13 #define MAX_STACK 4096
\r
14 #define MAX_LINES 1000
\r
16 #define MAX_PIXELS 5000
\r
17 #define NUM_COLORS 256
\r
18 #define NUM_PLANES 2
\r
19 #define MAX_SOUNDS 64
\r
20 #define MAX_RASTERS 100
\r
21 #define NUM_SCRIPTS 5
\r
22 #define MAX_SPRITES 5000
\r
23 #define MAX_PLAYERS 16
\r
24 #define MAX_OBJECTS 3000
\r
25 #define NUM_WEAPONS 55
\r
26 #define MAX_SAMPLES 31
\r
27 #define MAX_OBJLISTS 16
\r
28 #define MAX_HITTESTS 100
\r
29 #define MAX_CHANNELS 12
\r
30 #define MAX_PATTERNS 128
\r
31 #define MAX_MENUITEMS 128
\r
32 #define SB_SIZE 1024
\r
37 #define MAP_SHOOTABLE 1
\r
38 #define MAP_WALKABLE 2
\r
39 #define MAP_DESTROYABLE 4
\r
40 #define MAP_TEMPORARY 8
\r
42 typedef struct ColorType
\r
47 unsigned char Reserved;
\r
50 typedef struct PixelType
\r
57 unsigned char SetColor;
\r
58 unsigned char Explode;
\r
59 signed short Damage;
\r
60 unsigned char Owner;
\r
64 typedef struct CacheType
\r
68 unsigned char NumFrames;
\r
69 unsigned char **Frames;
\r
72 unsigned char AnimDelay;
\r
75 typedef struct SpriteType
\r
81 unsigned char AnimCount;
\r
82 unsigned char AnimTimer;
\r
83 unsigned char AnimDelay;
\r
84 unsigned char CurFrame;
\r
85 unsigned char Template;
\r
86 unsigned char Transparent;
\r
90 typedef struct WeaponType
\r
92 unsigned short Class;
\r
93 unsigned short ReloadDelay;
\r
94 unsigned short FireDelay;
\r
95 unsigned short Ammo;
\r
96 unsigned short MaxClips;
\r
98 unsigned short NameLength;
\r
101 typedef struct PWeaponType
\r
103 unsigned short Weapon;
\r
104 unsigned short ReloadTimer;
\r
105 unsigned short FireTimer;
\r
106 unsigned short AmmoLeft;
\r
107 unsigned short NumClips;
\r
108 signed short Vars[4];
\r
109 unsigned char Used;
\r
112 typedef struct PlayerType
\r
114 unsigned char Visual;
\r
115 unsigned short VPointX1;
\r
116 unsigned short VPointY1;
\r
117 unsigned short VPointX2;
\r
118 unsigned short VPointY2;
\r
119 unsigned short AMeterX1;
\r
120 unsigned short AMeterY1;
\r
121 unsigned short AMeterX2;
\r
122 unsigned short AMeterY2;
\r
123 unsigned short LMeterX1;
\r
124 unsigned short LMeterY1;
\r
125 unsigned short LMeterX2;
\r
126 unsigned short LMeterY2;
\r
127 unsigned short lx, ly;
\r
128 unsigned short kx, ky;
\r
129 unsigned short cx, cy;
\r
130 unsigned short Object;
\r
131 unsigned short VPObject;
\r
132 unsigned char Keys[NUM_KEYS];
\r
133 unsigned char HeldKeys[NUM_KEYS];
\r
134 unsigned short KeyCodes[NUM_KEYS];
\r
135 unsigned char Left;
\r
136 unsigned char Right;
\r
138 unsigned char Down;
\r
139 unsigned char Change;
\r
140 unsigned char Shoot;
\r
141 unsigned char JustShot;
\r
142 signed short CurWeapon;
\r
146 unsigned long CrossColor;
\r
147 signed short Kills;
\r
148 signed short Lives;
\r
149 signed short Health;
\r
150 signed short MaxHealth;
\r
151 signed short PVars[40];
\r
154 unsigned char *Buffer;
\r
155 unsigned char Method;
\r
156 unsigned char Effects[16];
\r
157 } Masks[NUM_MASKS];
\r
158 unsigned char Used;
\r
161 typedef struct ClassType
\r
163 unsigned char *Code;
\r
164 unsigned short Scripts[NUM_SCRIPTS];
\r
165 unsigned char TickDelay;
\r
166 unsigned char Sprite;
\r
167 unsigned char StartFrame;
\r
168 unsigned char RunHitTests;
\r
169 unsigned char TouchDelay;
\r
170 unsigned char TransSprite;
\r
171 signed short GravityMod;
\r
174 typedef struct ObjectType
\r
180 unsigned short Class;
\r
181 unsigned char TickTimer;
\r
182 signed short Variables[6];
\r
183 unsigned short SpriteLink;
\r
184 unsigned char TouchTimer;
\r
185 unsigned char Owner;
\r
186 unsigned char Used;
\r
189 typedef struct ObjectListType
\r
193 unsigned short Object;
\r
194 signed short x1, y1, x2, y2;
\r
195 } Objects[MAX_OBJECTS + 1];
\r
196 unsigned short NumObjects;
\r
197 unsigned char Used;
\r
200 typedef struct LineType
\r
202 signed short x1, y1;
\r
203 signed short x2, y2;
\r
204 unsigned long c1, c2;
\r
205 unsigned short Transparent;
\r
206 unsigned char UseSprite;
\r
207 unsigned char AnimTimer;
\r
208 unsigned char CurFrame;
\r
209 unsigned char Used;
\r
212 typedef struct RasterType
\r
214 signed short x1, y1;
\r
215 signed short x2, y2;
\r
216 signed short x3, y3;
\r
217 unsigned long Color;
\r
218 unsigned char Transparent;
\r
219 unsigned char Type;
\r
220 unsigned char Used;
\r
223 typedef struct PalType
\r
230 typedef struct SoundCacheType
\r
232 unsigned char *SoundBuffer;
\r
233 unsigned long Length;
\r
236 typedef struct SoundType
\r
238 unsigned short Sound;
\r
239 unsigned char Playing;
\r
240 unsigned char Repeat;
\r
242 unsigned long Offset;
\r
243 unsigned long Pitch;
\r
244 unsigned long PitchError;
\r
247 typedef struct ModSampleType
\r
249 unsigned long SampleLen;
\r
250 unsigned char FineTune;
\r
251 unsigned char Volume;
\r
252 unsigned long LoopStart;
\r
253 unsigned long LoopLen;
\r
254 unsigned char Allocated;
\r
255 signed char *Buffer;
\r
258 typedef struct ModChannelType
\r
260 unsigned short Period;
\r
261 unsigned short CurPeriod;
\r
262 unsigned short OldPeriod;
\r
263 unsigned char Volume;
\r
264 unsigned char CurVolume;
\r
265 unsigned char Sample;
\r
266 unsigned long Offset;
\r
267 signed char LastSample;
\r
268 unsigned char Looping;
\r
269 unsigned char Playing;
\r
270 unsigned long Reminder;
\r
271 unsigned char Effect;
\r
272 unsigned char Oscillation;
\r
273 unsigned char OscAmp;
\r
274 unsigned char OscFreq;
\r
276 unsigned char OscWave;
\r
277 unsigned char OscNoTrig;
\r
280 struct TwinNibbleType
\r
282 unsigned char n1 : 4;
\r
283 unsigned char n2 : 4;
\r
289 typedef struct ModEventType
\r
291 unsigned short Period;
\r
292 unsigned char Sample;
\r
293 unsigned char Effect;
\r
294 unsigned char EffectData;
\r
299 signed short Parent, Size;
\r
303 void SetMapPixel(unsigned short x, unsigned short y, unsigned long c, unsigned short Handle);
\r
304 unsigned long GetMapPixel(unsigned short x, unsigned short y, unsigned short Handle);
\r
305 void ShowMap(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short MapX, unsigned short MapY);
\r
306 void SetMode(unsigned char Mode);
\r
307 unsigned char SeekData(unsigned char *ID);
\r
308 unsigned char LoadSprite(unsigned char *ID, unsigned short CacheNum);
\r
309 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
310 unsigned char Init(unsigned short *Result);
\r
311 void Terminate(void);
\r
312 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
313 void ControlSprites(void);
\r
314 void ControlPixels(void);
\r
315 unsigned char ArgExist(unsigned short argc, unsigned char **argv, char *Match);
\r
316 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
317 void SpawnExplosion(signed short x, signed short y, unsigned char StartFrame, unsigned char Smokes, unsigned char Sound);
\r
318 unsigned short SpawnObject(unsigned short Class, unsigned char Owner, unsigned short x, unsigned short y, float xv, float yv);
\r
319 void ControlObjects(void);
\r
320 unsigned short WallAngle(unsigned short x, unsigned short y);
\r
321 void GetInputs(void);
\r
322 void DBPrint(unsigned char *Buffer, signed short x, signed short y, unsigned char bgc);
\r
323 void FontPrint(unsigned char *Buffer, signed short sx, signed short y, unsigned short bgc);
\r
324 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
325 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
326 unsigned short CalcAngle(signed short x1, signed short y1, signed short x2, signed short y2);
\r
327 void AddHitTest(unsigned short ObjNum);
\r
328 void RemoveHitTest(unsigned short ObjNum);
\r
329 void HurtRadius(signed short x, signed short y, signed short StartDamage, signed short StopDamage, unsigned short StartDecRadius, unsigned short StopRadius, unsigned char Owner);
\r
330 void CollVel(signed short x, signed short y, float *xv, float *yv, unsigned char Attributes);
\r
331 void MessageBox(unsigned char *Buffer);
\r
332 void FillBuffer(void);
\r
333 unsigned char PlaySound(unsigned short Sound, unsigned char Repeat, unsigned short StartSound, unsigned short EndSound, unsigned long Pitch, float Volume);
\r
334 unsigned long MakeColor(unsigned char R, unsigned char G, unsigned char B);
\r
335 unsigned char MonoColor(unsigned long c);
\r
336 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
337 unsigned short GetObjectList(void);
\r
339 Pixel *Pixels[MAX_PIXELS];
\r
341 Sprite *Sprites[MAX_SPRITES];
\r
342 Object *Objects[MAX_OBJECTS];
\r
343 Player *Players[MAX_PLAYERS];
\r
344 PWeapon *PWeapons[MAX_PLAYERS][NUM_WEAPONS];
\r
345 ObjectList *ObjectLists[MAX_OBJLISTS];
\r
346 Sound Sounds[MAX_SOUNDS];
\r
347 SoundCache **SoundCaches;
\r
350 unsigned char *Font;
\r
351 Line *Lines[MAX_LINES];
\r
352 Raster *Rasters[MAX_RASTERS];
\r
353 unsigned short HitTests[MAX_HITTESTS];
\r
354 unsigned char *Strings;
\r
355 Pal Palette[NUM_COLORS];
\r
356 unsigned char ColorInfo[NUM_COLORS];
\r
357 unsigned char *MenuItems[2][MAX_MENUITEMS];
\r
358 unsigned short MenuStack[16][3], MenuStackPos;
\r
361 SDL_Surface *VBuffer;
\r
362 unsigned char *DblBuffer;
\r
363 unsigned char FullScreen;
\r
364 signed short clip_x1, clip_x2;
\r
365 signed short clip_y1, clip_y2;
\r
366 unsigned short PagesFree;
\r
367 unsigned short BGSprite, BGFrame;
\r
368 unsigned char LevelFinished;
\r
369 unsigned short LevelWidth, LevelHeight;
\r
370 unsigned short MaxLW, MaxLH;
\r
371 unsigned char *LevelBuffer[NUM_PLANES];
\r
372 unsigned short NumSprites;
\r
373 unsigned short NumClasses;
\r
374 unsigned short NumWeapons;
\r
375 unsigned short NumSounds;
\r
376 unsigned char DebugMode;
\r
377 unsigned short FrameRate;
\r
378 unsigned short FontSprite;
\r
379 signed short Regs[32];
\r
380 signed short GameVars[40];
\r
381 unsigned char StackPos;
\r
382 unsigned short Stack[MAX_STACK];
\r
383 unsigned char SpecialKey;
\r
384 unsigned short AsciiTable[256];
\r
385 unsigned char AsciiTable2[256];
\r
386 float Sine[360], Cosine[360];
\r
387 float WaveForms[5][360];
\r
388 double PreSine[360], PreCosine[360];
\r
389 volatile unsigned char KeyTable[256];
\r
390 unsigned char RepeatKey;
\r
392 unsigned char *TextBuffer;
\r
393 unsigned char *KeyboardBuffer;
\r
394 unsigned char *LevelFileName, *ModFileName;
\r
395 unsigned char LevelType;
\r
396 unsigned short DispLevelWidth, DispLevelHeight;
\r
397 unsigned short KeybWritePos, KeybReadPos;
\r
398 unsigned char *SoundBuffer;
\r
399 signed short *TestBuffer;
\r
400 unsigned char UseSound;
\r
401 unsigned char FreeSound;
\r
402 unsigned short DSPAddress;
\r
403 unsigned char DMAChannel;
\r
404 unsigned char IRQLine;
\r
405 unsigned char OldMask;
\r
406 unsigned char DMAPage, DMAAddress, DMACount;
\r
407 unsigned char PICAddress;
\r
408 unsigned char ReadyBuffer, BufferReady;
\r
409 unsigned char Bit16, Stereo;
\r
410 unsigned short SBSampleRate;
\r
411 unsigned char NumPlays;
\r
412 unsigned short *FontBuffer;
\r
413 unsigned char ModeInfo[256];
\r
414 unsigned char *MenuBuffer;
\r
415 unsigned char FogSprite;
\r
416 signed short FogX, FogY;
\r
417 void (*TransOps[5])(unsigned long *Bg, unsigned long Amount);
\r
418 ModSample Samples[MAX_SAMPLES];
\r
419 ModChannel Channels[MAX_CHANNELS];
\r
420 ModEvent *Patterns;
\r
421 unsigned char PatternOrder[MAX_PATTERNS];
\r
422 unsigned char ModPlaying, ModLen, ModRepeat, ModChannels;
\r
423 unsigned char ModPattern, ModRow;
\r
424 unsigned short ModOffset;
\r
425 unsigned char ModBPM, ModTPD;
\r
426 unsigned char MenuActive;
\r
427 unsigned short NumMenuItems, CurMenuItem, StartMenuItem, MenuID;
\r
428 unsigned char GameType;
\r
430 unsigned char Paused;
\r
431 unsigned short CurNew, CurComp;
\r
433 #include "sdlmap.h"
\r
435 #include "dblbuf.h"
\r
436 #include "executor.h"
\r
442 unsigned char Data;
\r
444 raw_key = inp(0x60);
\r
445 Data = inp(0x61) | 0x82;
\r
447 outp(0x61, Data & 0x7F);
\r
451 if(SpecialKey == 1)
\r
453 KeyTable[raw_key + 128] = 1;
\r
455 RepeatKey = raw_key + 128;
\r
457 KeyboardBuffer[KeybWritePos++] = raw_key + 128;
\r
458 if(KeybWritePos >= 500)
\r
461 KeyTable[raw_key] = 1;
\r
462 RepeatKey = raw_key;
\r
464 KeyboardBuffer[KeybWritePos++] = raw_key;
\r
465 if(KeybWritePos >= 500)
\r
469 if(raw_key == 0xE0)
\r
474 if(SpecialKey == 1)
\r
476 KeyTable[raw_key] = 0;
\r
479 KeyTable[raw_key - 128] = 0;
\r
490 gettimeofday(&tv, NULL);
\r
491 return((double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0));
\r
494 unsigned char ReadKey(void)
\r
496 unsigned char Data;
\r
498 if((Data = KeyboardBuffer[KeybReadPos]) != 0)
\r
500 KeyboardBuffer[KeybReadPos] = 0;
\r
501 if(++KeybReadPos >= 500)
\r
507 void EmptyKeyBuffer(void)
\r
509 KeybWritePos = KeybReadPos = 0;
\r
510 memset(KeyboardBuffer, 0, 500);
\r
513 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
515 unsigned short cx, cy, i;
\r
516 unsigned long data;
\r
518 unsigned char Colors[NUM_COLORS];
\r
519 unsigned char NumColors;
\r
522 for(i = 0; i < NUM_COLORS; i++)
\r
524 if(ColorInfo[i] == ColorPattern)
\r
525 Colors[NumColors++] = i;
\r
527 for(cy = 0; cy < h; cy++)
\r
529 for(cx = 0; cx < w; cx++)
\r
531 data = *(unsigned long *)Buffer;
\r
535 if(((GetMapPixel(x + cx, y + cy, 1) & MAP_DESTROYABLE) == MAP_DESTROYABLE) || (DestroyAll == 1))
\r
537 if(Attributes != 0xFFFF)
\r
538 SetMapPixel(x + cx, y + cy, Attributes, 1);
\r
539 if(ColorPattern == 0)
\r
540 SetMapPixel(x + cx, y + cy, data, 0);
\r
543 c = Colors[rand() % NumColors];
\r
544 SetMapPixel(x + cx, y + cy, MakeColor(Palette[c].r, Palette[c].g, Palette[c].b), 0);
\r
554 unsigned short i, o;
\r
556 for(i = 0; i < MAX_PIXELS; i++)
\r
557 Pixels[i]->Used = 0;
\r
558 for(i = 0; i < MAX_OBJECTS; i++)
\r
559 Objects[i]->Used = 0;
\r
560 for(i = 0; i < MAX_PLAYERS; i++)
\r
562 for(o = 0; o < NUM_KEYS; o++)
\r
564 Players[i]->Keys[o] = 0;
\r
565 Players[i]->HeldKeys[o] = 0;
\r
568 for(i = 0; i < MAX_SPRITES; i++)
\r
569 Sprites[i]->Used = 0;
\r
570 for(i = 0; i < MAX_LINES; i++)
\r
571 Lines[i]->Used = 0;
\r
572 for(i = 0; i < MAX_RASTERS; i++)
\r
573 Rasters[i]->Used = 0;
\r
574 for(i = 0; i < MAX_SOUNDS; i++)
\r
575 Sounds[i].Playing = 0;
\r
576 for(i = 0; i < MAX_HITTESTS; i++)
\r
577 HitTests[i] = 0xFFFF;
\r
582 void TimerInt(void)
\r
585 TickError += FrameRate;
\r
586 if(TickError >= TIMER_RES)
\r
589 TickError -= TIMER_RES;
\r
593 if(--RepeatData == 0)
\r
595 KeyboardBuffer[KeybWritePos++] = RepeatKey;
\r
596 if(KeybWritePos >= 500)
\r
604 void SetMapPixel(unsigned short x, unsigned short y, unsigned long c, unsigned short Handle)
\r
606 if((x >= LevelWidth) || (y >= LevelHeight))
\r
609 *(unsigned long *)&LevelBuffer[Handle][(x + (y * LevelWidth)) << 2] = c;
\r
611 *(unsigned char *)&LevelBuffer[Handle][x + (y * LevelWidth)] = (unsigned short)c;
\r
614 unsigned long GetMapPixel(unsigned short x, unsigned short y, unsigned short Handle)
\r
616 if((x >= LevelWidth) || (y >= LevelHeight))
\r
619 return(*(unsigned long *)&LevelBuffer[Handle][(x + (y * LevelWidth)) << 2]);
\r
621 return((unsigned long)*(unsigned char *)&LevelBuffer[Handle][x + (y * LevelWidth)]);
\r
624 void ShowMap(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, unsigned short MapX, unsigned short MapY)
\r
626 unsigned short Window;
\r
627 unsigned short cwx, cwy;
\r
630 unsigned short CurFrame;
\r
631 unsigned char Template;
\r
633 if((MapX >= LevelWidth) || (MapY >= LevelHeight))
\r
635 DBSetClip(x1, y1, x2, y2);
\r
636 cwx = (MapX / 2) % Caches[BGSprite]->w;
\r
637 cwy = (MapY / 2) % Caches[BGSprite]->h;
\r
639 for(y = (signed short)(y1 - Caches[BGSprite]->h); y < (signed short)(y2 + Caches[BGSprite]->h); y += Caches[BGSprite]->h)
\r
641 for(x = (signed short)(x1 - Caches[BGSprite]->w); x < (signed short)(x2 + Caches[BGSprite]->w); x += Caches[BGSprite]->w)
\r
643 DBCopyBufferClip((signed short)x - cwx, (signed short)y - cwy, Caches[BGSprite]->Frames[BGFrame], Caches[BGSprite]->w, Caches[BGSprite]->h, -1);
\r
647 DBCopyBufferClip((signed short)x1 - (signed short)MapX, (signed short)y1 - (signed short)MapY, LevelBuffer[0], LevelWidth, LevelHeight, 0);
\r
648 //DBCopyMapBufferClip((signed short)x1 - (signed short)MapX, (signed short)y1 - (signed short)MapY, LevelBuffer[0], LevelBuffer[1], LevelWidth, LevelHeight);
\r
649 for(i = 0; i < MAX_LINES; i++)
\r
651 if(Lines[i]->Used > 0)
\r
653 if(Lines[i]->UseSprite != 0xFF)
\r
655 if(Lines[i]->Transparent != 0)
\r
656 DBSpriteLineTrans(Lines[i]->x1 - MapX + x1 - Caches[Lines[i]->UseSprite]->cx[Lines[i]->CurFrame], Lines[i]->y1 - MapY + y1 - Caches[Lines[i]->UseSprite]->cy[Lines[i]->CurFrame], Lines[i]->x2 - MapX + x1 - Caches[Lines[i]->UseSprite]->cx[Lines[i]->CurFrame], Lines[i]->y2 - MapY + y1 - Caches[Lines[i]->UseSprite]->cy[Lines[i]->CurFrame], Caches[Lines[i]->UseSprite]->Frames[Lines[i]->CurFrame], Caches[Lines[i]->UseSprite]->w, Caches[Lines[i]->UseSprite]->h, Lines[i]->Transparent - 1);
\r
658 DBSpriteLine(Lines[i]->x1 - MapX + x1 - Caches[Lines[i]->UseSprite]->cx[Lines[i]->CurFrame], Lines[i]->y1 - MapY + y1 - Caches[Lines[i]->UseSprite]->cy[Lines[i]->CurFrame], Lines[i]->x2 - MapY + x1 - Caches[Lines[i]->UseSprite]->cx[Lines[i]->CurFrame], Lines[i]->y2 - MapY + y1 - Caches[Lines[i]->UseSprite]->cy[Lines[i]->CurFrame], Caches[Lines[i]->UseSprite]->Frames[Lines[i]->CurFrame], Caches[Lines[i]->UseSprite]->w, Caches[Lines[i]->UseSprite]->h);
\r
660 if(Lines[i]->Transparent != 0)
\r
661 DBLineTrans(Lines[i]->x1 - MapX + x1, Lines[i]->y1 - MapY + y1, Lines[i]->x2 - MapX + x1, Lines[i]->y2 - MapY + y1, Lines[i]->c1, Lines[i]->c2, Lines[i]->Transparent - 1);
\r
663 DBLine(Lines[i]->x1 - MapX + x1, Lines[i]->y1 - MapY + y1, Lines[i]->x2 - MapX + x1, Lines[i]->y2 - MapY + y1, Lines[i]->c1, Lines[i]->c2);
\r
667 for(i = 0; i < MAX_PIXELS; i++)
\r
669 if(Pixels[i]->Used == 1)
\r
670 DBPSetC((unsigned short)(Pixels[i]->x - MapX + x1), (unsigned short)(Pixels[i]->y - MapY + y1), Pixels[i]->c);
\r
672 for(i = 0; i < MAX_SPRITES; i++)
\r
674 if(Sprites[i]->Used == 1)
\r
676 CurFrame = Sprites[i]->CurFrame;
\r
677 Template = Sprites[i]->Template;
\r
678 CurFrame %= Caches[Template]->NumFrames;
\r
679 if(Sprites[i]->Transparent != 0)
\r
680 DBCopyBufferClipTrans((signed short)(Sprites[i]->x - MapX - Caches[Template]->cx[CurFrame] + x1), (signed short)(Sprites[i]->y - MapY - Caches[Template]->cy[CurFrame] + y1), Caches[Template]->Frames[CurFrame], Caches[Template]->w, Caches[Template]->h, 0, Sprites[i]->Transparent - 1);
\r
682 DBCopyBufferClip((signed short)(Sprites[i]->x - MapX - Caches[Template]->cx[CurFrame] + x1), (signed short)(Sprites[i]->y - MapY - Caches[Template]->cy[CurFrame] + y1), Caches[Template]->Frames[CurFrame], Caches[Template]->w, Caches[Template]->h, 0);
\r
685 for(i = 0; i < MAX_RASTERS; i++)
\r
687 if(Rasters[i]->Used == 1)
\r
689 if(Rasters[i]->Type == 0)
\r
691 if(Rasters[i]->Transparent != 0)
\r
692 DBFPolyTrans(x1 - MapX + Rasters[i]->x1, y1 - MapY + Rasters[i]->y1, x1 - MapX + Rasters[i]->x2, y1 - MapY + Rasters[i]->y2, x1 - MapX + Rasters[i]->x3, y1 - MapY + Rasters[i]->y3, Rasters[i]->Color, Rasters[i]->Transparent - 1);
\r
694 DBFPoly(x1 - MapX + Rasters[i]->x1, y1 - MapY + Rasters[i]->y1, x1 - MapX + Rasters[i]->x2, y1 - MapY + Rasters[i]->y2, x1 - MapX + Rasters[i]->x3, y1 - MapY + Rasters[i]->y3, Rasters[i]->Color);
\r
696 if(Rasters[i]->Type == 1)
\r
698 if(Rasters[i]->Transparent != 0)
\r
699 DBFCircleTrans(x1 - MapX + Rasters[i]->x1, y1 - MapY + Rasters[i]->y1, Rasters[i]->x2, Rasters[i]->Color, 1, 1, Rasters[i]->Transparent - 1);
\r
701 DBFCircle(x1 - MapX + Rasters[i]->x1, y1 - MapY + Rasters[i]->y1, Rasters[i]->x2, Rasters[i]->Color, 1, 1);
\r
705 /*for(y = (signed short)(y1 - Caches[FogSprite]->h); y < (signed short)(y2 + Caches[FogSprite]->h); y += Caches[FogSprite]->h)
\r
707 for(x = (signed short)(x1 - Caches[FogSprite]->w); x < (signed short)(x2 + Caches[FogSprite]->w); x += Caches[FogSprite]->w)
\r
709 DBCopyBufferClipTrans((signed short)x - FogX, (signed short)y - FogY, Caches[FogSprite]->Frames[0], Caches[FogSprite]->w, Caches[FogSprite]->h, -1, 1);
\r
712 DBSetClip(0, 0, 319, 199);
\r
715 unsigned char PlaySound(unsigned short Sound, unsigned char Repeat, unsigned short StartSound, unsigned short EndSound, unsigned long Pitch, float Volume)
\r
719 for(i = StartSound; i <= EndSound; i++)
\r
721 if(Sounds[i].Playing == 0)
\r
723 Sounds[i].Sound = Sound;
\r
724 Sounds[i].Repeat = Repeat;
\r
725 Sounds[i].Offset = 0;
\r
726 Sounds[i].Pitch = Pitch;
\r
727 Sounds[i].Volume = Volume;
\r
728 Sounds[i].PitchError = 0;
\r
729 Sounds[i].Playing = 1;
\r
736 void InitCodeTable(void)
\r
742 for(i = 0; i < 4096; i++)
\r
744 Codes[i].Parent = -1;
\r
745 Codes[i].Size = -1;
\r
746 Codes[i].Value = -1;
\r
750 signed short FindCode(signed long Value, signed short Parent)
\r
754 for(i = 0; i < (1 << CurComp); i++)
\r
756 if((Codes[i].Value == Value) && (Codes[i].Parent == Parent))
\r
762 unsigned long ReadVarLen(KvidFile *FileStr)
\r
764 unsigned long Value;
\r
765 unsigned char Finished, Shift;
\r
768 Finished = Shift = 0;
\r
769 while(Finished == 0)
\r
771 if(FileReadBits(1, FileStr) == 1)
\r
773 Value += FileReadBits(7, FileStr) << Shift;
\r
779 unsigned char AddCode(signed long Value, signed short Parent)
\r
781 Codes[CurNew].Value = Value;
\r
782 Codes[CurNew].Parent = Parent;
\r
784 Codes[CurNew].Size = 0;
\r
786 Codes[CurNew].Size = Codes[Parent].Size + 1;
\r
787 if(++CurNew == (1 << CurComp))
\r
789 if(++CurComp >= 13)
\r
798 unsigned char LoadNewLevel(KvidFile *LevelFile)
\r
800 unsigned short i, p, x, y;
\r
801 unsigned short CC, CurCode;
\r
802 signed short Parent, CodeNum, Length, RLECount;
\r
803 signed long Col, LastCol;
\r
804 unsigned char InRLE, InCode, SType, NoAdd, HasParent, ReInited;
\r
807 FileRead((void *)&LevelWidth, 2, LevelFile);
\r
808 FileRead((void *)&LevelHeight, 2, LevelFile);
\r
809 DispLevelWidth = LevelWidth;
\r
810 DispLevelHeight = LevelHeight;
\r
811 for(p = 0; p < 2; p++)
\r
815 InRLE = InCode = 0;
\r
818 for(y = 0; y < LevelHeight; y++)
\r
820 for(x = 0; x < LevelWidth; x++)
\r
823 if((InRLE == 0) && (InCode == 0))
\r
825 InRLE = FileReadBits(1, LevelFile);
\r
826 SType = FileReadBits(2, LevelFile);
\r
828 RLECount = ReadVarLen(LevelFile);
\r
832 CurCode = FileReadBits(CurComp, LevelFile);
\r
833 Length = Codes[CurCode].Size;
\r
835 for(i = 0; i < Length; i++)
\r
836 CC = Codes[CC].Parent;
\r
837 Col = Codes[CC].Value;
\r
840 Col = FileReadBits(16, LevelFile);
\r
845 if((CodeNum = FindCode(LastCol, -1)) == -1)
\r
848 ReInited = AddCode(LastCol, -1);
\r
851 ReInited = (FindCode(Col, CodeNum) == -1)?0:1;
\r
858 AddCode(Col, Parent);
\r
860 if(FindCode(Col, -1) == -1)
\r
867 for(i = 0; i < Length; i++)
\r
868 CC = Codes[CC].Parent;
\r
869 Col = Codes[CC].Value;
\r
874 if(--RLECount <= 0)
\r
875 InRLE = InCode = 0;
\r
877 Length = Codes[CurCode].Size;
\r
890 if(--RLECount <= 0)
\r
895 SetMapPixel(x, y, Color16To32((unsigned short)Col), p);
\r
897 SetMapPixel(x, y, Col, p);
\r
901 SpawnObject(0, -1, 0, 0, 0, 0);
\r
902 FileClose(LevelFile);
\r
906 unsigned char LoadBMPLevel(KvidFile *LevelFile)
\r
908 unsigned short x, y;
\r
909 unsigned long Buffer;
\r
913 FileSkip(LevelFile, 16);
\r
914 FileRead((void *)&Buffer, 4, LevelFile);
\r
915 LevelWidth = DispLevelWidth = (unsigned short)Buffer;
\r
916 FileRead((void *)&Buffer, 4, LevelFile);
\r
917 LevelHeight = DispLevelHeight = (unsigned short)Buffer;
\r
918 FileSkip(LevelFile, 28);
\r
919 for(y = LevelHeight; y > 0; y--)
\r
921 for(x = 0; x < LevelWidth; x++)
\r
923 FileRead((void *)&Col, 3, LevelFile);
\r
925 SetMapPixel(x, y - 1, *(unsigned long *)&Col, 0);
\r
926 if((Col.R == 0) && (Col.G == 0) && (Col.B == 0))
\r
928 SetMapPixel(x, y - 1, MAP_WALKABLE | MAP_SHOOTABLE, 1);
\r
930 if((Col.R == Col.G) && (Col.R == Col.B))
\r
931 SetMapPixel(x, y - 1, 0, 1);
\r
933 SetMapPixel(x, y - 1, MAP_DESTROYABLE, 1);
\r
936 FileSkip(LevelFile, LevelWidth % 4);
\r
938 FileClose(LevelFile);
\r
939 SpawnObject(0, -1, 0, 0, 0, 0);
\r
943 unsigned char LoadLevel(unsigned char *Name)
\r
945 KvidFile LevelFile, PalFile;
\r
946 unsigned long Offset, Size;
\r
947 unsigned short x, y, Count, Count2, Signature, i, o;
\r
948 unsigned char Handle, RLEBase, c;
\r
949 signed short ox, oy;
\r
950 signed char Change, PalChange;
\r
953 DBFRect(0, 0, 319, 199, MakeColor(0, 0, 0));
\r
954 if(OpenFile(Name, &LevelFile) == 0)
\r
956 FileRead((void *)&Signature, 2, &LevelFile);
\r
957 if(Signature == 0x4C4E)
\r
958 return(LoadNewLevel(&LevelFile));
\r
959 if(Signature == 0x4D42)
\r
960 return(LoadBMPLevel(&LevelFile));
\r
961 if(Signature != 0x464B)
\r
964 FileRead((void *)&LevelWidth, 2, &LevelFile);
\r
966 if(LevelWidth == 0)
\r
968 FileRead((void *)&c, 1, &LevelFile);
\r
969 FileRead((void *)TextBuffer, c, &LevelFile);
\r
971 FileRead((void *)&LevelWidth, 2, &LevelFile);
\r
972 if(OpenFile(TextBuffer, &PalFile) != 0)
\r
975 FileRead((void *)Palette, sizeof(Pal) * 256, &PalFile);
\r
976 FileClose(&PalFile);
\r
979 FileRead((void *)&LevelHeight, 2, &LevelFile);
\r
980 DispLevelWidth = LevelWidth;
\r
981 DispLevelHeight = LevelHeight;
\r
982 FileRead((void *)&RLEBase, 1, &LevelFile);
\r
983 Size = LevelWidth * LevelHeight;
\r
984 for(Handle = 0; Handle < 2; Handle++)
\r
989 for(Offset = 0; Offset < Size; Offset++)
\r
995 c = FileGetChar(&LevelFile);
\r
998 Count = (c - RLEBase) + 1;
\r
999 c = FileGetChar(&LevelFile);
\r
1002 if((Offset & 0xFFFF) == 0)
\r
1004 sprintf(TextBuffer, "Loading %s... %u%%\0", Name, (unsigned short)(50 * ((double)Offset / (double)Size)) + (Handle * 50));
\r
1005 DBPrint(TextBuffer, 0, 0, 255);
\r
1009 SetMapPixel(x, y, MakeColor(Palette[c].r, Palette[c].g, Palette[c].b), Handle);
\r
1011 SetMapPixel(x, y, (unsigned long)c, Handle);
\r
1012 if(++x >= LevelWidth)
\r
1019 if(PalChange == 1)
\r
1021 if(OpenFile("DefaultPalette", &PalFile) != 0)
\r
1023 FileRead((void *)Palette, sizeof(Pal) * 256, &PalFile);
\r
1024 FileClose(&PalFile);
\r
1027 FileRead((void *)&Count, 2, &LevelFile);
\r
1029 for(i = 0; i < Count; i++)
\r
1031 FileRead((void *)&Signature, 2, &LevelFile);
\r
1032 FileRead((void *)&x, 2, &LevelFile);
\r
1033 FileRead((void *)&y, 2, &LevelFile);
\r
1034 FileRead((void *)&Count2, 2, &LevelFile);
\r
1035 for(o = 0; o < Count2; o++)
\r
1037 Regs[FileGetChar(&LevelFile) + (FileGetChar(&LevelFile) << 8)] = FileGetChar(&LevelFile) + (FileGetChar(&LevelFile) << 8);
\r
1039 SpawnObject(Signature, -1, x, y, 0, 0);
\r
1041 FileClose(&LevelFile);
\r
1042 if(GameType == 255)
\r
1043 SpawnObject(0, -1, 0, 0, 0, 0);
\r
1044 /*for(Offset = 0; Offset < 300; Offset++)
\r
1046 x = (unsigned short)(rand() % LevelWidth);
\r
1047 y = (unsigned short)(rand() % LevelWidth);
\r
1048 while(GetMapPixel(x, y, 0) != MakeColor(Palette[6].r, Palette[6].g, Palette[6].b))
\r
1050 x = (unsigned short)(rand() % LevelWidth);
\r
1051 y = (unsigned short)(rand() % LevelWidth);
\r
1053 for(oy = -1; oy <= 1; oy++)
\r
1055 for(ox = -1; ox <= 1; ox++)
\r
1057 Signature = GetMapPixel(x, y, 0);
\r
1058 Col = *(Color *)&Signature;
\r
1059 if((ox == 0) && (oy == 0))
\r
1061 if((ox != 0) && (oy == 0) || (ox == 0) && (oy != 0))
\r
1063 if((ox != 0) && (oy != 0))
\r
1065 SetMapPixel((signed short)x + ox, (signed short)y + oy, MakeColor(Col.r - Change, Col.g - (Change << 1), Col.b - Change), 0);
\r
1066 sprintf(TextBuffer, "Loading %s... %u%%\0", Name, (unsigned short)(100 * ((double)Offset / (double)300)));
\r
1067 DBPrint(TextBuffer, 0, 0, 255);
\r
1075 void RandomLevel(void)
\r
1077 unsigned short x, y, i, o;
\r
1078 unsigned char c0, c1, c2, c3, c4;
\r
1080 for(y = 0; y < LevelHeight; y++)
\r
1082 for(x = 0; x < LevelWidth; x++)
\r
1084 //SetMapPixel(x, y, (unsigned char)((rand() % 4) + 20), 0);
\r
1085 SetMapPixel(x, y, 0, 0);
\r
1088 for(y = 0; y < LevelHeight; y++)
\r
1090 for(x = 0; x < LevelWidth; x++)
\r
1092 SetMapPixel(x, y, MAP_WALKABLE | MAP_SHOOTABLE | MAP_DESTROYABLE, 1);
\r
1095 for(i = 0; i < 75; i++)
\r
1097 x = rand() % LevelWidth;
\r
1098 y = rand() % LevelHeight;
\r
1099 CopyToMap(x - 15, y - 11, Caches[11]->Frames[rand() % Caches[11]->NumFrames], Caches[11]->w, Caches[11]->h, 0, 0, 0, 0);
\r
1101 for(i = 0; i < 150; i++)
\r
1103 x = rand() % LevelWidth;
\r
1104 y = rand() % LevelHeight;
\r
1105 CopyToMap(x - Caches[0]->cx[0], y - Caches[0]->cy[0], Caches[0]->Frames[0], Caches[0]->w, Caches[0]->h, 0, 3, 0, MAP_DESTROYABLE);
\r
1107 /*for(y = 0; y < LevelHeight; y++)
\r
1109 for(x = 0; x < LevelWidth; x++)
\r
1111 c0 = GetMapPixel(x, y, 0);
\r
1114 c1 = GetMapPixel(x - 1, y, 0);
\r
1115 c2 = GetMapPixel(x + 1, y, 0);
\r
1116 c3 = GetMapPixel(x, y - 1, 0);
\r
1117 c4 = GetMapPixel(x, y + 1, 0);
\r
1118 c1 = (c1 == 0)?c0:c1;
\r
1119 c2 = (c2 == 0)?c0:c2;
\r
1120 c3 = (c3 == 0)?c0:c3;
\r
1121 c4 = (c4 == 0)?c0:c4;
\r
1122 SetMapPixel(x, y, (unsigned char)((c1 + c2 + c3 + c4) >> 2), 0);
\r
1126 for(i = 0; i < 100; i++)
\r
1128 x = rand() % LevelWidth;
\r
1129 y = rand() % LevelHeight;
\r
1130 while((GetMapPixel(x, y, 1) & MAP_WALKABLE) == 0)
\r
1132 x = rand() % LevelWidth;
\r
1133 y = rand() % LevelHeight;
\r
1135 while((GetMapPixel(x, y, 1) & MAP_WALKABLE) == MAP_WALKABLE)
\r
1137 c0 = rand() % Caches[12]->NumFrames;
\r
1138 CopyToMap(x - Caches[12]->cx[c0], y - Caches[12]->cy[c0], Caches[12]->Frames[c0], Caches[12]->w, Caches[12]->h, 0, 0, 0, MAP_WALKABLE | MAP_TEMPORARY);
\r
1140 for(i = 0; i < 4; i++)
\r
1142 for(o = 0; o < 15; o++)
\r
1144 x = rand() % LevelWidth;
\r
1145 y = rand() % LevelHeight;
\r
1146 while((GetMapPixel(x, y, 1) & MAP_WALKABLE) == 0)
\r
1148 x = rand() % (LevelWidth / 10);
\r
1149 y = rand() % (LevelHeight / 10);
\r
1152 while((GetMapPixel(x, ++y, 1) & MAP_WALKABLE) == MAP_WALKABLE);
\r
1154 while((GetMapPixel(--x, y, 1) & MAP_WALKABLE) == MAP_WALKABLE);
\r
1156 while((GetMapPixel(x, --y, 1) & MAP_WALKABLE) == MAP_WALKABLE);
\r
1158 while((GetMapPixel(++x, y, 1) & MAP_WALKABLE) == MAP_WALKABLE);
\r
1159 c0 = rand() % Caches[12]->NumFrames;
\r
1161 SpawnObject(93, -1, x, y, 0, 0);
\r
1164 for(y = 0; y < LevelHeight; y++)
\r
1166 for(x = 0; x < LevelWidth; x++)
\r
1168 if((GetMapPixel(x, y, 1) & MAP_TEMPORARY) == MAP_TEMPORARY)
\r
1169 SetMapPixel(x, y, MAP_DESTROYABLE, 1);
\r
1172 strcpy(LevelFileName, "Random");
\r
1173 DispLevelWidth = LevelWidth;
\r
1174 DispLevelHeight = LevelHeight;
\r
1175 SpawnObject(0, -1, 0, 0, 0, 0);
\r
1178 void DrawScreen(void)
\r
1180 unsigned short i, o, cx, cy;
\r
1181 signed short tx, ty, CurWeapon, x, y, x2, y2;
\r
1187 DBFRectTrans(0, 0, 319, 199, MakeColor(16, 16, 16), 1);
\r
1189 for(i = 0; i < MAX_PLAYERS; i++)
\r
1191 if(Players[i]->Visual == 1)
\r
1193 x = Objects[Players[i]->VPObject]->x;
\r
1194 y = Objects[Players[i]->VPObject]->y;
\r
1195 cx = (Players[i]->VPointX2 - Players[i]->VPointX1) >> 1;
\r
1196 cy = (Players[i]->VPointY2 - Players[i]->VPointY1) >> 1;
\r
1197 if(x > LevelWidth - cx - 2) x = LevelWidth - cx - 2;
\r
1198 if(y > LevelHeight - cy - 2) y = LevelHeight - cy - 2;
\r
1199 if(x < cx) x = cx;
\r
1200 if(y < cy) y = cy;
\r
1201 ShowMap(Players[i]->VPointX1, Players[i]->VPointY1, Players[i]->VPointX2, Players[i]->VPointY2, x - cx, y - cy);
\r
1202 //*(unsigned long *)(Players[i]->Masks[0].Buffer + ((((unsigned short)Objects[Players[i]->Object]->y - (y - cy)) * (Players[i]->VPointX2 - Players[i]->VPointX1 + 1) + ((unsigned short)Objects[Players[i]->Object]->x - (x - cx))) << 2)) = MakeColor(255, 0, 0);
\r
1203 DBSetClip(Players[i]->VPointX1, Players[i]->VPointY1, Players[i]->VPointX2, Players[i]->VPointY2);
\r
1204 for(o = 0; o < NUM_MASKS; o++)
\r
1206 if(Players[i]->Masks[o].Method != 0)
\r
1207 DBCopyBufferClipTrans(Players[i]->VPointX1, Players[i]->VPointY1, Players[i]->Masks[o].Buffer, Players[i]->VPointX2 - Players[i]->VPointX1 + 1, Players[i]->VPointY2 - Players[i]->VPointY1 + 1, -1, Players[i]->Masks[o].Method - 1);
\r
1209 x2 = (unsigned short)((unsigned short)(Objects[Players[i]->Object]->x) + (Cosine[(unsigned short)Players[i]->Angle] * ((Players[i]->Dir == 0)?15:-15)) - x + cx + Players[i]->VPointX1 + ((Players[i]->Dir == 0)?3:-2));
\r
1210 y2 = (unsigned short)((unsigned short)(Objects[Players[i]->Object]->y) - (Sine[(unsigned short)Players[i]->Angle] * 15) - y + cy + Players[i]->VPointY1 - 2);
\r
1211 DBPSetCTrans(x2 - 1, y2, Players[i]->CrossColor, 2);
\r
1212 DBPSetCTrans(x2 + 1, y2, Players[i]->CrossColor, 2);
\r
1213 DBPSetCTrans(x2, y2 - 1, Players[i]->CrossColor, 2);
\r
1214 DBPSetCTrans(x2, y2 + 1, Players[i]->CrossColor, 2);
\r
1215 if(Players[i]->Change)
\r
1217 tx = (signed short)(Objects[Players[i]->Object]->x - x + cx + Players[i]->VPointX1 - (Weapons[PWeapons[i][Players[i]->CurWeapon]->Weapon]->NameLength * 2));
\r
1218 ty = (signed short)(Objects[Players[i]->Object]->y - y + cy + Players[i]->VPointY1 - 20);
\r
1219 DBPrint((unsigned char *)&Strings[Weapons[PWeapons[i][Players[i]->CurWeapon]->Weapon]->Name], tx, ty, 0);
\r
1221 DBSetClip(0, 0, 319, 199);
\r
1222 CurWeapon = Players[i]->CurWeapon;
\r
1223 if(PWeapons[i][CurWeapon]->ReloadTimer == 0)
\r
1224 Per = (float)PWeapons[i][CurWeapon]->AmmoLeft / (float)Weapons[PWeapons[i][Players[i]->CurWeapon]->Weapon]->Ammo;
\r
1226 Per = (float)PWeapons[i][CurWeapon]->ReloadTimer / (float)Weapons[PWeapons[i][CurWeapon]->Weapon]->ReloadDelay;
\r
1228 DBFRect(Players[i]->AMeterX1, Players[i]->AMeterY1, Players[i]->AMeterX1 + (signed short)(Per * (Players[i]->AMeterX2 - Players[i]->AMeterX1)), Players[i]->AMeterY2, MakeColor(255 - (Per * 255), 0, 255));
\r
1229 Per = (float)Players[i]->Health / (float)Players[i]->MaxHealth;
\r
1233 DBFRect(Players[i]->LMeterX1, Players[i]->LMeterY1, Players[i]->LMeterX1 + (signed short)(Per * (Players[i]->LMeterX2 - Players[i]->LMeterX1)), Players[i]->LMeterY2, MakeColor(255 - ((Per - 0.5) * 254), 255, 0));
\r
1235 DBFRect(Players[i]->LMeterX1, Players[i]->LMeterY1, Players[i]->LMeterX1 + (signed short)(Per * (Players[i]->LMeterX2 - Players[i]->LMeterX1)), Players[i]->LMeterY2, MakeColor(255, 510 * Per, 0));
\r
1237 sprintf(TextBuffer, "Lives: %i\0", Players[i]->Lives);
\r
1238 DBPrint(TextBuffer, Players[i]->lx, Players[i]->ly, 255);
\r
1239 sprintf(TextBuffer, "Kills: %i\0", Players[i]->Kills);
\r
1240 DBPrint(TextBuffer, Players[i]->kx, Players[i]->ky, 255);
\r
1241 if(Weapons[PWeapons[i][CurWeapon]->Weapon]->MaxClips > 0)
\r
1243 sprintf(TextBuffer, "Ammo: %i\0", PWeapons[i][CurWeapon]->NumClips);
\r
1244 DBPrint(TextBuffer, Players[i]->cx, Players[i]->cy, 255);
\r
1248 DBPrint(TextBuffer, 319 - (sprintf(TextBuffer, "%s (%u x %u)", LevelFileName, DispLevelWidth, DispLevelHeight) * 4), 194, 255);
\r
1249 sprintf(TextBuffer, "%l08X", GetMapPixel(Objects[Players[1]->Object]->x, Objects[Players[1]->Object]->y, KeyTable[2]));
\r
1250 DBPrint(TextBuffer, 0, 194, 255);
\r
1252 for(y = 0; y < 40; y++)
\r
1254 for(x = 0; x < 64; x++)
\r
1256 DBPSetCTrans(128 + x, 160 + y, GetMapPixel((float)x * ((float)LevelWidth / 64), (float)y * ((float)LevelHeight / 40), 0), 2);
\r
1259 for(i = 0; i < MAX_PLAYERS; i++)
\r
1261 if(Players[i]->Used == 1)
\r
1263 DBPSetC(128 + (unsigned short)((float)Objects[Players[i]->Object]->x / ((float)LevelWidth / 64)), 160 + (unsigned short)((float)Objects[Players[i]->Object]->y / ((float)LevelHeight / 40)), MakeColor(200, 100, 0));
\r
1267 DBCopyBufferClip(143, 180, Caches[15]->Frames[0], Caches[15]->w, Caches[15]->h, 0);
\r
1271 unsigned short CalcAngle(signed short x1, signed short y1, signed short x2, signed short y2)
\r
1283 a = atan((double)(y1 - y2) / (double)(x1 - x2));
\r
1286 if((y1 >= y2) && (x1 < x2))
\r
1288 if((y1 >= y2) && (x1 >= x2))
\r
1293 if((y1 < y2) && (x1 >= x2))
\r
1295 if((y1 < y2) && (x1 < x2))
\r
1300 return((unsigned short)(((a + (Q * 1.570796)) / 3.141593) * 180));
\r
1303 unsigned long MakeColor(unsigned char R, unsigned char G, unsigned char B)
\r
1305 return(((unsigned short)R << 16) + ((unsigned short)G << 8) + (unsigned short)B);
\r
1308 unsigned char GetEvents(void)
\r
1313 while(SDL_PollEvent(&e))
\r
1315 if(e.type == SDL_QUIT)
\r
1317 if(e.type == SDL_KEYDOWN)
\r
1319 for(i = 0; sdlmap[i].sdl != -1; i++)
\r
1321 if(sdlmap[i].sdl == e.key.keysym.sym)
\r
1324 if(sdlmap[i].sdl != -1)
\r
1326 KeyTable[sdlmap[i].dos] = 1;
\r
1327 RepeatKey = sdlmap[i].dos;
\r
1328 RepeatData = ntime() + 0.25;
\r
1329 KeyboardBuffer[KeybWritePos++] = sdlmap[i].dos;
\r
1330 if(KeybWritePos >= 500)
\r
1334 if(e.type == SDL_KEYUP)
\r
1336 for(i = 0; sdlmap[i].sdl != -1; i++)
\r
1338 if(sdlmap[i].sdl == e.key.keysym.sym)
\r
1341 if(sdlmap[i].sdl != -1)
\r
1343 KeyTable[sdlmap[i].dos] = 0;
\r
1348 if((RepeatKey != 0) && (ntime() > RepeatData))
\r
1350 KeyboardBuffer[KeybWritePos++] = RepeatKey;
\r
1351 if(KeybWritePos >= 500)
\r
1353 RepeatData = ntime() + 0.025;
\r
1358 void GetInputs(void)
\r
1360 unsigned char i, o, u;
\r
1362 for(i = 0; i < MAX_PLAYERS; i++)
\r
1364 for(o = 0; o < NUM_KEYS; o++)
\r
1366 if(((Players[i]->KeyCodes[o] & 0xFF00) == 0)?(KeyTable[Players[i]->KeyCodes[o]] == 1):((KeyTable[(Players[i]->KeyCodes[o] & 0xFF00) >> 8] == 1) && (KeyTable[Players[i]->KeyCodes[o] & 0x00FF] == 1)))
\r
1368 if((Players[i]->Keys[o] == 0) && (Players[i]->HeldKeys[o] == 0))
\r
1370 Players[i]->Keys[o] = 1;
\r
1372 Players[i]->Keys[o] = 2;
\r
1375 Players[i]->Keys[o] = 0;
\r
1378 for(o = 0; o < NUM_KEYS; o++)
\r
1379 Players[i]->HeldKeys[o] = 0;
\r
1380 for(o = 0; o < NUM_KEYS; o++)
\r
1382 if(((Players[i]->KeyCodes[o] & 0xFF00) != 0) && (Players[i]->Keys[o] != 0))
\r
1384 for(u = 0; u < NUM_KEYS; u++)
\r
1386 if((Players[i]->KeyCodes[u] == (Players[i]->KeyCodes[o] & 0x00FF)) || (Players[i]->KeyCodes[u] == ((Players[i]->KeyCodes[o] & 0xFF00) >> 8)))
\r
1388 Players[i]->Keys[u] = 0;
\r
1389 Players[i]->HeldKeys[u] = 1;
\r
1397 void SetMode(unsigned char Mode)
\r
1399 if(FullScreen != Mode)
\r
1401 SDL_WM_ToggleFullScreen(VBuffer);
\r
1402 FullScreen = Mode;
\r
1404 if(FullScreen == 0)
\r
1405 SDL_ShowCursor(SDL_ENABLE);
\r
1407 SDL_ShowCursor(SDL_DISABLE);
\r
1410 void MessageBox(unsigned char *Buffer)
\r
1412 DBFRect(68, 88, 252, 112, MakeColor(255, 0, 0));
\r
1413 DBFRect(69, 89, 251, 111, MakeColor(0, 0, 0));
\r
1414 DBPrint(Buffer, 70, 90, 255);
\r
1416 while(KeyTable[57] == 1) GetEvents();
\r
1417 while(KeyTable[57] == 0) GetEvents();
\r
1420 unsigned char LoadMod(KvidFile *ModFile)
\r
1422 unsigned short i, o, MaxPattern, Granularity, BkOffset;
\r
1423 unsigned long Signature, BkAU, u;
\r
1424 unsigned char Bytes[4], NumSamples, OldMod;
\r
1427 for(i = 0; i < MAX_SAMPLES; i++)
\r
1429 if(Samples[i].Allocated != 0)
\r
1431 Samples[i].Allocated = 0;
\r
1432 free(Samples[i].Buffer);
\r
1435 for(i = 0; i < MAX_CHANNELS; i++)
\r
1437 memset((void *)&Channels[i], 0, sizeof(ModChannel));
\r
1439 if((ModFile->DataFile == 1) || (ModFile->Parent != NULL))
\r
1441 BkAU = ModFile->CurAU;
\r
1442 BkOffset = ModFile->Offset;
\r
1444 BkAU = ftell(ModFile->FilePtr);
\r
1446 FileSkip(ModFile, 1080);
\r
1447 Signature = FileGetChar(ModFile);
\r
1448 for(i = 0; i < 3; i++)
\r
1451 Signature += FileGetChar(ModFile);
\r
1453 if((ModFile->DataFile == 1) || (ModFile->Parent != NULL))
\r
1455 ModFile->CurAU = BkAU;
\r
1456 ModFile->Offset = BkOffset;
\r
1457 ModFile->ReSeek = 1;
\r
1459 fseek(ModFile->FilePtr, BkAU, SEEK_SET);
\r
1461 FileSkip(ModFile, 20);
\r
1463 if((Signature == 0x4D2E4B2E) || (Signature == 0x4D214B21)) //"M.K." or "M!K!"
\r
1465 if(Signature == 0x3643484E) //"6CHN"
\r
1467 if(Signature == 0x3843484E) //"8CHN"
\r
1469 if(Signature == 0x31324348) //"12CH"
\r
1471 if(ModChannels == 0)
\r
1480 for(i = 0; i < NumSamples; i++)
\r
1482 FileSkip(ModFile, 22);
\r
1483 Samples[i].SampleLen = ((FileGetChar(ModFile) << 8) + FileGetChar(ModFile)) << 1;
\r
1484 Samples[i].FineTune = FileGetChar(ModFile) & 0x0F;
\r
1485 Samples[i].Volume = FileGetChar(ModFile);
\r
1486 Samples[i].LoopStart = (FileGetChar(ModFile) << 8) + FileGetChar(ModFile);
\r
1487 Samples[i].LoopLen = (FileGetChar(ModFile) << 8) + FileGetChar(ModFile);
\r
1490 Samples[i].LoopStart <<= 1;
\r
1491 Samples[i].LoopLen <<= 1;
\r
1494 ModLen = FileGetChar(ModFile);
\r
1497 ModRepeat = FileGetChar(ModFile);
\r
1499 for(i = 0; i < 128; i++)
\r
1501 if((PatternOrder[i] = FileGetChar(ModFile)) > MaxPattern)
\r
1502 MaxPattern = PatternOrder[i];
\r
1504 if(NumSamples > 15)
\r
1505 FileSkip(ModFile, 4);
\r
1506 Granularity = 64 * ModChannels;
\r
1507 for(i = 0; i <= MaxPattern; i++)
\r
1509 for(o = 0; o < Granularity; o++)
\r
1511 Buffer = &Patterns[(i * Granularity) + o];
\r
1512 FileRead((void *)Bytes, 4, ModFile);
\r
1513 Buffer->Period = ((Bytes[0] & 0x0F) << 8) | Bytes[1];
\r
1514 Buffer->Sample = (Bytes[0] & 0xF0) | ((Bytes[2] & 0xF0) >> 4);
\r
1515 Buffer->Effect = Bytes[2] & 0x0F;
\r
1516 Buffer->EffectData = Bytes[3];
\r
1519 for(i = 0; i < NumSamples; i++)
\r
1521 if(Samples[i].SampleLen > 0)
\r
1523 //Samples[i].SampleLen = SoundCaches[15]->Length;
\r
1524 if((Samples[i].Buffer = (unsigned char *)malloc(Samples[i].SampleLen)) == NULL)
\r
1526 FileRead((void *)Samples[i].Buffer, Samples[i].SampleLen, ModFile);
\r
1527 //for(u = 0; u < Samples[i].SampleLen; u++)
\r
1528 // Samples[i].Buffer[u] = (signed char)((signed short)(SoundCaches[15]->SoundBuffer[u]) - 128);
\r
1529 Samples[i].Allocated = 1;
\r
1540 unsigned char LoadSprite(unsigned char *ID, unsigned short CacheNum)
\r
1542 unsigned short i, o, Found;
\r
1543 KvidFile SpriteFile;
\r
1545 if(OpenFile(ID, &SpriteFile) == 0)
\r
1547 FileRead((void *)&Caches[CacheNum]->w, 2, &SpriteFile);
\r
1548 FileRead((void *)&Caches[CacheNum]->h, 2, &SpriteFile);
\r
1549 FileRead((void *)&Caches[CacheNum]->NumFrames, 1, &SpriteFile);
\r
1550 FileRead((void *)&Caches[CacheNum]->AnimDelay, 1, &SpriteFile);
\r
1551 if((Caches[CacheNum]->cx = (signed short *)malloc(Caches[CacheNum]->NumFrames * 2)) == NULL)
\r
1553 if((Caches[CacheNum]->cy = (signed short *)malloc(Caches[CacheNum]->NumFrames * 2)) == NULL)
\r
1555 if((Caches[CacheNum]->Frames = (unsigned char **)malloc(Caches[CacheNum]->NumFrames * 4)) == NULL)
\r
1557 for(o = 0; o < Caches[CacheNum]->NumFrames; o++)
\r
1559 FileRead((void *)&Caches[CacheNum]->cx[o], 2, &SpriteFile);
\r
1560 FileRead((void *)&Caches[CacheNum]->cy[o], 2, &SpriteFile);
\r
1561 if((Caches[CacheNum]->Frames[o] = (unsigned char *)malloc(Caches[CacheNum]->w * Caches[CacheNum]->h * 4)) == NULL)
\r
1563 FileRead((void *)Caches[CacheNum]->Frames[o], Caches[CacheNum]->w * Caches[CacheNum]->h * 4, &SpriteFile);
\r
1565 FileClose(&SpriteFile);
\r
1569 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
1573 for(i = 0; i < MAX_SPRITES; i++)
\r
1575 if(Sprites[i]->Used == 0)
\r
1577 Sprites[i]->x = x;
\r
1578 Sprites[i]->y = y;
\r
1579 Sprites[i]->xv = xv;
\r
1580 Sprites[i]->yv = yv;
\r
1581 Sprites[i]->AnimTimer = 0;
\r
1582 Sprites[i]->AnimCount = AnimCount;
\r
1583 Sprites[i]->AnimDelay = Caches[Template]->AnimDelay;
\r
1584 Sprites[i]->CurFrame = StartFrame;
\r
1585 Sprites[i]->Template = Template;
\r
1586 Sprites[i]->Transparent = Transparent;
\r
1587 Sprites[i]->Used = 1;
\r
1594 void FillBuffer(void)
\r
1596 unsigned short i, o;
\r
1597 unsigned long Offset;
\r
1598 signed short Data, Data2;
\r
1599 unsigned short ModBPD;
\r
1600 unsigned short SampleRate;
\r
1601 unsigned char Temp;
\r
1605 for(i = 0; i < SB_SIZE >> 1; i++)
\r
1607 SoundBuffer[i] = 128;
\r
1609 for(i = 0; i < MAX_SOUNDS; i++)
\r
1611 if(Sounds[i].Playing == 1)
\r
1613 for(o = 0; o < SB_SIZE >> 1; o++)
\r
1615 Sounds[i].PitchError += Sounds[i].Pitch;
\r
1616 while(Sounds[i].PitchError >= SBSampleRate)
\r
1618 Sounds[i].PitchError -= SBSampleRate;
\r
1619 Sounds[i].Offset++;
\r
1621 if(Sounds[i].Offset >= SoundCaches[Sounds[i].Sound]->Length)
\r
1623 if(Sounds[i].Repeat == 0)
\r
1625 Sounds[i].Playing = 0;
\r
1628 Sounds[i].Offset = 0;
\r
1631 Data = ((signed short)SoundBuffer[o] - 128);
\r
1632 Data += (((signed short)(SoundCaches[Sounds[i].Sound]->SoundBuffer[Sounds[i].Offset] - 128) * Sounds[i].Volume) / 4);
\r
1637 SoundBuffer[o] = (unsigned char)(Data + 128);
\r
1641 if(ModPlaying != 0)
\r
1643 ModBPD = (SBSampleRate * 5 * ModTPD) / (ModBPM * 2);
\r
1644 if(KeyTable[5] == 1)
\r
1646 for(i = 0; i < SB_SIZE >> 1; i++)
\r
1649 for(o = 0; o < ModChannels; o++)
\r
1651 if(ModOffset == 0)
\r
1653 Buffer = &Patterns[(((PatternOrder[ModPattern] << 6) + ModRow) * ModChannels) + o];
\r
1654 if(Buffer->Period != 0)
\r
1656 Channels[o].Playing = 1;
\r
1657 Channels[o].OldPeriod = Channels[o].CurPeriod;
\r
1658 Channels[o].Period = Channels[o].CurPeriod = Buffer->Period;
\r
1659 Channels[o].Offset = 0;
\r
1660 Channels[o].Looping = 0;
\r
1661 Channels[o].Reminder = 0;
\r
1662 Channels[o].Effect = 0;
\r
1663 Channels[o].EffectData.b = 0;
\r
1665 if(Buffer->Sample != 0)
\r
1667 if((Samples[Buffer->Sample - 1].SampleLen > 0) && (Samples[Buffer->Sample - 1].Volume > 0))
\r
1669 Channels[o].Playing = 1;
\r
1670 Channels[o].Sample = Buffer->Sample - 1;
\r
1671 Channels[o].Volume = Channels[o].CurVolume = Samples[Buffer->Sample - 1].Volume;
\r
1672 Channels[o].Offset = 0;
\r
1673 Channels[o].Looping = 0;
\r
1674 Channels[o].Reminder = 0;
\r
1675 Channels[o].Effect = 0;
\r
1676 Channels[o].EffectData.b = 0;
\r
1678 Channels[o].Playing = 0;
\r
1681 Channels[o].Effect = Buffer->Effect;
\r
1682 Channels[o].EffectData.b = Buffer->EffectData;
\r
1683 if(Buffer->Effect == 4)
\r
1685 Channels[o].Oscillation = 1;
\r
1686 if((Channels[o].EffectData.Nibbles.n1 != 0) && (Channels[o].EffectData.Nibbles.n2 != 0))
\r
1688 Channels[o].OscFreq = Channels[o].EffectData.Nibbles.n1;
\r
1689 Channels[o].OscAmp = Channels[o].EffectData.Nibbles.n2;
\r
1691 if(Channels[o].OscNoTrig == 0)
\r
1692 Channels[o].OscOffset = 0;
\r
1694 if((Buffer->Effect != 7) && (Buffer->Effect != 6))
\r
1695 Channels[o].Oscillation = 0;
\r
1697 if(Buffer->Effect == 7)
\r
1699 Channels[o].Oscillation = 2;
\r
1700 if((Channels[o].EffectData.Nibbles.n1 != 0) && (Channels[o].EffectData.Nibbles.n2 != 0))
\r
1702 Channels[o].OscFreq = Channels[o].EffectData.Nibbles.n1;
\r
1703 Channels[o].OscAmp = Channels[o].EffectData.Nibbles.n2;
\r
1705 if(Channels[o].OscNoTrig == 0)
\r
1706 Channels[o].OscOffset = 0;
\r
1708 if((Buffer->Effect != 4) && (Buffer->Effect != 6))
\r
1709 Channels[o].Oscillation = 0;
\r
1711 if(Buffer->Effect == 6)
\r
1712 Channels[o].Effect = 10;
\r
1713 if(Buffer->Effect == 9)
\r
1714 Channels[o].Offset = Buffer->EffectData << 8;
\r
1715 if(Buffer->Effect == 12)
\r
1717 Channels[o].Volume = Buffer->EffectData;
\r
1718 if(Channels[o].Volume > 64)
\r
1719 Channels[o].Volume = 64;
\r
1720 Channels[o].CurVolume = Channels[o].Volume;
\r
1722 if(Buffer->Effect == 14)
\r
1724 if((Channels[o].EffectData.Nibbles.n1 = 4) || (Channels[o].EffectData.Nibbles.n1 = 7))
\r
1726 Channels[o].OscWave = Channels[o].EffectData.Nibbles.n2 & 3;
\r
1727 Channels[o].OscOffset = 0;
\r
1728 if(Channels[o].OscWave == 3)
\r
1729 Channels[o].OscWave = rand() % 3;
\r
1730 if(Channels[o].EffectData.Nibbles.n2 > 3)
\r
1731 Channels[o].OscNoTrig = 1;
\r
1733 Channels[o].OscNoTrig = 0;
\r
1736 if(Buffer->Effect == 15)
\r
1738 if(Buffer->EffectData <= 32)
\r
1739 ModTPD = Buffer->EffectData;
\r
1741 ModBPM = Buffer->EffectData;
\r
1742 ModBPD = ((5 * SBSampleRate) * ModTPD) / (ModBPM * 2);
\r
1745 if(Channels[o].Playing != 0)
\r
1747 SampleRate = 7093789 / (Channels[o].CurPeriod << 1);
\r
1748 if(KeyTable[6] == 1)
\r
1750 Channels[o].Reminder += SampleRate;
\r
1751 if(Channels[o].Reminder >= SBSampleRate)
\r
1753 Channels[o].LastSample = Samples[Channels[o].Sample].Buffer[Channels[o].Offset];
\r
1754 while(Channels[o].Reminder >= SBSampleRate)
\r
1756 Channels[o].Reminder -= SBSampleRate;
\r
1757 Channels[o].Offset++;
\r
1760 if(Channels[o].Looping != 0)
\r
1762 if(Channels[o].Offset >= Samples[Channels[o].Sample].LoopStart + Samples[Channels[o].Sample].LoopLen)
\r
1763 Channels[o].Offset = Samples[Channels[o].Sample].LoopStart;
\r
1765 if(Channels[o].Offset >= Samples[Channels[o].Sample].SampleLen)
\r
1767 if(Samples[Channels[o].Sample].LoopLen > 2)
\r
1769 Channels[o].Looping = 1;
\r
1770 Channels[o].Offset = Samples[Channels[o].Sample].LoopStart;
\r
1772 Channels[o].Playing = 0;
\r
1777 if(Channels[o].Playing != 0)
\r
1779 Data = (signed short)Samples[Channels[o].Sample].Buffer[Channels[o].Offset];
\r
1780 Data2 += (Data * Channels[o].CurVolume) / 256;
\r
1781 if(Channels[o].Oscillation == 1)
\r
1783 Amp = (WaveForms[Channels[o].OscWave][(unsigned short)Channels[o].OscOffset] * (float)Channels[o].OscAmp) / 32;
\r
1784 Channels[o].CurPeriod = (unsigned short)((double)Channels[o].Period * pow(2, (double)(Amp / 12)));
\r
1785 Channels[o].OscOffset += ((float)Channels[o].OscFreq * (float)ModTPD * 360) / (64 * ModBPD);
\r
1786 if(Channels[o].OscOffset >= 360)
\r
1787 Channels[o].OscOffset -= 360;
\r
1789 if(Channels[o].Oscillation == 2)
\r
1791 Amp = WaveForms[Channels[o].OscWave][(unsigned short)Channels[o].OscOffset] * (float)Channels[o].OscAmp * (float)(ModTPD - 1);
\r
1792 Channels[o].CurVolume = (unsigned char)((signed char)Channels[o].Volume + (signed char)Amp);
\r
1793 if((Amp > 0) && (Channels[o].CurVolume > 64))
\r
1794 Channels[o].CurVolume = 64;
\r
1795 if((Amp < 0) && (Channels[o].CurVolume > 64))
\r
1796 Channels[o].CurVolume = 0;
\r
1797 Channels[o].OscOffset += ((float)Channels[o].OscFreq * (float)ModTPD * 360) / (64 * ModBPD);
\r
1798 if(Channels[o].OscOffset >= 360)
\r
1799 Channels[o].OscOffset -= 360;
\r
1801 if(Channels[o].Effect == 0)
\r
1803 if(ModOffset == (unsigned short)(ModBPD / 3))
\r
1804 Channels[o].CurPeriod = (unsigned short)((double)Channels[o].Period * pow(2, (double)Channels[o].EffectData.Nibbles.n1 / 12));
\r
1805 if(ModOffset == (unsigned short)((2 * ModBPD) / 3))
\r
1806 Channels[o].CurPeriod = (unsigned short)((double)Channels[o].Period * pow(2, (double)Channels[o].EffectData.Nibbles.n2 / 12));
\r
1808 if(Channels[o].Effect == 1)
\r
1810 Channels[o].CurPeriod = Channels[o].Period - (unsigned short)(((unsigned long)Channels[o].EffectData.b * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1811 if((signed short)Channels[o].CurPeriod < 113)
\r
1812 Channels[o].CurPeriod = 113;
\r
1814 if(Channels[o].Effect == 2)
\r
1816 Channels[o].CurPeriod = Channels[o].Period + (unsigned short)(((unsigned long)Channels[o].EffectData.b * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1817 if(Channels[o].CurPeriod > 856)
\r
1818 Channels[o].CurPeriod = 856;
\r
1820 if(Channels[o].Effect == 3)
\r
1822 if(Channels[o].OldPeriod > Channels[o].Period)
\r
1824 Channels[o].CurPeriod = Channels[o].OldPeriod - (unsigned short)(((unsigned long)Channels[o].EffectData.b * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1825 if((signed short)Channels[o].CurPeriod < Channels[o].Period)
\r
1826 Channels[o].CurPeriod = Channels[o].Period;
\r
1828 Channels[o].CurPeriod = Channels[o].OldPeriod + (unsigned short)(((unsigned long)Channels[o].EffectData.b * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1829 if(Channels[o].CurPeriod > Channels[o].Period)
\r
1830 Channels[o].CurPeriod = Channels[o].Period;
\r
1833 if((Channels[o].Effect == 10) && (Channels[o].EffectData.Nibbles.n1 > 0))
\r
1835 Channels[o].CurVolume = Channels[o].Volume + (unsigned char)(((unsigned long)Channels[o].EffectData.Nibbles.n1 * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1836 if(Channels[o].CurVolume > 64)
\r
1837 Channels[o].CurVolume = 64;
\r
1839 if((Channels[o].Effect == 10) && (Channels[o].EffectData.Nibbles.n2 > 0))
\r
1841 Channels[o].CurVolume = Channels[o].Volume - (unsigned char)(((unsigned long)Channels[o].EffectData.Nibbles.n2 * (unsigned long)ModTPD * (unsigned long)ModOffset) / (unsigned long)ModBPD);
\r
1842 if(Channels[o].CurVolume > 64)
\r
1843 Channels[o].CurVolume = 0;
\r
1848 if(++ModOffset >= ModBPD)
\r
1852 for(o = 0; o < ModChannels; o++)
\r
1854 if(Channels[o].Effect == 11)
\r
1857 ModPattern = Channels[o].EffectData.b;
\r
1859 if((Channels[o].Effect == 13) && (Temp == 0))
\r
1861 if(++ModPattern >= ModLen)
\r
1863 if(ModRepeat >= ModLen)
\r
1866 ModPattern = ModRepeat;
\r
1868 ModRow = (Channels[o].EffectData.Nibbles.n1 * 10) + Channels[o].EffectData.Nibbles.n2;
\r
1876 if(++ModPattern >= ModLen)
\r
1878 if(ModRepeat >= ModLen)
\r
1881 ModPattern = ModRepeat;
\r
1885 Data = (signed short)SoundBuffer[i] - 128;
\r
1891 SoundBuffer[i] = (unsigned char)(Data + 128);
\r
1897 unsigned long GetString(unsigned short StringNum, unsigned short *Length)
\r
1899 unsigned long Offset, Offset2;
\r
1900 unsigned short Count;
\r
1904 while(Count < StringNum)
\r
1906 if(Strings[Offset++] == 0)
\r
1910 while(Strings[Offset2++] != 0);
\r
1911 if(Length != NULL)
\r
1912 *Length = Offset2 - Offset;
\r
1916 void LoadMenu(unsigned short MenuNum)
\r
1918 unsigned long Offset;
\r
1919 unsigned short i, o;
\r
1920 unsigned short NumItems, CurItem;
\r
1921 unsigned char DataLength;
\r
1926 for(i = 0; i <= MenuNum; i++)
\r
1928 NumItems = *(unsigned short *)(MenuBuffer + Offset);
\r
1931 NumMenuItems = NumItems;
\r
1932 for(o = 0; o < NumItems; o++)
\r
1934 DataLength = MenuBuffer[Offset++];
\r
1937 MenuItems[0][CurItem] = MenuBuffer + Offset;
\r
1938 Offset += DataLength;
\r
1939 strcpy(MenuItems[1][CurItem++], Strings + GetString(*(unsigned short *)(MenuBuffer + Offset - 2), NULL));
\r
1941 Offset += DataLength;
\r
1947 void LoadLayout(unsigned char NumPlayers)
\r
1950 unsigned short o, Buffer[18];
\r
1951 KvidFile LayoutFile;
\r
1953 for(i = 0; i < MAX_PLAYERS; i++)
\r
1954 Players[i]->Visual = 0;
\r
1955 if(OpenFile("Layouts", &LayoutFile) == 0)
\r
1957 for(i = 0; i < NumPlayers - 1; i++)
\r
1959 FileSkip(&LayoutFile, 36 * (i + 1));
\r
1961 for(i = 0; i < NumPlayers; i++)
\r
1963 FileRead((void *)&Buffer, 36, &LayoutFile);
\r
1964 Players[i]->Visual = 1;
\r
1965 Players[i]->VPointX1 = Buffer[0];
\r
1966 Players[i]->VPointY1 = Buffer[1];
\r
1967 Players[i]->VPointX2 = Buffer[2];
\r
1968 Players[i]->VPointY2 = Buffer[3];
\r
1969 Players[i]->AMeterX1 = Buffer[4];
\r
1970 Players[i]->AMeterY1 = Buffer[5];
\r
1971 Players[i]->AMeterX2 = Buffer[6];
\r
1972 Players[i]->AMeterY2 = Buffer[7];
\r
1973 Players[i]->LMeterX1 = Buffer[8];
\r
1974 Players[i]->LMeterY1 = Buffer[9];
\r
1975 Players[i]->LMeterX2 = Buffer[10];
\r
1976 Players[i]->LMeterY2 = Buffer[11];
\r
1977 Players[i]->lx = Buffer[12];
\r
1978 Players[i]->ly = Buffer[13];
\r
1979 Players[i]->kx = Buffer[14];
\r
1980 Players[i]->ky = Buffer[15];
\r
1981 Players[i]->cx = Buffer[16];
\r
1982 Players[i]->cy = Buffer[17];
\r
1983 for(o = 0; o < NUM_MASKS; o++)
\r
1985 if(Players[i]->Masks[o].Buffer != NULL)
\r
1986 free(Players[i]->Masks[o].Buffer);
\r
1987 Players[i]->Masks[o].Buffer = (unsigned char *)malloc((Buffer[2] - Buffer[0] + 1) * (Buffer[3] - Buffer[1] + 1) * 4);
\r
1990 FileClose(&LayoutFile);
\r
1993 unsigned char InitVar(void)
\r
1995 unsigned short i, o;
\r
1999 for(i = 0; i < MAX_PLAYERS; i++)
\r
2003 if(OpenFile("player1.ctr", &KeyFile) == 0)
\r
2008 if(OpenFile("player2.ctr", &KeyFile) == 0)
\r
2013 for(o = 0; o < 9; o++)
\r
2014 FileRead((void *)&Players[i]->KeyCodes[o], 2, &KeyFile);
\r
2015 FileClose(&KeyFile);
\r
2017 Players[i]->Angle = 0;
\r
2018 Players[i]->AngleVel = 0;
\r
2019 Players[i]->Dir = 0;
\r
2020 Players[i]->MaxHealth = 500;
\r
2021 Players[i]->Health = Players[0]->MaxHealth;
\r
2022 Players[i]->Kills = 0;
\r
2023 Players[i]->Lives = 5;
\r
2024 Players[i]->CurWeapon = 0;
\r
2025 /*Players[i]->Masks[0].Method = 1;
\r
2026 Players[i]->Masks[0].Effects[0] = 2;*/
\r
2027 for(o = 0; o < NUM_WEAPONS; o++)
\r
2029 PWeapons[i][o]->Weapon = o;
\r
2030 PWeapons[i][o]->Used = 1;
\r
2033 for(i = 0; i < MAX_PLAYERS; i++)
\r
2035 for(o = 0; o < NUM_WEAPONS; o++)
\r
2037 if((Players[i]->Used == 1) && (PWeapons[i][o]->Used == 1))
\r
2039 PWeapons[i][o]->AmmoLeft = Weapons[PWeapons[i][o]->Weapon]->Ammo;
\r
2040 PWeapons[i][o]->FireTimer = 0;
\r
2041 PWeapons[i][o]->ReloadTimer = 0;
\r
2042 PWeapons[i][o]->NumClips = Weapons[PWeapons[i][o]->Weapon]->MaxClips;
\r
2054 unsigned char Init(unsigned short *Result)
\r
2056 unsigned short i, o;
\r
2057 unsigned char Buffer[80], InpBuffer, BufferPos, Finished, Major, Minor;
\r
2058 unsigned long LastPos, Offset, Size, u, BkAU;
\r
2059 unsigned short DataLength, Count, BkOffset;
\r
2060 KvidFile OpenedFile, OpenedFile2;
\r
2061 KvidFile SoundFile;
\r
2063 printf("Initializing...\n");
\r
2065 if((OpenDatFile("kvid.dat", &DataFile) == 0) || (DataFile.CanWrite == 0))
\r
2067 MainDat = &DataFile;
\r
2068 if(DebugMode != 0)
\r
2069 printf("Initializing double buffer...\n");
\r
2070 DBSetClip(0, 0, 319, 199);
\r
2071 if(DebugMode != 0)
\r
2072 printf("Initializing level...\n");
\r
2075 for(i = 0; i < NUM_PLANES; i++)
\r
2077 if((LevelBuffer[i] = (unsigned char *)malloc(MaxLW * MaxLH * ((i == 0)?4:1))) == NULL)
\r
2080 if(DebugMode != 0)
\r
2081 printf("Initializing variables...\n");
\r
2082 for(i = 0; i < MAX_HITTESTS; i++)
\r
2084 HitTests[i] = 0xFFFF;
\r
2086 for(i = 0; i < MAX_PIXELS; i++)
\r
2088 if((Pixels[i] = (Pixel *)malloc(sizeof(Pixel))) == NULL)
\r
2090 Pixels[i]->Used = 0;
\r
2092 for(i = 0; i < MAX_SPRITES; i++)
\r
2094 if((Sprites[i] = (Sprite *)malloc(sizeof(Sprite))) == NULL)
\r
2096 Sprites[i]->Used = 0;
\r
2098 for(i = 0; i < MAX_OBJECTS; i++)
\r
2100 if((Objects[i] = (Object *)malloc(sizeof(Object))) == NULL)
\r
2102 Objects[i]->Used = 0;
\r
2104 for(i = 0; i < MAX_OBJLISTS; i++)
\r
2106 if((ObjectLists[i] = (ObjectList *)malloc(sizeof(ObjectList))) == NULL)
\r
2108 ObjectLists[i]->Used = 0;
\r
2110 for(i = 0; i < MAX_PLAYERS; i++)
\r
2112 if((Players[i] = (Player *)malloc(sizeof(Player))) == NULL)
\r
2114 Players[i]->Used = 0;
\r
2115 Players[i]->Visual = 0;
\r
2116 for(o = 0; o < NUM_MASKS; o++)
\r
2118 Players[i]->Masks[o].Buffer = NULL;
\r
2119 Players[i]->Masks[o].Method = 0;
\r
2120 for(u = 0; u < 16; u++)
\r
2121 Players[i]->Masks[o].Effects[u] = 0;
\r
2124 for(i = 0; i < MAX_PLAYERS; i++)
\r
2126 for(o = 0; o < NUM_WEAPONS; o++)
\r
2128 if((PWeapons[i][o] = (PWeapon *)malloc(sizeof(PWeapon))) == NULL)
\r
2130 PWeapons[i][o]->Used = 0;
\r
2133 for(i = 0; i < MAX_LINES; i++)
\r
2135 if((Lines[i] = (Line *)malloc(sizeof(Line))) == NULL)
\r
2137 Lines[i]->Used = 0;
\r
2139 for(i = 0; i < MAX_RASTERS; i++)
\r
2141 if((Rasters[i] = (Raster *)malloc(sizeof(Raster))) == NULL)
\r
2143 Rasters[i]->Used = 0;
\r
2145 for(i = 0; i < MAX_MENUITEMS; i++)
\r
2147 if((MenuItems[1][i] = (unsigned char *)malloc(128)) == NULL)
\r
2150 for(i = 0; i < MAX_SOUNDS; i++)
\r
2152 Sounds[i].Playing = 0;
\r
2154 if((MenuBuffer = (unsigned char *)malloc(16384)) == NULL)
\r
2156 if((TextBuffer = (unsigned char *)malloc(500)) == NULL)
\r
2158 if((KeyboardBuffer = (unsigned char *)malloc(500)) == NULL)
\r
2160 if((LevelFileName = (unsigned char *)malloc(100)) == NULL)
\r
2162 if((Patterns = (ModEvent *)malloc(MAX_PATTERNS * 512 * sizeof(ModEvent))) == NULL)
\r
2164 if((SoundBuffer = (unsigned char *)malloc(SB_SIZE >> 1)) == NULL)
\r
2166 for(i = 0; i < SB_SIZE >> 1; i++)
\r
2167 SoundBuffer[i] = 128;
\r
2168 TransOps[0] = ColorAdd;
\r
2169 TransOps[1] = ColorSub;
\r
2170 TransOps[2] = ColorAvr;
\r
2171 TransOps[3] = ColorSpc;
\r
2172 TransOps[4] = ColorFul;
\r
2175 LevelHeight = 400;
\r
2177 DSPAddress = 0x220;
\r
2183 srand((unsigned int)time(NULL));
\r
2184 for(i = 0; i < 360; i++)
\r
2186 Sine[i] = sin(((float)i / 180) * M_PI);
\r
2187 Cosine[i] = cos(((float)i / 180) * M_PI);
\r
2188 PreSine[i] = sin(((double)i / 90) * M_PI_2);
\r
2189 PreCosine[i] = cos(((double)i / 90) * M_PI_2);
\r
2190 WaveForms[0][i] = sin(((float)i / 180) * M_PI);
\r
2191 WaveForms[1][i] = (float)(359 - i) / 359;
\r
2192 WaveForms[2][i] = (i < 180)?1:0;
\r
2193 WaveForms[3][i] = (float)i / 359;
\r
2194 WaveForms[4][i] = (i < 180)?((float)i / 179):((float)(179 - (i - 180)) / 179);
\r
2196 for(i = 0; i < MAX_SAMPLES; i++)
\r
2198 Samples[i].Allocated = 0;
\r
2200 if(DebugMode != 0)
\r
2201 printf("Loading data...\n");
\r
2202 if(OpenFile("Layouts", &OpenedFile) == 0)
\r
2204 FileClose(&OpenedFile);
\r
2205 if(DebugMode != 0)
\r
2206 printf("Loading menus\n");
\r
2207 if(OpenFile("MenuData", &OpenedFile) == 0)
\r
2209 FileRead((void *)&Count, 2, &OpenedFile);
\r
2211 for(i = 0; i < Count; i++)
\r
2213 FileRead((void *)&DataLength, 2, &OpenedFile);
\r
2214 *(unsigned short *)(MenuBuffer + Offset) = DataLength;
\r
2216 for(o = 0; o < DataLength; o++)
\r
2218 FileRead((void *)&InpBuffer, 1, &OpenedFile);
\r
2219 MenuBuffer[Offset++] = InpBuffer;
\r
2220 FileRead((void *)(MenuBuffer + Offset), (unsigned long)InpBuffer, &OpenedFile);
\r
2221 Offset += InpBuffer;
\r
2224 FileClose(&OpenedFile);
\r
2225 if(DebugMode != 0)
\r
2226 printf("Loading palette...\n");
\r
2227 if(OpenFile("DefaultPalette", &OpenedFile) == 0)
\r
2229 FileRead((void *)Palette, sizeof(Pal) * NUM_COLORS, &OpenedFile);
\r
2230 FileClose(&OpenedFile);
\r
2231 if(DebugMode != 0)
\r
2232 printf("Loading color info...\n");
\r
2233 if(OpenFile("ColorInfo", &OpenedFile) == 0)
\r
2235 FileRead((void *)ColorInfo, NUM_COLORS, &OpenedFile);
\r
2236 FileClose(&OpenedFile);
\r
2237 if(DebugMode != 0)
\r
2238 printf("Loading ASCII Table...\n");
\r
2239 if(OpenFile("AsciiConv", &OpenedFile) == 0)
\r
2241 FileRead((void *)AsciiTable, 512, &OpenedFile);
\r
2242 FileClose(&OpenedFile);
\r
2243 if(OpenFile("MainAscii", &OpenedFile) == 0)
\r
2245 FileRead((void *)AsciiTable2, 256, &OpenedFile);
\r
2246 FileClose(&OpenedFile);
\r
2247 if(DebugMode != 0)
\r
2248 printf("Loading strings...\n");
\r
2249 if(OpenFile("Strings", &OpenedFile) == 0)
\r
2251 FileRead((void *)&LastPos, 4, &OpenedFile);
\r
2252 if((Strings = (unsigned char *)malloc((unsigned short)LastPos)) == NULL)
\r
2254 for(Offset = 0; Offset < LastPos; Offset++)
\r
2255 Strings[Offset] = FileGetChar(&OpenedFile);
\r
2256 FileClose(&OpenedFile);
\r
2259 if((OpenFile("BetaTime", &OpenedFile) == 0) || (OpenedFile.CanWrite == 0))
\r
2261 FileRead((void *)&Count, 2, &OpenedFile);
\r
2262 if(Count != 0x464B)
\r
2264 BkAU = OpenedFile.CurAU;
\r
2265 BkOffset = OpenedFile.Offset;
\r
2266 FileRead((void *)&NumPlays, 1, &OpenedFile);
\r
2269 printf("Your beta version has expired!\n");
\r
2272 OpenedFile.CurAU = BkAU;
\r
2273 OpenedFile.Offset = BkOffset;
\r
2274 OpenedFile.ReSeek = 1;
\r
2275 FilePutChar(--NumPlays, &OpenedFile);
\r
2276 printf("You have %u time(s) left to play!\n", (unsigned short)NumPlays);
\r
2278 if(DebugMode != 0)
\r
2279 printf("Loading sprites...\n");
\r
2280 if(OpenFile("SpriteCache", &OpenedFile) == 0)
\r
2282 FileRead((void *)&NumSprites, 2, &OpenedFile);
\r
2283 if((Caches = (Cache **)malloc(4 * NumSprites)) == NULL)
\r
2285 for(i = 0; i < NumSprites; i++)
\r
2287 if((Caches[i] = (Cache *)malloc(sizeof(Cache))) == NULL)
\r
2291 while(Finished == 0)
\r
2293 InpBuffer = FileGetChar(&OpenedFile);
\r
2294 if(InpBuffer == 0)
\r
2296 Buffer[BufferPos] = 0;
\r
2297 OpenedFile.ReSeek = 1;
\r
2298 switch(LoadSprite((unsigned char *)Buffer, i))
\r
2305 if(strcmp((char *)Buffer, (unsigned char *)"Spr_Font") == 0)
\r
2309 Buffer[BufferPos++] = InpBuffer;
\r
2313 FileClose(&OpenedFile);
\r
2314 if(DebugMode != 0)
\r
2315 printf("Loading classes...\n");
\r
2316 if(OpenFile("Classes", &OpenedFile) == 0)
\r
2318 FileRead((void *)&NumClasses, 2, &OpenedFile);
\r
2319 if((Classes = (Class **)malloc(4 * NumClasses)) == NULL)
\r
2321 for(i = 0; i < NumClasses; i++)
\r
2323 if((Classes[i] = (Class *)malloc(sizeof(Class))) == NULL)
\r
2325 FileRead((void *)&Classes[i]->Scripts, 2 * NUM_SCRIPTS, &OpenedFile);
\r
2326 FileRead((void *)&Classes[i]->TickDelay, 1, &OpenedFile);
\r
2327 FileRead((void *)&Classes[i]->GravityMod, 2, &OpenedFile);
\r
2328 FileRead((void *)&Classes[i]->Sprite, 1, &OpenedFile);
\r
2329 FileRead((void *)&Classes[i]->StartFrame, 1, &OpenedFile);
\r
2330 FileRead((void *)&Classes[i]->RunHitTests, 1, &OpenedFile);
\r
2331 FileRead((void *)&Classes[i]->TouchDelay, 1, &OpenedFile);
\r
2332 FileRead((void *)&Classes[i]->TransSprite, 1, &OpenedFile);
\r
2333 FileRead((void *)&DataLength, 2, &OpenedFile);
\r
2334 if((Classes[i]->Code = (unsigned char *)malloc(DataLength)) == NULL)
\r
2336 FileRead((void *)Classes[i]->Code, DataLength, &OpenedFile);
\r
2338 FileClose(&OpenedFile);
\r
2339 if(DebugMode != 0)
\r
2340 printf("Loading sounds...\n");
\r
2343 if(OpenDatFile("kvidsnd.dat", &SoundFile) == 0)
\r
2345 printf("Couldn't find sound file KVIDSND.DAT!\nUsing no sound...\n");
\r
2351 if(OpenNestedFile("LoadSound", &OpenedFile, &SoundFile, NULL) == 0)
\r
2353 printf("Sound file corrupt!\nUsing no sound...\n");
\r
2360 FileRead((void *)&NumSounds, 2, &OpenedFile);
\r
2361 if((SoundCaches = (SoundCache **)malloc(NumSounds << 2)) == NULL)
\r
2363 for(i = 0; i < NumSounds; i++)
\r
2364 SoundCaches[i] = NULL;
\r
2366 for(i = 0; i < NumSounds; i++)
\r
2368 OpenedFile.ReSeek = 1;
\r
2369 for(BufferPos = 0; (Buffer[BufferPos] = FileGetChar(&OpenedFile)) != 0; BufferPos++);
\r
2370 if(OpenNestedFile(Buffer, &OpenedFile2, &SoundFile, NULL) == 0)
\r
2372 printf("Sound file corrupt!\nUsing no sound...\n");
\r
2377 if((SoundCaches[i] = (SoundCache *)malloc(sizeof(SoundCache))) == NULL)
\r
2379 FileRead((void *)&Size, 4, &OpenedFile2);
\r
2380 SoundCaches[i]->Length = Size;
\r
2381 if((SoundCaches[i]->SoundBuffer = (unsigned char *)malloc(Size)) == NULL)
\r
2384 for(u = 0; u <= Size; u++)
\r
2386 if(DataLength > 0)
\r
2388 SoundCaches[i]->SoundBuffer[Offset++] = InpBuffer;
\r
2391 if(DataLength == 0)
\r
2394 if((InpBuffer = FileGetChar(&OpenedFile2)) >= 192)
\r
2396 DataLength = InpBuffer - 191;
\r
2397 InpBuffer = FileGetChar(&OpenedFile2);
\r
2401 FileClose(&OpenedFile2);
\r
2403 FileClose(&OpenedFile);
\r
2404 FileClose(&SoundFile);
\r
2406 if(OpenFile("WeaponInfo", &OpenedFile) == 0)
\r
2408 FileRead((void *)&NumWeapons, 2, &OpenedFile);
\r
2409 if((Weapons = (Weapon **)malloc(4 * NumWeapons)) == NULL)
\r
2411 for(i = 0; i < NumWeapons; i++)
\r
2413 if((Weapons[i] = (Weapon *)malloc(sizeof(Weapon))) == NULL)
\r
2415 FileRead((void *)&Weapons[i]->Class, 2, &OpenedFile);
\r
2416 FileRead((void *)&Weapons[i]->ReloadDelay, 2, &OpenedFile);
\r
2417 FileRead((void *)&Weapons[i]->FireDelay, 2, &OpenedFile);
\r
2418 FileRead((void *)&Weapons[i]->Ammo, 2, &OpenedFile);
\r
2419 FileRead((void *)&Weapons[i]->MaxClips, 2, &OpenedFile);
\r
2420 Weapons[i]->Name = 0;
\r
2421 FileRead((void *)&Weapons[i]->Name, 2, &OpenedFile);
\r
2422 Weapons[i]->Name = GetString((unsigned short)Weapons[i]->Name, (unsigned short *)&Weapons[i]->NameLength);
\r
2424 FileClose(&OpenedFile);
\r
2425 if(OpenFile("MainFont", &OpenedFile) == 0)
\r
2427 if((FontBuffer = (unsigned short *)malloc(16384)) == NULL)
\r
2429 memset((void *)FontBuffer, 0, 16384);
\r
2432 for(i = 0; (i < 256) && (Size != 0); i++)
\r
2435 FileRead((void *)&Size, 2, &OpenedFile);
\r
2436 FontBuffer[(i << 1)] = (unsigned short)Offset;
\r
2437 FontBuffer[(i << 1) + 1] = (unsigned short)Size;
\r
2438 for(o = 0; o < Size * 5; o++)
\r
2440 FileRead((void *)&FontBuffer[Offset + 512], 4, &OpenedFile);
\r
2444 FileClose(&OpenedFile);
\r
2445 if(DebugMode != 0)
\r
2446 printf("Initializing hardware...\n");
\r
2447 if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0)
\r
2449 printf("%s\n", SDL_GetError());
\r
2452 if((UseSound == 1) && (SBReset() != 0))
\r
2454 printf("Sound Blaster hardware reset failed!\n");
\r
2459 SBSampleRate = 44100;
\r
2461 printf("Using no sound...\n");
\r
2463 VBuffer = SDL_SetVideoMode(320, 200, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
\r
2464 BPP = VBuffer->format->BytesPerPixel * 8;
\r
2467 printf("Video mode format mismatch (BPP = %i)\n", BPP);
\r
2470 DblBuffer = VBuffer->pixels;
\r
2472 printf("Done!\n");
\r
2486 void Terminate(void)
\r
2488 unsigned short i, o;
\r
2492 FileClose(&DataFile);
\r
2494 for(i = 0; i < NUM_PLANES; i++)
\r
2495 free(LevelBuffer[i]);
\r
2496 if(FontBuffer != NULL)
\r
2498 if(FreeSound == 1)
\r
2500 for(i = 0; i < NumSounds; i++)
\r
2502 if(SoundCaches[i] != NULL)
\r
2504 free(SoundCaches[i]->SoundBuffer);
\r
2505 free(SoundCaches[i]);
\r
2508 free(SoundCaches);
\r
2511 TerminatePlayBack();
\r
2512 for(i = 0; i < MAX_PIXELS; i++)
\r
2514 if(Pixels[i] != NULL)
\r
2517 for(i = 0; i < NumSprites; i++)
\r
2519 if(Caches[i] != NULL)
\r
2521 if(Caches[i]->cx != NULL)
\r
2522 free(Caches[i]->cx);
\r
2523 if(Caches[i]->cy != NULL)
\r
2524 free(Caches[i]->cy);
\r
2525 if(Caches[i]->Frames != NULL)
\r
2527 for(o = 0; o < Caches[i]->NumFrames; o++)
\r
2529 if(Caches[i]->Frames[o] != NULL)
\r
2530 free(Caches[i]->Frames[o]);
\r
2532 free(Caches[i]->Frames);
\r
2537 if(Caches != NULL)
\r
2539 for(i = 0; i < MAX_SPRITES; i++)
\r
2541 if(Sprites[i] != NULL)
\r
2544 for(i = 0; i < MAX_PLAYERS; i++)
\r
2546 if(Players[i] != NULL)
\r
2548 for(o = 0; o < NUM_MASKS; o++)
\r
2550 if(Players[i]->Masks[o].Buffer != NULL)
\r
2551 free(Players[i]->Masks[o].Buffer);
\r
2556 for(i = 0; i < MAX_OBJECTS; i++)
\r
2558 if(Objects[i] != NULL)
\r
2561 for(i = 0; i < NumClasses; i++)
\r
2563 if(Classes[i]->Code != NULL)
\r
2564 free(Classes[i]->Code);
\r
2565 if(Classes[i] != NULL)
\r
2568 if(Classes != NULL)
\r
2570 for(i = 0; i < NumWeapons; i++)
\r
2572 if(Weapons[i] != NULL)
\r
2575 if(Weapons != NULL)
\r
2577 for(i = 0; i < MAX_PLAYERS; i++)
\r
2579 for(o = 0; o < NUM_WEAPONS; o++)
\r
2581 if(PWeapons[i][o] != NULL)
\r
2582 free(PWeapons[i][o]);
\r
2585 for(i = 0; i < MAX_LINES; i++)
\r
2587 if(Lines[i] != NULL)
\r
2590 for(i = 0; i < MAX_RASTERS; i++)
\r
2592 if(Rasters[i] != NULL)
\r
2595 for(i = 0; i < MAX_MENUITEMS; i++)
\r
2597 if(MenuItems[1][i] != NULL)
\r
2598 free(MenuItems[1][i]);
\r
2600 if(Strings != NULL)
\r
2602 if(MenuBuffer != NULL)
\r
2604 if(TextBuffer != NULL)
\r
2606 if(KeyboardBuffer != NULL)
\r
2607 free(KeyboardBuffer);
\r
2608 if(LevelFileName != NULL)
\r
2609 free(LevelFileName);
\r
2610 if(SoundBuffer != NULL)
\r
2611 free(SoundBuffer);
\r
2612 if(Patterns != NULL)
\r
2614 for(i = 0; i < MAX_SAMPLES; i++)
\r
2616 if(Samples[i].Allocated != 0)
\r
2617 free(Samples[i].Buffer);
\r
2621 void HurtRadius(signed short x, signed short y, signed short StartDamage, signed short StopDamage, unsigned short StartDecRadius, unsigned short StopRadius, unsigned char Owner)
\r
2624 signed long square, xdist, ydist;
\r
2625 unsigned short Radius, Sprite;
\r
2626 unsigned short Template;
\r
2627 signed short Damage;
\r
2629 for(i = 0; i < MAX_OBJECTS; i++)
\r
2631 if(Objects[i]->Used == 1)
\r
2633 if((Objects[i]->SpriteLink != 0xFFFF) && (Sprites[Objects[i]->SpriteLink]->Template != 0xFF))
\r
2635 Sprite = Objects[i]->SpriteLink;
\r
2636 Template = (unsigned short)Sprites[Sprite]->Template;
\r
2637 xdist = (signed long)(x - (signed short)Objects[i]->x + Caches[Template]->cx[Sprites[Sprite]->CurFrame]);
\r
2638 ydist = (signed long)(y - (signed short)Objects[i]->y + Caches[Template]->cy[Sprites[Sprite]->CurFrame]);
\r
2639 if(xdist < 0) xdist = 0;
\r
2640 if(ydist < 0) ydist = 0;
\r
2641 if(xdist > (signed long)Caches[Template]->w) xdist = (signed long)Caches[Template]->w;
\r
2642 if(ydist > (signed long)Caches[Template]->h) ydist = (signed long)Caches[Template]->h;
\r
2643 xdist += (signed long)Objects[i]->x - (signed long)Caches[Template]->cx[Sprites[Sprite]->CurFrame];
\r
2644 ydist += (signed long)Objects[i]->y - (signed long)Caches[Template]->cy[Sprites[Sprite]->CurFrame];
\r
2646 xdist = (signed long)Objects[i]->x;
\r
2647 ydist = (signed long)Objects[i]->y;
\r
2649 xdist = (signed long)(x - (signed short)xdist);
\r
2650 ydist = (signed long)(y - (signed short)ydist);
\r
2651 square = (xdist * xdist) + (ydist * ydist);
\r
2652 Radius = (unsigned short)sqrt((double)square);
\r
2653 if(Radius < StopRadius)
\r
2655 if(Radius < StartDecRadius)
\r
2657 Damage = StartDamage;
\r
2659 Damage = (unsigned short)((((float)(Radius - StartDecRadius) / (float)(StopRadius - StartDecRadius)) * (float)(StartDamage - StopDamage)) + StopDamage);
\r
2661 Regs[16] = (signed short)i;
\r
2662 Regs[17] = (signed short)Damage;
\r
2663 Regs[18] = (signed short)Owner;
\r
2664 Regs[19] = (signed short)Objects[i]->x;
\r
2665 Regs[20] = (signed short)Objects[i]->y;
\r
2666 Execute(Classes[Objects[i]->Class]->Code, (signed short *)&Objects[i]->Variables[0], Classes[Objects[i]->Class]->Scripts[3]); //TakeDamage
\r
2672 unsigned char SpritesOverlap(unsigned char Cache1, unsigned short Frame1, unsigned char Cache2, unsigned short Frame2, signed short dx, signed short dy)
\r
2674 signed short x, y;
\r
2675 unsigned short w, h;
\r
2676 unsigned char *Buffer1;
\r
2677 unsigned char *Buffer2;
\r
2678 unsigned long Offset;
\r
2679 unsigned long Data;
\r
2681 Buffer1 = Caches[Cache1]->Frames[Frame1];
\r
2682 Buffer2 = Caches[Cache2]->Frames[Frame2];
\r
2683 dx += Caches[Cache1]->cx[Frame1];
\r
2684 dy += Caches[Cache1]->cy[Frame1];
\r
2685 dx -= Caches[Cache2]->cx[Frame2];
\r
2686 dy -= Caches[Cache2]->cy[Frame2];
\r
2687 w = Caches[Cache2]->w;
\r
2688 h = Caches[Cache2]->h;
\r
2691 for(y = -dy; y < (signed short)Caches[Cache1]->h - dy; y++)
\r
2693 if((y < (signed short)h) && (y >= 0))
\r
2695 for(x = -dx; x < (signed short)Caches[Cache1]->w - dx; x++)
\r
2697 if((x < (signed short)w) && (x >= 0))
\r
2699 Data = *(unsigned long *)Buffer1;
\r
2703 if(*(unsigned long *)&Buffer2[(x + (y * w)) << 2] != 0)
\r
2711 Buffer1 += Caches[Cache1]->w << 2;
\r
2717 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
2739 unsigned short HitTest(signed short x, signed short y, unsigned short ObjNum, unsigned char TestCache, unsigned short TestFrame)
\r
2742 unsigned short SpriteLink;
\r
2743 unsigned char Template;
\r
2744 signed short tx1, ty1, tx2, ty2;
\r
2745 unsigned long Offset;
\r
2746 unsigned char *FrameBuffer;
\r
2748 for(i = 0; i < MAX_HITTESTS; i++)
\r
2750 if(HitTests[i] == 0xFFFF)
\r
2752 if(HitTests[i] == ObjNum)
\r
2754 SpriteLink = Objects[HitTests[i]]->SpriteLink;
\r
2755 if(SpriteLink != 0xFFFF)
\r
2757 Template = Sprites[SpriteLink]->Template;
\r
2758 if(TestCache == 0xFF)
\r
2765 tx1 = x - Caches[TestCache]->cx[TestFrame];
\r
2766 ty1 = y - Caches[TestCache]->cy[TestFrame];
\r
2767 tx2 = tx1 + Caches[TestCache]->w;
\r
2768 ty2 = ty1 + Caches[TestCache]->h;
\r
2770 if((tx2 >= Sprites[SpriteLink]->x - Caches[Template]->cx[Sprites[SpriteLink]->CurFrame]) && (ty2 >= Sprites[SpriteLink]->y - Caches[Template]->cy[Sprites[SpriteLink]->CurFrame]) && (tx1 < Sprites[SpriteLink]->x - Caches[Template]->cx[Sprites[SpriteLink]->CurFrame] + Caches[Template]->w) && (ty1 < Sprites[SpriteLink]->y - Caches[Template]->cy[Sprites[SpriteLink]->CurFrame] + Caches[Template]->h))
\r
2772 if(TestCache == 0xFF)
\r
2774 Offset = x - Sprites[SpriteLink]->x + Caches[Template]->cx[Sprites[SpriteLink]->CurFrame];
\r
2775 Offset += (y - Sprites[SpriteLink]->y + Caches[Template]->cy[Sprites[SpriteLink]->CurFrame]) * Caches[Template]->w;
\r
2776 FrameBuffer = Caches[Template]->Frames[Sprites[SpriteLink]->CurFrame];
\r
2777 if((Offset < Caches[Template]->w * Caches[Template]->h) && (*(unsigned long *)&FrameBuffer[Offset << 2] != 0))
\r
2778 return(HitTests[i]);
\r
2780 if(SpritesOverlap(TestCache, TestFrame, Template, Sprites[SpriteLink]->CurFrame, Sprites[SpriteLink]->x - x, Sprites[SpriteLink]->y - y) == 1)
\r
2781 return(HitTests[i]);
\r
2789 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
2792 signed short dx, dy, x, y, fx, fy;
\r
2793 signed short xi, yi, d;
\r
2794 unsigned long Data;
\r
2795 unsigned char Collided;
\r
2796 unsigned short Object, ObjectList, NumObjects;
\r
2818 ObjectList = 0xFFFF;
\r
2821 for(i = 0; i <= dx; i++)
\r
2832 Data = GetMapPixel((unsigned short)x, (unsigned short)y, 1);
\r
2833 if((Data & Pattern) == 0)
\r
2840 *ObjNum = ObjectList;
\r
2841 return(1 | Collided);
\r
2843 if(RunHitTests != 0)
\r
2845 if((Object = HitTest(x, y, *ObjNum, TestCache, TestFrame)) != 0xFFFF)
\r
2847 if(RunHitTests == 1)
\r
2856 if(ObjectList == 0xFFFF)
\r
2858 if((ObjectList = GetObjectList()) == 0xFFFF)
\r
2868 NumObjects = ObjectLists[ObjectList]->NumObjects;
\r
2869 ObjectLists[ObjectList]->Objects[NumObjects].Object = Object;
\r
2870 ObjectLists[ObjectList]->Objects[NumObjects].x1 = fx;
\r
2871 ObjectLists[ObjectList]->Objects[NumObjects].y1 = fy;
\r
2872 ObjectLists[ObjectList]->Objects[NumObjects].x2 = x;
\r
2873 ObjectLists[ObjectList]->Objects[NumObjects].y2 = y;
\r
2874 ObjectLists[ObjectList]->Objects[NumObjects + 1].Object = 0xFFFF;
\r
2875 ObjectLists[ObjectList]->NumObjects++;
\r
2882 for(i = 0; i <= dy; i++)
\r
2893 Data = GetMapPixel((unsigned short)x, (unsigned short)y, 1);
\r
2894 if((Data & Pattern) == 0)
\r
2901 *ObjNum = ObjectList;
\r
2902 return(1 | Collided);
\r
2904 if(RunHitTests != 0)
\r
2906 if((Object = HitTest(x, y, *ObjNum, TestCache, TestFrame)) != 0xFFFF)
\r
2908 if(RunHitTests == 1)
\r
2917 if(ObjectList == 0xFFFF)
\r
2919 if((ObjectList = GetObjectList()) == 0xFFFF)
\r
2929 NumObjects = ObjectLists[ObjectList]->NumObjects;
\r
2930 ObjectLists[ObjectList]->Objects[NumObjects].Object = Object;
\r
2931 ObjectLists[ObjectList]->Objects[NumObjects].x1 = fx;
\r
2932 ObjectLists[ObjectList]->Objects[NumObjects].y1 = fy;
\r
2933 ObjectLists[ObjectList]->Objects[NumObjects].x2 = x;
\r
2934 ObjectLists[ObjectList]->Objects[NumObjects].y2 = y;
\r
2935 ObjectLists[ObjectList]->Objects[NumObjects + 1].Object = 0xFFFF;
\r
2936 ObjectLists[ObjectList]->NumObjects++;
\r
2946 void AddHitTest(unsigned short ObjNum)
\r
2950 for(i = 0; i < MAX_HITTESTS; i++)
\r
2952 if(HitTests[i] == 0xFFFF)
\r
2954 HitTests[i] = ObjNum;
\r
2960 void RemoveHitTest(unsigned short ObjNum)
\r
2964 for(i = 0; i < MAX_HITTESTS; i++)
\r
2966 if(HitTests[i] == ObjNum)
\r
2968 for(i = i; i < MAX_HITTESTS; i++)
\r
2969 HitTests[i] = HitTests[i + 1];
\r
2970 HitTests[MAX_HITTESTS - 1] = 0xFFFF;
\r
2976 void FontPrint(unsigned char *Buffer, signed short sx, signed short y, unsigned short bgc)
\r
2978 unsigned long Offset;
\r
2979 unsigned char CurChar;
\r
2980 unsigned short CharOffset;
\r
2985 while((CurChar = Buffer[Offset++]) != 0)
\r
2996 if(AsciiTable2[CurChar] != 255)
\r
2999 DBFRect(x, y, x + FontBuffer[(AsciiTable2[CurChar] << 1) + 1], y + 4, bgc);
\r
3000 DBCopyBufferClip(x, y, (unsigned char *)&FontBuffer[FontBuffer[AsciiTable2[CurChar] << 1] + 512], FontBuffer[(AsciiTable2[CurChar] << 1) + 1], 5, 0);
\r
3003 DBFRect(x, y, x + 2, y + 4, bgc);
\r
3005 x += FontBuffer[(AsciiTable2[CurChar] << 1) + 1] + 1;
\r
3011 void DBPrint(unsigned char *Buffer, signed short sx, signed short y, unsigned char bgc)
\r
3013 unsigned long Offset;
\r
3014 unsigned char CurChar;
\r
3019 while((CurChar = Buffer[Offset++]) != 0)
\r
3030 if(AsciiTable[CurChar] != 65535)
\r
3032 DBCopyBufferClip(x, y, Caches[FontSprite]->Frames[AsciiTable[CurChar]], Caches[FontSprite]->w, Caches[FontSprite]->h, bgc);
\r
3035 DBFRect(x, y, x + 2, y + 3, MakeColor(0, 0, 0));
\r
3037 x += Caches[FontSprite]->w + 1;
\r
3043 unsigned short WallAngle(unsigned short x, unsigned short y)
\r
3048 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
3052 for(i = 0; i < MAX_PIXELS; i++)
\r
3054 if(Pixels[i]->Used == 0)
\r
3058 Pixels[i]->xv = xv;
\r
3059 Pixels[i]->yv = yv;
\r
3061 Pixels[i]->SetColor = SetColor;
\r
3062 Pixels[i]->Explode = Explode;
\r
3063 Pixels[i]->Damage = Damage;
\r
3064 Pixels[i]->Owner = Owner;
\r
3065 Pixels[i]->Used = 1;
\r
3071 void DrawLightning(signed short x1, signed short y1, signed short x2, signed short y2, signed short NumPoints, unsigned char Template)
\r
3074 signed short x, y, fx, fy, nx, ny;
\r
3075 unsigned short Dist;
\r
3076 unsigned char Rad;
\r
3080 if(NumPoints <= 0)
\r
3082 while((Dist = (unsigned short)sqrt(((x2 - fx) * (x2 - fx)) + ((y2 - fy) * (y2 - fy)))) > 10)
\r
3084 nx = fx + (((x2 - fx) * 10) / Dist);
\r
3085 ny = fy + (((y2 - fy) * 10) / Dist);
\r
3087 while((GetMapPixel((x = nx + (signed short)(rand() % ((Rad * 2) + 1)) - Rad), (y = ny + (signed short)(rand() % ((Rad * 2) + 1)) - Rad), 1) & MAP_SHOOTABLE) == 0)
\r
3089 //DrawLine(fx, fy, x, y, 0, 0, 1, Template);
\r
3090 DrawLine(fx, fy, x, y, 0, 0, 1, Template);
\r
3094 DrawLine(fx, fy, x2, y2, 0, 0, 1, Template);
\r
3096 for(i = 0; i < NumPoints; i++)
\r
3098 x = x1 + (signed short)(((signed long)(x2 - x1) * (signed long)i) / (signed long)NumPoints);
\r
3099 y = y1 + (signed short)(((signed long)(y2 - y1) * (signed long)i) / (signed long)NumPoints);
\r
3100 x += (signed short)(rand() % 7) - 3;
\r
3101 y += (signed short)(rand() % 7) - 3;
\r
3102 DrawLine(fx, fy, x, y, 0, 0, 1, Template);
\r
3109 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
3111 static unsigned short i = 0;
\r
3112 unsigned short Start;
\r
3114 for(Start = i; i < MAX_LINES; i++)
\r
3116 if(Lines[i]->Used == 0)
\r
3118 Lines[i]->x1 = x1;
\r
3119 Lines[i]->y1 = y1;
\r
3120 Lines[i]->x2 = x2;
\r
3121 Lines[i]->y2 = y2;
\r
3122 Lines[i]->c1 = c1;
\r
3123 Lines[i]->c2 = c2;
\r
3124 Lines[i]->Transparent = Method;
\r
3125 Lines[i]->UseSprite = UseSprite;
\r
3126 Lines[i]->AnimTimer = 0;
\r
3127 Lines[i]->CurFrame = 0;
\r
3128 if(UseSprite == 0xFF)
\r
3129 Lines[i]->Used = 1;
\r
3131 Lines[i]->Used = Caches[UseSprite]->AnimDelay * Caches[UseSprite]->NumFrames;
\r
3135 for(i = 0; i < Start; i++)
\r
3137 if(Lines[i]->Used == 0)
\r
3139 Lines[i]->x1 = x1;
\r
3140 Lines[i]->y1 = y1;
\r
3141 Lines[i]->x2 = x2;
\r
3142 Lines[i]->y2 = y2;
\r
3143 Lines[i]->c1 = c1;
\r
3144 Lines[i]->c2 = c2;
\r
3145 Lines[i]->Transparent = Method;
\r
3146 Lines[i]->UseSprite = UseSprite;
\r
3147 Lines[i]->AnimTimer = 0;
\r
3148 Lines[i]->CurFrame = 0;
\r
3149 if(UseSprite == 0xFF)
\r
3150 Lines[i]->Used = 1;
\r
3152 Lines[i]->Used = Caches[UseSprite]->AnimDelay * Caches[UseSprite]->NumFrames;
\r
3158 void DrawCircle(signed short x, signed short y, unsigned short r, unsigned long Color, unsigned char Transparent)
\r
3162 for(i = 0; i < MAX_RASTERS; i++)
\r
3164 if(Rasters[i]->Used == 0)
\r
3166 Rasters[i]->x1 = x;
\r
3167 Rasters[i]->y1 = y;
\r
3168 Rasters[i]->x2 = r;
\r
3169 Rasters[i]->Color = Color;
\r
3170 Rasters[i]->Transparent = Transparent;
\r
3171 Rasters[i]->Type = 1;
\r
3172 Rasters[i]->Used = 1;
\r
3178 void DrawPoly(signed short x1, signed short y1, signed short x2, signed short y2, signed short x3, signed short y3, unsigned long Color, unsigned char Transparent)
\r
3182 for(i = 0; i < MAX_RASTERS; i++)
\r
3184 if(Rasters[i]->Used == 0)
\r
3186 Rasters[i]->x1 = x1;
\r
3187 Rasters[i]->y1 = y1;
\r
3188 Rasters[i]->x2 = x2;
\r
3189 Rasters[i]->y2 = y2;
\r
3190 Rasters[i]->x3 = x3;
\r
3191 Rasters[i]->y3 = y3;
\r
3192 Rasters[i]->Color = Color;
\r
3193 Rasters[i]->Transparent = Transparent;
\r
3194 Rasters[i]->Type = 0;
\r
3195 Rasters[i]->Used = 1;
\r
3201 unsigned short SpawnObject(unsigned short Class, unsigned char Owner, unsigned short x, unsigned short y, float xv, float yv)
\r
3203 static unsigned short i = 0;
\r
3204 unsigned short Start;
\r
3206 for(Start = i; i < MAX_OBJECTS; i++)
\r
3208 if(Objects[i]->Used == 0)
\r
3210 Objects[i]->x = (float)x;
\r
3211 Objects[i]->y = (float)y;
\r
3212 Objects[i]->xv = xv;
\r
3213 Objects[i]->yv = yv;
\r
3214 Objects[i]->Class = Class;
\r
3215 Objects[i]->Owner = Owner;
\r
3216 Objects[i]->TickTimer = 0;
\r
3217 Objects[i]->TouchTimer = Classes[Class]->TouchDelay;
\r
3218 Objects[i]->SpriteLink = (Classes[Class]->Sprite != 0xFF)?(SpawnSprite(Classes[Class]->Sprite, (signed short)x, (signed short)y, 0, 0, 0, Classes[Class]->StartFrame, Classes[Class]->TransSprite)):0xFFFF;
\r
3219 Objects[i]->Used = 1;
\r
3221 Execute(Classes[Objects[i]->Class]->Code, (signed short *)&Objects[i]->Variables[0], Classes[Class]->Scripts[2]); //Init
\r
3225 for(i = 0; i < Start; i++)
\r
3227 if(Objects[i]->Used == 0)
\r
3229 Objects[i]->x = (float)x;
\r
3230 Objects[i]->y = (float)y;
\r
3231 Objects[i]->xv = xv;
\r
3232 Objects[i]->yv = yv;
\r
3233 Objects[i]->Class = Class;
\r
3234 Objects[i]->Owner = Owner;
\r
3235 Objects[i]->TickTimer = 0;
\r
3236 Objects[i]->TouchTimer = Classes[Class]->TouchDelay;
\r
3237 Objects[i]->SpriteLink = (Classes[Class]->Sprite != 0xFF)?(SpawnSprite(Classes[Class]->Sprite, (signed short)x, (signed short)y, 0, 0, 0, Classes[Class]->StartFrame, Classes[Class]->TransSprite)):0xFFFF;
\r
3238 Objects[i]->Used = 1;
\r
3240 Execute(Classes[Objects[i]->Class]->Code, (signed short *)&Objects[i]->Variables[0], Classes[Class]->Scripts[2]); //Init
\r
3247 unsigned short GetObjectList(void)
\r
3251 for(i = 0; i < MAX_OBJLISTS; i++)
\r
3253 if(ObjectLists[i]->Used == 0)
\r
3255 ObjectLists[i]->Objects[0].Object = 0xFFFF;
\r
3256 ObjectLists[i]->NumObjects = 0;
\r
3257 ObjectLists[i]->Used = 1;
\r
3264 void ControlObjects(void)
\r
3266 unsigned short i, o;
\r
3267 unsigned short Class;
\r
3268 signed short fx, fy, nx, ny, dx, dy, x, y;
\r
3269 signed short x1, y1, x2, y2, tx1, ty1, tx2, ty2;
\r
3270 unsigned char PixelInfo, Collided, Template;
\r
3271 unsigned short ObjNum, SpriteLink, TestFrame;
\r
3272 unsigned char *FrameBuffer;
\r
3274 for(i = 0; i < MAX_OBJECTS; i++)
\r
3276 if(Objects[i]->Used == 2)
\r
3277 Objects[i]->Used = 0;
\r
3279 for(i = 0; i < MAX_OBJECTS; i++)
\r
3281 if(Objects[i]->Used == 1)
\r
3283 Class = Objects[i]->Class;
\r
3284 fx = (signed short)Objects[i]->x;
\r
3285 fy = (signed short)Objects[i]->y;
\r
3286 Objects[i]->yv += Gravity * ((float)Classes[Class]->GravityMod / 10000);
\r
3287 Objects[i]->x += Objects[i]->xv;
\r
3288 Objects[i]->y += Objects[i]->yv;
\r
3289 if(Objects[i]->TouchTimer > 0)
\r
3290 Objects[i]->TouchTimer--;
\r
3291 nx = (signed short)Objects[i]->x;
\r
3292 ny = (signed short)Objects[i]->y;
\r
3299 if((dx > 1) || (dy > 1))
\r
3302 SpriteLink = Objects[i]->SpriteLink;
\r
3303 if(SpriteLink != 0xFFFF)
\r
3304 Template = Sprites[SpriteLink]->Template;
\r
3307 Collided = CollisionTest((signed short *)&fx, (signed short *)&fy, (signed short *)&nx, (signed short *)&ny, MAP_SHOOTABLE, Classes[Class]->RunHitTests, (unsigned short *)&ObjNum, Template, (Template == 0xFF)?0:Sprites[SpriteLink]->CurFrame);
\r
3309 Collided = (GetMapPixel((unsigned short)nx, (unsigned short)ny, 1) & MAP_SHOOTABLE) == 0;
\r
3310 if(Classes[Class]->RunHitTests == 1)
\r
3314 if((SpriteLink = Objects[i]->SpriteLink) == 0xFFFF)
\r
3318 Template = Sprites[SpriteLink]->Template;
\r
3319 TestFrame = Sprites[SpriteLink]->CurFrame;
\r
3321 if((ObjNum = HitTest(x, y, i, Template, TestFrame)) != 0xFFFF)
\r
3323 /*for(o = 0; o < MAX_HITTESTS; o++)
\r
3325 if(HitTests[o] == 0xFFFF)
\r
3327 if(HitTests[o] == i)
\r
3329 SpriteLink = Objects[HitTests[o]]->SpriteLink;
\r
3330 if(SpriteLink != 0xFFFF)
\r
3332 if(SpriteLink != 0xFFFF)
\r
3333 Template = Sprites[SpriteLink]->Template;
\r
3336 if(Objects[i]->SpriteLink != 0xFFFF)
\r
3338 SpriteLink2 = Objects[i]->SpriteLink;
\r
3339 TestFrame = Sprites[SpriteLink2]->CurFrame;
\r
3340 Template2 = Sprites[SpriteLink2]->Template;
\r
3342 SpriteLink2 = 0xFFFF;
\r
3346 if(Template2 == 0xFF)
\r
3353 tx1 = x - Caches[Template2]->cx[TestFrame];
\r
3354 ty1 = y - Caches[Template2]->cy[TestFrame];
\r
3355 tx2 = x - Caches[Template2]->cx[TestFrame] + Caches[Template2]->w;
\r
3356 ty2 = y - Caches[Template2]->cy[TestFrame] + Caches[Template2]->h;
\r
3358 if((tx2 >= Sprites[SpriteLink]->x - Caches[Template]->cx[Sprites[SpriteLink]->CurFrame]) && (ty2 >= Sprites[SpriteLink]->y - Caches[Template]->cy[Sprites[SpriteLink]->CurFrame]) && (tx1 < Sprites[SpriteLink]->x - Caches[Template]->cx[Sprites[SpriteLink]->CurFrame] + Caches[Template]->w) && (ty1 < Sprites[SpriteLink]->y - Caches[Template]->cy[Sprites[SpriteLink]->CurFrame] + Caches[Template]->h))
\r
3360 if(Objects[i]->SpriteLink == 0xFFFF)
\r
3362 Offset = x - Sprites[SpriteLink]->x + Caches[Template]->cx[Sprites[SpriteLink]->CurFrame];
\r
3363 Offset += (y - Sprites[SpriteLink]->y + Caches[Template]->cy[Sprites[SpriteLink]->CurFrame]) * Caches[Template]->w;
\r
3364 FrameBuffer = Caches[Template]->Frames[Sprites[SpriteLink]->CurFrame];
\r
3365 if((Offset < Caches[Template]->w * Caches[Template]->h) && (*(unsigned long *)&FrameBuffer[Offset << 2] != 0))
\r
3367 ObjNum = HitTests[o];
\r
3372 if(SpritesOverlap(Template2, TestFrame, Template, Sprites[SpriteLink]->CurFrame, Sprites[SpriteLink]->x - x, Sprites[SpriteLink]->y - y))
\r
3374 ObjNum = HitTests[o];
\r
3386 if((Collided == 2)?((Objects[i]->Owner != 0xFF)?((ObjNum == Players[Objects[i]->Owner]->Object)?(Objects[i]->TouchTimer == 0):1):1):1)
\r
3388 PixelInfo = GetMapPixel((unsigned short)nx, (unsigned short)ny, 1);
\r
3392 Regs[19] = ((PixelInfo & MAP_SHOOTABLE) == 0)?0:1;
\r
3393 Regs[20] = ((PixelInfo & MAP_WALKABLE) == 0)?0:1;
\r
3394 Regs[21] = ((PixelInfo & MAP_DESTROYABLE) == 0)?0:1;
\r
3397 Regs[24] = Collided;
\r
3398 Regs[25] = ObjNum;
\r
3399 Execute(Classes[Objects[i]->Class]->Code, (signed short *)&Objects[i]->Variables[0], Classes[Class]->Scripts[1]); //Touch
\r
3402 if((Classes[Class]->TickDelay != 0) && (Objects[i]->Used == 1))
\r
3404 if(++Objects[i]->TickTimer >= Classes[Class]->TickDelay)
\r
3406 PixelInfo = GetMapPixel((unsigned short)Objects[i]->x, (unsigned short)Objects[i]->y, 1);
\r
3407 Objects[i]->TickTimer = 0;
\r
3409 Regs[17] = (signed short)Objects[i]->x;
\r
3410 Regs[18] = (signed short)Objects[i]->y;
\r
3411 Regs[19] = ((PixelInfo & MAP_SHOOTABLE) == 0)?0:1;
\r
3412 Regs[20] = ((PixelInfo & MAP_WALKABLE) == 0)?0:1;
\r
3413 Regs[21] = ((PixelInfo & MAP_DESTROYABLE) == 0)?0:1;
\r
3414 Execute(Classes[Objects[i]->Class]->Code, (signed short *)&Objects[i]->Variables[0], Classes[Class]->Scripts[0]); //Tick
\r
3417 if(Objects[i]->SpriteLink != 0xFFFF)
\r
3419 Sprites[Objects[i]->SpriteLink]->x = (signed short)Objects[i]->x;
\r
3420 Sprites[Objects[i]->SpriteLink]->y = (signed short)Objects[i]->y;
\r
3426 void ControlSprites(void)
\r
3429 unsigned char Template;
\r
3431 for(i = 0; i < MAX_SPRITES; i++)
\r
3433 if(Sprites[i]->Used == 1)
\r
3435 Template = Sprites[i]->Template;
\r
3436 Sprites[i]->x += Sprites[i]->xv;
\r
3437 Sprites[i]->y += Sprites[i]->yv;
\r
3438 if(Sprites[i]->AnimDelay != 0xFF)
\r
3440 if(++Sprites[i]->AnimTimer >= Sprites[i]->AnimDelay)
\r
3442 Sprites[i]->AnimTimer = 0;
\r
3443 if(++Sprites[i]->CurFrame >= Caches[Template]->NumFrames)
\r
3445 Sprites[i]->CurFrame = 0;
\r
3446 if(Sprites[i]->AnimCount > 0)
\r
3448 if(--Sprites[i]->AnimCount == 0)
\r
3450 Sprites[i]->Used = 0;
\r
3458 for(i = 0; i < MAX_LINES; i++)
\r
3460 if(Lines[i]->Used > 0)
\r
3463 if((Lines[i]->UseSprite != 0xFF) && (Caches[Lines[i]->UseSprite]->AnimDelay != 0xFF))
\r
3465 if(++Lines[i]->AnimTimer >= Caches[Lines[i]->UseSprite]->AnimDelay)
\r
3467 Lines[i]->AnimTimer = 0;
\r
3468 if(++Lines[i]->CurFrame >= Caches[Lines[i]->UseSprite]->NumFrames)
\r
3469 Lines[i]->CurFrame = 0;
\r
3474 for(i = 0; i < MAX_RASTERS; i++)
\r
3475 Rasters[i]->Used = 0;
\r
3478 void ControlPixels(void)
\r
3480 unsigned short i, o;
\r
3481 signed short fx, fy, nx, ny, dx, dy, x, y;
\r
3482 unsigned char Collided;
\r
3483 unsigned short ObjNum, SpriteLink, Template, Offset;
\r
3484 unsigned char *FrameBuffer;
\r
3486 for(i = 0; i < MAX_PIXELS; i++)
\r
3488 if(Pixels[i]->Used == 1)
\r
3490 fx = (signed short)Pixels[i]->x;
\r
3491 fy = (signed short)Pixels[i]->y;
\r
3492 Pixels[i]->x += Pixels[i]->xv;
\r
3493 Pixels[i]->y += Pixels[i]->yv;
\r
3494 nx = (signed short)Pixels[i]->x;
\r
3495 ny = (signed short)Pixels[i]->y;
\r
3502 if((dx > 1) || (dy > 1))
\r
3505 Collided = CollisionTest((signed short *)&fx, (signed short *)&fy, (signed short *)&nx, (signed short *)&ny, MAP_SHOOTABLE, Pixels[i]->Explode, (unsigned short *)&ObjNum, 0xFF, 0);
\r
3507 Collided = (GetMapPixel((unsigned short)Pixels[i]->x, (unsigned short)Pixels[i]->y, 1) & MAP_SHOOTABLE) == 0;
\r
3508 if(Pixels[i]->Explode == 1)
\r
3510 x = (signed short)Pixels[i]->x;
\r
3511 y = (signed short)Pixels[i]->y;
\r
3512 if((ObjNum = HitTest(x, y, 0xFFFF, 0xFF, 0)) != 0xFFFF)
\r
3518 Pixels[i]->yv += Gravity;
\r
3521 if(Pixels[i]->SetColor == 1)
\r
3523 SetMapPixel((unsigned short)nx, (unsigned short)ny, Pixels[i]->c, 0);
\r
3525 if(Pixels[i]->SetColor == 2)
\r
3527 if((GetMapPixel((unsigned short)fx, (unsigned short)fy, 1) & MAP_SHOOTABLE) == MAP_SHOOTABLE)
\r
3529 SetMapPixel((unsigned short)fx, (unsigned short)fy, Pixels[i]->c, 0);
\r
3530 SetMapPixel((unsigned short)fx, (unsigned short)fy, MAP_DESTROYABLE, 1);
\r
3533 if(Pixels[i]->Explode == 1)
\r
3536 SpawnExplosion((signed short)nx, (signed short)ny, 7, 0, 1);
\r
3539 Objects[ObjNum]->xv += Pixels[i]->xv * (float)Pixels[i]->Damage * 0.013;
\r
3540 Objects[ObjNum]->yv += Pixels[i]->yv * (float)Pixels[i]->Damage * 0.013;
\r
3541 Regs[16] = (signed short)ObjNum;
\r
3542 Regs[17] = Pixels[i]->Damage;
\r
3543 Regs[18] = (signed short)Pixels[i]->Owner;
\r
3544 Regs[19] = (signed short)Objects[ObjNum]->x;
\r
3545 Regs[20] = (signed short)Objects[ObjNum]->y;
\r
3546 Execute(Classes[Objects[ObjNum]->Class]->Code, (signed short *)&Objects[ObjNum]->Variables[0], Classes[Objects[ObjNum]->Class]->Scripts[3]); //TakeDamage
\r
3549 Pixels[i]->Used = 0;
\r
3555 void CollVel(signed short x, signed short y, float *xv, float *yv, unsigned char Attributes)
\r
3558 signed char xa, ya;
\r
3559 unsigned char a1, a2;
\r
3569 a1 = GetMapPixel(x, y + ya, 1) & Attributes;
\r
3570 a2 = GetMapPixel(x + xa, y, 1) & Attributes;
\r
3571 if(((a1 == 0) && (a2 == 0)) || ((a1 != 0) && (a2 != 0)))
\r
3574 *yv = *xv * (float)(xa * -ya);
\r
3575 *xv = Temp * (float)(ya * -xa);
\r
3584 void ControlPlayers(void)
\r
3586 unsigned short i, o;
\r
3587 unsigned short ObjNum;
\r
3588 signed short PlayerAngle, CurWeapon;
\r
3590 for(i = 0; i < MAX_PLAYERS; i++)
\r
3592 if(Players[i]->Used == 1)
\r
3594 ObjNum = Players[i]->Object;
\r
3595 PlayerAngle = Players[i]->Angle;
\r
3596 if(PlayerAngle > 90)
\r
3597 PlayerAngle -= 360;
\r
3598 if(Players[i]->Dir == 1)
\r
3599 PlayerAngle = 180 - PlayerAngle;
\r
3600 if(PlayerAngle < 0)
\r
3601 PlayerAngle += 360;
\r
3602 for(o = 0; o < NUM_WEAPONS; o++)
\r
3604 if(PWeapons[i][o]->Used == 1)
\r
3606 if(PWeapons[i][o]->FireTimer > 0)
\r
3608 if(++PWeapons[i][o]->FireTimer > Weapons[PWeapons[i][o]->Weapon]->FireDelay)
\r
3609 PWeapons[i][o]->FireTimer = 0;
\r
3611 if((PWeapons[i][o]->ReloadTimer > 0) && (Players[i]->CurWeapon == o))
\r
3613 if((Weapons[PWeapons[i][o]->Weapon]->MaxClips > 0) && (PWeapons[i][o]->NumClips == 0))
\r
3615 PWeapons[i][o]->ReloadTimer = 0;
\r
3617 if(++PWeapons[i][o]->ReloadTimer > Weapons[PWeapons[i][o]->Weapon]->ReloadDelay)
\r
3619 PWeapons[i][o]->ReloadTimer = 0;
\r
3620 PWeapons[i][o]->AmmoLeft = Weapons[PWeapons[i][o]->Weapon]->Ammo;
\r
3621 PlaySound(2, 0, 0, MAX_SOUNDS - 1, 22050, 1);
\r
3625 Regs[16] = (signed short)ObjNum;
\r
3626 if(Players[i]->Dir == 0)
\r
3628 Regs[17] = (signed short)Objects[ObjNum]->x + 3 + Cosine[PlayerAngle] * 7;
\r
3630 Regs[17] = (signed short)Objects[ObjNum]->x - 1 + Cosine[PlayerAngle] * 7;
\r
3632 Regs[18] = (signed short)Objects[ObjNum]->y - 2 - Sine[PlayerAngle] * 7;
\r
3633 Regs[19] = (signed short)PlayerAngle;
\r
3634 Regs[20] = (signed short)i;
\r
3635 Regs[21] = (signed short)o;
\r
3636 Execute(Classes[Weapons[PWeapons[i][o]->Weapon]->Class]->Code, (signed short *)&PWeapons[i][o]->Vars[0], Classes[Weapons[PWeapons[i][o]->Weapon]->Class]->Scripts[1]); //Tick
\r
3639 Players[i]->Angle += Players[i]->AngleVel;
\r
3640 if((signed short)Players[i]->Angle >= 360)
\r
3641 Players[i]->Angle -= 360;
\r
3642 if((signed short)Players[i]->Angle < 0)
\r
3643 Players[i]->Angle += 360;
\r
3644 if((Players[i]->Angle < 300) && (Players[i]->Angle > 180))
\r
3646 Players[i]->Angle = 300;
\r
3647 Players[i]->AngleVel = 0;
\r
3649 if((Players[i]->Angle > 90) && (Players[i]->Angle <= 180))
\r
3651 Players[i]->Angle = 90;
\r
3652 Players[i]->AngleVel = 0;
\r
3654 if(((Players[i]->Left != 0) ^ (Players[i]->Right != 0)) & (Players[i]->Change == 0))
\r
3656 if(Players[i]->Left != 0)
\r
3658 if(((GetMapPixel((unsigned short)(Objects[ObjNum]->x) - 1, (unsigned short)(Objects[ObjNum]->y) - 1, 1) & MAP_WALKABLE) == MAP_WALKABLE) && (Objects[ObjNum]->xv > -1))
\r
3659 Objects[ObjNum]->xv -= 0.1;
\r
3660 Players[i]->Dir = 1;
\r
3662 if(Players[i]->Right != 0)
\r
3664 if(((GetMapPixel((unsigned short)(Objects[ObjNum]->x) + 1, (unsigned short)(Objects[ObjNum]->y) - 1, 1) & MAP_WALKABLE) == MAP_WALKABLE) && (Objects[ObjNum]->xv < 1))
\r
3665 Objects[ObjNum]->xv += 0.1;
\r
3666 Players[i]->Dir = 0;
\r
3669 if((GetMapPixel((unsigned short)Objects[ObjNum]->x, (unsigned short)Objects[ObjNum]->y, 1) & MAP_WALKABLE) == 0)
\r
3670 Objects[ObjNum]->xv *= 0.9;
\r
3672 if((Players[i]->Change != 0) && (Players[i]->Left == 1))
\r
3674 Players[i]->CurWeapon -= 1;
\r
3675 if(Players[i]->CurWeapon < 0)
\r
3676 Players[i]->CurWeapon += NUM_WEAPONS;
\r
3677 while(PWeapons[i][Players[i]->CurWeapon]->Used == 0)
\r
3679 Players[i]->CurWeapon -= 1;
\r
3680 if(Players[i]->CurWeapon < 0)
\r
3681 Players[i]->CurWeapon += NUM_WEAPONS;
\r
3684 if((Players[i]->Change != 0) && (Players[i]->Right == 1))
\r
3686 Players[i]->CurWeapon += 1;
\r
3687 if(Players[i]->CurWeapon >= NUM_WEAPONS)
\r
3688 Players[i]->CurWeapon -= NUM_WEAPONS;
\r
3689 while(PWeapons[i][Players[i]->CurWeapon]->Used == 0)
\r
3691 Players[i]->CurWeapon += 1;
\r
3692 if(Players[i]->CurWeapon >= NUM_WEAPONS)
\r
3693 Players[i]->CurWeapon -= NUM_WEAPONS;
\r
3696 if((Players[i]->Up != 0) ^ (Players[i]->Down != 0))
\r
3698 if((Players[i]->Up != 0) && (Players[i]->AngleVel < 3))
\r
3699 Players[i]->AngleVel += .5;
\r
3700 if((Players[i]->Down != 0) && (Players[i]->AngleVel > -3))
\r
3701 Players[i]->AngleVel -= .5;
\r
3703 Players[i]->AngleVel *= .75;
\r
3705 PlayerAngle = Players[i]->Angle;
\r
3706 if(PlayerAngle > 90)
\r
3707 PlayerAngle -= 360;
\r
3708 if(Players[i]->Dir == 1)
\r
3709 PlayerAngle = 180 - PlayerAngle;
\r
3710 if(PlayerAngle < 0)
\r
3711 PlayerAngle += 360;
\r
3712 CurWeapon = Players[i]->CurWeapon;
\r
3713 Players[i]->JustShot = 0;
\r
3714 if((Players[i]->Shoot != 0) && (PWeapons[i][CurWeapon]->FireTimer == 0) && (PWeapons[i][CurWeapon]->ReloadTimer == 0) && ((Weapons[PWeapons[i][CurWeapon]->Weapon]->MaxClips > 0)?(PWeapons[i][CurWeapon]->NumClips > 0):1))
\r
3716 PWeapons[i][Players[i]->CurWeapon]->FireTimer = 1;
\r
3717 if(Players[i]->Dir == 0)
\r
3719 Regs[16] = (signed short)Objects[ObjNum]->x + 3 + Cosine[PlayerAngle] * 7;
\r
3721 Regs[16] = (signed short)Objects[ObjNum]->x - 1 + Cosine[PlayerAngle] * 7;
\r
3723 Regs[17] = (signed short)Objects[ObjNum]->y - 2 - Sine[PlayerAngle] * 7;
\r
3724 Regs[18] = (signed short)PlayerAngle;
\r
3725 Regs[19] = (signed short)(Objects[ObjNum]->xv * 100);
\r
3726 Regs[20] = (signed short)(Objects[ObjNum]->yv * 100);
\r
3727 Regs[21] = (signed short)i;
\r
3728 if(Weapons[PWeapons[i][CurWeapon]->Weapon]->MaxClips > 0)
\r
3729 PWeapons[i][CurWeapon]->NumClips--;
\r
3730 Execute(Classes[Weapons[PWeapons[i][CurWeapon]->Weapon]->Class]->Code, (signed short *)&PWeapons[i][CurWeapon]->Vars[0], Classes[Weapons[PWeapons[i][CurWeapon]->Weapon]->Class]->Scripts[0]); //Fire
\r
3731 if(--PWeapons[i][CurWeapon]->AmmoLeft <= 0)
\r
3732 PWeapons[i][CurWeapon]->ReloadTimer = 1;
\r
3733 Players[i]->JustShot = 1;
\r
3739 void SaveBitmap(unsigned char *Buffer, unsigned short w, unsigned short h, unsigned char *FileName)
\r
3742 unsigned long LongBuffer;
\r
3743 unsigned short x, y;
\r
3745 if((CreateFile(FileName, &BMPFile, NULL, 0) == 0) || (BMPFile.CanWrite == 0))
\r
3747 FileWrite((void *)"BM", 2, &BMPFile);
\r
3748 LongBuffer = 54 + (w * h * 3) + ((w % 4) * h);
\r
3749 FileWrite((void *)&LongBuffer, 4, &BMPFile);
\r
3750 FileWrite((void *)"\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00", 12, &BMPFile);
\r
3752 FileWrite((void *)&LongBuffer, 4, &BMPFile);
\r
3754 FileWrite((void *)&LongBuffer, 4, &BMPFile);
\r
3755 FileWrite((void *)"\x01\x00\x18\x00\x00\x00\x00\x00", 8, &BMPFile);
\r
3756 LongBuffer = (w * h * 3) + ((w % 4) * h);
\r
3757 FileWrite((void *)&LongBuffer, 4, &BMPFile);
\r
3758 FileWrite((void *)"\xC4\x0E\x00\x00\xC4\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16, &BMPFile);
\r
3760 for(y = 0; y < h; y++)
\r
3762 for(x = 0; x < w; x++)
\r
3764 FileWrite((void *)(Buffer + (x << 2) + ((h - y - 1) * 1280)), 3, &BMPFile);
\r
3766 FileWrite((void *)&LongBuffer, w % 4, &BMPFile);
\r
3768 FileClose(&BMPFile);
\r
3771 void ControlMasks(void)
\r
3773 unsigned short i, o, u;
\r
3774 unsigned short x, y, w, h;
\r
3775 unsigned short R, G, B;
\r
3776 unsigned char Colors;
\r
3777 unsigned char *Buffer;
\r
3780 for(i = 0; i < MAX_PLAYERS; i++)
\r
3782 if(Players[i]->Used == 1)
\r
3784 w = Players[i]->VPointX2 - Players[i]->VPointX1 + 1;
\r
3785 h = Players[i]->VPointY2 - Players[i]->VPointY1 + 1;
\r
3786 for(o = 0; o < NUM_MASKS; o++)
\r
3788 Buffer = Players[i]->Masks[o].Buffer;
\r
3789 for(u = 0; u < 16; u++)
\r
3791 if(Players[i]->Masks[o].Effects[u] == 0)
\r
3793 switch(Players[i]->Masks[o].Effects[u])
\r
3796 for(y = 0; y < h; y++)
\r
3798 for(x = 0; x < w; x++)
\r
3800 *(unsigned long *)&c = *(unsigned long *)(Buffer + ((y * w + x) << 2));
\r
3801 R = c.R; G = c.G; B = c.B;
\r
3805 *(unsigned long *)&c = *(unsigned long *)(Buffer + ((y * w + (x - 1)) << 2));
\r
3806 R += c.R; G += c.G; B += c.B;
\r
3811 *(unsigned long *)&c = *(unsigned long *)(Buffer + ((y * w + (x + 1)) << 2));
\r
3812 R += c.R; G += c.G; B += c.B;
\r
3817 *(unsigned long *)&c = *(unsigned long *)(Buffer + (((y - 1) * w + x) << 2));
\r
3818 R += c.R; G += c.G; B += c.B;
\r
3823 *(unsigned long *)&c = *(unsigned long *)(Buffer + (((y + 1) * w + x) << 2));
\r
3824 R += c.R; G += c.G; B += c.B;
\r
3827 *(unsigned long *)&c = *(unsigned long *)(Buffer + ((y * w + x) << 2));
\r
3831 if(R > c.R || G > c.G || B > c.B)
\r
3843 *(unsigned long *)(Buffer + ((y * w + x) << 2)) = *(unsigned long *)&c;
\r
3848 for(y = 0; y < h; y++)
\r
3850 for(x = 0; x < w; x++)
\r
3852 *(unsigned long *)&c = *(unsigned long *)(Buffer + ((y * w + x) << 2));
\r
3856 *(unsigned long *)(Buffer + ((y * w + x) << 2)) = *(unsigned long *)&c;
\r
3867 unsigned char ControlMenu(unsigned char Key)
\r
3869 unsigned short i, o, x, y, Signature, l;
\r
3871 unsigned char ValidLevel;
\r
3873 struct dirent *de;
\r
3875 //DBFRectTrans(100, 30, 220, 150, MakeColor(0, 64, 0), 2);
\r
3876 DBLine(100, 30, 100, 150, MakeColor(0, 150, 0), MakeColor(0, 150, 0));
\r
3877 DBLine(100, 30, 220, 30, MakeColor(0, 150, 0), MakeColor(0, 150, 0));
\r
3878 DBLine(220, 30, 220, 150, MakeColor(0, 150, 0), MakeColor(0, 150, 0));
\r
3879 DBLine(100, 150, 220, 150, MakeColor(0, 150, 0), MakeColor(0, 150, 0));
\r
3880 DBLineTrans(101, 31, 101, 149, MakeColor(0, 150, 0), MakeColor(0, 150, 0), 2);
\r
3881 DBLineTrans(101, 31, 219, 31, MakeColor(0, 150, 0), MakeColor(0, 150, 0), 2);
\r
3882 DBLineTrans(219, 31, 219, 149, MakeColor(0, 150, 0), MakeColor(0, 150, 0), 2);
\r
3883 DBLineTrans(101, 149, 219, 149, MakeColor(0, 150, 0), MakeColor(0, 150, 0), 2);
\r
3884 DBFRectTrans(102, 32, 218, 148, MakeColor(0, 64, 0), 2);
\r
3885 if((Key == 200) && (CurMenuItem > 0))
\r
3887 if((Key == 208) && (CurMenuItem < NumMenuItems - 1))
\r
3889 if(CurMenuItem < StartMenuItem)
\r
3890 StartMenuItem = CurMenuItem;
\r
3891 if(CurMenuItem >= (StartMenuItem + 18))
\r
3892 StartMenuItem = CurMenuItem - 17;
\r
3895 if(MenuStackPos == 0)
\r
3897 Paused = MenuActive = 0;
\r
3899 LoadMenu(MenuStack[--MenuStackPos][0]);
\r
3900 CurMenuItem = MenuStack[MenuStackPos][1];
\r
3901 StartMenuItem = MenuStack[MenuStackPos][2];
\r
3906 switch(*MenuItems[0][CurMenuItem])
\r
3909 MenuStack[MenuStackPos][0] = MenuID;
\r
3910 MenuStack[MenuStackPos][1] = CurMenuItem;
\r
3911 MenuStack[MenuStackPos++][2] = StartMenuItem;
\r
3912 LoadMenu((unsigned short)MenuItems[0][CurMenuItem][1]);
\r
3913 CurMenuItem = StartMenuItem = 0;
\r
3916 if(InitVar() == 1)
\r
3918 MessageBox("Couldn't find the control files PLAYER1.CTR and PLAYER2.CTR!");
\r
3921 if(LevelType == 0)
\r
3923 if(LoadLevel(LevelFileName) != 0)
\r
3926 if(LevelType == 1)
\r
3931 if(LevelType == 2)
\r
3934 for(i = 0; i < 2; i++)
\r
3936 for(y = 0; y < LevelHeight; y++)
\r
3938 for(x = 0; x < LevelWidth; x++)
\r
3940 SetMapPixel((signed short)x, (signed short)y, (unsigned char)((i == 0)?0:7), i);
\r
3944 strcpy(LevelFileName, "Empty");
\r
3945 DispLevelWidth = LevelWidth;
\r
3946 DispLevelHeight = LevelHeight;
\r
3947 SpawnObject(0, -1, 0, 0, 0, 0);
\r
3951 if(ModFileName == NULL)
\r
3953 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
3955 if(OpenFile(ModFileName, &ModFile) == 0)
\r
3957 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
3959 if(LoadMod(&ModFile) != 0)
\r
3960 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
3963 FileClose(&ModFile);
\r
3966 LevelFinished = 0;
\r
3973 TerminatePlayBack();
\r
3974 if(SBReset() == 0)
\r
3987 LoadMenu(MenuStack[--MenuStackPos][0]);
\r
3988 CurMenuItem = MenuStack[MenuStackPos][1];
\r
3989 StartMenuItem = MenuStack[MenuStackPos][2];
\r
3992 MenuStack[MenuStackPos][0] = MenuID;
\r
3993 MenuStack[MenuStackPos][1] = CurMenuItem;
\r
3994 MenuStack[MenuStackPos++][2] = StartMenuItem;
\r
3995 CurMenuItem = StartMenuItem = 0;
\r
3996 MenuItems[0][0] = "\x06";
\r
3997 strcpy(MenuItems[1][0], "Random");
\r
3998 MenuItems[0][1] = "\x07";
\r
3999 strcpy(MenuItems[1][1], "Empty");
\r
4001 if((d = opendir(".")) != NULL)
\r
4003 while((de = readdir(d)) != NULL)
\r
4005 if((l = strlen(de->d_name)) < 4)
\r
4007 if(!strcmp(de->d_name + l - 4, ".lev") ||
\r
4008 !strcmp(de->d_name + l - 4, ".bmp"))
\r
4010 MenuItems[0][NumMenuItems] = "\x08";
\r
4011 strcpy(MenuItems[1][NumMenuItems++], de->d_name);
\r
4016 MenuItems[0][NumMenuItems] = "\x04";
\r
4017 strcpy(MenuItems[1][NumMenuItems++], "Return");
\r
4021 LoadMenu(MenuStack[--MenuStackPos][0]);
\r
4022 CurMenuItem = MenuStack[MenuStackPos][1];
\r
4023 StartMenuItem = MenuStack[MenuStackPos][2];
\r
4024 strcpy(LevelFileName, "Random");
\r
4025 DispLevelWidth = LevelWidth;
\r
4026 DispLevelHeight = LevelHeight;
\r
4030 LoadMenu(MenuStack[--MenuStackPos][0]);
\r
4031 CurMenuItem = MenuStack[MenuStackPos][1];
\r
4032 StartMenuItem = MenuStack[MenuStackPos][2];
\r
4033 strcpy(LevelFileName, "Empty");
\r
4034 DispLevelWidth = LevelWidth;
\r
4035 DispLevelHeight = LevelHeight;
\r
4038 if(OpenFile(MenuItems[1][CurMenuItem], &ModFile) == 0)
\r
4040 sprintf(TextBuffer, "Couldn't open %s!", MenuItems[1][CurMenuItem]);
\r
4041 MessageBox(TextBuffer);
\r
4044 FileRead((void *)&Signature, 2, &ModFile);
\r
4046 if(Signature == 0x464B)
\r
4049 FileRead((void *)&DispLevelWidth, 2, &ModFile);
\r
4050 FileRead((void *)&DispLevelHeight, 2, &ModFile);
\r
4052 if(Signature == 0x4C4E)
\r
4055 FileRead((void *)&DispLevelWidth, 2, &ModFile);
\r
4056 FileRead((void *)&DispLevelHeight, 2, &ModFile);
\r
4058 if(Signature == 0x4D42)
\r
4060 FileSkip(&ModFile, 16);
\r
4062 FileRead((void *)&DispLevelWidth, 2, &ModFile);
\r
4063 FileSkip(&ModFile, 2);
\r
4064 FileRead((void *)&DispLevelHeight, 2, &ModFile);
\r
4066 if(ValidLevel == 0)
\r
4068 sprintf(TextBuffer, "%s is not a valid level file!", MenuItems[1][CurMenuItem]);
\r
4069 MessageBox(TextBuffer);
\r
4072 FileClose(&ModFile);
\r
4074 strcpy(LevelFileName, MenuItems[1][CurMenuItem]);
\r
4075 LoadMenu(MenuStack[--MenuStackPos][0]);
\r
4076 CurMenuItem = MenuStack[MenuStackPos][1];
\r
4077 StartMenuItem = MenuStack[MenuStackPos][2];
\r
4081 for(i = 0; ((i + StartMenuItem) < NumMenuItems) && (i < 18); i++)
\r
4083 FontPrint(MenuItems[1][i + StartMenuItem], 110, 40 + (i * 6), 0);
\r
4084 if((i + StartMenuItem) == CurMenuItem)
\r
4086 DBCopyBufferClipTrans(109 - Caches[30]->w, 42 + (i * 6) - ((Caches[30]->h - 1) >> 1), Caches[30]->Frames[0], Caches[30]->w, Caches[30]->h, 0, 0);
\r
4087 for(o = 109; o < 210; o += Caches[31]->w)
\r
4088 DBCopyBufferClipTrans(o, 42 + (i * 6) - ((Caches[31]->h - 1) >> 1), Caches[31]->Frames[0], Caches[31]->w, Caches[31]->h, 0, 0);
\r
4089 DBCopyBufferClipTrans(o, 42 + (i * 6) - ((Caches[30]->h - 1) >> 1), Caches[30]->Frames[1], Caches[30]->w, Caches[30]->h, 0, 0);
\r
4095 unsigned char MonoColor(unsigned long c)
\r
4099 Col = *(Color *)&c;
\r
4100 return((unsigned char)((Col.R + ((Col.G * 31) / 63) + Col.B) / 3));
\r
4103 unsigned long SmoothColor(unsigned long c1, unsigned long c2, unsigned long c3, unsigned long c4)
\r
4105 Color Col0, Col1, Col2, Col3, Col4;
\r
4107 Col1 = *(Color *)&c1;
\r
4108 Col2 = *(Color *)&c2;
\r
4109 Col3 = *(Color *)&c3;
\r
4110 Col4 = *(Color *)&c4;
\r
4111 Col0.R = (Col1.R + Col2.R + Col3.R + Col4.R) >> 2;
\r
4112 Col0.G = (Col1.G + Col2.G + Col3.G + Col4.G) >> 2;
\r
4113 Col0.B = (Col1.B + Col2.B + Col3.B + Col4.B) >> 2;
\r
4114 return(*(unsigned long *)&Col0);
\r
4117 void SmoothArea(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2)
\r
4119 unsigned short x, y;
\r
4120 unsigned long c0, a1, a2, a3, a4, s;
\r
4122 for(y = y1; y <= y2; y++)
\r
4124 for(x = x1; x <= x2; x++)
\r
4126 if(((GetMapPixel(x, y, 1) & MAP_WALKABLE) == 0) && ((GetMapPixel(x, y, 1) & MAP_DESTROYABLE) == MAP_DESTROYABLE))
\r
4128 a1 = GetMapPixel((signed short)x - 1, y, 1);
\r
4129 a2 = GetMapPixel(x + 1, y, 1);
\r
4130 a3 = GetMapPixel(x, (signed short)y - 1, 1);
\r
4131 a4 = GetMapPixel(x, y + 1, 1);
\r
4133 if((a1 & MAP_WALKABLE) == 0)
\r
4135 if((a2 & MAP_WALKABLE) == 0)
\r
4137 if((a3 & MAP_WALKABLE) == 0)
\r
4139 if((a4 & MAP_WALKABLE) == 0)
\r
4143 SetMapPixel(x, y, MAP_WALKABLE | MAP_SHOOTABLE, 1);
\r
4144 SpawnPixel(x, y, ((float)(rand() % 100) - 50) / 50, ((float)(rand() % 100) - 50) / 50, 255, 2, 0, 0, GetMapPixel(x, y, 0));
\r
4145 SetMapPixel(x, y, 0, 0);
\r
4149 s = SmoothColor(GetMapPixel(x + 1, y, 0), GetMapPixel(x - 1, y, 0), GetMapPixel(x, y + 1, 0), GetMapPixel(x, y - 1, 0));
\r
4150 if(MonoColor(s) > 20)
\r
4151 SetMapPixel(x, y, s, 0);
\r
4158 void SpawnExplosion(signed short x, signed short y, unsigned char StartFrame, unsigned char Smokes, unsigned char Sound)
\r
4160 unsigned short i, Result;
\r
4162 Result = SpawnSprite(0, x, y, 0, 0, 1, StartFrame++, 1);
\r
4163 CopyToMap(x - Caches[0]->cx[StartFrame], y - Caches[0]->cy[StartFrame], Caches[0]->Frames[StartFrame], Caches[0]->w, Caches[0]->h, 0, 1, 0, MAP_WALKABLE | MAP_SHOOTABLE | MAP_DESTROYABLE);
\r
4164 SmoothArea(x - Caches[0]->cx[StartFrame], y - Caches[0]->cy[StartFrame], x - Caches[0]->cx[StartFrame] + Caches[0]->w, y - Caches[0]->cy[StartFrame] + Caches[0]->h);
\r
4168 for(i = 0; i < Smokes; i++)
\r
4170 SpawnSprite(1, x + ((signed short)(rand() % 10) - 5), y + ((signed short)(rand() % 10) - 5), 0, -1, 1, 0, 2);
\r
4175 if(StartFrame > 5)
\r
4176 PlaySound((rand() % 2) + 4, 0, 22, 42, 22050, 1);
\r
4178 PlaySound(3, 0, 43, 63, 22050, 1);
\r
4182 unsigned char ArgExist(unsigned short argc, unsigned char **argv, char *Match)
\r
4186 for(i = 1; i < argc; i++)
\r
4188 if(strcasecmp(argv[i], Match) == 0)
\r
4194 int main(int argc, unsigned char **argv)
\r
4196 unsigned short Result, x, y, i, o;
\r
4197 unsigned short Attributes;
\r
4198 signed short Size;
\r
4199 unsigned long Cycles;
\r
4200 unsigned char Finished;
\r
4201 unsigned char c0, c1, c2, c3, c4;
\r
4202 unsigned short w, h;
\r
4203 unsigned char MFR;
\r
4204 unsigned char Key;
\r
4205 unsigned long Start;
\r
4206 double TickCounts[5];
\r
4207 Color C0, C1, C2, C3, C4, FC;
\r
4210 double StartTime, CurTime;
\r
4211 unsigned char NetFuncAddr[6];
\r
4212 unsigned char *RetBuffer;
\r
4213 float fcx[5], fcy[5];
\r
4214 float fcxi[5], fcyi[5];
\r
4216 //*(unsigned long *)&NetFuncAddr[0] = 0x0040102E;
\r
4217 //*(unsigned short *)&NetFuncAddr[4] = 0x0177;
\r
4218 //RetBuffer = (unsigned char *)MakeFarCall(0, NULL, NetFuncAddr);
\r
4225 if(ArgExist(argc, argv, "/Debug") != 0)
\r
4227 if(ArgExist(argc, argv, "/FR") != 0)
\r
4229 if(ArgExist(argc, argv, "/Randomatiserad") != 0)
\r
4231 if(ArgExist(argc, argv, "/Empty") != 0)
\r
4233 if((c1 = (unsigned char)ArgExist(argc, argv, "/Bana")) != 0)
\r
4235 w = (unsigned short)ArgExist(argc, argv, "/Banbredd");
\r
4236 h = (unsigned short)ArgExist(argc, argv, "/Banaltitud");
\r
4237 if((c2 = (unsigned char)ArgExist(argc, argv, "/Bg")) != 0)
\r
4240 switch(Init(&Result))
\r
4243 printf("SDL Failure\nQuitting...\n");
\r
4247 printf("VESA Failure\nQuitting...\n");
\r
4251 printf("Not enough memory!\n");
\r
4255 printf("Couldn't find the file KVID.DAT!\n");
\r
4259 printf("Datafile corrupted!\n");
\r
4263 Players[0]->Used = 1;
\r
4264 Players[1]->Used = 1;
\r
4266 LevelWidth = (unsigned short)atoi(argv[w + 1]);
\r
4268 LevelHeight = (unsigned short)atoi(argv[h + 1]);
\r
4272 strcpy(LevelFileName, "dm.lev");
\r
4274 if(LoadLevel("dm.lev") != 0)
\r
4285 for(i = 0; i < 2; i++)
\r
4287 for(y = 0; y < LevelHeight; y++)
\r
4289 for(x = 0; x < LevelWidth; x++)
\r
4291 SetMapPixel((signed short)x, (signed short)y, (unsigned char)((i == 0)?0:7), i);
\r
4295 strcpy(LevelFileName, "Empty");
\r
4296 SpawnObject(0, -1, 0, 0, 0, 0);
\r
4300 strcpy(LevelFileName, argv[c1 + 1]);
\r
4302 if(LoadLevel(argv[c1 + 1]) != 0)
\r
4309 if(InitVar() == 1)
\r
4312 printf("Couldn't find control files!\nShould be named PLAYER1.CTR and PLAYER2.CTR\n");
\r
4315 ModFileName = NULL;
\r
4318 if(OpenFile("DefaultMod", &ModFile) == 0)
\r
4320 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
4322 if(LoadMod(&ModFile) != 0)
\r
4324 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
4327 ModFileName = "DefaultMod";
\r
4329 FileClose(&ModFile);
\r
4332 if(OpenFile(argv[c2 + 1], &ModFile) == 0)
\r
4334 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
4336 if(LoadMod(&ModFile) != 0)
\r
4338 PlaySound(0, 1, 0, MAX_SOUNDS - 1, 22050, 1);
\r
4341 ModFileName = argv[c2 + 1];
\r
4343 FileClose(&ModFile);
\r
4348 Start = (unsigned long)time(NULL);
\r
4349 while((unsigned long)time(NULL) == Start);
\r
4350 Start = (unsigned long)time(NULL);
\r
4356 LevelFinished = 0;
\r
4359 while(Finished == 0)
\r
4361 if(!MFR && !KeyTable[29])
\r
4363 CurTime = ntime();
\r
4364 while(CurTime - StartTime < 0.02)
\r
4366 usleep((unsigned long)((0.02 - (CurTime - StartTime)) * 1000000));
\r
4367 CurTime = ntime();
\r
4370 StartTime = ntime();
\r
4371 /*if(KeyTable[67] == 1)
\r
4373 if(KeyTable[68] == 1)
\r
4377 for(i = 0; i < MAX_PLAYERS; i++)
\r
4379 Players[i]->Left = 0;
\r
4380 Players[i]->Right = 0;
\r
4381 Players[i]->Up = 0;
\r
4382 Players[i]->Down = 0;
\r
4383 Players[i]->Shoot = 0;
\r
4384 Players[i]->Change = 0;
\r
4390 TickCounts[0] = ntime();
\r
4393 TickCounts[1] = ntime();
\r
4396 TickCounts[2] = ntime();
\r
4399 TickCounts[3] = ntime();
\r
4402 if((unsigned long)time(NULL) - Start > 10)
\r
4404 c0 = KeyTable[63] * 4;
\r
4405 if(KeyTable[64] == 1) c0 += 8;
\r
4406 if(KeyTable[65] == 1) c0 += 16;
\r
4407 if(KeyTable[59] == 1) BGFrame = c0;
\r
4408 if(KeyTable[60] == 1) BGFrame = c0 + 1;
\r
4409 if(KeyTable[61] == 1) BGFrame = c0 + 2;
\r
4410 if(KeyTable[62] == 1) BGFrame = c0 + 3;
\r
4411 if(KeyTable[66] == 1)
\r
4413 x = rand() % LevelWidth;
\r
4414 y = rand() % LevelHeight;
\r
4415 while((GetMapPixel(x, y, 1) & MAP_SHOOTABLE) == 0)
\r
4417 x = rand() % LevelWidth;
\r
4418 y = rand() % LevelHeight;
\r
4420 SpawnObject(145, -1, x, y, 0, 0);
\r
4422 if((Key == 1) && (LevelFinished == 0) && (MenuActive == 0))
\r
4426 CurMenuItem = StartMenuItem = 0;
\r
4427 Paused = MenuActive ^= 1;
\r
4430 if(KeyTable[87] == 1)
\r
4432 while(KeyTable[87] == 1)
\r
4434 Objects[Players[1]->Object]->xv = 100;
\r
4438 TickCounts[4] = ntime();
\r
4440 SetMode(!FullScreen);
\r
4442 SaveBitmap(DblBuffer, 320, 200, "ss.bmp");
\r
4443 if(MenuActive == 1)
\r
4445 if(ControlMenu(Key) == 1)
\r
4448 if((LevelFinished == 1) && ((MenuActive == 0) || (Paused == 0)))
\r
4451 CurMenuItem = StartMenuItem = 0;
\r
4452 Paused = MenuActive = 1;
\r
4455 sprintf(TextBuffer, "Play time left: %li", (signed long)(PLAY_TIME - Cycles));
\r
4456 DBPrint(TextBuffer, 0, 196, 255);
\r
4457 if(Cycles >= PLAY_TIME)
\r
4461 if(Cycles % 5 == 0)
\r
4463 if(--FogX < -Caches[FogSprite]->w)
\r
4464 FogX += Caches[FogSprite]->w;
\r
4466 if(Cycles % 10 == 0)
\r
4468 if(--FogY < -Caches[FogSprite]->h)
\r
4469 FogY += Caches[FogSprite]->h;
\r
4471 for(i = 0; i < 5; i++)
\r
4473 for(o = 0; o < (320 * ((TickCounts[i] - CurTime) / 0.02)); o++)
\r
4475 DBPSetC(x++, 199, MakeColor((i * 255) / 4, 0, ((4 - i) * 255) / 4));
\r
4477 CurTime = TickCounts[i];
\r
4479 if(KeyTable[203] == 1)
\r
4481 if(KeyTable[205] == 1)
\r
4487 //DBCopyBufferRotated(160, 100, Caches[47]->Frames[0], Caches[47]->w, Caches[47]->h, 0, Caches[47]->w >> 1, Caches[47]->h >> 1, Size);
\r
4488 DBPSetC(160, 100, MakeColor(255, 0, 0));
\r
4491 while(KeyTable[1] == 1)
\r
4493 for(i = 0; i < 5; i++)
\r
4495 fcx[i] = (rand() % 320) + 1;
\r
4496 fcy[i] = (rand() % 200) + 1;
\r
4497 fcxi[i] = ((float)(rand() % 200) / 100) - 1;
\r
4498 fcyi[i] = ((float)(rand() % 200) / 100) - 1;
\r
4500 while(KeyTable[1] == 0)
\r
4503 for(Start = 0; Start < 256000; Start += 4)
\r
4505 C0 = *(Color *)&DblBuffer[Start];
\r
4507 C1 = *(Color *)&DblBuffer[Start - 4];
\r
4508 if(Start < 255996)
\r
4509 C2 = *(Color *)&DblBuffer[Start + 4];
\r
4511 C3 = *(Color *)&DblBuffer[Start - 1280];
\r
4512 if(Start < 254720)
\r
4513 C4 = *(Color *)&DblBuffer[Start + 1280];
\r
4514 FC.R = (C0.R + C1.R + C2.R + C3.R + C4.R) / 5;
\r
4515 FC.G = (C0.G + C1.G + C2.G + C3.G + C4.G) / 5;
\r
4516 FC.B = (C0.B + C1.B + C2.B + C3.B + C4.B) / 5;
\r
4517 *(unsigned long *)&DblBuffer[Start] = *(unsigned long *)&FC;
\r
4523 movd (%%edi), %%mm0
\r
4524 punpcklbw %%mm2, %%mm0
\r
4525 movd -1280(%%edi), %%mm1
\r
4532 /*DBFCircleFadedTrans(fcx[0], fcy[0], 50, MakeColor(0, 100, 0), 1, 0);
\r
4533 DBFCircleFadedTrans(fcx[1], fcy[1], 50, MakeColor(0, 0, 100), 1, 0);
\r
4534 DBFCircleFadedTrans(fcx[2], fcy[2], 50, MakeColor(100, 100, 0), 1, 0);
\r
4535 DBFCircleFadedTrans(fcx[3], fcy[3], 50, MakeColor(100, 0, 50), 1, 0);
\r
4536 DBFCircleFadedTrans(fcx[4], fcy[4], 50, MakeColor(100, 0, 0), 1, 0);
\r
4537 for(i = 0; i < 5; i++)
\r
4539 fcx[i] += fcxi[i];
\r
4540 fcy[i] += fcyi[i];
\r
4542 fcxi[i] = -fabs(fcxi[i]);
\r
4544 fcxi[i] = fabs(fcxi[i]);
\r
4546 fcyi[i] = -fabs(fcyi[i]);
\r
4548 fcyi[i] = fabs(fcyi[i]);
\r
4553 printf("%lu\n", Cycles);
\r