package content.global.skill.construction
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.diary.DiaryType
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Items
import core.game.world.GameWorld.settings
import core.tools.END_DIALOGUE
import core.tools.START_DIALOGUE
/**
* Represents the estate agent dialogue.
*
* @author Woah
*/
@Initializable
class EstateAgentDialogue : core.game.dialogue.DialoguePlugin {
/**
* Constructs a new `EstateAgentDialogue` `Object`.
*/
constructor() {
/**
* empty.
*/
}
/**
* Constructs a new `EstateAgentDialogue` `Object`.
*
* @param player the player.
*/
constructor(player: Player?) : super(player)
override fun newInstance(player: Player): core.game.dialogue.DialoguePlugin {
return EstateAgentDialogue(player)
}
override fun open(vararg args: Any): Boolean {
npc = args[0] as NPC
npc("Hello. Welcome to the " + settings!!.name + " Housing Agency! What", "can I do for you?")
stage = START_DIALOGUE
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
when (stage) {
START_DIALOGUE -> {
if (player.houseManager.hasHouse()) {
options(
"Can you move my house please?",
"Can you redecorate my house please?",
"Could I have a Construction guidebook?",
"Tell me about houses.",
"Tell me about that skillcape you're wearing.")
stage = 1
} else {
options("How can I get a house?", "Tell me about houses.")
stage = 2
}
}
1 -> when (buttonId) {
1 -> {
player("Can you move my house please?")
stage = 10
}
2 -> {
player("Can you redecorate my house please?")
stage = 30
}
3 -> {
player("Could I have a Construction guidebook?")
stage = 50
}
4 -> {
player("Tell me about houses!")
stage = 60
}
5 -> {
player("Tell me about that skillcape you're wearing!")
stage = if (core.game.global.Skillcape.isMaster(player, Skills.CONSTRUCTION)) 102 else 100
}
}
2 -> when (buttonId) {
1 -> {
player("How can I get a house?")
stage = 3
}
2 -> {
player("Tell me about houses.")
stage = 60
}
}
3 -> {
npc(
"I can sell you a starting house in Rimmington for",
"1000 coins. As you increase your construction skill you",
"will be able to have your house moved to other areas",
"and redecorated in other styles."
)
stage++
}
4 -> {
npc("Do you want to buy a starter house?")
stage++
}
5 -> {
options("Yes please!", "No thanks.")
stage++
}
6 -> when (buttonId) {
1 -> {
player("Yes please!")
stage = 7
}
2 -> {
player("No thanks.")
stage = END_DIALOGUE
}
}
7 -> {
if (player.inventory.contains(995, 1000)) {
player.inventory.remove(Item(995, 1000))
player.houseManager.createNewHouseAt(HouseLocation.RIMMINGTON)
npc(
"Thank you. Go through the Rimmington house portal",
"and you will find your house ready for you to start",
"building in it."
)
} else {
npc("You don't have enough money to buy a house,", "come back when you can afford one.")
}
stage = END_DIALOGUE
}
10 -> {
npc("Certainly. Where would you like it moved to?")
stage++
}
11 -> {
options(
"Rimmington (5,000)",
"Taverley (5,000)",
"Pollnivneach (7,500)",
"Rellekka (10,000)",
"More..." )
stage++
}
12 -> when (buttonId) {
1 -> {
player("To Rimmington please!")
stage = 15
}
2 -> {
player("To Taverly please!")
stage = 16
}
3 -> {
player("To Pollnivneach please!")
stage = 17
}
4 -> {
player("To Rellekka please!")
stage = 18
}
5 -> {
options("Brimhaven (15,000)", "Yanille (25,000)", "...Previous", "Back")
stage = 13
}
}
13 -> when (buttonId) {
1 -> {
player("To Brimhaven please!")
stage = 19
}
2 -> {
player("To Yanille please!")
stage = 20
}
3 -> {
options(
"Rimmington (5,000)",
"Taverley (5,000)",
"Pollnivneach (7,500)",
"Rellekka (10,000)",
"More..."
)
stage = 12
}
}
15 -> configureMove(HouseLocation.RIMMINGTON)
16 -> configureMove(HouseLocation.TAVERLY)
17 -> configureMove(HouseLocation.POLLNIVNEACH)
18 -> configureMove(HouseLocation.RELLEKKA)
19 -> configureMove(HouseLocation.BRIMHAVEN)
20 -> configureMove(HouseLocation.YANILLE)
30 -> {
npc(
"Certainly. My magic can rebuild the house in a",
"completely new style! What style would you like?" )
stage++
}
31 -> {
options(
"Basic wood (5,000)",
"Basic stone (5,000)",
"Whitewashed stone (7,500)",
"Fremennik-style wood (10,000)",
"More..."
)
stage++
}
32 -> when (buttonId) {
1 -> {
player("Basic wood please!")
stage = 35
}
2 -> {
player("Basic stone please!")
stage = 36
}
3 -> {
player("Whitewashed stone please!")
stage = 37
}
4 -> {
player("Fremennik-style wood please!")
stage = 38
}
5 -> {
options("Tropical wood (15,000)", "Fancy stone (25,000)", "Previous...", "Back")
stage = 33
}
}
33 -> when (buttonId) {
1 -> {
player("Tropical wood please!")
stage = 39
}
2 -> {
player("Fancy stone please!")
stage = 40
}
3 -> {
options(
"Basic wood (5,000)",
"Basic stone (5,000)",
"Whitewashed stone (7,500)",
"Fremennik-style wood (10,000)",
"More..."
)
stage = 32
}
}
35 -> redecorate(HousingStyle.BASIC_WOOD)
36 -> redecorate(HousingStyle.BASIC_STONE)
37 -> redecorate(HousingStyle.WHITEWASHED_STONE)
38 -> redecorate(HousingStyle.FREMENNIK_STYLE_WOOD)
39 -> redecorate(HousingStyle.TROPICAL_WOOD)
40 -> redecorate(HousingStyle.FANCY_STONE)
50 -> {
if (player.hasItem(CONSTRUCTION_GUIDE_8463)) {
npc("You've already got one!")
} else {
npc("Certainly.")
player.inventory.add(CONSTRUCTION_GUIDE_8463)
}
stage = END_DIALOGUE
}
60 -> {
npc(
"It all came out of the wizards' experiments. They found",
"a way to fold space, so that they could pack many",
"acres of land into an area only a foot across."
)
stage++
}
61 -> {
npc(
"They created several folded-space regions across",
"" + settings!!.name + ". Each one contains hundreds of small plots",
"where people can build houses."
)
stage++
}
62 -> {
player("Ah, so that's how everyone can have a house without", "them cluttering up the world!")
stage++
}
63 -> {
npc(
"Quite. The wizards didn't want to get bogged down",
"in the business side of things so they ",
"hired me to sell the houses."
)
stage++
}
64 -> {
npc(
"There are various other people across " + settings!!.name + " who can",
"help you furnish your house. You should start buying",
"planks from the sawmill operator in Varrock."
)
stage = END_DIALOGUE
}
100 -> {
npc(
"As you may know, skillcapes are only available to masters",
"in a skill. I have spent my entire life building houses and",
"now I spend my time selling them! As a sign of my abilites",
"I wear this Skillcape of Construction. If you ever have"
)
stage = 101
}
101 -> {
npc(
"enough skill to build a demonic throne, come and talk to",
"me and I'll sell you a skillcape like mine."
)
stage = END_DIALOGUE
}
102 -> {
interpreter.sendDialogues(
npc,
core.game.dialogue.FacialExpression.JOLLY,
"I see you have recently achieved 99 construction.",
"Would you like to buy a cape for 99,0000 gp?"
)
stage++
}
103 -> {
options("Yes, I'll pay the 99k", "No thanks, maybe later.")
stage++
}
104 -> when (buttonId) {
1 -> {
if (core.game.global.Skillcape.purchase(player, Skills.CONSTRUCTION)) {
npc("Here you go lad, enjoy!")
}
stage = END_DIALOGUE
}
2 -> {
player("No thanks, maybe later.")
stage = END_DIALOGUE
}
}
END_DIALOGUE -> end()
}
return true
}
/**
* Configures the move.
*
* @param location The house location.
*/
private fun configureMove(location: HouseLocation) {
//Achievement completion checks
val completedVarrockHouseMove = player.achievementDiaryManager.hasCompletedTask(DiaryType.VARROCK,0,11)
when {
//Player does not have required construction level
!location.hasLevel(player) -> {
npc(
"I'm afraid you don't have a high enough construction",
"level to move there. You need to have level " + location.levelRequirement + "." )
stage = 11
return
}
//Player's house location is already where they selected
location == player.houseManager.location -> {
npc("Your house is already there!")
stage = 11
return
}
//Player does not have enough coins to buy a house move
!player.inventory.contains(Items.COINS_995, location.cost) -> {
npc("Hmph. Come back when you have " + location.cost + " coins.")
stage = END_DIALOGUE
return
}
//Player meets all above requirements + check for achievement unlocks
else -> {
player.inventory.remove(Item(Items.COINS_995, location.cost))
player.houseManager.location = location
npc("Your house has been moved to " + location.getName() + ".")
if (player.location.isInRegion(REGION_VARROCK_NE) && !completedVarrockHouseMove) {
player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 0, 11)
}
stage = END_DIALOGUE
}
}
}
/**
* Redecorates the player's house.
*
* @param style The house style.
*/
private fun redecorate(style: HousingStyle) {
//Achievement completion checks
val completedVarrockHouseRedecorate = player.achievementDiaryManager.hasCompletedTask(DiaryType.VARROCK,2,7)
when {
//Player does not have required construction level
!style.hasLevel(player) -> {
npc("You need a Construction level of " + style.level + " to buy this style.")
stage = 31
return
}
//Player's house location is already where they selected
style == player.houseManager.style -> {
npc("Your house is already in that style!")
stage = 31
return
}
//Player does not have enough coins to buy a house move
!player.inventory.contains(Items.COINS_995, style.cost) -> {
npc("Hmph. Come back when you have " + style.cost + " coins.")
stage = END_DIALOGUE
return
}
//Player meets all above requirements + check for achievement unlocks
else -> {
player.inventory.remove(Item(Items.COINS_995, style.cost))
player.houseManager.redecorate(style)
npc("Your house has been redecorated.")
// Give your player-owned house a fancy stone or tropical wood
finish at the Varrock estate agent's
if (player.location.isInRegion(REGION_VARROCK_NE) && !completedVarrockHouseRedecorate) {
player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 2, 7)
}
stage = END_DIALOGUE
}
}
}
override fun getIds(): IntArray {
return intArrayOf(4247)
}
//Items
private val CONSTRUCTION_GUIDE_8463 = Item(Items.CONSTRUCTION_GUIDE_8463, 1)
//Region to check
private val REGION_VARROCK_NE = 12854
}