Skip to content

Commit

Permalink
Water camouflage: Make fish not visible from unrealistically far away (
Browse files Browse the repository at this point in the history
…CleverRaven#50785)

* Start adding WATER_CAMOUFLAGE

WATER_CAMOUFLAGE is a flag meant to reflect that it is currently
unrealistically easy in CDDA to see many things, including most fish,
underwater. This first iteration does not have any changes re
is_divable.

* Scrap is_divable for creature::sees

map::is_divable() checks for not only DEEP_WATER, but SWIMMABLE. It is
not reasonable for visibility underwater to be lessened by a liquid
being swimmable by a human. Moreover, the check for DEEP_WATER
likely predates the use of Z-levels in water (as per @ralreegorganon
on discord); Z-levels should be taken into account, although DEEP_WATER
is unfortunately still used for various terrain. So rule out
visibility from out of the water to underwater if at least 2 of the
following are true: has WATER_CAMOUFLAGE; terrain position has
DEEP_WATER; Z-levels are different.

* Add WATER_CAMOUFLAGE to fish.json; misc cleanup

This adds the new `WATER_CAMOUFLAGE` flag to appropriate critters in
fish.json (those with the `fish` faction, at least to start; game
balance will need to be considered before adding to members of
less-neutral factions). It also removes `WARM` from inappropriate
fish/shellfish (too small to be warm due to retained heat alone) and
puts in `ARTHROPOD_BLOOD` in a couple of places it was missing (e.g.,
non-mutant crayfish).

* Document WATER_CAMOUFLAGE flag

Provide (in JSON_FLAGS.md) documentation for the new WATER_CAMOUFLAGE
flag. (Mostly a copy-and-pase from the CAMOUFLAGE flag, but with some
additions.)

* Sanity check; remove one auto

This puts a sanity check into
`MonsterGenerator::check_monster_definitions()` so that monsters that
can't submerge will generate a debug message if they're tagged with
WATER_CAMOUFLAGE. It also changes an `auto` into the actual type,
mtype, to be clearer about what is happening.

Use mon.id, not mon: `monster( thingy )` wants an mtype_id thingy, not mtype.

* Water camouflage for 1 DinoMod, 1 DSA critter

This adds the WATER_CAMOUFLAGE to the most appropriate monster from
each of DinoMod and Dark Skies Above; both are AQUATIC (as well as
SWIMS). For the first, I added it to the mosasaurus hatchling, which
is rather defenseless otherwise. For the second, I added it to the
(non-sewer) lurker (it is more described as waiting such that it is
hard to see).

* Get water_camouflage working better

is_underwater() appears to be somewhat pickier than I had thought
regarding whether something is actually in water. Checking for
_either_ is_underwater _or_ terrain being swimmable; may need to
extend to second check also, but this unfortunately does mean that
at least some non-water liquids are getting excluded. Should not
matter yet, but may for Aftershock, say.

* Extend use of TFLAG_SWIMMABLE/SHALLOW/DEEP

Get around apparent limits of is_underwater().

* Take into account AQUATIC re SWIMMABLE

After experiments revealed that is_underwater() is not reliable,
@Venera3 pointed out (thanks!) that AQUATIC's implementation of not
going on land is actually checking for SWIMMABLE, and suggested using
SWIMMABLE for more. Allowing AQUATIC + SWIMMABLE to indicate being
underwater even if is_underwater() is false. For WATER_CAMOUFLAGE,
also accepting SHALLOW_WATER (although may need size check, since
that is defined as water not deep enough to cover a human) or
DEEP_WATER.

* Code cleanup

Move checking for likely being underwater (either is_underwater or
AQUATIC and on SWIMMABLE terrain) into a function. Also add helper
function majority_rule as suggested by @jbytheway on discord.

* Add WATER_CAMOUFLAGE to more; size; flag fixes

This adds WATER_CAMOUFLAGE to several more appropriate species,
including the dragonfly nymph/naiad, beaver (but not zombeaver - brown
camouflage is going to be disrupted by red/pink/white ribs being
visible), otter, jawed terror, and the two more-evolved swimmer
zombies (the mancroc and non-base swimmer zombie; the latter is noted
as "glistening"). However, SHALLOW_WATER will no longer count for
distance-based WATER_CAMOUFLAGE for anything human-size or bigger,
since SHALLOW_WATER is insufficient to cover a human being.

I also added CLIMBS to the grey fox (specifically noted as doing so)
and SWIMS to the mink (mentioned as semi-aquatic, for instance).

Comment re LOUDMOVES and INSECT_FLYING

* Add WATER_CAMOUFLAGE to vinebeast; typo correct

This adds WATER_CAMOUFLAGE to the (triffid) vinebeast (not the creeper
vine, which is immobile), which has SWIMS. Also slight copyediting on
one description.

* Change to ter_furn_flag::

Update terrain flags to ter_furn_flag::* use.

Co-authored-by: actual-nh <[email protected]>
  • Loading branch information
actual-nh and actual-nh authored Sep 2, 2021
1 parent 25cc3f5 commit acde44f
Show file tree
Hide file tree
Showing 13 changed files with 70 additions and 26 deletions.
24 changes: 12 additions & 12 deletions data/json/monsters/fish.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_tiny",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_small",
Expand Down Expand Up @@ -93,7 +93,7 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_small",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_medium",
Expand Down Expand Up @@ -123,7 +123,7 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_small",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_large",
Expand Down Expand Up @@ -153,7 +153,7 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"fear_triggers": [ "SOUND", "PLAYER_CLOSE" ],
"harvest": "fish_large",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_huge",
Expand Down Expand Up @@ -183,7 +183,7 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_large",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_trout",
Expand Down Expand Up @@ -502,7 +502,7 @@
"reproduction": { "baby_egg": "egg_fish", "baby_count": 2, "baby_timer": 180 },
"baby_flags": [ "SUMMER", "AUTUMN" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE", "ARTHROPOD_BLOOD" ]
},
{
"id": "mon_fish_crayfish",
Expand Down Expand Up @@ -531,7 +531,7 @@
"baby_flags": [ "AUTUMN" ],
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"upgrades": { "half_life": 14, "into": "mon_crayfish_small" },
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE", "ARTHROPOD_BLOOD" ]
},
{
"id": "mon_fish_blinky",
Expand All @@ -557,7 +557,7 @@
"luminance": 5,
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_small",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fish_eel",
Expand All @@ -583,7 +583,7 @@
"luminance": 0,
"fear_triggers": [ "PLAYER_CLOSE", "SOUND" ],
"harvest": "fish_small",
"flags": [ "FISHABLE", "SEES", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "FISHABLE", "SEES", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_crayfish_small",
Expand Down Expand Up @@ -705,7 +705,7 @@
"harvest": "mutant_fish",
"reproduction": { "baby_egg": "egg_fish", "baby_count": 1, "baby_timer": 6 },
"baby_flags": [ "SPRING" ],
"flags": [ "SEES", "HEARS", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "AQUATIC" ]
},
{
"id": "mon_mutant_salmon",
Expand Down Expand Up @@ -733,7 +733,7 @@
"harvest": "mutant_fish",
"reproduction": { "baby_egg": "egg_fish", "baby_count": 2, "baby_timer": 150 },
"baby_flags": [ "AUTUMN" ],
"flags": [ "SEES", "HEARS", "SMELLS", "WARM", "SWIMS", "AQUATIC" ]
"flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "AQUATIC" ]
},
{
"id": "mon_sewer_fish",
Expand Down Expand Up @@ -763,6 +763,6 @@
"reproduction": { "baby_egg": "egg_fish", "baby_count": 2, "baby_timer": 19 },
"baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ],
"path_settings": { "max_dist": 5 },
"flags": [ "SEES", "SMELLS", "WARM", "AQUATIC" ]
"flags": [ "SEES", "SMELLS", "AQUATIC" ]
}
]
3 changes: 2 additions & 1 deletion data/json/monsters/insect_spider.json
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@
"harvest": "arachnid",
"anger_triggers": [ "PLAYER_CLOSE" ],
"fear_triggers": [ "HURT" ],
"flags": [ "AQUATIC", "SEES" ],
"flags": [ "AQUATIC", "SEES", "WATER_CAMOUFLAGE" ],
"upgrades": { "age_grow": 21, "into": "mon_dragonfly_giant" }
},
{
Expand Down Expand Up @@ -762,6 +762,7 @@
"harvest": "arachnid_flying",
"fear_triggers": [ "PLAYER_CLOSE", "HURT", "FIRE" ],
"upgrades": { "half_life": 21, "into": "mon_fly_mega" },
"//": "LOUDMOVES is now part of the species INSECT_FLYING",
"flags": [ "SEES", "SMELLS", "FLIES", "STUMBLES", "HIT_AND_RUN", "CANPLAY", "PATH_AVOID_FIRE" ]
},
{
Expand Down
8 changes: 4 additions & 4 deletions data/json/monsters/mammal.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
"anger_triggers": [ "PLAYER_CLOSE", "HURT" ],
"fear_triggers": [ "SOUND" ],
"zombify_into": "mon_zombeaver",
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "SWIMS", "WARM" ]
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "SWIMS", "WARM", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_black_rat",
Expand Down Expand Up @@ -1639,7 +1639,7 @@
"anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED" ],
"fear_triggers": [ "SOUND", "PLAYER_CLOSE" ],
"placate_triggers": [ "MEAT" ],
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ]
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "CLIMBS" ]
},
{
"id": "mon_fox_red",
Expand Down Expand Up @@ -1814,7 +1814,7 @@
"anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED" ],
"fear_triggers": [ "SOUND", "PLAYER_CLOSE" ],
"placate_triggers": [ "MEAT" ],
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ]
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "SWIMS" ]
},
{
"id": "mon_moose",
Expand Down Expand Up @@ -1970,7 +1970,7 @@
"dodge": 4,
"harvest": "mammal_small_fur",
"fear_triggers": [ "SOUND", "PLAYER_CLOSE" ],
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "SWIMS", "WARM" ]
"flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "SWIMS", "WARM", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_pig_piglet",
Expand Down
4 changes: 2 additions & 2 deletions data/json/monsters/triffid.json
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@
"armor_bash": 18,
"bleed_rate": 10,
"harvest": "triffid_small",
"flags": [ "HEARS", "GOODHEARING", "NOHEAD", "HARDTOSHOOT", "GRABS", "SWIMS", "PLASTIC" ]
"flags": [ "HEARS", "GOODHEARING", "NOHEAD", "HARDTOSHOOT", "GRABS", "SWIMS", "PLASTIC", "WATER_CAMOUFLAGE" ]
},
{
"id": "mon_fungal_fighter",
Expand Down Expand Up @@ -268,7 +268,7 @@
"id": "mon_triffid_flower",
"type": "MONSTER",
"name": { "str": "triffid flower" },
"description": "A giant plant with a thick stalk adorned by a purple flower. Its petals are open with ominous shine in center.",
"description": "A giant plant with a thick stalk adorned by a purple flower. Its petals are open with an ominous shine in the center.",
"default_faction": "triffid",
"species": [ "PLANT" ],
"diff": 4,
Expand Down
14 changes: 13 additions & 1 deletion data/json/monsters/zed-animal.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,19 @@
"armor_bullet": 2,
"luminance": 0,
"harvest": "zombie_leather",
"flags": [ "SEES", "HEARS", "SMELLS", "WARM", "SWIMS", "AQUATIC", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ]
"flags": [
"SEES",
"HEARS",
"SMELLS",
"WARM",
"SWIMS",
"AQUATIC",
"POISON",
"NO_BREATHE",
"REVIVES",
"FILTHY",
"WATER_CAMOUFLAGE"
]
},
{
"id": "mon_zombie_dog",
Expand Down
6 changes: 4 additions & 2 deletions data/json/monsters/zed_misc.json
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,8 @@
"REVIVES",
"PUSH_MON",
"SWIMS",
"FILTHY"
"FILTHY",
"WATER_CAMOUFLAGE"
]
},
{
Expand Down Expand Up @@ -1437,7 +1438,8 @@
"SWIMS",
"REVIVES",
"PUSH_MON",
"FILTHY"
"FILTHY",
"WATER_CAMOUFLAGE"
]
},
{
Expand Down
2 changes: 1 addition & 1 deletion data/mods/Dark-Skies-Above/monsters/alien_fauna.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
}
],
"anger_triggers": [ "PLAYER_CLOSE", "PLAYER_WEAK" ],
"flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "AQUATIC", "POISON" ]
"flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "AQUATIC", "WATER_CAMOUFLAGE", "POISON" ]
},
{
"//": "not really a 'lizard' as we would understand them, rather an invasive alien, likely a prehistoric creature from another world, like a dinosaur. 'lizard' a survivor colloquialism for their shape and general behavior",
Expand Down
3 changes: 2 additions & 1 deletion data/mods/DinoMod/monsters/hatchling.json
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,8 @@
"NO_BREED",
"CANPLAY",
"SWIMS",
"AQUATIC"
"AQUATIC",
"WATER_CAMOUFLAGE"
]
}
]
1 change: 1 addition & 0 deletions doc/JSON_FLAGS.md
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,7 @@ Other monster flags.
- ```VENOM``` Attack may poison the player.
- ```VERMIN``` Obsolete flag for inconsequential monsters, now prevents loading.
- ```WARM``` Warm blooded.
- ```WATER_CAMOUFLAGE``` If in water, stays invisible up to (current Perception, + base Perception if the character has the Spotting proficiency) tiles away, even in broad daylight. Monsters see it from the lower of `vision_day` and `vision_night` ranges. Can also make it harder to see in deep water or across Z-levels if it is underwater and the viewer is not.
- ```WEBWALK``` Doesn't destroy webs and won't get caught in them.
- ```WOOL``` May produce wool when butchered.

