summaryrefslogblamecommitdiff
path: root/npc/014-2-2/valia.txt
blob: 892f5641f001860e0beb191f93e8442be8ae683c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12



                
                                                                                   
 





                                                

                                         
                                                          






                                                                         
















                                                                                          
                                                         








                                                                                                                        
              

                               
                                                                                                                                       










                                         




















































                                                                                                                                                                   








                                                                                                                                                                                



                                               






                                      
         













                                                                                                          

























                                                                
                                                                   
                                                                  
          






                    
                                       














                                                                                                                                        





                                                             















                                                                                                                     
                  
























                                                                                                              






                                        
                       




                                                                                                          
                       




                                                                                                   
                       




                                                                                                                   
                       


                                                                                                             


                                   
                       




                                                                                                          
                       


                                                                                                               







































                                                                                                     




                
// TMW2 scripts.
// Authors:
//    Jesusalva
// Description:
//    Gemini Sisters Quest - Valia Gemini. The quest can be resumed within 4 hours.

034-1	mapflag	zone	MMO
034-2	mapflag	zone	MMO
034-3	mapflag	zone	MMO
034-4	mapflag	zone	MMO

// Check if you can do this action or not (hero)
function	script	GeminiCheck	{
    .@st = getarg(0, 0);
    if (getq(General_Narrator) < 16 || @mystatus < .@st) {
        warp "Save", 0, 0;
        dispbottom l("You don't feel so well... And then, you're dead.");
        die();
        end;
    }
}

// You killed a mob
function	script	GeminiKill	{
    if (!compare(getmap(), "val")) end;
    switch ('STATUS) {
    case 1: // Quest initiated
        break;
    case 2: // Looking for a runestone
        if (killedrid == GreenSlime) {
            if (!rand2(40)) {
                getexp 8132, 657;
                dispbottom l("You found the Runestone! You gave it to the party leader.");
                'STATUS = 3;
            }
        }
        break;
    case 3: // Has runestone
        break;
    case 4: // Desert unlocked, but no clue on what to do
    case 5: // Desert unlocked, cutscene over
        if (killedrid == CaveSnake) {
            if (!rand2(5) && countitem(SealedSoul) < 10) {
                getitem SealedSoul, 1;
                areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 1, "Valia::OnMGoblin");
            }
        }
        break;
    case 6: // Just entered the Den
        break;
    case 7: // Just got stunned
        break;
    // Forest -> Desert -> Bandit Cave -> Island -> Fake showdown -> Storage -> Showdown -> Chest, Lore and Exit -> Wumpus' Trap -> End
    }
    return;
}

// Janitor
function	script	GeminiFail	{
    .@id=getarg(0, 0);
    return;
}


