// TMW2 Scripts // Author: // Jesusalva // Description: // Candor - Maggot Extermination Quest // Added for GonzoDark 005-1-1,30,20,0 script Nylo#Marggo NPC_PLAYER,{ // Returns the crop ID to disable // getcropid(x,y) function getcropid { .@x=getarg(0); .@y=getarg(1); .@w=12; // Width of a row .@offx=23; // First X .@offy=22; // First Y .@i=0; // 0 is: 23,22 // width: 35-23=12 // height is not relevant // .@x / .@y // .@w = 12 // .@i → Real value // For each Y beyond .@offy we add .@w to i .@i+=(.@y-.@offy)*.@w; // Now we add any X beyond .@offx .@i+=(.@x-.@offx); // I don't know why this offset happens, but it happens .@i+=(.@y-.@offy); // Do not go out of scope if maggot wander outside the area return(sprintf("%03d", max(0, min(.@i, 168)))); } npctalk l("Go kill the maggots!"); end; OnStart: //initnpctimer; if ($@GM_OVERRIDE) { addtimer(400, "Nylo#Marggo::OnTimer55000"); addtimer(5000, "Nylo#Marggo::OnTimer60000"); addtimer(5300, "Nylo#Marggo::OnBegin"); end; } addtimer(10000, "Nylo#Marggo::OnTimer10000"); addtimer(20000, "Nylo#Marggo::OnTimer20000"); addtimer(30000, "Nylo#Marggo::OnTimer30000"); addtimer(40000, "Nylo#Marggo::OnTimer40000"); addtimer(50000, "Nylo#Marggo::OnTimer50000"); addtimer(55000, "Nylo#Marggo::OnTimer55000"); addtimer(60000, "Nylo#Marggo::OnTimer60000"); addtimer(60300, "Nylo#Marggo::OnBegin"); mesn; mesq l("The maggots will spawn in @@ at random.", b(l("60 seconds"))); mes l("Read the instructions carefully."); next; mesn l("Time Limit"); mes l("Campaign starts after 60 seconds. Eight maggots will spawn on the next 100 seconds."); mes l("Four minutes after the warp, or when the last maggot die, it'll be over."); next; mesn l("Victory Conditions"); mes l("If you save 80% from the crops or more, you'll get @@ GP.", 300); mes l("If you save 90% from the crops or more, you'll also get a @@.", getitemlink(RoundLeatherShield)); mes l("== If you decide to complete the quest you cannot repeat it."); next; mes l("Good luck!"); close; OnTimer10000: dispbottom "50 seconds!"; end; OnTimer20000: dispbottom "40 seconds!"; end; OnTimer30000: dispbottom "30 seconds!"; end; OnTimer40000: dispbottom "20 seconds!"; end; OnTimer50000: dispbottom "10 seconds!"; end; OnTimer55000: dispbottom "5 seconds!"; end; OnTimer60000: dispbottom l("Start!"); //stopnpctimer; end; OnBegin: // @MARGGO → (MaggotID, IsAlive) // IsAlive: 1 → yes @MARGGO=htnew; @TOTAL_MRG=0; //@DESTROY=0; // Array of all lost crops // 8 maggots // Minimum 80 sec // Maximum 100 sec addtimer(10, "Nylo#Marggo::OnSpawn"); addtimer(400, "Nylo#Marggo::OnInteract"); addtimer(180000, "Nylo#Marggo::OnFinish"); end; // Spawn a new maggot until eight maggots were spawn OnSpawn: .@ID=getcharid(0); .@MAP$="MRGO@"+str(.@ID); @TOTAL_MRG+=1; if (@TOTAL_MRG < 8) addtimer(rand(10000, 12500), "Nylo#Marggo::OnSpawn"); if (mobcount(getmap(), "Nylo#Marggo::OnMurder") >= 4) end; .@mobID=areamonster(.@MAP$, 23, 22, 35, 34, l("Maggot"), Maggot, 1, "Nylo#Marggo::OnMurder"); htput @MARGGO, str(.@mobID), 1; // 50% chances to spawn two maggots at once if (any(true, false) && @TOTAL_MRG < 8) { @TOTAL_MRG+=1; .@mobID=areamonster(.@MAP$, 23, 22, 35, 34, l("Maggot"), Maggot, 1, "Nylo#Marggo::OnMurder"); htput @MARGGO, str(.@mobID), 1; } end; // Move all maggots OnInteract: .@hti = htiterator(@MARGGO); for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) { .@alive=htget(@MARGGO, .@key$); /* if (.@alive == 2) continue; */ .@mobId=atoi(.@key$); getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, .@mobId); //debugmes("[LOGIC] -------------------------- proccess %d", .@mobId); // Destroy the crop if needed .@cropId$=getcropid(.@x, .@y); if (array_find(@DESTROYED$, .@cropId$) == -1) { array_push(@DESTROYED$, .@cropId$); //debugmes("[LOGIC] -------------------------- crop destroyed"); // hideonnpc disablenpc instance_npcname("#Marggo"+.@cropId$, MARGGO_ID); } /* // Tell the Maggot to walk to a random coordinate // (it may walk backwards due not preserving old data) // This will cause maggot to abort a counter attack and to never stop // If it hits an edge, it'll start moving to the center, may cause odd behavior unitstop(.@mobId); if (.@x == 22 || .@y == 22 || .@x == 36 || .@y == 34) unitwalk(.@mobId, 30, 30); else unitwalk(.@mobId, .@x+any(1, -1), .@y+any(1, -1)); */ //debugmes("[LOGIC] ------------------------------------- ai advanced"); } htidelete(.@hti); // Continue the cycle if (compare(getmap(), "MRGO") || compare(getmap(), "005-1-1")) addtimer(400, "Nylo#Marggo::OnInteract"); end; // A maggot was killed OnMurder: // I don't know which one was killed, so I cycle every one until I find the dead one .@hti = htiterator(@MARGGO); for(.@key$ = htinextkey(.@hti); hticheck(.@hti); .@key$ = htinextkey(.@hti)) { .@alive=htget(@MARGGO, .@key$); /* if (.@alive == 2) continue; */ .@mobId=atoi(.@key$); if (getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, .@mobId) >= 0) continue; // We found the dead monster, mark it as dead and stop this meaningless loop htput @MARGGO, .@key$, 0; //debugmes("[OK] Deleting Maggot"); break; } htidelete(.@hti); if (@TOTAL_MRG >= 8) { //debugmes("Current MARGGO Size: %d", htsize(@MARGGO)); if (htsize(@MARGGO) <= 1) doevent("Nylo#Marggo::OnFinish"); } end; // You killed all maggots or ran out of time OnFinish: htdelete @MARGGO; deltimer("Nylo#Marggo::OnInteract"); deltimer("Nylo#Marggo::OnSpawn"); deltimer("Nylo#Marggo::OnFinish"); MARGGO_ID=0; .@trueratio=100*getarraysize(@DESTROYED$)/169; .@ratio=100-.@trueratio; debugmes("Player lost %d crops", getarraysize(@DESTROYED$)); deletearray(@DESTROYED$); mesn l("Nylo"); mes l("You managed to save @@ % of my crops!", .@ratio); next; if (.@ratio >= 80) { inventoryplace RoundLeatherShield, 1; mesc l("Complete Quest?"); mesc l("You won't be able to aim for a better record!"); if (askyesno() == ASK_YES) { setq CandorQuest_Marggo, 1; Zeny=Zeny+300; getexp .@ratio*8/10, (.@ratio/3); if (.@ratio >= 90) getitem RoundLeatherShield, 1; } mes ""; } mesn l("Nylo"); mes l("Thanks for the help!"); warp "005-5", 25, 41; close; // Cosmetic OnInit: .@npcId = getnpcid(.name$); setunitdata(.@npcId, UDT_HEADTOP, CreasedShirt); setunitdata(.@npcId, UDT_HEADMIDDLE, CreasedShorts); setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes); setunitdata(.@npcId, UDT_WEAPON, CandorBoots); setunitdata(.@npcId, UDT_HAIRSTYLE, 26); setunitdata(.@npcId, UDT_HAIRCOLOR, 0); .sex = G_MALE; .distance = 4; end; OnInstanceInit: .@npcId = getnpcid(instance_npcname(.name$)); setunitdata(.@npcId, UDT_HEADTOP, CreasedShirt); setunitdata(.@npcId, UDT_HEADMIDDLE, CreasedShorts); setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes); setunitdata(.@npcId, UDT_WEAPON, CandorBoots); setunitdata(.@npcId, UDT_HAIRSTYLE, 26); setunitdata(.@npcId, UDT_HAIRCOLOR, 0); end; } /* python i=0 x=23 y=22 x2=35 y2=34 while y <= y2: print("005-1-1,%d,%d,0 script #Marggo%03d NPC_CROPS,{ end; }"% (x, y, i)) x+=1 if (x > x2): x=23 y+=1 i+=1 */ 005-1-1,23,22,0 script #Marggo000 NPC_CROPS,{ end; } 005-1-1,24,22,0 script #Marggo001 NPC_CROPS,{ end; } 005-1-1,25,22,0 script #Marggo002 NPC_CROPS,{ end; } 005-1-1,26,22,0 script #Marggo003 NPC_CROPS,{ end; } 005-1-1,27,22,0 script #Marggo004 NPC_CROPS,{ end; } 005-1-1,28,22,0 script #Marggo005 NPC_CROPS,{ end; } 005-1-1,29,22,0 script #Marggo006 NPC_CROPS,{ end; } 005-1-1,30,22,0 script #Marggo007 NPC_CROPS,{ end; } 005-1-1,31,22,0 script #Marggo008 NPC_CROPS,{ end; } 005-1-1,32,22,0 script #Marggo009 NPC_CROPS,{ end; } 005-1-1,33,22,0 script #Marggo010 NPC_CROPS,{ end; } 005-1-1,34,22,0 script #Marggo011 NPC_CROPS,{ end; } 005-1-1,35,22,0 script #Marggo012 NPC_CROPS,{ end; } 005-1-1,23,23,0 script #Marggo013 NPC_CROPS,{ end; } 005-1-1,24,23,0 script #Marggo014 NPC_CROPS,{ end; } 005-1-1,25,23,0 script #Marggo015 NPC_CROPS,{ end; } 005-1-1,26,23,0 script #Marggo016 NPC_CROPS,{ end; } 005-1-1,27,23,0 script #Marggo017 NPC_CROPS,{ end; } 005-1-1,28,23,0 script #Marggo018 NPC_CROPS,{ end; } 005-1-1,29,23,0 script #Marggo019 NPC_CROPS,{ end; } 005-1-1,30,23,0 script #Marggo020 NPC_CROPS,{ end; } 005-1-1,31,23,0 script #Marggo021 NPC_CROPS,{ end; } 005-1-1,32,23,0 script #Marggo022 NPC_CROPS,{ end; } 005-1-1,33,23,0 script #Marggo023 NPC_CROPS,{ end; } 005-1-1,34,23,0 script #Marggo024 NPC_CROPS,{ end; } 005-1-1,35,23,0 script #Marggo025 NPC_CROPS,{ end; } 005-1-1,23,24,0 script #Marggo026 NPC_CROPS,{ end; } 005-1-1,24,24,0 script #Marggo027 NPC_CROPS,{ end; } 005-1-1,25,24,0 script #Marggo028 NPC_CROPS,{ end; } 005-1-1,26,24,0 script #Marggo029 NPC_CROPS,{ end; } 005-1-1,27,24,0 script #Marggo030 NPC_CROPS,{ end; } 005-1-1,28,24,0 script #Marggo031 NPC_CROPS,{ end; } 005-1-1,29,24,0 script #Marggo032 NPC_CROPS,{ end; } 005-1-1,30,24,0 script #Marggo033 NPC_CROPS,{ end; } 005-1-1,31,24,0 script #Marggo034 NPC_CROPS,{ end; } 005-1-1,32,24,0 script #Marggo035 NPC_CROPS,{ end; } 005-1-1,33,24,0 script #Marggo036 NPC_CROPS,{ end; } 005-1-1,34,24,0 script #Marggo037 NPC_CROPS,{ end; } 005-1-1,35,24,0 script #Marggo038 NPC_CROPS,{ end; } 005-1-1,23,25,0 script #Marggo039 NPC_CROPS,{ end; } 005-1-1,24,25,0 script #Marggo040 NPC_CROPS,{ end; } 005-1-1,25,25,0 script #Marggo041 NPC_CROPS,{ end; } 005-1-1,26,25,0 script #Marggo042 NPC_CROPS,{ end; } 005-1-1,27,25,0 script #Marggo043 NPC_CROPS,{ end; } 005-1-1,28,25,0 script #Marggo044 NPC_CROPS,{ end; } 005-1-1,29,25,0 script #Marggo045 NPC_CROPS,{ end; } 005-1-1,30,25,0 script #Marggo046 NPC_CROPS,{ end; } 005-1-1,31,25,0 script #Marggo047 NPC_CROPS,{ end; } 005-1-1,32,25,0 script #Marggo048 NPC_CROPS,{ end; } 005-1-1,33,25,0 script #Marggo049 NPC_CROPS,{ end; } 005-1-1,34,25,0 script #Marggo050 NPC_CROPS,{ end; } 005-1-1,35,25,0 script #Marggo051 NPC_CROPS,{ end; } 005-1-1,23,26,0 script #Marggo052 NPC_CROPS,{ end; } 005-1-1,24,26,0 script #Marggo053 NPC_CROPS,{ end; } 005-1-1,25,26,0 script #Marggo054 NPC_CROPS,{ end; } 005-1-1,26,26,0 script #Marggo055 NPC_CROPS,{ end; } 005-1-1,27,26,0 script #Marggo056 NPC_CROPS,{ end; } 005-1-1,28,26,0 script #Marggo057 NPC_CROPS,{ end; } 005-1-1,29,26,0 script #Marggo058 NPC_CROPS,{ end; } 005-1-1,30,26,0 script #Marggo059 NPC_CROPS,{ end; } 005-1-1,31,26,0 script #Marggo060 NPC_CROPS,{ end; } 005-1-1,32,26,0 script #Marggo061 NPC_CROPS,{ end; } 005-1-1,33,26,0 script #Marggo062 NPC_CROPS,{ end; } 005-1-1,34,26,0 script #Marggo063 NPC_CROPS,{ end; } 005-1-1,35,26,0 script #Marggo064 NPC_CROPS,{ end; } 005-1-1,23,27,0 script #Marggo065 NPC_CROPS,{ end; } 005-1-1,24,27,0 script #Marggo066 NPC_CROPS,{ end; } 005-1-1,25,27,0 script #Marggo067 NPC_CROPS,{ end; } 005-1-1,26,27,0 script #Marggo068 NPC_CROPS,{ end; } 005-1-1,27,27,0 script #Marggo069 NPC_CROPS,{ end; } 005-1-1,28,27,0 script #Marggo070 NPC_CROPS,{ end; } 005-1-1,29,27,0 script #Marggo071 NPC_CROPS,{ end; } 005-1-1,30,27,0 script #Marggo072 NPC_CROPS,{ end; } 005-1-1,31,27,0 script #Marggo073 NPC_CROPS,{ end; } 005-1-1,32,27,0 script #Marggo074 NPC_CROPS,{ end; } 005-1-1,33,27,0 script #Marggo075 NPC_CROPS,{ end; } 005-1-1,34,27,0 script #Marggo076 NPC_CROPS,{ end; } 005-1-1,35,27,0 script #Marggo077 NPC_CROPS,{ end; } 005-1-1,23,28,0 script #Marggo078 NPC_CROPS,{ end; } 005-1-1,24,28,0 script #Marggo079 NPC_CROPS,{ end; } 005-1-1,25,28,0 script #Marggo080 NPC_CROPS,{ end; } 005-1-1,26,28,0 script #Marggo081 NPC_CROPS,{ end; } 005-1-1,27,28,0 script #Marggo082 NPC_CROPS,{ end; } 005-1-1,28,28,0 script #Marggo083 NPC_CROPS,{ end; } 005-1-1,29,28,0 script #Marggo084 NPC_CROPS,{ end; } 005-1-1,30,28,0 script #Marggo085 NPC_CROPS,{ end; } 005-1-1,31,28,0 script #Marggo086 NPC_CROPS,{ end; } 005-1-1,32,28,0 script #Marggo087 NPC_CROPS,{ end; } 005-1-1,33,28,0 script #Marggo088 NPC_CROPS,{ end; } 005-1-1,34,28,0 script #Marggo089 NPC_CROPS,{ end; } 005-1-1,35,28,0 script #Marggo090 NPC_CROPS,{ end; } 005-1-1,23,29,0 script #Marggo091 NPC_CROPS,{ end; } 005-1-1,24,29,0 script #Marggo092 NPC_CROPS,{ end; } 005-1-1,25,29,0 script #Marggo093 NPC_CROPS,{ end; } 005-1-1,26,29,0 script #Marggo094 NPC_CROPS,{ end; } 005-1-1,27,29,0 script #Marggo095 NPC_CROPS,{ end; } 005-1-1,28,29,0 script #Marggo096 NPC_CROPS,{ end; } 005-1-1,29,29,0 script #Marggo097 NPC_CROPS,{ end; } 005-1-1,30,29,0 script #Marggo098 NPC_CROPS,{ end; } 005-1-1,31,29,0 script #Marggo099 NPC_CROPS,{ end; } 005-1-1,32,29,0 script #Marggo100 NPC_CROPS,{ end; } 005-1-1,33,29,0 script #Marggo101 NPC_CROPS,{ end; } 005-1-1,34,29,0 script #Marggo102 NPC_CROPS,{ end; } 005-1-1,35,29,0 script #Marggo103 NPC_CROPS,{ end; } 005-1-1,23,30,0 script #Marggo104 NPC_CROPS,{ end; } 005-1-1,24,30,0 script #Marggo105 NPC_CROPS,{ end; } 005-1-1,25,30,0 script #Marggo106 NPC_CROPS,{ end; } 005-1-1,26,30,0 script #Marggo107 NPC_CROPS,{ end; } 005-1-1,27,30,0 script #Marggo108 NPC_CROPS,{ end; } 005-1-1,28,30,0 script #Marggo109 NPC_CROPS,{ end; } 005-1-1,29,30,0 script #Marggo110 NPC_CROPS,{ end; } 005-1-1,30,30,0 script #Marggo111 NPC_CROPS,{ end; } 005-1-1,31,30,0 script #Marggo112 NPC_CROPS,{ end; } 005-1-1,32,30,0 script #Marggo113 NPC_CROPS,{ end; } 005-1-1,33,30,0 script #Marggo114 NPC_CROPS,{ end; } 005-1-1,34,30,0 script #Marggo115 NPC_CROPS,{ end; } 005-1-1,35,30,0 script #Marggo116 NPC_CROPS,{ end; } 005-1-1,23,31,0 script #Marggo117 NPC_CROPS,{ end; } 005-1-1,24,31,0 script #Marggo118 NPC_CROPS,{ end; } 005-1-1,25,31,0 script #Marggo119 NPC_CROPS,{ end; } 005-1-1,26,31,0 script #Marggo120 NPC_CROPS,{ end; } 005-1-1,27,31,0 script #Marggo121 NPC_CROPS,{ end; } 005-1-1,28,31,0 script #Marggo122 NPC_CROPS,{ end; } 005-1-1,29,31,0 script #Marggo123 NPC_CROPS,{ end; } 005-1-1,30,31,0 script #Marggo124 NPC_CROPS,{ end; } 005-1-1,31,31,0 script #Marggo125 NPC_CROPS,{ end; } 005-1-1,32,31,0 script #Marggo126 NPC_CROPS,{ end; } 005-1-1,33,31,0 script #Marggo127 NPC_CROPS,{ end; } 005-1-1,34,31,0 script #Marggo128 NPC_CROPS,{ end; } 005-1-1,35,31,0 script #Marggo129 NPC_CROPS,{ end; } 005-1-1,23,32,0 script #Marggo130 NPC_CROPS,{ end; } 005-1-1,24,32,0 script #Marggo131 NPC_CROPS,{ end; } 005-1-1,25,32,0 script #Marggo132 NPC_CROPS,{ end; } 005-1-1,26,32,0 script #Marggo133 NPC_CROPS,{ end; } 005-1-1,27,32,0 script #Marggo134 NPC_CROPS,{ end; } 005-1-1,28,32,0 script #Marggo135 NPC_CROPS,{ end; } 005-1-1,29,32,0 script #Marggo136 NPC_CROPS,{ end; } 005-1-1,30,32,0 script #Marggo137 NPC_CROPS,{ end; } 005-1-1,31,32,0 script #Marggo138 NPC_CROPS,{ end; } 005-1-1,32,32,0 script #Marggo139 NPC_CROPS,{ end; } 005-1-1,33,32,0 script #Marggo140 NPC_CROPS,{ end; } 005-1-1,34,32,0 script #Marggo141 NPC_CROPS,{ end; } 005-1-1,35,32,0 script #Marggo142 NPC_CROPS,{ end; } 005-1-1,23,33,0 script #Marggo143 NPC_CROPS,{ end; } 005-1-1,24,33,0 script #Marggo144 NPC_CROPS,{ end; } 005-1-1,25,33,0 script #Marggo145 NPC_CROPS,{ end; } 005-1-1,26,33,0 script #Marggo146 NPC_CROPS,{ end; } 005-1-1,27,33,0 script #Marggo147 NPC_CROPS,{ end; } 005-1-1,28,33,0 script #Marggo148 NPC_CROPS,{ end; } 005-1-1,29,33,0 script #Marggo149 NPC_CROPS,{ end; } 005-1-1,30,33,0 script #Marggo150 NPC_CROPS,{ end; } 005-1-1,31,33,0 script #Marggo151 NPC_CROPS,{ end; } 005-1-1,32,33,0 script #Marggo152 NPC_CROPS,{ end; } 005-1-1,33,33,0 script #Marggo153 NPC_CROPS,{ end; } 005-1-1,34,33,0 script #Marggo154 NPC_CROPS,{ end; } 005-1-1,35,33,0 script #Marggo155 NPC_CROPS,{ end; } 005-1-1,23,34,0 script #Marggo156 NPC_CROPS,{ end; } 005-1-1,24,34,0 script #Marggo157 NPC_CROPS,{ end; } 005-1-1,25,34,0 script #Marggo158 NPC_CROPS,{ end; } 005-1-1,26,34,0 script #Marggo159 NPC_CROPS,{ end; } 005-1-1,27,34,0 script #Marggo160 NPC_CROPS,{ end; } 005-1-1,28,34,0 script #Marggo161 NPC_CROPS,{ end; } 005-1-1,29,34,0 script #Marggo162 NPC_CROPS,{ end; } 005-1-1,30,34,0 script #Marggo163 NPC_CROPS,{ end; } 005-1-1,31,34,0 script #Marggo164 NPC_CROPS,{ end; } 005-1-1,32,34,0 script #Marggo165 NPC_CROPS,{ end; } 005-1-1,33,34,0 script #Marggo166 NPC_CROPS,{ end; } 005-1-1,34,34,0 script #Marggo167 NPC_CROPS,{ end; } 005-1-1,35,34,0 script #Marggo168 NPC_CROPS,{ end; }