diff --git a/config/fxdata/columnset.toml b/config/fxdata/columnset.toml index 4168256b18..3e197af746 100644 --- a/config/fxdata/columnset.toml +++ b/config/fxdata/columnset.toml @@ -10284,4 +10284,28 @@ Height = 5 SolidMask = 25 FloorTexture = 179 Orientation = 0 -Cubes = [148,0,0,481,160,0,0,0] \ No newline at end of file +Cubes = [148,0,0,481,160,0,0,0] + +[column1286] +Lintel = 0 +Height = 5 +SolidMask = 31 +FloorTexture = 27 +Orientation = 0 +Cubes = [117, 72, 123, 120, 77, 0, 0, 0] + +[column1287] +Lintel = 0 +Height = 5 +SolidMask = 31 +FloorTexture = 27 +Orientation = 0 +Cubes = [117, 72, 124, 121, 77, 0, 0, 0] + +[column1288] +Lintel = 0 +Height = 5 +SolidMask = 31 +FloorTexture = 27 +Orientation = 0 +Cubes = [117, 72, 125, 122, 77, 0, 0, 0] \ No newline at end of file diff --git a/config/fxdata/slabset.toml b/config/fxdata/slabset.toml index 17eb3a6d2d..3c3ddad82d 100644 --- a/config/fxdata/slabset.toml +++ b/config/fxdata/slabset.toml @@ -8143,4 +8143,117 @@ Objects = [] [slab59.SE] Columns = [365, 365, 365, 365, 365, 365, 365, 365, 365] +Objects = [] + +[slab60] +[slab60.S] +Columns = [2, 2, 2, 2, 817, 2, 209, 210, 211] +Objects = [] + +[slab60.W] +Columns = [209, 2, 2, 210, 817, 2, 211, 2, 2] +Objects = [] + +[slab60.N] +Columns = [209, 210, 211, 2, 817, 2, 2, 2, 2] +Objects = [] + +[slab60.E] +Columns = [2, 2, 209, 2, 817, 210, 2, 2, 211] +Objects = [] + +[slab60.SW] +Columns = [209, 2, 2, 210, 817, 2, 5, 210, 211] +Objects = [] + +[slab60.NW] +Columns = [5, 210, 211, 210, 817, 2, 211, 2, 2] +Objects = [] + +[slab60.NE] +Columns = [209, 210, 5, 2, 817, 210, 2, 2, 211] +Objects = [] + +[slab60.SE] +Columns = [2, 2, 209, 2, 817, 210, 209, 210, 5] +Objects = [] + +[slab60.ALL] +Columns = [5, 210, 5, 210, 817, 210, 5, 210, 5] +Objects = [] + +[slab60.S_LAVA] +Columns = [2, 2, 2, 2, 817, 2, 212, 213, 214] +Objects = [] + +[slab60.W_LAVA] +Columns = [212, 2, 2, 213, 817, 2, 214, 2, 2] +Objects = [] + +[slab60.N_LAVA] +Columns = [212, 213, 214, 2, 817, 2, 2, 2, 2] +Objects = [] + +[slab60.E_LAVA] +Columns = [2, 2, 212, 2, 817, 213, 2, 2, 214] +Objects = [] + +[slab60.SW_LAVA] +Columns = [212, 2, 2, 213, 817, 2, 38, 213, 214] +Objects = [] + +[slab60.NW_LAVA] +Columns = [38, 213, 214, 213, 817, 2, 214, 2, 2] +Objects = [] + +[slab60.NE_LAVA] +Columns = [212, 213, 38, 2, 817, 213, 2, 2, 214] +Objects = [] + +[slab60.SE_LAVA] +Columns = [2, 2, 212, 2, 817, 213, 212, 213, 38] +Objects = [] + +[slab60.ALL_LAVA] +Columns = [38, 213, 38, 213, 817, 213, 38, 213, 38] +Objects = [] + +[slab60.S_WATER] +Columns = [2, 2, 2, 2, 817, 2, 1286, 1287, 1288] +Objects = [] + +[slab60.W_WATER] +Columns = [1286, 2, 2, 1287, 817, 2, 1288, 2, 2] +Objects = [] + +[slab60.N_WATER] +Columns = [1286, 1287, 1288, 2, 817, 2, 2, 2, 2] +Objects = [] + +[slab60.E_WATER] +Columns = [2, 2, 1286, 2, 817, 1287, 2, 2, 1288] +Objects = [] + +[slab60.SW_WATER] +Columns = [1286, 2, 2, 1287, 817, 2, 29, 1287, 1288] +Objects = [] + +[slab60.NW_WATER] +Columns = [29, 1287, 1288, 1287, 817, 2, 1288, 2, 2] +Objects = [] + +[slab60.NE_WATER] +Columns = [1286, 1287, 29, 2, 817, 1287, 2, 2, 1288] +Objects = [] + +[slab60.SE_WATER] +Columns = [2, 2, 1286, 2, 817, 1287, 1286, 1287, 29] +Objects = [] + +[slab60.ALL_WATER] +Columns = [29, 1287, 29, 1287, 817, 1287, 29, 1287, 29] +Objects = [] + +[slab60.CENTER] +Columns = [2, 2, 2, 2, 817, 2, 2, 2, 2] Objects = [] \ No newline at end of file diff --git a/config/fxdata/terrain.cfg b/config/fxdata/terrain.cfg index eed851d1b5..7a5162976e 100644 --- a/config/fxdata/terrain.cfg +++ b/config/fxdata/terrain.cfg @@ -1,7 +1,7 @@ ; KeeperFX Terrain Configuration file version 1.0. [common] -SlabsCount = 60 +SlabsCount = 61 RoomsCount = 17 ; Slabs configuration. @@ -184,11 +184,11 @@ IsOwnable = 1 WlbType = 0 [slab9] -Name = DAMAGED_WALL -TooltipTextID = 330 +Name = BLANK_WALL +TooltipTextID = 329 BlockFlagsHeight = 4 BlockHealthIndex = 2 -BlockFlags = BLOCKING DIGGABLE +BlockFlags = BLOCKING FILLED NoBlockFlags = FillStyle = 0 Category = 3 @@ -1069,6 +1069,28 @@ IsDiggable = 0 IsOwnable = 1 WlbType = 0 +[slab60] +Name = DAMAGED_WALL +TooltipTextID = 330 +BlockFlagsHeight = 4 +BlockHealthIndex = 9 +BlockFlags = BLOCKING FILLED +NoBlockFlags = +FillStyle = 0 +Category = 3 +SlbID = 0 +Indestructible = 0 +Wibble = 1 +Animated = 0 +IsSafeLand = 0 +IsDiggable = 1 +IsOwnable = 1 +WlbType = 0 +HealthLoss = 5 +DamageTurns = 500 +TurnTo = 10 +TransformEffect = EFFECT_DIRT_RUBBLE 1 + ; Rooms configuration. [room0] @@ -1429,3 +1451,4 @@ DOOR_WOODEN = 20 DOOR_BRACE = 80 DOOR_STEEL = 255 DOOR_MAGIC = 255 +DAMAGED = 255 diff --git a/src/config_terrain.c b/src/config_terrain.c index ac6cde073d..bcef16dd3b 100644 --- a/src/config_terrain.c +++ b/src/config_terrain.c @@ -61,6 +61,10 @@ const struct NamedCommand terrain_slab_commands[] = { {"ANIMATED", 14}, {"ISOWNABLE", 15}, {"INDESTRUCTIBLE", 16}, + {"HEALTHLOSS", 17}, + {"DAMAGETURNS", 18}, + {"TURNTO", 19}, + {"TRANSFORMEFFECT", 20}, {NULL, 0}, }; @@ -214,6 +218,7 @@ const struct NamedCommand terrain_health_commands[] = { {"DOOR_BRACE", 7}, {"DOOR_STEEL", 8}, {"DOOR_MAGIC", 9}, + {"DAMAGED", 10}, {NULL, 0}, }; @@ -717,6 +722,79 @@ TbBool parse_terrain_slab_blocks(char *buf, long len, const char *config_textnam COMMAND_TEXT(cmd_num), blocknamelen, blockname, config_textname); } break; + case 17: // HEALTHLOSS + if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = atoi(word_buf); + if (k > 0) + { + slbattr->health_loss = k; + n++; + } + } + if (n < 1) + { + CONFWRNLOG("Incorrect value of \"%s\" parameter in [%.*s] block of %s file.", + COMMAND_TEXT(cmd_num), blocknamelen, blockname, config_textname); + } + break; + case 18: // DAMAGETURNS + if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = atoi(word_buf); + if (k > 0) + { + slbattr->damage_turns = k; + n++; + } + } + if (n < 1) + { + CONFWRNLOG("Incorrect value of \"%s\" parameter in [%.*s] block of %s file.", + COMMAND_TEXT(cmd_num), blocknamelen, blockname, config_textname); + } + break; + case 19: // TURNTO + if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = atoi(word_buf); + if (k > 0) + { + slbattr->turn_to = k; + n++; + } + } + if (n < 1) + { + CONFWRNLOG("Incorrect value of \"%s\" parameter in [%.*s] block of %s file.", + COMMAND_TEXT(cmd_num), blocknamelen, blockname, config_textname); + } + break; + case 20: // TRANSFORMEFFECT + if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = get_id(effect_desc, word_buf); + if (k >= 0) + { + slbattr->transform_effect = k; + n++; + } else + { + slbattr->transform_effect = 0; + } + } + if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) + { + k = atoi(word_buf); + slbattr->transform_effect_mode = k; + n++; + } + if (n < 2) + { + CONFWRNLOG("Incorrect value of \"%s\" parameters in [%s] block of %s file.", + COMMAND_TEXT(cmd_num),word_buf,config_textname); + } + break; case ccr_comment: break; case ccr_endOfFile: @@ -751,15 +829,7 @@ TbBool parse_terrain_slab_blocks(char *buf, long len, const char *config_textnam n = 0; switch (cmd_num) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: + case 1 ... HEALTH_BLOCKS: if (get_conf_parameter_single(buf,&pos,len,word_buf,sizeof(word_buf)) > 0) { k = atoi(word_buf); diff --git a/src/config_terrain.h b/src/config_terrain.h index bc5d27144f..8e99009313 100644 --- a/src/config_terrain.h +++ b/src/config_terrain.h @@ -32,6 +32,7 @@ extern "C" { #define TERRAIN_ITEMS_MAX 256 #define SLABSETS_PER_SLAB (9*3+1) +#define HEALTH_BLOCKS 10 /******************************************************************************/ @@ -124,6 +125,11 @@ struct SlabAttr { unsigned char wlb_type; unsigned char is_ownable; unsigned char indestructible; + HitPoints health_loss; + GameTurn damage_turns; + SlabKind turn_to; + ThingModel transform_effect; + TbBool transform_effect_mode; }; #pragma pack() diff --git a/src/creature_instances.c b/src/creature_instances.c index 9b49513210..a6d0639d1f 100644 --- a/src/creature_instances.c +++ b/src/creature_instances.c @@ -680,7 +680,16 @@ long instf_dig(struct Thing *creatng, long *param) if ((slb->health > dig_damage) || slab_kind_is_indestructible(slb->kind)) { if (!slab_kind_is_indestructible(slb->kind)) - slb->health -= dig_damage; + { + if (slb->kind != SlbT_DAMAGEDWALL) + { + slb->health -= dig_damage; + } + else + { + slb->health = 0; + } + } struct ShotConfigStats* shotst = get_shot_model_stats(ShM_Dig); thing_play_sample(creatng, shotst->dig.sndsample_idx + UNSYNC_RANDOM(shotst->dig.sndsample_range), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); create_effect(&creatng->mappos, shotst->dig.effect_model, creatng->owner); @@ -1084,21 +1093,32 @@ long instf_reinforce(struct Thing *creatng, long *param) if (check_place_to_reinforce(creatng, slb_x, slb_y) <= 0) { return 0; } - if (cctrl->digger.consecutive_reinforcements <= 25) + struct SlabMap *slb = get_slabmap_block(slb_x, slb_y); + switch (slb->kind) { - cctrl->digger.consecutive_reinforcements++; - if (!S3DEmitterIsPlayingSample(creatng->snd_emitter_id, 63, 0)) + case SlbT_EARTH: + case SlbT_TORCHDIRT: { - struct PlayerInfo* player; - player = get_my_player(); - int volume = 32; - if ((player->view_type == PVT_CreatureContrl) || (player->view_type == PVT_CreaturePasngr)) + if (cctrl->digger.consecutive_reinforcements <= 25) { - volume = FULL_LOUDNESS; + cctrl->digger.consecutive_reinforcements++; + play_digger_reinforce_sound(creatng); + return 0; } - thing_play_sample(creatng, 1005 + UNSYNC_RANDOM(7), NORMAL_PITCH, 0, 3, 0, 2, volume); + break; + } + case SlbT_DAMAGEDWALL: + { + struct SlabAttr* slbattr = get_slab_attrs(slb); + if (slb->health < game.block_health[slbattr->block_health_index]) + { + slb->health++; + cctrl->digger.consecutive_reinforcements++; + play_digger_reinforce_sound(creatng); + return 0; + } + break; } - return 0; } cctrl->digger.consecutive_reinforcements = 0; place_and_process_pretty_wall_slab(creatng, slb_x, slb_y); @@ -1135,12 +1155,22 @@ long instf_tunnel(struct Thing *creatng, long *param) if (slabmap_block_invalid(slb)) { return 0; } - thing_play_sample(creatng, 69+UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); - if (slb->health > 1) { - slb->health--; - } else { - dig_out_block(stl_x, stl_y, creatng->owner); + thing_play_sample(creatng, 69+UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); + if (slb->health > 1) + { + if (slb->kind == SlbT_DAMAGEDWALL) + { + slb->health = 0; } + else + { + slb->health--; + } + } + else + { + dig_out_block(stl_x, stl_y, creatng->owner); + } return 1; } diff --git a/src/game_legacy.h b/src/game_legacy.h index e5cec24394..1dbfa5258f 100644 --- a/src/game_legacy.h +++ b/src/game_legacy.h @@ -37,6 +37,7 @@ #include "config_objects.h" #include "config_rules.h" #include "config_players.h" +#include "config_terrain.h" #include "dungeon_data.h" #include "thing_data.h" #include "thing_traps.h" @@ -215,7 +216,7 @@ char numfield_1A; PlayerNumber neutral_player_num; struct GoldLookup gold_lookup[GOLD_LOOKUP_COUNT]; unsigned short ambient_sound_thing_idx; - HitPoints block_health[9]; + HitPoints block_health[HEALTH_BLOCKS]; unsigned short generate_speed; unsigned long entrance_last_generate_turn; unsigned short entrance_room_id; diff --git a/src/game_loop.c b/src/game_loop.c index 3c2045a4fa..e5174b323f 100644 --- a/src/game_loop.c +++ b/src/game_loop.c @@ -28,6 +28,7 @@ #include "room_workshop.h" #include "map_columns.h" #include "creature_states.h" +#include "map_blocks.h" #include "magic_powers.h" #include "game_merge.h" #include "sounds.h" @@ -276,6 +277,76 @@ void update_manufacturing(void) } } +void update_terrain(void) +{ + for (MapSlabCoord slb_x = 0; slb_x < gameadd.map_tiles_x; slb_x++) + { + for (MapSlabCoord slb_y = 0; slb_y < gameadd.map_tiles_y; slb_y++) + { + struct SlabMap* slb = get_slabmap_block(slb_x, slb_y); + if (!slabmap_block_invalid(slb)) + { + struct SlabAttr* slbattr = get_slab_kind_attrs(slb->kind); + if (slbattr->health_loss != 0) + { + if (game.play_gameturn % slbattr->damage_turns == 0) + { + slb->health -= slbattr->health_loss; + if (slb->health <= 0) + { + if (slbattr->transform_effect != 0) + { + struct Coord3d pos; + MapSubtlCoord stl_x; + MapSubtlCoord stl_y; + if (slbattr->transform_effect_mode) + { + stl_x = STL_PER_SLB * slb_x; + stl_y = STL_PER_SLB * slb_y; + for (MapSubtlCoord y = stl_y; y < stl_y+STL_PER_SLB; y++) + { + for (MapSubtlCoord x = stl_x; x < stl_x+STL_PER_SLB; x++) + { + MapSubtlCoord z = get_floor_filled_subtiles_at(x, y); + if (z > 0) + { + pos.x.val = subtile_coord_center(x); + pos.y.val = subtile_coord_center(y); + pos.z.val = subtile_coord_center(1); + MapCoord max_height = subtile_coord(z,0); + while (pos.z.val < max_height) + { + create_effect(&pos, slbattr->transform_effect, game.neutral_player_num); + pos.z.val += COORD_PER_STL; + } + } + } + } + place_slab_type_on_map(slbattr->turn_to, slab_subtile(slb_x,0), slab_subtile(slb_y,0), game.neutral_player_num, 0); + } + else + { + place_slab_type_on_map(slbattr->turn_to, slab_subtile(slb_x,0), slab_subtile(slb_y,0), game.neutral_player_num, 0); + stl_x = slab_subtile_center(slb_x); + stl_y = slab_subtile_center(slb_y); + pos.x.val = subtile_coord_center(stl_x); + pos.y.val = subtile_coord_center(stl_y); + pos.z.val = get_floor_height_at(&pos); + create_effect(&pos, slbattr->transform_effect, game.neutral_player_num); + } + } + else + { + place_slab_type_on_map(slbattr->turn_to, slab_subtile(slb_x,0), slab_subtile(slb_y,0), game.neutral_player_num, 0); + } + } + } + } + } + } + } +} + /******************************************************************************/ #ifdef __cplusplus } diff --git a/src/game_loop.h b/src/game_loop.h index ef26adc595..0a6b22c77d 100644 --- a/src/game_loop.h +++ b/src/game_loop.h @@ -32,6 +32,7 @@ void process_dungeon_destroy(struct Thing* heartng); void initialise_devastate_dungeon_from_heart(PlayerNumber plyr_idx); void update_manufacturing(void); void update_research(void); +void update_terrain(void); /******************************************************************************/ /******************************************************************************/ #ifdef __cplusplus diff --git a/src/main.cpp b/src/main.cpp index f08888f8db..7b4a71a499 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2696,6 +2696,7 @@ void update(void) update_creature_pool_state(); if ((game.play_gameturn & 0x01) != 0) update_animating_texture_maps(); + update_terrain(); update_things(); process_rooms(); process_dungeons(); diff --git a/src/slab_data.h b/src/slab_data.h index 4b4529dd05..ec046e1c97 100644 --- a/src/slab_data.h +++ b/src/slab_data.h @@ -41,7 +41,7 @@ enum SlabTypes { SlbT_WALLWTWINS = 6, SlbT_WALLWWOMAN = 7, SlbT_WALLPAIRSHR = 8, - SlbT_DAMAGEDWALL = 9, + SlbT_BLANKWALL = 9, SlbT_PATH = 10, SlbT_CLAIMED = 11, SlbT_LAVA = 12, @@ -90,6 +90,9 @@ enum SlabTypes { SlbT_DOORSECRET1 = 55, SlbT_DOORSECRET2 = 56, SlbT_ROCK_FLOOR = 57, + SlbT_DOORMIDAS1 = 58, + SlbT_DOORMIDAS2 = 59, + SlbT_DAMAGEDWALL = 60, }; enum WlbType { diff --git a/src/sounds.c b/src/sounds.c index 9e5797b714..508011a242 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -733,6 +733,16 @@ void stop_streamed_sample() streamed_sample = NULL; } } + +void play_digger_reinforce_sound(struct Thing *spdigtng) +{ + if (!S3DEmitterIsPlayingSample(spdigtng->snd_emitter_id, 63, 0)) + { + struct PlayerInfo* player = get_my_player(); + int volume = ((player->view_type == PVT_CreatureContrl) || (player->view_type == PVT_CreaturePasngr)) ? FULL_LOUDNESS : 32; + thing_play_sample(spdigtng, 1005 + UNSYNC_RANDOM(7), NORMAL_PITCH, 0, 3, 0, 2, volume); + } +} /******************************************************************************/ #ifdef __cplusplus } diff --git a/src/sounds.h b/src/sounds.h index 6200409d33..ec55f8c0b6 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -94,6 +94,8 @@ void free_sound_chunks(); void play_external_sound_sample(unsigned char smpl_id); TbBool play_streamed_sample(char* fname, int volume, int loops); void stop_streamed_sample(); + +void play_digger_reinforce_sound(struct Thing *spdigtng); /******************************************************************************/ #ifdef __cplusplus } diff --git a/src/spdigger_stack.c b/src/spdigger_stack.c index 3d851ab7a6..6f40c94088 100644 --- a/src/spdigger_stack.c +++ b/src/spdigger_stack.c @@ -1341,9 +1341,8 @@ long add_to_reinforce_stack_if_need_to(long slb_x, long slb_y, struct Dungeon *d { if (r_stackpos < DIGGER_TASK_MAX_COUNT - dungeon->digger_stack_length) { - struct SlabMap *slb; - slb = get_slabmap_block(slb_x, slb_y); - if (slab_kind_is_friable_dirt(slb->kind)) + struct SlabMap *slb = get_slabmap_block(slb_x, slb_y); + if ( (slab_kind_is_friable_dirt(slb->kind)) || ( (slb->kind == SlbT_DAMAGEDWALL) && (slabmap_owner(slb) == dungeon->owner) ) ) { if (subtile_revealed(slab_subtile_center(slb_x), slab_subtile_center(slb_y), dungeon->owner)) { @@ -2603,31 +2602,36 @@ struct Thing *check_place_to_save_unconscious_creature(struct Thing *spdigtng, M long check_place_to_reinforce(struct Thing *creatng, MapSlabCoord slb_x, MapSlabCoord slb_y) { - struct SlabMap *slb; TRACE_THING(creatng); - slb = get_slabmap_block(slb_x, slb_y); - if ((slb->kind != SlbT_EARTH) && (slb->kind != SlbT_TORCHDIRT)) { - SYNCDBG(8,"The slab %d,%d is not a valid type to be reinforced",(int)slb_x, (int)slb_y); - return 0; - } - struct Map *mapblk; - mapblk = get_map_block_at(slab_subtile_center(slb_x), slab_subtile_center(slb_y)); - if (!map_block_revealed(mapblk, creatng->owner)) { - SYNCDBG(8,"The slab %d,%d is not revealed",(int)slb_x, (int)slb_y); - return 0; - } - if (!slab_by_players_land(creatng->owner, slb_x, slb_y)) { - SYNCDBG(8,"The slab %d,%d is not by players land",(int)slb_x, (int)slb_y); - return 0; - } - SubtlCodedCoords task_pos; - long task_idx; - task_pos = get_subtile_number_at_slab_center(slb_x, slb_y); - task_idx = find_dig_from_task_list(creatng->owner, task_pos); - if (task_idx != -1) { - return -1; + struct SlabMap *slb = get_slabmap_block(slb_x, slb_y); + switch (slb->kind) + { + case SlbT_EARTH: + case SlbT_TORCHDIRT: + case SlbT_DAMAGEDWALL: + { + struct Map *mapblk = get_map_block_at(slab_subtile_center(slb_x), slab_subtile_center(slb_y)); + if (!map_block_revealed(mapblk, creatng->owner)) { + SYNCDBG(8,"The slab %d,%d is not revealed",(int)slb_x, (int)slb_y); + return 0; + } + if (!slab_by_players_land(creatng->owner, slb_x, slb_y)) { + SYNCDBG(8,"The slab %d,%d is not by players land",(int)slb_x, (int)slb_y); + return 0; + } + SubtlCodedCoords task_pos = get_subtile_number_at_slab_center(slb_x, slb_y); + long task_idx = find_dig_from_task_list(creatng->owner, task_pos); + if (task_idx != -1) { + return -1; + } + return 1; + } + default: + { + SYNCDBG(8,"The slab %d,%d is not a valid type to be reinforced",(int)slb_x, (int)slb_y); + return 0; + } } - return 1; } struct Thing *check_place_to_pickup_crate(const struct Thing *creatng, MapSubtlCoord stl_x, MapSubtlCoord stl_y, unsigned short flags, long n) diff --git a/src/thing_shots.c b/src/thing_shots.c index 8c87d89bd1..1bf82a84c8 100644 --- a/src/thing_shots.c +++ b/src/thing_shots.c @@ -445,7 +445,14 @@ SubtlCodedCoords process_dig_shot_hit_wall(struct Thing *thing, long blocked_fla { if (!slab_kind_is_indestructible(slb->kind)) { - slb->health -= damage; + if (slb->kind != SlbT_DAMAGEDWALL) + { + slb->health -= damage; + } + else + { + slb->health = 0; + } } if ((mapblk->flags & SlbAtFlg_Valuable) != 0) {