فهرست منبع

Merge branch 'master' into cleanup/sc_display

# Conflicts:
#	src/map/clif.cpp
#	src/map/clif.hpp
#	src/map/status.cpp
#	src/map/status.hpp
Lemongrass3110 2 ماه پیش
والد
کامیت
934f469ecd
100فایلهای تغییر یافته به همراه10356 افزوده شده و 893 حذف شده
  1. 1 1
      .github/CONTRIBUTING.md
  2. 1 1
      3rdparty/httplib/CMakeLists.txt
  3. 1 1
      3rdparty/json/CMakeLists.txt
  4. 1 1
      3rdparty/rapidyaml/CMakeLists.txt
  5. 1 1
      3rdparty/rapidyaml/ext/c4core/src/c4/ext/fast_float/CMakeLists.txt
  6. 1 1
      3rdparty/yaml-cpp/CMakeLists.txt
  7. 1 8
      CMakeLists.txt
  8. 463 16
      conf/atcommands.yml
  9. 7 6
      conf/battle/battle.conf
  10. 6 2
      conf/battle/client.conf
  11. 5 0
      conf/battle/exp.conf
  12. 9 0
      conf/battle/feature.conf
  13. 44 24
      conf/battle/monster.conf
  14. 15 6
      conf/battle/player.conf
  15. 16 3
      conf/battle/skill.conf
  16. 1 0
      conf/maps_athena.conf
  17. 8 5
      conf/msg_conf/map_msg.conf
  18. 3 3
      conf/msg_conf/map_msg_idn.conf
  19. 3 3
      conf/msg_conf/map_msg_por.conf
  20. 4 4
      conf/msg_conf/map_msg_spn.conf
  21. 4 1
      db/import-tmpl/job_stats.yml
  22. 2 0
      db/import-tmpl/mob_skill_db.txt
  23. 3 3
      db/import-tmpl/skill_db.yml
  24. 4 1
      db/job_stats.yml
  25. BIN
      db/map_cache.dat
  26. 1 0
      db/map_index.txt
  27. 2 1
      db/pre-re/item_db_equip.yml
  28. 4 1
      db/pre-re/job_aspd.yml
  29. 4 1
      db/pre-re/job_basepoints.yml
  30. 4 1
      db/pre-re/job_exp.yml
  31. 4 1
      db/pre-re/job_stats.yml
  32. 5 3
      db/pre-re/mob_skill_db.txt
  33. 19 110
      db/pre-re/skill_db.yml
  34. 12 21
      db/pre-re/status.yml
  35. 7 0
      db/re/instance_db.yml
  36. 304 304
      db/re/item_combos.yml
  37. 666 64
      db/re/item_db_equip.yml
  38. 693 44
      db/re/item_db_etc.yml
  39. 1024 4
      db/re/item_db_usable.yml
  40. 580 1
      db/re/item_enchant.yml
  41. 2100 5
      db/re/item_group_db.yml
  42. 62 6
      db/re/item_packages.yml
  43. 209 1
      db/re/item_reform.yml
  44. 4 1
      db/re/job_aspd.yml
  45. 183 1
      db/re/job_basepoints.yml
  46. 4 1
      db/re/job_exp.yml
  47. 10 5
      db/re/job_stats.yml
  48. 128 0
      db/re/map_drops.yml
  49. 46 4
      db/re/mob_db.yml
  50. 5 3
      db/re/mob_skill_db.txt
  51. 268 1
      db/re/pet_db.yml
  52. 28 0
      db/re/quest_db.yml
  53. 31 97
      db/re/skill_db.yml
  54. 309 0
      db/re/skill_tree.yml
  55. 132 24
      db/re/status.yml
  56. 3 3
      db/skill_db.yml
  57. 3 1
      doc/item_bonus.txt
  58. 5 0
      doc/mob_db_mode_list.txt
  59. 31 0
      doc/sample/getguildinfo.txt
  60. 86 44
      doc/script_commands.txt
  61. 3 0
      doc/yaml/db/job_basepoints.yml
  62. 3 0
      doc/yaml/db/job_exp.yml
  63. 3 0
      doc/yaml/db/job_stats.yml
  64. 2 2
      doc/yaml/db/skill_db.yml
  65. 6 0
      doc/yaml/sql/mob_db.sql
  66. 6 0
      doc/yaml/sql/mob_db2.sql
  67. 6 0
      doc/yaml/sql/mob_db2_re.sql
  68. 2 0
      doc/yaml/sql/mob_db_re.sql
  69. 26 6
      npc/cities/umbala.txt
  70. 2 2
      npc/custom/events/disguise.txt
  71. 8 8
      npc/custom/quests/hunting_missions.txt
  72. 1 1
      npc/custom/quests/kahohorn.txt
  73. 4 4
      npc/custom/quests/questboard.txt
  74. 2 2
      npc/guild/agit_main.txt
  75. 1 1
      npc/other/arena/arena_room.txt
  76. 1 1
      npc/other/mercenary_rent.txt
  77. 2 2
      npc/pre-re/mobs/dungeons/lhz_dun.txt
  78. 540 0
      npc/re/instances/DeepForest.txt
  79. 1248 0
      npc/re/jobs/doram/spirit_handler.txt
  80. 5 0
      npc/re/mapflag/nobranch.txt
  81. 5 0
      npc/re/mapflag/nomemo.txt
  82. 6 0
      npc/re/mapflag/noteleport.txt
  83. 5 0
      npc/re/mapflag/nowarpto.txt
  84. 5 0
      npc/re/mapflag/partylock.txt
  85. 5 0
      npc/re/mapflag/restricted.txt
  86. 1 1
      npc/re/merchants/3rd_trader.txt
  87. 7 7
      npc/re/merchants/Extended_Ammunition.txt
  88. 3 3
      npc/re/merchants/barters/Extended_Ammunition.yml
  89. 722 0
      npc/re/merchants/barters/cashmall.yml
  90. 52 0
      npc/re/merchants/cashmall.txt
  91. 1 2
      npc/re/merchants/shops.txt
  92. 4 4
      npc/re/mobs/dungeons/lhz_dun.txt
  93. 75 0
      npc/re/other/kachua_key.txt
  94. 1 1
      npc/re/quests/cupet.txt
  95. 2 0
      npc/re/scripts_athena.conf
  96. 2 0
      npc/re/scripts_jobs.conf
  97. 3 2
      sql-files/main.sql
  98. 2 0
      sql-files/mob_db.sql
  99. 2 0
      sql-files/mob_db2.sql
  100. 2 0
      sql-files/mob_db2_re.sql

+ 1 - 1
.github/CONTRIBUTING.md

@@ -65,7 +65,7 @@ Suggesting Enhancements
 
 1. Make sure you have a [GitHub account](https://github.com/signup/free).
 2. Next, you will need to [fork rAthena](https://help.github.com/articles/fork-a-repo/#fork-an-example-repository) to your account.
-3. Before making changes, make sure you [create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) for your working tree.
+3. Before making changes, make sure you [create a new branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) for your working tree. Never use your **master** branch! :bangbang:
 4. After completing your changes, commit and push it to your branch.
 5. Now you are ready to [create a Pull Request](https://help.github.com/articles/creating-a-pull-request/) for rAthena!
   * Upon creating the Pull Request, make sure you follow our [template](https://github.com/rathena/rathena/blob/master/.github/PULL_REQUEST_TEMPLATE.md) and provide the required information.

+ 1 - 1
3rdparty/httplib/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.13)
 
 if ( NOT ENABLE_WEB_SERVER )
     return()

+ 1 - 1
3rdparty/json/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.13)
 
 set (JSON_INCLUDE_DIRS
     "${CMAKE_CURRENT_SOURCE_DIR}/include"

+ 1 - 1
3rdparty/rapidyaml/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.12)
+cmake_minimum_required(VERSION 3.13)
 include(./ext/c4core/cmake/c4Project.cmake)
 project(ryml
     DESCRIPTION "Rapid YAML parsing and emitting"

+ 1 - 1
3rdparty/rapidyaml/ext/c4core/src/c4/ext/fast_float/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.9)
+cmake_minimum_required(VERSION 3.13)
 
 project(fast_float VERSION 3.4.0 LANGUAGES CXX)
 option(FASTFLOAT_TEST "Enable tests" OFF)

+ 1 - 1
3rdparty/yaml-cpp/CMakeLists.txt

@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.13)
 
 ## start setting
 SET (this_target yaml-cpp)

+ 1 - 8
CMakeLists.txt

@@ -22,15 +22,8 @@
 #####################################################################
 
 
-#cmake_minimum_required( VERSION 2.8.4 )
-# Functional changes from 2.8.3 to 2.8.4:
-#   string(SUBSTRING) works with length -1 as "rest of string"
-#   changes to some CPack generators
-#   CYGWIN no longer defines WIN32
-#   CMP0017: Prefer files from the CMake module directory when including from there.
-# Update to 3.1 for CMAKE_CXX_STANDARD cross support definition
 set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
-cmake_minimum_required( VERSION 3.1 )
+cmake_minimum_required( VERSION 3.13 )
 project( rAthena )
 if( CYGWIN )
 	unset( WIN32 )

+ 463 - 16
conf/atcommands.yml

@@ -39,10 +39,17 @@ Body:
   - Command: accinfo
     Aliases:
       - accountinfo
+    Help: |
+      Params: <char name>. Searches for a character with the name <char name>. You may use % as a placeholder.
+      Params: <account ID>. Searches login information for the account <account ID>.
+      Displays basic information about the account with the account ID <account ID> or with the character <char name> on it.
   - Command: addfame
     Aliases:
       - famepoint
       - famepoints
+    Help: |
+      Params: <amount>.
+      Adds or reduces the player's fame points by <amount>.
   - Command: addperm
     Help: |
       Params: <permission_name>
@@ -54,6 +61,10 @@ Body:
     Help: |
       Params: <level> <char name>
       Do a temporary adjustment of the group level of a player.
+  - Command: adopt
+    Help: |
+      Params: <char name>
+      Adopts the specified player <char name>.
   - Command: agi
     Help: |
       Params: <amount>
@@ -61,12 +72,27 @@ Body:
   - Command: agitend
     Help: |
       End War of Emperium
+  - Command: agitend2
+    Help: |
+      End War of Emperium SE
+  - Command: agitend3
+    Help: |
+      End War of Emperium TE
   - Command: agitstart
     Help: |
       Starts War of Emperium
+  - Command: agitstart2
+    Help: |
+      Starts War of Emperium SE
+  - Command: agitstart3
+    Help: |
+      Starts War of Emperium TE
   - Command: alive
     Help: |
       Revives yourself from death.
+  - Command: allowks
+    Help: |
+      Enables or disables kill stealing on this map.
   - Command: allskill
     Aliases:
       - allskills
@@ -74,6 +100,9 @@ Body:
       - skillsall
     Help: |
       Give you all skills.
+  - Command: auction
+    Help: |
+      Opens the auction window.
   - Command: autoloot
     Help: |
       Params: <on|off|#>
@@ -81,14 +110,36 @@ Body:
   - Command: autolootitem
     Aliases:
       - alootid
+    Help: |
+      Params: None. Shows a short help.
+      Params: +<Item ID> to add an item ID
+      Params: -<Item ID> to remove an item ID
+      Params: reset to remove all item IDs
+      Makes items of this specific item ID go straight into your inventory.
   - Command: autoloottype
     Aliases:
       - aloottype
+    Help: |
+      Params: None. Shows a short help.
+      Params: +<type name/ID> to add an item type
+      Params: -<type name/ID> to remove an item type
+      Params: reset to remove all item types
+      Makes items of this specific item type go straight into your inventory.
+      Type List:
+        healing = 0, usable = 2, etc = 3, weapon = 4, armor = 5,
+        card = 6, petegg = 7, petarmor = 8, ammo = 10
   - Command: autotrade
     Aliases:
       - at
     Help: |
       Allows you to vend while you are offline.
+  - Command: ban
+    Aliases:
+      - banish
+    Help: |
+      Params: <time> <name>\n" "Temporarily ban an account.
+      time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)
+      Example: @ban +1m-2mn1s-6y testplayer
   - Command: baselevelup
     Aliases:
       - baselevel
@@ -101,6 +152,14 @@ Body:
     Help: |
       Params: <number of levels>
       Raises your base level the desired number of levels.
+  - Command: bodystyle
+    Help: |
+      Params: <bodystyle> - value between 0-1
+      Changes the character's bodystyle to <bodystyle>.
+  - Command: breakguild
+    Help: |
+      Breaks the guild of the attached character.
+      You must be the guildmaster to use this command.
   - Command: broadcast
     Help: |
       Params: <message>
@@ -111,6 +170,17 @@ Body:
       - setcamera
     Help: |
       Shows or updates the client's camera settings.
+  - Command: cart
+    Help: |
+      Params: <cart ID>
+      Gives or removes a cart to a player and also change the cart skin.
+      Available cart IDs:
+          0: remove cart
+        1-5: normal carts
+        6-9: new carts
+  - Command: cartlist
+    Help: |
+      Displays a list of items in the cart.
   - Command: cash
     Help: |
       Params: <amount> - Gives you the specified amount of cash points.
@@ -130,18 +200,35 @@ Body:
   - Command: channel
     Aliases:
       - main
+    Help: |
+      If you run this command without any parameters, you will get a more detailed help information.
+  - Command: changecharsex
+    Help: |
+      Changes your character's gender.
+  - Command: changelook
+    Help: |
+      Params: <position> <view ID>
+      Changes the player's appearance to the specified view ID.
+      Available positions:
+        1: Top
+        2: Middle
+        3: Bottom
+        4: Weapon
+        5: Shield
+        6: Shoes
+        7: Robe
+        8: Bodystyle
   - Command: changesex
     Help: |
-      Changes your gender.
+      Changes your account's gender.
   - Command: char_ban
     Aliases:
-      - ban
-      - banish
       - charban
     Help: |
-      Params: <time> <name>\n" "Temporarily ban an account.
+      Params: <time> <name>
+      Temporarily ban a character.
       time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)
-      Example: @ban +1m-2mn1s-6y testplayer
+      Example: @char_ban +1m-2mn1s-6y testplayer
   - Command: char_block
     Aliases:
       - block
@@ -151,16 +238,48 @@ Body:
   - Command: char_unban
     Aliases:
       - charunban
-      - unban
-      - unbanish
     Help: |
-      Params: <name> - Unban an account
+      Params: <name>
+      Unban a character
   - Command: char_unblock
     Aliases:
       - unblock
     Help: |
       Params: <char name>
       Unblocks an account.
+  - Command: charcommands
+    Help: |
+      Displays a list of charcommands that you can use.
+  - Command: checkquest
+    Help: |
+      Params: <quest ID>
+      Shows status information for the quest with quest ID <quest ID>.
+  - Command: clanspy
+    Help: |
+      Params: <clan name|id>
+      You will receive all messages of the clan chat (Chat logging must be enabled)
+  - Command: cleanarea
+    Aliases:
+      - cleararea
+    Help: |
+      Deletes floor items in sight range.
+  - Command: cleanmap
+    Aliases:
+      - clearmap
+    Help: |
+      Deletes floor items on the current map.
+  - Command: clearcart
+    Help: |
+      Deletes all items in the cart.
+  - Command: cleargstorage
+    Help: |
+      Deletes all items in the guild storage.
+  - Command: clearstorage
+    Help: |
+      Deletes all items in the storage.
+  - Command: clearweather
+    Help: |
+      Stops all weather effects on the current map.
   - Command: clone
     Help: |
       Params: <charname>
@@ -168,9 +287,17 @@ Body:
   - Command: cloneequip
     Aliases:
       - eqclone
+    Help: |
+      Params: <char name>
+      Params: <char ID>
+      Copies the equipment of player <char name/char ID>.
   - Command: clonestat
     Aliases:
       - stclone
+    Help: |
+      Params: <char name>
+      Params: <char ID>
+      Copies the status values of player <char name/char ID>.
   - Command: clouds
     Help: |
       Makes all maps to have the cloudy weather effect.
@@ -179,11 +306,25 @@ Body:
       Makes all maps to have another cloudy weather effect.
   - Command: commands
     Help: |
-      Displays a list of commands that you can use.
+      Displays a list of atcommands that you can use.
+  - Command: completequest
+    Help: |
+      Params: <quest ID>
+      Completes the quest with quest ID <quest ID>.
   - Command: con
     Help: |
       Params: <amount>
       Raises CON by given amount.
+  - Command: costume
+    Help: |
+      Params: <costume>
+      Changes the player's visible appearance to that of the selected <costume>.
+      Available costumes:
+        Hanbok
+        Oktoberfest
+        Summer
+        Wedding
+        Xmas
   - Command: crt
     Help: |
       Params: <amount>
@@ -191,6 +332,11 @@ Body:
   - Command: day
     Help: |
       Disables night mode and restores regular lighting, all characters are affected.
+  - Command: delitem
+    Help: |
+      Params: <item name> <amount>
+      Params: <item ID> <amount>
+      Deletes <amount> of the specified item <item name/ID> from the player's inventory.
   - Command: dex
     Help: |
       Params: <amount>
@@ -199,9 +345,30 @@ Body:
     Help: |
       Params: <monster name|ID>
       Change your appearence to other players to a mob.
+  - Command: disguiseall
+    Help: |
+      Params: <monster name|ID>
+      Disguises all online characters.
   - Command: disguiseguild
     Help: |
+      Params: <monster name|ID>
       Disguises all online characters of a guild.
+  - Command: displayskill
+    Help: |
+      Params: <skill ID> {<skill level>}
+      Displays the skill animation of a skill without really using the skill.
+  - Command: displayskillcast
+    Help: |
+      Params: <skill ID> {<skill level> <ground target flag> <cast time>}
+      Displays the cast animation of a skill without really casting the skill.
+  - Command: displayskillunit
+    Help: |
+      Params: <skill unit ID> {<skill level> <range>}
+      Displays the skill unit animation of a skill unit without really using the skill.
+  - Command: displaystatus
+    Help: |
+      Params: <status ID> <flag> <tick> {<val1> <val2> <val3>}
+      Displays the status animation of a status change without really having the status change.
   - Command: divorce
     Help: |
       Divorce player.
@@ -235,6 +402,10 @@ Body:
   - Command: enchantgradeui
     Help: |
       Opens the enchantgrade UI.
+  - Command: erasequest
+    Help: |
+      Params: <quest ID>
+      Removes the quest <quest ID> from the quest log.
   - Command: evilclone
     Help: |
       Params: <charname>
@@ -246,16 +417,42 @@ Body:
     Help: |
       Params: <name>
       Changes your name to your choice temporarily.
+  - Command: feelreset
+    Help: |
+      Resets a Star Gladiator's marked maps.
   - Command: fireworks
     Help: |
       Makes all maps to have the fireworks weather effect.
   - Command: fog
     Help: |
       Makes all maps to have the fog weather effect.
+  - Command: font
+    Help: |
+      Params: <type> - value between 0-9
+      Sets the client font to <type>.
+      Available types:
+        0: Default
+        1: RixLoveangel
+        2: RixSquirrel
+        3: NHCgogo
+        4: RixDiary
+        5: RixMiniHeart
+        6: RixFreshman
+        7: RixKid
+        8: RixMagic
+        9: RixJJangu
+  - Command: fontcolor
+    Help: |
+      Params: <color_name>
+      Sets channel chat font color for the invoking character only.
   - Command: follow
     Help: |
       Params: <char name>
       Follow a player.
+  - Command: fullstrip
+    Help: |
+      Params: <char name>
+      Unequips all items currently equipped by <char name>.
   - Command: gat
     Help: |
       For debugging (you inspect around gat)
@@ -307,7 +504,8 @@ Body:
       Warps all online characters of a guild to you.
   - Command: guildspy
     Help: |
-      Params: <guild name|id> - You will receive all messages of the guild channel (Chat logging must be enabled)
+      Params: <guild name|id>
+      You will receive all messages of the guild chat (Chat logging must be enabled)
   - Command: guildstorage
     Aliases:
       - gstorage
@@ -340,6 +538,9 @@ Body:
   - Command: hatch
     Help: |
       Create a pet from your inventory eggs list.
+  - Command: hatereset
+    Help: |
+      Resets a Star Gladiator's marked monsters.
   - Command: heal
     Help: |
       Params: [<HP> <SP>]
@@ -364,12 +565,48 @@ Body:
   - Command: homevolution
     Aliases:
       - homevolve
+    Help: |
+      Evolves your homunculus, if possible.
+  - Command: homfriendly
+    Help: |
+      Params: <level of intimacy> - value between 0-1000
+      Sets your homunculus intimacy level to the desired value.
+  - Command: homhungry
+    Help: |
+      Params: <level of hunger> - value between 0-100
+      Sets your homunculus hunger level to the desired value.
+  - Command: hominfo
+    Help: |
+      Displays homunculus stats.
   - Command: homlevel
     Aliases:
       - hlvl
       - hlevel
       - homlvl
       - homlvup
+    Help: |
+      Params: <level>
+      Increases the homunculus level by <level>.
+  - Command: hommutate
+    Help: |
+      Params: <mutated homunculus ID>
+      Mutates your homunculus to <mutated homunculus ID>, if possible.
+  - Command: homshuffle
+    Help: |
+      Recalculates the homunculus stats, as if the homunculus was leveled again from level 1.
+  - Command: homstats
+    Help: |
+      Displays homunculus stats.
+  - Command: homtalk
+    Help: |
+      Params: <message>
+      Let the player's homunculus say the text <message>.
+  - Command: identify
+    Help: |
+      Opens the identification window if any unidentified items are in your inventory.
+  - Command: identifyall
+    Help: |
+      Any unidentified items in your inventory will automatically be identified.
   - Command: idsearch
     Help: |
       Params: <part_of_item_name>
@@ -389,12 +626,37 @@ Body:
     Help: |
       Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>
       Gives you the desired item.
+  - Command: itembound
+    Help: |
+      Params: <item name or ID> <quantity> <bound type>
+      Creates an item bounded to the character.
+      The items cannot be dropped, sold, vended, auctioned, or mailed, and in some cases cannot be traded or stored.
+      Available bound types:
+        1: Account
+        2: Guild
+        3: Party
+        4: Character
+  - Command: itembound2
+    Help: |
+      Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4> <bound type>
+      Creates an item bounded to the character.
+      The items cannot be dropped, sold, vended, auctioned, or mailed, and in some cases cannot be traded or stored.
+      Available bound types:
+        1: Account
+        2: Guild
+        3: Party
+        4: Character
   - Command: iteminfo
     Aliases:
       - ii
     Help: |
       Params: <item name|ID>
       Shows item info (type, price etc).
+  - Command: itemlist
+    Aliases:
+      - inventorylist
+    Help: |
+      Displays a list of items in the inventory.
   - Command: itemreset
     Aliases:
       - clearinventory
@@ -402,7 +664,15 @@ Body:
       Remove all your items.
   - Command: jail
     Help: |
-      Params: <char name> - Sends specified character in jails
+      Params: <char name>
+      Sends specified character in jails.
+  - Command: jailfor
+    Help: |
+      Params: <time> <char name>
+      Sends specified character in jails for the given <time>.
+  - Command: jailtime
+    Help: |
+      Displays remaining jail time.
   - Command: jobchange
     Aliases:
       - job
@@ -476,6 +746,10 @@ Body:
     Help: |
       Params: <number of levels>
       Raises your job level the desired number of levels.
+  - Command: join
+    Help: |
+      Params: <#channel_name> {<password>}
+      Joins the specified channel <#channel_name>, if necessary by using the supplied <password>.
   - Command: jump
     Help: |
       Params: [<x> [<y>]]
@@ -495,6 +769,10 @@ Body:
     Help: |
       Params: <message>
       Broadcasts a message without your name (in blue).
+  - Command: kamic
+    Help: |
+      Params: <color> <message> - color is a hexadecimal value
+      Broadcasts a message without your name in the color <color>.
   - Command: kick
     Help: |
       Params: <char name>
@@ -509,7 +787,10 @@ Body:
       Kills player.
   - Command: killable
     Help: |
-      Make your character killable.
+      Allows other players to attack you outside of PvP.
+  - Command: killer
+    Help: |
+      Allows you to attack other players outside of PvP.
   - Command: killmonster
     Help: |
       Params: <map>
@@ -520,6 +801,12 @@ Body:
   - Command: ksprotection
     Aliases:
       - noks
+    Help: |
+      Params: None. Disables kill stealing protection or displays a help message.
+      Params: self. Enables kill stealing protection against any other players.
+      Params: party. Enables kill stealing protection against any other players not in your party.
+      Params: guilds. Enables kill stealing protection against any other players not in your guild.
+      Prevents other players from kill stealing.
   - Command: langtype
     Help: |
       Params: <language>
@@ -533,6 +820,10 @@ Body:
   - Command: limitedsale
     Help: |
       Opens the limited sale window.
+  - Command: lkami
+    Help: |
+      Params: <message>
+      Broadcasts a message without your name on the current map (in yellow).
   - Command: load
     Aliases:
       - return
@@ -574,6 +865,10 @@ Body:
     Help: |
       Params: <amount>
       Raises LUK by given amount.
+  - Command: macrochecker
+    Help: |
+      Params: <mapname>
+      Trigger a macro detection on all players of the given map.
   - Command: mail
     Help: |
       Open mail box.
@@ -581,12 +876,22 @@ Body:
     Help: |
       Params: <pet_id>
       Gives pet egg for monster number in pet DB
+  - Command: makehomun
+    Help: |
+      Params: <homunculus ID>
+      Creates a homunculus with the given <homunculus ID>.
   - Command: mapexit
     Help: |
       Kick all players and shut down map-server.
+  - Command: mapflag
+    Help: |
+      Params: None - Shows mapflags that are active on the current map.
+      Params: "available" - Shows a list of possible mapflags.
+      Params: <name> - Activates mapflag <name> on the current map.
   - Command: mapinfo
     Help: |
-      Params: [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: chatrooms).
+      Params: [<0-3> [map]]
+      Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: chatrooms).
   - Command: mapmove
     Aliases:
       - rura
@@ -606,6 +911,21 @@ Body:
     Help: |
       Params: [memo position]
       Set/change a memo location (no position: display memo points).
+  - Command: misceffect
+    Help: |
+      Params: <effect ID>
+      Does some visual effect on the character.
+      Available effect IDs:
+        0 = base level up
+        1 = job level up
+        2 = refine failure
+        3 = refine success
+        4 = game over
+        5 = pharmacy success
+        6 = pharmacy failure
+        7 = base level up (super novice)
+        8 = job level up (super novice)
+        9 = base level up (taekwon)
   - Command: mobinfo
     Aliases:
       - monsterinfo
@@ -636,6 +956,8 @@ Body:
   - Command: monsterignore
     Aliases:
       - battleignore
+    Help: |
+      Makes the player unattackable by monsters, other players, etc.
   - Command: monstersmall
     Help: |
       Params: <monster name|ID>
@@ -649,9 +971,16 @@ Body:
   - Command: mount2
     Help: |
       Give/remove a cash mount.
+  - Command: mute
+    Help: |
+      Params: <char name>
+      Mutes the player <char name> (prevents talking, usage of skills, and commands).
   - Command: mutearea
     Aliases:
       - stfu
+    Help: |
+      Params: <time> amount of minutes to mute the players
+      Mutes every player on screen for the specified time (prevents talking, usage of skills, and commands).
   - Command: night
     Help: |
       Enables night mode on all maps, all characters are affected.
@@ -690,10 +1019,18 @@ Body:
     Help: |
       Params: <party_name>
       Create a party.
+  - Command: partyoption
+    Help: |
+      Params: <item sharing> <item distribution> - yes/no
+      Changes party options for item sharing and item distribution.
   - Command: partyrecall
     Help: |
       Params: <party name|ID>
       Warps all online characters of a party to you.
+  - Command: partysharelvl
+    Help: |
+      Params: <level difference>
+      Temporarily adjusts the party share level range to <level difference>.
   - Command: partyspy
     Help: |
       @partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)
@@ -776,9 +1113,21 @@ Body:
   - Command: refine
     Help: |
       Params: <equip position> <+/- amount>
+  - Command: refineui
+    Help: |
+      Opens the refine UI.
+  - Command: refineui
+    Help: |
+      Opens the refine UI.
+  - Command: refresh
+    Help: |
+      Synchronizes the position and state between client and server.
+  - Command: refreshall
+    Help: |
+      Synchronizes the position and state of all players between client and server.
   - Command: reject
     Help: |
-      Rejects an invitation to a duel.
+      Automatically reject duel invitations.
   - Command: reloadachievementdb
     Help: |
       Reload achievement database.
@@ -788,6 +1137,9 @@ Body:
   - Command: reloadattendancedb
     Help: |
       Reload attendance database.
+  - Command: reloadbarterdb
+    Help: |
+      Reload the barter database.
   - Command: reloadbattleconf
     Help: |
       Reload battle settings.
@@ -802,6 +1154,9 @@ Body:
   - Command: reloaditemdb
     Help: |
       Reload item database.
+  - Command: reloadlogconf
+    Help: |
+      Reload the log settings.
   - Command: reloadmobdb
     Help: |
       Reload monster database.
@@ -811,6 +1166,10 @@ Body:
   - Command: reloadmsgconf
     Help: |
       Reload message configuration.
+  - Command: reloadnpcfile
+    Help: |
+      Params: <path> - path to script
+      Unloads and loads a script file from <path>.
   - Command: reloadpcdb
     Help: |
       Reload player settings.
@@ -833,6 +1192,9 @@ Body:
     Help: |
       Params: <message>
       Sends a message to all connected GMs (via the gm whisper system)
+  - Command: reset
+    Help: |
+      Resets the player's status and skill points.
   - Command: resetcooltime
     Aliases:
       - resetcooldown
@@ -841,9 +1203,16 @@ Body:
   - Command: resetskill
     Aliases:
       - skreset
+    Help: |
+      Resets the player's skill points.
   - Command: resetstat
     Aliases:
       - streset
+    Help: |
+      Resets the player's status points.
+  - Command: resurrect
+    Help: |
+      Resurrects a player, if the necessary conditions (items in inventory or status changes) are fulfilled.
   - Command: rmvperm
     Help: |
       Params: <permission_name>
@@ -868,19 +1237,42 @@ Body:
       - time
     Help: |
       Shows the date and time of the server.
-  - Command: setcard 
+  - Command: set
+    Help: |
+      Params: <variable name> {<value>}
+      Shows the value of the variable <variable name>.
+      If a <value> is provided, it changes the variable <variable name> to the given value.
+  - Command: setbattleflag
+    Help: |
+      Params: <battle config name> <value> {<reload>}
+      Changes <battle config name> to <value> without rebooting the server.
+      If <reload> is specified, the monster database will also be reloaded.
+  - Command: setcard
     Help: |
       Adds a card or enchant to the specific slot of the equipment.
+  - Command: setquest
+    Help: |
+      Params: <quest ID>
+      Activates the quest with quest ID <quest ID>.
   - Command: showdelay
     Help: |
       Shows/hides the "There is a delay after this skill" message.
   - Command: showexp
     Help: |
       Displays/hides experience gained.
+  - Command: showmobs
+    Help: |
+      Params: <monster ID>
+      Params: <monster name>
+      Locates and displays the position of a certain mob on your mini-map.
+      This shows up as a small white cross (+).
   - Command: shownpc
     Help: |
       Params: <NPC name>
       Enable a NPC.
+  - Command: showrate
+    Help: |
+      Enable or disable to show the rate information on every mapchange.
   - Command: showzeny
     Help: |
       Displays/hides Zeny gained.
@@ -919,6 +1311,10 @@ Body:
   - Command: snow
     Help: |
       Makes all maps to have the snow weather effect.
+  - Command: soulball
+    Help: |
+      Params: <amount> - value between 0-20
+      Summons the specified <amount> of soul spheres around you.
   - Command: sound
     Help: |
       Params: <path to file in data folder or GRF file>
@@ -948,6 +1344,9 @@ Body:
     Help: |
       Params: <value>
       Adds value in all stats (maximum if no value).
+  - Command: stats
+    Help: |
+      Displays the stats of the player in your chat.
   - Command: statuspoint
     Aliases:
       - stpoint
@@ -963,10 +1362,25 @@ Body:
   - Command: storeall
     Help: |
       Puts all your possessions in storage.
+  - Command: storagelist
+    Help: |
+      Displays a list of items in the storage.
   - Command: str
     Help: |
       Params: <amount>
       Raises STR by given amount.
+  - Command: stylist
+    Help: |
+      Opens the stylist user interface.
+  - Command: summon
+    Help: |
+      Params: <monster name/ID> {<duration>}
+      Spawns the monster with <monster name/ID> and let it treat you as their master.
+      If a duration is specified, it will stay with you until the duration has ended.
+  - Command: tonpc
+    Help: |
+      Params: <NPC name>
+      Warps to the specified NPC.
   - Command: trade
     Help: |
       Params: <char name> - Open a trade window with a another player
@@ -984,9 +1398,17 @@ Body:
       - trpoint
     Help: |
       Params: <number of points> - Gives you the desired number of trait stat points.
+  - Command: unban
+    Aliases:
+      - unbanish
+    Help: |
+      Params: <name> - Unban an account
   - Command: undisguise
     Help: |
       Restore your normal appearance.
+  - Command: undisguiseall
+    Help: |
+      Restore the normal appearance of all connected players.
   - Command: undisguiseguild
     Help: |
       Restore the normal appearance of all characters of a guild.
@@ -1004,9 +1426,16 @@ Body:
     Help: |
       Params: <path>
       Unload the specified script file path.
+  - Command: unmute
+    Help: |
+      Params: <char name>
+      Unmutes the player <char name>.
   - Command: uptime
     Help: |
       Displays how long the server has been online.
+  - Command: users
+    Help: |
+      Displays the distribution of players on the server per map.
   - Command: useskill
     Help: |
       Params: <skillid> <skillv> <target>
@@ -1014,6 +1443,11 @@ Body:
   - Command: version
     Help: |
       Displays SVN version of the server.
+  - Command: vip
+    Help: |
+      Params: <+/- time> <char name>
+      Set a player in VIP mode for a limited time.
+      Time elements: y/a, m, d/j, h, mn, s
   - Command: vit
     Help: |
       Params: <amount>
@@ -1022,6 +1456,10 @@ Body:
     Help: |
       Params: <char name>
       Tells you the location of a character.
+  - Command: whereis
+    Help: |
+      Params: <monster name/ID>
+      Displays the maps in which monster <monster name/ID> normally spawns.
   - Command: who
     Aliases:
       - whois
@@ -1045,7 +1483,16 @@ Body:
       Params: [match_text] - Like @who+@who2+who3, but only for GM.
   - Command: whomap
     Help: |
-      @whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specified map.
+      Params: <mapname>
+      Like @who but only for specified map <mapname>.
+  - Command: whomap2
+    Help: |
+      Params: <mapname>
+      Like @who2 but only for specified map <mapname>.
+  - Command: whomap3
+    Help: |
+      Params: <mapname>
+      Like @who3 but only for specified map <mapname>.
   - Command: wis
     Help: |
       Params: <amount>

+ 7 - 6
conf/battle/battle.conf

@@ -24,12 +24,13 @@ enable_critical: 17
 mob_critical_rate: 100
 critical_rate: 100
 
-// Should normal attacks give you a walk delay? (Note 3)
-// If no, characters can move as soon as they start an attack (attack animation
-// or walk animation may be omitted client-side, causing cropped attacks or
-// monsters that teleport to you)
-// Otherwise, the delay is equal to the 'attack animation' (amotion)
-attack_walk_delay: 15
+// Which unit types should get a walk delay from normal attacks? (Note 3)
+// The delay is equal to the 'attack animation' (amotion). The client already blocks
+// sending movement requests during this time, so for client-controlled characters 
+// this setting is mainly a safety mechanism against client edits.
+// Monsters are usually unaffected by this as their AI is inactive during their attack
+// animation unless you customize their AI (see monster_ai 0x2000 in monster.conf)
+attack_walk_delay: 0
 
 // Move-delay adjustment after being hit. (Note 2)
 // The 'can't walk' delay after being hit is calculated as a percentage of the damage animation duration.

+ 6 - 2
conf/battle/client.conf

@@ -113,8 +113,8 @@ display_status_timers: yes
 // packets for the desired number. (Note 1)
 client_reshuffle_dice: yes
 
