1 /**
2  * Header for code common to FreeDink and FreeDinkedit
3 
4  * Copyright (C) 2005, 2007, 2008, 2009, 2010, 2012  Sylvain Beucler
5 
6  * This file is part of GNU FreeDink
7 
8  * GNU FreeDink is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 3 of the
11  * License, or (at your option) any later version.
12 
13  * GNU FreeDink is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17 
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see
20  * <http://www.gnu.org/licenses/>.
21  */
22 
23 #ifndef _DINKVAR_H
24 #define _DINKVAR_H
25 
26 /* for RECT ?? */
27 /* #include <windows.h> */
28 
29 /* #include <ddraw.h> */
30 /* #include <dinput.h> */
31 /* #include <mmsystem.h> */
32 
33 #include <limits.h>
34 
35 #include "SDL.h"
36 #include "SDL_framerate.h"
37 #include "game_engine.h"
38 #include "rect.h"
39 #include "dinkc.h"
40 
41 struct attackinfo_struct
42 {
43 	int time;
44 	/*bool*/int active;
45 	int script;
46 	/*bool*/int hitme;
47 	int last_power;
48 	int wait;
49 	int pull_wait;
50 };
51 
52 struct sprite_placement
53 {
54   int x, y;
55   int seq, frame, type;  /* DinkC: editor_seq, editor_frame, editor_type */
56   int size;
57   BOOL_1BYTE active;
58   int rotation, special, brain;
59 
60   char script[13+1]; /* attached DinkC script */
61   int speed, base_walk, base_idle, base_attack, base_hit, timer, que;
62   int hard;
63   rect alt; /* trim left/top/right/bottom */
64   int is_warp;
65   int warp_map;
66   int warp_x;
67   int warp_y;
68   int parm_seq;
69 
70   int base_die, gold, hitpoints, strength, defense, exp, sound, vision, nohit, touch_damage;
71   int buff[5];
72 };
73 
74 /* one screen from map.dat */
75 struct small_map
76 {
77   struct tile t[12*8+1]; // 97 background tiles
78   struct sprite_placement sprite[100+1];
79   char script[20+1]; /* script to run when entering the script */
80 };
81 
82 
83 
84 #define TALK_TITLE_BUFSIZ 3000
85 #define TALK_LINE_BUFSIZ 101
86 struct talk_struct
87 {
88   char line[21][TALK_LINE_BUFSIZ];  /* dialog choices */
89   int line_return[21]; /* return this number if chosen */
90   char buffer[TALK_TITLE_BUFSIZ];   /* title */
91   int cur;
92   int last;
93   /*bool*/int active;
94   int cur_view;
95   int cur_view_end;
96   int page;
97   int script;
98   int offset;
99   int newy;
100   int color;
101   int curf;
102   int timer;
103 };
104 
105 //sub struct for tile hardness
106 
107 struct block_y
108 {
109   unsigned char y[51];
110 };
111 
112 struct ts_block
113 {
114   struct block_y x[51];
115   BOOL_1BYTE used;
116 };
117 
118 //struct for hardness info, INDEX controls which hardness each block has.  800 max
119 //types available.
120 #define HARDNESS_NB_TILES 800
121 struct hardness
122 {
123   struct ts_block htile[HARDNESS_NB_TILES];
124   /* default hardness for each background tile square, 12*8=96 tiles
125      per screen but indexed % 128 in the code (so 128*(41-1)+12*8=5216
126      used indexes instead of 12*8*41=3936). */
127   short btile_default[GFX_TILES_NB_SQUARES];
128 };
129 
130 extern int GetKeyboard(int key);
131 extern int add_sprite(int x1, int y, int brain,int pseq, int pframe );
132 extern void check_seq_status(int h);
133 /* extern void dderror(HRESULT hErr); */
134 //extern void draw_sprite_game(LPDIRECTDRAWSURFACE lpdest,int h);
135 extern void draw_sprite_game(SDL_Surface *GFX_lpdest, int h);
136 extern void draw_status_all(void);
137 extern void drawallhard( void);
138 extern void duck_brain(int h);
139 extern /*BOOL*/int init_mouse();
140 extern int load_map_to(char* path, const int num, struct small_map* screen);
141 extern int load_map(const int num);
142 extern int load_script(char filename[15], int sprite, /*bool*/int set_sprite);
143 extern /*bool*/int locate(int script, char proc[20]);
144 extern void process_callbacks(void);
145 extern void run_script (int script);
146 extern void update_status_all(void);
147 
148 extern /*bool*/int abort_this_flip;
149 extern int base_timing;
150 extern struct attackinfo_struct bow;
151 extern int dinkspeed;
152 extern int flife;
153 extern int flub_mode;
154 extern int fps_final;
155 extern int show_inventory;
156 extern int stop_entire_game;
157 extern int getpic(int h);
158 
159 /* show_bmp() currently ran */
160 struct show_bmp
161 {
162 	/*bool*/int active;
163 	/*bool*/int showdot;
164 	int reserved;
165 	int script;
166 	int stime;
167 	int picframe;
168 };
169 extern struct show_bmp showb;
170 
171 
172 extern int keep_mouse;
173 extern int last_sprite_created;
174 extern int mbase_count;
175 extern int mode;
176 extern unsigned long mold;
177 
178 extern int *pupdate_status;
179 extern struct small_map pam;
180 extern int playl;
181 extern int playx;
182 extern int playy;
183 extern int *pmap;
184 extern int screenlock;
185 extern int show_dot;
186 extern struct talk_struct talk;
187 extern Uint32 thisTickCount;
188 extern Uint32 lastTickCount;
189 extern FPSmanager framerate_manager;
190 extern /*bool*/int total_trigger;
191 extern /*bool*/int trig_man;
192 
193 /* extern HRESULT ddrval; */
194 /* extern LPDIRECTDRAWPALETTE lpDDPal; /\* The primary surface palette *\/ */
195 /* extern PALETTEENTRY    pe[256]; */
196 
197 
198 /* Game state */
199 extern /*bool*/int add_time_to_saved_game(int num);
200 extern void attach(void);
201 extern /*bool*/int windowed;
202 extern int fcur_weapon, fcur_magic;
203 extern int push_active;
204 extern int move_screen;
205 extern int move_counter;
206 extern int weapon_script;
207 extern int magic_script;
208 
209 /* Player */
210 extern /*bool*/int inside_box(int x1, int y1, rect box);
211 extern int walk_off_screen;
212 
213 /* Sprites - state */
214 extern void add_exp_force(int num, int source_sprite);
215 extern void add_exp(int num, int killed_sprite);
216 extern void changedir( int dir1, int k,int base);
217 extern int get_pan(int h);
218 extern int get_vol(int h);
219 
220 /* Sprites - action */
221 extern void kill_text_owned_by(int sprite);
222 
223 /* Sprites - global */
224 extern void kill_sprite_all (int sprite);
225 extern int find_sprite(int editor_sprite);
226 
227 /* Scripts */
228 extern int say_text_xy(char text[200], int mx, int my, int script);
229 extern void kill_all_scripts_for_real(void);
230 extern void kill_returning_stuff(int script);
231 extern int say_text(char text[200], int h, int script);
232 
233 /* Map */
234 extern unsigned char get_hard(int x1, int y1);
235 extern unsigned char get_hard_play(int h, int x1, int y1);
236 extern void load_hard(void);
237 extern int load_info_to(char* path, struct map_info *mymap);
238 extern void load_info(void);
239 
240 /* Dunno */
241 extern /*bool*/int mouse1;
242 
243 /* Screen */
244 extern void update_screen_time(void);
245 
246 /* OS */
247 extern int bActive; // is application active?
248 extern char *command_line; // command line params, used by doInit
249 
250 //if true, will close app as soon as the message pump is empty
251 extern int g_b_kill_app;
252 
253 
254 /* Startup */
255 extern void pre_figure_out(char* line);
256 extern void figure_out(char* line);
257 
258 /* Metadata */
259 extern int burn_revision;
260 
261 /*
262  * Game & editor
263  */
264 /*bool*/int get_box (int h, rect * box_crap, rect * box_real);
265 extern /*bool*/int dinkedit;
266 extern int draw_map_tiny;
267 extern int cur_map;
268 extern struct hardness hmap;
269 
270 
271 /*
272  * Editor
273  */
274 
275 extern void check_sprite_status(int h);
276 extern void add_hardness(int sprite, int num);
277 extern void fill_whole_hard(void);
278 extern int add_sprite_dumb(int x1, int y, int brain,int pseq, int pframe,int size);
279 extern /*bool*/int kill_last_sprite(void);
280 extern void check_frame_status(int h, int frame);
281 extern void flip_it_second(void);
282 extern void save_map(const int num);
283 extern void save_info(void);
284 extern int realhard(int tile);
285 extern void save_hard(void);
286 
287 extern /*bool*/int no_running_main;
288 
289 extern void fill_screen(int num);
290 
291 
292 /* Used by dinkc_bindings.c only */
293 enum item_type { ITEM_REGULAR, ITEM_MAGIC };
294 extern void clear_talk(void);
295 extern void add_item(char name[10], int mseq, int mframe, enum item_type type);
296 extern void kill_item_script(char* name);
297 extern void kill_mitem_script(char* name);
298 extern void show_bmp(char name[80], int showdot, int script);
299 extern void copy_bmp( char name[80]);
300 extern void kill_cur_item( void );
301 extern void kill_cur_magic( void );
302 extern /*bool*/int text_owned_by(int sprite);
303 extern void kill_all_vars(void);
304 extern void update_play_changes( void );
305 extern void fill_hardxy(rect box);
306 extern void save_game(int num);
307 extern /*bool*/int load_game(int num);
308 extern int does_sprite_have_text(int sprite);
309 extern int change_sprite(int h,  int val, int * change);
310 extern int change_sprite_noreturn(int h,  int val, int * change);
311 extern int change_edit_char(int h,  int val, unsigned char * change);
312 extern int change_edit(int h,  int val, unsigned short * change);
313 extern int hurt_thing(int h, int damage, int special);
314 extern void random_blood(int mx, int my, int h);
315 extern void check_sprite_status_full(int sprite_no);
316 
317 #endif
318