From 890fb4e0f873ea75ffc8b68193d45d34aea4ed8b Mon Sep 17 00:00:00 2001 From: Chaosvolt Date: Wed, 31 Jan 2024 11:27:29 -0600 Subject: [PATCH 1/6] feat(content): nether updates part 1 --- .../External_Tileset_DP_Normal.json | 3 +- .../External_Tileset_DP_Normal.png | Bin 43084 -> 44990 bytes data/json/monster_factions.json | 9 +- data/json/monster_special_attacks/spells.json | 34 ++++++ data/json/monsterdrops/misc.json | 20 ++++ data/json/monstergroups/nether.json | 15 ++- data/json/monsters/nether.json | 106 +++++++++++++++--- data/json/monsters/slimes.json | 3 +- src/monattack.cpp | 3 +- src/monster.cpp | 33 +++--- src/monstergenerator.cpp | 1 + src/mtype.h | 1 + 12 files changed, 184 insertions(+), 44 deletions(-) diff --git a/data/json/external_tileset/External_Tileset_DP_Normal.json b/data/json/external_tileset/External_Tileset_DP_Normal.json index 964a23bbf10b..bc172447203c 100644 --- a/data/json/external_tileset/External_Tileset_DP_Normal.json +++ b/data/json/external_tileset/External_Tileset_DP_Normal.json @@ -57,7 +57,8 @@ { "id": "cacao_pod", "fg": 46 }, { "id": "overlay_wielded_cacao_pod", "fg": 46 }, { "id": "f_sign", "fg": 47 }, - { "id": "tr_can_alarm", "fg": 48 } + { "id": "tr_can_alarm", "fg": 48 }, + { "id": "mon_mothman", "fg": 49 } ], "sprite_width": 32, "sprite_height": 32 diff --git a/data/json/external_tileset/External_Tileset_DP_Normal.png b/data/json/external_tileset/External_Tileset_DP_Normal.png index 2f6da180b96428a4fac42eac45afb2164ed9f31f..91096c4e200d958d45ec4baf0a377cd7756ac394 100644 GIT binary patch delta 9779 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 R<=>tGQkGYjtCTSh`yck=k3IkZ diff --git a/data/json/monster_factions.json b/data/json/monster_factions.json index 62d694d1d517..421b038623f3 100644 --- a/data/json/monster_factions.json +++ b/data/json/monster_factions.json @@ -18,14 +18,14 @@ "type": "MONSTER_FACTION", "name": "zombie", "friendly": [ "blob", "cult", "zombie_aquatic" ], - "neutral": [ "small_animal", "insect", "fish" ], + "neutral": [ "small_animal", "insect", "fish", "nether" ], "by_mood": "bee" }, { "type": "MONSTER_FACTION", "name": "zombie_aquatic", "friendly": [ "blob", "cult", "zombie" ], - "neutral": [ "small_animal", "insect" ], + "neutral": [ "small_animal", "insect", "nether" ], "by_mood": "bee" }, { @@ -36,7 +36,8 @@ { "type": "MONSTER_FACTION", "name": "nether", - "friendly": [ "blob", "cult" ] + "friendly": [ "blob", "cult" ], + "neutral": [ "zombie", "zombie_aquatic", "science" ] }, { "type": "MONSTER_FACTION", @@ -75,7 +76,7 @@ "type": "MONSTER_FACTION", "name": "science", "base_faction": "zombie", - "neutral": [ "bot" ] + "neutral": [ "bot", "nether" ] }, { "type": "MONSTER_FACTION", diff --git a/data/json/monster_special_attacks/spells.json b/data/json/monster_special_attacks/spells.json index da63392d4628..7a8aad44b7b0 100644 --- a/data/json/monster_special_attacks/spells.json +++ b/data/json/monster_special_attacks/spells.json @@ -149,5 +149,39 @@ "max_range": 25, "min_aoe": 4, "max_aoe": 4 + }, + { + "id": "spell_mothman_ninja_vanish", + "type": "SPELL", + "name": { "str": "Creeping Darkness" }, + "description": "This is a monster spell, used by the lepidopterid.", + "message": "", + "effect": "target_attack", + "effect_str": "blind", + "extra_effects": [ { "id": "spell_mothman_ninja_vanish_teleport" } ], + "valid_targets": [ "hostile", "ground" ], + "flags": [ "NO_EXPLOSION_VFX", "SILENT" ], + "min_range": 1, + "max_range": 1, + "min_aoe": 6, + "max_aoe": 6, + "min_duration": 1000, + "max_duration": 2000, + "field_id": "fd_shadow", + "field_chance": 1, + "min_field_intensity": 1, + "max_field_intensity": 1 + }, + { + "type": "SPELL", + "id": "spell_mothman_ninja_vanish_teleport", + "name": { "str": "Creeping Darkness Teleport" }, + "description": "And this teleports the caster, counts as a safe teleport.", + "message": "", + "effect": "teleport_random", + "valid_targets": [ "self" ], + "flags": [ "NO_EXPLOSION_VFX", "SILENT" ], + "min_range": 20, + "max_range": 40 } ] diff --git a/data/json/monsterdrops/misc.json b/data/json/monsterdrops/misc.json index 3dc507967c58..5c048c30dafa 100644 --- a/data/json/monsterdrops/misc.json +++ b/data/json/monsterdrops/misc.json @@ -21,5 +21,25 @@ { "item": "cable", "charges-min": 20, "charges-max": 50 }, { "item": "amplifier", "count": [ 0, 3 ] } ] + }, + { + "type": "item_group", + "id": "mon_gozu_death_drops", + "subtype": "collection", + "entries": [ + { + "distribution": [ + { "group": "male_underwear_bottom", "prob": 50, "damage": [ 1, 4 ] }, + { "group": "loincloth", "prob": 50, "damage": [ 1, 4 ] } + ] + }, + { + "distribution": [ + { "group": "male_underwear_top", "prob": 25, "damage": [ 1, 4 ] }, + { "item": "rag", "prob": 25, "damage": [ 1, 4 ], "count": [ 1, 4 ] } + ], + "prob": 50 + } + ] } ] diff --git a/data/json/monstergroups/nether.json b/data/json/monstergroups/nether.json index 01d41e6bd046..4deff5fe8e0f 100644 --- a/data/json/monstergroups/nether.json +++ b/data/json/monstergroups/nether.json @@ -32,16 +32,17 @@ "name": "GROUP_NETHER_FATIGUE_FIELD", "default": "mon_blank", "monsters": [ - { "monster": "mon_flying_polyp", "freq": 100, "cost_multiplier": 0 }, - { "monster": "mon_hunting_horror", "freq": 100, "cost_multiplier": 0 }, + { "monster": "mon_flying_polyp", "freq": 50, "cost_multiplier": 0 }, + { "monster": "mon_hunting_horror", "freq": 50, "cost_multiplier": 0 }, { "monster": "mon_mi_go", "freq": 100, "cost_multiplier": 0 }, - { "monster": "mon_mi_go_scout", "freq": 100, "cost_multiplier": 0, "starts": 840 }, + { "monster": "mon_mi_go_scout", "freq": 50, "cost_multiplier": 0, "starts": 840 }, { "monster": "mon_yugg", "freq": 100, "cost_multiplier": 0 }, { "monster": "mon_gelatin", "freq": 100, "cost_multiplier": 0 }, { "monster": "mon_flaming_eye", "freq": 100, "cost_multiplier": 0 }, { "monster": "mon_kreck", "freq": 100, "cost_multiplier": 0 }, { "monster": "mon_gracke", "freq": 100, "cost_multiplier": 0 }, - { "monster": "mon_blank", "freq": 100, "cost_multiplier": 0 } + { "monster": "mon_blank", "freq": 100, "cost_multiplier": 0 }, + { "monster": "mon_mothman", "freq": 100, "cost_multiplier": 0 } ] }, { @@ -56,7 +57,8 @@ { "monster": "mon_flaming_eye", "freq": 120, "cost_multiplier": 0 }, { "monster": "mon_kreck", "freq": 210, "cost_multiplier": 0 }, { "monster": "mon_gozu", "freq": 25, "cost_multiplier": 0 }, - { "monster": "mon_shoggoth", "freq": 5, "cost_multiplier": 0 } + { "monster": "mon_shoggoth", "freq": 5, "cost_multiplier": 0 }, + { "monster": "mon_mothman", "freq": 60, "cost_multiplier": 0 } ] }, { @@ -80,7 +82,8 @@ { "monster": "mon_flaming_eye", "freq": 200, "cost_multiplier": 0 }, { "monster": "mon_kreck", "freq": 200, "cost_multiplier": 0 }, { "monster": "mon_gracke", "freq": 200, "cost_multiplier": 0 }, - { "monster": "mon_blank", "freq": 200, "cost_multiplier": 0 } + { "monster": "mon_blank", "freq": 150, "cost_multiplier": 0 }, + { "monster": "mon_mothman", "freq": 50, "cost_multiplier": 0 } ] }, { diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json index 260156f9bf84..25afd34d6139 100644 --- a/data/json/monsters/nether.json +++ b/data/json/monsters/nether.json @@ -65,7 +65,7 @@ "id": "mon_blank", "type": "MONSTER", "name": { "str": "blank body", "str_pl": "blank bodies" }, - "description": "This is some form of unnatural changeling creature; its appearance is a bland mockery of the human form. Featureless and pale, its repugnant countenance is all the more unsettling due to its lack of eyes and distinguishing features except for a perfectly round mouth. Naked and trembling, it almost seems pitiful but for the way that its unearthly presence makes the hair on the back of your neck stand up in nameless horror.", + "description": "This is some form of unnatural changeling creature; its appearance is a bland mockery of the human form. Featureless and pale, its repugnant countenance is all the more unsettling due to its lack of eyes and distinguishing features except for a perfectly round mouth. Naked and trembling, it almost seems pitiful.", "default_faction": "nether", "bodytype": "human", "species": [ "NETHER" ], @@ -84,9 +84,10 @@ "melee_cut": 0, "dodge": 1, "harvest": "human", - "special_attacks": [ [ "SHRIEK", 10 ] ], + "special_attacks": [ [ "SHRIEK", 10 ], { "type": "bite", "cooldown": 10 } ], + "anger_triggers": [ "NETHER_ATTENTION" ], "death_function": [ "NORMAL" ], - "flags": [ "SMELLS", "HEARS", "WARM", "ANIMAL", "PATH_AVOID_DANGER_1", "SUNDEATH", "NO_BREATHE", "HUMAN" ] + "flags": [ "SMELLS", "HEARS", "WARM", "ANIMAL", "PATH_AVOID_DANGER_1", "SUNDEATH", "NO_BREATHE", "HUMAN", "GRABS" ] }, { "id": "mon_blood_sacrifice", @@ -129,10 +130,13 @@ "symbol": "o", "color": "pink", "melee_cut": 0, + "armor_bash": 6, + "armor_stab": 10, + "armor_acid": 10, "harvest": "exempt", "special_attacks": [ [ "BREATHE", 8 ] ], "death_function": [ "MELT" ], - "flags": [ "IMMOBILE", "NOGIB" ] + "flags": [ "IMMOBILE", "NOGIB", "NOHEAD" ] }, { "id": "mon_breather_hub", @@ -149,10 +153,16 @@ "symbol": "O", "color": "pink", "melee_cut": 0, + "armor_bash": 14, + "armor_cut": 4, + "armor_bullet": 3, + "armor_stab": 20, "harvest": "exempt", + "regenerates": 1, + "emit_fields": [ { "emit_id": "emit_hot_air4_blast", "delay": "8 s" } ], "special_attacks": [ [ "BREATHE", 8 ] ], "death_function": [ "KILL_BREATHERS" ], - "flags": [ "ACIDPROOF", "ACID_BLOOD", "IMMOBILE" ] + "flags": [ "ACIDPROOF", "ACID_BLOOD", "IMMOBILE", "NOGIB", "NOHEAD", "PLASTIC" ] }, { "id": "mon_darkman", @@ -182,6 +192,7 @@ "luminance": 6, "harvest": "exempt", "special_attacks": [ [ "DARKMAN", 5 ], [ "scratch", 15 ] ], + "anger_triggers": [ "NETHER_ATTENTION" ], "death_function": [ "DARKMAN" ], "regenerates_in_dark": true, "flags": [ "NOHEAD", "HARDTOSHOOT", "WEBWALK", "FLIES", "PLASTIC", "COLDPROOF", "ACIDPROOF", "SUNDEATH", "NO_BREATHE" ] @@ -245,7 +256,7 @@ "id": "mon_flaming_eye", "type": "MONSTER", "name": { "str": "flaming eye" }, - "description": "An enormous disembodied eyeball the size of a person, flying through the air through some unknown agency. Wreathed in unnatural flickering blue flame, it possesses a blazing yellow iris with a slitted pupil like that of a cat and trails a set of flailing black tendrils as it slowly drifts about; its unearthly presence filling you with dread at the prospect of falling under its baleful gaze.", + "description": "An enormous disembodied eyeball the size of a person, flying through the air through some unknown agency. Wreathed in unnatural flickering blue flame, it possesses a blazing yellow iris with a slitted pupil like that of a cat and trails a set of flailing black tendrils as it slowly drifts about. A baleful gaze seems to emanate from it.", "default_faction": "nether", "species": [ "NETHER" ], "diff": 20, @@ -301,7 +312,7 @@ "id": "mon_flying_polyp", "type": "MONSTER", "name": { "str": "flying polyp" }, - "description": "A half polypous, utterly alien creature. It's only partly material and has the ability to fly, despite the absence of wings. It produces strange whistling noises which send cold shivers of primal terror down your spine.", + "description": "A half polypous, utterly alien creature. It's only partly material and has the ability to fly, despite the absence of wings. The air swirling around it gives the impression of breathing or whistling, in a tone too high for most humans to hear.", "default_faction": "nether", "bodytype": "blob", "species": [ "NETHER" ], @@ -329,7 +340,7 @@ "id": "mon_gozu", "type": "MONSTER", "name": { "str": "gozu" }, - "description": "This is some sort of unnatural cross between a bull and a man. Quite different from the minotaur of legend, it possesses a shaggy white bull’s head on an otherwise unremarkable human body. Clad in sagging socks and stained jockey shorts, it grunts and snuffles, drooling ropey strands of white slobber down its chest. Its mere presence fills you with an unfathomable dread.", + "description": "This is some sort of unnatural cross between a bull and a man. Quite different from the minotaur of legend, it possesses a shaggy white bull’s head on an otherwise unremarkable human body. Clad in tattered remnants of clothing, it grunts and snuffles, frothing at the mouth like a rabid animal.", "default_faction": "nether", "bodytype": "human", "species": [ "NETHER" ], @@ -351,6 +362,7 @@ "vision_day": 30, "harvest": "gozu", "special_attacks": [ [ "FEAR_PARALYZE", 20 ] ], + "death_drops": "mon_gozu_death_drops", "death_function": [ "NORMAL" ], "flags": [ "SEES", @@ -369,7 +381,7 @@ "id": "mon_gracke", "type": "MONSTER", "name": { "str": "gracken" }, - "description": "This is some form of eldritch monstrosity; an uncouth black being with smooth, oily, skin and unpleasant horns that curve inward toward each other. Tall and thin, the shadows cling unnaturally to its vaguely defined humanoid form as it shuffles along, its hands twitching and spasming so rapidly as to appear a little more than a black blur of claws. Gazing upon its disturbing form fills you with an unspeakable terror.", + "description": "This is some form of eldritch monstrosity; an uncouth black being with smooth, oily, skin and unpleasant horns that curve inward toward each other. Tall and thin, the shadows cling unnaturally to its vaguely defined humanoid form as it shuffles along, its hands twitching and spasming so rapidly as to appear a little more than a black blur of claws.", "default_faction": "nether", "bodytype": "human", "species": [ "NETHER" ], @@ -385,11 +397,16 @@ "melee_skill": 10, "melee_dice": 4, "melee_dice_sides": 4, - "melee_cut": 0, + "melee_cut": 2, "dodge": 4, + "vision_night": 10, "harvest": "human", "death_function": [ "NORMAL" ], - "flags": [ "SMELLS", "HEARS", "WARM", "NO_BREATHE", "GRABS", "HUMAN", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS" ] + "anger_triggers": [ "NETHER_ATTENTION" ], + "special_attacks": [ + { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 8, "armor_multiplier": 0.8 } ] } + ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "NO_BREATHE", "GRABS", "HUMAN", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS" ] }, { "id": "mon_headless_dog_thing", @@ -571,7 +588,7 @@ "id": "mon_hunting_horror", "type": "MONSTER", "name": { "str": "hunting horror" }, - "description": "This is some sort of great viperine creature, possessed of a curiously distorted head and massive clawed appendages. It partially supports itself with the aid of black rubbery wings of monstrous dimensions. Its form writhes and changes before your eyes, filling you with unnameable horror.", + "description": "This is some sort of great viperine creature, possessed of a curiously distorted head and massive clawed appendages. It partially supports itself with the aid of black rubbery wings of monstrous dimensions.", "default_faction": "nether", "species": [ "NETHER" ], "volume": "62500 ml", @@ -609,7 +626,7 @@ "id": "mon_kreck", "type": "MONSTER", "name": { "str": "kreck" }, - "description": "This is some form of otherworldly hound. Lean and hungry looking, its twisted red flesh is stretched tightly across its misshapen, angular frame. Loping grotesquely along, its unusually long neck stretches forward, its skull-like head near the ground as it sniffs out its prey. Its foulness partially veiled by some arcane force, it seems to almost flicker in and out of your perceptions in a fashion that awakens ancient nameless terrors in the back of your mind", + "description": "This is some form of otherworldly hound. Lean and hungry looking, its twisted red flesh is stretched tightly across its misshapen, angular frame. Loping grotesquely along, its unusually long neck stretches forward, its skull-like head near the ground as it sniffs out its prey.", "default_faction": "nether", "bodytype": "quadruped", "species": [ "NETHER" ], @@ -635,11 +652,68 @@ "death_function": [ "MELT" ], "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "BASHES", "HIT_AND_RUN", "NO_BREATHE", "NOGIB" ] }, + { + "id": "mon_mothman", + "type": "MONSTER", + "name": { "str": "lepidopterid" }, + "description": "A humanoid figure flitting about on what appears to be multiple pairs of insectoid wings. Its outline is obscured by a pitch-black haze surrounding it, a faint glimmer of glowing eyes evident.", + "default_faction": "nether", + "bodytype": "angel", + "species": [ "NETHER" ], + "diff": 10, + "volume": "92500 ml", + "weight": "120 kg", + "hp": 300, + "speed": 200, + "material": [ "iflesh" ], + "symbol": "M", + "color": "dark_gray", + "looks_like": "mon_zombie_necro", + "morale": 100, + "melee_skill": 7, + "melee_dice": 3, + "melee_dice_sides": 4, + "melee_cut": 5, + "dodge": 5, + "armor_bash": 8, + "armor_cut": 16, + "armor_bullet": 20, + "vision_day": 20, + "vision_night": 50, + "path_settings": { "max_dist": 5 }, + "death_function": [ "MELT" ], + "anger_triggers": [ "NETHER_ATTENTION" ], + "harvest": "exempt", + "regenerates_in_dark": true, + "special_attacks": [ + { "type": "leap", "cooldown": 10, "max_range": 5 }, + [ "SHRIEK_ALERT", 10 ], + [ "SHRIEK_STUN", 1 ], + { + "type": "spell", + "spell_data": { "id": "spell_mothman_ninja_vanish" }, + "cooldown": 100, + "monster_message": "Creeping darkness radiates from %s!" + } + ], + "flags": [ + "SEES", + "SMELLS", + "KEENNOSE", + "PATH_AVOID_DANGER_2", + "FLIES", + "HARDTOSHOOT", + "WEBWALK", + "NO_BREATHE", + "COLDPROOF", + "NIGHT_INVISIBILITY" + ] + }, { "id": "mon_shadow", "type": "MONSTER", "name": { "str": "shadow" }, - "description": "This is an animate shadow. Looking like nothing more than an errant patch of normal shadow, it draws your attention by the way it moves subtly and whispers softly in the back of your mind. Strange intrusive thoughts accompany the quiet murmur, awakening your most horrific memories and fears.", + "description": "This is an animate shadow. Looking like nothing more than an errant patch of normal shadow, it draws your attention by the way it moves subtly and whispers softly in the back of your mind. Strange intrusive thoughts accompany its quiet murmurs.", "default_faction": "nether", "species": [ "NETHER" ], "diff": 2, @@ -799,7 +873,7 @@ "id": "mon_yugg", "type": "MONSTER", "name": { "str": "yugg" }, - "description": "This is a huge, slimy worm-like creature. Its pale, flattened head drips an oily mucus as it breaches the ground, searching for prey. Its pinkish mouth opens and closes, revealing long fangs glistening with ropey strands of saliva, which leave smoldering stains wherever they drip. The mere sight of its putrid whitish visage is enough to loose prehistoric terrors within the darkest recesses of your mind.", + "description": "This is a huge, slimy worm-like creature. Its pale, flattened head drips an oily mucus as it breaches the ground, searching for prey. Its pinkish mouth opens and closes, revealing long fangs glistening with ropey strands of saliva, which leave smoldering stains wherever they drip.", "default_faction": "nether", "bodytype": "snake", "species": [ "NETHER" ], @@ -822,7 +896,7 @@ "harvest": "meatslug", "special_attacks": [ [ "GENE_STING", 20 ] ], "death_function": [ "NORMAL" ], - "flags": [ "SEES", "SMELLS", "HEARS", "BASHES", "DESTROYS", "POISON", "VENOM", "NO_BREATHE", "DIGS" ] + "flags": [ "SEES", "SMELLS", "HEARS", "BASHES", "DESTROYS", "POISON", "VENOM", "NO_BREATHE", "CAN_DIG" ] }, { "id": "mon_vortex", diff --git a/data/json/monsters/slimes.json b/data/json/monsters/slimes.json index 511708c02989..0db236175256 100644 --- a/data/json/monsters/slimes.json +++ b/data/json/monsters/slimes.json @@ -138,11 +138,12 @@ "melee_skill": 4, "melee_dice": 2, "melee_dice_sides": 3, - "melee_cut": 0, + "melee_damage": [ { "damage_type": "acid", "amount": 5 } ], "armor_bash": 10, "harvest": "exempt", "special_attacks": [ [ "FORMBLOB", 4 ] ], "death_function": [ "MELT" ], + "anger_triggers": [ "NETHER_ATTENTION" ], "flags": [ "SMELLS", "HEARS", "PLASTIC", "NO_BREATHE", "NOHEAD", "NOGIB" ] }, { diff --git a/src/monattack.cpp b/src/monattack.cpp index 6e3c3466b011..feef7234e9aa 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -2841,7 +2841,8 @@ bool mattack::gene_sting( monster *z ) bool hit = sting_shoot( z, target, dam, range ); if( hit ) { //Add checks if previous NPC/player conditions are removed - dynamic_cast( target )->mutate(); + dynamic_cast( target )->vitamin_mod( vitamin_mutant_toxin, rng( 250, 500 ) ); + target->irradiate( rng( 50, 100 ) ); } return true; diff --git a/src/monster.cpp b/src/monster.cpp index 665d82321e84..f1e87f7c345b 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -63,6 +63,7 @@ static const ammo_effect_str_id ammo_effect_WHIP( "WHIP" ); +static const efftype_id effect_attention( "attention" ); static const efftype_id effect_badpoison( "badpoison" ); static const efftype_id effect_beartrap( "beartrap" ); static const efftype_id effect_bleed( "bleed" ); @@ -104,6 +105,7 @@ static const species_id FUNGUS( "FUNGUS" ); static const species_id INSECT( "INSECT" ); static const species_id MAMMAL( "MAMMAL" ); static const species_id MOLLUSK( "MOLLUSK" ); +static const species_id NETHER( "NETHER" ); static const species_id PLANT( "PLANT" ); static const species_id ROBOT( "ROBOT" ); static const species_id ZOMBIE( "ZOMBIE" ); @@ -1347,6 +1349,10 @@ monster_attitude monster::attitude( const Character *u ) const } } + if( type->has_anger_trigger( mon_trigger::NETHER_ATTENTION ) && u->has_effect( effect_attention ) ) { + return MATT_ATTACK; + } + if( type->in_species( FUNGUS ) && ( u->has_trait( trait_THRESH_MYCUS ) || u->has_trait( trait_MYCUS_FRIEND ) ) ) { return MATT_FRIEND; @@ -2819,25 +2825,22 @@ void monster::process_effects_internal() regeneration_amount = 0; } const int healed_amount = heal( round( regeneration_amount ) ); - if( healed_amount > 0 && one_in( 2 ) && g->u.sees( *this ) ) { - add_msg( m_debug, ( "Regen: %s" ), healed_amount ); - std::string healing_format_string; - if( healed_amount >= 50 ) { - healing_format_string = _( "The %s is visibly regenerating!" ); - } else if( healed_amount >= 10 ) { - healing_format_string = _( "The %s seems a little healthier." ); - } else { - healing_format_string = _( "The %s is healing slowly." ); - } - add_msg( m_warning, healing_format_string, name() ); + if( healed_amount > 0 && g->u.sees( *this ) ) { + add_msg( m_warning, _( "The %1$s regenerates %2$s damage." ), name(), healed_amount ); } if( type->regenerates_in_dark ) { const float light = g->m.ambient_light_at( pos() ); - // Magic number 10000 was chosen so that a floodlight prevents regeneration in a range of 20 tiles - if( heal( static_cast( 50.0 * std::exp( - light * light / 10000 ) ) > 0 && one_in( 2 ) && - g->u.sees( *this ) ) ) { - add_msg( m_warning, _( "The %s uses the darkness to regenerate." ), name() ); + add_msg( m_info, _( "Light level: %s" ), light ); + // Requires standing in a properly dark tile, scales as it gets darker + if ( light < 11.0f && one_in( 2 ) && hp < type->hp ) { + // Regen will max out at 50 at 6.0 light (barely able to craft), or top off to max HP + int dark_regen_amount = std::min( static_cast( 110.0f - ( light * 10.0f ) ), type->hp - hp ); + dark_regen_amount = std::min( dark_regen_amount, 50 ); + heal( round( dark_regen_amount ) ); + if ( dark_regen_amount > 0 && g->u.sees( *this ) ) { + add_msg( m_warning, _( "The %1$s uses the darkness to regenerate %2$s damage." ), name(), dark_regen_amount ); + } } } diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 5137ddebdc28..e9a0807a610c 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -52,6 +52,7 @@ std::string enum_to_string( mon_trigger data ) case mon_trigger::SOUND: return "SOUND"; case mon_trigger::PLAYER_NEAR_BABY: return "PLAYER_NEAR_BABY"; case mon_trigger::MATING_SEASON: return "MATING_SEASON"; + case mon_trigger::NETHER_ATTENTION: return "NETHER_ATTENTION"; // *INDENT-ON* case mon_trigger::_LAST: break; diff --git a/src/mtype.h b/src/mtype.h index f61acd08cf7e..79a4575e8e6d 100644 --- a/src/mtype.h +++ b/src/mtype.h @@ -50,6 +50,7 @@ enum class mon_trigger : int { SOUND, // Heard a sound PLAYER_NEAR_BABY, // Player/npc is near a baby monster of this type MATING_SEASON, // It's the monster's mating season (defined by baby_flags) + NETHER_ATTENTION, // Player/npc currently has effect_attention _LAST // This item must always remain last. }; From ad5a415d447fa465d760384757b108f8ddc086cf Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:40:08 +0000 Subject: [PATCH 2/6] style(autofix.ci): automated formatting --- data/json/monsters/nether.json | 4 +--- src/monster.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json index 25afd34d6139..13f634781e28 100644 --- a/data/json/monsters/nether.json +++ b/data/json/monsters/nether.json @@ -403,9 +403,7 @@ "harvest": "human", "death_function": [ "NORMAL" ], "anger_triggers": [ "NETHER_ATTENTION" ], - "special_attacks": [ - { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 8, "armor_multiplier": 0.8 } ] } - ], + "special_attacks": [ { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 8, "armor_multiplier": 0.8 } ] } ], "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "NO_BREATHE", "GRABS", "HUMAN", "PATH_AVOID_DANGER_2", "PRIORITIZE_TARGETS" ] }, { diff --git a/src/monster.cpp b/src/monster.cpp index f1e87f7c345b..d3d287a29d2b 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -1349,7 +1349,8 @@ monster_attitude monster::attitude( const Character *u ) const } } - if( type->has_anger_trigger( mon_trigger::NETHER_ATTENTION ) && u->has_effect( effect_attention ) ) { + if( type->has_anger_trigger( mon_trigger::NETHER_ATTENTION ) && + u->has_effect( effect_attention ) ) { return MATT_ATTACK; } @@ -2833,13 +2834,14 @@ void monster::process_effects_internal() const float light = g->m.ambient_light_at( pos() ); add_msg( m_info, _( "Light level: %s" ), light ); // Requires standing in a properly dark tile, scales as it gets darker - if ( light < 11.0f && one_in( 2 ) && hp < type->hp ) { + if( light < 11.0f && one_in( 2 ) && hp < type->hp ) { // Regen will max out at 50 at 6.0 light (barely able to craft), or top off to max HP int dark_regen_amount = std::min( static_cast( 110.0f - ( light * 10.0f ) ), type->hp - hp ); dark_regen_amount = std::min( dark_regen_amount, 50 ); heal( round( dark_regen_amount ) ); - if ( dark_regen_amount > 0 && g->u.sees( *this ) ) { - add_msg( m_warning, _( "The %1$s uses the darkness to regenerate %2$s damage." ), name(), dark_regen_amount ); + if( dark_regen_amount > 0 && g->u.sees( *this ) ) { + add_msg( m_warning, _( "The %1$s uses the darkness to regenerate %2$s damage." ), name(), + dark_regen_amount ); } } } From b4b4766f5a9311f7f528943e26819203f9472a19 Mon Sep 17 00:00:00 2001 From: Chaosvolt Date: Wed, 31 Jan 2024 13:28:04 -0600 Subject: [PATCH 3/6] Update monattack.cpp --- src/monattack.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/monattack.cpp b/src/monattack.cpp index feef7234e9aa..6e21477de50c 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -207,6 +207,8 @@ static const mtype_id mon_zombie_skeltal_minion( "mon_zombie_skeltal_minion" ); static const bionic_id bio_uncanny_dodge( "bio_uncanny_dodge" ); +const vitamin_id vitamin_mutant_toxin( "mutant_toxin" ); + // shared utility functions static bool within_visual_range( monster *z, int max_range ) { @@ -2842,7 +2844,7 @@ bool mattack::gene_sting( monster *z ) if( hit ) { //Add checks if previous NPC/player conditions are removed dynamic_cast( target )->vitamin_mod( vitamin_mutant_toxin, rng( 250, 500 ) ); - target->irradiate( rng( 50, 100 ) ); + dynamic_cast( target )->irradiate( rng( 50, 100 ) ); } return true; From 05ea02da82abc6a3262db62e0e40a188d14211f6 Mon Sep 17 00:00:00 2001 From: Chaosvolt Date: Wed, 31 Jan 2024 15:22:55 -0600 Subject: [PATCH 4/6] Fix stuff for now --- src/monattack.cpp | 1 - src/monster.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/monattack.cpp b/src/monattack.cpp index 6e21477de50c..f64fd0393841 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -2843,7 +2843,6 @@ bool mattack::gene_sting( monster *z ) bool hit = sting_shoot( z, target, dam, range ); if( hit ) { //Add checks if previous NPC/player conditions are removed - dynamic_cast( target )->vitamin_mod( vitamin_mutant_toxin, rng( 250, 500 ) ); dynamic_cast( target )->irradiate( rng( 50, 100 ) ); } diff --git a/src/monster.cpp b/src/monster.cpp index d3d287a29d2b..c8c7d4d1c2bf 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -105,7 +105,6 @@ static const species_id FUNGUS( "FUNGUS" ); static const species_id INSECT( "INSECT" ); static const species_id MAMMAL( "MAMMAL" ); static const species_id MOLLUSK( "MOLLUSK" ); -static const species_id NETHER( "NETHER" ); static const species_id PLANT( "PLANT" ); static const species_id ROBOT( "ROBOT" ); static const species_id ZOMBIE( "ZOMBIE" ); @@ -2832,7 +2831,7 @@ void monster::process_effects_internal() if( type->regenerates_in_dark ) { const float light = g->m.ambient_light_at( pos() ); - add_msg( m_info, _( "Light level: %s" ), light ); + add_msg( m_debug, _( "%1$s local light level: %2$s" ), name(), light ); // Requires standing in a properly dark tile, scales as it gets darker if( light < 11.0f && one_in( 2 ) && hp < type->hp ) { // Regen will max out at 50 at 6.0 light (barely able to craft), or top off to max HP From 86a451a9a76ade2a5a3c6ffa654e73947b336da0 Mon Sep 17 00:00:00 2001 From: Chaosvolt Date: Wed, 31 Jan 2024 21:55:52 -0600 Subject: [PATCH 5/6] I cri --- src/monattack.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/monattack.cpp b/src/monattack.cpp index f64fd0393841..f967e13943d9 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -207,8 +207,6 @@ static const mtype_id mon_zombie_skeltal_minion( "mon_zombie_skeltal_minion" ); static const bionic_id bio_uncanny_dodge( "bio_uncanny_dodge" ); -const vitamin_id vitamin_mutant_toxin( "mutant_toxin" ); - // shared utility functions static bool within_visual_range( monster *z, int max_range ) { @@ -2843,7 +2841,7 @@ bool mattack::gene_sting( monster *z ) bool hit = sting_shoot( z, target, dam, range ); if( hit ) { //Add checks if previous NPC/player conditions are removed - dynamic_cast( target )->irradiate( rng( 50, 100 ) ); + dynamic_cast( target )->irradiate( rng( 100, 300 ) ); } return true; From 3a90718cb9c9e2e313dcd8679313e69f48d6de4a Mon Sep 17 00:00:00 2001 From: Chaosvolt Date: Thu, 1 Feb 2024 18:49:33 -0600 Subject: [PATCH 6/6] Update external_tileset.md --- .../docs/en/mod/json/reference/graphics/external_tileset.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md b/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md index bcead80800ab..76b6acc8550d 100644 --- a/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md +++ b/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md @@ -38,6 +38,7 @@ Links to relevant pull requests, for content covered below: - New trees: [#3626](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3626) - Alternative sign sprite: [#3670](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3670) - New traps: [#3939](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3939) +- New monster: [#4182](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/4182) ## Undead People @@ -78,6 +79,7 @@ Ultica are planned for the future. - Cacao pods. Item specific to BN. - Override for sign sprite. Removes lettering on the front specific to DDA. - Makeshift perimeter alarm. Trap specific to BN. +- Lepidopterid. New monster specific to BN. ### External_Tileset_DP_Tall.png