6eadbbdf0d2ca4aec9d50b6442e9270659aab066
[rocksndiamonds.git] / src / game_em / input.c
1 /* 2000-08-13T15:29:40Z
2  *
3  * handle input from x11 and keyboard and joystick
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 void game_init_random(void)
16 {
17   game_em.random = 1684108901;
18 }
19
20 void game_init_cave_buffers(void)
21 {
22   int x, y;
23
24   for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
25     for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
26       lev.cavebuf[x][y] = Zborder;
27   for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
28     for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
29       lev.nextbuf[x][y] = Zborder;
30   for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
31     for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
32       lev.drawbuf[x][y] = Zborder;
33   for (y = 0; y < CAVE_BUFFER_HEIGHT; y++)
34     for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
35       lev.boombuf[x][y] = Xblank;
36
37   for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
38     lev.cavecol[x] = lev.cavebuf[x];
39   for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
40     lev.nextcol[x] = lev.nextbuf[x];
41   for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
42     lev.drawcol[x] = lev.drawbuf[x];
43   for (x = 0; x < CAVE_BUFFER_WIDTH; x++)
44     lev.boomcol[x] = lev.boombuf[x];
45
46   lev.cave = lev.cavecol;
47   lev.next = lev.nextcol;
48   lev.draw = lev.drawcol;
49   lev.boom = lev.boomcol;
50 }
51
52 void InitGameEngine_EM(void)
53 {
54   prepare_em_level();
55
56   game_initscreen();
57
58   RedrawPlayfield_EM(FALSE);
59 }
60
61 static void UpdateGameDoorValues_EM(void)
62 {
63 }
64
65 void GameActions_EM(byte action[MAX_PLAYERS], boolean warp_mode)
66 {
67   int i;
68   boolean any_player_dropping = FALSE;
69
70   game_em.random = game_em.random * 129 + 1;
71
72   frame = (frame - 1) & 7;
73
74   for (i = 0; i < MAX_PLAYERS; i++)
75     readjoy(action[i], &ply[i]);
76
77   UpdateEngineValues(screen_x / TILEX, screen_y / TILEY, ply[0].x, ply[0].y);
78
79   if (frame == 7)
80   {
81     logic_players();
82     logic_objects();
83   }
84
85   if (frame == 6)
86   {
87     logic_globals();
88
89     UpdateGameDoorValues_EM();
90   }
91
92   for (i = 0; i < MAX_PLAYERS; i++)
93     if (ply[i].joy_drop &&
94         ply[i].dynamite &&
95         ply[i].dynamite_cnt > 0 &&
96         ply[i].dynamite_cnt < 5)
97       any_player_dropping = TRUE;
98
99   CheckSingleStepMode_EM(action, frame, game_em.any_player_moving,
100                          game_em.any_player_snapping, any_player_dropping);
101
102   RedrawPlayfield_EM(FALSE);
103 }
104
105 /* read input device for players */
106
107 void readjoy(byte action, struct PLAYER *ply)
108 {
109   int north = 0, east = 0, south = 0, west = 0;
110   int snap = 0, drop = 0;
111
112   if (game_em.use_single_button && action & (JOY_BUTTON_1 | JOY_BUTTON_2))
113     action |= JOY_BUTTON_1 | JOY_BUTTON_2;
114
115   if (action & JOY_LEFT)
116     west = 1;
117
118   if (action & JOY_RIGHT)
119     east = 1;
120
121   if (action & JOY_UP)
122     north = 1;
123
124   if (action & JOY_DOWN)
125     south = 1;
126
127   if (action & JOY_BUTTON_1)
128     snap = 1;
129
130   if (action & JOY_BUTTON_2)
131     drop = 1;
132
133   /* always update drop action */
134   ply->joy_drop = drop;
135
136   if (ply->joy_stick || (north | east | south | west))  /* (no "| snap"!) */
137   {
138     ply->joy_n = north;
139     ply->joy_e = east;
140     ply->joy_s = south;
141     ply->joy_w = west;
142
143     /* when storing last action, only update snap action with direction */
144     /* (prevents clearing direction if snapping stopped before frame 7) */
145     ply->joy_snap = snap;
146   }
147
148   /* if no direction was stored before, allow setting snap to current state */
149   if (!ply->joy_n &&
150       !ply->joy_e &&
151       !ply->joy_s &&
152       !ply->joy_w)
153     ply->joy_snap = snap;
154
155   /* use bug with snap key (mainly TAS keys) sometimes moving the player */
156   if (game_em.use_snap_key_bug)
157     ply->joy_snap = snap;
158 }
159
160 void SaveEngineSnapshotValues_EM(void)
161 {
162   int i;
163
164   engine_snapshot_em.game_em = game_em;
165   engine_snapshot_em.lev = lev;
166
167   engine_snapshot_em.frame = frame;
168   engine_snapshot_em.screen_x = screen_x;
169   engine_snapshot_em.screen_y = screen_y;
170
171   for (i = 0; i < 4; i++)
172     engine_snapshot_em.ply[i] = ply[i];
173 }
174
175 void LoadEngineSnapshotValues_EM(void)
176 {
177   int i;
178
179   game_em = engine_snapshot_em.game_em;
180   lev = engine_snapshot_em.lev;
181
182   frame = engine_snapshot_em.frame;
183   screen_x = engine_snapshot_em.screen_x;
184   screen_y = engine_snapshot_em.screen_y;
185
186   for (i = 0; i < 4; i++)
187     ply[i] = engine_snapshot_em.ply[i];
188 }