Implemented The Curse of Zaros Miniquest

This commit is contained in:
Oven Bread
2025-02-13 12:34:23 +00:00
committed by Ryan
parent 618d39d73c
commit 4387b346dc
9 changed files with 1361 additions and 4 deletions
+198
View File
@@ -24103,6 +24103,199 @@
"attack_level": "61"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2381",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2382",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2383",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2384",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2385",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2386",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2387",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2388",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2389",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2390",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2391",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2392",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2393",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2394",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2395",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
"lifepoints": "10",
"combat_audio": "436,439,438",
"strength_level": "1",
"id": "2396",
"range_level": "1",
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
@@ -24114,6 +24307,7 @@
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
@@ -24125,6 +24319,7 @@
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
@@ -24136,6 +24331,7 @@
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
@@ -24147,6 +24343,7 @@
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
@@ -24158,6 +24355,7 @@
"attack_level": "1"
},
{
"examine": "Seems to flitter in and out of existence...",
"name": "Mysterious ghost",
"defence_level": "1",
"safespot": null,
+52 -4
View File
@@ -5511,21 +5511,69 @@
"npc_id": "2374",
"loc_data": "{2041,4632,0,1,3}-{2037,4630,0,1,3}-{2041,4644,0,1,4}-"
},
{
"npc_id": "2381",
"loc_data": "{2555,3444,0,1,0}-"
},
{
"npc_id": "2382",
"loc_data": "{3022,3946,0,1,0}-"
},
{
"npc_id": "2383",
"loc_data": "{3034,3701,0,1,0}-"
},
{
"npc_id": "2384",
"loc_data": "{3162,2982,0,1,0}-"
},
{
"npc_id": "2385",
"loc_data": "{3112,3159,0,0,0}-"
"loc_data": "{3112,3158,0,1,0}-"
},
{
"npc_id": "2386",
"loc_data": "{3051,3496,1,0,0}-"
"loc_data": "{3052,3496,1,1,0}-"
},
{
"npc_id": "2387",
"loc_data": "{3053,3378,1,1,0}-"
},
{
"npc_id": "2388",
"loc_data": "{2950,3820,0,1,0}-"
},
{
"npc_id": "2389",
"loc_data": "{3219,3677,0,0,0}-"
"loc_data": "{3218,3677,0,1,0}-"
},
{
"npc_id": "2390",
"loc_data": "{3068,3858,0,1,0}-"
},
{
"npc_id": "2391",
"loc_data": "{2850,3348,0,1,0}-"
},
{
"npc_id": "2392",
"loc_data": "{3043,3204,0,0,0}-"
"loc_data": "{3044,3204,0,1,0}-"
},
{
"npc_id": "2393",
"loc_data": "{2396,3481,0,1,0}-"
},
{
"npc_id": "2394",
"loc_data": "{3294,3934,1,1,0}-"
},
{
"npc_id": "2395",
"loc_data": "{3448,3550,1,1,0}-"
},
{
"npc_id": "2396",
"loc_data": "{3119,9996,0,1,0}-"
},
{
"npc_id": "2414",
@@ -0,0 +1,189 @@
package content.region.desert.quest.curseofzaros
import core.game.dialogue.*
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
/**
* Curse of Zaros is a miniquest with no quest points or final dialogue
*
* Players get the ghostly set for fashionscape.
*/
class CurseOfZaros {
companion object {
const val attributePathNumber = "/save:miniquest:curseofzaros-pathnumber" // 1 of 3.
const val attributeValdezSpoke = "/save:miniquest:curseofzaros-valdezspoke"
const val attributeRennardSpoke = "/save:miniquest:curseofzaros-rennardspoke"
const val attributeKharrimSpoke = "/save:miniquest:curseofzaros-kharrimspoke"
const val attributeLennissaSpoke = "/save:miniquest:curseofzaros-lennissaspoke"
const val attributeDhalakSpoke = "/save:miniquest:curseofzaros-dhalakspoke"
const val attributeViggoraSpoke = "/save:miniquest:curseofzaros-viggoraspoke"
// Ghostly Robes lost: http://youtu.be/YcwYOqfG1Ys
fun withoutGhostspeak(d: DialogueLabeller) {
fun label(label: String) { d.label(label) }
fun loadLabel(player: Player, label: String) { d.loadLabel(player, label) }
fun player(vararg messages: String) { d.player(ChatAnim.NEUTRAL, *messages) }
fun npc(vararg messages: String) { d.npc(ChatAnim.NEUTRAL, *messages) }
fun exec(callback: (player: Player, npc: NPC) -> Unit) { d.exec(callback) }
label("noghostspeak")
exec { player, npc ->
loadLabel(player, "noghostspeak" + (1..8).random())
}
label("noghostspeak1")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("You don't say?")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("You don't say!")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Well, I guess you didn't say.")
label("noghostspeak2")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("Yeah, I don't want to brag, but seriously: I am SOOOO rich....")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("Yeah, I know they say money doesn't bring you happiness, but sometimes I just like to open my bank account and look at all of the stuff I own and just think to myself:")
player("Wow. I am soooooo rich.")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Well, us rich alive people don't want to waste all day spending time with you poor dead people, because I'm just sooooo rich I have to go now, and very possibly make myself even richer.")
player("See ya around ghosty!")
label("noghostspeak3")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("Yeah, I heard about that, ha-ha-ha!")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("With a MACKEREL? Ouch!")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Well, it was fun. Let's do it again sometime.")
label("noghostspeak4")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("Why, thank you very much!")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("I know, but what are you going to do?")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Well, I guess that's always true in the long run. See you around, weird invisible dead person!")
label("noghostspeak5")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("Yeah it's not bad, but I prefer cooked chicken.")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("Maybe, but nothing beats a home cooked pie!")
player("Man, I love pie!")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("You don't say? I never knew that. Well, I must be going, see you around.")
// This is peak 2009 memez
label("noghostspeak6")
player("Hello there.")
npc("Wooo? Woooo woo woooooo wooooo woooowooo wooo woooooo woo!")
player("We get signal!")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("Somebody set up us the bomb!")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("You have no chance to survive make your time.")
npc("Woo?")
player("All your base are belong to us.")
label("noghostspeak7")
player("Hey, don't think you can talk to me like that!")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("Are you threatening me?")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Just because you're already dead, doesn't mean I can't find a way to hurt you ghosty!")
label("noghostspeak8")
player("No, I've never been there in my life and CERTAINLY didn't steal anything when I was!")
npc("Woo! WOO WOOOOO WOOWOOWOO WOO WOOOOO!")
player("Are you calling me a liar?!?! I have never stolen a thing in my life, and I resent the implication that I am the kind of morally depraved individual that would steal someone else's hard earned")
player("money from their very pockets!")
player("Or cakes. Or fur. Repeatedly. For long periods at a time.")
npc("Wooowoowoooooo.... Woowoowoo? Woooo, wooowoo wooowooowooo!")
player("Well if you are going to take that attitude, then I have nothing further to say on the matter, and bid you good day!")
}
fun wrongPath(d: DialogueLabeller) {
fun label(label: String) { d.label(label) }
fun loadLabel(player: Player, label: String) { d.loadLabel(player, label) }
fun player(vararg messages: String) { d.player(ChatAnim.NEUTRAL, *messages) }
fun npc(vararg messages: String) { d.npc(ChatAnim.NEUTRAL, *messages) }
fun exec(callback: (player: Player, npc: NPC) -> Unit) { d.exec(callback) }
label("wrongpath")
exec { player, npc ->
loadLabel(player, "wrongpath" + (1..7).random())
}
label("wrongpath1")
player("Hello there.")
npc("The endless tragedy of fate...", "Why must you torment me so?")
player("Alright, alright, calm down, calm down. All I said was 'hello'!")
label("wrongpath2")
player("Hello there.")
npc("You can see me?")
player("Uh... yes?")
npc("And you understand my words?")
player("Well, most of them...")
npc("This is incredible! How can such a thing have come to pass?")
player("What can I say? I'm a professional.")
label("wrongpath3")
player("Hello there.")
npc("Hello back at you.")
player("So what's a nice ghost like you doing in a place like this?")
npc("I suppose you think that's funny?")
player("Well... Mildly amusing I guess.")
npc("I don't think I want to talk to you anymore.")
label("wrongpath4")
player("Hello there.")
npc("Hello stranger. It is rare indeed that I meet one who can see my presence, let alone one who can understand my words.")
player("Soooo.... Is it fun being a ghost?")
npc("Does it look like fun to you?")
player("Erm... Well, yes actually.")
npc("Then you are a fool, and I will waste no more words upon you.")
player("What, not even 'goodbye'?")
npc(" ")
player("Sheesh, what a grouch. You'd think you'd have more of a sense of humour being dead and all.")
label("wrongpath5")
player("Hello there.")
npc("Mortal... Take heed of my example, and waste not your life, lest you may suffer the same fate as myself...")
player("Huh? You mean someone did this to you?")
npc("You have ascertained the truth in my words...")
player("So who did it to you? And why?")
npc("Events of moons past, I remember not clearly...")
player("Fine help you are then.")
label("wrongpath6")
player("Hello there.")
npc("Hello stranger.")
player("So.... Invisible ghost haunting the same place for thousands of years, huh?")
npc("You have no idea...")
player("Well, bad luck and all that. See ya around!")
label("wrongpath7")
player("Hello there.")
npc("Hello.")
player("So you're a ghost, huh?")
npc("Apparently.")
player("In which case I only have one thing to say to you:")
npc("...what?")
player("Guess you don't have the amulet of humanspeak, huh?")
npc("...huh?")
player("Yeah, that's right. WOO! WOOOWOOO WOO WOOOOWOO! Got no comeback for that, have you?")
npc("You are very strange...")
}
}
}
@@ -0,0 +1,149 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostDhalakDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostDhalakDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostDhalakDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2385, 2386, 2387)
}
}
class MysteriousGhostDhalakDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (2384 + getAttribute(player, CurseOfZaros.attributePathNumber, 0) == npc.id) {
if (getAttribute(player, CurseOfZaros.attributeDhalakSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_HOOD_6109) || inEquipment(player, Items.GHOSTLY_HOOD_6109)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "wrongpath")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
CurseOfZaros.wrongPath(this)
label("firsttime")
player("Hello Dhalak.")
npc("You see my form, hear my words, and know my name, yet your face I recognise not...")
npc("Be you some mighty sorcerer to bind me so?")
player("Um... Well, not really...") // player("Well, I don't mean to brag, but I guess I am with my level 99 magic...") if you are 99 lvl magic but calm the fuck down showoff
player("But that is besides the point. It is not I who has trapped you here as a ghost.")
npc("Then how comes it to be that you know my name stranger?")
player("Lennissa told me about you, and where to find you?")
npc("Lennissa? Oh that poor sweet girl... Has my foolishness cursed her as well as myself???")
player("Your foolishness?")
npc("The story shames me stranger, I wouldst rather keep it unto myself.")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Look, I don't want to force you into telling me, but perhaps sharing it with someone might relieve your guilt?")
npc("Aye... Perhaps it might at that.")
npc("So what has Lennissa told you of the events of the day this curse befell me?")
player("Well, she told me that she was working as an undercover agent of Saradomin amongst the followers of some 'Empty Lord', and when news of the theft of a god-weapon reached her, she passed the message on to")
player("you instead of taking it to Saradomin because she was scared her cover might be blown.")
npc("Aye, that is a fair account of events...")
player("But I don't understand why you didn't take her message to Saradomin?")
npc("Stranger, my foolishness was a result of my respect for Saradomin, not as a result of any attempted treachery!")
player("So why didn't you pass on Lennissa's message? As I understand it something happened with that staff that could have been avoided if you had passed her message on!")
npc("(sigh) I know not what occurred with that god-weapon, but I have my suspicions...")
npc("Let me explain myself. I was Lennissa's immediate superior, and I was often her contact for missions.")
npc("Because of this role, I had access to a larger picture of what was happening than she herself did, and I was not only well aware that her presence amongst the enemy camp had been detected, but I was also well aware that")
npc("there was a growing faction amongst them who were plotting to overthrow their master.")
player("Their master being...?")
npc("That I will not tell you. I will tempt the fates no more than I already have done.")
npc("But anyway, it had come to my attention that the Mahjarrat who had been liberated from the control of Icthlarin did not much appreciate one form of slavery to another, and under the leadership of the mighty")
npc("Zamorak were making plans to overthrow their master and take his power for themselves.")
npc("Now, as powerful, long-lived and evil as they were, they were still just mortal, and I made the decision that it would be of benefit to my Lord Saradomin for his mightiest rival to be distracted by such internal conflicts.")
player("So that is why you decided not to pass the report from Lennissa on?")
npc("Yes, but my guilt is more than simply inaction...")
npc("I knew that with such a weapon, Zamorak would be capable of launching an attack that could actually stand a chance of success, but I also knew that he would never be able to get a chance to use it in a battle for")
npc("being a god-weapon its very presence would have sung out to their leader.")
player("I'm guessing you did something about that, then?")
npc("Indeed I did. To my eternal shame, I decided that I would assist Zamorak and his henchmen in their battle, by secretly casting a spell of concealment upon the staff so that")
npc("they might use it secretly against their master.")
player("So Zamorak knew about this?")
npc("No, nobody except myself, and now you, knew that I cast such a spell....")
npc("Had I known what a threat to my Lord Saradomin Zamorak would later become, I wouldst have taken the message to Saradomin immediately! Alas, it is all too easy to see your mistakes after you")
npc("have made them...")
player("I'm confused. What exactly happened with this staff anyway? And why have all these various random people been cursed because of it?")
npc("I cannot answer your question with anything other than my own suppositions, but I do know of one who might be able to, and if any man deserved to be cursed for their actions that day, it was he!")
player("Who are you speaking of?")
npc("His name was Viggora. He was an evil man, brutal and vicious, and deadly with a blade.")
npc("He was one of the few humans Zamorak allowed to rise to a position of power amongst his rebels, possibly because he imitated those same qualities of Zamorak.")
npc("If anyone knows what Zamorak did with that god- weapon to have caused this curse to have befallen us, it would have been he, for he would have been fighting on Zamorak's very right hand side in their rebellion.")
npc("Please, if this curse can be lifted, find Viggora and find out what he has wrought upon us! I have no wealth nor magic to aid you, but take my hood as reward;")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeDhalakSpoke, true)
addItemOrDrop(player, Items.GHOSTLY_HOOD_6109)
}
npc("it has served me well these centuries past, and may bring you luck.")
player("Where would you suggest I look for Viggora?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("subsequenttime")
player("Dhalak, where can I find the swordsman Viggora?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("curseofzaros1")
npc("Ah, the evil swordsman Viggora... A rogue like him would probably flock to his own kind.")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros2")
npc("Ah, the evil swordsman Viggora... Perhaps he has returned to his castle in the dark lands?")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros3")
npc("Ah, the evil swordsman Viggora... Paddewwa was where he fought many battles, perhaps he has returned to one of his old haunts?")
player("Okay, well I'll try and find him for you then.")
label("lostghostlything")
player(ChatAnim.SAD, "Could I have that hat again? I seem to have misplaced it", "somewhere...")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_HOOD_6109)
}
npc("Certainly, I am not sure how, but it returned to me by", "some magic or other.")
}
}
@@ -0,0 +1,143 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostKharrimDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostKharrimDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostKharrimDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2388, 2389, 2390)
}
}
class MysteriousGhostKharrimDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (2387 + getAttribute(player, CurseOfZaros.attributePathNumber, 0) == npc.id) {
if (getAttribute(player, CurseOfZaros.attributeKharrimSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_BOOTS_6106) || inEquipment(player, Items.GHOSTLY_BOOTS_6106)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "wrongpath")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
CurseOfZaros.wrongPath(this)
label("firsttime")
player("Hello. So you must be Kharrim the messenger.")
npc("How do you know my name, stranger?")
player("Well now... I had a very interesting chat with Rennard the thief.")
player("It seems you redirected his message regarding a certain god-weapon for your own ends.")
npc("So THAT is what this is about... I should have known the deal was too good to have no repercussions...")
player("It seems as though you might be responsible for this curse that has befallen you by not delivering Rennard's message to the correct person.")
npc("Ha! That is not a truthful assessment of the story... You might think differently if you had heard my side of events.")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Please let me hear your side of the story then...")
npc("Well, if you have spoken to Rennard, then you will know that he had somehow managed to obtain a very valuable weapon, and was looking for buyers.")
npc("What he probably didn't tell you, was that he met me in a drunken stupor in some smoke filled tavern, and I offered to arrange a purchaser for his item, in exchange for a small finders fee.")
player("So you knew what the staff was?")
npc("The god-staff of Armadyl? Well, of course I did.")
npc("Honestly, you would have to be pretty slow-witted to not recognise a legendary artefact such as that.")
player("Wait, I don't understand, Rennard said that he had a buyer already in mind, and that you diverted his message to a General Zamorak instead?")
npc("Ha! Here is a word of advice for you adventurer; Never trust the words of a drunk.")
npc("Whatever he might have thought he was doing with it, in the end all that happened was he left me to arrange a purchaser for the item.")
player("So you thought you would offer it to General Zamorak?")
npc("Ah yes, Lord Zamorak. He was merely a mortal back then, you know?")
npc("Yet I could see great things in store for him even then. He had a kind of brilliant ruthlessness... And that special kind of vicious streak you see so rarely...")
npc("Well anyway, when given the task of selling a weapon forged by the very gods themselves, I naturally thought of Zamorak as a potential buyer.")
npc("I was a messenger in his employ anyway, so it was a mere trifle to find him and deliver the news, and I knew of his particular interest in armour and weaponry of all kinds.")
npc("Yes, he was always quite the connoisseur when it came to weaponry...")
npc("But I digress. I let Lord Zamorak know that there was some drunken fool with an artefact of incredible power that could probably be bought off with a few jewels and trinkets,")
npc("and he escorted me to the tavern and made the purchase there and then.")
npc("It was a satisfactory deal all around, I got a share of the sale price from Rennard, and I greatly increased my prestige amongst Zamorak and his followers.")
npc("But maybe... Perhaps the events that followed were responsible for my cursed state...")
player("Events that followed?")
npc("I can not tell you of them precisely, for I myself was not there to witness them.")
npc("I am after all, simply a messenger. When... 'it' happened, I was busy elsewhere delivering a message from Zamorak to the rest of his Mahjarrat ilk.")
player("When 'it' happened? What was 'it'?")
npc("As I have explained, I was not there, and I do not know what Zamorak did with the staff, but whatever it was resulted in his banishment by the other gods for many years.")
npc("The very strange thing was that Saradomin must have known about it, whatever it was, before it even happened...")
player("Really? Why do you say that?")
npc("Well, it was the contents of the message I was returning to Zamorak;")
npc("Lucien seemed quite certain that there was a spy for Saradomin somewhere amongst his followers named Lennissa.")
npc("If whatever happened to the staff caused this curse to befall me, then it is certain that she too would have been afflicted, because she would have been in the very heart of the action.")
npc("Hmmm....")
npc("You have given me much to think on adventurer. I would like to reward you with my sturdy messenger boots, may they aid you in your travels.")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeKharrimSpoke, true)
addItemOrDrop(player, Items.GHOSTLY_BOOTS_6106)
}
player("But where can I find this Lennissa?")
npc("Ah yes, the whereabouts of the treacherous Lennissa...")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("subsequenttime")
player("Hello again Kharrim.")
player("Can you remind me where to find Lennissa?")
npc("Ah yes, the whereabouts of the treacherous Lennissa...")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("curseofzaros1")
npc("Well, she was always sickeningly obedient to Saradomin, so I would expect her to have run to some great place of worship of him if she was affected by the curse to try and gain his blessing.")
player("Okay, well I'll try and find her for you then.")
label("curseofzaros2")
npc("According to Lucien's intelligence report, she had been uncovered as a spy by her constant use of ships to ferry information...")
npc("It is entirely possible she would be located somewhere coastal to this day!")
player("Okay, well I'll try and find her for you then.")
label("curseofzaros3")
npc("Well, we knew little about her or she would have been caught and exposed as a traitor and a spy, but Lucien did mention that he had evidence that she was a great fan of ball games...")
player("Okay, well I'll try and find her for you then.")
label("lostghostlything")
player(ChatAnim.SAD, "I lost those boots you gave me...", "Can I have some more please?")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_BOOTS_6106)
}
npc(ChatAnim.SAD, "How strange...", "They seemed to return to me when you lost them...")
}
}
@@ -0,0 +1,155 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostLennissaDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostLennissaDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostLennissaDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2391, 2392, 2393)
}
}
class MysteriousGhostLennissaDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (2390 + getAttribute(player, CurseOfZaros.attributePathNumber, 0) == npc.id) {
if (getAttribute(player, CurseOfZaros.attributeLennissaSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_ROBE_6108) || inEquipment(player, Items.GHOSTLY_ROBE_6108)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "wrongpath")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
CurseOfZaros.wrongPath(this)
label("firsttime")
player("Hello. You would be Lennissa, I take it?")
npc("Who are you? Where did you hear that name? How comes it that you can see and speak to me?")
player("Well, a ghost called Kharrim directed me towards you.")
npc("So that weasel Kharrim has been blighted by this curse too?")
npc("Ha, a good thing too. If anybody deserved such a fate it would be one such as him.")
player("I guess you didn't get along then?")
npc("No, evil scum such as he should never have been allowed to walk this world.")
npc("What lies has he told you to come here? Have you come to try and kill me?")
player("Well, I'm not sure I could if I tried, but that is not why I have come to you.")
npc("Then speak, and speak well, for I may yet be dead, but am still a danger to those who cross me.")
player("Actually, I'm trying to work out why all of you invisible ghosts seem to have been cursed.")
player("I'm not sure how exactly, but the trail seems to have led me to you...")
npc("That makes no sense... I served Saradomin faithfully my entire life, then all of a sudden I find myself reduced to this state!")
player("Well, it seems as though that may have been the cause...")
npc("What? Explain yourself.")
player("As I understand it, it was something to do with the Staff of Armadyl, and your refusal to tell Saradomin that it had been stolen...")
npc("What? But... But that is not how it happened at all!")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Then please, go ahead and tell me the events of that day in your own words...")
npc("Let me see... I had been working as a spy for my Lord Saradomin, amongst the forces of... the Empty Lord.")
player("'The Empty Lord'? Who is that?")
npc("I will not give you his name, for to do so would give him power here.")
npc("Let us just say that he was a fearsome deity, whose strength was greater than all the gods we knew of on this realm at the time.")
npc("It is probably worth mentioning that at this time we had no knowledge of the mysterious nature god Guthix.")
player("So he was stronger than Saradomin?")
npc("As Saradomin was, yes. As Saradomin is now? Who can say?")
player("I see... Please, continue.")
npc("As I say, I was working as a spy within the very camp of my Lord's enemies.")
npc("I knew that should I have been caught, I risked being killed upon the spot, but my combat skills were always formidable, and if truth be told, there was a fair amount of dissent amongst... 'his' followers anyway.")
player("How do you mean 'dissent'?")
npc("Ah, to not understand this, you must have led a sheltered life...")
npc("Let me tell you this: Evil will always breed more evil, and will never be satisfied with what it has.")
npc("The Empty Lord chose to ally himself with the dark creatures of this world, fully aware that their own natures would cause them to rally against his rule, and take every opportunity they could to betray him.")
npc("This has always been the nature of evil. Perhaps he thought his power could prevent such treachery?")
npc("This allowed me freedom amongst their camp, for it was always easy to point the finger of suspicion at some unsuspecting necromancer or foolish Mahjarrat if it seemed as though my activities had been discovered.")
npc("Similarly, should I ever be caught in the act of my sabotage, it was all too easy to bribe whoever found me or persuade them into believing it was just some minor treachery of my own, rather than my work for my")
npc("Lord Saradomin.")
player("Okay... Well, that makes sense, but I don't understand what the Staff of Armadyl had to do with this...?")
npc("As I have told you, the Empty Lord was extremely powerful, but not so powerful that he could rule over the other deities of this world without opposition.")
npc("Should he have made a move against any other god, then he could still have been easily brought down by the combined efforts of the others.")
npc("The theft of Armadyl's staff changed this however.")
npc("If he had taken possession of this god-weapon, then his power would have been so great that he could have overthrown all on this world, and made it into his own image!")
npc("I could not allow such a thing to happen!")
npc("I went immediately to my comrade Dhalak, the mage, and told him that a message had come to the lair offering this weapon for sale!")
npc("I knew that as soon as my Lord Saradomin heard this, he would contact Armadyl to inform them of the theft, and the matter would have been resolved quickly and discreetly.")
player("So you passed this information to Dhalak instead of taking it to Saradomin yourself?")
npc("To my eternal shame, I indeed failed my Lord Saradomin...")
npc("I could not risk taking the message directly, for I feared my disguise had been uncovered.")
npc("Lucien particularly had been taking an unhealthy interest in my activities, and I had a gut feeling that to make any obvious moves against the Empty Lord would have been my undoing.")
npc("But Dhalak was a noble man! I cannot believe that he would not have taken my message immediately to Lord Saradomin!")
player("Well, it seems like he didn't, but I don't know why not...")
npc("Please adventurer, discover what foul fate must have befallen him for him to have neglected his duty!")
npc("I have not much to offer as reward, but for these spare robes I wore while on assignment...")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeLennissaSpoke, true)
addItemOrDrop(player, Items.GHOSTLY_ROBE_6108)
}
npc("Please find him and discover why I am cursed like this!")
player("Where would I be able to find this Dhalak then?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("subsequenttime")
player("Hello Lennissa. Can you remind me where to find Dhalak?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("curseofzaros1")
npc("Dhalak? Well, he was always a knowlegeable mage, so if this curse has befallen him as well, I would suspect he would be researching how to free himself of it.")
npc("I would look for a library to find him if I were you.")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros2")
npc("Dhalak? He was always a loyal follower of Saradomin... I think he would have found an altar to Saradomin so that he may pray for this curse to be lifted.")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros3")
npc("Dhalak? I know not where, but he would try and make the most of his situation if he has been cursed, and find a place to lift his spirits!")
player("Okay, well I'll try and find him for you then.")
label("lostghostlything")
player(ChatAnim.SAD, "Could I have that rob bottom again? I seem to have", "misplaced it somewhere...")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_ROBE_6108)
}
npc(ChatAnim.SAD, "Certainly, I am not sure how, but it returned to me by", "some magic or other.")
}
}
@@ -0,0 +1,151 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostRennardDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostRennardDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostRennardDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2382, 2383, 2384)
}
}
class MysteriousGhostRennardDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (2381 + getAttribute(player, CurseOfZaros.attributePathNumber, 0) == npc.id) {
if (getAttribute(player, CurseOfZaros.attributeRennardSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_GLOVES_6110) || inEquipment(player, Items.GHOSTLY_GLOVES_6110)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "wrongpath")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
CurseOfZaros.wrongPath(this)
label("firsttime")
player("Hello. You must be Rennard.")
npc("What be this? You both see me and hear me, and also know my name?")
npc("Tell me what devilry brings you here, and be quick about it afore I gut you like a fish!")
player("Well, apart from the fact I ain't scared of no ghost, I am here because I have spoken to Valdez.")
npc("Valdez? Who be that? Some foul necromancer?")
player("No, he was a ghost I met near Glarial's tomb.")
player("He seems convinced that the artefact you stole from him is responsible for him becoming cursed to be an invisible ghost.")
player("Seems like he might be onto something too, given the state of you.")
npc("A curse ye say... Aye, that makes sense...")
npc("And there was I thinking my fate be the fault of the thieving and murdering I spent me life a-doing...")
npc("So it all began the day I stole that staff, ye say? Aye, that be a story I have never told another soul...")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Why don't you tell me what happened? I might be able to help...")
npc("Well, I was making me merry way along, having just pulled off a glorious jewellery heist from a bunch of stinking dwarves...")
player("Hey, that's no way to talk about dwarves! Some of my best friends are short!")
npc("Ah, yer misunderstand me [lad/lass], I wasn't generalising about the whole dwarf species, I had just stolen a bundle of jewels from a very specific group of dwarves who happened to have an odious stench about them!")
player("Oh. Well I guess that's okay then. Please continue.")
npc("Well, as I headed on me merry way, hoping the foul odours that lingered in me nostrils would soon pass, I see in front of me this explorer fella, all decked out in in his fine clothing, and carrying some long package")
npc("bundled in rags.")
npc("So I says to meself, 'Rennard', I says, 'Rennard, why would some fella all dressed in his finery be carrying something wrapped in dirty rags?'.")
npc("So I thinks to meself a little more, 'Rennard', I thinks, 'Rennard, maybe that fella has something valuable in there, and he covered it in dirty rags so it don't look so valuable'.")
npc("So I coshed this fella round the back of his head with me bag of jewels, picked up his package and was on me merry way afore he comes to.")
player("So what happened then?")
npc("Well, I makes me way to the closest tavern I knew of that catered to my sort of people...")
player("You mean thieves?")
npc("Right ye are, so I makes me way to the nearest friendly tavern, and unwraps the bundle to see what it had inside.")
player("The Staff of Armadyl?")
npc("Was it? Ah, I never knew that...")
npc("Anysways, I unwraps this staff, and sees it be a god- weapon; I may be just a common thief, but I recognises a weapon not made by mortal hands when I sees one.")
player("So what did you do then?")
npc("Well, I knew such a weapon would be of great value to...")
npc("Now that's funny. Can't remember his name, now. The powerful god, lived in the North-east. Took the Mahjarrat away from under Icthlarin's")
npc("control.")
npc("Anyway, I hired me a messenger to go off and let him know I had something I was prepared to sell that I thought he'd be interested in...")
npc("Now WHY can't I remember his name? Very odd that...")
player("So you sold the staff to this god you can't remember?")
npc("Well, that's the other funny thing... He never showed up, he sent some General or other instead.")
npc("Hmmm... You know... Thinking back on that, I'm getting the feeling that messenger did a little doublecross of his own, and took")
npc("me message to the wrong fella.")
player("So what was this General's name?")
npc("His name was Zamorak. I remember thinking at the time it was odd, because the fella was a mighty powerful warrior, but was never fully trusted by...")
npc("WHY can't I remember his name???")
player("So you suspect the messenger might have taken the message to the wrong person? So you think it was an accident or deliberate?")
npc("Well that I can't tell ya, but if something happened to get me cursed, it's likely the messenger would know what more than me.")
npc("His name was Kharrim, and if he caused me to be stuck like this, I'm gonna fillet him like a dog, ghost or no!")
npc("I tell ye what, you've given me much to think about so I'd like to offer yer a gift; Here, take these, they were the gloves I stole me first cake with, they might bring yer some luck.")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeRennardSpoke, true)
addItemOrDrop(player, Items.GHOSTLY_GLOVES_6110)
}
player("Where can I find this Kharrim then?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("subsequenttime")
player("Hello again Rennard.")
npc("Ah, it be you again! What can I do fer ya?")
player("Can you tell me where I can find Kharrim again?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("curseofzaros1")
npc("Kharrim the messenger... Well, he was always a devoted follower of old General Zamorak, and if I remember rightly Zamorak set up a small base in an old temple near Dareeyak...")
npc("You might want to check around there.")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros2")
npc("Kharrim the messenger... Last I'd heard of him, he'd headed off to Carrallagar to seek his fortune. Ya might want to check around there somewhere.")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros3")
npc("Kharrim the messenger... The last I'd heard of that weasel he was claiming he'd found some underground deposit of runite ore guarded by demons and dragons.")
npc("I suspect he was pulling some scam or other, but if you know of such a place, that might be a good place to start checking.")
player("Okay, well I'll try and find him for you then.")
label("lostghostlything")
player(ChatAnim.SAD, "I lost those gloves you gave me...", "Can I have some more please?")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_GLOVES_6110)
}
npc(ChatAnim.SAD, "It seems as though the curse that keeps me here", "extends to my very clothing...")
npc("Here, take them, some evil power returned them to", "me...")
}
}
@@ -0,0 +1,136 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostValdezDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostValdezDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostValdezDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2381) // wrong const SICK_LOOKING_SHEEP_4_2381 -> should be correct MYSTERIOUS_GHOST_2381
}
}
class MysteriousGhostValdezDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (getAttribute(player, CurseOfZaros.attributeValdezSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_ROBE_6107) || inEquipment(player, Items.GHOSTLY_ROBE_6107)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
label("firsttime")
player("Hello.")
npc(ChatAnim.EXTREMELY_SHOCKED, "H-hello!")
player(ChatAnim.THINKING, "So what's up?")
npc(ChatAnim.EXTREMELY_SHOCKED, "I cannot believe it!", "You can see me?", "You understand my words?")
player("Sure can.", "So why are you hanging around here?")
npc(ChatAnim.SAD, "My tale is one of woe...", "No doubt you will have little interest in hearing it...")
npc(ChatAnim.SAD, "Though it has been so many moons since last I had", "company in this endless non-life...")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Well, actually I would like to know what happened to you to turn you into an invisible ghost.")
player(ChatAnim.SUSPICIOUS, "If only so I can make sure it doesn't happen to me...")
npc("My name is Valdez. I served my Lord Saradomin faithfully for many years, as an explorer of this strange land we had been brought to.")
npc("I remember the day this curse fell upon me clearly... I had just discovered a huge temple, hidden below the ground, of one of Saradomin's compatriots.")
npc("I am unsure who had built it, or why they had left it seemingly abandoned, but inside I located a great treasure...")
npc("It was the godstaff of Armadyl.", "Oh, how I rue my choice that day!")
player("Choice?")
npc("Aye, stranger.", "I chose that day to take it so that my Lord Saradomin's", "power and prestige could be increased by its possession.")
npc("A god-weapon!", "Do you have any comprehension of the difficulty and", "rarity in obtaining such a thing?")
npc("To find such an artefact of power just lying around, it is almost incomprehensible...")
npc("So it was there in that deserted temple that I made my", "choice.", "I took the staff, and left that temple for Entrana", "immediately.")
npc("This was the cause of my cursed state.")
player("What, you mean you gave it to Saradomin and in return he cursed you???")
player("Seems kind of ungrateful if you ask me...")
npc("No stranger, you misunderstand completely...", "Firstly my gracious Lord would never treat anyone in", "such a manner;", "If he felt it was beyond my bounds as a mere mortal")
npc("to hold such an artefact, he would simply have commanded me to return it to whence I had claimed it, and I being eternally loyal would have obeyed without question...")
player("And secondly?")
npc("And secondly, I never managed to pass the artefact on to my Lord...")
npc("The vile thief Rennard accosted me as I made my way to Entrana, and after defeating me with a sneak attack, plundered the staff from my person, and left me for dead...")
npc("I do not know what became of the staff, but I can feel in my very bones that whatever its final fate was, it is somehow related to this curse upon me...")
player("Wow", "Tough break.")
npc("I am sorry to bore you with my tale stranger, please allow me to compound my rudeness by asking you for one favour, small to perform?")
player("Eh, I won't make any promises, but if it's nothing too annoying I guess I can help you out.")
npc("Many thanks stranger, this existence tortures me...")
npc("I need you to find Rennard and if he has the staff yet reclaim it, or find out what hideous deed he performed to curse me so!")
npc("I have nothing I may offer you save this piece of clothing, please take it as payment...")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeValdezSpoke, true)
// Set the path to follow.
setAttribute(player, CurseOfZaros.attributePathNumber, (1..3).random())
addItemOrDrop(player, Items.GHOSTLY_ROBE_6107)
}
player("Where can I find this Rennard then?")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("subsequenttime")
npc("Thank you for hearing my tale...", "It has been so lonely here...")
player("Can you remind me where to find the thief Rennard who caused this curse to befall you again?")
npc("Of course...")
exec { player, npc ->
// 1 of 3 paths.
loadLabel(player, "curseofzaros" + getAttribute(player, CurseOfZaros.attributePathNumber, 0))
}
label("curseofzaros1")
npc("Ah, the infamous Rennard...", "The last I had heard of him, he had sought passage on", "a ship crewed by none but the most dastardly lowly", "pirates...")
npc("I also heard that this ship had been caught in a violent", "storm, and stranded upon rocks, where the pirates then", "made their home...")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros2")
npc("Ah, the infamous Rennard...", "The last I had heard of that vile thief, he had joined a", "group of bandits in an evil land to the North-east of", "here, where they had made their home living outside of")
npc("the reach of the authorities that pursued them...")
player("Okay, well I'll try and find him for you then.")
label("curseofzaros3")
npc("Ah, the infamous Rennard...", "The last I had heard of that vile thief, he had joined a", "group of bandits in a barren land to the South-east of", "here, where they prey upon the unsuspecting visitors to")
npc("the desert awaiting the return of their dark master...")
player("Okay, well I'll try and find him for you then.")
label("lostghostlything")
player(ChatAnim.SAD, "I lost that Robe top you gave me...", "Can I have another please?")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_ROBE_6107)
}
npc(ChatAnim.SAD, "It seems as though the curse that keeps me here", "extends to my very clothing...")
npc("Here, take it, the moment you lost it, it returned to", "me...")
}
}
@@ -0,0 +1,188 @@
package content.region.desert.quest.curseofzaros
import core.api.*
import core.game.dialogue.ChatAnim
import core.game.dialogue.DialogueLabeller
import core.game.dialogue.DialogueOption
import core.game.dialogue.DialoguePlugin
import core.game.node.entity.player.Player
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
@Initializable
class MysteriousGhostViggoraDialogue (player: Player? = null) : DialoguePlugin(player) {
override fun newInstance(player: Player): DialoguePlugin {
return MysteriousGhostViggoraDialogue(player)
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
openDialogue(player, MysteriousGhostViggoraDialogueFile(), npc)
return false
}
override fun getIds(): IntArray {
return intArrayOf(2394, 2395, 2396)
}
}
class MysteriousGhostViggoraDialogueFile : DialogueLabeller() {
override fun addConversation() {
exec { player, npc ->
if (inEquipment(player, Items.GHOSTSPEAK_AMULET_552) || inEquipment(player, Items.GHOSTSPEAK_AMULET_4250)){
if (2393 + getAttribute(player, CurseOfZaros.attributePathNumber, 0) == npc.id) {
if (getAttribute(player, CurseOfZaros.attributeViggoraSpoke, false)) {
if (inInventory(player, Items.GHOSTLY_CLOAK_6111) || inEquipment(player, Items.GHOSTLY_CLOAK_6111)) {
loadLabel(player, "subsequenttime")
} else {
loadLabel(player, "lostghostlything")
}
} else {
loadLabel(player, "firsttime")
}
} else {
loadLabel(player, "wrongpath")
}
} else {
loadLabel(player, "noghostspeak")
}
}
CurseOfZaros.withoutGhostspeak(this)
CurseOfZaros.wrongPath(this)
label("firsttime")
player("So... You must be the infamous Viggora.")
npc("Hold thy tongue varlet! Speak fast, how come you to find me here, and how doth you understand mine speech?")
player("You want me to hold my tongue and tell you how I found you?")
npc("Cease thy chatter and respond to my demand!")
player("Cease my chatter AND respond to your demand?")
npc("I warn thee knave, this curse upon me hath not improved my temper, these centuries past...")
player("Well, it's actually about that curse that I have come to speak to you.")
npc("Oh, be that so? Then forgive my swift anger, and speak to me of how you plan to break this curse.")
player("Erm... I didn't actually mention anything about breaking the curse...")
npc("Then what lets you dare speak to me?")
player("Well, I heard of your name from a mage called Dhalak, and I'm trying to find out what exactly caused the curse to befall him, and you as well apparently.")
npc("Ha! So the weak-willed mage was cursed along with me?")
npc("Well now, that is an interesting turn of events... Then am I to assume that Valdez, Rennard, Kharrim and Lennissa were also cursed along with me?")
player("...How did you know that?")
npc("Ha ha ha! Oh, the curse cut deeper than I had previously thought!")
npc("Stranger, this news has brought me a ray of sunshine in an otherwise dreary millennium! Please, ask any question you wish!")
options(
DialogueOption("tellmeyourstory", "Tell me your story", skipPlayer = true),
DialogueOption("goodbye", "Goodbye then", skipPlayer = true),
)
label("goodbye")
player("Well, that's all fascinating, but I just don't particularly care. Bye-bye.")
label("tellmeyourstory")
player("Erm... Thanks, I think. So what exactly happened on that day you were all cursed?")
player("I know that Valdez discovered the Staff of Armadyl, was robbed by Rennard, who then sent Kharrim to tell Zamorak of it.")
player("Meanwhile Lennissa heard of the sale, and informed Dhalak who placed an enchantment upon it so that its power would be hidden.")
player("I still don't know what happened with the staff to cause this curse, or what you had to do with it though...")
npc("Well stranger, rest yourself awhile, and I will recount a tale of the events of that day, for I was one of the few actually there when it happened...")
player("When what happened?")
npc("When my Lord Zamorak first got his taste of godhood!")
player("Wow. Sounds like quite the dinner party anecdote.")
npc("You can take the snide venom out of your voice whelp, you came to me; 'twas not the other way round.")
player("Okay, okay. Please continue.")
npc("Well now, let us see... As you may have heard tell, my affiliation lay with General Zamorak, a mighty warrior of the Mahjarrat tribe, and my skill on the battlefield had quickly brought")
npc("me to his attention.")
npc("So pleased was he with my bloodlust that he promoted me on the battlefield once to serve in his honour guard, and let me tell you, this was a rare honour indeed, for I was the only human chosen to take such a position.")
player("Really?")
npc("Oh yes, the dragon riders, Mahjarrat, demons and vampyre warriors made up the bulk of the force, but I wager I was their equal in all ways of combat.")
npc("Ha, when I think of someone like Lucien struggling to lift a blade, in some ways I was even their better!")
player("Please continue.")
npc("Well anyway... Myself and the rest of Zamoraks honour guard were formulating stratagems in our battle-tent, when that sneaky messenger Kharrim came in offering to sell us")
npc("the god-staff of Armadyl!")
npc("Naturally, we suspected that this was some trick by our Lord to test our loyalty...")
player("Yes, who was your lord? Everyone has been very evasive about that...")
npc("Quiet fool, all things in their course; You are disrupting my train of thought!")
player("Sorry...")
npc("Well anyway, we thought it was too good to be true, yet when we visited this scummy tavern we were amazed to discover there was no trick, no test of loyalty, no hidden trap:")
npc("Somehow this fool had actually managed to obtain the god-staff of Armadyl!")
npc("Its power was incredible, you could almost feel the energies crackling around it in the air!")
player("So what happened then?")
npc("Well, with such a weapon, the plans we had been developing for a rebellion against our lord could finally be put into action, but we knew that we would have to act swiftly, before he heard that we had a weapon")
npc("capable of defeating him, and we would have to act decisively, for even amongst our group there were still those loyal to the lord - such as that pathetic fool Azzanadra.")
player("So JUST WHO WAS this lord you speak of?")
npc("And I tell thee again, I will say when it is appropriate, now do not disrupt my tale!")
player("Okay, carry on then...")
npc("So anyway, Lord Zamorak and his most trusted compatriots, namely myself, Hazeel, Drakan, Thammaron and Zemouregal made plans to overthrow our lord using the god-weapon, and by pledging")
npc("allegiance to Zamorak as our master, were each to be given a large piece of land as our own in return.")
npc("We decided to move immediately, before anyone got cold feet, or any other parties could interfere in our work, and made haste towards the castle where our Lord lived.")
npc("If Lucien had not been otherwise occupied, he would have probably accompanied us with his magicks, but it turned out the foolish Dhalak had made his involvement unnecessary with some spells of his own allowing us to")
npc("get close enough to the castle with the staff without the Empty Lord being able to sense its presence.")
player("So your lord was the one that cursed you?")
npc("I am coming to that... So anyway, we made our way to the castle, under the pretense that we had war plans against Saradomin and the other deities to discuss.")
npc("As usual, our lord was guarded well, but this was why Zamorak had brought his most trusted fighters with him.")
npc("While we distracted the Empty Lord with our feints and attacks, and kept his bodyguards busy, Lord Zamorak outflanked him, unsheathed the staff and plunged it into his back!")
npc("Ah, it was a glorious sight... At that moment I was reminded for whom I fought, and why General Zamorak had earned his nickname 'the scourge' upon the battlefield...")
player("And the next thing you know you were cursed?")
npc("No, it was not quite that simple... The Empty Lord turned away from our battle, eyes burning with hatred, and towards Zamorak instead. Seeing this, we all fought with extra vigour, so that")
npc("General Zamorak would not face our lord alone, but we were outnumbered by many hundreds of warriors and demons, and could not reach him to assist him!")
player("So what then?")
npc("Why, it was the Empty Lord versus Zamorak, in single combat! And the sight of the battle will be with me forever more...")
npc("The Empty Lord was a powerful god, stronger than any of the others awake at that time, possibly even as strong as Guthix is, and Zamorak was but a mortal: A Mahjarrat warrior all the same, with all of the")
npc("strength and power that that entails, but mortal nonetheless, but to see him fight, you would not think of him as a 'mere' anything...")
npc("He was war itself! Flurry after flurry of blows he rained upon the Empty Lord, and the very castle walls shook and quivered with their power, but the Empty Lord would not fall!")
npc("Even with the weapon of a god embedded in his back, he fought on, and with each blow our victory seemed less and less certain...")
player("So what then?")
npc("Well, then a miracle happened. Or luck. Or natural justice.")
npc("You can call it what you want, but as the Empty Lords hands wrapped tightly around Zamorak's throat, Lord Zamorak, kicking and screaming defiantly and radiant in his anger until the very last, plunged towards the")
npc("Empty Lord, who seemed to lose his footing slightly, and fell in such a way so that the staff plunged deeper into his body, but also impaled Lord Zamorak with it at the same time...")
npc("And then...")
player("And then what?")
npc("And then nothing. There was a sudden flash of bright light, and then a sudden blink of cold darkness, and it was over.")
npc("Zamorak stood over the Empty Lord who was slowly... fading from existence... And as he faded, it seemed as though... It almost seemed as though Zamorak became more real,")
npc("more solid than he had been before...")
npc("And as the Empty Lord faded from this world completely, I heard his voice, almost a whisper upon the wind, cursing all who had helped Zamorak in his victory, which as you now tell me seems to have been all who")
npc("were responsible for the staff ending up in Zamorak's hands at the castle.")
npc("As I heard it, I saw that I too was fading, just as the Empty Lord had, and I called to my brethren for their assistance, but they could no longer hear my words, nor see my form.")
npc("It was then that the other gods appeared and banished Zamorak from the world completely for daring to kill one of their kind, although as it turned out it didn't quite work out that way for them, when he returned")
npc("stronger than ever, a god himself.")
npc("But the god wars were another story entirely...")
player("But... I don't understand... If it was Zamorak who used the weapon, then why was it only you who were cursed?")
player("And the other people who were cursed, why them? Why not the other Mahjarrat for example?")
player("And just who was this 'Empty Lord' you keep speaking of?")
npc("Well, in my life I was nothing but a warrior. I had no hidden knowledge, I didn't especially care about the gods or their magics, and I certainly didn't respect them.")
npc("Now in my... I suppose this is my death. I am but a shade on the wind, unnoticed by all who pass me, until today anyway, and the only answer I can give you is that the others who were with me, the")
npc("Mahjarrats and the Vampyre, they were beings of magic.")
npc("It runs through their very veins, and ebbs through their bones.")
npc("Who knows why the curse fell as it did? Perhaps as a mere human I was more susceptible to it, when they were not. Perhaps they too are cursed, but their life spans are so")
npc("long that it will be millennia before they feel it upon them. Perhaps because it did not affect them, it extended backwards through time, to the moment the staff was")
npc("taken from its rightful place, and all who had known of its theft were cursed too. Perhaps there are others also cursed, who played no part in this tale, and were merely unlucky enough to be")
npc("in the wrong place at the wrong time...")
npc("I don't know. Things do not always happen for a reason, just as tales do not always end with all of the loose ends neatly tied up and all answers supplied.")
npc("I have simply told you the events I was witness to, for I can do no more.")
npc("You have cheered me no end to let me know that this curse that has afflicted me has not left me alone here, in this void between worlds.")
exec { player, npc ->
setAttribute(player, CurseOfZaros.attributeViggoraSpoke, true)
addItemOrDrop(player, Items.GHOSTLY_CLOAK_6111)
}
npc("Perhaps I will hunt down these others who have also been cursed as I was, but I feel I must reward you for your efforts; Here, take my cloak, it is drenched in the blood of a")
npc("thousand foes, and may bring you luck in battle.")
player("So how can I break this curse?")
npc("Who knows? If it was the death curse of the Empty Lord, there may be no way to break it.")
npc("If it was not his death curse, and he is still alive but not on this world, then the only way to break it may be to bring him back here;")
npc("But I would rather stay cursed than suffer under his rule again...")
player("But WHO was this 'Empty Lord'? WHAT was his NAME?")
npc("You do not know? You have not guessed yet?")
npc("He was Zaros.")
label("subsequenttime")
player("Hello.")
npc("Hello yourself.")
player("I really liked your little story. Can you tell me another one?")
player("Preferably something with a big fight and lots of explosions!")
npc("...You are a very strange young @g[man/woman].")
label("lostghostlything")
player(ChatAnim.SAD, "Can I have that cloak back?")
exec { player, npc ->
addItemOrDrop(player, Items.GHOSTLY_CLOAK_6111)
}
npc("Hmph.", "I suppose.")
}
}