summaryrefslogblamecommitdiff
path: root/npc/005-1-1/main.txt
blob: 46db948cb5beec1cf8cf80aad22f654b821b433f (plain) (tree)





























                                                    
                                     

































































































































                                                                                                       
                                 


























































































































































































































































                                                                                   
// 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);
        return(sprintf("%03d", .@i));
    }

    npctalk l("Go kill the maggots!");
    end;

OnStart:
    initnpctimer;
    addtimer(60000, "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 a @@.", getitemlink(RoundLeatherShield));
    mes l("If you save 60% from the crops or more, you'll get @@ GP.", 300);
    mes l("== If you decide to complete the quest you cannot repeat it.");
    next;
    mes l("Good luck!");
    close;

OnTimer10000:
    npctalk "50 seconds!";
    end;

OnTimer20000:
    npctalk "40 seconds!";
    end;

OnTimer30000:
    npctalk "30 seconds!";
    end;

OnTimer40000:
    npctalk "20 seconds!";
    end;

OnTimer50000:
    npctalk "10 seconds!";
    end;

OnTimer55000:
    npctalk "5 seconds!";
    end;

OnTimer60000:
    npctalk "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(850, "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");

    .@mobID=areamonster(.@MAP$, 23, 22, 35, 34, l("Maggot"), Maggot, 1, "Nylo#Marggo::OnMurder");
    htput @MARGGO, .@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);

        // Destroy the crop if needed
        .@cropId$=getcropid(.@x, .@y);
        if (array_find(@DESTROYED, .@cropId$) == -1) {
            array_push(@DESTROYED, .@cropId$);
            disablenpc instance_npcname("#Marggo"+.@cropId$);
        }

        // 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));
    }
    htidelete(.@hti);

    // Continue the cycle
    if (getmap() ~= "MRGO*" || getmap() ~= "005-1-1")
        addtimer(850, "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 .@key$, .@mobId, 0;
        break;
    }
    htidelete(.@hti);
    if (@TOTAL_MRG >= 8) {
        if (htsize(@MARGGO) == 0)
            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");
    .@trueratio=100*getarraysize(@DESTROYED)/169;
    .@ratio=100-.@trueratio;
    debugmes l("Player lost @@ crops", getarraysize(@DESTROYED));
    mesn l("Nylo");
    mes l("You managed to save @@ % of my crops!", .@ratio);
    next;
    if (.@ratio >= 60) {
        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 >= 80)
                getitem RoundLeatherShield, 1;
        }
        mes "";
    }
    mesn l("Nylo");
    mes l("Thanks for the help!");
    warp "Save", 0, 0;
    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; }