diff options
Diffstat (limited to 'npc/annuals/xmas')
-rw-r--r-- | npc/annuals/xmas/2021.txt | 565 |
1 files changed, 565 insertions, 0 deletions
diff --git a/npc/annuals/xmas/2021.txt b/npc/annuals/xmas/2021.txt new file mode 100644 index 00000000..27451e99 --- /dev/null +++ b/npc/annuals/xmas/2021.txt @@ -0,0 +1,565 @@ +// TMW Script. +// Author: +// Jesusalva +// Notes: +// Christmas 2021 - Configuration Files + +function script X21ID { + return (getcharid(1) > 0 ? getcharid(1) : getcharid(3)); +} + +function script X21ID2 { + return (getcharid(1) > 0 ? getcharid(1) : getcharid(0)); +} + +function script X21TYPE { + return (getcharid(1) > 0 ? IOT_PARTY : IOT_CHAR); +} + +function script X21BC1_CLEAR { + return (XMAS2021 & X21_BOSSDEFEAT); +} + +function script X21BC1_DOCLEAR { + XMAS2021 = (XMAS2021 | X21_BOSSDEFEAT); + return; +} +function script X21ED1_CLEAR { + return (XMAS2021 & X21_ALYSSARESCUE); +} + +function script X21ED1_DOCLEAR { + XMAS2021 = (XMAS2021 | X21_ALYSSARESCUE); + return; +} + +function script X21SRLZ { + .@n=getarg(0); + switch (.@n) { + case 1: return l("first"); + case 2: return l("second"); + case 3: return l("third"); + case 4: return l("fourth"); + case 5: return l("fifth"); + //case 6: return l("sixth"); + //case 7: return l("seventh"); + } + return str(.@n); +} + +function script X21QUESTON { + // Create and setup the challenge. Allow to reset quest. + XMAS2021 = X21_ACCEPTED; + /* Prepare something */ + return; +} + +function script X21INIT { + .@inst = instance_create("Northern Lights", X21ID(), X21TYPE()); + // Instance must be created + if (.@inst >= 0) { + // We... Could use base name, actually, but whatever + .@mapa$ = "0812@"+X21ID2(); // Northern Lights + .@mapb$ = "0813@"+X21ID2(); // Existential Frontier + .@mapc$ = "0803@"+X21ID2(); // Forgotten/Mystic/Peaceful Glade + .@mapd$ = "0801@"+X21ID2(); // Peaceful Glade (Present) + + instance_attachmap("081-2", .@inst, false, .@mapa$); + instance_attachmap("081-3", .@inst, false, .@mapb$); + instance_attachmap("080-3", .@inst, false, .@mapc$); + instance_attachmap("080-1", .@inst, false, .@mapd$); + + instance_set_timeout(1800, 1800, .@inst); + instance_init(.@inst); + + /* Create locks */ + setcells .@mapa$, 103, 211, 107, 212, 1, "X21L1@"+X21ID(); + setcells .@mapa$, 124, 127, 131, 128, 1, "X21L2@"+X21ID(); + setcells .@mapa$, 47, 71, 51, 72, 1, "X21L3@"+X21ID(); + setcells .@mapd$, 81, 131, 86, 135, 1, "X21LF@"+X21ID(); + + /* Spawn Special Monsters */ + "#XMAS21Core"::spawn(Grinchboo, 5, .@mapa$); + "#XMAS21Core"::spawn(Grinchboo, 3, .@mapc$); + "#XMAS21Core"::spawn(Moonshroom, 10, .@mapa$); + "#XMAS21Core"::spawn(Moonshroom, 14, .@mapc$); + "#XMAS21Core"::spawn2(BlueSpark, 47, 191, 65, 212, 2, .@mapa$); + "#XMAS21Core"::spawn2(RedSpark, 47, 191, 65, 212, 2, .@mapa$); + if (X21TYPE() == IOT_PARTY) + "#XMAS21Core"::spawn2(Koyntety, 70, 250, 99, 265, 1, .@mapa$, true); + else + "#XMAS21Core"::spawn2(ManaGuardian, 70, 250, 99, 265, 1, .@mapa$, true); + + /* Northern Lights Dungeon */ + "#XMAS21Core"::spawn(WhiteSlime, 37, .@mapa$); + "#XMAS21Core"::spawn(Archant, 7, .@mapa$); + //"#XMAS21Core"::spawn(BlueSpark, 1, .@mapa$); //? + //"#XMAS21Core"::spawn(RedSpark, 1, .@mapa$); //? + "#XMAS21Core"::spawn(AzulSlime, 21, .@mapa$); + "#XMAS21Core"::spawn(SantaSlime, 18, .@mapa$); + "#XMAS21Core"::spawn(Moggun, 27, .@mapa$); + "#XMAS21Core"::spawn(Yeti, 4, .@mapa$); + "#XMAS21Core"::spawn(Wisp, 5, .@mapa$); + "#XMAS21Core"::spawn(Poltergeist, 12, .@mapa$); + "#XMAS21Core"::spawn(Spectre, 5, .@mapa$); + "#XMAS21Core"::spawn(ManaGhost, 14, .@mapa$); + "#XMAS21Core"::spawn(IceElement, 2, .@mapa$); + "#XMAS21Core"::spawn(IceSkull, 2, .@mapa$); + "#XMAS21Core"::spawn(Nutcracker, 6, .@mapa$); + "#XMAS21Core"::spawn(Fluffy, 16, .@mapa$); + + /* Peaceful/Mystic/Forgotten Glade (Past) */ + "#XMAS21Core"::spawn(CrotcherScorpion, 10, .@mapc$); + "#XMAS21Core"::spawn(Snail, 18, .@mapc$); + "#XMAS21Core"::spawn(Bee, 9, .@mapc$); + "#XMAS21Core"::spawn(Butterfly, 24, .@mapc$); + "#XMAS21Core"::spawn(PinkFlower, 42, .@mapc$); + "#XMAS21Core"::spawn(Pinkie, 32, .@mapc$); + "#XMAS21Core"::spawn(Hyvern, 6, .@mapc$); + "#XMAS21Core"::spawn(WitchGuard, 8, .@mapc$); + + /* Peaceful/Mystic/Forgotten Glade (Present) */ + "#XMAS21Core"::spawn(Fluffy, 9, .@mapd$); + "#XMAS21Core"::spawn(Snail, 11, .@mapd$); + "#XMAS21Core"::spawn(Bee, 5, .@mapd$); + "#XMAS21Core"::spawn(Butterfly, 15, .@mapd$); + "#XMAS21Core"::spawn(PinkFlower, 24, .@mapd$); + "#XMAS21Core"::spawn(Pinkie, 18, .@mapd$); + "#XMAS21Core"::spawn(Hyvern, 3, .@mapd$); + + /* The Three Guardians */ + .@bon = 0; + if (X21TYPE() == IOT_PARTY) + .@bon = 20000; + + .@mg = monster(.@mapd$, 43, 47, "Der Schneemann (Alpha)", SnowmanBoss, 1, "#X21BarrierF::OnKil"); + .@hp = .@bon + rand2(35000, 47000); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 2); + setunitdata(.@mg, UDT_ATKMIN, 30); + setunitdata(.@mg, UDT_ATKMAX, 40); + + .@mg = monster(.@mapd$, 144, 154, "Der Schneemann (Beta)", SnowmanBoss, 1, "#X21BarrierF::OnKil"); + .@hp = .@bon + rand2(35000, 47000); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 2); + setunitdata(.@mg, UDT_ATKMIN, 30); + setunitdata(.@mg, UDT_ATKMAX, 40); + + .@mg = monster(.@mapd$, 42, 147, "Der Schneemann (Gamma)", SnowmanBoss, 1, "#X21BarrierF::OnKil"); + .@hp = .@bon + rand2(35000, 47000); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 2); + setunitdata(.@mg, UDT_ATKMIN, 30); + setunitdata(.@mg, UDT_ATKMAX, 40); + + /* The Three Guardians Friends */ + if (X21TYPE() == IOT_PARTY) { .@g = 12; } else { .@g = 7; } + + freeloop(true); + for (.@i=0; .@i < .@g; .@i++) { + .@mg = areamonster(.@mapd$, 30, 38, 50, 51, "Snowman (Alpha)", Snowman, 1); + .@hp = rand2(3500, 5700); + .@ak = rand2(70, 120); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 1); + setunitdata(.@mg, UDT_ATKMIN, .@ak); + setunitdata(.@mg, UDT_ATKMAX, .@ak+20); + } + + for (.@i=0; .@i < .@g; .@i++) { + .@mg = areamonster(.@mapd$, 30, 38, 50, 51, "Snowman (Beta)", Snowman, 1); + .@hp = rand2(3500, 5700); + .@ak = rand2(70, 120); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 1); + setunitdata(.@mg, UDT_ATKMIN, .@ak); + setunitdata(.@mg, UDT_ATKMAX, .@ak+20); + } + + for (.@i=0; .@i < .@g; .@i++) { + .@mg = areamonster(.@mapd$, 30, 38, 50, 51, "Snowman (Gamma)", Snowman, 1); + .@hp = rand2(3500, 5700); + .@ak = rand2(70, 120); + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKRANGE, 1); + setunitdata(.@mg, UDT_ATKMIN, .@ak); + setunitdata(.@mg, UDT_ATKMAX, .@ak+20); + } + freeloop(false); + + } + if (instance_id() >= 0) + instance_set_timeout(1800, 1800); + return; +} + +function script X21CANDLE_CHECK { + if ('XMAS21CANDLE) return false; + // NOTE: We could check here if player already finished this + // And skip the challenge after litting one candle? + if ('X21_CANDLE[0] != 'COLORCODE[0]) return false; + if ('X21_CANDLE[1] != 'COLORCODE[1]) return false; + if ('X21_CANDLE[2] != 'COLORCODE[2]) return false; + if ('X21_CANDLE[3] != 'COLORCODE[3]) return false; + if ('X21_CANDLE[4] != 'COLORCODE[4]) return false; + if ('X21_CANDLE[5] != 'COLORCODE[5]) return false; + // This instance challenge is over + 'XMAS21CANDLE = true; + // Record on player as well, just to be safe. + if (XMAS2021 & X21_CANDLES) return true; + XMAS2021 = (XMAS2021 | X21_CANDLES); + return true; +} + +function script X21SEED_CHECK { + /* Protip: You don't have to fill all spots + * + * If you plant a "L" it also works + * This is because "L" is the first letter of "Lazy" + * And I was particularly lazy to make a proper script + */ + if ('XMAS21TREE) return false; + // NOTE: We could check here if player already finished this + // And skip the challenge after planting one tree? + if (!'XMAS21TREE_X[116]) return false; + if (!'XMAS21TREE_X[117]) return false; + if (!'XMAS21TREE_X[118]) return false; + if (!'XMAS21TREE_X[119]) return false; + if (!'XMAS21TREE_X[120]) return false; + if (!'XMAS21TREE_Y[168]) return false; + if (!'XMAS21TREE_Y[169]) return false; + if (!'XMAS21TREE_Y[170]) return false; + // This instance challenge is over + 'XMAS21TREE = true; + // Record on player as well, just to be safe. + if (XMAS2021 & X21_PLANTPUZZLE) return true; + XMAS2021 = (XMAS2021 | X21_PLANTPUZZLE); + return true; +} + +function script X21_SEEDS { + getmapxy(.@m$, .@x, .@y, 0); + // If planted in the wrong region, vanish without effect + if (.@m$ != "0812@"+X21ID2()) + return; + if (.@x < 107 || .@x > 126) + return; + if (.@y < 159 || .@y > 177) + return; + // Should never happen, so nuke everything + //if (instance_id() < 0) end; + // Already planted this spot + if ('XMAS21TREE_X[.@x] && 'XMAS21TREE_Y[.@y]) return; + // Record the success planting it + 'XMAS21TREE_X[.@x] = true; + 'XMAS21TREE_Y[.@y] = true; + // Sprout a Christmas Tree IF position was not already filled + monster(.@m$, .@x, .@y, strmobinfo(1, ChristmasTree), ChristmasTree, 1, "#XMAS21Core::OnX1164"); + // Unlock the gate once the puzzle is complete + if (X21SEED_CHECK()) { + delcells("X21L2@"+X21ID()); + specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3)); + getexp X21_EXP_PUZZLE, 0; + getitem AquaTicket, X21_TICKET_PUZZLE; + X21INIT(); + } + return; +} + +/* You cannot fiddle with party in this region */ +080-1 mapflag partylock +080-3 mapflag partylock +//081-1 mapflag partylock +081-2 mapflag partylock +081-3 mapflag partylock + +081-2 mapflag bexp 125 +080-3 mapflag bexp 125 +080-1 mapflag bexp 125 + +/* Secure regions */ +081-3 mapflag zone MMO +081-3 mapflag nosave 081-1,68,31 + +/* Script Core */ +080-1,0,0,0 script #XMAS21Core NPC_HIDDEN,{ + end; + +// "#XMAS21Core"::spawn(MonsterID, {Amount=1, {Map=this}}) +public function spawn { + if (playerattached()) + .@m$=getarg(2, getmap()); + else + .@m$=getarg(2); + .@n$="#XMAS21Core::On"+getarg(0); + if (mobcount(.@m$, .@n$) < 200) + areamonster .@m$, 20, 20, getmapinfo(MAPINFO_SIZE_X, .@m$)-20, getmapinfo(MAPINFO_SIZE_Y, .@m$)-20, strmobinfo(1, getarg(0)), getarg(0), getarg(1, 1), .@n$; + + /* Aqua Ticket Drops */ + if (playerattached()) { + if (instance_id() < 0) return; // No drops outside instanced maps + fix_mobkill(getarg(0)); + } + return; +} + +// "#XMAS21Core"::spawn2(MonsterID, X1, Y1, X2, Y2, {Amount=1, {Map=this}}) +// Function Changes from On<ID> to OnX<ID> +public function spawn2 { + .@m$=getarg(6, getmap()); + .@n$="#XMAS21Core::OnX"+getarg(0); + .@x1=max(getarg(1), 20); + .@y1=max(getarg(2), 20); + .@x2=min(getarg(3), getmapinfo(MAPINFO_SIZE_X, .@m$)-20); + .@y2=min(getarg(4), getmapinfo(MAPINFO_SIZE_Y, .@m$)-20); + .@noob=getarg(7, false); + /* + // Radius-based, was scrapped in favor of rectangles + .@x1=max(getarg(1)-getarg(3), 20); + .@y1=max(getarg(2)-getarg(3), 20); + .@x2=min(getarg(1)+getarg(3), getmapinfo(MAPINFO_SIZE_X, .@m$)-20); + .@y2=min(getarg(2)+getarg(3), getmapinfo(MAPINFO_SIZE_Y, .@m$)-20); + */ + if (mobcount(.@m$, .@n$) < 200) { + .@mg=areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, getarg(0)), getarg(0), getarg(5, 1), .@n$); + if (.@noob && .@mg) { + .@hp = getunitdata(.@mg, UDT_MAXHP) * 3 / 5; // Reduce to 60% HP + .@ak = getunitdata(.@mg, UDT_ATKMIN) * 4 / 5; // Reduce to 80% ATK + .@ax = getunitdata(.@mg, UDT_ATKMAX) * 4 / 5; // Reduce to 80% ATK + + setunitdata(.@mg, UDT_MAXHP, .@hp); + setunitdata(.@mg, UDT_HP, .@hp); + setunitdata(.@mg, UDT_ATKMIN, .@ak); + setunitdata(.@mg, UDT_ATKMAX, .@ax); + } + } + return; +} + +/* Special */ +// Sparkles Chamber, drops seeds +OnX1080: +OnX1081: + spawn2(any(BlueSpark, RedSpark), 47, 191, 65, 212); + /* Give player enough seeds */ + getmapxy(.@m$, .@x, .@y, 0); + .@x1=.@x-1; + .@y1=.@y-1; + .@x2=.@x+1; + .@y2=.@y+1; + .@x=cap_value(rand2(.@x1, .@x2), 47, 65); + .@y=cap_value(rand2(.@y1, .@y2), 191, 212); + makeitem(XmasSeeds, rand2(1, 3), .@m$, .@x, .@y); + end; +// Mini-Boss Chamberlain, drops candle +OnX1146: +OnX1147: + spawn2(any(Flashmob, Koyntety), 70, 250, 99, 265, 1, getmap(), true); + /* Give player enough fuel potions */ + getmapxy(.@m$, .@x, .@y, 0); + .@x1=.@x-1; + .@y1=.@y-1; + .@x2=.@x+1; + .@y2=.@y+1; + .@x=cap_value(rand2(.@x1, .@x2), 70, 99); + .@y=cap_value(rand2(.@y1, .@y2), 250, 265); + makeitem(ThermalNapalm, rand2(3, 5), .@m$, .@x, .@y); + end; +// Mini-Boss Chamberlain, drops candle (easy mode) +OnX1140: +OnX1143: +OnX1138: + spawn2(any(Tengu, ManaSlayer, ManaGuardian, ManaGuardian), 70, 250, 99, 265, 1, getmap(), true); + /* Give player enough fuel potions */ + getmapxy(.@m$, .@x, .@y, 0); + .@x1=.@x-1; + .@y1=.@y-1; + .@x2=.@x+1; + .@y2=.@y+1; + .@x=cap_value(rand2(.@x1, .@x2), 70, 99); + .@y=cap_value(rand2(.@y1, .@y2), 250, 265); + makeitem(ThermalNapalm, rand2(3, 5), .@m$, .@x, .@y); + end; +// Christmas Tree, spawns a (few?) gift boxes +OnX1164: + getmapxy(.@m$, .@x, .@y, 0); + .@x1=.@x-2; + .@y1=.@y-2; + .@x2=.@x+2; + .@y2=.@y+2; + .@x=cap_value(rand2(.@x1, .@x2), 47, 65); + .@y=cap_value(rand2(.@y1, .@y2), 191, 212); + spawn2(ChristmasGift, .@x1, .@y1, .@x2, .@y2, rand2(1, 3)); + end; +// Christmas Gift Box, gives you Tickets +OnX1165: + getmapxy(.@m$, .@x, .@y, 0); + .@x1=.@x-2; + .@y1=.@y-2; + .@x2=.@x+2; + .@y2=.@y+2; + .@x=cap_value(rand2(.@x1, .@x2), 47, 65); + .@y=cap_value(rand2(.@y1, .@y2), 191, 212); + makeitem(AquaTicket, any(1, 1, 2), .@m$, .@x, .@y); + end; + +/* Experimental */ +On1162: + spawn(Grinchboo, 2); + end; +On1130: + spawn(Moonshroom); + end; + +/* Ice Caves */ +On1093: + spawn(WhiteSlime); + end; +On1060: + spawn(Archant); + end; +On1080: + spawn(BlueSpark); + end; +On1081: + spawn(RedSpark); + end; +On1100: + spawn(AzulSlime); + end; +On1015: + spawn(SantaSlime); + end; +On1061: + spawn(Moggun); + end; +On1072: + spawn(Yeti); + end; +On1040: + spawn(Wisp); + end; +On1047: + spawn(Poltergeist); + end; +On1042: + spawn(Spectre); + end; +On1125: + spawn(ManaGhost); + end; +On1071: + spawn(IceElement); + end; +On1085: + spawn(IceSkull); + end; +On1114: + spawn(Nutcracker); + end; +On1020: + spawn(Fluffy); + end; + +/* Woodlands */ +On1084: + spawn(CrotcherScorpion); + end; +On1041: + spawn(Snail); + end; +On1049: + spawn(Bee); + end; +On1055: + spawn(Butterfly); + end; +On1014: + spawn(PinkFlower); + end; +On1018: + spawn(Pinkie); + end; +On1088: + spawn(Hyvern); + end; +On1103: + spawn(WitchGuard); + end; + +/* Ambush */ +On1140: + spawn(Tengu); + end; +On1138: + spawn(ManaGuardian); + end; +On1143: + spawn(ManaSlayer); + end; +On1150: + spawn(ManaTyrant); + end; +On1147: + spawn(Koyntety); + end; +On1146: + spawn(Flashmob); + end; + +/* Other Christmas settings */ +OnInstanceInit: + /* Prepare the color code */ + 'COLORCODE[0] = rand2(0, 2); + 'COLORCODE[1] = rand2(0, 2); + 'COLORCODE[2] = rand2(0, 2); + 'COLORCODE[3] = rand2(0, 2); + 'COLORCODE[4] = rand2(0, 2); + 'COLORCODE[5] = rand2(0, 2); + 'OBSCURECOLOR = any(0, 1); + + /* Prepare the Ambush Chamber */ + 'AMBUSHTRI[0] = rand2(1, 17); + do + { + 'AMBUSHTRI[1] = rand2(1, 17); + } while ('AMBUSHTRI[1] == 'AMBUSHTRI[0]); + do + { + 'AMBUSHTRI[2] = rand2(1, 17); + } while ('AMBUSHTRI[2] == 'AMBUSHTRI[0] || 'AMBUSHTRI[2] == 'AMBUSHTRI[1]); + 'AMBUSH_BMASK = 0; + + /* Prepare the Enigma */ + 'TRUES=0; + 'TRUTHSTAT[0]=any(false, true); + if ('TRUTHSTAT[0]) + 'TRUES+=1; + 'TRUTHSTAT[1]=any(false, true); + if ('TRUTHSTAT[1]) + 'TRUES+=1; + 'TRUTHSTAT[2]=any(false, ('TRUES >= 2 ? false : true)); + 'TRUES=0; + end; + +OnInit: + /* Aethyra - Frontier Town */ + "#XMAS21Core"::spawn(Fluffy, 16, "081-1"); + "#XMAS21Core"::spawn(Poltergeist, 7, "081-1"); + "#XMAS21Core"::spawn(Wisp, 7, "081-1"); + "#XMAS21Core"::spawn(Spectre, 7, "081-1"); + "#XMAS21Core"::spawn(WhiteSlime, 12, "081-1"); + "#XMAS21Core"::spawn(SantaSlime, 4, "081-1"); + "#XMAS21Core"::spawn(Moggun, 10, "081-1"); + "#XMAS21Core"::spawn(Moonshroom, 7, "081-1"); + end; +} + + |