// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// Protect Hurnscald
012-1,71,24,0 script Lieutenant Paul NPC_PLAYER,{
// The Monster King guild have a special menu
if (!$HURNS_LIBDATE && is_admin()) goto L_Admus;
if (strcharinfo(2) == "Monster King") goto L_MKControl;
mesn;
mesq l("We are @@ since the last great attack from the Monster King.", FuzzyTime($HURNS_LIBDATE,1,2));
close;
L_Admus:
mes col("Protip: Use @hide to don't interfer.", 9);
mes l("Determine Team Size (If everyone is ready and stdby at Tulimshar, use: @@. Minimum 2 players.)", getusers(1));
input $@BG1_SIZE;
if ($@BG1_SIZE < 2) close;
$@BG1_SIZE=$@BG1_SIZE+1;
kickwaitingroomall("Hurnsguard");
setmapflagnosave("012-1", "000-1", 22, 22);
setmapflag("012-1", mf_nocommand);
setmapflag("012-1", mf_battleground);
enablenpc "Hurnsguard";
donpcevent "Hurnsguard::OnSet";
addmapmask "012-1", 10;
pvpon("012-1");
disablenpc "#012-1_22_62";
disablenpc "#012-1_79_17";
disablenpc "#012-1_79_102";
disablenpc "#012-1_132_101";
disablenpc "#012-1_65_55";
disablenpc "#012-1_89_58";
disablenpc "#012-1_101_55";
disablenpc "#012-1_121_71";
disablenpc "#012-1_116_66";
disablenpc "#012-1_110_56";
disablenpc "#012-1_102_69";
disablenpc "Andrei Sakar";
disablenpc "Dyrin The Traveler";
disablenpc "Gwendolyn";
disablenpc "Jack";
disablenpc "Locamit";
disablenpc "Richard";
disablenpc "Soul Menhir#hurns";
disablenpc "HurnsShip";
announce l("##1Hear ya, hear ya! There are @@ vacant slots at Hurnsguard to LIBERATE HURNSCALD!", $@BG1_SIZE), bc_all | bc_npc;
mes "##1You are assigned to Monster Forces. Do not leave Hurnscald.";
close;
L_MKControl:
mesn;
mes l("Oh noes! You've found the Hurnscald control panel!");
close;
/*
menu
l("Initiate small siege (lv. 20)"), L_MKSmall,
l("Initiate medium siege (lv. 30)"), L_MKMedium,
l("Initiate huge siege (lv. 40)"), L_MKHuge,
l("Abort"), -;
close;
L_MKSmall:
addmapmask "012-1", 2;
changemusic "012-1", "mythica.ogg";
disablenpc("Mana Stone");
$@SIEGE_HURNS=0; // factor zero
pvpon("012-1");
pvpon("010-2");
announce(l("##1WARNING! WARNING! Siege starting at Hurnscald!!"), bc_all);
areamonster("010-2", 0, 0, 79, 81, l("Black Scorpion"), 1074, 15, "Lieutenant Jacob::OnBlackScorpionDeath");
initnpctimer;
close;
L_MKMedium:
addmapmask "012-1", 2;
changemusic "012-1", "eric_matyas_ghouls.ogg";
disablenpc("Mana Stone");
$@SIEGE_HURNS=1; // factor one
pvpon("012-1");
pvpon("010-2");
announce(l("##1WARNING! WARNING! Siege starting at Hurnscald!!"), bc_all);
areamonster("010-2", 0, 0, 79, 81, l("Black Scorpion"), 1074, 25, "Lieutenant Jacob::OnBlackScorpionDeath");
initnpctimer;
close;
L_MKHuge:
addmapmask "012-1", 2;
changemusic "012-1", "misuse.ogg";
disablenpc("Mana Stone");
$@SIEGE_HURNS=5; // factor five
pvpon("012-1");
pvpon("010-2");
announce(l("##1WARNING! WARNING! Siege starting at Hurnscald!!"), bc_all);
areamonster("010-2", 0, 0, 79, 81, l("Black Scorpion"), 1074, 40, "Lieutenant Jacob::OnBlackScorpionDeath");
initnpctimer;
close;
OnBlackScorpionDeath:
areamonster("010-2", 0, 0, 79, 81, l("Black Scorpion"), 1074, 1, "Lieutenant Jacob::OnBlackScorpionDeath");
if (rand(10000) <= 90+($@SIEGE_HURNS*10))
getitem StrangeCoin, 1;
end;
OnBlackScorpion2Death:
areamonster("012-1", 0, 0, 120, 155, l("Black Scorpion"), 1074, 1, "Lieutenant Jacob::OnBlackScorpion2Death");
if (rand(10000) <= 850+($@SIEGE_HURNS*100))
getitem StrangeCoin, 1;
end;
OnGreenSlimeDeath:
areamonster("012-1", 0, 0, 120, 155, l("Green Slime"), 1085, 1, "Lieutenant Jacob::OnGreenSlimeDeath");
if (rand(10000) <= 200+($@SIEGE_HURNS*100))
getitem StrangeCoin, 1;
end;
OnCandiedSlimeDeath:
areamonster("012-1", 0, 0, 120, 155, l("Candied Slime"), 1089, 1, "Lieutenant Jacob::OnCandiedSlimeDeath");
if (rand(10000) <= 150+($@SIEGE_HURNS*100))
getitem StrangeCoin, 1;
end;
OnManaGhostDeath:
areamonster("012-1", 0, 0, 120, 155, l("Mana Ghost"), 1068, 1, "Lieutenant Jacob::OnManaGhostDeath");
if (rand(10000) <= 900+($@SIEGE_HURNS*100))
getitem StrangeCoin, 1;
end;
OnLieutenantDeath:
getitem StrangeCoin, 1;
Karma=Karma+1;
mapannounce("012-1", l("##2The Monster Lieutenant was defeated by @@!", strcharinfo(0)), bc_map);
end;
OnColonelDeath:
getitem StrangeCoin, 1;
Karma=Karma+1;
$MOST_HEROIC$=strcharinfo(0);
mapannounce("012-1", l("##2The Monster Colonel was defeated by @@!", strcharinfo(0)), bc_map);
end;
OnTimer5000:
areamonster("010-2", 0, 0, 79, 81, "Black Scorpion", 1074, 5+$@SIEGE_HURNS, "Lieutenant Jacob::OnBlackScorpionDeath");
areamonster("012-1", 0, 0, 120, 155, "Black Scorpion", 1074, 5+$@SIEGE_HURNS, "Lieutenant Jacob::OnBlackScorpion2Death");
mapannounce("012-1", "##2Message to all Hurnscald NPCs: Take shelter!", bc_map);
disablenpc "Lynn The Traveler";
end;
OnTimer15000:
areamonster("010-2", 0, 0, 79, 81, ("Black Scorpion"), 1074, 5, "Lieutenant Jacob::OnBlackScorpionDeath");
areamonster("012-1", 0, 0, 120, 155, ("Black Scorpion"), 1074, 10, "Lieutenant Jacob::OnBlackScorpion2Death");
end;
OnTimer60000:
if ($@SIEGE_HURNS == 1) {
mapannounce("012-1", "##1The Monster Lieutenant arrived!", bc_map);
areamonster("012-1", 0, 0, 120, 155, ("Monster Lieutenant"), 1077, 1, "Lieutenant Jacob::OnLieutenantDeath");
}
areamonster("012-1", 0, 0, 120, 155, ("Black Scorpion"), 1074, 3, "Lieutenant Jacob::OnBlackScorpion2Death");
areamonster("012-1", 0, 0, 120, 155, ("Green Slime"), 1085, 10+$@SIEGE_HURNS, "Lieutenant Jacob::OnGreenSlimeDeath");
areamonster("012-1", 0, 0, 120, 155, ("Candied Slime"), 1089, 1+$@SIEGE_HURNS, "Lieutenant Jacob::OnCandiedSlimeDeath");
end;
OnTimer120000:
if ($@SIEGE_HURNS == 5) {
mapannounce("012-1", "##1The Monster Colonel arrived!", bc_map);
areamonster("012-1", 0, 0, 120, 155, ("Monster Colonel"), 1036, 1, "Lieutenant Jacob::OnColonelDeath");
}
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 15);
areamonster("012-1", 0, 0, 120, 155, ("Black Scorpion"), 1074, 1, "Lieutenant Jacob::OnBlackScorpion2Death");
areamonster("012-1", 0, 0, 120, 155, ("Green Slime"), 1085, 10, "Lieutenant Jacob::OnGreenSlimeDeath");
areamonster("012-1", 0, 0, 120, 155, ("Mana Ghost"), 1068, 2, "Lieutenant Jacob::OnManaGhostDeath");
end;
OnTimer180000:
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 25);
areamonster("012-1", 0, 0, 120, 155, ("Black Scorpion"), 1074, 1, "Lieutenant Jacob::OnBlackScorpion2Death");
areamonster("012-1", 0, 0, 120, 155, ("Candied Slime"), 1089, 10, "Lieutenant Jacob::OnCandiedSlimeDeath");
areamonster("012-1", 0, 0, 120, 155, ("Mana Ghost"), 1068, 2, "Lieutenant Jacob::OnManaGhostDeath");
end;
OnTimer240000:
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 25);
areamonster("012-1", 0, 0, 120, 155, ("Black Scorpion"), 1074, 1, "Lieutenant Jacob::OnBlackScorpion2Death");
areamonster("012-1", 0, 0, 120, 155, ("Mana Ghost"), 1068, 2, "Lieutenant Jacob::OnManaGhostDeath");
end;
OnTimer300000:
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 5);
areamonster("012-1", 0, 0, 120, 155, ("Candied Slime"), 1089, 1, "Lieutenant Jacob::OnCandiedSlimeDeath");
areamonster("012-1", 0, 0, 120, 155, ("Mana Ghost"), 1068, 1, "Lieutenant Jacob::OnManaGhostDeath");
end;
OnTimer360000:
OnTimer420000:
OnTimer480000:
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 5+$@SIEGE_HURNS);
areamonster("012-1", 0, 0, 120, 155, ("Red Slime"), 1092, 1+$@SIEGE_HURNS);
end;
OnTimer540000:
mapannounce("012-1", "##1The Monster Army is getting tired of resistance!", bc_map);
areamonster("012-1", 0, 0, 120, 155, ("Slime Blast"), 1090, 5+$@SIEGE_HURNS);
areamonster("012-1", 0, 0, 120, 155, ("Mana Ghost"), 1068, 1, "Lieutenant Jacob::OnManaGhostDeath");
end;
OnTimer600000:
mapannounce("012-1", "##1The Monster King army is preparing to withdraw!", bc_map);
end;
OnTimer630000:
removemapmask "012-1", 2;
changemusic "012-1", "dragon_and_toast.ogg"; // Restore to default
enablenpc("Mana Stone");
$@SIEGE_HURNS$=0;
killmonsterall("012-1", 0);
killmonsterall("010-2", 0);
pvpoff("012-1");
announce(("Hurnscald siege is over!"), bc_all);
enablenpc "Lynn The Traveler";
stopnpctimer;
end;
*/
OnInit:
.sex = G_MALE;
.distance = 4;
.@npcId = getnpcid(0, .name$);
setunitdata(.@npcId, UDT_HEADTOP, Bull);
setunitdata(.@npcId, UDT_HEADMIDDLE, LegionTrainingShirt);
setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
setunitdata(.@npcId, UDT_SHIELD, LousyMoccasins); // TODO FIXME: Display Boots
setunitdata(.@npcId, UDT_WEAPON, ArtisBacksword);
setunitdata(.@npcId, UDT_HAIRSTYLE, 12);
setunitdata(.@npcId, UDT_HAIRCOLOR, 15);
end;
}
// Liberation Day Script
003-1,122,25,0 script Hurnsguard NPC_PLAYER,{
query_sql("SELECT online FROM char WHERE charname='Saulc GM'", .@online);
if (!.@online) {
mesn;
mesq l("We are planning to take over Hurnscald from the Monster King, and we will need everybody's help.");
next;
mesn;
mesq l("As soon that Saulc GM get back, we can start.");
close;
}
mes col("Hurnscald Liberation Day special event", 3);
mes "";
mes col("The objective of this event is to ##Bslay the Monster Admiral##b.",9);
mes col("If you die, you ##Bwon't##b be able to rejoin, but you won't suffer the penalty.",9);
next;
mes col("If all players there die, Hurnscald WON'T BE LIBERATED.",9);
mes col("This basically means that it'll be another day without it.", 9);
mes col("Also, the more players survive, the better rewards will be given.", 9);
next;
mes col("Right click on this NPC to join the Hurnscald Alliance.", 3);
mes col("The number of players must be precise, meaning if someone doesn't joins,", 9);
mes col("the event won't start and HURNSCALD WON'T BE LIBERATED.", 9);
next;
mes col("Once you join the Alliance, you won't be able to talk with people outside it.", 9);
mes col("Additionaly, all your movement will be restricted until either you're warped or log out.", 9);
close;
OnSet:
waitingroom("Hurnscald Alliance", $@BG1_SIZE, "start#hurns_lib::OnReadyCheck", $@BG1_SIZE-1);
end;
OnInit:
.@npcId = getnpcid(0, .name$);
setunitdata(.@npcId, UDT_HEADTOP, GoldenWarlordPlate); // Light armor
setunitdata(.@npcId, UDT_HEADMIDDLE, JeansChaps); // Pants
setunitdata(.@npcId, UDT_HEADBOTTOM, DeepBlackBoots); // Shoes
setunitdata(.@npcId, UDT_WEAPON, BugSlayer);
setunitdata(.@npcId, UDT_HAIRSTYLE, 13);
setunitdata(.@npcId, UDT_HAIRCOLOR, 7);
disablenpc(.name$);
end;
OnEnterBG:
$@FK_Team1 = waitingroom2bg("012-1",141, 65,"start#hurns_lib::OnPlayerQuit","start#hurns_lib::OnPlayerDeath");
end;
OnDoEvent:
mapannounce("012-1", "Find and slay the Monster Admiral! Don't let everyone die!", bc_map);
.@Pl=getmapusers("012-1");
monster("012-1", 65, 71, "Monster Admiral", GiantMutatedBat, 1, "Hurnsguard::OnVictory");
areamonster("012-1", 52, 45, 127, 80, "Monster Sergeant", Forain, .@Pl/2+1, "Hurnsguard::OnXtreem");
areamonster("012-1", 52, 45, 127, 80, "Monster Sergeant", Moonshroom, .@Pl/2+1, "Hurnsguard::OnXtreem");
areamonster("012-1", 52, 45, 127, 80, "Monster Soldier", AngryScorpion, .@Pl, "Hurnsguard::OnSkip");
for (.@i = 0; .@i < .@Pl; .@i++)
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Friendly Guard", FallenGuard1, "Cassia::OnSkip");
initnpctimer();
end;
OnSkip:
end;
OnTimer300000:
.@Pl=getmapusers("012-1")+mobcount("012-1", "Cassia:OnSkip")-1;
.@Pla=getmapusers("012-1");
.@Mb=mobcount("012-1", "Hurnsguard:OnSkip")+mobcount("012-1", "Hurnsguard::OnXtreem")+2; // Saulc GM is an enemy for server code
for (.@i = 0; .@i < .@Pla; .@i++)
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Friendly Guard", FallenGuard1, "Cassia::OnSkip");
// See if we need extra guards, depending on how outnumbered allied forces are.
if ((.@Mb / .@Pl) > 7) {
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
if ((.@Mb / .@Pl) > 6) {
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
if ((.@Mb / .@Pl) > 5) {
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
if ((.@Mb / .@Pl) > 4) {
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
if ((.@Mb / .@Pl) > 3) {
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
.@Pl=getmapusers("012-1")+mobcount("012-1", "Cassia:OnSkip")-1;
.@Pla=getmapusers("012-1")-1;
mapannounce("012-1", "Survivors: "+.@Pla+" Hurnscald Alliance: "+.@Pl+" Monsters: "+.@Mb, bc_map);
initnpctimer;
end;
OnTimer30000:
OnTimer120000:
OnTimer240000:
.@Pl=getmapusers("012-1");
for (.@i = 0; .@i < .@Pl; .@i++) {
.@mid=rand(1,13);
switch (.@mid) {
case 1:
.@monsterId = CaveMaggot ; break;
case 2:
.@monsterId = RedSlime ; break;
case 3:
.@monsterId = LavaSlime ; break;
case 4:
.@monsterId = BlackScorpion ; break;
case 5:
.@monsterId = AngryRedScorpion ; break;
case 6:
.@monsterId = Sarracenus ; break;
case 7:
.@monsterId = Snake ; break;
case 8:
.@monsterId = MountainSnake ; break;
case 9:
.@monsterId = GreenSlime ; break;
case 10:
.@monsterId = Bandit ; break;
case 11:
.@monsterId = SlimeBlast ; break;
case 12:
.@monsterId = rand(HouseMaggot, AngryScorpion) ; break; // Lucky bonus, probably a Bif
default: // case 13:
.@monsterId = Yeti ; break;
}
areamonster("012-1", 52, 45, 127, 80, "Monster Soldier", .@monsterId, 1, "Hurnsguard::OnSkip");
bg_monster($@FK_Team1, "012-1", rand(131, 141), rand(64, 80), "Additional Guard", FallenGuard2, "Cassia::OnSkip");
}
end;
OnXtreem:
if (rand(0,100) <= 50)
Karma=Karma+1;
else
getitem StrangeCoin, 2;
end;
OnVictory:
$HURNS_LIBDATE=gettimetick(2);
removemapflag("012-1", mf_nosave);
disablenpc "Hurnsguard";
pvpoff("012-1");
removemapflag("012-1", mf_nocommand);
removemapflag("012-1", mf_battleground);
enablenpc "#012-1_22_62";
enablenpc "#012-1_79_17";
enablenpc "#012-1_79_102";
enablenpc "#012-1_132_101";
enablenpc "#012-1_65_55";
enablenpc "#012-1_89_58";
enablenpc "#012-1_101_55";
enablenpc "#012-1_121_71";
enablenpc "#012-1_116_66";
enablenpc "#012-1_110_56";
enablenpc "#012-1_102_69";
enablenpc "Andrei Sakar";
enablenpc "Dyrin The Traveler";
enablenpc "Gwendolyn";
enablenpc "Jack";
enablenpc "Locamit";
enablenpc "Richard";
enablenpc "Soul Menhir#hurns";
enablenpc "HurnsShip";
announce "##2Hurnscald was recovered!", bc_all | bc_npc;
killmonster("012-1", "All");
maptimer("012-1", 10, "Hurnsguard::OnReward");
end;
OnReward:
// Let's say we have 5 players for reference. Subtract a Game Master, he doesn't counts.
.@Pl=getmapusers("012-1")-1;
getexp .@Pl*600, .@Pl*30; // 3,000 exp, 150 jxp
Zeny=Zeny+.@Pl*300; // 1,500 gp
end;
}
//== Battleground Engine ======================
012-1,0,0,0 script start#hurns_lib NPC_HIDDEN,{
OnInit:
end;
OnEnable:
end;
OnPlayerQuit:
OnPlayerDeath:
bg_leave();
// Check if we are done for.
warp "000-1", 22, 22;
.@Pl=getmapusers("012-1");
if (.@Pl <= 1) {
announce "##1Hurnscald is lost!", bc_all | bc_npc;
disablenpc "Hurnsguard";
pvpoff("012-1");
removemapflag("012-1", mf_nocommand);
removemapflag("012-1", mf_battleground);
killmonster("012-1", "All");
}
end;
OnReadyCheck:
.@Alliance = getwaitingroomstate(0,"start#hurns_lib");
if ( .@Alliance < 1 )
end;
donpcevent "Hurnsguard::OnEnterBG";
donpcevent "Hurnsguard::OnDoEvent";
bg_warp $@FK_Team1,"012-1",141, 65;
//initnpctimer;
end;
}
// Handle Guard's logic
function script CheckpointGuard {
mesn;
mesq l("I am stationed here to protect Hurnscald from monsters.");
next;
mesn;
mesq l("If the Monster King attack, I will try to control inbound monsters here.");
close;
return;
}
012-1,81,18,0 script Checkpoint Guard#1 NPC_GUARD2,{
CheckpointGuard();
end;
OnInit:
.sex = G_FEMALE;
.distance = 5;
end;
}
012-1,26,60,0 script Checkpoint Guard#2 NPC_GUARD1,{
CheckpointGuard();
end;
OnInit:
.sex = G_MALE;
.distance = 5;
end;
}
012-1,80,98,0 script Checkpoint Guard#3 NPC_GUARD2,{
CheckpointGuard();
end;
OnInit:
.sex = G_FEMALE;
.distance = 5;
end;
}
012-1,134,98,0 script Checkpoint Guard#4 NPC_GUARD1,{
CheckpointGuard();
end;
OnInit:
.sex = G_MALE;
.distance = 5;
end;
}
012-1,94,56,0 script Guard#012-1.1 NPC_GUARD1,{
legiontalk;
end;
OnInit:
.sex = G_MALE;
.distance = 5;
end;
}
012-1,112,65,0 script Guard#012-1.2 NPC_GUARD2,{
legiontalk;
end;
OnInit:
.sex = G_FEMALE;
.distance = 5;
end;
}