| 1 | #include <stdio.h>\r |
| 2 | #include <malloc.h>\r |
| 3 | #include <stdlib.h>\r |
| 4 | #include <string.h>\r |
| 5 | #include <math.h>\r |
| 6 | \r |
| 7 | #include "fileio.h"\r |
| 8 | \r |
| 9 | #define NUM_KEYS 9\r |
| 10 | #define MAX_STACK 4096\r |
| 11 | #define MAX_LINES 100\r |
| 12 | #define NUM_MASKS 1\r |
| 13 | #define MAX_PIXELS 5000\r |
| 14 | #define NUM_COLORS 256\r |
| 15 | #define NUM_PLANES 2\r |
| 16 | #define NUM_SCRIPTS 5\r |
| 17 | #define MAX_SPRITES 5000\r |
| 18 | #define MAX_PLAYERS 16\r |
| 19 | #define MAX_OBJECTS 3000\r |
| 20 | #define NUM_WEAPONS 36\r |
| 21 | #define MAX_SAMPLES 31\r |
| 22 | #define MAX_HITTESTS 100\r |
| 23 | #define MAX_CHANNELS 12\r |
| 24 | #define MAX_PATTERNS 128\r |
| 25 | #define MAX_SOUNDS 64\r |
| 26 | #define SB_SIZE 1024\r |
| 27 | #define PLAY_TIME 0\r |
| 28 | #define SHOW_MAP 1\r |
| 29 | #define TIMER_RES 1000\r |
| 30 | \r |
| 31 | #define MAP_SHOOTABLE 1\r |
| 32 | #define MAP_WALKABLE 2\r |
| 33 | #define MAP_DESTROYABLE 4\r |
| 34 | #define MAP_TEMPORARY 8\r |
| 35 | \r |
| 36 | typedef struct ColorType\r |
| 37 | {\r |
| 38 | unsigned char B;\r |
| 39 | unsigned char G;\r |
| 40 | unsigned char R;\r |
| 41 | unsigned char Reserved;\r |
| 42 | } Color;\r |
| 43 | \r |
| 44 | typedef struct PixelType\r |
| 45 | {\r |
| 46 | float x;\r |
| 47 | float y;\r |
| 48 | float xv;\r |
| 49 | float yv;\r |
| 50 | unsigned long c;\r |
| 51 | unsigned char SetColor;\r |
| 52 | unsigned char Explode;\r |
| 53 | signed short Damage;\r |
| 54 | unsigned char Owner;\r |
| 55 | unsigned char Used;\r |
| 56 | } Pixel;\r |
| 57 | \r |
| 58 | typedef struct CacheType\r |
| 59 | {\r |
| 60 | unsigned short w;\r |
| 61 | unsigned short h;\r |
| 62 | unsigned char NumFrames;\r |
| 63 | unsigned char **Frames;\r |
| 64 | signed short *cx;\r |
| 65 | signed short *cy;\r |
| 66 | unsigned char AnimDelay;\r |
| 67 | } Cache;\r |
| 68 | \r |
| 69 | typedef struct SpriteType\r |
| 70 | {\r |
| 71 | signed short x;\r |
| 72 | signed short y;\r |
| 73 | signed char xv;\r |
| 74 | signed char yv;\r |
| 75 | unsigned char AnimCount;\r |
| 76 | unsigned char AnimTimer;\r |
| 77 | unsigned char AnimDelay;\r |
| 78 | unsigned char CurFrame;\r |
| 79 | unsigned char Template;\r |
| 80 | unsigned char Transparent;\r |
| 81 | unsigned char Used;\r |
| 82 | } Sprite;\r |
| 83 | \r |
| 84 | typedef struct WeaponType\r |
| 85 | {\r |
| 86 | unsigned short Class;\r |
| 87 | unsigned short ReloadDelay;\r |
| 88 | unsigned short FireDelay;\r |
| 89 | unsigned short Ammo;\r |
| 90 | unsigned short MaxClips;\r |
| 91 | unsigned long Name;\r |
| 92 | unsigned short NameLength;\r |
| 93 | } Weapon;\r |
| 94 | \r |
| 95 | typedef struct PWeaponType\r |
| 96 | {\r |
| 97 | unsigned short Weapon;\r |
| 98 | unsigned short ReloadTimer;\r |
| 99 | unsigned short FireTimer;\r |
| 100 | unsigned short AmmoLeft;\r |
| 101 | unsigned short NumClips;\r |
| 102 | signed short Vars[4];\r |
| 103 | unsigned char Used;\r |
| 104 | } PWeapon;\r |
| 105 | \r |
| 106 | typedef struct PlayerType\r |
| 107 | {\r |
| 108 | unsigned char Visual;\r |
| 109 | unsigned short VPointX1;\r |
| 110 | unsigned short VPointY1;\r |
| 111 | unsigned short VPointX2;\r |
| 112 | unsigned short VPointY2;\r |
| 113 | unsigned short AMeterX1;\r |
| 114 | unsigned short AMeterY1;\r |
| 115 | unsigned short AMeterX2;\r |
| 116 | unsigned short AMeterY2;\r |
| 117 | unsigned short LMeterX1;\r |
| 118 | unsigned short LMeterY1;\r |
| 119 | unsigned short LMeterX2;\r |
| 120 | unsigned short LMeterY2;\r |
| 121 | unsigned short lx, ly;\r |
| 122 | unsigned short kx, ky;\r |
| 123 | unsigned short cx, cy;\r |
| 124 | unsigned short Object;\r |
| 125 | unsigned short VPObject;\r |
| 126 | unsigned char Keys[NUM_KEYS];\r |
| 127 | unsigned char HeldKeys[NUM_KEYS];\r |
| 128 | unsigned short KeyCodes[NUM_KEYS];\r |
| 129 | unsigned char Left;\r |
| 130 | unsigned char Right;\r |
| 131 | unsigned char Up;\r |
| 132 | unsigned char Down;\r |
| 133 | unsigned char Change;\r |
| 134 | unsigned char Shoot;\r |
| 135 | unsigned char JustShot;\r |
| 136 | signed short CurWeapon;\r |
| 137 | float Angle;\r |
| 138 | float AngleVel;\r |
| 139 | unsigned char Dir;\r |
| 140 | unsigned long CrossColor;\r |
| 141 | signed short Kills;\r |
| 142 | signed short Lives;\r |
| 143 | signed short Health;\r |
| 144 | signed short MaxHealth;\r |
| 145 | signed short PVars[40];\r |
| 146 | struct MaskType\r |
| 147 | {\r |
| 148 | unsigned char *Buffer;\r |
| 149 | unsigned char Method;\r |
| 150 | unsigned char Effects[16];\r |
| 151 | } Masks[NUM_MASKS];\r |
| 152 | unsigned char Used;\r |
| 153 | } Player;\r |
| 154 | \r |
| 155 | typedef struct ClassType\r |
| 156 | {\r |
| 157 | unsigned char *Code;\r |
| 158 | unsigned short Scripts[NUM_SCRIPTS];\r |
| 159 | unsigned char TickDelay;\r |
| 160 | unsigned char Sprite;\r |
| 161 | unsigned char StartFrame;\r |
| 162 | unsigned char RunHitTests;\r |
| 163 | unsigned char TouchDelay;\r |
| 164 | unsigned char TransSprite;\r |
| 165 | signed short GravityMod;\r |
| 166 | } Class;\r |
| 167 | \r |
| 168 | typedef struct ObjectType\r |
| 169 | {\r |
| 170 | float x;\r |
| 171 | float y;\r |
| 172 | float xv;\r |
| 173 | float yv;\r |
| 174 | unsigned short Class;\r |
| 175 | unsigned char TickTimer;\r |
| 176 | signed short Variables[6];\r |
| 177 | unsigned short SpriteLink;\r |
| 178 | unsigned char TouchTimer;\r |
| 179 | unsigned char Owner;\r |
| 180 | unsigned char Used;\r |
| 181 | } Object;\r |
| 182 | \r |
| 183 | typedef struct LineType\r |
| 184 | {\r |
| 185 | signed short x1, y1;\r |
| 186 | signed short x2, y2;\r |
| 187 | unsigned long c1, c2;\r |
| 188 | unsigned short Transparent;\r |
| 189 | unsigned char Used;\r |
| 190 | } Line;\r |
| 191 | \r |
| 192 | typedef struct PalType\r |
| 193 | {\r |
| 194 | unsigned char r;\r |
| 195 | unsigned char g;\r |
| 196 | unsigned char b;\r |
| 197 | } Pal;\r |
| 198 | \r |
| 199 | typedef struct SoundType\r |
| 200 | {\r |
| 201 | unsigned short Sound;\r |
| 202 | unsigned char Playing;\r |
| 203 | unsigned char Repeat;\r |
| 204 | float Volume;\r |
| 205 | unsigned long Offset;\r |
| 206 | unsigned long Pitch;\r |
| 207 | unsigned long PitchError;\r |
| 208 | } Sound;\r |
| 209 | \r |
| 210 | typedef struct ModSampleType\r |
| 211 | {\r |
| 212 | unsigned long SampleLen;\r |
| 213 | unsigned char FineTune;\r |
| 214 | unsigned char Volume;\r |
| 215 | unsigned long LoopStart;\r |
| 216 | unsigned long LoopLen;\r |
| 217 | unsigned char Allocated;\r |
| 218 | signed char *Buffer;\r |
| 219 | } ModSample;\r |
| 220 | \r |
| 221 | typedef struct ModChannelType\r |
| 222 | {\r |
| 223 | unsigned short Period;\r |
| 224 | unsigned short CurPeriod;\r |
| 225 | unsigned short OldPeriod;\r |
| 226 | unsigned char Volume;\r |
| 227 | unsigned char CurVolume;\r |
| 228 | unsigned char Sample;\r |
| 229 | unsigned long Offset;\r |
| 230 | unsigned char Looping;\r |
| 231 | unsigned char Playing;\r |
| 232 | unsigned long Reminder;\r |
| 233 | unsigned char Effect;\r |
| 234 | unsigned char Oscillation;\r |
| 235 | unsigned char OscAmp;\r |
| 236 | unsigned char OscFreq;\r |
| 237 | union\r |
| 238 | {\r |
| 239 | struct TwinNibbleType\r |
| 240 | {\r |
| 241 | unsigned char n1 : 4;\r |
| 242 | unsigned char n2 : 4;\r |
| 243 | } Nibbles;\r |
| 244 | unsigned char b;\r |
| 245 | } EffectData;\r |
| 246 | } ModChannel;\r |
| 247 | \r |
| 248 | typedef struct ModEventType\r |
| 249 | {\r |
| 250 | unsigned short Period;\r |
| 251 | unsigned char Sample;\r |
| 252 | unsigned char Effect;\r |
| 253 | unsigned char EffectData;\r |
| 254 | } ModEvent;\r |
| 255 | \r |
| 256 | void SetMapPixel(unsigned short x, unsigned short y, unsigned long c, unsigned short Handle);\r |
| 257 | unsigned long GetMapPixel(unsigned short x, unsigned short y, unsigned short Handle);\r |
| 258 | void ShowMap(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short MapX, unsigned short MapY);\r |
| 259 | void SetMode(unsigned char Mode);\r |
| 260 | unsigned char SeekData(unsigned char *ID);\r |
| 261 | unsigned char LoadSprite(unsigned char *ID, unsigned short CacheNum);\r |
| 262 | unsigned short SpawnSprite(unsigned char Template, signed short x, signed short y, signed char xv, signed char yv, unsigned short AnimCount, unsigned char StartFrame, unsigned char Transparent);\r |
| 263 | unsigned char Init(unsigned short *Result);\r |
| 264 | void Terminate(void);\r |
| 265 | void SpawnPixel(unsigned short x, unsigned short y, float xv, float yv, unsigned char Owner, unsigned char SetColor, unsigned char Explode, signed short Damage, unsigned long c);\r |
| 266 | void ControlSprites(void);\r |
| 267 | void ControlPixels(void);\r |
| 268 | unsigned char ArgExist(unsigned short argc, unsigned char **argv, char *Match);\r |
| 269 | void CopyToMap(signed short x, signed short y, unsigned char *Buffer, unsigned short w, unsigned short h, unsigned long bgc, unsigned char ColorPattern, unsigned char DestroyAll, unsigned short Attributes);\r |
| 270 | void SpawnExplosion(signed short x, signed short y, unsigned char StartFrame, unsigned char Smokes, unsigned char Sound);\r |
| 271 | unsigned short SpawnObject(unsigned short Class, unsigned char Owner, unsigned short x, unsigned short y, float xv, float yv);\r |
| 272 | void ControlObjects(void);\r |
| 273 | unsigned short WallAngle(unsigned short x, unsigned short y);\r |
| 274 | void GetInputs(void);\r |
| 275 | void DBPrint(unsigned char *Buffer, signed short x, signed short y, unsigned char bgc);\r |
| 276 | void FontPrint(unsigned char *Buffer, signed short sx, signed short y, unsigned short bgc);\r |
| 277 | unsigned char CollisionTest(signed short *x1, signed short *y1, signed short *x2, signed short *y2, unsigned char Pattern, unsigned char RunHitTests, unsigned short *ObjNum, unsigned char TestCache, unsigned short TestFrame);\r |
| 278 | void DrawLine(signed short x1, signed short y1, signed short x2, signed short y2, unsigned long c1, unsigned long c2, unsigned char Method, unsigned char UseSprite);\r |
| 279 | unsigned short CalcAngle(signed short x1, signed short y1, signed short x2, signed short y2);\r |
| 280 | void AddHitTest(unsigned short ObjNum);\r |
| 281 | void RemoveHitTest(unsigned short ObjNum);\r |
| 282 | void HurtRadius(signed short x, signed short y, signed short StartDamage, signed short StopDamage, unsigned short StartDecRadius, unsigned short StopRadius, unsigned char Owner);\r |
| 283 | void CollVel(signed short x, signed short y, float *xv, float *yv, unsigned char Attributes);\r |
| 284 | void MessageBox(unsigned char *Buffer);\r |
| 285 | void FillBuffer(void);\r |
| 286 | unsigned char PlaySound(unsigned short Sound, unsigned char Repeat, unsigned short StartSound, unsigned short EndSound, unsigned short Pitch, float Volume);\r |
| 287 | unsigned long MakeColor(unsigned char R, unsigned char G, unsigned char B);\r |
| 288 | unsigned char MonoColor(unsigned long c);\r |
| 289 | void __inline GetNextLineCoord(signed short *x, signed short *y, signed short *d, unsigned short dx, unsigned short dy, signed short xi, signed short yi);\r |
| 290 | void DrawLightning(signed short x1, signed short y1, signed short x2, signed short y2, unsigned short NumPoints, unsigned char Template);\r |
| 291 | \r |
| 292 | extern Pixel *Pixels[MAX_PIXELS];\r |
| 293 | extern Cache **Caches;\r |
| 294 | extern Sprite *Sprites[MAX_SPRITES];\r |
| 295 | extern Object *Objects[MAX_OBJECTS];\r |
| 296 | extern Player *Players[MAX_PLAYERS];\r |
| 297 | extern PWeapon *PWeapons[MAX_PLAYERS][NUM_WEAPONS];\r |
| 298 | extern Sound Sounds[MAX_SOUNDS];\r |
| 299 | extern Class **Classes;\r |
| 300 | extern Weapon **Weapons;\r |
| 301 | extern unsigned char *Font;\r |
| 302 | extern Line *Lines[MAX_LINES];\r |
| 303 | extern unsigned long *SoundOffsets;\r |
| 304 | extern unsigned short HitTests[MAX_HITTESTS];\r |
| 305 | extern unsigned char *Strings;\r |
| 306 | extern Pal Palette[NUM_COLORS];\r |
| 307 | extern unsigned char ColorInfo[NUM_COLORS];\r |
| 308 | extern KvidFile DataFile;\r |
| 309 | extern float Gravity;\r |
| 310 | extern unsigned char *VBuffer;\r |
| 311 | extern unsigned char *DblBuffer;\r |
| 312 | extern unsigned short VideoLDT;\r |
| 313 | extern signed short clip_x1, clip_x2;\r |
| 314 | extern signed short clip_y1, clip_y2;\r |
| 315 | extern unsigned short PagesFree;\r |
| 316 | extern unsigned short BGSprite, BGFrame;\r |
| 317 | extern unsigned char LevelFinished;\r |
| 318 | extern unsigned short LevelWidth, LevelHeight;\r |
| 319 | extern unsigned short MaxLW, MaxLH;\r |
| 320 | extern unsigned char *LevelBuffer[NUM_PLANES];\r |
| 321 | extern unsigned short NumSprites;\r |
| 322 | extern unsigned short NumClasses;\r |
| 323 | extern unsigned short NumWeapons;\r |
| 324 | extern unsigned short NumSounds;\r |
| 325 | extern unsigned char *SoundData;\r |
| 326 | extern unsigned char DebugMode;\r |
| 327 | extern unsigned short FrameRate;\r |
| 328 | extern unsigned short FontSprite;\r |
| 329 | extern signed short Regs[32];\r |
| 330 | extern signed short GameVars[32];\r |
| 331 | extern unsigned short StackPos;\r |
| 332 | extern unsigned short Stack[MAX_STACK];\r |
| 333 | extern unsigned char raw_key;\r |
| 334 | extern unsigned char SpecialKey;\r |
| 335 | extern volatile unsigned char ReadyToGo;\r |
| 336 | extern unsigned short AsciiTable[256];\r |
| 337 | extern unsigned char AsciiTable2[256];\r |
| 338 | extern float Sine[360], Cosine[360];\r |
| 339 | extern double PreSine[360], PreCosine[360];\r |
| 340 | extern volatile unsigned char KeyTable[256];\r |
| 341 | extern unsigned char RepeatKey;\r |
| 342 | extern double RepeatData;\r |
| 343 | extern unsigned short LastShot;\r |
| 344 | extern unsigned char *TextBuffer;\r |
| 345 | extern unsigned char *KeyboardBuffer;\r |
| 346 | extern unsigned short KeybWritePos;\r |
| 347 | extern unsigned char *SoundBuffer;\r |
| 348 | extern signed short *TestBuffer;\r |
| 349 | extern unsigned char UseSound;\r |
| 350 | extern unsigned char FreeSound;\r |
| 351 | extern unsigned short DSPAddress;\r |
| 352 | extern unsigned char DMAChannel;\r |
| 353 | extern unsigned char IRQLine;\r |
| 354 | extern unsigned char OldMask;\r |
| 355 | extern unsigned char DMAPage, DMAAddress, DMACount;\r |
| 356 | extern unsigned char PICAddress;\r |
| 357 | extern unsigned char ReadyBuffer, BufferReady;\r |
| 358 | extern unsigned char Bit16, Stereo;\r |
| 359 | extern unsigned short SBSampleRate;\r |
| 360 | extern unsigned char NumPlays;\r |
| 361 | extern unsigned short *FontBuffer;\r |
| 362 | extern unsigned char ModeInfo[256];\r |
| 363 | extern unsigned char *MenuBuffer;\r |
| 364 | extern unsigned char Test;\r |
| 365 | extern unsigned char FogSprite, FogX, FogY;\r |
| 366 | extern void (*TransOps[5])(unsigned long *Bg, unsigned long Amount);\r |
| 367 | extern ModSample Samples[MAX_SAMPLES];\r |
| 368 | extern ModChannel Channels[MAX_CHANNELS];\r |
| 369 | extern ModEvent *Patterns;\r |
| 370 | extern unsigned char PatternOrder[MAX_PATTERNS];\r |
| 371 | extern unsigned char ModPlaying, ModLen, ModRepeat, ModChannels;\r |
| 372 | extern unsigned char ModPattern, ModRow;\r |
| 373 | extern unsigned short ModOffset;\r |
| 374 | extern unsigned char ModBPM, ModTPD;\r |
| 375 | extern volatile unsigned long Ticks, TickError;\r |
| 376 | extern unsigned char GameType;\r |
| 377 | extern unsigned char BPP;\r |