// TMW2 Script
// Authors:
// Jesusalva
// Description:
// Dungeon utilities
- script #DungeonCore NPC_HIDDEN,{
end;
// Main initialization
OnInit:
setarray .heatmap$, "007-2", "026-3";
setarray .cursemap$, "006-4", "006-4-1", "025-1", "026-2";
setarray .sickmap$, "029-5";
setarray .bleedmap$, "006-9", "026-6", "026-7";
setarray .clockmap$, "017-0", "032-2";
end;
/////////////////////////////////////////
// Heartbeat for Heat effects
OnHeat:
// Did you left?
.@i=array_find(.heatmap$, getmap());
if (.@i < 0) {
@heat$="";
end;
}
// First time seeing this
if (@heat$ != getmap()) {
@heat$=getmap();
dispbottom l("This is a hot map, you're suffering damage over time.");
}
// You are in a HEATMAP$, so suffer damage from heat
if (@coolio > gettimetick(2) || Class == Redy)
percentheal -1, 0;
else
percentheal -5, 0;
// New tick (dies in 140~180 seconds)
addtimer2 rand2(7000, 9000), .name$+"::OnHeat";
end;
/////////////////////////////////////////
// Heartbeat for Cursed Land map effects
OnCurse:
// Did you left?
.@i=array_find(.cursemap$, getmap());
if (.@i < 0) {
@curse$="";
end;
}
// First time seeing this
if (@curse$ != getmap()) {
@curse$=getmap();
dispbottom l("This is a Cursed Lands map, you'll lose mana over time and may also incurr in debuffs if mana is low (may cause death).");
}
// You are in a CURSEMAP$, so suffer damage from the curse
if (@purifio > gettimetick(2) || Class == Savior)
heal 0, -1;
else if (islegendary())
percentheal 0, -2;
else
percentheal 0, -4;
// MP is below 20%, you'll get cursed
if (Sp*100 < MaxSp*20)
SC_Bonus(15, SC_CURSE, 1);
// MP is below 1%, you'll get start losing HP rapidly
if (Sp*100 < MaxSp)
percentheal -9, 0;
// New tick (cycles every 15 seconds in average)
addtimer2 rand2(14000, 15000), .name$+"::OnCurse";
end;
/////////////////////////////////////////
// Heartbeat for Disease effects
OnSick:
// Did you left?
.@i=array_find(.sickmap$, getmap());
if (.@i < 0) {
if (@forced_sick$ != getmap()) {
@sick$="";
end;
}
}
// First time seeing this
if (@sick$ != getmap()) {
@sick$=getmap();
dispbottom l("This map contains poisonous gas and may cause diseases.");
}
// The effect is based on HP
if (Hp*10 > MaxHp*7)
.@eff = SC_BLOODING;
else if (Hp*10 > MaxHp*4)
.@eff = SC_POISON;
else
.@eff = SC_DPOISON;
// You are in a SICKMAP$, so suffer damage from disease
if (@sickio > gettimetick(2) || Class == Raijin) {
heal -50, 0;
} else {
heal -rand2(50, 200), 0;
SC_Bonus(10, .@eff, 1);
}
// New tick (20 seconds fixed cycle)
addtimer2 20000, .name$+"::OnSick";
end;
/////////////////////////////////////////
// Heartbeat for Bleed effects
OnBleed:
// Did you left?
.@i=array_find(.bleedmap$, getmap());
if (.@i < 0) {
@bleed$="";
end;
}
// First time seeing this
if (@bleed$ != getmap()) {
@bleed$=getmap();
dispbottom l("This is a Blood Pact map, HP won't recover naturally, and bleeding may start.");
}
// You are in a BLEEDMAP$, HP regeneration is disabled
if (@bleedio <= gettimetick(2))
SC_Bonus(15, SC_HALT_REGENERATION, 1);
// You may bleed at 2% chance per 15 seconds (except heroes)
if (rand2(50) == 25 && !islegendary())
SC_Bonus(15, SC_BLOODING, 1);
// New tick (15 seconds fixed cycle)
addtimer2 15000, .name$+"::OnBleed";
end;
/////////////////////////////////////////
// Heartbeat for Clocked effects
function syndroCheck {
.@k = getarg(0);
.@t = getarg(1, 2000);
sleep2(.@t);
if (!playerattached()) return false;
if (BaseExp != .@k) return true;
return false;
}
OnClocked:
// Not Applicable
if ($CAPTCHA & 4)
end;
// Did you left?
.@i=array_find(.clockmap$, getmap());
if (.@i < 0) {
@clocked$="";
end;
}
// First time seeing this
if (@clocked$ != getmap()) {
@clocked$=getmap();
dispbottom l("This is an OverClocked map, excessive combat will cause Botter's Syndrome Disease, which reduces EXP Gain and drops.");
}
// Prepare the variables we'll be studying
.@mpk = MONSTERS_KILLED; .@k = BaseExp;
// We'll now wait in some intervals. Killing in them cause
// the K variables to be set, and contribute towards bot score.
.@k1 = syndroCheck(.@k); .@k = BaseExp;
.@k2 = syndroCheck(.@k); .@k = BaseExp;
.@k3 = syndroCheck(.@k); .@k = BaseExp;
.@k4 = syndroCheck(.@k); .@k = BaseExp;
.@k5 = syndroCheck(.@k); .@k = BaseExp;
.@k6 = syndroCheck(.@k); .@k = BaseExp;
.@k7 = syndroCheck(.@k); .@k = BaseExp;
.@k8 = syndroCheck(.@k); .@k = BaseExp;
// Determine if you'll be afflicted, base chance is 100%
.@chance = 100;
// Every 2 seconds you spent without killing is -10%
if (!.@k1)
.@chance -= 10;
if (!.@k2)
.@chance -= 10;
if (!.@k3)
.@chance -= 10;
if (!.@k4)
.@chance -= 10;
if (!.@k5)
.@chance -= 10;
if (!.@k6)
.@chance -= 10;
if (!.@k7)
.@chance -= 10;
if (!.@k8)
.@chance -= 10;
// You killed less than 7 monsters, so zero the chance
if (.@mpk + 7 > MONSTERS_KILLED)
.@chance -= 20;
// (If you killed less than 12 monsters, potentially go to 10%
else if (.@mpk + 12 > MONSTERS_KILLED)
.@chance -= 10;
// Determine whenever you'll be afflicted with the Syndrome
// The syndrome duration is 30 seconds
if (rand2(100) < .@chance) {
// If you have a Homunculus active, the effect is smaller (5~10%)
if (gethominfo(0))
.@homun = (homstatus() ? 10 : 20);
else
.@homun = 10;
// Calculate the effect based on your score (5~15%)
.@eff = 5 + (.@chance / .@homun);
// If you already have one running (!!), increase the effect
if (getstatus(SC_BOTTER_SYNDROME)) {
.@eff += min(100, getstatus(SC_BOTTER_SYNDROME, 1));
}
// Sanitize the effect (it cannot go past 30%)
// (Note it reaches the cap if it fires at 100% rate twice w/o Homun)
.@cap = (getmap() == "017-0" ? 30 : 40);
.@eff = min(.@cap, .@eff);
SC_Bonus(30, SC_BOTTER_SYNDROME, .@eff);
}
// New tick (14~30 seconds fixed cycle)
addtimer2 rand(14000,30000), .name$+"::OnClocked";
end;
}
//////////////////////////////
007-2 mapflag nosave 007-1,99,189
006-4 mapflag nosave 006-3,54,36
006-4-1 mapflag nosave 006-3,54,36
029-5 mapflag nosave 029-4,21,97
006-9 mapflag nosave 006-6,46,27