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