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",