From 5e4992b4a730f239cd47254135be7df0e5f1f316 Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sat, 25 Jul 2026 22:47:28 -0400 Subject: [PATCH 01/10] mm fixes --- scripts/login_logout/login.rs2 | 2 +- scripts/quests/quest_mm/configs/quest_mm.enum | 17 ++ scripts/quests/quest_mm/configs/quest_mm.inv | 58 ++-- scripts/quests/quest_mm/configs/quest_mm.loc | 4 + scripts/quests/quest_mm/configs/quest_mm.npc | 2 + .../quest_mm/scripts/aa_monkey_guard.rs2 | 29 +- scripts/quests/quest_mm/scripts/debug_mm.rs2 | 2 +- scripts/quests/quest_mm/scripts/mm_archer.rs2 | 29 +- .../quests/quest_mm/scripts/mm_awowogei.rs2 | 1 + scripts/quests/quest_mm/scripts/mm_demon.rs2 | 3 + scripts/quests/quest_mm/scripts/mm_jail.rs2 | 262 ++++++++---------- scripts/quests/quest_mm/scripts/mm_kruk.rs2 | 4 + scripts/quests/quest_mm/scripts/quest_mm.rs2 | 55 ++++ scripts/skill_woodcutting/configs/trees.dbrow | 3 +- 14 files changed, 280 insertions(+), 191 deletions(-) diff --git a/scripts/login_logout/login.rs2 b/scripts/login_logout/login.rs2 index cbd12e2a25..d18271cfc3 100644 --- a/scripts/login_logout/login.rs2 +++ b/scripts/login_logout/login.rs2 @@ -77,13 +77,13 @@ if(inzone(movecoord(^grandtree_jail_coord, 0, 0, -2), movecoord(^grandtree_jail_ ~grandtree_spawn_charlie; } +~initalltabs; ~castlewars_login; ~update_all(inv_getobj(worn, ^wearpos_rhand)); cam_reset; if (%tutorial < ^tutorial_complete & ~in_tutorial_island(coord) = true) { @start_tutorial; } -~initalltabs; queue(follower_login, 0, 0); if (map_live = true) { last_login_info; diff --git a/scripts/quests/quest_mm/configs/quest_mm.enum b/scripts/quests/quest_mm/configs/quest_mm.enum index 6f0d68b279..b865438058 100644 --- a/scripts/quests/quest_mm/configs/quest_mm.enum +++ b/scripts/quests/quest_mm/configs/quest_mm.enum @@ -9,3 +9,20 @@ val=5,mm_monkey_greegree_for_normal_monkey val=6,mm_monkey_greegree_for_small_zombie_monkey val=7,mm_monkey_greegree_for_large_zombie_monkey val=8,mm_monkey_greegree_for_ancient_monkey_skull + +[mm_jail_patrol_route] +inputtype=int +outputtype=coord +val=0,0_43_43_16_46 +val=1,0_43_43_18_46 +val=2,0_43_43_20_49 +val=3,0_43_43_20_44 +val=4,0_43_43_19_44 +val=5,0_43_43_20_44 +val=6,0_43_43_20_49 +val=7,0_43_43_20_44 +val=8,0_43_43_19_44 +val=9,0_43_43_20_44 +val=10,0_43_43_20_49 +val=11,0_43_43_18_46 +val=12,0_43_43_16_46 diff --git a/scripts/quests/quest_mm/configs/quest_mm.inv b/scripts/quests/quest_mm/configs/quest_mm.inv index 94ef324eb7..f05c14201c 100644 --- a/scripts/quests/quest_mm/configs/quest_mm.inv +++ b/scripts/quests/quest_mm/configs/quest_mm.inv @@ -6,44 +6,44 @@ size=25 [mm_magic_shop] size=8 -stock0=firerune,1000,10 -stock1=waterrune,1000,10 -stock2=airrune,1000,10 -stock3=earthrune,1000,10 -stock4=lawrune,250,300 -stock5=mm_eye_of_gnome,10,100 -stock6=mm_monkey_dentures,100,100 -stock7=mm_monkey_talisman,50,100 +stock1=firerune,1000,10 +stock2=waterrune,1000,10 +stock3=airrune,1000,10 +stock4=earthrune,1000,10 +stock5=lawrune,250,300 +stock6=mm_eye_of_gnome,10,100 +stock7=mm_monkey_dentures,100,100 +stock8=mm_monkey_talisman,50,100 [mm_scimitar_shop] size=4 -stock0=bronze_scimitar,10,100 -stock1=iron_scimitar,10,200 -stock2=steel_scimitar,8,600 -stock3=mithril_scimitar,6,400 +stock1=bronze_scimitar,10,100 +stock2=iron_scimitar,10,200 +stock3=steel_scimitar,8,600 +stock4=mithril_scimitar,6,400 [mm_food_shop] size=4 -stock0=mm_monkey_nuts,200,100 -stock1=banana,10,1000 -stock2=mm_banana_stew,10,100 -stock3=mm_monkey_bar,20,100 +stock1=mm_monkey_nuts,200,100 +stock2=banana,10,1000 +stock3=mm_banana_stew,10,100 +stock4=mm_monkey_bar,20,100 [mm_crafting_shop] size=8 -stock0=chisel,2,100 -stock1=ring_mould,4,100 -stock2=necklace_mould,2,100 -stock3=mm_monkey_amulet_mould,2,100 -stock4=needle,3,100 -stock5=thread,100,5 -stock6=ball_of_wool,100,5 +stock1=chisel,2,100 +stock2=ring_mould,4,100 +stock3=necklace_mould,2,100 +stock4=mm_monkey_amulet_mould,2,100 +stock5=needle,3,100 +stock6=thread,100,5 +stock7=ball_of_wool,100,5 [mm_general_shop] size=40 -stock0=pot_empty,3,50 -stock1=jug_empty,2,50 -stock2=rope,8,50 -stock3=bucket_empty,2,50 -stock4=tinderbox,2,50 -stock5=hammer,5,50 +stock1=pot_empty,3,50 +stock2=jug_empty,2,50 +stock3=rope,8,50 +stock4=bucket_empty,2,50 +stock5=tinderbox,2,50 +stock6=hammer,5,50 diff --git a/scripts/quests/quest_mm/configs/quest_mm.loc b/scripts/quests/quest_mm/configs/quest_mm.loc index 036fa146b0..9f7d7cdae7 100644 --- a/scripts/quests/quest_mm/configs/quest_mm.loc +++ b/scripts/quests/quest_mm/configs/quest_mm.loc @@ -1043,6 +1043,8 @@ ambient=40 op1=Chop-down op3=hidden mapscene=5 +category=tree +param=next_loc_stage,mm_bush_kharazi_jungle_tree1_stump [mm_bush_kharazi_jungle_tree1_stump] name=Jungle Tree Stump @@ -1059,6 +1061,8 @@ op3=hidden width=2 length=2 mapscene=5 +category=tree +param=next_loc_stage,mm_bush_kharazi_jungle_tree2_stump [mm_bush_kharazi_jungle_tree2_stump] name=Jungle Tree Stump diff --git a/scripts/quests/quest_mm/configs/quest_mm.npc b/scripts/quests/quest_mm/configs/quest_mm.npc index 700eb55c59..a1a190b927 100644 --- a/scripts/quests/quest_mm/configs/quest_mm.npc +++ b/scripts/quests/quest_mm/configs/quest_mm.npc @@ -1570,6 +1570,7 @@ recol1s=15648 recol1d=12037 recol2s=16801 recol2d=26149 +moverestrict=outdoors wanderrange=16 maxrange=16 attack=10 @@ -1601,6 +1602,7 @@ recol1s=15648 recol1d=13949 recol2s=16801 recol2d=31528 +moverestrict=outdoors wanderrange=64 maxrange=64 attack=5 diff --git a/scripts/quests/quest_mm/scripts/aa_monkey_guard.rs2 b/scripts/quests/quest_mm/scripts/aa_monkey_guard.rs2 index 15c5c6fdc5..d4ea4bf269 100644 --- a/scripts/quests/quest_mm/scripts/aa_monkey_guard.rs2 +++ b/scripts/quests/quest_mm/scripts/aa_monkey_guard.rs2 @@ -28,11 +28,16 @@ obj_addall(npc_coord, npc_param(death_drop), 1, ^lootdrop_duration); if(~mm_wearing_greegree = true | %mm_player_is_unconscious = ^true) { npc_del; spotanim_map(smokepuff, npc_coord, 50, 0); + sound_synth(smokepuff, 0, 0); return; } // regular guards dont always knockout, named guards will always knockout -if(npc_type = mm_monkey_guard & random(10) = 0) queue(aa_knockout, 0, 0); -else gosub(npc_default_attack); +if(npc_type ! mm_monkey_guard) { + strongqueue(aa_guard_knockout, 0, 0); +} else { + if(random(10) = 0) strongqueue(aa_guard_knockout, 0, 0); + else gosub(npc_default_attack); +} [ai_opplayer2,mm_religious_guard] @mm_religious_guard_attack; [ai_opplayer2,mm_religious_trapdoor_guard] @mm_religious_guard_attack; @@ -49,3 +54,23 @@ if(npc_stat(hitpoints) <= 30 & random(12) = 0) { return; } gosub(npc_default_attack); + +[queue,aa_guard_knockout] +p_stopaction; +%mm_player_is_unconscious = ^true; +~update_bas; +anim(human_death, 0); +p_delay(2); +~fade_out; +p_delay(2); +~fade_in; +p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); +walktrigger(wake_up); +~combat_clearqueue; +clearqueue(aa_archer_knockout); +clearqueue(aa_guard_knockout); +clearqueue(aa_jail_knockout); +queue(lumo_jailed_dialogue, 10, 0); +queue(fade_clear, 0, 0); +if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); +~objbox(steel_scimitar, "You are knocked unconscious by a blow to the head!", 250, 0, 0); \ No newline at end of file diff --git a/scripts/quests/quest_mm/scripts/debug_mm.rs2 b/scripts/quests/quest_mm/scripts/debug_mm.rs2 index 8fa952d924..9d60ffa187 100644 --- a/scripts/quests/quest_mm/scripts/debug_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/debug_mm.rs2 @@ -20,4 +20,4 @@ if(p_finduid(uid) = true) @mm_ch2_cutscene; if(p_finduid(uid) = true) queue(mm_ch3_cutscene, 0, 0); [debugproc,mmch4] -if(p_finduid(uid) = true) @mm_ch2_cutscene; +if(p_finduid(uid) = true) @mm_ch4_cutscene; diff --git a/scripts/quests/quest_mm/scripts/mm_archer.rs2 b/scripts/quests/quest_mm/scripts/mm_archer.rs2 index 7505160f85..68cc1ff178 100644 --- a/scripts/quests/quest_mm/scripts/mm_archer.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_archer.rs2 @@ -2,23 +2,25 @@ [ai_opplayer2,mm_posted_archer] npc_setmode(applayer2); [ai_applayer2,mm_posted_archer] // archers can not attack you in the long grass or if in monkey form, they will still try to though -if(~mm_wearing_greegree = true | %mm_player_is_unconscious = ^true | loc_find(coord, mm_long_jungle_grass1) = true | loc_find(coord, mm_long_jungle_grass2) = true | loc_find(coord, mm_long_jungle_grass3) = true) { +if(%mm_player_is_unconscious = ^true | loc_find(coord, mm_long_jungle_grass1) = true | loc_find(coord, mm_long_jungle_grass2) = true | loc_find(coord, mm_long_jungle_grass3) = true) { return; } -~npc_rangeattack; +~mm_archer_attack; [ai_queue1,mm_monkey_archer] ~npc_default_retaliate_ap; [ai_opplayer2,mm_monkey_archer] npc_setmode(applayer2); [ai_applayer2,mm_monkey_archer] // archers can not attack you in the long grass or if in monkey form, they will still try to though -if(~mm_wearing_greegree = true | %mm_player_is_unconscious = ^true | loc_find(coord, mm_long_jungle_grass1) = true | loc_find(coord, mm_long_jungle_grass2) = true | loc_find(coord, mm_long_jungle_grass3) = true) { +if(%mm_player_is_unconscious = ^true | loc_find(coord, mm_long_jungle_grass1) = true | loc_find(coord, mm_long_jungle_grass2) = true | loc_find(coord, mm_long_jungle_grass3) = true) { return; } -~npc_rangeattack; +~mm_archer_attack; [ai_queue1,mm_ravine_archer] ~npc_default_retaliate_ap; [ai_opplayer2,mm_ravine_archer] npc_setmode(applayer2); -[ai_applayer2,mm_ravine_archer] +[ai_applayer2,mm_ravine_archer] ~mm_archer_attack; + +[proc,mm_archer_attack] if(~mm_wearing_greegree = true) { return; } @@ -44,11 +46,12 @@ spotanim_npc(npc_param(proj_launch), npc_param(proj_height), 0); %npc_action_delay = add(map_clock, npc_param(attackrate)); def_int $duration = 64; -$duration = ~player_projectile(npc_coord, coord, uid, npc_param(proj_travel), 40, 36, 32, 15, 0, 11, 5); +$duration = ~player_projectile(npc_coord, coord, uid, npc_param(proj_travel), 15, 36, 41, 15, 5, 11, 5); -if(random(20) = 0) { // testing with 1 archer aggroed, it seems like about 1 in every 20 attacks, and its only when the arrow lands - queue(aa_knockout, 0, calc($duration / 30)); +if(npc_type = mm_ravine_archer & %mm_player_is_unconscious = ^false & random(20) = 0) { // testing with 1 archer aggroed, it seems like about 1 in every 20 attacks, and its only when the arrow lands + strongqueue(aa_archer_knockout, 0, calc($duration / 30)); } + if (randominc($attack_roll) > randominc($defence_roll)) { ~playerhit_n_ranged(true, randominc($maxhit), $duration, npc_param(attackrate)); ~npc_poison_player; @@ -60,7 +63,7 @@ if (randominc($attack_roll) > randominc($defence_roll)) { %mm_player_is_unconscious = ^false; anim(null, 0); -[queue,aa_knockout] +[queue,aa_archer_knockout] p_stopaction; %mm_player_is_unconscious = ^true; ~update_bas; @@ -68,13 +71,15 @@ anim(human_death, 0); p_delay(2); ~fade_out; p_delay(3); +// no poison arrow thing here? watched tons of videos and never saw it +p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); walktrigger(wake_up); ~combat_clearqueue; -clearqueue(aa_knockout); +clearqueue(aa_archer_knockout); +clearqueue(aa_guard_knockout); clearqueue(aa_jail_knockout); -p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); queue(lumo_jailed_dialogue, 10, 0); +if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); ~fade_in; p_delay(4); -if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); if_openoverlay(null); diff --git a/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 b/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 index 45828bc1f4..fce6d09b8c 100644 --- a/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 @@ -87,6 +87,7 @@ switch_int(%mm_awowogei) { ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "There are several of your kind kept captive there. I challenge you to free one and return it to me."); ~chatplayer("How am I meant to free one of them?"); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "This is for you to decide, visitor."); + // https://youtu.be/CrIK9wa_6j0?si=TP_5XVR8Ap397MAf&t=1820 ~chatplayer("Very well. I will be back later, with one of the captives."); } } diff --git a/scripts/quests/quest_mm/scripts/mm_demon.rs2 b/scripts/quests/quest_mm/scripts/mm_demon.rs2 index 28067cbc35..5fa58b6fff 100644 --- a/scripts/quests/quest_mm/scripts/mm_demon.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_demon.rs2 @@ -478,6 +478,9 @@ if(%mm_garkor < ^garkor_finished_mission) { ~chatplayer("Rest assured, I will do so. How do I leave this place?"); if(%mm_garkor < ^garkor_finished_mission) %mm_garkor = ^garkor_finished_mission; ~chatnpc("Speak to Zooknock. He will arrange for you to leave."); +if(npc_find(coord, mm_zooknock_final_battle, 15, 0) = true) { + hint_npc; +} [opnpc1,mm_zooknock_final_battle] if(%mm_main < ^mm_defeated_demon) { diff --git a/scripts/quests/quest_mm/scripts/mm_jail.rs2 b/scripts/quests/quest_mm/scripts/mm_jail.rs2 index bea86ac4c2..6a0f5edbf8 100644 --- a/scripts/quests/quest_mm/scripts/mm_jail.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_jail.rs2 @@ -29,8 +29,12 @@ if(inv_total(worn, mm_amulet_of_monkey_speak) = 0) { ~chatnpc("Grr ... Get out of my way..."); } +[ai_spawn,mm_aberab] +%npc_int = 0; +%npc_int2 = map_clock; + [ai_spawn,mm_trefaji] -%npc_int = 101; +%npc_int = 100; [ai_timer,mm_aberab] ~mm_jail_patrol; @@ -42,14 +46,15 @@ if(inv_total(worn, mm_amulet_of_monkey_speak) = 0) { %mm_player_is_unconscious = ^true; ~fade_out; p_delay(3); +p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); walktrigger(wake_up); -clearqueue(aa_knockout); +clearqueue(aa_archer_knockout); +clearqueue(aa_guard_knockout); clearqueue(aa_jail_knockout); -p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); queue(lumo_jailed_dialogue, 10, 0); +if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); ~fade_in; p_delay(4); -if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); if_openoverlay(null); [queue,mm_jail_guard_attack](npc_uid $npc_uid) @@ -79,8 +84,44 @@ if(npc_finduid($npc_uid) = true) { $dist = sub($dist, 1); } } + } else if(coordx(coord) > coordx($npc_center) & coordz(coord) < coordz($npc_center)) { + // southwest + $dir = ^exact_west; + $dist = 7; + while($dist > 0) { + $dest = movecoord(coord, $dist, 0, multiply($dist, -1)); + if(lineofwalk(coord, $dest) = true & coord ! $dest) { + $dist = 0; + } else { + $dist = sub($dist, 1); + } + } + } else if(coordx(coord) < coordx($npc_center) & coordz(coord) > coordz($npc_center)) { + // northeast + $dir = ^exact_east; + $dist = 7; + while($dist > 0) { + $dest = movecoord(coord, multiply($dist, -1), 0, $dist); + if(lineofwalk(coord, $dest) = true & coord ! $dest) { + $dist = 0; + } else { + $dist = sub($dist, 1); + } + } + } else if(coordx(coord) > coordx($npc_center) & coordz(coord) > coordz($npc_center)) { + // northwest + $dir = ^exact_west; + $dist = 7; + while($dist > 0) { + $dest = movecoord(coord, $dist, 0, $dist); + if(lineofwalk(coord, $dest) = true & coord ! $dest) { + $dist = 0; + } else { + $dist = sub($dist, 1); + } + } } else if(coordx(coord) < coordx($npc_center)) { - // east + // west $dir = ^exact_east; $dist = 7; while($dist > 0) { @@ -91,6 +132,18 @@ if(npc_finduid($npc_uid) = true) { $dist = sub($dist, 1); } } + } else if(coordx(coord) > coordx($npc_center)) { + // east + $dir = ^exact_west; + $dist = 7; + while($dist > 0) { + $dest = movecoord(coord, $dist, 0, 0); + if(lineofwalk(coord, $dest) = true & coord ! $dest) { + $dist = 0; + } else { + $dist = sub($dist, 1); + } + } } else if(coordz(coord) < coordz($npc_center)) { // south $dir = ^exact_north; @@ -103,24 +156,32 @@ if(npc_finduid($npc_uid) = true) { $dist = sub($dist, 1); } } + } else if(coordz(coord) > coordz($npc_center)) { + // north + $dir = ^exact_south; + $dist = 7; + while($dist > 0) { + $dest = movecoord(coord, 0, 0, $dist); + if(lineofwalk(coord, $dest) = true & coord ! $dest) { + $dist = 0; + } else { + $dist = sub($dist, 1); + } + } } anim(human_mm_flyback, 20); ~damage_self(divide(stat(hitpoints), 5)); // 1/5th of hp? if(lineofwalk(coord, $dest) = true & coord ! $dest) { p_exactmove(coord, $dest, 20, 40, $dir); } - queue(aa_jail_knockout, 0, 0); + strongqueue(aa_jail_knockout, 0, 0); p_delay(0); } [proc,mm_jail_patrol] -def_coord $dest; -def_coord $npc_center; -def_int $dir; -def_int $dist; huntall(npc_coord, 1, ^vis_lineofsight); while(huntnext = true) { - if(~mm_wearing_greegree = false & getqueue(aa_jail_knockout) = 0) { + if(~mm_wearing_greegree = false & %mm_player_is_unconscious = ^false) { if (%npc_action_delay <= map_clock) { if_close; %npc_action_delay = add(map_clock, 4); @@ -131,7 +192,7 @@ while(huntnext = true) { huntall(coord, 1, ^vis_lineofsight); if(huntnext = true) { if_close; - if(busy = false & ~mm_wearing_greegree = false) { + if(busy = false & ~mm_wearing_greegree = false & %mm_player_is_unconscious = ^false) { clearqueue(lumo_jailed_dialogue); // you can stack this queue, but not from getting hit by jail guard multiple times queue*(mm_jail_guard_attack, 0)(npc_uid); } @@ -141,147 +202,58 @@ while(huntnext = true) { } } -if(%npc_int < 3) { - npc_setmode(none); - npc_walk(npc_coord); - npc_walk(0_43_43_18_46); -} else if(%npc_int < 7) { - if(%npc_int = 3 & npc_coord ! 0_43_43_18_46) { - npc_tele(0_43_43_18_46); - npc_walk(npc_coord); - return; - } - npc_setmode(none); - npc_walk(npc_coord); - npc_walk(0_43_43_20_49); -} else if(%npc_int < 12) { - if(%npc_int = 7 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 15) { - if(%npc_int = 12 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(0_43_43_20_44); -} else if(%npc_int < 21) { - if(%npc_int = 15 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 24) { - if(%npc_int = 21 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(0_43_43_19_44); -} else if(%npc_int < 27) { - if(%npc_int = 24 & npc_coord ! 0_43_43_19_44) { - npc_tele(0_43_43_19_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 30) { - if(%npc_int = 27 & npc_coord ! 0_43_43_19_44) { - npc_tele(0_43_43_19_44); - } - npc_setmode(none); - npc_walk(0_43_43_20_44); -} else if(%npc_int < 33) { - if(%npc_int = 30 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 36) { - if(%npc_int = 33 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(0_43_43_20_49); -} else if(%npc_int < 42) { - if(%npc_int = 36 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 45) { - if(%npc_int = 42 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(0_43_43_20_44); -} else if(%npc_int < 51) { - if(%npc_int = 45 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 54) { - if(%npc_int = 51 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(0_43_43_19_44); -} else if(%npc_int < 57) { - if(%npc_int = 54 & npc_coord ! 0_43_43_19_44) { - npc_tele(0_43_43_19_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 60) { - if(%npc_int = 57 & npc_coord ! 0_43_43_19_44) { - npc_tele(0_43_43_19_44); - } - npc_setmode(none); - npc_walk(0_43_43_20_44); -} else if(%npc_int < 63) { - if(%npc_int = 60 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 66) { - if(%npc_int = 63 & npc_coord ! 0_43_43_20_44) { - npc_tele(0_43_43_20_44); - } - npc_setmode(none); - npc_walk(0_43_43_20_49); -} else if(%npc_int < 69) { - if(%npc_int = 66 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(npc_coord); -} else if(%npc_int < 72) { - if(%npc_int = 69 & npc_coord ! 0_43_43_20_49) { - npc_tele(0_43_43_20_49); - } - npc_setmode(none); - npc_walk(npc_coord); - npc_walk(0_43_43_18_46); -} else if(%npc_int < 75) { - if(%npc_int = 72 & npc_coord ! 0_43_43_18_46) { - npc_tele(0_43_43_18_46); - npc_walk(npc_coord); - return; +if(%npc_int = 100) { + return; +} + +def_coord $dest; +if(%npc_int < 13) { + $dest = enum(int, coord, mm_jail_patrol_route, %npc_int); + if(npc_coord = $dest) { + %npc_int = add(%npc_int, 1); + %npc_int2 = add(map_clock, ~mm_jail_patrol_pause($dest, ^false)); + } else if(map_clock >= add(%npc_int2, 6)) { // doesnt arrive 6t after starting -> tele there + npc_tele($dest); + %npc_int = add(%npc_int, 1); + %npc_int2 = add(map_clock, ~mm_jail_patrol_pause($dest, ^true)); } +} + +if(map_clock < %npc_int2) { npc_setmode(none); npc_walk(npc_coord); - npc_walk(0_43_43_15_50); -} else if(%npc_int = 100) { - if(npc_getmode = none) npc_tele(0_43_43_15_50); + return; } -%npc_int = add(%npc_int, 1); -if(inzone(0_43_43_12_48, 0_43_43_17_52, npc_coord) = true) { - if(npc_getmode = none & %npc_int >= 72) { +if(%npc_int = 13) { + npc_setmode(none); + npc_walk(0_43_43_15_50); + if(map_clock >= add(%npc_int2, 50)) { + npc_tele(0_43_43_15_50); + } + if(inzone(0_43_43_12_48, 0_43_43_17_52, npc_coord) = true) { if(.npc_find(npc_coord, npc_param(next_npc_type), 5, 0) = true) { .%npc_int = 0; + .%npc_int2 = map_clock; + %npc_int = 100; npc_setmode(wander); } } + return; +} + +npc_setmode(none); +npc_walk(enum(int, coord, mm_jail_patrol_route, %npc_int)); + + +[proc,mm_jail_patrol_pause](coord $coord, int $teleported)(int) +// will not stop at these 2 points unless teleported there +// this will always end up happening on the 2nd last point with the old pathing :) +// https://youtu.be/ZVGTjCbg0lA?si=sdUSoSYwzqWM_Nmv&t=167 (notice the pause) +if($coord = 0_43_43_16_46 | $coord = 0_43_43_18_46) { + if($teleported = ^false) { + return(0); + } + return(2); } +return(6); diff --git a/scripts/quests/quest_mm/scripts/mm_kruk.rs2 b/scripts/quests/quest_mm/scripts/mm_kruk.rs2 index 771bebdd43..003980a3ce 100644 --- a/scripts/quests/quest_mm/scripts/mm_kruk.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_kruk.rs2 @@ -7,6 +7,10 @@ if(inv_total(worn, mm_amulet_of_monkey_speak) = 0) { return; } ~chatplayer("Hello?"); +if(%mm_kruk = ^kruk_spoken) { + ~chatnpc("Sorry, I am far too busy dealing with the invaders right now."); + return; +} ~chatnpc("What brings you up here, monkey?"); if(%mm_elder_guard = ^elder_guard_spoken) { ~chatplayer("I have come to seek audience with Awowogei. I am told I need your permission to do so."); diff --git a/scripts/quests/quest_mm/scripts/quest_mm.rs2 b/scripts/quests/quest_mm/scripts/quest_mm.rs2 index 6e789ce0f9..4e2d5130c9 100644 --- a/scripts/quests/quest_mm/scripts/quest_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/quest_mm.rs2 @@ -268,6 +268,9 @@ walktrigger(mm_ch2_walktrigger); queue(mm_ch2_cutscene_queue, 0, 0); [queue,mm_ch2_cutscene_queue] +if(inzone(0_40_71_0_0, 0_40_71_63_63, coord) = false) { + return; +} %mm_cutscene_part = add(%mm_cutscene_part, 1); @mm_ch2_cutscene_dialogue; @@ -368,6 +371,9 @@ walktrigger(mm_ch3_walktrigger); queue(mm_ch3_cutscene_queue, 0, 0); [queue,mm_ch3_cutscene_queue] +if(inzone(0_41_71_0_0, 0_41_71_63_63, coord) = false) { + return; +} %mm_cutscene_part = add(%mm_cutscene_part, 1); @mm_ch3_cutscene_dialogue; @@ -493,6 +499,9 @@ walktrigger(mm_ch4_walktrigger); queue(mm_ch4_cutscene_queue, 0, 0); [queue,mm_ch4_cutscene_queue] +if(inzone(1_41_71_0_0, 1_41_71_63_63, coord) = false) { + return; +} %mm_cutscene_part = add(%mm_cutscene_part, 1); @mm_ch4_cutscene_dialogue; @@ -642,6 +651,7 @@ def_int $op = ~p_choice2_header("Yes", 1, "No", 2, "Do you wish to take one?"); if($op = 2) return; inv_add(inv, mm_reinitialisation_hint, 1); +[oploc1,bunker_teleport] @mm_bunker_teleport; [oploc1,bunker_teleport_floor] @mm_bunker_teleport; [oploc1,bunker_teleport_corner] @mm_bunker_teleport; @@ -729,6 +739,7 @@ switch_int(random(5)) { npc_add(map_findsquare(coord, 0, 10, ^map_findsquare_lineofsight), $main_guard, 50); spotanim_map(smokepuff, npc_coord, 50, 0); +sound_synth(smokepuff, 0, 0); %npc_aggressive_player = uid; npc_setmode(opplayer2); @@ -737,6 +748,7 @@ def_int $count = 0; while(random(2) = 0 & $count < 3) { npc_add(map_findsquare($main_coord, 1, 1, ^map_findsquare_lineofsight), mm_monkey_guard, 50); spotanim_map(smokepuff, npc_coord, 50, 0); + sound_synth(smokepuff, 0, 0); %npc_aggressive_player = uid; npc_setmode(opplayer2); $count = add($count,1); @@ -756,6 +768,36 @@ p_delay(1); p_teleport(movecoord(coord, 0, -1, 0)); mes("You climb down the ladder."); +[oploc1,mm_bamboo_ladder_top_reverse] +p_delay(0); +anim(human_reachforladder, 0); +p_delay(1); +def_int $dx = 0; +def_int $dz = 0; +switch_int(loc_angle) { + case ^loc_west : $dx = 1; + case ^loc_north : $dz = -1; + case ^loc_east : $dx = -1; + case ^loc_south : $dz = 1; +} +p_teleport(movecoord(loc_coord, $dx, -1, $dz)); +mes("You climb down the ladder."); + +[oploc1,mm_bamboo_ladder_reverse] +p_delay(0); +anim(human_reachforladder, 0); +p_delay(1); +def_int $dx = 0; +def_int $dz = 0; +switch_int(loc_angle) { + case ^loc_west : $dx = -1; + case ^loc_north : $dz = 1; + case ^loc_east : $dx = 1; + case ^loc_south : $dz = -1; +} +p_teleport(movecoord(loc_coord, $dx, 1, $dz)); +mes("You climb up the ladder."); + [oploc1,mm_bamboo_ladder_watchtower_west] p_delay(0); anim(human_reachforladder, 0); @@ -817,6 +859,16 @@ if($op = 2) { } inv_add(inv, iron_scimitar, 1); +[oploc1,mm_bronze_scimitar_crate] +mes("You search the crate."); +p_delay(2); +~objbox(iron_scimitar, "This crate is full of ... bronze scimitars!", 250, 0, 0); +def_int $op = ~p_choice2_header("Yes", 1, "No", 2, "Do you wish to take one?"); +if($op = 2) { + return; +} +inv_add(inv, bronze_scimitar, 1); + [oploc1,mm_tinderbox_crate] mes("You search the crate."); p_delay(2); @@ -897,6 +949,9 @@ if($op = 2) { } inv_add(inv, mm_eye_of_gnome, 1); +[oploc2,mm_bookcase] +mes("You find nothing to suit your reading taste here."); + [oploc1,mm_pineapple_plant_one] // no invspace loc_change(pineapple_plant_no_pineapples, 50); diff --git a/scripts/skill_woodcutting/configs/trees.dbrow b/scripts/skill_woodcutting/configs/trees.dbrow index cffd8d99cb..91eee13299 100644 --- a/scripts/skill_woodcutting/configs/trees.dbrow +++ b/scripts/skill_woodcutting/configs/trees.dbrow @@ -25,7 +25,8 @@ data=tree,evergreen data=tree,regicide_tree_large data=tree,regicide_tree_large2 data=tree,regicide_tree_large3 -data=tree,regicide_tree_small +data=tree,mm_bush_kharazi_jungle_tree1 +data=tree,mm_bush_kharazi_jungle_tree2 data=levelrequired,0 data=productexp,250 data=product,logs From 30ce89120a30c718b145274234491aecd82de49d Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sat, 25 Jul 2026 23:12:34 -0400 Subject: [PATCH 02/10] readd regicide_tree_small to tree table --- scripts/skill_woodcutting/configs/trees.dbrow | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/skill_woodcutting/configs/trees.dbrow b/scripts/skill_woodcutting/configs/trees.dbrow index 91eee13299..89875512f3 100644 --- a/scripts/skill_woodcutting/configs/trees.dbrow +++ b/scripts/skill_woodcutting/configs/trees.dbrow @@ -25,6 +25,7 @@ data=tree,evergreen data=tree,regicide_tree_large data=tree,regicide_tree_large2 data=tree,regicide_tree_large3 +data=tree,regicide_tree_small data=tree,mm_bush_kharazi_jungle_tree1 data=tree,mm_bush_kharazi_jungle_tree2 data=levelrequired,0 From 069e872893f1768673b060f998089bad50b38ced Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 11:29:00 -0400 Subject: [PATCH 03/10] typo fixes and poison arrow objbox --- scripts/quests/quest_mm/scripts/mm_archer.rs2 | 14 ++++++++++- .../quests/quest_mm/scripts/mm_caranock.rs2 | 2 +- scripts/quests/quest_mm/scripts/mm_daero.rs2 | 3 ++- scripts/quests/quest_mm/scripts/mm_garkor.rs2 | 4 ++-- .../quests/quest_mm/scripts/mm_journal.rs2 | 2 +- scripts/quests/quest_mm/scripts/mm_lumo.rs2 | 3 ++- .../quests/quest_mm/scripts/mm_narnode.rs2 | 4 +++- .../quests/quest_mm/scripts/mm_zooknock.rs2 | 23 +++++++++++++------ scripts/quests/quest_mm/scripts/quest_mm.rs2 | 7 +++++- 9 files changed, 46 insertions(+), 16 deletions(-) diff --git a/scripts/quests/quest_mm/scripts/mm_archer.rs2 b/scripts/quests/quest_mm/scripts/mm_archer.rs2 index 68cc1ff178..a1f1e750c6 100644 --- a/scripts/quests/quest_mm/scripts/mm_archer.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_archer.rs2 @@ -71,7 +71,6 @@ anim(human_death, 0); p_delay(2); ~fade_out; p_delay(3); -// no poison arrow thing here? watched tons of videos and never saw it p_teleport(movecoord(0_43_43_18_41, randominc(6), 0, randominc(1))); walktrigger(wake_up); ~combat_clearqueue; @@ -82,4 +81,17 @@ queue(lumo_jailed_dialogue, 10, 0); if(%mm_jail_count < 255) %mm_jail_count = add(%mm_jail_count, 1); ~fade_in; p_delay(4); +def_int $severity = ~random_range(10, 20); +if(random(10) = 0) { // seems random originally? only have one video of it: youtube.com/watch?si=-n3GpFUbwPR5L3PB&t=32&v=YGXz6CqRqig&feature=youtu.be + // assume the severity should be the same as the rest of the ape atoll stuff, maybe thats why it doesnt happen everytime? + // its not wrapped in the antipsn check, the player in the video is antipoisoned (same behaviour as osrs in this case) + if (%poison > -1) { + if (%poison > $severity) { + mes("You have been poisoned!"); + ~set_poison_timer; + %poison = $severity; + } + } + ~objbox(iron_arrow_p, "You have been hit by poisoned arrows and knocked out!", 250, 0, 0); +} if_openoverlay(null); diff --git a/scripts/quests/quest_mm/scripts/mm_caranock.rs2 b/scripts/quests/quest_mm/scripts/mm_caranock.rs2 index 5ca82db719..8561140c28 100644 --- a/scripts/quests/quest_mm/scripts/mm_caranock.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_caranock.rs2 @@ -40,7 +40,7 @@ else if(%mm_caranock = ^mm_asked_caranock) { [label,mm_caranock_p3] %mm_caranock = ^mm_caranock_p3; -~chatnpc("I shall personally see to the decommission. You should report to the King immediately."); +~chatnpc("I shall see personally to the decommission. You should report to the King immediately."); [label,mm_shipyardworker_dialogue] ~chatplayer("I am on a special mission for King Narnode of the Gnomes."); diff --git a/scripts/quests/quest_mm/scripts/mm_daero.rs2 b/scripts/quests/quest_mm/scripts/mm_daero.rs2 index 2a4cc615f1..591c6f8d0e 100644 --- a/scripts/quests/quest_mm/scripts/mm_daero.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_daero.rs2 @@ -73,7 +73,8 @@ switch_int(%mm_daero) { .npc_setmode(apnpc1); ~chatnpc_specific(nc_name(mm_daero), mm_daero, "Not just any old visitor Waydar; this is the person who exposed Glough and defeated his demon."); ~chatnpc_specific(nc_name(mm_waydar), mm_waydar, "I see. Well, there are no more demons left here."); - ~chatnpc_specific(nc_name(mm_daero), mm_daero, "Quite. He is now on a secret mission for the King."); + ~chatnpc_specific(nc_name(mm_daero), mm_daero, "Quite. is now on a secret mission for the King."); + ~chatnpc_specific(nc_name(mm_daero), mm_daero, "As you know, the 10th squad went missing during their mission to decommission the eastern shipyard of Karamja."); ~chatnpc_specific(nc_name(mm_daero), mm_daero, "We still do not know what happened, but evidence suggests they were blown far off course to the south."); ~chatnpc_specific(nc_name(mm_waydar), mm_waydar, "Their standard gliders must have fallen prey to the tropical weather."); ~chatnpcnoturn("When reinitialisation has been completed, you are to fly to the south of Karamja with and accompany on the mission."); diff --git a/scripts/quests/quest_mm/scripts/mm_garkor.rs2 b/scripts/quests/quest_mm/scripts/mm_garkor.rs2 index 600073b2f4..d0dc093273 100644 --- a/scripts/quests/quest_mm/scripts/mm_garkor.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_garkor.rs2 @@ -95,12 +95,12 @@ switch_int(%mm_garkor) { case ^mm_not_started : ~chatplayer("Hello?"); ~chatnpc("A fine day you have chosen to visit this hellish island, human."); - ~chatplayer("Good day to you too Sergeant. I've been sent by your King Narnode to -"); + ~chatplayer("Good day to you to Sergeant. I've been sent by your King Narnode to -"); ~chatnpc("Investigate the circumstances surrounding the mysterious disappearance of my squad. Yes, I know."); ~chatplayer("How did you know that?"); ~chatnpc("The King and I are still in communication, albeit sporadic. I decided I need a human of your calibre to assist me. It is pleasing to see you are still alive."); ~chatplayer("Why do you need a human?"); - ~chatnpc("There is more going on than meets your eye, human. Did you not find it strange that an entire squad be sent to decommission a shipyard?"); + ~chatnpc("There is more going on than meets your eye, human. Did you not find it strange that an entire squad be sent to decomission a shipyard?"); ~chatplayer("Well -"); ~chatnpc("Indeed. But there are more pressing matters at hand. Three of my squad have been captured and placed in the jail. They are watched over by somewhat overpowering guards."); ~chatnpc("Before we can resume our original mission we must rescue them."); diff --git a/scripts/quests/quest_mm/scripts/mm_journal.rs2 b/scripts/quests/quest_mm/scripts/mm_journal.rs2 index 2dee4dee0f..78fd0ce935 100644 --- a/scripts/quests/quest_mm/scripts/mm_journal.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_journal.rs2 @@ -1,7 +1,7 @@ [if_button,questlist:mm] def_string $text; if(%mm_main = ^mm_not_started) { - $text = "@dbl@In @dre@The Grand Tree@dbl@, I exposed the treachery of @dre@King Narnode Shareen's@dbl@ then High Tree Guardian, @dre@Glough@dbl@. @dre@Glough@dbl@ has since been deposed. To start this quest I must check how @dre@King Shareen@dbl@ is fairing."; + $text = "@dbl@In @dre@The Grand Tree@dbl@, I exposed the treachery of @dre@King Narnode Shareen's@dbl@ then High Tree Guardian, @dre@Glough@dbl@. @dre@Glough@dbl@ has since been deposed. To start this quest I must check how @dre@King Shareen@dbl@ is faring."; $text = append($text, "||@dbl@To complete this quest I need:|@dbl@- To be able to defeat a @dre@level 195 Jungle Demon"); ~quest_journal("Monkey Madness", $text); return; diff --git a/scripts/quests/quest_mm/scripts/mm_lumo.rs2 b/scripts/quests/quest_mm/scripts/mm_lumo.rs2 index 8d895428be..f376bbd5bc 100644 --- a/scripts/quests/quest_mm/scripts/mm_lumo.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_lumo.rs2 @@ -164,7 +164,8 @@ switch_int(%mm_lumo) { ~chatnpc("So human, what can we do for you?"); } ~chatplayer("Well I suppose I ought to help you escape."); -~chatnpc_specific(nc_name(mm_bunkdo), mm_bunkdo, "No, it's alright, , we quite like it in here."); +// https://youtu.be/qMJyd1UJjlI?si=g9Vx4lN3fKCuIckN&t=1119 +~chatnpc_specific(nc_name(mm_bunkdo), mm_bunkdo, "No it's alright , we quite like it in here."); ~chatnpc("Do your best to ignore him..."); if(inzone(0_43_43_18_41, 0_43_43_24_43, coord) = false) { ~chatnpc("Not all of us were captured. If you have not done so, you should make contact with those of us who escaped."); diff --git a/scripts/quests/quest_mm/scripts/mm_narnode.rs2 b/scripts/quests/quest_mm/scripts/mm_narnode.rs2 index 390ad26767..b4aa91f816 100644 --- a/scripts/quests/quest_mm/scripts/mm_narnode.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_narnode.rs2 @@ -185,7 +185,7 @@ while($op ! null) { [label,mm_narnode_p5] %mm_narnode = ^narnode_southern_winds; -~chatplayer("Caranock suggested they were blown off course by extreme southern winds."); +~chatplayer("Caranock suggested they were blown off course by extreme southerly winds."); ~chatnpc("Do you believe him?"); @mm_narnode_p6; @@ -198,3 +198,5 @@ p_delay(3); %mm_narnode = ^narnode_received_orders; inv_add(inv, mm_narnode_orders, 1); ~objbox(mm_narnode_orders, "Narnode hands you some handwritten orders.", 250, 0, 0); +~chatplayer("Where will I find Daero?"); +~chatnpc("You will find him attending to business somewhere on the Grand Tree."); diff --git a/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 b/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 index a9fbc12c8e..1a1a743f67 100644 --- a/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 @@ -27,7 +27,7 @@ switch_int(%mm_zooknock) { @mm_zooknock_p2; case ^mm_not_started : ~chatplayer("Hello?"); - ~chatnpcnoturn("A human... here? What business have you on Ape Atoll?"); + ~chatnpcnoturn("A human ... here? What business have you on Ape Atoll?"); ~chatplayer("I am on a mission for King Narnode Shareen of the Gnomes."); ~chatplayer("I have been sent to investigate the whereabouts of the 10th squad of his Royal Guard, which went missing during a recent mission to Karamja."); ~chatnpcnoturn("Well you've found us - what's left of us, that is."); @@ -37,6 +37,14 @@ switch_int(%mm_zooknock) { @mm_zooknock_p2; } +[proc,zooknock_handed_item_line] +switch_int(random(4)) { + case 0 : ~chatnpc("Nicely done."); + case 1 : ~chatnpc("Well done, human."); + case 2 : ~chatnpc("Good work."); + case default : ~chatnpc("Excellent."); +} + [opnpcu,mm_zooknock] if(%mm_zooknock < ^zooknock_need_items) { ~displaymessage(^dm_default); @@ -55,7 +63,7 @@ switch_obj(last_useitem) { %mm_zooknock_has_dentures = ^true; inv_del(inv, mm_monkey_dentures, 1); ~objbox(mm_monkey_dentures, "You hand Zooknock the magical monkey dentures.", 250, 0, ^objbox_height); - ~chatnpc("Nicely done."); + ~zooknock_handed_item_line; } ~mm_zooknock_amulet_check; case gold_bar : @@ -69,7 +77,7 @@ switch_obj(last_useitem) { %mm_zooknock_has_gold_bar = ^true; inv_del(inv, gold_bar, 1); ~objbox(gold_bar, "You hand Zooknock the gold bar.", 250, 0, 0); - ~chatnpc("Good work."); + ~zooknock_handed_item_line; } ~mm_zooknock_amulet_check; case mm_monkey_amulet_mould : @@ -83,7 +91,7 @@ switch_obj(last_useitem) { %mm_zooknock_has_amulet_mould = ^true; inv_del(inv, mm_monkey_amulet_mould, 1); ~objbox(mm_monkey_amulet_mould, "You hand Zooknock the monkey amulet mould.", 250, 0, divide(^objbox_height, 2)); - ~chatnpc("Well done, human."); + ~zooknock_handed_item_line; } ~mm_zooknock_amulet_check; case mm_small_ninja_monkey_bones, mm_medium_ninja_monkey_bones, mm_normal_gorilla_monkey_bones, mm_bearded_gorilla_monkey_bones, mm_normal_monkey_bones, mm_small_zombie_monkey_bones, mm_large_zombie_monkey_bones : @@ -108,7 +116,7 @@ switch_obj(last_useitem) { %mm_zooknock_monkey_relic = oc_param($last_useitem, mm_bones_type); inv_del(inv, $last_useitem, 1); ~objbox(last_useitem, "You hand Zooknock the monkey remains.", 250, 0, 0); - ~chatnpc("Excellent."); + ~zooknock_handed_item_line; ~mm_zooknock_talisman_check; } case mm_monkey_talisman : @@ -122,7 +130,7 @@ switch_obj(last_useitem) { %mm_zooknock_has_magical_talisman = ^true; inv_del(inv, last_useitem, 1); ~objbox(last_useitem, "You hand Zooknock the monkey talisman.", 250, 0, 0); - ~chatnpc("Well done, human."); + ~zooknock_handed_item_line; } ~mm_zooknock_talisman_check; case mm_monkey_greegree_for_small_ninja_monkey, mm_monkey_greegree_for_medium_ninja_monkey, mm_monkey_greegree_for_normal_gorilla, mm_monkey_greegree_for_bearded_gorilla, @@ -263,6 +271,7 @@ while($op ! null) { } else if($op = 3) { ~chatplayer("Where do I find something to do with monkey speech?"); ~chatnpc("I don't know. I'm sure you'll think of something."); + $op = ~p_choice4("Where do I find a gold bar?", 1, "Where do I find a monkey amulet mould?", 2, "Where do I find something to do with monkey speech?", 3, "I'll be back later.", 4); } else if($op = 4) { ~chatplayer("I'll be back later."); $op = null; @@ -322,7 +331,7 @@ while($op ! null) { [label,mm_zooknock_p2] ~chatnpcnoturn("Your story first, human. What possessed you to travel to this forsaken island?"); ~chatplayer("I am currently in the service of your King. I was the human who exposed Glough's warfaring plans and defeated his demon."); -~chatplayer("As far as I understand, the 10th squad were sent to oversee the decommission of Glough's shipyard in east Karamja."); +~chatplayer("As far as I understand, the 10th squad were sent to oversee the decomission of Glough's shipyard in east Karamja."); ~chatplayer("Rumour has it you were blown off course. The King worried as to your fate, and sent me to investigate."); ~chatnpcnoturn("You were sent alone?"); ~chatplayer("No, I have been accompanied by Flight Commander Waydar. We flew south on a special type of glider and landed on a small island to our east."); diff --git a/scripts/quests/quest_mm/scripts/quest_mm.rs2 b/scripts/quests/quest_mm/scripts/quest_mm.rs2 index 4e2d5130c9..23c6361785 100644 --- a/scripts/quests/quest_mm/scripts/quest_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/quest_mm.rs2 @@ -1041,7 +1041,12 @@ queue(damage_player, 0, 1); p_teleport(0_43_42_51_36); [opobj1,mm_enchanted_gold_bar] -~objbox(mm_enchanted_gold_bar, "The enchanted gold bar says:|@dbl@<~monkeyspeak_text>", 250, 0, 0); +def_string $text = "<~monkeyspeak_text>"; +if(inv_total(worn, mm_amulet_of_monkey_speak) > 0) { + if(random(2) = 0) $text = "'I'm stuck in this horrible gold bar!'"; + else $text = "'Argh! Get me out of here!'"; +} +~objbox(mm_enchanted_gold_bar, "The enchanted gold bar says:|@dbl@<$text>", 250, 0, 0); [oplocu,mm_pyre] if(last_useitem = mm_enchanted_gold_bar) { From 936681397715aed35f16efdf349d923d7ab64f6b Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 13:18:56 -0400 Subject: [PATCH 04/10] check for talisman using timer instead of var --- scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 index 8307ebd065..0cde87578d 100644 --- a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 @@ -43,7 +43,7 @@ if(%mm_monkey_child = ^mm_not_started) { @mm_child_give_bananas; } else if(%mm_monkey_child = ^monkey_child_given_bananas) { ~chatplayer("Has Aunty given you the toy yet?"); - if(%mm_monkey_child_waiting_for_talisman = ^false) { + if(gettimer(mm_give_child_toy) = 0) { ~chatnpc("Yeah - it's really neat!"); ~chatplayer("Can I borrow it now then?"); ~chatnpc("But I only just got it!"); From 0a8eb735d02242d71efd9c28f4bf3cd0aca8c286 Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 13:21:51 -0400 Subject: [PATCH 05/10] update comparison --- scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 index 0cde87578d..5bc56908f0 100644 --- a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 @@ -43,7 +43,7 @@ if(%mm_monkey_child = ^mm_not_started) { @mm_child_give_bananas; } else if(%mm_monkey_child = ^monkey_child_given_bananas) { ~chatplayer("Has Aunty given you the toy yet?"); - if(gettimer(mm_give_child_toy) = 0) { + if(gettimer(mm_give_child_toy) = -1) { ~chatnpc("Yeah - it's really neat!"); ~chatplayer("Can I borrow it now then?"); ~chatnpc("But I only just got it!"); From be646de36a57b8a4dd58629328cd93e90d2d8aeb Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 13:24:55 -0400 Subject: [PATCH 06/10] clear toy timer when it runs --- scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 index 5bc56908f0..372a3b1669 100644 --- a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 @@ -126,6 +126,7 @@ if(%mm_monkey_child > ^monkey_child_asked_who) { [timer,mm_give_child_toy] %mm_monkey_child_waiting_for_talisman = ^false; +cleartimer(mm_give_child_toy); // not setting anything here its just for the check (seems like only the one varb exists for this) [timer,mm_child_crying] From 886fbda52f5ed443ce971ad9682af19178366b4f Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 13:29:24 -0400 Subject: [PATCH 07/10] change comparison again to make it consistent --- scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 index 372a3b1669..c1a0f9e9e7 100644 --- a/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_monkey_child.rs2 @@ -43,7 +43,7 @@ if(%mm_monkey_child = ^mm_not_started) { @mm_child_give_bananas; } else if(%mm_monkey_child = ^monkey_child_given_bananas) { ~chatplayer("Has Aunty given you the toy yet?"); - if(gettimer(mm_give_child_toy) = -1) { + if(gettimer(mm_give_child_toy) < 1) { ~chatnpc("Yeah - it's really neat!"); ~chatplayer("Can I borrow it now then?"); ~chatnpc("But I only just got it!"); From 8316bdb0ebd7c289b714d19390c17186c5d004ae Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 14:41:46 -0400 Subject: [PATCH 08/10] couple more typo fixes and missing mes on temple stairs --- scripts/quests/quest_mm/scripts/mm_awowogei.rs2 | 4 +++- scripts/quests/quest_mm/scripts/quest_mm.rs2 | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 b/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 index fce6d09b8c..9260cc6b56 100644 --- a/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_awowogei.rs2 @@ -77,7 +77,7 @@ switch_int(%mm_awowogei) { facesquare(loc_coord); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "I must admit, I have always regarded your kind as our inferior cousins, visitor."); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "However, I am well aware that you may have a few things to offer."); - ~chatnpc("Don't listen to him, Awowogei!"); + ~chatnpc("Don't listen to him Awowogei!"); facesquare(loc_coord); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "Be silent, Uwogo."); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "I have heard your kind are exceptionally resourceful. I wish to put this reputation to the test."); @@ -111,3 +111,5 @@ loc_anim(m_monkey_ape_ruler_nod); ~chatplayer("Thank you."); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "You are clearly well acquainted with the ways of this world. We will talk more on this later."); ~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "In the meantime, feel free to remain as long as you like on my island."); +~chatplayer("What about the proposed alliance, Awowogei?"); +~chatnpc_specific(nc_name(mm_awowogei_cutscene), mm_awowogei_cutscene, "I must think upon it some more and discuss the matter with my advisers. We will contact you when we are ready."); \ No newline at end of file diff --git a/scripts/quests/quest_mm/scripts/quest_mm.rs2 b/scripts/quests/quest_mm/scripts/quest_mm.rs2 index 23c6361785..375df338ff 100644 --- a/scripts/quests/quest_mm/scripts/quest_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/quest_mm.rs2 @@ -591,7 +591,7 @@ if(npc_findexact(1_41_71_53_34, mm_waydar_cutscene) = true & .npc_findexact(1_41 } if(%mm_cutscene_part = 20) { %mm_cutscene_part = add(%mm_cutscene_part, 1); - ~chatnpc("Ignore . My colleague's official mission was to look after a human in the area, but don't worry: it is probably dead already."); + ~.chatnpc("Ignore . My colleague's official mission was to look after a human in the area, but don't worry: it is probably dead already."); } if(%mm_cutscene_part = 21) { %mm_cutscene_part = add(%mm_cutscene_part, 1); @@ -1088,9 +1088,11 @@ mes("You put some string on your amulet. It makes a slight 'Ook' sound."); [oploc1,mm_stairs_base] p_teleport(movecoord(coord, 0, 1, 4)); +mes("You climb up the stairs."); [oploc1,mm_stairs_top] p_teleport(movecoord(coord, 0, -1, -4)); +mes("You climb down the stairs."); [oploc1,mm_bananatreeempty] mes("There are no bananas left on the tree."); From 044a65034b9ada6ed8c101aec03f466e8f9ad039 Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 15:45:19 -0400 Subject: [PATCH 09/10] cutscene angle change, fishing spot and alch fix, some more dialogue fixes --- scripts/quests/quest_mm/scripts/mm_daero.rs2 | 7 +++++++ scripts/quests/quest_mm/scripts/mm_demon.rs2 | 4 +++- scripts/quests/quest_mm/scripts/mm_journal.rs2 | 2 +- scripts/quests/quest_mm/scripts/mm_zooknock.rs2 | 1 + scripts/quests/quest_mm/scripts/quest_mm.rs2 | 8 +++++--- scripts/skill_fishing/configs/fishing_movement.enum | 2 +- scripts/skill_magic/scripts/spells/alchemy.rs2 | 4 ++++ 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/scripts/quests/quest_mm/scripts/mm_daero.rs2 b/scripts/quests/quest_mm/scripts/mm_daero.rs2 index 591c6f8d0e..9a2f581b97 100644 --- a/scripts/quests/quest_mm/scripts/mm_daero.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_daero.rs2 @@ -6,6 +6,13 @@ if(%mm_narnode < ^narnode_received_orders) { ~mesbox("Daero seems like he is enjoying himself too much to talk."); return; } +if(%mm_main = ^mm_complete_training) { + ~chatplayer("I need to return to Crash Island."); + ~chatnpc("You know the routine..."); + ~objbox(eye_patch, "You wear the blindfold Daero hands you.", 250, 0, 0); + ~daero_move_hangar; + return; +} if(%mm_main = ^mm_complete) { @daero_training; } else if(%mm_daero >= ^daero_left_grandtree) { diff --git a/scripts/quests/quest_mm/scripts/mm_demon.rs2 b/scripts/quests/quest_mm/scripts/mm_demon.rs2 index 5fa58b6fff..c15f546fe2 100644 --- a/scripts/quests/quest_mm/scripts/mm_demon.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_demon.rs2 @@ -475,7 +475,9 @@ if(%mm_garkor < ^garkor_finished_mission) { ~chatplayer("Thank you."); } ~chatnpc("You should report to King Narnode immediately. Tell him that the 10th squad still survives and has suffered no casualties."); -~chatplayer("Rest assured, I will do so. How do I leave this place?"); +// https://youtu.be/Qr9nNWqN6Y8?si=07TYRisnQ7ak9jmU&t=4256 +~chatplayer("Rest assured, I will do so."); +~chatplayer("How do I leave this place?"); if(%mm_garkor < ^garkor_finished_mission) %mm_garkor = ^garkor_finished_mission; ~chatnpc("Speak to Zooknock. He will arrange for you to leave."); if(npc_find(coord, mm_zooknock_final_battle, 15, 0) = true) { diff --git a/scripts/quests/quest_mm/scripts/mm_journal.rs2 b/scripts/quests/quest_mm/scripts/mm_journal.rs2 index 78fd0ce935..8ece4ebee5 100644 --- a/scripts/quests/quest_mm/scripts/mm_journal.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_journal.rs2 @@ -317,7 +317,7 @@ if(%mm_main > ^mm_reported_narnode) { if(%mm_main >= ^mm_complete) $text = append($text, "||@red@QUEST COMPLETE!"); if(%mm_main > ^mm_complete) { - $text = append($text, "||@str@I found Daero and enrolled in the Royal Guard training@str@programme. I underwent a series of exercises designed to@str@increase strength and stamina. This was followed by training@str@my attack and defence techniques."); + $text = append($text, "||@str@I found Daero and enrolled in the Royal Guard training @str@programme. I underwent a series of exercises designed to @str@increase strength and stamina. This was followed by training @str@my attack and defence techniques."); } else if(%mm_main = ^mm_complete) { $text = append($text, "||@dbl@I should find Daero and enroll with the Royal Guard training programme."); } diff --git a/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 b/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 index 1a1a743f67..18ab302ee7 100644 --- a/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 +++ b/scripts/quests/quest_mm/scripts/mm_zooknock.rs2 @@ -106,6 +106,7 @@ switch_obj(last_useitem) { ~chatplayer("Yes."); %mm_zooknock_has_monkey_relic = ^true; %mm_zooknock_monkey_relic = oc_param($last_useitem, mm_bones_type); + inv_del(inv, $last_useitem, 1); ~objbox($last_useitem, "You hand Zooknock the monkey remains.", 250, 0, 0); case 2 : ~chatplayer("Actually, no."); diff --git a/scripts/quests/quest_mm/scripts/quest_mm.rs2 b/scripts/quests/quest_mm/scripts/quest_mm.rs2 index 375df338ff..65c48b6f8e 100644 --- a/scripts/quests/quest_mm/scripts/quest_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/quest_mm.rs2 @@ -234,7 +234,9 @@ if_openmain(inter_199); p_delay(4); if_close; if(npc_findexact(1_41_71_54_35, mm_awowogei_cutscene) = true) { - p_teleport(1_41_71_47_28); + // https://youtu.be/Qr9nNWqN6Y8?si=g2jLc94-ao414-5r&t=3784 + // cutscene start and facing is different compared to osrs + p_teleport(1_41_71_47_35); npc_facesquare(1_41_71_53_35); if_settab(null, ^tab_magic); p_delay(0); @@ -246,8 +248,8 @@ if(npc_findexact(1_41_71_54_35, mm_awowogei_cutscene) = true) { walktrigger(mm_ch4_walktrigger); if_settext(music:com_177, "Suspicious"); midi_song("suspicious"); - cam_moveto(1_41_71_47_36, 600, 232, 232); - cam_lookat(1_41_71_53_35, 160, 232, 232); + cam_moveto(1_41_71_47_35, 740, 232, 232); + cam_lookat(1_41_71_53_35, 240, 232, 232); @mm_ch4_cutscene_dialogue; } } diff --git a/scripts/skill_fishing/configs/fishing_movement.enum b/scripts/skill_fishing/configs/fishing_movement.enum index 0b58dca8c8..7880157ba8 100644 --- a/scripts/skill_fishing/configs/fishing_movement.enum +++ b/scripts/skill_fishing/configs/fishing_movement.enum @@ -467,7 +467,7 @@ val=14,0_53_51_47_20 inputtype=int outputtype=coord val=0,0_43_42_19_45 -val=1,0_41_57_28_53 +val=1,0_43_42_28_53 [fishing_movement_0_42_42_memberfish_enum] inputtype=int diff --git a/scripts/skill_magic/scripts/spells/alchemy.rs2 b/scripts/skill_magic/scripts/spells/alchemy.rs2 index 9f3286fe7f..5ec6936831 100644 --- a/scripts/skill_magic/scripts/spells/alchemy.rs2 +++ b/scripts/skill_magic/scripts/spells/alchemy.rs2 @@ -109,5 +109,9 @@ switch_obj($item) { mes("You cannot use alchemy on that item."); return(false); } + if(oc_category($item) = mm_greegree) { + mes("The magic of the monkeys defies alchemy."); + return(false); + } } return(true); From 6103b1617420c6dc45e65331541a8b356900e829 Mon Sep 17 00:00:00 2001 From: Indio3 Date: Sun, 26 Jul 2026 16:06:58 -0400 Subject: [PATCH 10/10] fix objbox obj for scim cart --- scripts/quests/quest_mm/scripts/quest_mm.rs2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/quests/quest_mm/scripts/quest_mm.rs2 b/scripts/quests/quest_mm/scripts/quest_mm.rs2 index 65c48b6f8e..679a1faffb 100644 --- a/scripts/quests/quest_mm/scripts/quest_mm.rs2 +++ b/scripts/quests/quest_mm/scripts/quest_mm.rs2 @@ -864,7 +864,7 @@ inv_add(inv, iron_scimitar, 1); [oploc1,mm_bronze_scimitar_crate] mes("You search the crate."); p_delay(2); -~objbox(iron_scimitar, "This crate is full of ... bronze scimitars!", 250, 0, 0); +~objbox(bronze_scimitar, "This crate is full of ... bronze scimitars!", 250, 0, 0); def_int $op = ~p_choice2_header("Yes", 1, "No", 2, "Do you wish to take one?"); if($op = 2) { return;