From 19610ebe13597a3e49a0ad27340270710cc3f251 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 14:52:44 +0000 Subject: [PATCH 01/10] Fix light sources --- game/src/main/kotlin/content/skill/firemaking/LightSource.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game/src/main/kotlin/content/skill/firemaking/LightSource.kt b/game/src/main/kotlin/content/skill/firemaking/LightSource.kt index 7a405d7b57..da4ca6b91f 100644 --- a/game/src/main/kotlin/content/skill/firemaking/LightSource.kt +++ b/game/src/main/kotlin/content/skill/firemaking/LightSource.kt @@ -13,6 +13,7 @@ import world.gregs.voidps.engine.inv.replace class LightSource : Script { init { val unlitSources = Tables.get("light_source").rows().joinToString(",") { it.itemId } + itemOnItem("tinderbox*", unlitSources) { _, toItem -> val source = Rows.getOrNull("light_source.${toItem.id}") ?: return@itemOnItem if (!has(Skill.Firemaking, source.int("level"), true)) { @@ -25,7 +26,7 @@ class LightSource : Script { } itemOption("Extinguish") { (item) -> - val extinguished = Tables.itemOrNull("extinguish.${item.id}") ?: return@itemOption + val extinguished = Tables.itemOrNull("extinguish.${item.id}.unlit") ?: return@itemOption if (!inventory.replace(item.id, extinguished)) { return@itemOption } From 842ae60a899debbdf8078bc42402a6c9ba1ff299 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 14:53:04 +0000 Subject: [PATCH 02/10] Add bug lantern light source --- data/skill/firemaking/light_source.tables.toml | 8 ++++++++ .../world/gregs/voidps/engine/data/definition/Tables.kt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/data/skill/firemaking/light_source.tables.toml b/data/skill/firemaking/light_source.tables.toml index bd411f85f4..e530544c65 100644 --- a/data/skill/firemaking/light_source.tables.toml +++ b/data/skill/firemaking/light_source.tables.toml @@ -59,6 +59,11 @@ lit = "lit_torch" level = 1 type = "torch" +[.unlit_bug_lantern] +lit = "lit_bug_lantern" +level = 33 +type = "lantern" + [extinguish] row_id = "item" unlit = "item" @@ -95,3 +100,6 @@ unlit = "sapphire_lantern_oil" [.lit_torch] unlit = "unlit_torch" + +[.lit_bug_lantern] +unlit = "unlit_bug_lantern" diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt index 2f508b779e..f10ee0d662 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt @@ -194,7 +194,7 @@ object Tables { private fun getOrNull(path: String, type: ColumnType): T? { val (table, row, column) = path.split(".") - val id = Rows.ids["${table}.${row}"] ?: error("Row '$row' not found for $path") + val id = Rows.ids["${table}.${row}"] ?: return null return getOrNull(table, column, id, type) } From fa20ea6cc437afc15b79b903750de91735705131 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 14:53:29 +0000 Subject: [PATCH 03/10] Add slayer task skill requirements --- data/skill/slayer/slayer.tables.toml | 6 +++--- game/src/main/kotlin/content/skill/slayer/Slayer.kt | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/data/skill/slayer/slayer.tables.toml b/data/skill/slayer/slayer.tables.toml index 9680f81cc9..daeefc136e 100644 --- a/data/skill/slayer/slayer.tables.toml +++ b/data/skill/slayer/slayer.tables.toml @@ -1,7 +1,6 @@ [slayer_tasks] npc = "npc" combat_level = "int" -defence_level = "int" quest = "string" variable = "string" tip = "string" @@ -92,7 +91,7 @@ combat_level = 15 [.cockatrice] npc = "cockatrice" combat_level = 25 -defence_level = 20 +skill = ["defence", 20] [.cows] npc = "cow_default" @@ -193,6 +192,7 @@ combat_level = 20 [.harpie_bug_swarms] npc = "harpie_bug_swarm" +skill = ["firemaking", 33] [.infernal_mage] npc = "infernal_mage" @@ -361,7 +361,7 @@ combat_level = 20 [.wall_beasts] npc = "wall_beast" combat_level = 30 -defence_level = 5 +skill = ["defence", 5] [.warped_creatures] npc = "warped_terrorbird" diff --git a/game/src/main/kotlin/content/skill/slayer/Slayer.kt b/game/src/main/kotlin/content/skill/slayer/Slayer.kt index b8e37a6c56..1c5bb18f59 100644 --- a/game/src/main/kotlin/content/skill/slayer/Slayer.kt +++ b/game/src/main/kotlin/content/skill/slayer/Slayer.kt @@ -112,6 +112,10 @@ private fun hasRequirements(player: Player, table: TableDefinition, row: Int): B if (player.combatLevel < combatLevel) { return false } + val pair = Tables.skillPairOrNull("slayer_tasks.$category.skill") + if (pair != null && !player.has(pair.first, pair.second)) { + return false + } val variable = Tables.stringOrNull("slayer_tasks.$category.variable") if (variable != null && !player.contains(variable)) { return false From 18f4dd847d1a1237edf8101775e051e1791b6692 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 14:53:40 +0000 Subject: [PATCH 04/10] Add harpie bug swarm tasks --- data/skill/slayer/master/vannaka.tables.toml | 8 ++++---- data/skill/slayer/slayer.items.toml | 3 ++- game/src/main/kotlin/content/entity/combat/Target.kt | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/data/skill/slayer/master/vannaka.tables.toml b/data/skill/slayer/master/vannaka.tables.toml index 1d51b900ef..9a6a3a55d9 100644 --- a/data/skill/slayer/master/vannaka.tables.toml +++ b/data/skill/slayer/master/vannaka.tables.toml @@ -103,10 +103,10 @@ amount = [40, 90] weight = 7 tip = "Hobgoblins are larger and stronger then their brethren. There is a peninsula, south-west of Falador, where these creatures have a hideout." -#[.harpie_bug_swarms] -#amount = [40, 90] -#weight = 8 -#tip = "Harpie Bug Swarms are pesky critters that are hard to hit. You need a lit bug lantern to distract them with its hypnotic light." +[.harpie_bug_swarms] +amount = [40, 90] +weight = 8 +tip = "Harpie Bug Swarms are pesky critters that are hard to hit. You need a lit bug lantern to distract them with its hypnotic light." [.infernal_mage] amount = [40, 90] diff --git a/data/skill/slayer/slayer.items.toml b/data/skill/slayer/slayer.items.toml index 58e7d8ec88..3cb2bc4f2a 100644 --- a/data/skill/slayer/slayer.items.toml +++ b/data/skill/slayer/slayer.items.toml @@ -219,8 +219,9 @@ limit = 100 tradeable = false weight = 2.267 slot = "Shield" -examine = "A lantern to aid attacking Harpie bugs." +aka = ["bug_lantern"] kept = "Reclaim" +examine = "A lantern to aid attacking Harpie bugs." [insulated_boots] id = 7159 diff --git a/game/src/main/kotlin/content/entity/combat/Target.kt b/game/src/main/kotlin/content/entity/combat/Target.kt index 88e3ebc54d..328a61d238 100644 --- a/game/src/main/kotlin/content/entity/combat/Target.kt +++ b/game/src/main/kotlin/content/entity/combat/Target.kt @@ -167,6 +167,7 @@ object Target { Hit.meleeType(type) && !weapon.id.startsWith("leaf_bladed") -> 0 else -> damage } + is NPC if target.id == "harpie_bug_swarm" && source is Player && source.equipped(EquipSlot.Shield).id != "lit_bug_lantern" -> 0 is NPC if target.def.contains("damage_cap") -> damage.coerceAtMost(target.def["damage_cap"]) is NPC if target.def.contains("immune_death") -> damage.coerceAtMost(target.levels.get(Skill.Constitution) - 10) else -> damage From fcf664e6e3eeaa0df7a9fdf286416543c28804a7 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 15:37:04 +0000 Subject: [PATCH 05/10] Add killerwatt plane --- .../area/misthalin/draynor/draynor.teles.toml | 7 ++- .../draynor/manor/draynor_manor.objs.toml | 19 ++++++++ .../killerwatt_plane.anims.toml | 8 ++-- .../killerwatt_plane.combat.toml | 5 +++ ....drop.toml => killerwatt_plane.drops.toml} | 0 .../killerwatt_plane.gfx.toml | 2 + .../killerwatt_plane.npcs.toml | 7 ++- data/entity/obj/door/door.objs.toml | 8 ---- data/entity/obj/door/door.sounds.toml | 3 ++ data/skill/herblore/herblore.anims.toml | 2 +- data/skill/slayer/slayer.tables.toml | 1 + .../draynor_village/manor/DraynorManor.kt | 20 +++++++++ .../draynor_village/manor/Killerwatt.kt | 17 +++++++ .../manor/ProfessorOddenstein.kt | 45 +++++++++++++++++++ .../skill/constitution/drink/Overload.kt | 2 +- 15 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 data/area/misthalin/draynor/manor/draynor_manor.objs.toml rename data/area/realm/killerwatt_plane/{killerwatt_plane.drop.toml => killerwatt_plane.drops.toml} (100%) create mode 100644 data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml create mode 100644 game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt create mode 100644 game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt diff --git a/data/area/misthalin/draynor/draynor.teles.toml b/data/area/misthalin/draynor/draynor.teles.toml index 0f80219fd1..456491209b 100644 --- a/data/area/misthalin/draynor/draynor.teles.toml +++ b/data/area/misthalin/draynor/draynor.teles.toml @@ -64,4 +64,9 @@ delta = { x = -35, y = 6421 } [133] option = "Climb-down" tile = { x = 3092, y = 3362 } -delta = { x = 25, y = 6392 } \ No newline at end of file +delta = { x = 25, y = 6392 } + +[portal_home] +option = "Enter" +tile = { x = 2678, y = 5214, level = 2 } +to = { x = 3110, y = 3363, level = 2 } diff --git a/data/area/misthalin/draynor/manor/draynor_manor.objs.toml b/data/area/misthalin/draynor/manor/draynor_manor.objs.toml new file mode 100644 index 0000000000..34d27657de --- /dev/null +++ b/data/area/misthalin/draynor/manor/draynor_manor.objs.toml @@ -0,0 +1,19 @@ +[draynor_manor_door_sign_closed] +id = 47421 +examine = "A large double door." + +[draynor_manor_door_sign_opened] +id = 47423 +examine = "A large double door." + +[draynor_manor_door_opened] +id = 47425 +examine = "A large double door." + +[draynor_manor_door_closed] +id = 47424 +examine = "A large double door." + +[portal_home] +id = 11356 +examine = "A gateway back to Gielinor." \ No newline at end of file diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml index 1165b00def..c4194ea3a8 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.anims.toml @@ -1,11 +1,11 @@ [killerwatt_death] -id = 3162 +id = 11939 [killerwatt_attack] -id = 3163 +id = 11937 [killerwatt_ranged_attack] -id = 3164 +id = 11936 [killerwatt_defend] -id = 3165 +id = 11938 diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml index e09fb3e28e..8691740760 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.combat.toml @@ -16,10 +16,15 @@ target_hit = { offense = "stab", max = 60 } condition = "insulated" range = 10 anim = "killerwatt_attack" +projectile = "wind_strike" # TODO proper gfx? +impact_gfx = "wind_strike_impact" target_sound = "killerwatt_attack" target_hit = { offense = "range", defence = "magic", max = 80 } [killerwatt.range_uninsulated] condition = "not_insulated" clone = "killerwatt.range" +target_sound = "killerwatt_electrocutes" +target_gfx = "electric_shock" +target_anim = "electric_shock" target_hit = { offense = "range", defence = "magic", max = 150 } diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.drop.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.drops.toml similarity index 100% rename from data/area/realm/killerwatt_plane/killerwatt_plane.drop.toml rename to data/area/realm/killerwatt_plane/killerwatt_plane.drops.toml diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml new file mode 100644 index 0000000000..6e266117b5 --- /dev/null +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.gfx.toml @@ -0,0 +1,2 @@ +[electric_shock] +id = 560 \ No newline at end of file diff --git a/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml b/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml index e12156318c..888654f25f 100644 --- a/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml +++ b/data/area/realm/killerwatt_plane/killerwatt_plane.npcs.toml @@ -6,13 +6,18 @@ str = 50 def = 40 mage = 67 range = 67 -combat_def = "killerwatt" attack_bonus = 30 slayer_xp = 51.0 categories = ["killerwatts"] respawn_delay = 30 examine = "A ball of electrical energy." +[killerwatt_attacking] +id = 3201 +combat_def = "killerwatt" +drop_table = "killerwatt" +examine = "An angry electrical shock!" + [storm_cloud_killerwatt_plane] id = 3203 examine = "A very small storm!" diff --git a/data/entity/obj/door/door.objs.toml b/data/entity/obj/door/door.objs.toml index 59d85f7f7d..630219cf19 100644 --- a/data/entity/obj/door/door.objs.toml +++ b/data/entity/obj/door/door.objs.toml @@ -3834,14 +3834,6 @@ id = 46308 id = 46307 examine = "The entrance to the sawmill training area." -[large_door_118_opened] -id = 47425 -examine = "A large double door." - -[large_door_118_closed] -id = 47424 -examine = "A large double door." - [door_768_opened] id = 47444 examine = "The door is open." diff --git a/data/entity/obj/door/door.sounds.toml b/data/entity/obj/door/door.sounds.toml index fc5fc8083b..b1d06292fc 100644 --- a/data/entity/obj/door/door.sounds.toml +++ b/data/entity/obj/door/door.sounds.toml @@ -13,6 +13,9 @@ id = 71 [irondoor_locked] id = 72 +[big_door_close] +id = 45 + [gate_close] id = 66 diff --git a/data/skill/herblore/herblore.anims.toml b/data/skill/herblore/herblore.anims.toml index 57c91da7d0..93cca66282 100644 --- a/data/skill/herblore/herblore.anims.toml +++ b/data/skill/herblore/herblore.anims.toml @@ -1,4 +1,4 @@ -[overload] +[electric_shock] id = 3170 [mixing_potion] diff --git a/data/skill/slayer/slayer.tables.toml b/data/skill/slayer/slayer.tables.toml index daeefc136e..c20a23a87f 100644 --- a/data/skill/slayer/slayer.tables.toml +++ b/data/skill/slayer/slayer.tables.toml @@ -1,6 +1,7 @@ [slayer_tasks] npc = "npc" combat_level = "int" +skill = "pair" quest = "string" variable = "string" tip = "string" diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt new file mode 100644 index 0000000000..9fb9720d98 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/DraynorManor.kt @@ -0,0 +1,20 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.obj.door.enterDoor +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.sound + +class DraynorManor : Script { + init { + objectOperate("Open", "draynor_manor_door_sign_closed,draynor_manor_door_closed") { (target) -> + if (tile.y >= 3354) { + message("The doors won't open.") + return@objectOperate + } + enterDoor(target) + message("The doors slam shut behind you.") + sound("big_door_close") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt new file mode 100644 index 0000000000..dfc5574e99 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/Killerwatt.kt @@ -0,0 +1,17 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.effect.transform +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.areaSound + +class Killerwatt : Script { + init { + npcCombatDamage("killerwatt") { (source) -> + if (transform != "") { + return@npcCombatDamage + } + areaSound("killerwatt_transforms", tile, radius = 5) + transform("killerwatt_attacking") + } + } +} diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt new file mode 100644 index 0000000000..aaaf8a4fe2 --- /dev/null +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt @@ -0,0 +1,45 @@ +package content.area.misthalin.draynor_village.manor + +import content.entity.player.dialogue.Confused +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.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.move.tele + +class ProfessorOddenstein : Script { + init { + npcOperate("Talk-to", "professor_oddenstein") { (target) -> + if (!questCompleted("ernest_the_chicken")) { + // TODO quest + return@npcOperate + } + // TODO on enter portal without boots + npc("Errr, just before you go through there...") + player("What's the problem?") + npc("That portal opens into a plane populated with some very shocking creatures. You should wear some kind of insulated armour before going there.") + choice { + option("Where can I get insulated armour from?") { + npc("Well there were some pretty tough people here last week. Said they were Slayer Masters. They were planning on making some protective boots. You should speak to one of them.") + choice { + option("Thanks, I'll do that.") { + npc("No problem. See you later.") + } + option("I don't want to run around after Slayer Masters, I'm going through.") { + tele(2677, 5214, 2) + } + } + } + option("Thanks, I think I'll stay here for a while then.") + option("Thanks for the warning, but I'm not scared of any monster.") { + player("Thanks for the warning, but I'm not scared of any monster.") + npc("Ok. Just don't say I didn't warn you") + tele(2677, 5214, 2) + } + } + } + } +} diff --git a/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt b/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt index e72625307a..1e896b4585 100644 --- a/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt +++ b/game/src/main/kotlin/content/skill/constitution/drink/Overload.kt @@ -71,7 +71,7 @@ class Overload : Script { repeat(5) { player.directHit(100) player.anim("overload") - player.gfx("overload") + player.gfx("electric_shock") pause(2) } } From 7603d2f8e8bc0301ed2fb8a589344dafcc0ad0f9 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 16:04:58 +0000 Subject: [PATCH 06/10] Fix leech anims --- data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml b/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml index 7b7c890cd5..babe13b2b1 100644 --- a/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml +++ b/data/area/wilderness/chaos_tunnels/chaos_tunnels.anims.toml @@ -8,13 +8,13 @@ id = 1557 id = 1558 [leech_attack] -id = 2070 +id = 1273 [leech_defend] -id = 2072 +id = 1271 [leech_death] -id = 2073 +id = 1272 [giant_crypt_rat_attack] id = 4933 From 7925596c93abd309d1041f679a65b8f955f7e213 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 16:05:14 +0000 Subject: [PATCH 07/10] Add vampyres --- .../mort_myre_swamp/mort_myre_swamp.npcs.toml | 10 ++++++ .../npc/monster/vampyre/vampyre.anims.toml | 7 ++-- .../npc/monster/vampyre/vampyre.combat.toml | 25 +++++++++++-- .../npc/monster/vampyre/vampyre.sounds.toml | 3 ++ data/skill/slayer/master/chaeldar.tables.toml | 8 ++--- data/skill/slayer/master/mazchna.tables.toml | 16 ++++----- data/skill/slayer/master/vannaka.tables.toml | 8 ++--- .../morytania/mort_myre_swamp/FeralVampyre.kt | 35 +++++++++++++++++++ 8 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt diff --git a/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml b/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml index 1b5ad3d719..ab9531ee74 100644 --- a/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml +++ b/data/area/morytania/mort_myre_swamp/mort_myre_swamp.npcs.toml @@ -165,5 +165,15 @@ id = 1568 [vampire] id = 1223 +hitpoints = 400 +att = 55 +str = 60 +def = 55 +magic = 40 +range = 1 +slayer_xp = 40.0 +combat_def = "vampyre" +drop_table = "vampyre" +categories = ["vampyres"] examine = "A feral vampyre. It looks really hungry!" diff --git a/data/entity/npc/monster/vampyre/vampyre.anims.toml b/data/entity/npc/monster/vampyre/vampyre.anims.toml index 2246dc260d..a857362a7e 100644 --- a/data/entity/npc/monster/vampyre/vampyre.anims.toml +++ b/data/entity/npc/monster/vampyre/vampyre.anims.toml @@ -1,8 +1,11 @@ -[vampyre_god_wars_attack] +[vampyre_attack] id = 1264 +[vampyre_bite] +id = 1263 + [vampyre_god_wars_defend] id = 403 -[vampyre_god_wars_death] +[vampyre_death] id = 836 \ No newline at end of file diff --git a/data/entity/npc/monster/vampyre/vampyre.combat.toml b/data/entity/npc/monster/vampyre/vampyre.combat.toml index 5976d2bf13..2a481ca395 100644 --- a/data/entity/npc/monster/vampyre/vampyre.combat.toml +++ b/data/entity/npc/monster/vampyre/vampyre.combat.toml @@ -3,12 +3,33 @@ attack_speed = 4 retreat_range = 8 defend_anim = "vampyre_god_wars_defend" defend_sound = "vampyre_defend" -death_anim = "vampyre_god_wars_death" +death_anim = "vampyre_death" death_sound = "vampyre_death" [vampyre_god_wars.melee] range = 1 -anim = "vampyre_god_wars_attack" +anim = "vampyre_attack" target_sound = "vampyre_attack" target_hit = { offense = "slash", max = 80 } +[vampyre] +attack_speed = 4 +retreat_range = 8 +defend_anim = "vampyre_defend" +defend_sound = "vampyre_defend" +death_anim = "vampyre_death" +death_sound = "vampyre_death" + +[vampyre.melee] +chance = 10 +range = 1 +anim = "vampyre_attack" +target_sound = "vampyre_attack" +target_hit = { offense = "stab", max = 70 } + +[vampyre.bite] +range = 1 +anim = "vampyre_bite" +target_sound = "vampyre_suck" +target_hit = { offense = "stab", max = 70 } + diff --git a/data/entity/npc/monster/vampyre/vampyre.sounds.toml b/data/entity/npc/monster/vampyre/vampyre.sounds.toml index 52c7353e93..9aefdaceac 100644 --- a/data/entity/npc/monster/vampyre/vampyre.sounds.toml +++ b/data/entity/npc/monster/vampyre/vampyre.sounds.toml @@ -4,5 +4,8 @@ id = 879 [vampyre_defend] id = 884 +[vampyre_suck] +id = 886 + [vampyre_death] id = 882 \ No newline at end of file diff --git a/data/skill/slayer/master/chaeldar.tables.toml b/data/skill/slayer/master/chaeldar.tables.toml index 9984133f69..e98139d93b 100644 --- a/data/skill/slayer/master/chaeldar.tables.toml +++ b/data/skill/slayer/master/chaeldar.tables.toml @@ -163,10 +163,10 @@ amount = [90, 150] weight = 8 tip = "Tzhaar reside in their cave under the Karamja volcano. Beware as they can call to their fellows for aid." -#[.vampyres] -#amount = [80, 100] -#weight = 6 -#tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." +[.vampyres] +amount = [80, 100] +weight = 6 +tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." #[.warped_creatures] #amount = [70, 130] diff --git a/data/skill/slayer/master/mazchna.tables.toml b/data/skill/slayer/master/mazchna.tables.toml index cbd09d9e19..84ace77aed 100644 --- a/data/skill/slayer/master/mazchna.tables.toml +++ b/data/skill/slayer/master/mazchna.tables.toml @@ -93,10 +93,10 @@ amount = [30, 50] weight = 6 tip = "Kalphite are large insects which live in great hives under the desert sands." -#[.killerwatts] -#amount = [30, 50] -#weight = 6 -#tip = "Killerwatts store huge amounts of energy in their bodies, which is released if they are touched. You'll need to wear heavily insulated boots to counter this shocking effect, plus they can attack speedily with both magic and missiles. To access their cloudy plane, you'll need to explore Draynor Manor." +[.killerwatts] +amount = [30, 50] +weight = 6 +tip = "Killerwatts store huge amounts of energy in their bodies, which is released if they are touched. You'll need to wear heavily insulated boots to counter this shocking effect, plus they can attack speedily with both magic and missiles. To access their cloudy plane, you'll need to explore Draynor Manor." [.lizards] amount = [30, 50] @@ -133,10 +133,10 @@ amount = [30, 50] weight = 7 tip = "Skeletons are undead so magic is your best bet against them, there is even a spell specially for fighting the undead." -#[.vampyres] -#amount = [10, 20] -#weight = 6 -#tip = "Vampyres are extremely powerful beings. They feed on the blood of the living, so watch that you don't get bitten. Look in the woods of Morytania." +[.vampyres] +amount = [10, 20] +weight = 6 +tip = "Vampyres are extremely powerful beings. They feed on the blood of the living, so watch that you don't get bitten. Look in the woods of Morytania." [.wolves] amount = [30, 50] diff --git a/data/skill/slayer/master/vannaka.tables.toml b/data/skill/slayer/master/vannaka.tables.toml index 9a6a3a55d9..844f7cde52 100644 --- a/data/skill/slayer/master/vannaka.tables.toml +++ b/data/skill/slayer/master/vannaka.tables.toml @@ -208,10 +208,10 @@ amount = [40, 90] weight = 7 tip = "Trolls regenerate damage quickly and have some level of magical defences, but this is easily bypassed by their weakness to fire." -#[.vampyres] -#amount = [10, 20] -#weight = 7 -#tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." +[.vampyres] +amount = [10, 20] +weight = 7 +tip = "Vampyres are extremely powerful beings. An underground group known as the Myreque have been searching for tools to defeat them, which they may be willing to share if you can find them." [.werewolves] amount = [30, 60] diff --git a/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt new file mode 100644 index 0000000000..16d4a2e435 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt @@ -0,0 +1,35 @@ +package content.area.morytania.mort_myre_swamp + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.message +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.equip.equipped +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot +import world.gregs.voidps.type.random + +class FeralVampyre : Script { + init { + npcAttack("vampyre", "bite") { target -> + levels.restore(Skill.Constitution, 10) // TODO unknown how much exactly, drains? + if (target !is Player) { + return@npcAttack + } + if (target.equipped(EquipSlot.Amulet).id != "holy_symbol") { + return@npcAttack + } + if (levels.getOffset(Skill.Attack) != 0) { + return@npcAttack + } + if (random.nextInt(20) != 0) { + return@npcAttack + } + levels.drain(Skill.Attack, multiplier = 0.25) + levels.drain(Skill.Strength, multiplier = 0.25) + levels.drain(Skill.Defence, multiplier = 0.25) + levels.drain(Skill.Magic, multiplier = 0.25) + target.message("The vampyre is weakened by your holy symbol of Saradomin.") + } + + } +} From ac26acecbe36f7ec4781876542fb93395b8325c2 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 16:06:35 +0000 Subject: [PATCH 08/10] Add vampyres --- data/entity/npc/monster/vampyre/vampyre.combat.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/entity/npc/monster/vampyre/vampyre.combat.toml b/data/entity/npc/monster/vampyre/vampyre.combat.toml index 2a481ca395..0b53119cfe 100644 --- a/data/entity/npc/monster/vampyre/vampyre.combat.toml +++ b/data/entity/npc/monster/vampyre/vampyre.combat.toml @@ -16,8 +16,8 @@ target_hit = { offense = "slash", max = 80 } attack_speed = 4 retreat_range = 8 defend_anim = "vampyre_defend" -defend_sound = "vampyre_defend" -death_anim = "vampyre_death" +defend_sound = "human_defend" +death_anim = "human_death" death_sound = "vampyre_death" [vampyre.melee] From f27c9c98b8c0bfad472ac784c500b8383da7cb20 Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 17:13:57 +0000 Subject: [PATCH 09/10] Add braindeath island and fever spiders --- .../kalphite_hive/kalphite.combat.toml | 6 +- .../kalphite_hive/kalphite.sounds.toml | 6 +- .../braindeath_island.anims.toml | 17 +++ .../braindeath_island.combat.toml | 36 ++++++ .../braindeath_island.npcs.toml | 14 ++- .../braindeath_island.objs.toml | 11 ++ .../braindeath_island.sounds.toml | 8 ++ .../braindeath_island.teles.toml | 69 ++++++++++ .../port_phasmatys/port_phasmatys.combat.toml | 13 ++ .../port_phasmatys.npc-spawns.toml | 18 +-- .../port_phasmatys/port_phasmatys.npcs.toml | 7 +- .../port_phasmatys/port_phasmatys.sounds.toml | 2 + data/skill/slayer/master/chaeldar.tables.toml | 8 +- data/skill/slayer/master/vannaka.tables.toml | 8 +- data/skill/slayer/slayer.tables.toml | 1 + .../engine/data/config/CombatDefinition.kt | 1 + .../data/definition/CombatDefinitions.kt | 3 + .../manor/ProfessorOddenstein.kt | 10 ++ .../morytania/braindeath_island/Brewer.kt | 113 +++++++++++++++++ .../braindeath_island/CaptainDonnie.kt | 30 +++++ .../braindeath_island/FeverSpider.kt | 32 +++++ .../braindeath_island/ZombieProtester.kt | 59 +++++++++ .../morytania/port_phasmatys/PiratePete.kt | 118 ++++++++++++++++++ .../morytania/port_phasmatys/TorturedSoul.kt | 16 +++ .../content/entity/npc/combat/Attack.kt | 4 + 25 files changed, 579 insertions(+), 31 deletions(-) create mode 100644 data/area/morytania/braindeath_island/braindeath_island.anims.toml create mode 100644 data/area/morytania/braindeath_island/braindeath_island.combat.toml create mode 100644 data/area/morytania/braindeath_island/braindeath_island.objs.toml create mode 100644 data/area/morytania/braindeath_island/braindeath_island.sounds.toml create mode 100644 data/area/morytania/braindeath_island/braindeath_island.teles.toml create mode 100644 data/area/morytania/port_phasmatys/port_phasmatys.combat.toml create mode 100644 data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml create mode 100644 game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt create mode 100644 game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt create mode 100644 game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt create mode 100644 game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt create mode 100644 game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt create mode 100644 game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt diff --git a/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml b/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml index a60f4c1507..b32c91e8de 100644 --- a/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml +++ b/data/area/kharidian_desert/kalphite_hive/kalphite.combat.toml @@ -2,14 +2,14 @@ attack_speed = 4 retreat_range = 8 defend_anim = "kalphite_defend" -defend_sound = "kalphite_defend" +defend_sound = "insect_defend" death_anim = "kalphite_death" -death_sound = "kalphite_death" +death_sound = "insect_death" [kalphite_worker.melee] range = 1 anim = "kalphite_attack" -target_sound = "kalphite_attack" +target_sound = "insect_attack" target_hit = { offense = "crush", max = 30 } [kalphite_guardian] diff --git a/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml b/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml index fc8c63422c..e3a2a83147 100644 --- a/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml +++ b/data/area/kharidian_desert/kalphite_hive/kalphite.sounds.toml @@ -1,10 +1,10 @@ -[kalphite_attack] +[insect_attack] id = 537 -[kalphite_death] +[insect_death] id = 538 -[kalphite_defend] +[insect_defend] id = 539 [kalphite_queen_attack] diff --git a/data/area/morytania/braindeath_island/braindeath_island.anims.toml b/data/area/morytania/braindeath_island/braindeath_island.anims.toml new file mode 100644 index 0000000000..2a619f7fdb --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.anims.toml @@ -0,0 +1,17 @@ +[spider_large_defend] +id = 5320 + +[spider_large_attack] +id = 5319 + +[spider_large_death] +id = 5321 + +[zombie_pirate_defend] +id = 5653 + +[zombie_pirate_attack] +id = 5651 + +[zombie_pirate_death] +id = 5654 \ No newline at end of file diff --git a/data/area/morytania/braindeath_island/braindeath_island.combat.toml b/data/area/morytania/braindeath_island/braindeath_island.combat.toml new file mode 100644 index 0000000000..0d4afb1a3b --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.combat.toml @@ -0,0 +1,36 @@ +[fever_spider] +attack_speed = 4 +retreat_range = 8 +defend_anim = "spider_large_defend" +defend_sound = "insect_defend" +death_anim = "spider_large_death" +death_sound = "insect_death" + +[fever_spider.melee] +condition = "slayer_gloves" +range = 1 +anim = "spider_large_attack" +target_sound = "insect_attack" +target_hit = { offense = "stab", max = 70 } + +[fever_spider.disease] +condition = "no_slayer_gloves" +range = 1 +anim = "spider_large_attack" +target_sound = "insect_attack" +impact_regardless = true +impact_disease = 80 + +[zombie_pirate] +attack_speed = 4 +retreat_range = 8 +defend_anim = "zombie_pirate_defend" +defend_sound = "zombie_pirate_defend" +death_anim = "zombie_pirate_death" +death_sound = "zombie_pirate_death" + +[zombie_pirate.melee] +range = 1 +anim = "zombie_pirate_attack" +target_sound = "zombie_pirate_attack" +target_hit = { offense = "crush", max = 60 } diff --git a/data/area/morytania/braindeath_island/braindeath_island.npcs.toml b/data/area/morytania/braindeath_island/braindeath_island.npcs.toml index e14d5ac58d..ffc974d9eb 100644 --- a/data/area/morytania/braindeath_island/braindeath_island.npcs.toml +++ b/data/area/morytania/braindeath_island/braindeath_island.npcs.toml @@ -17,21 +17,27 @@ id = 2830 [zombie_protester] id = 2831 +hunt_mode = "spotted" [zombie_protester_2] id = 2832 +hunt_mode = "spotted" [zombie_protester_3] id = 2833 +hunt_mode = "spotted" [zombie_protester_4] id = 2834 +hunt_mode = "spotted" [zombie_protester_5] id = 2835 +hunt_mode = "spotted" [zombie_protester_6] id = 2836 +hunt_mode = "spotted" [zombie_pirate] id = 2837 @@ -39,12 +45,12 @@ hitpoints = 520 att = 49 str = 50 def = 50 -style = "crush" -max_hit_melee = 60 +combat_def = "zombie_pirate" hunt_mode = "cowardly" slayer_xp = 52.0 categories = ["zombies"] respawn_delay = 50 +drop_table = "pirate" examine = "An undead sea scoundrel." [zombie_pirate_2] @@ -73,11 +79,11 @@ hitpoints = 500 att = 45 str = 50 def = 50 -style = "crush" -max_hit_melee = 60 +combat_def = "zombie_pirate" slayer_xp = 50.0 categories = ["zombies"] respawn_delay = 37 +drop_table = "pirate" examine = "He talks a good fight." [zombie_swab_2] diff --git a/data/area/morytania/braindeath_island/braindeath_island.objs.toml b/data/area/morytania/braindeath_island/braindeath_island.objs.toml new file mode 100644 index 0000000000..9bc261c723 --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.objs.toml @@ -0,0 +1,11 @@ +[braindeath_island_wooden_stair_down] +id = 10137 + +[braindeath_island_wooden_stair_up] +id = 10136 + +[braindeath_island_ladder_up] +id = 10167 + +[braindeath_island_ladder_down] +id = 10168 diff --git a/data/area/morytania/braindeath_island/braindeath_island.sounds.toml b/data/area/morytania/braindeath_island/braindeath_island.sounds.toml new file mode 100644 index 0000000000..0ea7fe50cc --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.sounds.toml @@ -0,0 +1,8 @@ +[zombie_pirate_defend] +id = 926 + +[zombie_pirate_attack] +id = 924 + +[zombie_pirate_death] +id = 925 diff --git a/data/area/morytania/braindeath_island/braindeath_island.teles.toml b/data/area/morytania/braindeath_island/braindeath_island.teles.toml new file mode 100644 index 0000000000..04ce8e4018 --- /dev/null +++ b/data/area/morytania/braindeath_island/braindeath_island.teles.toml @@ -0,0 +1,69 @@ +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2152, y = 5109, level = 1 } +to = { x = 2150, y = 5109 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2151, y = 5109 } +to = { x = 2153, y = 5108, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2163, y = 5088, level = 1 } +to = { x = 2166, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2163, y = 5088 } +to = { x = 2163, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2149, y = 5088, level = 1 } +to = { x = 2152, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2149, y = 5088 } +to = { x = 2149, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2137, y = 5088, level = 1 } +to = { x = 2140, y = 5088 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2137, y = 5088 } +to = { x = 2137, y = 5089, level = 1 } + +[braindeath_island_wooden_stair_down] +option = "Climb-down" +tile = { x = 2129, y = 5095, level = 1 } +to = { x = 2129, y = 5093 } + +[braindeath_island_wooden_stair_up] +option = "Climb-up" +tile = { x = 2129, y = 5094 } +to = { x = 2130, y = 5096, level = 1 } + +[braindeath_island_ladder_up] +option = "Climb-up" +tile = { x = 2163, y = 5092, level = 1 } +to = { x = 2162, y = 5092, level = 2 } + +[braindeath_island_ladder_down] +option = "Climb-down" +tile = { x = 2163, y = 5092, level = 2 } +to = { x = 2162, y = 5092, level = 1 } + +[braindeath_island_ladder_up] +option = "Climb-up" +tile = { x = 2139, y = 5105 } +to = { x = 2138, y = 5105, level = 1 } + +[braindeath_island_ladder_down] +option = "Climb-down" +tile = { x = 2139, y = 5105, level = 1 } +to = { x = 2138, y = 5105 } diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml b/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml new file mode 100644 index 0000000000..8dec1ceb9d --- /dev/null +++ b/data/area/morytania/port_phasmatys/port_phasmatys.combat.toml @@ -0,0 +1,13 @@ +[tortured_soul] +attack_speed = 4 +retreat_range = 8 +defend_anim = "human_defend" +defend_sound = "ghost_defend" +death_anim = "human_death" +death_sound = "ghost_death" + +[tortured_soul.melee] +range = 1 +anim = "unarmed_punch" +target_sound = "ghost_attack2" +target_hit = { offense = "crush", max = 70 } diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml index 0872586efe..cdb40517d3 100644 --- a/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml +++ b/data/area/morytania/port_phasmatys/port_phasmatys.npc-spawns.toml @@ -24,14 +24,14 @@ spawns = [ { id = "ghost_villager_port_phasmatys", x = 3675, y = 3496, members = true }, { id = "ghost_villager_port_phasmatys", x = 3679, y = 3474, members = true }, { id = "ghost_villager_port_phasmatys", x = 3684, y = 3485, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3648, y = 3472, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3649, y = 3503, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3654, y = 3536, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3657, y = 3534, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3666, y = 3529, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3668, y = 3537, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3672, y = 3520, members = true }, - { id = "tortured_soul_port_phasmatys", x = 3673, y = 3528, members = true }, + { id = "tortured_soul", x = 3648, y = 3472, members = true }, + { id = "tortured_soul", x = 3649, y = 3503, members = true }, + { id = "tortured_soul", x = 3654, y = 3536, members = true }, + { id = "tortured_soul", x = 3657, y = 3534, members = true }, + { id = "tortured_soul", x = 3666, y = 3529, members = true }, + { id = "tortured_soul", x = 3668, y = 3537, members = true }, + { id = "tortured_soul", x = 3672, y = 3520, members = true }, + { id = "tortured_soul", x = 3673, y = 3528, members = true }, { id = "ghost_shopkeeper_port_phasmatys", x = 3658, y = 3477, members = true }, { id = "ghost_innkeeper_port_phasmatys", x = 3681, y = 3496, members = true }, { id = "ghost_banker_port_phasmatys", x = 3687, y = 3464 }, @@ -52,7 +52,7 @@ spawns = [ { id = "ghost_guard_port_phasmatys", x = 3652, y = 3487, direction = "WEST", members = true }, { id = "ghost_guard_port_phasmatys", x = 3658, y = 3508, direction = "NORTH", members = true }, { id = "ghost_guard_port_phasmatys", x = 3661, y = 3508, direction = "NORTH", members = true }, - { id = "pirate_pete_port_phasmatys", x = 3680, y = 3537, members = true }, + { id = "pirate_pete", x = 3680, y = 3537, members = true }, { id = "melina_port_phasmatys", x = 3674, y = 3484, members = true }, { id = "droalak_port_phasmatys", x = 3657, y = 3469, members = true }, { id = "bill_teach_port_phasmatys", x = 3713, y = 3497, level = 1, members = true }, diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml b/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml index 949817071d..f41322d5f5 100644 --- a/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml +++ b/data/area/morytania/port_phasmatys/port_phasmatys.npcs.toml @@ -26,14 +26,13 @@ examine = "A master bowman." id = 1697 examine = "A spooky ghost villager." -[tortured_soul_port_phasmatys] +[tortured_soul] id = 1698 hitpoints = 510 att = 52 str = 62 def = 38 -style = "crush" -max_hit_melee = 70 +combat_def = "tortured_soul" slayer_xp = 51.0 categories = ["ghosts"] respawn_delay = 50 @@ -68,7 +67,7 @@ id = 1705 id = 1706 examine = "This ghost guards the gates of Port Phasmatys." -[pirate_pete_port_phasmatys] +[pirate_pete] id = 2825 examine = "A shifty-looking character." diff --git a/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml b/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml new file mode 100644 index 0000000000..6433b1ef6c --- /dev/null +++ b/data/area/morytania/port_phasmatys/port_phasmatys.sounds.toml @@ -0,0 +1,2 @@ +[cudgel] +id = 1842 \ No newline at end of file diff --git a/data/skill/slayer/master/chaeldar.tables.toml b/data/skill/slayer/master/chaeldar.tables.toml index e98139d93b..a51442cf73 100644 --- a/data/skill/slayer/master/chaeldar.tables.toml +++ b/data/skill/slayer/master/chaeldar.tables.toml @@ -73,10 +73,10 @@ amount = [70, 130] weight = 12 tip = "Like other giants, Fire giants often wield large weapons. Learn to recognise what kind of weapon it is and act accordingly. The smoke dungeon to the west of Pollnivneach has a population of these large and irritating creatures, so go smite them." -#[.fever_spiders] -#amount = [70, 130] -#weight = 7 -#tip = "Fever spiders are giant spiders that carry the deadly spider fever. If you don't want to catch it, I suggest you wear Slayer gloves to fight them. I've heard they cause problems in breweries, if you want to find some." +[.fever_spiders] +amount = [70, 130] +weight = 7 +tip = "Fever spiders are giant spiders that carry the deadly spider fever. If you don't want to catch it, I suggest you wear Slayer gloves to fight them. I've heard they cause problems in breweries, if you want to find some." [.gargoyles] amount = [70, 130] diff --git a/data/skill/slayer/master/vannaka.tables.toml b/data/skill/slayer/master/vannaka.tables.toml index 844f7cde52..572eebfffb 100644 --- a/data/skill/slayer/master/vannaka.tables.toml +++ b/data/skill/slayer/master/vannaka.tables.toml @@ -73,10 +73,10 @@ amount = [40, 90] weight = 7 tip = "Like other giants, Fire Giants have little to no magical ability, and they're particularly weak to water spells." -#[.fever_spiders] -#amount = [30, 90] -#weight = 7 -#tip = "Fever Spiders are giant spiders that carry the deadly Spider Fever. If you don't want to catch it I suggest you wear Slayer Gloves to fight them." +[.fever_spiders] +amount = [30, 90] +weight = 7 +tip = "Fever Spiders are giant spiders that carry the deadly Spider Fever. If you don't want to catch it I suggest you wear Slayer Gloves to fight them." [.gargoyles] amount = [40, 90] diff --git a/data/skill/slayer/slayer.tables.toml b/data/skill/slayer/slayer.tables.toml index c20a23a87f..5ec893f803 100644 --- a/data/skill/slayer/slayer.tables.toml +++ b/data/skill/slayer/slayer.tables.toml @@ -151,6 +151,7 @@ combat_level = 15 [.fever_spiders] npc = "fever_spider" +quest = "rum_deal" [.frost_dragons] npc = "frost_dragon" diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt index 6e81a209e0..e79d387941 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/config/CombatDefinition.kt @@ -101,6 +101,7 @@ data class CombatDefinition( val impactDrainSkills: List = emptyList(), val impactFreeze: Int = 0, val impactPoison: Int = 0, + val impactDisease: Int = 0, val impactMessage: String = "", ) { companion object { diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt index e5e7f96bd3..917529fa86 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/CombatDefinitions.kt @@ -119,6 +119,7 @@ class CombatDefinitions { var impactRegardless = false var freeze = 0 var poison = 0 + var disease = 0 var message = "" val definition = definitions.getOrPut(stringId) { CombatDefinition(npc = stringId) } val attacks = definition.attacks as MutableMap @@ -173,6 +174,7 @@ class CombatDefinitions { "impact_regardless" -> impactRegardless = boolean() "impact_freeze" -> freeze = int() "impact_poison" -> poison = int() + "impact_disease" -> disease = int() "impact_message" -> message = string() "miss_gfx" -> graphic(missGraphics) "miss_gfxs" -> graphics(missGraphics) @@ -212,6 +214,7 @@ class CombatDefinitions { impactDrainSkills = drainSkills, impactFreeze = freeze, impactPoison = poison, + impactDisease = disease, impactMessage = message, ) } diff --git a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt index aaaf8a4fe2..fa73b9ea12 100644 --- a/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt +++ b/game/src/main/kotlin/content/area/misthalin/draynor_village/manor/ProfessorOddenstein.kt @@ -15,6 +15,16 @@ class ProfessorOddenstein : Script { npcOperate("Talk-to", "professor_oddenstein") { (target) -> if (!questCompleted("ernest_the_chicken")) { // TODO quest + npc("Be careful in here, there's lots of dangerous equipment.") + choice { + option("What does this machine do?") { + npc("Nothing at the moment... It's broken. It's meant to be a transmutation machine.") + npc("It has also spent time as a time travel machine, and a dramatic lightning generator, and a thing for generating monsters.") + } + option("Is this your house?") { + npc("No, I'm just one of the tenants. It belongs to the count who lives in the basement.") + } + } return@npcOperate } // TODO on enter portal without boots diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt new file mode 100644 index 0000000000..c9e15b195a --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt @@ -0,0 +1,113 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.Despawn.Companion.player + +class Brewer : Script { + init { + npcOperate("Talk-to", "brewer") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("I don't know what your game is, but I know you're one of THEM!") + player("But I just saved you!") + npc("The voices tell me different. It's all part of a plot! Confess!") + } + + npcOperate("Talk-to", "brewer_2") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Have they gone yet?") + player("Well, no, but they are a lot calmer now.") + npc("What are we gonna do now, huh? What are we gunna do now?") + player("In your case I would say relax.") + } + + npcOperate("Talk-to", "brewer_3") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello yourself!") + player("How's things?") + npc("Fine...") + player("Excellent! Since I get the feeling I don't want to know why you said that so oddly I'll just go over here!") + npc("I think that would be for the best!") + } + + npcOperate("Talk-to", "brewer_4") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello yerself Landlubber!") + player("Everything ok with you now?") + npc("Hmmm...Overall everything is good!") + player("Great!") + } + + npcOperate("Talk-to", "brewer_5") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Hello there, brave hero, in whom I had total confidence!") + player("Total confidence?") + npc("Yes! I was so confident that I would never, ever have sold your soft, edible body to the pirates outside!") + player("Well, great...") + npc("On a completely unrelated note, I would steer clear of Hungry Frank for a while.") + npc("He's a filthy liar. And a forger. It wouldn't surprise me if he has written out a note detailing the terms of our surrender and your dismemberment and cooking in MY handwriting.") + npc("Imagine that, the fiend.") + } + + npcOperate("Talk-to", "brewer_6") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("So...got any sleep yet?") + npc("My brain is no longer capable of sleep.") + player("So...what are you going to do now?") + npc("I was gonna try and will myself dead.") + player("Right...good luck with that.") + } + + npcOperate("Talk-to", "brewer_7") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("Well you proved that you're probably not a zombie.") + npc("So what are you then? A ghoul? A vampyre?") + player("I'm not any form of undead!") + npc("Oh...oh god I'm sorry, I didn't realise it was natural...") + player("What?") + npc("Nothing...") + } + + npcOperate("Talk-to", "brewer_8") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + player("Hello there!") + npc("You saved us! Huzzah!") + player("All in a day's work, think nothing of it.") + npc("I don't have anything to reward you with except my collection of bleak, gothic poetry I wrote when I assumed we were all done for. Do you want it?") + player("I may come for it later, you hang on to it for now.") + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt new file mode 100644 index 0000000000..bb6c16f04d --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt @@ -0,0 +1,30 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script + +class CaptainDonnie : Script { + init { + npcOperate("Talk-to", "captain_donnie") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + npc("Hey! You!") + player("Who? Me?") + npc("Aye! Ye!") + npc("Got any more rum?") + player("What happens if I don't?") + npc("Then I'll clap ye in Runes!") + player("Don't you mean clap me in irons?") + npc("No lad, not irons, Runes!") + npc("We upgraded last week.") + player("Ok, well it's a good job that I have some over here isn't it?") + npc("Arr, yer a good lad...") + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt new file mode 100644 index 0000000000..2a85554008 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt @@ -0,0 +1,32 @@ +package content.area.morytania.braindeath_island + +import content.entity.combat.hit.damage +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Laugh +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Scared +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.Shock +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.Despawn.Companion.player +import world.gregs.voidps.engine.entity.character.player.Player +import world.gregs.voidps.engine.entity.character.player.equip.equipped +import world.gregs.voidps.engine.entity.character.player.skill.Skill +import world.gregs.voidps.network.login.protocol.visual.update.player.EquipSlot + +class FeverSpider : Script { + init { + npcCondition("slayer_gloves") { it is Player && it.equipped(EquipSlot.Hands).id == "slayer_gloves" } + npcCondition("no_slayer_gloves") { it is Player && it.equipped(EquipSlot.Hands).id != "slayer_gloves" } + npcAttack("fever_spider", "disease") { + val damage = (it.levels.get(Skill.Constitution) / 100.0) * 12.5 + it.damage(damage.toInt()) + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt new file mode 100644 index 0000000000..de00643da9 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt @@ -0,0 +1,59 @@ +package content.area.morytania.braindeath_island + +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Shifty +import content.entity.player.dialogue.type.npc +import content.entity.player.dialogue.type.player +import content.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.entity.character.mode.Follow +import world.gregs.voidps.engine.timer.Timer +import world.gregs.voidps.engine.timer.toTicks +import world.gregs.voidps.type.random +import java.util.concurrent.TimeUnit + +class ZombieProtester : Script { + init { + + huntPlayer("zombie_protester*", "spotted") { + if (!tile.within(it.tile, 4)) { + return@huntPlayer + } + softTimers.start("protesting") + mode = Follow(this, it) + } + + npcOperate("Talk-to", "zombie_protester*") { + if (!questCompleted("rum_deal")) { + return@npcOperate + } + npc("Arrrr! Tis yerself! Have a drink!") + player("Errr...Arrr! I will in a sec, I've just go to, err, plunder some landlubbers...") + npc("Good huntin'!") + } + + npcTimerStart("protesting") { TimeUnit.SECONDS.toTicks(30) } + + npcTimerTick("protesting") { + say( + when (random.nextInt(8)) { + 0 -> "Whadda we want? Rum!" + 1 -> "Give us rum or give us death!" + 2 -> "Give us yer rum, ye scurvy dog!" + 3 -> "Yer rum or yer brains!" + 4 -> "When do we want it? Now!" + 5 -> "Where d'ye think yer goin?" + 6 -> "Ye'll never beat us all!" + 7 -> "United we stagger!" + else -> "Rum, rum, we want rum!" + } + ) + if (mode is Follow) { + Timer.CONTINUE + } else { + Timer.CANCEL + } + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt new file mode 100644 index 0000000000..686f9642c0 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt @@ -0,0 +1,118 @@ +package content.area.morytania.port_phasmatys + +import content.entity.player.dialogue.Angry +import content.entity.player.dialogue.Drunk +import content.entity.player.dialogue.Happy +import content.entity.player.dialogue.Neutral +import content.entity.player.dialogue.Quiz +import content.entity.player.dialogue.Sad +import content.entity.player.dialogue.Shifty +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.quest.questCompleted +import world.gregs.voidps.engine.Script +import world.gregs.voidps.engine.client.ui.open +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.player.Player +import world.gregs.voidps.engine.entity.character.sound +import world.gregs.voidps.type.Direction +import world.gregs.voidps.type.Tile +import world.gregs.voidps.type.random + +class PiratePete : Script { + init { + npcOperate("Talk-to", "pirate_pete*") { (target) -> + if (!questCompleted("rum_deal")) { + player("Hello there!") + npc("Mornin'.") + player("Got any quests?") + npc("I may have a quest, but you don't look like you'd be able handle the kind of monsters I have problems with.") + return@npcOperate + } + player("Do I know you?") + npc("Yes, you owe me some money.") + if (target.id == "pirate_pete_braindeath_island") { + npc("Want a lift to Port Phasmatys?") + } else { + npc("Want a lift to Braindeath Island?") + player("Well, possibly, but could I go to Mos Le'Harmless instead?") + npc("Nope. It's Braindeath island or nothing. Interested?") + } + choice { + option("Okay!") { + if (target.id == "pirate_pete_braindeath_island") { + travel(target, Tile(3680, 3536)) + } else { + travel(target, Tile(2162, 5114, 1)) + } + } + option("Not now") { + player("I'm getting an awful headache talking to you. Any idea why?") + npc("No idea whatsoever.") + } + option("Why do I get a headache every time I see you?") { + npc("Well, it's possibly the weight of all of your expensive items giving you a sore back.") + npc("As a doctor I can tell you that sometimes a bad back can manifest as a headache.") + player("You're a doctor?") + npc("I'm on a break.") + npc("Regardless, I can tell you that if you hand me your most expensive items, then the pain will disappear.") + npc("CoughonceyouturnaroundagainCough!") + } + option("Are you any relation to Party Pete?") { + npc("Yes I am, he's my cousin.") + player("Well, you don't sound too happy about it. What happened?") + npc("Well, I arranged with all my friends to have a party at his place.") + npc("But then I humiliated myself by trying to dance with the knights.") + npc("All of them collapsed on me in a horrific, jangling pile.") + npc("I tried to salvage the night by having all the balloons come down...") + player("So what happened?") + npc("I didn't know that someone had swapped the balloons with cannonballs!") + npc("The casualties were horrific...") + npc("That was the worst fifth birthday party in the history of the world.") + player("I'm sure it wasn't that bad.") + npc("Not according to the Official History of Gielinor!") + npc("Every edition... the pictures bring it all back...") + player("Ouch...") + } + } + } + } + + private suspend fun Player.travel(target: NPC, tile: Tile) { + if (random.nextBoolean()) { + npc("Err... sure...") + player("Why are you looking over my shoulder?") + } else { + npc("Well I'll be more than happy to...") + npc("Egad! Did you see that?") + player("What? Where?") + } + face(Direction.SOUTH) + delay(2) + say("Ow!") + target.anim("mace_pummel") + gfx("stun_long", delay = 20) + open("fade_out") + sound("cudgel", delay = 15) + delay(3) + tele(tile) + delay(3) + open("fade_in") + face(Direction.NORTH) + delay(2) + player("Ooooh... my head...") + npc("Are you ok? You, errr...") + when (random.nextInt(3)) { + 0 -> npc("...missed your mouth while drinking from a bottle. Hence the bottle-shaped bruises.") + 1 -> { + npc("...hit your head on my oars while I was rowing over.") + npc("Twice.") + } + else -> npc("...slipped and fell down some stairs.") + } + player("Wow... I'm lucky I wasn't seriously hurt!") + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt new file mode 100644 index 0000000000..d50902f921 --- /dev/null +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt @@ -0,0 +1,16 @@ +package content.area.morytania.port_phasmatys + +import world.gregs.voidps.engine.Script +import world.gregs.voidps.type.random + +class TorturedSoul : Script { + init { + npcDeath("tortured_soul") { + say(when(random.nextInt(3)) { + 0 -> "Your soul will be forfeit for this, mortal!" + 1 -> "I will return, mortal!" + else -> "You cannot kill the undead, mortal!" + }) + } + } +} \ No newline at end of file diff --git a/game/src/main/kotlin/content/entity/npc/combat/Attack.kt b/game/src/main/kotlin/content/entity/npc/combat/Attack.kt index bcc2a6be67..97d0883249 100644 --- a/game/src/main/kotlin/content/entity/npc/combat/Attack.kt +++ b/game/src/main/kotlin/content/entity/npc/combat/Attack.kt @@ -5,6 +5,7 @@ import content.entity.combat.hit.Hit import content.entity.combat.hit.hit import content.entity.death.weightedSample import content.entity.effect.freeze +import content.entity.effect.toxin.disease import content.entity.effect.toxin.poison import content.entity.gfx.areaGfx import content.entity.proj.shoot @@ -155,6 +156,9 @@ class Attack( if (attack.impactPoison != 0) { poison(target, attack.impactPoison) } + if (attack.impactDisease != 0) { + disease(target, attack.impactDisease) + } if (attack.impactMessage != "") { target.message(attack.impactMessage) } From 44ecfd64403ee3bb3aa4fa9b10611a7ad6ec18aa Mon Sep 17 00:00:00 2001 From: GregHib Date: Sat, 28 Mar 2026 18:05:58 +0000 Subject: [PATCH 10/10] Formatting --- .../area/morytania/braindeath_island/Brewer.kt | 2 +- .../morytania/braindeath_island/CaptainDonnie.kt | 2 +- .../morytania/braindeath_island/FeverSpider.kt | 15 +-------------- .../braindeath_island/ZombieProtester.kt | 5 ++--- .../morytania/mort_myre_swamp/FeralVampyre.kt | 1 - .../area/morytania/port_phasmatys/PiratePete.kt | 2 +- .../area/morytania/port_phasmatys/TorturedSoul.kt | 14 ++++++++------ 7 files changed, 14 insertions(+), 27 deletions(-) diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt index c9e15b195a..86d41ec658 100644 --- a/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/Brewer.kt @@ -110,4 +110,4 @@ class Brewer : Script { player("I may come for it later, you hang on to it for now.") } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt index bb6c16f04d..c758f36efd 100644 --- a/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/CaptainDonnie.kt @@ -27,4 +27,4 @@ class CaptainDonnie : Script { npc("Arr, yer a good lad...") } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt index 2a85554008..985dc276b8 100644 --- a/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/FeverSpider.kt @@ -1,20 +1,7 @@ package content.area.morytania.braindeath_island import content.entity.combat.hit.damage -import content.entity.player.dialogue.Angry -import content.entity.player.dialogue.Drunk -import content.entity.player.dialogue.Happy -import content.entity.player.dialogue.Laugh -import content.entity.player.dialogue.Neutral -import content.entity.player.dialogue.Quiz -import content.entity.player.dialogue.Scared -import content.entity.player.dialogue.Shifty -import content.entity.player.dialogue.Shock -import content.entity.player.dialogue.type.npc -import content.entity.player.dialogue.type.player -import content.quest.questCompleted import world.gregs.voidps.engine.Script -import world.gregs.voidps.engine.entity.Despawn.Companion.player import world.gregs.voidps.engine.entity.character.player.Player import world.gregs.voidps.engine.entity.character.player.equip.equipped import world.gregs.voidps.engine.entity.character.player.skill.Skill @@ -29,4 +16,4 @@ class FeverSpider : Script { it.damage(damage.toInt()) } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt index de00643da9..a816d03a72 100644 --- a/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt +++ b/game/src/main/kotlin/content/area/morytania/braindeath_island/ZombieProtester.kt @@ -1,7 +1,6 @@ package content.area.morytania.braindeath_island import content.entity.player.dialogue.Drunk -import content.entity.player.dialogue.Quiz import content.entity.player.dialogue.Shifty import content.entity.player.dialogue.type.npc import content.entity.player.dialogue.type.player @@ -47,7 +46,7 @@ class ZombieProtester : Script { 6 -> "Ye'll never beat us all!" 7 -> "United we stagger!" else -> "Rum, rum, we want rum!" - } + }, ) if (mode is Follow) { Timer.CONTINUE @@ -56,4 +55,4 @@ class ZombieProtester : Script { } } } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt index 16d4a2e435..973046a6e1 100644 --- a/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt +++ b/game/src/main/kotlin/content/area/morytania/mort_myre_swamp/FeralVampyre.kt @@ -30,6 +30,5 @@ class FeralVampyre : Script { levels.drain(Skill.Magic, multiplier = 0.25) target.message("The vampyre is weakened by your holy symbol of Saradomin.") } - } } diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt index 686f9642c0..33c0ff80a1 100644 --- a/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/PiratePete.kt @@ -115,4 +115,4 @@ class PiratePete : Script { } player("Wow... I'm lucky I wasn't seriously hurt!") } -} \ No newline at end of file +} diff --git a/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt index d50902f921..257ff262aa 100644 --- a/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt +++ b/game/src/main/kotlin/content/area/morytania/port_phasmatys/TorturedSoul.kt @@ -6,11 +6,13 @@ import world.gregs.voidps.type.random class TorturedSoul : Script { init { npcDeath("tortured_soul") { - say(when(random.nextInt(3)) { - 0 -> "Your soul will be forfeit for this, mortal!" - 1 -> "I will return, mortal!" - else -> "You cannot kill the undead, mortal!" - }) + say( + when (random.nextInt(3)) { + 0 -> "Your soul will be forfeit for this, mortal!" + 1 -> "I will return, mortal!" + else -> "You cannot kill the undead, mortal!" + }, + ) } } -} \ No newline at end of file +}