1 /*********************************************************** 2 * Rocks'n'Diamonds -- McDuffin Strikes Back! * 3 *----------------------------------------------------------* 4 * (c) 1995-2006 Artsoft Entertainment * 5 * Holger Schemel * 6 * Detmolder Strasse 189 * 7 * 33604 Bielefeld * 8 * Germany * 9 * e-mail: info@artsoft.org * 10 *----------------------------------------------------------* 11 * game.h * 12 ***********************************************************/ 13 14 #ifndef GAME_H 15 #define GAME_H 16 17 /* (not included here due to collisions with Emerald Mine engine definitions) */ 18 /* #include "main.h" */ 19 20 #define MAX_INVENTORY_SIZE 1000 21 22 #define STD_NUM_KEYS 4 23 #define MAX_NUM_KEYS 8 24 25 #define NUM_BELTS 4 26 #define NUM_BELT_PARTS 3 27 28 #define NUM_PANEL_INVENTORY 8 29 #define NUM_PANEL_GRAPHICS 8 30 #define NUM_PANEL_ELEMENTS 8 31 #define NUM_PANEL_CE_SCORE 8 32 33 #if 1 34 struct GamePanelInfo 35 { 36 struct TextPosInfo level_number; 37 struct TextPosInfo gems; 38 struct TextPosInfo inventory_count; 39 struct TextPosInfo inventory_first[NUM_PANEL_INVENTORY]; 40 struct TextPosInfo inventory_last[NUM_PANEL_INVENTORY]; 41 struct TextPosInfo key[MAX_NUM_KEYS]; 42 struct TextPosInfo key_white; 43 struct TextPosInfo key_white_count; 44 struct TextPosInfo score; 45 struct TextPosInfo highscore; 46 struct TextPosInfo time; 47 struct TextPosInfo time_hh; 48 struct TextPosInfo time_mm; 49 struct TextPosInfo time_ss; 50 struct TextPosInfo frame; 51 struct TextPosInfo shield_normal; 52 struct TextPosInfo shield_normal_time; 53 struct TextPosInfo shield_deadly; 54 struct TextPosInfo shield_deadly_time; 55 struct TextPosInfo exit; 56 struct TextPosInfo emc_magic_ball; 57 struct TextPosInfo emc_magic_ball_switch; 58 struct TextPosInfo light_switch; 59 struct TextPosInfo light_switch_time; 60 struct TextPosInfo timegate_switch; 61 struct TextPosInfo timegate_switch_time; 62 struct TextPosInfo switchgate_switch; 63 struct TextPosInfo emc_lenses; 64 struct TextPosInfo emc_lenses_time; 65 struct TextPosInfo emc_magnifier; 66 struct TextPosInfo emc_magnifier_time; 67 struct TextPosInfo balloon_switch; 68 struct TextPosInfo dynabomb_number; 69 struct TextPosInfo dynabomb_size; 70 struct TextPosInfo dynabomb_power; 71 struct TextPosInfo penguins; 72 struct TextPosInfo sokoban_objects; 73 struct TextPosInfo sokoban_fields; 74 struct TextPosInfo robot_wheel; 75 struct TextPosInfo conveyor_belt[NUM_BELTS]; 76 struct TextPosInfo conveyor_belt_switch[NUM_BELTS]; 77 struct TextPosInfo magic_wall; 78 struct TextPosInfo magic_wall_time; 79 struct TextPosInfo gravity_state; 80 struct TextPosInfo graphic[NUM_PANEL_GRAPHICS]; 81 struct TextPosInfo element[NUM_PANEL_ELEMENTS]; 82 struct TextPosInfo element_count[NUM_PANEL_ELEMENTS]; 83 struct TextPosInfo ce_score[NUM_PANEL_CE_SCORE]; 84 struct TextPosInfo ce_score_element[NUM_PANEL_CE_SCORE]; 85 struct TextPosInfo player_name; 86 struct TextPosInfo level_name; 87 struct TextPosInfo level_author; 88 }; 89 90 struct GameButtonInfo 91 { 92 struct Rect stop; 93 struct Rect pause; 94 struct Rect play; 95 struct Rect sound_music; 96 struct Rect sound_loops; 97 struct Rect sound_simple; 98 }; 99 100 #else 101 102 struct GamePanelInfo 103 { 104 struct XY level; 105 struct XY gems; 106 struct XY inventory; 107 struct XY keys; 108 struct XY score; 109 struct XY time; 110 }; 111 #endif 112 113 struct GameInfo 114 { 115 /* values for control panel */ 116 struct GamePanelInfo panel; 117 struct GameButtonInfo button; 118 119 /* values for graphics engine customization */ 120 boolean use_native_emc_graphics_engine; 121 boolean use_native_sp_graphics_engine; 122 boolean use_masked_pushing; 123 int forced_scroll_delay_value; 124 int scroll_delay_value; 125 int tile_size; 126 127 /* values for engine initialization */ 128 int default_push_delay_fixed; 129 int default_push_delay_random; 130 131 /* constant within running game */ 132 int engine_version; 133 int emulation; 134 int initial_move_delay[MAX_PLAYERS]; 135 int initial_move_delay_value[MAX_PLAYERS]; 136 int initial_push_delay_value; 137 138 /* flags to handle bugs in and changes between different engine versions */ 139 /* (for the latest engine version, these flags should always be "FALSE") */ 140 boolean use_change_when_pushing_bug; 141 boolean use_block_last_field_bug; 142 boolean max_num_changes_per_frame; 143 boolean use_reverse_scan_direction; 144 145 /* variable within running game */ 146 int yamyam_content_nr; 147 boolean robot_wheel_active; 148 boolean magic_wall_active; 149 int magic_wall_time_left; 150 int light_time_left; 151 int timegate_time_left; 152 int belt_dir[4]; 153 int belt_dir_nr[4]; 154 int switchgate_pos; 155 int wind_direction; 156 boolean gravity; 157 boolean explosions_delayed; 158 boolean envelope_active; 159 boolean no_time_limit; /* (variable only in very special case) */ 160 161 /* values for the new EMC elements */ 162 int lenses_time_left; 163 int magnify_time_left; 164 boolean ball_state; 165 int ball_content_nr; 166 167 /* values for player idle animation (no effect on engine) */ 168 int player_boring_delay_fixed; 169 int player_boring_delay_random; 170 int player_sleeping_delay_fixed; 171 int player_sleeping_delay_random; 172 173 /* values for special game initialization control */ 174 boolean restart_level; 175 176 /* values for special game control */ 177 int centered_player_nr; 178 int centered_player_nr_next; 179 boolean set_centered_player; 180 181 /* values for random number generator initialization after snapshot */ 182 unsigned int num_random_calls; 183 }; 184 185 struct PlayerInfo 186 { 187 boolean present; /* player present in level playfield */ 188 boolean connected; /* player connected (locally or via network) */ 189 boolean active; /* player present and connected */ 190 boolean mapped; /* player already mapped to input device */ 191 192 boolean killed; /* player maybe present/active, but killed */ 193 boolean reanimated; /* player maybe killed, but reanimated */ 194 195 int index_nr; /* player number (0 to 3) */ 196 int index_bit; /* player number bit (1 << 0 to 1 << 3) */ 197 int element_nr; /* element (EL_PLAYER_1 to EL_PLAYER_4) */ 198 int client_nr; /* network client identifier */ 199 200 byte action; /* action from local input device */ 201 byte mapped_action; /* action mapped from device to player */ 202 byte effective_action; /* action acknowledged from network server 203 or summarized over all configured input 204 devices when in single player mode */ 205 byte programmed_action; /* action forced by game itself (like moving 206 through doors); overrides other actions */ 207 208 int jx, jy, last_jx, last_jy; 209 int MovDir, MovPos, GfxDir, GfxPos; 210 int Frame, StepFrame; 211 212 int GfxAction; 213 214 int initial_element; /* EL_PLAYER_1 to EL_PLAYER_4 or EL_SP_MURPHY */ 215 int artwork_element; 216 boolean use_murphy; 217 218 boolean block_last_field; 219 int block_delay_adjustment; /* needed for different engine versions */ 220 221 boolean can_fall_into_acid; 222 223 boolean gravity; 224 225 boolean LevelSolved, GameOver; 226 227 boolean LevelSolved_GameWon; 228 boolean LevelSolved_GameEnd; 229 boolean LevelSolved_PanelOff; 230 boolean LevelSolved_SaveTape; 231 boolean LevelSolved_SaveScore; 232 int LevelSolved_CountingTime; 233 int LevelSolved_CountingScore; 234 235 int last_move_dir; 236 237 boolean is_active; 238 239 boolean is_waiting; 240 boolean is_moving; 241 boolean is_auto_moving; 242 boolean is_digging; 243 boolean is_snapping; 244 boolean is_collecting; 245 boolean is_pushing; 246 boolean is_switching; 247 boolean is_dropping; 248 boolean is_dropping_pressed; 249 250 boolean is_bored; 251 boolean is_sleeping; 252 253 boolean cannot_move; 254 255 int frame_counter_bored; 256 int frame_counter_sleeping; 257 258 int anim_delay_counter; 259 int post_delay_counter; 260 261 int dir_waiting; 262 int action_waiting, last_action_waiting; 263 int special_action_bored; 264 int special_action_sleeping; 265 266 int num_special_action_bored; 267 int num_special_action_sleeping; 268 269 int switch_x, switch_y; 270 int drop_x, drop_y; 271 272 int show_envelope; 273 274 int move_delay; 275 int move_delay_value; 276 int move_delay_value_next; 277 int move_delay_reset_counter; 278 279 int push_delay; 280 int push_delay_value; 281 282 unsigned int actual_frame_counter; 283 284 int drop_delay; 285 int drop_pressed_delay; 286 287 int step_counter; 288 289 int score; 290 int score_final; 291 292 int gems_still_needed; 293 int sokobanfields_still_needed; 294 int lights_still_needed; 295 int friends_still_needed; 296 int key[MAX_NUM_KEYS]; 297 int num_white_keys; 298 int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl; 299 int shield_normal_time_left; 300 int shield_deadly_time_left; 301 302 int inventory_element[MAX_INVENTORY_SIZE]; 303 int inventory_infinite_element; 304 int inventory_size; 305 }; 306 307 extern struct GameInfo game; 308 extern struct PlayerInfo stored_player[MAX_PLAYERS], *local_player; 309 310 311 #ifdef DEBUG 312 void DEBUG_SetMaximumDynamite(); 313 #endif 314 315 void GetPlayerConfig(void); 316 int GetElementFromGroupElement(int); 317 318 void DrawGameValue_Time(int); 319 void DrawGameDoorValues(void); 320 321 void UpdateAndDisplayGameControlValues(); 322 323 void InitGameSound(); 324 void InitGame(); 325 326 void UpdateEngineValues(int, int); 327 void GameWon(void); 328 void GameEnd(void); 329 330 void InitPlayerGfxAnimation(struct PlayerInfo *, int, int); 331 void Moving2Blocked(int, int, int *, int *); 332 void Blocked2Moving(int, int, int *, int *); 333 void DrawDynamite(int, int); 334 335 void StartGameActions(boolean, boolean, int); 336 337 void GameActions(void); 338 void GameActions_EM_Main(); 339 void GameActions_SP_Main(); 340 void GameActions_RND(); 341 342 void ScrollLevel(int, int); 343 344 void InitPlayLevelSound(); 345 void PlayLevelSound_EM(int, int, int, int); 346 void PlayLevelSound_SP(int, int, int, int); 347 348 void RaiseScore(int); 349 void RaiseScoreElement(int); 350 351 void RequestQuitGameExt(boolean, boolean, char *); 352 void RequestQuitGame(boolean); 353 354 unsigned int InitEngineRandom_RND(int); 355 unsigned int RND(int); 356 357 void FreeEngineSnapshot(); 358 void LoadEngineSnapshot(); 359 void SaveEngineSnapshot(); 360 boolean CheckEngineSnapshot(); 361 362 void CreateGameButtons(); 363 void FreeGameButtons(); 364 void UnmapGameButtons(); 365 void RedrawGameButtons(); 366 367 void HandleSoundButtonKeys(Key); 368 369 #endif 370