7842a89c5dd7b0b0ad69f897386c4caa5dfcfed0
[rocksndiamonds.git] / src / game_em / game.c
1 /* 2007-11-06 03:39:32
2  *
3  * handle interaction between screen and cave
4  */
5
6 #include "main_em.h"
7
8
9 struct CAVE cav;
10 struct LOGIC lev;
11 struct PLAYER ply[MAX_PLAYERS];
12
13 struct EngineSnapshotInfo_EM engine_snapshot_em;
14
15 /* handle input actions for players */
16
17 static void readjoy(byte action, struct PLAYER *ply)
18 {
19   int north = 0, east = 0, south = 0, west = 0;
20   int snap = 0, drop = 0;
21
22   if (game_em.use_single_button && action & (JOY_BUTTON_1 | JOY_BUTTON_2))
23     action |= JOY_BUTTON_1 | JOY_BUTTON_2;
24
25   if (action & JOY_LEFT)
26     west = 1;
27
28   if (action & JOY_RIGHT)
29     east = 1;
30
31   if (action & JOY_UP)
32     north = 1;
33
34   if (action & JOY_DOWN)
35     south = 1;
36
37   if (action & JOY_BUTTON_1)
38     snap = 1;
39
40   if (action & JOY_BUTTON_2)
41     drop = 1;
42
43   /* always update drop action */
44   ply->joy_drop = drop;
45
46   if (ply->joy_stick || (north | east | south | west))  /* (no "| snap"!) */
47   {
48     ply->joy_n = north;
49     ply->joy_e = east;
50     ply->joy_s = south;
51     ply->joy_w = west;
52
53     /* when storing last action, only update snap action with direction */
54     /* (prevents clearing direction if snapping stopped before frame 7) */
55     ply->joy_snap = snap;
56   }
57
58   /* if no direction was stored before, allow setting snap to current state */
59   if (!ply->joy_n &&
60       !ply->joy_e &&
61       !ply->joy_s &&
62       !ply->joy_w)
63     ply->joy_snap = snap;
64
65   /* use bug with snap key (mainly TAS keys) sometimes moving the player */
66   if (game_em.use_snap_key_bug)
67     ply->joy_snap = snap;
68 }
69
70 void InitGameEngine_EM(void)
71 {
72   prepare_em_level();
73
74   game_initscreen();
75
76   RedrawPlayfield_EM(FALSE);
77 }
78
79 void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
80 {
81   int i;
82   boolean any_player_dropping = FALSE;
83
84   game_em.random = game_em.random * 129 + 1;
85
86   frame = (frame + 1) % 8;
87
88   for (i = 0; i < MAX_PLAYERS; i++)
89     readjoy(action[i], &ply[i]);
90
91   UpdateEngineValues(screen_x / TILEX, screen_y / TILEY, ply[0].x, ply[0].y);
92
93   logic();
94
95   for (i = 0; i < MAX_PLAYERS; i++)
96     if (ply[i].joy_drop &&
97         ply[i].dynamite &&
98         ply[i].dynamite_cnt > 0 &&
99         ply[i].dynamite_cnt < 5)
100       any_player_dropping = TRUE;
101
102   CheckSingleStepMode_EM(action, frame, game_em.any_player_moving,
103                          game_em.any_player_snapping, any_player_dropping);
104
105   RedrawPlayfield_EM(FALSE);
106 }
107
108 void SaveEngineSnapshotValues_EM(void)
109 {
110   int i;
111
112   engine_snapshot_em.game_em = game_em;
113   engine_snapshot_em.lev = lev;
114
115   engine_snapshot_em.frame = frame;
116   engine_snapshot_em.screen_x = screen_x;
117   engine_snapshot_em.screen_y = screen_y;
118
119   for (i = 0; i < 4; i++)
120     engine_snapshot_em.ply[i] = ply[i];
121 }
122
123 void LoadEngineSnapshotValues_EM(void)
124 {
125   int i;
126
127   game_em = engine_snapshot_em.game_em;
128   lev = engine_snapshot_em.lev;
129
130   frame = engine_snapshot_em.frame;
131   screen_x = engine_snapshot_em.screen_x;
132   screen_y = engine_snapshot_em.screen_y;
133
134   for (i = 0; i < 4; i++)
135     ply[i] = engine_snapshot_em.ply[i];
136 }