1 // Load player sprite
InitEnemyshootSprites()2 void InitEnemyshootSprites()
3 {
4 	LoadSprite(enemyshoot_psgcompr, ENEMYSHOOTBASE,enemyshoot_psgcompr_bank);
5 }
6 
InitEnemyshootDirection(unsigned char x,unsigned char y,signed char vx,signed char vy)7 void InitEnemyshootDirection(unsigned char x, unsigned char y, signed char vx, signed char vy)
8 {
9 	enemyshoot *es;
10 
11 	shootcount++;
12 	if(numenemyshoots<MAXENEMYSHOOTS)
13 	{
14 		es=&enemyshoots[numenemyshoots];
15 
16 		// Position
17 		es->enemyshootposx=x;
18 		es->enemyshootposy=y;
19 
20 		// Type
21 		es->enemyshoottype=ENEMYSHOOT_NORMAL;
22 
23 		// Set velocity
24 		es->enemyshootvelx=vx;
25 		es->enemyshootvely=vy;
26 
27 		// Increment
28 		numenemyshoots++;
29 	}
30 }
31 
SpreadEnemyshootDirection(unsigned char x,unsigned char y,const signed char * vx,const signed char * vy,unsigned char count)32 void SpreadEnemyshootDirection(unsigned char x, unsigned char y, const signed char *vx, const signed char *vy,unsigned char count)
33 {
34 	for(unsigned char a=0;a<count;a++)
35 		InitEnemyshootDirection(x,y,vx[a],vy[a]);
36 }
37 
38 
InitEnemyshootLaser(unsigned char x,unsigned char y)39 void InitEnemyshootLaser(unsigned char x, unsigned char y)
40 {
41 	enemyshoot *es;
42 
43 	shootcount++;
44 	if(numenemyshoots<MAXENEMYSHOOTS)
45 	{
46 		es=&enemyshoots[numenemyshoots];
47 
48 		// Position
49 		es->enemyshootposx=x;
50 		es->enemyshootposy=y;
51 
52 		// Type
53 		es->enemyshoottype=ENEMYSHOOT_LASER;
54 
55 		// Set velocity
56 		es->enemyshootvelx=0;
57 		es->enemyshootvely=DEFAULTENEMYSHOOTLASERSPEED+(gamelevel<<1);
58 
59 		// Increment
60 		numenemyshoots++;
61 
62 		// Sound
63 		PlaySound(enemylaser_psg,1);
64 	}
65 }
66 
67 // Create a Enemy shoot.. moved here as needed before header file
InitEnemyshoot(unsigned char x,unsigned char y,unsigned char forced)68 void InitEnemyshoot(unsigned char x, unsigned char y,unsigned char forced)
69 {
70 	signed int dx,dy,dm;
71 	enemyshoot *es;
72 
73 	shootcount++;
74 
75 	if(numenemyshoots<MAXENEMYSHOOTS)
76 	{
77 		if((shootcount%(ENEMYSHOOTDENSITY-gamelevel)==0)||(forced==1))
78 		{
79 			es=&enemyshoots[numenemyshoots];
80 
81 			// Better granularity although faster enemy shoots
82 			dx=playerx-x;
83 			dy=playery-y;
84 			dm=abs(dx)+abs(dy);
85 
86 			// Ahora solo dispara si está relativamente lejos
87 			if(dm>64)
88 			{
89 				// Position
90 				es->enemyshootposx=x;
91 				es->enemyshootposy=y;
92 
93 				// Type
94 				es->enemyshoottype=ENEMYSHOOT_NORMAL;
95 
96 				// Speed
97 				dx*=playstageshootspeed;
98 				dy*=playstageshootspeed;
99 				dx/=dm;
100 				dy/=dm;
101 
102 				// Set velocity
103 				es->enemyshootvelx=dx;
104 				es->enemyshootvely=dy;
105 
106 				// Increment
107 				numenemyshoots++;
108 			}
109 		}
110 	}
111 }
112 
113 // Test collision
CheckMapCollision(unsigned char x,unsigned char y)114 unsigned char CheckMapCollision(unsigned char x, unsigned char y)
115 {
116 	// Updates of stage
117 	if(stageframe2mod==0)
118 	{
119 		changeBank(FIXEDBANKSLOT);
120 		if(checkcollisionfunctions[playstage]!=0)
121 			return (*(checkcollisionfunctions[playstage]))(x,y);
122 	}
123 	return 0;
124 }
125 
126 // Remove enemyshoot
RemoveEnemyshoot(signed char a)127 void RemoveEnemyshoot(signed char a)
128 {
129 	enemyshoot *esa,*esb;
130 
131 	// Remove list of sprites
132 	if(a<numenemyshoots-1)
133 	{
134 		esa=&enemyshoots[a];
135 		esb=&enemyshoots[numenemyshoots-1];
136 
137 		esa->enemyshootposx=esb->enemyshootposx;
138 		esa->enemyshootposy=esb->enemyshootposy;
139 		esa->enemyshootvelx=esb->enemyshootvelx;
140 		esa->enemyshootvely=esb->enemyshootvely;
141 		esa->enemyshoottype=esb->enemyshoottype;
142 	}
143 	// Bajamos el numero de enemy shoots
144 	numenemyshoots--;
145 }
146 
147 // Update Enemy shoot
UpdateEnemyshoot(unsigned int a)148 void UpdateEnemyshoot(unsigned int a)
149 {
150 	enemyshoot *es=&enemyshoots[a];
151 
152 	if((es->enemyshootposx<8)||(es->enemyshootposx>247)||(es->enemyshootposy<8)||(es->enemyshootposy>183))
153 		RemoveEnemyshoot(a);
154 	else
155 	{
156 		// Collision
157 		if(CheckMapCollision(es->enemyshootposx+4,es->enemyshootposy+4))
158 			RemoveEnemyshoot(a);
159 		else
160 		{
161 			// Movement
162 			es->enemyshootposx+=es->enemyshootvelx;
163 			es->enemyshootposy+=es->enemyshootvely;
164 
165 			// Draw
166 			if(es->enemyshoottype==ENEMYSHOOT_NORMAL)
167 				SMS_addSprite(es->enemyshootposx,es->enemyshootposy,ENEMYSHOOTBASE+sprite82anim);
168 			else if(es->enemyshoottype==ENEMYSHOOT_LASER)
169 			{
170 				SMS_addSprite(es->enemyshootposx,es->enemyshootposy-8,ENEMYSHOOTBASE+2);
171 				SMS_addSprite(es->enemyshootposx,es->enemyshootposy,ENEMYSHOOTBASE+3);
172 			}
173 		}
174 	}
175 }
176 
177 // Update all Enemy shoots
UpdateEnemyshoots()178 void UpdateEnemyshoots()
179 {
180 	// For each
181 	if(numenemyshoots>0)
182 		for(signed char a=numenemyshoots-1;a>=0;a--)
183 			UpdateEnemyshoot(a);
184 }
185 
InitEnemyshoots()186 void InitEnemyshoots()
187 {
188 	InitEnemyshootSprites();
189 	numenemyshoots=0;
190 }
191 
KillEnemyshoots()192 void KillEnemyshoots()
193 {
194 	numenemyshoots=0;
195 }
196 
TestEnemyShoot(enemy * en,unsigned char freq)197 void TestEnemyShoot(enemy *en,unsigned char freq)
198 {
199 	if(en->enemyframe%freq==2)
200 		InitEnemyshoot(en->enemyposx+4,en->enemyposy+4,0);
201 }
202 
TestEnemyShootOne(enemy * en,unsigned char freq)203 void TestEnemyShootOne(enemy *en,unsigned char freq)
204 {
205 	if(en->enemyframe==freq)
206 		InitEnemyshoot(en->enemyposx+4,en->enemyposy+4,0);
207 }
208 
TestEnemyShootComplex(enemy * en,unsigned char freq,unsigned char dx,unsigned char dy)209 void TestEnemyShootComplex(enemy *en,unsigned char freq,unsigned char dx,unsigned char dy)
210 {
211 	if(en->enemyframe%freq==2)
212 		InitEnemyshoot(en->enemyposx+dx,en->enemyposy+dy,1);
213 }
214