From 8875cef958add4b361300c1ba108d8bf1d7995d7 Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Thu, 20 Jan 2022 02:46:20 +0000 Subject: Christmas 2021 Cleanup Contains several other bugfixes and improvements - The Mana World Team's Chairman - Fix Terogan Fight - Poppet's Battle Chamber (inactive) - `@setcells` and `@delcells` - Fix Graveyard Ghosts - Jande skill (inactive) --- conf/map/maps.conf | 7 + db/constants.conf | 11 +- db/map_index.txt | 29 ++-- db/pre-re/item_db.conf | 75 +++++++++- db/pre-re/mob_db.conf | 164 +++++++++++++++++++- db/pre-re/skill_db.conf | 19 +++ db/pre-re/skill_tree.conf | 1 + maps/pre-re/016-1.mcache | Bin 728 -> 727 bytes maps/pre-re/080-1.mcache | Bin 0 -> 1452 bytes maps/pre-re/080-3.mcache | Bin 0 -> 1522 bytes maps/pre-re/081-1.mcache | Bin 0 -> 619 bytes maps/pre-re/081-2.mcache | Bin 0 -> 1488 bytes maps/pre-re/081-3.mcache | Bin 0 -> 145 bytes maps/pre-re/082-2.mcache | Bin 0 -> 151 bytes maps/pre-re/082-3.mcache | Bin 0 -> 1082 bytes maps/pre-re/fermi.mcache | Bin 63 -> 71 bytes npc/009-1/_import.txt | 2 +- npc/009-1/event.txt | 160 -------------------- npc/009-1/kytty.txt | 160 ++++++++++++++++++++ npc/017-9/npcs.txt | 16 +- npc/027-8/general_terogan.txt | 10 +- npc/080-1/_import.txt | 2 + npc/080-3/_import.txt | 2 + npc/081-1/_import.txt | 4 + npc/081-1/_warps.txt | 4 + npc/081-1/extra.txt | 99 ++++++++++++ npc/081-2/_import.txt | 3 + npc/081-2/_warps.txt | 3 + npc/081-3/_import.txt | 2 + npc/082-2/_import.txt | 3 + npc/082-2/_warps.txt | 4 + npc/082-3/_import.txt | 4 + npc/082-3/_warps.txt | 3 + npc/082-3/poppet.txt | 266 +++++++++++++++++++++++++++++++++ npc/_import.txt | 7 + npc/annuals/tree_beard.txt | 6 +- npc/commands/kami.txt | 32 +++- npc/fermi/_import.txt | 1 + npc/fermi/_warps.txt | 1 + npc/fermi/chairman.txt | 73 +++++++++ npc/functions/clear_vars.txt | 12 +- npc/functions/ghost.txt | 14 +- npc/functions/global_event_handler.txt | 3 +- npc/functions/main.txt | 15 +- npc/functions/scoreboards.txt | 2 + npc/functions/vault.txt | 2 + npc/functions/weather.txt | 3 + npc/magic/config.txt | 1 - npc/magic/final.txt | 3 + npc/magic/level1-summon-maggots.txt | 11 ++ npc/magic/level1-transmutations.txt | 4 +- 51 files changed, 1036 insertions(+), 207 deletions(-) create mode 100644 maps/pre-re/080-1.mcache create mode 100644 maps/pre-re/080-3.mcache create mode 100644 maps/pre-re/081-1.mcache create mode 100644 maps/pre-re/081-2.mcache create mode 100644 maps/pre-re/081-3.mcache create mode 100644 maps/pre-re/082-2.mcache create mode 100644 maps/pre-re/082-3.mcache delete mode 100644 npc/009-1/event.txt create mode 100644 npc/009-1/kytty.txt create mode 100644 npc/080-1/_import.txt create mode 100644 npc/080-3/_import.txt create mode 100644 npc/081-1/_import.txt create mode 100644 npc/081-1/_warps.txt create mode 100644 npc/081-1/extra.txt create mode 100644 npc/081-2/_import.txt create mode 100644 npc/081-2/_warps.txt create mode 100644 npc/081-3/_import.txt create mode 100644 npc/082-2/_import.txt create mode 100644 npc/082-2/_warps.txt create mode 100644 npc/082-3/_import.txt create mode 100644 npc/082-3/_warps.txt create mode 100644 npc/082-3/poppet.txt create mode 100644 npc/fermi/chairman.txt diff --git a/conf/map/maps.conf b/conf/map/maps.conf index 68d2bd20..35f8979b 100644 --- a/conf/map/maps.conf +++ b/conf/map/maps.conf @@ -122,6 +122,13 @@ map_list: ( "069-2", "070-1", "070-3", + "080-1", + "080-3", + "081-1", + "081-2", + "081-3", + "082-2", + "082-3", "099-1", "099-2", "099-3", diff --git a/db/constants.conf b/db/constants.conf index 21bfd5f3..477a28ab 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -3185,9 +3185,18 @@ more than one separator can be used in a row (so 12_3___456 is illegal). NPC432:432 NPC433:433 NPC434:434 + NPC435:435 + NPC436:436 + NPC437:437 + NPC438:438 + NPC439:439 + NPC440:440 NPC32767:32767 // NPCs decently named + NPC_ALISSA: 438 + NPC_SANTA: 439 + NPC_GAK: 440 NPC_OFFSET_NO_SPRITE: 998 // Avatars (1000+) @@ -3214,7 +3223,7 @@ more than one separator can be used in a row (so 12_3___456 is illegal). NPC_UNUSED__MOBTOMB: 565 NPC_WARP_DEBUG: 722 NPC_UNUSED__FLAG: 722 - NPC_NO_SPRITE: 999 + NPC_NO_SPRITE: 400 NPC_HIDDEN: 32767 comment__: "Walk masks" diff --git a/db/map_index.txt b/db/map_index.txt index 354f427b..a7b53599 100644 --- a/db/map_index.txt +++ b/db/map_index.txt @@ -119,14 +119,21 @@ 069-2 119 070-1 120 070-3 121 -099-1 122 -099-2 123 -099-3 124 -099-4 125 -099-5 126 -099-6 127 -099-7 128 -099-8 129 -botcheck 130 -fermi 131 -sec_pri 132 +080-1 122 +080-3 123 +081-1 124 +081-2 125 +081-3 126 +082-2 127 +082-3 128 +099-1 129 +099-2 130 +099-3 131 +099-4 132 +099-5 133 +099-6 134 +099-7 135 +099-8 136 +botcheck 137 +fermi 138 +sec_pri 139 diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf index a037f0cd..1af0656f 100644 --- a/db/pre-re/item_db.conf +++ b/db/pre-re/item_db.conf @@ -1112,6 +1112,7 @@ item_db: ( Id5260: 1 } }, +/* Rings & Accessories */ { Id: 702 AegisName: "WeddingRing" @@ -1517,6 +1518,7 @@ item_db: ( bonus bHit, 25; "> }, +/* Boots */ { Id: 528 AegisName: "Boots" @@ -4793,6 +4795,54 @@ item_db: ( Refine: false ViewSprite: 5265 }, +{ + Id: 5276 + AegisName: "ThermalNapalm" + Name: "Thermal Napalm" + Type: "IT_ETC" + Buy: 9999 + Sell: 0 + Weight: 1 + ViewSprite: 5276 + Trade: { + partneroverride: true + notrade: false + nodrop: true + nogstorage: true + nomail: true + noauction: true + noselltonpc: true + } +}, +{ + Id: 5278 + AegisName: "XmasTicket" + Name: "Christmas Ticket" + Type: "IT_ETC" + Buy: 0 + Sell: 0 + Weight: 0 + ViewSprite: 5278 +}, +{ + Id: 5279 + AegisName: "Carrot" + Name: "Legendary Carrot" + Type: "IT_ETC" + Buy: 0 + Sell: 0 + Weight: 0 + ViewSprite: 5279 + Trade: { + notrade: true + nodrop: true + nogstorage: true + nomail: true + noauction: true + noselltonpc: true + } +}, +/* Chest Armor */ { Id: 523 AegisName: "LeatherShirt" @@ -11545,7 +11595,6 @@ item_db: ( bonus bDex, 1; bonus bLuk, 1; bonus bCritical, 10; - callfunc "DrugItem"; "> }, { @@ -12074,6 +12123,7 @@ item_db: ( bonus bMatkRate, -5; "> }, +/* Usable items */ { Id: 501 AegisName: "CactusDrink" @@ -13737,6 +13787,29 @@ item_db: ( callfunc "SK_Joyplim", false; "> }, +{ + Id: 5277 + AegisName: "XmasSeeds" + Name: "Christmas Seeds" + Type: "IT_USABLE" + Buy: 9999 + Sell: 0 + Weight: 1 + ViewSprite: 5277 + Trade: { + partneroverride: true + notrade: true + nodrop: true + nogstorage: true + nomail: true + noauction: true + noselltonpc: true + } + Script: <" + callfunc "X21_SEEDS"; + "> +}, +/* Legs Armor */ { Id: 586 AegisName: "CottonShorts" diff --git a/db/pre-re/mob_db.conf b/db/pre-re/mob_db.conf index 50798b57..107d1e26 100644 --- a/db/pre-re/mob_db.conf +++ b/db/pre-re/mob_db.conf @@ -3481,7 +3481,7 @@ mob_db: ( AttackMotion: 672 DamageMotion: 50 Drops: { - WumpusEgg: 10000 + WumpusEgg: 1 } }, { @@ -6569,7 +6569,7 @@ mob_db: ( AttackRange: 2 Attack: [40, 40] Def: 20 - Mdef: 40 + Mdef: 30 Stats: { Str: 30 Agi: 30 @@ -6606,7 +6606,7 @@ mob_db: ( AttackRange: 2 Attack: [40, 40] Def: 20 - Mdef: 40 + Mdef: 30 Stats: { Str: 30 Agi: 30 @@ -7002,4 +7002,162 @@ mob_db: ( CandyPumpkin: 1250 } }, +{ + Id: 1164 + SpriteName: "ChristmasTree" + Name: "Christmas Tree" + Lv: 40 + Hp: 12000 + Sp: 0 + Exp: 3647 + JExp: 392 + AttackRange: 2 + Attack: [40, 40] + Def: 20 + Mdef: 40 + Stats: { + Str: 30 + Agi: 30 + Vit: 30 + Int: 30 + Dex: 30 + Luk: 30 + } + ViewRange: 9 + ChaseRange: 10 + Size: 1 + Race: 0 + Element: (0, 1) + Mode: { + CanMove: false + CanAttack: true + ChangeTargetMelee: true + ChangeTargetChase: true + } + MoveSpeed: 190 + AttackDelay: 1500 + AttackMotion: 800 + DamageMotion: 800 +}, +{ + Id: 1165 + SpriteName: "ChristmasGift" + Name: "Christmas Gift" + Lv: 1 + Hp: 1 + Sp: 0 + Exp: 1 + JExp: 1 + AttackRange: 1 + Attack: [0, 0] + Def: 0 + Mdef: 5 + Stats: { + Str: 0 + Agi: 0 + Vit: 0 + Int: 0 + Dex: 0 + Luk: 0 + } + ViewRange: 9 + ChaseRange: 10 + Size: 1 + Race: 3 + Element: (2, 1) + MoveSpeed: 800 + AttackDelay: 800 + AttackMotion: 672 + DamageMotion: 480 + Drops: { + FourLeafClover: 5 + } +}, +{ + Id: 1166 + SpriteName: "Snowman" + Name: "Snowman" + Lv: 100 + Hp: 4200 + Sp: 0 + Exp: 2897 + JExp: 689 + AttackRange: 1 + Attack: [60, 80] + Def: 5 + Mdef: 20 + Stats: { + Str: 15 + Agi: 25 + Vit: 40 + Int: 15 + Dex: 75 + Luk: 30 + } + ViewRange: 8 + ChaseRange: 10 + Size: 1 + Race: 3 + Element: (0, 1) + Mode: { + CanMove: true + Aggressive: true + CanAttack: true + ChangeTargetMelee: true + ChangeTargetChase: true + } + MoveSpeed: 800 + AttackDelay: 1872 + AttackMotion: 672 + DamageMotion: 480 + Drops: { + IronPotion: 800 + ConcentrationPotion: 800 + Diamond: 50 + } +}, +{ + Id: 1167 + SpriteName: "SnowmanBoss" + Name: "Der Schneemann" + Lv: 100 + Hp: 35000 + Sp: 0 + Exp: 2897 + JExp: 689 + AttackRange: 3 + Attack: [60, 80] + Def: 20 + Mdef: 20 + Stats: { + Str: 15 + Agi: 15 + Vit: 10 + Int: 15 + Dex: 95 + Luk: 50 + } + ViewRange: 14 + ChaseRange: 16 + Size: 1 + Race: 3 + Element: (0, 1) + Mode: { + CanMove: true + Aggressive: true + CanAttack: true + ChangeTargetMelee: true + ChangeTargetChase: true + Boss: true + } + MoveSpeed: 700 + AttackDelay: 1672 + AttackMotion: 672 + DamageMotion: 480 + Drops: { + IronPotion: 800 + ConcentrationPotion: 800 + Diamond: 50 + } +}, ) diff --git a/db/pre-re/skill_db.conf b/db/pre-re/skill_db.conf index 98f0ab73..a553cd9e 100644 --- a/db/pre-re/skill_db.conf +++ b/db/pre-re/skill_db.conf @@ -39366,5 +39366,24 @@ skill_db: ( Quest: true } }, +{ + Id: 20057 + Name: "SKILL_JANDE" + Description: "Jande" + MaxLevel: 9 + SkillType: { + Self: true + } + SkillInfo: { + Quest: true + } + CoolDown: 60000 + Requirements: { + SPCost: 100 + Items: { + TinyManaElixir: 0 + } + } +}, ) diff --git a/db/pre-re/skill_tree.conf b/db/pre-re/skill_tree.conf index 1a009ef3..ba2202ec 100644 --- a/db/pre-re/skill_tree.conf +++ b/db/pre-re/skill_tree.conf @@ -43,6 +43,7 @@ Talpan: { //AC_SHOWER: 0 //MG_FIREWALL: 0 + SKILL_JANDE: 5 // Base Class SKILL_MAGIC: 0 diff --git a/maps/pre-re/016-1.mcache b/maps/pre-re/016-1.mcache index 4ccb5482..b0641a4d 100644 Binary files a/maps/pre-re/016-1.mcache and b/maps/pre-re/016-1.mcache differ diff --git a/maps/pre-re/080-1.mcache b/maps/pre-re/080-1.mcache new file mode 100644 index 00000000..09891164 Binary files /dev/null and b/maps/pre-re/080-1.mcache differ diff --git a/maps/pre-re/080-3.mcache b/maps/pre-re/080-3.mcache new file mode 100644 index 00000000..514e4730 Binary files /dev/null and b/maps/pre-re/080-3.mcache differ diff --git a/maps/pre-re/081-1.mcache b/maps/pre-re/081-1.mcache new file mode 100644 index 00000000..60f55155 Binary files /dev/null and b/maps/pre-re/081-1.mcache differ diff --git a/maps/pre-re/081-2.mcache b/maps/pre-re/081-2.mcache new file mode 100644 index 00000000..0e69fb70 Binary files /dev/null and b/maps/pre-re/081-2.mcache differ diff --git a/maps/pre-re/081-3.mcache b/maps/pre-re/081-3.mcache new file mode 100644 index 00000000..8250d273 Binary files /dev/null and b/maps/pre-re/081-3.mcache differ diff --git a/maps/pre-re/082-2.mcache b/maps/pre-re/082-2.mcache new file mode 100644 index 00000000..0108349e Binary files /dev/null and b/maps/pre-re/082-2.mcache differ diff --git a/maps/pre-re/082-3.mcache b/maps/pre-re/082-3.mcache new file mode 100644 index 00000000..e92774d9 Binary files /dev/null and b/maps/pre-re/082-3.mcache differ diff --git a/maps/pre-re/fermi.mcache b/maps/pre-re/fermi.mcache index 949c4a62..f536965d 100644 Binary files a/maps/pre-re/fermi.mcache and b/maps/pre-re/fermi.mcache differ diff --git a/npc/009-1/_import.txt b/npc/009-1/_import.txt index a414e690..3fabb91f 100644 --- a/npc/009-1/_import.txt +++ b/npc/009-1/_import.txt @@ -3,9 +3,9 @@ "npc/009-1/_mobs.txt", "npc/009-1/_warps.txt", "npc/009-1/constable.txt", -"npc/009-1/event.txt", "npc/009-1/guide.txt", "npc/009-1/jack.txt", +"npc/009-1/kytty.txt", "npc/009-1/mapflags.txt", "npc/009-1/milly.txt", "npc/009-1/old_man.txt", diff --git a/npc/009-1/event.txt b/npc/009-1/event.txt deleted file mode 100644 index edd39f34..00000000 --- a/npc/009-1/event.txt +++ /dev/null @@ -1,160 +0,0 @@ - -009-1,30,34,0 script Kytty NPC430,{ - // Core Variable Switcher - if (gettime(5) >= 13 && gettime(5) <= 15) goto L_Quest; - if (gettime(5) > 15 && strcharinfo(0) == "kytty" && $VALENTINE) goto L_StopEvent; - if (gettime(5) > 15 && #VALENTINE) goto L_ClaimRewards; - if (gettime(5) > 15 && GM >= GM_DEV && $VALENTINE) goto L_ReadOnly; - mes "[Kytty]"; - mes "\"Uh? Hello there. I am looking for my husband to stare at him, don't mind me.\""; - close; - -L_Quest: - if (#VALENTINE) goto L_Running; - // Core dialog - mes "[Kytty]"; - mes "\"Hey, "+strcharinfo(0)+"! I have a problem and perhaps you can help me!\""; - next; - menu - "Sure, m'am... What should I do?", L_Continue, - "Who, me? Sorry, wrong person.", L_close; - -L_Continue: - mes ""; - mes "[Kytty]"; - mes "\"I feel like my husband is staring at other people, and that is ABSURD! He should only stare at kytty!\" %%e"; - next; - mes "[Kytty]"; - mes "\"So kytty came up with a great plan - kytty will brew some [@@5263|Love Potions@@] so hubby only stares at me!\""; - next; - mes "[Kytty]"; - mes "\"I have most ingredients, but a few are still missing and I was hoping you could help me out:\""; - mes "- 20x Cherry"; - mes "- 20x Chocolate Bar"; - mes "- 1x Diamond"; - mes "- 1x Chocolate Cake"; - next; - mes "[Kytty]"; - mes "\"Uh? Of course I won't put everything in the potion! Wyara will sell me some other ingredients for the diamond, and... Hey, stop making questions!\""; - next; - mes "[Kytty]"; - mes "\"Do you have everything I've asked for?\""; - menu - "I do.", L_Check, - "I don't.", L_close; - -L_Check: - mes ""; - getinventorylist; - if (@inventorylist_count == 100) goto L_Full; - - if (countitem("ChocolateBar") < 20) goto L_NotEnough; - if (countitem("Cherry") < 20) goto L_NotEnough; - if (countitem("Diamond") < 1) goto L_NotEnough; - if (countitem("ChocolateCake") < 1) goto L_NotEnough; - - delitem "ChocolateBar", 20; - delitem "Cherry", 20; - delitem "Diamond", 1; - delitem "ChocolateCake", 1; - getitem "LovePotion", 1; - getexp 50000, 0; - #VALENTINE = 1; - mes "[Kytty]"; - mes "\"With this, he will totally stare only at me now! Thanks for the help. Here, you can have an extra, but you are not cute like him so don't blame me if it don't work or present... side effects.\""; - next; - mes "[Kytty]"; - mes "\"Also, I love chocolate. I'll give you a spare potion every fifty [@@509|@@] you bring me.\""; - close; - -L_NotEnough: - mes ""; - mes "[Kytty]"; - mes "\"Don't try to troll me, I know you don't have everything.\""; - close; - -L_Full: - mes "[Kytty]"; - mes "\"Free up some space in your inventory, please.\""; - close; - -L_Running: - getinventorylist; - if (@inventorylist_count == 100) goto L_Full; - mes "[Kytty]"; - mes "\"Have you brought me more chocolate? I am starving with only "+$VALENTINE+" [@@509|@@]. You ##Bonly##b gave me "+(#VALENTINE-1)+" bar(s), after all!\""; - next; - menu - "Not yet, but I'll be back.", L_close, - "Sure thing miss, take all you want!", L_Collect; - -L_Collect: - mes ""; - @choco = countitem("ChocolateBar"); - @bonus = (#VALENTINE%50)+@choco; - @potio = @bonus/50; - //debugmes "Choco "+@choco+" Potio "+@potio+" Bonus "+@bonus+"."; - @bonus = 0; - delitem "ChocolateBar", @choco; - #VALENTINE = #VALENTINE+@choco; - $VALENTINE = $VALENTINE+@choco; - getexp @choco*15, @choco*7; - if (@potio) goto L_BonusPots; - mes "[Kytty]"; - mes "\"Yummy! Thanks for your support. Tell me if you have more chocolate!\""; - close; - -L_BonusPots: - getitem "LovePotion", @potio; - mes "[Kytty]"; - mes "\"Here are some love potions for you. But as I said - I'm not sure if you are cute enough for them.\""; - close; - -L_StopEvent: - mes "[Kytty]"; - mes "\"Hey other me! I still have "+$VALENTINE+" chocolate bars, but I'm a NPC and cannot eat them, so here they are!\""; - next; - @choco = min($VALENTINE, 30000); - getitem "ChocolateBar", @choco; - $VALENTINE = $VALENTINE-@choco; - mes "[Kytty]"; - mes "\"Also: Jesusalva asked me to wish you a happy Valentine Day.\""; - close; - -L_ReadOnly: - mes "[Kytty]"; - mes "\"I'm still holding on "+$VALENTINE+" chocolate bars, but I'll eat them soon!\""; - close; - -L_ClaimRewards: - if(!#VALENTINE) goto L_close; - getinventorylist; - if (@inventorylist_count > 95) goto L_Full; - setarray @oldstock$, "GrassFedTofu", "Honey", "VeganWater", "FairTradeSoil", "LactoseFreeAcorn", "RawAir", "FreeRangeMoss"; - getitem @oldstock$[rand(getarraysize(@oldstock$))], 1; - cleararray @oldstock$, "", getarraysize(@oldstock$); - //getitem "BlueWolfHelmet", 1; // FIXME? - getitem "ShockSweet", rand(4, 7); - getitem "DarkConcentrationPotion", rand(2, 5); - getexp 1+(#VALENTINE*BaseLevel)/2, 0; - #VALENTINE = 0; - close; - -L_close: - close; - -L_Off: - disablenpc "Kytty"; - end; - -L_On: - enablenpc "Kytty"; - end; - -OnInit: - if (gettime(6) == 2) goto L_On; // NPC shows only in February - goto L_Off; - -OnClock0000: - goto OnInit; -} diff --git a/npc/009-1/kytty.txt b/npc/009-1/kytty.txt new file mode 100644 index 00000000..edd39f34 --- /dev/null +++ b/npc/009-1/kytty.txt @@ -0,0 +1,160 @@ + +009-1,30,34,0 script Kytty NPC430,{ + // Core Variable Switcher + if (gettime(5) >= 13 && gettime(5) <= 15) goto L_Quest; + if (gettime(5) > 15 && strcharinfo(0) == "kytty" && $VALENTINE) goto L_StopEvent; + if (gettime(5) > 15 && #VALENTINE) goto L_ClaimRewards; + if (gettime(5) > 15 && GM >= GM_DEV && $VALENTINE) goto L_ReadOnly; + mes "[Kytty]"; + mes "\"Uh? Hello there. I am looking for my husband to stare at him, don't mind me.\""; + close; + +L_Quest: + if (#VALENTINE) goto L_Running; + // Core dialog + mes "[Kytty]"; + mes "\"Hey, "+strcharinfo(0)+"! I have a problem and perhaps you can help me!\""; + next; + menu + "Sure, m'am... What should I do?", L_Continue, + "Who, me? Sorry, wrong person.", L_close; + +L_Continue: + mes ""; + mes "[Kytty]"; + mes "\"I feel like my husband is staring at other people, and that is ABSURD! He should only stare at kytty!\" %%e"; + next; + mes "[Kytty]"; + mes "\"So kytty came up with a great plan - kytty will brew some [@@5263|Love Potions@@] so hubby only stares at me!\""; + next; + mes "[Kytty]"; + mes "\"I have most ingredients, but a few are still missing and I was hoping you could help me out:\""; + mes "- 20x Cherry"; + mes "- 20x Chocolate Bar"; + mes "- 1x Diamond"; + mes "- 1x Chocolate Cake"; + next; + mes "[Kytty]"; + mes "\"Uh? Of course I won't put everything in the potion! Wyara will sell me some other ingredients for the diamond, and... Hey, stop making questions!\""; + next; + mes "[Kytty]"; + mes "\"Do you have everything I've asked for?\""; + menu + "I do.", L_Check, + "I don't.", L_close; + +L_Check: + mes ""; + getinventorylist; + if (@inventorylist_count == 100) goto L_Full; + + if (countitem("ChocolateBar") < 20) goto L_NotEnough; + if (countitem("Cherry") < 20) goto L_NotEnough; + if (countitem("Diamond") < 1) goto L_NotEnough; + if (countitem("ChocolateCake") < 1) goto L_NotEnough; + + delitem "ChocolateBar", 20; + delitem "Cherry", 20; + delitem "Diamond", 1; + delitem "ChocolateCake", 1; + getitem "LovePotion", 1; + getexp 50000, 0; + #VALENTINE = 1; + mes "[Kytty]"; + mes "\"With this, he will totally stare only at me now! Thanks for the help. Here, you can have an extra, but you are not cute like him so don't blame me if it don't work or present... side effects.\""; + next; + mes "[Kytty]"; + mes "\"Also, I love chocolate. I'll give you a spare potion every fifty [@@509|@@] you bring me.\""; + close; + +L_NotEnough: + mes ""; + mes "[Kytty]"; + mes "\"Don't try to troll me, I know you don't have everything.\""; + close; + +L_Full: + mes "[Kytty]"; + mes "\"Free up some space in your inventory, please.\""; + close; + +L_Running: + getinventorylist; + if (@inventorylist_count == 100) goto L_Full; + mes "[Kytty]"; + mes "\"Have you brought me more chocolate? I am starving with only "+$VALENTINE+" [@@509|@@]. You ##Bonly##b gave me "+(#VALENTINE-1)+" bar(s), after all!\""; + next; + menu + "Not yet, but I'll be back.", L_close, + "Sure thing miss, take all you want!", L_Collect; + +L_Collect: + mes ""; + @choco = countitem("ChocolateBar"); + @bonus = (#VALENTINE%50)+@choco; + @potio = @bonus/50; + //debugmes "Choco "+@choco+" Potio "+@potio+" Bonus "+@bonus+"."; + @bonus = 0; + delitem "ChocolateBar", @choco; + #VALENTINE = #VALENTINE+@choco; + $VALENTINE = $VALENTINE+@choco; + getexp @choco*15, @choco*7; + if (@potio) goto L_BonusPots; + mes "[Kytty]"; + mes "\"Yummy! Thanks for your support. Tell me if you have more chocolate!\""; + close; + +L_BonusPots: + getitem "LovePotion", @potio; + mes "[Kytty]"; + mes "\"Here are some love potions for you. But as I said - I'm not sure if you are cute enough for them.\""; + close; + +L_StopEvent: + mes "[Kytty]"; + mes "\"Hey other me! I still have "+$VALENTINE+" chocolate bars, but I'm a NPC and cannot eat them, so here they are!\""; + next; + @choco = min($VALENTINE, 30000); + getitem "ChocolateBar", @choco; + $VALENTINE = $VALENTINE-@choco; + mes "[Kytty]"; + mes "\"Also: Jesusalva asked me to wish you a happy Valentine Day.\""; + close; + +L_ReadOnly: + mes "[Kytty]"; + mes "\"I'm still holding on "+$VALENTINE+" chocolate bars, but I'll eat them soon!\""; + close; + +L_ClaimRewards: + if(!#VALENTINE) goto L_close; + getinventorylist; + if (@inventorylist_count > 95) goto L_Full; + setarray @oldstock$, "GrassFedTofu", "Honey", "VeganWater", "FairTradeSoil", "LactoseFreeAcorn", "RawAir", "FreeRangeMoss"; + getitem @oldstock$[rand(getarraysize(@oldstock$))], 1; + cleararray @oldstock$, "", getarraysize(@oldstock$); + //getitem "BlueWolfHelmet", 1; // FIXME? + getitem "ShockSweet", rand(4, 7); + getitem "DarkConcentrationPotion", rand(2, 5); + getexp 1+(#VALENTINE*BaseLevel)/2, 0; + #VALENTINE = 0; + close; + +L_close: + close; + +L_Off: + disablenpc "Kytty"; + end; + +L_On: + enablenpc "Kytty"; + end; + +OnInit: + if (gettime(6) == 2) goto L_On; // NPC shows only in February + goto L_Off; + +OnClock0000: + goto OnInit; +} diff --git a/npc/017-9/npcs.txt b/npc/017-9/npcs.txt index 9b9c2a1d..98bafae6 100644 --- a/npc/017-9/npcs.txt +++ b/npc/017-9/npcs.txt @@ -1,34 +1,40 @@ // Contains the secret doors for staff room -009-1,42,43,0 script #SecretDoor NPC32767,0,0,{ +009-1,42,43,0 script #SecretDoor NPC_HIDDEN,0,0,{ + if ($@TMWT_MEETING) { + if (is_trusted()) + cwarp "fermi", 29, 20; + else + cwarp "fermi", 21, 20; + } if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end; //gmlog "@warp 017-9"; warp "017-9", 36, 26; end; } -020-1,60,76,0 script #SecretDoor2 NPC32767,0,0,{ +020-1,60,76,0 script #SecretDoor2 NPC_HIDDEN,0,0,{ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end; gmlog "@warp 017-9"; warp "017-9", 39, 25; end; } -001-1,54,118,0 script #SecretDoor3 NPC32767,0,0,{ +001-1,54,118,0 script #SecretDoor3 NPC_HIDDEN,0,0,{ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end; gmlog "@warp 017-9"; warp "017-9", 31, 25; end; } -027-2,46,111,0 script #SecretDoor4 NPC32767,0,0,{ +027-2,46,111,0 script #SecretDoor4 NPC_HIDDEN,0,0,{ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end; gmlog "@warp 017-9"; warp "017-9", 41, 25; end; } -029-1,34,96,0 script #SecretDoor5 NPC32767,0,0,{ +029-1,34,96,0 script #SecretDoor5 NPC_HIDDEN,0,0,{ if (GM < MAP_LOUNGE && GM < G_SYSOP && !debug) end; gmlog "@warp 017-9"; warp "017-9", 33, 25; diff --git a/npc/027-8/general_terogan.txt b/npc/027-8/general_terogan.txt index 1038e4fe..6886ee46 100644 --- a/npc/027-8/general_terogan.txt +++ b/npc/027-8/general_terogan.txt @@ -146,15 +146,15 @@ L_CryptLogic: if ($@CRYPT_FIGHT3_PLAYER_COUNT <= 0) goto L_CleanUpLosers; if (getareausers("027-8", 20, 39, 35, 60, 1) < 1) goto L_Failure; if (getareausers("027-8", 43, 39, 58, 60, 1) < 1) goto L_Failure; - set $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER, $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER + 5; // Advance 5 seconds + set $@CRYPT_FIGHT3_ROUND_TIMER, $@CRYPT_FIGHT3_ROUND_TIMER + 5; // Advance 5 seconds if (mobcount("027-8", "General Terogan#Main::OnPetDeath") <= 0) goto L_NextWave; - if ($@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER + $@CRYPT_FIGHT3_ROUND_PEN >= 120) + if ($@CRYPT_FIGHT3_ROUND_TIMER + $@CRYPT_FIGHT3_ROUND_PEN >= 120) goto L_NextWave; goto L_Return_1; L_NextWave: - $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0; + $@CRYPT_FIGHT3_ROUND_TIMER = 0; $@CRYPT_FIGHT3_WAVE = $@CRYPT_FIGHT3_WAVE + 1; if ( ($@CRYPT_FIGHT3_WAVE > 10) && ($@CRYPT_FIGHT3_SUMMONS_COUNT == 0) ) goto L_CleanUp; @@ -231,7 +231,7 @@ L_CleanUpLosers: $@CRYPT_FIGHT3 = 0; $@CRYPT_FIGHT3_PLAYER_COUNT = 0; $@CRYPT_FIGHT3_WAVE = 0; - $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0; + $@CRYPT_FIGHT3_ROUND_TIMER = 0; $@CRYPT_FIGHT3_SUMMONS_COUNT = 0; $@CRYPT_FIGHT3_ROUND_PEN = 0; $@CRYPT_FIGHT3_SUMMONS_NUMBER = 0; @@ -247,7 +247,7 @@ L_CleanUp: $@CRYPT_FIGHT3 = 0; $@CRYPT_FIGHT3_PLAYER_COUNT = 0; $@CRYPT_FIGHT3_WAVE = 0; - $@CRYPT_FIGHT3_SUMMONS_ROUND_TIMER = 0; + $@CRYPT_FIGHT3_ROUND_TIMER = 0; $@CRYPT_FIGHT3_SUMMONS_COUNT = 0; $@CRYPT_FIGHT3_ROUND_PEN = 0; $@CRYPT_FIGHT3_SUMMONS_NUMBER = 0; diff --git a/npc/080-1/_import.txt b/npc/080-1/_import.txt new file mode 100644 index 00000000..02e6220e --- /dev/null +++ b/npc/080-1/_import.txt @@ -0,0 +1,2 @@ +// Map 080-1: Mysterious Glade +// This file is generated automatically. All manually added changes will be removed when running the Converter. diff --git a/npc/080-3/_import.txt b/npc/080-3/_import.txt new file mode 100644 index 00000000..0eab445c --- /dev/null +++ b/npc/080-3/_import.txt @@ -0,0 +1,2 @@ +// Map 080-3: Forgotten Glade +// This file is generated automatically. All manually added changes will be removed when running the Converter. diff --git a/npc/081-1/_import.txt b/npc/081-1/_import.txt new file mode 100644 index 00000000..863a8e60 --- /dev/null +++ b/npc/081-1/_import.txt @@ -0,0 +1,4 @@ +// Map 081-1: Aethyr +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/081-1/_warps.txt", +"npc/081-1/extra.txt", diff --git a/npc/081-1/_warps.txt b/npc/081-1/_warps.txt new file mode 100644 index 00000000..ef049ca9 --- /dev/null +++ b/npc/081-1/_warps.txt @@ -0,0 +1,4 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 081-1: Aethyr warps +081-1,58,104,0 warp #081-1_58_104 0,0,020-1,84,75 +081-1,44,89,0 warp #081-1_44_89 0,0,082-2,88,25 diff --git a/npc/081-1/extra.txt b/npc/081-1/extra.txt new file mode 100644 index 00000000..7f6b489e --- /dev/null +++ b/npc/081-1/extra.txt @@ -0,0 +1,99 @@ +// TMW Script. +// Author: +// Jesusalva +// Notes: +// Christmas 2021 - Extra NPCs & Code Injection + +081-1,82,68,0 script Nut Cracker NPC330,{ + @npcname$ = "Nut Cracker"; + Banker(); + close; + +OnInit: + .distance=5; + end; +} + +081-1,69,82,0 script Ol' Reset NPC329,{ + @npcname$ = "Ol' Reset"; + StatReset(); + close; + +OnInit: + .distance=5; + end; +} + +081-1,57,49,0 script Soul Menhir#Aethyr NPC346,{ + @map$ = "081-1"; + setarray @Xs, 54, 54, 54, 55, 55, 55, 56; + setarray @Ys, 52, 53, 54, 52, 53, 54, 54; + @x = 0; + @y = 0; + callfunc "SoulMenhir"; + @map$ = ""; + cleararray @Xs[0], 0, 7; + cleararray @Ys[0], 0, 7; + @x = 0; + @y = 0; + close; +OnInit: + .distance=5; + end; +} + +081-1,60,91,0 script TMW Evolved Guide NPC356,{ + mesn; + mes "\""+l("Hello, and welcome to The Mana World: Evolved."); + mes l("This is the server which will eventually take over TMW Legacy.")+"\""; + next; + mesn; + mesq l("A few things are different here, you can read [@@https://wiki.themanaworld.org/index.php/Legacy:TMW_Evolved|on the wiki@@] some of the major differences."); + select + l("Thanks."), + l("Learn more"); + mes ""; + if (@menu == 1) { closeclientdialog; close; } + mesn; + mesq l("For starters, magic skills are on F5 tab and no longer can be cast from chat. Drag'n'Drop them to the shortcut bars to use. You can also level them up if you have the points."); + next; + mesn; + mesq l("To use magic, first select the target, and use the skill to unleash the magical attack. The next attack will only come when you use the skill again; unfortunately, it is NOT automatic."); + next; + mesn; + mesq l("If you have unspent status points, you can level them up to 100. Focus skills work sightly different than on TMW Legacy. YOU NEED TO REFOCUS them!"); + next; + mesn; + mesq l("Your weight limit is a bit larger, but if it reaches 90% you will no longer be able to attack, so be careful."); + next; + mesn; + mesq l("When you die, you'll be taken to the Soul Menhir you touched last. There is a Soul Menhir nearby, I advise touching it as soon as possible."); + next; + mesn; + mesq l("Experience acquired here will be carried over to TMW Legacy once the event ends, as well as the event rewards. You can exchange the %s with GM Santa, the GM Team will be publishing the rules in turning these in level ups or ultra rare hats shortly.", getitemlink(Carrot)); + next; + mesn; + mesq l("The \"#world\" chat tab is bridged to #themanaworld-dev on IRC and Discord, you can quickly get in touch with the whole community and report bugs using it."); + next; + mesn; + mesq l("Also, you may wish to use \"@resync\" or \"@resyncall\" if the monsters appear to vanish. That's mostly all, thanks for playing The Mana World. Contact staff if you need further assistance!"); + close; + +OnInit: + .distance=5; + .sex = G_FEMALE; + end; +} + +081-1,47,74,0 script Christmas Assistant NPC328,{ + mesc l("They seem to be reminiscing Christmas 2021 event. Suddenly, they looks at you and shouts:"); + mes ""; + mesn; + mesq l("Come back again!"); + close; + +OnInit: + .distance=5; + end; +} + diff --git a/npc/081-2/_import.txt b/npc/081-2/_import.txt new file mode 100644 index 00000000..5ab49567 --- /dev/null +++ b/npc/081-2/_import.txt @@ -0,0 +1,3 @@ +// Map 081-2: Northern Lights +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/081-2/_warps.txt", diff --git a/npc/081-2/_warps.txt b/npc/081-2/_warps.txt new file mode 100644 index 00000000..22644e17 --- /dev/null +++ b/npc/081-2/_warps.txt @@ -0,0 +1,3 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 081-2: Northern Lights warps +081-2,90,299,0 warp #081-2_90_299 0,0,081-1,68,31 diff --git a/npc/081-3/_import.txt b/npc/081-3/_import.txt new file mode 100644 index 00000000..77c1a286 --- /dev/null +++ b/npc/081-3/_import.txt @@ -0,0 +1,2 @@ +// Map 081-3: Existential Frontier +// This file is generated automatically. All manually added changes will be removed when running the Converter. diff --git a/npc/082-2/_import.txt b/npc/082-2/_import.txt new file mode 100644 index 00000000..6284508f --- /dev/null +++ b/npc/082-2/_import.txt @@ -0,0 +1,3 @@ +// Map 082-2: Porthos - Frontier +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/082-2/_warps.txt", diff --git a/npc/082-2/_warps.txt b/npc/082-2/_warps.txt new file mode 100644 index 00000000..5ccaa5af --- /dev/null +++ b/npc/082-2/_warps.txt @@ -0,0 +1,4 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 082-2: Porthos - Frontier warps +082-2,88,26,0 warp #082-2_88_26 0,0,081-1,44,90 +082-2,28,16,0 warp #082-2_28_16 0,0,082-3,97,94 diff --git a/npc/082-3/_import.txt b/npc/082-3/_import.txt new file mode 100644 index 00000000..c19b648d --- /dev/null +++ b/npc/082-3/_import.txt @@ -0,0 +1,4 @@ +// Map 082-3: Aether Caves +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/082-3/_warps.txt", +"npc/082-3/poppet.txt", diff --git a/npc/082-3/_warps.txt b/npc/082-3/_warps.txt new file mode 100644 index 00000000..9ca06476 --- /dev/null +++ b/npc/082-3/_warps.txt @@ -0,0 +1,3 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 082-3: Aether Caves warps +082-3,111,34,0 warp #082-3_111_34 0,0,082-2,28,17 diff --git a/npc/082-3/poppet.txt b/npc/082-3/poppet.txt new file mode 100644 index 00000000..0583eb03 --- /dev/null +++ b/npc/082-3/poppet.txt @@ -0,0 +1,266 @@ +// TMW Script. +// Author: +// Jesusalva +// Notes: +// Christmas 2021 - Poppet's Realm DLC + +082-3,99,86,0 script Poppet NPC190,{ + function spawn; + if (mobcount("082-3", "all")) { + if (.tick + 300 < gettimetick(2)) + npctalk3 l("If you cannot handle it, maybe try asking staff for help...?"); + npctalk3 l("Monsters remaining: %s", fnum(mobcount("082-3", "all"))); + end; + } + mesn; + mesq l("Uh, how did you get here? Anyway, welcome to my realm."); + do + { + select + l("Thanks, poppy."), + l("I'm bored."), + l("Uh... Poppet's Realm? What's that?"), + l("Through a weird corridor. How do I leave?"); + mes ""; + switch (@menu) { + case 1: + close; + case 2: + goto L_Summon; + case 3: + mesn; + mesq l("You see, all of the most powerful beings of The Mana World can create their own realm, a place for their leisure."); + next; + mesn; + mesq l("But in this side of the æther, where existence itself is challenged, time is hardly important."); + next; + mesn; + mesq l("So my realm doesn't exist yet. Or perhaps it existed in the past, and is no longer the case. Whatever the case be, you're here, and you're welcome."); + next; + break; + case 4: + mesn; + mesq l("Hm, perhaps a wanderer of the Mirror Lake? I've heard rumors of a place which connected anything to everything dubbed like that."); + next; + mesn; + mesq l("...North of here is an exit. It is not connected to anywhere, just an infinite, never ending corridor, but if you ##Bcame##b from anywhere, it might as well work."); + next; + break; + } + } while (true); + +L_Summon: + if (.tick >= gettimetick(2)) { + mesn; + mesq l("I'm still recovering myself, please wait %s before trying again.", FuzzyTime(.tick)); + close; + } + mesn; + mesq l("I can summon some creatures for you, and all of them drop %s at a decent rate.", getitemlink(XmasTicket)); + next; + mesn; + mesq l("But I can't keep doing that too much, and it is dangerous if you're alone, so make sure you have company. It is always more fun in groups."); + if (getmapusers("082-3") < 3 && !is_evtc()) { + mesc l("There must be at least %d players to start.", 3), 1; + close; + } + next; + mesc b(l("Average monsters per mode:")); + mesc l("Easy: 145 mobs × 5 waves = 725 total"); + mesc l("Normal: 189 mobs × 5 waves = 945 total"); + mesc l("Hard: 280 mobs × 5 waves = 1,400 total"); + mesc l("Polish: 302 mobs × 5 waves = 1,510 total"); + if (is_evtc()) + mesc l("Nuclear: 270 mobs × 5 waves = 1,350 super strong mobs"); + else + mesc l("???: Available from Dec 23rd onwards"); + mes ""; + mesq l("If you select a mode you cannot manage, please contact staff; I'll not clean the room, no matter whatever happens."); + select + l("Hm, nevermind."), + l("Begin easy mode [10 min]"), + l("Begin normal mode [15 min]"), + l("Begin hard mode [20 min]"), + l("Begin Polish Warmachine mode [30 min]"), + rif(is_evtc(), l("Begin Nuclear Winter mode [45 min]")); + mes ""; + if (.tick >= gettimetick(2)) { closeclientdialog; close; } + switch (@menu) { + case 2: + .diff = 1; + .tick = gettimetick(2) + 600; + monster("082-3", 52, 48, "Alpha", UndeadWitch, 1); + monster("082-3", 155, 40, "Beta", UndeadWitch, 1); + monster("082-3", 45, 155, "Gamma", UndeadWitch, 1); + monster("082-3", 157, 157, "Delta", UndeadWitch, 1); + monster("082-3", 95, 85, "Omega", ScytheMob, 1); + break; + case 3: + .diff = 2; + .tick = gettimetick(2) + 900; + monster("082-3", 52, 48, "Alpha", Yeti, 1); + monster("082-3", 155, 40, "Beta", Yeti, 1); + monster("082-3", 45, 155, "Gamma", Yeti, 1); + monster("082-3", 157, 157, "Delta", Yeti, 1); + monster("082-3", 95, 85, "Omega", Yeti, 1); + break; + case 4: + .diff = 3; + .tick = gettimetick(2) + 1500; + monster("082-3", 52, 48, "Alpha", SnowmanBoss, 1); + monster("082-3", 155, 40, "Beta", SnowmanBoss, 1); + monster("082-3", 45, 155, "Gamma", SnowmanBoss, 1); + monster("082-3", 157, 157, "Delta", SnowmanBoss, 1); + monster("082-3", 95, 85, "Omega", SnowmanBoss, 1); + break; + case 5: + .diff = 4; + .tick = gettimetick(2) + 1800; + monster("082-3", 52, 48, "Alpha", Luvia, 1); + monster("082-3", 155, 40, "Beta", Luvia, 1); + monster("082-3", 45, 155, "Gamma", Luvia, 1); + monster("082-3", 157, 157, "Delta", Luvia, 1); + monster("082-3", 95, 85, "Omega", KageGolem, 1); // SUSAN? Tormenta? + break; + case 6: + .diff = 5; + .tick = gettimetick(2) + 2700; + monster("082-3", 52, 48, "Alpha", Reaper, 1); + monster("082-3", 155, 40, "Beta", Tormenta, 1); + monster("082-3", 45, 155, "Gamma", Luvia, 1); + monster("082-3", 157, 157, "Delta", Dragon, 1); + monster("082-3", 95, 85, "Omega", SUSAN, 1); + break; + } + $@X21_POPPYDIFF = .diff; + initnpctimer; + closeclientdialog; + close; + +OnTick: + if (ispcdead()) end; + sc_start SC_INCFLEERATE, 30000, 50; + sc_start SC_INCHITRATE, 30000, 50; + sc_start SC_ATTHASTE_POTION3, 30000, 10; + getitem XmasTicket, 1; + end; + +OnTimer600000: // 10.0 min (final) + mapannounce "082-3", "Warning : ##1##BFINAL WAVE##b##0", 0; + stopnpctimer; +OnTimer450000: // 7.5 min +OnTimer300000: // 5.0 min +OnTimer150000: // 2.5 min + maptimer("082-3", 10, "Poppet::OnTick"); +OnTimer1000: // Initial wave + /* Summon next wave */ + .@msg$ = any("I'm having fun, what about you?", + "I'm spawning more monsters, watch out.", + "Lemme see if I remember how to summon more monsters...", + "Here, more practice dummies, have fun.", + "I am no longer able to rotate fast, so I'm summoning again.", + "This won't nuke ManaMarket but should get you running.", + "If you don't like this, try migrating with the Mouboos.", + "I always miss the summons, in every sense possible...", + "Are you related to the monsters I'm about to summon?", + "If you don't want to die, start running.", + "It's never too early to eat frozen pizza. Or to kill new mobs.", + "Hocus would hide now, I'm spawning monsters.", + "I have no motivation for nothing but spawning again.", + "Welcome back from your exile, my summoned monsters.", + "These new monsters won't drop cookies, but maybe tickets.", + "Wushin wanted to paint all my monsters in pink and purle.", + "Watching you killing my spawns has certainly been amusing so far.", + "I should add new evil dumpling mobs to development list.", + "I am liberal about what I spawn. Consider this fact canon.", + "I'm taking new mobs from the locker room, gimme a few.", + "Let's make The Mana World great again: Bringing more mobs."); + mapannounce "082-3", "Poppet : "+.@msg$, 0; + sleep(500); // Give you enough time to RUN AWAY + switch (.diff) { + case 1: // Easy (145 mobs) × 5 waves = 725 mobs + spawn(Bandit, 7); + spawn(CrotcherScorpion, 7); + spawn(Archant, 5); + spawn(Moggun, 3); + spawn(BlackScorpion, 3); + spawn(Snake, 2); + break; + case 2: // Normal (189 mobs) × 5 waves = 945 mobs + spawn(FeyElement, 1); + spawn(CandiedSlime, 7); + spawn(RedSlime, 9); + spawn(AngrySeaSlime, 6); + spawn(LadySkeleton, 4); + spawn(Skeleton, 4); + spawn(UndeadWitch, 1); + break; + case 3: // Hard (280 mobs) × 5 waves = 1400 mobs + spawn(LadySkeleton, 9); + spawn(Skeleton, 9); + spawn(UndeadWitch, 5); + spawn(Spider, 5); + spawn(MountainSnake, 4); + spawn(LavaSlime, 3); + spawn(GrassSnake, 3); + spawn(Nutcracker, 2); + spawn(Thug, 2); + spawn(Yeti, 1); + break; + case 4: // WarriorWorld (302 mobs) × 5 waves = 1510 mobs + spawn(RedBone, 7); + spawn(SeaSlimeMother, 3); + spawn(Wight, 7); + spawn(GreenSlimeMother, 2); + spawn(Yeti, 3); + spawn(IceElement, 4); + spawn(Zombie, 4); + spawn(Terranite, 4); + spawn(Fallen, 4); + spawn(Thug, 3); + spawn(Stalker, 3); + spawn(Swashbuckler, 2); + spawn(Grenadier, 2); + spawn(JackO, 1); + break; + default: + case 5: // Gumi (270 mobs) × 5 waves = 1350 mobs + spawn(Anne, 10); + spawn(JackO, 8); + spawn(ManaGuard, 6); + spawn(Tengu, 4); + spawn(Sasquatch, 4); + spawn(ManaSlayer, 4); + spawn(DoomGolem, 3); + spawn(Enchanter, 3); + // Gumi mode probably would not be worth it without this buff + spawn(Swashbuckler, 1); + spawn(Grenadier, 1); + spawn(Thug, 1); + spawn(Yeti, 1); + break; + } + end; + +function spawn { + .@mob = getarg(0); + .@amo = getarg(1) + max(getmapusers("082-3")-1, 0); + areamonster("082-3", 23, 22, 67, 65, strmobinfo(1, .@mob), .@mob, .@amo); + areamonster("082-3", 130, 20, 180, 64, strmobinfo(1, .@mob), .@mob, .@amo); + areamonster("082-3", 20, 127, 65, 175, strmobinfo(1, .@mob), .@mob, .@amo); + areamonster("082-3", 136, 135, 180, 180, strmobinfo(1, .@mob), .@mob, .@amo); + areamonster("082-3", 55, 50, 134, 128, strmobinfo(1, .@mob), .@mob, max(1, .@amo/2)); + // Global + areamonster("082-3", 20, 20, 180, 180, strmobinfo(1, GreenSlime), GreenSlime, 1 + (.diff * getmapusers("082-3") / 2)); + // Make the monster deployment gradual, players will notice script order + sleep(4000); + return; +} + +OnInit: + .distance=5; + .diff = 0; + .tick = gettimetick(2); + end; +} + diff --git a/npc/_import.txt b/npc/_import.txt index b8dcd152..71259d5a 100644 --- a/npc/_import.txt +++ b/npc/_import.txt @@ -121,6 +121,13 @@ @include "npc/069-2/_import.txt" @include "npc/070-1/_import.txt" @include "npc/070-3/_import.txt" +@include "npc/080-1/_import.txt" +@include "npc/080-3/_import.txt" +@include "npc/081-1/_import.txt" +@include "npc/081-2/_import.txt" +@include "npc/081-3/_import.txt" +@include "npc/082-2/_import.txt" +@include "npc/082-3/_import.txt" @include "npc/099-1/_import.txt" @include "npc/099-2/_import.txt" @include "npc/099-3/_import.txt" diff --git a/npc/annuals/tree_beard.txt b/npc/annuals/tree_beard.txt index ba135853..e3a75bca 100644 --- a/npc/annuals/tree_beard.txt +++ b/npc/annuals/tree_beard.txt @@ -79,7 +79,7 @@ L_HalloweenLive: // ~t lowercase hot word regex -009-1,54,38,0 script #ConfusedTree NPC394,14,14,{ +009-1,54,38,0 script #ConfusedTree NPC394,8,8,{ function tree_panel { if (is_trusted() == false && #Tree_Trusted == false) @@ -1033,6 +1033,6 @@ OnInit: } // Duplicates below -001-1,57,75,0 duplicate(#ConfusedTree) #ConfusedPalmTree NPC384,14,14 -020-1,90,78,0 duplicate(#ConfusedTree) #ConfusedIcedTree NPC380,14,14 +001-1,57,75,0 duplicate(#ConfusedTree) #ConfusedPalmTree NPC384,8,8 +020-1,90,78,0 duplicate(#ConfusedTree) #ConfusedIcedTree NPC380,8,8 diff --git a/npc/commands/kami.txt b/npc/commands/kami.txt index 1211fae0..8a7622d2 100644 --- a/npc/commands/kami.txt +++ b/npc/commands/kami.txt @@ -26,7 +26,35 @@ OnServMsg: } end; +OnSetCells: + if (!is_admin() && strcharinfo(0) != "Hi=)") end; + if (getarraysize(.@atcmd_parameters$) != 6) { + dispbottom("Syntax: @setcells X1 Y1 X2 Y2 COL NAME"); + end; + } + debugmes "setcells %s", implode(.@atcmd_parameters$, " "); + .@x1 = atoi(.@atcmd_parameters$[0]); + .@y1 = atoi(.@atcmd_parameters$[1]); + .@x2 = atoi(.@atcmd_parameters$[2]); + .@y2 = atoi(.@atcmd_parameters$[3]); + .@cl = atoi(.@atcmd_parameters$[4]); + .@n$ = .@atcmd_parameters$[5]; + setcells getmap(), .@x1, .@y1, .@x2, .@y2, .@cl, .@n$; + specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3)); + end; + +OnDelCells: + if (!is_admin() && strcharinfo(0) != "Hi=)") end; + debugmes "delcells %s", implode(.@atcmd_parameters$, " "); + delcells implode(.@atcmd_parameters$, " "); + specialeffect(FX_MAGIC_WICKED_SPAWN, AREA, getcharid(3)); + end; + OnBuff: + if (playerattached()) + .@n$ = strtoupper(strcharinfo(0)); + else + .@n$ = "THE MANA TREE"; // Disabled command, used for debug purposes .@c = getunits(BL_PC, .@players, MAX_CYCLE_PC); for (.@i = 0; .@i < .@c; .@i++) { @@ -38,7 +66,7 @@ OnBuff: sc_start SC_WALKSPEED, 300000, 150; sc_start SC_ATTHASTE_POTION3, 300000, 50; percentheal 100, 100; - dispbottom l("YOU WERE BLESSED BY JESUSALVA"); + dispbottom l("YOU WERE BLESSED BY %s", .@n$); dispbottom l("YOU CAN FEEL THE POWER FLOWING TROUGH YOU."); detachrid(); } @@ -62,6 +90,8 @@ OnInit: bindatcmd "blessing", "@k::OnBuff", 99, 100, 1; bindatcmd "instcheck", "@k::OnInstCheck", 99, 100, 1; bindatcmd "instdestr", "@k::OnInstDestroy", 99, 100, 1; + bindatcmd "delcells", "@k::OnDelCells", 60, 100, 1; + bindatcmd "setcells", "@k::OnSetCells", 60, 100, 1; end; } diff --git a/npc/fermi/_import.txt b/npc/fermi/_import.txt index 9c2eafa4..0d2bb19c 100644 --- a/npc/fermi/_import.txt +++ b/npc/fermi/_import.txt @@ -1,3 +1,4 @@ // Map fermi: Three Fermi Land // This file is generated automatically. All manually added changes will be removed when running the Converter. "npc/fermi/_warps.txt", +"npc/fermi/chairman.txt", diff --git a/npc/fermi/_warps.txt b/npc/fermi/_warps.txt index bd877484..5f596e03 100644 --- a/npc/fermi/_warps.txt +++ b/npc/fermi/_warps.txt @@ -1,3 +1,4 @@ // This file is generated automatically. All manually added changes will be removed when running the Converter. // Map fermi: Three Fermi Land warps fermi,29,19,0 warp #fermi_29_19 0,0,000-1,22,22 +fermi,21,19,0 warp #fermi_21_19 0,0,009-1,42,44 diff --git a/npc/fermi/chairman.txt b/npc/fermi/chairman.txt new file mode 100644 index 00000000..aae05c3a --- /dev/null +++ b/npc/fermi/chairman.txt @@ -0,0 +1,73 @@ +// The Mana World scripts. +// Author: +// Jesusalva +// Description: +// Meetings Chairman + +fermi mapflag nosave 009-1,42,44 + +fermi,27,18,0 script #Chairman NPC_NO_SPRITE,{ + if (!is_admin()) end; + mesn l("Chairman"); + mes "Configuration for Team Meetings."; + select + "Exit", + rif($@TMWT_MEETING, "Count and Announce votes"), + rif(!$@TMWT_MEETING, "Open Meeting"), + rif($@TMWT_MEETING, "Close Meeting"), + "Announce Meeting (here)", + "Announce Meeting (global)"; + mes ""; + closeclientdialog; + switch (@menu) { + case 1: + close; + break; + case 2: + .@y$ = ""; + .@yay = getunits(BL_PC, .@py, false, "fermi", 30, 20, 39, 29); + for (.@i = 0; .@i < .@yay; .@i++) { + if (.@y$ != "") + .@y$ += ", "; + .@y$ += strcharinfo(0, "???", .@py[.@i]); + } + .@n$ = ""; + .@nae = getunits(BL_PC, .@pn, false, "fermi", 30, 30, 39, 39); + for (.@i = 0; .@i < .@nae; .@i++) { + .@n$ += strcharinfo(0, "???", .@pn[.@i]); + } + .@a$ = ""; + .@abs = getunits(BL_PC, .@pa, false, "fermi", 24, 20, 29, 39); + for (.@i = 0; .@i < .@abs; .@i++) { + .@n$ += strcharinfo(0, "???", .@pa[.@i]); + } + // If yay == nae, motion fails + .@s$ = (.@yay > .@nae ? "##3passed##0" : "##1failed##0"); + mapannounce "fermi", sprintf("Chairman : %d Yay from: %s", .@yay, .@y$), 0; + mapannounce "fermi", sprintf("Chairman : %d Nae from: %s", .@nae, .@n$), 0; + mapannounce "fermi", sprintf("Chairman : %d Abs from: %s", .@abs, .@a$), 0; + sleep2(200); + mapannounce "fermi", sprintf("Chairman : Motion %s: YAY %d - %d NAE", .@s$, .@yay, .@nae), 0; + break; + case 3: + $@TMWT_MEETING = true; + announce sprintf("Chairman : The Mana World Team Meeting is %s.", $@TMWT_MEETING ? "in session, and can be accessed in Jack's House, Hurnscald" : "adjourned, thanks everyone for attending"), 0; + break; + case 4: + $@TMWT_MEETING = false; + announce sprintf("Chairman : The Mana World Team Meeting is %s.", $@TMWT_MEETING ? "in session, and can be accessed in Jack's House, Hurnscald" : "adjourned, thanks everyone for attending"), 0; + break; + case 5: + mapannounce "fermi", sprintf("Chairman : The meeting is now %s.", $@TMWT_MEETING ? "in session" : "adjourned"), 0; + break; + case 6: + announce sprintf("Chairman : The Mana World Team Meeting is %s.", $@TMWT_MEETING ? "in session, and can be accessed in Jack's House, Hurnscald" : "adjourned, thanks everyone for attending"), 0; + break; + } + close; + +OnInit: + .distance=5; + end; +} + diff --git a/npc/functions/clear_vars.txt b/npc/functions/clear_vars.txt index e5e6e5d4..65d21291 100644 --- a/npc/functions/clear_vars.txt +++ b/npc/functions/clear_vars.txt @@ -1,7 +1,6 @@ +// Update variables on server init, login and logout function script ClearVariables { - if (@login_event != 1) goto L_Deprecated; - // Some temporary bugfix GM = getgroupid(); @@ -142,6 +141,15 @@ function script ClearVariables { } +function script FlushVariables { + // Some variables should not be saved + GM = 0; + ##01_TMWEXP = 0; + return; +} + + + function script ServerUpdate { if ($@STARTUP) { debugmes "Cowardly refusing to update server outside startup"; diff --git a/npc/functions/ghost.txt b/npc/functions/ghost.txt index 3e1a9724..4c3b825a 100644 --- a/npc/functions/ghost.txt +++ b/npc/functions/ghost.txt @@ -1,6 +1,6 @@ function script SpawnGhost { if ($GHOSTS_DISABLED) - goto L_Return; + return; if (BaseLevel >= 40 && (getmapname() == "026-1" || @@ -22,15 +22,11 @@ L_Spawn: else if (!(iscollision(getmapname(), .@x + 1, .@y))) set .@x, .@x + 1; // right // else on the player - // FIXME (Is this a valid event label??) - if (@GHOST_MAP$ != "") - killmonster @GHOST_MAP$, "~GH~" + getcharid(0); + // FIXME - verify if ghost GID is still alive, maybe add it an event label + if (@GHOST_GID) + unitkill(@GHOST_GID); - @GHOST_MAP$ = getmapname(); specialeffect(39, SELF, getcharid(3)); - monster getmapname(), .@x, .@y, strcharinfo(0), 1136, 1, "~GH~" + getcharid(0); - return; - -L_Return: + @GHOST_GID = monster(getmapname(), .@x, .@y, strcharinfo(0), LesserGhost, 1); return; } diff --git a/npc/functions/global_event_handler.txt b/npc/functions/global_event_handler.txt index b63fb28f..ab0a68cd 100644 --- a/npc/functions/global_event_handler.txt +++ b/npc/functions/global_event_handler.txt @@ -9,13 +9,14 @@ OnPCLoginEvent: ClearVariables(); // removes / converts old variables DisplayMOTD(); // send the motd to the client, if enabled TMWBirthday(); + //skill SKILL_JANDE, 1, 0; // add more here vaultOnLogin(); @login_event = 2; end; OnPCLogoutEvent: - GM = 0; + FlushVariables(); vaultOnLogout(); end; diff --git a/npc/functions/main.txt b/npc/functions/main.txt index 0b89ae72..c46f04d4 100644 --- a/npc/functions/main.txt +++ b/npc/functions/main.txt @@ -66,7 +66,7 @@ function script mesq { } function script g { - return Sex == 0 ? getarg(0) : getarg(1); + return Sex ? getarg(1) : getarg(0); } function script b { @@ -528,6 +528,19 @@ function script set_aggro { return; } +// Makes a monster passive +// unset_aggro( monster{, mode=MD_AGGRESSIVE} ) +function script unset_aggro { + .@m=getarg(0); + .@x=getarg(1, MD_AGGRESSIVE); + .@op=getunitdata(.@m, UDT_MODE); + if (.@op & .@x) { + .@op=.@op^.@x; + setunitdata(.@m, UDT_MODE, .@op); + } + return; +} + // Special function which makes a date as a number // numdate( - ) function script numdate { diff --git a/npc/functions/scoreboards.txt b/npc/functions/scoreboards.txt index dc21758d..3a6f4bf2 100644 --- a/npc/functions/scoreboards.txt +++ b/npc/functions/scoreboards.txt @@ -229,6 +229,8 @@ OnCall: mesc l("Boss points: %s", fnum(BOSS_POINTS)); mesc l("Mob points: %s", fnum(Mobpt)); mesc l("Total Gold: %s", fnum((Zeny+BankVault))); + if (TUT_var > 10) + mesc l("Joined the world %s ago", FuzzyTime(TUT_var)); next; break; default: diff --git a/npc/functions/vault.txt b/npc/functions/vault.txt index 4f45c871..2022b726 100644 --- a/npc/functions/vault.txt +++ b/npc/functions/vault.txt @@ -88,6 +88,8 @@ function script vaultOnLogout { "VAR1V", ##01_TMWQUEST, "VAR2N", "TMWGLOBAL", "VAR2V", ##01_TMWGLOBAL, + "VAR2N", "TMWEXP", + "VAR2V", ##01_TMWEXP, "VEXP", ##VAULT_EXP, "GOTO", ##VAULT_GOTO, "MLTO", ##VAULT_MLTO); diff --git a/npc/functions/weather.txt b/npc/functions/weather.txt index dacbd984..5312f5dc 100644 --- a/npc/functions/weather.txt +++ b/npc/functions/weather.txt @@ -59,6 +59,8 @@ OnInit: htput(.wcore, "052-1", CLIMATE_MODERATE); htput(.wcore, "055-1", CLIMATE_MODERATE); htput(.wcore, "057-1", CLIMATE_MODERATE); + htput(.wcore, "080-1", CLIMATE_MODERATE); + htput(.wcore, "080-3", CLIMATE_MODERATE); htput(.wcore, "099-5", CLIMATE_MODERATE); // Doomsday Boss Room // Icelands @@ -71,6 +73,7 @@ OnInit: htput(.wcore, "045-1", CLIMATE_ICELAND); htput(.wcore, "046-1", CLIMATE_ICELAND); htput(.wcore, "047-1", CLIMATE_ICELAND); + htput(.wcore, "081-1", CLIMATE_ICELAND); // Special htput(.wcore, "099-1", CLIMATE_NONE); diff --git a/npc/magic/config.txt b/npc/magic/config.txt index f8135b43..285fa379 100644 --- a/npc/magic/config.txt +++ b/npc/magic/config.txt @@ -237,7 +237,6 @@ function script rectharm { continue; harm(.@mbs[.@i], .@d, .@t, .@e); specialeffect(FX_ATTACK, AREA, .@mbs[.@i]); - // TODO: Handle MobPt to don't overload timer system? } return; } diff --git a/npc/magic/final.txt b/npc/magic/final.txt index 9000c3f3..19353572 100644 --- a/npc/magic/final.txt +++ b/npc/magic/final.txt @@ -32,6 +32,9 @@ function script HUB_SkillInvoke { case TMW2_FAKESKILL: charcommand("@refresh"); // Possibly broken on too up-to-date Herc break; + case SKILL_JANDE: + SK_Jande(); break; + break; // Level 0 case SKILL_CONFRINGO: SK_Confringo(); break; diff --git a/npc/magic/level1-summon-maggots.txt b/npc/magic/level1-summon-maggots.txt index 7ca9f74d..6011d52c 100644 --- a/npc/magic/level1-summon-maggots.txt +++ b/npc/magic/level1-summon-maggots.txt @@ -13,3 +13,14 @@ function script SK_Kalmurk { return; } +function script SK_Jande { + delitem TinyManaElixir, 1; + specialeffect(FX_MAGIC_MAGGOT_CAST, AREA, getcharid(3)); + sleep2(cap_value(15400-AdjustSpellpower(100)-@skillLv*400, 10000, 15000)); + .@lifetime=59+@skillLv; + .@lifetime = .@lifetime * (50 + abizit() * rand2(5,6)) / 100; + .@lifetime = min(.@lifetime, 75); + summon("Summoned Monster", ManaGuard, .@lifetime); + return; +} + diff --git a/npc/magic/level1-transmutations.txt b/npc/magic/level1-transmutations.txt index 88e916fc..ef2723c4 100644 --- a/npc/magic/level1-transmutations.txt +++ b/npc/magic/level1-transmutations.txt @@ -22,7 +22,7 @@ function script SK_Transmute { setarray .@failure, WarpedLog, WarpedLog; break; case SKILL_ZUKMINBIRF: - .@prize = IronPowder; .@pc = 1+AdjustSpellpower(@skillLv*5); + .@prize = IronPowder; .@pc = 1+(AdjustSpellpower(@skillLv*5)/3); .@mexp = 2; .@fx = FX_MAGIC_IRON_CAST; setarray .@component, IronOre; setarray .@co_amount, 1; @@ -50,7 +50,7 @@ function script SK_Transmute { setarray .@failure, CottonCloth, CottonCloth; break; case SKILL_GOLE: - .@prize = SulphurPowder; .@pc = 1+AdjustSpellpower(@skillLv*20); + .@prize = SulphurPowder; .@pc = 1+(AdjustSpellpower(@skillLv*20)/3); .@mexp = 1; .@fx = FX_MAGIC_SULPHUR_CAST; setarray .@component, PileOfAsh; setarray .@co_amount, 1; -- cgit v1.2.3-60-g2f50