From f59ddabef9f4d4caf4c1bb97fcd48e55e43e0ff4 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 19:23:27 -0500 Subject: [PATCH 01/80] Init --- .../area/misthalin/varrock/Gertrude.kt | 23 +++++++++++++--- .../member/gertrudes_cat/GertrudesCat.kt | 26 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index adc40323ef..686b3d0c2c 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,6 +1,8 @@ package content.area.misthalin.varrock +import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice @@ -58,8 +60,23 @@ class Gertrude : Script { } private suspend fun Player.unstarted() { - npc("Oh dear, oh dear. Whatever shall I do...") - player("What's wrong?") - npc("My poor little kitten has wandered off. Come back another time, dear, I haven't got the heart to chat.") + player("Hello, are you okay?") + npc("Do I look okay? Those kids drive me crazy.") + npc("I'm sorry. It's just that I've lost her.") + player("Lost whom?") + npc("Fluffs, poor Fluffs. She never hurt anyone.") + player("Who's Fluffs?") + npc("My beloved feline friend, Fluffs. She's been purring by my side for almost a decade. Please, could you go and search for her while I take care of the children?") + choice { + option("Well, I suppose I could, though I'd need more details.") { + + } + option("What's in it for me?") { + + } + option("Sorry, I'm too busy to play pet rescue.") { + + } + } } } diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt new file mode 100644 index 0000000000..7bf46051e9 --- /dev/null +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -0,0 +1,26 @@ +package content.quest.member.gertrudes_cat + +import content.quest.questJournal +import content.quest.questStage +import world.gregs.voidps.engine.Script + +// Source: https://runescape.wiki/w/Transcript:Gertrude%27s_Cat/Journal +// https://www.youtube.com/watch?v=_pZcnvI1l_Q from 2011 using a mix of RS3 and OSRS transcript and going as best as I can off of memory and videos. +const val GERTRUDES_CAT_STRING_NAME = "gertrudes_cat" +class GertrudesCat : Script { + init { + questJournalOpen(GERTRUDES_CAT_STRING_NAME) { + val progress = questStage(GERTRUDES_CAT_STRING_NAME) + val lines = mutableListOf() + + if(progress == 0){ + lines += "I can start this quest by speaking to Gertrude." + lines += "She can be found in a house south of the road leading west" + lines += "out of Varrock." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + questJournal("Gertrude's Cat", lines) + } + } +} \ No newline at end of file From a9d21fb49be8ad4a7b30c4bbbbbb7ac2bed9afa3 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 20:12:37 -0500 Subject: [PATCH 02/80] Initial Dialogue --- .../area/misthalin/varrock/Gertrude.kt | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 686b3d0c2c..af4d31dc5e 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -26,6 +26,7 @@ class Gertrude : Script { npcOperate("Talk-to", "gertrude") { when (quest("gertrudes_cat")) { "completed" -> postQuest() + "unstarted" -> unstarted() else -> unstarted() } } @@ -69,14 +70,37 @@ class Gertrude : Script { npc("My beloved feline friend, Fluffs. She's been purring by my side for almost a decade. Please, could you go and search for her while I take care of the children?") choice { option("Well, I suppose I could, though I'd need more details.") { - + questAccepted() } option("What's in it for me?") { - + npc("I'm sorry, I'm too poor to pay you anything, the best I could offer is a warm meal.") + npc("So, can you help?") + player("Just a meal? It's not the best offer I've had, but I suppose I can help.") + npc("I suppose I could give you some nice, yummy chocolate cake; maybe even a kitten too, if you seem like a nice sort.") + npc("Is that something you could be persuaded with?") + choice { + option("Well, I suppose I could, though I'd need more details.") { + questAccepted() + } + option("Sorry, I'm too busy to play pet rescue.") { + questRejected() + } + } } option("Sorry, I'm too busy to play pet rescue.") { - + questRejected() } } } + private suspend fun Player.questRejected() { + npc("Well, okay then. I'll have to find someone else; someone less heartless. It will be on your conscience if a poor kitty is lost in the wilds, though.") + } + private suspend fun Player.questAccepted() { + npc("Really? Thank you so much! I really have no idea where she could be!") + npc("I think my sons, Shilop and Wilough, saw the cat last. They'll be out in the marketplace.") + player("The marketplace? Which one would that be? It would help to know what they get up to, as well.") + npc("Really? Well, I generally let them do what they want, so I've no idea exactly what they would be doing. They are good lads, though. I'm sure they are just watching the passers-by in Varrock Marketplace.") + npc("Oh, to be young and carefree again!") + player("Alright then. I'll see what I can do. Two young lads in Varrock Marketplace; I can only hope that there's no school trip passing through when I arrive.") + } } From c2bd5bee8be2e0d9b5ee6542af1b9109065bfaef Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 20:53:25 -0500 Subject: [PATCH 03/80] Finished Gertrude's Dialogue. Added a stage name to each stage. Finished Stage 0 of Gertrude's Cat. --- .../members/gertrudes_cat/gertrudes_cat.varps.toml | 10 +++++++++- .../content/area/misthalin/varrock/Gertrude.kt | 14 +++++++++++++- .../quest/member/gertrudes_cat/GertrudesCat.kt | 9 +++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index 5ccb00e46e..ee9755b989 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -3,4 +3,12 @@ id = 180 persist = true format = "map" default = "unstarted" -values = { unstarted = 0, completed = 6 } +values = { + unstarted = 0, + spoke_to_gertrude = 1, + found_the_boys = 2, + found_fluffs = 3, + fed_fluffs = 4, + returned_fluffs = 5, + completed = 6, +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index af4d31dc5e..99b4bf6b29 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,6 +1,7 @@ package content.area.misthalin.varrock import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Quiz @@ -8,6 +9,7 @@ import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.entity.character.player.Player @@ -26,7 +28,7 @@ class Gertrude : Script { npcOperate("Talk-to", "gertrude") { when (quest("gertrudes_cat")) { "completed" -> postQuest() - "unstarted" -> unstarted() + "spoke_to_gertrude" -> lookingForInformation() else -> unstarted() } } @@ -96,6 +98,7 @@ class Gertrude : Script { npc("Well, okay then. I'll have to find someone else; someone less heartless. It will be on your conscience if a poor kitty is lost in the wilds, though.") } private suspend fun Player.questAccepted() { + set(GERTRUDES_CAT_STRING_NAME, "spoke_to_gertrude") npc("Really? Thank you so much! I really have no idea where she could be!") npc("I think my sons, Shilop and Wilough, saw the cat last. They'll be out in the marketplace.") player("The marketplace? Which one would that be? It would help to know what they get up to, as well.") @@ -103,4 +106,13 @@ class Gertrude : Script { npc("Oh, to be young and carefree again!") player("Alright then. I'll see what I can do. Two young lads in Varrock Marketplace; I can only hope that there's no school trip passing through when I arrive.") } + + private suspend fun Player.lookingForInformation() { + player("Hello Gertrude.") + npc("Have you seen my poor Fluffs?") + player("I'm afraid not.") + npc("What about Shilop?") + player("No sign of him either.") + npc("Hmm, strange; he should be in Varrock Marketplace.") + } } diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 7bf46051e9..cf8a184da2 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -20,6 +20,15 @@ class GertrudesCat : Script { questJournal("Gertrude's Cat", lines) return@questJournalOpen } + // Couldn't find anything official, this is just extrapolating. + lines += "I have talked to Gertrude about her cat. She is very upset." + + if(progress == 1){ + lines += "I need to speak to Gertrude's sons," + lines += "Shilop and Wilough, in Varrock Marketplace." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } questJournal("Gertrude's Cat", lines) } } From 1a439f38c535bf675b1da9e4743c594cfc5f0b6d Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 20:53:25 -0500 Subject: [PATCH 04/80] Finished Gertrude's Stage 0 Dialogue. Added a stage name to each stage. Finished Stage 0 of Gertrude's Cat. --- .../members/gertrudes_cat/gertrudes_cat.varps.toml | 10 +++++++++- .../content/area/misthalin/varrock/Gertrude.kt | 14 +++++++++++++- .../quest/member/gertrudes_cat/GertrudesCat.kt | 9 +++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index 5ccb00e46e..ee9755b989 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -3,4 +3,12 @@ id = 180 persist = true format = "map" default = "unstarted" -values = { unstarted = 0, completed = 6 } +values = { + unstarted = 0, + spoke_to_gertrude = 1, + found_the_boys = 2, + found_fluffs = 3, + fed_fluffs = 4, + returned_fluffs = 5, + completed = 6, +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index af4d31dc5e..99b4bf6b29 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,6 +1,7 @@ package content.area.misthalin.varrock import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Quiz @@ -8,6 +9,7 @@ import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.entity.character.player.Player @@ -26,7 +28,7 @@ class Gertrude : Script { npcOperate("Talk-to", "gertrude") { when (quest("gertrudes_cat")) { "completed" -> postQuest() - "unstarted" -> unstarted() + "spoke_to_gertrude" -> lookingForInformation() else -> unstarted() } } @@ -96,6 +98,7 @@ class Gertrude : Script { npc("Well, okay then. I'll have to find someone else; someone less heartless. It will be on your conscience if a poor kitty is lost in the wilds, though.") } private suspend fun Player.questAccepted() { + set(GERTRUDES_CAT_STRING_NAME, "spoke_to_gertrude") npc("Really? Thank you so much! I really have no idea where she could be!") npc("I think my sons, Shilop and Wilough, saw the cat last. They'll be out in the marketplace.") player("The marketplace? Which one would that be? It would help to know what they get up to, as well.") @@ -103,4 +106,13 @@ class Gertrude : Script { npc("Oh, to be young and carefree again!") player("Alright then. I'll see what I can do. Two young lads in Varrock Marketplace; I can only hope that there's no school trip passing through when I arrive.") } + + private suspend fun Player.lookingForInformation() { + player("Hello Gertrude.") + npc("Have you seen my poor Fluffs?") + player("I'm afraid not.") + npc("What about Shilop?") + player("No sign of him either.") + npc("Hmm, strange; he should be in Varrock Marketplace.") + } } diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 7bf46051e9..cf8a184da2 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -20,6 +20,15 @@ class GertrudesCat : Script { questJournal("Gertrude's Cat", lines) return@questJournalOpen } + // Couldn't find anything official, this is just extrapolating. + lines += "I have talked to Gertrude about her cat. She is very upset." + + if(progress == 1){ + lines += "I need to speak to Gertrude's sons," + lines += "Shilop and Wilough, in Varrock Marketplace." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } questJournal("Gertrude's Cat", lines) } } From 729d46763c48e42d17b1a6d93ed1a041ff8bb737 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 21:41:30 -0500 Subject: [PATCH 05/80] Initial Wilough Script --- .../content/area/misthalin/varrock/Wilough.kt | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt new file mode 100644 index 0000000000..ad5729dd07 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -0,0 +1,68 @@ +package content.area.misthalin.varrock + +import content.entity.player.dialogue.Admit +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.type.npc +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME +import content.quest.quest +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.type.statement + +const val WILOUGH_STRING_NAME = "wilough" + +// Source: https://runescape.wiki/w/Transcript:Wilough +// For some reason his face is small in dialogue. + +class Wilough : Script { + init { + npcOperate("Talk-to", WILOUGH_STRING_NAME){ + when (quest(GERTRUDES_CAT_STRING_NAME)) { + "completed" -> postQuest() + "spoke_to_gertrude" -> gertrudeLookingForInformation() + "found_the_boys" -> gertrudeWhereFluffs() + else -> unstarted() + } + } + } + + private suspend fun Player.unstarted() { + player("Hello youngster!") + npc("I don't talk to strange old people.") + player("Hey who you calling old?! And strange?!") + npc("You obviously. Old, strange and stupid.") + player("Whatever.") + } + + suspend fun Player.gertrudeLookingForInformation() { + player("Hello there, I've been looking for you and it's important.") + npc("I didn't mean to take it! I just forgot to pay.") + player("What? I'm trying to help your mum find some cat called Fluffs.") + npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.") + player("Where is this secret hideout? I really need to find that cat for your mum.") + npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.") + player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") + npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.") + } + + private suspend fun Player.postQuest() { + player("Hello again.") + npc("You think you're tough do you?") + player("Pardon?") + npc("I can beat anyone up.") + player("Really?") + statement("The boy starts jumping around with his fists up. You decide it's best not to kill him yet.") // Source - Under "Trivia" last point: https://runescape.wiki/w/Wilough + } + + // Source: https://oldschool.runescape.wiki/w/Transcript:Gertrude%27s_Cat + suspend fun Player.gertrudeWhereFluffs() { + player("Where did you say you saw Fluffs?") + npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.") + } +} \ No newline at end of file From 91806b018432d335ffed53babe6b8bac4d0bc18f Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 22:26:37 -0500 Subject: [PATCH 06/80] Finished Wilough --- .../content/area/misthalin/varrock/Wilough.kt | 77 ++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index ad5729dd07..b1df20f868 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -5,8 +5,11 @@ import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Neutral import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Sad import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest @@ -14,6 +17,9 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.entity.character.player.Player import content.entity.player.dialogue.type.player import content.entity.player.dialogue.type.statement +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove const val WILOUGH_STRING_NAME = "wilough" @@ -25,7 +31,7 @@ class Wilough : Script { npcOperate("Talk-to", WILOUGH_STRING_NAME){ when (quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> postQuest() - "spoke_to_gertrude" -> gertrudeLookingForInformation() + "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() else -> unstarted() } @@ -34,12 +40,77 @@ class Wilough : Script { private suspend fun Player.unstarted() { player("Hello youngster!") - npc("I don't talk to strange old people.") + npc("I don't talk to strange old people.", largeHead = true) player("Hey who you calling old?! And strange?!") - npc("You obviously. Old, strange and stupid.") + npc("You obviously. Old, strange and stupid.", largeHead = true) player("Whatever.") } + private suspend fun Player.lookingForInformationBranch() { + gertrudeLookingForInformation() + choice { + option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { + npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) + player("I'm an upstanding citizen!") + npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) + npc(npcId = SHILOP_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) + statement("You decide it's best not to aggravate the repulsive boys any more.") + } + option("What will make you tell me?") { + gertrudeFluffsCost() + } + option("Well never mind, it's Fluffs loss.") { + gertrudeFluffsLoss() + } + } + } + + suspend fun Player.gertrudeFluffsCost() { + npc("Well... Now you ask, I'm a bit short on cash.", largeHead = true) + player("How much?") + npc("100 coins should cover it.", largeHead = true) + player("100 coins! What sort of expensive things do you need that badly?") + npc("Well I Don't like chocolate and have you seen how much sweets cost to buy?", largeHead = true) + player("Why should I pay you then, canyou answer that as easily?") + npc("Obviously you shouldn't pay that much, but I won't help otherwise. I never liked that cat anyway, fussy scratchy thing it is, so what do you say?", largeHead = true) + choice { + option("I'm not paying you a thing.") { + gertrudeLifeOfCrime() + } + option("Okay then, I'll pay.") { + gertrudePayChildren() + } + } + } + + suspend fun Player.gertrudePayChildren() { + player("Okay then, I'll pay, but I'll want you to tell your mother what a nice person I am.") + npc("What?", largeHead = true) + player("I'll want you to tell your mother what a nice person I am so she rewards me for this search.") + npc("It's a deal.", largeHead = true) + if (inventory.contains("coins", 100)) { + inventory.remove("coins", 100) + set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") + statement("You give the lad 100 coins.") + player("There you go, now where did you see Fluffs?") + npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.") + player("Anything else?") + npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.") + } else { + player("This is a bit embarrassing - I'll have to get some money first.") + npc("I'll be waiting.") + message("You can not afford that.") + } + } + + suspend fun Player.gertrudeLifeOfCrime() { + npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.") + } + + suspend fun Player.gertrudeFluffsLoss() { + npc("I'm sure our mum will get over it.") + } + suspend fun Player.gertrudeLookingForInformation() { player("Hello there, I've been looking for you and it's important.") npc("I didn't mean to take it! I just forgot to pay.") From 571ef5eca70a54b3c8075c8311f4fbd45be116b1 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 22:29:01 -0500 Subject: [PATCH 07/80] Added large head to all of npc dialogue in Wilough --- .../content/area/misthalin/varrock/Wilough.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index b1df20f868..eae118c7a2 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -93,40 +93,40 @@ class Wilough : Script { set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") statement("You give the lad 100 coins.") player("There you go, now where did you see Fluffs?") - npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.") + npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.", largeHead = true) player("Anything else?") - npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.") + npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.", largeHead = true) } else { player("This is a bit embarrassing - I'll have to get some money first.") - npc("I'll be waiting.") + npc("I'll be waiting.", largeHead = true) message("You can not afford that.") } } suspend fun Player.gertrudeLifeOfCrime() { - npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.") + npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.", largeHead = true) } suspend fun Player.gertrudeFluffsLoss() { - npc("I'm sure our mum will get over it.") + npc("I'm sure our mum will get over it.", largeHead = true) } suspend fun Player.gertrudeLookingForInformation() { player("Hello there, I've been looking for you and it's important.") - npc("I didn't mean to take it! I just forgot to pay.") + npc("I didn't mean to take it! I just forgot to pay.", largeHead = true) player("What? I'm trying to help your mum find some cat called Fluffs.") - npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.") + npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.", largeHead = true) player("Where is this secret hideout? I really need to find that cat for your mum.") - npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.") + npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.", largeHead = true) player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") - npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.") + npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.", largeHead = true) } private suspend fun Player.postQuest() { player("Hello again.") - npc("You think you're tough do you?") + npc("You think you're tough do you?", largeHead = true) player("Pardon?") - npc("I can beat anyone up.") + npc("I can beat anyone up.", largeHead = true) player("Really?") statement("The boy starts jumping around with his fists up. You decide it's best not to kill him yet.") // Source - Under "Trivia" last point: https://runescape.wiki/w/Wilough } @@ -134,6 +134,6 @@ class Wilough : Script { // Source: https://oldschool.runescape.wiki/w/Transcript:Gertrude%27s_Cat suspend fun Player.gertrudeWhereFluffs() { player("Where did you say you saw Fluffs?") - npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.") + npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.", largeHead = true) } } \ No newline at end of file From 8180d8b91d4f9399f73ba1bd98578ae259bee534 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 22:47:55 -0500 Subject: [PATCH 08/80] Finished both Shilop's and Wilough's Dialogue --- .../content/area/misthalin/varrock/Shilop.kt | 49 +++++ .../content/area/misthalin/varrock/Wilough.kt | 173 +++++++++--------- 2 files changed, 136 insertions(+), 86 deletions(-) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt new file mode 100644 index 0000000000..9769fb12dd --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt @@ -0,0 +1,49 @@ +package content.area.misthalin.varrock + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.type.statement +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME +import content.quest.quest +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +const val SHILOP_STRING_NAME = "shilop" + +class Shilop : Script { + init { + npcOperate("Talk-to", SHILOP_STRING_NAME){ + when (quest(GERTRUDES_CAT_STRING_NAME)) { + "completed" -> postQuest() + "spoke_to_gertrude" -> lookingForInformationBranch() + "found_the_boys" -> gertrudeWhereFluffs() + else -> gertrudeUnstarted() + } + } + } +} + +private suspend fun Player.lookingForInformationBranch() { + gertrudeLookingForInformation() + choice { + option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { + npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) + player("I'm an upstanding citizen!") + npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) + npc(npcId = WILOUGH_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) + statement("You decide it's best not to aggravate the repulsive boys any more.") + } + option("What will make you tell me?") { + gertrudeFluffsCost() + } + option("Well never mind, it's Fluffs loss.") { + gertrudeFluffsLoss() + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index eae118c7a2..4fc1972860 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -9,6 +9,7 @@ import content.entity.player.dialogue.Neutral import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Sad import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.Shock import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME @@ -33,107 +34,107 @@ class Wilough : Script { "completed" -> postQuest() "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() - else -> unstarted() + else -> gertrudeUnstarted() } } } +} - private suspend fun Player.unstarted() { - player("Hello youngster!") - npc("I don't talk to strange old people.", largeHead = true) - player("Hey who you calling old?! And strange?!") - npc("You obviously. Old, strange and stupid.", largeHead = true) - player("Whatever.") - } +suspend fun Player.gertrudeUnstarted() { + player("Hello youngster!") + npc("I don't talk to strange old people.", largeHead = true) + player("Hey who you calling old?! And strange?!") + npc("You obviously. Old, strange and stupid.", largeHead = true) + player("Whatever.") +} - private suspend fun Player.lookingForInformationBranch() { - gertrudeLookingForInformation() - choice { - option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { - npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) - player("I'm an upstanding citizen!") - npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) - npc(npcId = SHILOP_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) - statement("You decide it's best not to aggravate the repulsive boys any more.") - } - option("What will make you tell me?") { - gertrudeFluffsCost() - } - option("Well never mind, it's Fluffs loss.") { - gertrudeFluffsLoss() - } +private suspend fun Player.lookingForInformationBranch() { + gertrudeLookingForInformation() + choice { + option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { + npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) + player("I'm an upstanding citizen!") + npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) + npc(npcId = SHILOP_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) + statement("You decide it's best not to aggravate the repulsive boys any more.") } - } - - suspend fun Player.gertrudeFluffsCost() { - npc("Well... Now you ask, I'm a bit short on cash.", largeHead = true) - player("How much?") - npc("100 coins should cover it.", largeHead = true) - player("100 coins! What sort of expensive things do you need that badly?") - npc("Well I Don't like chocolate and have you seen how much sweets cost to buy?", largeHead = true) - player("Why should I pay you then, canyou answer that as easily?") - npc("Obviously you shouldn't pay that much, but I won't help otherwise. I never liked that cat anyway, fussy scratchy thing it is, so what do you say?", largeHead = true) - choice { - option("I'm not paying you a thing.") { - gertrudeLifeOfCrime() - } - option("Okay then, I'll pay.") { - gertrudePayChildren() - } + option("What will make you tell me?") { + gertrudeFluffsCost() + } + option("Well never mind, it's Fluffs loss.") { + gertrudeFluffsLoss() } } +} - suspend fun Player.gertrudePayChildren() { - player("Okay then, I'll pay, but I'll want you to tell your mother what a nice person I am.") - npc("What?", largeHead = true) - player("I'll want you to tell your mother what a nice person I am so she rewards me for this search.") - npc("It's a deal.", largeHead = true) - if (inventory.contains("coins", 100)) { - inventory.remove("coins", 100) - set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") - statement("You give the lad 100 coins.") - player("There you go, now where did you see Fluffs?") - npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.", largeHead = true) - player("Anything else?") - npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.", largeHead = true) - } else { - player("This is a bit embarrassing - I'll have to get some money first.") - npc("I'll be waiting.", largeHead = true) - message("You can not afford that.") +suspend fun Player.gertrudeFluffsCost() { + npc("Well... Now you ask, I'm a bit short on cash.", largeHead = true) + player("How much?") + npc("100 coins should cover it.", largeHead = true) + player("100 coins! What sort of expensive things do you need that badly?") + npc("Well I Don't like chocolate and have you seen how much sweets cost to buy?", largeHead = true) + player("Why should I pay you then, can you answer that as easily?") + npc("Obviously you shouldn't pay that much, but I won't help otherwise. I never liked that cat anyway, fussy scratchy thing it is, so what do you say?", largeHead = true) + choice { + option("I'm not paying you a thing.") { + gertrudeLifeOfCrime() + } + option("Okay then, I'll pay.") { + gertrudePayChildren() } } +} - suspend fun Player.gertrudeLifeOfCrime() { - npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.", largeHead = true) +suspend fun Player.gertrudePayChildren() { + player("Okay then, I'll pay, but I'll want you to tell your mother what a nice person I am.") + npc("What?", largeHead = true) + player("I'll want you to tell your mother what a nice person I am so she rewards me for this search.") + npc("It's a deal.", largeHead = true) + if (inventory.contains("coins", 100)) { + inventory.remove("coins", 100) + set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") + statement("You give the lad 100 coins.") + player("There you go, now where did you see Fluffs?") + npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.", largeHead = true) + player("Anything else?") + npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.", largeHead = true) + } else { + player("This is a bit embarrassing - I'll have to get some money first.") + npc("I'll be waiting.", largeHead = true) + message("You can not afford that.") } +} - suspend fun Player.gertrudeFluffsLoss() { - npc("I'm sure our mum will get over it.", largeHead = true) - } +suspend fun Player.gertrudeLifeOfCrime() { + npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.", largeHead = true) +} - suspend fun Player.gertrudeLookingForInformation() { - player("Hello there, I've been looking for you and it's important.") - npc("I didn't mean to take it! I just forgot to pay.", largeHead = true) - player("What? I'm trying to help your mum find some cat called Fluffs.") - npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.", largeHead = true) - player("Where is this secret hideout? I really need to find that cat for your mum.") - npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.", largeHead = true) - player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") - npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.", largeHead = true) - } +suspend fun Player.gertrudeFluffsLoss() { + npc("I'm sure our mum will get over it.", largeHead = true) +} - private suspend fun Player.postQuest() { - player("Hello again.") - npc("You think you're tough do you?", largeHead = true) - player("Pardon?") - npc("I can beat anyone up.", largeHead = true) - player("Really?") - statement("The boy starts jumping around with his fists up. You decide it's best not to kill him yet.") // Source - Under "Trivia" last point: https://runescape.wiki/w/Wilough - } +suspend fun Player.gertrudeLookingForInformation() { + player("Hello there, I've been looking for you and it's important.") + npc("I didn't mean to take it! I just forgot to pay.", largeHead = true) + player("What? I'm trying to help your mum find some cat called Fluffs.") + npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.", largeHead = true) + player("Where is this secret hideout? I really need to find that cat for your mum.") + npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.", largeHead = true) + player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") + npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.", largeHead = true) +} - // Source: https://oldschool.runescape.wiki/w/Transcript:Gertrude%27s_Cat - suspend fun Player.gertrudeWhereFluffs() { - player("Where did you say you saw Fluffs?") - npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.", largeHead = true) - } +suspend fun Player.postQuest() { + player("Hello again.") + npc("You think you're tough do you?", largeHead = true) + player("Pardon?") + npc("I can beat anyone up.", largeHead = true) + player("Really?") + statement("The boy starts jumping around with his fists up. You decide it's best not to kill him yet.") // Source - Under "Trivia" last point: https://runescape.wiki/w/Wilough +} + +// Source: https://oldschool.runescape.wiki/w/Transcript:Gertrude%27s_Cat +suspend fun Player.gertrudeWhereFluffs() { + player("Where did you say you saw Fluffs?") + npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.", largeHead = true) } \ No newline at end of file From e56fce65bbfafcd062ed3c757a541e742aa367aa Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 22:54:15 -0500 Subject: [PATCH 09/80] Finished quest stage 1 --- .../quest/member/gertrudes_cat/GertrudesCat.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index cf8a184da2..baca00003a 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -23,12 +23,23 @@ class GertrudesCat : Script { // Couldn't find anything official, this is just extrapolating. lines += "I have talked to Gertrude about her cat. She is very upset." - if(progress == 1){ + if(progress == 1) { lines += "I need to speak to Gertrude's sons," lines += "Shilop and Wilough, in Varrock Marketplace." questJournal("Gertrude's Cat", lines) return@questJournalOpen } + + lines += "I spoke with Gertrude's sons," + lines += "Shilop and Wilough, in Varrock Marketplace." + + if(progress == 2) { + lines += "I need to go to Shilop and Wilough's secret hideout" + lines += "in an abandoned Lumber Mill, to the north-east and find" + lines += "Fluffs, then return her to Gertrude." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } questJournal("Gertrude's Cat", lines) } } From ec650b0574b93bb6dc777d5532d677572218ca88 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 23:16:07 -0500 Subject: [PATCH 10/80] Added Kanel and Philop dialogues --- .../content/area/misthalin/varrock/Kanel.kt | 43 +++++++++++++++++++ .../content/area/misthalin/varrock/Philop.kt | 43 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt new file mode 100644 index 0000000000..5334dbca0b --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt @@ -0,0 +1,43 @@ +package content.area.misthalin.varrock + +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.quest +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +private const val KANEL_STRING_NAME = "kanel" + +// Source: https://runescape.wiki/w/Transcript:Kanel + +class Kanel : Script { + init { + npcOperate("Talk-to", KANEL_STRING_NAME) { + when (quest("gertrudes_cat")) { + "spoke_to_gertrude" -> lookingForInformation() + else -> unstarted() + } + } + } + + private suspend fun Player.unstarted() { + player("Hello there.") + npc("Hel-lo?", largeHead = true) + player("Right. Goodbye.") + npc("Bye?", largeHead = true) + } + + private suspend fun Player.lookingForInformation() { + player("Hello there.") + npc("Hel-lo?", largeHead = true) + player("Have you seen Fluffs?") + npc("F-wuffs?", largeHead = true) + player("She's your mummy's cat.") + npc("Cat?", largeHead = true) + player("Right. Bye Kanel.") + npc("Me?", largeHead = true) + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt new file mode 100644 index 0000000000..63377172b6 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt @@ -0,0 +1,43 @@ +package content.area.misthalin.varrock + +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.quest +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +private const val PHILOP_STRING_NAME = "philop" + +// Source: https://runescape.wiki/w/Transcript:Philop +class Philop : Script { + init { + npcOperate("Talk-to", PHILOP_STRING_NAME) { + when (quest("gertrudes_cat")) { + "spoke_to_gertrude" -> lookingForInformation() + else -> unstarted() + } + } + } + private suspend fun Player.unstarted() { + greetChild() + player("Enjoy playing with your dragon, then.") + npc("Gwwwrrr!", largeHead = true) + } + private suspend fun Player.greetChild() { + player("Hello, what's your name?") + npc("Gwwrr!", largeHead = true) + player("Err, hello there. What's that you have there?") + npc("Gwwwrrr! Dwa-gon Gwwwwrrrr!", largeHead = true) + } + + private suspend fun Player.lookingForInformation() { + greetChild() + player("What a nice dragon, have you seen Fluffs little boy?") + npc("Dwa-gon nasty, dwa-gon eat Fwuffs, gwwwrrr, hungwy chomp chomp!", largeHead = true) + player("I see. I don't think this is the most helpful clue I have ever been given.") + npc("Gwwrr!", largeHead = true) + } +} \ No newline at end of file From d54c9f17c05e21b942b98586a786df329aafb482 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 23:16:31 -0500 Subject: [PATCH 11/80] Changed postQuest to gertrudePostQuest --- game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt | 2 +- .../src/main/kotlin/content/area/misthalin/varrock/Wilough.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt index 9769fb12dd..31a383257e 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt @@ -20,7 +20,7 @@ class Shilop : Script { init { npcOperate("Talk-to", SHILOP_STRING_NAME){ when (quest(GERTRUDES_CAT_STRING_NAME)) { - "completed" -> postQuest() + "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() else -> gertrudeUnstarted() diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index 4fc1972860..e57e1fa89d 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -31,7 +31,7 @@ class Wilough : Script { init { npcOperate("Talk-to", WILOUGH_STRING_NAME){ when (quest(GERTRUDES_CAT_STRING_NAME)) { - "completed" -> postQuest() + "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() else -> gertrudeUnstarted() @@ -124,7 +124,7 @@ suspend fun Player.gertrudeLookingForInformation() { npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.", largeHead = true) } -suspend fun Player.postQuest() { +suspend fun Player.gertrudePostQuest() { player("Hello again.") npc("You think you're tough do you?", largeHead = true) player("Pardon?") From d3ace1d355e995a7c5bb57e34337bec29f7d4c04 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 10 Sep 2026 23:23:04 -0500 Subject: [PATCH 12/80] Commented --- .../member/gertrudes_cat/GertrudesCat.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index baca00003a..d71ac582cd 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -40,6 +40,25 @@ class GertrudesCat : Script { questJournal("Gertrude's Cat", lines) return@questJournalOpen } + + if(progress == 3) { + //found_fluffs = 3, + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + + if(progress == 4) { + //fed_fluffs = 4, + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + + if(progress == 5) { + //returned_fluffs = 5, + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + // complete = 6 questJournal("Gertrude's Cat", lines) } } From 1de1a65201e92f7b8a9ef6dae71bfde28d098b27 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 06:43:46 -0500 Subject: [PATCH 13/80] Removed the largeHead variable from the children. Added dialogue = "child" under Kanel, Philop, Shilop, and Wilough in varrock.npcs.toml --- data/area/misthalin/varrock/varrock.npcs.toml | 4 ++ .../content/area/misthalin/varrock/Kanel.kt | 12 ++--- .../content/area/misthalin/varrock/Philop.kt | 10 ++--- .../content/area/misthalin/varrock/Shilop.kt | 4 +- .../content/area/misthalin/varrock/Wilough.kt | 44 +++++++++---------- 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/data/area/misthalin/varrock/varrock.npcs.toml b/data/area/misthalin/varrock/varrock.npcs.toml index 8304f07f43..328b82b791 100644 --- a/data/area/misthalin/varrock/varrock.npcs.toml +++ b/data/area/misthalin/varrock/varrock.npcs.toml @@ -429,10 +429,12 @@ examine = "A busy housewife." [philop] id = 782 +dialogue = "child" examine = "One of Gertrude's sons." [kanel] id = 784 +dialogue = "child" examine = "One of Gertrude's sons." [rogue] @@ -608,10 +610,12 @@ examine = "A retired vampyre hunter." [shilop] id = 781 +dialogue = "child" examine = "One of Gertrude's sons." [wilough] id = 783 +dialogue = "child" examine = "One of Gertrude's sons." [treznor] diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt index 5334dbca0b..fc1f4ba222 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt @@ -25,19 +25,19 @@ class Kanel : Script { private suspend fun Player.unstarted() { player("Hello there.") - npc("Hel-lo?", largeHead = true) + npc("Hel-lo?") player("Right. Goodbye.") - npc("Bye?", largeHead = true) + npc("Bye?") } private suspend fun Player.lookingForInformation() { player("Hello there.") - npc("Hel-lo?", largeHead = true) + npc("Hel-lo?") player("Have you seen Fluffs?") - npc("F-wuffs?", largeHead = true) + npc("F-wuffs?") player("She's your mummy's cat.") - npc("Cat?", largeHead = true) + npc("Cat?") player("Right. Bye Kanel.") - npc("Me?", largeHead = true) + npc("Me?") } } \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt index 63377172b6..5779e3448e 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt @@ -24,20 +24,20 @@ class Philop : Script { private suspend fun Player.unstarted() { greetChild() player("Enjoy playing with your dragon, then.") - npc("Gwwwrrr!", largeHead = true) + npc("Gwwwrrr!") } private suspend fun Player.greetChild() { player("Hello, what's your name?") - npc("Gwwrr!", largeHead = true) + npc("Gwwrr!") player("Err, hello there. What's that you have there?") - npc("Gwwwrrr! Dwa-gon Gwwwwrrrr!", largeHead = true) + npc("Gwwwrrr! Dwa-gon Gwwwwrrrr!") } private suspend fun Player.lookingForInformation() { greetChild() player("What a nice dragon, have you seen Fluffs little boy?") - npc("Dwa-gon nasty, dwa-gon eat Fwuffs, gwwwrrr, hungwy chomp chomp!", largeHead = true) + npc("Dwa-gon nasty, dwa-gon eat Fwuffs, gwwwrrr, hungwy chomp chomp!") player("I see. I don't think this is the most helpful clue I have ever been given.") - npc("Gwwrr!", largeHead = true) + npc("Gwwrr!") } } \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt index 31a383257e..093ca6fbf3 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt @@ -35,8 +35,8 @@ private suspend fun Player.lookingForInformationBranch() { option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) player("I'm an upstanding citizen!") - npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) - npc(npcId = WILOUGH_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) + npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.") + npc(npcId = WILOUGH_STRING_NAME, "And I'm even more her favourite than he is!") statement("You decide it's best not to aggravate the repulsive boys any more.") } option("What will make you tell me?") { diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index e57e1fa89d..5266c77bbc 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -42,9 +42,9 @@ class Wilough : Script { suspend fun Player.gertrudeUnstarted() { player("Hello youngster!") - npc("I don't talk to strange old people.", largeHead = true) + npc("I don't talk to strange old people.") player("Hey who you calling old?! And strange?!") - npc("You obviously. Old, strange and stupid.", largeHead = true) + npc("You obviously. Old, strange and stupid.") player("Whatever.") } @@ -54,8 +54,8 @@ private suspend fun Player.lookingForInformationBranch() { option("Tell me sonny, or I will inform your mum you are a pair of criminals.") { npc("W..wh..what?! Y..you wouldn't! Anyway, I'll deny it all and she'll be sure to believe me over some wandering killer like you.", largeHead = true) player("I'm an upstanding citizen!") - npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.", largeHead = true) - npc(npcId = SHILOP_STRING_NAME, "And I'm even more her favourite than he is!", largeHead = true) + npc("I'm her darling boy and you'd have to forget about her rewarding you. Hop it snitch.") + npc(npcId = SHILOP_STRING_NAME, "And I'm even more her favourite than he is!") statement("You decide it's best not to aggravate the repulsive boys any more.") } option("What will make you tell me?") { @@ -68,13 +68,13 @@ private suspend fun Player.lookingForInformationBranch() { } suspend fun Player.gertrudeFluffsCost() { - npc("Well... Now you ask, I'm a bit short on cash.", largeHead = true) + npc("Well... Now you ask, I'm a bit short on cash.") player("How much?") - npc("100 coins should cover it.", largeHead = true) + npc("100 coins should cover it.") player("100 coins! What sort of expensive things do you need that badly?") - npc("Well I Don't like chocolate and have you seen how much sweets cost to buy?", largeHead = true) + npc("Well I Don't like chocolate and have you seen how much sweets cost to buy?") player("Why should I pay you then, can you answer that as easily?") - npc("Obviously you shouldn't pay that much, but I won't help otherwise. I never liked that cat anyway, fussy scratchy thing it is, so what do you say?", largeHead = true) + npc("Obviously you shouldn't pay that much, but I won't help otherwise. I never liked that cat anyway, fussy scratchy thing it is, so what do you say?") choice { option("I'm not paying you a thing.") { gertrudeLifeOfCrime() @@ -87,48 +87,48 @@ suspend fun Player.gertrudeFluffsCost() { suspend fun Player.gertrudePayChildren() { player("Okay then, I'll pay, but I'll want you to tell your mother what a nice person I am.") - npc("What?", largeHead = true) + npc("What?") player("I'll want you to tell your mother what a nice person I am so she rewards me for this search.") - npc("It's a deal.", largeHead = true) + npc("It's a deal.") if (inventory.contains("coins", 100)) { inventory.remove("coins", 100) set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") statement("You give the lad 100 coins.") player("There you go, now where did you see Fluffs?") - npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.", largeHead = true) + npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.") player("Anything else?") - npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.", largeHead = true) + npc(npcId = SHILOP_STRING_NAME, "Well, you'll have to find the broken fence to get in. I'm sure you can manage that.") } else { player("This is a bit embarrassing - I'll have to get some money first.") - npc("I'll be waiting.", largeHead = true) + npc("I'll be waiting.") message("You can not afford that.") } } suspend fun Player.gertrudeLifeOfCrime() { - npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.", largeHead = true) + npc("Okay then, I'll find another way to make money. You only have yourself to blame if I'm forced into a life of crime.") } suspend fun Player.gertrudeFluffsLoss() { - npc("I'm sure our mum will get over it.", largeHead = true) + npc("I'm sure our mum will get over it.") } suspend fun Player.gertrudeLookingForInformation() { player("Hello there, I've been looking for you and it's important.") - npc("I didn't mean to take it! I just forgot to pay.", largeHead = true) + npc("I didn't mean to take it! I just forgot to pay.") player("What? I'm trying to help your mum find some cat called Fluffs.") - npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.", largeHead = true) + npc("Ohh...well, in that case I might be able to help. Fluffs followed me to my super secret hideout, I haven't seen her since. She's probably off eating small creatures somewhere.") player("Where is this secret hideout? I really need to find that cat for your mum.") - npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.", largeHead = true) + npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.") player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") - npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.", largeHead = true) + npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.") } suspend fun Player.gertrudePostQuest() { player("Hello again.") - npc("You think you're tough do you?", largeHead = true) + npc("You think you're tough do you?") player("Pardon?") - npc("I can beat anyone up.", largeHead = true) + npc("I can beat anyone up.") player("Really?") statement("The boy starts jumping around with his fists up. You decide it's best not to kill him yet.") // Source - Under "Trivia" last point: https://runescape.wiki/w/Wilough } @@ -136,5 +136,5 @@ suspend fun Player.gertrudePostQuest() { // Source: https://oldschool.runescape.wiki/w/Transcript:Gertrude%27s_Cat suspend fun Player.gertrudeWhereFluffs() { player("Where did you say you saw Fluffs?") - npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.", largeHead = true) + npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.") } \ No newline at end of file From 7ed21b512dc8a3bca223c8706e0f620ad9b1da8c Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 06:45:24 -0500 Subject: [PATCH 14/80] Added a check for step "found_the_boys" dialougue with Gertrude If memory serves, she tells you to look for the boys again. --- game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 99b4bf6b29..cd8f188977 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -29,6 +29,7 @@ class Gertrude : Script { when (quest("gertrudes_cat")) { "completed" -> postQuest() "spoke_to_gertrude" -> lookingForInformation() + "found_the_boys" -> lookingForInformation() else -> unstarted() } } From a899eea797eb763007fef572bccc5e0626d0fcaa Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 07:00:58 -0500 Subject: [PATCH 15/80] Added source --- data/area/misthalin/varrock/varrock.item-spawns.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/area/misthalin/varrock/varrock.item-spawns.toml b/data/area/misthalin/varrock/varrock.item-spawns.toml index 28167e836f..2275615a7f 100644 --- a/data/area/misthalin/varrock/varrock.item-spawns.toml +++ b/data/area/misthalin/varrock/varrock.item-spawns.toml @@ -24,4 +24,10 @@ spawns = [ { id = "empty_pot", x = 3144, y = 3449, level = 2, delay = 100 }, { id = "empty_jug", x = 3142, y = 3447, level = 2, delay = 100 }, { id = "cooking_apple", x = 3141, y = 3447, level = 2, delay = 100 }, + # Gertrude's Cat https://youtu.be/_pZcnvI1l_Q?si=fMcVTDwzTy4g2QHY&t=195 + { id = "doogle_leaves", x = 3152, y = 3399, delay = 100 }, + { id = "doogle_leaves", x = 3152, y = 3400, delay = 100 }, + { id = "doogle_leaves", x = 3151, y = 3399, delay = 100 }, + { id = "doogle_leaves", x = 3157, y = 3400, delay = 100 }, + { id = "doogle_leaves", x = 3156, y = 3401, delay = 100 }, ] \ No newline at end of file From 2bee535d65aca4b445c6acc1d31418ee74961ad9 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 07:30:39 -0500 Subject: [PATCH 16/80] Added the interaction to move past the broken sawmill. Animation still needed. --- data/area/misthalin/varrock/varrock.objs.toml | 4 +++ .../misthalin/varrock/BrokenFenceSawmill.kt | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt diff --git a/data/area/misthalin/varrock/varrock.objs.toml b/data/area/misthalin/varrock/varrock.objs.toml index 354ce08659..44276c5fa2 100644 --- a/data/area/misthalin/varrock/varrock.objs.toml +++ b/data/area/misthalin/varrock/varrock.objs.toml @@ -44,3 +44,7 @@ examine = "Ideal for cooking on." [cooking_range_varrock_palace_oven] id = 24313 examine = "For cooking food." + +[fence_varrock_lumbermill] +id = 31149 +examine = "A damaged wooden fence" # Source: https://classic.runescape.wiki/w/Low_Fence_%28Lumber_Mill%29 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt new file mode 100644 index 0000000000..d42bcd84ab --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -0,0 +1,30 @@ +package content.area.misthalin.varrock + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.chat.ChatType +import world.gregs.voidps.engine.entity.character.player.renderEmote +import world.gregs.voidps.type.Tile + +private val EAST_TILE = Tile(3296, 3498) +private val WEST_TILE = Tile(3295, 3498) + +class BrokenFenceSawmill : Script { + init { + objectOperate("Squeeze-under", "fence_varrock_lumbermill") { + when (tile) { + EAST_TILE -> { + message("You squeeze underneath the fence", ChatType.Filter) + walkOverDelay(WEST_TILE) + } + WEST_TILE -> { + message("You squeeze underneath the fence", ChatType.Filter) + walkOverDelay(EAST_TILE) + } + else -> { + message("You need to get closer to use that!") + } + } + } + } +} \ No newline at end of file From b6f45b7bd343a57d507fab5cb5666f5e2dfd2d1a Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 07:58:05 -0500 Subject: [PATCH 17/80] Intial Fluffs creation --- .../content/area/misthalin/varrock/Fluffs.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt new file mode 100644 index 0000000000..6f76439c15 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -0,0 +1,28 @@ +package content.area.misthalin.varrock + +import content.quest.quest +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.player.Player + +private const val FLUFFS_STRING_ID = "fluffs" + +class Fluffs : Script { + init { + npcOperate("Talk-to", FLUFFS_STRING_ID) { + when (quest("gertrudes_cat")) { + "completed" -> postQuest() + "found_the_boys" -> talkCatFoundTheBoys() + else -> unstarted() + } + } + npcOperate("Pick-up", FLUFFS_STRING_ID) { + // TODO + } + npcOperate("Stroke", FLUFFS_STRING_ID) { + + } + } + private suspend fun Player.unstarted(){} + private suspend fun Player.postQuest(){} + private suspend fun Player.talkCatFoundTheBoys(){} +} \ No newline at end of file From 33fc1efa7d96246529c64ef0a1900411cf611d2f Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 08:06:46 -0500 Subject: [PATCH 18/80] Added stage 3 to the quest journal --- .../kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index d71ac582cd..222a9bd38f 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -42,7 +42,8 @@ class GertrudesCat : Script { } if(progress == 3) { - //found_fluffs = 3, + lines += "I had a poke round the abandoned Lumber Mill and found" + lines += "Fluffs up a ladder. I now need to return Fluffs to Gertrude." questJournal("Gertrude's Cat", lines) return@questJournalOpen } From 6d361fdf5deff0106153ba85080b82c162a447be Mon Sep 17 00:00:00 2001 From: PrettyPrincessPotato <160365586+PrettyPrincessPotato@users.noreply.github.com> Date: Fri, 11 Sep 2026 08:50:06 -0500 Subject: [PATCH 19/80] Update data/area/misthalin/varrock/varrock.item-spawns.toml Co-authored-by: Greg --- data/area/misthalin/varrock/varrock.item-spawns.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/area/misthalin/varrock/varrock.item-spawns.toml b/data/area/misthalin/varrock/varrock.item-spawns.toml index 2275615a7f..15b7fc879c 100644 --- a/data/area/misthalin/varrock/varrock.item-spawns.toml +++ b/data/area/misthalin/varrock/varrock.item-spawns.toml @@ -24,7 +24,7 @@ spawns = [ { id = "empty_pot", x = 3144, y = 3449, level = 2, delay = 100 }, { id = "empty_jug", x = 3142, y = 3447, level = 2, delay = 100 }, { id = "cooking_apple", x = 3141, y = 3447, level = 2, delay = 100 }, - # Gertrude's Cat https://youtu.be/_pZcnvI1l_Q?si=fMcVTDwzTy4g2QHY&t=195 + # Gertrude's Cat https://youtu.be/_pZcnvI1l_Q?t=195 { id = "doogle_leaves", x = 3152, y = 3399, delay = 100 }, { id = "doogle_leaves", x = 3152, y = 3400, delay = 100 }, { id = "doogle_leaves", x = 3151, y = 3399, delay = 100 }, From 0d931e751cde589d26fff5d0daa17c026129fa80 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:13:56 -0500 Subject: [PATCH 20/80] Added near-complete animations to the broken fence. Now needs proper timing. --- data/entity/player/human.anims.toml | 8 +++++++- .../content/area/misthalin/varrock/BrokenFenceSawmill.kt | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/data/entity/player/human.anims.toml b/data/entity/player/human.anims.toml index 9b309e5bf1..83b5960867 100644 --- a/data/entity/player/human.anims.toml +++ b/data/entity/player/human.anims.toml @@ -95,4 +95,10 @@ id = 2096 id = 2097 [human_pick_wall_end] -id = 2098 \ No newline at end of file +id = 2098 + +[human_squeeze_under] +id = 9220 + +[human_squeeze_under_2] +id = 9221 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt index d42bcd84ab..6e47bd1133 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -3,6 +3,7 @@ package content.area.misthalin.varrock import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.player.chat.ChatType +import world.gregs.voidps.engine.entity.character.player.clearRenderEmote import world.gregs.voidps.engine.entity.character.player.renderEmote import world.gregs.voidps.type.Tile @@ -14,12 +15,16 @@ class BrokenFenceSawmill : Script { objectOperate("Squeeze-under", "fence_varrock_lumbermill") { when (tile) { EAST_TILE -> { + anim("human_squeeze_under", override = true) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(WEST_TILE) + clearAnim() } WEST_TILE -> { + anim("human_squeeze_under_2", override = true) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(EAST_TILE) + clearAnim() } else -> { message("You need to get closer to use that!") From 69a2d019cacf520b627e9f729ea7a3c9ba50e0fd Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:23:57 -0500 Subject: [PATCH 21/80] Added somewhat proper timing on the delay. --- .../content/area/misthalin/varrock/BrokenFenceSawmill.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt index 6e47bd1133..ae82ccf2e9 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -15,13 +15,13 @@ class BrokenFenceSawmill : Script { objectOperate("Squeeze-under", "fence_varrock_lumbermill") { when (tile) { EAST_TILE -> { - anim("human_squeeze_under", override = true) + anim("human_squeeze_under", delay = 35) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(WEST_TILE) clearAnim() } WEST_TILE -> { - anim("human_squeeze_under_2", override = true) + anim("human_squeeze_under_2", delay = 35) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(EAST_TILE) clearAnim() From 40cf6c1e6a5f32c50090f742db1411aea2f789b1 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:28:05 -0500 Subject: [PATCH 22/80] Good enough timing --- .../content/area/misthalin/varrock/BrokenFenceSawmill.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt index ae82ccf2e9..ca6656ae7b 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -15,13 +15,13 @@ class BrokenFenceSawmill : Script { objectOperate("Squeeze-under", "fence_varrock_lumbermill") { when (tile) { EAST_TILE -> { - anim("human_squeeze_under", delay = 35) + anim("human_squeeze_under", delay = 40) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(WEST_TILE) clearAnim() } WEST_TILE -> { - anim("human_squeeze_under_2", delay = 35) + anim("human_squeeze_under_2", delay = 40) message("You squeeze underneath the fence", ChatType.Filter) walkOverDelay(EAST_TILE) clearAnim() From e3da0a3f494bd3a21f96c732f913882b9cbe5743 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:30:52 -0500 Subject: [PATCH 23/80] Cleanup --- .../kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt index ca6656ae7b..31ff799f4f 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -3,8 +3,6 @@ package content.area.misthalin.varrock import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.player.chat.ChatType -import world.gregs.voidps.engine.entity.character.player.clearRenderEmote -import world.gregs.voidps.engine.entity.character.player.renderEmote import world.gregs.voidps.type.Tile private val EAST_TILE = Tile(3296, 3498) From ae6deba242d893c01418959111639705aaf47868 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:37:22 -0500 Subject: [PATCH 24/80] Added dialogue for before you find Fluffs but after you've discovered her location via one of the boys. --- .../content/area/misthalin/varrock/Gertrude.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index cd8f188977..b100af91f9 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -4,6 +4,7 @@ import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Laugh import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice @@ -29,12 +30,21 @@ class Gertrude : Script { when (quest("gertrudes_cat")) { "completed" -> postQuest() "spoke_to_gertrude" -> lookingForInformation() - "found_the_boys" -> lookingForInformation() + "found_the_boys" -> findingFluffs() else -> unstarted() } } } + private suspend fun Player.findingFluffs() { + player("Hello Gertrude.") + npc("Hello again, did you manage to find Shilop? I can't keep an eye on him for the life of me.") + player("He does seem quite a handful.") + npc("You have no idea! Did he help at all?") + player("I think so. I'm just going to look now.") + npc("Thanks again, adventurer.") + } + private suspend fun Player.postQuest() { npc("Hello dear. How are my kittens treating you?") choice { From 33b7920486308c2c7aac024689d5cb4af63212e5 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 09:54:12 -0500 Subject: [PATCH 25/80] Added foundational code and some test lines in the questlog --- .../content/area/misthalin/varrock/Fluffs.kt | 52 +++++++++++++++---- .../member/gertrudes_cat/GertrudesCat.kt | 3 ++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 6f76439c15..d4b8dd4a23 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -1,28 +1,60 @@ package content.area.misthalin.varrock +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.Player -private const val FLUFFS_STRING_ID = "fluffs" +private const val FLUFFS_STRING_ID = "fluffs_normal" class Fluffs : Script { + private var fluffsNPC: NPC? = null + init { + npcSpawn(FLUFFS_STRING_ID) { + fluffsNPC = this + } npcOperate("Talk-to", FLUFFS_STRING_ID) { - when (quest("gertrudes_cat")) { - "completed" -> postQuest() - "found_the_boys" -> talkCatFoundTheBoys() - else -> unstarted() + foundCatCheck() + when (quest(GERTRUDES_CAT_STRING_NAME)) { + "completed" -> talkPostQuest() + "found_fluffs" -> talkCatFoundFluffs() + else -> talkUnstarted() } } npcOperate("Pick-up", FLUFFS_STRING_ID) { - // TODO + foundCatCheck() + when (quest(GERTRUDES_CAT_STRING_NAME)) { + "found_fluffs" -> yoinkCatFoundFluffs() + "fed_fluffs" -> yoinkCatFedFluffs() + else -> yoinkUnstarted() + } } npcOperate("Stroke", FLUFFS_STRING_ID) { - + foundCatCheck() + when (quest(GERTRUDES_CAT_STRING_NAME)) { + "found_fluffs" -> strokeCatFoundFluffs() + "fed_fluffs" -> strokeCatFedFluffs() + else -> strokeUnstarted() + } } } - private suspend fun Player.unstarted(){} - private suspend fun Player.postQuest(){} - private suspend fun Player.talkCatFoundTheBoys(){} + private suspend fun Player.foundCatCheck(){ + when(quest(GERTRUDES_CAT_STRING_NAME)) { + "found_the_boys" -> set(GERTRUDES_CAT_STRING_NAME, "found_fluffs") + } + } + + private suspend fun Player.talkUnstarted(){} + private suspend fun Player.talkPostQuest(){} + private suspend fun Player.talkCatFoundFluffs(){} + + private suspend fun Player.yoinkUnstarted(){} + private suspend fun Player.yoinkCatFedFluffs(){} + private suspend fun Player.yoinkCatFoundFluffs(){} + + private suspend fun Player.strokeUnstarted(){} + private suspend fun Player.strokeCatFedFluffs(){} + private suspend fun Player.strokeCatFoundFluffs(){} } \ No newline at end of file diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 222a9bd38f..a828fb05e5 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -50,16 +50,19 @@ class GertrudesCat : Script { if(progress == 4) { //fed_fluffs = 4, + lines += "fed_fluffs stage 4" questJournal("Gertrude's Cat", lines) return@questJournalOpen } if(progress == 5) { //returned_fluffs = 5, + lines += "returned_fluffs stage 5" questJournal("Gertrude's Cat", lines) return@questJournalOpen } // complete = 6 + lines += "complete stage 6" questJournal("Gertrude's Cat", lines) } } From 1446aef6a4b20316c837ad849157bbf2386bb43a Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 11:03:11 -0500 Subject: [PATCH 26/80] Added another stage to Gertrude's Cat Varps to account for needing to feed the cat both milk and the sardine Added more Gertrude Dialogue for stage 3 More stage 3 progress --- .../gertrudes_cat/gertrudes_cat.varps.toml | 7 +- .../content/area/misthalin/varrock/Fluffs.kt | 81 ++++++++++++++----- .../area/misthalin/varrock/Gertrude.kt | 25 +++++- 3 files changed, 85 insertions(+), 28 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index ee9755b989..c41da1997e 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -8,7 +8,8 @@ values = { spoke_to_gertrude = 1, found_the_boys = 2, found_fluffs = 3, - fed_fluffs = 4, - returned_fluffs = 5, - completed = 6, + milked_fluffs = 4, + fed_fluffs = 5, + returned_fluffs = 6, + completed = 7, } diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index d4b8dd4a23..4b588a034f 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -1,60 +1,97 @@ package content.area.misthalin.varrock +import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.Player private const val FLUFFS_STRING_ID = "fluffs_normal" class Fluffs : Script { - private var fluffsNPC: NPC? = null init { - npcSpawn(FLUFFS_STRING_ID) { - fluffsNPC = this + itemOnNPCOperate(item = "doogle_sardine", npc = FLUFFS_STRING_ID) { + foundCatCheck() + when(quest(GERTRUDES_CAT_STRING_NAME)){ + else -> message("Fluffs doesn't seem to be hungry right now.") + } + } + itemOnNPCOperate(npc = FLUFFS_STRING_ID) { + foundCatCheck() + when(quest(GERTRUDES_CAT_STRING_NAME)) { + "completed" -> dontBotherCat() + else -> message("Fluffs regards you with distain.") + } } - npcOperate("Talk-to", FLUFFS_STRING_ID) { + npcOperate("Talk-to", FLUFFS_STRING_ID) { interact -> foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { - "completed" -> talkPostQuest() - "found_fluffs" -> talkCatFoundFluffs() - else -> talkUnstarted() + "completed" -> talkPostQuest(interact.target) + "found_fluffs" -> talkCatFoundFluffs(interact.target) + else -> dontBotherCat() } } - npcOperate("Pick-up", FLUFFS_STRING_ID) { + npcOperate("Pick-up", FLUFFS_STRING_ID) { interact -> foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { - "found_fluffs" -> yoinkCatFoundFluffs() + "found_fluffs" -> yoinkCatFoundFluffs(interact.target) "fed_fluffs" -> yoinkCatFedFluffs() - else -> yoinkUnstarted() + else -> dontBotherCat() } } - npcOperate("Stroke", FLUFFS_STRING_ID) { + npcOperate("Stroke", FLUFFS_STRING_ID) { interact -> foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { - "found_fluffs" -> strokeCatFoundFluffs() + "found_fluffs" -> strokeCatFoundFluffs(interact.target) "fed_fluffs" -> strokeCatFedFluffs() - else -> strokeUnstarted() + else -> dontBotherCat() } } } - private suspend fun Player.foundCatCheck(){ + private fun Player.foundCatCheck() { when(quest(GERTRUDES_CAT_STRING_NAME)) { "found_the_boys" -> set(GERTRUDES_CAT_STRING_NAME, "found_fluffs") } } - private suspend fun Player.talkUnstarted(){} - private suspend fun Player.talkPostQuest(){} - private suspend fun Player.talkCatFoundFluffs(){} + private fun Player.dontBotherCat() { + message("You decide it best to not bother the cat.") // Going off of memory here. + } - private suspend fun Player.yoinkUnstarted(){} - private suspend fun Player.yoinkCatFedFluffs(){} - private suspend fun Player.yoinkCatFoundFluffs(){} + private suspend fun Player.talkPostQuest(cat: NPC) { + cat.say("Miaoww") + // TODO: Amulet of catspeak dialogue + } + private fun talkCatFoundFluffs(cat: NPC) { + cat.say("Miaoww") + } + + private suspend fun Player.yoinkCatFedFluffs() {} + private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { + animDelay("climb_down") + delay(1) + cat.say("Hiss!") + cat.face(this) + cat.animDelay("pet_pounce_kitten") + delay(1) + say("Ouch!") + delay(1) + statement("Fluffs hisses but clearly wants something - maybe she is thirsty?") + } - private suspend fun Player.strokeUnstarted(){} private suspend fun Player.strokeCatFedFluffs(){} - private suspend fun Player.strokeCatFoundFluffs(){} + private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { + animDelay("climb_down") + delay(1) + cat.say("Hiss!") + cat.face(this) + cat.animDelay("pet_pounce_kitten") + delay(1) + say("Ouch!") + delay(1) + statement("Perhaps Fluffs wants something - food or drink, maybe?") + } } \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index b100af91f9..838af9a6bf 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -2,9 +2,11 @@ package content.area.misthalin.varrock import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused +import content.entity.player.dialogue.Disheartened import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Neutral import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice @@ -31,20 +33,37 @@ class Gertrude : Script { "completed" -> postQuest() "spoke_to_gertrude" -> lookingForInformation() "found_the_boys" -> findingFluffs() + "found_fluffs" -> hungryAndThirsty() else -> unstarted() } } } + private suspend fun Player.hungryAndThirsty() { + findShilopQ() + player("Yes, I've found Fluffs!") + npc("That's great; where is she?") + player("She's still in Varrock. I think she may be hungry, thirsty or both.") + npc("Oh dear, oh dear! Maybe she's just hungry. She loves doogle sardines but I'm all out.") + player("Doogle sardines?") + npc("Yes, raw sardines seasoned with doogle leaves. Unfortunately, I've used all my doogles leaves, but you may find some on the bush out back.") + player("What if she is thirsty?") + npc("In that case, she'd probably like some milk. A bucketful would tempt her, I'm sure.") + player("It seems a rather large amount of milk for one small cat, but I'll give it a try.") + } + private suspend fun Player.findingFluffs() { + findShilopQ() + player("I think so. I'm just going to look now.") + npc("Thanks again, adventurer.") + } + + private suspend fun Player.findShilopQ() { player("Hello Gertrude.") npc("Hello again, did you manage to find Shilop? I can't keep an eye on him for the life of me.") player("He does seem quite a handful.") npc("You have no idea! Did he help at all?") - player("I think so. I'm just going to look now.") - npc("Thanks again, adventurer.") } - private suspend fun Player.postQuest() { npc("Hello dear. How are my kittens treating you?") choice { From ed37bc4015488efd8f27573c4d832a07417e6b9f Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 11:30:12 -0500 Subject: [PATCH 27/80] Added Shilop and Wilough dialogue for when you found Fluffs but haven't given her food or milk. --- .../main/kotlin/content/area/misthalin/varrock/Shilop.kt | 7 +++++++ .../main/kotlin/content/area/misthalin/varrock/Wilough.kt | 1 + 2 files changed, 8 insertions(+) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt index 093ca6fbf3..57631b6c35 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt @@ -3,6 +3,7 @@ package content.area.misthalin.varrock import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle +import content.entity.player.dialogue.Neutral import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Scared import content.entity.player.dialogue.type.choice @@ -23,12 +24,18 @@ class Shilop : Script { "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() + "attempt_fluffs_pickup" -> gertrudeFluffsNotComeBack() else -> gertrudeUnstarted() } } } } +suspend fun Player.gertrudeFluffsNotComeBack() { + player("I've found Fluffs but she won't come back home with me. Any ideas?") + npc("None at all. Not that I want that boring thing back, anyway. I prefer dogs to a fat cat, any day.") +} + private suspend fun Player.lookingForInformationBranch() { gertrudeLookingForInformation() choice { diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index 5266c77bbc..0fb03c9bbf 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -34,6 +34,7 @@ class Wilough : Script { "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() "found_the_boys" -> gertrudeWhereFluffs() + "attempt_fluffs_pickup" -> gertrudeFluffsNotComeBack() else -> gertrudeUnstarted() } } From 8f7f3ad968f8924834938213abe4cd3317b196e8 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 11:30:53 -0500 Subject: [PATCH 28/80] Another change to varps, may not be final --- data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index c41da1997e..fe15a7e308 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -8,8 +8,9 @@ values = { spoke_to_gertrude = 1, found_the_boys = 2, found_fluffs = 3, - milked_fluffs = 4, + attempt_fluffs_pickup = 4, fed_fluffs = 5, - returned_fluffs = 6, - completed = 7, + milked_fluffs = 6, + returned_fluffs = 7, + completed = 8, } From d9afc2a5eae4bbc1976cdfcab9f3bf1fa908cee5 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 11:31:42 -0500 Subject: [PATCH 29/80] Added Gertrude diaglogue for when the player has found fluffs but has neither fed her nor gave her milk. --- .../quest/member/gertrudes_cat/GertrudesCat.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index a828fb05e5..359a9d650f 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -42,27 +42,29 @@ class GertrudesCat : Script { } if(progress == 3) { - lines += "I had a poke round the abandoned Lumber Mill and found" + lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to Gertrude." questJournal("Gertrude's Cat", lines) return@questJournalOpen } if(progress == 4) { - //fed_fluffs = 4, - lines += "fed_fluffs stage 4" + lines += "I had a poke round the abandoned Lumber Mill and found and found" + lines += "Fluffs up a ladder. I now need to return Fluffs to" + lines += "Gertrude. " + lines += "I think Fluffs may be hungry or thirsty but I am not sure what" + lines += "she wants; perhaps Gertrude can help?" questJournal("Gertrude's Cat", lines) return@questJournalOpen } if(progress == 5) { - //returned_fluffs = 5, - lines += "returned_fluffs stage 5" + questJournal("Gertrude's Cat", lines) return@questJournalOpen } - // complete = 6 - lines += "complete stage 6" + // complete + lines += "complete" questJournal("Gertrude's Cat", lines) } } From d37087f737e16b821f64b30bdc437aa7e810dda5 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 11:38:35 -0500 Subject: [PATCH 30/80] Cleaned up code and added proper checks and reminders on the attempt_fluffs_pickup stage. --- .../content/area/misthalin/varrock/Fluffs.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 4b588a034f..b3828faa75 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -31,6 +31,7 @@ class Fluffs : Script { when (quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> talkPostQuest(interact.target) "found_fluffs" -> talkCatFoundFluffs(interact.target) + "attempt_fluffs_pickup" -> talkCatFoundFluffs(interact.target) else -> dontBotherCat() } } @@ -38,6 +39,7 @@ class Fluffs : Script { foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_fluffs" -> yoinkCatFoundFluffs(interact.target) + "attempt_fluffs_pickup" -> yoinkCatFoundFluffs(interact.target) "fed_fluffs" -> yoinkCatFedFluffs() else -> dontBotherCat() } @@ -46,6 +48,7 @@ class Fluffs : Script { foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_fluffs" -> strokeCatFoundFluffs(interact.target) + "attempt_fluffs_pickup" -> strokeCatFoundFluffs(interact.target) "fed_fluffs" -> strokeCatFedFluffs() else -> dontBotherCat() } @@ -71,19 +74,16 @@ class Fluffs : Script { private suspend fun Player.yoinkCatFedFluffs() {} private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { - animDelay("climb_down") - delay(1) - cat.say("Hiss!") - cat.face(this) - cat.animDelay("pet_pounce_kitten") - delay(1) - say("Ouch!") - delay(1) + doNotTheCat(cat) statement("Fluffs hisses but clearly wants something - maybe she is thirsty?") } private suspend fun Player.strokeCatFedFluffs(){} private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { + doNotTheCat(cat) + statement("Perhaps Fluffs wants something - food or drink, maybe?") + } + private suspend fun Player.doNotTheCat(cat: NPC) { animDelay("climb_down") delay(1) cat.say("Hiss!") @@ -92,6 +92,6 @@ class Fluffs : Script { delay(1) say("Ouch!") delay(1) - statement("Perhaps Fluffs wants something - food or drink, maybe?") + set(GERTRUDES_CAT_STRING_NAME, "attempt_fluffs_pickup") } } \ No newline at end of file From 1f691d5f74d5c38f1d3d19ffd6bc134731fde367 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:14:05 -0500 Subject: [PATCH 31/80] Switched varps around for orders sake --- data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index fe15a7e308..128e51dbbb 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -9,8 +9,8 @@ values = { found_the_boys = 2, found_fluffs = 3, attempt_fluffs_pickup = 4, - fed_fluffs = 5, - milked_fluffs = 6, + milked_fluffs = 5, + fed_fluffs = 6, returned_fluffs = 7, completed = 8, } From ea5a6ba0fab74467f052b6b491e93049b3b5d313 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:23:03 -0500 Subject: [PATCH 32/80] Added the Doogle Sardine recipe --- .../gertrudes_cat/DoogleSardineRecipe.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt new file mode 100644 index 0000000000..de7f22224e --- /dev/null +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt @@ -0,0 +1,18 @@ +package content.quest.member.gertrudes_cat + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove + +class DoogleSardineRecipe : Script { + init { + itemOnItem("doogle_leaves", "raw_sardine") { _, _ -> + inventory.remove("doogle_leaves") + inventory.remove("raw_sardine") + message("You rub the doogle leaves over the sardine.") + inventory.add("doogle_sardine") + } + } +} \ No newline at end of file From 6786a331c4b5110e841e92e9d66849af214ab23d Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:23:38 -0500 Subject: [PATCH 33/80] Added checks for more stages, hinting to hungryAndThirsty dialogue --- .../area/misthalin/varrock/Gertrude.kt | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 838af9a6bf..a2fa82ab32 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -34,6 +34,8 @@ class Gertrude : Script { "spoke_to_gertrude" -> lookingForInformation() "found_the_boys" -> findingFluffs() "found_fluffs" -> hungryAndThirsty() + "attempt_fluffs_pickup" -> hungryAndThirsty() + "milked_fluffs" -> hungryAndThirsty() else -> unstarted() } } @@ -54,14 +56,14 @@ class Gertrude : Script { private suspend fun Player.findingFluffs() { findShilopQ() - player("I think so. I'm just going to look now.") + player("I think so. I'm just going to look now.") npc("Thanks again, adventurer.") } private suspend fun Player.findShilopQ() { - player("Hello Gertrude.") - npc("Hello again, did you manage to find Shilop? I can't keep an eye on him for the life of me.") - player("He does seem quite a handful.") + player("Hello Gertrude.") + npc("Hello again, did you manage to find Shilop? I can't keep an eye on him for the life of me.") + player("He does seem quite a handful.") npc("You have no idea! Did he help at all?") } private suspend fun Player.postQuest() { @@ -111,15 +113,15 @@ class Gertrude : Script { npc("I suppose I could give you some nice, yummy chocolate cake; maybe even a kitten too, if you seem like a nice sort.") npc("Is that something you could be persuaded with?") choice { - option("Well, I suppose I could, though I'd need more details.") { + option("Well, I suppose I could, though I'd need more details.") { questAccepted() } - option("Sorry, I'm too busy to play pet rescue.") { + option("Sorry, I'm too busy to play pet rescue.") { questRejected() } } } - option("Sorry, I'm too busy to play pet rescue.") { + option("Sorry, I'm too busy to play pet rescue.") { questRejected() } } @@ -130,7 +132,7 @@ class Gertrude : Script { private suspend fun Player.questAccepted() { set(GERTRUDES_CAT_STRING_NAME, "spoke_to_gertrude") npc("Really? Thank you so much! I really have no idea where she could be!") - npc("I think my sons, Shilop and Wilough, saw the cat last. They'll be out in the marketplace.") + npc("I think my sons, Shilop and Wilough, saw the cat last. They'll be out in the marketplace.") player("The marketplace? Which one would that be? It would help to know what they get up to, as well.") npc("Really? Well, I generally let them do what they want, so I've no idea exactly what they would be doing. They are good lads, though. I'm sure they are just watching the passers-by in Varrock Marketplace.") npc("Oh, to be young and carefree again!") @@ -138,7 +140,7 @@ class Gertrude : Script { } private suspend fun Player.lookingForInformation() { - player("Hello Gertrude.") + player("Hello Gertrude.") npc("Have you seen my poor Fluffs?") player("I'm afraid not.") npc("What about Shilop?") From 87f3ef7da972788d17e0f28b714142ab3cdfb9e9 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:31:59 -0500 Subject: [PATCH 34/80] Added cooked sardines to the doogle sardine recipe --- .../quest/member/gertrudes_cat/DoogleSardineRecipe.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt index de7f22224e..72e0f7943e 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt @@ -8,11 +8,22 @@ import world.gregs.voidps.engine.inv.remove class DoogleSardineRecipe : Script { init { + /** + * Source: https://runescape.wiki/w/Transcript:Gertrude%27s_Cat + * "Use doogle leaves, raw sardine or sardine on Fluffs" + * Implies the recipe also permits cooked sardine + */ itemOnItem("doogle_leaves", "raw_sardine") { _, _ -> inventory.remove("doogle_leaves") inventory.remove("raw_sardine") message("You rub the doogle leaves over the sardine.") inventory.add("doogle_sardine") } + itemOnItem("doogle_leaves", "sardine") { _, _ -> + inventory.remove("doogle_leaves") + inventory.remove("sardine") + message("You rub the doogle leaves over the sardine.") + inventory.add("doogle_sardine") + } } } \ No newline at end of file From 8456dc663c122714e8993925d5730f26b7fe4dc7 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:55:54 -0500 Subject: [PATCH 35/80] Added the "mildly interested" dialogue --- .../content/area/misthalin/varrock/Fluffs.kt | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index b3828faa75..4f5d78d97b 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -1,5 +1,10 @@ package content.area.misthalin.varrock +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest @@ -7,18 +12,41 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove private const val FLUFFS_STRING_ID = "fluffs_normal" class Fluffs : Script { init { - itemOnNPCOperate(item = "doogle_sardine", npc = FLUFFS_STRING_ID) { + val doogleSardineItems = setOf("doogle_leaves", "raw_sardine", "sardine") + itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ else -> message("Fluffs doesn't seem to be hungry right now.") } } + itemOnNPCOperate("*", FLUFFS_STRING_ID) { interact -> + val item = interact.item.id + + foundCatCheck() + when(quest(GERTRUDES_CAT_STRING_NAME)){ + else -> message("Fluffs doesn't seem to be hungry right now.") + } + if(item in doogleSardineItems){ + mildInterest(item) + } + message("Nothing interesting happens.") + } + itemOnNPCOperate("bucket_of_milk", FLUFFS_STRING_ID) { + foundCatCheck() + when(quest(GERTRUDES_CAT_STRING_NAME)){ + "attempt_fluffs_pickup" -> milkFluffs() + else -> message("Fluffs doesn't seem to be thirsty right now.") + } + } itemOnNPCOperate(npc = FLUFFS_STRING_ID) { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)) { @@ -54,6 +82,29 @@ class Fluffs : Script { } } } + + private suspend fun Player.mildInterest(item: String) { + var itemName = item + if(item == "doogle_leaves"){ + itemName = "doogle leaves" + } + if (item == "raw_sardine"){ + itemName = "raw sardine" + } + npc("Hiss!") + player("She seems to be a very fussy cat.") + statement("Fluffs looks vaguely interested at the $itemName but doesn't want it. A similar type of food or drink might be worth a try.") + } + + private suspend fun Player.milkFluffs() { + npc("Mew!") + player("Progress, at least.") + inventory.remove("bucket_of_milk") + inventory.add("bucket") + set(GERTRUDES_CAT_STRING_NAME, "milked_fluffs") + statement("Fluffs laps up the milk greedily. Then she mews at you again.") + } + private fun Player.foundCatCheck() { when(quest(GERTRUDES_CAT_STRING_NAME)) { "found_the_boys" -> set(GERTRUDES_CAT_STRING_NAME, "found_fluffs") @@ -78,7 +129,7 @@ class Fluffs : Script { statement("Fluffs hisses but clearly wants something - maybe she is thirsty?") } - private suspend fun Player.strokeCatFedFluffs(){} + private suspend fun Player.strokeCatFedFluffs() {} private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { doNotTheCat(cat) statement("Perhaps Fluffs wants something - food or drink, maybe?") From 6108394cba1ef6093478f77b0b08777d87704b6d Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 12:57:29 -0500 Subject: [PATCH 36/80] Commented --- data/entity/player/human.anims.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/entity/player/human.anims.toml b/data/entity/player/human.anims.toml index 83b5960867..45fef598a4 100644 --- a/data/entity/player/human.anims.toml +++ b/data/entity/player/human.anims.toml @@ -97,7 +97,7 @@ id = 2097 [human_pick_wall_end] id = 2098 -[human_squeeze_under] +[human_squeeze_under] # Appears to be identical with human_squeeze_under_2 id = 9220 [human_squeeze_under_2] From f7667a4492a6dc0fff94e0b93ad109a0b9c25137 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 13:13:24 -0500 Subject: [PATCH 37/80] Moved the mildInterest check into its own function, added check for each stage. --- .../content/area/misthalin/varrock/Fluffs.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 4f5d78d97b..7a00f1db43 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -21,7 +21,6 @@ private const val FLUFFS_STRING_ID = "fluffs_normal" class Fluffs : Script { init { - val doogleSardineItems = setOf("doogle_leaves", "raw_sardine", "sardine") itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ @@ -33,12 +32,10 @@ class Fluffs : Script { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ - else -> message("Fluffs doesn't seem to be hungry right now.") + "attempt_fluffs_pickup" -> checkItem(item) + "milked_fluffs" -> checkItem(item) + else -> message("Fluffs doesn't seem to be interested in that.") // Actually message unknown, but I'd rather it not be blank. } - if(item in doogleSardineItems){ - mildInterest(item) - } - message("Nothing interesting happens.") } itemOnNPCOperate("bucket_of_milk", FLUFFS_STRING_ID) { foundCatCheck() @@ -83,6 +80,16 @@ class Fluffs : Script { } } + private suspend fun Player.checkItem(item: String) { + val doogleSardineItems = setOf("doogle_leaves", "raw_sardine", "sardine") + + if(item in doogleSardineItems){ + mildInterest(item) + } else { + message("Fluffs doesn't seem to be interested in that.") + } + } + private suspend fun Player.mildInterest(item: String) { var itemName = item if(item == "doogle_leaves"){ From de479b85272659f5258092bb2c1f1bfd47998bb2 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 13:36:05 -0500 Subject: [PATCH 38/80] Silly me, I can't arbitrarily increase that number. Will need to get creative. --- data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index 128e51dbbb..e105a1b1da 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -10,7 +10,7 @@ values = { found_fluffs = 3, attempt_fluffs_pickup = 4, milked_fluffs = 5, - fed_fluffs = 6, - returned_fluffs = 7, - completed = 8, + #fed_fluffs = 6, + #returned_fluffs = 7, + completed = 6, } From f406530eea4a0ccf31095e6c7c2e063a11389481 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 13:58:02 -0500 Subject: [PATCH 39/80] Renamed varps Cleaned up to remove the 2 extra varps, added todos --- .../gertrudes_cat/gertrudes_cat.varps.toml | 4 +-- .../content/area/misthalin/varrock/Fluffs.kt | 34 +++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml index e105a1b1da..b845eca6a0 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.varps.toml @@ -9,8 +9,6 @@ values = { found_the_boys = 2, found_fluffs = 3, attempt_fluffs_pickup = 4, - milked_fluffs = 5, - #fed_fluffs = 6, - #returned_fluffs = 7, + fluffs_returned = 5, completed = 6, } diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 7a00f1db43..ee944b9fcf 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -24,6 +24,7 @@ class Fluffs : Script { itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ + "attempt_fluffs_pickup" -> checkCanFeed() else -> message("Fluffs doesn't seem to be hungry right now.") } } @@ -33,7 +34,6 @@ class Fluffs : Script { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ "attempt_fluffs_pickup" -> checkItem(item) - "milked_fluffs" -> checkItem(item) else -> message("Fluffs doesn't seem to be interested in that.") // Actually message unknown, but I'd rather it not be blank. } } @@ -65,7 +65,6 @@ class Fluffs : Script { when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_fluffs" -> yoinkCatFoundFluffs(interact.target) "attempt_fluffs_pickup" -> yoinkCatFoundFluffs(interact.target) - "fed_fluffs" -> yoinkCatFedFluffs() else -> dontBotherCat() } } @@ -74,12 +73,27 @@ class Fluffs : Script { when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_fluffs" -> strokeCatFoundFluffs(interact.target) "attempt_fluffs_pickup" -> strokeCatFoundFluffs(interact.target) - "fed_fluffs" -> strokeCatFedFluffs() + //"fed_fluffs" -> strokeCatFedFluffs(interact.target) TODO: check the player var if you fed the cat or not else -> dontBotherCat() } } } + private suspend fun Player.checkCanFeed() { + // check player variable if you already fed the cat + if(false){ + dontBotherCat() + } else { + feedFluffs() + } + } + private suspend fun Player.feedFluffs() { + inventory.remove("doogle_sardine") + npc("Mew!") + player("Progress, at least.") + statement("Fluffs devours the doogle sardine greedily. Then she mews at you again.") + } + private suspend fun Player.checkItem(item: String) { val doogleSardineItems = setOf("doogle_leaves", "raw_sardine", "sardine") @@ -108,7 +122,7 @@ class Fluffs : Script { player("Progress, at least.") inventory.remove("bucket_of_milk") inventory.add("bucket") - set(GERTRUDES_CAT_STRING_NAME, "milked_fluffs") + // TODO Set player variable so we know the player gave the cat milk statement("Fluffs laps up the milk greedily. Then she mews at you again.") } @@ -130,17 +144,25 @@ class Fluffs : Script { cat.say("Miaoww") } - private suspend fun Player.yoinkCatFedFluffs() {} private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { doNotTheCat(cat) statement("Fluffs hisses but clearly wants something - maybe she is thirsty?") } - private suspend fun Player.strokeCatFedFluffs() {} + // Based off of memory + private suspend fun Player.strokeCatFedFluffs(cat: NPC) { + animDelay("climb_down") + delay(1) + cat.say("Prr...") + delay(1) + message("Seems like the cat doesn't hate you anymore.") + } + private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { doNotTheCat(cat) statement("Perhaps Fluffs wants something - food or drink, maybe?") } + private suspend fun Player.doNotTheCat(cat: NPC) { animDelay("climb_down") delay(1) From 054bbdec8443b6f98290308a4ce7d5cabb364338 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 13:59:06 -0500 Subject: [PATCH 40/80] Fixed a typo in a comment --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index ee944b9fcf..447ac82f8a 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -34,7 +34,7 @@ class Fluffs : Script { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ "attempt_fluffs_pickup" -> checkItem(item) - else -> message("Fluffs doesn't seem to be interested in that.") // Actually message unknown, but I'd rather it not be blank. + else -> message("Fluffs doesn't seem to be interested in that.") // Actual message unknown, but I'd rather it not be blank. } } itemOnNPCOperate("bucket_of_milk", FLUFFS_STRING_ID) { From b72a239c7a83dd1c66d86d0e9ed841b208ec254c Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 14:36:55 -0500 Subject: [PATCH 41/80] Cleaned up old varps. Set fluffs being fed and given milk as variables with set() and get(). --- .../content/area/misthalin/varrock/Fluffs.kt | 17 ++++++++++++++--- .../content/area/misthalin/varrock/Gertrude.kt | 1 - 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 447ac82f8a..ac768ab777 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -17,6 +17,8 @@ import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove private const val FLUFFS_STRING_ID = "fluffs_normal" +private const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" +private const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" class Fluffs : Script { @@ -70,10 +72,13 @@ class Fluffs : Script { } npcOperate("Stroke", FLUFFS_STRING_ID) { interact -> foundCatCheck() + if(get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false)){ + strokeCatFedFluffs(interact.target) + return@npcOperate + } when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_fluffs" -> strokeCatFoundFluffs(interact.target) "attempt_fluffs_pickup" -> strokeCatFoundFluffs(interact.target) - //"fed_fluffs" -> strokeCatFedFluffs(interact.target) TODO: check the player var if you fed the cat or not else -> dontBotherCat() } } @@ -81,7 +86,7 @@ class Fluffs : Script { private suspend fun Player.checkCanFeed() { // check player variable if you already fed the cat - if(false){ + if(get(FLUFFS_FED_VAR, false)){ dontBotherCat() } else { feedFluffs() @@ -89,6 +94,7 @@ class Fluffs : Script { } private suspend fun Player.feedFluffs() { inventory.remove("doogle_sardine") + set(FLUFFS_FED_VAR, true) npc("Mew!") player("Progress, at least.") statement("Fluffs devours the doogle sardine greedily. Then she mews at you again.") @@ -122,7 +128,7 @@ class Fluffs : Script { player("Progress, at least.") inventory.remove("bucket_of_milk") inventory.add("bucket") - // TODO Set player variable so we know the player gave the cat milk + set(FLUFFS_MILK_VAR, true) statement("Fluffs laps up the milk greedily. Then she mews at you again.") } @@ -145,6 +151,11 @@ class Fluffs : Script { } private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { + if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ + doNotTheCat(cat) + statement("Fluffs seems afraid to leave. \nIn the Lumber Yard below you can hear kittens mewing.") + return + } doNotTheCat(cat) statement("Fluffs hisses but clearly wants something - maybe she is thirsty?") } diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index a2fa82ab32..16a9e08ad5 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -35,7 +35,6 @@ class Gertrude : Script { "found_the_boys" -> findingFluffs() "found_fluffs" -> hungryAndThirsty() "attempt_fluffs_pickup" -> hungryAndThirsty() - "milked_fluffs" -> hungryAndThirsty() else -> unstarted() } } From 0a0860e5f0b8eecc0c1f94c3effd11acbaab32ee Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 15:52:26 -0500 Subject: [PATCH 42/80] Init commit for randomized crate mewing and assigning a random box for the player to find kittens in. --- .../gertrudes_cat/gertrudes_cat.areas.toml | 4 ++++ .../content/area/misthalin/varrock/Fluffs.kt | 2 ++ .../member/gertrudes_cat/KittenCrates.kt | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 data/quest/members/gertrudes_cat/gertrudes_cat.areas.toml create mode 100644 game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.areas.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.areas.toml new file mode 100644 index 0000000000..c2522bdfeb --- /dev/null +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.areas.toml @@ -0,0 +1,4 @@ +[kitten_search_area] +x = [3313, 3298] +y = [3497, 3517] +level = 0 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index ac768ab777..d6e9a626e7 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -15,10 +15,12 @@ import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.type.Tile private const val FLUFFS_STRING_ID = "fluffs_normal" private const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" private const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" +private const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt new file mode 100644 index 0000000000..59513af94b --- /dev/null +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -0,0 +1,19 @@ +package content.quest.member.gertrudes_cat + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.data.definition.Areas + +class KittenCrates : Script { + init { + objectSpawn("Crate") { + if(this.tile in Areas["kitten_search_area"]){ + + } + } + objectOperate("Search", "Crate") { interact -> + if(interact.target.tile in Areas["kitten_search_area"]) { + + } + } + } +} \ No newline at end of file From 4dfef243f0e491c2082ec6a78f17937689805e8a Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 16:40:33 -0500 Subject: [PATCH 43/80] A random crate will now be assigned in the downstairs sawmill area --- .../content/area/misthalin/varrock/Fluffs.kt | 6 +++++- .../quest/member/gertrudes_cat/KittenCrates.kt | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index d6e9a626e7..b16d6d46a8 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -7,6 +7,8 @@ import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME +import content.quest.member.gertrudes_cat.KITTEN_CRATES +import content.quest.member.gertrudes_cat.KittenCrates import content.quest.quest import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message @@ -20,7 +22,7 @@ import world.gregs.voidps.type.Tile private const val FLUFFS_STRING_ID = "fluffs_normal" private const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" private const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" -private const val KITTENS_HIDING_SPOT = "kittens_hiding_here" +const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { @@ -155,6 +157,8 @@ class Fluffs : Script { private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ doNotTheCat(cat) + val crate = KITTEN_CRATES.random() + set(KITTENS_HIDING_SPOT, crate) statement("Fluffs seems afraid to leave. \nIn the Lumber Yard below you can hear kittens mewing.") return } diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index 59513af94b..c0b6fd6656 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -1,18 +1,29 @@ package content.quest.member.gertrudes_cat +import content.area.misthalin.varrock.KITTENS_HIDING_SPOT import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.data.definition.Areas +import world.gregs.voidps.type.Tile + +var KITTEN_CRATES = mutableSetOf() class KittenCrates : Script { + init { objectSpawn("Crate") { if(this.tile in Areas["kitten_search_area"]){ - + KITTEN_CRATES += tile } } objectOperate("Search", "Crate") { interact -> - if(interact.target.tile in Areas["kitten_search_area"]) { - + val player = interact.player + val crate = interact.target + if(interact.target.tile !in Areas["kitten_search_area"]) { + return@objectOperate + } + var kittenCrate = get(KITTENS_HIDING_SPOT, Tile(0, 0)) + if(crate.tile == kittenCrate){ + // Cat found! } } } From a9b343f5b4969c2c12fc33979b0b873d908b8110 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 11 Sep 2026 16:58:01 -0500 Subject: [PATCH 44/80] Doesn't quite work, need to just put it down for the day --- .../kotlin/content/area/misthalin/varrock/Fluffs.kt | 4 ++-- .../kotlin/content/area/misthalin/varrock/Gertrude.kt | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index b16d6d46a8..48b05a4c8e 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -20,8 +20,8 @@ import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.type.Tile private const val FLUFFS_STRING_ID = "fluffs_normal" -private const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" -private const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" +const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" +const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 16a9e08ad5..0fa7db5fb8 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -29,6 +29,10 @@ class Gertrude : Script { init { npcOperate("Talk-to", "gertrude") { + if(get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false) && quest("gertrudes_cat") == "attempt_fluffs_pickup"){ + mustBeAReasion() + return@npcOperate + } when (quest("gertrudes_cat")) { "completed" -> postQuest() "spoke_to_gertrude" -> lookingForInformation() @@ -40,6 +44,13 @@ class Gertrude : Script { } } + private suspend fun Player.mustBeAReasion() { + player("Hi!") + npc("Hey traveller, did Fluffs eat the sardines?") + player("Yeah, she loved them, but she still won't leave.") + npc("Well that is strange, there must be a reason.") + } + private suspend fun Player.hungryAndThirsty() { findShilopQ() player("Yes, I've found Fluffs!") From 433dd81516e53546a1b3370dc9907c280395138d Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 15:26:20 -0500 Subject: [PATCH 45/80] Progress, moved the assigning of crates to Fluffs, can't quite find the crate. I can either look for the ID or look to see if you can "search" the object itself and look at all objects --- .../content/area/misthalin/varrock/Fluffs.kt | 14 +++++++++++--- .../quest/member/gertrudes_cat/KittenCrates.kt | 5 +++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 48b05a4c8e..8a2d22afbb 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -7,11 +7,10 @@ import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME -import content.quest.member.gertrudes_cat.KITTEN_CRATES -import content.quest.member.gertrudes_cat.KittenCrates import content.quest.quest import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.data.definition.Areas import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.inv.add @@ -25,8 +24,15 @@ const val FLUFFS_MILK_VAR = "gertrudes_cat_fluffs_milk" const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { + private var kittenCrates = mutableSetOf() init { + objectSpawn("crate*") { // Not getting called, need to find ID and assign or look to see if you can "search" the object itself and look at all objects + if(this.tile in Areas["kitten_search_area"]){ + kittenCrates += tile + } + } + itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)){ @@ -157,7 +163,9 @@ class Fluffs : Script { private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ doNotTheCat(cat) - val crate = KITTEN_CRATES.random() + + val crate = kittenCrates.random() + set(KITTENS_HIDING_SPOT, crate) statement("Fluffs seems afraid to leave. \nIn the Lumber Yard below you can hear kittens mewing.") return diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index c0b6fd6656..30e7c7d536 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -5,14 +5,15 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.data.definition.Areas import world.gregs.voidps.type.Tile -var KITTEN_CRATES = mutableSetOf() + class KittenCrates : Script { + private var kittenCrates = mutableSetOf() init { objectSpawn("Crate") { if(this.tile in Areas["kitten_search_area"]){ - KITTEN_CRATES += tile + kittenCrates += tile } } objectOperate("Search", "Crate") { interact -> From 1dc4edcafe5fa38a0c71edbabab62f947552ff33 Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:06:34 -0500 Subject: [PATCH 46/80] I confirmed that crate 17 is the one around varrock, and I'm learning they don't technically spawn. --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 8a2d22afbb..ad5bf5be3f 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -27,8 +27,10 @@ class Fluffs : Script { private var kittenCrates = mutableSetOf() init { - objectSpawn("crate*") { // Not getting called, need to find ID and assign or look to see if you can "search" the object itself and look at all objects + objectSpawn("crate_17") { + println("Crate 17 spawned") if(this.tile in Areas["kitten_search_area"]){ + println("Found match $this at " + this.tile) kittenCrates += tile } } From 98b1ccb33d23a1ef2ae9317ce0a5a561b162dbb4 Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:42:11 -0500 Subject: [PATCH 47/80] Now properly assigns a crate tile per player. Testing was not exhaustive, but over 10 tries all of them have been on the first floor and in search-able crates. --- .../content/area/misthalin/varrock/Fluffs.kt | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index ad5bf5be3f..a0248f5bb5 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -13,10 +13,12 @@ import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.data.definition.Areas import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.obj.GameObjects import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.type.Tile +import world.gregs.voidps.type.Region private const val FLUFFS_STRING_ID = "fluffs_normal" const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" @@ -25,15 +27,9 @@ const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { private var kittenCrates = mutableSetOf() + private val kittenSearchArea = Areas["kitten_search_area"] init { - objectSpawn("crate_17") { - println("Crate 17 spawned") - if(this.tile in Areas["kitten_search_area"]){ - println("Found match $this at " + this.tile) - kittenCrates += tile - } - } itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() @@ -96,6 +92,15 @@ class Fluffs : Script { } } + private fun discoverKittenCrates() { + kittenCrates += Areas["kitten_search_area"] + .flatMap { tile -> + GameObjects.at(tile) + .filter { it.id == "crate_17" } + .map { it.tile } + } + } + private suspend fun Player.checkCanFeed() { // check player variable if you already fed the cat if(get(FLUFFS_FED_VAR, false)){ @@ -166,9 +171,11 @@ class Fluffs : Script { if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ doNotTheCat(cat) + discoverKittenCrates() val crate = kittenCrates.random() - set(KITTENS_HIDING_SPOT, crate) + println("Your cat is hiding at $crate") + statement("Fluffs seems afraid to leave. \nIn the Lumber Yard below you can hear kittens mewing.") return } From 2a5b08dbfecbe624fee67e0124b8a9179e53428b Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:44:36 -0500 Subject: [PATCH 48/80] "Seems like the cat doesn't hate you anymore." made into a statement instead of message for consistency --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index a0248f5bb5..a6d9eef92d 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -189,7 +189,7 @@ class Fluffs : Script { delay(1) cat.say("Prr...") delay(1) - message("Seems like the cat doesn't hate you anymore.") + statement("Seems like the cat doesn't hate you anymore.") } private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { From a43a8dd8c24ac073eed69e828fd26605f970c90c Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:45:11 -0500 Subject: [PATCH 49/80] Changed "the cat" to "Fluffs" for consistency --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index a6d9eef92d..bc2fec172b 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -189,7 +189,7 @@ class Fluffs : Script { delay(1) cat.say("Prr...") delay(1) - statement("Seems like the cat doesn't hate you anymore.") + statement("Seems like Fluffs doesn't hate you anymore.") } private suspend fun Player.strokeCatFoundFluffs(cat: NPC) { From 3e85c2737b00d8f6759ccd2c54e3f194b9f738f3 Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:45:37 -0500 Subject: [PATCH 50/80] Cleaned an unused import --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index bc2fec172b..4f0a759a09 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -18,7 +18,6 @@ import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove import world.gregs.voidps.type.Tile -import world.gregs.voidps.type.Region private const val FLUFFS_STRING_ID = "fluffs_normal" const val FLUFFS_FED_VAR = "gertrudes_cat_fluffs_fed" From 5db57b2fc3399cf8bc51b192b78aa3bffca44e63 Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:48:01 -0500 Subject: [PATCH 51/80] Removed an unused variable --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 4f0a759a09..c9b5c8aa09 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -26,7 +26,6 @@ const val KITTENS_HIDING_SPOT = "kittens_hiding_here" class Fluffs : Script { private var kittenCrates = mutableSetOf() - private val kittenSearchArea = Areas["kitten_search_area"] init { From 41b3b6aaa58f310d4efa294d7f2662e387868dbb Mon Sep 17 00:00:00 2001 From: potato Date: Sat, 12 Sep 2026 16:50:55 -0500 Subject: [PATCH 52/80] Fixed a typo --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index c9b5c8aa09..72204e084c 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -56,7 +56,7 @@ class Fluffs : Script { foundCatCheck() when(quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> dontBotherCat() - else -> message("Fluffs regards you with distain.") + else -> message("Fluffs regards you with disdain.") } } npcOperate("Talk-to", FLUFFS_STRING_ID) { interact -> From 01b50252fae22abc754a1a1b6feedaec3ebefd12 Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 09:46:23 -0500 Subject: [PATCH 53/80] KittenCrates logic should be about finished now. Still needs to be replaced with jiggling crates when appropriate. --- .../member/gertrudes_cat/KittenCrates.kt | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index 30e7c7d536..5ba00ea7f3 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -2,29 +2,35 @@ package content.quest.member.gertrudes_cat import content.area.misthalin.varrock.KITTENS_HIDING_SPOT import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.data.definition.Areas +import world.gregs.voidps.engine.inv.add +import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.type.Tile - +private const val KITTENS_FOUND = "three_little_kittens_found" class KittenCrates : Script { - private var kittenCrates = mutableSetOf() - init { - objectSpawn("Crate") { - if(this.tile in Areas["kitten_search_area"]){ - kittenCrates += tile - } - } - objectOperate("Search", "Crate") { interact -> + objectOperate("Search", "crate_17") { interact -> val player = interact.player val crate = interact.target + + if(get(KITTENS_FOUND, false)) { + return@objectOperate + } if(interact.target.tile !in Areas["kitten_search_area"]) { return@objectOperate } + var kittenCrate = get(KITTENS_HIDING_SPOT, Tile(0, 0)) if(crate.tile == kittenCrate){ - // Cat found! + if(player.inventory.isFull()){ + message("You find three little kittens but you have no space for them in your backpack.") + return@objectOperate + } + set(KITTENS_FOUND, true) + player.inventory.add("three_little_kittens") } } } From 144e6900cf1dd7a981aba31272e31cbdef8f11bc Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 09:49:53 -0500 Subject: [PATCH 54/80] Fixed a typo in function "mustBeAReasion" --- .../main/kotlin/content/area/misthalin/varrock/Gertrude.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 0fa7db5fb8..fb526167f6 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -30,7 +30,7 @@ class Gertrude : Script { init { npcOperate("Talk-to", "gertrude") { if(get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false) && quest("gertrudes_cat") == "attempt_fluffs_pickup"){ - mustBeAReasion() + mustBeAReason() return@npcOperate } when (quest("gertrudes_cat")) { @@ -44,7 +44,7 @@ class Gertrude : Script { } } - private suspend fun Player.mustBeAReasion() { + private suspend fun Player.mustBeAReason() { player("Hi!") npc("Hey traveller, did Fluffs eat the sardines?") player("Yeah, she loved them, but she still won't leave.") From 59f6a66cd7a996d3816a6622feddb59d3b51dfac Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 10:14:18 -0500 Subject: [PATCH 55/80] Functionally applied the drop logic for the three little kittens. --- .../member/gertrudes_cat/KittenCrates.kt | 4 +++- .../gertrudes_cat/ThreeLittleKittens.kt | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index 5ba00ea7f3..3d7b2788b8 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -1,6 +1,7 @@ package content.quest.member.gertrudes_cat import content.area.misthalin.varrock.KITTENS_HIDING_SPOT +import content.entity.player.dialogue.type.statement import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.data.definition.Areas @@ -8,7 +9,7 @@ import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.type.Tile -private const val KITTENS_FOUND = "three_little_kittens_found" +const val KITTENS_FOUND = "three_little_kittens_found" class KittenCrates : Script { init { @@ -31,6 +32,7 @@ class KittenCrates : Script { } set(KITTENS_FOUND, true) player.inventory.add("three_little_kittens") + statement("You find three little kittens! You carefully place them in your backpack. This explains why Fluffs is so agitated.") } } } diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt new file mode 100644 index 0000000000..2525a4db3e --- /dev/null +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt @@ -0,0 +1,23 @@ +package content.quest.member.gertrudes_cat + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.inv.remove + +private const val THREE_LITTLE_KITTENS_STRING_NAME = "three_little_kittens" + +class ThreeLittleKittens : Script { + init { + itemOption("Drop", THREE_LITTLE_KITTENS_STRING_NAME) { + inventory.remove(THREE_LITTLE_KITTENS_STRING_NAME) + set(KITTENS_FOUND, false) + message("You place the kittens on the floor.") + pause(2) + this.say("Mew!") + pause(2) + message("The kittens have run off.") + return@itemOption + } + } +} \ No newline at end of file From 59e6fc4efec32e9779a661677e62b7df2bd8da61 Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 10:26:15 -0500 Subject: [PATCH 56/80] Added a check for when three little kittens is inside the player's inventory, and the player attempts to pick up the cat. --- .../main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 72204e084c..4bb80e771c 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -120,6 +120,8 @@ class Fluffs : Script { if(item in doogleSardineItems){ mildInterest(item) + } else if(item == "three_little_kittens") { + TODO() } else { message("Fluffs doesn't seem to be interested in that.") } @@ -166,6 +168,11 @@ class Fluffs : Script { } private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { + if(inventory.contains("three_little_kittens")) { + doNotTheCat(cat) + + statement("Fluffs looks pitifully towards your backpack.") + } if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ doNotTheCat(cat) From 4cb2efadce1860311d1146742840248c96fa4cfb Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 10:40:31 -0500 Subject: [PATCH 57/80] Added notes for the cutscene so I'm not constantly referencing the video --- .../content/area/misthalin/varrock/Fluffs.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 4bb80e771c..68bcb2f2be 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -121,6 +121,23 @@ class Fluffs : Script { if(item in doogleSardineItems){ mildInterest(item) } else if(item == "three_little_kittens") { + /** + * Create a cutscene + * Fade to black + * Player is on the tile directly west of the ladder + * Camera is facing north-east, facing a steep angle, but not quite top-down. + * Fluffs is positioned directly north of the player 3 ~ 4 tiles away. Importantly, she is against the box/object. + * Player uses climb_down animation + * 3 little kittens are already spawned as the cutscene starts + * Fluffs says "Purr..." + * 3 little kittens moves straight to Fluffs and preforms an animation. + * Fluffs then preforms an animation while kittens say "purr" + * Kittens move to ladder and go down. + * Fluffs follows suit at the same time, but doesn't quite make it to the final tile before vanishing. + * Statement - "Fluffs has run off home with her offspring." + * Fade to black after statement is resumed. + * Cutscene ends, Fluffs disappears. + */ TODO() } else { message("Fluffs doesn't seem to be interested in that.") From 4777d26fda9341586eae390a4fbd4d04bd3579c6 Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 11:10:16 -0500 Subject: [PATCH 58/80] Created three_little_kittens NPC Further fleshed out the drop logic of the Three Little Kittens item. Not perfect but works. --- .../members/gertrudes_cat/gertrudes_cat.npcs.toml | 3 +++ .../member/gertrudes_cat/ThreeLittleKittens.kt | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml new file mode 100644 index 0000000000..69f6311fed --- /dev/null +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml @@ -0,0 +1,3 @@ +[three_little_kittens] +id = 7741 +examine = "Three little kittens." \ No newline at end of file diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt index 2525a4db3e..0c100967f6 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt @@ -2,20 +2,31 @@ package content.quest.member.gertrudes_cat import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.type.Tile private const val THREE_LITTLE_KITTENS_STRING_NAME = "three_little_kittens" class ThreeLittleKittens : Script { init { + // This works, but if the player moves then the kittens aren't shown properly running away. + // Putting it in a queue does not fix it. itemOption("Drop", THREE_LITTLE_KITTENS_STRING_NAME) { + val playerLoc = this.tile inventory.remove(THREE_LITTLE_KITTENS_STRING_NAME) set(KITTENS_FOUND, false) message("You place the kittens on the floor.") + pause(2) - this.say("Mew!") + val threeLittleKittens: NPC = NPCs.add(THREE_LITTLE_KITTENS_STRING_NAME, playerLoc) + threeLittleKittens.walkTo(Tile(3294, 3507)) + threeLittleKittens.say("Mew!") + pause(2) + threeLittleKittens.despawn(0) message("The kittens have run off.") return@itemOption } From 4a262e73a702e225c90312c4baf030a529901d5e Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 19:27:19 -0500 Subject: [PATCH 59/80] Changed Admit to Idle, actual animation unknown --- game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index 0fb03c9bbf..aaa63f4380 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -122,7 +122,7 @@ suspend fun Player.gertrudeLookingForInformation() { player("Where is this secret hideout? I really need to find that cat for your mum.") npc("If I told you that, it wouldn't be a secret. What if I need to escape from the law? I need a hideout.") player("From my limited knowledge of the law, they are not usually involved in manhunts for children.") - npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.") + npc("Well it's still mine anyway, we need a place to relax sometimes. Those two little brothers at the house are just such babies.") } suspend fun Player.gertrudePostQuest() { From 0898dbccd4eb443aba5d09701682998cbd0a5993 Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 20:53:44 -0500 Subject: [PATCH 60/80] Started cutscene where fluffs goes home --- .../gertrudes_cat/gertrudes_cat.npcs.toml | 5 +- .../content/area/misthalin/varrock/Fluffs.kt | 77 ++++++++++++++----- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml index 69f6311fed..ebf45a68b1 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.npcs.toml @@ -1,3 +1,6 @@ [three_little_kittens] id = 7741 -examine = "Three little kittens." \ No newline at end of file +examine = "Three little kittens." + +[fluffs_cutscene] +id = 7743 \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 68bcb2f2be..300cb3f398 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -8,15 +8,25 @@ import content.entity.player.dialogue.type.player import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest +import content.quest.setInstanceLogout +import content.quest.startCutscene import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.clearCamera import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.client.moveCamera +import world.gregs.voidps.engine.client.ui.open import world.gregs.voidps.engine.data.definition.Areas +import world.gregs.voidps.engine.entity.character.mode.PauseMode +import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPC +import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.obj.GameObjects import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove +import world.gregs.voidps.type.Direction +import world.gregs.voidps.type.Region import world.gregs.voidps.type.Tile private const val FLUFFS_STRING_ID = "fluffs_normal" @@ -121,29 +131,60 @@ class Fluffs : Script { if(item in doogleSardineItems){ mildInterest(item) } else if(item == "three_little_kittens") { - /** - * Create a cutscene - * Fade to black - * Player is on the tile directly west of the ladder - * Camera is facing north-east, facing a steep angle, but not quite top-down. - * Fluffs is positioned directly north of the player 3 ~ 4 tiles away. Importantly, she is against the box/object. - * Player uses climb_down animation - * 3 little kittens are already spawned as the cutscene starts - * Fluffs says "Purr..." - * 3 little kittens moves straight to Fluffs and preforms an animation. - * Fluffs then preforms an animation while kittens say "purr" - * Kittens move to ladder and go down. - * Fluffs follows suit at the same time, but doesn't quite make it to the final tile before vanishing. - * Statement - "Fluffs has run off home with her offspring." - * Fade to black after statement is resumed. - * Cutscene ends, Fluffs disappears. - */ - TODO() + fluffsGoesHome() } else { message("Fluffs doesn't seem to be interested in that.") } } + private suspend fun Player.fluffsGoesHome() { + /** + * Create a cutscene + * Fade to black + * Player is on the tile directly west of the ladder + * Camera is facing north-east, facing a steep angle, but not quite top-down. + * Fluffs is positioned directly north of the player 3 ~ 4 tiles away. Importantly, she is against the box/object. + * Player uses climb_down animation + * 3 little kittens are already spawned as the cutscene starts + * Fluffs says "Purr..." + * 3 little kittens moves straight to Fluffs and preforms an animation. + * Fluffs then preforms an animation while kittens say "purr" + * Kittens move to ladder and go down. + * Fluffs follows suit at the same time, but doesn't quite make it to the final tile before vanishing. + * Statement - "Fluffs has run off home with her offspring." + * Fade to black after statement is resumed. + * Cutscene ends, Fluffs disappears. + */ + val region = Region(13110) + val custceneStartTile = Tile(3309, 3509, 1) + + // set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") temporarily disabled for testing + + open("fade_out") + val cutscene = startCutscene("fluffs_kittens_reunite", region) + setInstanceLogout(custceneStartTile) + + cutscene.onEnd { + open("fade_out") + delay(3) + tele(custceneStartTile) + clearCamera() + clearAnim() + } + + delay(4) + tele(cutscene.tile(3309, 3509, 1), clearInterfaces = false) + face(Direction.NORTH) + val fluffs = NPCs.add("fluffs_cutscene", cutscene.tile(3309, 3512, 1), Direction.SOUTH) + fluffs.mode = PauseMode + moveCamera(cutscene.tile(3307, 3508, 1), 500) + + open("fade_in") + + delay(10) + cutscene.end() + } + private suspend fun Player.mildInterest(item: String) { var itemName = item if(item == "doogle_leaves"){ From c39be2fc76bfb70d4774f78285269936e545c7d4 Mon Sep 17 00:00:00 2001 From: potato Date: Sun, 13 Sep 2026 22:07:46 -0500 Subject: [PATCH 61/80] Cutscene progress. Done for the night. --- .../kotlin/content/area/misthalin/varrock/Fluffs.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 300cb3f398..7a8c0f7112 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -2,6 +2,7 @@ package content.area.misthalin.varrock import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Idle import content.entity.player.dialogue.Neutral import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player @@ -158,7 +159,9 @@ class Fluffs : Script { val region = Region(13110) val custceneStartTile = Tile(3309, 3509, 1) - // set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") temporarily disabled for testing + // Temporarily disabled for testing + // inventory.remove("three_little_kittens") + // set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") open("fade_out") val cutscene = startCutscene("fluffs_kittens_reunite", region) @@ -176,10 +179,18 @@ class Fluffs : Script { tele(cutscene.tile(3309, 3509, 1), clearInterfaces = false) face(Direction.NORTH) val fluffs = NPCs.add("fluffs_cutscene", cutscene.tile(3309, 3512, 1), Direction.SOUTH) + val kittens = NPCs.add("three_little_kittens", cutscene.tile(3309, 3510, 1), Direction.NORTH) + kittens.mode = PauseMode fluffs.mode = PauseMode + moveCamera(cutscene.tile(3307, 3508, 1), 500) + // Scene start open("fade_in") + anim("climb_down") + npc("Purr...") + kittens.walkToDelay(cutscene.tile(3309, 3511, 1)) + // TODO: find kitten and fluffs animation delay(10) cutscene.end() From 67fd36278ea8f6ea1b258ab1dd6acdcdff25d6da Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 12:23:20 -0500 Subject: [PATCH 62/80] Finished cat cutscene --- .../content/area/misthalin/varrock/Fluffs.kt | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 7a8c0f7112..5ccb7efc63 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -15,6 +15,7 @@ import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.clearCamera import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.client.moveCamera +import world.gregs.voidps.engine.client.turnCamera import world.gregs.voidps.engine.client.ui.open import world.gregs.voidps.engine.data.definition.Areas import world.gregs.voidps.engine.entity.character.mode.PauseMode @@ -46,15 +47,7 @@ class Fluffs : Script { "attempt_fluffs_pickup" -> checkCanFeed() else -> message("Fluffs doesn't seem to be hungry right now.") } - } - itemOnNPCOperate("*", FLUFFS_STRING_ID) { interact -> - val item = interact.item.id - - foundCatCheck() - when(quest(GERTRUDES_CAT_STRING_NAME)){ - "attempt_fluffs_pickup" -> checkItem(item) - else -> message("Fluffs doesn't seem to be interested in that.") // Actual message unknown, but I'd rather it not be blank. - } + return@itemOnNPCOperate } itemOnNPCOperate("bucket_of_milk", FLUFFS_STRING_ID) { foundCatCheck() @@ -62,11 +55,15 @@ class Fluffs : Script { "attempt_fluffs_pickup" -> milkFluffs() else -> message("Fluffs doesn't seem to be thirsty right now.") } + return@itemOnNPCOperate } - itemOnNPCOperate(npc = FLUFFS_STRING_ID) { + itemOnNPCOperate("*", FLUFFS_STRING_ID) { interact -> + val item = interact.item.id + foundCatCheck() - when(quest(GERTRUDES_CAT_STRING_NAME)) { + when(quest(GERTRUDES_CAT_STRING_NAME)){ "completed" -> dontBotherCat() + "attempt_fluffs_pickup" -> checkItem(item) else -> message("Fluffs regards you with disdain.") } } @@ -129,12 +126,16 @@ class Fluffs : Script { private suspend fun Player.checkItem(item: String) { val doogleSardineItems = setOf("doogle_leaves", "raw_sardine", "sardine") - if(item in doogleSardineItems){ - mildInterest(item) - } else if(item == "three_little_kittens") { - fluffsGoesHome() - } else { - message("Fluffs doesn't seem to be interested in that.") + when (item) { + in doogleSardineItems -> { + mildInterest(item) + } + "three_little_kittens" -> { + fluffsGoesHome() + } + else -> { + message("Fluffs doesn't seem to be interested in that.") + } } } @@ -159,9 +160,9 @@ class Fluffs : Script { val region = Region(13110) val custceneStartTile = Tile(3309, 3509, 1) - // Temporarily disabled for testing - // inventory.remove("three_little_kittens") - // set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") + + inventory.remove("three_little_kittens") + set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") open("fade_out") val cutscene = startCutscene("fluffs_kittens_reunite", region) @@ -183,16 +184,26 @@ class Fluffs : Script { kittens.mode = PauseMode fluffs.mode = PauseMode - moveCamera(cutscene.tile(3307, 3508, 1), 500) + // TODO: Get that proper camera angle. This is "good enough" + moveCamera(cutscene.tile(3304, 3505, 1), 500) + turnCamera(cutscene.tile(3309, 3510, 1), 100) // Scene start open("fade_in") anim("climb_down") npc("Purr...") kittens.walkToDelay(cutscene.tile(3309, 3511, 1)) - // TODO: find kitten and fluffs animation + kittens.mode = PauseMode // They just wanna zoom around! + kittens.animDelay("9207") + delay(15) + fluffs.animDelay("9205") + kittens.say("Purr...") + delay(6) + kittens.walkToDelay(cutscene.tile(3310, 3510, 1), true) + kittens.despawn() + fluffs.walkToDelay(cutscene.tile(3309, 3510, 1), true) + fluffs.despawn() - delay(10) cutscene.end() } @@ -241,6 +252,7 @@ class Fluffs : Script { doNotTheCat(cat) statement("Fluffs looks pitifully towards your backpack.") + return } if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ doNotTheCat(cat) From f0408dbe5f3fbe7c8813c3f351678178391cebbf Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 12:35:01 -0500 Subject: [PATCH 63/80] Added initial catspeak dialogue for Fluffs. --- .../content/area/misthalin/varrock/Fluffs.kt | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 5ccb7efc63..76bcda78c8 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -11,6 +11,7 @@ import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import content.quest.setInstanceLogout import content.quest.startCutscene +import content.skill.summoning.pet.hasCatspeakAmulet import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.clearCamera import world.gregs.voidps.engine.client.message @@ -23,6 +24,7 @@ import world.gregs.voidps.engine.entity.character.move.tele import world.gregs.voidps.engine.entity.character.npc.NPC import world.gregs.voidps.engine.entity.character.npc.NPCs import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.name import world.gregs.voidps.engine.entity.obj.GameObjects import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory @@ -70,7 +72,7 @@ class Fluffs : Script { npcOperate("Talk-to", FLUFFS_STRING_ID) { interact -> foundCatCheck() when (quest(GERTRUDES_CAT_STRING_NAME)) { - "completed" -> talkPostQuest(interact.target) + "completed" -> talkPostQuest(interact.target, interact.player.name) "found_fluffs" -> talkCatFoundFluffs(interact.target) "attempt_fluffs_pickup" -> talkCatFoundFluffs(interact.target) else -> dontBotherCat() @@ -239,9 +241,21 @@ class Fluffs : Script { message("You decide it best to not bother the cat.") // Going off of memory here. } - private suspend fun Player.talkPostQuest(cat: NPC) { + private suspend fun Player.talkPostQuest(cat: NPC, playerName: String) { + // TODO: Dialogue when the player has a kitten either following or in the player's inventory + if(hasCatspeakAmulet()){ + player("Hello Fluffs.") + npc("Purrrrr! So you can talk to cats now?") + player("Yes, I got this amulet from a Sphinx.") + npc("Well, I should thank you for finding my kitten that time. I have a terrible time keeping track of them, and I never know how many Gertrude has managed to sell.") + player("They're cute little creatures, aren't they?") + npc("Purrrrr!") + statement("Fluffs looks proud.") + npc("My children have always been popular with adventurers. They inherit their father's adventurous spirit. He's always travelling the world, when he can find some kind person to help him open doors!") + player("Look after yourself, Fluffs.") + npc("You too, $playerName.") + } cat.say("Miaoww") - // TODO: Amulet of catspeak dialogue } private fun talkCatFoundFluffs(cat: NPC) { cat.say("Miaoww") From 603833bbf6424df2427b95db9a181db0cb7c92df Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 14:48:49 -0500 Subject: [PATCH 64/80] Updated variables to be persistent --- .../members/gertrudes_cat/gertrudes_cat.vars.toml | 15 +++++++++++++++ .../content/area/misthalin/varrock/Fluffs.kt | 2 +- .../member/gertrudes_cat/ThreeLittleKittens.kt | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml new file mode 100644 index 0000000000..2f16c2ef3c --- /dev/null +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml @@ -0,0 +1,15 @@ +[gertrudes_cat_fluffs_fed] +persist = true +format = "boolean" + +[gertrudes_cat_fluffs_milk] +persist = true +format = "boolean" + +[kittens_hiding_here] +persist = true +format = "bitwise" ## Maybe bitwise? Honestly no idea what that even means + +[three_little_kittens_found] +persist = true +format = "boolean" \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 76bcda78c8..b7be1e24e2 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -298,6 +298,7 @@ class Fluffs : Script { } private suspend fun Player.doNotTheCat(cat: NPC) { + set(GERTRUDES_CAT_STRING_NAME, "attempt_fluffs_pickup") animDelay("climb_down") delay(1) cat.say("Hiss!") @@ -306,6 +307,5 @@ class Fluffs : Script { delay(1) say("Ouch!") delay(1) - set(GERTRUDES_CAT_STRING_NAME, "attempt_fluffs_pickup") } } \ No newline at end of file diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt index 0c100967f6..a9f5084c36 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt @@ -14,6 +14,7 @@ class ThreeLittleKittens : Script { init { // This works, but if the player moves then the kittens aren't shown properly running away. // Putting it in a queue does not fix it. + // If you drop the kittens up the ladder by Fluffs then the kittens will stick around. Or perhaps I delayed in doing something so the kittens spawned in, but performed the action before they despawned. itemOption("Drop", THREE_LITTLE_KITTENS_STRING_NAME) { val playerLoc = this.tile inventory.remove(THREE_LITTLE_KITTENS_STRING_NAME) From c3737088ac69afd2f9f4af9a756b789513402c22 Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 15:01:29 -0500 Subject: [PATCH 65/80] Speculative fix to properly store the coordinates of kitten_hiding_spot --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- .../kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index b7be1e24e2..f6e7987c18 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -273,7 +273,7 @@ class Fluffs : Script { discoverKittenCrates() val crate = kittenCrates.random() - set(KITTENS_HIDING_SPOT, crate) + set(KITTENS_HIDING_SPOT, crate.id) println("Your cat is hiding at $crate") statement("Fluffs seems afraid to leave. \nIn the Lumber Yard below you can hear kittens mewing.") diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index 3d7b2788b8..f7a0d18f0b 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -24,7 +24,8 @@ class KittenCrates : Script { return@objectOperate } - var kittenCrate = get(KITTENS_HIDING_SPOT, Tile(0, 0)) + val kittenCoords = get(KITTENS_HIDING_SPOT, -1) + var kittenCrate = Tile(kittenCoords) if(crate.tile == kittenCrate){ if(player.inventory.isFull()){ message("You find three little kittens but you have no space for them in your backpack.") From a655e1f09730aadb330196d9085748c49eb50085 Mon Sep 17 00:00:00 2001 From: PrettyPrincessPotato <160365586+PrettyPrincessPotato@users.noreply.github.com> Date: Mon, 14 Sep 2026 15:02:25 -0500 Subject: [PATCH 66/80] Update game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt Co-authored-by: Skal Fate <20464880+skalfate@users.noreply.github.com> --- .../kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 359a9d650f..a19ec58645 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -49,7 +49,7 @@ class GertrudesCat : Script { } if(progress == 4) { - lines += "I had a poke round the abandoned Lumber Mill and found and found" + lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to" lines += "Gertrude. " lines += "I think Fluffs may be hungry or thirsty but I am not sure what" From 1ebcbd954e18eb45b6453b5e9231146123e43712 Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 15:04:57 -0500 Subject: [PATCH 67/80] Properly updated format from "bitwise" to "int" for speculative fix --- data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml index 2f16c2ef3c..e59a148131 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml @@ -8,7 +8,7 @@ format = "boolean" [kittens_hiding_here] persist = true -format = "bitwise" ## Maybe bitwise? Honestly no idea what that even means +format = "int" [three_little_kittens_found] persist = true From 7d6dce6c84c971d3aad2be5ac65911ac344cc846 Mon Sep 17 00:00:00 2001 From: potato Date: Mon, 14 Sep 2026 15:22:40 -0500 Subject: [PATCH 68/80] Finished Fluffs interactions. Not 100% but good enough for horseshoes and hand grenades. --- game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index f6e7987c18..f757b9db8e 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -202,7 +202,7 @@ class Fluffs : Script { kittens.say("Purr...") delay(6) kittens.walkToDelay(cutscene.tile(3310, 3510, 1), true) - kittens.despawn() + kittens.despawn(1) // Added small delay to let the kittens get to the final tile fluffs.walkToDelay(cutscene.tile(3309, 3510, 1), true) fluffs.despawn() From d383c96d8ace2d147ba18bc9ea40604f6298f62d Mon Sep 17 00:00:00 2001 From: potato Date: Tue, 15 Sep 2026 23:23:08 -0500 Subject: [PATCH 69/80] Theoretically finished, needs polish and testing --- .../gertrudes_cat/gertrudes_cat.vars.toml | 4 ++ .../area/misthalin/varrock/Gertrude.kt | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml index e59a148131..2ff36f0a6f 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml @@ -12,4 +12,8 @@ format = "int" [three_little_kittens_found] persist = true +format = "boolean" + +[gertrudes_cat_talked_about_reward] +persist = true format = "boolean" \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index fb526167f6..984c2264bf 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,5 +1,6 @@ package content.area.misthalin.varrock +import content.entity.player.AdventurersLogs import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Disheartened @@ -12,12 +13,20 @@ import content.entity.player.dialogue.Sad import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest +import content.quest.questComplete +import content.quest.refreshQuestJournal import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.jingle import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.engine.entity.character.player.skill.exp.exp +import world.gregs.voidps.engine.event.AuditLog import world.gregs.voidps.engine.inv.add import world.gregs.voidps.engine.inv.inventory +import world.gregs.voidps.engine.queue.longQueue /** * Minimal Gertrude dialogue. Once Gertrude's Cat quest is completed, lets the @@ -39,11 +48,60 @@ class Gertrude : Script { "found_the_boys" -> findingFluffs() "found_fluffs" -> hungryAndThirsty() "attempt_fluffs_pickup" -> hungryAndThirsty() + "fluffs_returned" -> finishQuest() else -> unstarted() } } } + private suspend fun Player.finishQuest() { + if(!get("gertrudes_cat_talked_about_reward", false)) { + player("Hello, Gertrude. Fluffs had run off with her kittens, lost them and I have now returned them to her.") + statement("Gertrude thanks you heartily") + npc("Thank you! If you hadn't found her kittens then they would have died out there. I've got some presents for you in thanks for your help.") + player("That's okay, I like to do my bit.") + set("gertrudes_cat_talked_about_reward", true) + } else { + player("Hello again. You said something about presents...") + } + if(inventory.spaces < 3){ + npc("You don't have space to hold all four of my presents. Come back and talk to me again when you do.") + return + } + npc("I have no real material possessions but I do have kittens. I've cooked you some food too.") + player("Well if one needs a home.") + npc("I would sell one to my cousin in West Ardougne. I hear there's a rat epidemic there but it's too far for me to travel, what with my boys and all.") + npc("Here you go. Look after her and thank you again.") + npc("Oh, by the way, the kitten can live in your backpack but, to ensure it grows, you must take it out, feed it and stroke it often.") + statement("Gertrude gives you a kitten.") + questComplete() + } + + suspend fun Player.questComplete() { + AuditLog.event(this, "quest_completed", "gertrudes_cat") + // AdventurersLogs.questCompleted(this, "the_restless_ghost", points = 1) // Unknown if needed + set(GERTRUDES_CAT_STRING_NAME, "completed") + jingle("quest_complete_1") + exp(Skill.Cooking, 1525.0) + giveKitten() + inventory.add("chocolate_cake") + inventory.add("stew") + refreshQuestJournal() + inc("quest_points") + longQueue("quest_complete", 1) { + questComplete( + "Gertrude's Cat", + "1 Quest Point", + "A kitten!", + "1,525 Cooking XP", + "A chocolate cake", + "A bowl of stew", + "The ability to raise cats", + item = "pet_cat", // TODO: Find cat id + ) + } + } + private suspend fun Player.mustBeAReason() { player("Hi!") npc("Hey traveller, did Fluffs eat the sardines?") From ad2df6eedb962b637437c48d24b7143b7f2765ed Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 08:18:40 -0500 Subject: [PATCH 70/80] Added missing lines to Gertrude's Cat journal. --- .../member/gertrudes_cat/GertrudesCat.kt | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index a19ec58645..5881b2cb40 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -21,7 +21,7 @@ class GertrudesCat : Script { return@questJournalOpen } // Couldn't find anything official, this is just extrapolating. - lines += "I have talked to Gertrude about her cat. She is very upset." + lines += "I helped Gertrude to find her lost cat," if(progress == 1) { lines += "I need to speak to Gertrude's sons," @@ -58,13 +58,32 @@ class GertrudesCat : Script { return@questJournalOpen } - if(progress == 5) { + if (get("gertrudes_cat_fluffs_milk", false)){ + lines += "I have fed the cat milk." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + if (get("gertrudes_cat_fluffs_fed", false)) { + lines += "I have fed the cat a doogle sardine" + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + if(get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)){ + lines += "I still need to get her to follow me home." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + + lines += "I fed it and returned her missing kitten," + if(progress == 5) { questJournal("Gertrude's Cat", lines) return@questJournalOpen } // complete - lines += "complete" + lines += "Gertrude gave me my very own pet for a reward." + lines += "" + lines += "QUEST COMPLETE!" questJournal("Gertrude's Cat", lines) } } From 89f4b0b3bc4df5f97cbf5bda60dab43212d1d92d Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 08:27:52 -0500 Subject: [PATCH 71/80] Clean up, more missed dialogue, commented. --- .../quest/member/gertrudes_cat/GertrudesCat.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 5881b2cb40..e0852a4938 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -13,6 +13,7 @@ class GertrudesCat : Script { val progress = questStage(GERTRUDES_CAT_STRING_NAME) val lines = mutableListOf() + // Unstarted if(progress == 0){ lines += "I can start this quest by speaking to Gertrude." lines += "She can be found in a house south of the road leading west" @@ -23,6 +24,7 @@ class GertrudesCat : Script { // Couldn't find anything official, this is just extrapolating. lines += "I helped Gertrude to find her lost cat," + // spoke_to_gertrude if(progress == 1) { lines += "I need to speak to Gertrude's sons," lines += "Shilop and Wilough, in Varrock Marketplace." @@ -33,6 +35,7 @@ class GertrudesCat : Script { lines += "I spoke with Gertrude's sons," lines += "Shilop and Wilough, in Varrock Marketplace." + // found_the_boys if(progress == 2) { lines += "I need to go to Shilop and Wilough's secret hideout" lines += "in an abandoned Lumber Mill, to the north-east and find" @@ -41,6 +44,7 @@ class GertrudesCat : Script { return@questJournalOpen } + // found_fluffs if(progress == 3) { lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to Gertrude." @@ -48,6 +52,7 @@ class GertrudesCat : Script { return@questJournalOpen } + // attempt_fluffs_pickup if(progress == 4) { lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to" @@ -59,12 +64,14 @@ class GertrudesCat : Script { } if (get("gertrudes_cat_fluffs_milk", false)){ - lines += "I have fed the cat milk." + lines += "I found Fluffs and fed her some milk but she still won't come back." + lines += "Now I should feed her some doogle sardines." questJournal("Gertrude's Cat", lines) return@questJournalOpen } if (get("gertrudes_cat_fluffs_fed", false)) { - lines += "I have fed the cat a doogle sardine" + lines += "I found Fluffs and fed her some doogle sardines but she still won't come back." + lines += "Now I should feed her some milk." questJournal("Gertrude's Cat", lines) return@questJournalOpen } @@ -76,11 +83,13 @@ class GertrudesCat : Script { lines += "I fed it and returned her missing kitten," + // fluffs_returned if(progress == 5) { questJournal("Gertrude's Cat", lines) return@questJournalOpen } - // complete + + // completed lines += "Gertrude gave me my very own pet for a reward." lines += "" lines += "QUEST COMPLETE!" From b8156745ff2ec1148fe82c355b46621f6c0ad82d Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 09:16:48 -0500 Subject: [PATCH 72/80] Added the varrock sawmill operator's dialogue --- data/area/misthalin/varrock/varrock.npcs.toml | 2 + .../gertrudes_cat/gertrudes_cat.vars.toml | 4 ++ .../varrock/SawmillOperatorVarrock.kt | 39 +++++++++++++++++++ .../content/area/misthalin/varrock/Wilough.kt | 1 + 4 files changed, 46 insertions(+) create mode 100644 game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt diff --git a/data/area/misthalin/varrock/varrock.npcs.toml b/data/area/misthalin/varrock/varrock.npcs.toml index 328b82b791..63f250108e 100644 --- a/data/area/misthalin/varrock/varrock.npcs.toml +++ b/data/area/misthalin/varrock/varrock.npcs.toml @@ -273,6 +273,8 @@ examine = "He tries to keep order around here." [sawmill_operator] id = 4250 +shop = "construction_supplies" +examine = "He changes the shape of wood." [assistant_serf] id = 5066 diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml index 2ff36f0a6f..e726138487 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml @@ -16,4 +16,8 @@ format = "boolean" [gertrudes_cat_talked_about_reward] persist = true +format = "boolean" + +[gertrudes_cat_know_where_fluffs_is] +persist = true format = "boolean" \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt b/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt new file mode 100644 index 0000000000..a9cffa8bc5 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt @@ -0,0 +1,39 @@ +package content.area.misthalin.varrock + +import content.entity.npc.shop.openShop +import content.entity.player.dialogue.Confused +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.type.choice +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME +import content.quest.questStage +import world.gregs.voidps.engine.Script + +class SawmillOperatorVarrock : Script { + // Free to play message: "The sawmill operator pays you no attention, it doesn't seem like he'll help you." + init { + npcApproach("Talk-to", "sawmill_operator") { (target) -> + approachRange(2) + npc("Hello there. Do you want me to make some planks for you? I can make planks from wood, oak, teak and mahogany logs. Or would you like to buy some other housing supplies?") + choice { + option("Yes, please make me some planks.") { + TODO("Plank-making interface not finished") + } + option("Can I buy some housing supplies?") { + npc("Of course!") + openShop(target.def["shop"]) + } + if(questStage(GERTRUDES_CAT_STRING_NAME) == 2 && get("gertrudes_cat_know_where_fluffs_is", false)) { + option("I have some questions about a cat.") { + npc("A cat? What makes you ask about that?") + player("I'm looking for a cat named Fluffs and my sources tell me she may be in your sawmill.") + npc("Your sources? Who's been talking about my sawmill behind my back? This is a business. We don't have animals on the premises.") + } + } + } + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index aaa63f4380..ed823c2586 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -94,6 +94,7 @@ suspend fun Player.gertrudePayChildren() { if (inventory.contains("coins", 100)) { inventory.remove("coins", 100) set(GERTRUDES_CAT_STRING_NAME, "found_the_boys") + set("gertrudes_cat_know_where_fluffs_is", true) statement("You give the lad 100 coins.") player("There you go, now where did you see Fluffs?") npc(npcId = WILOUGH_STRING_NAME, "I play at an abandoned lumber mill to the north east. Just beyond the Jolly Boar Inn. I saw Fluffs running around in there.") From 367eabe4e1de169520e3caaf84d26b03baf7bf71 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 09:32:22 -0500 Subject: [PATCH 73/80] Further clean up for the quest journal --- .../gertrudes_cat/gertrudes_cat.vars.toml | 8 ++-- .../member/gertrudes_cat/GertrudesCat.kt | 43 ++++++++++++------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml index e726138487..abc13a17ba 100644 --- a/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml +++ b/data/quest/members/gertrudes_cat/gertrudes_cat.vars.toml @@ -1,3 +1,7 @@ +[gertrudes_cat_know_where_fluffs_is] +persist = true +format = "boolean" + [gertrudes_cat_fluffs_fed] persist = true format = "boolean" @@ -16,8 +20,4 @@ format = "boolean" [gertrudes_cat_talked_about_reward] persist = true -format = "boolean" - -[gertrudes_cat_know_where_fluffs_is] -persist = true format = "boolean" \ No newline at end of file diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index e0852a4938..d6cd4404b0 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -52,36 +52,49 @@ class GertrudesCat : Script { return@questJournalOpen } - // attempt_fluffs_pickup - if(progress == 4) { - lines += "I had a poke round the abandoned Lumber Mill and found" - lines += "Fluffs up a ladder. I now need to return Fluffs to" - lines += "Gertrude. " - lines += "I think Fluffs may be hungry or thirsty but I am not sure what" - lines += "she wants; perhaps Gertrude can help?" - questJournal("Gertrude's Cat", lines) - return@questJournalOpen - } - - if (get("gertrudes_cat_fluffs_milk", false)){ + /** + * attempt_fluffs_pickup + */ + if (!get("gertrudes_cat_fluffs_milk", false)){ lines += "I found Fluffs and fed her some milk but she still won't come back." lines += "Now I should feed her some doogle sardines." questJournal("Gertrude's Cat", lines) return@questJournalOpen } - if (get("gertrudes_cat_fluffs_fed", false)) { + if (!get("gertrudes_cat_fluffs_fed", false)) { lines += "I found Fluffs and fed her some doogle sardines but she still won't come back." lines += "Now I should feed her some milk." questJournal("Gertrude's Cat", lines) return@questJournalOpen } + if(get("three_little_kittens_found", false)) { + lines += "I have found some kittens. " + lines += "I think I should see whether Fluffs is looking for them." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } if(get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)){ - lines += "I still need to get her to follow me home." + lines += "I found Fluffs and fed her some milk and doogle sardine," + lines += "but she still won't come back. I should look around the Lumbermill Yard" + lines += "for a reason for this behaviour." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + + if(progress == 4) { + lines += "I had a poke round the abandoned Lumber Mill and found" + lines += "Fluffs up a ladder. I now need to return Fluffs to" + lines += "Gertrude. " + lines += "I think Fluffs may be hungry or thirsty but I am not sure what" + lines += "she wants; perhaps Gertrude can help?" questJournal("Gertrude's Cat", lines) return@questJournalOpen } + /** + * End of attempt_fluffs_pickup + */ - lines += "I fed it and returned her missing kitten," + lines += "I fed her and returned her missing kitten," // fluffs_returned if(progress == 5) { From 9262082763f07b2730f37621a94f0b3771557114 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 09:34:18 -0500 Subject: [PATCH 74/80] Removed unneeded notes, added statement at the end of fluffs cutscene --- .../content/area/misthalin/varrock/Fluffs.kt | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index f757b9db8e..078d518672 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -142,23 +142,6 @@ class Fluffs : Script { } private suspend fun Player.fluffsGoesHome() { - /** - * Create a cutscene - * Fade to black - * Player is on the tile directly west of the ladder - * Camera is facing north-east, facing a steep angle, but not quite top-down. - * Fluffs is positioned directly north of the player 3 ~ 4 tiles away. Importantly, she is against the box/object. - * Player uses climb_down animation - * 3 little kittens are already spawned as the cutscene starts - * Fluffs says "Purr..." - * 3 little kittens moves straight to Fluffs and preforms an animation. - * Fluffs then preforms an animation while kittens say "purr" - * Kittens move to ladder and go down. - * Fluffs follows suit at the same time, but doesn't quite make it to the final tile before vanishing. - * Statement - "Fluffs has run off home with her offspring." - * Fade to black after statement is resumed. - * Cutscene ends, Fluffs disappears. - */ val region = Region(13110) val custceneStartTile = Tile(3309, 3509, 1) @@ -205,6 +188,7 @@ class Fluffs : Script { kittens.despawn(1) // Added small delay to let the kittens get to the final tile fluffs.walkToDelay(cutscene.tile(3309, 3510, 1), true) fluffs.despawn() + statement("Fluffs has run off home with her offspring.") cutscene.end() } From 01198e255459b01479f881dbc63379fc90fea140 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 09:46:52 -0500 Subject: [PATCH 75/80] Corrected gertrude, she gives you three presents, not four. --- .../member/gertrudes_cat/GertrudesCat.kt | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index d6cd4404b0..25268fa2ea 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -55,33 +55,32 @@ class GertrudesCat : Script { /** * attempt_fluffs_pickup */ - if (!get("gertrudes_cat_fluffs_milk", false)){ - lines += "I found Fluffs and fed her some milk but she still won't come back." - lines += "Now I should feed her some doogle sardines." - questJournal("Gertrude's Cat", lines) - return@questJournalOpen - } - if (!get("gertrudes_cat_fluffs_fed", false)) { - lines += "I found Fluffs and fed her some doogle sardines but she still won't come back." - lines += "Now I should feed her some milk." - questJournal("Gertrude's Cat", lines) - return@questJournalOpen - } - if(get("three_little_kittens_found", false)) { - lines += "I have found some kittens. " - lines += "I think I should see whether Fluffs is looking for them." - questJournal("Gertrude's Cat", lines) - return@questJournalOpen - } - if(get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)){ - lines += "I found Fluffs and fed her some milk and doogle sardine," - lines += "but she still won't come back. I should look around the Lumbermill Yard" - lines += "for a reason for this behaviour." - questJournal("Gertrude's Cat", lines) - return@questJournalOpen - } - if(progress == 4) { + if (!get("gertrudes_cat_fluffs_milk", false)){ + lines += "I found Fluffs and fed her some milk but she still won't come back." + lines += "Now I should feed her some doogle sardines." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + if (!get("gertrudes_cat_fluffs_fed", false)) { + lines += "I found Fluffs and fed her some doogle sardines but she still won't come back." + lines += "Now I should feed her some milk." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + if(get("three_little_kittens_found", false)) { + lines += "I have found some kittens. " + lines += "I think I should see whether Fluffs is looking for them." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } + if(get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)){ + lines += "I found Fluffs and fed her some milk and doogle sardine," + lines += "but she still won't come back. I should look around the Lumbermill Yard" + lines += "for a reason for this behaviour." + questJournal("Gertrude's Cat", lines) + return@questJournalOpen + } lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to" lines += "Gertrude. " @@ -98,6 +97,9 @@ class GertrudesCat : Script { // fluffs_returned if(progress == 5) { + lines += "I returned the kittens to Fluffs who then ran away." + lines += "I think I should see Gertrude in her house, west of Varrock," + lines += "and explain what has happened." questJournal("Gertrude's Cat", lines) return@questJournalOpen } From a2dc2f5c7eb9edfabac255585efda693f5bd3804 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 09:47:36 -0500 Subject: [PATCH 76/80] Functionally finished. Needs a little bit of polish here and there but good enough. --- game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 984c2264bf..4dc1508ca3 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -65,7 +65,7 @@ class Gertrude : Script { player("Hello again. You said something about presents...") } if(inventory.spaces < 3){ - npc("You don't have space to hold all four of my presents. Come back and talk to me again when you do.") + npc("You don't have space to hold all three of my presents. Come back and talk to me again when you do.") return } npc("I have no real material possessions but I do have kittens. I've cooked you some food too.") From 6734b1676c03aec781ae2080ac591891cca98e8a Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 10:13:59 -0500 Subject: [PATCH 77/80] ./gradlew :game:spotlessApply --- .../misthalin/varrock/BrokenFenceSawmill.kt | 2 +- .../content/area/misthalin/varrock/Fluffs.kt | 25 +++++++++---------- .../area/misthalin/varrock/Gertrude.kt | 7 +++--- .../content/area/misthalin/varrock/Kanel.kt | 2 +- .../content/area/misthalin/varrock/Philop.kt | 2 +- .../varrock/SawmillOperatorVarrock.kt | 4 +-- .../content/area/misthalin/varrock/Shilop.kt | 4 +-- .../content/area/misthalin/varrock/Wilough.kt | 13 +++++----- .../gertrudes_cat/DoogleSardineRecipe.kt | 2 +- .../member/gertrudes_cat/GertrudesCat.kt | 20 +++++++-------- .../member/gertrudes_cat/KittenCrates.kt | 10 ++++---- .../gertrudes_cat/ThreeLittleKittens.kt | 2 +- 12 files changed, 45 insertions(+), 48 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt index 31ff799f4f..e17bb88009 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/BrokenFenceSawmill.kt @@ -30,4 +30,4 @@ class BrokenFenceSawmill : Script { } } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt index 078d518672..bdda7d75c0 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Fluffs.kt @@ -45,7 +45,7 @@ class Fluffs : Script { itemOnNPCOperate("doogle_sardine", FLUFFS_STRING_ID) { foundCatCheck() - when(quest(GERTRUDES_CAT_STRING_NAME)){ + when (quest(GERTRUDES_CAT_STRING_NAME)) { "attempt_fluffs_pickup" -> checkCanFeed() else -> message("Fluffs doesn't seem to be hungry right now.") } @@ -53,7 +53,7 @@ class Fluffs : Script { } itemOnNPCOperate("bucket_of_milk", FLUFFS_STRING_ID) { foundCatCheck() - when(quest(GERTRUDES_CAT_STRING_NAME)){ + when (quest(GERTRUDES_CAT_STRING_NAME)) { "attempt_fluffs_pickup" -> milkFluffs() else -> message("Fluffs doesn't seem to be thirsty right now.") } @@ -63,7 +63,7 @@ class Fluffs : Script { val item = interact.item.id foundCatCheck() - when(quest(GERTRUDES_CAT_STRING_NAME)){ + when (quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> dontBotherCat() "attempt_fluffs_pickup" -> checkItem(item) else -> message("Fluffs regards you with disdain.") @@ -88,7 +88,7 @@ class Fluffs : Script { } npcOperate("Stroke", FLUFFS_STRING_ID) { interact -> foundCatCheck() - if(get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false)){ + if (get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false)) { strokeCatFedFluffs(interact.target) return@npcOperate } @@ -111,7 +111,7 @@ class Fluffs : Script { private suspend fun Player.checkCanFeed() { // check player variable if you already fed the cat - if(get(FLUFFS_FED_VAR, false)){ + if (get(FLUFFS_FED_VAR, false)) { dontBotherCat() } else { feedFluffs() @@ -145,7 +145,6 @@ class Fluffs : Script { val region = Region(13110) val custceneStartTile = Tile(3309, 3509, 1) - inventory.remove("three_little_kittens") set(GERTRUDES_CAT_STRING_NAME, "fluffs_returned") @@ -195,10 +194,10 @@ class Fluffs : Script { private suspend fun Player.mildInterest(item: String) { var itemName = item - if(item == "doogle_leaves"){ + if (item == "doogle_leaves") { itemName = "doogle leaves" } - if (item == "raw_sardine"){ + if (item == "raw_sardine") { itemName = "raw sardine" } npc("Hiss!") @@ -216,7 +215,7 @@ class Fluffs : Script { } private fun Player.foundCatCheck() { - when(quest(GERTRUDES_CAT_STRING_NAME)) { + when (quest(GERTRUDES_CAT_STRING_NAME)) { "found_the_boys" -> set(GERTRUDES_CAT_STRING_NAME, "found_fluffs") } } @@ -227,7 +226,7 @@ class Fluffs : Script { private suspend fun Player.talkPostQuest(cat: NPC, playerName: String) { // TODO: Dialogue when the player has a kitten either following or in the player's inventory - if(hasCatspeakAmulet()){ + if (hasCatspeakAmulet()) { player("Hello Fluffs.") npc("Purrrrr! So you can talk to cats now?") player("Yes, I got this amulet from a Sphinx.") @@ -246,13 +245,13 @@ class Fluffs : Script { } private suspend fun Player.yoinkCatFoundFluffs(cat: NPC) { - if(inventory.contains("three_little_kittens")) { + if (inventory.contains("three_little_kittens")) { doNotTheCat(cat) statement("Fluffs looks pitifully towards your backpack.") return } - if(get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)){ + if (get(FLUFFS_FED_VAR, false) && get(FLUFFS_MILK_VAR, false)) { doNotTheCat(cat) discoverKittenCrates() @@ -292,4 +291,4 @@ class Fluffs : Script { say("Ouch!") delay(1) } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 4dc1508ca3..8543c3fb95 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,6 +1,5 @@ package content.area.misthalin.varrock -import content.entity.player.AdventurersLogs import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Disheartened @@ -38,7 +37,7 @@ class Gertrude : Script { init { npcOperate("Talk-to", "gertrude") { - if(get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false) && quest("gertrudes_cat") == "attempt_fluffs_pickup"){ + if (get(FLUFFS_MILK_VAR, false) && get(FLUFFS_FED_VAR, false) && quest("gertrudes_cat") == "attempt_fluffs_pickup") { mustBeAReason() return@npcOperate } @@ -55,7 +54,7 @@ class Gertrude : Script { } private suspend fun Player.finishQuest() { - if(!get("gertrudes_cat_talked_about_reward", false)) { + if (!get("gertrudes_cat_talked_about_reward", false)) { player("Hello, Gertrude. Fluffs had run off with her kittens, lost them and I have now returned them to her.") statement("Gertrude thanks you heartily") npc("Thank you! If you hadn't found her kittens then they would have died out there. I've got some presents for you in thanks for your help.") @@ -64,7 +63,7 @@ class Gertrude : Script { } else { player("Hello again. You said something about presents...") } - if(inventory.spaces < 3){ + if (inventory.spaces < 3) { npc("You don't have space to hold all three of my presents. Come back and talk to me again when you do.") return } diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt index fc1f4ba222..7bf604c4d1 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Kanel.kt @@ -40,4 +40,4 @@ class Kanel : Script { player("Right. Bye Kanel.") npc("Me?") } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt index 5779e3448e..a53a81f492 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Philop.kt @@ -40,4 +40,4 @@ class Philop : Script { player("I see. I don't think this is the most helpful clue I have ever been given.") npc("Gwwrr!") } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt b/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt index a9cffa8bc5..8aeb7045c5 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/SawmillOperatorVarrock.kt @@ -26,7 +26,7 @@ class SawmillOperatorVarrock : Script { npc("Of course!") openShop(target.def["shop"]) } - if(questStage(GERTRUDES_CAT_STRING_NAME) == 2 && get("gertrudes_cat_know_where_fluffs_is", false)) { + if (questStage(GERTRUDES_CAT_STRING_NAME) == 2 && get("gertrudes_cat_know_where_fluffs_is", false)) { option("I have some questions about a cat.") { npc("A cat? What makes you ask about that?") player("I'm looking for a cat named Fluffs and my sources tell me she may be in your sawmill.") @@ -36,4 +36,4 @@ class SawmillOperatorVarrock : Script { } } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt index 57631b6c35..b189accee1 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Shilop.kt @@ -19,7 +19,7 @@ const val SHILOP_STRING_NAME = "shilop" class Shilop : Script { init { - npcOperate("Talk-to", SHILOP_STRING_NAME){ + npcOperate("Talk-to", SHILOP_STRING_NAME) { when (quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() @@ -53,4 +53,4 @@ private suspend fun Player.lookingForInformationBranch() { gertrudeFluffsLoss() } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt index ed823c2586..41ce218d9a 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Wilough.kt @@ -1,6 +1,5 @@ package content.area.misthalin.varrock -import content.entity.player.dialogue.Admit import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Happy import content.entity.player.dialogue.Idle @@ -12,13 +11,13 @@ import content.entity.player.dialogue.Scared import content.entity.player.dialogue.Shock import content.entity.player.dialogue.type.choice import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.entity.player.dialogue.type.statement import content.quest.member.gertrudes_cat.GERTRUDES_CAT_STRING_NAME import content.quest.quest import world.gregs.voidps.engine.Script -import world.gregs.voidps.engine.entity.character.player.Player -import content.entity.player.dialogue.type.player -import content.entity.player.dialogue.type.statement import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.inv.inventory import world.gregs.voidps.engine.inv.remove @@ -29,7 +28,7 @@ const val WILOUGH_STRING_NAME = "wilough" class Wilough : Script { init { - npcOperate("Talk-to", WILOUGH_STRING_NAME){ + npcOperate("Talk-to", WILOUGH_STRING_NAME) { when (quest(GERTRUDES_CAT_STRING_NAME)) { "completed" -> gertrudePostQuest() "spoke_to_gertrude" -> lookingForInformationBranch() @@ -86,7 +85,7 @@ suspend fun Player.gertrudeFluffsCost() { } } -suspend fun Player.gertrudePayChildren() { +suspend fun Player.gertrudePayChildren() { player("Okay then, I'll pay, but I'll want you to tell your mother what a nice person I am.") npc("What?") player("I'll want you to tell your mother what a nice person I am so she rewards me for this search.") @@ -139,4 +138,4 @@ suspend fun Player.gertrudePostQuest() { suspend fun Player.gertrudeWhereFluffs() { player("Where did you say you saw Fluffs?") npc("Weren't you listening? I saw the flea bag in the old lumber mill just north east of here. Just walk past the Jolly Boar Inn and you should find it.") -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt index 72e0f7943e..dfa4688d1c 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/DoogleSardineRecipe.kt @@ -26,4 +26,4 @@ class DoogleSardineRecipe : Script { inventory.add("doogle_sardine") } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt index 25268fa2ea..ca6ed188b3 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/GertrudesCat.kt @@ -14,7 +14,7 @@ class GertrudesCat : Script { val lines = mutableListOf() // Unstarted - if(progress == 0){ + if (progress == 0) { lines += "I can start this quest by speaking to Gertrude." lines += "She can be found in a house south of the road leading west" lines += "out of Varrock." @@ -25,7 +25,7 @@ class GertrudesCat : Script { lines += "I helped Gertrude to find her lost cat," // spoke_to_gertrude - if(progress == 1) { + if (progress == 1) { lines += "I need to speak to Gertrude's sons," lines += "Shilop and Wilough, in Varrock Marketplace." questJournal("Gertrude's Cat", lines) @@ -36,7 +36,7 @@ class GertrudesCat : Script { lines += "Shilop and Wilough, in Varrock Marketplace." // found_the_boys - if(progress == 2) { + if (progress == 2) { lines += "I need to go to Shilop and Wilough's secret hideout" lines += "in an abandoned Lumber Mill, to the north-east and find" lines += "Fluffs, then return her to Gertrude." @@ -45,7 +45,7 @@ class GertrudesCat : Script { } // found_fluffs - if(progress == 3) { + if (progress == 3) { lines += "I had a poke round the abandoned Lumber Mill and found" lines += "Fluffs up a ladder. I now need to return Fluffs to Gertrude." questJournal("Gertrude's Cat", lines) @@ -55,8 +55,8 @@ class GertrudesCat : Script { /** * attempt_fluffs_pickup */ - if(progress == 4) { - if (!get("gertrudes_cat_fluffs_milk", false)){ + if (progress == 4) { + if (!get("gertrudes_cat_fluffs_milk", false)) { lines += "I found Fluffs and fed her some milk but she still won't come back." lines += "Now I should feed her some doogle sardines." questJournal("Gertrude's Cat", lines) @@ -68,13 +68,13 @@ class GertrudesCat : Script { questJournal("Gertrude's Cat", lines) return@questJournalOpen } - if(get("three_little_kittens_found", false)) { + if (get("three_little_kittens_found", false)) { lines += "I have found some kittens. " lines += "I think I should see whether Fluffs is looking for them." questJournal("Gertrude's Cat", lines) return@questJournalOpen } - if(get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)){ + if (get("gertrudes_cat_fluffs_milk", false) && get("gertrudes_cat_fluffs_fed", false)) { lines += "I found Fluffs and fed her some milk and doogle sardine," lines += "but she still won't come back. I should look around the Lumbermill Yard" lines += "for a reason for this behaviour." @@ -96,7 +96,7 @@ class GertrudesCat : Script { lines += "I fed her and returned her missing kitten," // fluffs_returned - if(progress == 5) { + if (progress == 5) { lines += "I returned the kittens to Fluffs who then ran away." lines += "I think I should see Gertrude in her house, west of Varrock," lines += "and explain what has happened." @@ -111,4 +111,4 @@ class GertrudesCat : Script { questJournal("Gertrude's Cat", lines) } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index f7a0d18f0b..d2a98f3f33 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -17,17 +17,17 @@ class KittenCrates : Script { val player = interact.player val crate = interact.target - if(get(KITTENS_FOUND, false)) { + if (get(KITTENS_FOUND, false)) { return@objectOperate } - if(interact.target.tile !in Areas["kitten_search_area"]) { + if (interact.target.tile !in Areas["kitten_search_area"]) { return@objectOperate } val kittenCoords = get(KITTENS_HIDING_SPOT, -1) var kittenCrate = Tile(kittenCoords) - if(crate.tile == kittenCrate){ - if(player.inventory.isFull()){ + if (crate.tile == kittenCrate) { + if (player.inventory.isFull()) { message("You find three little kittens but you have no space for them in your backpack.") return@objectOperate } @@ -37,4 +37,4 @@ class KittenCrates : Script { } } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt index a9f5084c36..a86bfe002f 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/ThreeLittleKittens.kt @@ -32,4 +32,4 @@ class ThreeLittleKittens : Script { return@itemOption } } -} \ No newline at end of file +} From 7b0b34cb7069d55781c1222305667838bd3ce281 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 14:51:31 -0500 Subject: [PATCH 78/80] Added adventure log and a period after "Gertrude thanks you heartily." --- .../main/kotlin/content/area/misthalin/varrock/Gertrude.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index 8543c3fb95..b590ea7bac 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,5 +1,6 @@ package content.area.misthalin.varrock +import content.entity.player.AdventurersLogs import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Disheartened @@ -56,7 +57,7 @@ class Gertrude : Script { private suspend fun Player.finishQuest() { if (!get("gertrudes_cat_talked_about_reward", false)) { player("Hello, Gertrude. Fluffs had run off with her kittens, lost them and I have now returned them to her.") - statement("Gertrude thanks you heartily") + statement("Gertrude thanks you heartily.") npc("Thank you! If you hadn't found her kittens then they would have died out there. I've got some presents for you in thanks for your help.") player("That's okay, I like to do my bit.") set("gertrudes_cat_talked_about_reward", true) @@ -78,7 +79,7 @@ class Gertrude : Script { suspend fun Player.questComplete() { AuditLog.event(this, "quest_completed", "gertrudes_cat") - // AdventurersLogs.questCompleted(this, "the_restless_ghost", points = 1) // Unknown if needed + AdventurersLogs.questCompleted(this, "gertrudes_cat", points = 1) set(GERTRUDES_CAT_STRING_NAME, "completed") jingle("quest_complete_1") exp(Skill.Cooking, 1525.0) From 236321f60105f60ea9d99d784c8d8674a1838c33 Mon Sep 17 00:00:00 2001 From: potato Date: Thu, 17 Sep 2026 16:01:24 -0500 Subject: [PATCH 79/80] Added dialogue for when you search the crate and find nothing. --- .../quest/member/gertrudes_cat/KittenCrates.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt index d2a98f3f33..2a1226bf08 100644 --- a/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt +++ b/game/src/main/kotlin/content/quest/member/gertrudes_cat/KittenCrates.kt @@ -17,10 +17,13 @@ class KittenCrates : Script { val player = interact.player val crate = interact.target - if (get(KITTENS_FOUND, false)) { + if (interact.target.tile !in Areas["kitten_search_area"]) { return@objectOperate } - if (interact.target.tile !in Areas["kitten_search_area"]) { + if (get(KITTENS_FOUND, false)) { + message("You search the crate.") + pause(1) + message("You find nothing.") return@objectOperate } @@ -34,6 +37,10 @@ class KittenCrates : Script { set(KITTENS_FOUND, true) player.inventory.add("three_little_kittens") statement("You find three little kittens! You carefully place them in your backpack. This explains why Fluffs is so agitated.") + } else { + message("You search the crate.") + pause(1) + message("You find nothing. You can hear kittens mewing close by...") } } } From 1dcfc3840f8dc043a4a863a2d1858ed74309ef24 Mon Sep 17 00:00:00 2001 From: potato Date: Fri, 18 Sep 2026 18:09:36 -0500 Subject: [PATCH 80/80] Added a check to ensure the kitten isn't in the bank before handing the player one. --- .../src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt index b590ea7bac..3027c724f4 100644 --- a/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt +++ b/game/src/main/kotlin/content/area/misthalin/varrock/Gertrude.kt @@ -1,6 +1,7 @@ package content.area.misthalin.varrock import content.entity.player.AdventurersLogs +import content.entity.player.bank.bank import content.entity.player.dialogue.Angry import content.entity.player.dialogue.Confused import content.entity.player.dialogue.Disheartened @@ -147,7 +148,7 @@ class Gertrude : Script { } private suspend fun Player.giveKitten() { - if (inventory.contains("pet_kitten")) { + if (inventory.contains("pet_kitten") || bank.contains("pet_kitten")) { npc("It looks like you've already got a kitten with you. Come back when you'd like another.") return }