-// Sorts the character and guild storage before it is sent to the client.
-// Official servers do not sort storage. (Note 1)
+// Sorts the cart, guild storage, inventory and storage before it is sent to the client. (Note 1)
+// Official servers do not sort them.
 // NOTE: Enabling this option degrades performance.
 client_sort_storage: no
 
@@ -169,3 +169,7 @@ macro_detection_punishment: 0
 // Amount of time in minutes that the punishment type is active for. Use 0 for infinite.
 // Official: 0
 macro_detection_punishment_time: 0
+
+// Macrochecker delay (per map)
+// Set to 0 to disable
+macrochecker_delay: 600000

+ 5 - 0
conf/battle/exp.conf

@@ -45,6 +45,11 @@ exp_bonus_attacker: 25
 // (eg: if set at 5, the max bonus is 4*bonus-per-char regardless of attackers)
 exp_bonus_max_attacker: 12
 
+// Should casting skills that deal no damage still make you count as an attacker? (Note 1)
+// Setting this to yes makes skills like Lex Aeterna increase the exp a monster gives.
+// Officially you need to deal damage for it to count. 
+exp_bonus_nodamage_attacker: no
+
 // MVP bonus exp rate. (Note 2)
 mvp_exp_rate: 100
 

+ 9 - 0
conf/battle/feature.conf

@@ -165,6 +165,15 @@ feature.mesitemlink_brackets: no
 // Default: no
 feature.mesitemlink_dbname: no
 
+// Itemlink Icons on NPC messages (Note 1)
+// Generates an itemicon string for an item and can be used for NPC's mes command.
+// Requires: 2023-03-02 or later
+feature.mesitemicon: on
+
+// Force all mesitemicons to use the database name, if mesitemicon feature is disabled (Note 1)
+// Default: no
+feature.mesitemicon_dbname: no
+
 // Stylist UI (Note 1)
 // Requires: 2015-11-04 or later
 feature.stylist: on

+ 44 - 24
conf/battle/monster.conf

@@ -15,13 +15,10 @@ mvp_hp_rate: 100
 // The HP rate of normal monsters (that is monsters that are not MVP's) (Note 2)
 monster_hp_rate: 100
 
-// The maximum attack speed of a monster
-monster_max_aspd: 199
-
 // Defines various mob AI related settings. (Note 3)
-// 0x0001: When enabled mobs will update their target cell every few iterations
-//         (normally they never update their target cell until they reach it while
-//         chasing)
+// 0x0001: When enabled, mobs will update their target cell every x cells moved.
+//         (normally they never update their target cell until they are one cell
+//         before the end of their walkpath. x = monster_chase_refresh, see below)
 // 0x0002: Makes mob use their "rude attack" skill (usually warping away) if they
 //         are attacked and they can't attack back regardless of how they were
 //         attacked (eg: GrimTooth), otherwise, their "rude attack" is only activated
@@ -36,8 +33,10 @@ monster_max_aspd: 199
 // 0x0020: When set, the monster ai is executed for all monsters in maps that 
 //         have players on them, instead of only for mobs who are in the vicinity
 //         of players.
-// 0x0040: When set, when the mob's target changes map, the mob will walk towards
-//         any npc-warps in it's sight of view (use with mob_warp below)
+// 0x0040: When set, when the mob's target changes map or is out of sight, the mob
+//         will walk towards npc-warps and/or priest warps in its sight of view.
+//         It will only walk to warps it can use and only to warps that bring it back
+//         in sight of the target (use with mob_warp below).
 // 0x0080: If not set, mobs on attack state will only change targets when attacked
 //         by normal attacks. Set this if you want mobs to also switch targets when
 //         hit by skills.
@@ -57,19 +56,22 @@ monster_max_aspd: 199
 //         This makes e.g. Greatest General use "Earth Spike" at range 8-9 whereas
 //         officially it would only use it after already having used "Blind Attack"
 //         at range 0-7.
+// 0x2000: When set, monsters will move right after they attacked or used a skill.
+//         Usually a monster's AI is inactive for its attack motion.
 // Example: 0x140 -> Chase players through warps + use skills in random order.
 monster_ai: 0
 
 // How often should a monster rethink its chase?
 // 0: Every 100ms (MIN_MOBTHINKTIME)
 // 1: Every cell moved
-// x: Every x cells moved or at end of the chase path
-// 30 (max): Only at end of the chase path (official)
-// Regardless of this setting, a monster will always check for targets in attack
-// range. Decrease this value if you want to make monsters to be more reactive while
-// chasing. This also defines the maximum amount of cells monsters will move after
-// they lost their target (hide, no line of sight, etc.).
-monster_chase_refresh: 30
+// x: Every x cells moved or one cell before the end of the chase path
+// 32 (max): One cell before the end of the chase path (official)
+// Regardless of this setting, a monster will always check for targets in attack range.
+// Decrease this value if you want to make monsters be more reactive while chasing.
+// If you want monsters to update their target cell while chasing you also need to enable
+// monster_ai 0x0001, see above. Otherwise this only defines the maximum amount of cells
+// monsters will move after they lost their target (hide, no line of sight, etc.).
+monster_chase_refresh: 32
 
 // Should mobs be able to be warped (add as needed)?
 // 0: Disable.
@@ -81,8 +83,11 @@ mob_warp: 0
 
 // Defines the time (in ms) during which monsters will have their AI active
 // after all players have left their vicinity.
-mob_active_time: 5000
-boss_active_time: 5000
+// Even after this time they will still walk randomly and use idle skills until
+// all players that saw them logged out or until they get teleported, recalled
+// or otherwise removed from the map.
+mob_active_time: 0
+boss_active_time: 0
 
 // Mobs and Pets view-range adjustment (range2 column in the mob_db) (Note 2)
 view_range_rate: 100
@@ -98,6 +103,16 @@ chase_range_rate: 100
 // be increased by that number.
 monster_eye_range_bonus: 0
 
+// Range in which looters search for loot (max 32)
+// Official: 12
+// Legacy Athena: 10
+loot_range: 12
+
+// Range in which assist mobs search for allies to assist (max 32)
+// Official: 11
+// Legacy Athena: 10
+assist_range: 11
+
 // Allow monsters to be aggresive and attack first? (Note 1)
 monster_active_enable: yes
 
@@ -181,6 +196,7 @@ randomize_center_cell: yes
 slaves_inherit_mode: 4
 
 // Do summon slaves have the same walking speed as their master?
+// Does not apply to Marine Spheres summoned by an Alchemist
 // NOTE: The default is 3 for official servers.
 // 0: Never.
 // 1: If the master can walk
@@ -189,6 +205,17 @@ slaves_inherit_mode: 4
 // 3: Always
 slaves_inherit_speed: 3
 
+// Should MVP slaves retain their target when summoned back to their master? (Note 1)
+mob_slave_keep_target: yes
+
+// Should slaves teleport back to their master if they get too far during chase? (Note 1)
+// Officially they can be moved as far away from their master as you want.
+slave_stick_with_master: no
+
+// Should slaves always be active when their master is active? (Note 1)
+// Officially it can be that the master is active but the slaves are not.
+slave_active_with_master: no
+
 // Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
 // chance of triggering the master's autospell cards? (Note 1)
 summons_trigger_autospells: yes
@@ -244,9 +271,6 @@ mob_npc_event_type: 1
 // will be reduced to 0.
 ksprotection: 0
 
-// Should MVP slaves retain their target when summoned back to their master?
-mob_slave_keep_target: yes
-
 // Whether or not to spawn the mvp tomb.
 // See http://irowiki.org/wiki/MVP#Gravestone
 mvp_tomb_enabled: yes
@@ -303,10 +327,6 @@ boss_nopc_move_rate: 100
 // Area is limited to area_size battle config.
 achievement_mob_share: no
 
-// Should slaves teleport back to their master if they get too far during chase? (Note 1)
-// Default (Official): no
-slave_stick_with_master: no
-
 // Absolute minimum respawn time in milliseconds of a monster.
 // Also used in delaying the spawning of guardians when a guild is not loaded.
 // Default (Official): 1000

+ 15 - 6
conf/battle/player.conf

@@ -60,10 +60,19 @@ natural_healsp_interval: 8000
 // Automatic healing skill's time interval. (in milliseconds)
 natural_heal_skill_interval: 10000
 
-// The maximum weight for a character to carry when the character stops healing naturally. (in %)
-// For renewal: Requires client 20171025 or newer to display properly
-natural_heal_weight_rate: 50
-natural_heal_weight_rate_renewal: 70
+// The maximum weight for a character to carry before it stops healing naturally. (Note 2)
+// Depending on this configuration you may need to change the corresponding TGA image file
+// in your data in order to show the proper percentage in the status icon.
+// Default on official servers: 50 for Pre-renewal, 70 for Renewal
+//natural_heal_weight_rate: 70
+
+// The maximum weight for a character to get an item from item boxes. (Note 2)
+// Default on official servers: 70 for Pre-renewal, 90 for Renewal
+//open_box_weight_rate: 90
+
+// The maximum weight for a character to carry before entering the major overweight state. (Note 2)
+// In this state the character cannot heal naturally, attack or use skills.
+major_overweight_rate: 90
 
 // Maximum atk speed. (Default 190, Highest allowed 199)
 max_aspd: 190
@@ -106,8 +115,8 @@ max_third_parameter: 130
 max_third_trans_parameter: 130
 max_baby_parameter: 80
 max_baby_third_parameter: 117
-max_extended_parameter: 125
-max_summoner_parameter: 120
+max_extended_parameter: 130
+max_summoner_parameter: 130
 max_fourth_parameter: 130
 
 // Status points bonus for transcendent class

+ 16 - 3
conf/battle/skill.conf

@@ -24,6 +24,16 @@ delay_dependon_agi: no
 // Note: Setting this to anything above 0 can stop speedhacks.
 min_skill_delay_limit: 100
 
+// Should attack motion be applied as minimum skill delay at castbegin? (Note 1)
+// The client usually doesn't send skill commands faster than attack motion.
+// However, there are a few tricks to make the client send commands faster.
+// For some unit types like mercenaries and homunculus, there is no adequate
+// server-sided delay in some situations, so it's possible to use skills faster
+// than attack motion using these tricks.
+// Set this to "yes" if you want to prevent these tricks and ensure that the
+// delay between using skills at castbegin is at least attack motion.
+amotion_min_skill_delay: no
+
 // This delay is the min 'can't walk delay' of all skills.
 // NOTE: Do not set this too low, if a character starts moving too soon after 
 // doing a skill, the client will not update this, and the player will appear
@@ -125,12 +135,15 @@ gvg_traps_target_all: 1
 // Default on official servers: 0 for Pre-renewal, 2 for Renewal
 //traps_setting: 0
 
-// Restrictions applied to the Alchemist's Summon Flora skill (add as necessary)
+// Restrictions applied to the Alchemist's Summon skills (add as necessary)
 // 1: Enable players to damage the floras outside of versus grounds.
-// 2: Disable having different types out at the same time
+// 2: Enable players to damage marine spheres outside of versus grounds.
+// 4: Disable having different types out at the same time
 //    (eg: forbid summoning anything except hydras when there's already 
 //     one hydra out)
-summon_flora_setting: 3
+// 8: Enable Marine Spheres to damage own Homunculus and summons outside PVP
+// Default on official servers: 15 for Pre-renewal, 12 for Renewal
+//alchemist_summon_setting: 15
 
 // Whether placed down skills will check walls (Note 1)
 // (ex. Storm Gust cast against a wall will not hit the other side.) 

+ 1 - 0
conf/maps_athena.conf

@@ -1616,6 +1616,7 @@ map: 1@vrsn
 // Episode 21
 map: 1@ep21a
 map: 1@ep21b
+map: 1@ep21c
 map: 1@mdtem
 map: 1@twbs2
 map: 1@wtgs

+ 8 - 5
conf/msg_conf/map_msg.conf

@@ -733,9 +733,9 @@
 701: Invalid time for VIP command.
 702: Time parameter format is +/-<value> to alter. y/a = Year, m = Month, d/j = Day, h = Hour, n/mn = Minute, s = Second.
 703: GM has removed your VIP time.
-704: Player is no longer VIP.
-705: Your VIP status is valid for %d years, %d months, %d days, %d hours and %d minutes.
-706: Player '%s' is now VIP for %d years, %d months, %d days, %d hours and %d minutes.
+704: Player '%s' is no longer VIP.
+705: Your VIP status is valid for %d years, %d months, %d days, %d hours, %d minutes and %d seconds.
+706: Player '%s' is now VIP for %d years, %d months, %d days, %d hours, %d minutes and %d seconds.
 707: You are VIP until: %s
 708: The player is now VIP until: %s
 
@@ -1400,8 +1400,8 @@
 1245:  Drops:
 1246: This monster has no drops.
 1247:  MVP Bonus EXP:%llu
-1248:  MVP Items:
-1249: This monster has no MVP prizes.
+1248:  MVP drops:
+1249: This monster has no MVP drops.
 
 // @showmobs
 1250: Invalid mob id %s!
@@ -1826,5 +1826,8 @@
 1536: Log configuration has been reloaded.
 1537: Found skill '%s', unblocking...
 
+//@macrochecker
+1538: Macro detection has been started on %d players.
+
 //Custom translations
 import: conf/msg_conf/import/map_msg_eng_conf.txt

+ 3 - 3
conf/msg_conf/map_msg_idn.conf

@@ -726,9 +726,9 @@
 701: Waktu yang dimasukkan salah.
 702: Format waktu yang digunakan +/-<nilai> untuk mengubah. y/a = Tahun, m = Bulan, d/j = Hari, h = Jam, n/mn = Menit, s = Detik.
 703: GM telah menghilangkan waktu VIP anda.
-704: Pemain sudah tidak VIP.
-705: Status VIP anda berlaku dalam %d tahun, %d bulan, %d hari, %d jam dan %d menit.
-706: Pemain '%s' saat ini VIP untuk %d tahun, %d bulan, %d hari, %d jam dan %d menit.
+704: Pemain '%s' sudah tidak VIP.
+705: Status VIP anda berlaku dalam %d tahun, %d bulan, %d hari, %d jam, %d menit dan %d detik.
+706: Pemain '%s' saat ini VIP untuk %d tahun, %d bulan, %d hari, %d jam, %d menit dan %d detik.
 707: VIP anda berlaku hingga: %s
 708: Status VIP pemain aktif hingga: %s
 

+ 3 - 3
conf/msg_conf/map_msg_por.conf

@@ -738,9 +738,9 @@
 701: Tempo inválido para o comando VIP.
 702: O formato do parâmetro de tempo é +/- <valor> para alterar. y/a = Ano, m = Mês, d/j = Dia, h = Hora, n/mn = Minuto, s = Segundo.
 703: GM removeu seu tempo VIP.
-704: O jogador não é mais VIP.
-705: Seu status VIP é válido para %d anos, %d meses, %d dias, %d horas e %d minutos.
-706: O jogador '% s' agora é VIP por %d anos, %d meses, %d dias, %d horas e %d minutos.
+704: O jogador '%s' não é mais VIP.
+705: Seu status VIP é válido para %d anos, %d meses, %d dias, %d horas, %d minutos e %d segundos.
+706: O jogador '% s' agora é VIP por %d anos, %d meses, %d dias, %d horas, %d minutos e %d segundos.
 707: Você é VIP até: %s
 708: O jogador agora é VIP até: %s
 

+ 4 - 4
conf/msg_conf/map_msg_spn.conf

@@ -733,9 +733,9 @@
 701: El tiempo que has introducido no es válido.
 702: El formato del tiempo es +/-<valor>. y/a = Año, m = Mes, d/j = Día, h = Horas, n/mn = Minutos, s = Segundos.
 703: Un GM te ha retirado el VIP.
-704: El jugador ya no es VIP.
-705: Tiempo restante como VIP: Años: %d. Meses: %d. Días: %d. Horas: %d. Minutos: %d.
-706: El jugador '%s' será VIP durante: Años: %d. Meses: %d. Días: %d. Horas: %d. Minutos: %d.
+704: El jugador '%s' ya no es VIP.
+705: Tiempo restante como VIP: Años: %d. Meses: %d. Días: %d. Horas: %d. Minutos: %d. Segundos: %d.
+706: El jugador '%s' será VIP durante: Años: %d. Meses: %d. Días: %d. Horas: %d. Minutos: %d. Segundos: %d.
 707: Serás VIP hasta: %s
 708: El jugador será VIP hasta: %s
 
@@ -1561,7 +1561,7 @@
 1343: casco,
 1344: boca/casco,
 1345: boca,
-1345: ojos/orejas,
+1346: ojos/orejas,
 1347: boca/ojos/orejas/casco,
 1348:  -> (huevo de mascota, ID de la mascota: %u, nombre cambiado)
 1349:  -> (huevo de mascota, ID de la mascota: %u, sin nombre cambiado)

+ 4 - 1
db/import-tmpl/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 #Body:
 ###########################################################################

+ 2 - 0
db/import-tmpl/mob_skill_db.txt

@@ -46,6 +46,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
+//	alchemist		When mob has a special AI, is not trickcasting, and is wounded (no condition value).
+//	trickcasting		Used once mob started moving through NPC_RANDOMMOVE until disabled (no condition value).
 //
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /

+ 3 - 3
db/import-tmpl/skill_db.yml

@@ -1,5 +1,5 @@
 # This file is a part of rAthena.
-#   Copyright(C) 2021 rAthena Development Team
+#   Copyright(C) 2024 rAthena Development Team
 #   https://rathena.org - https://github.com/rathena
 #
 # This program is free software: you can redistribute it and/or modify
@@ -58,7 +58,7 @@
 #   NoNearNPC:                Determines if the skill can be used near a NPC. (Optional)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
-#   CastCancel                Cancel cast when hit. (Default: false)
+#   CastCancel                Cancel cast when hit. (Default: true)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
@@ -140,4 +140,4 @@
 
 Header:
   Type: SKILL_DB
-  Version: 3
+  Version: 4

+ 4 - 1
db/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Footer:
   Imports:

BIN
db/map_cache.dat


+ 1 - 0
db/map_index.txt

@@ -1270,6 +1270,7 @@ iz_in_d
 jor_sklf1
 jor_sklf2
 cmd_bhole
+1@ep21c
 
 //======================================================================================
 // - Other/Extra maps -

+ 2 - 1
db/pre-re/item_db_equip.yml

@@ -9800,6 +9800,7 @@ Body:
       bonus2 bHPDrainRate,1000,100;
       bonus2 bSPDrainRate,1000,20;
       bonus bHealPower,200;
+      bonus bAspdRate,100;
       bonus2 bAddClass,Class_All,100;
       skill "WZ_STORMGUST",10;
       Skill "WZ_METEOR",10;
@@ -15229,11 +15230,11 @@ Body:
       Left_Hand: true
     ArmorLevel: 1
     EquipLevelMin: 1
-    Refineable: true
     View: 1
     Script: |
       bonus bAllStats,50;
       bonus bMdef,99;
+      bonus bUnbreakableShield;
       bonus bShortWeaponDamageReturn,100;
       bonus2 bSubRace,RC_DemiHuman,95;
       bonus2 bSubRace,RC_Player_Human,95;

+ 4 - 1
db/pre-re/job_aspd.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 4 - 1
db/pre-re/job_basepoints.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 4 - 1
db/pre-re/job_exp.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 4 - 1
db/pre-re/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 5 - 3
db/pre-re/mob_skill_db.txt

@@ -47,6 +47,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
+//	alchemist		When mob has a special AI, is not trickcasting, and is wounded (no condition value).
+//	trickcasting		Used once mob started moving through NPC_RANDOMMOVE until disabled (no condition value).
 //
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /
@@ -717,11 +719,11 @@
 1141,Marina@NPC_CRITICALSLASH,attack,170,1,500,500,5000,no,target,always,0,,,,,,6,
 1141,Marina@NPC_EMOTION,walk,197,1,2000,0,5000,yes,self,always,0,19,,,,,,
 1141,Marina@NPC_WATERATTACK,attack,184,2,500,500,5000,no,target,always,0,,,,,,6,
-1142,Marine Sphere@NPC_RANDOMMOVE,idle,331,1,10000,0,30000,no,master,alchemist,,,,,,,,
-1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,3000,0,no,self,afterskill,331,,,,,,,
+1142,Marine Sphere@NPC_RANDOMMOVE,idle,331,1,10000,0,30000,no,target,alchemist,,,,,,,,
 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,500,2000,5000,no,self,myhpltmaxrate,99,,,,,,,
 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,2000,5000,no,self,skillused,173,,,,,,,
-1142,Marine Sphere@NPC_SPEEDUP,idle,332,1,10000,0,700,yes,target,always,,,,,,,,
+1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,0,0,yes,self,alchemist,,,,,,,,
+1142,Marine Sphere@NPC_SPEEDUP,idle,332,1,10000,0,700,yes,self,trickcasting,,,,,,,,
 1143,Marionette@HT_FREEZINGTRAP,idle,121,5,500,0,300000,yes,around2,always,0,,,,,,29,
 1143,Marionette@MG_FIREWALL,chase,18,5,500,500,5000,yes,target,always,0,,,,,,2,
 1143,Marionette@NPC_TELEKINESISATTACK,attack,191,5,500,0,5000,yes,target,always,0,,,,,,6,

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 19 - 110
db/pre-re/skill_db.yml


+ 12 - 21
db/pre-re/status.yml

@@ -319,7 +319,6 @@ Body:
     Icon: EFST_HIDING
     DurationLookup: TF_HIDING
     States:
-      NoMove: true
       NoMoveCond: true
       NoPickItem: true
       NoConsumeItem: true
@@ -662,6 +661,8 @@ Body:
       NoBanishingBuster: true
       NoClearance: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight90: true
   - Status: Weight90
     Icon: EFST_WEIGHTOVER90
     Flags:
@@ -673,6 +674,8 @@ Body:
       NoBanishingBuster: true
       NoClearance: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight50: true
   - Status: Aspdpotion0
     Icon: EFST_ATTHASTE_POTION1
     CalcFlags:
@@ -777,9 +780,6 @@ Body:
   - Status: Barrier
     Icon: EFST_BARRIER
     DurationLookup: NPC_BARRIER
-    CalcFlags:
-      Mdef: true
-      Def: true
     Flags:
       RemoveOnHermode: true
   - Status: Stripweapon
@@ -1144,13 +1144,9 @@ Body:
       bonus2 bSubEle,Ele_Wind, getstatus(SC_ARMOR_ELEMENT_WATER, 4);
   - Status: Nochat
     States:
-      NoPickItem: true
       NoPickItemCond: true
-      NoDropItem: true
       NoDropItemCond: true
-      NoChat: true
       NoChatCond: true
-      NoConsumeItem: true
       NoConsumeItemCond: true
     Flags:
       NoRemoveOnDead: true
@@ -1231,7 +1227,6 @@ Body:
     Icon: EFST_GOSPEL
     DurationLookup: PA_GOSPEL
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Speed: true
@@ -1252,7 +1247,6 @@ Body:
   - Status: Basilica
     DurationLookup: HP_BASILICA
     States:
-      NoMove: true
       NoMoveCond: true
       NoAttack: true
     Flags:
@@ -1677,9 +1671,7 @@ Body:
     Icon: EFST_GRAVITATION
     DurationLookup: HW_GRAVITATION
     States:
-      NoMove: true
       NoMoveCond: true
-      NoConsumeItem: true
       NoConsumeItemCond: true
     CalcFlags:
       Aspd: true
@@ -1705,6 +1697,9 @@ Body:
     CalcFlags:
       Speed: true
       Aspd: true
+    States:
+      NoMoveCond: true
+      NoAttackCond: true
   - Status: Hermode
     Icon: EFST_HERMODE
     DurationLookup: CG_HERMODE
@@ -1767,8 +1762,8 @@ Body:
     Icon: EFST_BDPLAYING
     DurationLookup: BD_ENCORE
     States:
-      NoMove: true
       NoMoveCond: true
+      NoAttackCond: true
     CalcFlags:
       Speed: true
       Regen: true
@@ -1780,6 +1775,7 @@ Body:
       RemoveOnChangeMap: true
       RequireWeapon: true
       OverlapIgnoreLevel: true
+      StopAttacking: true
     EndOnEnd:
       Longing: true
   - Status: Elementalchange
@@ -2330,8 +2326,6 @@ Body:
     CalcFlags:
       Def2: true
       MDef2: true
-      Speed: true
-      Aspd: true
     Opt3:
       SteelBody: true
     Flags:
@@ -2993,7 +2987,6 @@ Body:
   - Status: Fear
     DurationLookup: RK_WINDCUTTER
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Flee: true
@@ -3356,7 +3349,6 @@ Body:
     Icon: EFST_CAMOUFLAGE
     DurationLookup: RA_CAMOUFLAGE
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Speed: true
@@ -3690,8 +3682,7 @@ Body:
   - Status: Oblivioncurse
     Icon: EFST_OBLIVIONCURSE
     States:
-      NoCast: true
-      Nocastcond: true
+      NoCastCond: true
     CalcFlags:
       Regen: true
     Flags:
@@ -3836,9 +3827,7 @@ Body:
     Icon: EFST_COLD
     DurationLookup: SO_DIAMONDDUST
     States:
-      NoMove: true
       NoMoveCond: true
-      NoCast: true
       NoCastCond: true
       NoConsumeItem: true
       NoAttack: true
@@ -5974,6 +5963,8 @@ Body:
       MaxSp: true
   - Status: Norecover_State
     Icon: EFST_HANDICAPSTATE_NORECOVER
+    CalcFlags:
+      Regen: true
   - Status: Suhide
     Icon: EFST_SUHIDE
     DurationLookup: SU_HIDE

+ 7 - 0
db/re/instance_db.yml

@@ -576,3 +576,10 @@ Body:
       Map: 1@jorlab
       X: 57
       Y: 45
+  - Id: 79
+    Name: Deep Forest
+    TimeLimit: 1200
+    Enter:
+      Map: 1@exsh
+      X: 90
+      Y: 35

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 304 - 304
db/re/item_combos.yml


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 666 - 64
db/re/item_db_equip.yml


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 693 - 44
db/re/item_db_etc.yml


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1024 - 4
db/re/item_db_usable.yml


+ 580 - 1
db/re/item_enchant.yml

@@ -1,5 +1,5 @@
 # This file is a part of rAthena.
-#   Copyright(C) 2024 rAthena Development Team
+#   Copyright(C) 2025 rAthena Development Team
 #   https://rathena.org - https://github.com/rathena
 #
 # This program is free software: you can redistribute it and/or modify
@@ -11341,6 +11341,198 @@ Body:
                 Amount: 35
               - Material: Snow_F_Stone3
                 Amount: 50
+          - Item: Glacier_F_Orb_168
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_169
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_170
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_171
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_172
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_173
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_174
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_175
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_176
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_177
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_178
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_179
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_180
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_181
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_182
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_183
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_184
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_185
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_186
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_187
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_188
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_189
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_190
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
+          - Item: Glacier_F_Orb_191
+            Materials:
+              - Material: Snow_F_Stone1
+                Amount: 25
+              - Material: Snow_F_Stone2
+                Amount: 35
+              - Material: Snow_F_Stone3
+                Amount: 50
           - Item: Glacier_F_Orb_156
             Materials:
               - Material: Snow_F_Stone2
@@ -15141,6 +15333,198 @@ Body:
                 Amount: 15
               - Material: EP19_S_F_3_Extract
                 Amount: 25
+          - Item: Glacier_F_Orb_168
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_169
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_170
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_171
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_172
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_173
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_174
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_175
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_176
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_177
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_178
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_179
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_180
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_181
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_182
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_183
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_184
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_185
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_186
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_187
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_188
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_189
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_190
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
+          - Item: Glacier_F_Orb_191
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 10
+              - Material: EP19_S_F_2_Extract
+                Amount: 15
+              - Material: EP19_S_F_3_Extract
+                Amount: 25
       - Slot: 2
         PerfectEnchants:
           - Item: Glacier_F_Orb_81
@@ -15743,6 +16127,198 @@ Body:
                 Amount: 20
               - Material: EP19_S_F_3_Extract
                 Amount: 35
+          - Item: Glacier_F_Orb_168
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_169
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_170
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_171
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_172
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_173
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_174
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_175
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_176
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_177
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_178
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_179
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_180
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_181
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_182
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_183
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_184
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_185
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_186
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_187
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_188
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_189
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_190
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
+          - Item: Glacier_F_Orb_191
+            Materials:
+              - Material: EP19_S_F_1_Extract
+                Amount: 15
+              - Material: EP19_S_F_2_Extract
+                Amount: 20
+              - Material: EP19_S_F_3_Extract
+                Amount: 35
       - Slot: 1
         PerfectEnchants:
           - Item: Physical_Grade_1
@@ -32894,6 +33470,9 @@ Body:
       Time_Gap_ABC_Dagger: true
       Time_Gap_SH_Foxtail: true
       Time_Gap_IQ_Knuckle: true
+      Time_Gap_EM_S_Book: true
+      Time_Gap_SS_Dagger1: true
+      Time_Gap_WH_Bow: true
     Reset:
       Chance: 100000
       Price: 5000000

+ 2100 - 5
db/re/item_group_db.yml

@@ -52590,7 +52590,7 @@ Body:
             Item: C_Foxtail
             Rate: 50
           - Index: 5
-            Item: aegis_400496
+            Item: C_Horo_Ears_WH
             Rate: 50
           - Index: 6
             Item: C_Fluttering_Haze
@@ -52620,7 +52620,7 @@ Body:
             Item: C_Helmet_Of_Siegfried_J
             Rate: 50
           - Index: 15
-            Item: aegis_420181
+            Item: C_Eis_Spinne
             Rate: 50
           - Index: 16
             Item: C_Little_Abyss_Dragon
@@ -64826,7 +64826,7 @@ Body:
             Rate: 10
             Announced: true
           - Index: 8
-            Item: aegis_410232
+            Item: Gambler_Seal_KR
             Rate: 10
             Announced: true
           - Index: 9
@@ -92629,7 +92629,7 @@ Body:
             Rate: 10
             Announced: true
           - Index: 17
-            Item: aegis_410232
+            Item: Gambler_Seal_KR
             Rate: 10
             Announced: true
           - Index: 18
@@ -93872,7 +93872,7 @@ Body:
             Item: C_Crushed_Snow_Man
             Rate: 50
           - Index: 15
-            Item: aegis_400373
+            Item: C_Frozen_Laurel
             Rate: 50
   - Group: SECURITY_CAMPAIGN_BOX
     SubGroups:
@@ -118135,3 +118135,2098 @@ Body:
         List:
           - Index: 0
             Item: Zonda_Support
