From ee1d57d74c4e4037fafb677953f8363489a263d0 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 1 Apr 2024 23:56:50 +0200 Subject: [PATCH] added support for rocket launcher in BD engine --- docs/elements/bd_rocket.txt | 1 + docs/elements/bd_rocket_launcher.txt | 3 + graphics/gfx_classic/boulder_rush.png | Bin 11568 -> 11838 bytes src/conf_gfx.c | 38 +++++ src/editor.c | 21 +++ src/files.c | 10 ++ src/game_bd/bd_cave.c | 7 +- src/game_bd/bd_cave.h | 5 +- src/game_bd/bd_cavedb.c | 12 ++ src/game_bd/bd_caveengine.c | 145 ++++++++++++++++++ src/game_bd/bd_elements.h | 7 + src/main.c | 35 +++++ src/main.h | 208 +++++++++++++------------- src/tools.c | 24 +++ 14 files changed, 413 insertions(+), 103 deletions(-) create mode 100644 docs/elements/bd_rocket.txt create mode 100644 docs/elements/bd_rocket_launcher.txt diff --git a/docs/elements/bd_rocket.txt b/docs/elements/bd_rocket.txt new file mode 100644 index 00000000..d2bcca2b --- /dev/null +++ b/docs/elements/bd_rocket.txt @@ -0,0 +1 @@ +A rocket that can be fired using the rocket launcher. diff --git a/docs/elements/bd_rocket_launcher.txt b/docs/elements/bd_rocket_launcher.txt new file mode 100644 index 00000000..92c48223 --- /dev/null +++ b/docs/elements/bd_rocket_launcher.txt @@ -0,0 +1,3 @@ +If you find a rocket launcher, you can pick it up, and fire rockets. +To use it, press fire and a direction key. Be careful not to make an +explosion which is too close to the player. diff --git a/graphics/gfx_classic/boulder_rush.png b/graphics/gfx_classic/boulder_rush.png index d01e4ba20f74b8ba9ae0ae6321b8a7798ef10ea7..618f146298655c2efc7519b08422a30d1f022392 100644 GIT binary patch delta 11112 zcmYki1yoc~7dAWvL+K115<`ciK}ie^3X&oS(h4H2ble#vL^?$p=>`R97)nY66a( zv9)9U6r=Omc!Kl$KzvDNblr8>v_Rz&FQ0RXX2*j!FS|;AJ6FKF*)MEs7~doBQIc1F zG!pR9Iz)9e04E1i{;S_U`0r%idu2cC@5lYa`>)jPxqHX62l9$Ltw3JUXcUsccbrkK z&1j%4u(l^JjP$qUo$@=XZ=>5rg3>uJEhsh?dehEY{VfCWpR?5{&W{A~)y@ujo7*r3 z5oJh&6nV}QnleAVYjh)&#dHsUAm;K@l@8_R8@`&LV>x2=+?Q?dR1~%wmE)ln zY_5aN(bGeHW1asO-l~Nzu+YAqZQp6v_V=HQ9r*yR~?JH$vTIm{uGv@1grnnd2w>e;@q*JO9=G1! zI3FuE*%o-79iv{w_{m0n{%p(jx=h>|6NK^PNXp`tW3xqHm?t7c$&F^u`+dk&sOP&Q zNE{ck{B2J6dA@DlUXhv$AmEELo=eK@r=kEX^&xKkXw)i6Sh{B5;A}N)(^zSyW`^=F zlS4+%nRctk$%_=TO-A>cIO-V;^aBo8K9`(%L!~A+RGdAG73*pwi@y1+2-L1d~vl zZrRE@7>I{ZPQ*luyk|Hwp?Ol*;!5QKk~mvBc$wWIO@$TbnSx#ga|u`@DjZ_6O#-DU z)|s9)?n22xIZ(K9W)2UDEc`1@Ls}Js#|KDkZjY0rX%>Z%7Gh{FQ8EVR7Ym8HM|cs-Hh-7uRgqLqcOQ!~j%CaS zn70z&_Nm9jEGh}u+l6O&_m!L4{3{yRa2eAi)x{LAcuq3#7#~z5-~fLz(nAtiTzrQ;Y_i`We}Pgg>Mqh z2tDJyre(9xxt3+t4ZHfpPc8VX50@{Z+1PHZWwX+b?gDTOhMj5#N;$eOrPR(Naq~X< zvav%s=ltZ?)7hV9Elb-!J^p&h*@f z|LcjSte^3_@VB^w;Y3CO4m1y#87sw`MeozOid|-9+G&|KTg*HUn>L@75#GB=!Siow z_~UkM0U&Orjsox91NB=isJW)7` zBrDV>UssNg{AQ0Zpy!aCM>HRM;zF?7njo%u+C8W~DR$vadh5{KUdp$rji=+Myh}G| zcraba7#~p-Hk62>%jNh)%Ou^P$pXCB2D^>|O81p1p!{eoYK<1G2xSzF;+@ZcHz5?f z-d8Qv*v@P=Qzx8gNu!WFXgTnjoYh0sB+Lo4ROVlfh7rx88+VQ z81}7%@irErBBt44`YZ+#hy6J-Q#29YLkEj$-T)6kGSSt1{l1t7PaxF#a|r48wm^G| zcBj>&pzl^lUZgI+l1t+Xe!|+Hc)D38;JMuEg8H$Zk7d+w?4~Tv%QJJ~q%zAI&n1Df z&2V#lv|9b5L7n^h{*4@kLqjr4?u8+xkP`hVh#Y+#bgd5@XdbTaokcP39XXV> zj$Ax($I06iwao6t_?pRQn+^Y{F!NSuE%2WBx3mnUcYlbbK@4;Al7;L5Z&0UxHDwQ( zXWnRpPJjw*HR|8~R4(7z+1_@Voa6jeVK#AFc*}Bj>d)4;t8~-WennSdSO4=Fs1TFi z*@Bm#Y6s;Mf&+L{hJd@~D| z-(5G9kIqys$~ng*Vsfq`dk4uJs!r8X+p`t2!&2{RA+$q3E8F0daLIC`-Zh*>ViUb=zbM{yJXnsAVYq zo?Rt*d+|T3-PPvqho--0$VoX^Q`+Jta$haePbxi=%0AcRWfP>xPYU!)5&AL{bp5r0 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 F_&*CapDF+V diff --git a/src/conf_gfx.c b/src/conf_gfx.c index c99b7716..127d38a4 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -168,6 +168,12 @@ struct ConfigInfo image_config[] = { "bd_player_with_bomb.frames", "1" }, { "bd_player_with_bomb.scale_up_factor", "2" }, + { "bd_player_with_rocket_launcher", "boulder_rush.png" }, + { "bd_player_with_rocket_launcher.xpos", "1" }, + { "bd_player_with_rocket_launcher.ypos", "46" }, + { "bd_player_with_rocket_launcher.frames", "1" }, + { "bd_player_with_rocket_launcher.scale_up_factor", "2" }, + { "bd_player_stirring", "boulder_rush.png" }, { "bd_player_stirring.xpos", "3" }, { "bd_player_stirring.ypos", "4" }, @@ -1222,6 +1228,38 @@ struct ConfigInfo image_config[] = { "bd_bomb.frames", "1" }, { "bd_bomb.scale_up_factor", "2" }, + { "bd_rocket_launcher", "boulder_rush.png" }, + { "bd_rocket_launcher.xpos", "0" }, + { "bd_rocket_launcher.ypos", "46" }, + { "bd_rocket_launcher.frames", "1" }, + { "bd_rocket_launcher.scale_up_factor", "2" }, + + { "bd_rocket", "boulder_rush.png" }, + { "bd_rocket.xpos", "5" }, + { "bd_rocket.ypos", "45" }, + { "bd_rocket.frames", "1" }, + { "bd_rocket.scale_up_factor", "2" }, + { "bd_rocket.right", "boulder_rush.png" }, + { "bd_rocket.right.xpos", "4" }, + { "bd_rocket.right.ypos", "45" }, + { "bd_rocket.right.frames", "1" }, + { "bd_rocket.right.scale_up_factor", "2" }, + { "bd_rocket.up", "boulder_rush.png" }, + { "bd_rocket.up.xpos", "5" }, + { "bd_rocket.up.ypos", "45" }, + { "bd_rocket.up.frames", "1" }, + { "bd_rocket.up.scale_up_factor", "2" }, + { "bd_rocket.left", "boulder_rush.png" }, + { "bd_rocket.left.xpos", "6" }, + { "bd_rocket.left.ypos", "45" }, + { "bd_rocket.left.frames", "1" }, + { "bd_rocket.left.scale_up_factor", "2" }, + { "bd_rocket.down", "boulder_rush.png" }, + { "bd_rocket.down.xpos", "7" }, + { "bd_rocket.down.ypos", "45" }, + { "bd_rocket.down.frames", "1" }, + { "bd_rocket.down.scale_up_factor", "2" }, + { "bd_nitro_pack", "RocksBD.png" }, { "bd_nitro_pack.xpos", "3" }, { "bd_nitro_pack.ypos", "4" }, diff --git a/src/editor.c b/src/editor.c index 40b1f51f..a4762db7 100644 --- a/src/editor.c +++ b/src/editor.c @@ -765,6 +765,7 @@ enum GADGET_ID_BD_CONVEYOR_BELTS_CHANGED, GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN, GADGET_ID_BD_HAMMER_WALLS_REAPPEAR, + GADGET_ID_BD_INFINITE_ROCKETS, GADGET_ID_BD_CREATURES_START_BACKWARDS, GADGET_ID_BD_CREATURES_TURN_ON_HATCHING, GADGET_ID_BD_GRAVITY_SWITCH_ACTIVE, @@ -1120,6 +1121,7 @@ enum ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED, ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN, ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR, + ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS, ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS, ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING, ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE, @@ -3949,6 +3951,14 @@ static struct NULL, NULL, "Hammered walls reappear", "Hammered walls reappear after delay" }, + { + ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS, + ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), + GADGET_ID_BD_INFINITE_ROCKETS, GADGET_ID_NONE, + &level.bd_infinite_rockets, + NULL, NULL, + "Infinite rockets", "Rocket launcher has infinite rockets" + }, { ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS, ED_ELEMENT_SETTINGS_XPOS(0), ED_ELEMENT_SETTINGS_YPOS(0), @@ -5281,8 +5291,13 @@ static int editor_el_boulderdash_native[] = EL_BD_PLAYER, EL_BD_PLAYER_WITH_BOMB, + EL_BD_PLAYER_WITH_ROCKET_LAUNCHER, + EL_BD_ROCKET_LAUNCHER, + EL_BD_PLAYER_GLUED, EL_BD_PLAYER_STIRRING, + EL_EMPTY, + EL_EMPTY, }; static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native; static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native; @@ -11734,6 +11749,7 @@ static boolean checkPropertiesConfig(int element) element == EL_BD_ROCK || element == EL_BD_MEGA_ROCK || element == EL_BD_BOMB || + element == EL_BD_ROCKET_LAUNCHER || element == EL_BD_NITRO_PACK || element == EL_BD_SWEET || element == EL_BD_VOODOO_DOLL || @@ -12216,6 +12232,11 @@ static void DrawPropertiesConfig(void) MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR); } + if (properties_element == EL_BD_ROCKET_LAUNCHER) + { + MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS); + } + if (properties_element == EL_BD_CREATURE_SWITCH) { MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS); diff --git a/src/files.c b/src/files.c index a0c0564c..157564d8 100644 --- a/src/files.c +++ b/src/files.c @@ -950,6 +950,12 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = &li.bd_hammer_walls_reappear_delay, 100 }, + { + EL_BD_ROCKET_LAUNCHER, -1, + TYPE_BOOLEAN, CONF_VALUE_8_BIT(1), + &li.bd_infinite_rockets, FALSE + }, + { EL_BD_SKELETON, -1, TYPE_INTEGER, CONF_VALUE_8_BIT(1), @@ -4326,6 +4332,8 @@ static void CopyNativeLevel_RND_to_BD(struct LevelInfo *level) cave->hammered_walls_reappear = level->bd_hammer_walls_reappear; cave->hammered_wall_reappear_frame = level->bd_hammer_walls_reappear_delay; + cave->infinite_rockets = level->bd_infinite_rockets; + cave->skeletons_needed_for_pot = level->bd_num_skeletons_needed_for_pot; cave->skeletons_worth_diamonds = level->bd_skeleton_worth_num_diamonds; @@ -4487,6 +4495,8 @@ static void CopyNativeLevel_BD_to_RND(struct LevelInfo *level) level->bd_hammer_walls_reappear = cave->hammered_walls_reappear; level->bd_hammer_walls_reappear_delay = cave->hammered_wall_reappear_frame; + level->bd_infinite_rockets = cave->infinite_rockets; + level->bd_num_skeletons_needed_for_pot= cave->skeletons_needed_for_pot; level->bd_skeleton_worth_num_diamonds = cave->skeletons_worth_diamonds; diff --git a/src/game_bd/bd_cave.c b/src/game_bd/bd_cave.c index ea56d6da..88fa9329 100644 --- a/src/game_bd/bd_cave.c +++ b/src/game_bd/bd_cave.c @@ -1314,12 +1314,15 @@ void gd_drawcave_game(const GdCave *cave, int **element_buffer, int **gfx_buffer elemdrawing[O_PLAYER] = draw; elemdrawing[O_PLAYER_GLUED] = draw; - // player with bomb does not blink or tap - no graphics drawn for that. - // running is drawn using w/o bomb cells */ + // player with bomb/rocketlauncher does not blink or tap - no graphics drawn for that. + // running is drawn using w/o bomb/rocketlauncher cells */ if (cave->last_direction != GD_MV_STILL) { elemmapping[O_PLAYER_BOMB] = map; elemdrawing[O_PLAYER_BOMB] = draw; + + elemmapping[O_PLAYER_ROCKET_LAUNCHER] = map; + elemdrawing[O_PLAYER_ROCKET_LAUNCHER] = draw; } elemmapping[O_INBOX] = (cave->inbox_flash_toggle ? O_INBOX_OPEN : O_INBOX_CLOSED); diff --git a/src/game_bd/bd_cave.h b/src/game_bd/bd_cave.h index 67eed046..b1ec47f3 100644 --- a/src/game_bd/bd_cave.h +++ b/src/game_bd/bd_cave.h @@ -82,7 +82,7 @@ void gd_struct_set_defaults_from_array(void *str, const GdStructDescriptor *prop // these define the number of the cells in the png file #define GD_NUM_OF_CELLS_X 8 -#define GD_NUM_OF_CELLS_Y 46 +#define GD_NUM_OF_CELLS_Y 47 // +80: placeholder for cells which are rendered by the game; // for example diamond + arrow = falling diamond @@ -530,6 +530,9 @@ typedef struct _gd_cave int hammered_wall_reappear_frame; boolean pneumatic_hammer_sound; + boolean infinite_rockets; // if true, the player which got a rocket launcher will be + // able to launch an infinite number of rockets + // internal variables, used during the game. private data :) // returns range corrected x/y position (points to perfect or line shifting get function) diff --git a/src/game_bd/bd_cavedb.c b/src/game_bd/bd_cavedb.c index 0952e68b..34084767 100644 --- a/src/game_bd/bd_cavedb.c +++ b/src/game_bd/bd_cavedb.c @@ -287,9 +287,16 @@ GdElements gd_elements[] = { O_PRE_PL_3, N_("Player birth (3)"), 0, "GUYBIRTH3", 0, 34, 34, 34 }, { O_PLAYER, N_("Player"), P_BLOWS_UP_FLIES | P_EXPLODES_BY_HIT | P_PLAYER, "GUY", 0, i_player, i_player, 35, 32 }, // has ckdelay { O_PLAYER_BOMB, N_("Player with bomb"), P_BLOWS_UP_FLIES | P_EXPLODES_BY_HIT | P_PLAYER, "GUYBOMB", 0, 42, 42, 42, 25 }, // has ckdelay + { O_PLAYER_ROCKET_LAUNCHER, N_("Player with rocket launcher"), P_BLOWS_UP_FLIES | P_EXPLODES_BY_HIT | P_PLAYER, "GUYROCKETLAUNCER", 0, 369, 369, 369, 25 }, // has ckdelay { O_PLAYER_GLUED, N_("Glued player"), P_BLOWS_UP_FLIES | P_EXPLODES_BY_HIT, "GUYGLUED", 0, i_player_glued, i_player_glued, 35 }, // is not a real player! so active x, y will not find it. no P_PLAYER bit! { O_PLAYER_STIRRING, N_("Player stirring"), P_BLOWS_UP_FLIES | P_EXPLODES_BY_HIT | P_PLAYER, "GUYSTIRRING", 0, 256, -256, -256 }, + { O_ROCKET_LAUNCHER, N_("Rocket launcher"), 0, "ROCKET_LAUNCHER", 0, 368, 368, 368 }, + { O_ROCKET_1, N_("Rocket (right)"), 0, "ROCKETr", 0, 364, 364, 364, 40 }, // has ckdelay + { O_ROCKET_2, N_("Rocket (up)"), 0, "ROCKETu", 0, 365, 365, 365, 40 }, // has ckdelay + { O_ROCKET_3, N_("Rocket (left)"), 0, "ROCKETl", 0, 366, 366, 366, 40 }, // has ckdelay + { O_ROCKET_4, N_("Rocket (down)"), 0, "ROCKETd", 0, 367, 367, 367, 40 }, // has ckdelay + { O_BOMB, N_("Bomb"), P_COLLECTIBLE, "BOMB", 0, 48, 48, 48 }, { O_BOMB_TICK_1, N_("Ticking bomb (1)"), P_EXPLOSION_FIRST_STAGE, "IGNITEDBOMB1", 0, 49, 49, 49 }, { O_BOMB_TICK_2, N_("Ticking bomb (2)"), 0, "IGNITEDBOMB2", 0, 50, 50, 50 }, @@ -489,6 +496,11 @@ const GdStructDescriptor gd_cave_properties[] = {"", GD_LABEL, 0, N_("Sweet")}, {"PushingBoulderProb", GD_TYPE_PROBABILITY, 0, N_("Probability of pushing (%)"), CAVE_OFFSET(pushing_stone_prob_sweet), 1, N_("Chance of player managing to push a stone, every game cycle he tries. This is used after eating sweet.")}, {"PushingMegaStonesAfterSweet", GD_TYPE_BOOLEAN, 0, N_("Mega stones pushable"), CAVE_OFFSET(mega_stones_pushable_with_sweet), 1, N_("If it is true, mega stones can be pushed after eating sweet.")}, + + // rocket launcher + {"", GD_LABEL, 0, N_("Rocket launcher")}, + {"RocketLauncher.infinite", GD_TYPE_BOOLEAN, 0, N_("Infinite rockets"), CAVE_OFFSET(infinite_rockets), 1, N_("If it is true, the player is able to launch an infinite number of rockets. Otherwise every rocket launcher contains only a single rocket.")}, + // pneumatic hammer {"", GD_LABEL, 0, N_("Pneumatic hammer")}, {"PneumaticHammer.frames", GD_TYPE_INT, 0, N_("Time for hammer (frames)"), CAVE_OFFSET(pneumatic_hammer_frame), 1, N_("This is the number of game frames, a pneumatic hammer is required to break a wall."), 1, 100}, diff --git a/src/game_bd/bd_caveengine.c b/src/game_bd/bd_caveengine.c index 03722b80..e95236ce 100644 --- a/src/game_bd/bd_caveengine.c +++ b/src/game_bd/bd_caveengine.c @@ -748,6 +748,13 @@ static void explode(GdCave *cave, int x, int y) creature_explode(cave, x, y, O_EXPLODE_1); break; + case O_ROCKET_1: + case O_ROCKET_2: + case O_ROCKET_3: + case O_ROCKET_4: + creature_explode(cave, x, y, O_EXPLODE_1); + break; + case O_BUTTER_1: case O_BUTTER_2: case O_BUTTER_3: @@ -780,6 +787,7 @@ static void explode(GdCave *cave, int x, int y) case O_PLAYER_BOMB: case O_PLAYER_GLUED: case O_PLAYER_STIRRING: + case O_PLAYER_ROCKET_LAUNCHER: case O_PLAYER_PNEUMATIC_LEFT: case O_PLAYER_PNEUMATIC_RIGHT: creature_explode(cave, x, y, O_EXPLODE_1); @@ -1747,6 +1755,19 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire, move(cave, x, y, player_move, O_PLAYER_BOMB); break; + case O_ROCKET_LAUNCHER: + // if its a rocket launcher, remember he now has one. + // we do not change the "remains" and "what" variables, + // so that part of the code will be ineffective + gd_sound_play(cave, GD_S_BOMB_COLLECTING, what, x, y); + store_dir(cave, x, y, player_move, O_SPACE); + + if (player_fire) + store(cave, x, y, O_PLAYER_ROCKET_LAUNCHER); + else + move(cave, x, y, player_move, O_PLAYER_ROCKET_LAUNCHER); + break; + case O_POT: // we do not change the "remains" and "what" variables, // so that part of the code will be ineffective @@ -1888,6 +1909,98 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire, } break; + case O_PLAYER_ROCKET_LAUNCHER: + // much simpler; cannot snap-push stones + if (cave->kill_player) + { + explode(cave, x, y); + break; + } + + cave->player_seen_ago = 0; + // bd4 intermission caves have many players. so if one of them has exited, + // do not change the flag anymore. so this if () is needed + if (cave->player_state != GD_PL_EXITED) + cave->player_state = GD_PL_LIVING; + + // firing a rocket? + if (player_move != GD_MV_STILL) + { + // if the player does not move, nothing to do + GdElement what = get_dir(cave, x, y, player_move); + GdElement remains = what; + + // to fire a rocket, diagonal movement should not be allowed. + // so either x or y must be zero + if (player_fire) + { + // placing a rocket into empty space + if (is_space_dir(cave, x, y, player_move)) + { + switch (player_move) + { + case GD_MV_RIGHT: + store_dir(cave, x, y, player_move, O_ROCKET_1); + if (!cave->infinite_rockets) + store(cave, x, y, O_PLAYER); + break; + + case GD_MV_UP: + store_dir(cave, x, y, player_move, O_ROCKET_2); + if (!cave->infinite_rockets) + store(cave, x, y, O_PLAYER); + break; + + case GD_MV_LEFT: + store_dir(cave, x, y, player_move, O_ROCKET_3); + if (!cave->infinite_rockets) + store(cave, x, y, O_PLAYER); + break; + + case GD_MV_DOWN: + store_dir(cave, x, y, player_move, O_ROCKET_4); + if (!cave->infinite_rockets) + store(cave, x, y, O_PLAYER); + break; + + default: + // cannot fire in other directions + break; + } + + gd_sound_play(cave, GD_S_BOMB_PLACING, O_BOMB, x, y); + } + + // a player with rocket launcher cannot snap elements, so stop here + break; + } + + // pushing and collecting + // if we are 'eating' a teleporter, and the function returns true + // (teleporting worked), break here + if (what == O_TELEPORTER && do_teleporter(cave, x, y, player_move)) + break; + + // player fire is false... + if (do_push(cave, x, y, player_move, FALSE)) + { + remains = O_SPACE; + } + else + { + // get element. if cannot get, player_get_element will return the same + remains = player_get_element(cave, what, x, y); + } + + // if something changed, OR there is space, move. + if (remains != what || remains == O_SPACE) + { + // if anything changed, apply the change. + move(cave, x, y, player_move, O_PLAYER_ROCKET_LAUNCHER); + } + } + break; + case O_PLAYER_STIRRING: if (cave->kill_player) { @@ -3169,6 +3282,38 @@ void gd_cave_iterate(GdCave *cave, GdDirection player_move, boolean player_fire, } break; + // ============================================================================ + // R O C K E T S + // ============================================================================ + + case O_ROCKET_1: + if (is_space_dir(cave, x, y, GD_MV_RIGHT)) + move(cave, x, y, GD_MV_RIGHT, O_ROCKET_1); + else + explode(cave, x, y); + break; + + case O_ROCKET_2: + if (is_space_dir(cave, x, y, GD_MV_UP)) + move(cave, x, y, GD_MV_UP, O_ROCKET_2); + else + explode(cave, x, y); + break; + + case O_ROCKET_3: + if (is_space_dir(cave, x, y, GD_MV_LEFT)) + move(cave, x, y, GD_MV_LEFT, O_ROCKET_3); + else + explode(cave, x, y); + break; + + case O_ROCKET_4: + if (is_space_dir(cave, x, y, GD_MV_DOWN)) + move(cave, x, y, GD_MV_DOWN, O_ROCKET_4); + else + explode(cave, x, y); + break; + // ============================================================================ // S I M P L E C H A N G I N G; E X P L O S I O N S // ============================================================================ diff --git a/src/game_bd/bd_elements.h b/src/game_bd/bd_elements.h index ab5d5fc5..de04d23a 100644 --- a/src/game_bd/bd_elements.h +++ b/src/game_bd/bd_elements.h @@ -190,9 +190,16 @@ typedef enum _element O_PRE_PL_3, O_PLAYER, O_PLAYER_BOMB, + O_PLAYER_ROCKET_LAUNCHER, O_PLAYER_GLUED, O_PLAYER_STIRRING, + O_ROCKET_LAUNCHER, + O_ROCKET_1, + O_ROCKET_2, + O_ROCKET_3, + O_ROCKET_4, + O_BOMB, O_BOMB_TICK_1, O_BOMB_TICK_2, diff --git a/src/main.c b/src/main.c index bff898d0..b278a0df 100644 --- a/src/main.c +++ b/src/main.c @@ -7107,6 +7107,11 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] = "bd_player", "Player with bomb", }, + { + "bd_player_with_rocket_launcher", + "bd_player", + "Player with rocket launcher", + }, { "bd_player_glued", "bd_player", @@ -7117,6 +7122,36 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] = "bd_player", "Stirring player" }, + { + "bd_rocket_launcher", + "bd_rocket_launcher", + "Rocket launcher", + }, + { + "bd_rocket", + "bd_rocket", + "Rocket", + }, + { + "bd_rocket.right", + "bd_rocket", + "Rocket (starts moving right)" + }, + { + "bd_rocket.up", + "bd_rocket", + "Rocket (starts moving up)" + }, + { + "bd_rocket.left", + "bd_rocket", + "Rocket (starts moving left)" + }, + { + "bd_rocket.down", + "bd_rocket", + "Rocket (starts moving down)" + }, { "bd_fake_bonus", "bd_fake_bonus", diff --git a/src/main.h b/src/main.h index 2a630a1e..04b6021a 100644 --- a/src/main.h +++ b/src/main.h @@ -2194,108 +2194,115 @@ #define EL_BD_NITRO_PACK 1379 #define EL_BD_PLAYER 1380 #define EL_BD_PLAYER_WITH_BOMB 1381 -#define EL_BD_PLAYER_GLUED 1382 -#define EL_BD_PLAYER_STIRRING 1383 -#define EL_BD_FAKE_BONUS 1384 -#define EL_BD_COVERED 1385 +#define EL_BD_PLAYER_WITH_ROCKET_LAUNCHER 1382 +#define EL_BD_PLAYER_GLUED 1383 +#define EL_BD_PLAYER_STIRRING 1384 +#define EL_BD_ROCKET_LAUNCHER 1385 +#define EL_BD_ROCKET 1386 +#define EL_BD_ROCKET_RIGHT 1387 +#define EL_BD_ROCKET_UP 1388 +#define EL_BD_ROCKET_LEFT 1389 +#define EL_BD_ROCKET_DOWN 1390 +#define EL_BD_FAKE_BONUS 1391 +#define EL_BD_COVERED 1392 // BD style elements ("effects"; mostly runtime elements, but can also be stored in level file) -#define EL_BD_SAND_BALL_FALLING 1386 -#define EL_BD_SAND_LOOSE_FALLING 1387 -#define EL_BD_ROCK_FALLING 1388 -#define EL_BD_FLYING_ROCK_FLYING 1389 -#define EL_BD_MEGA_ROCK_FALLING 1390 -#define EL_BD_DIAMOND_FALLING 1391 -#define EL_BD_FLYING_DIAMOND_FLYING 1392 -#define EL_BD_NUT_FALLING 1393 -#define EL_BD_FALLING_WALL_FALLING 1394 -#define EL_BD_NITRO_PACK_FALLING 1395 -#define EL_BD_WATER_1 1396 -#define EL_BD_WATER_2 1397 -#define EL_BD_WATER_3 1398 -#define EL_BD_WATER_4 1399 -#define EL_BD_WATER_5 1400 -#define EL_BD_WATER_6 1401 -#define EL_BD_WATER_7 1402 -#define EL_BD_WATER_8 1403 -#define EL_BD_WATER_9 1404 -#define EL_BD_WATER_10 1405 -#define EL_BD_WATER_11 1406 -#define EL_BD_WATER_12 1407 -#define EL_BD_WATER_13 1408 -#define EL_BD_WATER_14 1409 -#define EL_BD_WATER_15 1410 -#define EL_BD_WATER_16 1411 -#define EL_BD_COW_ENCLOSED_1 1412 -#define EL_BD_COW_ENCLOSED_2 1413 -#define EL_BD_COW_ENCLOSED_3 1414 -#define EL_BD_COW_ENCLOSED_4 1415 -#define EL_BD_COW_ENCLOSED_5 1416 -#define EL_BD_COW_ENCLOSED_6 1417 -#define EL_BD_COW_ENCLOSED_7 1418 -#define EL_BD_BLADDER_1 1419 -#define EL_BD_BLADDER_2 1420 -#define EL_BD_BLADDER_3 1421 -#define EL_BD_BLADDER_4 1422 -#define EL_BD_BLADDER_5 1423 -#define EL_BD_BLADDER_6 1424 -#define EL_BD_BLADDER_7 1425 -#define EL_BD_BLADDER_8 1426 -#define EL_BD_PLAYER_GROWING_1 1427 -#define EL_BD_PLAYER_GROWING_2 1428 -#define EL_BD_PLAYER_GROWING_3 1429 -#define EL_BD_BOMB_TICKING_1 1430 -#define EL_BD_BOMB_TICKING_2 1431 -#define EL_BD_BOMB_TICKING_3 1432 -#define EL_BD_BOMB_TICKING_4 1433 -#define EL_BD_BOMB_TICKING_5 1434 -#define EL_BD_BOMB_TICKING_6 1435 -#define EL_BD_BOMB_TICKING_7 1436 -#define EL_BD_CLOCK_GROWING_1 1437 -#define EL_BD_CLOCK_GROWING_2 1438 -#define EL_BD_CLOCK_GROWING_3 1439 -#define EL_BD_CLOCK_GROWING_4 1440 -#define EL_BD_DIAMOND_GROWING_1 1441 -#define EL_BD_DIAMOND_GROWING_2 1442 -#define EL_BD_DIAMOND_GROWING_3 1443 -#define EL_BD_DIAMOND_GROWING_4 1444 -#define EL_BD_DIAMOND_GROWING_5 1445 -#define EL_BD_EXPLODING_1 1446 -#define EL_BD_EXPLODING_2 1447 -#define EL_BD_EXPLODING_3 1448 -#define EL_BD_EXPLODING_4 1449 -#define EL_BD_EXPLODING_5 1450 -#define EL_BD_ROCK_GROWING_1 1451 -#define EL_BD_ROCK_GROWING_2 1452 -#define EL_BD_ROCK_GROWING_3 1453 -#define EL_BD_ROCK_GROWING_4 1454 -#define EL_BD_STEELWALL_GROWING_1 1455 -#define EL_BD_STEELWALL_GROWING_2 1456 -#define EL_BD_STEELWALL_GROWING_3 1457 -#define EL_BD_STEELWALL_GROWING_4 1458 -#define EL_BD_GHOST_EXPLODING_1 1459 -#define EL_BD_GHOST_EXPLODING_2 1460 -#define EL_BD_GHOST_EXPLODING_3 1461 -#define EL_BD_GHOST_EXPLODING_4 1462 -#define EL_BD_BOMB_EXPLODING_1 1463 -#define EL_BD_BOMB_EXPLODING_2 1464 -#define EL_BD_BOMB_EXPLODING_3 1465 -#define EL_BD_BOMB_EXPLODING_4 1466 -#define EL_BD_NITRO_PACK_EXPLODING 1467 -#define EL_BD_NITRO_PACK_EXPLODING_1 1468 -#define EL_BD_NITRO_PACK_EXPLODING_2 1469 -#define EL_BD_NITRO_PACK_EXPLODING_3 1470 -#define EL_BD_NITRO_PACK_EXPLODING_4 1471 -#define EL_BD_AMOEBA_2_EXPLODING_1 1472 -#define EL_BD_AMOEBA_2_EXPLODING_2 1473 -#define EL_BD_AMOEBA_2_EXPLODING_3 1474 -#define EL_BD_AMOEBA_2_EXPLODING_4 1475 -#define EL_BD_NUT_BREAKING_1 1476 -#define EL_BD_NUT_BREAKING_2 1477 -#define EL_BD_NUT_BREAKING_3 1478 -#define EL_BD_NUT_BREAKING_4 1479 - -#define NUM_FILE_ELEMENTS 1480 +#define EL_BD_SAND_BALL_FALLING 1393 +#define EL_BD_SAND_LOOSE_FALLING 1394 +#define EL_BD_ROCK_FALLING 1395 +#define EL_BD_FLYING_ROCK_FLYING 1396 +#define EL_BD_MEGA_ROCK_FALLING 1397 +#define EL_BD_DIAMOND_FALLING 1398 +#define EL_BD_FLYING_DIAMOND_FLYING 1399 +#define EL_BD_NUT_FALLING 1400 +#define EL_BD_FALLING_WALL_FALLING 1401 +#define EL_BD_NITRO_PACK_FALLING 1402 +#define EL_BD_WATER_1 1403 +#define EL_BD_WATER_2 1404 +#define EL_BD_WATER_3 1405 +#define EL_BD_WATER_4 1406 +#define EL_BD_WATER_5 1407 +#define EL_BD_WATER_6 1408 +#define EL_BD_WATER_7 1409 +#define EL_BD_WATER_8 1410 +#define EL_BD_WATER_9 1411 +#define EL_BD_WATER_10 1412 +#define EL_BD_WATER_11 1413 +#define EL_BD_WATER_12 1414 +#define EL_BD_WATER_13 1415 +#define EL_BD_WATER_14 1416 +#define EL_BD_WATER_15 1417 +#define EL_BD_WATER_16 1418 +#define EL_BD_COW_ENCLOSED_1 1419 +#define EL_BD_COW_ENCLOSED_2 1420 +#define EL_BD_COW_ENCLOSED_3 1421 +#define EL_BD_COW_ENCLOSED_4 1422 +#define EL_BD_COW_ENCLOSED_5 1423 +#define EL_BD_COW_ENCLOSED_6 1424 +#define EL_BD_COW_ENCLOSED_7 1425 +#define EL_BD_BLADDER_1 1426 +#define EL_BD_BLADDER_2 1427 +#define EL_BD_BLADDER_3 1428 +#define EL_BD_BLADDER_4 1429 +#define EL_BD_BLADDER_5 1430 +#define EL_BD_BLADDER_6 1431 +#define EL_BD_BLADDER_7 1432 +#define EL_BD_BLADDER_8 1433 +#define EL_BD_PLAYER_GROWING_1 1434 +#define EL_BD_PLAYER_GROWING_2 1435 +#define EL_BD_PLAYER_GROWING_3 1436 +#define EL_BD_BOMB_TICKING_1 1437 +#define EL_BD_BOMB_TICKING_2 1438 +#define EL_BD_BOMB_TICKING_3 1439 +#define EL_BD_BOMB_TICKING_4 1440 +#define EL_BD_BOMB_TICKING_5 1441 +#define EL_BD_BOMB_TICKING_6 1442 +#define EL_BD_BOMB_TICKING_7 1443 +#define EL_BD_CLOCK_GROWING_1 1444 +#define EL_BD_CLOCK_GROWING_2 1445 +#define EL_BD_CLOCK_GROWING_3 1446 +#define EL_BD_CLOCK_GROWING_4 1447 +#define EL_BD_DIAMOND_GROWING_1 1448 +#define EL_BD_DIAMOND_GROWING_2 1449 +#define EL_BD_DIAMOND_GROWING_3 1450 +#define EL_BD_DIAMOND_GROWING_4 1451 +#define EL_BD_DIAMOND_GROWING_5 1452 +#define EL_BD_EXPLODING_1 1453 +#define EL_BD_EXPLODING_2 1454 +#define EL_BD_EXPLODING_3 1455 +#define EL_BD_EXPLODING_4 1456 +#define EL_BD_EXPLODING_5 1457 +#define EL_BD_ROCK_GROWING_1 1458 +#define EL_BD_ROCK_GROWING_2 1459 +#define EL_BD_ROCK_GROWING_3 1460 +#define EL_BD_ROCK_GROWING_4 1461 +#define EL_BD_STEELWALL_GROWING_1 1462 +#define EL_BD_STEELWALL_GROWING_2 1463 +#define EL_BD_STEELWALL_GROWING_3 1464 +#define EL_BD_STEELWALL_GROWING_4 1465 +#define EL_BD_GHOST_EXPLODING_1 1466 +#define EL_BD_GHOST_EXPLODING_2 1467 +#define EL_BD_GHOST_EXPLODING_3 1468 +#define EL_BD_GHOST_EXPLODING_4 1469 +#define EL_BD_BOMB_EXPLODING_1 1470 +#define EL_BD_BOMB_EXPLODING_2 1471 +#define EL_BD_BOMB_EXPLODING_3 1472 +#define EL_BD_BOMB_EXPLODING_4 1473 +#define EL_BD_NITRO_PACK_EXPLODING 1474 +#define EL_BD_NITRO_PACK_EXPLODING_1 1475 +#define EL_BD_NITRO_PACK_EXPLODING_2 1476 +#define EL_BD_NITRO_PACK_EXPLODING_3 1477 +#define EL_BD_NITRO_PACK_EXPLODING_4 1478 +#define EL_BD_AMOEBA_2_EXPLODING_1 1479 +#define EL_BD_AMOEBA_2_EXPLODING_2 1480 +#define EL_BD_AMOEBA_2_EXPLODING_3 1481 +#define EL_BD_AMOEBA_2_EXPLODING_4 1482 +#define EL_BD_NUT_BREAKING_1 1483 +#define EL_BD_NUT_BREAKING_2 1484 +#define EL_BD_NUT_BREAKING_3 1485 +#define EL_BD_NUT_BREAKING_4 1486 + +#define NUM_FILE_ELEMENTS 1487 // "real" (and therefore drawable) runtime elements @@ -3715,6 +3722,7 @@ struct LevelInfo int bd_hammer_walls_break_delay; // BD hammer time for breaking walls (in BD frames) boolean bd_hammer_walls_reappear; // BD hammered walls are reappearing after some delay int bd_hammer_walls_reappear_delay; // BD hammer time for reappearing walls (in BD frames) + boolean bd_infinite_rockets; // BD rocket launcher has infinite number of rockets int bd_num_skeletons_needed_for_pot; // BD skeletons amount must be collected to use a pot int bd_skeleton_worth_num_diamonds; // BD skeleton collected is worth this number of diamonds int bd_expanding_wall_looks_like; // BD expanding wall looks like this other game element diff --git a/src/tools.c b/src/tools.c index 36fc6e15..e05a1973 100644 --- a/src/tools.c +++ b/src/tools.c @@ -6894,6 +6894,10 @@ bd_object_mapping_list[] = O_PLAYER_BOMB, TRUE, EL_BD_PLAYER_WITH_BOMB, -1, -1 }, + { + O_PLAYER_ROCKET_LAUNCHER, TRUE, + EL_BD_PLAYER_WITH_ROCKET_LAUNCHER, -1, -1 + }, { O_PLAYER_GLUED, TRUE, EL_BD_PLAYER_GLUED, -1, -1 @@ -6902,6 +6906,26 @@ bd_object_mapping_list[] = O_PLAYER_STIRRING, TRUE, EL_BD_PLAYER_STIRRING, -1, -1 }, + { + O_ROCKET_LAUNCHER, TRUE, + EL_BD_ROCKET_LAUNCHER, -1, -1 + }, + { + O_ROCKET_1, TRUE, + EL_BD_ROCKET_RIGHT, -1, -1 + }, + { + O_ROCKET_2, TRUE, + EL_BD_ROCKET_UP, -1, -1 + }, + { + O_ROCKET_3, TRUE, + EL_BD_ROCKET_LEFT, -1, -1 + }, + { + O_ROCKET_4, TRUE, + EL_BD_ROCKET_DOWN, -1, -1 + }, { O_BOMB, TRUE, EL_BD_BOMB, -1, -1 -- 2.34.1