diff --git a/data/skill/prayer/altar.objs.toml b/data/skill/prayer/altar.objs.toml index 379e9979e7..1fbf5397b4 100644 --- a/data/skill/prayer/altar.objs.toml +++ b/data/skill/prayer/altar.objs.toml @@ -326,6 +326,10 @@ examine = "A shrine for the faithful to worship at." id = 55340 examine = "Shrine to the glory of Zaros." +[prayer_altar_zaros_senntisten] +id = 47120 +examine = "An ancient altar to the glory of Zaros." + [prayer_altar_warped_construction] id = 55667 examine = "A shrine for the faithful to worship at." diff --git a/game/src/main/kotlin/content/skill/prayer/bone/PrayerAltars.kt b/game/src/main/kotlin/content/skill/prayer/bone/PrayerAltars.kt index 4f2d8646f9..fbb78d42f2 100644 --- a/game/src/main/kotlin/content/skill/prayer/bone/PrayerAltars.kt +++ b/game/src/main/kotlin/content/skill/prayer/bone/PrayerAltars.kt @@ -1,5 +1,9 @@ package content.skill.prayer.bone +import content.skill.prayer.PrayerConfigs.PRAYERS +import content.skill.prayer.PrayerConfigs.USING_QUICK_PRAYERS +import content.skill.prayer.getActivePrayerVarKey +import content.skill.prayer.isCurses import world.gregs.voidps.engine.Script import world.gregs.voidps.engine.client.message import world.gregs.voidps.engine.entity.character.player.Player @@ -8,6 +12,18 @@ import world.gregs.voidps.engine.entity.character.player.skill.Skill class PrayerAltars : Script { init { + objectOperate("Pray", "prayer_altar_zaros,prayer_altar_zaros_senntisten") { + prayAtZaros() + } + + objectOperate("Pray-at", "prayer_altar_zaros,prayer_altar_zaros_senntisten") { + prayAtZaros() + } + + objectOperate("Convert", "prayer_altar_zaros,prayer_altar_zaros_senntisten") { + prayAtZaros() + } + objectOperate("Pray", "prayer_altar_*") { pray() } @@ -31,4 +47,22 @@ class PrayerAltars : Script { set("prayer_point_power_task", true) } } + + private fun Player.prayAtZaros() { + if (levels.getOffset(Skill.Prayer) < 0) { + levels.set(Skill.Prayer, levels.getMax(Skill.Prayer)) + set("prayer_point_power_task", true) + message("You recharge your Prayer points.") + } + switchPrayerBook() + } + + private fun Player.switchPrayerBook() { + clear(getActivePrayerVarKey()) + this[USING_QUICK_PRAYERS] = false + val curses = !isCurses() + set(PRAYERS, if (curses) "curses" else "normal") + anim("altar_pray") + message(if (curses) "You switch to the Ancient Curses." else "You switch to the normal Prayer book.") + } } diff --git a/game/src/test/kotlin/content/skill/prayer/PrayerTest.kt b/game/src/test/kotlin/content/skill/prayer/PrayerTest.kt index 0cef872cea..afc1dfcf3f 100644 --- a/game/src/test/kotlin/content/skill/prayer/PrayerTest.kt +++ b/game/src/test/kotlin/content/skill/prayer/PrayerTest.kt @@ -1,6 +1,9 @@ package content.skill.prayer import WorldTest +import content.skill.prayer.PrayerConfigs.ACTIVE_PRAYERS +import content.skill.prayer.PrayerConfigs.PRAYERS +import content.skill.prayer.PrayerConfigs.USING_QUICK_PRAYERS import interfaceOption import itemOnObject import itemOption @@ -9,6 +12,7 @@ import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.DynamicTest.dynamicTest import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestFactory +import world.gregs.voidps.engine.client.instruction.handle.interactObject import world.gregs.voidps.engine.entity.character.player.skill.Skill import world.gregs.voidps.engine.entity.character.player.skill.exp.Experience import world.gregs.voidps.engine.entity.obj.GameObjects @@ -18,6 +22,43 @@ import world.gregs.voidps.type.Tile internal class PrayerTest : WorldTest() { + @Test + fun `Home Zaros altar recharges and switches prayers`() { + val player = createPlayer() + player.experience.set(Skill.Prayer, Experience.MAXIMUM_EXPERIENCE) + player.levels.set(Skill.Prayer, 1) + val altar = GameObjects.add("prayer_altar_zaros", player.tile) + + player.interactObject(altar, "Convert") + tick() + + assertEquals(player.levels.getMax(Skill.Prayer), player.levels.get(Skill.Prayer)) + assertEquals("curses", player[PRAYERS]) + } + + @Test + fun `Senntisten Zaros altar recharges and switches prayers`() { + val player = createPlayer() + player.experience.set(Skill.Prayer, Experience.MAXIMUM_EXPERIENCE) + player.levels.set(Skill.Prayer, 1) + val altar = GameObjects.add("prayer_altar_zaros_senntisten", player.tile) + player.addVarbit(ACTIVE_PRAYERS, "protect_from_melee") + player[USING_QUICK_PRAYERS] = true + + player.interactObject(altar, "Pray") + tick() + + assertEquals(player.levels.getMax(Skill.Prayer), player.levels.get(Skill.Prayer)) + assertEquals("curses", player[PRAYERS]) + assertFalse(player.containsVarbit(ACTIVE_PRAYERS, "protect_from_melee")) + assertFalse(player[USING_QUICK_PRAYERS, false]) + + player.interactObject(altar, "Pray-at") + tick() + + assertFalse(player.isCurses()) + } + @Test fun `Active prayers drain prayer points`() { val player = createPlayer()