+  - Group: AEGIS_103871
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: S_Swordman_earring
+            Rate: 10
+          - Index: 1
+            Item: S_Swordman_Pendant
+            Rate: 10
+          - Index: 2
+            Item: S_Knight_Shoes
+            Rate: 10
+          - Index: 3
+            Item: S_Knight_Armor
+            Rate: 10
+          - Index: 4
+            Item: S_Crusader_Shoes
+            Rate: 10
+          - Index: 5
+            Item: S_Crusader_Armor
+            Rate: 10
+          - Index: 6
+            Item: S_Magician_earring
+            Rate: 10
+          - Index: 7
+            Item: S_Magician_Pendant
+            Rate: 10
+          - Index: 8
+            Item: S_Wizard_Shoes
+            Rate: 10
+          - Index: 9
+            Item: S_Wizard_Armor
+            Rate: 10
+          - Index: 10
+            Item: S_Sage_Shoes
+            Rate: 10
+          - Index: 11
+            Item: S_Sage_Armor
+            Rate: 10
+          - Index: 12
+            Item: S_Merchant_earring
+            Rate: 10
+          - Index: 13
+            Item: S_Merchant_Pendant
+            Rate: 10
+          - Index: 14
+            Item: S_Blacksmith_Shoes
+            Rate: 10
+          - Index: 15
+            Item: S_Blacksmith_Armor
+            Rate: 10
+          - Index: 16
+            Item: S_Alchemist_Shoes
+            Rate: 10
+          - Index: 17
+            Item: S_Alchemist_Armor
+            Rate: 10
+          - Index: 18
+            Item: S_Acolyte_earring
+            Rate: 10
+          - Index: 19
+            Item: S_Acolyte_Pendant
+            Rate: 10
+          - Index: 20
+            Item: S_Priest_Shoes
+            Rate: 10
+          - Index: 21
+            Item: S_Priest_Armor
+            Rate: 10
+          - Index: 22
+            Item: S_Monk_Shoes
+            Rate: 10
+          - Index: 23
+            Item: S_Monk_Armor
+            Rate: 10
+          - Index: 24
+            Item: S_Thief_earring
+            Rate: 10
+          - Index: 25
+            Item: S_Thief_Pendant
+            Rate: 10
+          - Index: 26
+            Item: S_Assassin_Shoes
+            Rate: 10
+          - Index: 27
+            Item: S_Assassin_Armor
+            Rate: 10
+          - Index: 28
+            Item: S_Rogue_Shoes
+            Rate: 10
+          - Index: 29
+            Item: S_Rogue_Armor
+            Rate: 10
+          - Index: 30
+            Item: S_Archer_earring
+            Rate: 10
+          - Index: 31
+            Item: S_Archer_Pendant
+            Rate: 10
+          - Index: 32
+            Item: S_Hunter_Shoes
+            Rate: 10
+          - Index: 33
+            Item: S_Hunter_Armor
+            Rate: 10
+          - Index: 34
+            Item: S_Dancer_Shoes
+            Rate: 10
+          - Index: 35
+            Item: S_Dancer_Armor
+            Rate: 10
+          - Index: 36
+            Item: S_Bard_Shoes
+            Rate: 10
+          - Index: 37
+            Item: S_Bard_Armor
+            Rate: 10
+          - Index: 38
+            Item: S_Taekwon_Shield
+            Rate: 10
+          - Index: 39
+            Item: S_Taekwon_Weapon
+            Rate: 10
+          - Index: 40
+            Item: S_Ninja_Shield
+            Rate: 10
+          - Index: 41
+            Item: S_Ninja_Weapon
+            Rate: 10
+          - Index: 42
+            Item: S_Gunslinger_Shield
+            Rate: 10
+          - Index: 43
+            Item: S_Gunslinger_Weapon
+            Rate: 10
+  - Group: AEGIS_103872
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: S_Physical_Earring
+            Rate: 10
+          - Index: 1
+            Item: S_Physical_Weapon
+            Rate: 10
+          - Index: 2
+            Item: S_Physical_Pendant
+            Rate: 10
+          - Index: 3
+            Item: S_Magical_Earring
+            Rate: 10
+          - Index: 4
+            Item: S_Magical_Weapon
+            Rate: 10
+          - Index: 5
+            Item: S_Magical_Pendant
+            Rate: 10
+          - Index: 6
+            Item: S_Breezy_Armor
+            Rate: 10
+          - Index: 7
+            Item: S_Champion_Shoes
+            Rate: 10
+          - Index: 8
+            Item: S_Athena_Shield
+            Rate: 10
+          - Index: 9
+            Item: S_Immune_Armor
+            Rate: 10
+          - Index: 10
+            Item: S_Hard_Armor
+            Rate: 10
+          - Index: 11
+            Item: S_Ancient_Armor
+            Rate: 10
+          - Index: 12
+            Item: S_Critical_Armor
+            Rate: 10
+          - Index: 13
+            Item: S_Kingbird_Weapon
+            Rate: 10
+          - Index: 14
+            Item: S_Cri_Hit_Weapon
+            Rate: 10
+          - Index: 15
+            Item: S_Healing_Weapon
+            Rate: 10
+          - Index: 16
+            Item: S_Lucky_Weapon
+            Rate: 10
+          - Index: 17
+            Item: S_Power_Earring
+            Rate: 10
+          - Index: 18
+            Item: S_Int_Pendant
+            Rate: 10
+          - Index: 19
+            Item: S_Dexterous_Armor
+            Rate: 10
+          - Index: 20
+            Item: S_Vital_Shoes
+            Rate: 10
+          - Index: 21
+            Item: S_Athletic_Shield
+            Rate: 10
+          - Index: 22
+            Item: S_Lucky_Armor
+            Rate: 10
+          - Index: 23
+            Item: S_Power_Pendant
+            Rate: 10
+          - Index: 24
+            Item: S_Int_Earring
+            Rate: 10
+          - Index: 25
+            Item: S_Dexterous_Weapon
+            Rate: 10
+          - Index: 26
+            Item: S_Vital_Shield
+            Rate: 10
+          - Index: 27
+            Item: S_Athletic_Shoes
+            Rate: 10
+          - Index: 28
+            Item: S_Resist_Spell_Pendant
+            Rate: 10
+          - Index: 29
+            Item: S_Rapid_Pendant
+            Rate: 10
+          - Index: 30
+            Item: S_Caster_Pendant
+            Rate: 10
+          - Index: 31
+            Item: S_Hard_Earring
+            Rate: 10
+          - Index: 32
+            Item: S_Wise_Earring
+            Rate: 10
+          - Index: 33
+            Item: S_Athena_Earring
+            Rate: 10
+          - Index: 34
+            Item: S_Cranial_Shield
+            Rate: 10
+          - Index: 35
+            Item: S_Safeguard_Shield
+            Rate: 10
+          - Index: 36
+            Item: S_Brutal_Shield
+            Rate: 10
+          - Index: 37
+            Item: S_Gargantua_Shield
+            Rate: 10
+          - Index: 38
+            Item: S_Homers_Shield
+            Rate: 10
+          - Index: 39
+            Item: S_Dragoon_Shield
+            Rate: 10
+          - Index: 40
+            Item: S_Satanic_Shield
+            Rate: 10
+          - Index: 41
+            Item: S_Flameguard_Shield
+            Rate: 10
+          - Index: 42
+            Item: S_Requiem_Shield
+            Rate: 10
+          - Index: 43
+            Item: S_Cadi_Shield
+            Rate: 10
+          - Index: 44
+            Item: S_Bloody_Shoes
+            Rate: 10
+          - Index: 45
+            Item: S_Liberation_Shoes
+            Rate: 10
+          - Index: 46
+            Item: S_Chemical_Shoes
+            Rate: 10
+          - Index: 47
+            Item: S_Clamorous_Shoes
+            Rate: 10
+          - Index: 48
+            Item: S_Insecticide_Shoes
+            Rate: 10
+          - Index: 49
+            Item: S_Fisher_Shoes
+            Rate: 10
+          - Index: 50
+            Item: S_Seraphim_Shoes
+            Rate: 10
+          - Index: 51
+            Item: S_Beholder_Shoes
+            Rate: 10
+          - Index: 52
+            Item: S_Divine_Shoes
+            Rate: 10
+          - Index: 53
+            Item: S_Dragoon_Shoes
+            Rate: 10
+          - Index: 54
+            Item: S_Big_Armor
+            Rate: 10
+          - Index: 55
+            Item: S_Medium_Armor
+            Rate: 10
+          - Index: 56
+            Item: S_Small_Armor
+            Rate: 10
+          - Index: 57
+            Item: S_Big_Weapon
+            Rate: 10
+          - Index: 58
+            Item: S_Medium_Weapon
+            Rate: 10
+          - Index: 59
+            Item: S_Small_Weapon
+            Rate: 10
+          - Index: 60
+            Item: S_Spiritual_Weapon
+            Rate: 10
+          - Index: 61
+            Item: S_Spiritual_Earring
+            Rate: 10
+          - Index: 62
+            Item: S_Spiritual_Pendent
+            Rate: 10
+          - Index: 63
+            Item: S_Malicious_Armor
+            Rate: 10
+          - Index: 64
+            Item: S_Malicious_Shoes
+            Rate: 10
+          - Index: 65
+            Item: S_Malicious_Shield
+            Rate: 10
+          - Index: 66
+            Item: S_Gemstone_Armor
+            Rate: 10
+          - Index: 67
+            Item: S_Gemstone_Shoes
+            Rate: 10
+          - Index: 68
+            Item: S_Gemstone_Shield
+            Rate: 10
+          - Index: 69
+            Item: S_Gemstone_Weapon
+            Rate: 10
+          - Index: 70
+            Item: S_Gemstone_Earring
+            Rate: 10
+          - Index: 71
+            Item: S_Gemstone_Pendent
+            Rate: 10
+          - Index: 72
+            Item: S_Stability_Shield
+            Rate: 10
+          - Index: 73
+            Item: S_Plasterer's_Armor
+            Rate: 10
+          - Index: 74
+            Item: S_Plasterer's_Shoes
+            Rate: 10
+          - Index: 75
+            Item: S_Insomniac_Armor
+            Rate: 10
+          - Index: 76
+            Item: S_Insomniac_Shoes
+            Rate: 10
+          - Index: 77
+            Item: S_Peerless_Armor
+            Rate: 10
+          - Index: 78
+            Item: S_Peerless_Shoes
+            Rate: 10
+          - Index: 79
+            Item: S_Adurate_Armor
+            Rate: 10
+          - Index: 80
+            Item: S_Adurate_Shoes
+            Rate: 10
+          - Index: 81
+            Item: Unfreez_Weapon_S
+            Rate: 10
+          - Index: 82
+            Item: Unfreeze_Earing_S
+            Rate: 10
+          - Index: 83
+            Item: Unfreeze_Pendent_S
+            Rate: 10
+          - Index: 84
+            Item: Vitality_Earing_S
+            Rate: 10
+          - Index: 85
+            Item: Vitality_Pendant_S
+            Rate: 10
+          - Index: 86
+            Item: S_Neutral_Weapon
+            Rate: 10
+          - Index: 87
+            Item: S_Neutral_Earring
+            Rate: 10
+          - Index: 88
+            Item: S_Neutral_Pendent
+            Rate: 10
+          - Index: 89
+            Item: S_Curse_Lift_Earring
+            Rate: 10
+          - Index: 90
+            Item: S_Curse_Lift_Pendent
+            Rate: 10
+          - Index: 91
+            Item: S_Caster_earring
+            Rate: 10
+          - Index: 92
+            Item: S_Caster_Weapon
+            Rate: 10
+          - Index: 93
+            Item: S_Spell_Flow_Shoes
+            Rate: 10
+          - Index: 94
+            Item: S_Spell_Flow_Armor
+            Rate: 10
+          - Index: 95
+            Item: S_Spell_Flow_Shield
+            Rate: 10
+          - Index: 96
+            Item: S_Greed_Armor
+            Rate: 10
+          - Index: 97
+            Item: S_Greed_Shoes
+            Rate: 10
+          - Index: 98
+            Item: S_Greed_Shield
+            Rate: 10
+          - Index: 99
+            Item: S_Greed_Weapon
+            Rate: 10
+          - Index: 100
+            Item: S_Greed_Earring
+            Rate: 10
+          - Index: 101
+            Item: S_Greed_Pendant
+            Rate: 10
+          - Index: 102
+            Item: S_Heal_Armor
+            Rate: 10
+          - Index: 103
+            Item: S_Heal_Shoes
+            Rate: 10
+          - Index: 104
+            Item: S_Heal_Shield
+            Rate: 10
+          - Index: 105
+            Item: S_Heal_Weapon
+            Rate: 10
+          - Index: 106
+            Item: S_Heal_Earring
+            Rate: 10
+          - Index: 107
+            Item: S_Heal_Pendant
+            Rate: 10
+          - Index: 108
+            Item: S_Hiding_Armor
+            Rate: 10
+          - Index: 109
+            Item: S_Hiding_Shoes
+            Rate: 10
+          - Index: 110
+            Item: S_Hiding_Shield
+            Rate: 10
+          - Index: 111
+            Item: S_Hiding_Weapon
+            Rate: 10
+          - Index: 112
+            Item: S_Hiding_Earring
+            Rate: 10
+          - Index: 113
+            Item: S_Hiding_Pendant
+            Rate: 10
+          - Index: 114
+            Item: S_Cloaking_Armor
+            Rate: 10
+          - Index: 115
+            Item: S_Cloaking_Shoes
+            Rate: 10
+          - Index: 116
+            Item: S_Cloaking_Shield
+            Rate: 10
+          - Index: 117
+            Item: S_Cloaking_Weapon
+            Rate: 10
+          - Index: 118
+            Item: S_Cloaking_Earring
+            Rate: 10
+          - Index: 119
+            Item: S_Cloaking_Pendant
+            Rate: 10
+          - Index: 120
+            Item: S_Teleport_Armor
+            Rate: 10
+          - Index: 121
+            Item: S_Teleport_Shoes
+            Rate: 10
+          - Index: 122
+            Item: S_Teleport_Shield
+            Rate: 10
+          - Index: 123
+            Item: S_Teleport_Weapon
+            Rate: 10
+          - Index: 124
+            Item: S_Teleport_Earring
+            Rate: 10
+          - Index: 125
+            Item: S_Teleport_Pendant
+            Rate: 10
+          - Index: 126
+            Item: S_Steal_Armor
+            Rate: 10
+          - Index: 127
+            Item: S_Steal_Shoes
+            Rate: 10
+          - Index: 128
+            Item: S_Steal_Shield
+            Rate: 10
+          - Index: 129
+            Item: S_Steal_Weapon
+            Rate: 10
+          - Index: 130
+            Item: S_Steal_Earring
+            Rate: 10
+          - Index: 131
+            Item: S_Steal_Pendant
+            Rate: 10
+          - Index: 132
+            Item: S_Infinity_Earring
+            Rate: 10
+          - Index: 133
+            Item: S_Infinity_Pendant
+            Rate: 10
+          - Index: 134
+            Item: S_Solid_Weapon
+            Rate: 10
+          - Index: 135
+            Item: S_Solid_Earring
+            Rate: 10
+          - Index: 136
+            Item: S_Immortal_Armor
+            Rate: 10
+          - Index: 137
+            Item: S_Immortal_Pendant
+            Rate: 10
+          - Index: 138
+            Item: S_Executioner_Weapon
+            Rate: 10
+          - Index: 139
+            Item: S_Exorcist_Weapon
+            Rate: 10
+          - Index: 140
+            Item: S_Hunting_Weapon
+            Rate: 10
+          - Index: 141
+            Item: S_Insect_Net_Weapon
+            Rate: 10
+          - Index: 142
+            Item: S_Fishing_Weapon
+            Rate: 10
+          - Index: 143
+            Item: S_Dragon_Killer_Weapon
+            Rate: 10
+          - Index: 144
+            Item: S_Corrupt_Weapon
+            Rate: 10
+          - Index: 145
+            Item: S_Vibration_Weapon
+            Rate: 10
+          - Index: 146
+            Item: S_Holy_Water_Weapon
+            Rate: 10
+          - Index: 147
+            Item: S_Scissors_Weapon
+            Rate: 10
+          - Index: 148
+            Item: S_Penetration_Earring
+            Rate: 10
+          - Index: 149
+            Item: S_Penetration_Pendent
+            Rate: 10
+          - Index: 150
+            Item: S_Tempest_Earring
+            Rate: 10
+          - Index: 151
+            Item: S_Tempest_Pendent
+            Rate: 10
+          - Index: 152
+            Item: S_M_Executioner_Weapon
+            Rate: 10
+          - Index: 153
+            Item: S_M_Exorcist_Weapon
+            Rate: 10
+          - Index: 154
+            Item: S_M_Hunting_Weapon
+            Rate: 10
+          - Index: 155
+            Item: S_M_Insect_Net_Weapon
+            Rate: 10
+          - Index: 156
+            Item: S_M_Fishing_Weapon
+            Rate: 10
+          - Index: 157
+            Item: S_M_Dragon_K_Weapon
+            Rate: 10
+          - Index: 158
+            Item: S_M_Corrupt_Weapon
+            Rate: 10
+          - Index: 159
+            Item: S_M_Vibration_Weapon
+            Rate: 10
+          - Index: 160
+            Item: S_M_Holy_Water_Weapon
+            Rate: 10
+          - Index: 161
+            Item: S_M_Scissors_Weapon
+            Rate: 10
+          - Index: 162
+            Item: S_Bearers_Armor
+            Rate: 10
+          - Index: 163
+            Item: S_Bearers_Shoes
+            Rate: 10
+          - Index: 164
+            Item: S_Bearers_Shield
+            Rate: 10
+          - Index: 165
+            Item: S_Bearers_Weapon
+            Rate: 10
+          - Index: 166
+            Item: S_Bearers_Earring
+            Rate: 10
+          - Index: 167
+            Item: S_Bearers_Pendent
+            Rate: 10
+          - Index: 168
+            Item: S_Basis_Armor
+            Rate: 10
+          - Index: 169
+            Item: S_Hallowed_Armor
+            Rate: 10
+          - Index: 170
+            Item: S_Saharic_Armor
+            Rate: 10
+          - Index: 171
+            Item: S_Underneath_Armor
+            Rate: 10
+          - Index: 172
+            Item: S_Flam_Armor
+            Rate: 10
+          - Index: 173
+            Item: S_Windy_Armor
+            Rate: 10
+          - Index: 174
+            Item: S_Envenom_Armor
+            Rate: 10
+          - Index: 175
+            Item: S_Damned_Armor
+            Rate: 10
+          - Index: 176
+            Item: S_Geist_Armor
+            Rate: 10
+          - Index: 177
+            Item: S_Divine_Armor
+            Rate: 10
+          - Index: 178
+            Item: S_Hasty_Shoes
+            Rate: 10
+          - Index: 179
+            Item: S_Hasty_Armor
+            Rate: 10
+          - Index: 180
+            Item: S_Basis_Shield
+            Rate: 10
+          - Index: 181
+            Item: S_Hallowed_Shield
+            Rate: 10
+          - Index: 182
+            Item: S_Saharic_Shield
+            Rate: 10
+          - Index: 183
+            Item: S_Underneath_Shield
+            Rate: 10
+          - Index: 184
+            Item: S_Flam_Shield
+            Rate: 10
+          - Index: 185
+            Item: S_Windy_Shield
+            Rate: 10
+          - Index: 186
+            Item: S_Envenom_Shield
+            Rate: 10
+          - Index: 187
+            Item: S_Damned_Shield
+            Rate: 10
+          - Index: 188
+            Item: S_Geist_Shield
+            Rate: 10
+          - Index: 189
+            Item: S_Divine_Shield
+            Rate: 10
+          - Index: 190
+            Item: S_Expert_Shoes
+            Rate: 10
+          - Index: 191
+            Item: S_Expert_Shield
+            Rate: 10
+          - Index: 192
+            Item: S_Beginner_Shoes
+            Rate: 10
+          - Index: 193
+            Item: S_Beginner_Shield
+            Rate: 10
+          - Index: 194
+            Item: S_Rookie_Shoes
+            Rate: 10
+          - Index: 195
+            Item: S_Rookie_Shield
+            Rate: 10
+          - Index: 196
+            Item: S_Advanced_Shoes
+            Rate: 10
+          - Index: 197
+            Item: S_Advanced_Shield
+            Rate: 10
+          - Index: 198
+            Item: S_Attack_Armor
+            Rate: 10
+          - Index: 199
+            Item: S_Blitz_Earring
+            Rate: 10
+          - Index: 200
+            Item: S_Blitz_Pendent
+            Rate: 10
+          - Index: 201
+            Item: S_ColdBolt_Armor
+            Rate: 10
+          - Index: 202
+            Item: S_FireBolt_Armor
+            Rate: 10
+          - Index: 203
+            Item: S_LightingBolt_Armor
+            Rate: 10
+          - Index: 204
+            Item: S_EarthSpike_Armor
+            Rate: 10
+          - Index: 205
+            Item: S_Enhance_Force_Weapon
+            Rate: 10
+          - Index: 206
+            Item: S_Force_Weapon
+            Rate: 10
+          - Index: 207
+            Item: S_Force_Earring
+            Rate: 10
+          - Index: 208
+            Item: S_Force_Pendant
+            Rate: 10
+          - Index: 209
+            Item: S_Enhance_Spirit_Weapon
+            Rate: 10
+          - Index: 210
+            Item: S_Spirit_Weapon
+            Rate: 10
+          - Index: 211
+            Item: S_Spirit_Earring
+            Rate: 10
+          - Index: 212
+            Item: S_Spirit_Pendant
+            Rate: 10
+          - Index: 213
+            Item: S_Blitz_Shoes
+            Rate: 10
+          - Index: 214
+            Item: S_Blitz_Shield
+            Rate: 10
+          - Index: 215
+            Item: S_Exceed_Weapon
+            Rate: 10
+          - Index: 216
+            Item: S_Titan_Earring
+            Rate: 10
+          - Index: 217
+            Item: S_Titan_Pendant
+            Rate: 10
+          - Index: 218
+            Item: S_Boned_Earring
+            Rate: 10
+          - Index: 219
+            Item: S_Boned_Pendant
+            Rate: 10
+          - Index: 220
+            Item: S_Gigantic_Earring
+            Rate: 10
+          - Index: 221
+            Item: S_Gigantic_Pendant
+            Rate: 10
+          - Index: 222
+            Item: S_Caster_Shoes
+            Rate: 10
+          - Index: 223
+            Item: S_Caster_Shield
+            Rate: 10
+          - Index: 224
+            Item: S_Caster_Armor
+            Rate: 10
+          - Index: 225
+            Item: S_Reload_Shoes
+            Rate: 10
+          - Index: 226
+            Item: S_Reload_Shield
+            Rate: 10
+          - Index: 227
+            Item: S_Reload_Armor
+            Rate: 10
+  - Group: IFRIT_SCROLL
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: Sealed_F_Bishop_Scroll
+            Rate: 10
+          - Index: 1
+            Item: Sealed_Ifrit_Scroll
+            Rate: 10
+          - Index: 2
+            Item: Sealed_TurtleG_Scroll
+            Rate: 10
+          - Index: 3
+            Item: Sealed_Bacsojin_Scroll
+            Rate: 10
+          - Index: 4
+            Item: Sealed_Pharaoh_Scroll
+            Rate: 10
+      - SubGroup: 1
+        List:
+          - Index: 0
+            Item: Blacksmith_Blessing
+            Rate: 400
+          - Index: 1
+            Item: Shadow_Refine_Hammer
+            Rate: 400
+          - Index: 2
+            Item: aegis_103871
+            Rate: 400
+          - Index: 3
+            Item: If_Shadow_Mix_Recipe
+            Rate: 400
+          - Index: 4
+            Item: aegis_103872
+            Rate: 400
+          - Index: 5
+            Item: C_Wing_Of_Fly_1Day_Para
+            Rate: 400
+          - Index: 6
+            Item: Minus_Status_Box_
+            Rate: 400
+          - Index: 7
+            Item: Poison_Bottle_Box2
+            Rate: 400
+          - Index: 8
+            Item: C_CatPaw_7Day_Box_
+            Rate: 400
+          - Index: 9
+            Item: Alchemist_Box_
+            Rate: 400
+          - Index: 10
+            Item: E_Inc_Agi_10_Scr_Box
+            Rate: 400
+            Amount: 10
+          - Index: 11
+            Item: E_Blessing_10_Scr_Box
+            Rate: 400
+            Amount: 10
+          - Index: 12
+            Item: Comp_Battle_Manual
+            Rate: 400
+          - Index: 13
+            Item: Comp_Bubble_Gum
+            Rate: 400
+          - Index: 14
+            Item: Comp_Insurance
+            Rate: 400
+            Amount: 5
+          - Index: 15
+            Item: Comp_Mystic_Powder
+            Rate: 400
+            Amount: 5
+          - Index: 16
+            Item: Comp_Tyr's_Blessing
+            Rate: 400
+            Amount: 5
+          - Index: 17
+            Item: Comp_Regenerate_Potion
+            Rate: 400
+            Amount: 5
+          - Index: 18
+            Item: Comp_Spark_Candy
+            Rate: 400
+            Amount: 5
+          - Index: 19
+            Item: Comp_Magic_Candy
+            Rate: 400
+            Amount: 5
+          - Index: 20
+            Item: Comp_Glass_Of_Illusion
+            Rate: 400
+            Amount: 5
+          - Index: 21
+            Item: Comp_Kafra_Card
+            Rate: 400
+            Amount: 5
+          - Index: 22
+            Item: Comp_Megaphone
+            Rate: 400
+            Amount: 2
+          - Index: 23
+            Item: E_Token_Of_Siegfried
+            Rate: 400
+            Amount: 3
+          - Index: 24
+            Item: World_Tour_Ticket
+            Rate: 400
+            Amount: 5
+  - Group: IF_COSTUME_SCROLL
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: Loose_Wave_Twin_Box
+            Rate: 307
+          - Index: 1
+            Item: C_Pecopeco_Cap
+            Rate: 307
+          - Index: 2
+            Item: C_Woodie_Hat
+            Rate: 307
+          - Index: 3
+            Item: C_Little_Aquarium
+            Rate: 307
+          - Index: 4
+            Item: C_Niflheim_Bunny_Hat
+            Rate: 307
+          - Index: 5
+            Item: C_Crow_Tengu_Mask
+            Rate: 307
+          - Index: 6
+            Item: C_Pumpkin_Head
+            Rate: 307
+          - Index: 7
+            Item: C_White_Lily
+            Rate: 306
+          - Index: 8
+            Item: C_Small_Poring_Band
+            Rate: 306
+          - Index: 9
+            Item: C_Wild_Poring_Rider
+            Rate: 306
+          - Index: 10
+            Item: C_Valhalla_Idol
+            Rate: 306
+          - Index: 11
+            Item: C_Louise_Red_Hat
+            Rate: 306
+          - Index: 12
+            Item: C_Monochrome_RibbonHat
+            Rate: 306
+          - Index: 13
+            Item: C_Khalitzburg_KN_Helm
+            Rate: 306
+          - Index: 14
+            Item: C_Laser_Of_Eagle
+            Rate: 306
+          - Index: 15
+            Item: C_Tone_Of_Gold
+            Rate: 306
+          - Index: 16
+            Item: C_Dwarf_Beard
+            Rate: 306
+          - Index: 17
+            Item: C_Mad_Hatter
+            Rate: 306
+          - Index: 18
+            Item: C_Pig_Nose
+            Rate: 306
+          - Index: 19
+            Item: C_Cat_Ear_Hat
+            Rate: 306
+          - Index: 20
+            Item: C_Valkyrie_Circlet
+            Rate: 306
+          - Index: 21
+            Item: C_Assassin_Skull_Mask
+            Rate: 306
+          - Index: 22
+            Item: C_Vampire_Familiar
+            Rate: 306
+          - Index: 23
+            Item: C_Ghostring_Tall_Hat
+            Rate: 306
+          - Index: 24
+            Item: C_Steampunk_Hat
+            Rate: 306
+          - Index: 25
+            Item: C_Poring_Soap_Pipe
+            Rate: 306
+          - Index: 26
+            Item: Hair_Bun_Box
+            Rate: 306
+          - Index: 27
+            Item: Roll_Twin_Box
+            Rate: 306
+          - Index: 28
+            Item: Long_Pony_Box
+            Rate: 306
+          - Index: 29
+            Item: C_Piggyback
+            Rate: 306
+          - Index: 30
+            Item: C_Rune_Helm
+            Rate: 306
+          - Index: 31
+            Item: C_SwordWing
+            Rate: 39
+          - Index: 32
+            Item: C_Magical_Feather
+            Rate: 39
+          - Index: 33
+            Item: C_Eremes_Scarf_Black
+            Rate: 39
+          - Index: 34
+            Item: C_Eleanor_Wig
+            Rate: 39
+          - Index: 35
+            Item: C_QueenAnzRevenge
+            Rate: 39
+          - Index: 36
+            Item: C_Wings_of_Uriel
+            Rate: 39
+          - Index: 37
+            Item: C_Devil_Wing
+            Rate: 39
+          - Index: 38
+            Item: C_Poring_Bag
+            Rate: 39
+          - Index: 39
+            Item: C_Morocc_Kid_Servant
+            Rate: 39
+          - Index: 40
+            Item: C_Eremes_Scarf
+            Rate: 39
+          - Index: 41
+            Item: C_Blessing_Of_Angels
+            Rate: 39
+          - Index: 42
+            Item: C_Angel_Fluttering
+            Rate: 39
+          - Index: 43
+            Item: C_Cupid_Wing_Pink
+            Rate: 39
+  - Group: AEGIS_103891
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Time_Gap_SS_Dagger1
+          - Index: 1
+            Item: Time_Gap_SS_Dagger2
+  - Group: AEGIS_103909
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: Greed_Stone
+            Rate: 5
+          - Index: 1
+            Item: Range_Stone_Robe_D
+            Rate: 10
+          - Index: 2
+            Item: Melee_Stone_Robe_D
+            Rate: 10
+          - Index: 3
+            Item: Magic_Stone_Robe_D
+            Rate: 10
+          - Index: 4
+            Item: SmatkStone_Robe
+            Rate: 11
+          - Index: 5
+            Item: M_PATKStone_Robe
+            Rate: 11
+          - Index: 6
+            Item: R_PATKStone_Robe
+            Rate: 11
+          - Index: 7
+            Item: ResistDefStone_Robe
+            Rate: 11
+          - Index: 8
+            Item: aegis_1001938
+            Rate: 11
+          - Index: 9
+            Item: StaminaWISStone_Robe_D
+            Rate: 10
+          - Index: 10
+            Item: POWStone_Robe_D
+            Rate: 10
+          - Index: 11
+            Item: SplStone_Robe_D
+            Rate: 10
+          - Index: 12
+            Item: ConStone_Robe_D
+            Rate: 10
+          - Index: 13
+            Item: CrtStone_Robe_D
+            Rate: 10
+          - Index: 14
+            Item: aegis_1001907
+            Rate: 10
+          - Index: 15
+            Item: aegis_1001948
+            Rate: 10
+          - Index: 16
+            Item: aegis_1001949
+            Rate: 10
+          - Index: 17
+            Item: aegis_1001950
+            Rate: 10
+          - Index: 18
+            Item: ReloadStone_Robe_D
+            Rate: 10
+          - Index: 19
+            Item: CriticalStone_Robe_D
+            Rate: 10
+          - Index: 20
+            Item: DoubleAttack_Stone
+            Rate: 20
+          - Index: 21
+            Item: Critical_Stone_Robe
+            Rate: 20
+          - Index: 22
+            Item: CastStone_Robe_D
+            Rate: 40
+          - Index: 23
+            Item: SPdrainStone_Robe_D
+            Rate: 40
+          - Index: 24
+            Item: HPdrainStone_Robe_D
+            Rate: 80
+          - Index: 25
+            Item: ASPDStone_Robe_D
+            Rate: 80
+          - Index: 26
+            Item: CastStone_Robe
+            Rate: 80
+          - Index: 27
+            Item: aegis_1001939
+            Rate: 80
+          - Index: 28
+            Item: aegis_1001940
+            Rate: 80
+          - Index: 29
+            Item: aegis_1001941
+            Rate: 80
+          - Index: 30
+            Item: aegis_1001942
+            Rate: 80
+          - Index: 31
+            Item: aegis_1001943
+            Rate: 80
+          - Index: 32
+            Item: aegis_1001944
+            Rate: 80
+          - Index: 33
+            Item: aegis_1001945
+            Rate: 80
+          - Index: 34
+            Item: aegis_1001946
+            Rate: 80
+          - Index: 35
+            Item: aegis_1001947
+            Rate: 80
+          - Index: 36
+            Item: Stone_Robe_Box
+            Rate: 160
+          - Index: 37
+            Item: Stone_Robe3_Box
+            Rate: 160
+          - Index: 38
+            Item: Magic_Stone_Top
+            Rate: 200
+          - Index: 39
+            Item: Magic_Stone_Middle
+            Rate: 200
+          - Index: 40
+            Item: Magic_Stone_Bottom
+            Rate: 200
+          - Index: 41
+            Item: Range_Stone_Top
+            Rate: 200
+          - Index: 42
+            Item: Range_Stone
+            Rate: 200
+          - Index: 43
+            Item: Range_Stone_Bottom
+            Rate: 200
+          - Index: 44
+            Item: Melee_Stone_Top
+            Rate: 200
+          - Index: 45
+            Item: Melee_Stone_Middle
+            Rate: 200
+          - Index: 46
+            Item: Melee_Stone_Bottom
+            Rate: 200
+          - Index: 47
+            Item: DefenseStone_Top
+            Rate: 200
+          - Index: 48
+            Item: DefenseStone_Middle
+            Rate: 200
+          - Index: 49
+            Item: DefenseStone_Bottom
+            Rate: 200
+          - Index: 50
+            Item: ReloadStone_Top
+            Rate: 200
+          - Index: 51
+            Item: ReloadStone_Middle
+            Rate: 200
+          - Index: 52
+            Item: ReloadStone_Bottom
+            Rate: 200
+          - Index: 53
+            Item: EXPStone_Middle
+            Rate: 200
+          - Index: 54
+            Item: EXPStone_Bottom
+            Rate: 200
+          - Index: 55
+            Item: EXPStone_Top
+            Rate: 200
+          - Index: 56
+            Item: Stone_Top_Box
+            Rate: 400
+          - Index: 57
+            Item: Stone_Top2_Box
+            Rate: 400
+          - Index: 58
+            Item: Stone_Middle_Box
+            Rate: 400
+          - Index: 59
+            Item: Stone_Middle2_Box
+            Rate: 400
+          - Index: 60
+            Item: Stone_Bottom_Box
+            Rate: 400
+          - Index: 61
+            Item: Stone_Bottom2_Box
+            Rate: 400
+          - Index: 62
+            Item: CastingStone_Top
+            Rate: 400
+          - Index: 63
+            Item: CastingStone_Middle
+            Rate: 400
+          - Index: 64
+            Item: CastingStone_Bottom
+            Rate: 400
+          - Index: 65
+            Item: Critical_Stone
+            Rate: 400
+          - Index: 66
+            Item: Critical_Stone_Top
+            Rate: 400
+          - Index: 67
+            Item: Critical_Stone_Bottom
+            Rate: 400
+  - Group: AEGIS_103991
+    SubGroups:
+      - SubGroup: 6
+        Algorithm: Random
+        List:
+          - Index: 0
+            Item: Time_Gap_Spear_IG
+            Rate: 10
+          - Index: 1
+            Item: Time_Gap_Staff_AG
+            Rate: 10
+          - Index: 2
+            Item: Time_Gap_Revolver_NW
+            Rate: 10
+          - Index: 3
+            Item: Time_Gap_MT_Axe
+            Rate: 10
+          - Index: 4
+            Item: Time_Gap_HN_Staff
+            Rate: 10
+          - Index: 5
+            Item: Time_Gap_TR_Vilolin
+            Rate: 10
+          - Index: 6
+            Item: Time_Gap_TR_Ribbon
+            Rate: 10
+          - Index: 7
+            Item: Time_Gap_BO_Blade
+            Rate: 10
+          - Index: 8
+            Item: aegis_103582
+            Rate: 10
+          - Index: 9
+            Item: Time_Gap_SOA_Rod
+            Rate: 10
+          - Index: 10
+            Item: Time_Gap_DK_Spear
+            Rate: 10
+          - Index: 11
+            Item: Time_Gap_SKE_Book
+            Rate: 10
+          - Index: 12
+            Item: Time_Gap_CD_Staff
+            Rate: 10
+          - Index: 13
+            Item: Time_Gap_ABC_Dagger
+            Rate: 10
+          - Index: 14
+            Item: Time_Gap_SH_Foxtail
+            Rate: 10
+          - Index: 15
+            Item: Time_Gap_IQ_Knuckle
+            Rate: 10
+          - Index: 16
+            Item: Time_Gap_WH_Bow
+            Rate: 10
+          - Index: 17
+            Item: aegis_103891
+            Rate: 10
+          - Index: 18
+            Item: Time_Gap_EM_S_Book
+            Rate: 10
+  - Group: NEWSERVER_PACKAGE_1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 6
+          - Index: 1
+            Item: Premium_Box
+          - Index: 2
+            Item: EXP_Drop_Up_7days
+          - Index: 3
+            Item: Battle_Manual
+            Amount: 12
+          - Index: 4
+            Item: Mental_Potion
+            Amount: 8
+          - Index: 5
+            Item: Ifrit_Scroll
+            Amount: 20
+  - Group: NEWSERVER_PACKAGE_2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 200
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 200
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 200
+          - Index: 3
+            Item: Blacksmith_Blessing
+            Amount: 2
+          - Index: 4
+            Item: E_Speed_Booster
+            Amount: 11
+          - Index: 5
+            Item: E_Force_Booster
+            Amount: 11
+          - Index: 6
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: NEWSERVER_PACKAGE_3
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 200
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 200
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 200
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 22
+          - Index: 4
+            Item: Blacksmith_Blessing
+            Amount: 4
+          - Index: 5
+            Item: Infinity_Drink
+            Amount: 33
+          - Index: 6
+            Item: Almighty
+            Amount: 33
+          - Index: 7
+            Item: E_Speed_Booster
+            Amount: 22
+          - Index: 8
+            Item: E_Force_Booster
+            Amount: 22
+          - Index: 9
+            Item: Limit_Power_Booster
+            Amount: 34
+  - Group: NEWSERVER_GROWTHPACK1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Infinity_Drink
+            Amount: 25
+          - Index: 1
+            Item: Limit_Power_Booster
+            Amount: 25
+          - Index: 2
+            Item: Almighty
+            Amount: 25
+          - Index: 3
+            Item: Force_Booster
+            Amount: 25
+          - Index: 4
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: NEWSERVER_GROWTHPACK2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Med_Life_Potion
+            Amount: 100
+          - Index: 1
+            Item: Mysterious_Water
+            Amount: 100
+          - Index: 2
+            Item: Speed_Booster
+            Amount: 50
+          - Index: 3
+            Item: Small_Life_Potion
+            Amount: 100
+          - Index: 4
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: NEWSERVER_REFINEPACK1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Enriched_Elunium
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: NEWSERVER_REFINEPACK2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Enriched_Oridecon
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: NEWSERVER_NYANGVINEPACK
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: COSTUMEMILEPACK_37_1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 100
+          - Index: 1
+            Item: Evt_Cos_Coin
+            Amount: 12
+          - Index: 2
+            Item: aegis_103617
+            Amount: 3
+  - Group: COSTUMEMILEPACK_37_2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 200
+          - Index: 1
+            Item: Evt_Cos_Coin
+            Amount: 25
+          - Index: 2
+            Item: aegis_103617
+            Amount: 5
+  - Group: COSTUMEMILEPACK_37_3
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 400
+          - Index: 1
+            Item: Evt_Cos_Coin
+            Amount: 50
+          - Index: 2
+            Item: aegis_103617
+            Amount: 10
+  - Group: IF_COSTUME_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: If_Costume_Scroll
+          - Index: 1
+            Item: Ifrit_Scroll
+  - Group: IF_ALMIGHTY100_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Almighty
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+          - Index: 2
+            Item: Comp_Mystic_Powder
+            Amount: 10
+          - Index: 3
+            Item: Comp_Tyr's_Blessing
+            Amount: 10
+          - Index: 4
+            Item: Comp_Regenerate_Potion
+            Amount: 10
+          - Index: 5
+            Item: Comp_Spark_Candy
+          - Index: 6
+            Item: Comp_Magic_Candy
+  - Group: IF_ALMIGHTY_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Almighty
+            Amount: 10
+          - Index: 1
+            Item: Ifrit_Scroll
+          - Index: 2
+            Item: Comp_Mystic_Powder
+          - Index: 3
+            Item: Comp_Tyr's_Blessing
+          - Index: 4
+            Item: Comp_Regenerate_Potion
+  - Group: IF_REFINE_ORE_BOX_SET
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Enriched_Oridecon
+            Amount: 50
+          - Index: 1
+            Item: Enriched_Elunium
+            Amount: 50
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_REFINE_ORE_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Enriched_Oridecon
+            Amount: 5
+          - Index: 1
+            Item: Enriched_Elunium
+            Amount: 5
+          - Index: 2
+            Item: Ifrit_Scroll
+  - Group: IF_HD_REFINE_ORE_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Oridecon
+            Amount: 13
+          - Index: 1
+            Item: HD_Elunium
+            Amount: 13
+          - Index: 2
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_HD_ELUNIUM_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Elunium
+            Amount: 26
+          - Index: 1
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_HD_ORIDECON_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Oridecon
+            Amount: 26
+          - Index: 1
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_INFINITY_10_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Infinity_Drink
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_INFINITY_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Infinity_Drink
+            Amount: 10
+          - Index: 1
+            Item: Ifrit_Scroll
+  - Group: IF_UNLIMITED_10_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: ASPD_Potion
+            Amount: 50
+          - Index: 1
+            Item: Red_Booster
+            Amount: 100
+          - Index: 2
+            Item: Comp_Tyr's_Blessing
+            Amount: 11
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_UNLIMITED_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: ASPD_Potion
+            Amount: 5
+          - Index: 1
+            Item: Red_Booster
+            Amount: 10
+          - Index: 2
+            Item: Comp_Tyr's_Blessing
+          - Index: 3
+            Item: Ifrit_Scroll
+  - Group: EYPGT_COSTUME_BOX1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Zonda_Support_Package
+          - Index: 1
+            Item: EXP_Drop_Up_Box
+          - Index: 2
+            Item: EXP_Drop_Up_Box
+          - Index: 3
+            Item: Eypgt_Costume_Select1
+  - Group: EYPGT_COSTUME_BOX2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Speed_Booster
+            Amount: 100
+          - Index: 1
+            Item: Force_Booster
+            Amount: 100
+          - Index: 2
+            Item: K_Secret_Key
+            Amount: 20
+          - Index: 3
+            Item: Eypgt_Costume_Select2
+  - Group: EYPGT_COSTUME_BOX3
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Mana_Potion
+            Amount: 250
+          - Index: 1
+            Item: K_Secret_Key
+            Amount: 20
+          - Index: 2
+            Item: Eypgt_Costume_Select3
+  - Group: IF_SPEED_BOOSTER_10_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Speed_Booster
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_SPEED_BOOSTER_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Speed_Booster
+            Amount: 10
+          - Index: 1
+            Item: Ifrit_Scroll
+  - Group: IF_FORCE_BOOSTER_10_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Force_Booster
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_FORCE_BOOSTER_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Force_Booster
+            Amount: 10
+          - Index: 1
+            Item: Ifrit_Scroll
+  - Group: IF_3_LIFE_POTION_10PACK
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 200
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 200
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 200
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_3_LIFE_POTION_PACK
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 20
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 20
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 20
+          - Index: 3
+            Item: Ifrit_Scroll
+  - Group: IF_HD_HIGH_REFINE_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Bradium
+            Amount: 13
+          - Index: 1
+            Item: HD_Carnium
+            Amount: 13
+          - Index: 2
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_HD_CARNIUM_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Carnium
+            Amount: 26
+          - Index: 1
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_HD_BRADIUM_BOX
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: HD_Bradium
+            Amount: 26
+          - Index: 1
+            Item: Mental_Potion
+            Amount: 6
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_LIMITPOWERBOOSTER100
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Limit_Power_Booster
+            Amount: 100
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 11
+  - Group: IF_LIMITPOWERBOOSTER
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Limit_Power_Booster
+            Amount: 10
+          - Index: 1
+            Item: Ifrit_Scroll
+  - Group: CLB_KP_PACK1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 200
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 200
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 200
+          - Index: 3
+            Item: Small_Mana_Potion
+            Amount: 50
+          - Index: 4
+            Item: M_DEFScroll
+            Amount: 300
+          - Index: 5
+            Item: K_Secret_Key
+            Amount: 25
+          - Index: 6
+            Item: C_CLB_KP_Select_Box1
+  - Group: CLB_KP_PACK2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Speed_Booster
+            Amount: 100
+          - Index: 1
+            Item: Force_Booster
+            Amount: 100
+          - Index: 2
+            Item: K_Secret_Key
+            Amount: 25
+          - Index: 3
+            Item: C_CLB_KP_Select_Box2
+  - Group: 2025_COSTUME_BOX1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Infinity_Drink
+            Amount: 100
+          - Index: 1
+            Item: Limit_Power_Booster
+            Amount: 100
+          - Index: 2
+            Item: Almighty
+            Amount: 100
+          - Index: 3
+            Item: K_Secret_Key
+            Amount: 30
+          - Index: 4
+            Item: InkPainting_Select_Box
+  - Group: 2025_COSTUME_BOX2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 200
+          - Index: 1
+            Item: K_Secret_Key
+            Amount: 20
+          - Index: 2
+            Item: Panda_Foot_Select_Box
+  - Group: IF_CLB_KP_PACK1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Small_Life_Potion
+            Amount: 200
+          - Index: 1
+            Item: Med_Life_Potion
+            Amount: 200
+          - Index: 2
+            Item: Mysterious_Water
+            Amount: 200
+          - Index: 3
+            Item: Nyangvine_Fruit
+            Amount: 100
+          - Index: 4
+            Item: Ifrit_Scroll
+            Amount: 25
+          - Index: 5
+            Item: C_CLB_KP_Select_Box1
+  - Group: IF_CLB_KP_PACK2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Speed_Booster
+            Amount: 100
+          - Index: 1
+            Item: Force_Booster
+            Amount: 100
+          - Index: 2
+            Item: Ifrit_Scroll
+            Amount: 25
+          - Index: 3
+            Item: C_CLB_KP_Select_Box2
+  - Group: IF_2025_COSTUME_BOX1
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Infinity_Drink
+            Amount: 100
+          - Index: 1
+            Item: Limit_Power_Booster
+            Amount: 100
+          - Index: 2
+            Item: Almighty
+            Amount: 100
+          - Index: 3
+            Item: Ifrit_Scroll
+            Amount: 30
+          - Index: 4
+            Item: InkPainting_Select_Box
+  - Group: IF_2025_COSTUME_BOX2
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 200
+          - Index: 1
+            Item: Ifrit_Scroll
+            Amount: 20
+          - Index: 2
+            Item: Panda_Foot_Select_Box
+  - Group: LI_NYANGVINE_BOX1_38
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 100
+          - Index: 1
+            Item: aegis_103909
+            Amount: 2
+          - Index: 2
+            Item: Comp_Bubble_Gum
+            Amount: 3
+  - Group: LI_NYANGVINE_BOX2_38
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 200
+          - Index: 1
+            Item: Battle_Manual100
+            Amount: 2
+          - Index: 2
+            Item: aegis_103909
+            Amount: 5
+  - Group: LI_NYANGVINE_BOX3_38
+    SubGroups:
+      - SubGroup: 0
+        Algorithm: All
+        List:
+          - Index: 0
+            Item: Nyangvine_Fruit
+            Amount: 400
+          - Index: 1
+            Item: Comp_Bubble_Gum
+            Amount: 5
+          - Index: 2
+            Item: Battle_Manual100
+            Amount: 5
+          - Index: 3
+            Item: aegis_103909
+            Amount: 10

