X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_em%2Flogic.c;h=f4968eed725dda990023b36aef1f7c7820be4293;hb=8a54d8767e822626488cb0504567b565249ca3cf;hp=fc6cbb30ce8af579d45984f7058994eb6d1c739c;hpb=273804cdb8135fa75f8732957de8909d16ea8a73;p=rocksndiamonds.git diff --git a/src/game_em/logic.c b/src/game_em/logic.c index fc6cbb30..f4968eed 100644 --- a/src/game_em/logic.c +++ b/src/game_em/logic.c @@ -20,7 +20,7 @@ static short **cave, **next, **boom; static unsigned int seed; static int score; -static const byte is_blank[TILE_MAX] = +static const byte is_blank[GAME_TILE_MAX] = { [Xblank] = 1, [Xsplash_e] = 1, @@ -35,7 +35,7 @@ static const byte is_blank[TILE_MAX] = [Xfake_acid_8] = 1 }; -static const byte is_blank_or_acid[TILE_MAX] = +static const byte is_blank_or_acid[GAME_TILE_MAX] = { [Xblank] = 1, [Xsplash_e] = 1, @@ -58,7 +58,7 @@ static const byte is_blank_or_acid[TILE_MAX] = [Xacid_8] = 1 }; -static const byte is_fake_acid[TILE_MAX] = +static const byte is_fake_acid[GAME_TILE_MAX] = { [Xfake_acid_1] = 1, [Xfake_acid_2] = 1, @@ -70,7 +70,7 @@ static const byte is_fake_acid[TILE_MAX] = [Xfake_acid_8] = 1 }; -static const byte is_amoeba[TILE_MAX] = +static const byte is_amoeba[GAME_TILE_MAX] = { [Xfake_amoeba] = 1, [Yfake_amoeba] = 1, @@ -84,7 +84,7 @@ static const byte is_amoeba[TILE_MAX] = [Xamoeba_8] = 1 }; -static const byte is_android_walkable[TILE_MAX] = +static const byte is_android_walkable[GAME_TILE_MAX] = { [Xblank] = 1, [Xsplash_e] = 1, @@ -115,7 +115,8 @@ static void Lboom_generic(int x, int y, int element, int element_middle) static void Lboom_bug(int x, int y) { - next[x][y] = Zbug; + if (game_em.use_old_explosions) + next[x][y] = Zbug; Lboom_generic(x, y, Xemerald, Xdiamond); @@ -126,7 +127,8 @@ static void Lboom_bug(int x, int y) static void Lboom_tank(int x, int y) { - next[x][y] = Ztank; + if (game_em.use_old_explosions) + next[x][y] = Ztank; Lboom_generic(x, y, Xblank, Xblank); @@ -137,7 +139,8 @@ static void Lboom_tank(int x, int y) static void Lboom_eater(int x, int y) { - next[x][y] = Zeater; + if (game_em.use_old_explosions) + next[x][y] = Zeater; boom[x-1][y-1] = lev.eater_array[lev.eater_pos][0]; boom[x][y-1] = lev.eater_array[lev.eater_pos][1]; @@ -156,6 +159,63 @@ static void Lboom_eater(int x, int y) #endif } +static void Lboom_bug_old(int x, int y) +{ + if (!game_em.use_old_explosions) + return; + + Lboom_bug(x, y); +} + +static void Lboom_tank_old(int x, int y) +{ + if (!game_em.use_old_explosions) + return; + + Lboom_tank(x, y); +} + +static void Lboom_eater_old(int x, int y) +{ + if (!game_em.use_old_explosions) + return; + + Lboom_eater(x, y); +} + +static void Lboom_bug_new(int x, int y, boolean chain_explosion) +{ + if (game_em.use_old_explosions) + return; + + if (chain_explosion) + cave[x][y] = Xchain; + + Lboom_bug(x, y); +} + +static void Lboom_tank_new(int x, int y, boolean chain_explosion) +{ + if (game_em.use_old_explosions) + return; + + if (chain_explosion) + cave[x][y] = Xchain; + + Lboom_tank(x, y); +} + +static void Lboom_eater_new(int x, int y, boolean chain_explosion) +{ + if (game_em.use_old_explosions) + return; + + if (chain_explosion) + cave[x][y] = Xchain; + + Lboom_eater(x, y); +} + static boolean player_killed(struct PLAYER *ply) { int x = ply->x; @@ -280,7 +340,7 @@ static void kill_player(struct PLAYER *ply) int x = ply->x; int y = ply->y; - ply->alive = 0; + ply->alive = FALSE; switch (cave[x][y-1]) { @@ -293,6 +353,7 @@ static void kill_player(struct PLAYER *ply) case Xbug_2_s: case Xbug_2_w: cave[x][y-1] = Xboom_bug; + Lboom_bug_new(x, y-1, TRUE); break; case Xtank_1_n: @@ -304,6 +365,7 @@ static void kill_player(struct PLAYER *ply) case Xtank_2_s: case Xtank_2_w: cave[x][y-1] = Xboom_tank; + Lboom_tank_new(x, y-1, TRUE); break; } @@ -318,6 +380,7 @@ static void kill_player(struct PLAYER *ply) case Xbug_2_s: case Xbug_2_w: cave[x+1][y] = Xboom_bug; + Lboom_bug_new(x+1, y, TRUE); break; case Xtank_1_n: @@ -329,6 +392,7 @@ static void kill_player(struct PLAYER *ply) case Xtank_2_s: case Xtank_2_w: cave[x+1][y] = Xboom_tank; + Lboom_tank_new(x+1, y, TRUE); break; } @@ -343,6 +407,7 @@ static void kill_player(struct PLAYER *ply) case Xbug_2_s: case Xbug_2_w: cave[x][y+1] = Xboom_bug; + Lboom_bug_new(x, y+1, TRUE); break; case Xtank_1_n: @@ -354,6 +419,7 @@ static void kill_player(struct PLAYER *ply) case Xtank_2_s: case Xtank_2_w: cave[x][y+1] = Xboom_tank; + Lboom_tank_new(x, y+1, TRUE); break; } @@ -368,6 +434,7 @@ static void kill_player(struct PLAYER *ply) case Xbug_2_s: case Xbug_2_w: cave[x-1][y] = Xboom_bug; + Lboom_bug_new(x-1, y, TRUE); break; case Xtank_1_n: @@ -379,6 +446,7 @@ static void kill_player(struct PLAYER *ply) case Xtank_2_s: case Xtank_2_w: cave[x-1][y] = Xboom_tank; + Lboom_tank_new(x-1, y, TRUE); break; } @@ -1322,7 +1390,6 @@ static void check_player(struct PLAYER *ply) ply->joy_stick = 1; ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0; ply->dynamite_cnt = 0; /* reset dynamite timer if we move */ - ply->joy_spin = !ply->joy_spin; if (ply->joy_snap == 0) /* player wants to move */ { @@ -2802,6 +2869,7 @@ static void Lbug_1_n(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -2849,6 +2917,7 @@ static void Lbug_2_n(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -2914,6 +2983,7 @@ static void Lbug_1_e(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -2961,6 +3031,7 @@ static void Lbug_2_e(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -3026,6 +3097,7 @@ static void Lbug_1_s(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -3073,6 +3145,7 @@ static void Lbug_2_s(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -3138,6 +3211,7 @@ static void Lbug_1_w(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -3185,6 +3259,7 @@ static void Lbug_2_w(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_bug(x, y); return; @@ -3250,6 +3325,7 @@ static void Ltank_1_n(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3297,6 +3373,7 @@ static void Ltank_2_n(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3362,6 +3439,7 @@ static void Ltank_1_e(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3409,6 +3487,7 @@ static void Ltank_2_e(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3474,6 +3553,7 @@ static void Ltank_1_s(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3521,6 +3601,7 @@ static void Ltank_2_s(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3586,6 +3667,7 @@ static void Ltank_1_w(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -3633,6 +3715,7 @@ static void Ltank_2_w(int x, int y) is_amoeba[cave[x][y+1]] || is_amoeba[cave[x-1][y]]) { + next[x][y] = Zboom; Lboom_tank(x, y); return; @@ -4393,16 +4476,20 @@ static void Lstone_fall(int x, int y) case Xeater_s: case Xeater_w: cave[x][y] = Ystone_sB; + next[x][y] = Xblank; cave[x][y+1] = Yeater_stone; - Lboom_eater(x, y+1); + next[x][y+1] = Zeater; + Lboom_eater_old(x, y+1); score += lev.eater_score; return; case Xalien: case Xalien_pause: cave[x][y] = Ystone_sB; + next[x][y] = Xblank; cave[x][y+1] = Yalien_stone; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); score += lev.alien_score; return; @@ -4415,8 +4502,10 @@ static void Lstone_fall(int x, int y) case Xbug_2_s: case Xbug_2_w: cave[x][y] = Ystone_sB; + next[x][y] = Xblank; cave[x][y+1] = Ybug_stone; - Lboom_bug(x, y+1); + next[x][y+1] = Zbug; + Lboom_bug_old(x, y+1); score += lev.bug_score; return; @@ -4429,8 +4518,10 @@ static void Lstone_fall(int x, int y) case Xtank_2_s: case Xtank_2_w: cave[x][y] = Ystone_sB; + next[x][y] = Xblank; cave[x][y+1] = Ytank_stone; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); score += lev.tank_score; return; @@ -4506,8 +4597,11 @@ static void Lstone_fall(int x, int y) case Xbomb: case Xbomb_pause: + cave[x][y] = Xstone; + next[x][y] = Xstone; cave[x][y+1] = Ybomb_blank; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); return; case Xnut: @@ -4815,7 +4909,8 @@ static void Lbomb_fall(int x, int y) default: cave[x][y] = Ybomb_blank; - Lboom_tank(x, y); + next[x][y] = Ztank; + Lboom_tank_old(x, y); return; } } @@ -5509,16 +5604,20 @@ static void Lspring_fall(int x, int y) case Xeater_s: case Xeater_w: cave[x][y] = Yspring_sB; + next[x][y] = Xblank; cave[x][y+1] = Yeater_spring; - Lboom_eater(x, y+1); + next[x][y+1] = Zeater; + Lboom_eater_old(x, y+1); score += lev.eater_score; return; case Xalien: case Xalien_pause: cave[x][y] = Yspring_sB; + next[x][y] = Xblank; cave[x][y+1] = Yalien_spring; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); score += lev.alien_score; return; @@ -5531,8 +5630,10 @@ static void Lspring_fall(int x, int y) case Xbug_2_s: case Xbug_2_w: cave[x][y] = Yspring_sB; + next[x][y] = Xblank; cave[x][y+1] = Ybug_spring; - Lboom_bug(x, y+1); + next[x][y+1] = Zbug; + Lboom_bug_old(x, y+1); score += lev.bug_score; return; @@ -5545,15 +5646,20 @@ static void Lspring_fall(int x, int y) case Xtank_2_s: case Xtank_2_w: cave[x][y] = Yspring_sB; + next[x][y] = Xblank; cave[x][y+1] = Ytank_spring; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); score += lev.tank_score; return; case Xbomb: case Xbomb_pause: + cave[x][y] = Xspring; + next[x][y] = Xspring; cave[x][y+1] = Ybomb_blank; - Lboom_tank(x, y+1); + next[x][y+1] = Ztank; + Lboom_tank_old(x, y+1); return; default: @@ -5576,6 +5682,8 @@ static void Lpush_emerald_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5616,6 +5724,8 @@ static void Lpush_emerald_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5656,6 +5766,8 @@ static void Lpush_diamond_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5696,6 +5808,8 @@ static void Lpush_diamond_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5736,6 +5850,8 @@ static void Lpush_stone_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5776,6 +5892,8 @@ static void Lpush_stone_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5816,6 +5934,8 @@ static void Lpush_bomb_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5856,6 +5976,8 @@ static void Lpush_bomb_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5896,6 +6018,8 @@ static void Lpush_nut_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5936,6 +6060,8 @@ static void Lpush_nut_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -5976,6 +6102,8 @@ static void Lpush_spring_e(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -6016,6 +6144,8 @@ static void Lpush_spring_w(int x, int y) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -6815,6 +6945,8 @@ static void Lboom_one(int x, int y, boolean by_dynamite) case Ztank: case Zeater: case Zdynamite: + case Zboom: + case Xchain: case Xboom_bug: case Xboom_tank: case Xboom_android: @@ -6877,12 +7009,14 @@ static void Lboom_one(int x, int y, boolean by_dynamite) case Xbug_2_s: case Xbug_2_w: cave[x][y] = Xboom_bug; + Lboom_bug_new(x, y, TRUE); return; case Xbomb: case Xbomb_pause: case Xbomb_fall: cave[x][y] = Xboom_tank; + Lboom_tank_new(x, y, TRUE); return; default: @@ -6910,20 +7044,27 @@ static void Lexplode(int x, int y) switch (cave[x][y]) { case Zbug: + Lboom_bug_new(x, y, FALSE); Lboom_nine(x, y, FALSE); break; case Ztank: + Lboom_tank_new(x, y, FALSE); Lboom_nine(x, y, FALSE); break; case Zeater: + Lboom_eater_new(x, y, FALSE); Lboom_nine(x, y, FALSE); break; case Zdynamite: Lboom_nine(x, y, TRUE); break; + + case Zboom: + Lboom_nine(x, y, FALSE); + break; } } @@ -6952,6 +7093,11 @@ static void Lboom_android(int x, int y) Lboom_1(x, y); } +static void Lchain(int x, int y) +{ + next[x][y] = Zboom; +} + static void handle_tile(int x, int y) { switch (cave[x][y]) @@ -7111,6 +7257,7 @@ static void handle_tile(int x, int y) case Xpause: Lpause(x, y); break; + case Xchain: Lchain(x, y); break; case Xboom_bug: Lboom_bug(x, y); break; case Xboom_tank: Lboom_tank(x, y); break; case Xboom_android: Lboom_android(x, y); break; @@ -7119,7 +7266,7 @@ static void handle_tile(int x, int y) } } -void logic_players(void) +static void logic_players(void) { int start_check_nr; int i; @@ -7142,6 +7289,9 @@ void logic_players(void) for (i = 0; i < MAX_PLAYERS; i++) { + if (!ply[i].alive) + continue; + /* check for wrap-around movement */ if (ply[i].x < lev.left || ply[i].x > lev.right - 1) @@ -7150,11 +7300,11 @@ void logic_players(void) game.centered_player_nr_next = i; game.set_centered_player = TRUE; - game.set_centered_player_fast = TRUE; + game.set_centered_player_wrap = TRUE; } - ply[i].oldx = ply[i].x; - ply[i].oldy = ply[i].y; + ply[i].prev_x = ply[i].x; + ply[i].prev_y = ply[i].y; ply[i].anim = PLY_still; } @@ -7174,10 +7324,10 @@ void logic_players(void) if (!ply[i].alive) continue; - if (cave[ply[i].oldx][ply[i].oldy] == Zplayer) + if (cave[ply[i].prev_x][ply[i].prev_y] == Zplayer) { - cave[ply[i].oldx][ply[i].oldy] = Xblank; - next[ply[i].oldx][ply[i].oldy] = Xblank; + cave[ply[i].prev_x][ply[i].prev_y] = Xblank; + next[ply[i].prev_x][ply[i].prev_y] = Xblank; } if (cave[ply[i].x][ply[i].y] == Xblank) @@ -7188,7 +7338,7 @@ void logic_players(void) } } -void logic_objects(void) +static void logic_objects(void) { int x, y; @@ -7217,7 +7367,7 @@ void logic_objects(void) lev.draw = temp; } -void logic_globals(void) +static void logic_globals(void) { int x; int y; @@ -7284,3 +7434,17 @@ void logic_globals(void) for (x = lev.left; x < lev.right; x++) next[x][y] = cave[x][y]; } + +void logic(void) +{ + if (frame == 0) + { + logic_players(); + logic_objects(); + } + + if (frame == 1) + { + logic_globals(); + } +}