Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
f673a43
Add familiar interactions and dialogues for summoning
HarleyGilpin Jun 28, 2026
1ab7a08
Use static familiar chatheads instead of generic cat anims
HarleyGilpin Jun 28, 2026
a03ec16
Use large chatheads for summoning familiars
HarleyGilpin Jun 28, 2026
7d4c51c
Add forager familiar system with Magpie Withdraw
HarleyGilpin Jun 28, 2026
ee7e10b
Add foraging to the remaining overworld forager familiars
HarleyGilpin Jun 28, 2026
2e24480
Move dreadfowl/compost farming boost to the special-move option
HarleyGilpin Jun 29, 2026
f3d304b
Trigger dreadfowl/compost farming boost from the Special npc option
HarleyGilpin Jun 29, 2026
acca60d
Add dreadfowl Special dialogue and animation
HarleyGilpin Jun 29, 2026
f735f8b
Use dreadfowl special animation (5387)
HarleyGilpin Jun 29, 2026
39c5c4d
Add dreadfowl farming-boost graphics
HarleyGilpin Jun 29, 2026
bc7c923
Make familiar Farming boost non-stacking and removed on dismiss
HarleyGilpin Jun 29, 2026
f8416be
Add passive invisible familiar skill boosts
HarleyGilpin Jun 29, 2026
93c1036
Add random familiar overhead dialogue
HarleyGilpin Jun 29, 2026
2375c59
Move familiar overhead dialogue into a table definition
HarleyGilpin Jun 29, 2026
c52f634
Play per-familiar spawn animation on summon and call
HarleyGilpin Jun 29, 2026
1e17631
Add iron and steel titan talk dialogue
HarleyGilpin Jun 29, 2026
b5c77b5
Add albino rat spawn animation (best-guess 8545)
HarleyGilpin Jun 29, 2026
048c17e
Add albino rat spawn animation (best-guess 8545)
HarleyGilpin Jun 29, 2026
a7cfb2c
Merge remote-tracking branch 'origin/feat/summoning/interactions-and-…
HarleyGilpin Jun 29, 2026
8e71d12
Remove incorrect Albino rat familiar spawn animation.
HarleyGilpin Jun 29, 2026
e338993
Let familiars assist in single-way combat and grant owner xp
HarleyGilpin Jun 29, 2026
d3c7afb
Make familiars path to and chase their combat target
HarleyGilpin Jun 30, 2026
07748a5
Test familiar assists owner in single-way combat
HarleyGilpin Jun 30, 2026
56ed27b
Familiars only fight in multi-combat, not single-way
HarleyGilpin Jun 30, 2026
77ed45b
Familiars fight solo in single-way, can't share a target
HarleyGilpin Jun 30, 2026
2110c58
Test familiar walks to a distant ordered target in single-way
HarleyGilpin Jun 30, 2026
5a6f36a
Keep familiar pursuing its target when its path is blocked
HarleyGilpin Jun 30, 2026
0da075a
Let familiars chase a moving combat target
HarleyGilpin Jun 30, 2026
c131733
Familiar returns to following its owner when it can't reach its target
HarleyGilpin Jun 30, 2026
08e5ddf
Credit a familiar's kill to its owner
HarleyGilpin Jun 30, 2026
618d29d
Fix crash resolving familiar owner on non-familiar npc kills
HarleyGilpin Jun 30, 2026
8bcd7b3
Add familiar combat foundation
HarleyGilpin Jun 30, 2026
334e63c
Familiar re-acquires the owner's current target when freed
HarleyGilpin Jun 30, 2026
6f04e52
Let familiars phase through players, not npcs
HarleyGilpin Jun 30, 2026
c401a69
Set standard familiar attack speed to 8 ticks
HarleyGilpin Jun 30, 2026
d8d6039
feat: add familiar attack projectiles and animations.
HarleyGilpin Jun 30, 2026
22b4403
Drain summoning points over familiar lifetime
HarleyGilpin Jun 30, 2026
93a5670
feat: add familiar special moves with Howl projectile tuning
HarleyGilpin Jun 30, 2026
6a26ed0
adjust howl special move projectile for spirit wolf familiar.
HarleyGilpin Jul 1, 2026
6b8b9ee
fix: familiar special move casting, projectiles, hitsplats
HarleyGilpin Jul 1, 2026
0bb2d0f
fix: wire albino rat as a forager with Cheese Feast
HarleyGilpin Jul 1, 2026
0aa89e5
Adjust player animation to correct animation for renewing summoning p…
HarleyGilpin Jul 2, 2026
71a91ac
Adjust player animation to correct animation for renewing summoning p…
HarleyGilpin Jul 2, 2026
08a32b2
Feat: add egg spawn special move for spirit spider familiar
HarleyGilpin Jul 2, 2026
9bbda6d
fix: allow npcs to retaliate against player owned familiars.
HarleyGilpin Jul 2, 2026
f01e6b8
fix formatting - ran spotless apply
HarleyGilpin Jul 2, 2026
3d274fc
bug: fix allows npcs to retaliate against familiars that use special …
HarleyGilpin Jul 2, 2026
be00241
feat: add Burrow npc option to desert wyrm familiar
HarleyGilpin Jul 2, 2026
11ddfd1
feat: spirit scorpion venom shot fires a projectile at its owner
HarleyGilpin Jul 2, 2026
9d1eb33
refactor: drop venom shot impact graphic, keep only the projectile
HarleyGilpin Jul 2, 2026
f37a379
Adjust poison damage from venom shot charge
HarleyGilpin Jul 2, 2026
0f0cd10
feat: play cast animation, graphic and sound on every special move
HarleyGilpin Jul 2, 2026
9cf170d
feat: add compost mound Generate Compost special move
HarleyGilpin Jul 2, 2026
5835c5c
feat: giant chinchompa Explode special move
HarleyGilpin Jul 2, 2026
2d7d87a
feat: chinchompa auto-explode triggers when attacked, for free
HarleyGilpin Jul 2, 2026
523f26c
fix: show owner the blue 0 splat when a familiar is hit
HarleyGilpin Jul 2, 2026
3062759
fix: giant chinchompa attacks melee instead of ranged
HarleyGilpin Jul 2, 2026
7aca3d5
feat: honey badger Insane Ferocity buff
HarleyGilpin Jul 2, 2026
b04bcaa
feat: beaver Multichop, fletching and forage message
HarleyGilpin Jul 3, 2026
5f007e3
feat: Void familiars' Call to Arms teleport special
HarleyGilpin Jul 3, 2026
3568d44
feat: Void spinner heals its owner 100 life points every 15s
HarleyGilpin Jul 3, 2026
d385561
feat: Void shifter teleports owner to safety below 10% life points
HarleyGilpin Jul 3, 2026
0c3c752
test: cover Void shifter 10% threshold in life-point units
HarleyGilpin Jul 3, 2026
4f106ef
feat: Bull Rush stuns its target
HarleyGilpin Jul 3, 2026
9a5116a
fix: stunned characters can't swing while charging in
HarleyGilpin Jul 3, 2026
986f628
feat: minotaur familiars swing their axe (gfx 1498) on normal attacks
HarleyGilpin Jul 3, 2026
3a1e8bc
fix: projectiles emit from the source edge facing the target
HarleyGilpin Jul 3, 2026
ef4952c
feat: Bull Rush stuns on impact, a third of the time, over a 2s charge
HarleyGilpin Jul 3, 2026
1514dc0
feat: Macaw Herbcall searches out a grimy herb, on a 1-minute cooldown
HarleyGilpin Jul 3, 2026
89f5693
feat: Herbcall flies up, drops its herb mid-graphic, then recalls the…
HarleyGilpin Jul 4, 2026
9041e87
feat: cockatrice Drain option recasts Petrifying Gaze; Evil Flames pl…
HarleyGilpin Jul 4, 2026
856e697
fix: familiar specials deal life-point (x10) damage, matching normal …
HarleyGilpin Jul 4, 2026
01201d7
feat: nine familiar combat specials - Doomsphere, Spike Shot, Swamp P…
HarleyGilpin Jul 4, 2026
81228b5
feat: Dust Cloud chokes up to seven nearby foes; Iron Within and Stee…
HarleyGilpin Jul 4, 2026
7820b8b
feat: Regrowth revives a felled tree from its stump
HarleyGilpin Jul 4, 2026
c859e84
feat: Swallow Whole, Ophidian Incubation and Immense Heat item-target…
HarleyGilpin Jul 4, 2026
9ae585d
feat: familiar passives and item interactions - bunyip heal, forage x…
HarleyGilpin Jul 4, 2026
93e20fd
test: cover the combat, boost, item and passive familiar specials
HarleyGilpin Jul 4, 2026
b52baf5
feat: cast button explains how to trigger item-target specials
HarleyGilpin Jul 4, 2026
792476d
feat: item-target specials cast from the button onto an inventory item
HarleyGilpin Jul 4, 2026
c0d7739
fix: pyrelord and forge regent breathe fire beneath themselves when b…
HarleyGilpin Jul 4, 2026
5fb5ca1
feat: adjacent familiars face their idle owner; pyrelord steps west o…
HarleyGilpin Jul 4, 2026
067849b
fix: familiar no longer tucks in behind an owner who steps up beside it
HarleyGilpin Jul 4, 2026
d87c5be
feat: logs land at the familiar's feet before the pyrelord breathes fire
HarleyGilpin Jul 4, 2026
024398b
feat: familiars step out from under a player standing on their tile
HarleyGilpin Jul 4, 2026
ae3dfc7
fix: Thieving Fingers actually boosts Thieving by 2
HarleyGilpin Jul 5, 2026
ee4f99f
fix: a second same-tick graphic no longer overwrites the first
HarleyGilpin Jul 5, 2026
57ea960
fix: Blood Drain plays its visuals and restores stats by 2 + 20%
HarleyGilpin Jul 5, 2026
443a8aa
fix: Tireless Run plays the right visuals on the right characters
HarleyGilpin Jul 5, 2026
7cf7ca7
fix: QA pass over every familiar special in the testing tracker
HarleyGilpin Jul 5, 2026
8ca5e78
feat: familiar 'other abilities' from the testing tracker
HarleyGilpin Jul 5, 2026
1c5895c
feat: fishing foragers only produce while their owner fishes
HarleyGilpin Jul 5, 2026
67e0f16
feat: iron/steel titan and wolpertinger style-gated defence passives
HarleyGilpin Jul 5, 2026
a610e0d
feat: Drown and Flames order the familiar at its owner's target
HarleyGilpin Jul 5, 2026
9f907b9
fix: Dust Cloud fires as an AoE on a plain cast click
HarleyGilpin Jul 5, 2026
5e59fa9
fix: familiar AoE specials find npcs by their bodies, not anchor tiles
HarleyGilpin Jul 5, 2026
cf4df2d
fix: transformed npcs fall back to base-id interaction handlers
HarleyGilpin Jul 5, 2026
e99368f
fix: stranger plant swings its own attack animation
HarleyGilpin Jul 5, 2026
74a9644
fix: Toad Bark's cannonball flies darkan's low rising arc
HarleyGilpin Jul 5, 2026
5f5e48a
fix: familiar special projectiles fly at distance-scaled speed
HarleyGilpin Jul 5, 2026
dc4bdd8
fix: Toad Bark fires the multicannon's round cannonball graphic
HarleyGilpin Jul 5, 2026
e35543f
feat: cache graphic patching rotates the Toad Bark cannonball 180 deg…
HarleyGilpin Jul 5, 2026
b1dbae6
feat: Testudo plays its shell tint (gfx 1308) on the owner
HarleyGilpin Jul 5, 2026
ee9f062
fix: the bunyip transmute projectile flies from the player to the bunyip
HarleyGilpin Jul 5, 2026
fb9c2b0
fix: Fruitfall scatters fruit onto free tiles with landing splashes
HarleyGilpin Jul 5, 2026
4c46097
feat: the fruit bat flies up into the trees before dropping its fruit
HarleyGilpin Jul 5, 2026
9abc4a3
fix: familiars follow the real PvP rules when sent at players
HarleyGilpin Jul 5, 2026
d6af23a
fix: the arctic bear swings its own claws, not a spider's legs
HarleyGilpin Jul 5, 2026
69a175f
feat: Rise from the Ashes - the phoenix's special, built from the wiki
HarleyGilpin Jul 5, 2026
5c92876
fix: Rise from the Ashes targets ashes on the ground, reborn-scaled
HarleyGilpin Jul 5, 2026
50ce402
fix: the giant ent's transmuted runes stack
HarleyGilpin Jul 6, 2026
e2eed8d
fix: Titan's Constitution over-heals 80 life points past maximum
HarleyGilpin Jul 6, 2026
8c3841f
fix: Spike Shot stuns its target on impact
HarleyGilpin Jul 6, 2026
981bf92
fix: combat specials fire at the familiar's foe on a plain cast click
HarleyGilpin Jul 6, 2026
323a04d
fix: Steel of Legends' blade-storm graphic plays on the target alone
HarleyGilpin Jul 6, 2026
9f06928
fix: pack yak attack and defend animations
HarleyGilpin Jul 6, 2026
e4df927
chore: strip narration comments from the special toml files, remove d…
HarleyGilpin Jul 6, 2026
2017ee6
Merge remote-tracking branch 'upstream/main' into feat/summoning/inte…
HarleyGilpin Jul 6, 2026
faecc25
test: wrap InterfaceApi.onItem calls in runTest - it is suspend on main
HarleyGilpin Jul 6, 2026
59a3308
chore: adjust npc spawn for pikkupstix.
HarleyGilpin Jul 6, 2026
244809d
feat: Pikkupstix tutor dialogue and enchanted headgear scroll storage
HarleyGilpin Jul 6, 2026
23a1849
feat: enchant metal/god helms for scroll storage; Commune and Uncharg…
HarleyGilpin Jul 6, 2026
a7fdff9
feat: mirror stored scroll count onto the charged helm's item charge
HarleyGilpin Jul 6, 2026
737e5c0
feat: mirror stored scroll count onto the charged helm's item charge
HarleyGilpin Jul 6, 2026
9cfe6f6
fix: add the albino rat's missing summon animation
HarleyGilpin Jul 6, 2026
48097f1
fix: remove albino rat's incorrect summon animation
HarleyGilpin Jul 6, 2026
55c259a
feat: abyssal parasite turns Abyss prayer drain into gradual leak
HarleyGilpin Jul 6, 2026
9b7a17b
feat: Drown instantly casts water blast for two summoning points
HarleyGilpin Jul 6, 2026
124fc29
feat: Flames instantly casts fire spell for two summoning points
HarleyGilpin Jul 6, 2026
78d62fb
fix: default familiar chatheads to small dialogue heads
HarleyGilpin Jul 6, 2026
337bb32
feat: resolve familiar dialogue chatheads like cs2 script 751
HarleyGilpin Jul 6, 2026
c9c2372
fix: stop unmapped familiar chatheads playing the enums' default
HarleyGilpin Jul 6, 2026
686bf28
fix: replace typographic punctuation that crashes the client
HarleyGilpin Jul 6, 2026
70373a3
test: scan content sources for multi-byte client-bound characters
HarleyGilpin Jul 6, 2026
3fbfe75
fix: show static chatheads for familiars with unverified map values
HarleyGilpin Jul 6, 2026
89b4297
fix: play the enums' default chathead animation like the client does
HarleyGilpin Jul 6, 2026
2871387
feat: resolve pet dialogue chatheads through the cs2 enum lookup
HarleyGilpin Jul 6, 2026
1feaadc
fix: check the real level, not summoning points, in summoning gates
HarleyGilpin Jul 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,11 @@ object Params {
const val QUEST_INFO = 5262
const val VARIABLES = 5263
const val SUMMONING_BEAST_OF_BURDEN_ESSENCE = 5264
const val SUMMONING_SPECIAL_COST = 5265

private fun custom(name: String) = when (name) {
"summoning_beast_of_burden_essence" -> SUMMONING_BEAST_OF_BURDEN_ESSENCE
"summoning_special_cost" -> SUMMONING_SPECIAL_COST
"variables" -> VARIABLES
"quest_info" -> QUEST_INFO
"skill_cape_t" -> SKILL_CAPE_T
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package world.gregs.voidps.cache.definition.encoder

import world.gregs.voidps.buffer.write.Writer
import world.gregs.voidps.cache.DefinitionEncoder
import world.gregs.voidps.cache.definition.data.GraphicDefinition

class GraphicEncoder : DefinitionEncoder<GraphicDefinition> {

override fun Writer.encode(definition: GraphicDefinition, members: GraphicDefinition) {
if (definition.id == -1) {
return
}

if (definition.modelId != 0) {
writeByte(1)
writeShort(definition.modelId)
}

if (definition.animationId != -1) {
writeByte(2)
writeShort(definition.animationId)
}

if (definition.sizeXY != 128) {
writeByte(4)
writeShort(definition.sizeXY)
}

if (definition.sizeZ != 128) {
writeByte(5)
writeShort(definition.sizeZ)
}

if (definition.rotation != 0) {
writeByte(6)
writeShort(definition.rotation)
}

if (definition.ambience != 0) {
writeByte(7)
writeByte(definition.ambience)
}

if (definition.contrast != 0) {
writeByte(8)
writeByte(definition.contrast)
}

when (definition.aByte2381.toInt()) {
1 -> writeByte(11)
2 -> {
writeByte(14)
writeByte(definition.anInt2385 / 256)
}
3 -> when {
definition.anInt2385 == 8224 -> writeByte(9)
definition.anInt2385 in 0..0xffff -> {
writeByte(15)
writeShort(definition.anInt2385)
}
else -> {
writeByte(16)
writeInt(definition.anInt2385)
}
}
4 -> writeByte(12)
5 -> writeByte(13)
}

if (definition.aBoolean2402) {
writeByte(10)
}

definition.writeColoursTextures(this)
writeByte(0)
}
}
3 changes: 1 addition & 2 deletions data/area/asgarnia/taverley/taverley.npc-spawns.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
spawns = [
# 11573
{ id = "sanfew", x = 2897, y = 3426, level = 1, members = true },
{ id = "pikkupstix_spawn", x = 2925, y = 3443 },
{ id = "pikkupstix_spawn_2", x = 2925, y = 3443 },
{ id = "pikkupstix", x = 2925, y = 3443 },
{ id = "thaerisk_cemphier", x = 2916, y = 3449, level = 1, members = true },
{ id = "ivy_sophista", x = 2917, y = 3449, members = true },
{ id = "dalmatian", x = 2927, y = 3431, members = true },
Expand Down
4 changes: 2 additions & 2 deletions data/client/all.enums.toml
Original file line number Diff line number Diff line change
Expand Up @@ -371,11 +371,11 @@ id = 1187
[summoning_scroll_ids_1]
id = 1188

# Used if varp 4282 > 50
# Chathead animation from varbit 4282 minus 50, used by cs2 751 when the varbit is over 50
[pet_details_chathead_animations_sad]
id = 1275

# Used if varp 4282 <= 50
# Chathead animation from varbit 4282, used by cs2 751 when the varbit is 50 or under
[pet_details_chathead_animations_normal]
id = 1276

Expand Down
14 changes: 8 additions & 6 deletions data/entity/player/modal/toplevel/gameframe.ifaces.toml
Original file line number Diff line number Diff line change
Expand Up @@ -210,12 +210,11 @@ id = 12
[.renew_familiar]
id = 13

# Can't yet confirm that these 2 are cast / attack.
# Likely IDs 21 and 22 will be their left-click options as well
#[.n14]
#id = 14
#
#[.n15]
[.attack]
id = 14

# id 15 is the (still unconfirmed) cast option; its left-click counterpart is likely 22.
#[.cast]
#id = 15

[.leftclick_follower_details]
Expand All @@ -233,6 +232,9 @@ id = 19
[.leftclick_renew_familiar]
id = 20

[.leftclick_attack]
id = 21


[.cast_fetch_casket]
id = 87
Expand Down
256 changes: 256 additions & 0 deletions data/skill/summoning/familiar_overhead.tables.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
# Random overhead lines a summoned familiar periodically shouts (~every 30s, see
# SummoningTimers). Sourced from the RuneScape Wiki transcript "Overhead dialogue"
# sections. Keyed by familiar npc id; familiars without a row stay silent.

[familiar_overhead]
lines = "list<string>"

[.spirit_wolf_familiar]
lines = ["Grrrrr...", "Whuff-whuff!"]

[.dreadfowl_familiar]
lines = ["Bwaaak!", "Bwuk bwuk!"]

[.vampire_bat_familiar]
lines = ["Squeak!", "Squeak squeak!"]

[.spirit_terrorbird_familiar]
lines = ["Scree screee!", "Screee!"]

[.granite_crab_familiar]
lines = ["Chitter!", "Click click!"]

[.praying_mantis_familiar]
lines = ["Chitter!", "Clack clack!"]

[.giant_ent_familiar]
lines = ["Groooooan!", "Creeeeak!"]

[.spirit_cobra_familiar]
lines = ["Hssssssss!", "Hsss!"]

[.spirit_dagannoth_familiar]
lines = ["Raaaw!", "Grrrowl!"]

[.thorny_snail_familiar]
lines = ["Slither!", "Sclurp!"]

[.beaver_familiar]
lines = ["Gnawgnaw...", "Gnaw ..."]

[.karamthulhu_overlord_familiar]
lines = ["(Bow down!)", "(Obey!)"]

[.hydra_familiar]
lines = ["Rassssssp!", "Raaaaasp!"]

[.spirit_jelly_familiar]
lines = ["Jiggle!", "Flobble!"]

[.bunyip_familiar]
lines = ["Glorp glorp!", "Glorp!"]

[.war_tortoise_familiar]
lines = ["Hsss..."]

[.fruit_bat_familiar]
lines = ["Squeeeak!", "Squeee!"]

[.abyssal_parasite_familiar]
lines = ["Schlorp!", "Gurgle"]

[.abyssal_lurker_familiar]
lines = ["Craaaw!", "Screee!"]

[.unicorn_stallion_familiar]
lines = ["Whinney!", "Neigh!"]

[.magpie_familiar]
lines = ["Chirrup!", "Twitter!"]

[.stranger_plant_familiar]
lines = ["Rustle!", "Snapsnap!"]

[.desert_wyrm_familiar]
lines = ["Ssssss!", "Hssssss!"]

[.evil_turnip_familiar]
lines = ["Graaah!", "Hur hur hur!"]

[.spirit_scorpion_familiar]
lines = ["Clatter!", "Clack clack!"]

[.arctic_bear_familiar]
lines = ["Unf!", "Graaaowl!"]

[.spirit_spider_familiar]
lines = ["Clitterclatter!", "Click!"]

[.bloated_leech_familiar]
lines = ["Gurgle!", "Schlurp!"]

[.spirit_kalphite_familiar]
lines = ["Click click!", "Hsssss!"]

[.honey_badger_familiar]
lines = ["Raaaaar!", "Grooowl!"]

[.albino_rat_familiar]
lines = ["Squeee!", "Squeak squeak!"]

[.granite_lobster_familiar]
lines = ["Grind!", "Clonk clonk!"]

[.macaw_familiar]
lines = ["Braaak!", "Caw!"]

[.bronze_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.iron_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.steel_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.mithril_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.adamant_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.rune_minotaur_familiar]
lines = ["Out of the way!", "Hey, no-horns!"]

[.smoke_devil_familiar]
lines = ["Hoot!", "Honk!"]

[.bull_ant_familiar]
lines = ["Click click!", "Click!"]

[.wolpertinger_familiar]
lines = ["Mew!", "Raawr!"]

[.compost_mound_familiar]
lines = ["Splutter!", "Schlorp!"]

[.pack_yak_familiar]
lines = ["Barooo barooo!", "Barooo!"]

[.spirit_cockatrice_familiar]
lines = ["Bwwwark bwwwark!", "Bwwwark!"]

[.spirit_guthatrice_familiar]
lines = ["Caaaw caaaw!", "Caaaw!"]

[.spirit_saratrice_familiar]
lines = ["Hoooot hoooot!", "Hoooot!"]

[.spirit_zamatrice_familiar]
lines = ["Screeee screeee!", "Screeee!"]

[.spirit_pengatrice_familiar]
lines = ["Awk awk!", "Awk!"]

[.spirit_coraxatrice_familiar]
lines = ["Craaw craaw!", "Craaw!"]

[.spirit_vulatrice_familiar]
lines = ["Scraaaaw scraaaaw!", "Scraaaaw!"]

[.barker_toad_familiar]
lines = ["Braaaaap!", "Craaaaaaak!"]

[.ibis_familiar]
lines = ["Chirp!", "Twitter!"]

[.swamp_titan_familiar]
lines = ["Something smells clean...", "The power of stench compels you!"]

[.spirit_mosquito_familiar]
lines = ["Bzzzzzzzzz!", "Whiiiiiine!"]

[.void_spinner_familiar]
lines = ["Whiiiiiir!", "Whiiiir!"]

[.forge_regent_familiar]
lines = ["Sizzle!", "Crackle!"]

[.spirit_larupia_familiar]
lines = ["Hssssss!", "Ssssss!"]

[.geyser_titan_familiar]
lines = ["Pah!", "Flee from me!"]

[.lava_titan_familiar]
lines = ["Sacred flames...", "By my fire..."]

[.steel_titan_familiar]
lines = ["Stand back!", "I Am Legend!"]

[.obsidian_golem_familiar]
lines = ["Onward to glory!", "Stand back!"]

[.talon_beast_familiar]
lines = ["Growwwl!", "Mrowl!"]

[.abyssal_titan_familiar]
lines = ["Mwanu b'ruum!", "T'verah hoshay!"]

[.void_torcher_familiar]
lines = ["Scree!", "Squaa!"]

[.giant_chinchompa_familiar]
lines = ["Squeek!", "Squeek squeek!"]

[.fire_titan_familiar]
lines = ["Come on and fight!", "Hey, tiny!"]

[.moss_titan_familiar]
lines = ["Don't get me mad!", "Little soft humies!"]

[.ice_titan_familiar]
lines = ["I'm melting!", "It's so warm here!"]

[.spirit_tz-kih_familiar]
lines = ["Squee!", "Squee squee!"]

[.spirit_graahk_familiar]
lines = ["Howl!", "Rowr!"]

[.spirit_kyatt_familiar]
lines = ["Grrrrrr!", "Mrrrowl!"]

[.void_shifter_familiar]
lines = ["Chitter!", "Scree!"]

[.pyrelord_familiar]
lines = ["Whoosh!", "Crackle!"]

[.void_ravager_familiar]
lines = ["Rarf!", "Grrrrr!"]

[.ravenous_locust_familiar]
lines = ["Whiiiiiine!", "Click!"]

[.iron_titan_familiar]
lines = ["Victory!", "Crush them!"]

[.meerkats_familiar]
lines = ["Squeak squeak!", "Simples!"]

[.clay_familiar_class_1_familiar]
lines = ["Rumble!", "Rumble, rumble!"]

[.clay_familiar_class_2_familiar]
lines = ["Rumble!", "Rumble, rumble!"]

[.clay_familiar_class_3_familiar]
lines = ["Rumble!", "Rumble, rumble!"]

[.clay_familiar_class_4_familiar]
lines = ["Rumble!", "Rumble, rumble!"]

[.clay_familiar_class_5_familiar]
lines = ["Rumble!", "Rumble, rumble!"]

Loading