summaryrefslogtreecommitdiff
path: root/npc/001-1
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
committerJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
commita7c45a192268da2601cef47a4cdba987ae2327ca (patch)
treec5fb5b97db109fe7106496dd96498c475881046b /npc/001-1
downloadserverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.gz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.bz2
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.xz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.zip
Initial commit (Moubootaur Legends fork)
Diffstat (limited to 'npc/001-1')
-rw-r--r--npc/001-1/_import.txt9
-rw-r--r--npc/001-1/bgmaster.txt349
-rw-r--r--npc/001-1/eventmaster.txt854
-rw-r--r--npc/001-1/mahul.txt57
-rw-r--r--npc/001-1/mapflags.txt9
-rw-r--r--npc/001-1/portal.txt136
-rw-r--r--npc/001-1/rewards.txt129
-rw-r--r--npc/001-1/wateranimation.txt29
8 files changed, 1572 insertions, 0 deletions
diff --git a/npc/001-1/_import.txt b/npc/001-1/_import.txt
new file mode 100644
index 0000000..71cb54d
--- /dev/null
+++ b/npc/001-1/_import.txt
@@ -0,0 +1,9 @@
+// Map 001-1: Floating Island of Aeros
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-1/bgmaster.txt",
+"npc/001-1/eventmaster.txt",
+"npc/001-1/mahul.txt",
+"npc/001-1/mapflags.txt",
+"npc/001-1/portal.txt",
+"npc/001-1/rewards.txt",
+"npc/001-1/wateranimation.txt",
diff --git a/npc/001-1/bgmaster.txt b/npc/001-1/bgmaster.txt
new file mode 100644
index 0000000..cd4af38
--- /dev/null
+++ b/npc/001-1/bgmaster.txt
@@ -0,0 +1,349 @@
+// TMW2 Scripts.
+// Author:
+// Jesusalva
+// Description
+// Cassia and her lieutenants manages Aeros Battlegrounds
+
+001-1,96,37,0 script Cassia NPC_FEMALE,{
+ mesn;
+
+ if (is_gm()) goto L_Control;
+ if ($@BGMaster1) goto L_Busy;
+
+L_Intro:
+ mesq l("Hello! I am Cassia, Ambassator. During the Monster War outbreak, Halinarzo was almost entirely destroyed.");
+ next;
+ mesq l("To train their soldiers, they frequently face Frostia in duels. Adventurers are welcome to join their drills.");
+ next;
+ mesq l("To join a drill, right click on one of the lieutenants and join their Battle Stations. The drill can last up to 10 minutes.");
+ next;
+ mesq l("The sides accept only one adventurer. You'll also lose access to General Chat upon joining, and will have to use #world.");
+ next;
+ mesq l("Be sure to have a friend before joining, or you may have to logout in order to be able to move again!");
+ close;
+
+L_Close:
+ close;
+
+L_Busy:
+ if ($@BGMaster1 == 2) {
+ mesq l("The soldiers are resting at the moment.");
+ } else {
+ mesq l("People are challenging now.");
+ }
+ close;
+
+L_Control:
+ menu
+ l("Introduce"), L_Intro,
+ rif($@BGMaster1 != 1 && is_gm(),l("Enable BG")), L_On,
+ l("Disable BG"), L_Off,
+ rif(is_admin(), l("Solo Try")), L_Beta;
+
+L_On:
+ mes "";
+ mes l("Determine Team Size +1 (so 1 each side, use 2)");
+ input $@BG1_SIZE;
+ if ($@BG1_SIZE < 2) close;
+
+ donpcevent "Lt. Randy::OnSet";
+ donpcevent "Lt. Gerry::OnSet";
+ kickwaitingroomall("Lt. Randy");
+ kickwaitingroomall("Lt. Gerry");
+
+ if ($@BGMaster1 == 2) $@BGMaster1=0;
+ enablenpc "Lt. Randy";
+ enablenpc "Lt. Gerry";
+ mapannounce "001-1", l("Frostia and Halinarzo are now on a spar!"), bc_map;
+ mes "Event enabled.";
+ close;
+
+L_Off:
+ delwaitingroom("Lt. Randy");
+ delwaitingroom("Lt. Gerry");
+ disablenpc "Lt. Randy";
+ disablenpc "Lt. Gerry";
+ mes "Event disabled.";
+ close;
+
+OnPcQuit:
+ warp "002-4", 0, 0;
+ bg_leave();
+ end;
+
+OnPcDeath:
+ warp "002-4", 0, 0;
+ bg_leave();
+ end;
+
+OnTimer60000:
+ if (getmapusers("001-2") < 2 || .BGC > 10) goto L_Cancel;
+
+ mapannounce("001-2", "Reinforcements raise!", bc_map);
+ //$@FKing_T1 = bg_monster($@FK_Team1, "001-2", 125, 38, "Frostia Guard", 1081, "Cassia::OnSkip");
+ bg_monster($@FK_Team1, "001-2", rand(105, 108), rand(37, 80), "Frostia Guard", FallenGuard1, "Cassia::OnSkip");
+ //$@FKing_T2 = bg_monster($@FK_Team2, "001-2",124, 213, "Halinarzo Guard", 1082, "Cassia::OnSkip");
+ bg_monster($@FK_Team2, "001-2", rand(142, 145), rand(37, 80), "Halinarzo Guard", FallenGuard2, "Cassia::OnSkip");
+ .BGC+=1;
+ stopnpctimer();
+ initnpctimer();
+ end;
+
+// Arena Cooldown (every 8 hours) (CET time)
+OnClock0001:
+OnClock0801:
+OnClock1601:
+ if ($@BGMaster1 == 2) $@BGMaster1=0;
+ end;
+
+OnSkip:
+ end;
+
+L_Skip:
+ end;
+
+L_RestartTimer:
+ stopnpctimer();
+ initnpctimer();
+ end;
+
+L_Cancel:
+ if ($@GM_OVERRIDE)
+ end;
+ stopnpctimer();
+ announce "The Fallen Kings Duel ended in a draw!", bc_all;
+ killmonsterall "001-2";
+
+ mapwarp "001-2", "001-1", 235, 27;
+ bg_destroy($@FK_Team1);
+ bg_destroy($@FK_Team2);
+ $@BGMaster1=2;
+ end;
+
+OnVictor1:
+ if (!$@BGMaster1) goto L_Skip;
+ stopnpctimer();
+ announce "Team 1 raises victorious at the Fallen Kings Duel!", bc_all; // TODO: Give players a reward
+ killmonsterall "001-2";
+ //delcells "Wall_0012_left";
+ //delcells "Wall_0012_right";
+
+ mapwarp "001-2", "001-1", 117, 72;
+ bg_destroy($@FK_Team1);
+ bg_destroy($@FK_Team2);
+ $@BGMaster1=2;
+ end;
+
+OnVictor2:
+ if (!$@BGMaster1) goto L_Skip;
+ stopnpctimer();
+ announce "Team 2 raises victorious at the Fallen Kings Duel!", bc_all;
+ killmonsterall "001-2";
+ //delcells "Wall_0012_left";
+ //delcells "Wall_0012_right";
+
+ mapwarp "001-2", "001-1", 117, 72;
+ bg_destroy($@FK_Team1);
+ bg_destroy($@FK_Team2);
+ $@BGMaster1=2;
+ end;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, GMRobe); // Dress
+ setunitdata(.@npcId, UDT_HEADMIDDLE, NPCEyes); // Not needed
+ setunitdata(.@npcId, UDT_HEADBOTTOM, LousyMoccasins); // Shoes
+ setunitdata(.@npcId, UDT_WEAPON, 3501);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 12);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 5);
+ npcsit;
+
+ .sex = G_FEMALE;
+ .distance = 7;
+ /*
+ // This script is TODO
+ if (!debug) {
+ disablenpc "Cassia";
+ }*/
+ end;
+
+OnDoEvent:
+ //setcells "001-2", 109, 37, 109, 213, 3, "Wall_0012_left";
+ //setcells "001-2", 141, 37, 141, 213, 3, "Wall_0012_right";
+ .BGC=0;
+ mapannounce("001-2", "May the fight begin!", bc_map);
+ $@FKing_T1 = bg_monster($@FK_Team1, "001-2", rand(105, 108), rand(37, 80), "Frostia King", FallenKing1, "Cassia::OnVictor2");
+ $@FKing_T2 = bg_monster($@FK_Team2, "001-2", rand(142, 145), rand(37, 80), "Halinarzo King", FallenKing2, "Cassia::OnVictor1");
+ bg_monster($@FK_Team1, "001-2", rand(105, 108), rand(37, 80), "Frostia Guard", FallenGuard1, "Cassia::OnSkip");
+ bg_monster($@FK_Team2, "001-2",rand(142, 145), rand(37, 80), "Halinarzo Guard", FallenGuard2, "Cassia::OnSkip");
+ initnpctimer();
+ end;
+
+L_Beta:
+ $@BGMaster1 = 1;
+
+ $@FK_Team1 = bgnew("001-2",rand(105, 108), rand(37, 80),"start#bat_a02::OnSide1Quit","");
+ $@FK_Team2 = bgnew("001-2",rand(142, 145), rand(37, 80),"start#bat_a02::OnSide2Quit","");
+
+ bgjoin($@FK_Team1, "001-2", rand(105, 108), rand(37, 80), getcharid(3));
+
+ setbgteam $@FK_Team1, 1;
+ setbgteam $@FK_Team2, 2;
+
+ //bg_warp $@FK_Team1,"001-2",rand(105, 108), rand(37, 80);
+ //bg_warp $@FK_Team2,"001-2",rand(142, 145), rand(37, 80);
+
+ donpcevent "Cassia::OnDoEvent";
+ //initnpctimer;
+ end;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+001-1,94,36,0 script Lt. Randy NPC_ELF,{
+ hello;
+ end;
+
+OnSet:
+ waitingroom("Battle Station R", $@BG1_SIZE, "start#bat_a02::OnReadyCheck", $@BG1_SIZE-1);
+ end;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, LightPlatemail); // Light armor
+ setunitdata(.@npcId, UDT_HEADMIDDLE, JeansShorts); // Pants
+ setunitdata(.@npcId, UDT_HEADBOTTOM, LousyMoccasins); // Shoes
+ setunitdata(.@npcId, UDT_WEAPON, BugSlayer);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 13);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 7);
+
+ //waitingroom("Battle Station", 2, "start#bat_a02::OnReadyCheck", 1);
+
+ disablenpc("Lt. Randy");
+ end;
+
+OnEnterBG:
+ $@FK_Team1 = waitingroom2bg("001-2",rand(105, 108), rand(37, 80),"start#bat_a02::OnSide1Quit","");
+ end;
+}
+
+001-1,98,36,0 script Lt. Gerry NPC_ELF,{
+ hello;
+ end;
+
+OnSet:
+ waitingroom("Battle Station G", $@BG1_SIZE, "start#bat_a02::OnReadyCheck", $@BG1_SIZE-1);
+ end;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, TerraniteArmor); // Terranite armor
+ setunitdata(.@npcId, UDT_HEADMIDDLE, JeansShorts); // Pants
+ setunitdata(.@npcId, UDT_HEADBOTTOM, LousyMoccasins); // Shoes
+ setunitdata(.@npcId, UDT_WEAPON, BugSlayer);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 13);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 7);
+
+ //waitingroom("Battle Station", 2, "start#bat_a02::OnReadyCheck", 1);
+
+ disablenpc("Lt. Gerry");
+ end;
+
+OnEnterBG:
+ $@FK_Team2 = waitingroom2bg("001-2",rand(142, 145), rand(37, 80),"start#bat_a02::OnSide2Quit","");
+ end;
+}
+
+//== Tierra Gorge Battleground Engine ======================
+001-2,0,0,3 script start#bat_a02 NPC_HIDDEN,{
+OnInit:
+ //mapwarp "bat_a02","bat_room",154,150;
+ end;
+
+OnEnable:
+ end;
+
+OnSide1Quit:
+OnSide2Quit:
+ bg_leave;
+ end;
+
+OnReadyCheck:
+ if( $@BGMaster1 )
+ end;
+ .@Guillaume = getwaitingroomstate(0,"Lt. Randy");
+ .@Croix = getwaitingroomstate(0,"Lt. Gerry");
+ if( !.@Guillaume && !.@Croix ) {
+ donpcevent "#bat_a02_timer::OnStop";
+ end;
+ }
+ else if( .@Guillaume < 1 || .@Croix < 1 )
+ end;
+ $@BGMaster1 = 1;
+ donpcevent "Lt. Randy::OnEnterBG";
+ donpcevent "Lt. Gerry::OnEnterBG";
+ setbgteam $@FK_Team1, 1;
+ setbgteam $@FK_Team2, 2;
+ bg_warp $@FK_Team1,"001-2",rand(105, 108), rand(37, 80);
+ bg_warp $@FK_Team2,"001-2",rand(142, 145), rand(37, 80);
+ donpcevent "Cassia::OnDoEvent";
+ //initnpctimer;
+ end;
+}
+
diff --git a/npc/001-1/eventmaster.txt b/npc/001-1/eventmaster.txt
new file mode 100644
index 0000000..add05c4
--- /dev/null
+++ b/npc/001-1/eventmaster.txt
@@ -0,0 +1,854 @@
+// TMW2 Script
+// Author:
+// Jesusalva, Saulc
+// Description:
+// This GM NPC controls spawns and item drops on Aeros
+// Monsters are sorted alphabetically, except bif
+
+001-1,250,20,0 script Mana Being#001-1 NPC_ALIGE_OUTSIDE_BARREL,{
+ function spawner { // (memo, ID, amount)
+ // First argument is a memorand for Script Writers, usually name. It must be present, but can have whatever value you want. (Unused)
+
+ // [0] East [1] West [2] Full
+ switch($@AEROS_SPWN) {
+ case 1:
+ areamonster("001-1", 20, 20, 140, 140, strmobinfo(1, getarg(1)), getarg(1), getarg(2), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ case 2:
+ areamonster("001-1", 20, 20, 340, 160, strmobinfo(1, getarg(1)), getarg(1), getarg(2), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ default:
+ areamonster("001-1", 171, 20, 340, 160, strmobinfo(1, getarg(1)), getarg(1), getarg(2), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ }
+ }
+
+ function mkitem { // ( ID{, Amount} )
+ // [0] East [1] West [2] Full makeitem
+ switch($@AEROS_SPWN) {
+ case 1:
+ for (.@i = 0; .@i < getarg(1,1); .@i++)
+ makeitem(getarg(0), 1, "001-1", rand(20,140), rand(20,140));
+ break;
+ case 2:
+ for (.@i = 0; .@i < getarg(1,1); .@i++)
+ makeitem(getarg(0), 1, "001-1", rand(20,340), rand(20,160));
+ break;
+ default:
+ for (.@i = 0; .@i < getarg(1,1); .@i++)
+ makeitem(getarg(0), 1, "001-1", rand(171,320), rand(158,340));
+ break;
+ }
+ }
+
+ function buryitem { // ( ID{, Amount} )
+ // [0] East [1] West [2] Full makeitem
+ switch($@AEROS_SPWN) {
+ case 1:
+ shovel_scatter("001-1", 20, 20, 140, 140, getarg(1,1), getarg(0));
+ break;
+ case 2:
+ shovel_scatter("001-1", 20, 20, 340, 160, getarg(1,1), getarg(0));
+ default:
+ shovel_scatter("001-1",171, 20, 340, 160, getarg(1,1), getarg(0));
+ }
+ }
+
+ .@curmobc=mobcount("001-1", "Mana Being#001-1::OnAerosMobDeath");
+ if (!is_gm()) goto L_Unauthorized;
+ if ($HARDCORE) goto L_Unauthorized;
+
+ @log_spawns=0;
+ @log_mode=$@AEROS_SPWN;
+ @log_ratio=$coinsrate;
+ logmes "Aeros Control Panel was open.", LOGMES_ATCOMMAND;
+
+ mesn;
+ mes "Tired of walking the whole Aeros to spawn monsters, I was brought to existence.";
+ mes "Monsters left: "+str(.@curmobc);
+
+L_Menu:
+ mes "";
+ mes "Please select operation.";
+ menu
+ "Close", L_Close,
+ "Start/End Event", L_EventHandler,
+ "Spawn", L_Spawn,
+ rif(countitem(StrangeCoin) >= 10, "Drop stuff! (10x Coins)"), L_Drop,
+ "Reconfigure spawn/warp points", L_Conf,
+ rif(.WALL, "Open Extension"), L_DelWall,
+ rif(!.WALL, "Close Extension"), L_AddWall,
+ rif(is_master(), "Adjust coins drop rate"), L_Rate;
+
+L_Unauthorized:
+ //dispbottom l("I am too far away to talk. Weird floating thingy...");
+ dispbottom l("Monsters left: @@", .@curmobc);
+ end;
+
+L_Close:
+ if (@log_spawns > 0) logmes "spawned "+str(@log_spawns)+" beigns at Aeros.", LOGMES_ATCOMMAND;
+ if (@log_ratio != $coinsrate) logmes "set aeros ratio from "+str(@log_ratio)+" to "+str($coinsrate), LOGMES_ATCOMMAND;
+ if (@log_mode == $@AEROS_SPWN) logmes "configured aeros spawn area to "+str($@AEROS_SPWN), LOGMES_ATCOMMAND;
+ logmes "Aeros Control Panel was closed normally.", LOGMES_ATCOMMAND;
+ close;
+
+L_Spawn:
+ mes "";
+ mes "Spawn from a preset (with intended levels) from this menu. Otherwise, use @aeros with same syntax.";
+ mes "(agr) means Agressive Monsters on the set, DO NOT ABUSE.";
+ next;
+ menu
+ "Abort", L_Menu,
+ "Presets", L_Preset,
+ "Normal (Lv <50)", L_Norm,
+ "Normal (Lv >50)", L_Norm2,
+ "Plants", L_Plants,
+ "Looters", L_Sli,
+ "Aggressive", L_Agr,
+ //"Assistants", L_Ass,
+ "GM Event Only", L_EventOnly,
+ "Boss", L_Boss;
+
+// NOTE: New Presets weren't added since ... long time ago.
+L_Preset:
+ select
+ "Abort", // 1
+ "20x Piou, Piousse, Ratto, 10x Croc", // 2
+ "20x Little Blub, 10x Plushroom Field", // 3
+ "(agr) 5x Tipiu, 10x Cave Maggot, 10x Bat", // 4
+ "20x Scorpion, 10x Duck, 10x Maggot", // 5
+ "10x Red Scorpion, 20x Fire Goblin, 5x Mana Ghost", // 6
+ "(agr) 1x Saxso Ghost, 20x House Maggot", // 7
+ "(agr) 5x Slime Blast, 5x Red Slime, 10x White Slime", // 8
+
+ "(agr) 5x Mouboo, 4x Bandit, 2x Black Scorpion", // 9
+ "10x Giant Maggot, 10x Cave Snake, 10x Mana Bug", // 10
+ "1x Golden/Night Scorpion, 2x Santa Slime, 5x Copper Slime", // 11
+ "(agr) 2x Fallen Guards", // 12
+
+ "(agr) 5x Old Snake, 4x Grass Snake, 3x Snake", // 13
+ "(agr) 4x Pollet, 3x Wolvern", // 14
+ "5x of each fairy", // 15
+ "(agr) 1x of each slime mother", // 16
+ "(agr) 1x of each skull slime", // 17
+
+ "20x Bat, 10x Crafty, 5x Troll", // 18
+ "(agr) 5x Forain, 5x Yeti, 5x Centaur", // 19
+ "(agr) 10x Gobo Bear, 10x Terra, 5x Terra Protector", // 20
+ "(agr) 1x Reaper, 1x Michel, 2x JackO, 5x Skellington", // 21
+ "1x of each Pixie", // 22
+ "(agr) 20x Pinkie, 10x Suseran, 7x Maximus", // 23
+
+ "7x3 random Chests and mimics", // 24
+ "10x Clover Path, 5 groups of 5 random Bifs", // 25
+ "5x Bifs, 4 groups of 5 random Bifs"; // 26
+
+ switch (@menu) {
+ case 1:
+ goto L_Spawn;
+ break;
+ //"20x Piou, Piousse, Ratto, 10x Croc", // 2
+ //"20x Little Blub, 10x Plushroom Field", // 3
+ //"(agr) 5x Tipiu, 10x Cave Maggot, 10x Bat", // 4
+ //"20x Scorpion, 10x Duck, 10x Maggot", // 5
+ //"10x Red Scorpion, 20x Fire Goblin, 5x Mana Ghost", // 6
+ //"(agr) 1x Saxso Ghost, 20x House Maggot", // 7
+ //"(agr) 5x Slime Blast, 5x Red Slime, 10x White Slime", // 8
+ case 2:
+ spawner(strmobinfo(1, Piou), Piou, 20);
+ spawner(strmobinfo(1, Piousse), Piousse, 20);
+ spawner(strmobinfo(1, Ratto), Ratto, 20);
+ spawner(strmobinfo(1, Croc), Croc, 10);
+ @log_spawns=@log_spawns+70;
+ break;
+ case 3:
+ spawner(strmobinfo(1, LittleBlub), LittleBlub, 20);
+ spawner(strmobinfo(1, PlushroomField), PlushroomField, 10);
+ @log_spawns=@log_spawns+30;
+ break;
+ case 4:
+ spawner(strmobinfo(1, Tipiu), Tipiu, 5);
+ spawner(strmobinfo(1, CaveMaggot), CaveMaggot, 10);
+ spawner(strmobinfo(1, Bat), Bat, 10);
+ @log_spawns=@log_spawns+25;
+ break;
+ case 5:
+ spawner(strmobinfo(1, Scorpion), Scorpion, 20);
+ spawner(strmobinfo(1, Duck), Duck, 10);
+ spawner(strmobinfo(1, Maggot), Maggot, 10);
+ @log_spawns=@log_spawns+40;
+ break;
+ case 6:
+ spawner(strmobinfo(1, RedScorpion), RedScorpion, 10);
+ spawner(strmobinfo(1, ManaBug), FireGoblin, 20);
+ spawner(strmobinfo(1, ManaGhost), ManaGhost, 5);
+ @log_spawns=@log_spawns+35;
+ break;
+ case 7:
+ spawner(strmobinfo(1, SaxsoGhost), SaxsoGhost, 1);
+ spawner(strmobinfo(1, HouseMaggot), HouseMaggot, 20);
+ @log_spawns=@log_spawns+21;
+ break;
+ case 8:
+ spawner(strmobinfo(1, SlimeBlast), SlimeBlast, 5);
+ spawner(strmobinfo(1, RedSlime), RedSlime, 5);
+ spawner(strmobinfo(1, WhiteSlime), WhiteSlime, 10);
+ @log_spawns=@log_spawns+20;
+ break;
+
+ //"(agr) 5x Mouboo, 4x Bandit, 2x Black Scorpion", // 9
+ //"10x Giant Maggot, 10x Cave Snake, 10x Mana Bug", // 10
+ //"1x Golden/Night Scorpion, 2x Santa Slime, 5x Copper Slime", // 11
+ //"(agr) 2x Fallen Guards", // 12
+ case 9:
+ spawner(strmobinfo(1, Mouboo), Mouboo, 5);
+ spawner(strmobinfo(1, Bandit), Bandit, 4);
+ spawner(strmobinfo(1, BlackScorpion), BlackScorpion, 2);
+ @log_spawns=@log_spawns+11;
+ break;
+ case 10:
+ spawner(strmobinfo(1, GiantMaggot), GiantMaggot, 10);
+ spawner(strmobinfo(1, CaveSnake), CaveSnake, 10);
+ spawner(strmobinfo(1, ManaBug), ManaBug, 10);
+ @log_spawns=@log_spawns+30;
+ break;
+ case 11:
+ spawner(strmobinfo(1, GoldenScorpion), GoldenScorpion, 1);
+ spawner(strmobinfo(1, NightScorpion), NightScorpion, 1);
+ spawner(strmobinfo(1, SantaSlime), SantaSlime, 5);
+ spawner(strmobinfo(1, CopperSlime), CopperSlime, 10);
+ @log_spawns=@log_spawns+17;
+ break;
+ case 12:
+ spawner(strmobinfo(1, FallenGuard1), FallenGuard1, 1);
+ spawner(strmobinfo(1, FallenGuard2), FallenGuard2, 1);
+ @log_spawns=@log_spawns+2;
+ break;
+
+ //"(agr) 5x Old Snake, 4x Grass Snake, 3x Snake", // 13
+ //"(agr) 4x Pollet, 3x Wolvern", // 14
+ //"5x of each fairy", // 15
+ //"(agr) 1x of each slime mother", // 16
+ //"(agr) 1x of each skull slime", // 17
+ case 13:
+ spawner("", OldSnake, 5);
+ spawner("", GrassSnake, 4);
+ spawner("", Snake, 3);
+ @log_spawns=@log_spawns+12;
+ break;
+ case 14:
+ spawner("", Pollet, 4);
+ spawner("", Wolvern, 3);
+ @log_spawns=@log_spawns+7;
+ break;
+ case 15:
+ spawner("", EarthFairy, 5);
+ spawner("", FireFairy, 5);
+ spawner("", WaterFairy, 5);
+ spawner("", WindFairy, 5);
+ spawner("", PoisonFairy, 5);
+ @log_spawns=@log_spawns+25;
+ break;
+ case 16:
+ spawner("", GreenSlimeMother, 1);
+ spawner("", BlueSlimeMother, 1);
+ spawner("", CopperSlimeMother, 1);
+ spawner("", YellowSlimeMother, 1);
+ spawner("", RedSlimeMother, 1);
+ spawner("", ChocolateSlimeMother, 1);
+ spawner("", WhiteSlimeMother, 1);
+ spawner("", AzulSlimeMother, 1);
+ spawner("", SeaSlimeMother, 1);
+ spawner("", LavaSlimeMother, 1);
+ spawner("", BlackSlimeMother, 1);
+ @log_spawns=@log_spawns+11;
+ break;
+ case 17:
+ spawner("", AzulSkullSlime, 1);
+ spawner("", YellowSkullSlime, 1);
+ spawner("", RedSkullSlime, 1);
+ spawner("", GreenSkullSlime, 1);
+ spawner("", CopperSkullSlime, 1);
+ spawner("", LavaSkullSlime, 1);
+ spawner("", BlackSkullSlime, 1);
+ @log_spawns=@log_spawns+7;
+ break;
+ //"20x Bat, 10x Crafty, 5x Troll", // 18
+ //"(agr) 5x Forain, 5x Yeti, 5x Centaur", // 19
+ //"(agr) 10x Gobo Bear, 10x Terra, 5x Terra Protector", // 20
+ //"(agr) 1x Reaper, 1x Michel, 2x JackO, 5x Skellington", // 21
+ //"1x of each Pixie", // 22
+ //"(agr) 20x Pinkie, 10x Suseran, 7x Maximus", // 23
+ case 18:
+ spawner("", Bat, 20);
+ spawner("", Crafty, 10);
+ spawner("", Troll, 5);
+ @log_spawns=@log_spawns+35;
+ break;
+ case 19:
+ spawner("", Forain, 5);
+ spawner("", Yeti, 5);
+ spawner("", Centaur, 5);
+ @log_spawns=@log_spawns+15;
+ break;
+ case 20:
+ spawner("", GoboBear, 10);
+ spawner("", Terranite, 10);
+ spawner("", TerraniteProtector, 5);
+ @log_spawns=@log_spawns+25;
+ break;
+ case 21:
+ spawner("", Reaper, 1);
+ spawner("", Michel, 1);
+ spawner("", JackO, 2);
+ spawner("", Skeleton, 5);
+ @log_spawns=@log_spawns+9;
+ break;
+ case 22:
+ spawner("", VanityPixie, 1);
+ spawner("", HolyPixie, 1);
+ spawner("", ShadowPixie, 1);
+ spawner("", NulityPixie, 1);
+ @log_spawns=@log_spawns+4;
+ break;
+ case 23:
+ spawner("", Pinkie, 20);
+ spawner("", PinkieSuseran, 10);
+ spawner("", PinkieMaximus, 7);
+ @log_spawns=@log_spawns+37;
+ break;
+
+
+ //"7x3 random Chests and mimics", // 24
+ //"10x Clover Path, 5 groups of 5 random Bifs", // 25
+ //"5x Bifs, 4 groups of 5 random Bifs"; // 26
+ case 24:
+ spawner("", rand(BronzeChest, GoldenChest), 3);
+ spawner("", rand(BronzeChest, MalignChest), 3);
+ spawner("", rand(BronzeMimic, GoldenMimic), 3);
+ spawner("", rand(WildxChest, MalignChest), 3);
+ spawner("", rand(BronzeChest, GoldenChest), 3);
+ spawner("", rand(BronzeChest, MalignChest), 3);
+ spawner("", rand(BronzeMimic, GoldenMimic), 3);
+ @log_spawns=@log_spawns+21;
+ break;
+ case 25:
+ spawner(strmobinfo(1, CloverPatch), CloverPatch, 10);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ @log_spawns=@log_spawns+35;
+ break;
+ case 26:
+ spawner(strmobinfo(1, Bif), Bif, 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ spawner(l("Mysterious Bif"), rand(1098,1118), 5);
+ @log_spawns=@log_spawns+25;
+ break;
+ }
+
+ if (@menu == 1) goto L_Spawn;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Preset;
+
+L_Norm:
+ // option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Lv50);
+ for (.@i=0;.@i < getarraysize(.ML_Lv50);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Lv50[.@i]);
+ // .ML_Lv50[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Norm;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("NORMAL 1 Monster"), .ML_Lv50[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Norm;
+
+L_Norm2:
+ // option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Lv99);
+ for (.@i=0;.@i < getarraysize(.ML_Lv99);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Lv99[.@i]);
+ // .ML_Lv99[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Norm2;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("NORMAL 2 Monster"), .ML_Lv99[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Norm2;
+
+L_Sli:
+ // option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Loot);
+ for (.@i=0;.@i < getarraysize(.ML_Loot);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Loot[.@i]);
+ // .ML_Loot[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Sli;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("LOOTER Monster"), .ML_Loot[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Sli;
+
+
+L_Plants:
+ // option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Plants);
+ for (.@i=0;.@i < getarraysize(.ML_Plants);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Plants[.@i]);
+ // .ML_Plants[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Plants;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("PLANT Monster"), .ML_Plants[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Plants;
+
+
+L_Agr:
+ // option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Aggr);
+ for (.@i=0;.@i < getarraysize(.ML_Aggr);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Aggr[.@i]);
+ // .ML_Aggr[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Agr;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("AGGRESSIVE Monster"), .ML_Aggr[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Agr;
+
+
+
+
+
+
+
+
+
+L_EventOnly:
+ mesc l("WARNING: Spawn these monsters with moderation!"), 1;
+ mesc l("This is just a short list to make GMs life easier!"), 1;
+ mes "";
+ menuint
+ "Abort", -1,
+ "Bhop Fluffy", BhopFluffy,
+ "Easter Mouboo", EasterMouboo,
+ "Evil Scythe", EvilScythe,
+ "Jack'O", JackO,
+ "Magic Ratto", MagicRatto,
+ "Moonshroom", Moonshroom,
+ "Mouboo Slime", MoubooSlime,
+ "Small Magic Bif", SmallMagicBif,
+ "Magic Bif", MagicBif,
+ "Bronze Chest", BronzeChest,
+ "Bronze Mimic", BronzeMimic,
+ "Silver Chest", SilverChest,
+ "Silver Mimic", SilverMimic,
+ "Golden Chest", GoldenChest,
+ "Golden Mimic", GoldenMimic,
+ "Evil Chest", EvilChest,
+ "Big Magic Bif", BigMagicBif;
+
+ .@mobId=@menuret;
+
+ if (.@mobId > 0)
+ input .@c, 0, 100;
+ if (.@c == 0 && .@mobId > 0)
+ .@mobId = 0;
+
+ if (.@mobId < 0)
+ goto L_Spawn;
+ else if (.@mobId > 0)
+ spawner("", .@mobId, .@c);
+
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_EventOnly;
+
+
+
+
+
+
+
+
+L_Boss:
+ // Boss option preparatives
+ .@opt$="Abort";
+ debugmes "Found %d entries", getarraysize(.ML_Boss);
+ for (.@i=0;.@i < getarraysize(.ML_Boss);.@i++) {
+ .@opt$+=":"+strmobinfo(1, .ML_Boss[.@i]);
+ // .ML_Boss[.@i]);
+ }
+ select .@opt$;
+
+ // Select handler
+ if (@menu != 1)
+ input .@c, 0, 100;
+ if (.@c == 0 && @menu != 1)
+ @menu=99;
+
+ if (@menu == 1)
+ goto L_Spawn;
+ if (@menu == 99)
+ goto L_Boss;
+
+ // Spawn if needed
+ .@i=@menu-2;
+ spawner(("BOSS Monster"), .ML_Boss[.@i], .@c);
+
+ // Log the spawn and resume
+ @log_spawns=@log_spawns+.@c;
+ mes "";
+ mes "Completed.";
+ mes "Total spawns: "+str(@log_spawns);
+ next;
+ goto L_Boss;
+
+
+L_Drop:
+ select
+ "Abort", // 1
+ "Bury 10x Coins", // 2
+ "Toothbrush", // 4
+ "Bronze Gift", // 5
+ "Silver Gift", // 6
+ "Golden Gift", // 7
+ "Prism Gift", // 8
+ "Supreme Gift"; // default
+
+ if (@menu != 1)
+ input .@c, 0, countitem(StrangeCoin)/10;
+ if (.@c == 0 && @menu != 1)
+ @menu=1;
+
+ delitem(StrangeCoin,.@c*10);
+ switch (@menu) {
+ case 1:
+ goto L_Menu;
+ break;
+ case 2:
+ buryitem(StrangeCoin, .@c*any(9,10,10,10,11,11)); break;
+ case 3:
+ mkitem(Toothbrush, .@c); break;
+ case 4:
+ mkitem(BronzeGift, .@c); break;
+ case 5:
+ mkitem(SilverGift, .@c); break;
+ case 6:
+ mkitem(GoldenGift, .@c); break;
+ case 7:
+ mkitem(PrismGift, .@c); break;
+ default:
+ mkitem(SupremeGift, .@c); break;
+
+ }
+
+ mes "";
+ mes "Dropped "+.@c+" stuff.";
+ next;
+ goto L_Drop;
+
+L_Rate:
+ // Only Admins can change Strange Coin drop rate
+ if (!is_master())
+ goto L_Menu;
+
+ mes "";
+ mes "Current drop rate: " + str($coinsrate);
+ mes "Insert drop rate (from 0 to 10000, capped at 3000 or 30%). Use -1 to disable.";
+ .@old = $coinsrate;
+ input $coinsrate;
+ if ($coinsrate > 3000)
+ $coinsrate=3000;
+ if ($coinsrate != .@old)
+ consolewarn("Aeros Coins drop rate changed - highlight %s - by %s (%d) from %d to %d", "<@&411247967064948737>", strcharinfo(0), getcharid(3), .@old, $coinsrate);
+ mes "";
+ mes "Ratio adjusted.";
+ next;
+ goto L_Menu;
+
+L_EventHandler:
+ if($@GM_EVENT) {
+ announce ("The event is over!"), bc_all|bc_npc; // I haven't tested this yet.
+ $@GM_EVENT=0;
+ $@MK_SCENE=MK_NONE;
+ } else if (!$@MK_SCENE) {
+ announce ("The mana bridge to Aeros is open! To participate on event, talk to ##BSoul Menhir##b!"), bc_all|bc_npc;
+ channelmes("#world", "An event is happening on Aeros! Hurry up!");
+ $@GM_EVENT=1;
+ $@MK_SCENE=MK_LOCKED;
+ } else {
+ mesc("Operation not permitted: Monster King event is in progress.", 1);
+ mesc("You MUST wait.", 1);
+ }
+ close;
+
+L_AddWall:
+ setcells "001-1", 169, 63, 169, 76, 3, "AerosWall";
+ //setwall("001-1", 169, 63, 13, DOWN, false, "AerosWall");
+ .WALL=1;
+ close;
+
+L_DelWall:
+ delcells "AerosWall";
+ //delwall("AerosWall");
+ .WALL=0;
+ close;
+
+L_Conf:
+ mes "";
+ mesn;
+ mesq l("Current Spawn Mode: "+$@AEROS_SPWN);
+ next;
+ select
+ l("[0] East Aeros"),
+ l("[1] West Aeros"),
+ l("[2] Full Aeros");
+ $@AEROS_SPWN=@menu-1;
+ goto L_Menu;
+
+OnAutoSched:
+ .@t=0;
+ // Scatter 10× Strange Coins for digging
+ // Also scatter some strange coins for looting
+ buryitem(StrangeCoin, any(9,10,10,10,11,11));
+ mkitem(StrangeCoin, $@AEROS_AUTOSPAWN);
+ // Spawn monsters
+ freeloop(true);
+ for (.@i = 0; .@i < ($@AEROS_AUTOSPAWN * 5); .@i++) {
+ .@r=rand2(5, 12);
+ // FIXME: Use TOP3AVERAGELVL() instead of a full list
+ .@m=any(Piou, Piousse, Ratto, LittleBlub, Croc, PlushroomField,
+ Tipiu, CaveMaggot, Bat, Scorpion, Duck, Maggot, RedScorpion,
+ ManaBug, ManaGhost, HouseMaggot, RedSlime, WhiteSlime,
+ SlimeBlast, Mouboo, Bandit, BlackScorpion, GiantMaggot,
+ CaveSnake, ManaBug, GoldenScorpion, NightScorpion, SantaSlime,
+ CopperSlime, FallenGuard1, FallenGuard2, OldSnake, GrassSnake,
+ Snake, Pollet, Wolvern, EarthFairy, FireFairy, WaterFairy,
+ WindFairy, PoisonFairy, GreenSlimeMother, ChocolateSlimeMother,
+ CopperSlimeMother, SeaSlimeMother, AzulSkullSlime,
+ CopperSkullSlime, Crafty, Troll, Forain, Yeti, Centaur, GoboBear,
+ Terranite, TerraniteProtector, Reaper, Michel, JackO, Skeleton,
+ Pinkie, PinkieSuseran, CloverPatch, MagicRatto, Moonshroom,
+ MoubooSlime);
+ spawner(strmobinfo(1, .@m), .@m, .@r);
+ .@t += .@r;
+ // Bonus
+ .@r=rand2(1, 3);
+ .@m=any(SaxsoGhost, HolyPixie, BronzeChest, SilverChest, GoldenChest,
+ MalignChest, PrismChest, SupremeChest, WildxChest, ManaChest,
+ ThornChest, ViciousChest, EvilChest, BronzeMimic, SilverMimic,
+ GoldenMimic, Bif, EleniumBif, BigEleniumBif, RubyBif, BigRubyBif,
+ TopazBif, BigTopazBif, EmeraldBif, BigEmeraldBif,
+ DiamondBif, BigDiamondBif, AmethystBif, BigAmethystBif,
+ SapphireBif, BigSapphireBif, SmallMagicBif, MagicBif, BigMagicBif,
+ SmallMagicBif, SmallMagicBif, SmallMagicBif, SmallMagicBif,
+ CloverPatch, EvilScythe);
+ spawner(strmobinfo(1, .@m), .@m, .@r);
+ .@t += .@r;
+ }
+ freeloop(false);
+ // Open gate if full
+ if ($@AEROS_SPWN == 2 && .WALL) {
+ delcells "AerosWall";
+ .WALL=0;
+ }
+ // Close gate otherwise
+ if ($@AEROS_SPWN != 2 && !.WALL) {
+ setcells "001-1", 169, 63, 169, 76, 3, "AerosWall";
+ .WALL=1;
+ }
+ // We're done
+ $@AEROS_AUTOSPAWN = 0;
+ consoleinfo("script automatically spawned "+str(.@t)+" beigns at Aeros.");
+ end;
+
+OnAerosMobDeath:
+ // is killedrid even set?
+ if ($coinsrate < 0) end;
+ // A level 100 monster can have a 4% drop bonus against a level 0 monster.
+ // $coinsrate acts stablishing a basic drop value. Advised value: 600 (up to 10% for normal mobs)
+ if (playerattached()) {
+ debugmes("Mob slain: %d", killedrid);
+ if (rand(10000) <= $coinsrate + (getmonsterinfo(killedrid, MOB_LV)*4)) {
+ getmapxy(.@m$, .@x, .@y, 0);
+ makeitem(StrangeCoin, 1, .@m$, .@x, .@y);
+ }
+ fix_mobkill(killedrid);
+ }
+ end;
+
+OnInit:
+ if ($coinsrate == 0)
+ $coinsrate=400; // Default value is 4% + mob str bonus
+
+ // Monster lists
+ // These arrays are filled automatically by redesign.py
+ // DO NOT EDIT MANUALLY
+ setarray .ML_Plants, 1021, 1058, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1134, 1135, 1136, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1156, 1157, 1158, 1170, 1188, 1189, 1226, 1227, 1228;
+ setarray .ML_Boss, 1015, 1036, 1040, 1044, 1076, 1077, 1079, 1080, 1087, 1129, 1154, 1179, 1200, 1205, 1209, 1211, 1213, 1221, 1222, 1225, 1229, 1400, 1401, 1420, 1430, 1431, 1432, 1439, 1495, 1496, 1497, 1498, 1499, 1500, 1503, 1504, 1505;
+ setarray .ML_Aggr, 1012, 1024, 1026, 1027, 1037, 1042, 1045, 1051, 1052, 1056, 1061, 1062, 1063, 1064, 1074, 1081, 1082, 1084, 1085, 1089, 1090, 1092, 1097, 1119, 1120, 1122, 1123, 1124, 1125, 1130, 1131, 1137, 1138, 1153, 1167, 1168, 1169, 1174, 1176, 1177, 1178, 1187, 1192, 1193, 1194, 1195, 1196, 1198, 1199, 1203, 1206, 1207, 1208, 1212, 1214, 1220, 1223, 1224, 1230, 1231, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1433, 1492, 1501, 1502;
+ setarray .ML_Asst, 1003, 1007, 1016, 1023, 1038, 1056, 1065, 1066, 1072, 1083, 1085, 1086, 1089, 1090, 1094, 1155, 1175, 1178, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1190, 1191, 1192, 1195, 1201, 1202, 1230, 1232, 1434, 1435;
+ setarray .ML_Loot, 1005, 1007, 1008, 1009, 1018, 1029, 1032, 1033, 1039, 1053, 1054, 1055, 1085, 1086, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1124, 1125, 1126, 1138, 1167, 1175, 1178, 1180, 1181, 1187, 1190, 1191, 1192, 1193, 1194, 1195, 1198, 1212, 1230, 1233, 1234, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1402, 1403, 1404, 1405, 1406, 1407, 1408;
+ setarray .ML_Lv50, 1002, 1006, 1010, 1011, 1017, 1022, 1025, 1028, 1030, 1031, 1034, 1035, 1041, 1043, 1049, 1050, 1060, 1067, 1068, 1070, 1071, 1073, 1075, 1121, 1127, 1128, 1132, 1133, 1152, 1172, 1173, 1204, 1210, 1219, 1436, 1437, 1438;
+ setarray .ML_Lv99, 1004, 1069, 1078, 1139, 1151, 1171, 1197, 1215, 1216, 1217, 1218, 1493, 1494;
+ end;
+}
+
+
+
+- script @aeros 32767,{
+ end;
+
+OnCall:
+ if (!is_gm())
+ end;
+ if (getmapname() != "001-1") {
+ dispbottom "This command can only be used at aeros.";
+ end;
+ }
+ if ($HARDCORE) {
+ dispbottom "Aeros cannot be used on Hardcore servers.";
+ end;
+ }
+ //.@atcmd_parameters$ = strtoupper(strip( // nah
+
+ if (.@atcmd_numparameters != 2) {
+ dispbottom "Use the numeric ID provided by the wiki. This is a safeguard to ensure you are not overkilling players.";
+ dispbottom "Talk to Mana Being for a less fine-grained but much more optimized control over monsters.";
+ dispbottom "This command takes exactly this syntax: Mob ID <space> amount.";
+ end;
+ }
+
+ switch($@AEROS_SPWN) {
+ case 1:
+ areamonster("001-1", 20, 20, 140, 140, strmobinfo(1, atoi(.@atcmd_parameters$[0])), atoi(.@atcmd_parameters$[0]), atoi(.@atcmd_parameters$[1]), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ case 2:
+ areamonster("001-1", 20, 20, 340, 160, strmobinfo(1, atoi(.@atcmd_parameters$[0])), atoi(.@atcmd_parameters$[0]), atoi(.@atcmd_parameters$[1]), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ default:
+ areamonster("001-1", 171, 20, 340, 160, strmobinfo(1, atoi(.@atcmd_parameters$[0])), atoi(.@atcmd_parameters$[0]), atoi(.@atcmd_parameters$[1]), "Mana Being#001-1::OnAerosMobDeath");
+ break;
+ }
+ logmes "@aeros "+strmobinfo(1, atoi(.@atcmd_parameters$[0])) + " " + .@atcmd_parameters$[1], LOGMES_ATCOMMAND;
+ dispbottom "All monsters summoned.";
+
+ end;
+
+OnInit:
+ bindatcmd "aeros", "@aeros::OnCall", 80, 99, 0;
+ end;
+}
diff --git a/npc/001-1/mahul.txt b/npc/001-1/mahul.txt
new file mode 100644
index 0000000..fa4cd28
--- /dev/null
+++ b/npc/001-1/mahul.txt
@@ -0,0 +1,57 @@
+// TMW-2 Script
+// Author:
+// Saulc
+// Jesusalva
+// Description:
+// Mahul is the Aeros Well Master
+
+001-1,299,45,0 script Mahul NPC_PLAYER,{
+ mesn;
+ mesq l("Uhul! My name is Mahul!");
+ mes l("I can fill your bottle with water for only @@ gp the bottle.", .COST_PER_BOTTLE);
+ mes l("After all, I am the Well Master!");
+ input .@count;
+
+ if (.@count == 0)
+ close;
+ .@Cost = .@count * .COST_PER_BOTTLE;
+ .@empty = countitem(EmptyBottle);
+
+ if (.@empty < .@count)
+ goto L_NotEnoughBottles;
+ if (Zeny < .@Cost)
+ goto L_NotEnoughMoney;
+ inventoryplace BottleOfDivineWater, .@count;
+
+ Zeny=Zeny-.@Cost;
+ delitem EmptyBottle, .@count;
+ getitem BottleOfDivineWater, .@count;
+ close;
+
+L_NotEnoughBottles:
+ mes "";
+ mesn;
+ mes l("You don't have that many empty bottles!");
+ close;
+
+L_NotEnoughMoney:
+ mes "";
+ mesn;
+ mes l("You don't have enough gold! You need @@ gp.", .@Cost);
+ close;
+
+OnInit:
+ .COST_PER_BOTTLE = 100;
+ .sex = G_MALE;
+ .distance = 7;
+
+ .@npcId = getnpcid(.name$);
+ // Check items.xml for info about this
+ setunitdata(.@npcId, UDT_HEADTOP, InfantryHelmet);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, SailorShirt);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, RaidTrousers);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 7);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 17);
+
+ end;
+}
diff --git a/npc/001-1/mapflags.txt b/npc/001-1/mapflags.txt
new file mode 100644
index 0000000..4dd9b7a
--- /dev/null
+++ b/npc/001-1/mapflags.txt
@@ -0,0 +1,9 @@
+001-1 mapflag zone Aeros
+001-2 mapflag zone Event
+001-3 mapflag zone Event
+001-3-1 mapflag zone Event
+
+001-4 mapflag zone Aeros
+001-5 mapflag zone Aeros
+001-11 mapflag zone Aeros
+001-12 mapflag zone Aeros
diff --git a/npc/001-1/portal.txt b/npc/001-1/portal.txt
new file mode 100644
index 0000000..3dbcc32
--- /dev/null
+++ b/npc/001-1/portal.txt
@@ -0,0 +1,136 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Manages warps at Aeros
+
+001-1,235,25,0 script Worlds Gate NPC_HIDDEN,1,0,{
+
+OnTouch:
+ mesn;
+ mes l("This Portal can send your soul back to the world, along any items, money and/or experience gained.");
+ mes l("Would you like to leave this place?");
+ menu
+ l("No."), L_Close,
+ rif(is_master() && !$@GM_EVENT, l("Enable Event")), L_Enable,
+ rif(is_master() && $@GM_EVENT, l("Disable Event")), L_Disable,
+ l("Yes."), L_Leave;
+
+L_Leave:
+ warp getsavepoint(0), getsavepoint(1), getsavepoint(2);
+ goto L_Close;
+
+L_Enable:
+ mesc l("WARNING: Deprecated!"), 1;
+ mesc l("Please don't use this function in future!");
+ $@GM_EVENT=1;
+ close;
+
+L_Disable:
+ $@GM_EVENT=0;
+ $@MK_SCENE=MK_NONE;
+ close;
+
+// Uses l() to translate utilities
+L_TranslationFix:
+ // Mobs
+ mes l("Magic Maggot");
+ mes l("Monster");
+ mes l("Monster King");
+ mes l("Monster General");
+ mes l("Monster Admiral");
+ mes l("Monster Major");
+ mes l("Monster Captain");
+ mes l("Monster Lieutenant");
+ mes l("Monster Sergeant");
+ mes l("Monster Soldier");
+ mes l("Random Bif");
+ mes l("Summoned Monster");
+ mes l("Scout");
+ mes l("Desert Pirate");
+ mes l("Marsh Pirate");
+ mes l("Buccaneer");
+ mes l("Corsair");
+ mes l("Pirate Lord");
+ mes l("Duck Soldier");
+ mes l("Duck Initiate");
+ // Configs
+ mes l("Human");
+ mes l("Ukar");
+ mes l("Redy");
+ mes l("Elf");
+ mes l("Orc");
+ mes l("Raijin");
+ mes l("Tritan");
+ // Messages
+ mes l("All monsters summoned!");
+ mes l("Mercy has been granted.");
+ mes l("Judgement has passed.");
+ mes l("Warping to save point.");
+ mes l("Your save point has been changed.");
+ mes l("Warped.");
+ mes l("Item created.");
+ mes l("Welcome to TMW-2: Moubootaur Legends! We hope you have a great time in our server!");
+ mes l("You have been jailed by a GM.");
+ mes l("A GM has discharged you from jail.");
+ mes l("This item cannot be dropped.");
+ mes l("This item cannot be sold.");
+ mes l("This item cannot be auctioned.");
+ mes l("This item cannot be traded.");
+ mes l("This item cannot be stored.");
+ // Announcements
+ mes l("I can't handle it anymore! NO MORE!");
+ mes l("Come, my minions! Lay siege to towns! LEAVE NO OPPOSITION TO ME!");
+ mes l("Burn, destroy, do whatever you need, until your last breath, my lieutenants and colonels!");
+ mes l("The event is over!");
+ mes l("The mana bridge to Aeros is open! To participate on event, talk to ##BSoul Menhir##b!");
+ mes l("WARNING: Server will go down for scheduled maintenance in 15 minutes!");
+ mes l("WARNING: Server will go down for scheduled maintenance in 10 minutes!");
+ mes l("WARNING: Server will go down for scheduled maintenance in 5 minutes!");
+ mes l("WARNING! WARNING! Monster Army is moving towards Hurnscald!!");
+ mes l("WARNING! WARNING! Monster Army is moving towards Halinarzo!!");
+ mes l("WARNING! WARNING! Monster Army is moving towards Nivalis!!");
+ mes l("WARNING! WARNING! Monster Army is moving towards Tulimshar!!");
+ mes l("People failed to rescue Cindy!");
+ mes l("Players failed to defend the city!!");
+ mes l("The city was defended with success! GG, everyone!");
+ mes l("EVENT CANCELLED DUE TO PLAYER INACTIVITY");
+ mes l("%s has EXILED %s from %s.", "", "", "");
+ mes l("Aurora Events");
+ mes l("Map cleared!");
+ mes l("Moubootaur (Sealed)");
+ mes l("Level Boss");
+ // Legendary Messages
+ mesc l("WARNING: The %s is a %s. Besides being insanely powerful, no duplicate of them exist in the world. They can be tweaked freely and can hold multiple cards as well, and scale according to your level. Use its powers wisely. However, beware: This weapon cannot be traded except with \"@grantpower\" command, and if you abandon the world, the weapon will abandon you as well!", getitemlink(Acorn), b(l("legendary weapon"))), 1;
+ mesc l("%s, you did your best to avenge a fallen comrade. It is my wish that you continue protecting this world. Therefore, I bestow upon you, the legendary %s. Please use its powers to protect your friend and the world peace!", "", getitemlink(Acorn)), 2;
+ mesc l("%s, you did your best to protect this world inhabitants. It is my wish that you continue protecting this world. Therefore, I bestow upon you, the legendary %s. Please use its powers to protect your friend and the world peace!", "", getitemlink(Acorn)), 2;
+ mesc l("%s, you did your best to entertain me. It is my wish that you continue protecting this world. Therefore, I bestow upon you, the legendary %s. Please use its powers to protect your friend and the world peace!", "", getitemlink(Acorn)), 2;
+ mesc l("%s, you proved your worth today. It is my wish that you continue protecting this world. Therefore, I bestow upon you, the legendary %s. Please use its powers to protect your friend and the world peace!", "", getitemlink(Acorn)), 2;
+ mesc l("%s, your dedication is touching. It is my wish that you continue protecting this world. Therefore, I bestow upon you, the legendary %s. Please use its powers to protect your friend and the world peace!", "", getitemlink(Acorn)), 2;
+
+ // Internal
+ mesc b(l(" 0 This file is automatically generated. Editing it will have no effect.")), 1; // ;- TRANSLATORS: Do not translate
+ mesc b(l(" 1 Please translate at https://transifex.com/arctic-games/moubootaur-legends/ instead.")), 1; // ;- TRANSLATORS: Do not translate
+ mes l("sample");
+ close;
+
+L_Close:
+ closedialog;
+ close;
+}
+
+// This is a copy for west Aeros
+001-1,23,107,0 script World Gate 2 NPC_HIDDEN,1,0,{
+OnTouch:
+ mesn;
+ mes l("This Portal can send your soul back to the world, along any items, money and/or experience gained.");
+ mes l("Would you like to leave this place?");
+ select
+ l("No."),
+ l("Yes.");
+
+ if (@menu == 2)
+ warp getsavepoint(0), getsavepoint(1), getsavepoint(2);
+ closedialog;
+ close;
+}
diff --git a/npc/001-1/rewards.txt b/npc/001-1/rewards.txt
new file mode 100644
index 0000000..8b96724
--- /dev/null
+++ b/npc/001-1/rewards.txt
@@ -0,0 +1,129 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Trades Strange Coins for useful items
+
+001-1,243,26,0 script Aeros Trader NPC_M_COINKEEPER,{
+ mesn;
+ mesq l("Oh, hello there! Welcome to the Mana Plane Of Existence!");
+ next;
+ mesn;
+ mesq l("In this wonderful realm, you can find and earn many @@, our currency!", getitemlink(StrangeCoin));
+ next;
+ mesn;
+ mesq l("You can then trade these coins for items with me!");
+ next;
+ openshop;
+ closedialog;
+ close;
+
+OnInit:
+ .@npcId = getnpcid(.name$);
+ setunitdata(.@npcId, UDT_HEADTOP, TopHat);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, GoldenWarlordPlate);
+ setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
+ setunitdata(.@npcId, UDT_HEADBOTTOM, AssassinBoots);
+ setunitdata(.@npcId, UDT_HAIRSTYLE, 25);
+ setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
+
+ .sex = G_MALE;
+ .distance = 5;
+
+ tradertype(NST_CUSTOM);
+
+ // Rare Equipment selection.
+ // *these* are really rare!
+ // Maximum 30,000
+ sellitem MysteriousFruit,10000; // This is OP
+ sellitem DoggyDog,9000;
+ sellitem CattyCat,9000;
+ sellitem DarkPulsar,6000;
+ sellitem ThunderStaff,5000;
+ sellitem PiouEgg,3915;
+ sellitem DeliciousCookie,3240;
+ sellitem SmileyCap, 1820;
+ sellitem EyePatch, 1620;
+ sellitem Doll, 1420;
+ sellitem TopHat, 1220;
+ sellitem HeartGlasses,960;
+ sellitem BowlerHat, 720;
+ sellitem AshUrn,630;
+ sellitem BrimmedFeatherHat, 540;
+ sellitem Googles,540;
+ sellitem LeatherBall, 480;
+ sellitem ClericCap, 440;
+ sellitem Barrel,400;
+
+ // Temporary, Seasonal, for events, rare drops, next release
+ sellitem MercBoxEE,1200;
+ sellitem MercBoxDD,950;
+ sellitem MercBoxE,900;
+ sellitem MercBoxD,600;
+ sellitem ArcmageBoxset,500;
+ sellitem BoneAmmoBox,180;
+ sellitem ThornAmmoBox,80;
+
+ // Dye Shop
+ // RARE 3
+ sellitem PurpleDye, 300;
+ sellitem DarkRedDye, 270;
+ sellitem BlackDye, 250;
+ // RARE 2
+ sellitem SilverDye, 200;
+ sellitem NavyBlueDye, 200;
+ sellitem BlueGrayDye, 200;
+ sellitem FuschiaDye, 200;
+ sellitem BrownDye, 200;
+ sellitem MauveDye, 200;
+ // Rare 1
+ sellitem RedDye, 100;
+ sellitem CamelDye, 100;
+ sellitem CrimsonDye, 100;
+ sellitem KhakiDye, 100;
+ sellitem MintDye, 100;
+ // Normal
+ sellitem TealDye, 45;
+ sellitem PinkDye, 45;
+ sellitem GreenDye, 45; // Quest
+ sellitem LimeDye, 30; // Shop, 1200 GP
+ // Low rarity
+ sellitem BlueDye, 22;
+ sellitem YellowDye, 22;
+ sellitem ChocolateDye, 22;
+ sellitem OrangeDye, 22; // Shop, 495 GP
+
+ // Consumables
+ sellitem MagicApple,115;
+ sellitem SacredLifePotion,60;
+ sellitem SacredManaPotion,60;
+ sellitem ElixirOfLife,32;
+ sellitem ScrollMagnusHealA,28;
+ sellitem WhiskeyAle,28;
+ sellitem YerbaMate,22;
+ sellitem CelestiaTea,17;
+ sellitem BottleOfDivineWater, 15;
+ sellitem PrecisionPotion,9;
+ sellitem DodgePotion,9;
+ sellitem Wurtzite,8;
+ sellitem Curshroom,6;
+ sellitem PetcaringGuide,5; // I needed to add this somewhere
+ sellitem ScrollSCave,3;
+ sellitem SmokeGrenade,3;
+ end;
+
+/* set currency to be item 828 */
+OnCountFunds:
+ setcurrency(countitem(StrangeCoin));
+ end;
+
+/* @price is total cost. @points is if we accept two items as currency. */
+OnPayFunds:
+ //dispbottom "Hi: price="+@price+" and points="+@points;
+ if( countitem(StrangeCoin) < @price )
+ end;
+ delitem StrangeCoin,@price;
+ purchaseok();
+ end;
+
+}
diff --git a/npc/001-1/wateranimation.txt b/npc/001-1/wateranimation.txt
new file mode 100644
index 0000000..7c14358
--- /dev/null
+++ b/npc/001-1/wateranimation.txt
@@ -0,0 +1,29 @@
+// TMW2 scripts.
+// Author:
+// Saulc
+// Jesusalva
+// Description:
+// Water animations, splash, fishes, etc...
+
+001-1,254,70,0 script #water_animation_aeros0 NPC_WATER_SPLASH,{
+
+ fishing(3, CommonCarp, Roach, Tench,
+ GrassCarp); // begin or continue fishing
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 4;
+ end;
+}
+
+001-1,250,72,0 duplicate(#water_animation_aeros0) #water_animation_aeros1 NPC_WATER_SPLASH
+001-1,254,76,0 duplicate(#water_animation_aeros0) #water_animation_aeros2 NPC_WATER_SPLASH
+001-1,247,77,0 duplicate(#water_animation_aeros0) #water_animation_aeros3 NPC_WATER_SPLASH
+
+001-1,105,112,0 duplicate(#water_animation_aeros0) #water_animation_aeros4 NPC_WATER_SPLASH
+001-1,99,112,0 duplicate(#water_animation_aeros0) #water_animation_aeros5 NPC_WATER_SPLASH
+001-1,94,110,0 duplicate(#water_animation_aeros0) #water_animation_aeros6 NPC_WATER_SPLASH
+001-1,90,112,0 duplicate(#water_animation_aeros0) #water_animation_aeros7 NPC_WATER_SPLASH
+
+