diff --git a/README.md b/README.md index 26b5553f6..203450655 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ - @@ -160,147 +159,11 @@ Press TAB to switch between modes during the game. Bestiary -------- -| Monster | Class/Rarity | Dngr | Attack | # Attcks | Other attacks | Immunity | -| :--- | --- | --- | --- | --- | --- | --- | -| Reaper | E/common | 824 | 1d6+6 | 2 | | Acid
Cold
Fire
Holy-damage
Necrosis
Negation
Paralysis
Confusion
Confusion
Blinding
Poison
Holding
Sanctuary-tiles
Slowing
Webs
Draining
Vorpal-Weapons
Non-Magical-Weapons
| -| Fire Demon | D/uncommon | 566 | 1d14+4 | 2 | Fire:1d6+6
| Cold
Fire
Necrosis
Poison
Vorpal-Weapons
| -| Cthulite | D/rare | 440 | 1d14+4 | 2 | Acid:2d6
Poison:2d12
| Acid
Cold
Necrosis
Confusion
Confusion
Poison
Draining
Vorpal-Weapons
| -| Ettin, Two Headed Giant | D/rare | 382 | 1d10+4 | 2 | | | -| Flesh Golem | C/rare | 346 | 2d8+4 | 2 | | Cold
Confusion
Confusion
Poison
Draining
| -| Tentacle Horror | B/common | 332 | 2d6+2 | 1 | Acid:1d6
| Acid
Necrosis
| -| Undead Bear | C/common | 328 | 2d8+5 | 2 | Necrotic:1
| Cold
Necrosis
Poison
Draining
| -| Bearowl | C/common | 290 | 2d8+5 | 2 | | | -| Baby Kraken | D/rare | 251 | | 1 | Bite:3d8+10
Digest:1d20
Drown:1d20
| Water
| -| Colossal Scorpion | E/v-rare | 243 | | 1 | Bite:2d8+6
Digest:1d40
Poison:1d20+10
| | -| Fire Troll | B/uncommon | 241 | 1d12+4 | 1 | | Fire
Poison
| -| Yeti | C/rare | 209 | 1d12+8 | 1 | | Cold
| -| Mummy | B/common | 208 | 1d10+10 | 2 | Drain:1d10
| Cold
Fire
Necrosis
Poison
Draining
| -| Giant Skeleton | C/common | 197 | 1d6 | 1 | | Cold
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Stone Troll | B/common | 197 | 1d12+4 | 1 | | Poison
| -| Dungeon Cleaner | B/common | 189 | 1d10 | 1 | Digest:1d40
| Acid
Necrosis
| -| Black Pudding | B/common | 188 | 3d6+2 | 1 | Acid:2d6
| Acid
Cold
Electricity
Lightning
Necrosis
| -| Cement Man | C/common | 184 | 3d8+6 | 1 | | Cold
Fire
Confusion
Confusion
Poison
Draining
| -| Mummy Necromancer | C/uncommon | 154 | 1d6+2 | 1 | Necrotic:1
| Cold
Necrosis
Poison
Draining
| -| Bone Spider | C/common | 152 | 1d8+3 | 1 | Poison:2d8
| Cold
Necrosis
Poison
Webs
Draining
Vorpal-Weapons
| -| Lesser Tentacleye | C/common | 141 | 2d6 | 1 | | Cold
Necrosis
Poison
Draining
Water
| -| Flameskull | C/uncommon | 140 | 2d6 | 1 | | Acid
Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Draining
Vorpal-Weapons
Non-Magical-Weapons
| -| Giant Spider | B/common | 140 | 1d8+3 | 1 | Poison:2d8
| Webs
| -| Gargoyle | C/common | 134 | 2d6 | 1 | | Cold
Necrosis
Poison
Draining
Water
Vorpal-Weapons
| -| Murder Bunny | B/rare | 132 | 1d8 | 2 | Bite:1d6
Claw:1d4
| | -| Portable Hole | B/uncommon | 127 | | 0 | | Acid
Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Webs
Draining
Vorpal-Weapons
| -| Hill Ogre | B/common | 127 | 1d10+4 | 1 | | | -| Iceman | B/common | 126 | | 1 | Cold:1d8
| Cold
| -| Unleashed Gargoyle | C/common | 124 | 1d6+2 | 1 | | Necrosis
Poison
Draining
Water
Vorpal-Weapons
| -| Demon Goat | B/rare | 106 | 2d6+2 | 1 | | Fire
Necrosis
Poison
| -| Giant Piranha | B/v-rare | 103 | 1d10+3 | 1 | Bite:1d8
| Water
| -| Giant Battle Duck | C/v-rare | 98 | 1d8+4 | 1 | Bite:1d10
Claw:1d6
| Water
| -| Treasure Chest | B/common | 93 | 1d8+4 | 1 | | Water
Vorpal-Weapons
| -| Treasure Chest Mimic | B/common | 93 | 1d8+4 | 1 | | Water
Vorpal-Weapons
| -| Flaming Skeleton | B/common | 92 | 1d4 | 1 | | Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Acid Blob | A/common | 90 | 1d10 | 1 | | Acid
Necrosis
| -| Burning Skeleton | B/common | 89 | 1d3 | 1 | | Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Electric Eel | B/rare | 87 | 1d3+1 | 1 | Bite:1d4
| Electricity
Water
| -| Mantisman | B/uncommon | 85 | 1d12+8 | 1 | | | -| Dreadfire Snake | C/rare | 83 | 1d3+1 | 1 | Poison:1d4
| Webs
Water
| -| Flux Spider | B/uncommon | 82 | 1d3 | 1 | Necrotic:1
Poison:1d4
| Cold
Necrosis
Poison
Webs
Vorpal-Weapons
| -| Gargoyle Baby | C/common | 80 | 1d6 | 1 | | Cold
Necrosis
Poison
Draining
Water
Vorpal-Weapons
| -| Hellpup | B/rare | 78 | 1d6+2 | 1 | | Cold
Fire
Necrosis
Poison
Draining
| -| Zorblin Priest | B/common | 78 | 1d6+2 | 1 | | | -| Assassin Duck | B/v-rare | 77 | 1d6+1 | 1 | Bite:1d8
Claw:1d6
| Water
| -| Zorblin Leader | B/common | 76 | 1d4+2 | 1 | | | -| Zorblin Pirate | B/common | 76 | 1d4+2 | 1 | | | -| Gaseous Gloat | B/common | 75 | 1d20 | 1 | Digest:1d40
| Necrosis
| -| Firefox | B/rare | 74 | 1d6+2 | 1 | | Fire
Water
| -| Dungeon Belcher | B/common | 74 | 1d20 | 1 | Digest:1d10
| Confusion
Confusion
| -| Teletoad | B/common | 73 | 1d3+1 | 1 | Poison:1d10
| Cold
Water
| -| Death Hornet | A/uncommon | 72 | 1d4+1 | 1 | Bite:1d10
Poison:1d10
| | -| Zoblin | A/common | 70 | 1d6 | 1 | | Cold
Necrosis
Poison
Draining
| -| Zoblin | A/common | 70 | 1d6 | 1 | | Cold
Necrosis
Poison
Draining
| -| Zorblin Soldier | A/common | 70 | 1d4+2 | 1 | | | -| Huge Fluffy Bat | B/common | 67 | 1d4+2 | 1 | Bite:1d4
Claw:1d6
Poison:1d4+1
| Water
| -| Deathstalker Scorpion | B/rare | 66 | 1d6+1 | 1 | Poison:1d30
| | -| Dogman | A/common | 65 | 1d4+1 | 1 | | Water
| -| Molekin | A/uncommon | 64 | 1d4+2 | 1 | | Water
| -| Zorblin Wizard | C/common | 64 | 1d4+2 | 1 | | | -| Lesser Zorblin | A/common | 64 | 1d4+2 | 1 | | | -| Pyrolizard | B/common | 64 | 1d6+1 | 1 | | Fire
| -| Gnome Knight | B/common | 63 | 1d6+1 | 1 | | Poison
| -| Zorblomancer | B/common | 62 | 1d4+2 | 1 | | | -| Zorblin Eldster | B/common | 62 | 1d4+2 | 1 | | | -| Rock Gnome | B/common | 61 | 1d6+1 | 1 | | Poison
| -| Carcass Creeper | A/common | 61 | 1d6+2 | 1 | Bite:1d8
Claw:1d6
Poison:1d10
| Poison
| -| Piranha | A/rare | 61 | 1d4+3 | 1 | Bite:1d4
| Water
| -| Gnorf | A/common | 60 | 1d4+1 | 1 | | Cold
Poison
| -| Brown Extrovert Spider | A/uncommon | 59 | 1d3 | 1 | Necrotic:1
Poison:1d3
| Necrosis
Webs
| -| Battle Goat | B/uncommon | 58 | 1d6+2 | 1 | | Poison
Water
| -| Gnome Thief | A/common | 54 | 1d2+1 | 1 | | Cold
Poison
| -| Slime Jumper | A/common | 54 | 2d6+2 | 1 | Acid:1d6
| Acid
Necrosis
| -| Kraken Tentacle | A/common | 52 | 1d3+1 | 1 | Poison:1d8+1
| Water
| -| Thylacine | B/v-rare | 52 | 1d6+2 | 1 | | Water
| -| Onyx Widow | A/common | 52 | 1d3 | 1 | Poison:1d4
| Webs
| -| Meatfairy | A/common | 51 | 1d3+1 | 1 | Bite:1d4
Claw:1d2
| Vorpal-Weapons
| -| Blinkcat | B/common | 50 | 1d3+1 | 1 | | Cold
Water
Vorpal-Weapons
| -| Noble Warrior | /common | 50 | 1d3 | 1 | | Sanctuary-tiles
| -| Spectral Blade | B/unique | 49 | 1d4 | 1 | | Cold
Fire
Necrosis
Paralysis
Confusion
Confusion
Blinding
Poison
Webs
Draining
Vorpal-Weapons
| -| Moresquito | A/common | 48 | 1d3+1 | 1 | Bite:1d4
Claw:1d3
Poison:1d4
Drain:1d4
| | -| Para Spider | B/uncommon | 48 | 1d3 | 1 | Poison:1d4
| Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Webs
Draining
Vorpal-Weapons
| -| Spectral Blade | B/unique | 48 | 1d3 | 1 | | Cold
Fire
Necrosis
Paralysis
Confusion
Confusion
Blinding
Poison
Webs
Draining
Vorpal-Weapons
| -| Spectral Blade | B/unique | 48 | 1d3 | 1 | | Cold
Fire
Necrosis
Paralysis
Confusion
Confusion
Blinding
Poison
Webs
Draining
Vorpal-Weapons
| -| Orb Of Energy | B/uncommon | 47 | | 0 | | Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Webs
Draining
| -| Dog | A/uncommon | 46 | 1d4+2 | 1 | | Water
| -| Cuddly Eel | A/common | 45 | 1d3+1 | 1 | Bite:1d4
| Water
| -| Giant Rat | B/common | 45 | 1d6+2 | 1 | | Water
| -| Scorpion | A/common | 45 | 1d3+1 | 1 | Poison:1d12
| | -| Skeleton | A/common | 45 | 1d3 | 1 | | Cold
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Ghost | A/common | 45 | | 1 | Cold:1
| Acid
Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Webs
Draining
Water
| -| Orb Of Fire | B/uncommon | 45 | | 0 | | Fire
Necrosis
Paralysis
Blinding
Poison
| -| Ghost Minion | A/common | 45 | | 1 | Cold:1
| Acid
Cold
Fire
Necrosis
Paralysis
Blinding
Poison
Webs
Draining
Water
| -| Asp | A/common | 45 | 1d3+1 | 1 | Poison:1d3+1
| Webs
Water
| -| Narhornet | A/uncommon | 44 | 1d4+1 | 1 | Bite:1d4
Poison:1d8
| | -| Centipede | A/common | 44 | 1d4+2 | 1 | Bite:1d8
Claw:1d4
Poison:1d4
| Poison
| -| Skeleton | A/common | 43 | 1d3 | 1 | | Cold
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Skeleton Minion | A/common | 42 | 1d2 | 1 | | Cold
Necrosis
Paralysis
Blinding
Poison
Draining
| -| Baby Black Pudding | B/common | 41 | 1 | 1 | Acid:1d5
| Acid
Cold
Electricity
Lightning
Necrosis
| -| Rabid Bat Minion | A/common | 40 | 1 | 1 | Bite:1d3
Claw:1d2
| Water
| -| Giant Dungeon Duck | A/rare | 39 | 1d3+1 | 1 | Bite:1d4
Claw:1d3
| Water
| -| Rat | A/common | 38 | 1d3+2 | 1 | | Water
| -| Fluffy Bat | A/common | 38 | 1 | 1 | Bite:1d3
Claw:1d2
| Water
| -| Jade Viper | B/common | 37 | 1d3+1 | 1 | Poison:1d2
| Webs
Water
| -| Clingy Leech | A/common | 37 | 1d3+1 | 1 | Bite:1d4
Drain:1d4
| Water
| -| Jackalope | A/rare | 36 | 1d4 | 1 | | | -| Sewer Crab | A/common | 32 | 1d3+1 | 1 | | Water
| -| Fleshbee | A/common | 32 | 1d3+1 | 1 | Bite:1d4
Claw:1d3
| | -| Goldfish | A/common | 31 | 1 | 1 | Bite:1d1+1
| Water
Vorpal-Weapons
| -| Baby Slime Jumper | A/common | 29 | 1 | 1 | Acid:1d3
| Acid
Necrosis
| -| Sheep | B/common | 27 | 1d3+2 | 1 | | Water
| -| Lava Ant | A/common | 27 | 1d3+1 | 1 | Bite:1d4
Claw:1d3
Fire:1d3+1
| Fire
| -| Bloated Bloodbug | A/common | 24 | 1d2+1 | 1 | Bite:1d2
Drain:1d1
| | -| Vampire Rose | A/common | 24 | 1d3 | 1 | Digest:1d5
| Confusion
Confusion
| Weapons ------- -| Name | Class/Rarity | Damage | Damage Roll | Special | Weapon Damaged Chance | Runic Chance | Gold Value | -| :--- | --- | --- | --- | --- | --- | --- | --- | -| Sword Of Darkness | C/v-rare | 12 - 42 | 6d6+6 | Immunity-Acid
| 0.01 % | Y | 1000 | -| Warhammer | C/common | 4 - 32 | 4d8 | Swing-penalty
Hits all surrounding
| 0.01 % | Y | 450 | -| Mace | C/common | 3 - 24 | 3d8 | Swing-penalty
| 0.01 % | Y | 350 | -| Double Shovel | C/uncommon | 2 - 20 | 2d10 | Hits in-front and behind
| 1.00 % | Y | 50 | -| Holy Sword Of Clonrichet | C/v-rare | 5 - 20 | 1d16+4 | Immunity-Acid
Immunity-Cold
Immunity-Poison
x2 undead
Hits all surrounding
| 0.01 % | Y | 2500 | -| Scythe | C/uncommon | 3 - 18 | 3d6 | Hits all surrounding
| 0.05 % | Y | 250 | -| Sword Of Plutonium | C/v-rare | 5 - 16 | 1d12+4 | Immunity-Acid
| 0.01 % | Y | 1000 | -| Sword Of Draining | C/v-rare | 1 - 12 | 1d12 | Damage-Drain:1d20
Immunity-Drain
Additional-attack
| 0.05 % | Y | 1000 | -| Sword Of Duck Summoning | C/v-rare | 3 - 12 | 1d10+2 | Immunity-Acid
| 0.01 % | Y | 1500 | -| Very Broadsword | C/uncommon | 1 - 12 | 1d12 | Hits adjacent
| 0.01 % | Y | 350 | -| Pike | B/uncommon | 1 - 10 | 1d10 | Hits two ahead
| 0.50 % | Y | 10 | -| Cutlass | B/rare | 1 - 10 | 1d10 | | 0.20 % | Y | 100 | -| Shovel | B/uncommon | 1 - 8 | 1d8 | | 0.50 % | Y | 5 | -| Short Sword | A/common | 1 - 8 | 1d8 | | 0.10 % | Y | 100 | -| Rusty Short Sword | A/common | 2 - 7 | 1d6+1 | Damage-Poison:1d2+1
| 2.00 % | Y | 50 | -| Short Axe | B/uncommon | 1 - 6 | 1d6 | Hits all surrounding
| 0.05 % | Y | 150 | -| Dagger | A/common | 1 - 4 | 1d4 | | 0.05 % | Y | 15 | -| Wooden Short Sword | A/common | 1 - 4 | 1d4 | | 1.00 % | Y | 25 | Pixelart Screenshots @@ -552,7 +415,7 @@ Content Other content ------------- -- 120 x monsters +- 123 x monsters - 52 x food - 25 x items - 24 x treasure diff --git a/data/gfx.tgz b/data/gfx.tgz index f38104286..8be7163d6 100644 Binary files a/data/gfx.tgz and b/data/gfx.tgz differ diff --git a/python/gfx.py b/python/gfx.py index 57b2b41d9..0e38ea0b9 100644 --- a/python/gfx.py +++ b/python/gfx.py @@ -2785,14 +2785,14 @@ def init_tiles_16x16_main(): "", "", ############################################################ - "" - "" - "" - "" - "" - "" - "" - "" + "gnoll.sleeping.1", + "gnoll.sleeping.2", + "gnoll.1", + "gnoll.2", + "gnoll.3", + "gnoll.4", + "gnoll.dead.1", + "", "flameskull.1", "flameskull.2", "flameskull.3", diff --git a/python/things/dungeon/bridge.py b/python/things/dungeon/bridge.py index 83a7fae51..5f84dddba 100644 --- a/python/things/dungeon/bridge.py +++ b/python/things/dungeon/bridge.py @@ -45,11 +45,11 @@ def tp_init(name, tiles=[], bot3_tiles=[]): my.is_biome_lava(self, True) my.is_bridge(self, True) my.is_burnable(self, True) + my.is_combustible(self, True) my.is_cursor_can_hover_over(self, True) my.is_described_in_leftbar(self, True) my.is_described_when_hovering_over(self, True) my.is_flat(self, True) - my.is_combustible(self, True) my.is_interesting(self, True) my.is_one_per_tile(self, True) my.on_death_do(self, "bridge.on_death()") diff --git a/python/things/monsters/dog.py b/python/things/monsters/dog.py index 9508ef108..cef2e81a2 100644 --- a/python/things/monsters/dog.py +++ b/python/things/monsters/dog.py @@ -4,6 +4,8 @@ def on_born(me, x, y): my.thing_friend(me, "is_dog") + my.thing_enemy(me, "dogman") + my.thing_enemy(me, "gnoll") def on_you_nat_attack_attempt(me, x, y): diff --git a/python/things/monsters/dogman.py b/python/things/monsters/dogman.py index 7600c5eb3..74ef3ca7e 100644 --- a/python/things/monsters/dogman.py +++ b/python/things/monsters/dogman.py @@ -4,6 +4,7 @@ def on_born(me, x, y): my.thing_friend(me, "dogman") + my.thing_enemy(me, "gnoll") my.thing_carry(me, "dagger") my.thing_carry(me, "dart") @@ -111,9 +112,9 @@ def tp_init(name, text_long_name): my.is_daring(self, True) my.is_described_in_leftbar(self, True) my.is_described_when_hovering_over(self, True) + my.is_dogman(self, True) my.is_eater_of_meat(self, True) my.is_eater_of_red_blood(self, True) - my.is_gnome(self, True) my.is_hittable(self, True) my.is_humanoid(self, True) my.is_immune_to_water(self, True) @@ -163,7 +164,8 @@ def tp_init(name, text_long_name): my.text_a_or_an(self, "a") my.text_description_long2(self, "Dogmen have amazing hearing and are hard to creep up on.") my.text_description_long3(self, "Very skilled with throwing darts.") - my.text_description_long4(self, "Where the dogwomen live is a well kept secret.") + my.text_description_long4(self, "Dogmen detest gnolls. Dogmen are solitary and do not appear in packs, unlike gnolls.") + my.text_description_long5(self, "Where the dogwomen live is a well kept secret.") my.text_description_long(self, "A mildly odorous dogman. Half man, half mutt and blessed with the intellectual capabilities of a human, this poor creature is often very confused as to where it is.") my.text_description_short(self, "A perma-panting dogman.") my.text_hits(self, "gores") diff --git a/python/things/monsters/gnoll.py b/python/things/monsters/gnoll.py new file mode 100644 index 000000000..39a538f45 --- /dev/null +++ b/python/things/monsters/gnoll.py @@ -0,0 +1,205 @@ +import my +import tp + + +def on_born(me, x, y): + my.thing_friend(me, "gnoll") + my.thing_enemy(me, "dogman") + my.thing_carry(me, "dagger") + my.thing_carry(me, "dart") + + +def on_you_nat_attack_attempt(me, x, y): + sound = f"hiss{my.py_non_pcg_random_range_inclusive(1, 10)}" + my.thing_sound_play_channel(me, my.CHANNEL_MONST, sound) + + +def on_hit_and_still_alive(me, hitter, real_hitter, x, y, crit, damage): + sound = f"hiss{my.py_non_pcg_random_range_inclusive(1, 10)}" + my.thing_sound_play_channel(me, my.CHANNEL_MONST, sound) + + +def on_hit_dodge_do(me, hitter, x, y): + sound = f"hiss{my.py_non_pcg_random_range_inclusive(1, 10)}" + my.thing_sound_play_channel(me, my.CHANNEL_MONST, sound) + + +def on_death(me, x, y): + my.thing_msg(me, "The gnoll curses and dies!") + + sound = f"growl{my.py_non_pcg_random_range_inclusive(1, 10)}" + if not my.thing_sound_play_channel(me, my.CHANNEL_MONST, sound): + my.thing_sound_play_channel(me, my.CHANNEL_MONST_DEATH, sound) + + +def tp_init(name, text_long_name): + self = tp.Tp(name, text_long_name) + # begin sort marker + my.aggression_pct(self, 90) + my.ai_resent_count(self, 100) + my.ai_wanderer(self, True) + my.attack_eater(self, True) + my.attack_humanoid(self, True) + my.capacity_height(self, 6) + my.capacity_width(self, 6) + my.chance_d1000_carrier_of_treasure_class_A(self, 20) + my.chance_d1000_carrier_of_weapon_class_A(self, 1000) + my.chance_d1000_shooting(self, 500) + my.chance_d1000_tameable(self, 50) + my.collision_check(self, True) + my.collision_hit_priority(self, 20) + my.consume_per_bite_amount(self, 10) + my.distance_avoid(self, 4) + my.distance_throw(self, 10) + my.distance_vision(self, 10) + my.dmg_chance_d1000_nat_att(self, 0, 100) + my.dmg_limited_per_tick(self, True) + my.dmg_nat_att_dice(self, "1d4+1") + my.dmg_nat_att_type(self, "bite") + my.dmg_rcv_doubled_from_fire(self, True) + my.environ_dislikes_acid(self, 100) + my.environ_dislikes_cold(self, 100) + my.environ_dislikes_poison(self, 100) + my.environ_hates_fire(self, 10) + my.gfx_anim_use(self, "attack_red") + my.gfx_ascii_fade_with_dist(self, True) + my.gfx_ascii_shown(self, True) + my.gfx_pixelart_animated_can_hflip(self, True) + my.gfx_pixelart_animated(self, True) + my.gfx_pixelart_bounce_on_move(self, True) + my.gfx_pixelart_health_bar_shown(self, True) + my.gfx_pixelart_reflection(self, True) + my.gfx_pixelart_shadow(self, True) + my.gfx_pixelart_shadow_short(self, True) + my.gfx_pixelart_show_asleep_anim(self, True) + my.gfx_pixelart_show_highlighted(self, True) + my.gfx_pixelart_submergible(self, True) + my.gfx_pixelart_wobbles_when_hit(self, True) + my.has_a_head(self, True) + my.health_initial_dice(self, "3d6") + my.hunger_clock_tick_freq(self, 50) + my.hunger_is_insatiable(self, True) + my.is_able_to_be_surprised(self, True) + my.is_able_to_be_teleported(self, True) + my.is_able_to_fall(self, True) + my.is_able_to_freeze(self, True) + my.is_able_to_lunge(self, True) + my.is_able_to_rage(self, True) + my.is_able_to_rest(self, True) + my.is_able_to_see_in_the_dark(self, True) + my.is_able_to_shoot_at(self, True) + my.is_able_to_sleep(self, True) + my.is_able_to_swim(self, True) + my.is_able_to_tire(self, True) + my.is_able_to_use_amulet(self, True) + my.is_able_to_use_cloak(self, True) + my.is_able_to_use_ranged_weapons(self, True) + my.is_air_breather(self, True) + my.is_asleep_initially(self, True) + my.is_attackable_by_monst(self, True) + my.is_attackable_by_player(self, True) + my.is_biome_dungeon(self, True) + my.is_biome_ice(self, True) + my.is_biome_swamp(self, True) + my.is_bleeder(self, True) + my.is_buffable(self, True) + my.is_burnable(self, True) + my.is_corpse_on_death(self, True) + my.is_corpse_with_bones(self, True) + my.is_crushable(self, True) + my.is_daring(self, True) + my.is_described_in_leftbar(self, True) + my.is_described_when_hovering_over(self, True) + my.is_eater_of_meat(self, True) + my.is_eater_of_red_blood(self, True) + my.is_gnoll(self, True) + my.is_hittable(self, True) + my.is_humanoid(self, True) + my.is_immune_to_water(self, True) + my.is_interesting(self, True) + my.is_item_collector(self, True) + my.is_living(self, True) + my.is_loggable(self, True) + my.is_meat(self, True) + my.is_monst_class_A(self, True) + my.is_monst(self, True) + my.is_moveable(self, True) + my.is_msg_allowed_hears_something(self, True) + my.is_msg_allowed_is_dead(self, True) + my.is_msg_allowed_is_seen(self, True) + my.is_msg_allowed_is_surprised(self, True) + my.is_msg_allowed_is_wounded(self, True) + my.is_msg_allowed_senses_danger(self, True) + my.is_red_blooded(self, True) + my.is_shootable(self, True) + my.is_shovable(self, True) + my.is_swimmer_but_land_dweller(self, True) + my.is_swimmer(self, True) + my.is_tickable(self, True) + my.move_speed(self, 100) + my.noise_decibels_hearing(self, 10) + my.noise_on_moving(self, 50) + my.normal_placement_rules(self, True) + my.nutrition_dice(self, "1d4") + my.on_born_do(self, "me.on_born()") + my.on_death_do(self, "me.on_death()") + my.on_hit_and_still_alive_do(self, "me.on_hit_and_still_alive()") + my.on_hit_dodge_do(self, "me.on_hit_dodge_do()") + my.on_you_nat_attack_attempt_do(self, "me.on_you_nat_attack_attempt()") + my.rarity(self, my.RARITY_COMMON) # how rare within this monster class + my.stamina(self, 100) + my.stat_con(self, 11) + my.stat_def(self, 12) + my.stat_dex(self, 12) + my.stat_int(self, 8) + my.stat_luck(self, 2) + my.stat_psi(self, 8) + my.stat_str(self, 8) + my.temperature_max(self, 50) + my.temperature_min(self, 0) + my.temperature(self, 20) + my.temperature_sensitive(self, True) + my.text_a_or_an(self, "a") + my.text_description_long2(self, "The gnoll race carry an unknown curse and are hence very unlucky; as if being part hyena was not bad enough already...") + my.text_description_long3(self, "Gnolls detest dog-people.") + my.text_description_long4(self, "Gnolls often appear in packs.") + my.text_description_long(self, "Gnolls are feral humanoid hyena like people that are renowned for their combat prowess and baking.") + my.text_description_short(self, "A gnoll.") + my.text_hits(self, "gores") + my.thing_size(self, my.THING_SIZE_NORMAL) + my.tick_prio(self, my.MAP_TICK_PRIO_NORMAL) + my.z_depth(self, my.MAP_DEPTH_OBJ) + my.z_prio(self, my.MAP_Z_PRIO_MONST) + # end sort marker + + delay = 900 + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile="gnoll.sleeping.1", is_sleeping=True, delay_ms=delay) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile="gnoll.sleeping.2", is_sleeping=True, delay_ms=delay) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile=name + ".1", delay_ms=delay, frame=1) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile=name + ".2", delay_ms=delay, frame=2) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile=name + ".3", delay_ms=delay, frame=3) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="brown", + tile=name + ".4", delay_ms=delay, frame=4) + my.tile(self, + ascii_fg_char="g", ascii_bg_col_name="", ascii_fg_col_name="gray30", + tile="gnoll.dead.1", is_dead=True, delay_ms=delay) + + my.tp_update(self) + + +def init(): + tp_init(name="gnoll", text_long_name="gnoll") + + +init() diff --git a/python/things/monsters/gnoll_pack.py b/python/things/monsters/gnoll_pack.py new file mode 100644 index 000000000..fdbfb5935 --- /dev/null +++ b/python/things/monsters/gnoll_pack.py @@ -0,0 +1,37 @@ +import my +import tp + + +def on_born(me, x, y): + my.thing_friend(me, "gnoll") + my.thing_enemy(me, "dogman") + my.thing_carry(me, "dagger") + my.thing_carry(me, "dart") + + +def tp_init(name, text_long_name): + self = tp.Tp(name, text_long_name) + # begin sort marker + my.tick_prio(self, my.MAP_TICK_PRIO_NORMAL) + my.gfx_ascii_shown(self, True) + my.is_able_to_follow(self, True) + my.is_allied_with(self, "gnoll_pack") + my.is_biome_dungeon(self, True) + my.is_biome_ice(self, True) + my.is_biome_chasms(self, True) + my.distance_recruitment_max(self, 7) + my.is_monst_class_B(self, True) + my.is_loggable(self, True) + my.is_monst_pack(self, True) + my.is_loggable(self, True) + my.spawn_group_radius(self, 4) + my.spawn_group_size_dice(self, "1d4+3") + # end sort marker + my.tp_update(self) + + +def init(): + tp_init(name="gnoll_pack", text_long_name="gnoll pack") + + +init() diff --git a/python/things/monsters/thylacine.py b/python/things/monsters/thylacine.py index d4de66016..f66427205 100644 --- a/python/things/monsters/thylacine.py +++ b/python/things/monsters/thylacine.py @@ -4,6 +4,8 @@ def on_born(me, x, y): my.thing_friend(me, "is_thylacine") + my.thing_enemy(me, "dogman") + my.thing_enemy(me, "gnoll") def on_you_nat_attack_attempt(me, x, y): diff --git a/src/game_player.cpp b/src/game_player.cpp index 59bc7820c..107e66ee6 100644 --- a/src/game_player.cpp +++ b/src/game_player.cpp @@ -103,6 +103,8 @@ void Game::place_player(void) level->thing_new("dogman", point(x + 1, y + 1)); level->thing_new("dogman", point(x + 1, y - 1)); } + level->thing_new("gnoll", point(x + 2, y + 1)); + level->thing_new("dogman", point(x + 2, y - 3)); if (0) { level->thing_new("skeleton", point(x, y + 3)); auto w = level->thing_new("sword_holy", point(x, y)); diff --git a/src/my_py_thing.hpp b/src/my_py_thing.hpp index afad2c842..4d19abc27 100644 --- a/src/my_py_thing.hpp +++ b/src/my_py_thing.hpp @@ -358,6 +358,7 @@ PyObject *thing_is_dir_tl(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_dirt(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_dir_tr(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_dir_up(PyObject *obj, PyObject *args, PyObject *keywds); +PyObject *thing_is_dogman(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_dog(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_door(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_dragon_scales(PyObject *obj, PyObject *args, PyObject *keywds); @@ -421,6 +422,7 @@ PyObject *thing_is_gas_explosion_blocker(PyObject *obj, PyObject *args, PyObject PyObject *thing_is_gauntlet(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_gelatinous(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_glass(PyObject *obj, PyObject *args, PyObject *keywds); +PyObject *thing_is_gnoll(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_gnome(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_goat(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_golden(PyObject *obj, PyObject *args, PyObject *keywds); @@ -693,8 +695,6 @@ PyObject *thing_is_unused_flag41(PyObject *obj, PyObject *args, PyObject *keywds PyObject *thing_is_unused_flag42(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_unused_flag43(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_unused_flag44(PyObject *obj, PyObject *args, PyObject *keywds); -PyObject *thing_is_unused_flag45(PyObject *obj, PyObject *args, PyObject *keywds); -PyObject *thing_is_unused_flag46(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_unused_flag4(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_unused_flag5(PyObject *obj, PyObject *args, PyObject *keywds); PyObject *thing_is_unused_flag6(PyObject *obj, PyObject *args, PyObject *keywds); diff --git a/src/my_py_tp.hpp b/src/my_py_tp.hpp index bb75349bd..b47e5a982 100644 --- a/src/my_py_tp.hpp +++ b/src/my_py_tp.hpp @@ -425,6 +425,7 @@ TP_SET_PROTO(is_destroyed_on_hit_or_miss) TP_SET_PROTO(is_destroyed_on_hitting) TP_SET_PROTO(is_dirt) TP_SET_PROTO(is_dog) +TP_SET_PROTO(is_dogman) TP_SET_PROTO(is_door) TP_SET_PROTO(is_dragon_scales) TP_SET_PROTO(is_drinkable) @@ -486,6 +487,7 @@ TP_SET_PROTO(is_gas_explosion_blocker) TP_SET_PROTO(is_gauntlet) TP_SET_PROTO(is_gelatinous) TP_SET_PROTO(is_glass) +TP_SET_PROTO(is_gnoll) TP_SET_PROTO(is_gnome) TP_SET_PROTO(is_goat) TP_SET_PROTO(is_gold) @@ -768,8 +770,6 @@ TP_SET_PROTO(is_unused_flag41) TP_SET_PROTO(is_unused_flag42) TP_SET_PROTO(is_unused_flag43) TP_SET_PROTO(is_unused_flag44) -TP_SET_PROTO(is_unused_flag45) -TP_SET_PROTO(is_unused_flag46) TP_SET_PROTO(is_unused_flag5) TP_SET_PROTO(is_unused_flag6) TP_SET_PROTO(is_unused_flag7) diff --git a/src/my_thing.hpp b/src/my_thing.hpp index 42737ba9f..7462d3782 100644 --- a/src/my_thing.hpp +++ b/src/my_thing.hpp @@ -1674,6 +1674,7 @@ typedef class Thing_ int is_destroyed_on_hit_or_miss(void); int is_destroyed_on_hitting(void); int is_dirt(void); + int is_dogman(void); int is_dog(void); int is_door(void); int is_dragon_scales(void); @@ -1736,6 +1737,7 @@ typedef class Thing_ int is_gauntlet(void); int is_gelatinous(void); int is_glass(void); + int is_gnoll(void); int is_gnome(void); int is_goat(void); int is_golden(void); @@ -2013,8 +2015,6 @@ typedef class Thing_ int is_unused_flag42(void); int is_unused_flag43(void); int is_unused_flag44(void); - int is_unused_flag45(void); - int is_unused_flag46(void); int is_unused_flag4(void); int is_unused_flag5(void); int is_unused_flag6(void); diff --git a/src/my_thing_template.hpp b/src/my_thing_template.hpp index 4fcccd52b..060c642a1 100644 --- a/src/my_thing_template.hpp +++ b/src/my_thing_template.hpp @@ -438,6 +438,7 @@ class Tp int _is_destroyed_on_hitting {}; int _is_dirt {}; int _is_dog {}; + int _is_dogman {}; int _is_door {}; int _is_dragon_scales {}; int _is_drinkable {}; @@ -499,6 +500,7 @@ class Tp int _is_gauntlet {}; int _is_gelatinous {}; int _is_glass {}; + int _is_gnoll {}; int _is_gnome {}; int _is_goat {}; int _is_gold {}; @@ -778,8 +780,6 @@ class Tp int _is_unused_flag42 {}; int _is_unused_flag43 {}; int _is_unused_flag44 {}; - int _is_unused_flag45 {}; - int _is_unused_flag46 {}; int _is_unused_flag5 {}; int _is_unused_flag6 {}; int _is_unused_flag7 {}; @@ -1831,6 +1831,7 @@ class Tp int is_destroyed_on_hit_or_miss(void) const; int is_destroyed_on_hitting(void) const; int is_dirt(void) const; + int is_dogman(void) const; int is_dog(void) const; int is_door(void) const; int is_dragon_scales(void) const; @@ -1893,6 +1894,7 @@ class Tp int is_gauntlet(void) const; int is_gelatinous(void) const; int is_glass(void) const; + int is_gnoll(void) const; int is_gnome(void) const; int is_goat(void) const; int is_golden(void) const; @@ -2170,8 +2172,6 @@ class Tp int is_unused_flag42(void) const; int is_unused_flag43(void) const; int is_unused_flag44(void) const; - int is_unused_flag45(void) const; - int is_unused_flag46(void) const; int is_unused_flag4(void) const; int is_unused_flag5(void) const; int is_unused_flag6(void) const; @@ -2611,6 +2611,7 @@ class Tp void is_destroyed_on_hit_or_miss_set(int v); void is_destroyed_on_hitting_set(int v); void is_dirt_set(int v); + void is_dogman_set(int v); void is_dog_set(int v); void is_door_set(int v); void is_dragon_scales_set(int v); @@ -2673,6 +2674,7 @@ class Tp void is_gauntlet_set(int v); void is_gelatinous_set(int v); void is_glass_set(int v); + void is_gnoll_set(int v); void is_gnome_set(int v); void is_goat_set(int v); void is_golden_set(int v); @@ -2950,8 +2952,6 @@ class Tp void is_unused_flag42_set(int v); void is_unused_flag43_set(int v); void is_unused_flag44_set(int v); - void is_unused_flag45_set(int v); - void is_unused_flag46_set(int v); void is_unused_flag4_set(int v); void is_unused_flag5_set(int v); void is_unused_flag6_set(int v); diff --git a/src/py_thing_get.cpp b/src/py_thing_get.cpp index c17c1ecba..713d09f12 100644 --- a/src/py_thing_get.cpp +++ b/src/py_thing_get.cpp @@ -351,6 +351,7 @@ THING_BODY_GET_BOOL(thing_is_dir_tl, is_dir_tl) THING_BODY_GET_BOOL(thing_is_dir_tr, is_dir_tr) THING_BODY_GET_BOOL(thing_is_dir_up, is_dir_up) THING_BODY_GET_BOOL(thing_is_dog, is_dog) +THING_BODY_GET_BOOL(thing_is_dogman, is_dogman) THING_BODY_GET_BOOL(thing_is_door, is_door) THING_BODY_GET_BOOL(thing_is_dragon_scales, is_dragon_scales) THING_BODY_GET_BOOL(thing_is_drinkable, is_drinkable) @@ -413,6 +414,7 @@ THING_BODY_GET_BOOL(thing_is_gas_explosion_blocker, is_gas_explosion_blocker) THING_BODY_GET_BOOL(thing_is_gauntlet, is_gauntlet) THING_BODY_GET_BOOL(thing_is_gelatinous, is_gelatinous) THING_BODY_GET_BOOL(thing_is_glass, is_glass) +THING_BODY_GET_BOOL(thing_is_gnoll, is_gnoll) THING_BODY_GET_BOOL(thing_is_gnome, is_gnome) THING_BODY_GET_BOOL(thing_is_goat, is_goat) THING_BODY_GET_BOOL(thing_is_golden, is_golden) @@ -686,8 +688,6 @@ THING_BODY_GET_BOOL(thing_is_unused_flag41, is_unused_flag41) THING_BODY_GET_BOOL(thing_is_unused_flag42, is_unused_flag42) THING_BODY_GET_BOOL(thing_is_unused_flag43, is_unused_flag43) THING_BODY_GET_BOOL(thing_is_unused_flag44, is_unused_flag44) -THING_BODY_GET_BOOL(thing_is_unused_flag45, is_unused_flag45) -THING_BODY_GET_BOOL(thing_is_unused_flag46, is_unused_flag46) THING_BODY_GET_BOOL(thing_is_unused_flag4, is_unused_flag4) THING_BODY_GET_BOOL(thing_is_unused_flag5, is_unused_flag5) THING_BODY_GET_BOOL(thing_is_unused_flag6, is_unused_flag6) diff --git a/src/py_tp.cpp b/src/py_tp.cpp index b84a13745..61395e1bc 100644 --- a/src/py_tp.cpp +++ b/src/py_tp.cpp @@ -1141,6 +1141,7 @@ TP_BODY_SET_INT(is_destroyed_on_hit_or_miss) TP_BODY_SET_INT(is_destroyed_on_hitting) TP_BODY_SET_INT(is_dirt) TP_BODY_SET_INT(is_dog) +TP_BODY_SET_INT(is_dogman) TP_BODY_SET_INT(is_door) TP_BODY_SET_INT(is_dragon_scales) TP_BODY_SET_INT(is_drinkable) @@ -1202,6 +1203,7 @@ TP_BODY_SET_INT(is_gas_explosion_blocker) TP_BODY_SET_INT(is_gauntlet) TP_BODY_SET_INT(is_gelatinous) TP_BODY_SET_INT(is_glass) +TP_BODY_SET_INT(is_gnoll) TP_BODY_SET_INT(is_gnome) TP_BODY_SET_INT(is_goat) TP_BODY_SET_INT(is_gold) @@ -1479,8 +1481,6 @@ TP_BODY_SET_INT(is_unused_flag41) TP_BODY_SET_INT(is_unused_flag42) TP_BODY_SET_INT(is_unused_flag43) TP_BODY_SET_INT(is_unused_flag44) -TP_BODY_SET_INT(is_unused_flag45) -TP_BODY_SET_INT(is_unused_flag46) TP_BODY_SET_INT(is_unused_flag5) TP_BODY_SET_INT(is_unused_flag6) TP_BODY_SET_INT(is_unused_flag7) diff --git a/src/python_methods.cpp b/src/python_methods.cpp index 4a2ac1cf8..d7a67c5c8 100644 --- a/src/python_methods.cpp +++ b/src/python_methods.cpp @@ -675,6 +675,7 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_FUNCTION(thing_is_dir_tr), MY_ADD_PYTHON_FUNCTION(thing_is_dir_up), MY_ADD_PYTHON_FUNCTION(thing_is_dog), + MY_ADD_PYTHON_FUNCTION(thing_is_dogman), MY_ADD_PYTHON_FUNCTION(thing_is_door), MY_ADD_PYTHON_FUNCTION(thing_is_dragon_scales), MY_ADD_PYTHON_FUNCTION(thing_is_drinkable), @@ -737,6 +738,7 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_FUNCTION(thing_is_gauntlet), MY_ADD_PYTHON_FUNCTION(thing_is_gelatinous), MY_ADD_PYTHON_FUNCTION(thing_is_glass), + MY_ADD_PYTHON_FUNCTION(thing_is_gnoll), MY_ADD_PYTHON_FUNCTION(thing_is_gnome), MY_ADD_PYTHON_FUNCTION(thing_is_goat), MY_ADD_PYTHON_FUNCTION(thing_is_gold), @@ -1010,8 +1012,6 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag42), MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag43), MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag44), - MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag45), - MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag46), MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag5), MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag6), MY_ADD_PYTHON_FUNCTION(thing_is_unused_flag7), @@ -1601,6 +1601,7 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_TP_FUNCTION(is_destroyed_on_hitting), MY_ADD_PYTHON_TP_FUNCTION(is_dirt), MY_ADD_PYTHON_TP_FUNCTION(is_dog), + MY_ADD_PYTHON_TP_FUNCTION(is_dogman), MY_ADD_PYTHON_TP_FUNCTION(is_door), MY_ADD_PYTHON_TP_FUNCTION(is_dragon_scales), MY_ADD_PYTHON_TP_FUNCTION(is_drinkable), @@ -1662,6 +1663,7 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_TP_FUNCTION(is_gauntlet), MY_ADD_PYTHON_TP_FUNCTION(is_gelatinous), MY_ADD_PYTHON_TP_FUNCTION(is_glass), + MY_ADD_PYTHON_TP_FUNCTION(is_gnoll), MY_ADD_PYTHON_TP_FUNCTION(is_gnome), MY_ADD_PYTHON_TP_FUNCTION(is_goat), MY_ADD_PYTHON_TP_FUNCTION(is_gold), @@ -1939,8 +1941,6 @@ static PyMethodDef python_c_METHODS[] = { MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag42), MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag43), MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag44), - MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag45), - MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag46), MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag5), MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag6), MY_ADD_PYTHON_TP_FUNCTION(is_unused_flag7), diff --git a/src/thing_api.cpp b/src/thing_api.cpp index f0f14cf39..6def54b0f 100644 --- a/src/thing_api.cpp +++ b/src/thing_api.cpp @@ -433,15 +433,15 @@ int Thing::is_unused_flag44(void) TRACE_NO_INDENT(); return (tp()->is_unused_flag44()); } -int Thing::is_unused_flag45(void) +int Thing::is_gnoll(void) { TRACE_NO_INDENT(); - return (tp()->is_unused_flag45()); + return (tp()->is_gnoll()); } -int Thing::is_unused_flag46(void) +int Thing::is_dogman(void) { TRACE_NO_INDENT(); - return (tp()->is_unused_flag46()); + return (tp()->is_dogman()); } int Thing::is_vanquished_on_negation(void) { diff --git a/src/thing_match.cpp b/src/thing_match.cpp index 794ef1d4e..debb5df77 100644 --- a/src/thing_match.cpp +++ b/src/thing_match.cpp @@ -231,6 +231,7 @@ bool Tp::matches(const std::string &what) if (is_destroyed_on_hit_or_miss() && (what == "is_defeated _on_hit_and_still_alive_or_miss")) { return true; } if (is_destroyed_on_hitting() && (what == "is_defeated _on_hit_and_still_aliveting")) { return true; } if (is_dirt() && (what == "is_dirt")) { return true; } + if (is_dogman() && (what == "is_dogman")) { return true; } if (is_dog() && (what == "is_dog")) { return true; } if (is_door() && (what == "is_door")) { return true; } if (is_dragon_scales() && (what == "is_dragon_scales")) { return true; } @@ -292,6 +293,7 @@ bool Tp::matches(const std::string &what) if (is_gauntlet() && (what == "is_gauntlet")) { return true; } if (is_gelatinous() && (what == "is_gelatinous")) { return true; } if (is_glass() && (what == "is_glass")) { return true; } + if (is_gnoll() && (what == "is_gnoll")) { return true; } if (is_gnome() && (what == "is_gnome")) { return true; } if (is_goat() && (what == "is_goat")) { return true; } if (is_golden() && (what == "is_golden")) { return true; } @@ -555,8 +557,6 @@ bool Tp::matches(const std::string &what) if (is_unused_flag42() && (what == "is_unused_flag42")) { return true; } if (is_unused_flag43() && (what == "is_unused_flag43")) { return true; } if (is_unused_flag44() && (what == "is_unused_flag44")) { return true; } - if (is_unused_flag45() && (what == "is_unused_flag45")) { return true; } - if (is_unused_flag46() && (what == "is_unused_flag46")) { return true; } if (is_unused_flag4() && (what == "is_unused_flag4")) { return true; } if (is_unused_flag5() && (what == "is_unused_flag5")) { return true; } if (is_unused_flag6() && (what == "is_unused_flag6")) { return true; } @@ -842,6 +842,7 @@ bool Thing::matches(const std::string &what) if (is_destroyed_on_hit_or_miss() && (what == "is_defeated _on_hit_and_still_alive_or_miss")) { return true; } if (is_destroyed_on_hitting() && (what == "is_defeated _on_hit_and_still_aliveting")) { return true; } if (is_dirt() && (what == "is_dirt")) { return true; } + if (is_dogman() && (what == "is_dogman")) { return true; } if (is_dog() && (what == "is_dog")) { return true; } if (is_door() && (what == "is_door")) { return true; } if (is_dragon_scales() && (what == "is_dragon_scales")) { return true; } @@ -903,6 +904,7 @@ bool Thing::matches(const std::string &what) if (is_gauntlet() && (what == "is_gauntlet")) { return true; } if (is_gelatinous() && (what == "is_gelatinous")) { return true; } if (is_glass() && (what == "is_glass")) { return true; } + if (is_gnoll() && (what == "is_gnoll")) { return true; } if (is_gnome() && (what == "is_gnome")) { return true; } if (is_goat() && (what == "is_goat")) { return true; } if (is_golden() && (what == "is_golden")) { return true; } @@ -1167,8 +1169,6 @@ bool Thing::matches(const std::string &what) if (is_unused_flag42() && (what == "is_unused_flag42")) { return true; } if (is_unused_flag43() && (what == "is_unused_flag43")) { return true; } if (is_unused_flag44() && (what == "is_unused_flag44")) { return true; } - if (is_unused_flag45() && (what == "is_unused_flag45")) { return true; } - if (is_unused_flag46() && (what == "is_unused_flag46")) { return true; } if (is_unused_flag4() && (what == "is_unused_flag4")) { return true; } if (is_unused_flag5() && (what == "is_unused_flag5")) { return true; } if (is_unused_flag6() && (what == "is_unused_flag6")) { return true; } @@ -1449,6 +1449,7 @@ std::function< int(Thingp) > Thing::matches_to_func(const std::string &what) if (what == "is_described_in_leftbar") { return &Thing::is_described_in_leftbar; } if (what == "is_described_when_hovering_over") { return &Thing::is_described_when_hovering_over; } if (what == "is_dirt") { return &Thing::is_dirt; } + if (what == "is_dogman") { return &Thing::is_dogman; } if (what == "is_dog") { return &Thing::is_dog; } if (what == "is_door") { return &Thing::is_door; } if (what == "is_dragon_scales") { return &Thing::is_dragon_scales; } @@ -1510,6 +1511,7 @@ std::function< int(Thingp) > Thing::matches_to_func(const std::string &what) if (what == "is_gauntlet") { return &Thing::is_gauntlet; } if (what == "is_gelatinous") { return &Thing::is_gelatinous; } if (what == "is_glass") { return &Thing::is_glass; } + if (what == "is_gnoll") { return &Thing::is_gnoll; } if (what == "is_gnome") { return &Thing::is_gnome; } if (what == "is_goat") { return &Thing::is_goat; } if (what == "is_golden") { return &Thing::is_golden; } @@ -1767,8 +1769,6 @@ std::function< int(Thingp) > Thing::matches_to_func(const std::string &what) if (what == "is_unused_flag42") { return &Thing::is_unused_flag42; } if (what == "is_unused_flag43") { return &Thing::is_unused_flag43; } if (what == "is_unused_flag44") { return &Thing::is_unused_flag44; } - if (what == "is_unused_flag45") { return &Thing::is_unused_flag45; } - if (what == "is_unused_flag46") { return &Thing::is_unused_flag46; } if (what == "is_unused_flag4") { return &Thing::is_unused_flag4; } if (what == "is_unused_flag5") { return &Thing::is_unused_flag5; } if (what == "is_unused_flag6") { return &Thing::is_unused_flag6; } diff --git a/src/thing_template_fn.cpp b/src/thing_template_fn.cpp index 8248b5556..c29d72bfb 100644 --- a/src/thing_template_fn.cpp +++ b/src/thing_template_fn.cpp @@ -534,6 +534,7 @@ int Tp::is_described_when_hovering_over(void) const { return _is_described_when_ int Tp::is_destroyed_on_hit_or_miss(void) const { return _is_destroyed_on_hit_or_miss; } int Tp::is_destroyed_on_hitting(void) const { return _is_destroyed_on_hitting; } int Tp::is_dirt(void) const { return _is_dirt; } +int Tp::is_dogman(void) const { return _is_dogman; } int Tp::is_dog(void) const { return _is_dog; } int Tp::is_door(void) const { return _is_door; } int Tp::is_dragon_scales(void) const { return _is_dragon_scales; } @@ -596,6 +597,7 @@ int Tp::is_gas_explosion_blocker(void) const { return _is_gas_explosion_blocker; int Tp::is_gauntlet(void) const { return _is_gauntlet; } int Tp::is_gelatinous(void) const { return _is_gelatinous; } int Tp::is_glass(void) const { return _is_glass; } +int Tp::is_gnoll(void) const { return _is_gnoll; } int Tp::is_gnome(void) const { return _is_gnome; } int Tp::is_goat(void) const { return _is_goat; } int Tp::is_golden(void) const { return _is_golden; } @@ -872,8 +874,6 @@ int Tp::is_unused_flag41(void) const { return _is_unused_flag41; } int Tp::is_unused_flag42(void) const { return _is_unused_flag42; } int Tp::is_unused_flag43(void) const { return _is_unused_flag43; } int Tp::is_unused_flag44(void) const { return _is_unused_flag44; } -int Tp::is_unused_flag45(void) const { return _is_unused_flag45; } -int Tp::is_unused_flag46(void) const { return _is_unused_flag46; } int Tp::is_unused_flag4(void) const { return _is_unused_flag4; } int Tp::is_unused_flag5(void) const { return _is_unused_flag5; } int Tp::is_unused_flag6(void) const { return _is_unused_flag6; } @@ -1313,6 +1313,7 @@ void Tp::is_described_when_hovering_over_set(int v) { _is_described_when_hoverin void Tp::is_destroyed_on_hit_or_miss_set(int v) { _is_destroyed_on_hit_or_miss = v; } void Tp::is_destroyed_on_hitting_set(int v) { _is_destroyed_on_hitting = v; } void Tp::is_dirt_set(int v) { _is_dirt = v; } +void Tp::is_dogman_set(int v) { _is_dogman = v; } void Tp::is_dog_set(int v) { _is_dog = v; } void Tp::is_door_set(int v) { _is_door = v; } void Tp::is_dragon_scales_set(int v) { _is_dragon_scales = v; } @@ -1375,6 +1376,7 @@ void Tp::is_gas_explosion_blocker_set(int v) { _is_gas_explosion_blocker = v; } void Tp::is_gauntlet_set(int v) { _is_gauntlet = v; } void Tp::is_gelatinous_set(int v) { _is_gelatinous = v; } void Tp::is_glass_set(int v) { _is_glass = v; } +void Tp::is_gnoll_set(int v) { _is_gnoll = v; } void Tp::is_gnome_set(int v) { _is_gnome = v; } void Tp::is_goat_set(int v) { _is_goat = v; } void Tp::is_golden_set(int v) { _is_golden = v; } @@ -1651,8 +1653,6 @@ void Tp::is_unused_flag41_set(int v) { _is_unused_flag41 = v; } void Tp::is_unused_flag42_set(int v) { _is_unused_flag42 = v; } void Tp::is_unused_flag43_set(int v) { _is_unused_flag43 = v; } void Tp::is_unused_flag44_set(int v) { _is_unused_flag44 = v; } -void Tp::is_unused_flag45_set(int v) { _is_unused_flag45 = v; } -void Tp::is_unused_flag46_set(int v) { _is_unused_flag46 = v; } void Tp::is_unused_flag4_set(int v) { _is_unused_flag4 = v; } void Tp::is_unused_flag5_set(int v) { _is_unused_flag5 = v; } void Tp::is_unused_flag6_set(int v) { _is_unused_flag6 = v; } diff --git a/src/thing_template_ids.cpp b/src/thing_template_ids.cpp index 9d7263820..bb4d0b77a 100644 --- a/src/thing_template_ids.cpp +++ b/src/thing_template_ids.cpp @@ -515,6 +515,8 @@ std::initializer_list< std::string > tps = { "ghost_mob", "ginger", "gloat", + "gnoll", + "gnoll_pack", "gnome_all", "gnome_dwarf", "gnome_knight",