+ 62 - 6
db/re/item_packages.yml

@@ -1,5 +1,5 @@
 # This file is a part of rAthena.
-#   Copyright(C) 2024 rAthena Development Team
+#   Copyright(C) 2025 rAthena Development Team
 #   https://rathena.org - https://github.com/rathena
 #
 # This program is free software: you can redistribute it and/or modify
@@ -1048,14 +1048,70 @@ Body:
         Items:
           - Item: HD_Oridecon
             Amount: 26
-#  - Item: Calender_Costume_Box
+  - Item: Calender_Costume_Box
+    Groups:
+      - Group: 0
+        Items:
+          - Item: C_berry_Prince_Crown
+      - Group: 1
+        Items:
+          - Item: C_Loki_Nidhogg_Hat
+      - Group: 2
+        Items:
+          - Item: C_Firinto_Scarf
+#  - Item: C_CLB_KP_Select_Box1
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: C_CLB_KP_DC
+#      - Group: 1
+#        Items:
+#          - Item: C_CLB_KP_DMS
+#  - Item: C_CLB_KP_Select_Box2
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: C_CLB_KP_SF
+#      - Group: 1
+#        Items:
+#          - Item: C_CLB_KP_Ta
+#  - Item: InkPainting_Select_Box
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: C_InkPainting_Day
+#      - Group: 1
+#        Items:
+#          - Item: C_InkPainting_Night
+#  - Item: Panda_Foot_Select_Box
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: aegis_1001908
+#      - Group: 1
+#        Items:
+#          - Item: aegis_1001909
+#  - Item: Eypgt_Costume_Select1
 #    Groups:
 #      - Group: 0
 #        Items:
-#          - Item: C_berry_Prince_Crown
+#          - Item: aegis_400749
 #      - Group: 1
 #        Items:
-#          - Item: C_Loki_Nidhogg_Hat
-#      - Group: 2
+#          - Item: aegis_400760
+#  - Item: Eypgt_Costume_Select2
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: aegis_410385
+#      - Group: 1
+#        Items:
+#          - Item: aegis_480523
+#  - Item: Eypgt_Costume_Select3
+#    Groups:
+#      - Group: 0
+#        Items:
+#          - Item: aegis_420430
+#      - Group: 1
 #        Items:
-#          - Item: C_Firinto_Scarf
+#          - Item: aegis_420429

+ 209 - 1
db/re/item_reform.yml

@@ -1,5 +1,5 @@
 # This file is a part of rAthena.
-#   Copyright(C) 2024 rAthena Development Team
+#   Copyright(C) 2025 rAthena Development Team
 #   https://rathena.org - https://github.com/rathena
 #
 # This program is free software: you can redistribute it and/or modify
@@ -12141,6 +12141,174 @@ Body:
             Amount: 2
         ResultItem: S_SKE_SB_Shoes
         #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_EM_CO_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_EM_CO_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_EM_CO_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_EM_CO_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_EM_LS_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_EM_LS_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_EM_LS_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_EM_LS_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_ABC_AF_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_ABC_AF_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_ABC_AF_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_ABC_AF_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_ABC_FA_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_ABC_FA_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_ABC_FA_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_ABC_FA_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_SOA_TOWB_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_SOA_TOWB_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_SOA_TOWB_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_SOA_TOWB_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_SOA_TOFG_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_SOA_TOFG_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_SOA_TOFG_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_SOA_TOFG_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Magical_M_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Magical_M_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Magical_M_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Magical_M_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Magical_M_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Magical_M_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Magical_M_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Magical_M_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Spell_M_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Spell_M_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Spell_M_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Spell_M_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Spell_M_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Spell_M_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Spell_M_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Spell_M_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Sorcery_M_Armor
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Sorcery_M_Armor
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Sorcery_M_Shoes
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Sorcery_M_Shoes
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Sorcery_M_Earring
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Sorcery_M_Earring
+        #RandomOptionGroup: NSU # TODO: translate to our group names
+      - BaseItem: S_Sorcery_M_Pendant
+        MaximumRefine: 10
+        Materials:
+          - Material: S_Enchant_Essence
+            Amount: 2
+        ResultItem: S_Sorcery_M_Pendant
+        #RandomOptionGroup: NSU # TODO: translate to our group names
   - Item: Time_Gap_Refine_Hammer
     BaseItems:
       - BaseItem: Time_Gap_Spear_IG
@@ -12313,6 +12481,46 @@ Body:
             Amount: 2
         ResultItem: Time_Gap_SH_Foxtail
         ChangeRefine: 1
+      - BaseItem: Time_Gap_EM_S_Book
+        MinimumRefine: 9
+        MaximumRefine: 11
+        Materials:
+          - Material: Blacksmith_Blessing
+            Amount: 12
+          - Material: Time_D_Ma_Rune
+            Amount: 2
+        ResultItem: Time_Gap_EM_S_Book
+        ChangeRefine: 1
+      - BaseItem: Time_Gap_SS_Dagger1
+        MinimumRefine: 9
+        MaximumRefine: 11
+        Materials:
+          - Material: Blacksmith_Blessing
+            Amount: 12
+          - Material: Time_D_Ma_Rune
+            Amount: 2
+        ResultItem: Time_Gap_SS_Dagger1
+        ChangeRefine: 1
+      - BaseItem: Time_Gap_SS_Dagger2
+        MinimumRefine: 9
+        MaximumRefine: 11
+        Materials:
+          - Material: Blacksmith_Blessing
+            Amount: 12
+          - Material: Time_D_Ma_Rune
+            Amount: 2
+        ResultItem: Time_Gap_SS_Dagger2
+        ChangeRefine: 1
+      - BaseItem: Time_Gap_WH_Bow
+        MinimumRefine: 9
+        MaximumRefine: 11
+        Materials:
+          - Material: Blacksmith_Blessing
+            Amount: 12
+          - Material: Time_D_Ma_Rune
+            Amount: 2
+        ResultItem: Time_Gap_WH_Bow
+        ChangeRefine: 1
   - Item: Yorscalp_Refin_Hammer
     BaseItems:
       - BaseItem: Yorscalp_Armor

+ 4 - 1
db/re/job_aspd.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 183 - 1
db/re/job_basepoints.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:
@@ -25501,3 +25504,182 @@ Body:
         Sp: 630
       - Level: 275
         Sp: 630
+  - Jobs:
+      Hyper_Novice: true
+      Dragon_Knight: true
+      Dragon_Knight2: true
+      Arch_Mage: true
+      Windhawk: true
+      Windhawk2: true
+      Cardinal: true
+      Meister: true
+      Meister2: true
+      Shadow_Cross: true
+      Sky_Emperor: true
+      Sky_Emperor2: true
+      Night_Watch: true
+      Shinkiro: true
+      Shiranui: true
+      Spirit_Handler: true
+      Imperial_Guard: true
+      Imperial_Guard2: true
+      Elemental_Master: true
+      Troubadour: true
+      Trouvere: true
+      Inquisitor: true
+      Biolo: true
+      Abyss_Chaser: true
+      Soul_Ascetic: true
+    BaseAp:
+      - Level: 200
+        Ap: 200
+      - Level: 201
+        Ap: 200
+      - Level: 202
+        Ap: 200
+      - Level: 203
+        Ap: 200
+      - Level: 204
+        Ap: 200
+      - Level: 205
+        Ap: 200
+      - Level: 206
+        Ap: 200
+      - Level: 207
+        Ap: 200
+      - Level: 208
+        Ap: 200
+      - Level: 209
+        Ap: 200
+      - Level: 210
+        Ap: 200
+      - Level: 211
+        Ap: 200
+      - Level: 212
+        Ap: 200
+      - Level: 213
+        Ap: 200
+      - Level: 214
+        Ap: 200
+      - Level: 215
+        Ap: 200
+      - Level: 216
+        Ap: 200
+      - Level: 217
+        Ap: 200
+      - Level: 218
+        Ap: 200
+      - Level: 219
+        Ap: 200
+      - Level: 220
+        Ap: 200
+      - Level: 221
+        Ap: 200
+      - Level: 222
+        Ap: 200
+      - Level: 223
+        Ap: 200
+      - Level: 224
+        Ap: 200
+      - Level: 225
+        Ap: 200
+      - Level: 226
+        Ap: 200
+      - Level: 227
+        Ap: 200
+      - Level: 228
+        Ap: 200
+      - Level: 229
+        Ap: 200
+      - Level: 230
+        Ap: 200
+      - Level: 231
+        Ap: 200
+      - Level: 232
+        Ap: 200
+      - Level: 233
+        Ap: 200
+      - Level: 234
+        Ap: 200
+      - Level: 235
+        Ap: 200
+      - Level: 236
+        Ap: 200
+      - Level: 237
+        Ap: 200
+      - Level: 238
+        Ap: 200
+      - Level: 239
+        Ap: 200
+      - Level: 240
+        Ap: 200
+      - Level: 241
+        Ap: 200
+      - Level: 242
+        Ap: 200
+      - Level: 243
+        Ap: 200
+      - Level: 244
+        Ap: 200
+      - Level: 245
+        Ap: 200
+      - Level: 246
+        Ap: 200
+      - Level: 247
+        Ap: 200
+      - Level: 248
+        Ap: 200
+      - Level: 249
+        Ap: 200
+      - Level: 250
+        Ap: 200
+      - Level: 251
+        Ap: 200
+      - Level: 252
+        Ap: 200
+      - Level: 253
+        Ap: 200
+      - Level: 254
+        Ap: 200
+      - Level: 255
+        Ap: 200
+      - Level: 256
+        Ap: 200
+      - Level: 257
+        Ap: 200
+      - Level: 258
+        Ap: 200
+      - Level: 259
+        Ap: 200
+      - Level: 260
+        Ap: 200
+      - Level: 261
+        Ap: 200
+      - Level: 262
+        Ap: 200
+      - Level: 263
+        Ap: 200
+      - Level: 264
+        Ap: 200
+      - Level: 265
+        Ap: 200
+      - Level: 266
+        Ap: 200
+      - Level: 267
+        Ap: 200
+      - Level: 268
+        Ap: 200
+      - Level: 269
+        Ap: 200
+      - Level: 270
+        Ap: 200
+      - Level: 271
+        Ap: 200
+      - Level: 272
+        Ap: 200
+      - Level: 273
+        Ap: 200
+      - Level: 274
+        Ap: 200
+      - Level: 275
+        Ap: 200

+ 4 - 1
db/re/job_exp.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:

+ 10 - 5
db/re/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 Header:
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 Body:
   - Jobs:
@@ -7787,6 +7790,7 @@ Body:
     BonusStats:
       - Level: 1
         Dex: 1
+        Sta: 1
       - Level: 2
         Int: 1
         Dex: 1
@@ -7812,7 +7816,6 @@ Body:
       - Level: 10
         Str: 1
         Pow: 1
-        Sta: 1
       - Level: 11
         Dex: 1
         Crt: 1
@@ -7845,7 +7848,6 @@ Body:
         Spl: 1
       - Level: 23
         Str: 1
-        Sta: 1
       - Level: 24
         Int: 1
         Con: 1
@@ -7854,6 +7856,7 @@ Body:
         Crt: 1
       - Level: 26
         Vit: 1
+        Sta: 1
       - Level: 27
         Luk: 1
         Wis: 1
@@ -7866,7 +7869,6 @@ Body:
         Spl: 1
       - Level: 31
         Str: 1
-        Sta: 1
       - Level: 32
         Dex: 1
         Con: 1
@@ -7879,7 +7881,6 @@ Body:
         Dex: 1
       - Level: 36
         Str: 1
-        Sta: 1
       - Level: 37
         Int: 1
       - Level: 38
@@ -7902,9 +7903,13 @@ Body:
       - Level: 45
         Spl: 1
         Con: 1
+      - Level: 46
+        Sta: 1
       - Level: 47
         Wis: 1
         Con: 1
+      - Level: 48
+        Sta: 1
       - Level: 49
         Crt: 1
       - Level: 50

+ 128 - 0
db/re/map_drops.yml

@@ -2428,3 +2428,131 @@ Body:
           - Index: 8
             Item: Evilspirit_Gloves
             Rate: 50
+  - Map: ein_d02_i
+    SpecificDrops:
+      - Monster: ILL_TEDDY_BEAR_B 
+        Drops:
+          - Index: 0
+            Item: IllusionStone
+            Rate: 10
+          - Index: 1
+            Item: Survival_Staff_IL
+            Rate: 25
+            RandomOptionGroup: ILL_MAGIC_NORMAL
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_MINERAL
+        Drops:
+          - Index: 0
+            Item: IllusionStone
+            Rate: 10
+          - Index: 1
+            Item: Survival_Staff_IL
+            Rate: 25
+            RandomOptionGroup: ILL_MAGIC_NORMAL
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_PITMAN
+        Drops:
+          - Index: 0
+            Item: Gate_KeeperDD_IL
+            Rate: 25
+            RandomOptionGroup: ILL_PHYSIC_NORMAL
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_TEDDY_BEAR_R
+        Drops:
+          - Index: 0
+            Item: Headband_Of_Power_IL
+            Rate: 25
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_TEDDY_BEAR_Y
+        Drops:
+          - Index: 0
+            Item: Boots_IL
+            Rate: 25
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_TEDDY_BEAR_W
+        Drops:
+          - Index: 0
+            Item: Counter_Dagger_IL
+            Rate: 25
+            RandomOptionGroup: ILL_PHYSIC_NORMAL
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_OBSIDIAN
+        Drops:
+          - Index: 0
+            Item: Counter_Dagger_IL
+            Rate: 25
+            RandomOptionGroup: ILL_PHYSIC_NORMAL
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_TEDDY_BEAR_G
+        Drops:
+          - Index: 0
+            Item: Gate_KeeperDD_IL
+            Rate: 25
+            RandomOptionGroup: ILL_PHYSIC_NORMAL
+          - Index: 1
+            Item: IllusionStone
+            Rate: 10
+          - Index: 2
+            Item: Teddy_Bear_Box_IL
+            Rate: 5
+      - Monster: ILL_TEDDY_BEAR_S
+        Drops:
+          - Index: 0
+            Item: Boots_IL
+            Rate: 5000
+          - Index: 1
+            Item: Counter_Dagger_IL
+            Rate: 5000
+            RandomOptionGroup: ILL_PHYSIC_BOSS
+          - Index: 2
+            Item: Gate_KeeperDD_IL
+            Rate: 5000
+            RandomOptionGroup: ILL_PHYSIC_BOSS
+          - Index: 3
+            Item: Headband_Of_Power_IL
+            Rate: 5000
+          - Index: 4
+            Item: IllusionStone
+            Rate: 5000
+          - Index: 5
+            Item: IllusionStone
+            Rate: 10000
+          - Index: 6
+            Item: IllusionStone
+            Rate: 15000
+          - Index: 7
+            Item: Survival_Staff_IL
+            Rate: 5000
+            RandomOptionGroup: ILL_MAGIC_BOSS
+          - Index: 8
+            Item: S_Teddy_Bear_Box_IL
+            Rate: 150

+ 46 - 4
db/re/mob_db.yml

@@ -93067,6 +93067,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Plant
+    RaceGroups:
+      Lasagna: true
     Element: Water
     ElementLevel: 1
     WalkSpeed: 200
@@ -93115,6 +93117,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Brute
+    RaceGroups:
+      Lasagna: true
     Element: Earth
     ElementLevel: 1
     WalkSpeed: 300
@@ -93163,6 +93167,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Brute
+    RaceGroups:
+      Lasagna: true
     Element: Earth
     ElementLevel: 2
     WalkSpeed: 250
@@ -93211,6 +93217,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Brute
+    RaceGroups:
+      Lasagna: true
     Element: Earth
     ElementLevel: 2
     WalkSpeed: 250
@@ -93314,6 +93322,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Plant
+    RaceGroups:
+      Lasagna: true
     Element: Earth
     ElementLevel: 3
     WalkSpeed: 1000
@@ -93362,6 +93372,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Insect
+    RaceGroups:
+      Lasagna: true
     Element: Earth
     ElementLevel: 3
     WalkSpeed: 250
@@ -102421,6 +102433,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demihuman
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Dark
     ElementLevel: 3
     WalkSpeed: 120
@@ -102466,6 +102480,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demihuman
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Dark
     ElementLevel: 3
     WalkSpeed: 150
@@ -102508,6 +102524,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demon
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Water
     ElementLevel: 3
     WalkSpeed: 150
@@ -102558,6 +102576,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Formless
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Earth
     ElementLevel: 3
     WalkSpeed: 200
@@ -102604,6 +102624,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demihuman
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Undead
     ElementLevel: 2
     WalkSpeed: 150
@@ -103000,6 +103022,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demon
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Water
     ElementLevel: 3
     WalkSpeed: 150
@@ -103049,6 +103073,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demon
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Fire
     ElementLevel: 3
     WalkSpeed: 150
@@ -103315,6 +103341,8 @@ Body:
     ChaseRange: 12
     Size: Medium
     Race: Demon
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Wind
     ElementLevel: 2
     WalkSpeed: 100
@@ -103365,6 +103393,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Demon
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Dark
     ElementLevel: 3
     WalkSpeed: 150
@@ -103422,6 +103452,8 @@ Body:
     ChaseRange: 12
     Size: Large
     Race: Undead
+    RaceGroups:
+      Glast_Heim_Abyss: true
     Element: Undead
     ElementLevel: 3
     WalkSpeed: 100
@@ -108780,7 +108812,7 @@ Body:
     AttackMotion: 864
     ClientAttackMotion: 648
     DamageMotion: 1440
-#   Ai: 
+    Ai: Abr_Offensive
   - Id: 20835
     AegisName: ABR_DUAL_CANNON
     Name: ABR Duel Cannon
@@ -108805,7 +108837,7 @@ Body:
     AttackMotion: 768
     ClientAttackMotion: 576
     DamageMotion: 1008
-#   Ai: 
+    Ai: Abr_Offensive
   - Id: 20836
     AegisName: ABR_MOTHER_NET
     Name: ABR Mother Net
@@ -108830,7 +108862,7 @@ Body:
     AttackMotion: 1008
     ClientAttackMotion: 672
     DamageMotion: 576
-#   Ai: 
+    Ai: Abr_Passive
   - Id: 20837
     AegisName: ABR_INFINITY
     Name: ABR Infinity
@@ -108855,7 +108887,7 @@ Body:
     AttackMotion: 1728
     ClientAttackMotion: 840
     DamageMotion: 1008
-#   Ai: 
+    Ai: Abr_Offensive
 #  - Id: 20838
 #    AegisName: ELEMETAL_MASTER_S1
 #  - Id: 20839
@@ -117610,10 +117642,20 @@ Body:
 #    AegisName: EP21_B_YORTUS_A_H
 #  - Id: 22422
 #    AegisName: EP21_B_YORTUS_B_H
+#  - Id: 22423
+#    AegisName: 2501_EV_MATJALAL
+#  - Id: 22424
+#    AegisName: 2501_EV_ACARI
 #  - Id: 22425
 #    AegisName: E_LEADER_SHEEP
 #  - Id: 22426
 #    AegisName: E_WINTER_SAVAGE
+#  - Id: 22427
+#    AegisName: MANDURING
+#  - Id: 22429
+#    AegisName: KINGMANDURING
+#  - Id: 22430
+#    AegisName: E_WINTER_KEEPER
 #  - Id: 22431
 #    AegisName: TATSI
 #  - Id: 22432

+ 5 - 3
db/re/mob_skill_db.txt

@@ -47,6 +47,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
+//	alchemist		When mob has a special AI, is not trickcasting, and is wounded (no condition value).
+//	trickcasting		Used once mob started moving through NPC_RANDOMMOVE until disabled (no condition value).
 //
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /
@@ -719,11 +721,11 @@
 1141,Marina@NPC_CRITICALSLASH,attack,170,1,500,500,5000,no,target,always,0,,,,,,6,
 1141,Marina@NPC_EMOTION,walk,197,1,2000,0,5000,yes,self,always,0,19,,,,,,
 1141,Marina@NPC_WATERATTACK,attack,184,2,500,500,5000,no,target,always,0,,,,,,6,
-1142,Marine Sphere@NPC_RANDOMMOVE,idle,331,1,10000,0,30000,no,master,alchemist,,,,,,,,
-1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,3000,0,no,self,afterskill,331,,,,,,,
+1142,Marine Sphere@NPC_RANDOMMOVE,idle,331,1,10000,0,30000,no,target,alchemist,,,,,,,,
 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,500,2000,5000,no,self,myhpltmaxrate,99,,,,,,,
 1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,2000,5000,no,self,skillused,173,,,,,,,
-1142,Marine Sphere@NPC_SPEEDUP,idle,332,1,10000,0,700,yes,target,always,,,,,,,,
+1142,Marine Sphere@NPC_SELFDESTRUCTION,idle,173,1,10000,0,0,yes,self,alchemist,,,,,,,,
+1142,Marine Sphere@NPC_SPEEDUP,idle,332,1,10000,0,700,yes,self,trickcasting,,,,,,,,
 1143,Marionette@HT_FREEZINGTRAP,idle,121,5,500,0,300000,yes,around2,always,0,,,,,,29,
 1143,Marionette@MG_FIREWALL,chase,18,5,500,500,5000,yes,target,always,0,,,,,,2,
 1143,Marionette@NPC_TELEKINESISATTACK,attack,191,5,500,0,5000,yes,target,always,0,,,,,,6,

+ 268 - 1
db/re/pet_db.yml

@@ -762,6 +762,7 @@ Body:
           - Item: Alice_Card
             Amount: 1
   - Mob: EVENT_RICECAKE
+    TameItem: Mysterious_Rice_Powder
     EggItem: Rice_Cake_Egg
     FoodItem: Green_Herb
     Fullness: 3
@@ -2425,6 +2426,7 @@ Body:
 #          - Item: Cookies_Bat
 #            Amount: 100
   - Mob: WILOW
+    #TameItem: Dew_Of_Old_Tree
     EggItem: Wilow_Egg
     FoodItem: Tree_Of_Archer_1
     Fullness: 2   # unknown
@@ -2442,6 +2444,7 @@ Body:
          bonus bInt,2;
       }
   - Mob: ROWEEN
+    #TameItem: Foul_Rotten_Meat
     EggItem: Roween_Egg
     FoodItem: Rotten_Meat
     Fullness: 2   # unknown
@@ -2556,12 +2559,13 @@ Body:
 #      }
 #
   - Mob: DARK_PRIEST
+    TameItem: Darkness_Bible
     EggItem: Dark_Priest_Egg
     FoodItem: Evil_Water
     Fullness: 2   # unknown
     HungryDelay: 120   # unknown
     IntimacyFed: 15   # unknown
-    CaptureRate: 0   # unknown
+    CaptureRate: 200   # unknown
     SpecialPerformance: false   # unknown
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
@@ -3280,3 +3284,266 @@ Body:
 #         bonus2 bAddClass,Class_Normal,1;
 #      }
 #
+#  - Mob: DOMOVOI
+#    EggItem: Brownie_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_LOYAL) {
+#         bonus2 bAddRace,RC_DemiHuman,1;
+#         bonus2 bMagicAddRace,RC_DemiHuman,1;
+#         bonus2 bSubRace,RC_DemiHuman,1;
+#      }
+#
+#  - Mob: WOODIE
+#    EggItem: Woodie_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMaxHP,75;
+#         bonus bLuk,2;
+#      }
+#
+#  - Mob: ELEPHANT
+#    EggItem: Elephant_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      bonus bDex,3;
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bDex,3;
+#      }
+#
+#  - Mob: GORILLA
+#    EggItem: Gorilla_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      bonus bStr,2;
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bBaseAtk,10;
+#      }
+#
+#  - Mob: LION
+#    EggItem: Lion_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      bonus bMaxSP,10;
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bInt,3;
+#      }
+#
+#  - Mob: RHINO
+#    EggItem: Rhino_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      bonus bMaxHP,100;
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bVit,3;
+#      }
+#
+#  - Mob: PAD_RUBYLIT
+#    EggItem: Rubylit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bBaseAtk,10;
+#      }
+#
+#  - Mob: PAD_SAPPHILIT
+#    EggItem: Sapphilit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMaxHP,100;
+#      }
+#
+#  - Mob: PAD_EMELIT
+#    EggItem: Emelit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMaxHP,50;
+#         bonus bMaxSP,25;
+#      }
+#
+#  - Mob: PAD_TOPALIT
+#    EggItem: Topalit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMaxSP,50;
+#      }
+#
+#  - Mob: PAD_AMELIT
+#    EggItem: Amelit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMatk,10;
+#      }
+#
+#  - Mob: PAD_MYTHLIT
+#    EggItem: Mythlit_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bAllStats,1;
+#      }
+#
+#  - Mob: PAD_TAMADORA
+#    EggItem: Tamadora_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_LOYAL) {
+#         bonus3 bAutoSpell,"AL_HEAL",1,10;
+#         skill "AL_HEAL",1;
+#      }
+#      else if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus3 bAutoSpell,"AL_HEAL",1,10;
+#      }
+#
+#  - Mob: ORK_HERO
+#    EggItem: Orc_Hero_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_LOYAL) {
+#         bonus bBaseAtk,40;
+#      }
+#      else if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bBaseAtk,30;
+#      }
+#      else if (.@i >= PET_INTIMATE_NEUTRAL) {
+#         bonus bBaseAtk,20;
+#      }
+#      else {
+#         bonus bBaseAtk,10;
+#         bonus bDef,-3;
+#      }
+#
+#  - Mob: ORC_LORD
+#    EggItem: Orc_Lord_Egg
+#    FoodItem: Pet_Food   # unknown
+#    Fullness: 2   # unknown
+#    HungryDelay: 120   # unknown
+#    IntimacyFed: 15   # unknown
+#    CaptureRate: 0   # unknown
+#    SpecialPerformance: false   # unknown
+#    Script: >
+#      .@i = getpetinfo(PETINFO_INTIMATE);
+#
+#      if (.@i >= PET_INTIMATE_LOYAL) {
+#         bonus bMatk,20;
+#         bonus bBaseAtk,20;
+#      }
+#      else if (.@i >= PET_INTIMATE_CORDIAL) {
+#         bonus bMatk,15;
+#         bonus bBaseAtk,15;
+#      }
+#      else if (.@i >= PET_INTIMATE_NEUTRAL) {
+#         bonus bMatk,10;
+#         bonus bBaseAtk,10;
+#      }
+#      else {
+#         bonus bBaseAtk,10;
+#         bonus bDef,-3;
+#      }

+ 28 - 0
db/re/quest_db.yml

@@ -8297,6 +8297,34 @@ Body:
   - Id: 11739
     Title: "[Cooldown] Oz Labyrinth 2F"
     TimeLimit: 4h
+  - Id: 11769
+    Title: Job Change to Spirit Handler
+  - Id: 11770
+    Title: How to make friends with spirits
+  - Id: 11771
+    Title: How to make friends with spirits
+  - Id: 11772
+    Title: How to make friends with spirits
+  - Id: 11773
+    Title: How to make friends with spirits
+  - Id: 11774
+    Title: How to make friends with spirits
+  - Id: 11775
+    Title: How to make friends with spirits
+  - Id: 11776
+    Title: How to make friends with spirits
+  - Id: 11777
+    Title: How to make friends with spirits
+  - Id: 11778
+    Title: How to make friends with spirits
+  - Id: 11779
+    Title: How to make friends with spirits
+  - Id: 11780
+    Title: How to make friends with spirits
+  - Id: 11781
+    Title: How to make friends with spirits
+  - Id: 11782
+    Title: How to make friends with spirits
   - Id: 12000
     Title: An old friend
   - Id: 12001

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 31 - 97
db/re/skill_db.yml


+ 309 - 0
db/re/skill_tree.yml

@@ -7019,6 +7019,13 @@ Body:
         Requires:
           - Name: AG_RAIN_OF_CRYSTAL
             Level: 1
+      - Name: AG_ENERGY_CONVERSION
+        MaxLevel: 5
+        Requires:
+          - Name: WL_RECOGNIZEDSPELL
+            Level: 2
+          - Name: AG_CLIMAX
+            Level: 1
   - Job: Cardinal
     Inherit:
       Novice: true
@@ -7201,6 +7208,13 @@ Body:
         Requires:
           - Name: WH_SOLIDTRAP
             Level: 1
+      - Name: WH_WILD_WALK
+        MaxLevel: 5
+        Requires:
+          - Name: WH_NATUREFRIENDLY
+            Level: 3
+          - Name: WH_HAWKRUSH
+            Level: 3
   - Job: Imperial_Guard
     Inherit:
       Novice: true
@@ -8298,3 +8312,298 @@ Body:
             Level: 1
           - Name: SH_MYSTICAL_CREATURE_MASTERY
             Level: 10
