// 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; }