summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2025-03-22 22:08:26 -0300
committerJesusaves <cpntb1@ymail.com>2025-03-22 22:08:26 -0300
commita1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5 (patch)
tree9fcd8a73a344d73ca56e03bfc3cd10b22ae7f6c5
parent2a9075b1aa53d23e31c4ade4de407e4055a41562 (diff)
downloadserverdata-a1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5.tar.gz
serverdata-a1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5.tar.bz2
serverdata-a1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5.tar.xz
serverdata-a1085cbf65d0f14ae8b8055dc8fbd1a43e404fc5.zip
Optional Dungeon
-rw-r--r--conf/map/maps.conf1
-rw-r--r--db/constants.conf1
-rw-r--r--db/map_index.txt271
-rw-r--r--db/re/item_db.conf66
-rw-r--r--db/re/map_zone_db.conf89
-rw-r--r--db/re/mob_db.conf270
-rw-r--r--maps/re/026-6.mcachebin533 -> 548 bytes
-rw-r--r--maps/re/026-8.mcachebin0 -> 1473 bytes
-rw-r--r--npc/005-2/saxsochest.txt1
-rw-r--r--npc/026-6/_mobs.txt2
-rw-r--r--npc/026-6/_warps.txt22
-rw-r--r--npc/026-6/ctrl.c50
-rw-r--r--npc/026-8/_import.txt5
-rw-r--r--npc/026-8/_mobs.txt11
-rw-r--r--npc/026-8/_warps.txt3
-rw-r--r--npc/026-8/ctrl.c64
-rw-r--r--npc/042-3/jail.txt2
-rw-r--r--npc/_import.txt1
-rw-r--r--npc/config/location.txt10
-rw-r--r--npc/functions/hub.txt2
-rw-r--r--npc/functions/util.txt2
-rw-r--r--npc/items/teleporter.txt6
22 files changed, 736 insertions, 143 deletions
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
}
@@ -699,6 +702,92 @@ zones: (
}
},
{
+ /* 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"
mapflags: (
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
--- a/maps/re/026-6.mcache
+++ b/maps/re/026-6.mcache
Binary files differ
diff --git a/maps/re/026-8.mcache b/maps/re/026-8.mcache
new file mode 100644
index 000000000..1c65f4ba4
--- /dev/null
+++ b/maps/re/026-8.mcache
Binary files 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