diff options
author | Jesusaves <cpntb1@ymail.com> | 2024-12-31 01:47:07 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2024-12-31 01:47:07 -0300 |
commit | cf65e1dff480e01ab7bbeb6a8139056bbc88d7f3 (patch) | |
tree | f70261aad31f7dd3898ac484d9f2edf6176e20a8 | |
parent | 74b73eaa35bdd0c4dcec102730473788636a5fac (diff) | |
download | serverdata-cf65e1dff480e01ab7bbeb6a8139056bbc88d7f3.tar.gz serverdata-cf65e1dff480e01ab7bbeb6a8139056bbc88d7f3.tar.bz2 serverdata-cf65e1dff480e01ab7bbeb6a8139056bbc88d7f3.tar.xz serverdata-cf65e1dff480e01ab7bbeb6a8139056bbc88d7f3.zip |
This should be good enough for now.
Actually, this is a VERY GOOD idea, but it would take inordiate amounts of time
to implement everywhere. For now, this limited implementation will have to suffice.
It requires some tests in instanced maps (i.e. crash possible)
It also requires some more logic and randomness on the time (not fixed at 05:51)
Also, OnInit + OnClock0551 might overlap the NPCs, but they have unique IDs so...
...No crashes, just "exploits", hopefully
-rw-r--r-- | npc/functions/treasure.txt | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/npc/functions/treasure.txt b/npc/functions/treasure.txt index 489c3c407..fbcf80bec 100644 --- a/npc/functions/treasure.txt +++ b/npc/functions/treasure.txt @@ -75,3 +75,209 @@ function script TreasureBox { return; } +////////////////////////////// +// Dungeon's Points Of Interest +// A Point Of Interest is a temporary duplicate NPC which is randomly +// created & assigned to key points and contains minor stuff you can loot. +// #DungeonPOI controls the duplication, and #DungeonPOI_Type<%02d> is the type +boss,0,0,0 script #DungeonPOI_Type01 NPC_NO_SPRITE,0,0,{ + // Someone already looted this before you + if (.empty) end; + // You are the first one looting this, so provision space + inventoryplace NPCEyes, 1; + inventoryplace Iten, 1; + // No one else can now loot this + .empty = true; + // Retrieve the item from Type 1 list + // relative_array_random() + setarray(.@prizes, 0, + TolchiAmmoBox, 100, + TrainingAmmoBox, 75, + ArrowAmmoBox, 50, + IronAmmoBox, 35, + BigArrowSack, 20, + MysteriousBottle, 7, + SmokeGrenade, 7, + IronPowder, 3, + CottonCloth, 6, + TreasureKey, 60, + StrangeCoin, 1, + PileOfAsh, 5, + EverburnPowder, 2, + EarthPowder, 2, + ShadowHerb, 3 + ); + // Some are conditional unlocks + if ($ARKIM_ST >= 1400) { + array_push(.@prizes, CursedAmmoBox); + array_push(.@prizes, 25); + } + if ($ARKIM_ST >= 2800) { + array_push(.@prizes, PoisonAmmoBox); + array_push(.@prizes, 15); + } + if ($ARKIM_ST >= 10000 && $GAME_STORYLINE >= 4) { + array_push(.@prizes, ThornAmmoBox); + array_push(.@prizes, 5); + } + if ($ARKIM_ST >= 10000 && $GAME_STORYLINE >= 5) { + array_push(.@prizes, BoneAmmoBox); + array_push(.@prizes, 1); + } + // Story-limited content + if ($GAME_STORYLINE < 5) { + array_push(.@prizes, EmptyBottle); + array_push(.@prizes, 5); + array_push(.@prizes, MintDonut); + array_push(.@prizes, 4); + array_push(.@prizes, ChocolateDonut); + array_push(.@prizes, 4); + array_push(.@prizes, StrawberryDonut); + array_push(.@prizes, 4); + array_push(.@prizes, ScrollBattlePlansA); + array_push(.@prizes, 2); + array_push(.@prizes, ScrollCriticalFortuneA); + array_push(.@prizes, 2); + } else { + array_push(.@prizes, MintDonut); + array_push(.@prizes, 2); + array_push(.@prizes, ChocolateDonut); + array_push(.@prizes, 2); + array_push(.@prizes, StrawberryDonut); + array_push(.@prizes, 2); + array_push(.@prizes, EmptyBottle); + array_push(.@prizes, 2); + } + // Decide what you'll find this time + .@item = relative_array_random(.@prizes); + dispbottom l("You've found a(n) %s.", getitemname(.@item)); + getitem .@item, 1; + // Expire the instance as soon as reasonable + .@t = htget($@_DUPES, .name$, 0); + if (.@t) { + .@t = min(gettimetick(2)+2, .@t); + htput($@_DUPES, .name$, .@t); + } + end; + +OnInit: + .distance = 1; + .empty = false; + end; + +} + + +boss,0,0,0 script #DungeonPOI_Type02 NPC_NO_SPRITE,0,0,{ + // Someone already looted this before you + if (.empty) end; + // You are the first one looting this, so provision space + inventoryplace NPCEyes, 1; + inventoryplace Iten, 1; + // No one else can now loot this + .empty = true; + // Retrieve the item from Type 2 list + // relative_array_random() + setarray(.@prizes, 0, + Bread, 10, + Tomato, 8, + Potatoz, 6, + ChickenLeg, 5, + Cheese, 5, + Curshroom, 3, + MoubooSteak, 3, + SnakeEgg, 2, + Orange, 1, + Pear, 1, + TonoriDelight, 1 + ); + // Decide what you'll find this time + .@item = relative_array_random(.@prizes); + dispbottom l("You've found a(n) %s.", getitemname(.@item)); + getitem .@item, 1; + // Expire the instance as soon as reasonable + .@t = htget($@_DUPES, .name$, 0); + if (.@t) { + .@t = min(gettimetick(2)+2, .@t); + htput($@_DUPES, .name$, .@t); + } + end; + +OnInit: + .distance = 1; + .empty = false; + end; + +} + + +// Core logic +- script #DungeonPOI NPC_HIDDEN,{ + function create_poi; + function p; + end; +OnInit: + .offset = 0; +OnClock0551: + // 026-2 Impregnable Fortress B2F + create_poi("026-2", 44, 30, 1, p(15)); + create_poi("026-2", 89, 57, 1, p(15)); + create_poi("026-2", 95, 68, 1, p(15)); + create_poi("026-2", 48, 89, 1, p(15)); + create_poi("026-2", 32, 68, 1, p(15)); + create_poi("026-2", 27, 50, 1, p(15)); + // 026-0 Impregnable Fortress B0F + create_poi("026-0", 91, 69, 2, p(100)); + create_poi("026-0", 29, 38, 1, p(15)); + create_poi("026-0", 89, 25, 1, p(30)); + create_poi("026-0", 97, 25, 1, p(30)); + // 027-7 Magic Academy Storage Room + create_poi("027-7", 34, 41, 1, p(5)); + create_poi("027-7", 36, 41, 1, p(5)); + create_poi("027-7", 31, 41, 1, p(5)); + create_poi("027-7", 34, 41, 1, p(5)); + create_poi("027-7", 23, 40, 2, p(5)); + create_poi("027-7", 51, 41, 1, p(5)); // Sack + create_poi("027-7", 34, 32, 1, p(5)); + create_poi("027-7", 36, 32, 1, p(5)); + create_poi("027-7", 21, 32, 1, p(5)); + create_poi("027-7", 27, 20, 1, p(5)); + create_poi("027-7", 34, 20, 1, p(5)); + create_poi("027-7", 46, 20, 1, p(5)); + create_poi("027-7", 48, 20, 1, p(5)); + create_poi("027-7", 58, 20, 1, p(5)); + // 015-2 Bandit Cave + create_poi("015-2", 264, 172, 1, p(40)); + create_poi("015-2", 266, 170, 1, p(10)); + create_poi("015-2", 247, 233, 1, p(40)); + create_poi("015-2", 244, 237, 1, p(20)); + create_poi("015-2", 260, 237, 1, p(60)); + if ($GAME_STORYLINE >= 4) + create_poi("015-2", 262, 246, 2, p(20)); + // I have no idea how Kamelot would behave to this!! + // Same for Gemini Sisters + // Tests must be done first + end; + +// p({base}) aka. probability given storyline step (with rounding) +function p { + return getarg(0) * min(5, max(1, $GAME_STORYLINE)) / 5; +} + +// create_poi(map, x, y, type, probability) +function create_poi { + if (rand2(100) > getarg(4)) return; + .offset += 1; + .@n$ = sprintf("#POI_%06d_%02d_%03d", .offset, .@id, htsize($@_DUPES)); + .@m$ = getarg(0); + .@x = getarg(1); + .@y = getarg(2); + .@id = getarg(3); + npc_duplicate(sprintf("#DungeonPOI_Type%02d", .@id), .@n$, .@m$, .@x, .@y, NPC_NO_SPRITE, 0, 0, 0); + htput($@_DUPES, .@n$, gettimetick(2) + 86400); + return; +} + +} + + |