From e52be365d7d73e3f42beed3e80d9f7a8988fb93c Mon Sep 17 00:00:00 2001 From: Indio3 Date: Thu, 17 Sep 2026 11:57:29 -0400 Subject: [PATCH] feat: ecto and some port phat stuff/pre-quest interactions --- pack/varbit.pack | 2 +- pack/varp.pack | 4 +- scripts/_unpack/377/all.loc | 18 ++ scripts/_unpack/377/all.npc | 5 + scripts/_unpack/377/all.obj | 53 ++++ scripts/_unpack/377/all.varbit | 14 +- scripts/_unpack/377/all.varp | 5 +- scripts/ladders+stairs/scripts/stairs.rs2 | 24 -- .../quest_ahoy/configs/quest_ahoy.param | 3 + .../quests/quest_ahoy/scripts/ahoy_bank.rs2 | 33 ++ .../quests/quest_ahoy/scripts/ahoy_crone.rs2 | 7 + .../quest_ahoy/scripts/ahoy_disciple.rs2 | 80 +++++ .../quest_ahoy/scripts/ahoy_ectofunctus.rs2 | 286 ++++++++++++++++++ .../quest_ahoy/scripts/ahoy_ghost_captain.rs2 | 59 ++++ .../quest_ahoy/scripts/ahoy_ghost_farmer.rs2 | 8 + .../quest_ahoy/scripts/ahoy_ghost_guard.rs2 | 32 ++ .../scripts/ahoy_ghost_protestor.rs2 | 20 ++ .../quest_ahoy/scripts/ahoy_ghost_sailor.rs2 | 9 + .../quest_ahoy/scripts/ahoy_necrovarus.rs2 | 18 ++ .../quests/quest_ahoy/scripts/ahoy_oldman.rs2 | 7 + .../quests/quest_ahoy/scripts/quest_ahoy.rs2 | 159 ++++++++++ scripts/skill_prayer/configs/bones.obj | 13 +- 22 files changed, 822 insertions(+), 37 deletions(-) create mode 100644 scripts/quests/quest_ahoy/configs/quest_ahoy.param create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_bank.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_crone.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_disciple.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ectofunctus.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ghost_captain.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ghost_farmer.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ghost_guard.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ghost_protestor.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_ghost_sailor.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_necrovarus.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/ahoy_oldman.rs2 create mode 100644 scripts/quests/quest_ahoy/scripts/quest_ahoy.rs2 diff --git a/pack/varbit.pack b/pack/varbit.pack index e055672921..a86b045c05 100644 --- a/pack/varbit.pack +++ b/pack/varbit.pack @@ -202,7 +202,7 @@ 201=shadeattack 202=varbit_202 203=fenk_read_signpost -204=varbit_204 +204=ahoy_ectotokens_to_collect 205=ahoy_windspeed 206=ahoy_given_manual 207=ahoy_given_robes diff --git a/pack/varp.pack b/pack/varp.pack index b7eaa1e4f1..8446f28e0e 100644 --- a/pack/varp.pack +++ b/pack/varp.pack @@ -407,8 +407,8 @@ 406=tutorial_progress_overlay 407=varp_407 408=ahoy_varbits_1 -409=varp_409 -410=varp_410 +409=ahoy_varbits_2 +410=ahoy_bones_type 411=varp_411 412=varp_412 413=varp_413 diff --git a/scripts/_unpack/377/all.loc b/scripts/_unpack/377/all.loc index cf567a4b27..8bf828fafb 100644 --- a/scripts/_unpack/377/all.loc +++ b/scripts/_unpack/377/all.loc @@ -35884,6 +35884,8 @@ recol4s=7330 recol4d=4256 active=yes op1=Open +category=door_closed +param=next_loc_stage,ahoy_harbour_door_open [ahoy_harbour_door_open] name=Door @@ -35899,6 +35901,8 @@ recol4s=7330 recol4d=4256 active=yes op1=Close +category=door_opened +param=next_loc_stage,ahoy_harbour_door [normal_bed] name=Bed @@ -38134,6 +38138,7 @@ hillskew=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop2] name=Pool of Slime @@ -38144,6 +38149,7 @@ hillskew=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop3] name=Pool of Slime @@ -38156,6 +38162,7 @@ contrast=50 blockwalk=no length=2 width=2 +category=ahoy_gloop [green_gloop_flat] name=Pool of Slime @@ -38166,6 +38173,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_two] name=Pool of Slime @@ -38176,6 +38184,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_three] name=Pool of Slime @@ -38186,6 +38195,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_four] name=Pool of Slime @@ -38196,6 +38206,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_five] name=Pool of Slime @@ -38206,6 +38217,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_six] name=Pool of Slime @@ -38216,6 +38228,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_q] name=Pool of Slime @@ -38226,6 +38239,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_w] name=Pool of Slime @@ -38236,6 +38250,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_e] name=Pool of Slime @@ -38246,6 +38261,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_r] name=Pool of Slime @@ -38256,6 +38272,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [green_gloop_t] name=Pool of Slime @@ -38266,6 +38283,7 @@ forcedecor=yes ambient=90 contrast=50 blockwalk=no +category=ahoy_gloop [ahoy_tomb_wall] model=ahoy_tomb_wall diff --git a/scripts/_unpack/377/all.npc b/scripts/_unpack/377/all.npc index 2e85f724f9..5c9f951627 100644 --- a/scripts/_unpack/377/all.npc +++ b/scripts/_unpack/377/all.npc @@ -37362,6 +37362,9 @@ contrast=35 op1=Talk-To vislevel=hide head1=npc_1685_head +wanderrange=0 +moverestrict=nomove +timer=14 [ahoy_disciple] name=Ghost Disciple @@ -37783,6 +37786,8 @@ contrast=35 op1=Talk-To vislevel=hide head1=npc_1686_head +wanderrange=0 +moverestrict=nomove [ahoy_ghost_disguise] name=Ghost (?) diff --git a/scripts/_unpack/377/all.obj b/scripts/_unpack/377/all.obj index 381fddde2e..46e477a052 100644 --- a/scripts/_unpack/377/all.obj +++ b/scripts/_unpack/377/all.obj @@ -33301,6 +33301,8 @@ iop1=Bury weight=500g category=bones param=bone_exp,45 +param=ahoy_bones_type,7 +param=next_obj_stage,pot_bonemeal_wolf [cert_wolf_bones] certlink=wolf_bones @@ -36047,6 +36049,8 @@ iop1=Bury weight=1500g category=bones param=bone_exp,250 +param=ahoy_bones_type,22 +param=next_obj_stage,pot_bonemeal_beast [cert_tbwt_beast_bones] certlink=tbwt_beast_bones @@ -36064,6 +36068,8 @@ iop1=Bury weight=800g category=bones param=bone_exp,150 +param=ahoy_bones_type,8 +param=next_obj_stage,pot_bonemeal_jogre [cert_tbwt_jogre_bones] certlink=tbwt_jogre_bones @@ -36083,6 +36089,8 @@ iop1=Bury weight=800g category=bones param=bone_exp,160 +param=ahoy_bones_type,9 +param=next_obj_stage,pot_bonemeal_burnt_jogre [tbwt_burnt_jogre_bones_in_raw_karambwanji_paste] name=Pasty jogre bones @@ -36789,6 +36797,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,10 +param=next_obj_stage,pot_bonemeal_small_ninja_monkey [mm_medium_ninja_monkey_bones] name=Monkey bones @@ -36802,6 +36812,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,11 +param=next_obj_stage,pot_bonemeal_medium_ninja_monkey [mm_normal_gorilla_monkey_bones] name=Monkey bones @@ -36814,6 +36826,8 @@ model=obj_big_bones iop1=Bury weight=800g category=bones +param=ahoy_bones_type,12 +param=next_obj_stage,pot_bonemeal_normal_gorilla_monkey [mm_bearded_gorilla_monkey_bones] name=Monkey bones @@ -36826,6 +36840,8 @@ model=obj_big_bones iop1=Bury weight=800g category=bones +param=ahoy_bones_type,13 +param=next_obj_stage,pot_bonemeal_bearded_gorilla_monkey [mm_normal_monkey_bones] name=Monkey bones @@ -36838,6 +36854,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,14 +param=next_obj_stage,pot_bonemeal_normal_monkey [cert_mm_normal_monkey_bones] certlink=mm_normal_monkey_bones @@ -36855,6 +36873,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,15 +param=next_obj_stage,pot_bonemeal_small_ninja_monkey [mm_large_zombie_monkey_bones] name=Monkey bones @@ -36867,6 +36887,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,16 +param=next_obj_stage,pot_bonemeal_large_zombie_monkey [mm_skeleton_bones] name=Bones @@ -36881,6 +36903,8 @@ model=obj_sheepbonesa iop1=Bury weight=500g category=bones +param=ahoy_bones_type,17 +param=next_obj_stage,pot_bonemeal_skeleton [tbwt_cleaning_cloth] name=Cleaning cloth @@ -49626,6 +49650,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_bat] name=Bonemeal @@ -49641,6 +49666,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_big] name=Bonemeal @@ -49656,6 +49682,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_burnt] name=Bonemeal @@ -49671,6 +49698,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_burnt_jogre] name=Bonemeal @@ -49686,6 +49714,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_babydragon] name=Bonemeal @@ -49701,6 +49730,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_dragon] name=Bonemeal @@ -49716,6 +49746,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_wolf] name=Bonemeal @@ -49731,6 +49762,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_small_ninja_monkey] name=Bonemeal @@ -49746,6 +49778,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_medium_ninja_monkey] name=Bonemeal @@ -49761,6 +49794,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_normal_gorilla_monkey] name=Bonemeal @@ -49776,6 +49810,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_bearded_gorilla_monkey] name=Bonemeal @@ -49791,6 +49826,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_normal_monkey] name=Bonemeal @@ -49806,6 +49842,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_small_zombie_monkey] name=Bonemeal @@ -49821,6 +49858,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_large_zombie_monkey] name=Bonemeal @@ -49836,6 +49874,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_skeleton] name=Bonemeal @@ -49851,6 +49890,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [pot_bonemeal_jogre] name=Bonemeal @@ -49866,6 +49906,7 @@ model=obj_pot_flour members=yes iop2=Empty weight=1500g +category=bonemeal [ahoy_bone_key] name=Bone key @@ -56308,6 +56349,8 @@ iop1=Bury members=yes weight=800g category=bones +param=ahoy_bones_type,18 +param=next_obj_stage,pot_bonemeal_zogre [cert_zogre_bones] certlink=zogre_bones @@ -56596,6 +56639,8 @@ iop1=Bury members=yes weight=800g category=bones +param=ahoy_bones_type,19 +param=next_obj_stage,pot_bonemeal_ancestral_fayg [cert_zogre_ancestral_bones_fayg] certlink=zogre_ancestral_bones_fayg @@ -56616,6 +56661,8 @@ iop1=Bury members=yes weight=800g category=bones +param=ahoy_bones_type,20 +param=next_obj_stage,pot_bonemeal_ancestral_raurg [cert_zogre_ancestral_bones_raurg] certlink=zogre_ancestral_bones_raurg @@ -56636,6 +56683,8 @@ iop1=Bury members=yes weight=800g category=bones +param=ahoy_bones_type,21 +param=next_obj_stage,pot_bonemeal_ancestral_ourg [cert_zogre_ancestral_bones_ourg] certlink=zogre_ancestral_bones_ourg @@ -79610,6 +79659,8 @@ iop1=Bury members=yes weight=1500g category=bones +param=ahoy_bones_type,23 +param=next_obj_stage,pot_bonemeal_dagannoth [cert_dagannoth_king_bones] certlink=dagannoth_king_bones @@ -80814,6 +80865,8 @@ iop1=Bury members=yes weight=500g category=bones +param=ahoy_bones_type,24 +param=next_obj_stage,pot_bonemeal_wyvern [cert_granite_legs] certlink=granite_legs diff --git a/scripts/_unpack/377/all.varbit b/scripts/_unpack/377/all.varbit index ff8aae0a9d..398b5e78cc 100644 --- a/scripts/_unpack/377/all.varbit +++ b/scripts/_unpack/377/all.varbit @@ -988,7 +988,7 @@ basevar=fenk_flags startbit=23 endbit=23 -[varbit_204] +[ahoy_ectotokens_to_collect] basevar=ahoy_varbits_1 startbit=0 endbit=5 @@ -1059,32 +1059,32 @@ startbit=28 endbit=31 [varbit_218] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=10 endbit=12 [varbit_219] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=13 endbit=15 [varbit_220] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=16 endbit=18 [varbit_221] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=19 endbit=21 [varbit_222] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=22 endbit=24 [varbit_223] -basevar=varp_409 +basevar=ahoy_varbits_2 startbit=25 endbit=27 diff --git a/scripts/_unpack/377/all.varp b/scripts/_unpack/377/all.varp index a4f33df32b..12746295dc 100644 --- a/scripts/_unpack/377/all.varp +++ b/scripts/_unpack/377/all.varp @@ -691,9 +691,10 @@ transmit=yes [ahoy_varbits_1] transmit=yes -[varp_409] +[ahoy_varbits_2] -[varp_410] +[ahoy_bones_type] +scope=perm [varp_411] diff --git a/scripts/ladders+stairs/scripts/stairs.rs2 b/scripts/ladders+stairs/scripts/stairs.rs2 index 493fbc6118..64f75433c8 100644 --- a/scripts/ladders+stairs/scripts/stairs.rs2 +++ b/scripts/ladders+stairs/scripts/stairs.rs2 @@ -738,30 +738,6 @@ switch_coord (loc_coord) { case default : @unhandled_stairs(loc_coord); } -[oploc1,ahoy_cavern_stairs] -// arrive delay? -switch_coord (loc_coord) { - case default : @unhandled_stairs(loc_coord); -} - -[oploc1,ahoy_cavern_stairs_top] -// arrive delay? -switch_coord (loc_coord) { - case default : @unhandled_stairs(loc_coord); -} - -[oploc1,ahoy_tower_stairs_lv1] -// arrive delay? -switch_coord (loc_coord) { - case default : @unhandled_stairs(loc_coord); -} - -[oploc1,ahoy_tower_stairs_lv1_top] -// arrive delay? -switch_coord (loc_coord) { - case default : @unhandled_stairs(loc_coord); -} - [oploc1,dwarf_keldagrim_stairs_lower] // arrive delay? switch_coord (loc_coord) { diff --git a/scripts/quests/quest_ahoy/configs/quest_ahoy.param b/scripts/quests/quest_ahoy/configs/quest_ahoy.param new file mode 100644 index 0000000000..e73e680daa --- /dev/null +++ b/scripts/quests/quest_ahoy/configs/quest_ahoy.param @@ -0,0 +1,3 @@ +[ahoy_bones_type] +type=int +default=null \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_bank.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_bank.rs2 new file mode 100644 index 0000000000..360da26be4 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_bank.rs2 @@ -0,0 +1,33 @@ +[apnpc1,ahoy_ghost_banker] +if (npc_range(coord) > 2) { + p_aprange(2); + return; +} +if(~wearing_ghostspeak_amulet = ^false) { + @ahoy_ghostspeak; +} +@talk_to_banker; + +[apnpc3,ahoy_ghost_banker] +if (npc_range(coord) > 2) { + p_aprange(2); + return; +} +@ahoy_quickbank; + +[oploc1,ahoy_bankbooth] +if (npc_find(loc_coord, ahoy_ghost_banker, 2, 0) = true) { + if(~wearing_ghostspeak_amulet = ^false) { + @ahoy_ghostspeak; + } + @talk_to_banker; +} +@ahoy_quickbank; + +[oploc2,ahoy_bankbooth] @ahoy_quickbank; + +[label,ahoy_quickbank] +if(~wearing_ghostspeak_amulet = ^false) { + ~mesbox("The ghost banker wails incomprehensibly at you, but seems to understand that you wish to access your bank account. You can still quick-bank, but will have to communicate via a series of hand gestures."); +} +@openbank; \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_crone.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_crone.rs2 new file mode 100644 index 0000000000..035cd8ec08 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_crone.rs2 @@ -0,0 +1,7 @@ +[opnpc1,ahoy_crone] +~chatplayer("Hello, old woman."); + +def_int $rand = random(3); +if($rand = 0) ~chatnpc("I lived here when this was all just fields, you know."); +else if($rand = 1) ~chatnpc("When 100 years old you reach, look like a prune you will."); +else ~chatnpc("I'm over 100 years old, you know."); \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_disciple.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_disciple.rs2 new file mode 100644 index 0000000000..1ada31b9c8 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_disciple.rs2 @@ -0,0 +1,80 @@ +[opnpc1,ahoy_disciple] +if(~wearing_ghostspeak_amulet = ^false) { + @ahoy_ghostspeak; +} + +if(coordz(npc_coord) > 0) { + ~chatplayer("How do I use the bone grinder?"); + ~chatnpc("Put bones of any type into the machine's hopper, and then turn the handle to grind them. You will need a pot to empty the machine of ground up bones."); + return; +} + +def_int $rewarded_tokens = 0; +if(%ahoy_ectotokens_to_collect > 0) { + ~chatplayer("Can I have the tokens I have earned?"); + if(inv_itemspace(inv, ectotoken, %ahoy_ectotokens_to_collect, inv_size(inv)) = false) { + ~chatnpc("I have ectotokens waiting for you mortal, but you do not have room in your inventory for them."); + return; + } + $rewarded_tokens = %ahoy_ectotokens_to_collect; + %ahoy_ectotokens_to_collect = 0; + inv_add(inv, ectotoken, $rewarded_tokens); + ~chatnpc("Certainly, mortal. Here's ectotokens."); + return; +} + +~chatplayer("What is this strange fountain?"); +~chatnpc("This is the Ectofuntus, the most marvellous creation of Necrovarus, our glorious leader."); +@multi5("What is the Ectofuntus for?", disciple_ectofor, + "Where do I get ectoplasm from?", disciple_where, + "How do I grind bones?", disciple_howbones, + "How do I receive Ectotokens?", disciple_howtoken, + "Thanks for your time.", disciple_end); + + +[label,disciple_ectofor] +~chatplayer("What is the Ectofuntus for?"); +~chatnpc("It provides the power to keep us ghosts from passing over into the next plane of existence."); +~chatplayer("And how does it work?"); +~chatnpc("You have to pour a bucket of ectoplasm into the fountain, a pot of ground bones, and then worship at the Ectofuntus. A unit of unholy power will then be created."); +~chatplayer("Can you do it yourself?"); +~chatnpc("No, we must rely upon the living, as the worship of the undead no longer holds any inherent power."); +~chatplayer("Why would people waste their time helping you out?"); +~chatnpc("For every unit of power produced we will give you five Ectotokens. These tokens can be used in Port Phasmatys to purchase various services, not least of which includes access through the main toll gates."); +@multi5("What is the Ectofuntus for?", disciple_ectofor, + "Where do I get ectoplasm from?", disciple_where, + "How do I grind bones?", disciple_howbones, + "How do I receive Ectotokens?", disciple_howtoken, + "Thanks for your time.", disciple_end); + +[label,disciple_where] +~chatplayer("Where do I get ectoplasm from?"); +~chatnpc("Necrovarus sensed the power bubbling beneath our feet, and we delved long and deep beneath Port Phasmatys, until we found a pool of natural ectoplasm. You may find it by using the trapdoor over there."); +@multi5("What is the Ectofuntus for?", disciple_ectofor, + "Where do I get ectoplasm from?", disciple_where, + "How do I grind bones?", disciple_howbones, + "How do I receive Ectotokens?", disciple_howtoken, + "Thanks for your time.", disciple_end); + +[label,disciple_howbones] +~chatplayer("How do I grind bones?"); +~chatnpc("There is a bone grinding machine upstairs. Put bones of any type into the machine's hopper, and then turn the handle to grind them. You will need a pot to empty the machine of ground up bones."); +@multi5("What is the Ectofuntus for?", disciple_ectofor, + "Where do I get ectoplasm from?", disciple_where, + "How do I grind bones?", disciple_howbones, + "How do I receive Ectotokens?", disciple_howtoken, + "Thanks for your time.", disciple_end); + +[label,disciple_howtoken] +~chatplayer("How do I receive Ectotokens?"); +~chatnpc("We disciples keep track of how many units of power have been produced. Just talk to us once you have generated some and we will reimburse you with the correct amount of Ectotokens."); +~chatplayer("How do I generate units of power?"); +~chatnpc("You have to pour a bucket of ectoplasm into the fountain and then worship at the Ectofuntus with a pot of ground bones. This will create a unit of unholy power."); +@multi5("What is the Ectofuntus for?", disciple_ectofor, + "Where do I get ectoplasm from?", disciple_where, + "How do I grind bones?", disciple_howbones, + "How do I receive Ectotokens?", disciple_howtoken, + "Thanks for your time.", disciple_end); + +[label,disciple_end] +~chatplayer("Thanks for your time."); \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ectofunctus.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ectofunctus.rs2 new file mode 100644 index 0000000000..f64ba592ad --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ectofunctus.rs2 @@ -0,0 +1,286 @@ +[opheld1,ectophial] +def_int $slot = last_slot; +if (~wilderness_level(coord) > 20) { + mes("A mysterious force blocks your teleport spell!"); + mes("You can't use this teleport after level 20 wilderness."); + return; +} +if (~pre_tele_checks(coord) = false) { + return; +} + +// https://www.youtube.com/watch?v=6LNGbPzn2QI +def_coord $destination = map_findsquare(0_57_55_11_2, 0, 4, ^map_findsquare_lineofwalk); +mes("You empty the ectoplasm onto the ground around your feet..."); +inv_setslot(inv, $slot, ectophial_empty, 1); +~player_teleport_normal($destination); +mes("...and the world changes around you."); + +[oploc1,ahoy_ectofunctus] +if(inv_totalcat(inv, bonemeal) = 0 & inv_total(inv, bucket_ectoplasm) = 0) { + ~mesbox("You don't have any ectoplasm or crushed bones to put into the Ectofuntus."); + return; +} +@worship_ectofunctus; + +[oplocu,ahoy_ectofunctus] +if(last_useitem = ectophial_empty) { + inv_setslot(inv, last_useslot, ectophial, 1); + mes("You refill the ectophial from the Ectofuntus."); + return; +} +if(oc_category(last_useitem) ! bonemeal & last_useitem ! bucket_ectoplasm) { + ~mesbox("A Ghost Disciple waves at you angrily, indicating that you cannot put that in the Ectofuntus."); + return; +} +@worship_ectofunctus; // the bones you use here don't seem to matter, just picks best + +[label,worship_ectofunctus] +if(inv_totalcat(inv, bonemeal) = 0) { + ~mesbox("You need a pot of crushed bones to put into the Ectofuntus."); + return; +} +if(inv_total(inv, bucket_ectoplasm) = 0) { + ~mesbox("You need a bucket of ectoplasm to put into the Ectofuntus."); + return; +} +if(%ahoy_ectotokens_to_collect > 55) { // cap of 65, adds 5 each time + // https://youtu.be/dTLr_7HhgXw?si=R75uo5KpfONXgB_f&t=231 + ~mesbox("There isn't room to put any more in."); + return; +} +def_namedobj $bones; +def_int $xp = 0; +// seems to be a very fixed order? meaning you can have tied xp bonemeals of different types in whichever order within +// your inventory, and it will always prio this way, meaning it's probably done similarly to this +// TODO: recheck -> order of monkey bones, order big/jogre, order beast/gorilla, ninja/burnt jogre +if(inv_total(inv, pot_bonemeal_dragon) > 0) { + $bones = pot_bonemeal_dragon; + $xp = 2880; +} else if(inv_total(inv, pot_bonemeal_babydragon) > 0) { + $bones = pot_bonemeal_babydragon; + $xp = 1200; +} else if(inv_total(inv, pot_bonemeal_beast) > 0) { + $bones = pot_bonemeal_beast; + $xp = 1000; +} else if(inv_total(inv, pot_bonemeal_bearded_gorilla_monkey) > 0) { + $bones = pot_bonemeal_bearded_gorilla_monkey; + $xp = 800; +} else if(inv_total(inv, pot_bonemeal_normal_gorilla_monkey) > 0) { + $bones = pot_bonemeal_normal_gorilla_monkey; + $xp = 720; +} else if(inv_total(inv, pot_bonemeal_medium_ninja_monkey) > 0) { + $bones = pot_bonemeal_medium_ninja_monkey; + $xp = 720; +} else if(inv_total(inv, pot_bonemeal_small_ninja_monkey) > 0) { + $bones = pot_bonemeal_small_ninja_monkey; + $xp = 640; +} else if(inv_total(inv, pot_bonemeal_burnt_jogre) > 0) { + $bones = pot_bonemeal_burnt_jogre; + $xp = 640; +} else if(inv_total(inv, pot_bonemeal_jogre) > 0) { + $bones = pot_bonemeal_jogre; + $xp = 600; +} else if(inv_total(inv, pot_bonemeal_big) > 0) { + $bones = pot_bonemeal_big; + $xp = 600; +} else if(inv_total(inv, pot_bonemeal_bat) > 0) { + $bones = pot_bonemeal_bat; + $xp = 212; +} else if(inv_total(inv, pot_bonemeal_normal_monkey) > 0) { + $bones = pot_bonemeal_normal_monkey; + $xp = 200; +} else if(inv_total(inv, pot_bonemeal_small_zombie_monkey) > 0) { + $bones = pot_bonemeal_small_zombie_monkey; + $xp = 200; +} else if(inv_total(inv, pot_bonemeal_large_zombie_monkey) > 0) { + $bones = pot_bonemeal_large_zombie_monkey; + $xp = 200; +} else if(inv_total(inv, pot_bonemeal) > 0) { + $bones = pot_bonemeal; + $xp = 180; +} else if(inv_total(inv, pot_bonemeal_burnt) > 0) { + $bones = pot_bonemeal_burnt; + $xp = 180; +} else if(inv_total(inv, pot_bonemeal_wolf) > 0) { + $bones = pot_bonemeal_wolf; + $xp = 180; +} else if(inv_total(inv, pot_bonemeal_skeleton) > 0) { // unobtainable? + $bones = pot_bonemeal_skeleton; + $xp = 120; +} +if($bones = null) { // shouldnt ever happen... + return; +} +mes("You put some ectoplasm and bonemeal into the Ectofuntus, and"); +mes("worship it."); +stat_advance(prayer, $xp); +anim(ahoy_prayer, 0); +sound_synth(prayer_boost, 1, 0); +%ahoy_ectotokens_to_collect = add(%ahoy_ectotokens_to_collect, 5); +inv_del(inv, bucket_ectoplasm, 1); +inv_add(inv, bucket_empty, 1); +inv_del(inv, $bones, 1); +inv_add(inv, pot_empty, 1); + +[oplocu,ahoy_grinder_loader] +def_int $bones_type = oc_param(last_useitem, ahoy_bones_type); +if(oc_category(last_useitem) = bones) { + if($bones_type = null) { + // i don't think this happens generally, but there are some periods where bones + // can exist without a bonemeal, guessing NIH + ~displaymessage(^dm_default); + return; + } + if(%ahoy_grinder_status = 2) { + mes("You need to empty the grinder's bin before you put more bones in it."); + return; + } + if(%ahoy_grinder_status = 1) { + mes("There are already some in the grinder's hopper."); + return; + } + %ahoy_grinder_status = 1; + %ahoy_bones_type = $bones_type; + mes("You put some in the grinder's hopper."); + inv_delslot(inv, last_useslot); + anim(ahoy_bone_dump, 5); + sound_synth(fill_grinder, 1, 5); + return; +} +~displaymessage(^dm_default); + +[proc,get_hopper_bones]()(namedobj) +switch_int(%ahoy_bones_type) { + case 1 : return (bones); + case 2 : return (bones_burnt); + case 3 : return (bat_bones); + case 4 : return (big_bones); + case 5 : return (babydragon_bones); + case 6 : return (dragon_bones); + case 7 : return (wolf_bones); + case 8 : return (tbwt_jogre_bones); + case 9 : return (tbwt_burnt_jogre_bones); + case 10 : return (mm_small_ninja_monkey_bones); + case 11 : return (mm_medium_ninja_monkey_bones); + case 12 : return (mm_normal_gorilla_monkey_bones); + case 13 : return (mm_bearded_gorilla_monkey_bones); + case 14 : return (mm_normal_monkey_bones); + case 15 : return (mm_small_zombie_monkey_bones); + case 16 : return (mm_large_zombie_monkey_bones); + case 17 : return (mm_skeleton_bones); + case 18 : return (zogre_bones); + case 19 : return (zogre_ancestral_bones_fayg); + case 20 : return (zogre_ancestral_bones_raurg); + case 21 : return (zogre_ancestral_bones_ourg); + case 22 : return (tbwt_beast_bones); + case 23 : return (dagannoth_king_bones); + case 24 : return (wyvern_bones); +} +return (bones); + +[proc,get_hopper_bones_name]()(string) +def_namedobj $bones = ~get_hopper_bones; +if($bones = babydragon_bones) return ("baby dragon bones"); +return (lowercase(oc_name(~get_hopper_bones))); + + +[oploc1,ahoy_grinder_handle] +mes("You wind the grinder handle."); +anim(ahoy_bone_grind, 10); +sound_synth(grinder_grinding, 1, 10); +p_delay(2); +if(%ahoy_grinder_status = 1) { + %ahoy_grinder_status = 2; + mes("Some crushed <~get_hopper_bones_name> pour into the bin."); +} + +[oploc1,ahoy_grinder_chute] +if(%ahoy_grinder_status = 2) { + if(inv_total(inv, pot_empty) = 0) { + mes("You need an empty pot to put the crushed <~get_hopper_bones_name> into."); + return; + } + mes("You fill a pot with crushed <~get_hopper_bones_name>."); + inv_del(inv, pot_empty, 1); + if(oc_param(~get_hopper_bones, next_obj_stage) ! null) inv_add(inv, oc_param(~get_hopper_bones, next_obj_stage), 1); + %ahoy_grinder_status = 0; + %ahoy_bones_type = 0; + anim(ahoy_fillbucket_bonedust, 5); + sound_synth(grinder_empty, 1, 5); + return; +} +if(%ahoy_grinder_status = 1) { + mes("You need to wind the handle to grind the <~get_hopper_bones_name>."); + return; +} +mes("The grinder is already empty."); + +[oplocu,ahoy_grinder_chute] +if(last_useitem = pot_empty) { + p_oploc(1); + return; +} +~displaymessage(^dm_default); + +[oploc1,ahoy_cavern_stairs] +// arrive delay? +switch_coord (loc_coord) { + case 2_57_154_41_31 : p_teleport(3_57_154_44_31); + case 1_57_154_24_31 : p_teleport(2_57_154_23_30); + case 0_57_154_36_31 : p_teleport(1_57_154_39_31); + case default : @unhandled_stairs(loc_coord); +} + +[oploc1,ahoy_cavern_stairs_top] +switch_coord (loc_coord) { + case 3_57_154_41_31 : p_teleport(2_57_154_40_32); + case 2_57_154_24_31 : p_teleport(1_57_154_27_32); + case 1_57_154_36_31 : p_teleport(0_57_154_35_32); + case default : @unhandled_stairs(loc_coord); +} + +[oploc1,ahoy_trapdoor] +// no arrivedelay on this mes +mes("The trapdoor opens..."); +p_arrivedelay; +anim(human_openchest, 0); +sound_synth(trapdoor_open, 1, 0); +p_delay(0); +loc_change(ahoy_trapdoor_open, 500); + +[oploc1,ahoy_trapdoor_open] +mes("You climb down through the trapdoor..."); +p_teleport(3_57_154_21_32); + +[oploc2,ahoy_trapdoor_open] +// no arrivedelay on this mes +mes("You close the trapdoor."); +p_arrivedelay; +anim(human_closechest, 0); +sound_synth(trapdoor_close, 1, 0); +p_delay(0); +loc_change(ahoy_trapdoor, 500); + +[oploc1,ahoy_ladder_from_cellar] +p_arrivedelay; +~climb_ladder(0_57_54_6_63, true); + +[aplocu,_ahoy_gloop] +def_int $slot = last_useslot; +if(last_useitem = bucket_empty) { + // weakqueued by osrs release, but not in 2006 https://youtu.be/dTLr_7HhgXw?si=EtqutsAvY2BkF_jG&t=194 + anim(human_pickupfloor, 0); // sequence id=quest_ahoy_human_filling_bucket (4471) sept 2006 + p_delay(1); + mes("You fill the bucket with ectoplasm."); + inv_setslot(inv, $slot, bucket_ectoplasm, 1); + sound_synth(fill_ectoplasm, 0, 0); + return; +} +~displaymessage(^dm_default); + +[oploc1,ahoy_tower_stairs_lv1] +p_teleport(movecoord(coord, 0, 1, 5)); + +[oploc1,ahoy_tower_stairs_lv1_top] +p_teleport(movecoord(coord, 0, -1, -5)); diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ghost_captain.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_captain.rs2 new file mode 100644 index 0000000000..9bdd76d7c4 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_captain.rs2 @@ -0,0 +1,59 @@ +[opnpc1,ahoy_ghost_captain_1] +def_int $op; +// dragontooth island +if(inzone(0_59_55_0_0, 0_59_55_63_63, npc_coord) = true) { + $op = ~p_choice2("Can you take me back to Phasmatys, now?", 1, "There isn't much on this island, is there?", 2); + if($op = 1) { + ~chatplayer("Can you take me back to Phasmatys, now?"); // bored in osrs + if(~wearing_ghostspeak_amulet = ^false) { + ~mesbox("The ghost sailor wails at you incomprehensibly, and points at the boat, nodding his ghostly head."); + } else { + ~chatnpc("Yes, climb in."); + } + if_close; + if_openmain(ahoy_blackout); + if_settext(ahoy_blackout:com_1, ""); + p_delay(2); + if_settext(ahoy_blackout:com_1, "After a long boat trip you return to Port Phasmatys..."); + p_delay(2); + if_close; + p_teleport(0_57_54_54_31); + } else if ($op = 2) { + ~chatplayer("There isn't much on this island, is there?"); + if(~wearing_ghostspeak_amulet = ^false) { + ~chatnpc("Woooo wooo wooooo woooo."); + } else { + ~chatnpc("Beautiful isn't it?"); + ~chatplayer("But it cost me a lot of ectotokens to get here!"); + ~chatnpc("Worth every token, if you ask me."); + } + } + return; +} +if(~wearing_ghostspeak_amulet = ^false) { + ~chatnpc("Woooo wooo wooooo woooo."); + return; +} +~chatplayer("Where do you sail to, in such a small boat?"); +~chatnpc("Would you like to visit Dragontooth Island? It is a most pleasant island in the sea between Morytania and the lands of the east."); +~chatplayer("How much does it cost?"); +~chatnpc("It'll cost you 25 ectotokens for the return trip."); + +if(inv_total(inv, ectotoken) > 1) $op = ~p_choice2("I have the ectotokens here - please take me to Dragontooth Island.", 1, "No thanks, not at the moment.", 2); +else $op = 2; + +switch_int($op) { + case 1 : + ~chatplayer("I have the ectotokens here - please take me to Dragontooth Island."); + inv_del(inv, ectotoken, 25); + if_close; + if_openmain(ahoy_blackout); + if_settext(ahoy_blackout:com_1, ""); + p_delay(2); + if_settext(ahoy_blackout:com_1, "After a long boat trip you arrive at Dragontooth Island..."); + p_delay(2); + if_close; + p_teleport(0_59_55_16_39); + case 2 : + ~chatplayer("No thanks, not at the moment."); +} \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ghost_farmer.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_farmer.rs2 new file mode 100644 index 0000000000..65ae4952e0 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_farmer.rs2 @@ -0,0 +1,8 @@ +[opnpc1,ahoy_ghost_farmer] +// osrs +~chatplayer("Your animals don't look too healthy."); +~chatnpc("It's that fountain thingy in the temple to the east. It's turned them all into zombies."); +~chatplayer("What use are zombie animals?"); +~chatnpc("None at all, mate, except that those worshippers at that temple keep comin' and killin' 'em all for their bones. Don't ask me why."); +~chatplayer("But you're a ghost - surely you know|something about it."); +~chatnpc("I don't know nuthin' about nuthin'. Oim a simple ghost with simple needs. All I know is, years ago, that temple started glowing green and, a few months later, I woke up dead. That's all there is to it."); \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ghost_guard.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_guard.rs2 new file mode 100644 index 0000000000..7c4413a3f4 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_guard.rs2 @@ -0,0 +1,32 @@ +[opnpc1,ahoy_ghost_guard] +if(~wearing_ghostspeak_amulet = ^false) { + ~mesbox("The ghostly guards wail at you incomprehensibly, and though you cannot understand their exact words you understand their meaning - you may not pass the barriers of Port Phasmatys."); + return; +} +~chatnpc("All visitors to Port Phasmatys must pay a toll charge of 2 Ectotokens."); +def_int $op; +if(inv_total(inv, ectotoken) > 1) $op = ~p_choice3("I would like to enter Port Phasmatys - here's 2 Ectotokens.", 3, "I'm not paying you Ectotokens just to go through a gate.", 4, "Where can I get Ectotokens?", 2); +else $op = ~p_choice2("I don't have that many Ectotokens.", 1, "Where can I get Ectotokens?", 2); + +switch_int($op) { + case 1 : + ~chatplayer("I don't have that many Ectotokens."); + ~chatnpc("In that case, you need to go to the Temple and earn some. Talk to the disciples - they will tell you how."); + case 2 : + ~chatplayer("Where can I get Ectotokens?"); + ~chatnpc("You need to go to the Temple and earn some. Talk to the disciples - they will tell you how."); + case 3 : + ~chatplayer("I would like to enter Port Phasmatys - here's 2 Ectotokens."); + if_close; + inv_del(inv, ectotoken, 2); + if(npc_coord = 0_57_54_13_52) { + p_teleport(movecoord(npc_coord, -1, 0, 0)); + } else { + p_teleport(movecoord(npc_coord, 1, 0, 0)); + } + p_delay(0); + p_teleport(movecoord(coord, 0, 0, -1)); + case 4 : + ~chatplayer("I'm not paying you Ectotokens just to go through a gate."); + ~chatnpc("Sorry - it's Town Policy."); +} \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ghost_protestor.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_protestor.rs2 new file mode 100644 index 0000000000..57064c73cc --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_protestor.rs2 @@ -0,0 +1,20 @@ +[opnpc1,ahoy_ghost_protestor] +if(~wearing_ghostspeak_amulet = ^false) { + @ahoy_ghostspeak; +} + +~chatnpc("Will you join with me and protest against the evil ban of Necrovarus and his disciples?"); +~chatplayer("I'm sorry, I don't really think I should get involved."); +~chatnpc("Ah, the youth of today - so apathetic to politics."); + +[ai_timer,ahoy_ghost_protestor] +switch_int(random(8)) { + case 0 : npc_say("Down with Necrovarus!!"); + case 1 : npc_say("Rise up my fellow ghosts, and we shall be victorious!!"); + case 2 : npc_say("Power to the Ghosts!!"); + case 3 : npc_say("Rise together, Ghosts without a cause!!"); + case 4 : npc_say("United we conquer - divided we fall!!"); + case 5 : npc_say("We shall overcome!!"); + case 6 : npc_say("Let Necrovarus know we want out!!"); + case 7 : npc_say("Don't stay silent - victory in numbers!!"); +} \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_ghost_sailor.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_sailor.rs2 new file mode 100644 index 0000000000..85113511eb --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_ghost_sailor.rs2 @@ -0,0 +1,9 @@ +[opnpc1,ahoy_ghost_sailor] +if(~wearing_ghostspeak_amulet = ^false) { + ~chatnpc("Woooo wooo wooooo woooo."); + return; +} +~chatplayer("Hi there. Why do you still bother having ships here? I mean - you're dead, what use are they to you?"); +~chatnpc("We keep ships because we still need trade in Phasmatys. Every trader that comes to Phasmatys is made to worship the Ectofuntus, so that the Ectopower doesn't run out."); +~chatplayer("So, without traders to worship in the Temple you're history, right?"); +~chatnpc("Aye, matey."); diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_necrovarus.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_necrovarus.rs2 new file mode 100644 index 0000000000..38a492b4b3 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_necrovarus.rs2 @@ -0,0 +1,18 @@ +[opnpc1,ahoy_necrovarus] +if(~wearing_ghostspeak_amulet = ^false) { + @ahoy_ghostspeak; +} + +switch_int(~p_choice3("What is this place?", 1, "What happened to everyone here?", 2, "How do I get into the town?", 3)) { + case 1 : ~chatplayer("What is this place?"); + case 2 : ~chatplayer("What happened to everyone here?"); + case 3 : ~chatplayer("How do I get into the town?"); +} + +switch_int(random(5)) { + case 0 : ~chatnpc("Speak to me again and I will rend the soul from your flesh."); + case 1 : ~chatnpc("Nobody speaks to me unless I speak to them!!!"); + case 2 : ~chatnpc("I do not answer questions, mortal fool!!"); + case 3 : ~chatnpc("I will answer questions when you are dead!!"); + case 4 : ~chatnpc("You dare to speak to me??? Have you lost your wits????"); +} \ No newline at end of file diff --git a/scripts/quests/quest_ahoy/scripts/ahoy_oldman.rs2 b/scripts/quests/quest_ahoy/scripts/ahoy_oldman.rs2 new file mode 100644 index 0000000000..3f616f14e7 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/ahoy_oldman.rs2 @@ -0,0 +1,7 @@ +[opnpc1,ahoy_oldman] +~chatplayer("What are you doing on this shipwreck?"); +~chatnpc("Shipwreck?!? Not shipwreck, surely not! Just in port, that's all!"); +~chatplayer("Don't be silly - half the ship's missing!"); +~chatnpc("No no no - the captain's just waiting for the wind to change, then we're off!"); +~chatplayer("You mean this skeleton sitting here in this chair?"); +~chatnpc("You must show more respect to the Captain."); diff --git a/scripts/quests/quest_ahoy/scripts/quest_ahoy.rs2 b/scripts/quests/quest_ahoy/scripts/quest_ahoy.rs2 new file mode 100644 index 0000000000..e594a933f3 --- /dev/null +++ b/scripts/quests/quest_ahoy/scripts/quest_ahoy.rs2 @@ -0,0 +1,159 @@ +[oploc1,ahoy_harbour_door] +// necrovarus door in the ectofuntus +if(loc_coord = 1_57_54_8_58) { + if(~wearing_ghostspeak_amulet = ^false) { + if(npc_find(coord, ahoy_disciple, 10, 0) = true) { + ~chatnpc("woooo wooooo woooo"); + ~mesbox("You get the general impression that this ghost doesn't want you to open the door."); + } + return; + } + if(npc_find(coord, ahoy_disciple, 10, 0) = true) { + ~chatnpc("What are you doing going in there?"); + ~chatplayer("Err, I was just curious..."); + ~chatnpc("Inside that room is a coffin, inside which lie the mortal remains of our most glorious master, Necrovarus. None may enter."); + } + return; +} +~open_door(500); + +[oploc1,ahoy_town_barrier] +if(coordz(coord) < coordz(loc_coord)) { + ~forcemove(movecoord(coord, 0, 0, 2)); + return; +} +if(npc_find(coord, ahoy_ghost_guard, 1, 0) = true) { + p_opnpc(1); +} + +[oploc1,ahoy_ghostship_ladder] +def_coord $dest = 1_56_55_24_23; +if(loc_coord = 0_56_55_29_23) $dest = 1_56_55_30_23; +p_arrivedelay; +~climb_ladder($dest, true); + +[oploc1,ahoy_ghostship_laddertop] +p_arrivedelay; +if(loc_coord = 1_56_55_29_23) p_teleport(movecoord(coord, -2, -1, 0)); +else p_teleport(movecoord(coord, 2, -1, 0)); + +[oploc1,ahoy_skull_captain] +~mesbox("The pirate captain ignores you and continues to stare lifelessly at nothing, as he has clearly been dead for some time."); + +[oploc1,ahoy_chest_closed] +~open_chest(ahoy_chest_open); + +[oploc1,ahoy_chest_open] +if(loc_coord = 0_56_55_22_44) { // rock island chest, stage check or w/e it needs + +} +mes("You search the chest but find nothing."); + +[oploc2,ahoy_chest_open] +~close_chest(ahoy_chest_closed); + +[oploc1,ahoy_chest_locked] +mes("The chest is locked."); + +[oploc1,ahoy_gangplank_shipwreck_on] +p_arrivedelay; // arrivedelay on both despite no seq +mes("You cross the gangplank."); +p_teleport(movecoord(coord, 0, -1, 3)); + +[oploc1,ahoy_gangplank_shipwreck_off] +p_arrivedelay; +mes("You cross the gangplank."); +p_teleport(movecoord(coord, 0, 1, -3)); + +[aploc1,ahoy_rock_invisible] +// recheck this stuff cause I think osrs fixed a lot of jank with it comparing to an old video +if(distance(coord, loc_coord) > 4) { + p_aprange(4); + return; +} +def_coord $start; +def_coord $dest; +def_int $dir; + +if(inzone(0_56_55_20_28, 0_56_55_22_31, coord) = true) { + // first section + $start = 0_56_55_20_30; + $dest = 0_56_55_18_30; + $dir = ^exact_west; +} else if(inzone(0_56_55_15_28, 0_56_55_18_33, coord) = true) { + // second section + if(loc_coord = 0_56_55_20_30 | loc_coord = 0_56_55_18_30) { + $start = 0_56_55_18_30; + $dest = 0_56_55_20_30; + $dir = ^exact_east; + } else { + $start = 0_56_55_15_32; + $dest = 0_56_55_13_32; + $dir = ^exact_west; + } +} else if(inzone(0_56_55_10_31, 0_56_55_13_35, coord) = true) { + // third section + if(loc_coord = 0_56_55_13_32 | loc_coord = 0_56_55_15_32) { + $start = 0_56_55_13_32; + $dest = 0_56_55_15_32; + $dir = ^exact_east; + } else { + $start = 0_56_55_11_34; + $dest = 0_56_55_11_36; + $dir = ^exact_north; + } +} else if(inzone(0_56_55_10_36, 0_56_55_14_39, coord) = true) { + // fourth section + if(loc_coord = 0_56_55_11_34 | loc_coord = 0_56_55_11_36) { + $start = 0_56_55_11_36; + $dest = 0_56_55_11_34; + $dir = ^exact_south; + } else { + $start = 0_56_55_13_39; + $dest = 0_56_55_13_41; + $dir = ^exact_north; + } +} else if(inzone(0_56_55_11_41, 0_56_55_15_45, coord) = true) { + // fifth section + if(loc_coord = 0_56_55_13_39 | loc_coord = 0_56_55_13_41) { + $start = 0_56_55_13_41; + $dest = 0_56_55_13_39; + $dir = ^exact_south; + } else { + $start = 0_56_55_15_44; + $dest = 0_56_55_17_44; + $dir = ^exact_east; + } +} else if(inzone(0_56_55_16_42, 0_56_55_22_47, coord) = true) { + $start = 0_56_55_17_44; + $dest = 0_56_55_15_44; + $dir = ^exact_west; +} +if(runenergy < 500) { + ~mesbox("You don't have enough energy to make that jump."); + return; +} + +if(coord ! $start) ~forcewalk2($start); + +if(%option_run = ^true) healenergy(-500); +~agility_exactmove(human_jump_stones, 26, 1, $start, $dest, 47, 59, $dir, false); + +if(stat_random(agility, 140, 232) = false) { + anim(human_falling_end, 0); + sound_synth(fall_land, 0, 0); + strongqueue(damage_player, 0, divide(stat(hitpoints), 5)); + p_delay(1); +} else { + stat_advance(agility, 100); +} + +[label,ahoy_ghostspeak] +~chatnpc("Woooo wooo wooooo woooo"); +~mesbox("You cannot understand the ghost."); + +[proc,wearing_ghostspeak_amulet]()(boolean) +if(inv_total(worn, amulet_of_ghostspeak) > 0 | inv_total(worn, amulet_of_ghostspeak_enchanted) > 0) { + return (true); +} +return (false); diff --git a/scripts/skill_prayer/configs/bones.obj b/scripts/skill_prayer/configs/bones.obj index b7222511eb..b8368c82a6 100644 --- a/scripts/skill_prayer/configs/bones.obj +++ b/scripts/skill_prayer/configs/bones.obj @@ -10,6 +10,8 @@ iop1=Bury weight=500g category=bones param=bone_exp,45 +param=ahoy_bones_type,1 +param=next_obj_stage,pot_bonemeal [bones_burnt] name=Burnt bones @@ -25,6 +27,8 @@ iop1=Bury weight=500g category=bones param=bone_exp,45 +param=ahoy_bones_type,2 +param=next_obj_stage,pot_bonemeal_burnt [bat_bones] name=Bat bones @@ -41,6 +45,8 @@ category=bones param=bone_exp,45 param=grindable_ingredient_refined,ground_bat_bones param=grindable_ingredient_message,You grind the bones to a powder. +param=ahoy_bones_type,3 +param=next_obj_stage,pot_bonemeal_bat [big_bones] name=Big bones @@ -54,6 +60,8 @@ weight=800g category=bones respawnrate=50 param=bone_exp,150 +param=ahoy_bones_type,4 +param=next_obj_stage,pot_bonemeal_big [babydragon_bones] name=Babydragon bones @@ -67,6 +75,8 @@ iop1=Bury weight=800g category=bones param=bone_exp,300 +param=ahoy_bones_type,5 +param=next_obj_stage,pot_bonemeal_babydragon [dragon_bones] name=Dragon bones @@ -80,4 +90,5 @@ members=yes weight=1500g category=bones param=bone_exp,720 - +param=ahoy_bones_type,6 +param=next_obj_stage,pot_bonemeal_dragon \ No newline at end of file