1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2024 by Artsoft Entertainment
7 // https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
15 struct GameInfo_BD game_bd;
16 struct LevelInfo_BD native_bd_level;
17 struct EngineSnapshotInfo_BD engine_snapshot_bd;
20 // ============================================================================
21 // initialization functions
22 // ============================================================================
24 void InitGfxBuffers_BD(void)
26 ReCreateBitmap(&gd_screen_bitmap, SXSIZE, SYSIZE);
28 set_cell_size(TILESIZE_VAR);
29 set_play_area(SXSIZE, SYSIZE);
32 void bd_open_all(void)
39 gd_c64_import_init_tables();
48 void bd_close_all(void)
53 // ============================================================================
54 // level file functions
55 // ============================================================================
57 void setLevelInfoToDefaults_BD_Ext(int width, int height)
59 GdCave *cave = native_bd_level.cave;
64 // get empty cave, using default values
67 // set cave size, if defined
68 if (width > 0 && height > 0)
74 gd_flatten_cave(cave, 0);
76 cave->selectable = TRUE;
77 cave->intermission = FALSE;
79 native_bd_level.cave = cave;
80 native_bd_level.replay = NULL;
82 native_bd_level.cave_nr = 0;
83 native_bd_level.level_nr = 0;
85 native_bd_level.loaded_from_caveset = FALSE;
88 void setLevelInfoToDefaults_BD(void)
90 setLevelInfoToDefaults_BD_Ext(0, 0);
93 boolean LoadNativeLevel_BD(char *filename, int level_pos, boolean level_info_only)
95 static char *filename_loaded = NULL;
97 if (filename_loaded == NULL || !strEqual(filename, filename_loaded))
99 if (!gd_caveset_load_from_file(filename))
101 if (!level_info_only)
102 Warn("cannot load BD cave set from file '%s'", filename);
107 setString(&filename_loaded, filename);
110 if (level_pos < 0 || level_pos >= 5 * gd_caveset_count())
112 Warn("invalid level position %d in BD cave set", level_pos);
117 native_bd_level.cave_nr = level_pos % gd_caveset_count();
118 native_bd_level.level_nr = level_pos / gd_caveset_count();
120 if (native_bd_level.cave != NULL)
121 gd_cave_free(native_bd_level.cave);
123 // get selected cave, prepared for playing
124 native_bd_level.cave = gd_get_prepared_cave_from_caveset(native_bd_level.cave_nr,
125 native_bd_level.level_nr);
127 // set better initial cave speed (to set better native replay tape length)
128 set_initial_cave_speed(native_bd_level.cave);
130 native_bd_level.loaded_from_caveset = TRUE;
132 // check if this cave has any replays
133 if (native_bd_level.cave->replays != NULL)
135 GList *item = native_bd_level.cave->replays;
137 // try to find replay that was recorded for this difficulty level
138 while (item != NULL &&
139 (item->data == NULL ||
140 ((GdReplay *)item->data)->success == FALSE ||
141 ((GdReplay *)item->data)->level != native_bd_level.level_nr))
144 // matching replay found
146 native_bd_level.replay = (GdReplay *)item->data;
153 // ============================================================================
154 // game engine functions
155 // ============================================================================
157 int map_action_RND_to_BD(int action)
159 GdDirection player_move = gd_direction_from_keypress(action & JOY_UP,
163 boolean player_fire = (action & (JOY_BUTTON_1 | JOY_BUTTON_2));
165 return (player_move | (player_fire ? GD_REPLAY_FIRE_MASK : 0));
168 int map_action_BD_to_RND(int action)
170 GdDirection player_move = action & GD_REPLAY_MOVE_MASK;
171 boolean player_fire = action & GD_REPLAY_FIRE_MASK;
173 int action_move = (player_move == GD_MV_UP ? JOY_UP :
174 player_move == GD_MV_UP_RIGHT ? JOY_UP | JOY_RIGHT :
175 player_move == GD_MV_RIGHT ? JOY_RIGHT :
176 player_move == GD_MV_DOWN_RIGHT ? JOY_DOWN | JOY_RIGHT :
177 player_move == GD_MV_DOWN ? JOY_DOWN :
178 player_move == GD_MV_DOWN_LEFT ? JOY_DOWN | JOY_LEFT :
179 player_move == GD_MV_LEFT ? JOY_LEFT :
180 player_move == GD_MV_UP_LEFT ? JOY_UP | JOY_LEFT : JOY_NO_ACTION);
181 int action_fire = (player_fire ? JOY_BUTTON_1 : JOY_NO_ACTION);
183 return (action_move | action_fire);
186 boolean checkGameRunning_BD(void)
188 return (game_bd.game != NULL && game_bd.game->state_counter == GAME_INT_CAVE_RUNNING);