summaryrefslogblamecommitdiff
path: root/npc/018-7-1/demure.txt
blob: 6372d5197b43dd16d488a3e5bfc1ba9b378a6f83 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                    




                                        
                                                                                 


                                                



                                                                                                                               




                                                                                              






                                                                                                                                                       



                                                  
                      













































































                                                                                                                                 
                              
        
                                                                  







                                                             

          











                                                                                            
                         

                            
                                                                                    








                                                                   


                                                                           
                                                                     
                                


        

                                             
                           


                                                    
                                                         
                               

                            
                                                                                    




















                                                                                                                            

                                        


                                                          
                                





                                                                        
     


                                                                                                      






                    
// TMW2 scripts.
// Author:
//    Jesusalva
// Description:
//    Demure is the Queen of Dragons


018-7-1,23,20,0	script	Demure, Queen of Dragons	NPC_DEMURE,{
    mesn;
    mesq l("Greetings mortal; I am Demure, Queen of Dragons.");
    if (BaseLevel < 40) close;
    next;
    mesn strcharinfo(0);
    select
        l("Thanks. It is my pleasure."),
        rif($DEMUR_HOLDER$ == "", l("I've heard rumors about a legendary axe.")),
        l("I want to challenge you.");
    mes "";
    if (@menu == 1) { closeclientdialog; close;}
    if (@menu == 2) {
        mesn;
        mesq l("The %s, yes. I have it. It is a legendary weapon, only one of it exist on the world.", getitemlink(DemureAxe));
        next;
        if ($GAME_STORYLINE < 3) {
            mesn;
            mesq l("But it is still too early to give it away to a %s children.", get_race());
            close;
        }
        mesn;
        mesq l("I'll give it to someone who challenge me and best me in an impressive manner. If it was easy, someone would already have claimed it.");
        mesn;
        mesq l("So, will you challenge me?");
        next;
        if (askyesno() == ASK_NO) close;
    }
    mesc l("Mode?");
    menuint
        l("Solo"), MODE_SOLO,
        rif(getcharid(1), l("Party")), MODE_PARTY;
    .@mode = @menuret;
    if (.@mode == MODE_PARTY) {
        if (getcharid(1) < 1)
            kick(getcharid(3), 3);
        if (strcharinfo(0) != getpartyleader(getcharid(1))) {
            mesn;
            mesq l("Hold your horses, %s. You are not the party leader.", strcharinfo(0));
            close;
        }
    }
    mes "";
    mesc l("Difficulty?");
    menuint
        l("I want to challenge the Yetifly."), 1,
        l("I want to challenge you."), 2,
        l("I want to challenge you both."), 3;
    .@mode2 = @menuret;
    mes "";
    mesc l("Monster Density and Boss HP?");
    menuint
        l("Meager."), 1,
        l("Normal."), 2,
        l("Doubled."), 4,
        l("Hunter."), 8,
        l("Ultimate"), 16;
    .@mode3 = @menuret;
    mes "";
    if (.@mode == MODE_SOLO) {
    	.@mapn$="demu@"+getcharid(0);
    	.@inst = instance_create("Demured "+getcharid(0), getcharid(3), IOT_CHAR);
    } else {
    	.@mapn$="demu@"+getcharid(1);
    	.@inst = instance_create("Demured "+getcharid(1), getcharid(1), IOT_PARTY);
    }
    instance_attachmap("018-7-1", .@inst, false, .@mapn$);
    // Instance lasts 10 minutes + 15s grace time
	instance_set_timeout(615, 615, .@inst);
	instance_init(.@inst);

    // Create walls
    setcells .@mapn$, 75, 66, 75, 67, 1, .@mapn$+"A";
    setcells .@mapn$, 85, 84, 86, 84, 1, .@mapn$+"B";

    // Adjust the proper monster count to be spawned
    if (.@mode == MODE_PARTY) {
        getpartymember(getcharid(1));
	    .@count = max($@partymembercount, 1);
    } else {
        .@count = 1;
    }

    // Setup the boss monsters. Non-exclusive (bitwise)
    if (.@mode2 & 1) {
        .@m=monster(.@mapn$, 85, 66, strmobinfo(1, Yetifly), Yetifly, 1, strnpcinfo(NPC_NAME_UNIQUE)+"::OnYeti");
        .@p=getunitdata(.@m, UDT_MAXHP);
        setunitdata(.@m, UDT_MAXHP, .@p*.@count*.@mode3);
        setunitdata(.@m, UDT_HP,    .@p*.@count*.@mode3);
    }
    if (.@mode2 & 2) {
        .@m=monster(.@mapn$, 87, 57, strmobinfo(1, DemureFirstForm), DemureFirstForm, 1, strnpcinfo(NPC_NAME_UNIQUE)+"::OnDem1");
        .@p=getunitdata(.@m, UDT_MAXHP);
        setunitdata(.@m, UDT_MAXHP, .@p*.@count*.@mode3);
        setunitdata(.@m, UDT_HP,    .@p*.@count*.@mode3);
    }

    // Setup the reinforcements, in appropriate number and mode
    for (.@i = 0; .@i < (.@count*.@mode3); .@i++) {
        .@mob = any(EarthFairy, FireFairy, WaterFairy, WindFairy, PoisonFairy);
        .@m = areamonster(.@mapn$, 76, 47, 95, 83, strmobinfo(1, .@mob), .@mob, 1);
        .@p = getunitdata(.@m, UDT_MODE);
        setunitdata(.@m, UDT_MODE, (.@p | MD_AGGRESSIVE));
    }
    for (.@i = 0; .@i < .@count; .@i++) {
        .@mob = any(EliteDuck, Archant, Wolvern, BlueSlimeMother);
        areamonster .@mapn$, 76, 47, 95, 83, strmobinfo(1, .@mob), .@mob, any(1,2);
    }

    // Warp you and/or your party
    if (.@mode == MODE_SOLO)
        warp(.@mapn$, 85, 70);
    else
        warpparty(.@mapn$, 85, 70, getcharid(1), "018-7-1", true);

    // Begin tracking time and metadata (blackbox needs this)
    @elapsed = 0;
    @d_mode1 = .@mode;
    @d_mode2 = .@mode2;
    @d_mode3 = .@mode3;
    @d_count = .@count;
    addtimer 5000, strnpcinfo(NPC_NAME_UNIQUE)+"::OnBeet";
    close;

OnBeet:
    if (!compare(getmap(), "demu@") && !compare(getmap(), "018-7-1")) end;
    @elapsed += 5;
    if (@elapsed % 60 < 5)
        mapannounce(getmap(), l("Time left: %d minutes", 10-(@elapsed/60)), bc_map | bc_pc);
    if (@elapsed > 600)
        end;
    addtimer2 5000, strnpcinfo(NPC_NAME_UNIQUE)+"::OnBeet";
    end;

// Check victory conditions
OnYeti:
    fix_mobkill(Yetifly);
OnDem2:
    if (!playerattached()) {
        consolebug "ERROR - PLAYER NOT ATTACHED, INVALID KILL, CANNOT RESOLVE MAP.";
        end;
    }
    .@m$ = getmap();
    .@left=0;
    .@left+=mobcount(.@m$, strnpcinfo(NPC_NAME_UNIQUE)+"::OnYeti");
    .@left+=mobcount(.@m$, strnpcinfo(NPC_NAME_UNIQUE)+"::OnDem1");
    .@left+=mobcount(.@m$, strnpcinfo(NPC_NAME_UNIQUE)+"::OnDem2");
    // You win!
    if (!.@left) {
        mapannounce(getmap(), "CONGRATULATIONS - YOU WIN", bc_map | bc_pc);
        Zeny += rand2(500, 1500)*max(1, @d_mode2);
        // FIXME: Add a proper reward
        maptimer2(.@m$, 1000, strnpcinfo(NPC_NAME_UNIQUE)+"::OnBye");
        01871_Demure_BlackBox();
    }
    end;

OnBye:
    Zeny += rand2(100, 300)*max(1, @d_mode2);
    warp "018-7-1", 23, 22;
    deltimer strnpcinfo(NPC_NAME_UNIQUE)+"::OnBeet";
    end;

// Summon second form (give 5 seconds to players to move)
// FIXME: @d_* might not be set
OnDem1:
    if (!playerattached()) {
        consolebug "ERROR - PLAYER NOT ATTACHED, INVALID KILL, CANNOT RESOLVE MAP.";
        end;
    }
    getmapxy(.@m$, .@x, .@y, 0);
    .@n$ = "Demure, Queen of Dragons : ";
    mapannounce(getmap(), .@n$+"You think you've won...?", bc_map | bc_pc);
    sleep2(1000);
    mapannounce(getmap(), .@n$+"That would be lame; After all, did you forget that...", bc_map | bc_pc);
    sleep2(2000);
    mapannounce(getmap(), .@n$+"I *am* the Queen of Dragons??", bc_map | bc_pc);
    sleep2(1000);
    // Read data, summon dragons...
    for (.@i = 0; .@i < max(1, @d_count*@d_mode3/2); .@i++) {
        .@mob = any(EarthFairy, FireFairy, WaterFairy, WindFairy, GreenDragon);
        .@m = areamonster(.@m$, .@x-10, .@y-10, .@x+10, .@y+10, strmobinfo(1, .@mob), .@mob, 1);
        .@p = getunitdata(.@m, UDT_MODE);
        setunitdata(.@m, UDT_MODE, (.@p | MD_AGGRESSIVE));
    }
    areamonster(.@m$, .@x-5, .@y-5, .@x+5, .@y+5, strmobinfo(1, GreenDragon), GreenDragon, 1);

    // And finally, change form (ressurect)
    .@m=monster(.@m$, 87, 57, strmobinfo(1, DemureSecondForm), DemureSecondForm, 1, strnpcinfo(NPC_NAME_UNIQUE)+"::OnDem2");
    if (@d_count) {
        .@p=getunitdata(.@m, UDT_MAXHP);
        // If player is solo'ing, put more ATK and less HP
        .@hp=.@p*@d_count*@d_mode3;
        if (@d_mode1 == MODE_SOLO) {
            .@hp = .@hp * 3 / 5;
            // Raise ASPD based on difficulty
            setunitdata(.@m, UDT_ADELAY,
                        getunitdata(.@m, UDT_ADELAY) - (@d_mode3 * 25));
        }
        setunitdata(.@m, UDT_MAXHP, .@hp);
        setunitdata(.@m, UDT_HP,    .@hp);
    }
    mapannounce(getmap(), .@n$+"I'll leave a 2x2 black square where you used to be!", bc_map | bc_pc);
    end;

OnInit:
    .distance = 4;
    .sex = G_FEMALE;
    npcsit;
    end;
}