moved functions (no functional change)
[rocksndiamonds.git] / src / game_bd / main_bd.c
1 // ============================================================================
2 // Rocks'n'Diamonds - McDuffin Strikes Back!
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2024 by Artsoft Entertainment
5 //                  Holger Schemel
6 //                  info@artsoft.org
7 //                  https://www.artsoft.org/
8 // ----------------------------------------------------------------------------
9 // main_bd.c
10 // ============================================================================
11
12 #include "main_bd.h"
13
14
15 struct GameInfo_BD game_bd;
16 struct LevelInfo_BD native_bd_level;
17 struct EngineSnapshotInfo_BD engine_snapshot_bd;
18
19
20 // ============================================================================
21 // level file functions
22 // ============================================================================
23
24 void setLevelInfoToDefaults_BD_Ext(int width, int height)
25 {
26   GdCave *cave = native_bd_level.cave;
27
28   if (cave != NULL)
29     gd_cave_free(cave);
30
31   // get empty cave, using default values
32   cave = gd_cave_new();
33
34   // set cave size, if defined
35   if (width > 0 && height > 0)
36   {
37     cave->w = width;
38     cave->h = height;
39   }
40
41   gd_flatten_cave(cave, 0);
42
43   cave->selectable = TRUE;
44   cave->intermission = FALSE;
45
46   native_bd_level.cave = cave;
47   native_bd_level.replay = NULL;
48
49   native_bd_level.cave_nr = 0;
50   native_bd_level.level_nr = 0;
51
52   native_bd_level.loaded_from_caveset = FALSE;
53 }
54
55 void setLevelInfoToDefaults_BD(void)
56 {
57   setLevelInfoToDefaults_BD_Ext(0, 0);
58 }
59
60 boolean LoadNativeLevel_BD(char *filename, int level_pos, boolean level_info_only)
61 {
62   static char *filename_loaded = NULL;
63
64   if (filename_loaded == NULL || !strEqual(filename, filename_loaded))
65   {
66     if (!gd_caveset_load_from_file(filename))
67     {
68       if (!level_info_only)
69         Warn("cannot load BD cave set from file '%s'", filename);
70
71       return FALSE;
72     }
73
74     setString(&filename_loaded, filename);
75   }
76
77   if (level_pos < 0 || level_pos >= 5 * gd_caveset_count())
78   {
79     Warn("invalid level position %d in BD cave set", level_pos);
80
81     return FALSE;
82   }
83
84   native_bd_level.cave_nr  = level_pos % gd_caveset_count();
85   native_bd_level.level_nr = level_pos / gd_caveset_count();
86
87   if (native_bd_level.cave != NULL)
88     gd_cave_free(native_bd_level.cave);
89
90   // get selected cave, prepared for playing
91   native_bd_level.cave = gd_get_prepared_cave_from_caveset(native_bd_level.cave_nr,
92                                                            native_bd_level.level_nr);
93
94   // set better initial cave speed (to set better native replay tape length)
95   set_initial_cave_speed(native_bd_level.cave);
96
97   native_bd_level.loaded_from_caveset = TRUE;
98
99   // check if this cave has any replays
100   if (native_bd_level.cave->replays != NULL)
101   {
102     GList *item = native_bd_level.cave->replays;
103
104     // try to find replay that was recorded for this difficulty level
105     while (item != NULL &&
106            (item->data == NULL ||
107             ((GdReplay *)item->data)->success == FALSE ||
108             ((GdReplay *)item->data)->level != native_bd_level.level_nr))
109       item = item->next;
110
111     // matching replay found
112     if (item != NULL)
113       native_bd_level.replay = (GdReplay *)item->data;
114   }
115
116   return TRUE;
117 }
118
119
120 // ============================================================================
121 // game engine functions
122 // ============================================================================
123
124 int map_action_RND_to_BD(int action)
125 {
126   GdDirection player_move = gd_direction_from_keypress(action & JOY_UP,
127                                                        action & JOY_DOWN,
128                                                        action & JOY_LEFT,
129                                                        action & JOY_RIGHT);
130   boolean player_fire = (action & (JOY_BUTTON_1 | JOY_BUTTON_2));
131
132   return (player_move | (player_fire ? GD_REPLAY_FIRE_MASK : 0));
133 }
134
135 int map_action_BD_to_RND(int action)
136 {
137   GdDirection player_move = action & GD_REPLAY_MOVE_MASK;
138   boolean     player_fire = action & GD_REPLAY_FIRE_MASK;
139
140   int action_move = (player_move == GD_MV_UP            ? JOY_UP                :
141                      player_move == GD_MV_UP_RIGHT      ? JOY_UP   | JOY_RIGHT  :
142                      player_move == GD_MV_RIGHT         ?            JOY_RIGHT  :
143                      player_move == GD_MV_DOWN_RIGHT    ? JOY_DOWN | JOY_RIGHT  :
144                      player_move == GD_MV_DOWN          ? JOY_DOWN              :
145                      player_move == GD_MV_DOWN_LEFT     ? JOY_DOWN | JOY_LEFT   :
146                      player_move == GD_MV_LEFT          ?            JOY_LEFT   :
147                      player_move == GD_MV_UP_LEFT       ? JOY_UP   | JOY_LEFT   : JOY_NO_ACTION);
148   int action_fire = (player_fire ? JOY_BUTTON_1 : JOY_NO_ACTION);
149
150   return (action_move | action_fire);
151 }
152
153 boolean checkGameRunning_BD(void)
154 {
155   return (game_bd.game != NULL && game_bd.game->state_counter == GAME_INT_CAVE_RUNNING);
156 }