// Valia Gemini
014-2-2,36,22,0	script	Valia	NPC_RED_WIZARD_F,{
    GeminiCheck();
    .@q = getq(HurnscaldQuest_Gemini);
    mesn;
    mesq l("Greetings, adventurer. I am Valia Gemini, owner of this abode.");
    next;
    mesn;
    mesq l("I usually don't let anyone in, but I had to make an exception for the likes of you.");
    next;
    mesn;
    mesq l("You see, I have a sister. Luvia Gemini. Very talented, but unfortunately, not enough to prevent being captured and brainwashed by Isbamuth.");
    next;
    mesn;
    mesq l("I am sure you already fought him. And survived, too, apparently. Help her, and I will reward your efforts appropriately.");
    next;
    mesn;
    mesq l("You can bring up to 3 other friends with you, but they must be on the same party as you and you must be the party leader.");
    next;
    select
        l("I'm not interested, sorry."),
        l("Why don't you go yourself?"),
        l("Alright, I will help.");
    mes "";
    switch (@menu) {
    case 1:
        close;
    case 2:
        mesn;
        mesq l("Because Isbamuth is tracking me? It would be pointless if he noticed. If you can't even understand this, maybe I overestimated you, after all...");
        close;
    }
    // You accepted the quest
    mesn;
    // ...But you lack a party
    if (getcharid(1) <= 0) {
	    mesq l("You don't have a party. You're useless to me.");
        close;
    }
    // ...But you are not the leader
    if (strcharinfo(0) != getpartyleader(getcharid(1))) {
	    mesq l("Bring me %s or make your own party if you want to help me.", getpartyleader(getcharid(1)));
        close;
    }
    // ...But the party is too large
    getpartymember(getcharid(1));
	.@count = $@partymembercount;
    if (.@count > 4) {
	    mesq l("Your party is too big. Discretion is a key if we want to succeed.");
        close;
    }
    // Alright.
    mesq l("Good. I hope you have stocked everything. The time limit is 4 hours.");

    // Only first attempt is free - all others are charged
    if (getq(HurnscaldQuest_Gemini)) {
        next;
        mesn;
        mesq l("Actually, I need help with reagents this time. Bring me a %s and a %s and I'll gladly warp you... again.", getitemlink(GemPowder), getitemlink(EverburnPowder));
        if (!countitem(GemPowder) || !countitem(EverburnPowder)) close;
        next;
    }
    mesc l("Are you and your party ready?"), 1;
    if (askyesno() != ASK_YES)
        close;

    // Not eligible for free lunch
    if (getq(HurnscaldQuest_Gemini)) {
        delitem GemPowder, 1;
        delitem EverburnPowder, 1;
    }

    // Handle first attempt
    mesn;
    mesq l("Good. Here, take this key and hide it. I will quickly brief you:");
    mes "";
    mesc l(".:: GEMINI ASSASSINS QUEST ::."), 3;
    mesc ("Recommended Level: %d+", 85);
    mes "";
    mes l("- The goal is to rescue Luvia from Isabamuth. She has been ##Bbrainwashed##b.");
    mes l("- Luvia is a powerful mage and Isbamuth is watching, so teleporting directly would be risky.");
    mes l("- Instead, the party will be teleported ##Bto a forest.##b");
    mes l("- Find a path to the island where she is hiding herself!");
    if (!getq(HurnscaldQuest_Gemini))
        mesc l("- If you fail, you'll need to pay me ingredients to try again!"), 1;
    mes "";
    mesc l("Good luck!");

    compareandsetq HurnscaldQuest_Gemini, 0, 1;

    // Create instance
    .@p=getcharid(1);
	.@inst = instance_create("Gemini "+.@p, .@p, IOT_PARTY);

    // If it worked then setup
    if (.@inst >= 0) {
        // Attach maps
        instance_attachmap("034-1", .@inst, false, "val1@"+.@p);
        instance_attachmap("034-2", .@inst, false, "val2@"+.@p);
        instance_attachmap("034-3", .@inst, false, "val3@"+.@p);
        instance_attachmap("034-4", .@inst, false, "val4@"+.@p);
        // Save the instance ID
        $@VALIA_INST[.@p]=.@inst;
        $@VALIA_MAP$[.@p]="";
    }

    // Instance lasts 4 hours - your time limit
	instance_set_timeout(14400, 14400, $@VALIA_INST[.@p]);

    // Do we need to initialize or are we just restarting?
    if (.@inst >= 0)
    	instance_init(.@inst);

    // Warp everyone and add timers
    partytimer("014-2-2", 1000, "Valia::OnCoreInit", getcharid(1));
    warpparty("val1@"+.@p, 24, 24, getcharid(1), "014-2-2", true);
    close;

// Macros
OnCoreInit:
    @mystatus = 0;
    if (!'STATUS)
        'STATUS = 1;
OnCore:
    if (!compare(getmap(), "val")) end;
    .@p = getcharid(1);
    // Always true on first interaction
    // This handles new stages for person
    if (@mystatus != 'STATUS) {
        switch ('STATUS) {
        case 1: // Quest initiated
            @mystatus = 1;
            // Spawn monsters
            areamonster("val1@"+.@p, 20, 20, 60, 60, strmobinfo(1, GreenSlime), GreenSlime, (BaseLevel/15), "Valia::OnGSlime");
            areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, LogHead), LogHead, (BaseLevel/15), "Valia::OnLHead");
            areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, ForestMushroom), ForestMushroom, (BaseLevel/12), "Valia::OnFShroom");
            areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, RedMushroom), RedMushroom, 1+(BaseLevel/30), "Valia::OnRShroom");
            break;
        case 2: // Looking for a runestone
            break;
        case 3: // Runestone was found
            getexp 8132, 657;
            break;
        case 4: // Desert unlocked, but no clue on what to do
            dispbottom l("You hear a noise from distance.");
            // Spawn monsters
            areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, CaveSnake), CaveSnake, 2, "Valia::OnCSnake");
            areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 1, "Valia::OnMGoblin");
            // These refuse to respawn but are numerous
            // Thus far, the quest is still easy. But soon it won't be.
            areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, MountainSnake), MountainSnake, 1+(BaseLevel/24));
            areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, DarkLizard), DarkLizard, 1+(BaseLevel/20));
            areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, WickedMushroom), WickedMushroom, 1+(BaseLevel/32));
            areamonster(getmap(), 100, 20, 170, 60, strmobinfo(1, EliteDuck), EliteDuck, 1);
            break;
        case 6: // Passage Open
            if (countitem(SealedSoul))
                delitem SealedSoul, countitem(SealedSoul);
            dispbottom l("You hear waterfall opening in distance.");
            // FALLTHROUGH
        case 5: // JackO shows up
            getexp 32000, 1400;
            break;
        case 7: // Ambushed & Captured
            @lockpicks=false;
            // Prision Area
            .@m=any(Bandit, RobinBandit, SleepingBandit);
            areamonster("val2@"+.@p, 52, 93, 70, 98, strmobinfo(1, .@m), .@m, 1);
            .@m=any(Bandit, RobinBandit, SleepingBandit);
            areamonster("val2@"+.@p, 52, 93, 70, 98, strmobinfo(1, .@m), .@m, 1);
            // Ante-chamber
            areamonster("val2@"+.@p, 69, 96, 85, 107, strmobinfo(1, Bandit), Bandit, 1);
            .@m=any(Bandit, RobinBandit, SleepingBandit, RobinBandit);
            areamonster("val2@"+.@p, 69, 96, 85, 107, strmobinfo(1, .@m), .@m, 1);
            // Reception & Lord Desk
            areamonster("val2@"+.@p, 50, 30, 80, 75, strmobinfo(1, Bandit), Bandit, (BaseLevel/15));
            areamonster("val2@"+.@p, 50, 30, 80, 75, strmobinfo(1, RobinBandit), RobinBandit, (BaseLevel/25));
            // Whole Map
            areamonster("val2@"+.@p, 20, 24, 78, 72, strmobinfo(1, Archant), Archant, (BaseLevel/8));
            // Great Hall
            areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, RobinBandit), RobinBandit, (BaseLevel/22));
            areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, Assassin), Assassin, (BaseLevel/20));
            areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, Bandit), Bandit, (BaseLevel/18));
            areamonster("val2@"+.@p, 25, 24, 50, 45, strmobinfo(1, HoodedNinja), HoodedNinja, 1);
            break;
        case 8: // Key retrieved
            getexp 128000, 2000;
            break;
        }
    }
    addtimer(5000, "Valia::OnCoreInit");
    end;