+  - Job: Sky_Emperor
+    Inherit:
+      Novice: true
+      Taekwon: true
+      Star_Gladiator: true
+      Star_Emperor: true
+    Tree:
+      - Name: SKE_WAR_BOOK_MASTERY
+        MaxLevel: 10
+      - Name: SKE_SKY_MASTERY
+        MaxLevel: 10
+      - Name: SKE_RISING_SUN
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 1
+      - Name: SKE_RISING_MOON
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 1
+      - Name: SKE_TWINKLING_GALAXY
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 1
+      - Name: SKE_NOON_BLAST
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 3
+          - Name: SKE_RISING_SUN
+            Level: 1
+      - Name: SKE_MIDNIGHT_KICK
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 3
+          - Name: SKE_RISING_MOON
+            Level: 1
+      - Name: SKE_STAR_BURST
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 3
+          - Name: SKE_TWINKLING_GALAXY
+            Level: 1
+      - Name: SKE_SUNSET_BLAST
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 5
+          - Name: SKE_NOON_BLAST
+            Level: 1
+      - Name: SKE_DAWN_BREAK
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 5
+          - Name: SKE_MIDNIGHT_KICK
+            Level: 1
+      - Name: SKE_STAR_CANNON
+        MaxLevel: 5
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 5
+          - Name: SKE_STAR_BURST
+            Level: 1
+      - Name: SKE_ALL_IN_THE_SKY
+        MaxLevel: 10
+        Requires:
+          - Name: SKE_WAR_BOOK_MASTERY
+            Level: 5
+          - Name: SKE_RISING_SUN
+            Level: 1
+          - Name: SKE_RISING_MOON
+            Level: 1
+      - Name: SKE_ENCHANTING_SKY
+        MaxLevel: 10
+        Requires:
+          - Name: SKE_SKY_MASTERY
+            Level: 5
+  - Job: Sky_Emperor2
+    Inherit:
+      Novice: true
+      Taekwon: true
+      Star_Gladiator: true
+      Star_Emperor: true
+      Sky_Emperor: true
+  - Job: Shinkiro
+    Inherit:
+      Novice: true
+      Ninja: true
+      Kagerou: true
+    Tree:
+      - Name: SS_SHINKIROU
+        MaxLevel: 1
+      - Name: SS_SEKIENHOU
+        MaxLevel: 10
+      - Name: SS_SHIMIRU
+        MaxLevel: 5
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KUNAIWAIKYOKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KAGEGARI
+        MaxLevel: 10
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_REIKETSUHOU
+        MaxLevel: 10
+      - Name: SS_TOKEDASU
+        MaxLevel: 5
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KUNAIKAITEN
+        MaxLevel: 5
+        Requires:
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 3
+      - Name: SS_FUUMASHOUAKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 3
+      - Name: SS_KAGENOMAI
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KAGEGARI
+            Level: 3
+      - Name: SS_RAIDENPOU
+        MaxLevel: 10
+      - Name: SS_AKUMUKESU
+        MaxLevel: 1
+      - Name: SS_KUNAIKUSSETSU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KUNAIKAITEN
+            Level: 5
+      - Name: SS_FUUMAKOUCHIKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_FUUMASHOUAKU
+            Level: 5
+      - Name: SS_KAGEGISSEN
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KAGENOMAI
+            Level: 5
+      - Name: SS_KINRYUUHOU
+        MaxLevel: 10
+      - Name: SS_HITOUAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 5
+          - Name: SS_KUNAIKAITEN
+            Level: 5
+          - Name: SS_KUNAIKUSSETSU
+            Level: 5
+      - Name: SS_KAGEAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_KAGEGISSEN
+            Level: 7
+      - Name: SS_ANTENPOU
+        MaxLevel: 10
+      - Name: SS_ANKOKURYUUAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_SEKIENHOU
+            Level: 5
+          - Name: SS_REIKETSUHOU
+            Level: 5
+          - Name: SS_RAIDENPOU
+            Level: 5
+          - Name: SS_KINRYUUHOU
+            Level: 5
+          - Name: SS_ANTENPOU
+            Level: 5
+  - Job: Shiranui
+    Inherit:
+      Novice: true
+      Ninja: true
+      Oboro: true
+    Tree:
+      - Name: SS_SHINKIROU
+        MaxLevel: 1
+      - Name: SS_SEKIENHOU
+        MaxLevel: 10
+      - Name: SS_SHIMIRU
+        MaxLevel: 5
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KUNAIWAIKYOKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KAGEGARI
+        MaxLevel: 10
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_REIKETSUHOU
+        MaxLevel: 10
+      - Name: SS_TOKEDASU
+        MaxLevel: 5
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+      - Name: SS_KUNAIKAITEN
+        MaxLevel: 5
+        Requires:
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 3
+      - Name: SS_FUUMASHOUAKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 3
+      - Name: SS_KAGENOMAI
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KAGEGARI
+            Level: 3
+      - Name: SS_RAIDENPOU
+        MaxLevel: 10
+      - Name: SS_AKUMUKESU
+        MaxLevel: 1
+      - Name: SS_KUNAIKUSSETSU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KUNAIKAITEN
+            Level: 5
+      - Name: SS_FUUMAKOUCHIKU
+        MaxLevel: 10
+        Requires:
+          - Name: SS_FUUMASHOUAKU
+            Level: 5
+      - Name: SS_KAGEGISSEN
+        MaxLevel: 10
+        Requires:
+          - Name: SS_KAGENOMAI
+            Level: 5
+      - Name: SS_KINRYUUHOU
+        MaxLevel: 10
+      - Name: SS_HITOUAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_KUNAIWAIKYOKU
+            Level: 5
+          - Name: SS_KUNAIKAITEN
+            Level: 5
+          - Name: SS_KUNAIKUSSETSU
+            Level: 5
+      - Name: SS_KAGEAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_KAGEGISSEN
+            Level: 7
+      - Name: SS_ANTENPOU
+        MaxLevel: 10
+      - Name: SS_ANKOKURYUUAKUMU
+        MaxLevel: 1
+        Requires:
+          - Name: SS_SHINKIROU
+            Level: 1
+          - Name: SS_SEKIENHOU
+            Level: 5
+          - Name: SS_REIKETSUHOU
+            Level: 5
+          - Name: SS_RAIDENPOU
+            Level: 5
+          - Name: SS_KINRYUUHOU
+            Level: 5
+          - Name: SS_ANTENPOU
+            Level: 5

+ 132 - 24
db/re/status.yml

@@ -340,7 +340,6 @@ Body:
     Icon: EFST_HIDING
     DurationLookup: TF_HIDING
     States:
-      NoMove: true
       NoMoveCond: true
       NoPickItem: true
       NoConsumeItem: true
@@ -689,6 +688,8 @@ Body:
       NoBanishingBuster: true
       NoClearance: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight90: true
   - Status: Weight90
     Icon: EFST_WEIGHTOVER90
     Flags:
@@ -700,6 +701,8 @@ Body:
       NoBanishingBuster: true
       NoClearance: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight50: true
   - Status: Aspdpotion0
     Icon: EFST_ATTHASTE_POTION1
     CalcFlags:
@@ -765,7 +768,7 @@ Body:
       OverlapIgnoreLevel: true
       RemoveOnHermode: true
     Script: |
-      bonus bMatk, getstatus(SC_MATKPOTION, 1);  /* TODO: hidden in status window */
+      bonus bMatk2, getstatus(SC_MATKPOTION, 1);
   - Status: Wedding
     States:
       NoAttack: true
@@ -804,9 +807,6 @@ Body:
   - Status: Barrier
     Icon: EFST_BARRIER
     DurationLookup: NPC_BARRIER
-    CalcFlags:
-      Mdef: true
-      Def: true
     Flags:
       RemoveOnHermode: true
   - Status: Stripweapon
@@ -1173,13 +1173,9 @@ Body:
       bonus2 bSubEle,Ele_Wind, getstatus(SC_ARMOR_ELEMENT_WATER, 4);
   - Status: Nochat
     States:
-      NoPickItem: true
       NoPickItemCond: true
-      NoDropItem: true
       NoDropItemCond: true
-      NoChat: true
       NoChatCond: true
-      NoConsumeItem: true
       NoConsumeItemCond: true
     Flags:
       NoRemoveOnDead: true
@@ -1257,7 +1253,6 @@ Body:
     Icon: EFST_GOSPEL
     DurationLookup: PA_GOSPEL
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Speed: true
@@ -1774,7 +1769,6 @@ Body:
     Icon: EFST_BDPLAYING
     DurationLookup: BD_ENCORE
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Speed: true
@@ -2455,8 +2449,6 @@ Body:
     CalcFlags:
       Def2: true
       MDef2: true
-      Speed: true
-      Aspd: true
     Opt3:
       SteelBody: true
     Flags:
@@ -3109,7 +3101,6 @@ Body:
   - Status: Fear
     DurationLookup: RK_WINDCUTTER
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Flee: true
@@ -3481,7 +3472,6 @@ Body:
     Icon: EFST_CAMOUFLAGE
     DurationLookup: RA_CAMOUFLAGE
     States:
-      NoMove: true
       NoMoveCond: true
     CalcFlags:
       Speed: true
@@ -3839,8 +3829,7 @@ Body:
   - Status: Oblivioncurse
     Icon: EFST_OBLIVIONCURSE
     States:
-      NoCast: true
-      Nocastcond: true
+      NoCastCond: true
     CalcFlags:
       Regen: true
     Flags:
@@ -3993,9 +3982,7 @@ Body:
     Icon: EFST_COLD
     DurationLookup: SO_DIAMONDDUST
     States:
-      NoMove: true
       NoMoveCond: true
-      NoCast: true
       NoCastCond: true
       NoConsumeItem: true
       NoAttack: true
@@ -6501,8 +6488,8 @@ Body:
       MaxSp: true
   - Status: Norecover_State
     Icon: EFST_HANDICAPSTATE_NORECOVER
-    Fail:
-      Norecover_State: true
+    CalcFlags:
+      Regen: true
   - Status: Suhide
     Icon: EFST_SUHIDE
     DurationLookup: SU_HIDE
@@ -6565,6 +6552,8 @@ Body:
   - Status: Tunaparty
     Icon: EFST_TUNAPARTY
     DurationLookup: SU_TUNAPARTY
+    Flags:
+      NoDispell: true
   - Status: Shrimp
     Icon: EFST_SHRIMP
     DurationLookup: SU_BUNCHOFSHRIMP
@@ -7526,24 +7515,25 @@ Body:
       bonus bVariableCastrate,-80;
   - Status: OverBrandReady
     Icon: EFST_OVERBRANDREADY
-    Flags:
   - Status: Poison_Mist
     Icon: EFST_POISON_MIST
     DurationLookup: MH_POISON_MIST
     CalcFlags:
       Flee: true
-    Flags:
   - Status: Stone_Wall
     Icon: EFST_STONE_WALL
     DurationLookup: MH_STEINWAND
     CalcFlags:
       Def: true
       Mdef: true
-    Flags:
   - Status: Cloud_Poison
     Icon: EFST_CLOUD_POISON
     DurationLookup: SO_CLOUD_KILL
     Flags:
+      BlEffect: true
+#     DisplayMob: true  # !TODO: check me
+    Fail:
+      Cloud_Poison: true
   - Status: Homun_Time
     Icon: EFST_HOMUN_TIME
     Flags:
@@ -9588,6 +9578,11 @@ Body:
       Patk: true
       Smatk: true
       Hplus: true
+    Flags:
+      # NoClearbuff: true  # !TODO
+      NoDispell: true
+      # NoBanishingBuster: true  # !TODO
+      # NoClearance: true  # !TODO
   - Status: Marine_Festival
     Icon: EFST_MARINE_FESTIVAL
     DurationLookup: SH_MARINE_FESTIVAL_OF_KI_SUL
@@ -9674,6 +9669,119 @@ Body:
     CalcFlags:
       Patk: true
       Smatk: true
+    # Flags:  # !TODO: NoDispell ?
   - Status: Blessing_of_M_C_Debuff
     Icon: EFST_BLESSING_OF_M_C_DEBUFF
     DurationLookup: SH_BLESSING_OF_MYSTICAL_CREATURES
+    Flags:
+      # NoClearbuff: true  # !TODO
+      NoDispell: true
+      # NoBanishingBuster: true  # !TODO
+      # NoClearance: true  # !TODO
+  - Status: Rising_Sun
+    Icon: EFST_RISING_SUN
+    DurationLookup: SKE_RISING_SUN
+    Fail:
+      Rising_Moon: true
+      Midnight_Moon: true
+      Sky_Enchant: true
+    EndOnStart:
+      Dawn_Moon: true
+  - Status: Noon_Sun
+    Icon: EFST_NOON_SUN
+    DurationLookup: SKE_RISING_SUN
+    EndOnStart:
+      Rising_Sun: true
+  - Status: Sunset_Sun
+    Icon: EFST_SUNSET_SUN
+    DurationLookup: SKE_RISING_SUN
+    EndOnStart:
+      Noon_Sun: true
+    Fail:
+      Sunset_Sun: true
+  - Status: Rising_Moon
+    Icon: EFST_RISING_MOON
+    DurationLookup: SKE_RISING_MOON
+    Fail:
+      Rising_Sun: true
+      Noon_Sun: true
+      Sky_Enchant: true
+    EndOnStart:
+      Sunset_Sun: true
+  - Status: Midnight_Moon
+    Icon: EFST_MIDNIGHT_MOON
+    DurationLookup: SKE_RISING_MOON
+    EndOnStart:
+      Rising_Moon: true
+  - Status: Dawn_Moon
+    Icon: EFST_DAWN_MOON
+    DurationLookup: SKE_RISING_MOON
+    EndOnStart:
+      Midnight_Moon: true
+    Fail:
+      Dawn_Moon: true
+  - Status: Star_Burst
+    Icon: EFST_STAR_BURST
+    DurationLookup: SKE_STAR_BURST
+    Flags:
+      BlEffect: true
+  - Status: Sky_Enchant
+    Icon: EFST_SKY_ENCHANT
+    DurationLookup: SKE_ENCHANTING_SKY
+    EndOnStart:
+      Rising_Sun: true
+      Noon_Sun: true
+      Sunset_Sun: true
+      Rising_Moon: true
+      Midnight_Moon: true
+      Dawn_Moon: true
+  - Status: Wild_Walk
+    Icon: EFST_WILD_WALK
+    DurationLookup: WH_WILD_WALK
+    CalcFlags:
+      Flee: true
+      Speed: true
+    Flags:
+      NoRemoveOnDead: true
+      NoSave: true
+      NoBanishingBuster: true
+      NoDispell: true
+      NoClearance: true
+  - Status: Shadow_Clock
+    Icon: EFST_SHADOW_CLOCK
+    DurationLookup: SS_TOKEDASU
+    CalcFlags:
+      Speed: true
+  - Status: Shinkirou_Call
+    Icon: EFST_SBUNSHIN
+    DurationLookup: SS_SHINKIROU
+    CalcFlags:
+      Speed: true
+  - Status: Nightmare
+    Icon: EFST_NIGHTMARE
+    DurationLookup: SS_KAGEGARI
+    Flags:
+      Debuff: true
+      BlEffect: true
+      DisplayPc: true
+  - Status: Contents_34
+    Icon: EFST_CONTENTS_34
+    Flags:
+      NoClearbuff: true
+      NoDispell: true
+      NoBanishingBuster: true
+      NoClearance: true
+    Script: |
+      bonus bAspdRate, getstatus(SC_CONTENTS_34, 1);
+      bonus bCritical, getstatus(SC_CONTENTS_34, 2);
+  - Status: Contents_35
+    Icon: EFST_CONTENTS_35
+    Flags:
+      NoClearbuff: true
+      NoDispell: true
+      NoBanishingBuster: true
+      NoClearance: true
+    Script: |
+      .@val1 = getstatus(SC_CONTENTS_35, 1);
+      bonus bMatk, .@val1;
+      bonus bBaseAtk, .@val1;

+ 3 - 3
db/skill_db.yml

@@ -58,7 +58,7 @@
 #   NoNearNPC:                Determines if the skill can be used near a NPC. (Optional)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
-#   CastCancel                Cancel cast when hit. (Default: false)
+#   CastCancel                Cancel cast when hit. (Default: true)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
@@ -115,7 +115,7 @@
 #         Amount              Ammo amount required at specific skill level.
 #     State                   Special state required to cast. (Default: None)
 #     Status:                 Status change required to cast. (Default: nullptr)
-#     SphereCost:             Spirit sphere required to cast. (Default: 0)
+#     SpiritSphereCost:       Spirit sphere required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #     ItemCost:               Item required to cast. (Default: 0)
@@ -140,7 +140,7 @@
 
 Header:
   Type: SKILL_DB
-  Version: 3
+  Version: 4
 
 Footer:
   Imports:

+ 3 - 1
doc/item_bonus.txt

@@ -32,7 +32,7 @@ This list contains all available constants referenced in the 'bonus' commands.
 	RC2_Clocktower, RC2_Thanatos, RC2_Faceworm, RC2_Hearthunter, RC2_Rockridge, RC2_Werner_Lab,
 	RC2_Temple_Demon, RC2_Illusion_Vampire, RC2_Malangdo, RC2_EP172ALPHA, RC2_EP172BETA, RC2_EP172BATH,
 	RC2_Illusion_Turtle, RC2_Rachel_Sanctuary, RC2_Illusion_Luanda, RC2_Illusion_Frozen, RC2_Illusion_Moonlight,
-	RC2_Ep16_def, RC2_Edda_Arunafeltz
+	RC2_Ep16_def, RC2_Edda_Arunafeltz, RC2_Lasagna, RC2_Glast_Heim_Abyss
 
 * Class (c)
 	Class_Normal, Class_Boss, Class_Guardian, Class_All
@@ -130,6 +130,7 @@ bonus bAtk2,n;     			ATK2 + n
 bonus bAtkRate,n;  			ATK + n% that won't interfere with Damage modifier and SC_EDP (renewal mode only)
 bonus bWeaponAtkRate,n; 	Weapon ATK + n%
 bonus bMatk,n;     			Magical attack power + n
+bonus bMatk2,n;     		Magical attack power + n (not visible in status window)
 bonus bMatkRate,n; 			Magical attack power + n%
 bonus bWeaponMatkRate,n;	Weapon Magical ATK + n% (renewal mode only)
 bonus bDef,n;      			Equipment DEF + n
@@ -197,6 +198,7 @@ bonus2 bSkillUseSPrate,sk,n;		Decreases SP consumption of skill sk by n%
 Atk/Def
 -------
 bonus2 bSkillAtk,sk,n;    		Increases damage of skill sk by n%
+bonus bSkillRatio,n;			Adds n to the skillratio of all attacks/skills that use it
 bonus bShortAtkRate,n;			Increases damage of short ranged attacks by n%
 bonus bLongAtkRate,n;     		Increases damage of long ranged attacks by n%
 bonus bCritAtkRate,n;     		Increases critical damage by +n%

+ 5 - 0
doc/mob_db_mode_list.txt

@@ -142,6 +142,11 @@ Aegis/rA (description)
 26: 0xB695 (aggressive, change-target melee/chase, cast sensor idle/chase, chase-change target, random target)
 27: 0x8084 (aggressive, immobile, random target)
 
+Special AI:
+
+ABR_PASSIVE: 0x0021 (passive, does not walk randomly, can't attack)
+ABR_OFFENSIVE: 0x00A5 (aggressive, does not walk randomly)
+
 Aegis Class Types
 -------------------------------------------------------------------------------
 

+ 31 - 0
doc/sample/getguildinfo.txt

@@ -0,0 +1,31 @@
+//===== rAthena Script =======================================
+//= getguildinfo sample
+//===== Description: =========================================
+//= Sample script for the getguildinfo script command
+//===== Additional Comments: =================================
+//= 1.0 First version. [crazyarashi]
+//============================================================
+
+prontera,255,55,5	script	test_getguildinfo	2_M_SAGE_OLD,{
+	.@gid = getcharid(2);
+	if ( !.@gid ) {
+		mes "You don't have a guild.";
+		close;
+	}
+	setarray .@data$[0], "Guild Name", "Guild Level", "Average Level", "Online Count", "Member Count", "Max Member Count", "EXP", "Next Exp", "Master CID", "Master Name";
+	setarray .@type[0], GUILDINFO_NAME, GUILDINFO_LEVEL, GUILDINFO_AVERAGELEVEL, GUILDINFO_ONLINECOUNT, GUILDINFO_MEMBERCOUNT, GUILDINFO_MAXMEMBERCOUNT, GUILDINFO_EXP, GUILDINFO_NEXTEXP, GUILDINFO_MASTERID, GUILDINFO_MASTERNAME;
+	for ( .@i = 0; .@i < getarraysize(.@data$); ++.@i )
+		dispbottom .@data$[.@i] + " : " + getguildinfo(.@gid, .@type[.@i]);
+	end;
+}
+
+prontera,255,57,5	script	test_getguildinfo2	2_M_SAGE_OLD,{
+	.@gid = 1234;
+	// Load guild information from char-server
+	requestguildinfo .@gid;
+	setarray .@data$[0], "Guild Name", "Guild Level", "Average Level", "Online Count", "Member Count", "Max Member Count", "EXP", "Next Exp", "Master CID", "Master Name";
+	setarray .@type[0], GUILDINFO_NAME, GUILDINFO_LEVEL, GUILDINFO_AVERAGELEVEL, GUILDINFO_ONLINECOUNT, GUILDINFO_MEMBERCOUNT, GUILDINFO_MAXMEMBERCOUNT, GUILDINFO_EXP, GUILDINFO_NEXTEXP, GUILDINFO_MASTERID, GUILDINFO_MASTERNAME;
+	for ( .@i = 0; .@i < getarraysize(.@data$); ++.@i )
+		dispbottom .@data$[.@i] + " : " + getguildinfo(.@gid, .@type[.@i]);
+	end;
+}

+ 86 - 44
doc/script_commands.txt

@@ -1188,6 +1188,11 @@ The following sample will open a preview window for Red Potion:
 
 NOTE: Be aware that item links are broken in some 2015 clients.
 
+In 2023 the syntax ^i[Item ID] was introduced to display an item icon inside a NPC dialog.
+We created a script command "mesitemicon" that allows you to create the correct syntax
+depending on your configured packet version. We recommend that you use this script command
+instead of hardcoding the other syntax. For more details see the documentation for "mesitemicon".
+
 URLs
 ----
 Similarly, you can create links to websites that launch in a new window:
@@ -3507,6 +3512,36 @@ guild specified by the ID. 0 if the character is not a guild master of any guild
 
 ---------------------------------------
 
+*getguildinfo(<guild ID>, <type>);
+
+This function will look up and return the request type of guild information.
+
+Types:
+	GUILDINFO_NAME              - Guild's Name
+	GUILDINFO_LEVEL             - Guild's Level
+	GUILDINFO_AVERAGELEVEL      - Guild's Average Level
+	GUILDINFO_ONLINECOUNT       - Guild's Online Member Count
+	GUILDINFO_MEMBERCOUNT       - Guild's Current Member Count
+	GUILDINFO_MAXMEMBERCOUNT    - Guild's Max Member Count
+	GUILDINFO_EXP               - Guild's Current EXP
+	GUILDINFO_NEXTEXP           - Guild's Required EXP to Level
+	GUILDINFO_MASTERID          - Guild Master Character ID
+	GUILDINFO_MASTERNAME        - Guild Master Name
+
+Note: Make sure to use the requestguildinfo script command to load the guild data from the char-server.
+Example Case ( Newly formed guild ):
+
+.@gid = 1234;
+
+getguildinfo( .@gid, GUILDINFO_LEVEL ); //Returns 0
+
+requestguildinfo( .@gid );
+getguildinfo( .@gid, GUILDINFO_LEVEL ); //Returns current guild level
+
+See the sample in 'doc/sample/getguildinfo.txt'.
+
+---------------------------------------
+
 *is_guild_leader({<guild ID>})
 
 This command will return true if the player attached to the script is the leader
@@ -3678,32 +3713,34 @@ It will return -1 if there is no such monster (or the type value is invalid),
 or "null" if you requested the monster's name.
 
 Valid types are:
-	MOB_NAME - monster's japanese name, if there is no such monster "null" is returned
-	MOB_LV - monster's level
-	MOB_MAXHP - monster's maximum hp
-	MOB_BASEEXP - monster's base experience
-	MOB_JOBEXP - monster's job experience
-	MOB_ATK1 - monster's atk
-	MOB_ATK2 - monster's atk2
-	MOB_DEF - monster's def
-	MOB_MDEF - monster's mdef
-	MOB_RES - monster's res
-	MOB_MRES - monster's mres
-	MOB_STR - monster's str
-	MOB_AGI - monster's agi
-	MOB_VIT - monster's vit
-	MOB_INT - monster's int
-	MOB_DEX - monster's dex
-	MOB_LUK - monster's luk
-	MOB_RANGE - monster's range
-	MOB_RANGE2 - monster's range2
-	MOB_RANGE3 - monster's range3
-	MOB_SIZE - monster's size
-	MOB_RACE - monster's race
-	MOB_ELEMENT - monster's element(doesn't return the element level, only the element ID)
-	MOB_MODE - monster's mode
-	MOB_MVPEXP - monster's mvp experience
-	MOB_ID - monster's ID
+	MOB_NAME          - monster's japanese name
+	MOB_LV            - monster's level
+	MOB_MAXHP         - monster's maximum hp
+	MOB_BASEEXP       - monster's base experience
+	MOB_JOBEXP        - monster's job experience
+	MOB_ATKMIN        - monster's minimum atk
+	MOB_ATKMAX        - monster's maximum atk
+	MOB_DEF           - monster's def
+	MOB_MDEF          - monster's mdef
+	MOB_RES           - monster's res
+	MOB_MRES          - monster's mres
+	MOB_STR           - monster's str
+	MOB_AGI           - monster's agi
+	MOB_VIT           - monster's vit
+	MOB_INT           - monster's int
+	MOB_DEX           - monster's dex
+	MOB_LUK           - monster's luk
+	MOB_SPEED         - monster's speed
+	MOB_ATKRANGE      - monster's attack range
+	MOB_SKILLRANGE    - monster's skill cast range
+	MOB_CHASERANGE    - monster's chase range
+	MOB_SIZE          - monster's size
+	MOB_RACE          - monster's race
+	MOB_ELEMENT       - monster's element
+	MOB_ELEMENTLV     - monster's element level
+	MOB_MODE          - monster's mode
+	MOB_MVPEXP        - monster's mvp experience
+	MOB_ID            - monster's ID
 
 For more details, see the sample in 'doc/sample/getmonsterinfo.txt'.
 
@@ -4765,6 +4802,12 @@ wall), the character is pushed only up to the obstacle.
 
 ---------------------------------------
 
+*kick({<char_id>});
+
+This command kicks the attached character (or character provided by <char_id>) from the map server, just like @kick.
+
+---------------------------------------
+
 *recalculatestat;
 
 This command will force a stat recalculation for the attached player.
@@ -6869,24 +6912,6 @@ command, simply use 1 for type. Any other number won't be recognized.
 
 ---------------------------------------
 
-*strmobinfo(<type>,<monster id>);
-
-This function will return information about a monster record in the database, as
-per 'db/(pre-)re/mob_db.yml'. Type is the kind of information returned. Valid types are:
-It will return 0 if there is no such monster (or the type value is invalid),
-or an empty string if you requested the monster's name.
-
- 1 - 'english name' field in the database, a string.
- 2 - 'japanese name' field in the database, a string.
-     All other returned values are numbers:
- 3 - Level.
- 4 - Maximum HP.
- 5 - Maximum SP.
- 6 - Experience reward.
- 7 - Job experience reward.
-
----------------------------------------
-
 *mobcount("<map name>","<event label>")
 
 This function will count all the monsters on the specified map that have a given
