//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
Copyright (C) 2017-2019 Nuke.YKT
Copyright (C) 2020 - Christoph Oelckers

This file is part of Duke Nukem 3D version 1.5 - Atomic Edition

Duke Nukem 3D is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------

#include "ns.h"
#include "global.h"
#include "names_r.h"

BEGIN_DUKE_NS

short pinsectorresetdown(short sect);


void ballreturn(short spr)
{
	short j, i, nexti, nextj;
	i = headspritestat[105];
	while (i >= 0)
	{
		nexti = nextspritestat[i];
		if (sprite[i].picnum == RRTILE281)
			if (sprite[spr].sectnum == sprite[i].sectnum)
		{
			j = headspritestat[105];
			while (j >= 0)
			{
				nextj = nextspritestat[j];
				if (sprite[j].picnum == RRTILE282)
					if (sprite[i].hitag == sprite[j].hitag)
					fi.spawn(j, BOWLINGBALLSPRITE);
				if (sprite[j].picnum == RRTILE280)
					if (sprite[i].hitag == sprite[j].hitag)
						if (sprite[j].lotag == 0)
				{
					sprite[j].lotag = 100;
					sprite[j].extra++;
					pinsectorresetdown(sprite[j].sectnum);
				}
				j = nextj;
			}
		}

		i = nexti;
	}
}

short pinsectorresetdown(short sect)
{
	int vel, j;
	
	j = getanimationgoal(anim_ceilingz, sect);

	if (j == -1)
	{
		j = sector[sect].floorz;
		vel = 64;
		setanimation(sect, anim_ceilingz, sect, j, vel);
		return 1;
	}
	return 0;
}

short pinsectorresetup(short sect)
{
	int vel, j;

	j = getanimationgoal(anim_ceilingz, sect);

	if (j == -1)
	{
		j = sector[nextsectorneighborz(sect, sector[sect].ceilingz, -1, -1)].ceilingz;
		vel = 64;
		setanimation(sect, anim_ceilingz, sect, j, vel);
		return 1;
	}
	return 0;
}

short checkpins(short sect)
{
	short i, pin;
	int  x, y;
	short pins[10];
	short nexti, tag;
	
	pin = 0;
	for(i=0;i<10;i++) pins[i] = 0;

	i = headspritesect[sect];

	while (i >= 0)
	{
		nexti = nextspritesect[i];

		if (sprite[i].picnum == RRTILE3440)
		{
			pin++;
			pins[sprite[i].lotag] = 1;
		}
		if (sprite[i].picnum == RRTILE280)
		{
			tag = sprite[i].hitag;
		}

		i = nexti;
	}

	if (tag)
	{
		tag += 2024;
		tileCopySection(2024,0,0,128,64,tag,0,0);
		for(i=0;i<10;i++)
		{
			if (pins[i] == 1)
			{
				switch (i)
				{
					case 0:
						x = 64;
						y = 48;
						break;
					case 1:
						x = 56;
						y = 40;
						break;
					case 2:
						x = 72;
						y = 40;
						break;
					case 3:
						x = 48;
						y = 32;
						break;
					case 4:
						x = 64;
						y = 32;
						break;
					case 5:
						x = 80;
						y = 32;
						break;
					case 6:
						x = 40;
						y = 24;
						break;
					case 7:
						x = 56;
						y = 24;
						break;
					case 8:
						x = 72;
						y = 24;
						break;
					case 9:
						x = 88;
						y = 24;
						break;
				}
				tileCopySection(2023,0,0,8,8,tag,x-4,y-10);
			}
		}
	}

	return pin;
}

void resetpins(short sect)
{
	short i, j, nexti, tag;
	int x, y;
	i = headspritesect[sect];
	while (i >= 0)
	{
		nexti = headspritesect[i];
		if (sprite[i].picnum == 3440)
			deletesprite(i);
		i = nexti;
	}
	i = headspritesect[sect];
	while (i >= 0)
	{
		nexti = nextspritesect[i];
		if (sprite[i].picnum == 283)
		{
			j = fi.spawn(i,3440);
			sprite[j].lotag = sprite[i].lotag;
			if (sprite[j].lotag == 3 || sprite[j].lotag == 5)
			{
				sprite[j].clipdist = (1+(krand()%1))*16+32;
			}
			else
			{
				sprite[j].clipdist = (1+(krand()%1))*16+32;
			}
			sprite[j].ang -= ((krand()&32)-(krand()&64))&2047;
		}
		if (sprite[i].picnum == 280)
			tag = sprite[i].hitag;
		i = nexti;
	}
	if (tag)
	{
		tag += LANEPICS+1;
		tileCopySection(LANEPICS+1,0,0,128,64,tag,0,0);
		for(i=0;i<10;i++)
		{
			switch (i)
			{
				case 0:
					x = 64;
					y = 48;
					break;
				case 1:
					x = 56;
					y = 40;
					break;
				case 2:
					x = 72;
					y = 40;
					break;
				case 3:
					x = 48;
					y = 32;
					break;
				case 4:
					x = 64;
					y = 32;
					break;
				case 5:
					x = 80;
					y = 32;
					break;
				case 6:
					x = 40;
					y = 24;
					break;
				case 7:
					x = 56;
					y = 24;
					break;
				case 8:
					x = 72;
					y = 24;
					break;
				case 9:
					x = 88;
					y = 24;
					break;
			}
			tileCopySection(LANEPICS,0,0,8,8,tag,x-4,y-10);
		}
	}
}

void resetlanepics(void)
{
	int x, y;
	short i;
	short tag, pic;
	for(tag=0;tag<4;tag++)
	{
		pic = tag + 1;
		if (pic == 0) continue;
		pic += LANEPICS+1;
		tileCopySection(LANEPICS+1,0,0,128,64, pic,0,0);
		for(i=0;i<10;i++)
		{
			switch (i)
			{
				case 0:
					x = 64;
					y = 48;
					break;
				case 1:
					x = 56;
					y = 40;
					break;
				case 2:
					x = 72;
					y = 40;
					break;
				case 3:
					x = 48;
					y = 32;
					break;
				case 4:
					x = 64;
					y = 32;
					break;
				case 5:
					x = 80;
					y = 32;
					break;
				case 6:
					x = 40;
					y = 24;
					break;
				case 7:
					x = 56;
					y = 24;
					break;
				case 8:
					x = 72;
					y = 24;
					break;
				case 9:
					x = 88;
					y = 24;
					break;
			}
			tileCopySection(LANEPICS,0,0,8,8,pic,x-4,y-10);
		}
	}
}

END_DUKE_NS

