// 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; @log_spawns=0; @log_mode=$@AEROS_SPWN; @log_ratio=$coinsrate; 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 "Abort", 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_admin(), "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; 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, Piousee, 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 "10x Clover Path, 5 groups of 5 random Bifs", // 13 "5x Bifs, 4 groups of 5 random Bifs"; // 14 switch (@menu) { case 1: goto L_Spawn; break; case 2: spawner(strmobinfo(1, Piou), Piou, 20); spawner(strmobinfo(1, Piousee), Piousee, 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; 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; //"10x Clover Path, 5 groups of 5 random Bifs", // 13 //"5x Bifs, 4 groups of 5 random Bifs"; // 14 case 13: 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 14: 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 ""; select "Abort", // 1 "Bhop Fluffy", // 2 "Easter Mouboo", // 3 "Evil Scythe", // 4 "Jack'O", // 5 "Magic Ratto", // 6 "Moonshroom", // 7 "Mouboo Slime", // 8 "Small Magic Bif", // 9 "Magic Bif", // 10 "Bronze Chest", // 11 "Bronze Mimic", // 12 "Silver Chest", // 13 "Silver Mimic", // 14 "Evil Chest", // 15 "Big Magic Bif"; // default if (@menu != 1) input .@c, 0, 100; if (.@c == 0 && @menu != 1) @menu=99; switch (@menu) { case 1: goto L_Spawn; break; case 2: spawner(("BhopFluffy"), BhopFluffy, .@c); break; case 3: spawner(("EasterMouboo"), EasterMouboo, .@c); break; case 4: spawner(("EvilScythe"), EvilScythe, .@c); break; case 5: spawner(("Jack'O"), JackO, .@c); // WUT case 6: spawner(("MagicRatto"), MagicRatto, .@c); break; case 7: spawner(("Moonshroom"), Moonshroom, .@c); // WUT case 8: spawner(("MoubooSlime"), MoubooSlime, .@c); break; case 9: spawner(("SmallMagicBif"), SmallMagicBif, .@c); break; case 10: spawner(("MagicBif"), MagicBif, .@c); break; case 11: spawner(("BronzeChest"), BronzeChest, .@c); break; case 12: spawner(("BronzeMimic"), BronzeMimic, .@c); break; case 13: spawner(("SilverChest"), SilverChest, .@c); break; case 14: spawner(("SilverMimic"), SilverMimic, .@c); break; case 15: spawner(("EvilChest"), EvilChest, .@c); break; default: spawner(("BigMagicBif"), BigMagicBif, .@c); break; } @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_admin()) goto L_Menu; mes ""; mes "Current drop rate: " + str($coinsrate); mes "Insert drop rate (from 0 to 10000, capped at 5000 or 50%). Use -1 to disable."; input $coinsrate; if ($coinsrate > 5000) $coinsrate=5000; 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; } 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; OnAerosMobDeath: 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()) { if (rand(10000) <= $coinsrate + (atoi(strmobinfo(3,killedrid))*4)) { getmapxy(.@m$, .@x, .@y, 0); makeitem(StrangeCoin, 1, .@m$, .@x, .@y); } } 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, 1495, 1496, 1497, 1498, 1499; setarray .ML_Aggr, 1012, 1024, 1026, 1027, 1037, 1042, 1051, 1052, 1056, 1061, 1062, 1063, 1064, 1074, 1081, 1082, 1084, 1085, 1089, 1090, 1092, 1097, 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, 1500; setarray .ML_Asst, 1003, 1007, 1016, 1023, 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; 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; 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, 1119, 1121, 1127, 1128, 1132, 1133, 1152, 1172, 1173, 1204, 1210, 1219; 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; } //.@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 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; }