-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblocks3.h
683 lines (545 loc) · 16.2 KB
/
blocks3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
/*****************************************************/
/* Ultimate Blocks */
/* Copyright (c) An Ly 2000, Owen Rudge 2001, 2008 */
/*****************************************************/
#include <aldumb.h>
#include "b3types.h"
#include "fps.h"
#if defined(_MSC_VER) || defined(__MINGW32__)
#ifndef WIN32
#define WIN32
#endif
#define strdup _strdup
#define strlwr _strlwr
#endif
#ifndef MAX_PATH
#ifdef PATH_MAX
#define MAX_PATH PATH_MAX
#else
#define MAX_PATH 200
#endif
#endif
#define LOGIN_LEN (MAX_PATH + 4)
#define OLD_SOLID 1
#define OLD_BOX 2
#define OLD_TOKEN 3
#define OLD_FALL 4
#define OLD_AUDREY 9
#define OLD_AN 8
#define OLD_LASER_4WAY 56
#define OLD_LASER_UP 57
#define OLD_LASER_LEFT 58
#define OLD_LASER_DOWN 59
#define OLD_LASER_RIGHT 60
#define OLD_MIRROR_MINUS 61
#define OLD_MIRROR_PLUS 62
#define OLD_MON1 6
#define OLD_MON2 20
#define OLD_BOMB 7
#define OLD_BOMB2 10
#define OLD_EXPLODE 11
#define OLD_DOOR1 12
#define OLD_DOOR2 13
#define OLD_DOOR3 14
#define OLD_SWITCH1 15
#define OLD_SWITCH2 16
#define OLD_SWITCH3 17
#define OLD_DOOR_CLOSE 18
#define OLD_BOX_SLIDE 19
#define OLD_BOX_FALL 21
#define OLD_REVERSE 22
#define SFX_CLICK 0 /* SAMP */
#define SFX_DOOR 1 /* SAMP */
#define SFX_EXPLODE 2 /* SAMP */
#define SFX_FALL 3 /* SAMP */
#define SFX_GETRED 4 /* SAMP */
#define SFX_INQUIRY 5 /* SAMP */
#define SFX_POPON 6 /* SAMP */
#define SFX_ROAR 7 /* SAMP */
#define SFX_WELLDONE 8 /* SAMP */
#define SFX_YEAH 9 /* SAMP */
#define EDITOR_GAME 1
#define PLAYER_GAME 2
#define RESERVE0 8
#define FULL 32
#define PUSH 64
#define MONSTER 128
#define PICKUP 256
#define BLOWUP 512
#define TELEPORT 1024
#define LASER 2048
#define MIRROR 4096
#define BOMB 8192
#define DOOR 16384
#define SWITCH 32768
#define FALL 4
#define FALL_PRIME 5
#define SOLID 48 /* 16, FULL */
#define RESERVE 52 /* 4, 16, FULL */
#define BOX 609 /* 1, PUSH, BLOWUP, FULL */
#define TOKEN 257 /* 1, PICKUP */
#define AUDREY 1000
#define AN 1001
#define RED 1
#define BLUE 2
#define GREEN 4
#define RED_TELEPORT 1025 /* RED, TELEPORT */
#define BLUE_TELEPORT 1026 /* BLUE, TELEPORT */
#define GREEN_TELEPORT 1028 /* GREEN, TELEPORT */
#define OPEN 8
#define CLOSE 16
#define RED_DOOR_OPEN 16393 /* RED, DOOR, OPEN */
#define BLUE_DOOR_OPEN 16394
#define GREEN_DOOR_OPEN 16396
#define RED_DOOR_CLOSE 16433 /* RED, DOOR, CLOSE, FULL */
#define BLUE_DOOR_CLOSE 16434
#define GREEN_DOOR_CLOSE 16436
#define RED_SWITCH 32769
#define BLUE_SWITCH 32770
#define GREEN_SWITCH 32772
#define UP 1
#define RIGHT 2
#define DOWN 4
#define LEFT 8
#define LASER_UP 2145 /* LASER, UP, PUSH, FULL */
#define LASER_DOWN 2148 /* LASER, DOWN, PUSH, FULL */
#define LASER_LEFT 2152 /* LASER, LEFT, PUSH, FULL */
#define LASER_RIGHT 2146 /* LASER, RIGHT, PUSH, FULL */
#define LASER_4WAY 2159
#define MIRROR_PLUS 4161 /* 1, MIRROR, PUSH */
#define MIRROR_MINUS 4162 /* 2, MIRROR, PUSH */
#define BOMB1 8801 /* 1, BOMB, PUSH, BLOWUP, FULL */
#define BOMB2 8802 /* 2, BOMB, PUSH, BLOWUP, FULL */
#define BOMB3 8804 /* 4, BOMB, PUSH, BLOWUP, FULL */
#define LASER_FILTER 40 /* 32, 8 */
#define STOP 0
#define PATROL 1
#define ALERT 2
#define TRACK 4
#define MON0 128 /* 0, MONSTER */
#define MON1 129 /* 1, MONSTER */
#define MON2 130 /* 2, MONSTER */
#define MON3 132 /* 4, MONSTER */
#define SUNNY 1
#define CASTLE 2
#define ROCKY 3
#define SNOWY 4
#define MODTYPE_NULL 0
#define MODTYPE_MOD 1
#define MODTYPE_S3M 2
#define MODTYPE_XM 3
#define MODTYPE_IT 4
#define MODTYPE_DAT_MOD 5
#define MODTYPE_DAT_S3M 6
#define MODTYPE_DAT_XM 7
#define MODTYPE_DAT_IT 8
#define MOTIF_ID_LEN 5
#define FONT_OCR20 0
#define FONT_OCR72 1
#define FONT_HELV12 2
#define FONT_HELV12B 3
#define FONT_HNEUE20 4
#define FONT_HELV10 5
#define DATAFILE_PASSWORD "ub-dat-4.0"
extern DUH *music;
extern char music_unload;
extern AL_DUH_PLAYER *mod_player;
extern int _music_predefined;
extern DATAFILE *fonts, *sfx, *music_dat;
extern char login[LOGIN_LEN]; //13];
extern char login_path[LOGIN_LEN];
extern BITMAP *gfx, *temp, *back;
extern BITMAP *ply_pic[2][12];
extern BITMAP *mon_pic[5][12];
extern BITMAP *temp_particle;
extern BITMAP *title_gfx;
extern PALETTE title_palette;
extern BITMAP *box_pic, *bomb_pic[3];
extern BITMAP *token_pic;
extern BITMAP *teleport_pic[3];
extern BITMAP *blank;
extern BITMAP *laser_pic[5];
extern BITMAP *beam_pic[7];
extern BITMAP *mirror_pic[2];
extern BITMAP *explode_pic[8];
extern BITMAP *filter_pic;
extern BITMAP *door_pic[3];
extern BITMAP *switches_pic[3];
extern BITMAP *editor_icons;
extern BITMAP *fall_pic;
extern BITMAP *dark[5];
extern BITMAP *tick_pic[2];
#define TICK_PIC_WIDTH 16
#define TICK_PIC_HEIGHT 16
extern PALETTE palette;
extern COLOR_MAP trans_table;
extern COLOR_MAP light_table;
extern int _block_width;
extern int _block_height;
extern int _block_depth;
#define _block_height_depth (_block_height + _block_depth)
extern int fps_count;
extern int time_count;
extern int game_type;
extern int game_exit;
extern int lev;
extern int mus_vol, sfx_vol, cd_vol;
extern int _game_speed;
extern char *GAME_SPEEDS[3];
extern FPS *fps;
#define MAP_MAX_WIDTH 20
#define MAP_MAX_HEIGHT 15
#define MAP_MAX_DEPTH 2
#define MAP_WIDTH 20
#define MAP_HEIGHT 15
#define MAP_DEPTH 2
extern int map[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
extern int maps[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH][101];
extern char map_motif[100][MOTIF_ID_LEN];
extern int map2[MAP_MAX_WIDTH][MAP_MAX_HEIGHT];
extern int map_laser[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
extern int map_door[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
extern int map_done[100];
extern int no_ply;
extern int mod_track, mod_last;
extern char motif[MOTIF_ID_LEN];
extern char map_save[20];
typedef struct PLY_DEF
{
int x, y, z, dx, dy, dz;
int frame, dir;
} PLY_DEF;
extern PLY_DEF ply[2];
typedef struct DIRTY_DEF
{
int x, y, z, w, h;
BITMAP *pic;
} DIRTY_DEF;
#define MAX_DIRTY 300
extern DIRTY_DEF dirty[MAX_DIRTY], dirty_sort[MAX_DIRTY];
extern int dirty_count;
typedef struct BOX_DEF
{
int16 x, y, z, dx, dy, dz, dir, type;
BITMAP *pic;
} BOX_DEF;
extern BOX_DEF box[468];
extern uint16 box_count;
typedef struct EXPLODE_DEF
{
int16 x, y, z, frame, type;
} EXPLODE_DEF;
extern EXPLODE_DEF explode[468];
extern uint16 explode_count;
#define MENU_ITEM_NAME_LEN 50
typedef struct MENU_ITEM
{
char name[MENU_ITEM_NAME_LEN];
} MENU_ITEM;
typedef struct MENU_DEF
{
int x, y, w, h, n;
MENU_ITEM item[10];
} MENU_DEF;
extern MENU_DEF menu[4], menu_title[4];
#define DIR_MAXNAME MAX_PATH
typedef struct DIR_DEF
{
char name[DIR_MAXNAME];
char type;
char id;
} DIR_DEF;
#define MAX_MODS 50
#define MAX_DIRS 500
extern DIR_DEF dir[MAX_DIRS], mod[MAX_MODS];
typedef struct MON_DEF
{
int x, y, z, dx, dy, dz;
int dir, state, type, frame;
int speed, count;
} MON_DEF;
extern MON_DEF mon[100];
extern int mon_count;
typedef struct SWITCH_DEF
{
int x, y, z, c;
} SWITCH_DEF;
extern SWITCH_DEF switches[60];
typedef struct DOOR_DEF
{
int x, y, z, c, state;
} DOOR_DEF;
extern DOOR_DEF door[60];
extern int switches_count;
extern int door_count;
typedef struct SOUND_DEF
{
int x, s;
} SOUND_DEF;
#define MAX_SOUND_EFFECTS 40
extern SOUND_DEF fx[MAX_SOUND_EFFECTS];
extern int fx_count;
typedef struct UNDO_DEF
{
PLY_DEF ply[2];
BOX_DEF box[468];
EXPLODE_DEF explode[468];
MON_DEF mon[100];
DOOR_DEF door[60];
SWITCH_DEF switches[60];
int map[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
int map_laser[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
int map_door[MAP_MAX_WIDTH][MAP_MAX_HEIGHT][MAP_MAX_DEPTH];
int box_count;
int explode_count;
int mon_count;
int door_count;
int switches_count;
} UNDO_DEF;
extern UNDO_DEF undo[20];
extern int undo_count;
typedef struct MOTIF
{
char *filename;
char *title;
int special;
char uid[MOTIF_ID_LEN];
char *gfx_fn;
char *music_fn;
int block_width;
int block_height;
int block_depth;
char particles;
} MOTIF;
extern char _particles;
extern MOTIF motifs[20];
extern int num_motifs;
extern int B2Music;
#define MAX_PARTICLES 1000
typedef struct PARTICLE_DEF
{
int x;
int y;
int dx;
int dy;
int col;
} PARTICLE_DEF;
extern PARTICLE_DEF part[MAX_PARTICLES];
extern int part_count;
// todo: new particles
typedef struct particle
{
double x, y; // location of the particle on the screen
double dx, dy; // speed and direction of movement
double rx,ry; // the amount of randomness in the movement
double tx,ty; // the location this particle was last at.
int colour; // the particle's colour
int oldcol[5]; // colour of the old pixel
int type; // the drawing type of the particle
int life; // When the counter hits zero we remove the particle.
struct particle *next; // a link to the next particle.
char first_update; // first time round?
} particle;
#define RAIN_PARTICLE 0 // here are just some types for the drawing types :)
#define SNOW_PARTICLE1 1
#define SNOW_PARTICLE2 2
extern int _redraw_status;
// functions
// bomb.c
void Del_Box(uint16 b_no);
void Add_Explode(uint16 x, uint16 y, uint16 z);
void Explode_Prime_Chain(uint16 x, uint16 y);
void Explode_Prime(uint16 x, uint16 y, uint16 z);
void Bomb_Prime_Laser(void);
void Draw_Explode(void);
// box.c
void Box_Push(int x, int y, int z, int dx, int dy);
void Box_Move(void);
void Box_Fall(void);
// music.c
void CD_Player(void);
void Mod_Music(void);
void Play_MOD_Track(const char *filename, int type, char loop);
void Poll_Music();
void Sort_Music_Files();
// door.c
void Door(void);
void Open_Doors(int c);
void Close_Doors(int c);
int Player_On(int x, int y, int p_no);
// editor.c
void Editor_Draw_Screen(void);
void Editor_Draw_Menu(void);
void Editor_Put_Block(int x, int y, int b);
void Highlight_Menu(int x);
void Drop_Down(void);
void Open_Maps(void);
void Save_Maps(void);
void Map_to_Maps(int lev);
void Maps_to_Map(int lev);
void Copy_To_Buffer(int lev);
void Copy_From_Buffer(int lev);
void Editor_Draw_Tiles(void);
void Editor_Change_Block_Type(int b);
void Clear(int l);
void Clear_All(void);
void Editor_Key_Put_Tile(int mx, int my);
void Reset_Motifs(void);
void Editor(void);
// fall.c
void Check_Fall(int p_no);
void Check_Fall_Prime(void);
int Player_On_Fall(int x, int y);
// gfx.c
void Draw_Block(int x, int y, int z, BITMAP *pic);
void Draw_Status(void);
void DirtyList(int x,int y, int z, int w, int h, BITMAP *pic);
void Draw_Map(void);
void Draw_Area(void);
void Sort_Dirty(void);
void Draw_Screen(void);
void Map_Setup(void);
// init.c
int Remember_Mod_File(const char *fn, int a, void *b);
void Add_Datafile_Mod(const char *fn, const char id, const char type);
int LoadGraphicsPack(const char *fn, int a, void *b);
void UnloadGraphics();
void Initialise(void);
void Save_Config();
void close_button_callback(void);
inline DATAFILE * load_encrypted_datafile(const char *filename);
void UpdateGameSpeeds();
extern volatile int close_button_pressed;
// laser.c
void Start_XYZ(int b_x, int b_y, int b_z, int b_dx, int b_dy, int b_dir);
void Track_Laser(void);
void Laser(void);
void Draw_Lasers();
// levels.c
void Change_Levels(void);
// main.c
void Full_Game(void);
void Get_Ready(void);
void Well_Done(void);
void Init_Full_Game(void);
void Save_Map_Done(void);
void Finish_Game(void);
void Init_Level(void);
int Run_Level(void);
int Token_Count(void);
int Next_Level(void);
int Num_Tokens(void);
char *safe_strcpy(char *dest, const size_t dest_len, const char *src);
char *safe_strcat(char *dest, const size_t dest_len, const char *src);
char *safe_strncpy(char *dest, const size_t dest_len, const char *src, const size_t source_len);
void report_error(char *str);
// menu.c
typedef struct {
char *title;
int id;
char options;
} Menu;
typedef struct {
char *title;
int font;
} InfoWindow;
void Music_Menu(void);
void Options_Menu(void);
void In_Game_Menu(void);
void Music_Menu(void);
int Display_Menu(const Menu *menu, int *ret, int flags, int def_item);
void Display_Info_Window(const InfoWindow *menu);
void About_Box(void);
void Keyboard_Menu(void);
#define END_OF_MENU (char *) NULL, (int) NULL, (char) NULL
#define END_OF_INFOWINDOW (char *) NULL, (int) NULL
enum {
MENUITEM_KEY_LEFT = 1,
MENUITEM_KEY_RIGHT = 2,
MENUITEM_CLOSE = 4,
MENUITEM_TITLE = 8,
MENUITEM_DRAWLINES = 16
};
enum {
MENU_KEY_ENTER = 1,
MENU_KEY_ESC = 2,
MENU_KEY_SPACE = 4,
MENU_KEY_LEFT = 8,
MENU_KEY_RIGHT = 16
};
enum {
MENU_NO_REDRAW = 1,
MENU_ALLOW_MANY_LR = 2,
MENU_SMALL_FONT = 4
};
// mon.c
void Draw_Monsters();
void Monster(void);
void Monster_Draw(int m_no);
void Monster_Mon0(int m_no);
void Monster_Mon1(int m_no);
void Monster_Mon2(int m_no);
void Monster_Mon3(int m_no);
void Monster_Patrol(int m_no);
void Monster_Track(int m_no);
void Monster_Change_Dir_Track(int m_no, int p_no);
void Monster_Die_Check(void);
void Monster_Move(int m_no);
int Monster_Sight(int x, int y, int z, int dir);
void Del_Monster(int m_no);
void Monster_Change_Dir(int m_no, int x, int y, int z);
// motif.c
void Change_Motif(const char *m);
// part.c
void Add_Part(int x, int y, int dx, int dy, int col);
void Del_Part(int p_no);
void Particle(void);
void Particle_Move(void);
void Reset_Particles();
// ply.c
void Player_Fall(int p_no);
void Player_Move(int p_no);
void Player_Teleport(int p_no);
void Player_Pickup(int p_no, int x, int y);
void Player_Pickup_Check(int p_no);
void Player_Input(int p_no);
void Player_Draw(int p_no);
void Player_Monster_Collision(int p_no);
void Player_Laser_Collision(int p_no);
void Player_Death(int p_no);
void Player2_Input(int p_no);
inline int Player_Frame(int f);
int Player_Collision(int p_no, int dx, int dy);
int Check_Can_Fall(int x, int y, int z);
int Check_Map(int x, int y, int z, int b, int or_and, int equals_and);
// sound.c
void Add_Sound(int x, int s);
void Play_Sound(void);
// title.c
char *GetMotifFromInt(int motif);
void Log_In(void);
void Presents(void);
void Title(void);
int Title_Menu(void);
int Remember_File_Title(const char *fn, int a, void *b);
int Open_Maps_Title(void);
// trans.c
void Transition_Out(BITMAP *pic, PALETTE pal);
void Transition_In(BITMAP *pic, PALETTE pal);
// undo.c
void Move_Undo_Down(void);
void Add_Undo(void);
void Undo(void);
void Move_Undo_Down(void);
void Clear_Undo(void);
extern int _level_undos;
// platform-specific .c
#include "b4dirs.h"
const char *get_resource_file_path (const char * str1, const char * str2, const char * file, char userdir);
const char *find_resource_file (int dir, const char *file);
const char *get_current_username();
const char *get_current_user_nicename();
const char *_config_file;
const char *_graphics_dir;
const char *_music_dir;
const char *_map_dir;