From a1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5 Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Sat, 22 Mar 2025 22:08:26 -0300 Subject: Optional Dungeon --- conf/map/maps.conf | 1 + db/constants.conf | 1 + db/map_index.txt | 271 ++++++++++++++++++++++++----------------------- db/re/item_db.conf | 66 ++++++++++++ db/re/map_zone_db.conf | 89 ++++++++++++++++ db/re/mob_db.conf | 270 ++++++++++++++++++++++++++++++++++++++++++++++ maps/re/026-6.mcache | Bin 533 -> 548 bytes maps/re/026-8.mcache | Bin 0 -> 1473 bytes npc/005-2/saxsochest.txt | 1 + npc/026-6/_mobs.txt | 2 +- npc/026-6/_warps.txt | 22 +++- npc/026-6/ctrl.c | 50 +++++++++ npc/026-8/_import.txt | 5 + npc/026-8/_mobs.txt | 11 ++ npc/026-8/_warps.txt | 3 + npc/026-8/ctrl.c | 64 +++++++++++ npc/042-3/jail.txt | 2 +- npc/_import.txt | 1 + npc/config/location.txt | 10 +- npc/functions/hub.txt | 2 + npc/functions/util.txt | 2 + npc/items/teleporter.txt | 6 ++ 22 files changed, 736 insertions(+), 143 deletions(-) create mode 100644 maps/re/026-8.mcache create mode 100644 npc/026-8/_import.txt create mode 100644 npc/026-8/_mobs.txt create mode 100644 npc/026-8/_warps.txt create mode 100644 npc/026-8/ctrl.c diff --git a/conf/map/maps.conf b/conf/map/maps.conf index 0d12d8324..cda185bc9 100644 --- a/conf/map/maps.conf +++ b/conf/map/maps.conf @@ -296,6 +296,7 @@ map_list: ( "026-3", "026-6", "026-7", + "026-8", "027-0", "027-1", "027-2", diff --git a/db/constants.conf b/db/constants.conf index 926f3a1d1..84a4fdd40 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -2167,6 +2167,7 @@ constants_db: { TP_LILIT: 256 TP_CANDOR: 512 TP_ARTIS: 1024 + TP_HEART: 2048 comment__: "Grand Collector Quest enum" COLLECT_CHESTPLATE: 1 diff --git a/db/map_index.txt b/db/map_index.txt index de3cec08d..32e7a4cd0 100644 --- a/db/map_index.txt +++ b/db/map_index.txt @@ -293,138 +293,139 @@ 026-3 293 026-6 294 026-7 295 -027-0 296 -027-1 297 -027-2 298 -027-3 299 -027-4 300 -027-5 301 -027-6 302 -027-7 303 -029-0 304 -029-1 305 -029-2 306 -029-3 307 -029-4 308 -029-5 309 -029-6 310 -029-7 311 -029-8 312 -029-9 313 -030-01 314 -030-02 315 -030-03 316 -030-04 317 -030-05 318 -030-06 319 -030-07 320 -030-08 321 -030-09 322 -030-10 323 -030-11 324 -030-12 325 -030-13 326 -030-14 327 -030-15 328 -030-16 329 -030-17 330 -030-18 331 -030-19 332 -030-20 333 -030-21 334 -030-22 335 -030-23 336 -030-24 337 -030-25 338 -030-26 339 -030-27 340 -030-28 341 -030-29 342 -030-30 343 -030-31 344 -030-32 345 -030-33 346 -030-34 347 -030-35 348 -030-36 349 -030-37 350 -030-38 351 -030-39 352 -030-40 353 -030-41 354 -030-42 355 -030-43 356 -030-44 357 -030-45 358 -030-46 359 -030-47 360 -030-48 361 -030-49 362 -030-50 363 -030-51 364 -030-52 365 -030-53 366 -030-54 367 -030-55 368 -030-56 369 -030-57 370 -030-58 371 -030-59 372 -030-60 373 -030-61 374 -030-62 375 -030-63 376 -030-64 377 -030-65 378 -030-66 379 -030-67 380 -030-68 381 -030-69 382 -030-70 383 -030-71 384 -030-72 385 -030-73 386 -030-74 387 -030-75 388 -031-0 389 -031-1 390 -031-2 391 -031-3 392 -031-4 393 -031-5 394 -031-6 395 -031-7 396 -031-8 397 -031-9 398 -032-1 399 -032-2 400 -032-3 401 -032-4 402 -032-5 403 -033-1 404 -033-2 405 -033-3 406 -033-4 407 -033-5 408 -034-1 409 -034-2 410 -034-3 411 -034-4 412 -042-0 413 -042-1 414 -042-10 415 -042-11 416 -042-2 417 -042-3 418 -042-4 419 -042-5 420 -042-6 421 -042-7 422 -042-8 423 -042-9 424 -boss 425 -botcheck 426 -guilds 427 -sec_pri 428 -soren-2 429 -soren 430 +026-8 296 +027-0 297 +027-1 298 +027-2 299 +027-3 300 +027-4 301 +027-5 302 +027-6 303 +027-7 304 +029-0 305 +029-1 306 +029-2 307 +029-3 308 +029-4 309 +029-5 310 +029-6 311 +029-7 312 +029-8 313 +029-9 314 +030-01 315 +030-02 316 +030-03 317 +030-04 318 +030-05 319 +030-06 320 +030-07 321 +030-08 322 +030-09 323 +030-10 324 +030-11 325 +030-12 326 +030-13 327 +030-14 328 +030-15 329 +030-16 330 +030-17 331 +030-18 332 +030-19 333 +030-20 334 +030-21 335 +030-22 336 +030-23 337 +030-24 338 +030-25 339 +030-26 340 +030-27 341 +030-28 342 +030-29 343 +030-30 344 +030-31 345 +030-32 346 +030-33 347 +030-34 348 +030-35 349 +030-36 350 +030-37 351 +030-38 352 +030-39 353 +030-40 354 +030-41 355 +030-42 356 +030-43 357 +030-44 358 +030-45 359 +030-46 360 +030-47 361 +030-48 362 +030-49 363 +030-50 364 +030-51 365 +030-52 366 +030-53 367 +030-54 368 +030-55 369 +030-56 370 +030-57 371 +030-58 372 +030-59 373 +030-60 374 +030-61 375 +030-62 376 +030-63 377 +030-64 378 +030-65 379 +030-66 380 +030-67 381 +030-68 382 +030-69 383 +030-70 384 +030-71 385 +030-72 386 +030-73 387 +030-74 388 +030-75 389 +031-0 390 +031-1 391 +031-2 392 +031-3 393 +031-4 394 +031-5 395 +031-6 396 +031-7 397 +031-8 398 +031-9 399 +032-1 400 +032-2 401 +032-3 402 +032-4 403 +032-5 404 +033-1 405 +033-2 406 +033-3 407 +033-4 408 +033-5 409 +034-1 410 +034-2 411 +034-3 412 +034-4 413 +042-0 414 +042-1 415 +042-10 416 +042-11 417 +042-2 418 +042-3 419 +042-4 420 +042-5 421 +042-6 422 +042-7 423 +042-8 424 +042-9 425 +boss 426 +botcheck 427 +guilds 428 +sec_pri 429 +soren-2 430 +soren 431 diff --git a/db/re/item_db.conf b/db/re/item_db.conf index 05be4a039..085b46c44 100644 --- a/db/re/item_db.conf +++ b/db/re/item_db.conf @@ -11866,6 +11866,34 @@ item_db: ( id5021: 1 } }, +{ + Id: 3036 + AegisName: "MoubootaurHead" + Name: "Moubootaur Head" + Type: "IT_ARMOR" + Buy: 16000 + Sell: 3000 + Weight: 80 + Def: 5 + Loc: "EQP_HEAD_TOP" + EquipLv: 150 + Refine: false + Trade: { + notrade: true + nodrop: true + nocart: true + noselltonpc: true + nostorage: false + nogstorage: true + nomail: true + noauction: true + } + Script: <" + bonus bMaxHP, 2500; + bonus bDef2, 18+REBIRTH; + bonus bMdef, 3*REBIRTH; + "> +}, // Neck Armor { @@ -20469,6 +20497,44 @@ item_db: ( getitem 4005, 1; "> }, +{ + Id: 8068 + AegisName: "LimePotion" + Name: "Moubootaur's Ointment" + Type: "IT_USABLE" + Buy: 30000 + Sell: 1000 + Weight: 8 + KeepAfterUse: false + Script: <" + MOUBOOTAUR_OINTMENT+=1; + "> +}, +{ + Id: 8069 + AegisName: "EvilWarpCrystal" + Name: "Evil Warp Crystal" + Type: "IT_USABLE" + Buy: 0 + Sell: 0 + Weight: 40 + Delay: 500 + Trade: { + notrade: true + nodrop: true + nocart: true + noselltonpc: true + nostorage: false + nogstorage: true + nomail: true + noauction: true + } + Script: <" + @dest$="Endgame"; + @itemid=8069; + doevent "Warp Crystal::OnUse"; + "> +}, ) diff --git a/db/re/map_zone_db.conf b/db/re/map_zone_db.conf index f1e9a3c90..b10772a2f 100644 --- a/db/re/map_zone_db.conf +++ b/db/re/map_zone_db.conf @@ -158,6 +158,7 @@ zones: ( FrostiaWarpCrystal: true LilitWarpCrystal: true ArtisWarpCrystal: true + EvilWarpCrystal: true ReturnPotion: true } @@ -561,6 +562,7 @@ zones: ( FrostiaWarpCrystal: true LilitWarpCrystal: true ArtisWarpCrystal: true + EvilWarpCrystal: true ReturnPotion: true RentCart: true DeathPotion: true @@ -650,6 +652,7 @@ zones: ( FrostiaWarpCrystal: true LilitWarpCrystal: true ArtisWarpCrystal: true + EvilWarpCrystal: true ReturnPotion: true DeathPotion: true } @@ -698,6 +701,92 @@ zones: ( skill_damage_cap: { } }, +{ + /* FinalMMO Zone is not the place for GMs to mess with - Final Showdown */ + name: "FinalMMO" + + disabled_skills: { + AL_WARP: "ALL" + AL_TELEPORT: "ALL" + WE_CALLPARTNER: "ALL" + WE_CALLPARENT: "ALL" + WE_CALLBABY: "ALL" + SC_DIMENSIONDOOR: "ALL" + GD_EMERGENCYCALL: "ALL" + } + + disabled_items: { + TimeFlask: true + CandorWarpCrystal: true + TulimWarpCrystal: true + HalinWarpCrystal: true + HurnsWarpCrystal: true + LoFWarpCrystal: true + NivalWarpCrystal: true + FrostiaWarpCrystal: true + LilitWarpCrystal: true + ArtisWarpCrystal: true + EvilWarpCrystal: true + ReturnPotion: true + // Should we disable mounts? + } + + mapflags: ( + "nowarpto", + "bexp 50", + "nosave 001-16,90,45", + "resave 001-16,90,45", + "partylock", + "guildlock", + "monster_noteleport", + "pvp_nocalcrank", + "pvp_noguild", + "pvp_noparty", + "nojobexp", + "invincible_time_inc 2000", + "short_damage_rate 85", +// "battleground", +// "nomobloot", + ) + + /* "command:min-group-lv-to-override" e.g. "heal: 70" */ + disabled_commands: { + recall: 100 + recallall: 100 + monster: 100 + item: 100 + summon: 100 + killer: 100 + killable: 100 + pvpon: 100 + pvpoff: 100 + clone: 100 + slaveclone: 100 + evilclone: 100 + monstersmall: 100 + monsterbig: 100 + save: 100 + killmonster: 100 + killmonster2: 100 + raisemap: 100 + doommap: 100 + kill: 100 + nuke: 100 + //revive: 100 + setbattleflag: 100 + cvcon: 100 + cvcoff: 100 + addwarp: 100 + mapflag: 100 + gvgon: 100 + gvgoff: 100 + skillon: 100 + skilloff: 100 + alive: 100 + } + skill_damage_cap: { + } +}, { name: "Towns" diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf index 80fc26c5d..879036c75 100644 --- a/db/re/mob_db.conf +++ b/db/re/mob_db.conf @@ -589,6 +589,7 @@ mob_db: ( // 1013 is free // mob ids which is free: 1013 (pikpik) // is free: 1057, 1059 (small/big mineral bif) +// is free: 1453 Bobone 1454 ??? { Id: 1014 SpriteName: "EntAbomination" @@ -12905,6 +12906,275 @@ mob_db: ( TortugaShellFragment: 3 } }, +// 1453 RESERVED (not free): Bobone +{ + Id: 1454 + SpriteName: "TopUnderling" + Name: "Top Underling" + Lv: 200 + Hp: 180000 + Exp: 64000 + JExp: 500 + AttackRange: 2 + Attack: [7500, 8600] + Def: 442 + Mdef: 74 + Race: 8 + Element: (8, 2) + Stats: { + Str: 200 + Agi: 200 + Vit: 200 + Int: 200 + Dex: 200 + Luk: 200 + } + Mode: { + Boss: true + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 280 + AttackDelay: 1200 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 9 + ChaseRange: 12 + Drops: { + LimePotion: 2350 + LimePotion: 1620 + LimePotion: 940 + GoldenBossGift: 800 + SilverBossGift: 400 + BronzeBossGift: 200 + } +}, +{ + Id: 1455 + SpriteName: "GunnerUnderling" + Name: "Gunner Underling" + Lv: 200 + Hp: 96000 + Exp: 36000 + JExp: 300 + AttackRange: 7 + Attack: [3500, 4600] + Def: 422 + Mdef: 64 + Race: 8 + Element: (8, 1) + Stats: { + Str: 121 + Agi: 150 + Vit: 121 + Int: 121 + Dex: 175 + Luk: 121 + } + Mode: { + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 300 + AttackDelay: 2000 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 11 + ChaseRange: 14 + Drops: { + LimePotion: 350 + LimePotion: 120 + BronzeBossGift: 3 + SilverBossGift: 1 + } +}, +{ + Id: 1456 + SpriteName: "HalberdUnderling" + Name: "Halberd Underling" + Lv: 200 + Hp: 96000 + Exp: 36000 + JExp: 300 + AttackRange: 3 + Attack: [2700, 3600] + Def: 442 + Mdef: 64 + Race: 8 + Element: (8, 1) + Stats: { + Str: 121 + Agi: 150 + Vit: 121 + Int: 121 + Dex: 150 + Luk: 121 + } + Mode: { + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 300 + AttackDelay: 1200 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 7 + ChaseRange: 11 + Drops: { + LimePotion: 350 + LimePotion: 120 + BronzeBossGift: 3 + SilverBossGift: 1 + } +}, +{ + Id: 1457 + SpriteName: "MagicUnderling" + Name: "Magic Underling" + Lv: 200 + Hp: 96000 + Exp: 36000 + JExp: 300 + AttackRange: 12 + Attack: [2000, 2600] + Def: 362 + Mdef: 84 + Race: 8 + Element: (8, 1) + Stats: { + Str: 121 + Agi: 150 + Vit: 121 + Int: 121 + Dex: 150 + Luk: 121 + } + Mode: { + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 320 + AttackDelay: 1100 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 13 + ChaseRange: 15 + Drops: { + LimePotion: 350 + LimePotion: 120 + BronzeBossGift: 3 + SilverBossGift: 1 + } +}, +{ + Id: 1458 + SpriteName: "BansheeUnderling" + Name: "Banshee Underling" + Lv: 200 + Hp: 96000 + Exp: 36000 + JExp: 300 + AttackRange: 8 + Attack: [2400, 2900] + Def: 422 + Mdef: 64 + Race: 8 + Element: (8, 1) + Stats: { + Str: 121 + Agi: 150 + Vit: 121 + Int: 121 + Dex: 150 + Luk: 121 + } + Mode: { + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 200 + AttackDelay: 1000 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 9 + ChaseRange: 13 + Drops: { + LimePotion: 350 + LimePotion: 120 + BronzeBossGift: 3 + SilverBossGift: 1 + } +}, +{ + Id: 1459 + SpriteName: "FlyingUnderling" + Name: "Flying Underling" + Lv: 200 + Hp: 96000 + Exp: 36000 + JExp: 300 + AttackRange: 1 + Attack: [2700, 3600] + WalkMask: "WALK_AIR" + Def: 422 + Mdef: 64 + Race: 8 + Element: (8, 1) + Stats: { + Str: 121 + Agi: 150 + Vit: 121 + Int: 121 + Dex: 150 + Luk: 121 + } + Mode: { + CanMove: true + Aggressive: true + ChangeChase: true + ChangeTargetChase: true + ChangeTargetMelee: true + CanAttack: true + CastSensorChase: true + } + MoveSpeed: 240 + AttackDelay: 1200 + AttackMotion: 672 + DamageMotion: 200 + ViewRange: 13 + ChaseRange: 16 + Drops: { + LimePotion: 350 + LimePotion: 120 + BronzeBossGift: 3 + SilverBossGift: 1 + } +}, // System { Id: 1490 diff --git a/maps/re/026-6.mcache b/maps/re/026-6.mcache index b86006ff2..5731abc1e 100644 Binary files a/maps/re/026-6.mcache and b/maps/re/026-6.mcache differ diff --git a/maps/re/026-8.mcache b/maps/re/026-8.mcache new file mode 100644 index 000000000..1c65f4ba4 Binary files /dev/null and b/maps/re/026-8.mcache differ diff --git a/npc/005-2/saxsochest.txt b/npc/005-2/saxsochest.txt index b6c0f1abb..c4932347a 100644 --- a/npc/005-2/saxsochest.txt +++ b/npc/005-2/saxsochest.txt @@ -84,6 +84,7 @@ OnInit: end; OnGuarantee: + fix_mobkill(SaxsoGhost); if (REBIRTH || BaseLevel > 20) end; if (getq(CandorQuest_Chest) || countitem(SaxsoKey)) end; if (getq(General_Banker) && any(true, false)) end; diff --git a/npc/026-6/_mobs.txt b/npc/026-6/_mobs.txt index a7b32b253..0aab1e239 100644 --- a/npc/026-6/_mobs.txt +++ b/npc/026-6/_mobs.txt @@ -1,3 +1,3 @@ // This file is generated automatically. All manually added changes will be removed when running the Converter. // Map 026-6: The Impregnable Fortress (B6F) mobs -026-6,26,89,0,0 monster Jack.O 1120,1,10000,10000,#026-6Gate::OnGoto +026-6,26,89,0,0 monster Jack.O 1430,1,10000,10000,#026-6Gate::OnGoto diff --git a/npc/026-6/_warps.txt b/npc/026-6/_warps.txt index cbfb4fac2..6c6dd547b 100644 --- a/npc/026-6/_warps.txt +++ b/npc/026-6/_warps.txt @@ -1,6 +1,6 @@ // This file is generated automatically. All manually added changes will be removed when running the Converter. // Map 026-6: The Impregnable Fortress (B6F) warps -026-6,88,94,0 warp #026-6_88_94 0,0,025-2,100,25 +026-6,91,78,0 warp #026-6_91_78 0,0,025-2,100,25 026-6,95,121,0 script #026-6_95_121 NPC_HIDDEN,0,0,{ end; OnTouch: @@ -41,3 +41,23 @@ OnTouch: OnTouch: slide 99,64; end; } +026-6,122,64,0 script #026-6_122_64 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 133,54; end; +} +026-6,133,53,0 script #026-6_133_53 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 122,65; end; +} +026-6,120,80,0 script #026-6_120_80 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 125,80; end; +} +026-6,124,80,0 script #026-6_124_80 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 119,80; end; +} diff --git a/npc/026-6/ctrl.c b/npc/026-6/ctrl.c index 058b61aea..f45ab9e53 100644 --- a/npc/026-6/ctrl.c +++ b/npc/026-6/ctrl.c @@ -169,3 +169,53 @@ OnInit: end; } +026-6,85,79,0 script Expeditionary#A NPC_CONSTR_WORKER,{ + mesn; + mesq l("I'm from the Alliance Expeditionary Force. I'm here to protect these passages from the untrained."); + next; + mesn; + mesq l("This one brings you closer to the World's Heart."); + next; + mesn; + if (!MK_WINNER) + mesq l("Which is why I cannot allow you past this point."); + else + mesq l("You can go there, if you wish, but it is deadly."); + close; +OnInit: + .distance=3; + end; +} + +026-6,89,79,0 script Expeditionary#B NPC_MAINTENANCE_A,{ + mesn; + mesq l("I'm from the Alliance Expeditionary Force. I'm here to protect these passages from the untrained."); + next; + mesn; + mesq l("One of them will bring you out of the Impregnable Fortress, the other brings you closer to the World's Heart."); + next; + mesn; + if (!MK_WINNER) + mesq l("Which is why I cannot allow you past this point."); + else + mesq l("You can go there, if you wish, but it is deadly."); + close; +OnInit: + .distance=3; + end; +} + +026-6,92,79,0 script Expeditionary#C NPC_CONSTR_WORKER,{ + mesn; + mesq l("I'm from the Alliance Expeditionary Force. I'm here to protect these passages from the untrained."); + next; + mesn; + mesq l("This one leads you to outside the Impregnable Fortress."); + close; +OnInit: + .distance=3; + end; +} + +// Optional Dungeon +// The warp is added by npc/026-8/ctrl.c diff --git a/npc/026-8/_import.txt b/npc/026-8/_import.txt new file mode 100644 index 000000000..a72bad0ac --- /dev/null +++ b/npc/026-8/_import.txt @@ -0,0 +1,5 @@ +// Map 026-8: Optional Dungeon +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/026-8/_mobs.txt", +"npc/026-8/_warps.txt", +"npc/026-8/ctrl.c", diff --git a/npc/026-8/_mobs.txt b/npc/026-8/_mobs.txt new file mode 100644 index 000000000..a7e85e312 --- /dev/null +++ b/npc/026-8/_mobs.txt @@ -0,0 +1,11 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 026-8: Optional Dungeon mobs +026-8,42,92,22,45 monster Moubootaur Underling #4 1458,11,60000,240000 +026-8,61,74,51,59 monster Flying Underling 1459,13,60000,240000 +026-8,53,70,22,45 monster Moubootaur Underling #3 1457,11,60000,240000 +026-8,73,93,22,45 monster Moubootaur Underling #2 1456,11,60000,240000 +026-8,59,45,45,23 monster Moubootaur Underling #1 1455,5,60000,240000 +026-8,55,124,45,18 monster Moubootaur Underling #1 1455,5,60000,240000 +026-8,83,64,7,5 monster Moubootaur Top Underling 1454,1,60000,240000,#OPTDungeon::OnBossDown +026-8,85,72,5,2 monster Moubootaur Underling #1 1455,2,60000,240000 +026-8,92,53,6,6 monster Moubootaur Underling #2 1455,2,60000,240000 diff --git a/npc/026-8/_warps.txt b/npc/026-8/_warps.txt new file mode 100644 index 000000000..cb027640e --- /dev/null +++ b/npc/026-8/_warps.txt @@ -0,0 +1,3 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 026-8: Optional Dungeon warps +026-8,94,100,0 warp #026-8_94_100 0,0,026-6,86,79 diff --git a/npc/026-8/ctrl.c b/npc/026-8/ctrl.c new file mode 100644 index 000000000..a2064279d --- /dev/null +++ b/npc/026-8/ctrl.c @@ -0,0 +1,64 @@ +// TMW2 scripts. +// Author: +// Jesusalva +// Description: +// Optional Dungeon Configuration File + +026-8 mapflag zone SuperMMO + +// Main Configuration and Warp NPC +026-6,86,78,0 script #OPTDungeon NPC_HIDDEN,0,0,{ + end; + +OnTouch: +OnTouchNPC: + if (!MK_WINNER) dispbottom l("The Alliance Expeditionary Force won't allow me beyond this point."); + else warp "026-8", 93, 100; + end; + +OnBossDown: + if (!playerattached()) end; + getitem EvilWarpCrystal, 1; + OPTBossCount += 1; + switch (OPTBossCount) { + case 1: + getitem IntelligenceFruit, 1; break; + case 2: + getitem VitalityFruit, 1; break; + case 3: + getitem DexterityFruit, 1; break; + case 4: + getitem StrengthFruit, 1; break; + case 5: + getitem LuckFruit, 1; break; + case 6: + getitem AgilityFruit, 1; break; + case 7: + getitem GoldenBossGift, 1; break; + case 8: + getitem MercBoxEE, 1; break; + case 9: + getitem PrismGift, 1; break; + case 10: + getitem SaviorBlueprint, 1; break; + default: + // After this, you heal fully and gain extra EXP + percentheal 100, 0; + getexp OPTBossCount*200, OPTBossCount*10; + // You can still get some low value, repeatable prizes in cycles of 40 + // However, this code does NOT start at zero! + if (OPTBossCount % 40 == 20) + getitem Arcanum, 1; + else if (OPTBossCount % 40 == 30) + getitem TreasureKey, 1; + else if (OPTBossCount % 40 == 0) + getitem ArcmageBoxset, 1; + else if (OPTBossCount % 40 == 10) + getitem StrangeCoin, 5; + break; + } + fix_mobkill(TopUnderling); + end; +} + + diff --git a/npc/042-3/jail.txt b/npc/042-3/jail.txt index 87ba809d8..aea673193 100644 --- a/npc/042-3/jail.txt +++ b/npc/042-3/jail.txt @@ -47,7 +47,7 @@ OnFirstSlime: } getmapxy(.@m$, .@x, .@y, 0); @kamslimekills += 1; - if (@kamslimekills > 10 && @lockpicks) { + if (@kamslimekills > 12 && @lockpicks) { @kamslimekills -= 3; detachrid(); sleep(rand2(24) * 1800); diff --git a/npc/_import.txt b/npc/_import.txt index a3e4675ad..ae05a74a3 100644 --- a/npc/_import.txt +++ b/npc/_import.txt @@ -295,6 +295,7 @@ @include "npc/026-3/_import.txt" @include "npc/026-6/_import.txt" @include "npc/026-7/_import.txt" +@include "npc/026-8/_import.txt" @include "npc/027-0/_import.txt" @include "npc/027-1/_import.txt" @include "npc/027-2/_import.txt" diff --git a/npc/config/location.txt b/npc/config/location.txt index f2db2bf94..7d4da3ded 100644 --- a/npc/config/location.txt +++ b/npc/config/location.txt @@ -7,11 +7,11 @@ OnInit: // TP_FORT TP_BOSSR - setarray $@LOCMASTER_TP, TP_CANDOR,TP_TULIM,TP_HALIN,TP_HURNS, TP_LOF,TP_LILIT,TP_NIVAL, TP_FROST, TP_FORT,TP_ARTIS; - setarray $@LOCMASTER_LOC$, "Candor", "Tulim", "Halin", "Hurns", "LoF", "Lilit", "Nival", "Frostia", "Fort", "Artis"; - setarray $@LOCMASTER_MAP$, "005-1", "003-1", "009-1", "012-1", "017-1", "018-5", "020-1", "024-1", "025-2", "029-0"; - setarray $@LOCMASTER_X, 43, 40, 26, 86, 119, 111, 56, 94, 108, 203; - setarray $@LOCMASTER_Y, 99, 49, 30, 69, 87, 53, 62, 42, 32, 85; + setarray $@LOCMASTER_TP, TP_CANDOR,TP_TULIM,TP_HALIN,TP_HURNS, TP_LOF,TP_LILIT,TP_NIVAL, TP_FROST, TP_FORT,TP_ARTIS, TP_HEART; + setarray $@LOCMASTER_LOC$, "Candor", "Tulim", "Halin", "Hurns", "LoF", "Lilit", "Nival", "Frostia", "Fort", "Artis", "Endgame"; + setarray $@LOCMASTER_MAP$, "005-1", "003-1", "009-1", "012-1", "017-1", "018-5", "020-1", "024-1", "025-2", "029-0", "026-8"; + setarray $@LOCMASTER_X, 43, 40, 26, 86, 119, 111, 56, 94, 108, 203, 80; + setarray $@LOCMASTER_Y, 99, 49, 30, 69, 87, 53, 62, 42, 32, 85, 100; //debugmes "Locmaster: Index 0: %s [%s.gat (%d, %d)]", $@LOCMASTER_LOC$[0], $@LOCMASTER_MAP$[0], $@LOCMASTER_X[0], $@LOCMASTER_Y[0]; //debugmes "Locmaster: Index 2: %s [%s.gat (%d, %d)]", $@LOCMASTER_LOC$[2], $@LOCMASTER_MAP$[2], $@LOCMASTER_X[2], $@LOCMASTER_Y[2]; diff --git a/npc/functions/hub.txt b/npc/functions/hub.txt index ff88bc9c4..18be56672 100644 --- a/npc/functions/hub.txt +++ b/npc/functions/hub.txt @@ -1418,6 +1418,8 @@ function script HUB_PCBonus { bonus bMaxSP, 40; if (getq(HalinarzoQuest_Speed) > 1) bonus bSpeedAddRate, min(getq(HalinarzoQuest_Speed)-1, 10); + if (MOUBOOTAUR_OINTMENT) + bonus bMaxHP, min(2500, MOUBOOTAUR_OINTMENT); /* Stat reassignment */ bonus bMaxHP, (readparam2(bVit)*2)-(readparam2(bAgi)*2); diff --git a/npc/functions/util.txt b/npc/functions/util.txt index 893ebcbdf..2393ca1df 100644 --- a/npc/functions/util.txt +++ b/npc/functions/util.txt @@ -1150,6 +1150,8 @@ function script POL_LocToTP { // TODO: Change this to use npc/config/location.txt instead if (.@tw$ == "FROSTIA") return TP_FROST; + if (.@tw$ == "HEART" || .@tw$ == "ENDGAME") + return TP_HEART; return Exception("Invalid town requested / POL_LocToTP", RB_DEFAULT|RB_SPEECH, -1); } diff --git a/npc/items/teleporter.txt b/npc/items/teleporter.txt index 81ea4f1f3..bfb6cc1cf 100644 --- a/npc/items/teleporter.txt +++ b/npc/items/teleporter.txt @@ -36,6 +36,12 @@ OnUse: } // TODO: Are you already at target point? + // In some cases, you're not allowed to use it + if (@itemid == EvilWarpCrystal && !MK_WINNER) { + dispbottom l("The Crystal doesn't react. You most likely cannot use this item yet."); + ReturnItem(true); + } + // The chance to break is always at least 20% // Begins at 100% and each second will subtract 0.01% // It will never go below 5%, which happens after x seconds -- cgit v1.2.3-70-g09d2