@@ -11187,6 +11212,7 @@ client (and server) supports the Item Random Options feature (PACKETVER >= 20150
 ---------------------------------------
 
 *mesitemlink(<item_id>{,<use_brackets>{,<display_name>});
+*mesitemlink(<"item_name">{,<use_brackets>{,<display_name>});
 
 Generates an itemlink string for an item and can be used with NPC's mes command.
 The NPC message will show the item's name which will be clickable and opens the
@@ -11198,10 +11224,26 @@ but in some cases it might be necessary to overwrite the <display_name> with som
 Examples:
 
 	mes mesitemlink( 1201 ); // Will display "[Knife]" and will be clickable. If clicked it opens the description for Knife [3]
+	mes mesitemlink( "Knife" ); // Will display "[Knife]" and will be clickable. If clicked it opens the description for Knife [3]
 	mes "Bring me a " + mesitemlink( 1201 ) + "."; // Will display "Bring me a [Knife]." and "[Knife]" will be clickable.
 	mes "Bring me a " + mesitemlink( 1201, false ) + "."; // Will display "Bring me a Knife." and "Knife" will be clickable.
 	mes "Bring me a " + mesitemlink( 1201, true, "Super cutting knife" ) + "."; // Will display "Bring me a [Super cutting knife]." and "[Super cutting knife]" will be clickable.
 
+---------------------------------------
+
+*mesitemicon(<item_id>{,<display_name>});
+
+Generates an itemicon string for an item and can be used with NPC's mes command.
+The NPC message will show the item's icon which will be clickable and opens the
+item description client side.
+
+If the feature is disabled, by default the database name of the item will be used.
+However if you provide a <display_name>, this name will be displayed instead.
+
+Examples:
+
+	mes mesitemicon( 1201 ); // Will display a Knife icon and will be clickable. If clicked it opens the description for Knife [3]
+
 ========================
 |14.- Channel commands.|
 ========================

+ 3 - 0
doc/yaml/db/job_basepoints.yml

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 3 - 0
doc/yaml/db/job_exp.yml

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 3 - 0
doc/yaml/db/job_stats.yml

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   HpFactor                 Exponential HP increase. Per base level: [HpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   HpIncrease               Linear HP increase. Per base level: [HpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 500)
+#   SpFactor                 Exponential SP increase. Per base level: [SpFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   SpIncrease               Linear SP increase. Per base level: [SpIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 100)
+#   ApFactor                 Exponential AP increase. Per base level: [ApFactor * BaseLv / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
+#   ApIncrease               Linear AP increase. Per base level: [ApIncrease / 100]. Used when macro HP_SP_TABLES is disabled. (Default: 0)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.

+ 2 - 2
doc/yaml/db/skill_db.yml

@@ -41,7 +41,7 @@
 #   NoNearNPC:                Determines if the skill can be used near a NPC. (Optional)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
-#   CastCancel                Cancel cast when hit. (Default: false)
+#   CastCancel                Cancel cast when hit. (Default: true)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
@@ -98,7 +98,7 @@
 #         Amount              Ammo amount required at specific skill level.
 #     State                   Special state required to cast. (Default: None)
 #     Status:                 Status change required to cast. (Default: nullptr)
-#     SphereCost:             Spirit sphere required to cast. (Default: 0)
+#     SpiritSphereCost:       Spirit sphere required to cast. (Default: 0)
 #       - Level               Skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #     ItemCost:               Item required to cast. (Default: 0)

+ 6 - 0
doc/yaml/sql/mob_db.sql

@@ -63,6 +63,12 @@ CREATE TABLE `mob_db` (
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_frozen` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 6 - 0
doc/yaml/sql/mob_db2.sql

@@ -63,6 +63,12 @@ CREATE TABLE `mob_db2` (
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_frozen` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 6 - 0
doc/yaml/sql/mob_db2_re.sql

@@ -65,6 +65,12 @@ CREATE TABLE `mob_db2_re` (
   `racegroup_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_frozen` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 2 - 0
doc/yaml/sql/mob_db_re.sql

@@ -69,6 +69,8 @@ CREATE TABLE `mob_db_re` (
   `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 26 - 6
npc/cities/umbala.txt

@@ -379,9 +379,19 @@ umbala,59,243,5	script	Utan Kid#1	787,{
 				mes "Meat? Thanks! I will pay you";
 				mes "back with these.";
 				delitem 517,1;// Meat
-				getitem 909,2;// Jellopy
-				getitem 914,2;// Fluff
-				getitem 705,2;// Clover
+				if ( checkre(0) ) {
+					//Clover 50%, Fluff 25%, Jellopy 25%
+					switch (rand(1,4)) {
+						case 1: getitem 909,3; break; // Jellopy
+						case 2: getitem 914,3; break; // Fluff
+						case 3: getitem 705,3; break; // Clover
+						case 4: getitem 705,3; break; // Clover
+					}
+				} else {
+					getitem 909,2; // Jellopy
+					getitem 914,2; // Fluff
+					getitem 705,2; // Clover
+				}
 				emotion ET_SCISSOR;
 				close;
 			}
@@ -416,9 +426,19 @@ umbala,59,243,5	script	Utan Kid#1	787,{
 				mes "Umbaumbaumbabababah.";
 				mes "Umbababahum.";
 				delitem 517,1;// Meat
-				getitem 909,2;// Jellopy
-				getitem 914,2;// Fluff
-				getitem 705,2;// Clover
+				if ( checkre(0) ) {
+					switch (rand(1,4)) {
+						//Clover 50%, Fluff 25%, Jellopy 25%
+						case 1: getitem 909,3; break; // Jellopy
+						case 2: getitem 914,3; break; // Fluff
+						case 3: getitem 705,3; break; // Clover
+						case 4: getitem 705,3; break; // Clover
+					}
+				} else {
+					getitem 909,2; // Jellopy
+					getitem 914,2; // Fluff
+					getitem 705,2; // Clover
+				}
 				emotion ET_SCISSOR;
 				close;
 			}

+ 2 - 2
npc/custom/events/disguise.txt

@@ -208,12 +208,12 @@ iDisguise:
 		if (compare(","+.BlackList$+"," , ","+.Monster+",")) goto iDisguise;
 		if (.Monster==.LastMonster) goto iDisguise;
 		set .LastMonster,.Monster;
-		set $MonsterName$,getmonsterinfo(.Monster,0);
+		set $MonsterName$,getmonsterinfo(.Monster, MOB_NAME);
 	}
 	if (.Rule==2) {
 		set .Winner,0;
 		set .Monster,rand(49);
-		set $MonsterName$,getmonsterinfo(.MVP[.Monster],0);
+		set $MonsterName$,getmonsterinfo(.MVP[.Monster], MOB_NAME);
 	}
 	deletepset 1;
 	defpattern 1,"([^:]+):.\\s*"+$MonsterName$+".*", "iCorrect";

+ 8 - 8
npc/custom/quests/hunting_missions.txt

@@ -164,10 +164,10 @@ Mission_Status:
 	deletearray .@j[0], getarraysize(.@j);
 	for (.@i = 0; .@i < .Quests; .@i++) {
 		.@j[.@i] = getd("Mission" + .@i);
-		.@j[.Quests] = .@j[.Quests] + strmobinfo(3,.@j[.@i]);
-		.@j[.Quests+1] = .@j[.Quests+1] + (strmobinfo(6,.@j[.@i]) / (getbattleflag("base_exp_rate") / 100) * .Modifier[0]);
-		.@j[.Quests+2] = .@j[.Quests+2] + (strmobinfo(7,.@j[.@i]) / (getbattleflag("job_exp_rate") / 100) * .Modifier[1]);
-		mes " > "+Chk(getd("Mission"+.@i+"_"),#Mission_Count) + strmobinfo(1,.@j[.@i]) + " (" + getd("Mission"+.@i+"_") + "/" + #Mission_Count + ")^000000";
+		.@j[.Quests] = .@j[.Quests] + getmonsterinfo(.@j[.@i], MOB_LV);
+		.@j[.Quests+1] = .@j[.Quests+1] + (getmonsterinfo(.@j[.@i], MOB_BASEEXP) / (getbattleflag("base_exp_rate") / 100) * .Modifier[0]);
+		.@j[.Quests+2] = .@j[.Quests+2] + (getmonsterinfo(.@j[.@i], MOB_JOBEXP) / (getbattleflag("job_exp_rate") / 100) * .Modifier[1]);
+		mes " > "+Chk(getd("Mission"+.@i+"_"),#Mission_Count) + getmonsterinfo(.@j[.@i], MOB_NAME) + " (" + getd("Mission"+.@i+"_") + "/" + #Mission_Count + ")^000000";
 	}
 
 	// Reward formulas:
@@ -268,10 +268,10 @@ OnNPCKillEvent:
 	if (!getcharid(1) || !.Party) {
 		if (!#Mission_Count || !Mission0) end;
 		for (.@i = 0; .@i < .Quests; .@i++) {
-			if (strmobinfo(1,killedrid) == strmobinfo(1,getd("Mission" + .@i))) {
+			if (getmonsterinfo(killedrid, MOB_NAME) == getmonsterinfo(getd("Mission" + .@i), MOB_NAME)) {
 				if (getd("Mission" + .@i + "_") < #Mission_Count) {
 					dispbottom "[Hunting Mission] Killed " + (set(getd("Mission" + .@i + "_"),getd("Mission" + .@i + "_") + 1)) +
-					           " of " + #Mission_Count + " " + strmobinfo(1,killedrid) + ".";
+					           " of " + #Mission_Count + " " + getmonsterinfo(killedrid, MOB_NAME) + ".";
 					end;
 				}
 			}
@@ -293,10 +293,10 @@ OnNPCKillEvent:
 						for (.@j = 0; .@j < .Quests; .@j++) {
 							.@my_mob_id = getvar( getd("Mission"+.@j),$@partymembercid[.@i] );
 							.@my_count = getvar( getd("Mission"+.@j+"_"), $@partymembercid[.@i] );
-							if (strmobinfo(1,.@mob) == strmobinfo(1,.@my_mob_id)) {
+							if (getmonsterinfo(.@mob, MOB_NAME) == getmonsterinfo(.@my_mob_id, MOB_NAME)) {
 								if (.@my_count < .@Mission_Count) {
 									setd "Mission"+.@j+"_", (.@my_count+1), $@partymembercid[.@i];
-									dispbottom "[Hunting Mission] Killed " + (.@my_count+1) + " of " + .@Mission_Count + " " + strmobinfo(1,.@mob) + ".", 0x777777, $@partymembercid[.@i];
+									dispbottom "[Hunting Mission] Killed " + (.@my_count+1) + " of " + .@Mission_Count + " " + getmonsterinfo(.@mob, MOB_NAME) + ".", 0x777777, $@partymembercid[.@i];
 									break;
 								}
 							}

+ 1 - 1
npc/custom/quests/kahohorn.txt

@@ -32,7 +32,7 @@ geffen,115,107,5	script	Lord Kaho's Servant	61,{
 	next;
 	mes .@n$;
 	for(set .@i,0; .@i<10; set .@i,.@i+1)
-		mes "1x ^0055FF"+getitemname(.@Items[.@i])+"^000000 (from "+strmobinfo(1,.@Drops[.@i])+")";
+		mes "1x ^0055FF"+getitemname(.@Items[.@i])+"^000000 (from "+getmonsterinfo(.@Drops[.@i], MOB_NAME)+")";
 	next;
 	mes .@n$;
 	mes "We're not done yet, sweetie...";

+ 4 - 4
npc/custom/quests/questboard.txt

@@ -52,7 +52,7 @@ prontera,129,215,5	script	Questboard	4_BOARD3,{
 		set .@size, getarraysize(getd("."+ currentquest$ + "_huntingmob"));
 		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]");
-			mes "^FF0000"+strmobinfo(1,getd("."+currentquest$+"_huntingmob["+.@j+"]"))+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
+			mes "^FF0000"+getmonsterinfo(getd("."+currentquest$+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
 		}
 		mes "--------------------------------";
 		mes "[Reward]";
@@ -163,7 +163,7 @@ prontera,129,215,5	script	Questboard	4_BOARD3,{
 		mes "--------------------------------";
 		set .@size, getarraysize(getd("."+ .@selection + "_huntingmob"));
 		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
-			mes "^FF0000"+strmobinfo(1,getd("."+.@selection+"_huntingmob["+.@j+"]"))+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
+			mes "^FF0000"+getmonsterinfo(getd("."+.@selection+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
 		}
 		mes "--------------------------------";
 		mes "[Reward]";
@@ -264,7 +264,7 @@ OnNPCKillEvent:
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
 			if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){
 				setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1);
-				dispbottom getd("."+currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")";
+				dispbottom getd("."+currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")";
 			}
 			if(getcharid(1) != 0 && .party_support == true){
 				getmapxy(.@map1$,.@x1,.@y1);
@@ -282,7 +282,7 @@ OnNPCKillEvent:
 								if(.@kill_amt<.@kill_goal)
 								{
 									setd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", .@kill_amt+1, $@partymembercid[.@j]);
-									dispbottom getd("."+.@currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+(.@kill_amt+1)+"/"+.@kill_goal+")", 0xB6FF00, $@partymembercid[.@j];
+									dispbottom getd("."+.@currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+(.@kill_amt+1)+"/"+.@kill_goal+")", 0xB6FF00, $@partymembercid[.@j];
 								}
 							}
 						}

+ 2 - 2
npc/guild/agit_main.txt

@@ -811,7 +811,7 @@ OnRecvCastle:
 			if (.@guardiantype[.@UseGID] == 1) { set .@type,1287; }
 			else if (.@guardiantype[.@UseGID] == 2) { set .@type,1285; }
 			else { set .@type,1286; }
-			guardian strnpcinfo(2),.@guardianposx[.@UseGID],.@guardianposy[.@UseGID],strmobinfo(2,.@type),.@type,"Guardian#"+strnpcinfo(2)+"::OnGuardianDied",.@UseGID;
+			guardian strnpcinfo(2),.@guardianposx[.@UseGID],.@guardianposy[.@UseGID],getmonsterinfo(.@type, MOB_NAME),.@type,"Guardian#"+strnpcinfo(2)+"::OnGuardianDied",.@UseGID;
 			mes "["+strnpcinfo(1)+"]";
 			mes "We completed the summoning of the Guardian. Our defenses are now increased with it in place.";
 			close;
@@ -1115,7 +1115,7 @@ OnSpawnGuardians:
 		else if (.@guardiantype[.@i] == 2) { set .@type,1285; }
 		else { set .@type,1286; }
 		if (GetCastleData(strnpcinfo(2),.@UseGID)) {
-			guardian strnpcinfo(2),.@guardianposx[.@i],.@guardianposy[.@i],strmobinfo(2,.@type),.@type,"Guardian#"+strnpcinfo(2)+"::OnGuardianDied",.@i;
+			guardian strnpcinfo(2),.@guardianposx[.@i],.@guardianposy[.@i],getmonsterinfo(.@type, MOB_NAME),.@type,"Guardian#"+strnpcinfo(2)+"::OnGuardianDied",.@i;
 		}
 	}
 	end;

+ 1 - 1
npc/other/arena/arena_room.txt

@@ -686,7 +686,7 @@ prt_are_in,98,14,3	script	Givu#arena	728,{
 			else if ($@arena_picture_id == 7777)
 				mes "Would you like to take a picture with a Valkyrie?";
 			else
-				mes "Would you like to take a picture with a "+getmonsterinfo($@arena_picture_id,0)+"?";
+				mes "Would you like to take a picture with a "+getmonsterinfo($@arena_picture_id, MOB_NAME)+"?";
 			next;
 			switch(select("Yes:No")) {
 			case 1:

+ 1 - 1
npc/other/mercenary_rent.txt

@@ -224,7 +224,7 @@ pay_arche,99,167,4	duplicate(Mercenary Manager#main)	Mercenary Manager#Bow	4_M_J
 	mes "you're looking for?";
 	next;
 	setarray .@item, 12184,	12185,	12241,	12242,	12243;
-	setarray .@cost, 1750,	3000,	560,	1050,	2100;
+	setarray .@cost, 2500,	5000,	800,	1500,	3000;
 	for (.@size = getarraysize(.@item); .@i < .@size; .@i++)
 		.@menu$ = .@menu$ + getitemname(.@item[.@i]) + ":";
 	.@m = select(.@menu$)-1;

+ 2 - 2
npc/pre-re/mobs/dungeons/lhz_dun.txt

@@ -281,7 +281,7 @@ OnSummon:
 	case 6: set .@x,175;	set .@y,137;	break;
 	}
 	set .@mob,rand(1646,1651);
-	monster "lhz_dun03",.@x,.@y,strmobinfo(1,.@mob),.@mob,1,"summon_boss_lt::OnLhzMvPDead";
+	monster "lhz_dun03",.@x,.@y,getmonsterinfo(.@mob, MOB_NAME),.@mob,1,"summon_boss_lt::OnLhzMvPDead";
 
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,6)) {
@@ -293,7 +293,7 @@ OnSummon:
 	case 6: set .@x2,139;	set .@y2,259;	break;
 	}
 	set .@mob2,rand(1640,1645);
-	monster "lhz_dun03",.@x2,.@y2,strmobinfo(1,.@mob2),.@mob2,1,"summon_boss_lt::OnMy99Dead";
+	monster "lhz_dun03",.@x2,.@y2,getmonsterinfo(.@mob2, MOB_NAME),.@mob2,1,"summon_boss_lt::OnMy99Dead";
 	end;
 
 OnLhzMvPDead:

+ 540 - 0
npc/re/instances/DeepForest.txt

@@ -0,0 +1,540 @@
+//===== rAthena Script =======================================
+//= Instance: Deep Forest.
+//===== Description: =========================================
+//- [Walkthrough conversion]
+//- Part of the Spirit Handler job change.
+//- Total : 6 steps.
+//===== Changelogs: ==========================================
+//= 1.0 First version. [Atemo]
+//============================================================
+
+// Entrance
+1@exsh,90,25,0	script	#outexsh	WARPNPC,4,4,{
+	end;
+OnTouch:
+	if (select( "Leave Deep Forest.", "Stay." ) == 1) {
+		warp "pay_fild09",114,343;
+		end;
+	}
+	end;
+
+OnInstanceInit:
+	'step = 0;
+	'map_1exsh$ = instance_mapname("1@exsh");
+	end;
+}
+
+1@exsh,90,53,0	script	#shbr1	WARPNPC,4,4,{
+	mes "- Something mysterious seems to be blocking the way. Let's talk to Chulho first. -";
+	close2;
+	warp 'map_1exsh$,90,38;
+	end;
+}
+
+// Unknown effect
+// 1@exsh,90,53,0	script	#shbr2	WARPNPC,4,4
+
+
+// Step 1
+1@exsh,92,38,3	script	Chulho#sh1	4_EXJOB_CHUL_HO,{
+	if ('step == 0) {
+		setpcblock( PCBLOCK_NPC, true );
+		npctalk "Chulho : You followed me right away!";
+		cutin "ex_sh_chulho01.png",2;
+		sleep2 2000;
+		npctalk "Chulho : It seems that Hyunrok is very angry, given that there is an air of ferocity.";
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		cloakoffnpc( instance_npcname("???#sh1_s") );
+		// npctalk "??? : Who is it!!! It smells fishy!!!";	// bug?
+		npctalk "??? : Who is it!!! It smells fishy!!!", instance_npcname("???#sh1_s");
+		cutin "",255;
+		sleep2 2000;
+		npctalk "Chulho : It's me!! It's me!! It's Chulho!!!";
+		cutin "ex_sh_chulho01.png",2;
+		sleep2 2000;
+		// npctalk "??? : I've never smelled anything like that!!!";
+		npctalk "??? : I've never smelled anything like that!!!", instance_npcname("???#sh1_s");
+		cutin "",255;
+		sleep2 2000;
+		// npctalk "??? : Get out of this forest right now!!";
+		npctalk "??? : Get out of this forest right now!!", instance_npcname("???#sh1_s");
+		sleep2 1000;
+		npctalk "Chulho : Argh!! Why are you hitting me all of a sudden!!!";
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		npctalk "Chulho : Argh!! I can't do this!!!";
+		sleep2 1000;
+		npctalk "Chulho : Let's calm this guy down and go into the woods!!!";
+		cutin "",255;
+		cloakonnpc( instance_npcname("???#sh1_s") );
+		setpcblock( PCBLOCK_NPC, false );
+		disablenpc();
+		if ('step == 0)
+			donpcevent instance_npcname("doram_job_change_mob_1") + "::OnStart";
+		end;
+	}
+}
+
+1@exsh,93,39,3	duplicate(dummy_cloaked_npc)	???#sh1_s	G_RAKE_SCARABA
+
+
+// Step 2
+1@exsh,93,39,3	script	doram_job_change_mob_1	-1,{
+	end;
+OnStart:
+	'step = 1;
+	monster 'map_1exsh$,93,39,"???","G_RAKE_SCARABA",1, instance_npcname("doram_job_change_mob_1") + "::OnMobDead";
+	.@mode = ( MD_CANMOVE | MD_AGGRESSIVE | MD_CANATTACK | MD_TELEPORTBLOCK | MD_DETECTOR );
+	setunitdata( $@mobid[0], UMOB_MODE, .@mode );
+	end;
+OnMobDead:
+	if ('step != 1 || mobcount( 'map_1exsh$, instance_npcname("doram_job_change_mob_1") + "::OnMobDead" ) != 0)
+		end;
+	'step = 2;
+	cloakoffnpc( instance_npcname("Chulho#sh1_1") );
+	setpcblock( PCBLOCK_NPC, true );
+	sleep2 2000;
+	npctalk "Chulho : What's happening!", instance_npcname("Chulho#sh1_1");
+	cutin "ex_sh_chulho02.png",2;
+	sleep2 2000;
+	npctalk "Chulho : I'll have to look for Hyunrok.", instance_npcname("Chulho#sh1_1");
+	sleep2 2000;
+	npctalk "Chulho : This is the front door, so let's hurry up and go in.", instance_npcname("Chulho#sh1_1");
+	sleep2 2000;
+	cutin "",255;
+	cloakonnpc( instance_npcname("Chulho#sh1_1") );
+	setpcblock( PCBLOCK_NPC, false );
+	disablenpc instance_npcname("#shbr1");
+	// disablenpc instance_npcname("#shbr2");
+	if ('step == 2)
+		'step = 3;
+	end;
+}
+
+1@exsh,92,38,3	duplicate(dummy_cloaked_npc)	Chulho#sh1_1	4_EXJOB_CHUL_HO
+
+
+// Step 3
+1@exsh,86,83,5	script	Guard#md1	4_M_PAY_SOLDIER,3,3,{
+	if ('step == 3) {
+		mes "[Guard]";
+		mes "You can't pass through here.";
+		mes "Go back.";
+		next;
+		select( "Ask them to let you in." );
+		mes "[Guard]";
+		mes "Hyunrok told me not to bring in suspicious people!!";
+		close2;
+		setpcblock( PCBLOCK_NPC, true );
+		.@npc_a$ = instance_npcname("Chulho#sh_c1");
+		.@npc_b$ = instance_npcname("Kisul#sh_k1");
+		cloakoffnpc( .@npc_a$ );
+		cloakoffnpc( .@npc_b$ );
+		npctalk "Kisul : Oh my~", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		sleep2 2000;
+		npctalk "Kisul : He's got a lot of horns!", .@npc_b$;
+		cutin "ex_sh_kisul02.png",2;
+		sleep2 2000;
+		npctalk "Kisul : It's because I'm still young, so please understand~", .@npc_b$;
+		sleep2 2000;
+		npctalk "Kisul : Hahahahaha!", .@npc_b$;
+		sleep2 2000;
+		npctalk "Chulho : But why are you attacking me!", .@npc_a$;
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		npctalk "Kisul : Didn't I tell you not to eat anything?", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		sleep2 2000;
+		npctalk "Kisul : You won't change like other wild animals after taking that medicine.", .@npc_b$;
+		cutin "ex_sh_kisul02.png",2;
+		sleep2 2000;
+		npctalk "Kisul : The smell doesn't disappear, so it's natural to be considered suspicious!", .@npc_b$;
+		cutin "ex_sh_kisul03.png",2;
+		sleep2 2000;
+		npctalk "Chulho : Don't just say that and help me!", .@npc_a$;
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		npctalk "Kisul : It won't be difficult, so try your best.", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		sleep2 2000;
+		npctalk "Kisul : It's been a long time since I've seen something interesting~", .@npc_b$;
+		cutin "ex_sh_kisul02.png",2;
+		sleep2 2000;
+		npctalk "Chulho : Aaaah!!!", .@npc_a$;
+		cutin "",255;
+		cloakonnpc( .@npc_a$ );
+		cloakonnpc( .@npc_b$ );
+		mapannounce 'map_1exsh$, "Guard : I told you to go back!!!", bc_map, 0xB7EE,FW_NORMAL,16;
+		sleep2 1000;
+		disablenpc instance_npcname("Guard#md1");
+		disablenpc instance_npcname("Guard#md2");
+		sleep2 2000;
+		setpcblock( PCBLOCK_NPC, false );
+		mapannounce 'map_1exsh$, "Guard : You'll have to deal with us if you don't want go back!!!!", bc_map, 0xB7EE,FW_NORMAL,16;
+		if ('step == 3)
+			donpcevent instance_npcname("doram_job_change_mob_2") + "::OnStart";
+		end;
+	}
+	end;
+
+OnTouch:
+	mes "[Guard]";
+	mes "You can't pass through here.";
+	mes "Go back.";
+	close2;
+	warp 'map_1exsh$,90,75;
+	end;
+}
+1@exsh,93,83,3	duplicate(Guard#md1)	Guard#md2	4_M_PAY_SOLDIER,3,3
+
+
+// Step 4
+1@exsh,93,39,3	script	doram_job_change_mob_2	-1,{
+	end;
+OnStart:
+	'step = 4;
+	.@event$ = instance_npcname("doram_job_change_mob_2") + "::OnMobDead";
+	.@mode = ( MD_CANMOVE | MD_AGGRESSIVE | MD_CANATTACK | MD_TELEPORTBLOCK | MD_DETECTOR );
+
+	monster 'map_1exsh$,87,77,"Deep Forest Guardian","G_RAKE_SCARABA",1, .@event$;
+	setunitdata( $@mobid[0], UMOB_MODE, .@mode );
+	monster 'map_1exsh$,87,75,"Deep Forest Guardian","G_RAKE_SCARABA",1, .@event$;
+	setunitdata( $@mobid[0], UMOB_MODE, .@mode );
+	monster 'map_1exsh$,92,77,"Deep Forest Guardian","G_RAKE_SCARABA",1, .@event$;
+	setunitdata( $@mobid[0], UMOB_MODE, .@mode );
+	monster 'map_1exsh$,92,75,"Deep Forest Guardian","G_RAKE_SCARABA",1, .@event$;
+	setunitdata( $@mobid[0], UMOB_MODE, .@mode );
+	end;
+OnMobDead:
+	if ('step != 4 || mobcount( 'map_1exsh$, instance_npcname("doram_job_change_mob_2") + "::OnMobDead" ) != 0)
+		end;
+	.@npc_a$ = instance_npcname("Kisul#sh_k1");
+	.@npc_b$ = instance_npcname("Chulho#sh_c1");
+
+	'step = 5;
+	setpcblock( PCBLOCK_NPC, true );
+	cloakoffnpc( .@npc_a$ );
+	cloakoffnpc( .@npc_b$ );
+	npctalk "Chulho : Oh my!", .@npc_b$;
+	cutin "ex_sh_chulho02.png",2;
+	sleep2 2000;
+	npctalk "Chulho : I thought I was going to die...", .@npc_b$;
+	emotion ET_CRY;
+	sleep2 2000;
+	npctalk "Kisul : It's hard to you fluster like that...", .@npc_a$;
+	cutin "ex_sh_kisul01.png",2;
+	sleep2 2000;
+	npctalk "Chulho : You've only been watching!!!", .@npc_b$;
+	cutin "ex_sh_chulho02.png",2;
+	sleep2 2000;
+	npctalk "Kisul : Hmm...", .@npc_a$;
+	cutin "ex_sh_kisul01.png",2;
+	sleep2 2000;
+	npctalk "Kisul : Let's see...", .@npc_a$;
+	sleep2 2000;
+	npctalk "Chulho : Don't just ignore what I said!", .@npc_b$;
+	cutin "ex_sh_chulho02.png",2;
+	sleep2 2000;
+	npctalk "Kisul : It's beginning to smell ominous, so you'd better hurry up and look for Hyunrok.", .@npc_a$;
+	cutin "ex_sh_kisul02.png",2;
+	sleep2 2000;
+	npctalk "Kisul : If it's Hyunrok, he's always there.", .@npc_a$;
+	sleep2 2000;
+	npctalk "Chulho : Then he's near the north main building!", .@npc_b$;
+	cutin "ex_sh_chulho01.png",2;
+	sleep2 2000;
+	npctalk "Kisul : Don't stand like that and move.", .@npc_a$;
+	cutin "ex_sh_kisul02.png",2;
+	sleep2 1000;
+	cloakonnpc( .@npc_b$ );
+	cloakonnpc( .@npc_a$ );
+	cloakoffnpc( instance_npcname("Hyunrok#sh1") );
+	cutin "",255;
+	setpcblock( PCBLOCK_NPC, false );
+	if ('step == 5)
+		'step = 6;
+	end;
+}
+
+1@exsh,91,79,3	duplicate(dummy_cloaked_npc)	Chulho#sh_c1	4_EXJOB_CHUL_HO
+1@exsh,87,80,5	duplicate(dummy_cloaked_npc)	Kisul#sh_k1	4_EXJOB_KI_SUL
+
+
+// Step 5
+1@exsh,87,146,5	duplicate(dummy_cloaked_npc)	Chulho#sh_c2	4_EXJOB_CHUL_HO
+1@exsh,92,146,3	duplicate(dummy_cloaked_npc)	Kisul#sh_k2	4_EXJOB_KI_SUL
+1@exsh,93,139,1	duplicate(dummy_cloaked_npc)	??????#sh_y2	G_THA_ODIUM
+1@exsh,92,140,1	duplicate(dummy_cloaked_npc)	Kwang Saeng#sh_t2	4_M_DARKPRIEST
+1@exsh,93,139,1	duplicate(dummy_cloaked_npc)	Admiral Lee Daegam#sh_y2	2_M_PHARMACIST
+
+1@exsh,90,148,3	script(CLOAKED)	Hyunrok#sh1	4_EXJOB_HYUN_ROK,{
+	if ('step == 6) {
+		setpcblock( PCBLOCK_NPC, true );
+		.@npc_a$ = instance_npcname("Chulho#sh_c2");
+		.@npc_b$ = instance_npcname("Kisul#sh_k2");
+		.@npc_c$ = instance_npcname("??????#sh_y2");
+		.@npc_d$ = instance_npcname("Kwang Saeng#sh_t2");
+		.@npc_e$ = instance_npcname("Admiral Lee Daegam#sh_y2");
+
+		npctalk "Hyunrok : Chulho, Kisul. You're back.";
+		cutin "ex_sh_hyunrok01.png",2;
+		cloakoffnpc( .@npc_a$ );
+		cloakoffnpc( .@npc_b$ );
+		sleep2 2000;
+		npctalk "Chulho : That's where you were!", .@npc_a$;
+		emotion ET_BLABLA, getnpcid(0,.@npc_a$);
+		cutin "ex_sh_chulho01.png",2;
+		sleep2 2000;
+		npctalk "Chulho : I've been looking for you for a long time!", .@npc_a$;
+		sleep2 2000;
+		npctalk "Hyunrok : I was out only for a moment I think.";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		npctalk "Hyunrok : But the person next to you is...?";
+		sleep2 2000;
+		npctalk "Hyunrok : How did you get into this place?";
+		sleep2 2000;
+		npctalk "Chulho : What are you talking about!", .@npc_a$;
+		emotion ET_SMILE, getnpcid(0,.@npc_a$);
+		cutin "ex_sh_chulho01.png",2;
+		sleep2 2000;
+		npctalk "Chulho : This man is a tiger like me!", .@npc_a$;
+		cutin "ex_sh_chulho03.png",2;
+		emotion ET_HUK, playerattached();
+		sleep2 2000;
+		npctalk "Hyunrok : What are you talking about?";
+		emotion ET_PROFUSELY_SWEAT;
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		npctalk "Hyunrok : He's not a part of the forest like us, he's a forester, he's a forester.";
+		sleep2 2000;
+		npctalk "Kisul : Hahahahaha!!!", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		emotion ET_SMILE, getnpcid(0,.@npc_b$);
+		sleep2 2000;
+		npctalk "Kisul : I thought it was weird, but you didn't know?!", .@npc_b$;
+		cutin "ex_sh_kisul02.png",2;
+		sleep2 2000;
+		npctalk "Chulho : What?!", .@npc_a$;
+		cutin "ex_sh_chulho02.png",2;
+		emotion ET_HUK, getnpcid(0,.@npc_a$);
+		sleep2 2000;
+		npctalk "Chulho : He smells just like me!!!", .@npc_a$;
+		sleep2 2000;
+		npctalk "Hyunrok : Even though there are some similarities with you Chulho...";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		npctalk "Chulho : Aaaah!!!", .@npc_a$;
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		npctalk "Hyunrok : Anyway, I think anyone who lives outside the forest should go back to the outside.";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		npctalk "Hyunrok : The people who have disturbed the forest are approaching again.";
+		sleep2 2000;
+		npctalk "Hyunrok : We can't just sit back.";
+		sleep2 2000;
+		npctalk "Kisul : Ah~", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		sleep2 2000;
+		npctalk "Kisul : Are you trying to do something annoying again?", .@npc_b$;
+		emotion ET_SLEEPY, getnpcid(0,.@npc_b$);
+		sleep2 1000;
+		cutin "",255;
+		cloakoffnpc( .@npc_e$ );
+		sleep2 2000;
+		npctalk "Admiral Lee Daegam : Where are we?", .@npc_e$;
+		emotion ET_STARE_ABOUT, getnpcid(0,.@npc_e$);
+		sleep2 2000;
+		npctalk "Admiral Lee Daegam : Kwang Saeng, I think you've gone too deep, so why don't you leave this to your servants?", .@npc_e$;
+		emotion ET_SCRATCH, getnpcid(0,.@npc_e$);
+		sleep2 3000;
+		npctalk "Admiral Lee Daegam : What the hell is this!", .@npc_e$;
+		emotion ET_HUK, getnpcid(0,.@npc_e$);
+		sleep2 2000;
+		npctalk "Admiral Lee Daegam : Why are the beasts dressed?", .@npc_e$;
+		sleep2 2000;
+		npctalk "Hyunrok : How rude can you be!!!";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		cutin "",255;
+		npctalk "Admiral Lee Daegam : Oops!", .@npc_e$;
+		emotion ET_HUK, getnpcid(0,.@npc_e$);
+		sleep2 2000;
+		npctalk "Admiral Lee Daegam : A man with horns!!!", .@npc_e$;
+		sleep2 1000;
+		cloakoffnpc( .@npc_d$ );
+		sleep2 2000;
+		npctalk "Kwang Saeng : Oh!!!!", .@npc_d$;
+		emotion ET_COOL, getnpcid(0,.@npc_d$);
+		sleep2 2000;
+		npctalk "Kwang Saeng : I finally found it!!!", .@npc_d$;
+		sleep2 2000;
+		npctalk "Kwang Saeng : The mysterious beasts of the Deep Forest that no man can enter!!!!", .@npc_d$;
+		sleep2 2000;
+		npctalk "Kwang Saeng : A legendary animal in front of my eyes that can be immortalized by cutting and sweetening those horns!!!!", .@npc_d$;
+		emotion ET_SEXY, getnpcid(0,.@npc_d$);
+		sleep2 2000;
+		npctalk "Hyunrok : Back off!!! How dare you!";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		cutin "",255;
+		npctalk "Kwang Saeng : Eheheheh!!!", .@npc_d$;
+		sleep2 2000;
+		npctalk "Kwang Saeng : You won't be able to stop me with the beasts of the forest!", .@npc_d$;
+		emotion ET_KIK, getnpcid(0,.@npc_d$);
+		sleep2 2000;
+		npctalk "Kwang Saeng : Because all the animals that have taken my medicine have no choice but to listen to my orders.", .@npc_d$;
+		sleep2 2000;
+		npctalk "Admiral Lee Daegam : Aaaah!!!", .@npc_e$;
+		sleep2 350;
+		cloakonnpc( .@npc_e$ );
+		cloakoffnpc( .@npc_c$ );
+		emotion ET_HUK, getnpcid(0,.@npc_a$);
+		emotion ET_HUK, getnpcid(0,.@npc_b$);
+		emotion ET_HUK, playerattached();
+		emotion ET_SURPRISE;
+		sleep2 2000;
+		npctalk "?????? : That's too much!!!", .@npc_c$;
+		emotion ET_FRET, getnpcid(0,.@npc_c$);
+		sleep2 2000;
+		npctalk "Hyunrok : Aaah!!";
+		cutin "ex_sh_hyunrok01.png",2;
+		sleep2 2000;
+		npctalk "Hyunrok : Oh my!!!";
+		sleep2 2000;
+		npctalk "Chulho : Arrgggg!!! It's gross!!!!!", .@npc_a$;
+		emotion ET_PROFUSELY_SWEAT, getnpcid(0,.@npc_a$);
+		cutin "ex_sh_chulho02.png",2;
+		emotion ET_HUK, getnpcid(0,.@npc_a$);
+		sleep2 2000;
+		npctalk "Chulho : Am I going to end up like that!!!", .@npc_a$;
+		sleep2 2000;
+		npctalk "Kisul : Calm down and stay put.", .@npc_b$;
+		cutin "ex_sh_kisul03.png",2;
+		sleep2 2000;
+		npctalk "Kisul : Things are going more interesting than I thought.", .@npc_b$;
+		cutin "ex_sh_kisul01.png",2;
+		emotion ET_KIK, getnpcid(0,.@npc_b$);
+		sleep2 2000;
+		npctalk "Chulho : This is not the time to sit back!", .@npc_a$;
+		cutin "ex_sh_chulho02.png",2;
+		sleep2 2000;
+		npctalk "Chulho : What if I become a monster like that!", .@npc_a$;
+		sleep2 2000;
+		npctalk "Kisul : Well, let's put the monsters to sleep and talk again.", .@npc_b$;
+		cutin "ex_sh_kisul02.png",2;
+		sleep2 2000;
+		cloakonnpc( .@npc_a$ );
+		cloakonnpc( .@npc_b$ );
+		cloakonnpc( .@npc_c$ );
+		cloakonnpc( .@npc_d$ );
+		cutin "",255;
+		setpcblock( PCBLOCK_NPC, false );
+		disablenpc();
+		mapannounce 'map_1exsh$, "?????? : Arrgggg!!!", bc_map, 0xB7EE,FW_NORMAL,16;
+		mapannounce 'map_1exsh$, "?????? : Huhh!!!!", bc_map, 0xB7EE,FW_NORMAL,16;
+		if ('step == 6)
+			donpcevent instance_npcname("doram_job_change_mob_3") + "::OnStart";
+		end;
+	}
+	end;
+}
+
+
+// Step 6
+1@exsh,90,148,3	script(CLOAKED)	Hyunrok#sh2	4_EXJOB_HYUN_ROK,{
+	if ('step >= 8) {	// custom (debug)
+		warp "pay_fild09",113,343;
+		end;
+	}
+	end;
+}
+
+1@exsh,93,39,3	script	doram_job_change_mob_3	-1,{
+	end;
+OnStart:
+	'step = 7;
+	.@event$ = instance_npcname("doram_job_change_mob_3") + "::OnMobDead";
+	monster 'map_1exsh$,92,140,"??????","G_THA_ODIUM",1, .@event$;
+	monster 'map_1exsh$,92,140,"??????","G_THA_ODIUM",1, .@event$;
+	monster 'map_1exsh$,92,140,"??????","G_THA_ODIUM",1, .@event$;
+	end;
+OnMobDead:
+	if ('step != 7 || mobcount( 'map_1exsh$, instance_npcname("doram_job_change_mob_3") + "::OnMobDead" ) != 0)
+		end;
+	'step = 8;
+
+	setpcblock( PCBLOCK_NPC, true );
+	.@npc_a$ = instance_npcname("Chulho#sh_c2");
+	.@npc_b$ = instance_npcname("Kisul#sh_k2");
+	.@npc_c$ = instance_npcname("Kwang Saeng#sh_t2");
+	.@npc_d$ = instance_npcname("Hyunrok#sh2");
+
+	cloakoffnpc( .@npc_a$ );
+	cloakoffnpc( .@npc_b$ );
+	cloakoffnpc( .@npc_c$ );
+	cloakoffnpc( .@npc_d$ );
+	sleep2 2000;
+	npctalk "Kwang Saeng : Arg!!", .@npc_c$;
+	emotion ET_HUK, getnpcid(0,.@npc_c$);
+	sleep2 2000;
+	npctalk "Kwang Saeng : Why!!!", .@npc_c$;
+	sleep2 2000;
+	npctalk "Hyunrok : It was reckless to try to win this forest with that amount of strength.", .@npc_d$;
+	cutin "ex_sh_hyunrok01.png",2;
+	sleep2 2000;
+	npctalk "Hyunrok : You'd better get back to where you belong.", .@npc_d$;
+	sleep2 2000;
+	cutin "",255;
+	npctalk "Kwang Saeng : Arg!!!!!", .@npc_c$;
+	sleep2 500;
+	cloakonnpc( .@npc_c$ );
+	sleep2 1500;
+	npctalk "Hyunrok : Even the slightest trace seems too much for you, but I hope the life of the trace will be an opportunity to reflect on your sins.", .@npc_d$;
+	cutin "ex_sh_hyunrok01.png",2;
+	sleep2 2000;
+	npctalk "Hyunrok : And " + strcharinfo(0) + ", thank you very much for helping us despite my rudeness.", .@npc_d$;
+	sleep2 2000;
+	npctalk "Chulho : Thank you!", .@npc_a$;
+	cutin "ex_sh_chulho01.png",2;
+	sleep2 2000;
+	npctalk "Chulho : Then let's have a party since we scolded the bad guy!", .@npc_a$;
+	sleep2 2000;
+	npctalk "Kisul : It's good to have a feast, but if you stay in the forest for too long, you won't be able to go back.", .@npc_b$;
+	cutin "ex_sh_kisul01.png",2;
+	sleep2 2000;
+	npctalk "Chulho : Then you can keep playing with me!", .@npc_a$;
+	cutin "ex_sh_chulho01.png",2;
+	sleep2 2000;
+	npctalk "Hyunrok : That is not possible.", .@npc_d$;
+	cutin "ex_sh_hyunrok01.png",2;
+	sleep2 2000;
+	npctalk "Hyunrok : Let me send you back now.", .@npc_d$;
+	sleep2 2000;
+	npctalk "Chulho : Ch--", .@npc_a$;
+	cutin "ex_sh_chulho02.png",2;
+	emotion ET_CRY, getnpcid(0,.@npc_a$);
+	sleep2 2000;
+	npctalk "Hyunrok : So go back before you're obsessed with this place.", .@npc_d$;
+	cutin "ex_sh_hyunrok01.png",2;
+	sleep2 2000;
+	npctalk "Hyunrok : I left a small letter in front of the forest when you return, so please take a look before you leave.", .@npc_d$;
+	sleep2 2000;
+	npctalk "Hyunrok : Please...", .@npc_d$;
+	sleep2 2000;
+	npctalk "Hyunrok : Have a safe journey home...", .@npc_d$;
+	if (isbegin_quest(11782) == 1) {
+		erasequest 11782;
+		setquest 11769;
+	}
+	if ('step == 8)
+		'step = 9;
+	sleep2 2000;
+	setpcblock( PCBLOCK_NPC, false );
+	cutin "",255;
+	warp "pay_fild09",113,343;
+	end;
+}

+ 1248 - 0
npc/re/jobs/doram/spirit_handler.txt

@@ -0,0 +1,1248 @@
+//===== rAthena Script =======================================
+//= Job change : Spirit Handler
+//===== Description: =========================================
+//- [Walkthrough conversion]
+//- The translation is not from iRO.
+//- Step 14 takes place in an instance (npc/re/instance/DeepForest.txt)
+//- Total : 15 steps.
+//===== Changelogs: ==========================================
+//= 1.0 First version. [Atemo]
+//============================================================
+
+// Step 1
+payon,165,116,5	script	Request Board#JQ_SH	4_BOARD3,{
+	if (Class == JOB_SPIRIT_HANDLER) {
+		mes "- This request has already been completed. -";
+		close;
+	}
+	if (Class != JOB_SUMMONER) {
+		mes "[Urgent Firewood Request]";
+		mes "A request to capture a wild beast.";
+		mes "^123456Requirement:^000000";
+		mes "Good with animals.";
+		mes "Adventurer of ^dd5555Base LV200/Job LV60^000000 or higher.";
+		mes "Prefer <FONT SIZE = 14>^dd5555<B>Summoner</B>^000000</FONT> class.";
+		emotion ET_HELP;
+		next;
+		mes "- It seems like a difficult request to carry out with my current job. -";
+		close;
+	}
+	if (BaseLevel < 200 || JobLevel < 60) {	// !TODO: unknown dialog
+		mes "[Urgent Firewood Request]";
+		mes "A request to capture a wild beast.";
+		mes "^123456Requirement:^000000";
+		mes "Good with animals.";
+		mes "Adventurer of ^dd5555Base LV200/Job LV60^000000 or higher.";
+		mes "Prefer <FONT SIZE = 14>^dd5555<B>Summoner</B>^000000</FONT> class.";
+		emotion ET_HELP;
+		next;
+		mes "- Your level is too low for this request board. -";
+		close;
+	}
+	switch( isbegin_quest(11770) ) {
+	case 0:
+		mes "[Urgent Firewood Request]";
+		mes "A request to capture a wild beast.";
+		mes "^123456Requirement:^000000";
+		mes "Good with animals.";
+		mes "Adventurer of ^dd5555Base LV200/Job LV60^000000 or higher.";
+		mes "Prefer <FONT SIZE = 14>^dd5555<B>Summoner</B>^000000</FONT> class.";
+		emotion ET_HELP;
+		next;
+		mes "[Urgent Firewood Request]";
+		mes "^123456Special note:^000000";
+		mes "Those who still smell like a carnivore,";
+		mes "such as a wolf or hawk,";
+		mes "cannot complete the quest.";
+		next;
+		mes "[Urgent Firewood Request]";
+		mes "For other details, please contact the <NAVI>[Woodworker]<INFO>payon,252,297,0,101,0</INFO></NAVI> near the firewood factory.";
+		setquest 11770;
+		navigateto("payon",252,297);
+		close;
+	case 1:
+		mes "[Urgent Firewood Request]";
+		mes "For other details, please contact the <NAVI>[Woodworker]<INFO>payon,252,297,0,101,0</INFO></NAVI> near the firewood factory.";
+		navigateto("payon",252,297);
+		close;
+	case 2:
+		mes "- There are no more requests. -";
+		close;
+	}
+	end;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "Class == JOB_SUMMONER && BaseLevel == 200 && JobLevel == 60 && isbegin_quest(11770) == 0" );
+	end;
+}
+
+// Step 2
+payon,252,297,3	script	Woodworker#JQ_SH	2_M_BARD_ORIENT,{
+	if (isbegin_quest(11770) == 0) {
+		mes "[Woodworker]";
+		mes "<FONT SIZE = 14>Welcome~ Customer~!</FONT>";
+		mes "This is a woodworking shop for firewood~";
+		emotion ET_DELIGHT;
+		npctalk "Welcome~ Customer~!", "", bc_self;
+		next;
+		mes "[Woodworker]";
+		mes "Is there anything~ you're looking for~?";
+		close;
+	}
+	if (isbegin_quest(11770) == 1) {
+		mes "[Woodworker]";
+		mes "<FONT SIZE = 14>Welcome~ Customer~!</FONT>";
+		mes "This is a woodworking shop for firewood~";
+		emotion ET_DELIGHT;
+		npctalk "Welcome~ Customer~!", "", bc_self;
+		next;
+		mes "[Woodworker]";
+		mes "Is there anything~ you're looking for~?";
+		next;
+		select( "About the request." );
+		mes "[Woodworker]";
+		mes "Are you talking about a request~ customer~?";
+		mes "Could you wait a moment, please~?";
+		emotion ET_AHA;
+		next;
+		mes "[Woodworker]";
+		mes "The carpentry request...";
+		mes "Hm...";
+		npctalk "Let's see...", "", bc_self;
+		next;
+		mes "[Woodworker]";
+		mes "I'm sorry, but it's confirmed that there's no request from our woodwork.";
+		mes "May I know what kind of request you've received? Customer~";
+		emotion ET_PROFUSELY_SWEAT;
+		next;
+		select( "Request for firewood." );
+		mes "[Woodworker]";
+		mes "Aaah!!!";
+		mes "I'm sorry!";
+		mes "I don't think it's from the woodworking shop, but it's a personal request from the owner~";
+		emotion ET_SURPRISE;
+		next;
+		mes "[Woodworker]";
+		mes "<FONT SIZE = 10>If the boss asked you to do it, you should've told me!</FONT>";
+		mes "May I have a moment, please? Customer?";
+		mes "I'll call the boss...";
+		emotion ET_SORRY;
+		next;
+		mes "[Woodworker]";
+		mes "<FONT SIZE = 14>This gentleman is out and gone again!!</FONT>";
+		mes "<FONT SIZE = 10>Did he go to the forest again!</FONT>";
+		mes "This can't be happening!!!";
+		emotion ET_FRET;
+		npctalk "This guy, seriously!!!!", "", bc_self;
+		next;
+		mes "[Woodworker]";
+		mes "I'm sorry~ Customer.";
+		mes "The boss is out of the office right now.";
+		next;
+		mes "[Woodworker]";
+		mes "I don't know when he'll be back.";
+		mes "If you're in a hurry, why don't you go to ^dd5555Payon Forest^000000?";
+		mes "You go <NAVI>[there]<INFO>pay_fild08,157,129,0,101,0</INFO></NAVI>.";
+		emotion ET_SORRY;
+		completequest 11770;
+		setquest 11771;
+		navigateto("pay_fild08",157,129);
+		close;
+	}
+	if (isbegin_quest(11771) == 1) {
+		mes "[Woodworker]";
+		mes "I'm sorry~ Customer.";
+		mes "The boss is out of the office right now.";
+		next;
+		mes "[Woodworker]";
+		mes "I don't know when he'll be back.";
+		mes "If you're in a hurry, why don't you go to ^dd5555Payon Forest^000000?";
+		mes "You go <NAVI>[there]<INFO>pay_fild08,157,129,0,101,0</INFO></NAVI>.";
+		emotion ET_SORRY;
+		navigateto("pay_fild08",157,129);
+		close;
+	}
+	mes "[Woodworker]";
+	mes "<FONT SIZE = 14>Welcome~ Customer~!</FONT>";
+	mes "This is a woodworking shop for firewood~";
+	emotion ET_DELIGHT;
+	npctalk "Welcome~ Customer~!", "", bc_self;
+	next;
+	mes "[Woodworker]";
+	mes "Do you have any other business?";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11770) == 1" );
+	end;
+}
+
+// Step 3, 10
+pay_fild08,161,129,5	duplicate(dummy_npc)	Wrecked Cart#JQ_SH	4_EP18_WAGON
+pay_fild08,152,129,5	duplicate(dummy_cloaked_npc)	Lee Daegam#JQ_SH_1	2_M_PHARMACIST
+
+pay_fild08,157,129,3	script	Carpenter Firewood#JQ_SH	1_M_SMITH,{
+	if (isbegin_quest(11770) != 2) {
+		mes "[Carpenter Firewood]";
+		mes "Aaaah~~";
+		mes "I'm completely blown away today! I messed up!!!";
+		emotion ET_CRY;
+		npctalk "Aaaah...", "", bc_self;
+		close;
+	}
+	if (isbegin_quest(11771) == 1) {
+		mes "[Carpenter Firewood]";
+		mes "Aaaah~~";
+		mes "I'm completely blown away today! I messed up!!!";
+		emotion ET_CRY;
+		npctalk "Aaaah...", "", bc_self;
+		next;
+		select( "Chief?" );
+		mes "[Carpenter Firewood]";
+		mes "Who?";
+		mes "...";
+		mes "Did Lee Daegam send you?";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "How long has it been since you roasted it? Are you sending someone here again?!";
+		mes "Just pushing doesn't mean it's going to work!";
+		emotion ET_FRET;
+		next;
+		select( "I came for the request." );
+		mes "[Carpenter Firewood]";
+		mes "Huh...";
+		mes "<FONT SIZE = 14>Huh...</FONT>";
+		mes "<FONT SIZE = 18><B>Ah!!!!!!!!!</B></FONT>";
+		emotion ET_SURPRISE;
+		npctalk "Aaah!!!!!!!", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Eheh~~!!";
+		mes "Aaaah!!!";
+		mes "<FONT SIZE = 16>That's right!!!!!</FONT>";
+		emotion ET_HUK;
+		npctalk "That's right!!!!!!!!!", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "<FONT SIZE = 14>Sorry!</FONT>";
+		mes "I came out for a while because I didn't have any progress on my work and I was so frustrated, but I didn't expect a customer to visit me.";
+		mes "What a shame!";
+		mes "Eheheh!";
+		emotion ET_PROFUSELY_SWEAT;
+		npctalk "I thought the request was from Lee Daegam~", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "It's the perfect timing!";
+		mes "Now that you've come all the way here, don't go back to the woodwork, come here and look at what the nasty beasts have done.";
+		npctalk "They've made a mess of all the tools, what can I do!", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "It looks like they're hoofed guys like deer and wild boars, but...";
+		mes "Why are they so fierce when they're grazing in the woods!";
+		npctalk "Don't you guys ever get caught! I'm so angry!!", "", bc_self;
+		erasequest 11771;
+		setquest 11772;
+		close;
+	}
+	if (isbegin_quest(11772) == 1) {
+		mes "[Carpenter Firewood]";
+		mes "It's the perfect timing!";
+		mes "Now that you've come all the way here, don't go back to the woodwork, come here and look at what the nasty beasts have done.";
+		npctalk "They've made a mess of all the tools, what can I do!", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "It looks like they're hoofed guys like deer and wild boars, but...";
+		mes "Why are they so fierce when they're grazing in the woods!";
+		npctalk "Don't you guys ever get caught! I'm so angry!!", "", bc_self;
+		close;
+	}
+	if (isbegin_quest(11773) == 1 || isbegin_quest(11774) == 1 || isbegin_quest(11775) == 1 || isbegin_quest(11776) == 1 || isbegin_quest(11777) == 1) {
+		mes "[Carpenter Firewood]";
+		mes "So, how is your investigation going?";
+		mes "Have you found those wild animals yet?";
+		close;
+	}
+	if (isbegin_quest(11778) == 1) {
+		mes "[Carpenter Firewood]";
+		mes "What have you found, adventurer?";
+		mes "What have you got?";
+		next;
+		select( "About the food that fell on the street." );
+		mes "[Carpenter Firewood]";
+		mes "How could someone throw food on the street? Food is precious, it's such a waste!!";
+		emotion ET_ANGER;
+		npctalk "When I was young, I used to eat tree roots because I didn't have anything to eat!!!", "", bc_self;
+		next;
+		select( "About wild animals." );
+		mes "[Carpenter Firewood]";
+		mes "I'm glad it fed some wild animals, but...";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Then didn't the wild animals come all the way here while picking up the food?";
+		emotion ET_SURPRISE;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Who could have done such a strange thing...";
+		emotion ET_QUESTION;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Anyway, the adventurer took over the job, so I can see some clues!";
+		mes "With this momentum, we'll solve this before Lee Daegam goes crazy again...";
+		next;
+		mes "[???]";
+		mes "<FONT SIZE = 16>Ahem!</FONT>";
+		mes "<FONT SIZE = 14>Do you have a factory~</FONT>";
+		emotion ET_HUK;
+		emotion ET_HUK, playerattached();
+		cloakoffnpcself( "Lee Daegam#JQ_SH_1" );
+		npctalk "What!!! Hem!!!!!!", "Lee Daegam#JQ_SH_1", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Ugh....";
+		mes "Eddga told me he was coming...";
+		npctalk "Eddga is better.", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Lee Daegam, what brings you here?";
+		next;
+		mes "[Lee Daegam]";
+		mes "Oh~~ Eheh~ It's nothing special~";
+		mes "I'm here to see if everything is going well~";
+		npctalk "Oops! What's all this on the floor?", "Lee Daegam#JQ_SH_1", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "It won't work if you come all the time like this...";
+		next;
+		mes "[Lee Daegam]";
+		mes "Oh my~";
+		mes "It doesn't look much different from yesterday.";
+		mes "You didn't even start working on it, but I hear loud noises~";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "<FONT SIZE = 14>Oh... I... I...!!!</FONT>";
+		mes "<FONT SIZE = 14>I can't work because the tools keep breaking down!!!</FONT>";
+		mes "<FONT SIZE = 14>If you're here to tease me, you're just disturbing me, so go back!</FONT>";
+		emotion ET_FRET;
+		next;
+		mes "[Lee Daegam]";
+		mes "Oh my!";
+		mes "You don't have to yell that much. I'm going!";
+		mes "<FONT SIZE = 18>Hmph!</FONT>";
+		npctalk "Hmph!!!", "Lee Daegam#JQ_SH_1", bc_self;
+		emotion ET_HNG, getnpcid(0,"Lee Daegam#JQ_SH_1");
+		next;
+		mes "[Carpenter Firewood]";
+		mes "<FONT SIZE = 14>Oh, that old man!</FONT>";
+		mes "Are you asking me to work or not? You're just increasing my temper again!";
+		cloakonnpcself( "Lee Daegam#JQ_SH_1" );
+		next;
+		mes "[Carpenter Firewood]";
+		mes "He's only disturbing me, let alone helping me with what I've entrusted with you.";
+		mes "<FONT SIZE = 14>Oh my!</FONT>";
+		emotion ET_FRET;
+		npctalk "Salt! I should sprinkle salt!", "", bc_self;
+		next;
+		select( "About Lee Daegam." );
+		mes "[Carpenter Firewood]";
+		mes "As you've heard before, he is a great leader, ^123456Lee Daegam^000000, who left this job to me.";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "I'll be making a vacation spot for young people around here! What do you say!";
+		npctalk "I think we need to make it even grander.", "", bc_self;
+		next;
+		mes "[Carpenter Firewood]";
+		mes "I told you that construction would be difficult because it was an area full of monsters, but who knew that even wild animals would be such a problem?";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "In the meantime, he came to me a today and teased me like that...";
+		mes "If you can't solve this problem again, I think I should quit...";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Then I'll be organizing my luggage in the cart.";
+		mes "Take a closer look at ^dd5555Broken Tools^000000.";
+		emotion ET_HNG;
+		npctalk "It's my fortune!", "", bc_self;
+		erasequest 11778;
+		setquest 11779;
+		close;
+	}
+	if (isbegin_quest(11779) == 1) {
+		mes "[Carpenter Firewood]";
+		mes "In the meantime, he came to me a today and teased me like that...";
+		mes "If you can't solve this problem again, I think I should quit...";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Then I'll be organizing my luggage in the cart.";
+		mes "Take a closer look at ^dd5555Broken Tools^000000.";
+		emotion ET_HNG;
+		npctalk "It's my fortune!", "", bc_self;
+		close;
+	}
+	// !TODO: unknown dialog for steps [11-14]
+	if (isbegin_quest(11769) == 2) {
+		mes "[Carpenter Firewood]";
+		mes "Oh my... Oh my...";
+		mes "How in the world could that happen...";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "He was a grumpy gentleman, but he wasn't that bad of a person, so what happened...";
+		mes "Oh my...";
+		npctalk "Oh my...", "", bc_self;
+		emotion ET_THINK;
+		close;
+	}
+	end;
+
+OnInit:
+	// Step 3
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11771) == 1" );
+
+	// Step 10
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11778) == 1" );
+	end;
+}
+
+// Step 4, 11
+pay_fild08,153,129,5	duplicate(dummy_cloaked_npc)	Chulho#JQ_SH_1	4_POINT_BLUE
+pay_fild08,153,129,5	duplicate(dummy_cloaked_npc)	Chulho#JQ_SH_1_1	4_EXJOB_CHUL_HO
+
+pay_fild08,155,128,3	script	Broken Tools#JQ_SH	4_BRICKPILE,{
+	if (isbegin_quest(11772) == 1) {
+		mes "- It contains broken tools. -";
+		next;
+		mes "- Around the box, animal footprints are imprinted in disorder, and as the Carpenter Firewood said, they appear to be herbivorous footprints. -";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "What do you say, adventurer?";
+		mes "You think you know something?";
+		next;
+		select( "I think I need to look around a little more." );
+		mes "[Carpenter Firewood]";
+		mes "Then look around carefully.";
+		mes "We have to start construction as soon as possible, so don't take too long.";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Let me know if you find out anything while you take a look.";
+		erasequest 11772;
+		setquest 11773;
+		navigateto("pay_fild08",153,116);
+		close;
+	}
+	if (isbegin_quest(11773) == 1) {
+		mes "- It contains broken tools. -";
+		next;
+		mes "- Around the box, animal footprints are imprinted in disorder, and as the Carpenter Firewood said, they appear to be herbivorous footprints. -";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "What do you say, adventurer?";
+		mes "You think you know something?";
+		next;
+		select( "I think I need to look around a little more." );
+		mes "[Carpenter Firewood]";
+		mes "Then look around carefully.";
+		mes "We have to start construction as soon as possible, so don't take too long.";
+		next;
+		mes "[Carpenter Firewood]";
+		mes "Let me know if you find out anything while you take a look.";
+		navigateto("pay_fild08",153,116);
+		close;
+	}
+	if (isbegin_quest(11779) == 1) {
+		mes "- A closer look at the broken tools shows a blurry stain. -";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 16>Oh no!!</FONT>";
+		mes "<FONT SIZE = 14>You can't eat that!</FONT>";
+		cutin "ex_sh_chulho00.png",2;
+		cloakoffnpcself( "Chulho#JQ_SH_1" );
+		npctalk "Oh my gosh!!", "Chulho#JQ_SH_1", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>It smells delicious, but it makes you sick.</FONT>";
+		npctalk "I tried it!", "Chulho#JQ_SH_1", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>The things I ate in the forest were sweet and delicious, but the snake strawberries I picked up earlier were bitter!</FONT>";
+		mes "<FONT SIZE = 16>I'm angry!</FONT>";
+		mes "<FONT SIZE = 18>My stomach hurts!</FONT>";
+		npctalk "My stomach is still burning!", "Chulho#JQ_SH_1", bc_self;
+		emotion ET_PROFUSELY_SWEAT, getnpcid(0,"Chulho#JQ_SH_1");
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Even the friends who followed the food here went home angry!</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>The road over there smells delicious, but that road is on the way to the village, so we, the mountain animals, will be in trouble if we go that way!</FONT>";
+		npctalk "You're going to get in trouble!", "Chulho#JQ_SH_1", bc_self;
+		next;
+		select( "About the delicious smell." );
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>The smell from the front of the forest is connected to the road to the village.</FONT>";
+		mes "<FONT SIZE = 14>But it doesn't matter if it smells good and it's bitter, angry, and gives a stomachache.</FONT>";
+		next;
+		if (select( "Give him a strawberry.", "Stop." ) == 2) {
+			// !TODO: unknown dialog
+			cutin "",255;
+			cloakonnpcself( "Chulho#JQ_SH_1" );
+			end;
+		}
+		if (countitem(578) < 1) {
+			mes "[Chulho]";
+			mes "<FONT SIZE = 14>Huh?</FONT>";
+			mes "<FONT SIZE = 14>What are you giving me?</FONT>";
+			cutin "ex_sh_chulho00.png",2;
+			close2;
+			cutin "",255;
+			cloakonnpcself( "Chulho#JQ_SH_1" );
+			end;
+		}
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Are you really giving it to me?!</FONT>";
+		mes "<FONT SIZE = 14>It's delicious! Delicious!</FONT>";
+		mes "<FONT SIZE = 14>It's much better than the strawberries I ate in the forest!</FONT>";
+		cutin "ex_sh_chulho03.png",2;
+		cloakonnpcself( "Chulho#JQ_SH_1" );
+		cloakoffnpcself( "Chulho#JQ_SH_1_1" );
+		npctalk "It's good! It's good!!!!", "Chulho#JQ_SH_1_1", bc_self;
+		emotion ET_BIGTHROB, getnpcid(0,"Chulho#JQ_SH_1");
+		delitem 578,1;	// Strawberry
+		erasequest 11779;
+		setquest 11780;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>You gave me delicious food, so I'll take you to the place you're curious about, with the delicious smell!</FONT>";
+		mes "<FONT SIZE = 14>Follow me.</FONT>";
+		cutin "ex_sh_chulho01.png",2;
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_1_1" );
+		navigateto("payon",233,159);
+		end;
+	}
+	if (isbegin_quest(11780) == 1) {
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>You gave me delicious food, so I'll take you to the place you're curious about, with the delicious smell!</FONT>";
+		mes "<FONT SIZE = 14>Follow me.</FONT>";
+		cloakoffnpcself( "Chulho#JQ_SH_1_1" );
+		cutin "ex_sh_chulho01.png",2;
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_1_1" );
+		navigateto("payon",233,159);
+		end;
+	}
+	// Default dialog
+	mes "- It contains broken tools. -";
+	close;
+
+OnInit:
+	// Step 4
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11772) == 1" );
+
+	// Step 11
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11779) == 1" );	// !TODO: countitem(578) > 0 ?
+	end;
+}
+
+// Step 5
+pay_fild08,153,116,3	script	Clutter Traces#JQ_SH1	4_SOIL,{
+	if (isbegin_quest(11773) == 1) {
+		mes "- I found another trace.";
+		mes "Footprints similar to those found next to the toolbox are stamped. -";
+		next;
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		erasequest 11773;
+		setquest 11774;
+		navigateto("pay_fild08",137,88);
+		close;
+	}
+	if (isbegin_quest(11774) == 1) {
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		navigateto("pay_fild08",137,88);
+		close;
+	}
+	// Default dialog
+	mes "- There is a trace of something messy. -";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11773) == 1" );
+	end;
+}
+
+// Step 6
+pay_fild08,137,88,3	script	Clutter Traces#JQ_SH2	4_SOIL,{
+	if (isbegin_quest(11774) == 1) {
+		mes "- I found another trace.";
+		mes "Given the large and deep footprints, it seems to be a huge herbivore. -";
+		next;
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		erasequest 11774;
+		setquest 11775;
+		navigateto("pay_fild08",165,68);
+		close;
+	}
+	if (isbegin_quest(11775) == 1) {
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		navigateto("pay_fild08",165,68);
+		close;
+	}
+	// Default dialog
+	mes "- There is a trace of something messy. -";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11774) == 1" );
+	end;
+}
+
+// Step 7
+pay_fild08,165,70,6	duplicate(dummy_cloaked_npc)	???#JQ_SH_1	4_POINT_BLUE
+
+pay_fild08,165,68,3	script	Clutter Traces#JQ_SH3	4_SOIL,{
+	if (isbegin_quest(11775) == 1) {
+		mes "- I found another trace.";
+		mes "Looking at the closely footprints, it doesn't look like one or two. -";
+		next;
+		mes "[???]";
+		mes "What are you doing, enjoying watching?";
+		cutin "ex_sh_spirit01.png",2;
+		cloakoffnpcself( "???#JQ_SH_1" );
+		npctalk "What are you looking at?", "???#JQ_SH_1", bc_self;
+		emotion ET_HUK, playerattached();
+		next;
+		cutin "",255;
+		mes "- I looked around at the sudden voice, but I couldn't see anyone. -";
+		next;
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		erasequest 11775;
+		setquest 11776;
+		cloakonnpcself( "???#JQ_SH_1" );
+		navigateto("pay_fild08",214,89);
+		close;
+	}
+	if (isbegin_quest(11776) == 1) {
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		navigateto("pay_fild08",214,89);
+		close;
+	}
+	// Default dialog
+	mes "- There is a trace of something messy. -";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11775) == 1" );
+	end;
+}
+
+// Step 8
+pay_fild08,213,91,6	duplicate(dummy_cloaked_npc)	???#JQ_SH_2	4_POINT_BLUE
+
+pay_fild08,214,89,3	script	Clutter Traces#JQ_SH4	4_SOIL,{
+	if (isbegin_quest(11776) == 1) {
+		mes "- I found another trace.";
+		mes "It is a neat footprint unlike what I saw in the firewood workshop. -";
+		next;
+		mes "- The animals seem to have moved straight down the road to the firewood workshop. -";
+		next;
+		mes "[???]";
+		mes "Is it fun to see footprints?";
+		cloakoffnpcself( "???#JQ_SH_2" );
+		npctalk "There are so many footprints.", "???#JQ_SH_2", bc_self;
+		cutin "ex_sh_spirit02.png",2;
+		emotion ET_HUK, playerattached();
+		next;
+		cutin "",255;
+		mes "- I heard a voice again, but I couldn't see anything. -";
+		next;
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		erasequest 11776;
+		setquest 11777;
+		cloakonnpcself( "???#JQ_SH_2" );
+		navigateto("pay_fild09",31,87);
+		close;
+	}
+	if (isbegin_quest(11777) == 1) {
+		mes "- Footprints are showing the way.";
+		mes "It seems to keep going.";
+		mes "Let's follow the footsteps. -";
+		navigateto("pay_fild09",31,87);
+		close;
+	}
+	// Default dialog
+	mes "- There is a trace of something messy. -";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11776) == 1" );
+	end;
+}
+
+// Step 9
+pay_fild09,33,89,6	duplicate(dummy_cloaked_npc)	???#JQ_SH_3	4_POINT_BLUE
+
+pay_fild09,31,87,3	script	Clutter Traces#JQ_SH5	4_SOIL,{
+	if (isbegin_quest(11777) == 1) {
+		mes "- I found another trace. -";
+		next;
+		mes "[???]";
+		mes "If it's a footprint, it extends all the way to that deep forest.";
+		cloakoffnpcself( "???#JQ_SH_3" );
+		cutin "ex_sh_spirit02.png",2;
+		emotion ET_HUK, playerattached();
+		next;
+		select( "Who's speaking?" );
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>I am Chulho.</FONT>";
+		mes "<FONT SIZE = 14>I~~ I'm a spirit from the forest.</FONT>";
+		npctalk "Ahem!", "???#JQ_SH_3", bc_self;
+		cutin "ex_sh_chulho00.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>There are many friends in the forest!</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Today, I'm playing in the forest waving branches, and other friends are flocking along the road.</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>I followed you because I thought something interesting happened and you were walking so excitedly.</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Walking with everyone, it was quite fun because there were ^dd5555fruits and grains^000000. Things that were hard to see in the forest on the floor!</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Then I saw an unusually ripe fruit on the floor, so I looked away for a moment and everyone left.</FONT>";
+		npctalk "It was very coveted!", "???#JQ_SH_3", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>After everyone left, there were no delicious fruits left, but there were footprints everywhere. So... I followed them here.</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>How delicious was it to eat it without a trace?</FONT>";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 17>Oh!!!</FONT>";
+		mes "<FONT SIZE = 14>There's another great snake strawberry!!!</FONT>";
+		npctalk "It looks delicious!!", "???#JQ_SH_3", bc_self;
+		emotion ET_HUK, getnpcid(0,"???#JQ_SH_3");
+		next;
+		cutin "",255;
+		mes "- I got information that there was something to eat on the way the wild animals passed by.";
+		mes "Let's go back to firewood. -";
+		erasequest 11777;
+		setquest 11778;
+		cloakonnpcself( "???#JQ_SH_3" );
+		navigateto("pay_fild08",157,129);
+		close;
+	}
+	if (isbegin_quest(11778) == 1) {
+		mes "- I got information that there was something to eat on the way the wild animals passed by.";
+		mes "Let's go back to firewood. -";
+		navigateto("pay_fild08",157,129);
+		close;
+	}
+	// Default dialog
+	mes "- There is a trace of something messy. -";
+	close;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11777) == 1" );
+	end;
+}
+
+// Step 10
+// pay_fild08,157,129,3	script	Carpenter Firewood#JQ_SH	1_M_SMITH,{
+
+// Step 11
+// pay_fild08,155,128,3	script	Broken Tools#JQ_SH	4_BRICKPILE,{
+
+// Step 12
+payon,233,158,3	duplicate(dummy_cloaked_npc)	Chulho#JQ_SH_2	4_EXJOB_CHUL_HO
+payon,232,157,6	duplicate(dummy_cloaked_npc)	???#JQ_SH_k	4_POINT_BLUE
+payon,238,157,5	duplicate(dummy_cloaked_npc)	???#JQ_SH_lee	4_M_ORIENT01
+payon,242,157,3	duplicate(dummy_cloaked_npc)	Kwang Saeng#JQ_SH_lee	4_M_DARKPRIEST
+payon,240,156,5	duplicate(dummy_cloaked_npc)	Admiral Lee Daegam#JQ_SH_lee	2_M_PHARMACIST
+	
+payon,233,159,3	script	Food Pile#JQ_SH	4_EP16_FOOD,2,2,{
+	if (isbegin_quest(11780) == 1) {
+		mes "- The food seems to be piled up.";
+		mes "Let's get closer and check. -";
+		close;
+	}
+	// Default dialog
+	mes "- The food seems to be piled up.";
+	mes "Who would do something like this in a place like this??? -";
+	close;
+
+OnTouch:
+	if (isbegin_quest(11780) == 1) {
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Here it is!</FONT>";
+		mes "<FONT SIZE = 14>It smells so bad here!</FONT>";
+		mes "<FONT SIZE = 16>Churup...</FONT>";
+		cloakoffnpcself( "Chulho#JQ_SH_2" );
+		cutin "ex_sh_chulho03.png",2;
+		emotion ET_HUNGRY, getnpcid(0,"Chulho#JQ_SH_2");
+		next;
+		mes "[???]";
+		mes "<FONT SIZE = 14>Cute!</FONT>";
+		mes "You punk!";
+		mes "What if you covet someone else's in the village?";
+		cloakoffnpcself( "???#JQ_SH_k" );
+		// npctalk "Cute!!!!", "???#JQ_SH_lee", bc_self;	// bug?
+		npctalk "Cute!!!!", "???#JQ_SH_k", bc_self;
+		cutin "ex_sh_spirit01.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>I didn't want it!</FONT>";
+		mes "<FONT SIZE = 14>I just drooled!</FONT>";
+		cutin "ex_sh_chulho02.png",2;
+		next;
+		mes "[???]";
+		mes "Besides, those are things you shouldn't eat!";
+		cutin "ex_sh_spirit01.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 18><B>Why?</B></FONT>";
+		cutin "ex_sh_chulho02.png",2;
+		emotion ET_HUK, getnpcid(0,"Chulho#JQ_SH_2");
+		next;
+		mes "[???]";
+		mes "These days, ^dd5555mountain animals who are sick after eating what they fell on the road^000000 keep coming to me, and it's all because of them.";
+		cutin "ex_sh_spirit02.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Kisul is nice!</FONT>";
+		mes "<FONT SIZE = 14>Are you worried about your stomachache?</FONT>";
+		cutin "ex_sh_chulho03.png",2;
+		next;
+		mes "[Kisul]";
+		mes "I came to scold those who sprayed strange things because it was <FONT SIZE = 14><B>annoying</B></FONT> to keep coming.";
+		cutin "ex_sh_spirit02.png",2;
+		emotion ET_HNG, getnpcid(0,"???#JQ_SH_k");
+		next;
+		mes "[Chulho]";
+		mes "...";
+		cutin "ex_sh_chulho02.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 18>Good boy!</FONT>";
+		cutin "ex_sh_chulho01.png",2;
+		npctalk "That's nice!!!!!!!", "Chulho#JQ_SH_2", bc_self;
+		next;
+		mes "[Kisul]";
+		mes "Shh!";
+		mes "Seeing that you can hear the running sound, you must have finally discovered it.";
+		cutin "ex_sh_spirit02.png",2;
+		npctalk "It's noisy.", "???#JQ_SH_k", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 10>What?</FONT>";
+		cutin "ex_sh_chulho01.png",2;
+		next;
+		mes "[Kisul]";
+		mes "I've been playing a little trick on you to see the faces of the old white guys who bothered me.";
+		mes "Stay still.";
+		cutin "ex_sh_spirit02.png",2;
+		next;
+		cutin "",255;
+		mes "[???]";
+		mes "<FONT SIZE = 16>Sir!</FONT>";
+		cloakoffnpcself( "???#JQ_SH_lee" );
+		npctalk "Sir!!!!!", "???#JQ_SH_lee", bc_self;
+		next;
+		mes "[???]";
+		mes "<FONT SIZE = 16>Sir!!!</FONT>";
+		mes "<FONT SIZE = 16>We're in trouble!!!</FONT>";
+		npctalk "What should I do with this?", "???#JQ_SH_lee", bc_self;
+		emotion ET_HELP, getnpcid(0,"???#JQ_SH_lee");
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "What's the matter?";
+		mes "Please explain quickly.";
+		cloakoffnpcself( "Admiral Lee Daegam#JQ_SH_lee" );
+		next;
+		mes "[Lee Daegam's Subordinate]";
+		mes "I put it in the barn... The...the food is all gone!";
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "<FONT SIZE = 14>What!?</FONT>";
+		mes "Where did all the food go!";
+		next;
+		mes "[Lee Daegam's Subordinate]";
+		mes "The barn door was locked well, I was in the yard the whole time and no one passed by.";
+		emotion ET_PROFUSELY_SWEAT, getnpcid(0,"???#JQ_SH_lee");
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "So you're saying the food walked out on its own?!";
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "Well...";
+		mes "First of all, call a person to investigate the barn quietly. Next, tell them to go to the kitchen and prepare a meal quickly because they need food for immediate use.";
+		npctalk "You can't mess things up like this!", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "Then go to the men's quarters and tell them to come to Kwang Saeng.";
+		npctalk "Don't make a noise and go quietly.", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		next;
+		mes "[Lee Daegam's Subordinate]";
+		mes "Yes, sir.";
+		next;
+		cloakonnpcself( "???#JQ_SH_lee" );
+		mes "[Admiral Lee Daegam]";
+		mes "Sigh~";
+		mes "What a ghost!";
+		npctalk "How did you prepare that food!!!", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "<FONT SIZE = 14>I don't know who it is, but I better not catch you stealing in my barn!!!</FONT>";
+		npctalk "I'll catch you!!!", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		next;
+		mes "[Kwang Saeng]";
+		mes "Lee Daegam, you're looking for me?";
+		cloakoffnpcself( "Kwang Saeng#JQ_SH_lee" );
+		npctalk "Haha!", "Kwang Saeng#JQ_SH_lee", bc_self;
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "<FONT SIZE = 16>Aaah~~!</FONT>";
+		mes "<FONT SIZE = 16>Kwang Saeng!!!</FONT>";
+		mes "How did you get here so soon?!";
+		npctalk "Welcome.", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		next;
+		mes "[Kwang Saeng]";
+		mes "I came quickly because you said you were looking for me in a hurry.";
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "It's not much, but there was a thief in the barn, and all the food disappeared.";
+		next;
+		mes "[Kwang Saeng]";
+		mes "Oh no!";
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "That's why we're trying to catch the criminals, but we need to make new food for the people right now...";
+		emotion ET_SCRATCH, getnpcid(0,"Admiral Lee Daegam#JQ_SH_lee");
+		next;
+		mes "[Kwang Saeng]";
+		mes "All right.";
+		mes "I'll get you some medicines.";
+		next;
+		mes "[Kwang Saeng]";
+		mes "By the way...";
+		mes "I'm preparing medicine ^123456because^000000 Lee Daegam asked me to, but isn't the construction of the forest done by Lee Daegam himself?";
+		mes "Why don't you let me handle that?";
+		next;
+		mes "[Admiral Lee Daegam]";
+		mes "It takes effort to buy good land for cheap.";
+		next;
+		mes "[Kwang Saeng]";
+		mes "Haha.";
+		mes "Lee Daegam.";
+		npctalk "Hahahahaha!", "Kwang Saeng#JQ_SH_lee", bc_self;
+		next;
+		npctalk "Hahahahaha!!!", "Admiral Lee Daegam#JQ_SH_lee", bc_self;
+		emotion ET_SMILE, getnpcid(0,"Admiral Lee Daegam#JQ_SH_lee");
+		emotion ET_SMILE, getnpcid(0,"Kwang Saeng#JQ_SH_lee");
+		sleep2 1000;
+		cloakonnpcself( "Admiral Lee Daegam#JQ_SH_lee" );
+		cloakonnpcself( "Kwang Saeng#JQ_SH_lee" );
+		mes "[Kisul]";
+		mes "Oh, my~";
+		mes "What was that.";
+		mes "I wondered if there was a big reason, but it was a boring reason.";
+		cutin "ex_sh_kisul00.png",2;
+		npctalk "What a letdown~", "???#JQ_SH_k", bc_self;
+		next;
+		mes "[Kisul]";
+		mes "Then I'll go home since my interest has cooled down.";
+		emotion ET_SLEEPY, getnpcid(0,"???#JQ_SH_k");
+		npctalk "That was boring~", "???#JQ_SH_k", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "Oh!";
+		mes "Are you not going to stop me?";
+		cutin "ex_sh_chulho01.png",2;
+		emotion ET_HUK, getnpcid(0,"Chulho#JQ_SH_2");
+		next;
+		mes "[Kisul]";
+		mes "No, well.";
+		mes "He's already in over his head, so wouldn't he take care of it?";
+		cutin "ex_sh_kisul00.png",2;
+		next;
+		mes "[Kisul]";
+		mes "It's gonna be fun to watch.";
+		mes "Hehehe.";
+		cutin "ex_sh_kisul00.png",2;
+		emotion ET_KIK, getnpcid(0,"???#JQ_SH_k");
+		next;
+		cloakonnpcself( "???#JQ_SH_k" );
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Gasp!</FONT>";
+		mes "<FONT SIZE = 14>That's right!</FONT>";
+		mes "<FONT SIZE = 14>I'm in trouble!</FONT>";
+		cutin "ex_sh_chulho02.png",2;
+		npctalk "It's crazy!!!", "Chulho#JQ_SH_2", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Hyunrok will be in big trouble if he finds out that he gave strange medicine to his friends as well as digging through the forest to make something weird!!</FONT>";
+		npctalk "If you don't stop me, I'll destroy everything!", "Chulho#JQ_SH_2", bc_self;
+		cutin "ex_sh_chulho01.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 16>Let's go!</FONT>";
+		mes "<FONT SIZE = 16>Hurry up!!</FONT>";
+		emotion ET_GO, getnpcid(0,"Chulho#JQ_SH_2");
+		erasequest 11780;
+		setquest 11781;
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_2" );
+		navigateto("pay_fild09",108,346);
+		end;
+	}
+	if (isbegin_quest(11781) == 1) {
+		// Debug (npcs not uncloaked on official server)
+		cloakoffnpcself( "???#JQ_SH_k" );
+		cloakoffnpcself( "Chulho#JQ_SH_2" );
+
+		mes "[Kisul]";
+		mes "Then I'll go home since my interest has cooled down.";
+		emotion ET_SLEEPY, getnpcid(0,"???#JQ_SH_k");
+		npctalk "That was boring~", "???#JQ_SH_k", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "Oh!";
+		mes "Are you not going to stop me?";
+		cutin "ex_sh_chulho01.png",2;
+		emotion ET_HUK, getnpcid(0,"Chulho#JQ_SH_2");
+		next;
+		mes "[Kisul]";
+		mes "No, well.";
+		mes "He's already in over his head, so wouldn't he take care of it?";
+		cutin "ex_sh_kisul00.png",2;
+		next;
+		mes "[Kisul]";
+		mes "It's gonna be fun to watch.";
+		mes "Hehehe.";
+		cutin "ex_sh_kisul00.png",2;
+		emotion ET_KIK, getnpcid(0,"???#JQ_SH_k");
+		next;
+		cloakonnpcself( "???#JQ_SH_k" );
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Gasp!</FONT>";
+		mes "<FONT SIZE = 14>That's right!</FONT>";
+		mes "<FONT SIZE = 14>I'm in trouble!</FONT>";
+		cutin "ex_sh_chulho02.png",2;
+		npctalk "It's crazy!!!", "Chulho#JQ_SH_2", bc_self;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Hyunrok will be in big trouble if he finds out that he gave strange medicine to his friends as well as digging through the forest to make something weird!!</FONT>";
+		npctalk "If you don't stop me, I'll destroy everything!", "Chulho#JQ_SH_2", bc_self;
+		cutin "ex_sh_chulho01.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 16>Let's go!</FONT>";
+		mes "<FONT SIZE = 16>Hurry up!!</FONT>";
+		emotion ET_GO, getnpcid(0,"Chulho#JQ_SH_2");
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_2" );
+		navigateto("pay_fild09",108,346);
+		end;
+	}
+	end;
+
+OnInit:
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11780) == 1" );
+	end;
+}
+
+// Step 13, 15
+pay_fild09,109,344,5	duplicate(dummy_cloaked_npc)	Chulho#JQ_SH_door	4_EXJOB_CHUL_HO
+
+pay_fild09,108,346,3	script	Suspicious Light#JQ_SH	4_ENERGY_WHITE,{
+	if (isbegin_quest(11770) == 0) {
+		mes "- A suspicious ripple is visible. -";
+		close;
+	}
+	// !TODO: unknown dialog for steps [2-12]
+	if (isbegin_quest(11781) == 1) {
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Oh no!</FONT>";
+		mes "<FONT SIZE = 14>What's this hideous atmosphere!</FONT>";
+		mes "<FONT SIZE = 14>As expected, Hyunrok seems to have noticed!</FONT>";
+		cloakoffnpcself( "Chulho#JQ_SH_door" );
+		cutin "ex_sh_chulho02.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>What if we're in big trouble?</FONT>";
+		mes "<FONT SIZE = 14>Let's hurry up, go in and stop Hyunrok.</FONT>";
+		npctalk "It's really scary when Hyunrok is angry!", "Chulho#JQ_SH_door", bc_self;
+		erasequest 11781;
+		setquest 11782;
+		next;
+		cloakonnpcself( "Chulho#JQ_SH_door" );
+		cutin "",255;
+	}
+	if (isbegin_quest(11782) == 1) {
+		.@md_name$ = "Deep Forest";
+
+		mes "- A suspicious ripple appears where Chulho disappeared. -";
+		next;
+		if (is_party_leader() == true) {	// !TODO: confirm if it's solo party
+			.@menu$[0] = "Open the door.";
+			.@menu$[1] = "Enter.";
+		}
+		switch( select( .@menu$[0], .@menu$[1], "Quit." ) ) {
+		case 1:
+			if (is_party_leader() == true)
+				instance_create(.@md_name$);
+			end;
+		case 2:
+			if (is_party_leader() == true) {
+				switch( instance_enter(.@md_name$) ) {
+				case IE_OTHER:
+					mes "^ff0000An unknown error occurred.^000000";
+					close;
+				case IE_NOINSTANCE:
+					mes "- The swaying looks unsettling.";
+					mes "Let's wait a bit and then go in. -";
+					close;
+				case IE_NOMEMBER:
+					end;
+				case IE_OK:
+					mapannounce "pay_fild09", "" + strcharinfo(0) + " of the " + getpartyname( getcharid(1) ) + " party is entering the " + .@md_name$ + ".", bc_map, 0xFF99;
+					// warp "1@exsh",90,35;
+					end;
+				}
+				end;
+			}
+			end;
+		case 3:
+			end;
+		}
+		end;
+	}
+	if (isbegin_quest(11769) == 1) {
+		if (checkweight(490087,1) == 0) {
+			// !TODO: unknown dialog
+			mes "- Hold on a second here!! -";
+			mes "- You have too many items. -";
+			mes "- That means you can no longer receive any items. -";
+			mes "- Free up some space -";
+			mes "- and try again. -";
+			close;
+		}
+		if (SkillPoint > 0) {
+			// !TODO: unknown dialog
+			mes "[Chulho]";
+			mes "Please use all your skill points before proceeding.";
+			close3;
+		}
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>I've been waiting!</FONT>";
+		mes "<FONT SIZE = 14>It's hard to come to the Deep Forest now, but come to think of it, I just have to come out to play!</FONT>";
+		mes "<FONT SIZE = 14>Although Hyunrok won't come out!</FONT>";
+		cloakoffnpcself( "Chulho#JQ_SH_door" );
+		cutin "ex_sh_chulho01.png",2;
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Oh, and this is a letter from Hyunrok!</FONT>";
+		mes "<FONT SIZE = 14>Go ahead and read it!</FONT>";
+		cutin "ex_sh_chulho03.png",2;
+		next;
+		if (select( "Read the letter.", "Stop." ) == 2) {
+			// !TODO: unknown dialog
+			cutin "",255;
+			cloakonnpcself( "Chulho#JQ_SH_door" );
+			end;
+		}
+		mes "[Hyunrok's Letter]";
+		mes "Dear " + strcharinfo(0) + ".";
+		cutin "ex_sh_hyunrok00.png",2;
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "It's a relationship just by touching your clothes...";
+		mes "The reason you entered this forest and the reason we met must be all fate that the heavens decided.";
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "I will never forget the grace that helped us in danger even though we did not see the relationship properly and were disrespectful in the immediate event.";
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "As Chulho said, I wanted to at least hold a feast to repay you, but staying in this Deep Forest for a long time is dangerous to those outside the forest, so I feel heavy to send them back in a hurry without even telling them a proper goodbye.";
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "I'm sure you'll understand because I did it for you.";
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "And it's not a small reward for your help, but it's engraved in our souls so that we can call out our strength whenever we need help.";
+		next;
+		mes "[Hyunrok's Letter]";
+		mes "Then, let's look forward to seeing each other again...";
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Have you finished reading the letter?</FONT>";
+		mes "<FONT SIZE = 14>What did it say?</FONT>";
+		cutin "ex_sh_chulho01.png",2;
+		next;
+		select( "Show the letter." );
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>Hyunrok always says things that are hard to understand!</FONT>";
+		mes "<FONT SIZE = 14>And take this, too!</FONT>";
+		mes "<FONT SIZE = 14>I saved it because it was a fun item, but I'll give it to you!</FONT>";
+		cutin "ex_sh_chulho02.png",2;
+		completequest 11769;
+		jobchange JOB_SPIRIT_HANDLER;
+		getitem 490087,1;	// 4th_Q_Necklace
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_door" );
+		end;
+	}
+	if (isbegin_quest(11769) == 2) {
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>See you again</FONT>";
+		mes "<FONT SIZE = 14>I was just out playing.</FONT>";
+		cutin "ex_sh_chulho01.png",2;
+		cloakoffnpcself( "Chulho#JQ_SH_door" );
+		next;
+		mes "[Chulho]";
+		mes "<FONT SIZE = 14>There's so much fun outside the forest!</FONT>";
+		mes "<FONT SIZE = 14>Of course the forest is fun too!</FONT>";
+		close2;
+		cutin "",255;
+		cloakonnpcself( "Chulho#JQ_SH_door" );
+		end;
+	}
+	end;
+
+OnInit:
+	// Step 13
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11781) == 1" );
+
+	// Step 14
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11782) == 1" );
+
+	// Step 15
+	questinfo( QTYPE_JOBQUEST, QMARK_YELLOW, "isbegin_quest(11769) == 1" );
+	end;
+}
+
+// Step 14
+// (inside the instance)
+
+// Step 15 (final)
+// pay_fild09,108,346,3	script	Suspicious Light#JQ_SH	4_ENERGY_WHITE,{

+ 5 - 0
npc/re/mapflag/nobranch.txt

@@ -322,6 +322,11 @@ job4_bio	mapflag	nobranch
 job4_mag	mapflag	nobranch
 job4_tro	mapflag	nobranch
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	nobranch
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 5 - 0
npc/re/mapflag/nomemo.txt

@@ -391,6 +391,11 @@ job4_bio	mapflag	nomemo
 job4_mag	mapflag	nomemo
 job4_tro	mapflag	nomemo
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	nomemo
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 6 - 0
npc/re/mapflag/noteleport.txt

@@ -357,6 +357,12 @@ job4_tro	mapflag	noteleport
 1@4igd	mapflag	monster_noteleport
 1@4drk	mapflag	monster_noteleport
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	noteleport
+1@exsh	mapflag	monster_noteleport
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 5 - 0
npc/re/mapflag/nowarpto.txt

@@ -327,6 +327,11 @@ job4_bio	mapflag	nowarpto
 job4_mag	mapflag	nowarpto
 job4_tro	mapflag	nowarpto
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	nowarpto
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 5 - 0
npc/re/mapflag/partylock.txt

@@ -195,6 +195,11 @@
 1@4igd	mapflag	partylock
 1@4drk	mapflag	partylock
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	partylock
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 5 - 0
npc/re/mapflag/restricted.txt

@@ -180,6 +180,11 @@ lhz_d_n2	mapflag	restricted	6
 1@4igd	mapflag	restricted	6
 1@4drk	mapflag	restricted	6
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	restricted	6
+
 //============================================================
 // Geffen Night Arena
 //============================================================

+ 1 - 1
npc/re/merchants/3rd_trader.txt

@@ -113,7 +113,7 @@ job3_guil01,91,93,3	script	Rare Herb Collector	1_M_03,{
 
 // Point Merchants (Sorcerer) :: point_3rd_trader
 //============================================================
--	shop	Shard_Seller	HIDDEN_NPC,no,6360:200,6363:200,6361:200,6362:200
+-	shop	Shard_Seller	HIDDEN_NPC,no,6360:200,6363:200,6361:200,6362:200,1000291:-1,1000292:-1,1000293:-1,1000294:-1,1000295:-1
 
 -	script	::pss	HIDDEN_NPC,{
 	npctalk "Do you have an element for each property?", "", bc_self;

+ 7 - 7
npc/re/merchants/Extended_Ammunition.txt

@@ -15,15 +15,15 @@
 	next;
 	switch ( select( "Buy Arrows", "Quiver Exchange", "Sell Items", "Cancel" )) {
 	case 1:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Arrow_Archer", 1;
 		break;
 	case 2:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Quiver_Archer", 1;
 		break;
 	case 3:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Selling_Items", 2;
 		break;
 	case 4:
@@ -90,15 +90,15 @@ OnInit:
 	next;
 	switch ( select( "Buy Ninjutsu Tool", "Parchment Exchange", "Sell Items", "Cancel" )) {
 	case 1:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Weapons_Ninja", 1;
 		break;
 	case 2:
-		close2;	
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Box_Exchange_Ninja", 1;
 		break;
 	case 3:
-		close2;	
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Selling_Items", 2;
 		break;
 	case 4:
@@ -199,7 +199,7 @@ OnInit:
 -	marketshop	Ammunition_Gunslinger	HIDDEN_NPC,13200:-1:-1,13221:-1:-1,13228:-1:-1,13229:-1:-1,13230:-1:-1,13231:-1:-1,13232:-1:-1,13222:-1:-1,13215:-1:-1,13216:-1:-1,13217:-1:-1,13218:-1:-1,13219:-1:-1,13220:-1:-1,7663:-1:-1,7665:15:-1,7664:-1:-1,25187:-1:-1,1000564:-1:-1
 
 //= Ninja
--	marketshop	Weapons_Ninja	HIDDEN_NPC,1220001:-1:-1,1220002:-1:-1,1220003:30:-1,1220004:-1:-1,13258:-1:-1,13257:-1:-1,13255:-1:-1,13256:-1:-1,13259:-1:-1,13294:-1:-1,6512:-1:-1,6513:-1:-1,6514:-1:-1,13250:-1:-1,13251:-1:-1,13252:-1:-1,13253:-1:-1,13254:-1:-1,7521:-1:-1,7522:-1:-1,7523:-1:-1,7524:-1:-1,1000565:-1:-1,1000566:-1:-1,1000567:-1:-1,1000568:-1:-1,1000569:-1:-1
+-	marketshop	Weapons_Ninja	HIDDEN_NPC,1220001:-1:-1,1220002:-1:-1,1220003:30:-1,1220004:-1:-1,13258:-1:-1,13257:-1:-1,13255:-1:-1,13256:-1:-1,13259:-1:-1,13294:-1:-1,6512:-1:-1,6515:-1:-1,6513:-1:-1,6514:-1:-1,13250:-1:-1,13251:-1:-1,13252:-1:-1,13253:-1:-1,13254:-1:-1,7521:-1:-1,7522:-1:-1,7523:-1:-1,7524:-1:-1,1000565:-1:-1,1000566:-1:-1,1000567:-1:-1,1000568:-1:-1,1000569:-1:-1
 
 //= Merchant
 -	shop	Weapons_Mechanic	-1,2139:-1,2800:-1,2801:-1,2802:-1,2803:-1,2805:-1,2806:-1,6186:-1,2808:-1,2807:-1

+ 3 - 3
npc/re/merchants/barters/Extended_Ammunition.yml

@@ -400,13 +400,13 @@ Body:
             Item: Shadow_Orb
             Amount: 500
       - Index: 18
-        Item: Shadow_Orb_Bundle
+        Item: SS_Charm_Box
         RequiredItems:
           - Index: 0
-            Item: Shadow_Orb
+            Item: SS_Charm
             Amount: 500
       - Index: 19
-        Item: SS_Charm_Box
+        Item: SS_Charm_F_Box
         RequiredItems:
           - Index: 0
             Item: SS_Charm_F

+ 722 - 0
npc/re/merchants/barters/cashmall.yml

@@ -1037,3 +1037,725 @@ Body:
           - Index: 0
             Item: Cachua_Coupon
             Amount: 10
+  - Name: barter_mall_coupon_1
+    Items:
+      - Index: 0
+        Item: FateSin_Boots_CD
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 1
+        Item: FateSin_Boots_IQ
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 2
+        Item: FateSin_Boots_SOA
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 3
+        Item: FateSin_Boots_BO
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 4
+        Item: FateSin_Boots_DK
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 5
+        Item: FateSin_Boots_SH
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 6
+        Item: FateSin_Boots_EM
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 7
+        Item: FateSin_Boots_WH
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 8
+        Item: FateSin_Boots_SKE
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 9
+        Item: FateSin_Boots_IG
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 10
+        Item: FateSin_Boots_AG
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 11
+        Item: FateSin_Boots_NW
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 12
+        Item: FateSin_Boots_MT
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 13
+        Item: FateSin_Boots_SHC
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 14
+        Item: FateSin_Boots_SS
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 15
+        Item: FateSin_Boots_ABC
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 16
+        Item: FateSin_Boots_TR
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+      - Index: 17
+        Item: FateSin_Boots_HN
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_FateSinBoots
+  - Name: barter_mall_coupon_2
+    Items:
+      - Index: 0
+        Item: GoodnEvil_Circlet_DK
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 1
+        Item: GoodnEvil_Circlet_IG
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 2
+        Item: GoodnEvil_Circlet_AG
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 3
+        Item: GoodnEvil_Circlet_EM
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 4
+        Item: GoodnEvil_Circlet_CD
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 5
+        Item: GoodnEvil_Circlet_IQ
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 6
+        Item: GoodnEvil_Circlet_MT
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 7
+        Item: GoodnEvil_Circlet_BO
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 8
+        Item: GoodnEvil_Circlet_SHC
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 9
+        Item: GoodnEvil_Circlet_ABC
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 10
+        Item: GoodnEvil_Circlet_WH
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 11
+        Item: GoodnEvil_Circlet_TR
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 12
+        Item: GoodnEvil_Circlet_SS
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 13
+        Item: GoodnEvil_Circlet_SKE
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 14
+        Item: GoodnEvil_Circlet_SOA
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 15
+        Item: GoodnEvil_Circlet_HN
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 16
+        Item: GoodnEvil_Circlet_SH
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 17
+        Item: GoodnEvil_Circlet_NW
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 18
+        Item: GoodnEvil_Circlet_NW2
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 19
+        Item: GoodnEvil_Circlet_NW3
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 20
+        Item: GoodnEvil_Circlet_NW4
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+      - Index: 21
+        Item: GoodnEvil_Circlet_NW5
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_GoodnEvil_Helm
+  - Name: barter_mall_coupon_3
+    Items:
+      - Index: 0
+        Item: Punish_Hall
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 1
+        Item: Saint_Bringer
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 2
+        Item: Humma_Brilliance
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 3
+        Item: Luppiter_Spear
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 4
+        Item: Holy_Raise_Spear
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 5
+        Item: Lightforce_Foxtail_Wand
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 6
+        Item: Shining_Light_Katar
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 7
+        Item: Angel_Wing_Bow
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 8
+        Item: Guardian_Saber
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 9
+        Item: Holy_Light_Dagger
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 10
+        Item: Light_Power_Harp
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 11
+        Item: Light_Power_Spark
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 12
+        Item: Lighting_Splatter
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 13
+        Item: Justice_Bomber
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 14
+        Item: Last_Dawn
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 15
+        Item: Devil_Hunter
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 16
+        Item: Road_Of_Glory
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 17
+        Item: Victory_Sword
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 18
+        Item: Divine_Buster
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 19
+        Item: Orign_Of_Life
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 20
+        Item: Destiny_Staff
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 21
+        Item: Blessed_Bible
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+      - Index: 22
+        Item: Soul_Liberator
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Justice_Weapon
+  - Name: barter_mall_coupon_4
+    Items:
+      - Index: 0
+        Item: Demonic_Claw
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 1
+        Item: Sealed_Bible
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 2
+        Item: Darkness_Tablet
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 3
+        Item: Devil_Wing_Staff
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 4
+        Item: Doom_Bible
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 5
+        Item: Soul_Harvest
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 6
+        Item: The_Reaper
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 7
+        Item: Underworld_Knife
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 8
+        Item: Devil_Cursed_Sword
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 9
+        Item: Dark_Angel_Ray_Bow
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 10
+        Item: Crime_Violine
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 11
+        Item: Crime_Whip
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 12
+        Item: RG_5649
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 13
+        Item: Devil_L_Launcher
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 14
+        Item: Screaming_Rifle
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 15
+        Item: Devils_Bullet
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 16
+        Item: Outlaw_Cursed_Shotgun
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 17
+        Item: Blood_Rapier
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 18
+        Item: Destruction_Axe
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 19
+        Item: Devil_Claw
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 20
+        Item: Execution_Great_Sword
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 21
+        Item: Devil_Guardian_Sword
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+      - Index: 22
+        Item: Darkness_Foxtail_Model
+        RequiredItems:
+          - Index: 0
+            Item: Coupon_Injustice_Weapon
+  - Name: barter_mall_coupon_5
+    Items:
+      - Index: 0
+        Item: StormBow_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 1
+        Item: TornadoBow_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 2
+        Item: SaintBook_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 3
+        Item: SaintWand_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 4
+        Item: SunBook_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 5
+        Item: MoonBook_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 6
+        Item: Slayer_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 7
+        Item: Trident_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 8
+        Item: Demonius_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 9
+        Item: Demonsword_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 10
+        Item: Foxtail_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 11
+        Item: Setaria_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 12
+        Item: OverSpear_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 13
+        Item: aegis_103033
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 14
+        Item: Impact_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 15
+        Item: aegis_103034
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 16
+        Item: Humma_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 17
+        Item: WheelHumma_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 18
+        Item: GiganticAxe_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 19
+        Item: Hammer_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 20
+        Item: MasterSpellBook_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 21
+        Item: Grimoire_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 22
+        Item: Soul_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 23
+        Item: SpiritStick_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 24
+        Item: MetalVilolin_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 25
+        Item: MetalWhip_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 26
+        Item: Harp_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 27
+        Item: Whip_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 28
+        Item: Lapier_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 29
+        Item: SharpSword_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 30
+        Item: Stick_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 31
+        Item: WhiteSword_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 32
+        Item: Flame_Staff_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 33
+        Item: Specter_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 34
+        Item: GaleClaw_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 35
+        Item: Exterminate_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 36
+        Item: Gatling_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+      - Index: 37
+        Item: Rifle_Furious
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001809
+  - Name: barter_mall_coupon_6
+    Items:
+      - Index: 0
+        Item: FuriousCirclet_WH
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 1
+        Item: FuriousCirclet_CD
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 2
+        Item: FuriousCirclet_SKE
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 3
+        Item: FuriousCirclet_DK
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 4
+        Item: FuriousCirclet_ABC
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 5
+        Item: FuriousCirclet_SH
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 6
+        Item: FuriousCirclet_IG
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 7
+        Item: FuriousCirclet_SHC
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 8
+        Item: FuriousCirclet_SS
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 9
+        Item: FuriousCirclet_MT
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 10
+        Item: FuriousCirclet_EM
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 11
+        Item: FuriousCirclet_SOA
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 12
+        Item: FuriousCirclet_TR
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 13
+        Item: FuriousCirclet_BO
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 14
+        Item: FuriousCirclet_HN
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 15
+        Item: FuriousCirclet_AG
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 16
+        Item: FuriousCirclet_IQ
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810
+      - Index: 17
+        Item: FuriousCirclet_NW
+        RequiredItems:
+          - Index: 0
+            Item: aegis_1001810

+ 52 - 0
npc/re/merchants/cashmall.txt

@@ -4,6 +4,7 @@
 //= 1.0 Initial version from replays. [Lemongrass]
 //= 1.1 Cash Hair Stylist [Kisuka]
 //= 1.2 Updated Hair Stylist [Lemongrass]
+//= 1.3 Added an NPC to exchange coupons for Good, Evil or Wrath equipment. [Atemo]
 //============================================================
 
 prontera,137,125,4	script	Cash Sales Guide#prontera::cashmall_warper	4_M_HUMAN_02,{
@@ -329,3 +330,54 @@ itemmall,19,74,5	script	Stylist#cash	91,{
 	mes "to see you again. Take care!";
 	close;
 }
+
+itemmall,41,55,3	script	Cat Hand Salesman Tunkarom	4_M_MERCAT1,{
+	mes "[Tunkarom]";
+	mes "Welcome!";
+	mes "If you have a special coupon, we'll exchange it for the product you want!";
+	mes "These are the exchangeable coupons:";
+	mes mesitemicon(1001583) + " " + mesitemicon(1001581) + " " + mesitemicon(1001584) + " " + mesitemicon(1001588) + " " + mesitemicon(1001809) + " " + mesitemicon(1001810);
+	next;
+	switch( select( "Exchange Good and Evil Boots", "Exchange Good and Evil Crown", "Exchange Good Weapons", "Exchange Evil Weapons", "Exchange Wrath Weapons", "Exchange Wrath Crown", "Cancel" ) ) {
+	case 1:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Good and Evil Boots. What a good choice~!";
+		close2;
+		callshop( "barter_mall_coupon_1" );
+		end;
+	case 2:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Good and Evil Crown. What a great choice~!";
+		close2;
+		callshop( "barter_mall_coupon_2" );
+		end;
+	case 3:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Good Weapons. What a great choice~!";
+		close2;
+		callshop( "barter_mall_coupon_3" );
+		end;
+	case 4:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Evil Weapons. What a great choice~!";
+		close2;
+		callshop( "barter_mall_coupon_4" );
+		end;
+	case 5:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Wrath Weapons. What a great choice~!";
+		close2;
+		callshop( "barter_mall_coupon_5" );
+		end;
+	case 6:
+		mes "[Tunkarom]";
+		mes "This is an exchange of Wrath Crowns. What a great choice~!";
+		close2;
+		callshop( "barter_mall_coupon_6" );
+		end;
+	case 7:
+		mes "[Tunkarom]";
+		mes "Can't find what you're looking for? Come back next time.";
+		close;
+	}
+}

+ 1 - 2
npc/re/merchants/shops.txt

@@ -58,7 +58,6 @@ que_ng,180,79,3	shop	Johnny Waiker	900,13200:-1,13221:-1,13222:-1
 // El Dicastes
 //=======================================================
 dic_in01,238,107,5	shop	Peddler#dic	900,601:-1,602:-1,611:-1,610:-1
-dicastes01,207,200,6	shop	Points Merchant#dic	66,6360:-1,6361:-1,6362:-1,6363:-1
 
 //=======================================================
 // Geffen
@@ -109,7 +108,7 @@ malangdo,232,163,5	shop	Tool Dealer Myo	560,611:-1,1750:-1,645:-1,656:-1,601:-1,
 //=======================================================
 // Mora
 //=======================================================
-mora,100,118,4	shop	Tool Dealer#mora	517,11522:-1,11523:-1,11524:-1,602:-1,601:-1,611:-1,1773:-1,1774:-1
+mora,100,118,4	shop	Tool Dealer#mora	517,11522:-1,11523:-1,11524:-1,602:-1,601:-1,611:-1
 mora,138,110,4	shop	Mora Chef	518,11519:-1
 
 //=======================================================

+ 4 - 4
npc/re/mobs/dungeons/lhz_dun.txt

@@ -85,7 +85,7 @@ OnInit:
 		case 6:  set .@x,175;  set .@y,137;  break;
 	}
 	set .@mob,rand(1646,1651);
-	monster "lhz_dun03",.@x,.@y,strmobinfo(1,.@mob),.@mob,1,strnpcinfo(3)+"::OnMyMVPDead";
+	monster "lhz_dun03",.@x,.@y,getmonsterinfo(.@mob, MOB_NAME),.@mob,1,strnpcinfo(3)+"::OnMyMVPDead";
 
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,6)) {
@@ -97,7 +97,7 @@ OnInit:
 		case 6:  set .@x2,139;  set .@y2,259;  break;
 	}
 	set .@mob2,rand(1640,1645);
-	monster "lhz_dun03",.@x2,.@y2,strmobinfo(1,.@mob2),.@mob2,1,strnpcinfo(3)+"::OnMy99Dead";
+	monster "lhz_dun03",.@x2,.@y2,getmonsterinfo(.@mob2, MOB_NAME),.@mob2,1,strnpcinfo(3)+"::OnMy99Dead";
 	end;
 
 OnMyMVPDead:
@@ -141,7 +141,7 @@ OnInit:
 		case 7:  set .@x,149;  set .@y,151;  break;
 	}
 	set .@mob,rand(2235,2241);
-	monster "lhz_dun04",.@x,.@y,strmobinfo(1,.@mob),.@mob,1,strnpcinfo(3)+"::OnLhzMvPDead";
+	monster "lhz_dun04",.@x,.@y,getmonsterinfo(.@mob, MOB_NAME),.@mob,1,strnpcinfo(3)+"::OnLhzMvPDead";
 
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,7)) {
@@ -154,7 +154,7 @@ OnInit:
 		case 7:  set .@x2,149;  set .@y2,151;  break;
 	}
 	set .@mob2,rand(2228,2234);
-	monster "lhz_dun04",.@x2,.@y2,strmobinfo(1,.@mob2),.@mob2,1,strnpcinfo(3)+"::OnMy99Dead";
+	monster "lhz_dun04",.@x2,.@y2,getmonsterinfo(.@mob2, MOB_NAME),.@mob2,1,strnpcinfo(3)+"::OnMy99Dead";
 	end;
 
 OnLhzMvPDead:

+ 75 - 0
npc/re/other/kachua_key.txt

@@ -0,0 +1,75 @@
+//===== rAthena Script =======================================
+//= Dynamic NPC: Kachua's Secret Box
+//===== Description: =========================================
+//- [Official conversion]
+//= Kachua's Secret Box is a Gachapon NPC.
+//= It lets the player exchange a Kachua's Secret Key for a random item.
+//= It also gives a Kachua's Mileage Coupon for each pull.
+//===== Changelogs: ==========================================
+//= 1.0 First version. [secretdataz]
+//============================================================
+
+sec_in02,126,178,3	script	Kachua's Secret Box#bm	4_TREASURE_BOX,{
+	.@key$ = "K_Secret_Key";
+	.@keyname$ = getitemname( .@key$ );
+	.@box$ = "Main_Lucky_Box";
+	.@boxname$ = getitemname( .@box$ );
+	mes "A Secret Box where no one knows what's inside.";
+	mes "^4d4dffYou can open this box by consuming " + mesitemlink( .@key$ ) + ".^000000";
+	next;
+	switch(select("^4d4dffOpen the box 1 time (1 " + .@keyname$ + ")^000000","^4d4dffOpen the box 10 times (10 " + .@keyname$ + "s)^000000")) {
+		case 1:
+			mes "^FF0000[Notice]^000000";
+			mes "^FF0000Exchange one random item with one " + .@keyname$ + ".^000000";
+			mes "^FF0000The item exchanged above cannot be withdrawn, nor can it be exchanged to " + .@keyname$ + ".^000000";
+			next;
+			if(select("Keep going.","Stop conversation.") == 2) {
+				mes "You have decided not to open the Box.";
+				close;
+			} else if (countitem(.@key$) < 1) {
+				mes "Not enough " + mesitemlink( .@key$ ) + ".";
+				close;
+			} else {
+				if (checkweight(1201,1) == 0 || ((MaxWeight - Weight) * 100 / MaxWeight) < 10) {
+					mes "^4d4dffPlease make sure you have enough space in your inventory.^000000";
+					close;
+				}
+				delitem(.@key$, 1);
+				consumeitem(.@box$);
+				mes .@boxname$ + " was opened!";
+				mes "Were you lucky?";
+				specialeffect2 EF_VALLENTINE;
+				close;
+			}
+		case 2:
+			mes "^FF0000[Notice]^000000";
+			mes "^FF0000Exchange 10 random items with 10 " + .@keyname$ + "s.^000000";
+			mes "^FF0000The items exchanged above cannot be withdrawn, nor can it be exchanged to " + .@keyname$ + ".^000000";
+			next;
+			if(select("Keep going.","Stop conversation.") == 2) {
+				mes "You have decided not to open the Box.";
+				close;
+			} else if (countitem(.@key$) < 10) {
+				mes "You do not have enough " + mesitemlink( .@key$ ) + ".";
+				close;
+			} else {
+				for (.@i = 1; .@i <= 10; ++.@i) {
+					progressbar "4d4dff",2;
+					if (checkweight(1201,1) == 0 || ((MaxWeight - Weight) * 100 / MaxWeight) < 10) {
+						mes "^4d4dffPlease make sure you have enough space in your inventory.^000000";
+						close;
+					}
+					if (countitem(.@key$) < 1) { // Custom check, just in case
+						close;
+					}
+					delitem(.@key$, 1);
+					consumeitem(.@box$);
+					dispbottom .@boxname$ + " was opened " + .@i + " times. Another one is being opened.",0xFFFFFF;
+					specialeffect2 EF_VALLENTINE;
+				}
+				mes .@boxname$ + " was opened 10 times!";
+				mes "Were you lucky?";
+				close;
+			}
+	}
+}

+ 1 - 1
npc/re/quests/cupet.txt

@@ -215,7 +215,7 @@ function	script	cute_pet_manager	{
 		mes "[Cute Pet Manager]";
 		mes "You have chosen " + getitemname(.@tame_id) + ".";
 		mes "You can use it for taming";
-		mes "^FF0000" + strmobinfo(1,.@mob_id) + "^000000 monsters.";
+		mes "^FF0000" + getmonsterinfo(.@mob_id, MOB_NAME) + "^000000 monsters.";
 		next;
 		mes "[Cute Pet Manager]";
 		mes "Bring ^FF0000" + .@hunt_amount + " " + getitemname(.@hunt_id) + "^000000" + (.@hunt_id2 ? ", ^FF0000" + .@hunt_amount2 + " " + getitemname(.@hunt_id2) : "") + " ^000000 and ^FF00001 Dolly Capsule^000000";

+ 2 - 0
npc/re/scripts_athena.conf

@@ -69,6 +69,7 @@ npc: npc/re/instances/BuwayaCave.txt
 npc: npc/re/instances/CentralLaboratory.txt
 npc: npc/re/instances/CharlestonCrisis.txt
 npc: npc/re/instances/CorOperation.txt
+npc: npc/re/instances/DeepForest.txt
 npc: npc/re/instances/DevilTower.txt
 npc: npc/re/instances/EclageInterior.txt
 npc: npc/re/instances/EddaHalfMoonInTheDaylight.txt
@@ -191,6 +192,7 @@ npc: npc/re/other/resetskill.txt
 npc: npc/re/other/stone_change.txt
 npc: npc/re/other/turbo_track.txt
 npc: npc/re/other/CashShop_Functions.txt
+npc: npc/re/other/kachua_key.txt
 
 // --------------------------- Quests ---------------------------
 // - Eden Group -------------------------------------------------

+ 2 - 0
npc/re/scripts_jobs.conf

@@ -38,6 +38,8 @@ npc: npc/re/jobs/novice/academy.txt
 npc: npc/re/jobs/novice/supernovice_ex.txt
 // - Job Repairs
 npc: npc/re/jobs/repair.txt
+// - Doram
+npc: npc/re/jobs/doram/spirit_handler.txt
 
 // ------------------------ Skill Quests ------------------------
 npc: npc/re/quests/skills/merchant_skills.txt

+ 3 - 2
sql-files/main.sql

@@ -285,6 +285,7 @@ CREATE TABLE IF NOT EXISTS `char` (
   `inventory_slots` smallint(6) NOT NULL default '100',
   `body_direction` tinyint(1) unsigned NOT NULL default '0',
   `disable_call` tinyint(3) unsigned NOT NULL default '0',
+  `disable_partyinvite` tinyint(1) unsigned NOT NULL default '0',
   PRIMARY KEY  (`char_id`),
   UNIQUE KEY `name_key` (`name`),
   KEY `account_id` (`account_id`),
@@ -1063,7 +1064,7 @@ CREATE TABLE IF NOT EXISTS `skillcooldown_homunculus` (
   `homun_id` int(11) NOT NULL,
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `tick` bigint(20) NOT NULL,
-  PRIMARY KEY (`homun_id`)
+  PRIMARY KEY (`homun_id`,`skill`)
 ) ENGINE=MyISAM;
 
 --
@@ -1074,7 +1075,7 @@ CREATE TABLE IF NOT EXISTS `skillcooldown_mercenary` (
   `mer_id` int(11) NOT NULL,
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `tick` bigint(20) NOT NULL,
-  PRIMARY KEY (`mer_id`)
+  PRIMARY KEY (`mer_id`,`skill`)
 ) ENGINE=MyISAM;
 
 --

+ 2 - 0
sql-files/mob_db.sql

@@ -67,6 +67,8 @@ CREATE TABLE `mob_db` (
   `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 2 - 0
sql-files/mob_db2.sql

@@ -67,6 +67,8 @@ CREATE TABLE `mob_db2` (
   `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

+ 2 - 0
sql-files/mob_db2_re.sql

@@ -69,6 +69,8 @@ CREATE TABLE `mob_db2_re` (
   `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_lasagna` tinyint(1) unsigned DEFAULT NULL,
+  `racegroup_glast_heim_abyss` tinyint(1) unsigned DEFAULT NULL,
   `element` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است