{
Event event;
- if (NextValidEvent(&event))
+ while (NextValidEvent(&event))
{
switch(event.type)
{
else
{
/* when playing, display a special mouse pointer inside the playfield */
- if (game_status == GAME_MODE_PLAYING)
+ if (game_status == GAME_MODE_PLAYING && !tape.pausing)
{
if (!playfield_cursor_set && cursor_inside_playfield &&
DelayReached(&playfield_cursor_delay, 1000))
case GAME_MODE_PLAYING:
#ifdef DEBUG
- if (button == MB_RELEASED)
- {
- if (IN_GFX_SCREEN(mx, my))
- {
- int sx = (mx - SX) / TILEX;
- int sy = (my - SY) / TILEY;
- int x = LEVELX(sx);
- int y = LEVELY(sy);
-
- printf("INFO: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
-
- if (!IN_LEV_FIELD(x, y))
- break;
-
- printf(" Feld[%d][%d] == %d ('%s')\n", x,y, Feld[x][y],
- element_info[Feld[x][y]].token_name);
- printf(" Back[%d][%d] == %d\n", x,y, Back[x][y]);
- printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]);
- printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]);
- printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]);
- printf(" MovPos[%d][%d] == %d\n", x,y, MovPos[x][y]);
- printf(" MovDir[%d][%d] == %d\n", x,y, MovDir[x][y]);
- printf(" MovDelay[%d][%d] == %d\n", x,y, MovDelay[x][y]);
- printf(" ChangeDelay[%d][%d] == %d\n", x,y, ChangeDelay[x][y]);
- printf(" GfxElement[%d][%d] == %d\n", x,y, GfxElement[x][y]);
- printf(" GfxAction[%d][%d] == %d\n", x,y, GfxAction[x][y]);
- printf(" GfxFrame[%d][%d] == %d\n", x,y, GfxFrame[x][y]);
- printf(" RunnerVisit[%d][%d] == %d\n", x,y, RunnerVisit[x][y]);
- printf(" PlayerVisit[%d][%d] == %d\n", x,y, PlayerVisit[x][y]);
- printf("\n");
- }
- }
+ if (button == MB_PRESSED && !motion_status && IN_GFX_SCREEN(mx, my))
+ DumpTile(LEVELX((mx - SX) / TILEX), LEVELY((my - SY) / TILEY));
#endif
break;
}
}
+static boolean is_string_suffix(char *string, char *suffix)
+{
+ int string_len = strlen(string);
+ int suffix_len = strlen(suffix);
+
+ if (suffix_len > string_len)
+ return FALSE;
+
+ return (strcmp(&string[string_len - suffix_len], suffix) == 0);
+}
+
+#define MAX_CHEAT_INPUT_LEN 32
+
+static void HandleKeysSpecial(Key key)
+{
+ static char cheat_input[2 * MAX_CHEAT_INPUT_LEN + 1] = "";
+ char letter = getCharFromKey(key);
+ int cheat_input_len = strlen(cheat_input);
+ int i;
+
+ if (letter == 0)
+ return;
+
+ if (cheat_input_len >= 2 * MAX_CHEAT_INPUT_LEN)
+ {
+ for (i = 0; i < MAX_CHEAT_INPUT_LEN + 1; i++)
+ cheat_input[i] = cheat_input[MAX_CHEAT_INPUT_LEN + i];
+
+ cheat_input_len = MAX_CHEAT_INPUT_LEN;
+ }
+
+ cheat_input[cheat_input_len++] = letter;
+ cheat_input[cheat_input_len] = '\0';
+
+#if 0
+ printf("::: '%s' [%d]\n", cheat_input, cheat_input_len);
+#endif
+
+ if (game_status == GAME_MODE_MAIN)
+ {
+ if (is_string_suffix(cheat_input, ":insert-solution-tape") ||
+ is_string_suffix(cheat_input, ":ist"))
+ {
+ InsertSolutionTape();
+ }
+ else if (is_string_suffix(cheat_input, ":reload-graphics") ||
+ is_string_suffix(cheat_input, ":rg"))
+ {
+ ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS);
+ DrawMainMenu();
+ }
+ else if (is_string_suffix(cheat_input, ":reload-sounds") ||
+ is_string_suffix(cheat_input, ":rs"))
+ {
+ ReloadCustomArtwork(1 << ARTWORK_TYPE_SOUNDS);
+ DrawMainMenu();
+ }
+ else if (is_string_suffix(cheat_input, ":reload-music") ||
+ is_string_suffix(cheat_input, ":rm"))
+ {
+ ReloadCustomArtwork(1 << ARTWORK_TYPE_MUSIC);
+ DrawMainMenu();
+ }
+ else if (is_string_suffix(cheat_input, ":reload-artwork") ||
+ is_string_suffix(cheat_input, ":ra"))
+ {
+ ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS |
+ 1 << ARTWORK_TYPE_SOUNDS |
+ 1 << ARTWORK_TYPE_MUSIC);
+ DrawMainMenu();
+ }
+ else if (is_string_suffix(cheat_input, ":dump-level") ||
+ is_string_suffix(cheat_input, ":dl"))
+ {
+ DumpLevel(&level);
+ }
+ else if (is_string_suffix(cheat_input, ":dump-tape") ||
+ is_string_suffix(cheat_input, ":dt"))
+ {
+ DumpTape(&tape);
+ }
+ }
+ else if (game_status == GAME_MODE_PLAYING)
+ {
+#ifdef DEBUG
+ if (is_string_suffix(cheat_input, ".q"))
+ for (i = 0; i < MAX_INVENTORY_SIZE; i++)
+ if (local_player->inventory_size < MAX_INVENTORY_SIZE)
+ local_player->inventory_element[local_player->inventory_size++] =
+ EL_DYNAMITE;
+#endif
+ }
+ else if (game_status == GAME_MODE_EDITOR)
+ {
+ if (is_string_suffix(cheat_input, ":dump-brush") ||
+ is_string_suffix(cheat_input, ":DB"))
+ {
+ DumpBrush();
+ }
+ }
+}
+
void HandleKey(Key key, int key_status)
{
int joy = 0;
{ &custom_key.up, DEFAULT_KEY_UP, JOY_UP },
{ &custom_key.down, DEFAULT_KEY_DOWN, JOY_DOWN },
{ &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 },
- { &custom_key.bomb, DEFAULT_KEY_BOMB, JOY_BUTTON_2 }
+ { &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 }
};
if (game_status == GAME_MODE_PLAYING)
{
/* only needed for single-step tape recording mode */
static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE };
- static boolean bomb_placed[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE };
+ static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE };
int pnr;
for (pnr = 0; pnr < MAX_PLAYERS; pnr++)
if (key_action & KEY_MOTION)
{
if (stored_player[pnr].action & KEY_BUTTON_2)
- bomb_placed[pnr] = TRUE;
+ element_dropped[pnr] = TRUE;
}
}
else if (key_status == KEY_RELEASED &&
(key_action & KEY_BUTTON_2))
{
- if (!bomb_placed[pnr])
+ if (!element_dropped[pnr])
{
TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
clear_button_2[pnr] = TRUE;
}
- bomb_placed[pnr] = FALSE;
+ element_dropped[pnr] = FALSE;
}
}
else if (tape.recording && tape.pausing && (key_action & KEY_ACTION))
if (key_status == KEY_RELEASED)
return;
- if ((key == KSYM_Return || key == setup.shortcut.toggle_pause) &&
- game_status == GAME_MODE_PLAYING && AllPlayersGone)
+ if (game_status == GAME_MODE_PLAYING && AllPlayersGone &&
+ (key == KSYM_Return || key == setup.shortcut.toggle_pause))
{
CloseDoor(DOOR_CLOSE_1);
game_status = GAME_MODE_MAIN;
DrawMainMenu();
+
+ return;
+ }
+
+ if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause)
+ {
+ if (setup.autorecord)
+ TapeStartRecording();
+
+#if defined(NETWORK_AVALIABLE)
+ if (options.network)
+ SendToServer_StartPlaying();
+ else
+#endif
+ {
+ game_status = GAME_MODE_PLAYING;
+ StopAnimation();
+ InitGame();
+ }
+
return;
}
- /* special key shortcuts */
if (game_status == GAME_MODE_MAIN || game_status == GAME_MODE_PLAYING)
{
if (key == setup.shortcut.save_game)
TapeTogglePause(TAPE_TOGGLE_MANUAL);
}
+ HandleKeysSpecial(key);
+
if (HandleGadgetsKeyInput(key))
{
if (key != KSYM_Escape) /* always allow ESC key to be handled */
case GAME_MODE_INFO:
switch(key)
{
+ case KSYM_space:
case KSYM_Return:
if (game_status == GAME_MODE_MAIN)
HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
HandleInfoScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
break;
-#ifdef DEBUG
- case KSYM_t:
- DumpTape(&tape);
- break;
-#endif
-
default:
break;
}
case GAME_MODE_SCORES:
switch(key)
{
+ case KSYM_space:
case KSYM_Return:
case KSYM_Escape:
game_status = GAME_MODE_MAIN;
}
break;
- case KSYM_s:
+ case KSYM_S:
if (!global.fps_slowdown)
{
global.fps_slowdown = TRUE;
printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize);
break;
- case KSYM_Q:
- case KSYM_q:
- {
- int i;
-
- for (i = 0; i < MAX_INVENTORY_SIZE; i++)
- if (local_player->inventory_size < MAX_INVENTORY_SIZE)
- local_player->inventory_element[local_player->inventory_size++] =
- EL_DYNAMITE;
- }
-
+ case KSYM_v:
+ printf("::: currently using game engine version %d\n",
+ game.engine_version);
break;
-
#if 0
case KSYM_z:
}
break;
}
+
default:
if (key == KSYM_Escape)
{
return;
}
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
if (options.network)
HandleNetworking();
#endif