OnGSlime:
    fix_mobkill(GreenSlime);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 20, 20, 60, 60, strmobinfo(1, GreenSlime), GreenSlime, 1, "Valia::OnGSlime");
    end;

OnLHead:
    fix_mobkill(LogHead);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, LogHead), LogHead, 1, "Valia::OnLHead");
    end;

OnFShroom:
    fix_mobkill(ForestMushroom);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, ForestMushroom), ForestMushroom, 1, "Valia::OnFShroom");
    end;

OnRShroom:
    fix_mobkill(RedMushroom);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 20, 20, 70, 60, strmobinfo(1, RedMushroom), RedMushroom, 1, "Valia::OnRShroom");
    end;

///////////////////////////////////
OnCSnake:
    fix_mobkill(CaveSnake);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, CaveSnake), CaveSnake, 1, "Valia::OnCSnake");
    end;

OnMGoblin:
    fix_mobkill(MagicGoblin);
    .@p = getcharid(1);
    areamonster("val1@"+.@p, 100, 20, 170, 60, strmobinfo(1, MagicGoblin), MagicGoblin, 2, "Valia::OnMGoblin");
    end;

///////////////////////////////////
OnKey1:
    .@p = getcharid(1);
    .@mob=monster("val2@"+.@p, 57, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey1");
    // This should wipe the monster experience value
    setunitdata(.@mob, UDT_LEVEL, 1);
    if (countitem(Lockpicks) || @lockpicks || rand2(3)) end;
    getitem Lockpicks, 1;
    @lockpicks=true;
    end;

OnKey2:
    .@p = getcharid(1);
    .@mob=monster("val2@"+.@p, 61, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey2");
    // This should wipe the monster experience value
    setunitdata(.@mob, UDT_LEVEL, 1);
    if (countitem(Lockpicks) || @lockpicks || rand2(3)) end;
    getitem Lockpicks, 1;
    @lockpicks=true;
    end;

OnKey3:
    .@p = getcharid(1);
    .@mob=monster("val2@"+.@p, 66, 104, strmobinfo(1, CopperSlime), CopperSlime, 1, "Valia::OnKey3");
    // This should wipe the monster experience value
    setunitdata(.@mob, UDT_LEVEL, 1);
    if (countitem(Lockpicks) || @lockpicks || rand2(3)) end;
    getitem Lockpicks, 1;
    @lockpicks=true;
    end;

OnLord:
    .@p = getcharid(1);
    if (mobcount("val2@"+.@p, "Valia::OnLord")) {
        'STATUS = 8;
        Zeny+=15000;
        dispbottom l("This lord dropped a key and a stash of gold!");
    }
    end;

OnInit:
    .distance=4;
    end;
}