From 36ebef54429348dc79e0ae9d94ff33abf01ec801 Mon Sep 17 00:00:00 2001 From: noted-shark <186774109+noted-shark@users.noreply.github.com> Date: Fri, 17 Jan 2025 08:46:32 +1000 Subject: [PATCH] interim commit for legends --- data/src/pack/obj.pack | 24 +- data/src/pack/seq.pack | 8 +- data/src/scripts/_unpack/all.npc | 1445 ----------------- data/src/scripts/_unpack/all.seq | 8 +- .../general_use/scripts/water_sources.rs2 | 8 +- .../configs/kharazi_jungle.dbrow | 16 - .../quest_legends/configs/legends_zones.dbrow | 25 + .../configs/quest_legends.constant | 21 +- .../quest_legends/configs/quest_legends.loc | 7 + .../quest_legends/configs/quest_legends.npc | 1 + .../quest_legends/configs/quest_legends.obj | 30 +- .../quests/quest_legends/scripts/gujuo.rs2 | 213 ++- .../quest_legends/scripts/jungle_forester.rs2 | 1 - .../quest_legends/scripts/jungle_tree.rs2 | 197 +++ .../quest_legends/scripts/legends_guard.rs2 | 4 +- .../quest_legends/scripts/quest_legends.rs2 | 453 +++++- .../quests/quest_legends/scripts/ungadulu.rs2 | 122 ++ .../quest_upass/scripts/quest_upass.rs2 | 2 +- .../scripts/smithing/smithing.rs2 | 4 +- .../skill_woodcutting/configs/trees.dbrow | 19 + 20 files changed, 1004 insertions(+), 1604 deletions(-) delete mode 100644 data/src/scripts/quests/quest_legends/configs/kharazi_jungle.dbrow create mode 100644 data/src/scripts/quests/quest_legends/configs/legends_zones.dbrow create mode 100644 data/src/scripts/quests/quest_legends/scripts/jungle_tree.rs2 create mode 100644 data/src/scripts/quests/quest_legends/scripts/ungadulu.rs2 diff --git a/data/src/pack/obj.pack b/data/src/pack/obj.pack index bdd015d083..ca187fafc9 100644 --- a/data/src/pack/obj.pack +++ b/data/src/pack/obj.pack @@ -715,16 +715,16 @@ 714=radimus_notes 715=radimus_notes_complete 716=bullroarer -717=obj_717 -718=obj_718 -719=obj_719 +717=scrawled_note +718=a_scribbled_note +719=scrumpled_note 720=sketch -721=obj_721 -722=obj_722 -723=obj_723 -724=obj_724 -725=obj_725 -726=obj_726 +721=gold_bowl +722=blessed_gold_bowl +723=golden_bowl_water +724=golden_bowl_pure_water +725=blessed_golden_bowl_water +726=blessed_golden_bowl_pure_water 727=hollow_reed 728=cert_hollow_reed 729=shamans_tome @@ -733,15 +733,15 @@ 732=holy_water 733=smashed_glass 734=cert_smashed_glass -735=obj_735 -736=obj_736 +735=yommi_tree_seeds +736=yommi_tree_seeds_germinated 737=snakeweed_mixture 738=ardrigal_mixture 739=bravery_potion 740=blue_hat 741=chunk_of_crystal 742=hunk_of_crystal -743=lumb_of_crystal +743=lump_of_crystal 744=heart_crystal 745=glowing_heart_crystal 746=dark_dagger diff --git a/data/src/pack/seq.pack b/data/src/pack/seq.pack index c19ca7a631..75e0c74598 100644 --- a/data/src/pack/seq.pack +++ b/data/src/pack/seq.pack @@ -732,9 +732,9 @@ 731=seq_731 732=seq_732 733=human_createfire -734=seq_734 -735=seq_735 -736=seq_736 +734=human_knockback +735=human_knockback_long +736=human_knockback_long_end 737=seq_737 738=seq_738 739=seq_739 @@ -842,7 +842,7 @@ 841=earthwarrior_walk 842=earthwarrior_ready 843=earthwarrior_death -844=seq_844 +844=human_crawling 845=seq_845 846=seq_846 847=human_ready_scythe diff --git a/data/src/scripts/_unpack/all.npc b/data/src/scripts/_unpack/all.npc index 8228af1093..874447cef2 100644 --- a/data/src/scripts/_unpack/all.npc +++ b/data/src/scripts/_unpack/all.npc @@ -3900,39 +3900,6 @@ huntrange=2 // osrs stats and Vislvl match 1:1 // https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc npc_110 -[npc_143] -name=Jungle Wolf -desc=A rare jungle wolf - specific to the Kharazi jungle. -size=2 -walkanim=dog_walk -readyanim=dog_ready -op2=Attack -vislevel=64 -recol1s=15855 -recol1d=15777 -recol2s=23254 -recol2d=18917 -model1=model_2937_npc -wanderrange=6 -maxrange=8 -respawnrate=180 -hitpoints=69 -attack=50 -strength=55 -defence=52 -param=damagetype,^stab_style -param=attack_anim,dog_attack -param=defend_anim,dog_block -param=death_anim,dog_death -param=attack_sound,wolf_attack2 -param=defend_sound,wolf_hit -param=death_sound,wolf_death -param=death_drop,wolf_bones -huntmode=cowardly -huntrange=2 -// osrs stats and Vislvl match 1:1 -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc npc_232 - [npc_144] size=2 walkanim=scorpion_walk @@ -5881,1418 +5848,6 @@ param=attack_sound,stabsword_slash // param=defend_sound,big_bar_mail // osrs stats and Vislvl match 1:1 -[donovan] -vislevel=hide -name=Donovan the Family Handyman -desc=He looks very tired... -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=2114 -recol2s=8416 -recol2d=2114 -recol3s=2340 -recol3d=2114 -recol4s=11456 -recol4d=10570 -recol5s=32735 -recol5d=0 -model1=model_214_idk -model2=model_252_idk -model3=model_299_npc -model4=model_151_idk -model5=model_179_obj_wear -model6=model_267_idk -model7=model_185_obj_wear -model8=model_491_obj_wear -model9=model_320_idk -head1=model_52_idk_head -head2=model_84_idk_head - -[pierre] -vislevel=hide -name=Pierre -desc=His job doesn't look very fun... -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=2114 -recol2s=2340 -recol2d=2114 -recol3s=6144 -recol3d=2114 -recol4s=13600 -recol4d=2114 -model1=model_230_idk -model2=model_246_idk -model3=model_295_obj_wear -model4=model_150_obj_wear -model5=model_179_obj_wear -model6=model_275_idk -model7=model_185_obj_wear -model8=model_236_obj_wear -model9=model_322_idk -head1=model_63_idk_head -head2=model_68_obj_wear - -[hobbes] -vislevel=hide -name=Hobbes -desc=He looks kind of stuck up... -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=32767 -recol2s=14724 -recol2d=2114 -recol3s=15648 -recol3d=31649 -recol4s=15846 -recol4d=32767 -recol5s=2340 -recol5d=2114 -recol6s=14801 -recol6d=2114 -model1=model_215_idk -model2=model_247_idk -model3=model_292_idk -model4=model_163_idk -model5=model_176_idk -model6=model_267_idk -model7=model_185_obj_wear -model8=model_327_idk -head1=model_53_idk_head -head2=model_79_idk_head - -[louisa] -vislevel=hide -name=Louisa -desc=She looks like she enjoys her job. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=16883 -recol2s=14724 -recol2d=2114 -recol3s=2340 -recol3d=2114 -recol4s=14801 -recol4d=24075 -model1=model_378_idk -model2=model_465_npc -model3=model_332_idk -model4=model_353_idk -model5=model_419_idk -model6=model_358_idk -model7=model_483_npc -head1=model_103_idk_head -param=death_sound,female_death - -[mary] -vislevel=hide -name=Mary -desc=She looks very nervous... -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=2114 -recol2s=8420 -recol2d=32767 -recol3s=2340 -recol3d=2114 -recol4s=14801 -recol4d=24075 -model1=model_391_idk -model2=model_475_obj_wear -model3=model_351_idk -model4=model_353_idk -model5=model_429_idk -model6=model_358_idk -model7=model_483_npc -model8=model_414_npc -head1=model_114_idk_head -param=death_sound,female_death - -[stanford] -vislevel=hide -name=Stanford -desc=He looks like he spends a lot of time outdoors. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=8416 -recol1d=2114 -recol2s=14801 -recol2d=2114 -recol3s=7298 -recol3d=2114 -recol4s=2340 -recol4d=2114 -recol5s=24075 -recol5d=14592 -model1=model_203_idk -model2=model_251_idk -model3=model_315_npc -model4=model_173_npc -model5=model_179_obj_wear -model6=model_271_idk -model7=model_185_obj_wear -model8=model_496_obj_wear -model9=model_283_obj_wear -head1=model_45_idk_head -head2=model_83_idk_head - -[murder_guard] -vislevel=hide -name=Guard -desc=An officer of the Law. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=14801 -recol2s=15360 -recol2d=31 -recol3s=2340 -recol3d=14801 -model1=model_219_obj_wear -model2=model_248_idk -model3=model_301_obj_wear -model4=model_163_idk -model5=model_176_idk -model6=model_274_idk -model7=model_185_obj_wear -model8=model_519_obj_wear -model9=model_517_obj_wear -model10=model_323_obj_wear -head1=model_57_obj_wear -head2=model_80_idk_head - -[gossip] -vislevel=hide -name=Gossip -desc=One of those people who love to gossip! -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14801 -recol1d=24075 -recol2s=14724 -recol2d=2114 -recol3s=2340 -recol3d=15648 -model1=model_217_idk -model2=model_249_idk -model3=model_292_idk -model4=model_151_idk -model5=model_176_idk -model6=model_254_idk -model7=model_181_idk -head1=model_55_idk_head -head2=model_81_idk_head - -[anna] -vislevel=hide -name=Anna -desc=She's dressed in a red top and green trousers. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=31105 -recol2s=14724 -recol2d=30753 -recol3s=2340 -recol3d=992 -recol4s=14724 -recol4d=30753 -recol5s=14801 -recol5d=24075 -model1=model_390_idk -model2=model_471_idk -model3=model_332_idk -model4=model_353_idk -model5=model_419_idk -model6=model_358_idk -model7=model_417_npc -head1=model_113_idk_head -param=death_sound,female_death - -[murder_bob] -vislevel=hide -name=Bob -desc=He's dressed all in red. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=30753 -recol2s=14801 -recol2d=24075 -recol3s=2340 -recol3d=30753 -recol4s=6273 -recol4d=31105 -model1=model_215_idk -model2=model_248_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_267_idk -model7=model_185_obj_wear -head1=model_53_idk_head -head2=model_80_idk_head - -[carol] -vislevel=hide -name=Carol -desc=She's wearing a blue top and red trousers. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=31457 -recol2s=14724 -recol2d=31 -recol3s=2340 -recol3d=30753 -recol4s=14724 -recol4d=31 -recol5s=14801 -recol5d=24075 -model1=model_391_idk -model2=model_471_idk -model3=model_332_idk -model4=model_353_idk -model5=model_419_idk -model6=model_358_idk -model7=model_414_npc -head1=model_114_idk_head -param=death_sound,female_death - -[david] -vislevel=hide -name=David -desc=He's dressed all in green. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=992 -recol2s=14801 -recol2d=24075 -recol3s=2340 -recol3d=992 -recol4s=6273 -recol4d=31457 -model1=model_215_idk -model2=model_246_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_267_idk -model7=model_185_obj_wear -head1=model_53_idk_head - -[elizabeth] -vislevel=hide -name=Elizabeth -desc=She's wearing a green top and blue trousers. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=11264 -recol2s=14724 -recol2d=992 -recol3s=2340 -recol3d=31 -recol4s=14724 -recol4d=992 -recol5s=14801 -recol5d=24075 -model1=model_390_idk -model2=model_471_idk -model3=model_332_idk -model4=model_353_idk -model5=model_419_idk -model6=model_358_idk -head1=model_113_idk_head -param=death_sound,female_death - -[frank] -vislevel=hide -name=Frank -desc=He's dressed all in blue. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=31 -recol2s=14801 -recol2d=24075 -recol3s=2340 -recol3d=31 -recol4s=6273 -recol4d=11264 -model1=model_215_idk -model2=model_251_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_267_idk -model7=model_185_obj_wear -head1=model_53_idk_head -head2=model_83_idk_head - -[sinclair_guard_dog] -name=Sinclair Guard dog -desc=Big, noisy, and scary looking! -walkanim=dog_walk -readyanim=dog_ready -vislevel=1 -model1=model_2936_npc -timer=40 -param=death_anim,dog_death - -[npc_822] -vislevel=hide -name=Ana -desc=She looks like a tourist. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=25313 -recol2s=2340 -recol2d=14724 -recol3s=6144 -recol3d=14724 -model1=model_399_idk -model2=model_471_idk -model3=model_348_idk -model4=model_353_idk -model5=model_428_idk -model6=model_361_obj_wear -model7=model_509_obj_wear -head1=model_118_idk_head -wanderrange=3 -param=death_sound,female_death - -[anabarrel] -vislevel=hide -op1=Talk-to -recol1s=6273 -recol1d=25313 -recol2s=2340 -recol2d=14724 -recol3s=6144 -recol3d=14724 -model1=model_361_obj_wear -head1=model_118_idk_head -head2=model_135_npc_head -wanderrange=0 -moverestrict=nomove - -[npc_824] -vislevel=hide -name=Female slave -desc=She looks like she's been down here a long time. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=2340 -recol1d=14724 -recol2s=6144 -recol2d=14724 -model1=model_393_idk -model2=model_471_idk -model3=model_348_idk -model4=model_353_idk -model5=model_428_idk -model6=model_361_obj_wear -model7=model_509_obj_wear -head1=model_115_idk_head -wanderrange=1 -param=death_sound,female_death - -[npc_825] -vislevel=hide -name=Male slave -desc=It looks like he's been here a long time. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=2340 -recol1d=14724 -recol2s=6144 -recol2d=14724 -model1=model_217_idk -model2=model_250_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_265_obj_wear -model7=model_185_obj_wear -model8=model_509_obj_wear -head1=model_55_idk_head -head2=model_82_idk_head -wanderrange=1 - -[npc_826] -vislevel=hide -name=Escaping slave. -desc=He's making a break for it! -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -vislevel=hide -op1=Talk-to -recol1s=14724 -recol1d=32767 -recol2s=2340 -recol2d=32767 -recol3s=7298 -recol3d=32767 -recol4s=14801 -recol4d=24075 -recol5s=6144 -recol5d=32767 -model1=model_217_idk -model2=model_250_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_265_obj_wear -model7=model_185_obj_wear -head1=model_55_idk_head -head2=model_82_idk_head - -[rowdy_slave] -name=Rowdy slave -desc=He looks a bit aggressive. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -op2=Attack -vislevel=15 -recol1s=2340 -recol1d=14724 -recol2s=6144 -recol2d=14724 -recol3s=24075 -recol3d=14596 -recol4s=15853 -recol4d=25313 -model1=model_217_idk -model2=model_250_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_265_obj_wear -model7=model_185_obj_wear -model8=model_509_obj_wear -head1=model_55_idk_head -head2=model_82_idk_head -wanderrange=3 -maxrange=40 -respawnrate=100 -hitpoints=16 -attack=7 -strength=7 -defence=7 -magic=0 -ranged=0 -param=damagetype,^crush_style -param=defend_anim,human_unarmedblock -param=attack_sound,baxe_crush -huntmode=aggressive_melee -huntrange=1 -// Unknown reason osrs side this npc use unarmed attacks --attack seq_422 defend seq_424-- -// Stats match osrs version but our version Vislvl is different. - -[npc_828] -name=Mercenary -desc=He looks a bit aggressive. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -op2=Attack -vislevel=40 -recol1s=2340 -recol1d=25313 -recol2s=14724 -recol2d=25313 -recol3s=24075 -recol3d=14596 -recol4s=15853 -recol4d=25313 -model1=model_230_idk -model2=model_246_idk -model3=model_294_obj_wear -model4=model_167_idk -model5=model_179_obj_wear -model6=model_254_idk -model7=model_185_obj_wear -model8=model_490_obj_wear -model9=model_517_obj_wear -model10=model_191_npc -head1=model_63_idk_head -head2=model_34_npc_head -wanderrange=3 -maxrange=3 -respawnrate=100 -hitpoints=60 -attack=32 -strength=32 -defence=39 -magic=0 -ranged=0 -param=attackbonus,9 -param=strengthbonus,14 -param=stabdefence,17 -param=slashdefence,15 -param=crushdefence,19 -param=magicdefence,-3 -param=rangedefence,19 -param=damagetype,^crush_style -param=attack_anim,human_sword_slash -param=defend_anim,human_sword_defend2 -param=attack_sound,hacksword_slash -// Stats match osrs version but our version Vislvl is different. - -[npc_829] -name=Mercenary -desc=He looks a bit aggressive. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -op2=Attack -vislevel=40 -recol1s=2340 -recol1d=25313 -recol2s=14724 -recol2d=25313 -recol3s=24075 -recol3d=14596 -recol4s=15853 -recol4d=25313 -model1=model_230_idk -model2=model_191_npc -model3=model_246_idk -model4=model_294_obj_wear -model5=model_167_idk -model6=model_179_obj_wear -model7=model_254_idk -model8=model_185_obj_wear -model9=model_490_obj_wear -model10=model_517_obj_wear -head1=model_34_npc_head -head2=model_63_idk_head -wanderrange=1 -maxrange=1 -respawnrate=100 -hitpoints=60 -attack=32 -strength=32 -defence=39 -magic=0 -ranged=0 -param=attackbonus,9 -param=strengthbonus,14 -param=stabdefence,17 -param=slashdefence,15 -param=crushdefence,19 -param=magicdefence,-3 -param=rangedefence,19 -param=damagetype,^crush_style -param=attack_anim,human_sword_slash -param=defend_anim,human_sword_defend2 -param=attack_sound,hacksword_slash -// Stats match osrs version but our version Vislvl is different. - -[npc_830] -name=Mercenary Captain -desc=He looks a bit aggressive. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -op2=Attack -op3=Watch -vislevel=53 -recol1s=2340 -recol1d=25313 -recol2s=14724 -recol2d=25313 -recol3s=24075 -recol3d=14596 -recol4s=8386 -recol4d=22689 -recol5s=15853 -recol5d=25313 -model1=model_230_idk -model2=model_191_npc -model3=model_247_idk -model4=model_294_obj_wear -model5=model_167_idk -model6=model_179_obj_wear -model7=model_254_idk -model8=model_185_obj_wear -model9=model_490_obj_wear -model10=model_517_obj_wear -model11=model_323_obj_wear -head1=model_63_idk_head -head2=model_34_npc_head -head3=model_79_idk_head -wanderrange=3 -maxrange=5 -respawnrate=50 -hitpoints=80 -attack=32 -strength=29 -defence=32 -magic=0 -ranged=0 -param=attackbonus,9 -param=strengthbonus,14 -param=stabdefence,17 -param=slashdefence,15 -param=crushdefence,19 -param=magicdefence,-3 -param=rangedefence,19 -param=damagetype,^slash_style -param=attack_anim,human_sword_slash -param=defend_anim,human_sword_defend2 -param=attack_sound,hacksword_slash -// Stats match osrs version but our version Vislvl is different. - -[npc_831] -name=Captain Siad -desc=He's in control of the whole mining camp. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -vislevel=hide -recol1s=14724 -recol1d=398 -recol2s=15855 -recol2d=398 -recol3s=2340 -recol3d=398 -recol4s=6144 -recol4d=32767 -recol5s=24075 -recol5d=14596 -model1=model_215_idk -model2=model_248_idk -model3=model_201_obj_wear -model4=model_292_idk -model5=model_320_idk -model6=model_170_idk -model7=model_176_idk -model8=model_254_idk -model9=model_185_obj_wear -head1=model_53_idk_head -head2=model_43_obj_wear -head3=model_80_idk_head -wanderrange=3 - -[npc_841] -vislevel=hide -name=Mine cart driver -desc=He looks busy attending to his cart. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=14724 -recol1d=32767 -recol2s=2340 -recol2d=32767 -recol3s=7298 -recol3d=32767 -recol4s=6144 -recol4d=32767 -recol5s=15649 -recol5d=32767 -model1=model_217_idk -model2=model_246_idk -model3=model_292_idk -model4=model_170_idk -model5=model_176_idk -model6=model_265_obj_wear -model7=model_185_obj_wear -head1=model_55_idk_head -wanderrange=3 - -[npc_842] -name=Rowdy Guard -desc=He looks a bit aggressive and rowdy. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -op2=Attack -vislevel=40 -recol1s=2340 -recol1d=25313 -recol2s=14724 -recol2d=25313 -recol3s=24075 -recol3d=14596 -model1=model_219_obj_wear -model2=model_246_idk -model3=model_294_obj_wear -model4=model_167_idk -model5=model_179_obj_wear -model6=model_254_idk -model7=model_185_obj_wear -model8=model_490_obj_wear -model9=model_517_obj_wear -head1=model_57_obj_wear -wanderrange=3 -maxrange=3 -hitpoints=60 -attack=32 -strength=32 -defence=32 -magic=0 -ranged=0 -param=attackbonus,9 -param=strengthbonus,14 -param=stabdefence,17 -param=slashdefence,15 -param=crushdefence,19 -param=magicdefence,-3 -param=rangedefence,19 -param=damagetype,^crush_style -param=attack_anim,human_sword_slash -param=defend_anim,human_sword_defend2 -param=attack_sound,hacksword_slash -// https://oldschool.runescape.wiki/w/Guard_(Desert_Mining_Camp)#Brown_hair -// stats taken here and param taken osrs desert mining camp guards. -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc npc_4654 - -[npc_852] -name=Ogre chieftain -desc=Tough looking. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op2=Attack -vislevel=70 -model1=model_2880_npc -model2=model_2876_npc -head1=model_141_npc_head -wanderrange=3 -maxrange=5 -respawnrate=600 -hitpoints=60 -attack=75 -strength=71 -defence=75 -param=attackbonus,5 -param=strengthbonus,7 -param=stabdefence,10 -param=slashdefence,21 -param=crushdefence,16 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,mace_crush -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -huntmode=cowardly -huntrange=2 -// Stats match osrs version but our version Vislvl is different. - -[npc_853] -vislevel=hide -name=Og -desc=A senior member of the ogre community. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -param=death_anim,giant_death -param=death_sound,giant_death -param=death_drop,big_bones - -[npc_854] -vislevel=hide -name=Grew -desc=Very probably an ogre. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -param=death_anim,giant_death -param=death_sound,giant_death -param=death_drop,big_bones - -[npc_855] -vislevel=hide -name=Toban -desc=Ogre-ish. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -param=death_anim,giant_death -param=death_sound,giant_death -param=death_drop,big_bones - -[npc_856] -name=Gorad -desc=Big, dumb and ugly. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op2=Attack -vislevel=58 -model1=model_2880_npc -model2=model_2876_npc -head1=model_141_npc_head -wanderrange=3 -maxrange=5 -respawnrate=60 -hitpoints=80 -attack=54 -strength=54 -defence=54 -param=attackbonus,8 -param=strengthbonus,6 -param=stabdefence,15 -param=slashdefence,27 -param=crushdefence,21 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,mace_crush -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// Stats match osrs version but our version Vislvl is different. - -[npc_857] -name=Ogre guard -desc=An ogre that guards. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -vislevel=74 -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackrate,6 -param=attackbonus,22 -param=strengthbonus,20 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// param taken city guard attack param take normal ogre - -[npc_858] -name=Ogre guard -desc=These ogres protect the city. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -vislevel=74 -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackrate,6 -param=attackbonus,22 -param=strengthbonus,20 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// param taken city guard attack param take normal ogre - -[npc_859] -name=Ogre guard -desc=An ogre that guards. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -vislevel=74 -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackrate,6 -param=attackbonus,22 -param=strengthbonus,20 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// param taken city guard attack param take normal ogre - -[npc_860] -name=Ogre guard -desc=An ogre that guards. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -vislevel=74 -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackrate,6 -param=attackbonus,22 -param=strengthbonus,20 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// param taken city guard attack param take normal ogre - -[npc_861] -name=Ogre guard -desc=An ogre that guards. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -vislevel=74 -model1=model_2880_npc -model2=model_2874_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackrate,6 -param=attackbonus,22 -param=strengthbonus,20 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// param taken city guard attack param take normal ogre -// stats taken here -- npc_4368 - npc_4372 -- -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc - -[npc_862] -name=City guard -desc=Tries to keep the peace. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op2=Attack -vislevel=74 -model1=model_2878_npc -model2=model_2876_npc -head1=model_141_npc_head -respawnrate=100 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackbonus,9 -param=strengthbonus,13 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,mace_crush -param=defend_sound,giant_hit -param=death_sound,giant_death -param=death_drop,big_bones -// Stats match osrs version but our version Vislvl is different. - -[npc_863] -vislevel=hide -name=Scared skavid -desc=Frightened looking. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_864] -vislevel=hide -name=Mad skavid -desc=Looks mad. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -recol1s=16871 -recol1d=9504 -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_865] -vislevel=hide -name=Skavid -desc=A skavid. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_866] -vislevel=hide -name=Skavid -desc=A skavid. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_867] -vislevel=hide -name=Skavid -desc=A skavid. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_868] -vislevel=hide -name=Skavid -desc=A skavid. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_869] -vislevel=hide -name=Skavid -desc=A skavid. -size=2 -walkanim=skavid_walk -readyanim=skavid_ready -op1=Talk-to -model1=model_2999_npc -head1=model_146_npc_head -param=death_anim,skavid_death -param=death_sound,imp_death - -[npc_870] -name=Enclave guard -desc=Big and ugly looking. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op2=Attack -vislevel=74 -model1=model_2880_npc -model2=model_2876_npc -head1=model_141_npc_head -wanderrange=1 -maxrange=3 -respawnrate=24 -hitpoints=80 -attack=70 -strength=70 -defence=70 -param=attackbonus,9 -param=strengthbonus,13 -param=stabdefence,13 -param=slashdefence,24 -param=crushdefence,19 -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,mace_stab -// param=defend_sound,blade3_mail -param=death_sound,giant_death -param=death_drop,big_bones -// Stats match osrs version but our version Vislvl is different. - -[npc_871] -name=Ogre shaman -desc=Seems intelligent... for an ogre. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op2=Attack -vislevel=113 -model1=model_2879_npc -model2=model_2877_npc -head1=model_141_npc_head -respawnrate=102 -hitpoints=99 -attack=99 -strength=99 -defence=99 -param=attack_anim,ogre_attack -param=magicattack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -param=defend_sound,giant_hit -param=death_sound,giant_death -// TODO monster examine spell -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc npc_4386 - 4396 - -[npc_872] -vislevel=hide -name=Watchtower wizard -desc=The hat is a dead give away. -walkanim=human_walk_f,human_walk_b,human_walk_l,human_walk_r -readyanim=human_ready -op1=Talk-to -recol1s=6273 -recol1d=20083 -recol2s=14724 -recol2d=239 -recol3s=2340 -recol3d=239 -model1=model_214_idk -model2=model_181_idk -model3=model_250_idk -model4=model_292_idk -model5=model_170_idk -model6=model_176_idk -model7=model_265_obj_wear -model8=model_202_obj_wear -model9=model_181_idk -model10=model_323_obj_wear -head1=model_52_idk_head -head2=model_82_idk_head -head3=model_44_obj_wear - -[npc_873] -name=Ogre trader -desc=Funnily enough, doesn't actually buy or sell ogres. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op1=Talk-to -op2=Attack -op3=Trade -vislevel=60 -model1=model_2878_npc -model2=model_2874_npc -head1=model_141_npc_head -wanderrange=2 -maxrange=4 -hitpoints=60 -attack=62 -strength=60 -defence=63 -// TODO attackrate some trader can attack player. -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -param=defend_sound,giant_hit -param=death_sound,giant_death -param=death_drop,big_bones -// stats taken here npc_4401 - npc_4405 -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc - -[npc_874] -name=Ogre merchant -desc=Funnily enough, doesn't actually buy or sell ogres. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op1=Talk-to -op2=Attack -op3=Trade -vislevel=60 -model1=model_2878_npc -model2=model_2874_npc -head1=model_141_npc_head -wanderrange=2 -maxrange=4 -hitpoints=60 -attack=62 -strength=60 -defence=63 -// TODO attackrate some trader can attack player. -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -param=defend_sound,giant_hit -param=death_sound,giant_death -param=death_drop,big_bones -// stats taken here npc_4401 - npc_4405 -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc - -[npc_875] -name=Ogre trader -desc=Funnily enough, doesn't actually buy or sell ogres. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op1=Talk-to -op2=Attack -op3=Trade -vislevel=60 -model1=model_2878_npc -model2=model_2874_npc -head1=model_141_npc_head -wanderrange=2 -maxrange=4 -hitpoints=60 -attack=62 -strength=60 -defence=63 -// TODO attackrate some trader can attack player. -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -param=defend_sound,giant_hit -param=death_sound,giant_death -param=death_drop,big_bones -// stats taken here npc_4401 - npc_4405 -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc - -[npc_876] -name=Ogre trader -desc=Funnily enough, doesn't actually buy or sell ogres. -size=2 -walkanim=ogre_walk -readyanim=ogre_ready -op1=Talk-to -op1=Talk-to -op2=Attack -op3=Trade -vislevel=60 -model1=model_2878_npc -model2=model_2874_npc -head1=model_141_npc_head -wanderrange=3 -maxrange=5 -hitpoints=60 -attack=62 -strength=60 -defence=63 -// TODO attackrate some trader can attack player. -param=damagetype,^crush_style -param=attack_anim,ogre_attack -param=defend_anim,ogre_block -param=death_anim,ogre_death -param=attack_sound,giant_attack -param=defend_sound,giant_hit -param=death_sound,giant_death -param=death_drop,big_bones -// stats taken here npc_4401 - npc_4405 -// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc - [green_dragon] size=4 walkanim=dragon_walk diff --git a/data/src/scripts/_unpack/all.seq b/data/src/scripts/_unpack/all.seq index 226aa184da..2e5d86e056 100644 --- a/data/src/scripts/_unpack/all.seq +++ b/data/src/scripts/_unpack/all.seq @@ -9747,7 +9747,7 @@ frame14=anim_575 frame15=anim_867 frame16=anim_1145 -[seq_734] +[human_knockback] righthand=hide lefthand=hide frame1=anim_1676 @@ -9785,7 +9785,7 @@ frame32=anim_1135 frame33=anim_1421 frame34=anim_1713 -[seq_735] +[human_knockback_long] replayoff=12 frame1=anim_1723 frame2=anim_2023 @@ -9800,7 +9800,7 @@ frame10=anim_2023 frame11=anim_2324 frame12=anim_602 -[seq_736] +[human_knockback_long_end] frame1=anim_1265 frame2=anim_1547 frame3=anim_1840 @@ -11427,7 +11427,7 @@ frame6=anim_1953 frame7=anim_2256 delay7=20000 -[seq_844] +[human_crawling] righthand=hide lefthand=hide frame1=anim_718 diff --git a/data/src/scripts/general_use/scripts/water_sources.rs2 b/data/src/scripts/general_use/scripts/water_sources.rs2 index b38b7a7e8d..0406e420d8 100644 --- a/data/src/scripts/general_use/scripts/water_sources.rs2 +++ b/data/src/scripts/general_use/scripts/water_sources.rs2 @@ -59,14 +59,18 @@ inv_setslot(inv, $use_slot, oc_param($used_with, changesto), 1); //new empty sou [oplocu,_watersource] switch_obj (last_useitem) { - case bucket_empty, jug_empty, vial_empty, bowl_empty : @fill_container_water(last_useitem); + case bucket_empty, jug_empty, vial_empty, bowl_empty, gold_bowl, blessed_gold_bowl : @fill_container_water(last_useitem); case default : ~displaymessage(^dm_default); } [label,fill_container_water](obj $container) def_string $source_name = lowercase(loc_name); def_string $container_name = lowercase(oc_name($container)); -if(compare($source_name, "well") = 0 & compare($container_name, "bucket") ! 0) { +if(compare($source_name, "well") = 0 & ($container = gold_bowl | $container = blessed_gold_bowl)) { + mes("If I drop my bowl down there I don't think I'm likely to get it back."); + return; +} +if(compare($source_name, "well") = 0 & $container = bucket_empty) { ~displaymessage(^dm_default); return; } diff --git a/data/src/scripts/quests/quest_legends/configs/kharazi_jungle.dbrow b/data/src/scripts/quests/quest_legends/configs/kharazi_jungle.dbrow deleted file mode 100644 index 75848a1b5c..0000000000 --- a/data/src/scripts/quests/quest_legends/configs/kharazi_jungle.dbrow +++ /dev/null @@ -1,16 +0,0 @@ -[kharazi_jungle_west] -table=coord_pair_table -data=coord_pair,0_43_45_5_2,0_43_45_63_55 - -[kharazi_jungle_middle] -table=coord_pair_table -data=coord_pair,0_44_45_0_2,0_44_45_63_55 - -[kharazi_jungle_east] -table=coord_pair_table -data=coord_pair,0_45_45_0_2,0_46_45_30_55 - -// for convenience - covers all 3 regions above -[kharazi_jungle] -table=coord_pair_table -data=coord_pair,0_43_45_5_2,0_46_45_30_55 \ No newline at end of file diff --git a/data/src/scripts/quests/quest_legends/configs/legends_zones.dbrow b/data/src/scripts/quests/quest_legends/configs/legends_zones.dbrow new file mode 100644 index 0000000000..c4986bd894 --- /dev/null +++ b/data/src/scripts/quests/quest_legends/configs/legends_zones.dbrow @@ -0,0 +1,25 @@ +[kharazi_jungle_west] +table=coord_pair_table +data=coord_pair,0_43_45_5_2,0_43_45_63_55 + +[kharazi_jungle_middle] +table=coord_pair_table +data=coord_pair,0_44_45_0_2,0_44_45_63_55 + +[kharazi_jungle_east] +table=coord_pair_table +data=coord_pair,0_45_45_0_2,0_46_45_30_55 + +// for convenience - covers all 3 regions above +[kharazi_jungle] +table=coord_pair_table +data=coord_pair,0_43_45_5_2,0_46_45_30_55 + +[legends_fire_wall] +table=coord_pair_table +data=coord_pair,0_43_145_36_48,0_43_145_45_49 +data=coord_pair,0_43_145_40_44,0_43_145_41_53 +data=coord_pair,0_43_145_37_45,0_43_145_44_52 +// there's a bug in osrs which considers this row of tiles to be +// inside the octagram even though they are not +data=coord_pair,0_43_145_36_37,0_43_145_36_44 \ No newline at end of file diff --git a/data/src/scripts/quests/quest_legends/configs/quest_legends.constant b/data/src/scripts/quests/quest_legends/configs/quest_legends.constant index 9f6494c5e0..8f3e613044 100644 --- a/data/src/scripts/quests/quest_legends/configs/quest_legends.constant +++ b/data/src/scripts/quests/quest_legends/configs/quest_legends.constant @@ -37,17 +37,20 @@ ^legends_jungle_west_mapped = 0 ^legends_jungle_middle_mapped = 1 ^legends_jungle_east_mapped = 2 +// Below are used to enable dialogue options with Gujuo, but are not tracked as part of quest progress ^legends_entered_cavern = 3 -// not sure on this one -^legends_asked_who = 4 - - -^legends_soul_rune_used = 3 -^legends_mind_rune_used = 4 -^legends_earth_rune_used = 5 -^legends_law_rune_1_used = 6 -^legends_law_rune_2_used = 7 +^legends_asked_ungadulu_where = 4 +^legends_asked_ungadulu_who = 5 +^legends_ungadulu_called_vacu = 6 +^legends_soul_rune_used = 7 +^legends_mind_rune_used = 8 +^legends_earth_rune_used = 9 +^legends_law_rune_1_used = 10 +^legends_law_rune_2_used = 11 // todo: check if gem puzzle progress is stored. wiki seems to suggest not +// 10 doses of holy water, decremented when using vial or extinguishing flames +^legends_golden_bowl_uses_start = 11 +^legends_golden_bowl_uses_end = 15 ^legends_required_questpoints = 107 diff --git a/data/src/scripts/quests/quest_legends/configs/quest_legends.loc b/data/src/scripts/quests/quest_legends/configs/quest_legends.loc index a2fc831154..653029ee5f 100644 --- a/data/src/scripts/quests/quest_legends/configs/quest_legends.loc +++ b/data/src/scripts/quests/quest_legends/configs/quest_legends.loc @@ -305,6 +305,8 @@ model=model_loc_2912 active=yes op1=Open op2=Search +category=double_door_open_and_close_left +param=next_loc_stage,legends_ancient_gate_1_open [legends_ancient_gate_2_closed] name=Ancient Gate @@ -312,6 +314,8 @@ model=model_loc_2913 active=yes op1=Open op2=Search +category=double_door_open_and_close_right +param=next_loc_stage,legends_ancient_gate_2_open [legends_ancient_gate_1_open] model=model_loc_2912 @@ -349,6 +353,7 @@ width=2 length=2 mapscene=11 op1=Smash-to-bits +category=legends_boulder [legends_boulder_2] name=Boulder @@ -358,6 +363,7 @@ width=2 length=2 mapscene=11 op1=Smash-to-bits +category=legends_boulder [legends_boulder_3] name=Boulder @@ -367,6 +373,7 @@ width=2 length=2 mapscene=11 op1=Smash-to-bits +category=legends_boulder [legends_ancient_gate_3_closed] name=Ancient Gate diff --git a/data/src/scripts/quests/quest_legends/configs/quest_legends.npc b/data/src/scripts/quests/quest_legends/configs/quest_legends.npc index ff7936f433..9e029b11e2 100644 --- a/data/src/scripts/quests/quest_legends/configs/quest_legends.npc +++ b/data/src/scripts/quests/quest_legends/configs/quest_legends.npc @@ -30,6 +30,7 @@ param=death_drop,wolf_bones huntmode=cowardly huntrange=2 // osrs stats and Vislvl match 1:1 +// https://raw.githubusercontent.com/Joshua-F/osrs-dumps/refs/heads/master/config/dump.npc npc_232 [gujuo] vislevel=hide diff --git a/data/src/scripts/quests/quest_legends/configs/quest_legends.obj b/data/src/scripts/quests/quest_legends/configs/quest_legends.obj index e153554c2c..44e665b13b 100644 --- a/data/src/scripts/quests/quest_legends/configs/quest_legends.obj +++ b/data/src/scripts/quests/quest_legends/configs/quest_legends.obj @@ -47,7 +47,7 @@ iop1=Swing weight=20g tradeable=no -[obj_717] +[scrawled_note] name=Scrawled note desc=A scrawled note with spidery writing on it. members=yes @@ -73,7 +73,7 @@ iop1=Read weight=20g tradeable=no -[obj_718] +[a_scribbled_note] name=A scribbled note desc=A scrawled note with spidery writing on it. members=yes @@ -99,7 +99,7 @@ iop1=Read weight=20g tradeable=no -[obj_719] +[scrumpled_note] name=Scrumpled note desc=A scrawled note with spidery writing on it. members=yes @@ -144,7 +144,7 @@ iop1=Look weight=20g tradeable=no -[obj_721] +[gold_bowl] name=Gold bowl desc=A specially made bowl constructed out of pure gold. cost=700 @@ -159,8 +159,9 @@ recol2d=31528 2dxan=204 weight=800g tradeable=no +param=changesto,golden_bowl_water -[obj_722] +[blessed_gold_bowl] name=Blessed gold bowl desc=A specially made bowl constructed out of pure gold and blessed. cost=700 @@ -175,8 +176,9 @@ recol2d=31528 2dxan=204 weight=800g tradeable=no +param=changesto,blessed_golden_bowl_water -[obj_723] +[golden_bowl_water] name=Golden bowl desc=A specially made golden bowl with water. cost=700 @@ -190,8 +192,9 @@ recol1d=31528 iop1=Empty weight=1kg tradeable=no +param=next_obj_stage,gold_bowl -[obj_724] +[golden_bowl_pure_water] name=Golden bowl desc=A specially made bowl constructed out of pure gold. It has pure water in it. cost=700 @@ -205,8 +208,9 @@ recol1d=31528 iop1=Empty weight=1kg tradeable=no +param=next_obj_stage,gold_bowl -[obj_725] +[blessed_golden_bowl_water] name=Golden bowl desc=A blessed golden bowl. It has water in it. cost=700 @@ -220,8 +224,9 @@ recol1d=31528 iop1=Empty weight=1kg tradeable=no +param=next_obj_stage,blessed_gold_bowl -[obj_726] +[blessed_golden_bowl_pure_water] name=Golden bowl desc=A blessed golden bowl. It has pure sacred water in it. cost=700 @@ -235,6 +240,7 @@ recol1d=31528 iop1=Empty weight=1kg tradeable=no +param=next_obj_stage,blessed_gold_bowl [hollow_reed] cost=2 @@ -346,7 +352,7 @@ model=model_2676_obj 2dxan=412 weight=2g -[obj_735] +[yommi_tree_seeds] name=Yommi tree seeds desc=These need to be germinated before they can be used. model=model_2381_obj @@ -363,7 +369,7 @@ op1=Look weight=1g tradeable=no -[obj_736] +[yommi_tree_seeds_germinated] name=Yommi tree seeds desc=These are germinated and ready to be planted in fertile soil. model=model_2381_obj @@ -467,7 +473,7 @@ members=yes weight=50g tradeable=no -[lumb_of_crystal] +[lump_of_crystal] name=Lump of crystal desc=It looks like it's been snapped off of something. model=model_2844_obj diff --git a/data/src/scripts/quests/quest_legends/scripts/gujuo.rs2 b/data/src/scripts/quests/quest_legends/scripts/gujuo.rs2 index 809e00245a..bca7ee8af6 100644 --- a/data/src/scripts/quests/quest_legends/scripts/gujuo.rs2 +++ b/data/src/scripts/quests/quest_legends/scripts/gujuo.rs2 @@ -7,6 +7,31 @@ mes("Gujuo approaches..."); npc_setmode(none); @gujuo_start; +[opnpcu,gujuo] +switch_obj(last_useitem) { + // todo: add things he does need + case gold_bowl : + if (%legends_progress < ^legends_asked_gujuo_holy_water) { + // shouldn't be possible under normal circumstances + ~displaymessage(^dm_default); + return; + } + // slightly different dialogue here, full stop intentional + ~chatnpc("Aha Bwana, well done, you have made the golden bowl. Would you like me to show you how to bless it."); + def_int $choice = ~p_choice2("Yes, I'd like to bless my gold bowl.", 1, "No thanks, I'll wait.", 2); + if ($choice = 1) { + ~chatplayer("Yes, I'd like to bless my gold bowl."); + @gujuo_bless_bowl; + } + else { + ~chatplayer("No thanks, I'll wait."); + ~chatnpc("Very well, let me know when you want to try."); + @gujuo_how_goes_ungadulu; + } + case default : + ~chatnpc("Sorry, but I don't need that Bwana."); +} + [label,gujuo_start] if (p_finduid(uid) = false) { return; @@ -17,33 +42,113 @@ if (%legends_progress = ^legends_got_bullroarer | %legends_progress = ^legends_s "Sorry, it was a mistake?", gujuo_sorry); } else if (%legends_progress >= ^legends_accepted_rescue_ungadulu) { - ~chatnpc("How goes your quest to release Ungadulu Bwana?"); - switch_int(%legends_progress) { - case ^legends_accepted_rescue_ungadulu : - @multi2("I can't find the caves...", gujuo_cant_find, + if (inv_total(inv, gold_bowl) > 0) { + ~chatnpc("Greetings Bwana. Ah I see you have the golden bowl! Would you like me to show you how to bless it?"); + def_int $choice = ~p_choice2("Yes, I'd like you to bless my gold bowl.", 1, "No thanks, I need help with something else.", 2); + if ($choice = 1) { + ~chatplayer("Yes, I'd like you to bless my gold bowl."); + @gujuo_bless_bowl; + } + // selecting the no option skips straight to ungadulu question + } + @gujuo_how_goes_ungadulu; +} + +[label,gujuo_how_goes_ungadulu] +~chatnpc("How goes your quest to release Ungadulu Bwana?"); +switch_int(%legends_progress) { + case ^legends_accepted_rescue_ungadulu : + @multi2("I can't find the caves...", gujuo_cant_find, + "Ok thanks for your help.", gujuo_thanks); + case ^legends_found_entrance : + if (testbit(%legends_map_runes, ^legends_entered_cavern) = true) { + @multi2("Ungadulu is trapped in some magical flames!", gujuo_ungadulu_trapped, + "I'm not sure what to do.", gujuo_idk); + } + else { + @multi2("I've found the caves, but I don't know what to do.", gujuo_found_but_idk, "Ok thanks for your help.", gujuo_thanks); - case ^legends_found_entrance : - if (testbit(%legends_map_runes, ^legends_entered_cavern) = true) { - @multi2("Ungadulu is trapped in some magical flames!", gujuo_ungadulu_trapped, - "I'm not sure what to do.", gujuo_idk); - } - else { - @multi2("I've found the caves, but I don't know what to do.", gujuo_found_but_idk, - "Ok thanks for your help.", gujuo_thanks); - } - case ^legends_spoke_ungadulu : + } + case ^legends_spoke_ungadulu, ^legends_asked_gujuo_holy_water, ^legends_filled_bowl : + if (testbit(%legends_map_runes, ^legends_ungadulu_called_vacu) = true) { @multi5("Ungadulu looks a little strange.", gujuo_ungadulu_strange, "I'm not sure what to do.", gujuo_idk, "I need some pure water to douse some magic flames.", gujuo_pure_water, "Ungadulu called me a 'Vacu'", gujuo_vacu, "Ok thanks for your help.", gujuo_thanks); + } + else if (testbit(%legends_map_runes, ^legends_asked_ungadulu_where) = true) { + @multi5("Ungadulu looks a little strange.", gujuo_ungadulu_strange, + "I'm not sure what to do.", gujuo_idk, + "Sorry for bothering you.", gujuo_sorry_bothering, + "I need some pure water to douse some magic flames.", gujuo_pure_water, + "Ok thanks for your help.", gujuo_thanks); + } + else { + @multi5("Ungadulu looks a little strange.", gujuo_ungadulu_strange, + "Sorry for bothering you.", gujuo_sorry_bothering, + "I'm not sure what to do.", gujuo_idk, + "Ungadulu mumbled something about 'pure' water?", gujuo_ungadulu_mumbled, + "Ok thanks for your help.", gujuo_thanks); + } +} + +[label,gujuo_bless_bowl] +if (stat(prayer) < 42) { + ~chatnpc("Bwana, I am very sorry, but you are too inexperienced to bless this bowl."); + // dialogue ends here + mes("You need a Prayer level of at least 42 to complete this task."); + return; +} +if (inv_total(inv, blessed_gold_bowl) > 0) { + // says hello again + ~chatnpc("Hello Bwana, I see that you already have a blessed golden bowl. Have you fallen under the spell of the metal of the sun? Alas, I cannot allow you to bless the vessel if you're possessed by greed."); + return; +} +~chatnpc("Very well Bwana..."); +if_close; +mes("Gujuo places the bowl on the floor in front of you, and leads you into a deep"); +mes("meditation..."); +p_delay(3); +npc_say("Ohhhhhmmmmmm"); +p_delay(3); +say("Oooooommmmmmmmmm"); +p_delay(3); +npc_say("Ohhhhhmmmmmm"); +p_delay(3); +say("Oooooohhhhmmmmmmmmmm"); +p_delay(3); +npc_say("Ohhhhhmmmmmm"); +p_delay(3); +// guess but it seems pretty common +if(random(2) = 0) { + ~mesbox("You were not able to go into a deep enough trance. You lose some prayer..."); + stat_sub(prayer, 5, 0); + ~chatnpc("Would you like to try again?"); + // this choice has slightly different wording ("like to" vs "like you to") - intentional + def_int $choice = ~p_choice2("Yes, I'd like to bless my gold bowl.", 1, "No thanks, I'll wait.", 2); + if ($choice = 1) { + ~chatplayer("Yes, I'd like to bless my gold bowl."); + @gujuo_bless_bowl; + } + else { + ~chatplayer("No thanks, I'll wait."); + ~chatnpc("Very well, let me know when you want to try."); + @gujuo_how_goes_ungadulu; } } +else { + inv_del(inv, gold_bowl, 1); + inv_add(inv, blessed_gold_bowl, 1); + ~objbox(blessed_gold_bowl, "You're surrounded by a totally peaceful aura as you bring the blessings of your god down on the bowl.", 250, 0, divide(^objbox_height, 2)); + ~objbox(blessed_gold_bowl, "The bowl is blessed!", 250, 0, divide(^objbox_height, 2)); + @gujuo_how_goes_ungadulu; +} [label,gujuo_ungadulu_trapped] -~chatplayer("I can't find the caves..."); +~chatplayer("Ungadulu is trapped in some magical flames!"); ~chatnpc("Well, maybe you can get his attention somehow? Did you examine the nature of the magical flames? From where did they come do you think?"); -@multi2("Sorry for bothering you.", gujuo_sorry, +@multi2("Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk); [label,gujuo_cant_find] @@ -57,20 +162,49 @@ else if (%legends_progress >= ^legends_accepted_rescue_ungadulu) { ~chatnpc("Search the caves and try to talk to Ungadulu, there may be some clues to be had by searching all the items in the cave..."); @gujuo_leave; +[label,gujuo_ungadulu_mumbled] +~chatplayer("Ungadulu mumbled something about 'pure' water?"); +~chatnpc("Hmm, that sounds strange. But it looks like the Shaman has lost his mind. I am sorry Bwana, but it looks like I've sent you on a fools errand. My apologies Bwana."); +@multi4("Sorry for bothering you.", gujuo_sorry_bothering, + "I'm not sure what to do.", gujuo_idk, + "Can we still get the people together?", gujuo_still_people, + "Strange, why?", gujuo_strange_why); + +[label,gujuo_strange_why] +~chatplayer("Strange, why?"); +~chatnpc("Well, there is a pool of water that is sacred to us. It contains pure water, but I am not sure why he needs this. Perhaps you should go back and talk to him again and get more information."); +@multi3("Sorry for bothering you.", gujuo_sorry_bothering, + "I'm not sure what to do.", gujuo_idk, + "Ok, thanks... Goodbye.", gujuo_water_thanks); + [label,gujuo_ungadulu_strange] ~chatplayer("Ungadulu looks a little strange."); -~chatnpc("Be wary Bwana. There are many unknown spirits that reside in these dark areas. You may be tricked by an unknown force.."); -@multi5("Ok, thanks... Goodbye.", gujuo_water_thanks, - "What kind of unknown force?", gujuo_force, - "Sorry for bothering you.", gujuo_sorry, - "I'm not sure what to do.", gujuo_idk, - "I need some pure water to douse some magic flames.", gujuo_pure_water); - // todo: vacu option? +~chatnpc("Be wary Bwana. There are many unknown spirits that reside in these dark areas. You may be tricked by an unknown force..."); +if (testbit(%legends_map_runes, ^legends_asked_ungadulu_where) = true) { + @multi5("Ok, thanks... Goodbye.", gujuo_water_thanks, + "What kind of unknown force?", gujuo_force, + "Sorry for bothering you.", gujuo_sorry_bothering, + "I'm not sure what to do.", gujuo_idk, + "I need some pure water to douse some magic flames.", gujuo_pure_water); +} +else if (testbit(%legends_map_runes, ^legends_ungadulu_called_vacu) = true) { + @multi5("Ok, thanks... Goodbye.", gujuo_water_thanks, + "What kind of unknown force?", gujuo_force, + "Sorry for bothering you.", gujuo_sorry_bothering, + "I need some pure water to douse some magic flames.", gujuo_pure_water, + "Ungadulu called me 'Vacu', what does that mean?", gujuo_vacu); +} +else { + @multi4("What kind of unknown force?", gujuo_force, + "Sorry for bothering you.", gujuo_sorry_bothering, + "I'm not sure what to do.", gujuo_idk, + "Ungadulu mumbled something about 'pure' water?", gujuo_ungadulu_mumbled); +} [label,gujuo_force] ~chatplayer("What kind of unknown force?"); ~chatnpc("Strange spirits that our forefathers summoned for visions. They haunt the underworld and caves that exist in this area. Take not anything as it might first appear."); -@multi4("Sorry for bothering you.", gujuo_sorry, +@multi4("Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "How did they summon the spirits?", gujuo_spirits, "Ok, thanks... Goodbye.", gujuo_water_thanks); @@ -79,29 +213,28 @@ else if (%legends_progress >= ^legends_accepted_rescue_ungadulu) { ~chatplayer("How did they summon the spirits?"); ~chatnpc("I am unlearned in such matters. But I am told of sacred patterns that are scored on the ground to bind the spirit and confine it... But that is all I know."); @multi4("Ungadulu looks a little strange.", gujuo_ungadulu_strange, - "Sorry for bothering you.", gujuo_sorry, + "Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "Ok, thanks... Goodbye.", gujuo_water_thanks); [label,gujuo_idk] ~chatplayer("I'm not sure what to do."); if (%legends_progress >= ^legends_spoke_ungadulu) { - ~chatnpc("I am at a loss as well Bwana. At this time Ungadulu is the only one who might know of a solution for this puzzle and at this time, he is part of that same puzzle"); + ~chatnpc("I am at a loss as well Bwana. At this time Ungadulu is the only one who might know of a solution for this puzzle and at this time, he is part of that same puzzle."); } else { ~chatnpc("Perhaps you should investigate the caves further? Have you been able to speak to Ungadulu yet? He may have some information to give you that could help?"); } @multi3("Ok, thanks... Goodbye.", gujuo_water_thanks, - "Sorry for bothering you.", gujuo_sorry, + "Sorry for bothering you.", gujuo_sorry_bothering, "Ungadulu looks a little strange.", gujuo_ungadulu_strange); [label,gujuo_pure_water] ~chatplayer("I need some pure water to douse some magic flames."); -// need to test both scenarios here on osrs -if (testbit(%legends_map_runes, ^legends_asked_who) = true) { +if (testbit(%legends_map_runes, ^legends_asked_ungadulu_who) = true) { ~chatnpc("This sounds very strange Bwana... but maybe I can help. There is a pool of water that is sacred to us. It is located in the middle of the Kharazi Jungle."); ~chatnpc("The water contains special properties but it can only be contained in a blessed vessel made from metal of the sun. The water is difficult to get to, but I am sure you will manage to claim some."); - @multi5("Sorry for bothering you.", gujuo_sorry, + @multi5("Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "Ok, thanks... Goodbye.", gujuo_water_thanks, "Metal of the sun, what is that?", gujuo_metal, @@ -110,7 +243,7 @@ if (testbit(%legends_map_runes, ^legends_asked_who) = true) { else { ~chatnpc("Well there is a pool of water that is very sacred to us. But I am unsure why he would need that to douse flames. Perhaps the poor Shaman has lost his mind in the darkness of the caves?"); @multi5("Ok, thanks... Goodbye.", gujuo_water_thanks, - "Sorry for bothering you.", gujuo_sorry, + "Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "Can we still get the people together?", gujuo_still_people, "Where is the pool of sacred water?", gujuo_pool_where); @@ -128,14 +261,14 @@ mes("Gujuo disappears into the Kharazi Jungle as swiftly as he appeared..."); ~chatnpc("The 'Vacu' were priests who summoned the spirits of our ancestors. But the priests were enslaved by the evil spirits of the underworld. It is but a myth, perhaps a story told to scare badly behaved children."); @multi4("Ok, thanks... Goodbye.", gujuo_water_thanks, "Ungadulu looks a little strange.", gujuo_ungadulu_strange, - "Sorry for bothering you.", gujuo_sorry, + "Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk); [label,gujuo_still_people] ~chatplayer("Can we still get the people together?"); ~chatnpc("I am sorry Bwana, my people are scattered throughout the Kharazi Jungle. Without the totem pole to allay their fears, I believe it is impossible to collect them together as a group."); @multi4("Ungadulu looks a little strange.", gujuo_ungadulu_strange, - "Sorry for bothering you.", gujuo_sorry, + "Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "Ok, thanks... Goodbye.", gujuo_water_thanks); @@ -143,17 +276,28 @@ mes("Gujuo disappears into the Kharazi Jungle as swiftly as he appeared..."); ~chatplayer("Where is the pool of sacred water?"); ~chatnpc("The pool of sacred water is very precious to us, it is located in the middle of the Kharazi Jungle."); ~chatnpc("The water contains special properties which can only be retained if the water is contained in a blessed vessel made from metal of the sun."); -@multi5("Sorry for bothering you.", gujuo_sorry, +@multi5("Sorry for bothering you.", gujuo_sorry_bothering, "I'm not sure what to do.", gujuo_idk, "Ok, thanks... Goodbye.", gujuo_water_thanks, "Metal of the sun, what is that?", gujuo_metal, "What kind of a vessel?", gujuo_vessel); +[label,gujuo_sorry_bothering] +~chatplayer("Sorry for bothering you."); +~chatnpc("That's fine Bwana, not to worry. I hope your quest is going well in any case."); +@multi3("Ok, thanks... Goodbye.", gujuo_water_thanks, + "I'm not sure what to do.", gujuo_idk, + "Ungadulu looks a little strange.", gujuo_ungadulu_strange); + [label,gujuo_vessel] ~chatplayer("What kind of a vessel?"); ~chatnpc("A vessel made of sun metal, but it can be of any shape. However, it must be blessed."); if (inv_total(inv, sketch) = 0) { + ~objbox(sketch, "Gujuo takes out a small scroll and some charcoal and draws a rough sketch. When he has finished, he gives the sketch to you.", 180, 0, 0); ~chatnpc("Here, have this as an example... I pray that it will help you."); + if (%legends_progress < ^legends_asked_gujuo_holy_water) { + %legends_progress = ^legends_asked_gujuo_holy_water; + } inv_add(inv, sketch, 1); } else { @@ -162,7 +306,6 @@ else { @multi2("How do I bless the vessel?", gujuo_bless, "Ok thanks for your help.", gujuo_thanks); - [label,gujuo_metal] ~chatplayer("Metal of the sun, what is that?"); ~chatnpc("It is a bright and precious metal that is much sought after, though uncommonly found. It is the same glorious colour as the sun and it never loses its wondrous lustre. A blessed vessel made of this metal"); diff --git a/data/src/scripts/quests/quest_legends/scripts/jungle_forester.rs2 b/data/src/scripts/quests/quest_legends/scripts/jungle_forester.rs2 index f8251ff28c..25f79179dd 100644 --- a/data/src/scripts/quests/quest_legends/scripts/jungle_forester.rs2 +++ b/data/src/scripts/quests/quest_legends/scripts/jungle_forester.rs2 @@ -116,7 +116,6 @@ else { } [label,jungle_forester_map] -// todo: mesanim check ~chatnpc("@blu@--The forester looks very interested--|@bla@Oh, well, that sounds quite good actually... Sorry if I sounded rude before, it just didn't seem like a good idea to me."); ~chatnpc("I guess I just wouldn't want to do it myself. But a map of that area would certainly be a big task. And it would certainly be very useful...|@blu@-- The forester looks very thoughtful --"); ~chatnpc("Hey, if you manage to complete it, be sure to let me take a look! Well, best of luck with it, I'm sure you're going to need it."); diff --git a/data/src/scripts/quests/quest_legends/scripts/jungle_tree.rs2 b/data/src/scripts/quests/quest_legends/scripts/jungle_tree.rs2 new file mode 100644 index 0000000000..ce62ffb39b --- /dev/null +++ b/data/src/scripts/quests/quest_legends/scripts/jungle_tree.rs2 @@ -0,0 +1,197 @@ +[oploc1,_jungle_tree] @start_chop_jungle; +[oploc1,_jungle_bush] @start_chop_jungle; +[oploc3,_jungle_tree] @chop_jungle; +[oploc3,_jungle_bush] @chop_jungle; + +// todo: evaporate water if move through jungle with it + +// the success rates in here don't feel quite right, probably need tweaking + +[label,start_chop_jungle] +if (inv_total(inv, radimus_notes) = 0 & inv_total(inv, radimus_notes_complete) = 0 & %legends_progress < ^legends_complete) { + ~mesbox("You'll get lost in this jungle without a map. You decide not to go any further."); + return; +} +def_namedobj $axe = ~woodcutting_axe_checker(false); +if ($axe = null) { + // OSRS message + ~mesbox("You'll need an axe to get through this rough jungle. You don't think it would be a good idea to continue without one you've got the level to use."); + return; +} +if (inv_total(inv, machete) = 0 & inv_total(worn, machete) = 0) { + // Says bush even for tree + mes("You need a machete to cut your way through this dense jungle bush."); + return; +} +def_int $bowl_water_count = inv_total(inv, golden_bowl_water); +def_int $bowl_pure_water_count = inv_total(inv, golden_bowl_pure_water); +def_int $blessed_bowl_water_count = inv_total(inv, blessed_golden_bowl_water); +def_int $blessed_bowl_pure_water_count = inv_total(inv, blessed_golden_bowl_pure_water); + +if (calc($bowl_water_count + $bowl_pure_water_count + $blessed_bowl_water_count + $blessed_bowl_pure_water_count) > 0) { + mes("The heat in this jungle is terrific."); + mes("The water from your golden bowl evaporates."); + if ($bowl_water_count > 0) { + inv_del(inv, golden_bowl_water, $bowl_water_count); + inv_add(inv, gold_bowl, $bowl_water_count); + } + if ($bowl_pure_water_count > 0) { + inv_del(inv, golden_bowl_pure_water, $bowl_pure_water_count); + inv_add(inv, gold_bowl, $bowl_pure_water_count); + } + if ($blessed_bowl_water_count > 0) { + inv_del(inv, blessed_golden_bowl_water, $blessed_bowl_water_count); + inv_add(inv, blessed_gold_bowl, $blessed_bowl_water_count); + } + if ($blessed_bowl_pure_water_count > 0) { + inv_del(inv, blessed_golden_bowl_pure_water, $blessed_bowl_pure_water_count); + inv_add(inv, blessed_gold_bowl, $blessed_bowl_pure_water_count); + } + } +db_find(woodcutting_trees:tree, loc_type); +def_dbrow $data = db_findnext; +if ($data = null) { + ~displaymessage(^dm_default); + return; +} + +if (%action_delay < map_clock) { + // No sound for jungle trees + if (loc_category = jungle_bush) { + // scuffed implementation for lining up skill sounds (very first chop) + if (%skill_sound = calc(map_clock + 4)) { + sound_synth(woodchop_4,0,20); + } + } + %action_delay = calc(map_clock + 3); + %skill_anim = calc(map_clock + 3); + p_oploc(1); +} else { + if (loc_category = jungle_bush) { + anim(human_machette_chop, 0); + sound_synth(woodchop_4, 0, 10); + mes("You swing your machete at the jungle plant."); + } + else { + anim(struct_param(oc_param($axe, woodcutting_struct), skill_anim), 0); + mes("You swing your axe at the tree."); + } + %skill_sound = calc(map_clock + 5); + + @chop_jungle; +} + +[label,chop_jungle] +// check if player has axe and level, ifso return best axe +def_namedobj $axe = ~woodcutting_axe_checker(true); +if ($axe = null) { + return; +} +// find tree in db +db_find(woodcutting_trees:tree, loc_type); +def_dbrow $data = db_findnext; +if ($data = null) { + ~displaymessage(^dm_default); + return; +} +def_namedobj $product = db_getfield($data, woodcutting_trees:product, 0); +// play animation every 4 ticks +// make sure this is before the skill clock check, else theres a few cases where the skill anim +// gets redefined after skill(anim, null) +if (%skill_anim <= map_clock) { + if (loc_category = jungle_bush) { + %skill_anim = calc(map_clock + 2); + anim(human_machette_chop, 0); + } + else { + %skill_anim = calc(map_clock + 4); + anim(struct_param(oc_param($axe, woodcutting_struct), skill_anim), 0); + } +} +// this is here because theres always a tick where no mes("You swing your axe at the tree.") when spam clicking on tree +// this tick is when you get you get a roll. so that means that skill clock is set next tick after roll is given +if (%action_delay < map_clock) { + %action_delay = calc(map_clock + 3); +} +if (%action_delay = map_clock) { + // get lows and highs + def_int $tree_chance_low; + def_int $tree_chance_high; + $tree_chance_low, $tree_chance_high = ~woodcutting_successchance($data, $axe); + def_int $respawnrate = db_getfield($data, woodcutting_trees:respawnrate, 0); + def_int $deplete_chance = 3; // 1/3 chance to deplete - this is a guess + if (stat_random(stat(woodcutting), $tree_chance_low, $tree_chance_high) = true) { + // Jungle trees/bushes just silently fail to give logs/xp if no space + // There's also a chance to receive no logs. This is guessed at 75% here + if (inv_freespace(inv) > 0 & random(4) = 0) { + mes("You get some ."); + stat_advance(woodcutting, db_getfield($data, woodcutting_trees:productexp, 0)); + inv_add(inv, $product, 1); + } + if (randominc($deplete_chance) = $deplete_chance) { + $respawnrate = ~scale_by_playercount($respawnrate); + loc_change(loc_param(next_loc_stage), $respawnrate); + // set skill anim so it doesnt continue after depletion + anim(null, 0); + %skill_sound = calc(map_clock + 1); + def_coord $dest = coord; + // If you chop jungle that you're standing on, you don't move forward + if (coord ! loc_coord) { + $dest = ~movecoord_indirection(coord, ~coord_direction(coord, loc_coord), 2); + } + else { + mes("This way is blocked off, no chance to get through here!"); + return; + } + + // todo: test on OSRS + if (map_blocked($dest) = true & ~jungle_at_dest($dest) = false) { + mes("This way is blocked off, no chance to get through here!"); + } + else { + if (loc_category = jungle_tree) { + mes("You hack your way through the tree."); + } + else { + mes("You hack your way through the jungle bush."); + } + // Same message even when leaving the jungle + mes("You move deeper into the jungle."); + ~forcemove($dest); + } + return; + } + } +} +if (loc_category = jungle_bush) { + // this is for the very first chop + if (%skill_sound = calc(map_clock + 4)) { + %skill_sound = calc(map_clock + 3); + if (loc_category = jungle_bush) { + sound_synth(woodchop_4,0,25); + } + } + // third + else if (%skill_sound < map_clock) { + %skill_sound = calc(map_clock + 3); + sound_synth(woodchop_4,0,8); + } + // second + else if (%skill_sound = map_clock) { + sound_synth(woodchop_4,0,0); + } + // first + else if (%skill_sound = calc(map_clock + 2)) { + sound_synth(woodchop_4,0,18); + } +} +p_oploc(3); + + +[proc,jungle_at_dest](coord $dest)(boolean) +if (loc_find($dest, jungle_bush_1) = true | loc_find($dest, jungle_bush_2) = true | + loc_find($dest, jungle_tree_1) = true | loc_find($dest, jungle_tree_2) = true | + loc_find($dest, jungle_tree_3) = true) { + return (true); +} +return (false); \ No newline at end of file diff --git a/data/src/scripts/quests/quest_legends/scripts/legends_guard.rs2 b/data/src/scripts/quests/quest_legends/scripts/legends_guard.rs2 index 9abab9b018..cdfb5020cc 100644 --- a/data/src/scripts/quests/quest_legends/scripts/legends_guard.rs2 +++ b/data/src/scripts/quests/quest_legends/scripts/legends_guard.rs2 @@ -39,7 +39,7 @@ else { [label,legends_guard_what] ~chatplayer("What is this place?"); ~chatnpc("This is the Legends Guild, !"); -~chatnpc("Legendary Gielinor citizens are invited on a quest in order to become members of the guild."); +~chatnpc("Legendary RuneScape citizens are invited on a quest in order to become members of the guild."); @multi2("Can I go on the quest?", legends_guard_eligible, "What kind of quest is it?", legends_guard_quest_info); @@ -174,7 +174,7 @@ else { [label,legends_guard_how] ~chatplayer("How do I get in here?"); -~chatnpc("Well , you'll need to be a legendary citizen of Gielinor."); +~chatnpc("Well , you'll need to be a legendary citizen of RuneScape."); ~chatnpc("If you want to use the Legends Hall, you'll be invited to complete a quest. Once you have completed that quest, you'll be a fully fledged member of the Guild."); @multi3("What is this place?", legends_guard_what, "Can I speak to someone in charge?", legends_guard_charge, diff --git a/data/src/scripts/quests/quest_legends/scripts/quest_legends.rs2 b/data/src/scripts/quests/quest_legends/scripts/quest_legends.rs2 index 0e5e85bbeb..ce9f0ca694 100644 --- a/data/src/scripts/quests/quest_legends/scripts/quest_legends.rs2 +++ b/data/src/scripts/quests/quest_legends/scripts/quest_legends.rs2 @@ -1,6 +1,3 @@ -[oploc1,_jungle_tree] @chop_jungle(^jungle_type_tree); -[oploc1,_jungle_bush] @chop_jungle(^jungle_type_bush); - [oploc1,legends_rocks_1] @legends_search_rocks; [oploc1,legends_mossy_rock_1] @legends_search_rocks; [oploc1,legends_mossy_rock_2] @legends_search_rocks; @@ -8,8 +5,134 @@ [oploc1,legends_cave_entrance_1] @legends_cave_entrance; [oploc1,legends_cave_entrance_2] @legends_cave_entrance; -[oploc1,legends_fire_wall_1] @legends_fire_wall; -[oploc1,legends_fire_wall_2] @legends_fire_wall; +[oploc1,legends_fire_wall_1] @legends_touch_fire_wall; +[oploc1,legends_fire_wall_2] @legends_touch_fire_wall; +[oploc2,legends_fire_wall_1] @legends_investigate_fire_wall; +[oploc2,legends_fire_wall_2] @legends_investigate_fire_wall; + +[opheld1,a_scribbled_note] +~mesbox("You try your best to decode the writing.|This is what you make out..."); +~objbox(a_scribbled_note, "I fear that the spirit of an ancient one resides within me and uses me... I am too weak to cast the curse myself and fight the beast within.", 180, 0, 0); +~objbox(a_scribbled_note, "Day 3 ...my last hope is that someone will read this and aid me... I am undone and I fear....", 180, 0, 0); +~mesbox("The writing trails off at this point."); + +[opheld1,scrawled_note] +~mesbox("You try your best to decode the writing.|This is what you make out..."); +~objbox(scrawled_note, "Daily notes of Ungadulu...|Day 1... I have prepared the incantations and will invoke the spirits of my ancestors and pay them homage.", 180, 0, 0); +~objbox(scrawled_note, "Though I feel a strange presence in these caves, it is with the heart of the lion that I fight my fears and mark the magical octagram.", 180, 0, 0); +~objbox(scrawled_note, "Day 2... What have I done? My spirit is overthrown by feelings of fear and evil, I am not myself these days and feel helpless and weak. From my teachings...", 180, 0, 0); +~mesbox("The writing trails off at this point."); + +[opheld1,scrumpled_note] +~mesbox("You try your best to decode the writing.|This is what you make out..."); +~objbox(scrumpled_note, "Day 4 ... These days come so fleetingly, I have no idea how long I have been here now...|Day 5... A wizened charm will release me, but never magic that would harm...", 180, 0, 0); + +[opheld1,shamans_tome] +~mesbox("You read the ancient shaman's tome. It is written in a strange sort of language but you manage a rough translation."); +~mesbox("...scattered are my hopes that I will ever be released from this flaming Octagram, it is the only thing which will contain this beast within. Although its grip over me is weakened with magic, it is hopeless to know if a saviour would guess this. I am doomed..."); + +[oploc1,legends_table] +~mesbox("A crudely constructed makeshift table made from various pieces of wood. You see a piece of screwed up paper on the table top."); + +[oploc2,legends_table] +if (inv_total(inv, a_scribbled_note) < 0) { + // no delay + mes("You start searching the table..."); + ~mesbox("You find a scrap of paper with what looks like nonsense written on it."); + inv_add(inv, a_scribbled_note, 1); +} +else { + mes("You cannot find anything else in here."); +} + +[oploc1,legends_crate] +~mesbox("It looks like a rickety old crate, perhaps placed in this recess to hide it from prying eyes."); + +[oploc2,legends_crate] +mes("You search the crate."); +if (inv_total(inv, scrawled_note) < 0) { + p_delay(1); + ~objbox(scrawled_note, "After some time you find a scrumpled up piece of paper. It looks like rubbish.", 180, 0, 0); + inv_add(inv, scrawled_note, 1); +} +else { + mes("You can't find anything else here."); +} + +[oploc2,legends_bed] +// no delay +mes("You search the flea infested rags..."); + if (inv_total(inv, scrumpled_note) < 0) { + // mes instead of mesbox here + mes("You find a scrap of paper with spidery writing on it.");; + inv_add(inv, scrumpled_note, 1); +} +else { + mes("You cannot find anything else in here."); +} + +[oploc1,legends_desk] +mes("It's a very old rickety desk made of bamboo."); + +[oploc2,legends_desk] +// rs3 +mes("You give the desk a good search."); +p_delay(2); +if (inv_total(inv,shamans_tome) = 0) { + inv_add(inv, shamans_tome, 1); + ~mesbox("You find an interesting tome. It looks heavy and very unique."); +} +else { + mes("You find nothing else of interest here."); +} + +[oploc1,legends_bookcase] +~mesbox("This bamboo book shelf doesn't house many books, it doesn't look as if the Shaman has much opportunity to read at the moment in any case."); + +[oploc2,legends_bookcase] +~mesbox("You search the bookcase, it looks fairy old...|After a while you notice that there is a small crevice|in the back. You might just be able to force your way|through if you were in any way athletic."); +if (~p_choice2_header("Yes please!", 1, "No thanks!", 2, "Would you like to squeeze into this crevice?") = 1) { + if_close; + p_walk(0_43_145_42_59); + p_delay(1); + anim(human_pickupfloor, 0); + p_delay(1); + ~agility_exactmove(human_crawling, 0, 0, coord, 0_43_145_43_60, 6, 20, ^exact_east, false); + // guess + if (stat_random(stat(agility), 125, 250) = false) { + mes("You get stuck as you try to squeeze into the crevice."); + p_delay(5); + mes("It takes you a while to get back out again."); + ~agility_exactmove(human_crawling, 0, 0, coord, 0_43_145_42_59, 6, 20, ^exact_west, false); + return; + } + mes("You successfully squeeze through the crevice into a small tunnel."); + p_telejump(0_43_145_47_61); + anim(human_crawling, 0); + p_delay(2); + p_walk(0_43_145_48_60); +} +else { + mes("You decide not to squeeze yourself into that ridiculously small crevice."); +} + +[oploc1,legends_crevice] +mes("It looks like a crevice, you could possibly squeeze through."); + +[oploc2,legends_crevice] +~mesbox("You search the the crevice. It looks as if you might be able to squeeze through, would you like to try?"); +if (~p_choice2_header("Yes please!", 1, "No thanks.", 2, "Squeeze through incredibly tight crevice?") = 1) { + if_close; + mes("You squeeze your way through the crevice."); + anim(human_crawling, 0); + p_delay(1); + p_teleport(0_43_145_43_58); +} +else { + mes("You decide not to try and squeeze your way through the crevice."); +} + + [oploc2,legends_radimus_cupboard_open] // No quest progress check here @@ -26,7 +149,7 @@ else { [oploc3,legends_radimus_cupboard_open] @close_cupboard(true); -[label,legends_fire_wall] +[label,legends_touch_fire_wall] mes("You approach the supernatural flames."); p_delay(2); mes("They give off an incredibly intense heat."); @@ -43,6 +166,25 @@ else { mes("from the flames."); } +[label,legends_investigate_fire_wall] +~mesbox("You look closely at the flames. They seem to form a straight wall. Something about them looks very strange: they look completely supernatural. For example, they seem to come straight out of the ground."); +say("Mmmm, pretty!"); +~mesbox("You see a white clad figure in the midst of the flames..."); +~mesbox("You see the white robed figure inside the flaming octagram gesturing to you."); +// range guess +// todo: test if this works to handle someone else talking to him, +// making him possessed +npc_findallany(coord, 12, 0); +while (npc_findnext = true) { + if (npc_type = ungadulu) { + @ungadulu_no_closer; + } + else if (npc_type = ungadulu_possessed) { + npc_changetype(ungadulu); + @ungadulu_no_closer; + } +} + [label,legends_search_rocks] if (%legends_progress < ^legends_found_entrance) { mes("You search the rocks but you see nothing significant..."); @@ -95,92 +237,277 @@ if (%legends_progress >= ^legends_found_entrance) { } } else { - ~mesbox("You decide against forcing yourself into the tiny crevice."); + // rsc/rs3 + ~mesbox("You decide against forcing yourself into the tiny crevice. And realise that you have much better things to do. Like visit inns and mine ore."); } } [label,legends_cave_entrance] +p_delay(1); mes("You crawl back out from the cavern..."); p_delay(3); p_teleport(0_43_45_29_54); -[opheld1,sketch] -~mesbox("This is a crudely drawn picture of some kind of vessel, it looks vaguely bowl shaped - this is what Gujuo was referring to when he said that you needed to make a vessel made from the metal of the sun."); +[oploc1,legends_ancient_gate_1_closed] @open_ancient_gate; +[oploc1,legends_ancient_gate_2_closed] @open_ancient_gate; +[oploc2,legends_ancient_gate_1_closed] @search_ancient_gate(^left); +[oploc2,legends_ancient_gate_2_closed] @search_ancient_gate(^right); +[oplocu,legends_ancient_gate_1_closed] @use_on_ancient_gate(^left); +[oplocu,legends_ancient_gate_2_closed] @use_on_ancient_gate(^right); + +[label,open_ancient_gate] +p_delay(2); +anim(human_push, 0); +p_delay(1); +~mesbox("You push on the doors, they're really shut. It looks like the doors have a huge locking mechanism. Although ancient, it looks very sophisticated."); -[label,chop_jungle](int $type) -// todo: -// - time to cut varies, may need to use normal tree logic here -if (inv_total(inv, radimus_notes) = 0 & inv_total(inv, radimus_notes_complete) = 0 & %legends_progress < ^legends_complete) { - ~mesbox("You'll get lost in this jungle without a map. You decide not to go any further."); +[label,search_ancient_gate](int $side) +p_delay(2); +def_boolean $entering = ~check_axis(coord, loc_coord, loc_angle); +if ($entering = false) { + ~open_and_close_double_door2($entering, $side, door_open); return; } -def_namedobj $axe = ~woodcutting_axe_checker(false); -if ($axe = null) { - // OSRS message - ~mesbox("You'll need an axe to get through this rough jungle. You don't think it would be a good idea to continue without one you've got the level to use."); +if (inv_total(inv, lockpick) = 0) { + ~mesbox("These doors are huge! They have a very sophisticated locking mechanism. You're definitely going to need a lockpick to get through these doors."); return; } -if (inv_total(inv, machete) = 0 & inv_total(worn, machete) = 0) { - // Says bush even for tree - mes("You need a machete to cut your way through this dense jungle bush."); +if (stat(thieving) < 50) { + // guess + ~mesbox("You need a Thieving level of 50 to pick this lock."); return; } -if ($type = ^jungle_type_tree) { - anim(struct_param(oc_param($axe, woodcutting_struct), skill_anim), 0); - // No sound for jungle trees +~mesbox("You attempt to pick the lock..."); +anim(human_pickuptable, 0); +~mesbox("It looks very sophisticated..."); +say("Hmmm, interesting..."); +anim(human_pickuptable, 0); +~mesbox("You carefully insert your lockpick into the lock."); +say("This will be a challenge."); +if_close; +anim(human_pickuptable, 0); +p_delay(2); +~mesbox("You feel for the pins and levers in the mechanism."); +say("Easy does it..."); +anim(human_pickuptable, 0); +// todo: rate? +if (random(2) = 0) { + ~mesbox("But you fail to pick the lock."); + inv_del(inv, lockpick, 1); + // todo: placeholder message + ~mesbox("You break your lockpick in the door."); + return; } -else { - anim(human_machette_chop, 32); - sound_synth(woodchop_4, 0, 0); - sound_synth(woodchop_4, 0, 32); - sound_synth(woodchop_4, 0, 64); +~mesbox("CLICK!"); +~chatplayer("Easy as pie..."); +~mesbox("You tumble the lock mechanism and the door opens easily."); +stat_advance(thieving, 100); +~open_and_close_double_door2($entering, $side, door_open); + +[label,use_on_ancient_gate](int $side) +if (last_useitem = lockpick) { + @search_ancient_gate($side); } +~displaymessage(^dm_default); -if ($type = ^jungle_type_tree) { - mes("You swing your axe at the tree."); +[oploc1,_legends_boulder] +def_obj $pickaxe = ~pickaxe_checker; +if ($pickaxe = null) { + // osrs + mes("You need a pickaxe to mine this rock."); + mes("You do not have a pickaxe which you have the Mining level to use"); + return; } -else { - mes("You swing your machete at the jungle plant."); +if(stat(mining) < 52) { + mes("You need a Mining level of 52 to mine your way through this rock."); + return; } +mes("You swing your pick at the rock."); +anim(oc_param($pickaxe, mining_animation), 0); +~mining_sound; +p_delay(2); +// todo: random chance, add rock to inv, replace with stone +// instead of loc_del +mes("You manage to smash the rock to bits."); +loc_del(6); +~forcemove(movecoord(coord, 0, 0, -2)); p_delay(1); -loc_change(loc_param(next_loc_stage), 4); -// Not guaranteed to get logs. Can roll multiple logs before tree falls -// If no inv space, just don't give logs (or xp) -if (inv_freespace(inv) > 0 & random(2) = 0) { - mes("You get some wood."); - stat_advance(woodcutting, 100); - inv_add(inv, logs, 1); +~forcemove(movecoord(coord, 0, 0, -1)); + +[oploc1,legends_water_pool] +~mesbox("It looks like a small babbling brook that comes from and disappears underground again. The water bubbles with a strange effervescence."); + +[oploc2,legends_water_pool] +~mesbox("It looks like you'll have problems getting some of the water as it's difficult to reach with all the rocks around it. There is a narrow gap that you simply won't be able to get a container into."); + +[oplocu,legends_water_pool] +if (last_useitem = hollow_reed) { + if (inv_total(inv, blessed_gold_bowl) > 0) { + inv_del(inv, blessed_gold_bowl, 1); + inv_del(inv, hollow_reed, 1); + inv_add(inv, blessed_golden_bowl_pure_water, 1); + // inconsistent use of "syphon" here is accurate + // https://youtu.be/Lid8enDEF_U?t=1463 + ~objbox(blessed_golden_bowl_pure_water, "You use the cut reed plant to syphon some water from the pool into your blessed golden bowl. The water seems to bubble and sparkle as if alive.", 250, 0, divide(^objbox_height, 2)); + } + else if (inv_total(inv, enchanted_vial) > 0) { + inv_del(inv, enchanted_vial, 1); + inv_del(inv, hollow_reed, 1); + inv_add(inv, holy_water, 1); + ~objbox(holy_water, "You use the cut reed plant to siphon some water from the pool into your enchanted vial. The water seems to bubble and sparkle as if alive.", 250, 0, divide(^objbox_height, 2)); + } + else if (inv_total(inv, gold_bowl) > 0) { + inv_del(inv, gold_bowl, 1); + inv_del(inv, hollow_reed, 1); + inv_add(inv, golden_bowl_pure_water, 1); + ~objbox(golden_bowl_pure_water, "You use the cut reed plant to siphon some water from the pool into your golden bowl. The water doesn't seem as sparkly as it looked in the pool...", 250, 0, divide(^objbox_height, 2)); + } + else if (inv_total(inv, bucket_empty) > 0) { + inv_del(inv, bucket_empty, 1); + inv_add(inv, bucket_water, 1); + // lack of full stop is intentional + // https://youtu.be/1A8nP50qIX8?t=1166 + ~objbox(bucket_water, "You use the hollow reed to siphon some water from the pool into your bucket The water doesn't seem as sparkly as it looked in the pool.", 250, 0, divide(^objbox_height, 2)); + } + else if (inv_total(inv, vial_empty) > 0) { + inv_del(inv, vial_empty, 1); + inv_del(inv, hollow_reed, 1); + inv_add(inv, vial_water, 1); + // lack of full stop is intentional + // https://runescape.wiki/w/Transcript:Legends%27_Quest#With_an_empty_vial_and_without_a_blessed_gold_bowl + ~objbox(vial_water, "You use the hollow reed to siphon some water from the pool into your vial The water doesn't seem as sparkly as it looked in the pool.", 250, 0, divide(^objbox_height, 2)); + } + else { + mes("You start to siphon some of the water up the tube..."); + p_delay(3); + mes("But you have nothing to put the water in."); + return; + } + ~objbox(hollow_reed, "The hollow reed is soaked through with water and is now all soggy.", 180, 0, 0); } -def_coord $dest = coord; -// If you chop jungle that you're standing on, you don't move forward -// todo: test that this always gives the blocked off message, as it seems to on OSRS -if (coord ! loc_coord) { - $dest = ~movecoord_indirection(coord, ~coord_direction(coord, loc_coord), 2); +else if (last_useitem = bucket_empty | last_useitem = vial_empty | last_useitem = gold_bowl | last_useitem = blessed_gold_bowl) { + ~mesbox("This item doesn't fit in the gap between the rocks. You'll need to find another way to reach the water."); } +else { + ~displaymessage(^dm_default); +} + +[oploc1,legends_tall_reeds] +~mesbox("These look like interesting plants, right next to the water's edge. They make the pool look really picturesque."); -// todo: test on OSRS -if (map_blocked($dest) = true & ~jungle_at_dest($dest) = false) { - mes("This way is blocked off, no chance to get through here!"); +[oploc2,legends_tall_reeds] +~mesbox("These tall reeds look nice and long with a long tube for a stem. They reach all the way down to the water."); + +[oplocu,legends_tall_reeds] +if (last_useitem = knife) { + anim(human_knife_slash, 0); + p_delay(1); + mes("You use your knife to cut down a reed."); + inv_add(inv, hollow_reed, 1); +} +else if (last_useitem = machete) { + anim(human_machette_chop, 0); + p_delay(1); + mes("You use your machete to cut down a reed."); + inv_add(inv, hollow_reed, 1); } else { - if ($type = ^jungle_type_tree) { - mes("You hack your way through the tree."); + ~displaymessage(^dm_default); +} + +[opheld1,sketch] +~objbox(sketch, "This is a crudely drawn picture of some kind of vessel, it looks vaguely bowl shaped - this is what Gujuo was referring to when he said that you needed to make a vessel made from the metal of the sun.", 180, 0, 0); + +// none of these empty ops operate on the used slot, will empty the first instance of the item they find +[opheld1,golden_bowl_pure_water] +inv_del(inv, golden_bowl_pure_water, 1); +inv_add(inv, gold_bowl, 1); +mes("You empty the pure water out of the golden bowl."); + +[opheld1,golden_bowl_water] +inv_del(inv, golden_bowl_water, 1); +inv_add(inv, gold_bowl, 1); +mes("You empty the plain water out of the golden bowl."); + +[opheld1,blessed_golden_bowl_water] +inv_del(inv, blessed_golden_bowl_water, 1); +inv_add(inv, blessed_gold_bowl, 1); +mes("You empty the plain water out of the blessed golden bowl."); + +[opheld1,blessed_golden_bowl_pure_water] +inv_del(inv, blessed_golden_bowl_pure_water, 1); +inv_add(inv, blessed_gold_bowl, 1); +mes("You empty the pure water out of the blessed golden bowl."); + +[opheldu,blessed_golden_bowl_pure_water] +// this doesn't work in reverse (bowl -> vial = nothing interesting happens) +if (last_useitem = vial_empty) { + mes("You decant some water from the golden bowl into the vial."); + def_int $bowl_uses = getbit_range(%legends_map_runes, ^legends_golden_bowl_uses_start, ^legends_golden_bowl_uses_end); + inv_del(inv, vial_empty, 1); + inv_add(inv, vial_water, 1); + if ($bowl_uses = 1) { + $bowl_uses = 10; + inv_del(inv, blessed_golden_bowl_pure_water, 1); + inv_add(inv, blessed_gold_bowl, 1); + mes("The golden bowl is empty. There's no sacred water left."); } else { - mes("You hack your way through the jungle bush."); + $bowl_uses = sub($bowl_uses, 1); } - // Same message even when leaving the jungle - mes("You move deeper into the jungle."); - ~forcemove($dest); + %legends_map_runes = setbit_range_toint(%legends_map_runes, $bowl_uses, ^legends_golden_bowl_uses_start, ^legends_golden_bowl_uses_end); + // if water count = 0, replace bowl with empty bowl + mes("The water doesn't seem as effervescent as it was in the bowl."); } -[proc,jungle_at_dest](coord $dest)(boolean) -if (loc_find($dest, jungle_bush_1) = true | loc_find($dest, jungle_bush_2) = true | - loc_find($dest, jungle_tree_1) = true | loc_find($dest, jungle_tree_2) = true | - loc_find($dest, jungle_tree_3) = true) { - return (true); +[label,make_golden_bowl] +if (map_members = false) { + mes("You can only make that on a members' server."); + return; +} +if (~p_choice2_header("Yes", 1, "No", 2, "Would you like to make a golden bowl?") = 2) { + return; +} +if_close; +if (inv_total(inv, gold_bar) < 2) { + ~mesbox("You need two Gold Bars to make a bowl."); + return; +} +if (stat(smithing) < 50) { + // rsc + ~mesbox("You need at least level 50 smithing to work gold."); + return; +} +if (inv_total(inv, hammer) < 1) { + ~mesbox("You need a hammer to work the metal with."); + return; +} +// play anim and sound +anim(human_smithing, 0); +sound_synth(anvil_4, 0, 0); +p_delay(4); +// guessing 50% chance of failure. not sure if impacted by smithing level? +// https://youtu.be/uF1a9xsV7zo?t=931 +// fail rate doesn't appear to be impacted by having vs not having the sketch, +// despite OSRS wiki saying otherwise +if (random(2) = 0) { + mes("You make a mistake forging the bowl."); + // 135/256 chance of removing a second gold bar + // https://x.com/JagexAsh/status/1346079741821022209 + if (random(256) < 135) { + mes("You pour molten gold all over the floor."); + inv_del(inv, gold_bar, 2); + } + else { + inv_del(inv, gold_bar, 1); + } +} +else { + mes("You forge a beautiful bowl out of solid gold."); + inv_del(inv, gold_bar, 2); + inv_add(inv, gold_bowl, 1); + stat_advance(smithing, 300); } -return (false); [queue,legends_quest_complete] %legends_progress = ^legends_complete; @@ -207,6 +534,12 @@ if (p_finduid(uid) = true) { p_telejump(0_42_52_40_38); } +[debugproc,lw] +// legends water +if (p_finduid(uid) = true) { + p_telejump(0_44_45_23_36); +} + [debugproc,jf] // jungle forester if (p_finduid(uid) = true) { diff --git a/data/src/scripts/quests/quest_legends/scripts/ungadulu.rs2 b/data/src/scripts/quests/quest_legends/scripts/ungadulu.rs2 new file mode 100644 index 0000000000..788190ccf1 --- /dev/null +++ b/data/src/scripts/quests/quest_legends/scripts/ungadulu.rs2 @@ -0,0 +1,122 @@ +[opnpc1,ungadulu] @ungadulu_start; +[opnpc2,ungadulu] @attack_ungadulu; +[apnpc2,ungadulu] @attack_ungadulu; +[opnpc2,ungadulu_possessed] @attack_ungadulu; +[apnpc2,ungadulu_possessed] @attack_ungadulu; + +[label,ungadulu_start] +if (%legends_progress < ^legends_defeated_nezikchened_fire) @ungadulu_run; +else mes("Unhandled dialogue stage"); // todo + +[label,ungadulu_run] +~chatnpc("Please run for your life..."); +~mesbox("The Shaman seems to be fighting an inner battle."); +~chatnpc("Go... go now...!"); +~mesbox("The Shaman seems to change in front of your eyes..."); +npc_changetype(ungadulu_possessed); +~chatnpc("Welcome Vacu, to eternal..."); +if_close; +mes("The Shaman starts an incantation..."); +p_delay(1); +mes("You feel a strange power coming over you..."); +p_delay(1); +mes("You feel very weak..."); +p_delay(1); +mes("The Shaman seems to get stronger!"); +p_delay(1); +npc_changetype(ungadulu); +mes("The Shaman seems to return to normal..."); +~chatnpc("Run, run away... Run like the leopard Bwana!"); +// if the player casts confuse/curse/weaken shortly after this dialogue, +// there's special dialogue about getting the book of binding. +// todo: how do we track this? timer? + +[label,ungadulu_no_closer] +~chatnpc("Please come no closer... the flames will incinerate you."); +if (%legends_progress < ^legends_spoke_ungadulu) { + %legends_progress = ^legends_spoke_ungadulu; +} +@multi2("How can I extinguish the flames?", ungadulu_extinguish, + "Who are you?", ungadulu_who); + +[label,ungadulu_extinguish] +~chatplayer("How can I extinguish the flames?"); +~chatnpc("Please don't try to extinguish..."); +npc_changetype(ungadulu_possessed); +~chatnpc("Yes, douse the flames with water, pure water... foo..."); +npc_changetype(ungadulu); +// double space intentional +// https://youtu.be/atp7nZUwC8E?t=33 +~chatnpc("Please, leave now... don't listen to me... I beg you, leave now, don't touch the flames..."); +@multi2("Where do I get pure water from?", ungadulu_where, + "Who are you?", ungadulu_who); + +[label,ungadulu_where] +~chatplayer("Where do I get pure water from?"); +~chatnpc("Please, leave now..."); +npc_changetype(ungadulu_possessed); +~chatnpc("...from the above lands... hurry and release me..."); +npc_changetype(ungadulu); +~chatnpc("Leave here, please, go... now..."); +%legends_map_runes = setbit(%legends_map_runes, ^legends_asked_ungadulu_where); +npc_changetype(ungadulu_possessed); +~chatnpc("Hurry, Vacu, the heat kills me... ha ha ha"); +%legends_map_runes = setbit(%legends_map_runes, ^legends_ungadulu_called_vacu); +~mesbox("The Shaman throws himself down on the floor and starts convulsing."); + +[label,ungadulu_who] +~chatplayer("Who are you?"); +~chatnpc("I am Ungadulu, trapped here many years now... Leave these caves and save yourself..."); +npc_changetype(ungadulu_possessed); +~chatnpc("Wait... get pure water from the pool... above lands..."); +%legends_map_runes = setbit(%legends_map_runes, ^legends_asked_ungadulu_where); +%legends_map_runes = setbit(%legends_map_runes, ^legends_asked_ungadulu_who); +npc_changetype(ungadulu); +~chatnpc("Please Bwana, don't listen to me... run, save yourself..."); +@multi2("How can I extinguish the flames?", ungadulu_extinguish, + "Where do I get pure water from?", ungadulu_where); + +// Ungadulu cannot be attacked with melee or ranged weapons; he will throw players out of the Octagram, +// hitting them for between 4 and 10 damage. However, players can manually cast combat spells on him both inside +// and outside the Octagram to damage and kill him without being thrown by his spell. +[label,attack_ungadulu] +if (~inzone_coord_pair_table(legends_fire_wall, coord) = false) { + ~mesbox("You feel certain that your weapon would melt if you tried to attack through these magical flames."); +} +else { + p_delay(1); + npc_facesquare(coord); + mes("The shaman casts a spell!"); + npc_changetype(ungadulu_possessed); + npc_say("Ha ha ha ha! Die, Vacu!"); + spotanim_npc(zap, 100, 0); + npc_anim(zap, 0); + p_delay(1); + // this isn't correct - not sure what the exact target coord mechanism is + def_coord $thrown = movecoord(coord, 0, 0, 5); + //def_int $dist = distance(coord, $thrown); + //[proc,agility_exactmove](seq $anim, int $anim_delay, int $movement_delay, coord $start_coord, coord $end_coord, int $start_cycle, int $end_cycle, int $direction, boolean $merge_with_loc) + //~agility_exactmove(human_walk_fence_north, 30, 2, $start_coord, $end_coord, 30, 94, $dir, true); + // start 5376 (2791, 9237) + // end 5382 (2785, 9329) + ~agility_exactmove(human_knockback_long, 0, 6, coord, $thrown, 31, 115, ^exact_south, false); + queue(damage_player, 0, calc(random(7) + 4)); + anim(null, 0); + ~mesbox("Ungadulu unleashes a savage bolt of energy at you. You're knocked out of the octagram by the power of the spell."); + npc_say("Ha, ha ha Vacu... Come for me again and you'll taste more of my power!"); + // todo check coord, anim, etc +} + +// curse to start: +//https://youtu.be/uYxkN3aJ-44?t=4317 +// npc_say("What...what's happening...") + dizzy anim +// mes("The shaman somehow resists the power of the spell.") +// mes("Perhaps you should try again?"); +// approaches you, becomes possessed, attacks, "Ha ha ha ha! Die, Vacu!", throws you out +// throwing out is pretty janky: https://youtu.be/uYxkN3aJ-44?t=4323 + +// when possessed form despawns, regular form spawns immediately. can be different tile (2 away from table is spawn loc) + +// https://youtu.be/uYxkN3aJ-44?t=4486 +// if you talk to him and go through possession -> normal, then cast curse/weakness/etc on him, get dialogue about book of binding +// then mesbox("The shaman's eyes roll back and he returns to his quiet, unassuming self.") \ No newline at end of file diff --git a/data/src/scripts/quests/quest_upass/scripts/quest_upass.rs2 b/data/src/scripts/quests/quest_upass/scripts/quest_upass.rs2 index d6e9eabc2e..249d446c67 100644 --- a/data/src/scripts/quests/quest_upass/scripts/quest_upass.rs2 +++ b/data/src/scripts/quests/quest_upass/scripts/quest_upass.rs2 @@ -187,7 +187,7 @@ if (inv_total(inv, orb_of_light4) > 0) { ~forcewalk(movecoord(loc_coord, 1, 0, 0)); p_delay(0); if(loc_find(0_37_151_12_3, loc_3338) = true) loc_anim(seq_458); -~agility_exactmove(seq_734, 20, 2, coord, movecoord(coord, 5, 0, 0), 20, 80, ^exact_west, false); +~agility_exactmove(human_knockback, 20, 2, coord, movecoord(coord, 5, 0, 0), 20, 80, ^exact_west, false); anim(seq_848, 0); spotanim_pl(stunned_thieving, 124, 0); sound_synth(stunned, 0, 0); diff --git a/data/src/scripts/skill_smithing/scripts/smithing/smithing.rs2 b/data/src/scripts/skill_smithing/scripts/smithing/smithing.rs2 index 64859162df..6950b21ed5 100644 --- a/data/src/scripts/skill_smithing/scripts/smithing/smithing.rs2 +++ b/data/src/scripts/skill_smithing/scripts/smithing/smithing.rs2 @@ -44,8 +44,10 @@ if (%tutorial_progress < ^tutorial_complete) { } } -if (oc_category(last_useitem) = category_151) @smithing_anvil_interface(last_useitem); +if (last_useitem = gold_bar & %legends_progress >= ^legends_asked_gujuo_holy_water) @make_golden_bowl; +else if (oc_category(last_useitem) = category_151) @smithing_anvil_interface(last_useitem); else if (last_useitem = shield_left_half | last_useitem = shield_right_half) @make_dragon_sq; +else ~displaymessage(^dm_default); [if_close,smithing] inv_stoptransmit(smithing:column1); diff --git a/data/src/scripts/skill_woodcutting/configs/trees.dbrow b/data/src/scripts/skill_woodcutting/configs/trees.dbrow index f6cbc8a93e..de8d90f265 100644 --- a/data/src/scripts/skill_woodcutting/configs/trees.dbrow +++ b/data/src/scripts/skill_woodcutting/configs/trees.dbrow @@ -34,6 +34,25 @@ data=successchance,mithril_axe,160,500 data=successchance,adamant_axe,192,600 data=successchance,rune_axe,224,700 +[jungle_tree_table] +table=woodcutting_trees +data=tree,jungle_tree_1 +data=tree,jungle_tree_2 +data=tree,jungle_tree_3 +data=tree,jungle_bush_1 +data=tree,jungle_bush_2 +data=levelrequired,0 +data=productexp,100 +data=product,logs +data=respawnrate,4 +data=successchance,bronze_axe,64,200 +data=successchance,iron_axe,96,300 +data=successchance,steel_axe,128,400 +data=successchance,black_axe,144,450 +data=successchance,mithril_axe,160,500 +data=successchance,adamant_axe,192,600 +data=successchance,rune_axe,224,700 + [burnt_tree_table] table=woodcutting_trees data=tree,loc_1384