diff --git a/data/json/items/ammo/barb.json b/data/json/items/ammo/barb.json new file mode 100644 index 0000000000000..31ef616685e99 --- /dev/null +++ b/data/json/items/ammo/barb.json @@ -0,0 +1,24 @@ +{ + "type": "AMMO", + "id": "barb_paralysis", + "price": 400, + "name": "paralyzing barb", + "symbol": "=", + "color": "green", + "description": "Tiny droplets of venom trickle out of the sponge-like tissue of this sharp barb.", + "material": "bone", + "volume": "250ml", + "weight": 37, + "bashing": 6, + "cutting": 2, + "ammo_type": "barb", + "damage": 5, + "pierce": 5, + "dispersion": 120, + "loudness": 0, + "count": 10, + "show_stats": true, + "effects": [ + "PARALYZEPOISON" + ] +} diff --git a/data/json/items/ammo_types.json b/data/json/items/ammo_types.json index ded3b0b8ca640..ad600a1ea5e44 100644 --- a/data/json/items/ammo_types.json +++ b/data/json/items/ammo_types.json @@ -29,6 +29,12 @@ "name": "nails", "default": "nail" }, + { + "type": "ammunition_type", + "id": "barb", + "name": "barb", + "default": "barb_paralysis" + }, { "type": "ammunition_type", "id": "BB", diff --git a/data/json/items/gun/monster_gun.json b/data/json/items/gun/monster_gun.json new file mode 100644 index 0000000000000..8806081e2f6ca --- /dev/null +++ b/data/json/items/gun/monster_gun.json @@ -0,0 +1,33 @@ +{ + "id": "barb_launcher", + "type": "GUN", + "symbol": "%", + "color": "red", + "name": "barb launching organ", + "description": "A mutated organ capable of launching bony barbs at great speed.", + "material": [ + "hflesh" + ], + "flags": [ + "PRIMITIVE_RANGED_WEAPON", + "NEVER_JAMS", + "NONCONDUCTIVE", + "NO_REPAIR", + "WATERPROOF_GUN", + "NO_SALVAGE", + "NO_UNLOAD", + "RELOAD_AND_SHOOT" + ], + "skill": "pistol", + "ammo": "barb", + "clip_size": 1, + "weight": 540, + "volume": "750ml", + "bashing": 2, + "to_hit": 1, + "reload_noise_volume": 2, + "loudness": 2, + "range": 12, + "dispersion": 100, + "durability": 8 +} diff --git a/data/json/mapgen/collapsed_tower.json b/data/json/mapgen/collapsed_tower.json index 898c1ef443175..173c6c414ef3e 100644 --- a/data/json/mapgen/collapsed_tower.json +++ b/data/json/mapgen/collapsed_tower.json @@ -4,10 +4,10 @@ "type": "monstergroup", "default": "mon_null", "monsters": [ - { "monster": "mon_zombie", "freq": 100, "cost_multiplier": 1, "pack_size": [ 3, 5 ] }, - { "monster": "mon_zombie_gasbag_immobile", "freq": 200, "cost_multiplier": 1 }, - { "monster": "mon_zombie_gasbag_crawler", "freq": 10, "cost_multiplier": 7, "pack_size": [ 3, 5 ] }, - { "monster": "mon_zombie_tough", "freq": 20, "cost_multiplier": 6 } + { "monster": "mon_zombie_gasbag_immobile", "freq": 150, "cost_multiplier": 1 }, + { "monster": "mon_zombie", "freq": 200, "cost_multiplier": 7, "pack_size": [ 3, 5 ] }, + { "monster": "mon_zombie_gasbag_crawler", "freq": 150, "cost_multiplier": 7, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_gasbag_impaler", "freq": 50, "cost_multiplier": 6, "pack_size": [ 1, 4 ] } ] }, { @@ -28,9 +28,9 @@ "....s.z1CCC 4|CC l|CCC | 4 #|4 4|zsssssss##ssssssssssssssssss", "....s.z1C B |||||||###| |#| B B||B 1zsssssssssssssssssssssssssss", "....s.||||||||| #####|||||||||||666|||6 1zssss###ssssssssssssssssssss", - "....s.z1#### ## | |||####|||#B ||||ssssssssssszzzzssssssssss", - "....s.z## # 6666666|||||##sssss##s|||||||||Bsssssss", - "....s.z|C B | |C 00 |#| B B B 1zs###ssssssBsz.zz z|Bsssssss", + "....s.||#### ## | |||####|||#B ||||ssssssssssszzzzssssssssss", + "....s|||# # 6666666|||||##sssss##s|||||||||Bsssssss", + "....s|z|C B | |C 00 |#| B B B 1zs###ssssssBsz.zz z|Bsssssss", "....s.#|CCC l||| -|CCC | |||#|4 4 zss|||sssssssz.zz z|ssssssss", "....#.z|-- | ||||----## ||||222--33--22 zsss|||||ssBsz.zz z|Bsssssss", "....s.#|;w |####|# |###|### B |||sssssBszz. z|Bsssssss", @@ -38,11 +38,11 @@ "....s.#|;w A|A w;| ####|||||||| B |||| #sss|||sssssssssssssszz", ".##.s |-- | --|#####||B ||||||| # ~~~ss~~22222222~~ss~~~~", "....s.z|;w A|A | w;||||##| ### C|C||||||~~~~ss~~1## ##1~~ss~~~~", - "....s z|--| |##||####| |--| |||||3zzzz~~sszz1## ##1zzsszzz~", + "....s z|||| |##||####| |--| |||||3zzzz~~sszz1## ##1zzsszzz~", ".||.s |-w-----|||#||| | ####C |#-22---~~{{222--22--222{{221~", "....s s||| # || ##BC #|||||| ~~ 4 ???? 4 1s", "..||s |---w-----|-|| - ---- ---- ---|### ~~ 1s", - "...| ||-|l l| |B B | |l| ##||| z~~ ???? zzz 1s", + "...| ||||l l| |B B | |l| ##||| z~~ ???? zzz 1s", ".||||||||#|l l| ||66 | | |-c----c-| | z~~ ###### zTz |s", "....s.. |--- ---|#|||66 ||#| #|#||| zz~~~ zzz 1s", "....|.. |### #||| B B | |l ll ll ll|l| ~~~ 1s", @@ -50,24 +50,24 @@ "....s..||B666B 46B || B w |## | #|?rrr ##~~ rrrrrr s", ". |||||| 666 6B ||||| w #|###llll l#|||r###zT~~ Hr>>rH |", ".. ### B B 666|| | ##|||||--| ##|?r|||||#~~~ ||||s", - ".. |||# B B B B||| | |##| ###| ## |||||###### ## |s", + ".. |||# B B B B||| | |##| ###| ## - |||||###### ## |s", ".... |# B B 666 || | w C || ~ ||||||666666 ||| |s", - "....s||||###6 666 B##|| | | 444424## r ~~ ||| 6|| B66 1s", - "....#z|||##### ####66 # 4| ||||||| ## ~~ |||## ## 1s", - "....#||------- |----|||||| | |## ~~~~~~~ | |||||w### 1s", - "....s||CCC 4 C C| ||||4 B | || || ~~~~~~~~~~- |||||||###- -|s", - "....sz|C | BC| CCC CCC | | B| ~~||~~~~ 3```| | 4 1s", - "....3##||||| C| ||||| | | C|| ~~~~~~~~~~~ 3```| |BC C 1s", - "..###z1 ||||C CCC CC||| ##||| ~~~~~ | |```| | C C B|s", - "....sz14 | BC -- #| |---| ||||||||CC CCC|s", - "....#z14 || C | #|| ##### w || w 1s", - "...#### ||||||||||||||CCC ##||| ---| ### ||||||||| 41s", - "..|||z|C | C| B B |||||||||||| |CCC |```3 >|| ||CCC CCC|s", - "....s CB |||| CCC CC||#D | C||||| #```3 |#||||C C B|s", - ".... CC 4 CCC||B 4##||##3 ##|||###```||||||#3 ||#|####### 1s", + "....s||||###6 666 B##|| | | 444424##-- r ~~ ||| 6|| B66 1s", + "....#z|||##### ####66 # 4| |||||||-## --~~ |||## ## 1s", + "....#||------- |----|||||| | |##|| ~~~~~~~-| |||||w### 1s", + "....s||CCC 4 C C| ||||4 B | || || ~~~~~~~~~~---||||||||##- -|s", + "....sz|C | BC| CCC CCC | | B| ~~--~~~~ |```| | 4 1s", + "....3##||||| C| ||||| | | C|| ~~~~~~~~~~~ ||``| |BC C 1s", + "..###z1 ||||C CCC CC||| ##||| ~~~~~ | M||||`| | C C B|s", + "....sz14 | BC -- #|| ||||| |M|||||||||||CC CCC|s", + "....#z14 || C | #|| | ##||| w || w 1s", + "...#### ||||||||||||||CCC ##||| |---| |## |||||||||| 41s", + "..|||z|C | C| B B |||||||||||| |CCC||```3 >|| ||CCC CCC|s", + "....s CB |||| CCC CC||#D | C||||| |#```3 |#||||C C B|s", + ".... CC 4 CCC||B 4##||##3 ##|||#|#```||||||#3 ||#|####### 1s", ".... |||--22-||||||||||| ## ||||||||||||||| ||| ||||||||||||||s", - "....szzzzz|||zzzzzzz|||##| z## |||zzzzz###zzzz1111 ||##zzzzzzzzzzs", - "...##.......||......||.... ##...........||..##......|||||.............", + "....szzzzz|||zzzzzzz|||##| z## |||z||z|###zzzz1111 ||##zzzzzzzzzzs", + "...##.......||......||.... ##...........|||.##......|||||.............", ".#..sssssssssssssssssssssss 3sssssssssssssssssssssssss||sssssssssssssss" ], "set": [ @@ -85,12 +85,13 @@ { "item": "cleaning", "x": [ 11, 11 ], "y": [ 21, 22 ], "chance": 60 }, { "item": "cleaning", "x": [ 15, 15 ], "y": [ 21, 22 ], "chance": 60 } ], + "monster": { "M": { "monster": "mon_zombie_crushed_giant" } }, "place_monsters": [ - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 0, 23 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 24, 47 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 35 ], "y": [ 24, 47 ], "density": 1.5 } + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 24, 47 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 35 ], "y": [ 24, 47 ], "density": 2.5 } ] } }, @@ -123,32 +124,32 @@ "###################### ###############~~########|~~~~||| ~||||||||####", "###################### ||||||||||#|####~~#######|~~##| ~ |####", "#####||||||||||||||||| || |#############|~~~#| 6666|####", - "#####|xppCCppppCCppp6| #|## #### |# ~~~~~######|#~~#|22{{22222222|####", - "#####|xppppppppppppp6| #|# #### #|# ~#~~~######|####| 6666|####", - "#####|222222ppY66ppp6| |##########| # ~~~ # ~~~~## |####", - "#####|ppppp2ppppppppp|# ||| ## ##|# ~~#~~~~~~ #~~~# BB |####", - "#####|p//pp{ppppppppp3# 3##| ##| {~~~~~~~~~~~~~~~~##||||||BB#|| |####", - "#####|ppppp2ppppppppp3 3 #| # + { ## ########~~ #|######### |####", - "#####|222222ppY66ppp6| #|##|###| |||||||||||||||~~~~|###|# # |####", - "#####|xppppppppppppp6| |#|||||| ##|##########~~#|##~~|###|# # ##|####", - "#####|xppCCppppppppp6| |## ##| |#########~~~~~####||||||||||###|####", - "#####||||||||||#ppppp| #| # 66|# #|#~~~~~~~~~~~~~~~~#|########### |####", - "##############|#2{{22| + B|| ||######~~t~~~| ######## |####", + "#####|xppCCppppCCppp|| #|## #### |# ~~~~~######|#~~#|22{{22222222|####", + "#####|xppppppppppppp|| #|# #### #|# ~#~~~######|####| 6666|####", + "#####|222222ppY66ppp|| |##########| # ~~~ # ~~~~## |####", + "#####|ppppp2pppppppp||# ||| ## ##|# ~~#~~~~~~ #~~~# BB |####", + "#####|p//pp{pppppppp33# 3##| ##| {~~~~~~~~~~~~~~~~##||||||BB#|| |####", + "#####|ppppp2pppppppp33 3 #| # + { ## ########~~ #|######### |####", + "#####|222222ppY66ppp|| #|##|###| |||||||||||||||~~~~|###|# # |####", + "#####|xppppppppppppp|| |#|||||| ##|##########~~#|##~~|###|# # ##|####", + "#####|xppCCppppppppp|| |## ##| |#########~~~~~####||||||||||###|####", + "#####||||||||||#pppp|| #| # 66|# #|#~~~~~~~~~~~~~~~~#|########### |####", + "##############|#2{{2|| + B|| ||######~~t~~~| ######## |####", "################ppppr|# | | ##~~~~~~| |# #### |####", "#################pppr|33| ####|###|| ##### ~~~||33||## #|####", "###############pppppp|##||||###| ########~~~~~~~|# # 6#####|####", "################p##pR|# |######| # ##~~~~####|# #####|####", "#############||||||||| |######| ######~~~####| ##|#66#########|####", "#####################| | ####| ##~~######| ###||||||||||||||####", - "#####################| | #####| ###||| ||||||| 3 |#############", - "#####################| 3 ##| ##| 6 |###3~~ 3 |#############", - "####################|| |# | |B6 |###3 | |#############", + "#####################| | #####| ###||| ||||||| #3ppp|#############", + "#####################| 3 ##| ##| 6 |###3~~ 3ppp|#############", + "####################|| |# | |B6 |### |ppp|#############", "#####||||||||||||||||# |######| | 6 ||||| |||||#############", - "##### # |R |# |######||| + ##### w ||#############", + "##### # |R |# |######||| + ##### #wpp||#############", "#########|####### #|| ||| ## + #||||| |||||||############", - "#########|###### ## # + # |# #| 3 3 ||#############", - "#########|####### ### + # ######|||###| 3 ||||||#############", - "#########|######## ||||||| #||||||||# #| ||||||###################", + "#########|###### ## # + # |# #|ppp3 3ppp||#############", + "#########|####### ### + # ######|||###|ppp## ||||||#############", + "#########|######## ||||||| #||||||||# #|ppp|##|||###################", "#########|## R|##### ########| ||||||||#####################", "#########||||||||||||####### ########| ||############################", "#####################################||||||#############################", @@ -182,13 +183,14 @@ { "item": "cleaning", "x": [ 15, 15 ], "y": [ 21, 22 ], "chance": 60 } ], "place_monster": [ { "monster": "mon_tripod", "x": [ 12, 13 ], "y": [ 20, 23 ] } ], + "monster": { " ": { "monster": "mon_zombie_living_wall", "chance": 20 } }, "place_monsters": [ - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 0, 19 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 27, 47 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 24, 47 ], "density": 1.5 }, - { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 24, 47 ], "density": 1.5 } + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 0, 15 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 0, 23 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 0, 23 ], "y": [ 37, 47 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 24, 47 ], "y": [ 24, 47 ], "density": 2.5 }, + { "monster": "GROUP_COLLAPSED_TOWER", "x": [ 48, 71 ], "y": [ 24, 47 ], "density": 2.5 } ] } } diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index 7e7c9b452595d..5344c40daab26 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -46,5 +46,42 @@ "min_duration": 1000, "max_duration": 10000, "duration_increment": 2000 + }, + { + "type": "SPELL", + "id": "mon_summon_zombie_gasbag_crawler", + "name": "Summon Gangrenous Crawlers", + "description": "Summons 2 permanent gangrenous crawlers.", + "flags": [ "HOSTILE_SUMMON", "PERMANENT" ], + "valid_targets": [ "ground", "self" ], + "max_level": 1, + "min_damage": 1, + "max_damage": 1, + "min_range": 0, + "max_range": 0, + "min_aoe": 3, + "max_aoe": 3, + "base_casting_time": 3, + "effect": "summon", + "effect_str": "mon_zombie_gasbag_crawler" + }, + { + "type": "SPELL", + "id": "crushed_giant_summoning", + "name": "Summon Gangrenous Monsters", + "description": "Summons 2 permanent gangrenous impalers.", + "flags": [ "HOSTILE_SUMMON", "PERMANENT" ], + "valid_targets": [ "ground" ], + "extra_effects": [ { "id": "mon_summon_zombie_gasbag_crawler" } ], + "max_level": 1, + "min_damage": 1, + "max_damage": 1, + "min_range": 0, + "max_range": 0, + "min_aoe": 3, + "max_aoe": 3, + "base_casting_time": 3, + "effect": "summon", + "effect_str": "mon_zombie_gasbag_impaler" } ] diff --git a/data/json/monsters/monsters.json b/data/json/monsters/monsters.json index c365dffecbffa..d64523d03a9cf 100644 --- a/data/json/monsters/monsters.json +++ b/data/json/monsters/monsters.json @@ -3892,12 +3892,107 @@ "melee_skill": 3, "melee_dice": 2, "melee_dice_sides": 4, - "melee_cut": 0, - "vision_night": 3, + "melee_cut": 2, + "armor_bash": 6, + "armor_cut": 6, + "vision_night": 50, "harvest": "exempt", "special_attacks": [ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true }, [ "scratch", 5 ] ], "death_function": [ "GAS" ], - "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "POISON", "NO_BREATHE", "CLIMBS", "HARDTOSHOOT" ] + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "POISON", "CLIMBS", "NO_BREATHE", "CLIMBS", "HARDTOSHOOT" ] + }, + { + "id": "mon_zombie_gasbag_impaler", + "type": "MONSTER", + "name": "gangrenous impaler", + "description": "A corpse hideously twisted into an insect-like form. A hollow tendril reaches out from its open thorax.", + "default_faction": "zombie", + "bodytype": "spider", + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 14, + "volume": "30000 ml", + "weight": 40750, + "hp": 30, + "speed": 12, + "material": [ "flesh" ], + "symbol": "w", + "color": "yellow_yellow", + "aggression": 100, + "morale": 100, + "melee_skill": 3, + "melee_dice": 2, + "melee_dice_sides": 4, + "melee_cut": 0, + "vision_night": 30, + "armor_bash": 6, + "armor_cut": 6, + "harvest": "exempt", + "starting_ammo": { "barb_paralysis": 100 }, + "special_attacks": [ + { + "type": "gun", + "cooldown": 2, + "gun_type": "barb_launcher", + "ranges": [ [ 2, 12, "DEFAULT" ] ], + "description": "The impaler launches a barb!" + }, + { "type": "leap", "cooldown": 15, "max_range": 2, "allow_no_target": true }, + [ "scratch", 5 ] + ], + "death_function": [ "GAS" ], + "flags": [ "SEES", "HEARS", "SMELLS", "WARM", "POISON", "CLIMBS", "NO_BREATHE", "CLIMBS", "HARDTOSHOOT" ] + }, + { + "id": "mon_zombie_crushed_giant", + "type": "MONSTER", + "name": "trapped tendril", + "description": "A great tendril of mutated flesh and sharpened bone. Emergent from a crevice in the ruined floor, hundreds of human limbs seek freedom and writhe incessantly from underneath its grotesque carapace. As enormous as it may already be, you feel certain that this is just part of a creature much bigger, for when it moves, you can feel this whole ruin tremble, as if an unseen giant struggled against the weight of its concrete tomb.", + "default_faction": "zombie", + "volume": "875000 ml", + "weight": 200000, + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 35, + "hp": 500, + "speed": 100, + "material": [ "flesh" ], + "symbol": "S", + "color": "red_yellow", + "aggression": 100, + "morale": 100, + "melee_skill": 7, + "melee_dice": 6, + "melee_dice_sides": 4, + "melee_cut": 10, + "vision_day": 60, + "vision_night": 60, + "harvest": "exempt", + "special_attacks": [ [ "FLESH_TENDRIL", 1 ] ], + "death_function": [ "GAS" ], + "flags": [ "SEES", "HEARS", "SMELLS", "IMMOBILE", "WARM", "POISON", "IMMOBILE", "NO_BREATHE", "FILTHY" ] + }, + { + "id": "mon_zombie_living_wall", + "type": "MONSTER", + "name": "flesh wall", + "description": "A great lump of mutated flesh. It resembles the innards of some gigantic creature and is covered in a grid of diminutive veins.", + "default_faction": "zombie", + "volume": "875000 ml", + "weight": 200000, + "species": [ "ZOMBIE", "HUMAN" ], + "diff": 1, + "hp": 3, + "speed": 100, + "material": [ "flesh" ], + "symbol": "#", + "color": "red_yellow", + "morale": 10, + "vision_day": 60, + "vision_night": 60, + "armor_bash": 50, + "armor_cut": 25, + "harvest": "exempt", + "death_function": [ "NORMAL" ], + "flags": [ "SEES", "HEARS", "SMELLS", "IMMOBILE", "WARM", "POISON", "IMMOBILE", "NO_BREATHE", "FILTHY" ] }, { "id": "mon_zombie_gasbag_fungus", diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index be0bd5c3c706f..3426c08f5660b 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -962,25 +962,6 @@ { "point": [ 2, 1, 0 ], "overmap": "office_tower_2_b3_north" } ] }, - { - "type": "city_building", - "id": "office_tower_collapsed", - "locations": [ "land" ], - "overmaps": [ - { "point": [ 0, 0, 0 ], "overmap": "office_tower_collapse_a0_north" }, - { "point": [ 1, 0, 0 ], "overmap": "office_tower_collapse_a1_north" }, - { "point": [ 2, 0, 0 ], "overmap": "office_tower_collapse_a2_north" }, - { "point": [ 0, 1, 0 ], "overmap": "office_tower_collapse_b0_north" }, - { "point": [ 1, 1, 0 ], "overmap": "office_tower_collapse_b1_north" }, - { "point": [ 2, 1, 0 ], "overmap": "office_tower_collapse_b2_north" }, - { "point": [ 0, 0, -1 ], "overmap": "office_tower_collapse_b_a0_north" }, - { "point": [ 1, 0, -1 ], "overmap": "office_tower_collapse_b_a1_north" }, - { "point": [ 2, 0, -1 ], "overmap": "office_tower_collapse_b_a2_north" }, - { "point": [ 0, 1, -1 ], "overmap": "office_tower_collapse_b_b0_north" }, - { "point": [ 1, 1, -1 ], "overmap": "office_tower_collapse_b_b1_north" }, - { "point": [ 2, 1, -1 ], "overmap": "office_tower_collapse_b_b2_north" } - ] - }, { "type": "city_building", "id": "office_tower_hiddenlab", diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index e22cc31730153..642fe5d90395b 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -129,9 +129,9 @@ { "point": [ 2, 1, -1 ], "overmap": "office_tower_collapse_b_b2_north" } ], "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road" }, { "point": [ 2, -1, 0 ], "terrain": "road" } ], - "city_distance": [ 0, 1 ], + "city_distance": [ 0, 25 ], "locations": [ "land" ], - "city_sizes": [ 0, 12 ], + "city_sizes": [ 0, 16 ], "occurrences": [ 0, 0 ] }, { diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 443f90aaee080..848917357611c 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -685,6 +685,7 @@ "office_doctor": 200, "office_doctor_1": 200, "office_doctor_2": 200, + "office_tower_collapsed": 250, "s_restaurant_fast": 400, "s_restaurant_fast_1": 400, "s_restaurant_coffee": 200, diff --git a/src/creature.cpp b/src/creature.cpp index 8cdd92008f948..2ef1a7f130fe6 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -51,6 +51,8 @@ const efftype_id effect_no_sight( "no_sight" ); const efftype_id effect_riding( "riding" ); const efftype_id effect_ridden( "ridden" ); const efftype_id effect_tied( "tied" ); +const efftype_id effect_paralyzepoison( "paralyzepoison" ); + const std::map Creature::size_map = { {"TINY", MS_TINY}, {"SMALL", MS_SMALL}, {"MEDIUM", MS_MEDIUM}, @@ -718,6 +720,10 @@ void Creature::deal_projectile_attack( Creature *source, dealt_projectile_attack if( proj_effects.count( "APPLY_SAP" ) ) { add_effect( effect_sap, 1_turns * dealt_dam.total_damage() ); } + if( proj_effects.count( "PARALYZEPOISON" ) && dealt_dam.total_damage() > 0 ) { + add_msg_if_player( m_bad, _( "You feel poison coursing through your body!" ) ); + add_effect( effect_paralyzepoison, 5_minutes ); + } int stun_strength = 0; if( proj.proj_effects.count( "BEANBAG" ) ) { diff --git a/src/monattack.cpp b/src/monattack.cpp index f3b2a25b33add..a9a1a2f9cc86f 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -98,6 +98,8 @@ const mtype_id mon_headless_dog_thing( "mon_headless_dog_thing" ); const mtype_id mon_manhack( "mon_manhack" ); const mtype_id mon_shadow( "mon_shadow" ); const mtype_id mon_triffid( "mon_triffid" ); +const mtype_id mon_zombie_gasbag_impaler( "mon_zombie_gasbag_impaler" ); +const mtype_id mon_zombie_gasbag_crawler( "mon_zombie_gasbag_crawler" ); const mtype_id mon_turret_searchlight( "mon_turret_searchlight" ); const mtype_id mon_zombie_dancer( "mon_zombie_dancer" ); const mtype_id mon_zombie_jackson( "mon_zombie_jackson" ); @@ -2561,8 +2563,13 @@ bool mattack::ranged_pull( monster *z ) } } if( seen ) { - add_msg( _( "The %1$s's arms fly out and pull and grab %2$s!" ), z->name(), - target->disp_name() ); + if( z->type->bodytype == "human" || z->type->bodytype == "angel" ) { + add_msg( _( "The %1$s's arms fly out and pull and grab %2$s!" ), z->name(), + target->disp_name() ); + } else { + add_msg( _( "The %1$s reaches out and pulls %2$s!" ), z->name(), + target->disp_name() ); + } } const int prev_effect = target->get_effect_int( effect_grabbed ); @@ -4666,6 +4673,73 @@ bool mattack::riotbot( monster *z ) return true; } +bool mattack::flesh_tendril( monster *z ) +{ + Creature *target = z->attack_target(); + + if( target == nullptr || !z->sees( *target ) ) { + if( one_in( 70 ) ) { + add_msg( _( "The floor trembles underneath your feet." ) ); + z->moves -= 200; + sounds::sound( z->pos(), 60, sounds::sound_t::alert, _( "a deafening roar!" ), false, "shout", + "roar" ); + } + return false; + } + + const int distance_to_target = rl_dist( z->pos(), target->pos() ); + + // the monster summons stuff to fight you + if( distance_to_target > 3 && one_in( 12 ) ) { + std::vector free; + + for( const tripoint &dest : g->m.points_in_radius( z->pos(), 1 ) ) { + if( g->is_empty( dest ) ) { + free.push_back( dest ); + } + } + if( !free.empty() ) { + mtype_id spawned = mon_zombie_gasbag_crawler; + if( one_in( 2 ) ) { + spawned = mon_zombie_gasbag_impaler; + } + + z->moves -= 100; + const tripoint target = random_entry( free ); + if( monster *const summoned = g->summon_mon( spawned, target ) ) { + summoned->make_ally( *z ); + g->m.propagate_field( z->pos(), fd_gibs_flesh, 75, 1 ); + if( g->u.sees( *z ) ) { + add_msg( m_warning, _( "A %s struggles to pull itself free from the %s!" ), summoned->name(), + z->name() ); + } + } + return true; + } + } + + if( ( distance_to_target == 2 || distance_to_target == 3 ) && one_in( 4 ) ) { + //it pulls you towards itself and then knocks you away + bool pulled = ranged_pull( z ); + if( pulled && one_in( 4 ) ) { + sounds::sound( z->pos(), 60, sounds::sound_t::alarm, _( "a deafening roar!" ), false, "shout", + "roar" ); + } + return pulled; + } + + if( distance_to_target <= 1 ) { + if( one_in( 8 ) ) { + g->fling_creature( target, coord_to_angle( z->pos(), target->pos() ), + z->type->melee_sides * z->type->melee_dice * 3 ); + } else { + grab( z ); + } + } + + return false; +} + bool mattack::bio_op_takedown( monster *z ) { if( !z->can_act() ) { diff --git a/src/monattack.h b/src/monattack.h index d53488ac700df..947528175c147 100644 --- a/src/monattack.h +++ b/src/monattack.h @@ -83,6 +83,7 @@ bool parrot( monster *z ); bool parrot_at_danger( monster *parrot ); bool darkman( monster *z ); bool slimespring( monster *z ); +bool flesh_tendril( monster *z ); bool bio_op_takedown( monster *z ); bool ranged_pull( monster *z ); bool grab( monster *z ); diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 068f344c2e753..5bf74937680f9 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -525,6 +525,7 @@ void MonsterGenerator::init_attack() add_hardcoded_attack( "PARROT_AT_DANGER", mattack::parrot_at_danger ); add_hardcoded_attack( "DARKMAN", mattack::darkman ); add_hardcoded_attack( "SLIMESPRING", mattack::slimespring ); + add_hardcoded_attack( "FLESH_TENDRIL", mattack::flesh_tendril ); add_hardcoded_attack( "BIO_OP_TAKEDOWN", mattack::bio_op_takedown ); add_hardcoded_attack( "SUICIDE", mattack::suicide ); add_hardcoded_attack( "KAMIKAZE", mattack::kamikaze );