Expand Down
23 changes: 22 additions & 1 deletion src/creature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ bool Creature::is_underwater() const
return underwater;
}

bool Creature::is_likely_underwater() const
{
return is_underwater() ||
( has_flag( MF_AQUATIC ) && get_map().has_flag( ter_furn_flag::TFLAG_SWIMMABLE, pos() ) );
}

bool Creature::is_ranged_attacker() const
{
if( has_flag( MF_RANGED_ATTACKER ) ) {
Expand Down Expand Up @@ -243,6 +249,12 @@ bool Creature::is_dangerous_field( const field_entry &entry ) const
return entry.is_dangerous() && !is_immune_field( entry.get_field_type() );
}

static bool majority_rule( const bool a_vote, const bool b_vote, const bool c_vote )
{
// Helper function suggested on discord by jbtw
return ( ( a_vote + b_vote + c_vote ) > 1 );
}

bool Creature::sees( const Creature &critter ) const
{
// Creatures always see themselves (simplifies drawing).
Expand Down Expand Up @@ -282,8 +294,17 @@ bool Creature::sees( const Creature &critter ) const
} else if( ( wanted_range > 1 && critter.digging() &&
here.has_flag( ter_furn_flag::TFLAG_DIGGABLE, critter.pos() ) ) ||
( critter.has_flag( MF_CAMOUFLAGE ) && wanted_range > this->get_eff_per() ) ||
( critter.has_flag( MF_WATER_CAMOUFLAGE ) &&
wanted_range > this->get_eff_per() &&
( critter.is_likely_underwater() ||
here.has_flag( ter_furn_flag::TFLAG_DEEP_WATER, critter.pos() ) ||
( here.has_flag( ter_furn_flag::TFLAG_SHALLOW_WATER, critter.pos() ) &&
critter.get_size() < creature_size::medium ) ) ) ||
( critter.has_flag( MF_NIGHT_INVISIBILITY ) && here.light_at( critter.pos() ) <= lit_level::LOW ) ||
( critter.is_underwater() && !is_underwater() && here.is_divable( critter.pos() ) ) ||
( !is_likely_underwater() && critter.is_likely_underwater() &&
majority_rule( critter.has_flag( MF_WATER_CAMOUFLAGE ),
here.has_flag( ter_furn_flag::TFLAG_DEEP_WATER, critter.pos() ),
posz() != critter.posz() ) ) ||
( here.has_flag_ter_or_furn( ter_furn_flag::TFLAG_HIDE_PLACE, critter.pos() ) &&
!( std::abs( posx() - critter.posx() ) <= 1 && std::abs( posy() - critter.posy() ) <= 1 &&
std::abs( posz() - critter.posz() ) <= 1 ) ) ) {
Expand Down
1 change: 1 addition & 0 deletions src/creature.h
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,7 @@ class Creature : public location, public viewer
virtual bool digging() const;
virtual bool is_on_ground() const = 0;
virtual bool is_underwater() const;
bool is_likely_underwater() const; // Should eventually be virtual, although not pure
virtual bool is_warm() const; // is this creature warm, for IR vision, heat drain, etc
virtual bool in_species( const species_id & ) const;

Expand Down
6 changes: 5 additions & 1 deletion src/monstergenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ std::string enum_to_string<m_flag>( m_flag data )
case MF_INSECTICIDEPROOF: return "INSECTICIDEPROOF";
case MF_RANGED_ATTACKER: return "RANGED_ATTACKER";
case MF_CAMOUFLAGE: return "CAMOUFLAGE";
case MF_WATER_CAMOUFLAGE: return "WATER_CAMOUFLAGE";
// *INDENT-ON*
case m_flag::MF_MAX:
break;
Expand Down Expand Up @@ -1201,7 +1202,7 @@ void mtype::remove_regeneration_modifiers( const JsonObject &jo, const std::stri

void MonsterGenerator::check_monster_definitions() const
{
for( const auto &mon : mon_templates->get_all() ) {
for( const mtype &mon : mon_templates->get_all() ) {
if( mon.harvest.is_null() && !mon.has_flag( MF_ELECTRONIC ) && !mon.id.is_null() ) {
debugmsg( "monster %s has no harvest entry", mon.id.c_str(), mon.harvest.c_str() );
}
Expand Down Expand Up @@ -1258,6 +1259,9 @@ void MonsterGenerator::check_monster_definitions() const
if( !mon.harvest.is_valid() ) {
debugmsg( "monster %s has invalid harvest_entry: %s", mon.id.c_str(), mon.harvest.c_str() );
}
if( mon.has_flag( MF_WATER_CAMOUFLAGE ) && !monster( mon.id ).can_submerge() ) {
debugmsg( "monster %s has WATER_CAMOUFLAGE but cannot submerge", mon.id.c_str() );
}
for( const scenttype_id &s_id : mon.scents_tracked ) {
if( !s_id.is_empty() && !s_id.is_valid() ) {
debugmsg( "monster %s has unknown scents_tracked %s", mon.id.c_str(), s_id.c_str() );
Expand Down
1 change: 1 addition & 0 deletions src/mtype.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ enum m_flag : int {
MF_INSECTICIDEPROOF, // This monster is immune to insecticide, even though it's made of bug flesh
MF_RANGED_ATTACKER, // This monster has any sort of ranged attack
MF_CAMOUFLAGE, // This monster is hard to spot, even in broad daylight
MF_WATER_CAMOUFLAGE, // This monster is hard to spot if it is underwater, especially if you aren't
MF_MAX // Sets the length of the flags - obviously must be LAST
};

Expand Down

0 comments on commit acde44f

Please sign in to comment.