// TMW-2 Script // Author: Jesusalva // Desc: Grand Hunter Quest Utils // MobID function script GHQ_GetQuestIDByMonsterID { switch (getarg(0)) { case Maggot: return 1; break; case Snake: return 2; break; case Scorpion: return 3; break; case ForestMushroom: return 4; break; case Pinkie: return 5; break; case Moggun: return 6; break; case Fluffy: return 7; break; case MountainSnake: return 8; break; case Duck: return 9; break; case Bat: return 10; break; case GreenDragon: return 11; break; default: return Exception("GHQ GQID: Invalid ID: "+getarg(0), RB_DEFAULT^RB_PLEASEREPORT|RB_ISFATAL); break; } } // QuestID (basically reverses the previous code) function script GHQ_GetMonsterIDByQuestID { switch (getarg(0)) { case 1: return Maggot; break; case 2: return Snake; break; case 3: return Scorpion; break; case 4: return ForestMushroom; break; case 5: return Pinkie; break; case 6: return Moggun; break; case 7: return Fluffy; break; case 8: return MountainSnake; break; case 9: return Duck; break; case 10: return Bat; break; case 11: return GreenDragon; break; default: return Exception("GHQ GMID: Invalid ID: "+getarg(0), RB_DEFAULT^RB_PLEASEREPORT|RB_ISFATAL); break; } } ///////////////////////////////////////////////////////////////////////////////// // Handle milestone rewards; it does NOT update stuff // Syntax: GHQ_GetRewardsOnMilestone ( rewardoverrideid ) function script GHQ_GetRewardsOnMilestone { // Check if you can store a Strange Coin (you really should) // Another item too, which I'm sure you won't get it anywhere. inventoryplace StrangeCoin, 1, NPCEyes, 1; // Global setup .@q=getq(General_Hunter); .@k=getq2(General_Hunter); .@monsterId=GHQ_GetMonsterIDByQuestID(getq(General_Hunter)); // Setup .@old=GHMEMO[getq(General_Hunter)]; .@new=getq2(General_Hunter); .@blv=strmobinfo(3, .@monsterId); .@bhp=strmobinfo(4, .@monsterId); .@bxp=getmonsterinfo(.@monsterId, MOB_BASEEXP); .@xp=0; .@gp=0; .@jp=0; .@sc=0; //if (getq2(General_Hunter) >= 10000) goto L_Finish; // 1st step: 1000 kills if (is_between(.@old, .@new, 1000)) { mesc l("Goal: @@/@@ reached!", .@new, 1000), 2; .@xp+=.@bxp*10; .@gp+=(.@bhp/2); .@jp+=10; } else if (.@new < 1000) { mesc l("@@: @@/@@", l("1st step"), .@new, 1000); } // 2nd step: 2000 kills if (is_between(.@old, .@new, 2000)) { mesc l("Goal: @@/@@ reached!", .@new, 2000), 2; .@xp+=.@bxp*20; .@gp+=.@bhp; .@jp+=20; } else if (.@new < 2000) { mesc l("@@: @@/@@", l("2nd step"), .@new, 2000); } // BONUS step: 2500 kills if (is_between(.@old, .@new, 2500)) { mesc l("Bonus Goal: @@/@@ reached!", .@new, 2500), 2; .@sc=1+(.@blv/10); } // 3rd step: 3000 kills if (is_between(.@old, .@new, 3000)) { mesc l("Goal: @@/@@ reached!", .@new, 3000), 2; .@xp+=.@bxp*30; .@gp+=.@bhp; .@jp+=30; } else if (.@new < 3000) { mesc l("@@: @@/@@", l("3rd step"), .@new, 3000); } // 4th step: 4000 kills if (is_between(.@old, .@new, 4000)) { mesc l("Goal: @@/@@ reached!", .@new, 4000), 2; .@xp+=.@bxp*40; .@gp+=.@bhp; .@jp+=40; } else if (.@new < 4000) { mesc l("@@: @@/@@", l("4th step"), .@new, 4000); } // 5th step: 5000 kills if (is_between(.@old, .@new, 5000)) { mesc l("Goal: @@/@@ reached!", .@new, 5000), 2; .@sc=1+(.@blv/10); .@xp+=.@bxp*50; .@gp+=.@bhp; .@jp+=50; } else if (.@new < 5000) { mesc l("@@: @@/@@", l("bonus step"), .@new, 5000); } // 6th step: 6000 kills if (is_between(.@old, .@new, 6000)) { mesc l("Goal: @@/@@ reached!", .@new, 6000), 2; .@xp+=.@bxp*60; .@gp+=.@bhp; .@jp+=60; } else if (.@new < 6000) { mesc l("@@: @@/@@", l("6th step"), .@new, 6000); } // 7th step: 7000 kills if (is_between(.@old, .@new, 7000)) { mesc l("Goal: @@/@@ reached!", .@new, 7000), 2; .@xp+=.@bxp*70; .@gp+=.@bhp; .@jp+=70; } else if (.@new < 7000) { mesc l("@@: @@/@@", l("7th step"), .@new, 7000); } // BONUS step: 7500 kills if (is_between(.@old, .@new, 7500)) { mesc l("Bonus Goal: @@/@@ reached!", .@new, 7500), 2; .@sc=1+(.@blv/10); } // 8th step: 8000 kills if (is_between(.@old, .@new, 8000)) { mesc l("Goal: @@/@@ reached!", .@new, 8000), 2; .@xp+=.@bxp*80; .@gp+=.@bhp; .@jp+=80; } else if (.@new < 8000) { mesc l("@@: @@/@@", l("8th step"), .@new, 8000); } // 9th step: 9000 kills if (is_between(.@old, .@new, 9000)) { mesc l("Goal: @@/@@ reached!", .@new, 9000), 2; .@xp+=.@bxp*90; .@gp+=.@bhp; .@jp+=90; } else if (.@new < 9000) { mesc l("@@: @@/@@", l("9th step"), .@new, 9000); } // 10th step: 10000 kills if (is_between(.@old, .@new, 10000)) { mesc l("Goal: @@/@@ reached!", .@new, 10000), 2; // Main reward getitem StrangeCoin, .@blv*2; Zeny=Zeny+.@bhp*25; // Maggot: 10.000 gp. That's plenty. getexp .@bhp*BaseLevel, .@bhp; // The monster hp, once again, drastically affects // Achievements if (!GHQ_WINNER) GHQ_WINNER = gettimetick(2); // Grand Prize switch (.@monsterId) { case Pinkie: getitem PinkHelmet, 1; mesc l("And here's a rare for you, a @@! Good job!", getitemlink(PinkHelmet)); break; default: mesc l("A new pet has been unlocked on the @@!", l("Pet Detective")); } } // Get reward (must have Job Exp) if (.@jp) { getexp .@xp, .@jp; Zeny=Zeny+.@gp; } if (.@sc) { getitem StrangeCoin, .@sc; } // Update Grand Hunter memory GHMEMO[.@q]=.@k; return; } ///////////////////////////////////////////////////////////////////////////////// // MobID, Place, Prize Override function script GHQ_Assign { // Arguments .@mobId =getarg(0); .@loc$ =getarg(1); .@prize$=getarg(2, ""); // Current Quest Status + vars .@id=GHQ_GetQuestIDByMonsterID(.@mobId); .@q=getq(General_Hunter); .@p=getq2(General_Hunter); //next; //mesq l("Current Quest Progress: @@/10,000 kills", .@p); // Handle Partial Rewards if (.@q) GHQ_GetRewardsOnMilestone(); mes ""; mesn; mes l("I represent the @@ Hunters. We hunt @@ (Lv @@).", .@loc$, getmonsterlink(.@mobId), strmobinfo(3, .@mobId)); if (.@prize$ != "") mes l("The great prize is @@.", .@prize$); else mes l("The great prize is to unlock a pet!"); if (.@q == .@id) { .@m=GHQ_GetMonsterIDByQuestID(.@q); mes l("You are currently hunting @@/10000 @@.", .@p, getmonsterlink(.@m)); next; closedialog; goodbye; } if (.@q) { .@m=GHQ_GetMonsterIDByQuestID(.@q); mes l("You are currently hunting @@/10000 @@. Do you want to switch?", .@p, getmonsterlink(.@m)); mesc l("Protip: Your current progress will be saved."); } select l("I'm not interested."), rif(GHMEMO[.@id] < 10000,l("I'll hunt them for you.")); switch (@menu) { case 2: GHMEMO[getq(General_Hunter)]=getq2(General_Hunter); setq(General_Hunter, .@id, GHMEMO[.@id]); mesn; mesq l("Good luck! Don't come back until you reach 10000 kills!"); break; } closedialog; goodbye; } function script mobhunter { if (getq(General_Hunter) == 0) return; .@ghd=getq(General_Hunter); if (killedrid == GHQ_GetMonsterIDByQuestID(.@ghd)) { setq2 General_Hunter, getq2(General_Hunter)+1; .@ghd=getq2(General_Hunter); if (! (.@ghd % 1000)) dispbottom l("Grand Hunter Quest: @@/10,000", format_number(.@ghd)); } return; }