// TMW2 Script
// Author:
// Jesusalva
006-7,44,50,0 script #OutOf0067 NPC_HIDDEN,0,0,{
end;
OnTouch:
if (!$@ICICLE_CHALLENGE)
warp "006-6", 40, 36;
end;
OnRw:
getexp 1000000, 0;
Mobpt += 10000;
dispbottom l("Der Schneemann has been defeated: %s Monster Points gained.", fnum(10000));
end;
}
006-7,44,50,0 script Ice Lord NPC_YETIFLY,{
if ($@ICICLE_CHALLENGE) end;
if (.ticks > gettimetick(2)) {
mesn;
mesq l("This challenge will be available in %s. Please wait until then.", FuzzyTime(.ticks));
close;
}
mesn;
mesq l("With Magic and Blades, The Icicle shall break. Do you undertake the challenge?");
mesc l("Advised: 6+ players"), 1;
mesc l("Advised: 1+ mage, 1+ tanker, 2+ healer"), 1;
mesc l("Time Limit: 90 minutes"), 1;
mesc l("Enter/Leave after start: %s", b(l("NO"))), 1;
next;
select
l("Not yet."),
l("Bring it on!"),
rif(REBIRTH, l("Bring me, my worst nightmare."));
mes "";
if (@menu == 1) {
closeclientdialog;
close;
}
.ticks = gettimetick(2) + 5400; // 90 minutes
.BOSS = monster("006-7", 44, 36, "Der Schneemann", SnowmanBoss, 1);
.@mlt = (@menu == 2 ? 10 : 15);
setunitdata(.BOSS, UDT_MAXHP, 1000000 * .@mlt / 10); // 1M ~ 1.5M
setunitdata(.BOSS, UDT_HP, 1000000 * .@mlt / 10);
// Reconfigure the AI
.@opt=getunitdata(.BOSS, UDT_MODE);
// Disable looting
if (.@opt & MD_LOOTER)
.@opt=.@opt^MD_LOOTER;
// Add knockback immunity
.@opt=.@opt|MD_NOKNOCKBACK;
// Mark as boss
.@opt=.@opt|MD_BOSS;
// Mark as aggressive
.@opt=.@opt|MD_AGGRESSIVE;
.@opt=.@opt|MD_ANGRY;
// Make it more op
.@opt=.@opt|MD_DETECTOR;
.@opt=.@opt|MD_CASTSENSOR_CHASE;
.@opt=.@opt|MD_CASTSENSOR_IDLE;
.@opt=.@opt|MD_CHANGECHASE;
.@opt=.@opt|MD_CHANGETARGET_MELEE;
.@opt=.@opt|MD_CHANGETARGET_CHASE;
setunitdata(.BOSS, UDT_MODE, .@opt);
// Nerf the damage, but never miss a hit
setunitdata(.BOSS, UDT_ATKMIN, 60 * .@mlt / 10); // 60~90 dmg
setunitdata(.BOSS, UDT_ATKMAX, 60 * .@mlt / 10);
setunitdata(.BOSS, UDT_ADELAY, 2220 / .@mlt * 10); // 2220 or 1480ms
setunitdata(.BOSS, UDT_HIT, 2400);
// Boosting the defense is not necessary
// It nerfs weapons to 40% (bows to 20%)
// Then it resists 50% of Neutral element.
// Note it is strong against Water (25% dmg)
// And weak against Fire (snow) and Wind (100% dmg)
// Otherwise, behave as Ghost element
$@ICICLE_CHALLENGE = true;
disablenpc .name$;
initnpctimer;
closeclientdialog;
close;
// Heart
OnTimer5000:
/* Maybe the fight is over */
if (!mobcount("006-7", "all"))
maptimer2("006-7", 10, "#OutOf0067::OnRw");
if (.ticks < gettimetick(2) || !mobcount("006-7", "all") || !getmapusers("006-7")) {
killmonsterall("006-7");
enablenpc .name$;
.ticks = min(.ticks, gettimetick(2) + 1800); // Min. Cooldown: 30 min
.beats = 0;
$@ICICLE_CHALLENGE = false;
stopnpctimer;
end;
}
/* Prepare some data */
.@hp = getunitdata(.BOSS, UDT_HP) * 100 / getunitdata(.BOSS, UDT_MAXHP);
getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, .BOSS);
.@c=getunits(BL_PC, .@pcs, MAX_CYCLE_PC, .@m$);
.@mvp=0;.@rnd=0;.@def=0;
for (.@i = 0; .@i < .@c; .@i++) {
if (!.@rnd || !rand2(.@c))
.@rnd=.@pcs[.@i];
if (getunitdata(.@pcs[.@i], UDT_DEF) > .@def) {
if (getunitdata(.@pcs[.@i], UDT_HP) < 1) continue;
.@mvp=.@pcs[.@i];
.@def=getunitdata(.@pcs[.@i], UDT_DEF);
}
}
.beats += 1;
/* Everyone is dead, get rid of them */
if (!.@mvp || !.@rnd) {
mapwarp("006-7", "006-6", 40, 36);
initnpctimer;
end;
}
/* Decide the skill to use based on ~5s beats over 3 minutes */
switch (.beats % 18) {
// Summon Reinforcements (every 60s)
case 0:
case 6:
case 12:
unittalk(.BOSS, "Come forth, ##Bsnow army##b, for the Icicle shall live forever!");
specialeffect(64, AREA, .BOSS);
sleep(500);
monster("006-7", 44, 22, strmobinfo(1, Snowman), Snowman, max(1, (11 - .@hp) / 10));
break;
}
initnpctimer;
end;
OnInit:
.distance = 4;
.ticks = gettimetick(2);
.beats = 0;
.mvp = 0;
.def = 0;
end;
}