1 /*
2  * OpenTyrian: A modern cross-platform port of Tyrian
3  * Copyright (C) 2007-2009  The OpenTyrian Development Team
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18  */
19 #ifndef VARZ_H
20 #define VARZ_H
21 
22 #include "episodes.h"
23 #include "opentyr.h"
24 #include "player.h"
25 #include "sprite.h"
26 
27 #include <stdbool.h>
28 
29 #define SA 7
30 
31 enum
32 {
33 	SA_NONE = 0,
34 	SA_NORTSHIPZ = 7,
35 
36 	// only used for code entry
37 	SA_DESTRUCT = 8,
38 	SA_ENGAGE = 9,
39 
40 	// only used in pItems[P_SUPERARCADE]
41 	SA_SUPERTYRIAN = 254,
42 	SA_ARCADE = 255
43 };
44 
45 #define ENEMY_SHOT_MAX  60 /* 60*/
46 
47 #define CURRENT_KEY_SPEED 1  /*Keyboard/Joystick movement rate*/
48 
49 #define MAX_EXPLOSIONS           200
50 #define MAX_REPEATING_EXPLOSIONS 20
51 #define MAX_SUPERPIXELS          101
52 
53 struct JE_SingleEnemyType
54 {
55 	JE_byte     fillbyte;
56 	JE_integer  ex, ey;     /* POSITION */
57 	JE_shortint exc, eyc;   /* CURRENT SPEED */
58 	JE_shortint exca, eyca; /* RANDOM ACCELERATION */
59 	JE_shortint excc, eycc; /* FIXED ACCELERATION WAITTIME */
60 	JE_shortint exccw, eyccw;
61 	JE_byte     armorleft;
62 	JE_byte     eshotwait[3], eshotmultipos[3]; /* [1..3] */
63 	JE_byte     enemycycle;
64 	JE_byte     ani;
65 	JE_word     egr[20]; /* [1..20] */
66 	JE_byte     size;
67 	JE_byte     linknum;
68 	JE_byte     aniactive;
69 	JE_byte     animax;
70 	JE_byte     aniwhenfire;
71 	Sprite2_array *sprite2s;
72 	JE_shortint exrev, eyrev;
73 	JE_integer  exccadd, eyccadd;
74 	JE_byte     exccwmax, eyccwmax;
75 	void       *enemydatofs;
76 	JE_boolean  edamaged;
77 	JE_word     enemytype;
78 	JE_byte     animin;
79 	JE_word     edgr;
80 	JE_shortint edlevel;
81 	JE_shortint edani;
82 	JE_byte     fill1;
83 	JE_byte     filter;
84 	JE_integer  evalue;
85 	JE_integer  fixedmovey;
86 	JE_byte     freq[3]; /* [1..3] */
87 	JE_byte     launchwait;
88 	JE_word     launchtype;
89 	JE_byte     launchfreq;
90 	JE_byte     xaccel;
91 	JE_byte     yaccel;
92 	JE_byte     tur[3]; /* [1..3] */
93 	JE_word     enemydie; /* Enemy created when this one dies */
94 	JE_boolean  enemyground;
95 	JE_byte     explonum;
96 	JE_word     mapoffset;
97 	JE_boolean  scoreitem;
98 
99 	JE_boolean  special;
100 	JE_byte     flagnum;
101 	JE_boolean  setto;
102 
103 	JE_byte     iced; /*Duration*/
104 
105 	JE_byte     launchspecial;
106 
107 	JE_integer  xminbounce;
108 	JE_integer  xmaxbounce;
109 	JE_integer  yminbounce;
110 	JE_integer  ymaxbounce;
111 	JE_byte     fill[3]; /* [1..3] */
112 };
113 
114 typedef struct JE_SingleEnemyType JE_MultiEnemyType[100]; /* [1..100] */
115 
116 typedef JE_word JE_DanCShape[(24 * 28) / 2]; /* [1..(24*28) div 2] */
117 
118 typedef JE_char JE_CharString[256]; /* [1..256] */
119 
120 typedef JE_byte JE_Map1Buffer[24 * 28 * 13 * 4]; /* [1..24*28*13*4] */
121 
122 typedef JE_byte *JE_MapType[300][14]; /* [1..300, 1..14] */
123 typedef JE_byte *JE_MapType2[600][14]; /* [1..600, 1..14] */
124 typedef JE_byte *JE_MapType3[600][15]; /* [1..600, 1..15] */
125 
126 struct JE_EventRecType
127 {
128 	JE_word     eventtime;
129 	JE_byte     eventtype;
130 	JE_integer  eventdat, eventdat2;
131 	JE_shortint eventdat3, eventdat5, eventdat6;
132 	JE_byte     eventdat4;
133 };
134 
135 struct JE_MegaDataType1
136 {
137 	JE_MapType mainmap;
138 	struct
139 	{
140 		JE_DanCShape sh;
141 	} shapes[72]; /* [0..71] */
142 	JE_byte tempdat1;
143 	/*JE_DanCShape filler;*/
144 };
145 
146 struct JE_MegaDataType2
147 {
148 	JE_MapType2 mainmap;
149 	struct
150 	{
151 		JE_byte nothing[3]; /* [1..3] */
152 		JE_byte fill;
153 		JE_DanCShape sh;
154 	} shapes[71]; /* [0..70] */
155 	JE_byte tempdat2;
156 };
157 
158 struct JE_MegaDataType3
159 {
160 	JE_MapType3 mainmap;
161 	struct
162 	{
163 		JE_byte nothing[3]; /* [1..3] */
164 		JE_byte fill;
165 		JE_DanCShape sh;
166 	} shapes[70]; /* [0..69] */
167 	JE_byte tempdat3;
168 };
169 
170 typedef JE_byte JE_EnemyAvailType[100]; /* [1..100] */
171 
172 typedef struct {
173 	JE_integer sx, sy;
174 	JE_integer sxm, sym;
175 	JE_shortint sxc, syc;
176 	JE_byte tx, ty;
177 	JE_word sgr;
178 	JE_byte sdmg;
179 	JE_byte duration;
180 	JE_word animate;
181 	JE_word animax;
182 	JE_byte fill[12];
183 } EnemyShotType;
184 
185 typedef struct {
186 	unsigned int ttl;
187 	signed int x, y;
188 	signed int delta_x, delta_y;
189 	bool fixed_position;
190 	bool follow_player;
191 	unsigned int sprite;
192 } explosion_type;
193 
194 typedef struct {
195 	unsigned int delay;
196 	unsigned int ttl;
197 	unsigned int x, y;
198 	bool big;
199 } rep_explosion_type;
200 
201 typedef struct {
202 	unsigned int x, y, z;
203 	signed int delta_x, delta_y;
204 	Uint8 color;
205 } superpixel_type;
206 
207 extern JE_integer tempDat, tempDat2, tempDat3;
208 extern const JE_byte SANextShip[SA + 2];
209 extern const JE_word SASpecialWeapon[SA];
210 extern const JE_word SASpecialWeaponB[SA];
211 extern const JE_byte SAShip[SA];
212 extern const JE_word SAWeapon[SA][5];
213 extern const JE_byte specialArcadeWeapon[PORT_NUM];
214 extern const JE_byte optionSelect[16][3][2];
215 extern const JE_word PGR[21];
216 extern const JE_byte PAni[21];
217 extern const JE_word linkGunWeapons[38];
218 extern const JE_word chargeGunWeapons[38];
219 extern const JE_byte randomEnemyLaunchSounds[3];
220 extern const JE_byte keyboardCombos[26][8];
221 extern const JE_byte shipCombosB[21];
222 extern const JE_byte superTyrianSpecials[4];
223 extern const JE_byte shipCombos[14][3];
224 extern JE_byte SFCurrentCode[2][21];
225 extern JE_byte SFExecuted[2];
226 extern JE_byte lvlFileNum;
227 extern JE_word maxEvent, eventLoc;
228 extern JE_word tempBackMove, explodeMove;
229 extern JE_byte levelEnd;
230 extern JE_word levelEndFxWait;
231 extern JE_shortint levelEndWarp;
232 extern JE_boolean endLevel, reallyEndLevel, waitToEndLevel, playerEndLevel, normalBonusLevelCurrent, bonusLevelCurrent, smallEnemyAdjust, readyToEndLevel, quitRequested;
233 extern JE_byte newPL[10];
234 extern JE_word returnLoc;
235 extern JE_boolean returnActive;
236 extern JE_word galagaShotFreq;
237 extern JE_longint galagaLife;
238 extern JE_boolean debug;
239 extern Uint32 debugTime, lastDebugTime;
240 extern JE_longint debugHistCount;
241 extern JE_real debugHist;
242 extern JE_word curLoc;
243 extern JE_boolean firstGameOver, gameLoaded, enemyStillExploding;
244 extern JE_word totalEnemy;
245 extern JE_word enemyKilled;
246 extern struct JE_MegaDataType1 megaData1;
247 extern struct JE_MegaDataType2 megaData2;
248 extern struct JE_MegaDataType3 megaData3;
249 extern JE_byte flash;
250 extern JE_shortint flashChange;
251 extern JE_byte displayTime;
252 
253 extern bool play_demo, record_demo, stopped_demo;
254 extern Uint8 demo_num;
255 extern FILE *demo_file;
256 
257 extern Uint8 demo_keys, next_demo_keys;
258 extern Uint16 demo_keys_wait;
259 
260 extern JE_byte soundQueue[8];
261 extern JE_boolean enemyContinualDamage;
262 extern JE_boolean enemiesActive;
263 extern JE_boolean forceEvents;
264 extern JE_boolean stopBackgrounds;
265 extern JE_byte stopBackgroundNum;
266 extern JE_byte damageRate;
267 extern JE_boolean background3x1;
268 extern JE_boolean background3x1b;
269 extern JE_boolean levelTimer;
270 extern JE_word levelTimerCountdown;
271 extern JE_word levelTimerJumpTo;
272 extern JE_boolean randomExplosions;
273 extern JE_boolean editShip1, editShip2;
274 extern JE_boolean globalFlags[10];
275 extern JE_byte levelSong;
276 extern JE_boolean loadDestruct;
277 extern JE_word mapOrigin, mapPNum;
278 extern JE_byte mapPlanet[5], mapSection[5];
279 extern JE_boolean moveTyrianLogoUp;
280 extern JE_boolean skipStarShowVGA;
281 extern JE_MultiEnemyType enemy;
282 extern JE_EnemyAvailType enemyAvail;
283 extern JE_word enemyOffset;
284 extern JE_word enemyOnScreen;
285 extern JE_byte enemyShapeTables[6];
286 extern JE_word superEnemy254Jump;
287 extern explosion_type explosions[MAX_EXPLOSIONS];
288 extern JE_integer explosionFollowAmountX, explosionFollowAmountY;
289 extern JE_boolean fireButtonHeld;
290 extern JE_boolean enemyShotAvail[ENEMY_SHOT_MAX];
291 extern EnemyShotType enemyShot[ENEMY_SHOT_MAX];
292 extern JE_byte zinglonDuration;
293 extern JE_byte astralDuration;
294 extern JE_word flareDuration;
295 extern JE_boolean flareStart;
296 extern JE_shortint flareColChg;
297 extern JE_byte specialWait;
298 extern JE_byte nextSpecialWait;
299 extern JE_boolean spraySpecial;
300 extern JE_byte doIced;
301 extern JE_boolean infiniteShot;
302 extern JE_boolean allPlayersGone;
303 extern const uint shadowYDist;
304 extern JE_real optionSatelliteRotate;
305 extern JE_integer optionAttachmentMove;
306 extern JE_boolean optionAttachmentLinked, optionAttachmentReturn;
307 extern JE_byte chargeWait, chargeLevel, chargeMax, chargeGr, chargeGrWait;
308 extern JE_word neat;
309 extern rep_explosion_type rep_explosions[MAX_REPEATING_EXPLOSIONS];
310 extern superpixel_type superpixels[MAX_SUPERPIXELS];
311 extern unsigned int last_superpixel;
312 extern JE_byte temp, temp2, temp3;
313 extern JE_word tempX, tempY;
314 extern JE_word tempW;
315 extern JE_boolean doNotSaveBackup;
316 extern JE_word x, y;
317 extern JE_integer b;
318 extern JE_byte **BKwrap1to, **BKwrap2to, **BKwrap3to, **BKwrap1, **BKwrap2, **BKwrap3;
319 extern JE_shortint specialWeaponFilter, specialWeaponFreq;
320 extern JE_word specialWeaponWpn;
321 extern JE_boolean linkToPlayer;
322 extern JE_word shipGr, shipGr2;
323 extern Sprite2_array *shipGrPtr, *shipGr2ptr;
324 
325 static const int hud_sidekick_y[2][2] =
326 {
327 	{  64,  82 }, // one player HUD
328 	{ 108, 126 }, // two player HUD
329 };
330 
331 void JE_getShipInfo( void );
332 JE_word JE_SGr( JE_word ship, Sprite2_array **ptr );
333 
334 void JE_drawOptions( void );
335 
336 void JE_tyrianHalt( JE_byte code ); /* This ends the game */
337 void JE_specialComplete( JE_byte playernum, JE_byte specialType );
338 void JE_doSpecialShot( JE_byte playernum, uint *armor, uint *shield );
339 
340 void JE_wipeShieldArmorBars( void );
341 JE_byte JE_playerDamage( JE_byte temp, Player * );
342 
343 void JE_setupExplosion( signed int x, signed int y, signed int delta_y, unsigned int type, bool fixed_position, bool follow_player );
344 void JE_setupExplosionLarge( JE_boolean enemyground, JE_byte explonum, JE_integer x, JE_integer y );
345 
346 void JE_drawShield( void );
347 void JE_drawArmor( void );
348 
349 JE_word JE_portConfigs( void );
350 
351 /*SuperPixels*/
352 void JE_doSP( JE_word x, JE_word y, JE_word num, JE_byte explowidth, JE_byte color );
353 void JE_drawSP( void );
354 
355 void JE_drawOptionLevel( void );
356 
357 
358 #endif /* VARZ_H */
359 
360