summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <jesusalva@themanaworld.org>2020-11-30 21:49:54 -0300
committerGitHub <noreply@github.com>2020-12-01 00:49:54 +0000
commitdbc0174b72ea451dd737a99e581cd460ff969fa8 (patch)
tree90472c492bd8a4c97fc9c90436e459cfb36711b2
parent7b9d5976809d36fd542176f2010fd9714d0c685c (diff)
downloadserverdata-dbc0174b72ea451dd737a99e581cd460ff969fa8.tar.gz
serverdata-dbc0174b72ea451dd737a99e581cd460ff969fa8.tar.bz2
serverdata-dbc0174b72ea451dd737a99e581cd460ff969fa8.tar.xz
serverdata-dbc0174b72ea451dd737a99e581cd460ff969fa8.zip
Christmas 2020 (#567)
“Jack Frost has cursed Santa's Reinboos! They can recover if hit with a snowball, but catching these buggers is hard! Get a Snowball Thrower with Santa and save Christmas! On the meanwhile, someone not so interested in Christmas might have better targets for these snowballs...”
-rw-r--r--world/map/db/const-quest.txt1
-rw-r--r--world/map/db/item_db_weapon.txt3
-rw-r--r--world/map/db/mob_db_0_19.txt3
-rw-r--r--world/map/db/mob_db_20_39.txt2
-rw-r--r--world/map/db/mob_db_40_59.txt4
-rw-r--r--world/map/db/mob_db_over_100.txt8
-rw-r--r--world/map/news.d/90-christmas-2020.txt17
-rw-r--r--world/map/npc/annuals/xmas/2020.txt675
-rw-r--r--world/map/npc/scripts.conf1
9 files changed, 706 insertions, 8 deletions
diff --git a/world/map/db/const-quest.txt b/world/map/db/const-quest.txt
index 0ad92636..ad679d17 100644
--- a/world/map/db/const-quest.txt
+++ b/world/map/db/const-quest.txt
@@ -155,3 +155,4 @@ AMMO_NONE 0
AMMO_BOW 1
AMMO_SLING 2
AMMO_WAND 3
+AMMO_XMAS 4
diff --git a/world/map/db/item_db_weapon.txt b/world/map/db/item_db_weapon.txt
index 08d472f0..016e5055 100644
--- a/world/map/db/item_db_weapon.txt
+++ b/world/map/db/item_db_weapon.txt
@@ -61,3 +61,6 @@
1201, Knife, 4, 50, 25, 120, 5, 0, 1, 0, 0, 2, 2, 1, 1, 1, {}, {}
1215, ToySabre, 4, 2000000, 25, 1, 1, 0, 1, 0, 0, 2, 2, 1, 1, 1, {}, {}
1282, BoneArrows, 10, 50, 20, 0, 55, 0, 0, 0, 0, 2, 32768, 0, 0, 0, {}, {bonus bCritical, 1;set @AmmoType, AMMO_BOW; callfunc "CheckAmmo";}
+//ID, Name___________________, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, {UseScript}, {EquipScript}
+5260, Snowball, 10, 1, 0, 1, 3, 0, 0, 0, 0, 2, 32768, 0, 0, 0, {}, {set @AmmoType, AMMO_XMAS; callfunc "CheckAmmo";}
+5261, SnowLauncher, 4, 500, 50, 10, 5, 0, 3, 0, 0, 2, 2, 1, 1, 11, {}, {set @LauncherType, AMMO_XMAS; callfunc "CheckLauncher";}
diff --git a/world/map/db/mob_db_0_19.txt b/world/map/db/mob_db_0_19.txt
index 65ae7b57..c59f1d84 100644
--- a/world/map/db/mob_db_0_19.txt
+++ b/world/map/db/mob_db_0_19.txt
@@ -13,5 +13,6 @@
1063, Pumpkin, Pumpkin, 1, 200, 0, 0, 1, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 22, 0, 800, 800, 672, 480, 3000, 100, 3001, 20, 3002, 10, 3003, 15, 3011, 500, 3006, 1500, 3007, 2000, 3010, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1082, Serqet, Serqet, 10, 100, 0, 0, 2, 1, 10, 15, 0, 5, 1, 1, 1, 0, 15, 5, 1, 1, 1, 3, 20, 129, 2000, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1092, SlimeBlast, SlimeBlast, 10, 100, 0, 0, 8, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 0, 61, 175, 250, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
-1095, WhiteBell, WhiteBell, 10, 100, 0, 0, 40, 2, 70, 75, 0, 5, 16, 12, 20, 20, 20, 50, 2, 2, 1, 3, 22, 128, 800, 800, 672, 480, 535, 100, 540, 10, 1199, 100, 526, 400, 861, 5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 50
+1095, WhiteBell, WhiteBell, 10, 100, 0, 0, 40, 2, 70, 75, 0, 5, 16, 12, 20, 20, 20, 50, 2, 2, 1, 3, 22, 128, 800, 800, 672, 480, 535, 100, 540, 10, 1199, 100, 526, 400, 861, 5000, 5260, 700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 50
1105, ViciousSquirrel, ViciousSquirrel, 15, 140, 1, 0, 7, 1, 20, 25, 1, 6, 3, 3, 1, 0, 15, 40, 1, 1, 1, 3, 20, 133, 800, 800, 672, 480, 704, 7000, 680, 1000, 681, 1000, 682, 1000, 683, 1000, 807, 800, 4005, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15
+1162, Grinchboo, Grinchboo, 5, 50, 0, 0, 1, 1, 5, 10, 0, 5, 1, 1, 1, 0, 6, 5, 1, 1, 1, 3, 21, 129, 800, 1872, 672, 480, 505, 800, 501, 150, 518, 400, 527, 50, 527, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
diff --git a/world/map/db/mob_db_20_39.txt b/world/map/db/mob_db_20_39.txt
index 7fe8ca4d..1d9cef84 100644
--- a/world/map/db/mob_db_20_39.txt
+++ b/world/map/db/mob_db_20_39.txt
@@ -20,7 +20,7 @@
1084, CrotcherScorpion, CrotcherScorpion, 25, 1200, 0, 0, 86, 1, 75, 175, 15, 45, 15, 30, 10, 10, 25, 25, 1, 1, 1, 0, 45, 133, 750, 1350, 672, 480, 523, 300, 518, 1000, 509, 300, 512, 300, 535, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1087, Larvern, Larvern, 20, 550, 0, 0, 26, 1, 50, 200, 30, 65, 35, 20, 50, 0, 70, 20, 1, 1, 1, 0, 25, 139, 1500, 1500, 672, 480, 836, 2000, 518, 1000, 807, 300, 806, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1089, HungryFluffy, HungryFluffy, 30, 500, 0, 0, 10, 1, 6, 10, 1, 5, 1, 2, 1, 0, 20, 25, 1, 1, 1, 3, 20, 133, 800, 1600, 672, 480, 611, 500, 527, 150, 752, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40
-1093, WhiteSlime, WhiteSlime, 20, 200, 0, 0, 15, 1, 80, 120, 10, 10, 20, 30, 10, 10, 30, 20, 1, 1, 1, 0, 61, 137, 500, 1872, 672, 480, 4026, 200, 4002, 20, 541, 500, 863, 100, 864, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
+1093, WhiteSlime, WhiteSlime, 20, 200, 0, 0, 15, 1, 80, 120, 10, 10, 20, 30, 10, 10, 30, 20, 1, 1, 1, 0, 61, 137, 500, 1872, 672, 480, 4026, 200, 4002, 20, 541, 500, 863, 100, 864, 200, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
1094, Reinboo, Reinboo, 35, 1100, 0, 0, 29, 2, 40, 75, 35, 5, 15, 5, 15, 0, 40, 10, 2, 2, 1, 3, 20, 129, 600, 1872, 672, 480, 512, 1000, 736, 1200, 737, 1200, 738, 1200, 739, 1200, 869, 50, 4042, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 30
1099, SleepingBandit, SleepingBandit, 20, 25, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 1, 1, 1, 0, 29, 0, 500, 1500, 672, 900, 4016, 800, 521, 200, 526, 500, 535, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1100, AzulSlime, AzulSlime, 20, 200, 0, 0, 10, 1, 80, 120, 10, 10, 20, 30, 10, 10, 30, 20, 1, 1, 1, 0, 61, 131, 500, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
diff --git a/world/map/db/mob_db_40_59.txt b/world/map/db/mob_db_40_59.txt
index a27c015c..d22bfd55 100644
--- a/world/map/db/mob_db_40_59.txt
+++ b/world/map/db/mob_db_40_59.txt
@@ -6,8 +6,8 @@
1081, RedSpark, RedSpark, 40, 10000, 0, 0, 392, 2, 40, 40, 20, 40, 30, 30, 30, 30, 30, 30, 1, 1, 1, 0, 20, 129, 190, 1500, 800, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1086, FeyElement, FeyElement, 50, 5000, 0, 12500, 901, 5, 50, 125, 25, 50, 20, 70, 10, 20, 80, 1, 1, 1, 1, 0, 84, 165, 330, 740, 672, 400, 834, 5000, 680, 1000, 680, 1000, 681, 1000, 681, 1000, 682, 1000, 682, 1000, 683, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50
1088, Hyvern, Hyvern, 40, 2250, 0, 0, 346, 1, 50, 125, 0, 10, 10, 45, 5, 0, 35, 35, 1, 1, 1, 0, 85, 133, 250, 800, 672, 480, 835, 2000, 518, 1000, 657, 600, 529, 3000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
-1090, Wolvern, Wolvern, 40, 900, 0, 0, 86, 1, 50, 80, 5, 5, 15, 10, 5, 0, 20, 10, 1, 1, 1, 3, 20, 133, 425, 770, 500, 200, 858, 1000, 859, 400, 4023, 200, 676, 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40
+1090, Wolvern, Wolvern, 40, 900, 0, 0, 86, 1, 50, 80, 5, 5, 15, 10, 5, 0, 20, 10, 1, 1, 1, 3, 20, 133, 425, 770, 500, 200, 858, 1000, 859, 400, 4023, 200, 676, 1300, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40
1091, BlueSlime, BlueSlime, 40, 2000, 0, 0, 77, 1, 100, 150, 20, 40, 40, 30, 50, 10, 50, 40, 1, 1, 1, 0, 61, 131, 1200, 1872, 672, 480, 4026, 200, 4005, 20, 501, 500, 862, 700, 863, 100, 864, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
1098, CopperSlime, CopperSlime, 40, 600, 0, 0, 18, 1, 60, 90, 20, 30, 20, 30, 10, 10, 30, 30, 1, 1, 1, 0, 21, 131, 1200, 1872, 672, 480, 640, 1500, 537, 1000, 4001, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
1111, CandiedSlime, CandiedSlime, 50, 800, 0, 800, 66, 3, 50, 50, 20, 30, 20, 30, 10, 10, 30, 30, 1, 1, 1, 0, 21, 175, 1200, 1872, 672, 480, 510, 1000, 509, 1000, 515, 200, 516, 200, 538, 200, 512, 200, 508, 500, 514, 750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
-1112, Santaboo, Santaboo, 50, 2200, 0, 0, 59, 2, 80, 125, 50, 10, 25, 10, 25, 0, 60, 30, 2, 2, 1, 3, 20, 129, 600, 1872, 672, 480, 512, 1000, 736, 1200, 737, 1200, 738, 1200, 739, 1200, 511, 50, 4042, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 30
+1112, Santaboo, Santaboo, 50, 2200, 0, 0, 59, 2, 80, 125, 50, 10, 25, 10, 25, 0, 60, 30, 2, 2, 1, 3, 20, 129, 600, 1872, 672, 480, 512, 1000, 736, 1200, 737, 1200, 738, 1200, 739, 1200, 511, 50, 4042, 10, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 30
diff --git a/world/map/db/mob_db_over_100.txt b/world/map/db/mob_db_over_100.txt
index 607b6031..fd74bc7d 100644
--- a/world/map/db/mob_db_over_100.txt
+++ b/world/map/db/mob_db_over_100.txt
@@ -4,7 +4,7 @@
1012, Spider, Spider, 125, 800, 0, 690, 115, 1, 70, 85, 4, 6, 14, 13, 10, 10, 35, 10, 1, 1, 1, 0, 25, 175, 1000, 1500, 672, 480, 537, 500, 535, 100, 638, 20, 526, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 40
1013, EvilMushroom, EvilMushroom, 110, 650, 0, 0, 35, 1, 65, 80, 4, 6, 16, 12, 10, 10, 35, 10, 1, 1, 1, 3, 22, 137, 800, 1800, 672, 480, 535, 500, 540, 10, 534, 100, 566, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60
1014, PinkFlower, PinkFlower, 115, 700, 0, 0, 40, 2, 70, 75, 0, 5, 16, 12, 20, 20, 20, 50, 2, 2, 1, 3, 22, 128, 800, 800, 672, 480, 535, 100, 540, 10, 1199, 100, 526, 400, 565, 1000, 565, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 50
-1015, SantaSlime, SantaSlime, 120, 750, 0, 0, 58, 1, 75, 80, 2, 7, 1, 20, 1, 0, 30, 30, 1, 1, 1, 0, 21, 161, 1500, 1872, 672, 480, 512, 800, 513, 700, 514, 600, 519, 500, 527, 400, 538, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
+1015, SantaSlime, SantaSlime, 120, 750, 0, 0, 58, 1, 75, 80, 2, 7, 1, 20, 1, 0, 30, 30, 1, 1, 1, 0, 21, 161, 1500, 1872, 672, 480, 512, 800, 513, 700, 514, 600, 519, 500, 527, 400, 538, 500, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10
1022, JackO, JackO, 175, 10000, 0, 18130, 1241, 2, 100, 500, 40, 20, 105, 40, 85, 75, 105, 95, 1, 1, 1, 0, 20, 133, 250, 1500, 672, 480, 617, 300, 622, 400, 624, 400, 620, 400, 615, 300, 1203, 400, 1198, 10000, 616, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1023, FireSkull, FireSkull, 170, 5000, 0, 0, 721, 2, 75, 175, 35, 15, 40, 30, 30, 30, 35, 70, 1, 1, 1, 3, 23, 175, 600, 1600, 672, 480, 631, 1000, 701, 5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1024, PoisonSkull, PoisonSkull, 170, 5000, 0, 0, 721, 2, 75, 175, 35, 15, 40, 30, 30, 30, 35, 70, 1, 1, 1, 3, 25, 175, 600, 1600, 672, 480, 631, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 20
@@ -15,10 +15,10 @@
1045, Fallen, Fallen, 120, 10000, 0, 7812, 1663, 2, 180, 430, 5, 20, 40, 3, 25, 5, 80, 45, 1, 1, 1, 0, 49, 133, 300, 1200, 672, 300, 775, 210, 775, 210, 776, 300, 631, 1000, 636, 3, 658, 2, 532, 35, 778, 500, 1198, 500, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50
1062, Terranite, Terranite, 110, 6000, 0, 0, 889, 1, 200, 300, 20, 40, 60, 40, 40, 30, 60, 40, 1, 1, 1, 0, 29, 133, 400, 872, 672, 900, 4001, 600, 4004, 20, 4005, 20, 4007, 20, 763, 500, 640, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1068, Reaper, Reaper, 140, 40000, 0, 0, 156, 7, 200, 350, 30, 80, 100, 120, 70, 120, 100, 75, 1, 50, 1, 1, 89, 165, 500, 1200, 800, 300, 777, 1000, 775, 500, 776, 100, 1221, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-1071, IceElement, IceElement, 100, 5000, 0, 0, 689, 3, 60, 200, 5, 20, 15, 25, 40, 15, 45, 30, 1, 1, 1, 0, 41, 135, 330, 740, 672, 400, 4026, 900, 537, 750, 568, 400, 543, 900, 544, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 20
-1072, Yeti, Yeti, 100, 8500, 0, 0, 726, 2, 100, 400, 60, 15, 60, 5, 45, 15, 60, 32, 1, 1, 1, 0, 61, 135, 220, 1200, 672, 900, 4023, 700, 4024, 300, 4025, 400, 4027, 142, 4021, 800, 4022, 700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
+1071, IceElement, IceElement, 100, 5000, 0, 0, 689, 3, 60, 200, 5, 20, 15, 25, 40, 15, 45, 30, 1, 1, 1, 0, 41, 135, 330, 740, 672, 400, 4026, 900, 537, 750, 568, 400, 543, 900, 544, 250, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 20
+1072, Yeti, Yeti, 100, 8500, 0, 0, 726, 2, 100, 400, 60, 15, 60, 5, 45, 15, 60, 32, 1, 1, 1, 0, 61, 135, 220, 1200, 672, 900, 4023, 700, 4024, 300, 4025, 400, 4027, 142, 4021, 800, 4022, 700, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1075, Stalker, Stalker, 120, 20000, 0, 0, 4000, 2, 220, 500, 23, 30, 35, 15, 3, 50, 50, 50, 2, 2, 1, 1, 29, 175, 340, 1800, 672, 950, 775, 75, 775, 115, 776, 135, 631, 40, 778, 500, 1198, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 20
-1085, IceSkull, IceSkull, 170, 7000, 0, 0, 757, 2, 75, 400, 40, 15, 40, 30, 30, 30, 35, 44, 1, 1, 1, 3, 21, 141, 600, 1600, 672, 480, 4026, 5000, 862, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
+1085, IceSkull, IceSkull, 170, 7000, 0, 0, 757, 2, 75, 400, 40, 15, 40, 30, 30, 30, 35, 44, 1, 1, 1, 3, 21, 141, 600, 1600, 672, 480, 4026, 5000, 862, 800, 5260, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1096, SoulSnake, SoulSnake, 115, 850, 0, 0, 56, 1, 75, 90, 4, 6, 20, 11, 10, 10, 35, 10, 1, 1, 1, 0, 20, 137, 900, 1300, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 30
1102, Luvia, Luvia, 127, 48044, 60, 0, 12172, 5, 339, 364, 50, 92, 1, 29, 55, 255, 255, 255, 31, 30, 1, 0, 69, 181, 220, 1200, 672, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1106, WickedMushroom, WickedMushroom, 110, 550, 0, 0, 30, 1, 70, 80, 4, 4, 16, 12, 10, 10, 35, 10, 1, 1, 1, 3, 22, 133, 800, 1800, 672, 480, 613, 600, 4007, 50, 567, 100, 566, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60
diff --git a/world/map/news.d/90-christmas-2020.txt b/world/map/news.d/90-christmas-2020.txt
new file mode 100644
index 00000000..33241e89
--- /dev/null
+++ b/world/map/news.d/90-christmas-2020.txt
@@ -0,0 +1,17 @@
+{title:Christmas 2020}
+{date:2020-12-01}
+
+{b}Christmas 2020{/b}
+
+The Mana World Team wishes everyone a happy new Christmas!
+
+By the way, Santa seemed very concerned with something.
+Perhaps you could help him? Last I saw him, he was hanging in Nivalis.
+If you hurry, maybe you can still catch him!
+
+The Mana World: rEvolt release will be postponed at least until the event ends,
+so enjoy your time and Christmas this year.
+
+As they say: Merry Christmas and Happy New Year!
+
+{author:Jesusalva}
diff --git a/world/map/npc/annuals/xmas/2020.txt b/world/map/npc/annuals/xmas/2020.txt
new file mode 100644
index 00000000..f60dfd4e
--- /dev/null
+++ b/world/map/npc/annuals/xmas/2020.txt
@@ -0,0 +1,675 @@
+// The Mana World Scripts
+// Christmas 2020
+// (C) Jesusalva, Hocus, Ledmitz, toams, monwarez, jak1, Hello=) et. al., 2020
+// Licensed under the GPLv2 or later
+// XXmas is not a typo, "XX" is twenty and the year is twenty-twenty.
+
+034-1,0,0,0|script|XXmas0341|32767
+{
+ end;
+
+OnHit2:
+ goto OnHit;
+
+OnHit:
+ // Not Christmas yet
+ if (!$@xmas_time)
+ end;
+ // Reward time
+ if ($@xmas_time == $@xmas_reward_time)
+ end;
+ // player must be created at least two weeks ago
+ if ((BaseLevel < 30) || (gettimetick(2) - TUT_var < 2*7*86400))
+ end;
+
+ // Not equipped to hunt Grinchboos
+ if (getequipid(equip_arrow) != 5260)
+ end;
+ if (getequipid(equip_hand1) != 5261)
+ end;
+
+ // Grinchboo slain
+ set XMAS2020, XMAS2020 + 1;
+ set $XMAS2020_BOO, $XMAS2020_BOO + 1;
+ set @loop, 0;
+ set @rank, 0;
+ goto L_MaybeInsertNext;
+
+L_MaybeInsertNext:
+ if (XMAS2020 > $Record_XXmas_Kills[@rank])
+ goto L_InsertScore;
+ // you already had a better score
+ if (strcharinfo(0) == $Record_XXmas_Name$[@rank])
+ goto L_Reward1;
+ set @rank, @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Reward1;
+ goto L_MaybeInsertNext;
+
+L_InsertScore:
+ set @loop, @rank;
+ goto L_FindLastScore;
+
+L_FindLastScore:
+ // comment this out to allow the player to be in the list more than once
+ // though actually, it might be better just to assume the list is full
+ if (strcharinfo(0) == $Record_XXmas_Name$[@loop])
+ goto L_MoveStuff;
+
+ set @loop, @loop + 1;
+ if (@loop == MAX_HIGH_SCORES)
+ goto L_MoveStuff;
+ goto L_FindLastScore;
+
+L_MoveStuff:
+ if (@loop == @rank)
+ goto L_FinallyInsertMe;
+ set $Record_XXmas_Kills[@loop], $Record_XXmas_Kills[@loop - 1];
+ set $Record_XXmas_Name$[@loop], $Record_XXmas_Name$[@loop - 1];
+ set $Record_XXmas_Date$[@loop], $Record_XXmas_Date$[@loop - 1];
+ set @loop, @loop - 1;
+ goto L_MoveStuff;
+
+L_FinallyInsertMe:
+ set $Record_XXmas_Kills[@rank], XMAS2020;
+ set $Record_XXmas_Name$[@rank], strcharinfo(0);
+ callfunc "time_stamp";
+ set $Record_XXmas_Date$[@rank], @ts_date$ + " " + @ts_time$;
+ set @ts_date$, "";
+ set @ts_time$, "";
+ goto L_Reward1;
+
+L_Reward1:
+ // Maybe we should tell you how many you purified?
+ if (XMAS2020 % 10 == 0 || XMAS2020 == 1)
+ goto L_Warning;
+ end;
+
+L_Warning:
+ message strcharinfo(0), "Grinchboos purified: "+XMAS2020;
+ end;
+
+OnTimer15000:
+ areamonster "034-1", 20, 20, 160, 110, "", 1162, 18, "XXmas0341::OnHit2";
+ // Only happens until :15, and every 15 minutes, for a total of 60 cycles.
+ if (gettime(2) > 15)
+ end;
+ initnpctimer;
+ end;
+
+OnClock1800:
+ initnpctimer;
+ end;
+
+OnClock1830:
+ killmonster "034-1", "XXmas0341::OnHit2";
+ stopnpctimer;
+ end;
+
+// Additional timers
+OnClock0000:
+ goto OnClock1800;
+OnClock0030:
+ goto OnClock1830;
+OnClock0600:
+ goto OnClock1800;
+OnClock0630:
+ goto OnClock1830;
+}
+
+// Scatter the grinchboos
+// Nivalis
+034-1,0,0,0,0|monster|Grinchboo|1162,14,100000ms,30000ms,XXmas0341::OnHit
+//030-1,0,0,0,0|monster|Grinchboo|1162,7,100000ms,30000ms,XXmas0341::OnHit
+//031-1,0,0,0,0|monster|Grinchboo|1162,2,100000ms,30000ms,XXmas0341::OnHit
+033-1,0,0,0,0|monster|Grinchboo|1162,5,100000ms,30000ms,XXmas0331::OnHit
+//019-1,0,0,0,0|monster|Grinchboo|1162,2,100000ms,30000ms,XXmas0341::OnHit
+// Thermin
+//045-1,0,0,0,0|monster|Grinchboo|1162,10,100000ms,30000ms,XXmas0341::OnHit
+046-1,0,0,0,0|monster|Grinchboo|1162,8,100000ms,30000ms,XXmas0461::OnHit
+047-1,0,0,0,0|monster|Grinchboo|1162,6,100000ms,30000ms,XXmas0471::OnHit
+
+// Bring Santa back!!! With speeches from all previous events because I'M LAZY
+// Same place as he was in 2009, instead of his room in 030-2,197,62
+020-1,78,85,0|script|Santa|105
+{
+ if (Sex)
+ set @honorific$, "Young Hero";
+ if (!Sex)
+ set @honorific$, "Young Heroine";
+
+
+ // Not Christmas yet
+ if (!$@xmas_time)
+ goto L_PreXmas;
+ // Past Christmas
+ if ($@xmas_time == $@xmas_reward_time)
+ goto L_Reward;
+ // Already equipped, so...
+ if (countitem("SnowLauncher") > 0)
+ goto L_Doing;
+
+ // Begin exactly like it was in 2009
+ mes "[Santa Claus]";
+ mes "\"ho-hum ho-hum ho-hum, I'm sorry, " + @honorific$ + " Not really in the Christmas spirit.";
+ mes "That Evil Jack Frost has stolen all the Christmas ornaments!";
+ mes "He will never get off the Naughty List!";
+ mes "How can we have Christmas without a proper Christmas tree?\"";
+ mes "\"The Elves are too depressed to work";
+ mes "Christmas will be ruined!\"";
+ next;
+ // But this is not 2009...
+ mes "[Santa Claus]";
+ mes "\"OOPS! That was Christmas 2009! We are in 2020, how could I forget? Ho! Ho! Ho!\"";
+ next;
+ mes "[Santa Claus]";
+ mes "\"But still! Can you believe Jack Frost turned all my Reinboos into Grinchboos?! Christmas will be ruined!\"";
+ next;
+ mes "[Santa Claus]";
+ mes "\"Say, Why don't you help me?";
+ mes "In fact, You are just the " + @honorific$ + " I am looking for!\"";
+ mes "\"What do you say, will you help save Christmas?\"";
+ next;
+ menu
+ "I won't.", L_Close,
+ "How can I help?", L_Help;
+
+L_Help:
+ // player must be created at least two weeks ago
+ if ((BaseLevel < 30) || (gettimetick(2) - TUT_var < 2*7*86400))
+ goto L_Young;
+ mes "[Santa Claus]";
+ mes "\"Oh that is excellent news!";
+ mes "Thank you.\"";
+ mes "##9Santa shakes your hand with delight.##0";
+ next;
+ mes "[Santa Claus]";
+ mes "\"You see, if you hit the grinchboos with snowballs, they can be purified! (Don't ask me how it works, Christmas is weird this year!)\"";
+ next;
+ mes "[Santa Claus]";
+ mes "\"However, you cannot just throw snowballs at them. But I have the ideal tool for this task!\"";
+ next;
+ mes "[Santa Claus]";
+ mes "\"You can use this super ##BCandy-Caned Anti-Grinch-Rifle 2020™##b! Hit as many as you can! Ho ho ho!\"";
+ menu
+ "Many thanks, Santa!", L_Item,
+ "I already have one, I'll get to work!", L_Close;
+
+L_Young:
+ mes "[Santa]";
+ mes "\"That's a very friendly offer! But I don't think we need any help.\"";
+ goto L_Close;
+
+L_Item:
+ getinventorylist;
+ if (@inventorylist_count == 100) goto L_Full;
+ getitem "SnowLauncher", 1;
+ mes "[Santa Claus]";
+ mes "\"Ho Ho Ho Merry Christmas!\"";
+ close;
+
+L_Close:
+ close;
+
+L_Full:
+ mes "[Santa Claus]";
+ mes "\"Your backpack seems to be full. You should get rid of some unused stuff before you get my gifts, or maybe try one super resistant red bag, my personal favorite! Hoh-hoh!\"";
+ close;
+
+L_PreXmas:
+ mes "[Santa Claus]";
+ mes "\"Ho, Ho... See you later " +@honorific$+ "!\"";
+ close;
+
+L_ShowRecord:
+ mes "[Santa Claus]";
+ mes "You have purified "+XMAS2020+" Grinchboos thus far.";
+ mes "All players have purified "+$XMAS2020_BOO+" Grinchboos in total.";
+ set @rank, 0;
+ set @loop, 0;
+ goto L_ShowNextRecord;
+
+L_ShowNextRecord:
+ if ($Record_XXmas_Kills[@loop] == 0)
+ goto L_Close;
+ mes (@loop + 1) + " - " + $Record_XXmas_Name$[@loop] + " - " + $Record_XXmas_Kills[@loop] + " Grinchboos saved at " + $Record_XXmas_Date$[@loop];
+ set @loop, @loop + 1;
+ if (MAX_HIGH_SCORES > 4 && (@loop % 5) == 0 && $Record_XXmas_Kills[@loop] > 0)
+ goto L_NextShowNextRecord;
+ goto L_ShowNextRecord;
+
+L_NextShowNextRecord:
+ next;
+ goto L_ShowNextRecord;
+
+L_Doing:
+ mes "[Santa]";
+ mes "\"Hello " + strcharinfo(0) + ". I heard about your efforts to help. I'm very happy to hear that.\"";
+ next;
+ mes "[Santa]";
+ mes "\"Be careful at 18:00, 00:00 and 06:00, those are the most active times for my reinboos.\"";
+ next;
+ menu
+ "I'll go back to work.", L_Close,
+ "What are current highscores?", L_ShowRecord;
+
+L_Done:
+ mes "[Santa]";
+ mes "\"Hello " + strcharinfo(0) + ". I heard about your efforts to help. I'm very happy to hear that.\"";
+ next;
+ menu
+ "Santa, you are the best!", L_Close,
+ "What were the highscores?", L_ShowRecord;
+
+L_Reward:
+ if (XMAS2020 <= 0)
+ goto L_Done;
+ mes "[Santa Claus]";
+ mes "\"You are so generous! I believe I can give you one of the hats from this bag. I know you like these silly hats. Yes, Santa knows this kind of thing... Ho-Ho-Ho! Put your hand here and pick one hat...\"";
+ next;
+ getinventorylist;
+ if (@inventorylist_count > 95) goto L_Full;
+ mes "You have purified "+XMAS2020+" Grinchboos thus far.";
+ mes "All players have purified "+$XMAS2020_BOO+" Grinchboos in total.";
+ set @rank, 0;
+ set @loop, 0;
+ goto L_FindRank;
+
+L_FindRank:
+ if (strcharinfo(0) == $Record_XXmas_Name$[@rank])
+ goto L_Continue;
+ set @rank, @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Continue;
+ goto L_FindRank;
+
+L_Continue:
+ getinventorylist;
+ if (@inventorylist_count > 95) goto L_Full;
+ set XMAS2020, 0;
+ setarray @oldstock$, "PlushMouboo", "StickReinboo", "Doll", "LeatherBall", "SantaSnowGlobe", "SnowmanSnowGlobe", "RedOrnament", "YellowOrnament", "GreenOrnament", "AquaOrnament", "BlueOrnament", "MagentaOrnament";
+ getitem @oldstock$[rand(getarraysize(@oldstock$))], 1;
+ cleararray @oldstock$, "", getarraysize(@oldstock$);
+ if (@rank < 15)
+ goto L_Extra1;
+ close;
+
+// TOP 15 reward
+L_Extra1:
+ mes "[Santa Claus]";
+ mes "\"The official Christmas 2009 headgear!";
+ mes "Ho Ho Ho Merry Christmas!\"";
+ getitem "SnowGoggles", 1;
+ if (@rank < 10)
+ goto L_Extra2;
+ close;
+
+// TOP 10 reward
+L_Extra2:
+ setarray @oldstock$, "PlushMouboo", "StickReinboo", "Doll", "LeatherBall", "SantaSnowGlobe", "SnowmanSnowGlobe", "RedOrnament", "YellowOrnament", "GreenOrnament", "AquaOrnament", "BlueOrnament", "MagentaOrnament";
+ getitem @oldstock$[rand(getarraysize(@oldstock$))], 1;
+ cleararray @oldstock$, "", getarraysize(@oldstock$);
+ if (@rank < 5)
+ goto L_Extra3;
+ close;
+
+// TOP 5 reward
+L_Extra3:
+ setarray @oldstock$, "MoubooHead", "MushHat", "ChristmasElfHat", "FunkyHat", "ShroomHat", "ElfNightcap", "BowlerHat", "TopHat";
+ getitem @oldstock$[rand(getarraysize(@oldstock$))], 1;
+ cleararray @oldstock$, "", getarraysize(@oldstock$);
+ if (@rank < 2)
+ goto L_Extra4;
+ close;
+
+// TOP 2 reward
+L_Extra4:
+ setarray @oldstock$, "SantaBeardHat", "ChristmasTreeHat", "EyePatch", "AntlerHat";
+ getitem @oldstock$[rand(getarraysize(@oldstock$))], 1;
+ cleararray @oldstock$, "", getarraysize(@oldstock$);
+ close;
+
+}
+
+
+
+////////////////////////////////
+033-1,0,0,0|script|XXmas0331|32767
+{
+ end;
+
+OnHit2:
+ goto OnHit;
+
+OnHit:
+ // Not Christmas yet
+ if (!$@xmas_time)
+ end;
+ // Reward time
+ if ($@xmas_time == $@xmas_reward_time)
+ end;
+ // player must be created at least two weeks ago
+ if ((BaseLevel < 30) || (gettimetick(2) - TUT_var < 2*7*86400))
+ end;
+
+ // Not equipped to hunt Grinchboos
+ if (getequipid(equip_arrow) != 5260)
+ end;
+ if (getequipid(equip_hand1) != 5261)
+ end;
+
+ // Grinchboo slain
+ set XMAS2020, XMAS2020 + 1;
+ set $XMAS2020_BOO, $XMAS2020_BOO + 1;
+ set @loop, 0;
+ set @rank, 0;
+ goto L_MaybeInsertNext;
+
+L_MaybeInsertNext:
+ if (XMAS2020 > $Record_XXmas_Kills[@rank])
+ goto L_InsertScore;
+ // you already had a better score
+ if (strcharinfo(0) == $Record_XXmas_Name$[@rank])
+ goto L_Reward1;
+ set @rank, @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Reward1;
+ goto L_MaybeInsertNext;
+
+L_InsertScore:
+ set @loop, @rank;
+ goto L_FindLastScore;
+
+L_FindLastScore:
+ // comment this out to allow the player to be in the list more than once
+ // though actually, it might be better just to assume the list is full
+ if (strcharinfo(0) == $Record_XXmas_Name$[@loop])
+ goto L_MoveStuff;
+
+ set @loop, @loop + 1;
+ if (@loop == MAX_HIGH_SCORES)
+ goto L_MoveStuff;
+ goto L_FindLastScore;
+
+L_MoveStuff:
+ if (@loop == @rank)
+ goto L_FinallyInsertMe;
+ set $Record_XXmas_Kills[@loop], $Record_XXmas_Kills[@loop - 1];
+ set $Record_XXmas_Name$[@loop], $Record_XXmas_Name$[@loop - 1];
+ set $Record_XXmas_Date$[@loop], $Record_XXmas_Date$[@loop - 1];
+ set @loop, @loop - 1;
+ goto L_MoveStuff;
+
+L_FinallyInsertMe:
+ set $Record_XXmas_Kills[@rank], XMAS2020;
+ set $Record_XXmas_Name$[@rank], strcharinfo(0);
+ callfunc "time_stamp";
+ set $Record_XXmas_Date$[@rank], @ts_date$ + " " + @ts_time$;
+ set @ts_date$, "";
+ set @ts_time$, "";
+ goto L_Reward1;
+
+L_Reward1:
+ // Maybe we should tell you how many you purified?
+ if (XMAS2020 % 10 == 0 || XMAS2020 == 1)
+ goto L_Warning;
+ end;
+
+L_Warning:
+ message strcharinfo(0), "Grinchboos purified: "+XMAS2020;
+ end;
+
+OnTimer15000:
+ areamonster "033-1", 20, 20, 120, 110, "", 1162, 18, "XXmas0331::OnHit2";
+ // Only happens until :15, and every 15 minutes, for a total of 60 cycles.
+ if (gettime(2) > 15)
+ end;
+ initnpctimer;
+ end;
+
+OnClock1800:
+ initnpctimer;
+ end;
+
+OnClock1830:
+ killmonster "033-1", "XXmas0331::OnHit2";
+ stopnpctimer;
+ end;
+
+// Additional timers
+OnClock0000:
+ goto OnClock1800;
+OnClock0030:
+ goto OnClock1830;
+OnClock0600:
+ goto OnClock1800;
+OnClock0630:
+ goto OnClock1830;
+}
+
+046-1,0,0,0|script|XXmas0461|32767
+{
+ end;
+
+OnHit2:
+ goto OnHit;
+
+OnHit:
+ // Not Christmas yet
+ if (!$@xmas_time)
+ end;
+ // Reward time
+ if ($@xmas_time == $@xmas_reward_time)
+ end;
+ // player must be created at least two weeks ago
+ if ((BaseLevel < 30) || (gettimetick(2) - TUT_var < 2*7*86400))
+ end;
+
+ // Not equipped to hunt Grinchboos
+ if (getequipid(equip_arrow) != 5260)
+ end;
+ if (getequipid(equip_hand1) != 5261)
+ end;
+
+ // Grinchboo slain
+ set XMAS2020, XMAS2020 + 1;
+ set $XMAS2020_BOO, $XMAS2020_BOO + 1;
+ set @loop, 0;
+ set @rank, 0;
+ goto L_MaybeInsertNext;
+
+L_MaybeInsertNext:
+ if (XMAS2020 > $Record_XXmas_Kills[@rank])
+ goto L_InsertScore;
+ // you already had a better score
+ if (strcharinfo(0) == $Record_XXmas_Name$[@rank])
+ goto L_Reward1;
+ set @rank, @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Reward1;
+ goto L_MaybeInsertNext;
+
+L_InsertScore:
+ set @loop, @rank;
+ goto L_FindLastScore;
+
+L_FindLastScore:
+ // comment this out to allow the player to be in the list more than once
+ // though actually, it might be better just to assume the list is full
+ if (strcharinfo(0) == $Record_XXmas_Name$[@loop])
+ goto L_MoveStuff;
+
+ set @loop, @loop + 1;
+ if (@loop == MAX_HIGH_SCORES)
+ goto L_MoveStuff;
+ goto L_FindLastScore;
+
+L_MoveStuff:
+ if (@loop == @rank)
+ goto L_FinallyInsertMe;
+ set $Record_XXmas_Kills[@loop], $Record_XXmas_Kills[@loop - 1];
+ set $Record_XXmas_Name$[@loop], $Record_XXmas_Name$[@loop - 1];
+ set $Record_XXmas_Date$[@loop], $Record_XXmas_Date$[@loop - 1];
+ set @loop, @loop - 1;
+ goto L_MoveStuff;
+
+L_FinallyInsertMe:
+ set $Record_XXmas_Kills[@rank], XMAS2020;
+ set $Record_XXmas_Name$[@rank], strcharinfo(0);
+ callfunc "time_stamp";
+ set $Record_XXmas_Date$[@rank], @ts_date$ + " " + @ts_time$;
+ set @ts_date$, "";
+ set @ts_time$, "";
+ goto L_Reward1;
+
+L_Reward1:
+ // Maybe we should tell you how many you purified?
+ if (XMAS2020 % 10 == 0 || XMAS2020 == 1)
+ goto L_Warning;
+ end;
+
+L_Warning:
+ message strcharinfo(0), "Grinchboos purified: "+XMAS2020;
+ end;
+
+OnTimer15000:
+ areamonster "046-1", 20, 20, 160, 115, "", 1162, 18, "XXmas0461::OnHit2";
+ // Only happens until :15, and every 15 minutes, for a total of 60 cycles.
+ if (gettime(2) > 15)
+ end;
+ initnpctimer;
+ end;
+
+OnClock1800:
+ initnpctimer;
+ end;
+
+OnClock1830:
+ killmonster "046-1", "XXmas0461::OnHit2";
+ stopnpctimer;
+ end;
+
+// Additional timers
+OnClock0000:
+ goto OnClock1800;
+OnClock0030:
+ goto OnClock1830;
+OnClock0600:
+ goto OnClock1800;
+OnClock0630:
+ goto OnClock1830;
+}
+
+047-1,0,0,0|script|XXmas0471|32767
+{
+ end;
+
+OnHit2:
+ goto OnHit;
+
+OnHit:
+ // Not Christmas yet
+ if (!$@xmas_time)
+ end;
+ // Reward time
+ if ($@xmas_time == $@xmas_reward_time)
+ end;
+ // player must be created at least two weeks ago
+ if ((BaseLevel < 30) || (gettimetick(2) - TUT_var < 2*7*86400))
+ end;
+
+ // Not equipped to hunt Grinchboos
+ if (getequipid(equip_arrow) != 5260)
+ end;
+ if (getequipid(equip_hand1) != 5261)
+ end;
+
+ // Grinchboo slain
+ set XMAS2020, XMAS2020 + 1;
+ set $XMAS2020_BOO, $XMAS2020_BOO + 1;
+ set @loop, 0;
+ set @rank, 0;
+ goto L_MaybeInsertNext;
+
+L_MaybeInsertNext:
+ if (XMAS2020 > $Record_XXmas_Kills[@rank])
+ goto L_InsertScore;
+ // you already had a better score
+ if (strcharinfo(0) == $Record_XXmas_Name$[@rank])
+ goto L_Reward1;
+ set @rank, @rank + 1;
+ if (@rank == MAX_HIGH_SCORES)
+ goto L_Reward1;
+ goto L_MaybeInsertNext;
+
+L_InsertScore:
+ set @loop, @rank;
+ goto L_FindLastScore;
+
+L_FindLastScore:
+ // comment this out to allow the player to be in the list more than once
+ // though actually, it might be better just to assume the list is full
+ if (strcharinfo(0) == $Record_XXmas_Name$[@loop])
+ goto L_MoveStuff;
+
+ set @loop, @loop + 1;
+ if (@loop == MAX_HIGH_SCORES)
+ goto L_MoveStuff;
+ goto L_FindLastScore;
+
+L_MoveStuff:
+ if (@loop == @rank)
+ goto L_FinallyInsertMe;
+ set $Record_XXmas_Kills[@loop], $Record_XXmas_Kills[@loop - 1];
+ set $Record_XXmas_Name$[@loop], $Record_XXmas_Name$[@loop - 1];
+ set $Record_XXmas_Date$[@loop], $Record_XXmas_Date$[@loop - 1];
+ set @loop, @loop - 1;
+ goto L_MoveStuff;
+
+L_FinallyInsertMe:
+ set $Record_XXmas_Kills[@rank], XMAS2020;
+ set $Record_XXmas_Name$[@rank], strcharinfo(0);
+ callfunc "time_stamp";
+ set $Record_XXmas_Date$[@rank], @ts_date$ + " " + @ts_time$;
+ set @ts_date$, "";
+ set @ts_time$, "";
+ goto L_Reward1;
+
+L_Reward1:
+ // Maybe we should tell you how many you purified?
+ if (XMAS2020 % 10 == 0 || XMAS2020 == 1)
+ goto L_Warning;
+ end;
+
+L_Warning:
+ message strcharinfo(0), "Grinchboos purified: "+XMAS2020;
+ end;
+
+OnTimer15000:
+ areamonster "047-1", 20, 20, 200, 180, "", 1162, 48, "XXmas0471::OnHit2";
+ // Only happens until :15, and every 15 minutes, for a total of 60 cycles.
+ if (gettime(2) > 15)
+ end;
+ initnpctimer;
+ end;
+
+OnClock1800:
+ initnpctimer;
+ end;
+
+OnClock1830:
+ killmonster "047-1", "XXmas0471::OnHit2";
+ stopnpctimer;
+ end;
+
+// Additional timers
+OnClock0000:
+ goto OnClock1800;
+OnClock0030:
+ goto OnClock1830;
+OnClock0600:
+ goto OnClock1800;
+OnClock0630:
+ goto OnClock1830;
+}
+
diff --git a/world/map/npc/scripts.conf b/world/map/npc/scripts.conf
index f17cc922..f509ab29 100644
--- a/world/map/npc/scripts.conf
+++ b/world/map/npc/scripts.conf
@@ -75,6 +75,7 @@ npc: npc/annuals/xmas/helpers.txt
npc: npc/annuals/xmas/list.txt
npc: npc/annuals/xmas/reagents.txt
npc: npc/annuals/xmas/mobmanager.txt
+npc: npc/annuals/xmas/2020.txt
// Annual halloween
npc: npc/annuals/halloween/config.txt
npc: npc/annuals/halloween/debug.txt