From 04d409cad786668b89298489fd774d52f157dd38 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 13 Aug 2026 11:01:33 +0100 Subject: [PATCH 1/3] Clear walk trigger on mime finish to fix #1169 --- .../main/kotlin/content/activity/event/random/RandomEvents.kt | 1 + .../kotlin/content/activity/event/random/mime_theatre/Mime.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/game/src/main/kotlin/content/activity/event/random/RandomEvents.kt b/game/src/main/kotlin/content/activity/event/random/RandomEvents.kt index 5a8dadd910..6cf5266a93 100644 --- a/game/src/main/kotlin/content/activity/event/random/RandomEvents.kt +++ b/game/src/main/kotlin/content/activity/event/random/RandomEvents.kt @@ -176,6 +176,7 @@ object RandomEvents : AutoCloseable { } private fun exit(player: Player): Tile { + player.walkTrigger = null val origin = Tile(player["random_event_origin", player.tile.id]) player.clearInstance() player.clear("random_event") diff --git a/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt b/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt index 372147d292..d4686ba9f8 100644 --- a/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt +++ b/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt @@ -136,6 +136,7 @@ class Mime : Script { for (unlock in MIME_EMOTES) { set("unlocked_emote_$unlock", true) } + walkTrigger = null addOrDrop("random_event_gift") rewardCostumePoint("mime") clear("mime_emote") From 2b25bd616956772f3a91ad2915d821b02ef0c0d0 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 13 Aug 2026 11:10:06 +0100 Subject: [PATCH 2/3] Reset walk trigger on mime start --- .../activity/event/random/RandomEventKidnap.kt | 2 +- .../event/random/kiss_the_frog/KissTheFrog.kt | 6 +++++- .../activity/event/random/mime_theatre/Mime.kt | 13 +++++++++---- game/src/main/kotlin/content/quest/Cutscene.kt | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/game/src/main/kotlin/content/activity/event/random/RandomEventKidnap.kt b/game/src/main/kotlin/content/activity/event/random/RandomEventKidnap.kt index 11dd1b40b6..d65e6581f2 100644 --- a/game/src/main/kotlin/content/activity/event/random/RandomEventKidnap.kt +++ b/game/src/main/kotlin/content/activity/event/random/RandomEventKidnap.kt @@ -90,7 +90,7 @@ suspend fun Player.kidnap(destination: Tile) { */ fun Player.onExitInterrupt(block: suspend Player.() -> Unit) { val event: String = get("random_event") ?: return - walkTrigger = { + walkTrigger { queue("random_event_exit") { if (get("random_event") == event) { block() diff --git a/game/src/main/kotlin/content/activity/event/random/kiss_the_frog/KissTheFrog.kt b/game/src/main/kotlin/content/activity/event/random/kiss_the_frog/KissTheFrog.kt index 6c9e8a2210..f207bb50b1 100644 --- a/game/src/main/kotlin/content/activity/event/random/kiss_the_frog/KissTheFrog.kt +++ b/game/src/main/kotlin/content/activity/event/random/kiss_the_frog/KissTheFrog.kt @@ -193,7 +193,11 @@ class KissTheFrog : Script { // The cave is enclosed, so the player must not be able to strand themselves by walking off. If // they click off the dialogue (which cancels this handler), the walk fires this trigger and they // fade out and teleport home anyway; reading the dialogue through does the same at the end. - walkTrigger = { queue("ktf_escape_cave") { escapeCave() } } + walkTrigger { + queue("ktf_escape_cave") { + escapeCave() + } + } npc("Oh, another poor soul hexed into a frog for their bad manners.") npc("Here, I'll send you on your way. Do be more polite next time.") escapeCave() diff --git a/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt b/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt index d4686ba9f8..d7e45eaff8 100644 --- a/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt +++ b/game/src/main/kotlin/content/activity/event/random/mime_theatre/Mime.kt @@ -50,18 +50,23 @@ class Mime : Script { set("mime_correct", 0) } mysteriousOldMan() + trigger() + kidnap(SPAWN) + // The old man stays behind at the kidnap origin, so he narrates by id rather than talkWith. + npc("mysterious_old_man", "Here's a little challenge for you:
Copy the Mime's performance, then you'll be released.") + start() + } + + private fun Player.trigger() { walkTrigger { strongQueue("start") { start() } } - kidnap(SPAWN) - // The old man stays behind at the kidnap origin, so he narrates by id rather than talkWith. - npc("mysterious_old_man", "Here's a little challenge for you:
Copy the Mime's performance, then you'll be released.") - start() } private suspend fun Player.start() { + trigger() walkOverDelay(WATCH) val mime = NPCs.firstOrNull(MIME_TILE) { it.id == "mime" } ?: NPCs.add("mime", MIME_TILE, ticks = -1, owner = this) runMime(mime) diff --git a/game/src/main/kotlin/content/quest/Cutscene.kt b/game/src/main/kotlin/content/quest/Cutscene.kt index 2fcf6b574e..3a0e81b999 100644 --- a/game/src/main/kotlin/content/quest/Cutscene.kt +++ b/game/src/main/kotlin/content/quest/Cutscene.kt @@ -45,7 +45,7 @@ class Cutscene( } fun onEnd(destroyInstance: Boolean = true, block: suspend () -> Unit) { - player.walkTrigger = { + player.walkTrigger { player.queue.clear("${name}_cutscene_end") player.queue("${name}_cutscene_end") { end(destroyInstance) From ef90035c912cf95ce2b8a05cf3e0551b26756441 Mon Sep 17 00:00:00 2001 From: GregHib Date: Thu, 13 Aug 2026 11:10:36 +0100 Subject: [PATCH 3/3] Clear random event origin with admin command --- .../kotlin/content/activity/event/random/RandomEventTrigger.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/game/src/main/kotlin/content/activity/event/random/RandomEventTrigger.kt b/game/src/main/kotlin/content/activity/event/random/RandomEventTrigger.kt index 1855019656..acec29e3fd 100644 --- a/game/src/main/kotlin/content/activity/event/random/RandomEventTrigger.kt +++ b/game/src/main/kotlin/content/activity/event/random/RandomEventTrigger.kt @@ -49,6 +49,7 @@ class RandomEventTrigger : Script { adminCommand("random_event", stringArg("event", optional = true, autofill = RandomEvents.keys), desc = "Start a random event") { args -> val event = args.getOrNull(0) ?: RandomEvents.pick() + clear("random_event_origin") if (event == null || !RandomEvents.start(this, event)) { message("No random event found${if (args.isEmpty()) "" else " for '${args[0]}'"}.") }