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