moved correcting playfield buffer scroll position to EM engine
[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   boolean north = FALSE;
20   boolean east  = FALSE;
21   boolean south = FALSE;
22   boolean west  = FALSE;
23   boolean snap  = FALSE;
24   boolean drop  = FALSE;
25
26   if (game_em.use_single_button && action & (JOY_BUTTON_1 | JOY_BUTTON_2))
27     action |= JOY_BUTTON_1 | JOY_BUTTON_2;
28
29   if (action & JOY_LEFT)
30     west = TRUE;
31
32   if (action & JOY_RIGHT)
33     east = TRUE;
34
35   if (action & JOY_UP)
36     north = TRUE;
37
38   if (action & JOY_DOWN)
39     south = TRUE;
40
41   if (action & JOY_BUTTON_1)
42     snap = TRUE;
43
44   if (action & JOY_BUTTON_2)
45     drop = TRUE;
46
47   /* always update drop action */
48   ply->joy_drop = drop;
49
50   if (ply->joy_stick || (north | east | south | west))  /* (no "| snap"!) */
51   {
52     ply->joy_n = north;
53     ply->joy_e = east;
54     ply->joy_s = south;
55     ply->joy_w = west;
56
57     /* when storing last action, only update snap action with direction */
58     /* (prevents clearing direction if snapping stopped before frame 7) */
59     ply->joy_snap = snap;
60   }
61
62   /* if no direction was stored before, allow setting snap to current state */
63   if (!ply->joy_n &&
64       !ply->joy_e &&
65       !ply->joy_s &&
66       !ply->joy_w)
67     ply->joy_snap = snap;
68
69   /* use bug with snap key (mainly TAS keys) sometimes moving the player */
70   if (game_em.use_snap_key_bug)
71     ply->joy_snap = snap;
72 }
73
74 void InitGameEngine_EM(void)
75 {
76   prepare_em_level();
77
78   game_initscreen();
79
80   RedrawPlayfield_EM(FALSE);
81 }
82
83 void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
84 {
85   int i;
86   boolean any_player_dropping = FALSE;
87
88   game_em.random = game_em.random * 129 + 1;
89
90   frame = (frame + 1) % 8;
91
92   for (i = 0; i < MAX_PLAYERS; i++)
93     readjoy(action[i], &ply[i]);
94
95   UpdateEngineValues(CAVE_POS_X(screen_x / TILEX),
96                      CAVE_POS_Y(screen_y / TILEY),
97                      CAVE_POS_X(ply[0].x),
98                      CAVE_POS_Y(ply[0].y));
99
100   logic();
101
102   for (i = 0; i < MAX_PLAYERS; i++)
103     if (ply[i].joy_drop &&
104         ply[i].dynamite &&
105         ply[i].dynamite_cnt > 0 &&
106         ply[i].dynamite_cnt < 5)
107       any_player_dropping = TRUE;
108
109   CheckSingleStepMode_EM(action, frame, game_em.any_player_moving,
110                          game_em.any_player_snapping, any_player_dropping);
111
112   RedrawPlayfield_EM(FALSE);
113 }
114
115 void SaveEngineSnapshotValues_EM(void)
116 {
117   int i;
118
119   engine_snapshot_em.game_em = game_em;
120   engine_snapshot_em.lev = lev;
121
122   engine_snapshot_em.frame = frame;
123   engine_snapshot_em.screen_x = screen_x;
124   engine_snapshot_em.screen_y = screen_y;
125
126   for (i = 0; i < 4; i++)
127     engine_snapshot_em.ply[i] = ply[i];
128 }
129
130 void LoadEngineSnapshotValues_EM(void)
131 {
132   int i;
133
134   game_em = engine_snapshot_em.game_em;
135   lev = engine_snapshot_em.lev;
136
137   frame = engine_snapshot_em.frame;
138   screen_x = engine_snapshot_em.screen_x;
139   screen_y = engine_snapshot_em.screen_y;
140
141   for (i = 0; i < 4; i++)
142     ply[i] = engine_snapshot_em.ply[i];
143 }