Browse Source

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 months ago
parent
commit
934f469ecd
100 changed files with 10356 additions and 893 deletions
  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).
 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.
 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.
 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!
 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.
   * 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 )
 if ( NOT ENABLE_WEB_SERVER )
     return()
     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
 set (JSON_INCLUDE_DIRS
     "${CMAKE_CURRENT_SOURCE_DIR}/include"
     "${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)
 include(./ext/c4core/cmake/c4Project.cmake)
 project(ryml
 project(ryml
     DESCRIPTION "Rapid YAML parsing and emitting"
     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)
 project(fast_float VERSION 3.4.0 LANGUAGES CXX)
 option(FASTFLOAT_TEST "Enable tests" OFF)
 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
 ## start setting
 SET (this_target yaml-cpp)
 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 )
 set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
-cmake_minimum_required( VERSION 3.1 )
+cmake_minimum_required( VERSION 3.13 )
 project( rAthena )
 project( rAthena )
 if( CYGWIN )
 if( CYGWIN )
 	unset( WIN32 )
 	unset( WIN32 )

+ 463 - 16
conf/atcommands.yml

@@ -39,10 +39,17 @@ Body:
   - Command: accinfo
   - Command: accinfo
     Aliases:
     Aliases:
       - accountinfo
       - 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
   - Command: addfame
     Aliases:
     Aliases:
       - famepoint
       - famepoint
       - famepoints
       - famepoints
+    Help: |
+      Params: <amount>.
+      Adds or reduces the player's fame points by <amount>.
   - Command: addperm
   - Command: addperm
     Help: |
     Help: |
       Params: <permission_name>
       Params: <permission_name>
@@ -54,6 +61,10 @@ Body:
     Help: |
     Help: |
       Params: <level> <char name>
       Params: <level> <char name>
       Do a temporary adjustment of the group level of a player.
       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
   - Command: agi
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
@@ -61,12 +72,27 @@ Body:
   - Command: agitend
   - Command: agitend
     Help: |
     Help: |
       End War of Emperium
       End War of Emperium
+  - Command: agitend2
+    Help: |
+      End War of Emperium SE
+  - Command: agitend3
+    Help: |
+      End War of Emperium TE
   - Command: agitstart
   - Command: agitstart
     Help: |
     Help: |
       Starts War of Emperium
       Starts War of Emperium
+  - Command: agitstart2
+    Help: |
+      Starts War of Emperium SE
+  - Command: agitstart3
+    Help: |
+      Starts War of Emperium TE
   - Command: alive
   - Command: alive
     Help: |
     Help: |
       Revives yourself from death.
       Revives yourself from death.
+  - Command: allowks
+    Help: |
+      Enables or disables kill stealing on this map.
   - Command: allskill
   - Command: allskill
     Aliases:
     Aliases:
       - allskills
       - allskills
@@ -74,6 +100,9 @@ Body:
       - skillsall
       - skillsall
     Help: |
     Help: |
       Give you all skills.
       Give you all skills.
+  - Command: auction
+    Help: |
+      Opens the auction window.
   - Command: autoloot
   - Command: autoloot
     Help: |
     Help: |
       Params: <on|off|#>
       Params: <on|off|#>
@@ -81,14 +110,36 @@ Body:
   - Command: autolootitem
   - Command: autolootitem
     Aliases:
     Aliases:
       - alootid
       - 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
   - Command: autoloottype
     Aliases:
     Aliases:
       - aloottype
       - 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
   - Command: autotrade
     Aliases:
     Aliases:
       - at
       - at
     Help: |
     Help: |
       Allows you to vend while you are offline.
       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
   - Command: baselevelup
     Aliases:
     Aliases:
       - baselevel
       - baselevel
@@ -101,6 +152,14 @@ Body:
     Help: |
     Help: |
       Params: <number of levels>
       Params: <number of levels>
       Raises your base level the desired 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
   - Command: broadcast
     Help: |
     Help: |
       Params: <message>
       Params: <message>
@@ -111,6 +170,17 @@ Body:
       - setcamera
       - setcamera
     Help: |
     Help: |
       Shows or updates the client's camera settings.
       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
   - Command: cash
     Help: |
     Help: |
       Params: <amount> - Gives you the specified amount of cash points.
       Params: <amount> - Gives you the specified amount of cash points.
@@ -130,18 +200,35 @@ Body:
   - Command: channel
   - Command: channel
     Aliases:
     Aliases:
       - main
       - 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
   - Command: changesex
     Help: |
     Help: |
-      Changes your gender.
+      Changes your account's gender.
   - Command: char_ban
   - Command: char_ban
     Aliases:
     Aliases:
-      - ban
-      - banish
       - charban
       - charban
     Help: |
     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)
       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
   - Command: char_block
     Aliases:
     Aliases:
       - block
       - block
@@ -151,16 +238,48 @@ Body:
   - Command: char_unban
   - Command: char_unban
     Aliases:
     Aliases:
       - charunban
       - charunban
-      - unban
-      - unbanish
     Help: |
     Help: |
-      Params: <name> - Unban an account
+      Params: <name>
+      Unban a character
   - Command: char_unblock
   - Command: char_unblock
     Aliases:
     Aliases:
       - unblock
       - unblock
     Help: |
     Help: |
       Params: <char name>
       Params: <char name>
       Unblocks an account.
       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
   - Command: clone
     Help: |
     Help: |
       Params: <charname>
       Params: <charname>
@@ -168,9 +287,17 @@ Body:
   - Command: cloneequip
   - Command: cloneequip
     Aliases:
     Aliases:
       - eqclone
       - eqclone
+    Help: |
+      Params: <char name>
+      Params: <char ID>
+      Copies the equipment of player <char name/char ID>.
   - Command: clonestat
   - Command: clonestat
     Aliases:
     Aliases:
       - stclone
       - stclone
+    Help: |
+      Params: <char name>
+      Params: <char ID>
+      Copies the status values of player <char name/char ID>.
   - Command: clouds
   - Command: clouds
     Help: |
     Help: |
       Makes all maps to have the cloudy weather effect.
       Makes all maps to have the cloudy weather effect.
@@ -179,11 +306,25 @@ Body:
       Makes all maps to have another cloudy weather effect.
       Makes all maps to have another cloudy weather effect.
   - Command: commands
   - Command: commands
     Help: |
     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
   - Command: con
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
       Raises CON by given 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
   - Command: crt
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
@@ -191,6 +332,11 @@ Body:
   - Command: day
   - Command: day
     Help: |
     Help: |
       Disables night mode and restores regular lighting, all characters are affected.
       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
   - Command: dex
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
@@ -199,9 +345,30 @@ Body:
     Help: |
     Help: |
       Params: <monster name|ID>
       Params: <monster name|ID>
       Change your appearence to other players to a mob.
       Change your appearence to other players to a mob.
+  - Command: disguiseall
+    Help: |
+      Params: <monster name|ID>
+      Disguises all online characters.
   - Command: disguiseguild
   - Command: disguiseguild
     Help: |
     Help: |
+      Params: <monster name|ID>
       Disguises all online characters of a guild.
       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
   - Command: divorce
     Help: |
     Help: |
       Divorce player.
       Divorce player.
@@ -235,6 +402,10 @@ Body:
   - Command: enchantgradeui
   - Command: enchantgradeui
     Help: |
     Help: |
       Opens the enchantgrade UI.
       Opens the enchantgrade UI.
+  - Command: erasequest
+    Help: |
+      Params: <quest ID>
+      Removes the quest <quest ID> from the quest log.
   - Command: evilclone
   - Command: evilclone
     Help: |
     Help: |
       Params: <charname>
       Params: <charname>
@@ -246,16 +417,42 @@ Body:
     Help: |
     Help: |
       Params: <name>
       Params: <name>
       Changes your name to your choice temporarily.
       Changes your name to your choice temporarily.
+  - Command: feelreset
+    Help: |
+      Resets a Star Gladiator's marked maps.
   - Command: fireworks
   - Command: fireworks
     Help: |
     Help: |
       Makes all maps to have the fireworks weather effect.
       Makes all maps to have the fireworks weather effect.
   - Command: fog
   - Command: fog
     Help: |
     Help: |
       Makes all maps to have the fog weather effect.
       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
   - Command: follow
     Help: |
     Help: |
       Params: <char name>
       Params: <char name>
       Follow a player.
       Follow a player.
+  - Command: fullstrip
+    Help: |
+      Params: <char name>
+      Unequips all items currently equipped by <char name>.
   - Command: gat
   - Command: gat
     Help: |
     Help: |
       For debugging (you inspect around gat)
       For debugging (you inspect around gat)
@@ -307,7 +504,8 @@ Body:
       Warps all online characters of a guild to you.
       Warps all online characters of a guild to you.
   - Command: guildspy
   - Command: guildspy
     Help: |
     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
   - Command: guildstorage
     Aliases:
     Aliases:
       - gstorage
       - gstorage
@@ -340,6 +538,9 @@ Body:
   - Command: hatch
   - Command: hatch
     Help: |
     Help: |
       Create a pet from your inventory eggs list.
       Create a pet from your inventory eggs list.
+  - Command: hatereset
+    Help: |
+      Resets a Star Gladiator's marked monsters.
   - Command: heal
   - Command: heal
     Help: |
     Help: |
       Params: [<HP> <SP>]
       Params: [<HP> <SP>]
@@ -364,12 +565,48 @@ Body:
   - Command: homevolution
   - Command: homevolution
     Aliases:
     Aliases:
       - homevolve
       - 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
   - Command: homlevel
     Aliases:
     Aliases:
       - hlvl
       - hlvl
       - hlevel
       - hlevel
       - homlvl
       - homlvl
       - homlvup
       - 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
   - Command: idsearch
     Help: |
     Help: |
       Params: <part_of_item_name>
       Params: <part_of_item_name>
@@ -389,12 +626,37 @@ Body:
     Help: |
     Help: |
       Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>
       Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>
       Gives you the desired item.
       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
   - Command: iteminfo
     Aliases:
     Aliases:
       - ii
       - ii
     Help: |
     Help: |
       Params: <item name|ID>
       Params: <item name|ID>
       Shows item info (type, price etc).
       Shows item info (type, price etc).
+  - Command: itemlist
+    Aliases:
+      - inventorylist
+    Help: |
+      Displays a list of items in the inventory.
   - Command: itemreset
   - Command: itemreset
     Aliases:
     Aliases:
       - clearinventory
       - clearinventory
@@ -402,7 +664,15 @@ Body:
       Remove all your items.
       Remove all your items.
   - Command: jail
   - Command: jail
     Help: |
     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
   - Command: jobchange
     Aliases:
     Aliases:
       - job
       - job
@@ -476,6 +746,10 @@ Body:
     Help: |
     Help: |
       Params: <number of levels>
       Params: <number of levels>
       Raises your job level the desired 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
   - Command: jump
     Help: |
     Help: |
       Params: [<x> [<y>]]
       Params: [<x> [<y>]]
@@ -495,6 +769,10 @@ Body:
     Help: |
     Help: |
       Params: <message>
       Params: <message>
       Broadcasts a message without your name (in blue).
       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
   - Command: kick
     Help: |
     Help: |
       Params: <char name>
       Params: <char name>
@@ -509,7 +787,10 @@ Body:
       Kills player.
       Kills player.
   - Command: killable
   - Command: killable
     Help: |
     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
   - Command: killmonster
     Help: |
     Help: |
       Params: <map>
       Params: <map>
@@ -520,6 +801,12 @@ Body:
   - Command: ksprotection
   - Command: ksprotection
     Aliases:
     Aliases:
       - noks
       - 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
   - Command: langtype
     Help: |
     Help: |
       Params: <language>
       Params: <language>
@@ -533,6 +820,10 @@ Body:
   - Command: limitedsale
   - Command: limitedsale
     Help: |
     Help: |
       Opens the limited sale window.
       Opens the limited sale window.
+  - Command: lkami
+    Help: |
+      Params: <message>
+      Broadcasts a message without your name on the current map (in yellow).
   - Command: load
   - Command: load
     Aliases:
     Aliases:
       - return
       - return
@@ -574,6 +865,10 @@ Body:
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
       Raises LUK by given amount.
       Raises LUK by given amount.
+  - Command: macrochecker
+    Help: |
+      Params: <mapname>
+      Trigger a macro detection on all players of the given map.
   - Command: mail
   - Command: mail
     Help: |
     Help: |
       Open mail box.
       Open mail box.
@@ -581,12 +876,22 @@ Body:
     Help: |
     Help: |
       Params: <pet_id>
       Params: <pet_id>
       Gives pet egg for monster number in pet DB
       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
   - Command: mapexit
     Help: |
     Help: |
       Kick all players and shut down map-server.
       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
   - Command: mapinfo
     Help: |
     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
   - Command: mapmove
     Aliases:
     Aliases:
       - rura
       - rura
@@ -606,6 +911,21 @@ Body:
     Help: |
     Help: |
       Params: [memo position]
       Params: [memo position]
       Set/change a memo location (no position: display memo points).
       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
   - Command: mobinfo
     Aliases:
     Aliases:
       - monsterinfo
       - monsterinfo
@@ -636,6 +956,8 @@ Body:
   - Command: monsterignore
   - Command: monsterignore
     Aliases:
     Aliases:
       - battleignore
       - battleignore
+    Help: |
+      Makes the player unattackable by monsters, other players, etc.
   - Command: monstersmall
   - Command: monstersmall
     Help: |
     Help: |
       Params: <monster name|ID>
       Params: <monster name|ID>
@@ -649,9 +971,16 @@ Body:
   - Command: mount2
   - Command: mount2
     Help: |
     Help: |
       Give/remove a cash mount.
       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
   - Command: mutearea
     Aliases:
     Aliases:
       - stfu
       - 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
   - Command: night
     Help: |
     Help: |
       Enables night mode on all maps, all characters are affected.
       Enables night mode on all maps, all characters are affected.
@@ -690,10 +1019,18 @@ Body:
     Help: |
     Help: |
       Params: <party_name>
       Params: <party_name>
       Create a party.
       Create a party.
+  - Command: partyoption
+    Help: |
+      Params: <item sharing> <item distribution> - yes/no
+      Changes party options for item sharing and item distribution.
   - Command: partyrecall
   - Command: partyrecall
     Help: |
     Help: |
       Params: <party name|ID>
       Params: <party name|ID>
       Warps all online characters of a party to you.
       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
   - Command: partyspy
     Help: |
     Help: |
       @partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)
       @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
   - Command: refine
     Help: |
     Help: |
       Params: <equip position> <+/- amount>
       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
   - Command: reject
     Help: |
     Help: |
-      Rejects an invitation to a duel.
+      Automatically reject duel invitations.
   - Command: reloadachievementdb
   - Command: reloadachievementdb
     Help: |
     Help: |
       Reload achievement database.
       Reload achievement database.
@@ -788,6 +1137,9 @@ Body:
   - Command: reloadattendancedb
   - Command: reloadattendancedb
     Help: |
     Help: |
       Reload attendance database.
       Reload attendance database.
+  - Command: reloadbarterdb
+    Help: |
+      Reload the barter database.
   - Command: reloadbattleconf
   - Command: reloadbattleconf
     Help: |
     Help: |
       Reload battle settings.
       Reload battle settings.
@@ -802,6 +1154,9 @@ Body:
   - Command: reloaditemdb
   - Command: reloaditemdb
     Help: |
     Help: |
       Reload item database.
       Reload item database.
+  - Command: reloadlogconf
+    Help: |
+      Reload the log settings.
   - Command: reloadmobdb
   - Command: reloadmobdb
     Help: |
     Help: |
       Reload monster database.
       Reload monster database.
@@ -811,6 +1166,10 @@ Body:
   - Command: reloadmsgconf
   - Command: reloadmsgconf
     Help: |
     Help: |
       Reload message configuration.
       Reload message configuration.
+  - Command: reloadnpcfile
+    Help: |
+      Params: <path> - path to script
+      Unloads and loads a script file from <path>.
   - Command: reloadpcdb
   - Command: reloadpcdb
     Help: |
     Help: |
       Reload player settings.
       Reload player settings.
@@ -833,6 +1192,9 @@ Body:
     Help: |
     Help: |
       Params: <message>
       Params: <message>
       Sends a message to all connected GMs (via the gm whisper system)
       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
   - Command: resetcooltime
     Aliases:
     Aliases:
       - resetcooldown
       - resetcooldown
@@ -841,9 +1203,16 @@ Body:
   - Command: resetskill
   - Command: resetskill
     Aliases:
     Aliases:
       - skreset
       - skreset
+    Help: |
+      Resets the player's skill points.
   - Command: resetstat
   - Command: resetstat
     Aliases:
     Aliases:
       - streset
       - 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
   - Command: rmvperm
     Help: |
     Help: |
       Params: <permission_name>
       Params: <permission_name>
@@ -868,19 +1237,42 @@ Body:
       - time
       - time
     Help: |
     Help: |
       Shows the date and time of the server.
       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: |
     Help: |
       Adds a card or enchant to the specific slot of the equipment.
       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
   - Command: showdelay
     Help: |
     Help: |
       Shows/hides the "There is a delay after this skill" message.
       Shows/hides the "There is a delay after this skill" message.
   - Command: showexp
   - Command: showexp
     Help: |
     Help: |
       Displays/hides experience gained.
       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
   - Command: shownpc
     Help: |
     Help: |
       Params: <NPC name>
       Params: <NPC name>
       Enable a NPC.
       Enable a NPC.
+  - Command: showrate
+    Help: |
+      Enable or disable to show the rate information on every mapchange.
   - Command: showzeny
   - Command: showzeny
     Help: |
     Help: |
       Displays/hides Zeny gained.
       Displays/hides Zeny gained.
@@ -919,6 +1311,10 @@ Body:
   - Command: snow
   - Command: snow
     Help: |
     Help: |
       Makes all maps to have the snow weather effect.
       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
   - Command: sound
     Help: |
     Help: |
       Params: <path to file in data folder or GRF file>
       Params: <path to file in data folder or GRF file>
@@ -948,6 +1344,9 @@ Body:
     Help: |
     Help: |
       Params: <value>
       Params: <value>
       Adds value in all stats (maximum if no value).
       Adds value in all stats (maximum if no value).
+  - Command: stats
+    Help: |
+      Displays the stats of the player in your chat.
   - Command: statuspoint
   - Command: statuspoint
     Aliases:
     Aliases:
       - stpoint
       - stpoint
@@ -963,10 +1362,25 @@ Body:
   - Command: storeall
   - Command: storeall
     Help: |
     Help: |
       Puts all your possessions in storage.
       Puts all your possessions in storage.
+  - Command: storagelist
+    Help: |
+      Displays a list of items in the storage.
   - Command: str
   - Command: str
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
       Raises STR by given 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
   - Command: trade
     Help: |
     Help: |
       Params: <char name> - Open a trade window with a another player
       Params: <char name> - Open a trade window with a another player
@@ -984,9 +1398,17 @@ Body:
       - trpoint
       - trpoint
     Help: |
     Help: |
       Params: <number of points> - Gives you the desired number of trait stat points.
       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
   - Command: undisguise
     Help: |
     Help: |
       Restore your normal appearance.
       Restore your normal appearance.
+  - Command: undisguiseall
+    Help: |
+      Restore the normal appearance of all connected players.
   - Command: undisguiseguild
   - Command: undisguiseguild
     Help: |
     Help: |
       Restore the normal appearance of all characters of a guild.
       Restore the normal appearance of all characters of a guild.
@@ -1004,9 +1426,16 @@ Body:
     Help: |
     Help: |
       Params: <path>
       Params: <path>
       Unload the specified script file path.
       Unload the specified script file path.
+  - Command: unmute
+    Help: |
+      Params: <char name>
+      Unmutes the player <char name>.
   - Command: uptime
   - Command: uptime
     Help: |
     Help: |
       Displays how long the server has been online.
       Displays how long the server has been online.
+  - Command: users
+    Help: |
+      Displays the distribution of players on the server per map.
   - Command: useskill
   - Command: useskill
     Help: |
     Help: |
       Params: <skillid> <skillv> <target>
       Params: <skillid> <skillv> <target>
@@ -1014,6 +1443,11 @@ Body:
   - Command: version
   - Command: version
     Help: |
     Help: |
       Displays SVN version of the server.
       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
   - Command: vit
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>
@@ -1022,6 +1456,10 @@ Body:
     Help: |
     Help: |
       Params: <char name>
       Params: <char name>
       Tells you the location of a character.
       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
   - Command: who
     Aliases:
     Aliases:
       - whois
       - whois
@@ -1045,7 +1483,16 @@ Body:
       Params: [match_text] - Like @who+@who2+who3, but only for GM.
       Params: [match_text] - Like @who+@who2+who3, but only for GM.
   - Command: whomap
   - Command: whomap
     Help: |
     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
   - Command: wis
     Help: |
     Help: |
       Params: <amount>
       Params: <amount>

+ 7 - 6
conf/battle/battle.conf

@@ -24,12 +24,13 @@ enable_critical: 17
 mob_critical_rate: 100
 mob_critical_rate: 100
 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)
 // 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.
 // 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)
 // packets for the desired number. (Note 1)
 client_reshuffle_dice: yes
 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.
 // NOTE: Enabling this option degrades performance.
 client_sort_storage: no
 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.
 // Amount of time in minutes that the punishment type is active for. Use 0 for infinite.
 // Official: 0
 // Official: 0
 macro_detection_punishment_time: 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)
 // (eg: if set at 5, the max bonus is 4*bonus-per-char regardless of attackers)
 exp_bonus_max_attacker: 12
 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 bonus exp rate. (Note 2)
 mvp_exp_rate: 100
 mvp_exp_rate: 100
 
 

+ 9 - 0
conf/battle/feature.conf

@@ -165,6 +165,15 @@ feature.mesitemlink_brackets: no
 // Default: no
 // Default: no
 feature.mesitemlink_dbname: 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)
 // Stylist UI (Note 1)
 // Requires: 2015-11-04 or later
 // Requires: 2015-11-04 or later
 feature.stylist: on
 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)
 // The HP rate of normal monsters (that is monsters that are not MVP's) (Note 2)
 monster_hp_rate: 100
 monster_hp_rate: 100
 
 
-// The maximum attack speed of a monster
-monster_max_aspd: 199
-
 // Defines various mob AI related settings. (Note 3)
 // 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
 // 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
 //         are attacked and they can't attack back regardless of how they were
 //         attacked (eg: GrimTooth), otherwise, their "rude attack" is only activated
 //         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 
 // 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
 //         have players on them, instead of only for mobs who are in the vicinity
 //         of players.
 //         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
 // 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
 //         by normal attacks. Set this if you want mobs to also switch targets when
 //         hit by skills.
 //         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
 //         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"
 //         officially it would only use it after already having used "Blind Attack"
 //         at range 0-7.
 //         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.
 // Example: 0x140 -> Chase players through warps + use skills in random order.
 monster_ai: 0
 monster_ai: 0
 
 
 // How often should a monster rethink its chase?
 // How often should a monster rethink its chase?
 // 0: Every 100ms (MIN_MOBTHINKTIME)
 // 0: Every 100ms (MIN_MOBTHINKTIME)
 // 1: Every cell moved
 // 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)?
 // Should mobs be able to be warped (add as needed)?
 // 0: Disable.
 // 0: Disable.
@@ -81,8 +83,11 @@ mob_warp: 0
 
 
 // Defines the time (in ms) during which monsters will have their AI active
 // Defines the time (in ms) during which monsters will have their AI active
 // after all players have left their vicinity.
 // 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)
 // Mobs and Pets view-range adjustment (range2 column in the mob_db) (Note 2)
 view_range_rate: 100
 view_range_rate: 100
@@ -98,6 +103,16 @@ chase_range_rate: 100
 // be increased by that number.
 // be increased by that number.
 monster_eye_range_bonus: 0
 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)
 // Allow monsters to be aggresive and attack first? (Note 1)
 monster_active_enable: yes
 monster_active_enable: yes
 
 
@@ -181,6 +196,7 @@ randomize_center_cell: yes
 slaves_inherit_mode: 4
 slaves_inherit_mode: 4
 
 
 // Do summon slaves have the same walking speed as their master?
 // 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.
 // NOTE: The default is 3 for official servers.
 // 0: Never.
 // 0: Never.
 // 1: If the master can walk
 // 1: If the master can walk
@@ -189,6 +205,17 @@ slaves_inherit_mode: 4
 // 3: Always
 // 3: Always
 slaves_inherit_speed: 3
 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
 // Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
 // chance of triggering the master's autospell cards? (Note 1)
 // chance of triggering the master's autospell cards? (Note 1)
 summons_trigger_autospells: yes
 summons_trigger_autospells: yes
@@ -244,9 +271,6 @@ mob_npc_event_type: 1
 // will be reduced to 0.
 // will be reduced to 0.
 ksprotection: 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.
 // Whether or not to spawn the mvp tomb.
 // See http://irowiki.org/wiki/MVP#Gravestone
 // See http://irowiki.org/wiki/MVP#Gravestone
 mvp_tomb_enabled: yes
 mvp_tomb_enabled: yes
@@ -303,10 +327,6 @@ boss_nopc_move_rate: 100
 // Area is limited to area_size battle config.
 // Area is limited to area_size battle config.
 achievement_mob_share: no
 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.
 // Absolute minimum respawn time in milliseconds of a monster.
 // Also used in delaying the spawning of guardians when a guild is not loaded.
 // Also used in delaying the spawning of guardians when a guild is not loaded.
 // Default (Official): 1000
 // 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)
 // Automatic healing skill's time interval. (in milliseconds)
 natural_heal_skill_interval: 10000
 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)
 // Maximum atk speed. (Default 190, Highest allowed 199)
 max_aspd: 190
 max_aspd: 190
@@ -106,8 +115,8 @@ max_third_parameter: 130
 max_third_trans_parameter: 130
 max_third_trans_parameter: 130
 max_baby_parameter: 80
 max_baby_parameter: 80
 max_baby_third_parameter: 117
 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
 max_fourth_parameter: 130
 
 
 // Status points bonus for transcendent class
 // 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.
 // Note: Setting this to anything above 0 can stop speedhacks.
 min_skill_delay_limit: 100
 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.
 // 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 
 // 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
 // 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
 // Default on official servers: 0 for Pre-renewal, 2 for Renewal
 //traps_setting: 0
 //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.
 // 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 
 //    (eg: forbid summoning anything except hydras when there's already 
 //     one hydra out)
 //     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)
 // Whether placed down skills will check walls (Note 1)
 // (ex. Storm Gust cast against a wall will not hit the other side.) 
 // (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
 // Episode 21
 map: 1@ep21a
 map: 1@ep21a
 map: 1@ep21b
 map: 1@ep21b
+map: 1@ep21c
 map: 1@mdtem
 map: 1@mdtem
 map: 1@twbs2
 map: 1@twbs2
 map: 1@wtgs
 map: 1@wtgs

+ 8 - 5
conf/msg_conf/map_msg.conf

@@ -733,9 +733,9 @@
 701: Invalid time for VIP command.
 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.
 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.
 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
 707: You are VIP until: %s
 708: The player is now VIP until: %s
 708: The player is now VIP until: %s
 
 
@@ -1400,8 +1400,8 @@
 1245:  Drops:
 1245:  Drops:
 1246: This monster has no drops.
 1246: This monster has no drops.
 1247:  MVP Bonus EXP:%llu
 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
 // @showmobs
 1250: Invalid mob id %s!
 1250: Invalid mob id %s!
@@ -1826,5 +1826,8 @@
 1536: Log configuration has been reloaded.
 1536: Log configuration has been reloaded.
 1537: Found skill '%s', unblocking...
 1537: Found skill '%s', unblocking...
 
 
+//@macrochecker
+1538: Macro detection has been started on %d players.
+
 //Custom translations
 //Custom translations
 import: conf/msg_conf/import/map_msg_eng_conf.txt
 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.
 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.
 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.
 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
 707: VIP anda berlaku hingga: %s
 708: Status VIP pemain aktif 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.
 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.
 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.
 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
 707: Você é VIP até: %s
 708: O jogador agora é 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.
 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.
 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.
 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
 707: Serás VIP hasta: %s
 708: El jugador será VIP hasta: %s
 708: El jugador será VIP hasta: %s
 
 
@@ -1561,7 +1561,7 @@
 1343: casco,
 1343: casco,
 1344: boca/casco,
 1344: boca/casco,
 1345: boca,
 1345: boca,
-1345: ojos/orejas,
+1346: ojos/orejas,
 1347: boca/ojos/orejas/casco,
 1347: boca/ojos/orejas/casco,
 1348:  -> (huevo de mascota, ID de la mascota: %u, nombre cambiado)
 1348:  -> (huevo de mascota, ID de la mascota: %u, nombre cambiado)
 1349:  -> (huevo de mascota, ID de la mascota: %u, sin 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)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 #Body:
 #Body:
 ###########################################################################
 ###########################################################################

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

@@ -46,6 +46,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
 //	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:
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /
 //	    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.
 # 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
 #   https://rathena.org - https://github.com/rathena
 #
 #
 # This program is free software: you can redistribute it and/or modify
 # 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)
 #   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)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
 #     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)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
 #     - Level                 Skill level.
@@ -140,4 +140,4 @@
 
 
 Header:
 Header:
   Type: SKILL_DB
   Type: SKILL_DB
-  Version: 3
+  Version: 4

+ 4 - 1
db/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Footer:
 Footer:
   Imports:
   Imports:

BIN
db/map_cache.dat


+ 1 - 0
db/map_index.txt

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

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

@@ -9800,6 +9800,7 @@ Body:
       bonus2 bHPDrainRate,1000,100;
       bonus2 bHPDrainRate,1000,100;
       bonus2 bSPDrainRate,1000,20;
       bonus2 bSPDrainRate,1000,20;
       bonus bHealPower,200;
       bonus bHealPower,200;
+      bonus bAspdRate,100;
       bonus2 bAddClass,Class_All,100;
       bonus2 bAddClass,Class_All,100;
       skill "WZ_STORMGUST",10;
       skill "WZ_STORMGUST",10;
       Skill "WZ_METEOR",10;
       Skill "WZ_METEOR",10;
@@ -15229,11 +15230,11 @@ Body:
       Left_Hand: true
       Left_Hand: true
     ArmorLevel: 1
     ArmorLevel: 1
     EquipLevelMin: 1
     EquipLevelMin: 1
-    Refineable: true
     View: 1
     View: 1
     Script: |
     Script: |
       bonus bAllStats,50;
       bonus bAllStats,50;
       bonus bMdef,99;
       bonus bMdef,99;
+      bonus bUnbreakableShield;
       bonus bShortWeaponDamageReturn,100;
       bonus bShortWeaponDamageReturn,100;
       bonus2 bSubRace,RC_DemiHuman,95;
       bonus2 bSubRace,RC_DemiHuman,95;
       bonus2 bSubRace,RC_Player_Human,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)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

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

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

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

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

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

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

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

@@ -47,6 +47,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
 //	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:
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /
 //	    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_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_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,
 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,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_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@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@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,
 1143,Marionette@NPC_TELEKINESISATTACK,attack,191,5,500,0,5000,yes,target,always,0,,,,,,6,

File diff suppressed because it is too large
+ 19 - 110
db/pre-re/skill_db.yml


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

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

+ 7 - 0
db/re/instance_db.yml

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

File diff suppressed because it is too large
+ 304 - 304
db/re/item_combos.yml


File diff suppressed because it is too large
+ 666 - 64
db/re/item_db_equip.yml


File diff suppressed because it is too large
+ 693 - 44
db/re/item_db_etc.yml


File diff suppressed because it is too large
+ 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.
 # 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
 #   https://rathena.org - https://github.com/rathena
 #
 #
 # This program is free software: you can redistribute it and/or modify
 # This program is free software: you can redistribute it and/or modify
@@ -11341,6 +11341,198 @@ Body:
                 Amount: 35
                 Amount: 35
               - Material: Snow_F_Stone3
               - Material: Snow_F_Stone3
                 Amount: 50
                 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
           - Item: Glacier_F_Orb_156
             Materials:
             Materials:
               - Material: Snow_F_Stone2
               - Material: Snow_F_Stone2
@@ -15141,6 +15333,198 @@ Body:
                 Amount: 15
                 Amount: 15
               - Material: EP19_S_F_3_Extract
               - Material: EP19_S_F_3_Extract
                 Amount: 25
                 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
       - Slot: 2
         PerfectEnchants:
         PerfectEnchants:
           - Item: Glacier_F_Orb_81
           - Item: Glacier_F_Orb_81
@@ -15743,6 +16127,198 @@ Body:
                 Amount: 20
                 Amount: 20
               - Material: EP19_S_F_3_Extract
               - Material: EP19_S_F_3_Extract
                 Amount: 35
                 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
       - Slot: 1
         PerfectEnchants:
         PerfectEnchants:
           - Item: Physical_Grade_1
           - Item: Physical_Grade_1
@@ -32894,6 +33470,9 @@ Body:
       Time_Gap_ABC_Dagger: true
       Time_Gap_ABC_Dagger: true
       Time_Gap_SH_Foxtail: true
       Time_Gap_SH_Foxtail: true
       Time_Gap_IQ_Knuckle: true
       Time_Gap_IQ_Knuckle: true
+      Time_Gap_EM_S_Book: true
+      Time_Gap_SS_Dagger1: true
+      Time_Gap_WH_Bow: true
     Reset:
     Reset:
       Chance: 100000
       Chance: 100000
       Price: 5000000
       Price: 5000000

+ 2100 - 5
db/re/item_group_db.yml

@@ -52590,7 +52590,7 @@ Body:
             Item: C_Foxtail
             Item: C_Foxtail
             Rate: 50
             Rate: 50
           - Index: 5
           - Index: 5
-            Item: aegis_400496
+            Item: C_Horo_Ears_WH
             Rate: 50
             Rate: 50
           - Index: 6
           - Index: 6
             Item: C_Fluttering_Haze
             Item: C_Fluttering_Haze
@@ -52620,7 +52620,7 @@ Body:
             Item: C_Helmet_Of_Siegfried_J
             Item: C_Helmet_Of_Siegfried_J
             Rate: 50
             Rate: 50
           - Index: 15
           - Index: 15
-            Item: aegis_420181
+            Item: C_Eis_Spinne
             Rate: 50
             Rate: 50
           - Index: 16
           - Index: 16
             Item: C_Little_Abyss_Dragon
             Item: C_Little_Abyss_Dragon
@@ -64826,7 +64826,7 @@ Body:
             Rate: 10
             Rate: 10
             Announced: true
             Announced: true
           - Index: 8
           - Index: 8
-            Item: aegis_410232
+            Item: Gambler_Seal_KR
             Rate: 10
             Rate: 10
             Announced: true
             Announced: true
           - Index: 9
           - Index: 9
@@ -92629,7 +92629,7 @@ Body:
             Rate: 10
             Rate: 10
             Announced: true
             Announced: true
           - Index: 17
           - Index: 17
-            Item: aegis_410232
+            Item: Gambler_Seal_KR
             Rate: 10
             Rate: 10
             Announced: true
             Announced: true
           - Index: 18
           - Index: 18
@@ -93872,7 +93872,7 @@ Body:
             Item: C_Crushed_Snow_Man
             Item: C_Crushed_Snow_Man
             Rate: 50
             Rate: 50
           - Index: 15
           - Index: 15
-            Item: aegis_400373
+            Item: C_Frozen_Laurel
             Rate: 50
             Rate: 50
   - Group: SECURITY_CAMPAIGN_BOX
   - Group: SECURITY_CAMPAIGN_BOX
     SubGroups:
     SubGroups:
@@ -118135,3 +118135,2098 @@ Body:
         List:
         List:
           - Index: 0
           - Index: 0
             Item: Zonda_Support
             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.
 # 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
 #   https://rathena.org - https://github.com/rathena
 #
 #
 # This program is free software: you can redistribute it and/or modify
 # This program is free software: you can redistribute it and/or modify
@@ -1048,14 +1048,70 @@ Body:
         Items:
         Items:
           - Item: HD_Oridecon
           - Item: HD_Oridecon
             Amount: 26
             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:
 #    Groups:
 #      - Group: 0
 #      - Group: 0
 #        Items:
 #        Items:
-#          - Item: C_berry_Prince_Crown
+#          - Item: aegis_400749
 #      - Group: 1
 #      - Group: 1
 #        Items:
 #        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:
 #        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.
 # 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
 #   https://rathena.org - https://github.com/rathena
 #
 #
 # This program is free software: you can redistribute it and/or modify
 # This program is free software: you can redistribute it and/or modify
@@ -12141,6 +12141,174 @@ Body:
             Amount: 2
             Amount: 2
         ResultItem: S_SKE_SB_Shoes
         ResultItem: S_SKE_SB_Shoes
         #RandomOptionGroup: NSU # TODO: translate to our group names
         #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
   - Item: Time_Gap_Refine_Hammer
     BaseItems:
     BaseItems:
       - BaseItem: Time_Gap_Spear_IG
       - BaseItem: Time_Gap_Spear_IG
@@ -12313,6 +12481,46 @@ Body:
             Amount: 2
             Amount: 2
         ResultItem: Time_Gap_SH_Foxtail
         ResultItem: Time_Gap_SH_Foxtail
         ChangeRefine: 1
         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
   - Item: Yorscalp_Refin_Hammer
     BaseItems:
     BaseItems:
       - BaseItem: Yorscalp_Armor
       - BaseItem: Yorscalp_Armor

+ 4 - 1
db/re/job_aspd.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

+ 183 - 1
db/re/job_basepoints.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:
@@ -25501,3 +25504,182 @@ Body:
         Sp: 630
         Sp: 630
       - Level: 275
       - Level: 275
         Sp: 630
         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)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:

+ 10 - 5
db/re/job_stats.yml

@@ -27,7 +27,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.
@@ -78,7 +81,7 @@
 
 
 Header:
 Header:
   Type: JOB_STATS
   Type: JOB_STATS
-  Version: 2
+  Version: 3
 
 
 Body:
 Body:
   - Jobs:
   - Jobs:
@@ -7787,6 +7790,7 @@ Body:
     BonusStats:
     BonusStats:
       - Level: 1
       - Level: 1
         Dex: 1
         Dex: 1
+        Sta: 1
       - Level: 2
       - Level: 2
         Int: 1
         Int: 1
         Dex: 1
         Dex: 1
@@ -7812,7 +7816,6 @@ Body:
       - Level: 10
       - Level: 10
         Str: 1
         Str: 1
         Pow: 1
         Pow: 1
-        Sta: 1
       - Level: 11
       - Level: 11
         Dex: 1
         Dex: 1
         Crt: 1
         Crt: 1
@@ -7845,7 +7848,6 @@ Body:
         Spl: 1
         Spl: 1
       - Level: 23
       - Level: 23
         Str: 1
         Str: 1
-        Sta: 1
       - Level: 24
       - Level: 24
         Int: 1
         Int: 1
         Con: 1
         Con: 1
@@ -7854,6 +7856,7 @@ Body:
         Crt: 1
         Crt: 1
       - Level: 26
       - Level: 26
         Vit: 1
         Vit: 1
+        Sta: 1
       - Level: 27
       - Level: 27
         Luk: 1
         Luk: 1
         Wis: 1
         Wis: 1
@@ -7866,7 +7869,6 @@ Body:
         Spl: 1
         Spl: 1
       - Level: 31
       - Level: 31
         Str: 1
         Str: 1
-        Sta: 1
       - Level: 32
       - Level: 32
         Dex: 1
         Dex: 1
         Con: 1
         Con: 1
@@ -7879,7 +7881,6 @@ Body:
         Dex: 1
         Dex: 1
       - Level: 36
       - Level: 36
         Str: 1
         Str: 1
-        Sta: 1
       - Level: 37
       - Level: 37
         Int: 1
         Int: 1
       - Level: 38
       - Level: 38
@@ -7902,9 +7903,13 @@ Body:
       - Level: 45
       - Level: 45
         Spl: 1
         Spl: 1
         Con: 1
         Con: 1
+      - Level: 46
+        Sta: 1
       - Level: 47
       - Level: 47
         Wis: 1
         Wis: 1
         Con: 1
         Con: 1
+      - Level: 48
+        Sta: 1
       - Level: 49
       - Level: 49
         Crt: 1
         Crt: 1
       - Level: 50
       - Level: 50

+ 128 - 0
db/re/map_drops.yml

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

+ 5 - 3
db/re/mob_skill_db.txt

@@ -47,6 +47,8 @@
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	mobnearbygt		When monsters in range become greater than specified number.
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	groundattacked		When mob is hit by ground targeted skill (no condition value).
 //	damagedgt		When single attack deals greater damage than specified number.
 //	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:
 //	Status abnormalities specified through the statuson/statusoff system:
 //	    anybad (any type of state change) / stone / freeze / stun / sleep /
 //	    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_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_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,
 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,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_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@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@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,
 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
           - Item: Alice_Card
             Amount: 1
             Amount: 1
   - Mob: EVENT_RICECAKE
   - Mob: EVENT_RICECAKE
+    TameItem: Mysterious_Rice_Powder
     EggItem: Rice_Cake_Egg
     EggItem: Rice_Cake_Egg
     FoodItem: Green_Herb
     FoodItem: Green_Herb
     Fullness: 3
     Fullness: 3
@@ -2425,6 +2426,7 @@ Body:
 #          - Item: Cookies_Bat
 #          - Item: Cookies_Bat
 #            Amount: 100
 #            Amount: 100
   - Mob: WILOW
   - Mob: WILOW
+    #TameItem: Dew_Of_Old_Tree
     EggItem: Wilow_Egg
     EggItem: Wilow_Egg
     FoodItem: Tree_Of_Archer_1
     FoodItem: Tree_Of_Archer_1
     Fullness: 2   # unknown
     Fullness: 2   # unknown
@@ -2442,6 +2444,7 @@ Body:
          bonus bInt,2;
          bonus bInt,2;
       }
       }
   - Mob: ROWEEN
   - Mob: ROWEEN
+    #TameItem: Foul_Rotten_Meat
     EggItem: Roween_Egg
     EggItem: Roween_Egg
     FoodItem: Rotten_Meat
     FoodItem: Rotten_Meat
     Fullness: 2   # unknown
     Fullness: 2   # unknown
@@ -2556,12 +2559,13 @@ Body:
 #      }
 #      }
 #
 #
   - Mob: DARK_PRIEST
   - Mob: DARK_PRIEST
+    TameItem: Darkness_Bible
     EggItem: Dark_Priest_Egg
     EggItem: Dark_Priest_Egg
     FoodItem: Evil_Water
     FoodItem: Evil_Water
     Fullness: 2   # unknown
     Fullness: 2   # unknown
     HungryDelay: 120   # unknown
     HungryDelay: 120   # unknown
     IntimacyFed: 15   # unknown
     IntimacyFed: 15   # unknown
-    CaptureRate: 0   # unknown
+    CaptureRate: 200   # unknown
     SpecialPerformance: false   # unknown
     SpecialPerformance: false   # unknown
     Script: >
     Script: >
       .@i = getpetinfo(PETINFO_INTIMATE);
       .@i = getpetinfo(PETINFO_INTIMATE);
@@ -3280,3 +3284,266 @@ Body:
 #         bonus2 bAddClass,Class_Normal,1;
 #         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
   - Id: 11739
     Title: "[Cooldown] Oz Labyrinth 2F"
     Title: "[Cooldown] Oz Labyrinth 2F"
     TimeLimit: 4h
     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
   - Id: 12000
     Title: An old friend
     Title: An old friend
   - Id: 12001
   - Id: 12001

File diff suppressed because it is too large
+ 31 - 97
db/re/skill_db.yml


+ 309 - 0
db/re/skill_tree.yml

@@ -7019,6 +7019,13 @@ Body:
         Requires:
         Requires:
           - Name: AG_RAIN_OF_CRYSTAL
           - Name: AG_RAIN_OF_CRYSTAL
             Level: 1
             Level: 1
+      - Name: AG_ENERGY_CONVERSION
+        MaxLevel: 5
+        Requires:
+          - Name: WL_RECOGNIZEDSPELL
+            Level: 2
+          - Name: AG_CLIMAX
+            Level: 1
   - Job: Cardinal
   - Job: Cardinal
     Inherit:
     Inherit:
       Novice: true
       Novice: true
@@ -7201,6 +7208,13 @@ Body:
         Requires:
         Requires:
           - Name: WH_SOLIDTRAP
           - Name: WH_SOLIDTRAP
             Level: 1
             Level: 1
+      - Name: WH_WILD_WALK
+        MaxLevel: 5
+        Requires:
+          - Name: WH_NATUREFRIENDLY
+            Level: 3
+          - Name: WH_HAWKRUSH
+            Level: 3
   - Job: Imperial_Guard
   - Job: Imperial_Guard
     Inherit:
     Inherit:
       Novice: true
       Novice: true
@@ -8298,3 +8312,298 @@ Body:
             Level: 1
             Level: 1
           - Name: SH_MYSTICAL_CREATURE_MASTERY
           - Name: SH_MYSTICAL_CREATURE_MASTERY
             Level: 10
             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
     Icon: EFST_HIDING
     DurationLookup: TF_HIDING
     DurationLookup: TF_HIDING
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
       NoPickItem: true
       NoPickItem: true
       NoConsumeItem: true
       NoConsumeItem: true
@@ -689,6 +688,8 @@ Body:
       NoBanishingBuster: true
       NoBanishingBuster: true
       NoClearance: true
       NoClearance: true
       NoForcedEnd: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight90: true
   - Status: Weight90
   - Status: Weight90
     Icon: EFST_WEIGHTOVER90
     Icon: EFST_WEIGHTOVER90
     Flags:
     Flags:
@@ -700,6 +701,8 @@ Body:
       NoBanishingBuster: true
       NoBanishingBuster: true
       NoClearance: true
       NoClearance: true
       NoForcedEnd: true
       NoForcedEnd: true
+    EndOnStart:
+      Weight50: true
   - Status: Aspdpotion0
   - Status: Aspdpotion0
     Icon: EFST_ATTHASTE_POTION1
     Icon: EFST_ATTHASTE_POTION1
     CalcFlags:
     CalcFlags:
@@ -765,7 +768,7 @@ Body:
       OverlapIgnoreLevel: true
       OverlapIgnoreLevel: true
       RemoveOnHermode: true
       RemoveOnHermode: true
     Script: |
     Script: |
-      bonus bMatk, getstatus(SC_MATKPOTION, 1);  /* TODO: hidden in status window */
+      bonus bMatk2, getstatus(SC_MATKPOTION, 1);
   - Status: Wedding
   - Status: Wedding
     States:
     States:
       NoAttack: true
       NoAttack: true
@@ -804,9 +807,6 @@ Body:
   - Status: Barrier
   - Status: Barrier
     Icon: EFST_BARRIER
     Icon: EFST_BARRIER
     DurationLookup: NPC_BARRIER
     DurationLookup: NPC_BARRIER
-    CalcFlags:
-      Mdef: true
-      Def: true
     Flags:
     Flags:
       RemoveOnHermode: true
       RemoveOnHermode: true
   - Status: Stripweapon
   - Status: Stripweapon
@@ -1173,13 +1173,9 @@ Body:
       bonus2 bSubEle,Ele_Wind, getstatus(SC_ARMOR_ELEMENT_WATER, 4);
       bonus2 bSubEle,Ele_Wind, getstatus(SC_ARMOR_ELEMENT_WATER, 4);
   - Status: Nochat
   - Status: Nochat
     States:
     States:
-      NoPickItem: true
       NoPickItemCond: true
       NoPickItemCond: true
-      NoDropItem: true
       NoDropItemCond: true
       NoDropItemCond: true
-      NoChat: true
       NoChatCond: true
       NoChatCond: true
-      NoConsumeItem: true
       NoConsumeItemCond: true
       NoConsumeItemCond: true
     Flags:
     Flags:
       NoRemoveOnDead: true
       NoRemoveOnDead: true
@@ -1257,7 +1253,6 @@ Body:
     Icon: EFST_GOSPEL
     Icon: EFST_GOSPEL
     DurationLookup: PA_GOSPEL
     DurationLookup: PA_GOSPEL
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
     CalcFlags:
     CalcFlags:
       Speed: true
       Speed: true
@@ -1774,7 +1769,6 @@ Body:
     Icon: EFST_BDPLAYING
     Icon: EFST_BDPLAYING
     DurationLookup: BD_ENCORE
     DurationLookup: BD_ENCORE
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
     CalcFlags:
     CalcFlags:
       Speed: true
       Speed: true
@@ -2455,8 +2449,6 @@ Body:
     CalcFlags:
     CalcFlags:
       Def2: true
       Def2: true
       MDef2: true
       MDef2: true
-      Speed: true
-      Aspd: true
     Opt3:
     Opt3:
       SteelBody: true
       SteelBody: true
     Flags:
     Flags:
@@ -3109,7 +3101,6 @@ Body:
   - Status: Fear
   - Status: Fear
     DurationLookup: RK_WINDCUTTER
     DurationLookup: RK_WINDCUTTER
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
     CalcFlags:
     CalcFlags:
       Flee: true
       Flee: true
@@ -3481,7 +3472,6 @@ Body:
     Icon: EFST_CAMOUFLAGE
     Icon: EFST_CAMOUFLAGE
     DurationLookup: RA_CAMOUFLAGE
     DurationLookup: RA_CAMOUFLAGE
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
     CalcFlags:
     CalcFlags:
       Speed: true
       Speed: true
@@ -3839,8 +3829,7 @@ Body:
   - Status: Oblivioncurse
   - Status: Oblivioncurse
     Icon: EFST_OBLIVIONCURSE
     Icon: EFST_OBLIVIONCURSE
     States:
     States:
-      NoCast: true
-      Nocastcond: true
+      NoCastCond: true
     CalcFlags:
     CalcFlags:
       Regen: true
       Regen: true
     Flags:
     Flags:
@@ -3993,9 +3982,7 @@ Body:
     Icon: EFST_COLD
     Icon: EFST_COLD
     DurationLookup: SO_DIAMONDDUST
     DurationLookup: SO_DIAMONDDUST
     States:
     States:
-      NoMove: true
       NoMoveCond: true
       NoMoveCond: true
-      NoCast: true
       NoCastCond: true
       NoCastCond: true
       NoConsumeItem: true
       NoConsumeItem: true
       NoAttack: true
       NoAttack: true
@@ -6501,8 +6488,8 @@ Body:
       MaxSp: true
       MaxSp: true
   - Status: Norecover_State
   - Status: Norecover_State
     Icon: EFST_HANDICAPSTATE_NORECOVER
     Icon: EFST_HANDICAPSTATE_NORECOVER
-    Fail:
-      Norecover_State: true
+    CalcFlags:
+      Regen: true
   - Status: Suhide
   - Status: Suhide
     Icon: EFST_SUHIDE
     Icon: EFST_SUHIDE
     DurationLookup: SU_HIDE
     DurationLookup: SU_HIDE
@@ -6565,6 +6552,8 @@ Body:
   - Status: Tunaparty
   - Status: Tunaparty
     Icon: EFST_TUNAPARTY
     Icon: EFST_TUNAPARTY
     DurationLookup: SU_TUNAPARTY
     DurationLookup: SU_TUNAPARTY
+    Flags:
+      NoDispell: true
   - Status: Shrimp
   - Status: Shrimp
     Icon: EFST_SHRIMP
     Icon: EFST_SHRIMP
     DurationLookup: SU_BUNCHOFSHRIMP
     DurationLookup: SU_BUNCHOFSHRIMP
@@ -7526,24 +7515,25 @@ Body:
       bonus bVariableCastrate,-80;
       bonus bVariableCastrate,-80;
   - Status: OverBrandReady
   - Status: OverBrandReady
     Icon: EFST_OVERBRANDREADY
     Icon: EFST_OVERBRANDREADY
-    Flags:
   - Status: Poison_Mist
   - Status: Poison_Mist
     Icon: EFST_POISON_MIST
     Icon: EFST_POISON_MIST
     DurationLookup: MH_POISON_MIST
     DurationLookup: MH_POISON_MIST
     CalcFlags:
     CalcFlags:
       Flee: true
       Flee: true
-    Flags:
   - Status: Stone_Wall
   - Status: Stone_Wall
     Icon: EFST_STONE_WALL
     Icon: EFST_STONE_WALL
     DurationLookup: MH_STEINWAND
     DurationLookup: MH_STEINWAND
     CalcFlags:
     CalcFlags:
       Def: true
       Def: true
       Mdef: true
       Mdef: true
-    Flags:
   - Status: Cloud_Poison
   - Status: Cloud_Poison
     Icon: EFST_CLOUD_POISON
     Icon: EFST_CLOUD_POISON
     DurationLookup: SO_CLOUD_KILL
     DurationLookup: SO_CLOUD_KILL
     Flags:
     Flags:
+      BlEffect: true
+#     DisplayMob: true  # !TODO: check me
+    Fail:
+      Cloud_Poison: true
   - Status: Homun_Time
   - Status: Homun_Time
     Icon: EFST_HOMUN_TIME
     Icon: EFST_HOMUN_TIME
     Flags:
     Flags:
@@ -9588,6 +9578,11 @@ Body:
       Patk: true
       Patk: true
       Smatk: true
       Smatk: true
       Hplus: true
       Hplus: true
+    Flags:
+      # NoClearbuff: true  # !TODO
+      NoDispell: true
+      # NoBanishingBuster: true  # !TODO
+      # NoClearance: true  # !TODO
   - Status: Marine_Festival
   - Status: Marine_Festival
     Icon: EFST_MARINE_FESTIVAL
     Icon: EFST_MARINE_FESTIVAL
     DurationLookup: SH_MARINE_FESTIVAL_OF_KI_SUL
     DurationLookup: SH_MARINE_FESTIVAL_OF_KI_SUL
@@ -9674,6 +9669,119 @@ Body:
     CalcFlags:
     CalcFlags:
       Patk: true
       Patk: true
       Smatk: true
       Smatk: true
+    # Flags:  # !TODO: NoDispell ?
   - Status: Blessing_of_M_C_Debuff
   - Status: Blessing_of_M_C_Debuff
     Icon: EFST_BLESSING_OF_M_C_DEBUFF
     Icon: EFST_BLESSING_OF_M_C_DEBUFF
     DurationLookup: SH_BLESSING_OF_MYSTICAL_CREATURES
     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)
 #   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)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
 #     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)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
 #     - Level                 Skill level.
@@ -115,7 +115,7 @@
 #         Amount              Ammo amount required at specific skill level.
 #         Amount              Ammo amount required at specific skill level.
 #     State                   Special state required to cast. (Default: None)
 #     State                   Special state required to cast. (Default: None)
 #     Status:                 Status change required to cast. (Default: nullptr)
 #     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.
 #       - Level               Skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #     ItemCost:               Item required to cast. (Default: 0)
 #     ItemCost:               Item required to cast. (Default: 0)
@@ -140,7 +140,7 @@
 
 
 Header:
 Header:
   Type: SKILL_DB
   Type: SKILL_DB
-  Version: 3
+  Version: 4
 
 
 Footer:
 Footer:
   Imports:
   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_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_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_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 (c)
 	Class_Normal, Class_Boss, Class_Guardian, Class_All
 	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 bAtkRate,n;  			ATK + n% that won't interfere with Damage modifier and SC_EDP (renewal mode only)
 bonus bWeaponAtkRate,n; 	Weapon ATK + n%
 bonus bWeaponAtkRate,n; 	Weapon ATK + n%
 bonus bMatk,n;     			Magical attack power + 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 bMatkRate,n; 			Magical attack power + n%
 bonus bWeaponMatkRate,n;	Weapon Magical ATK + n% (renewal mode only)
 bonus bWeaponMatkRate,n;	Weapon Magical ATK + n% (renewal mode only)
 bonus bDef,n;      			Equipment DEF + n
 bonus bDef,n;      			Equipment DEF + n
@@ -197,6 +198,7 @@ bonus2 bSkillUseSPrate,sk,n;		Decreases SP consumption of skill sk by n%
 Atk/Def
 Atk/Def
 -------
 -------
 bonus2 bSkillAtk,sk,n;    		Increases damage of skill sk by n%
 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 bShortAtkRate,n;			Increases damage of short ranged attacks by n%
 bonus bLongAtkRate,n;     		Increases damage of long ranged attacks by n%
 bonus bLongAtkRate,n;     		Increases damage of long ranged attacks by n%
 bonus bCritAtkRate,n;     		Increases critical damage 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)
 26: 0xB695 (aggressive, change-target melee/chase, cast sensor idle/chase, chase-change target, random target)
 27: 0x8084 (aggressive, immobile, 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
 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.
 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
 URLs
 ----
 ----
 Similarly, you can create links to websites that launch in a new window:
 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>})
 *is_guild_leader({<guild ID>})
 
 
 This command will return true if the player attached to the script is the leader
 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.
 or "null" if you requested the monster's name.
 
 
 Valid types are:
 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'.
 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;
 *recalculatestat;
 
 
 This command will force a stat recalculation for the attached player.
 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>")
 *mobcount("<map name>","<event label>")
 
 
 This function will count all the monsters on the specified map that have a given
 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_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.
 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
 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:
 Examples:
 
 
 	mes mesitemlink( 1201 ); // Will display "[Knife]" and will be clickable. If clicked it opens the description for Knife [3]
 	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 ) + "."; // 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, 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.
 	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.|
 |14.- Channel commands.|
 ========================
 ========================

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

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.

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

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   BonusStats:              Job level bonus stats/traits.

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

@@ -10,7 +10,10 @@
 #   MaxWeight                Base maximum weight. (Default: 20000)
 #   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)
 #   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)
 #   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)
 #   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)
 #   BaseASPD:                Base ASPD for each weapon type. (Default: 2000)
 #     Weapon                 Weapon type with associated ASPD.
 #     Weapon                 Weapon type with associated ASPD.
 #   BonusStats:              Job level bonus stats/traits.
 #   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)
 #   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)
 #     AdditionalRange         Number of cells from an NPC where the skill can be cast. (Optional)
 #     Type:                   Type of NPC.
 #     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)
 #   CastDefenseReduction      Defense reduction rate during skill cast. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #   CastTime:                 Time to cast the skill in milliseconds. (Default: 0)
 #     - Level                 Skill level.
 #     - Level                 Skill level.
@@ -98,7 +98,7 @@
 #         Amount              Ammo amount required at specific skill level.
 #         Amount              Ammo amount required at specific skill level.
 #     State                   Special state required to cast. (Default: None)
 #     State                   Special state required to cast. (Default: None)
 #     Status:                 Status change required to cast. (Default: nullptr)
 #     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.
 #       - Level               Skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #         Amount              Spirit sphere required at specific skill level.
 #     ItemCost:               Item required to cast. (Default: 0)
 #     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_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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_illusion_turtle` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_rachel_sanctuary` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_illusion_luanda` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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 "Meat? Thanks! I will pay you";
 				mes "back with these.";
 				mes "back with these.";
 				delitem 517,1;// Meat
 				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;
 				emotion ET_SCISSOR;
 				close;
 				close;
 			}
 			}
@@ -416,9 +426,19 @@ umbala,59,243,5	script	Utan Kid#1	787,{
 				mes "Umbaumbaumbabababah.";
 				mes "Umbaumbaumbabababah.";
 				mes "Umbababahum.";
 				mes "Umbababahum.";
 				delitem 517,1;// Meat
 				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;
 				emotion ET_SCISSOR;
 				close;
 				close;
 			}
 			}

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

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

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

@@ -164,10 +164,10 @@ Mission_Status:
 	deletearray .@j[0], getarraysize(.@j);
 	deletearray .@j[0], getarraysize(.@j);
 	for (.@i = 0; .@i < .Quests; .@i++) {
 	for (.@i = 0; .@i < .Quests; .@i++) {
 		.@j[.@i] = getd("Mission" + .@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:
 	// Reward formulas:
@@ -268,10 +268,10 @@ OnNPCKillEvent:
 	if (!getcharid(1) || !.Party) {
 	if (!getcharid(1) || !.Party) {
 		if (!#Mission_Count || !Mission0) end;
 		if (!#Mission_Count || !Mission0) end;
 		for (.@i = 0; .@i < .Quests; .@i++) {
 		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) {
 				if (getd("Mission" + .@i + "_") < #Mission_Count) {
 					dispbottom "[Hunting Mission] Killed " + (set(getd("Mission" + .@i + "_"),getd("Mission" + .@i + "_") + 1)) +
 					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;
 					end;
 				}
 				}
 			}
 			}
@@ -293,10 +293,10 @@ OnNPCKillEvent:
 						for (.@j = 0; .@j < .Quests; .@j++) {
 						for (.@j = 0; .@j < .Quests; .@j++) {
 							.@my_mob_id = getvar( getd("Mission"+.@j),$@partymembercid[.@i] );
 							.@my_mob_id = getvar( getd("Mission"+.@j),$@partymembercid[.@i] );
 							.@my_count = 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) {
 								if (.@my_count < .@Mission_Count) {
 									setd "Mission"+.@j+"_", (.@my_count+1), $@partymembercid[.@i];
 									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;
 									break;
 								}
 								}
 							}
 							}

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

@@ -32,7 +32,7 @@ geffen,115,107,5	script	Lord Kaho's Servant	61,{
 	next;
 	next;
 	mes .@n$;
 	mes .@n$;
 	for(set .@i,0; .@i<10; set .@i,.@i+1)
 	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;
 	next;
 	mes .@n$;
 	mes .@n$;
 	mes "We're not done yet, sweetie...";
 	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"));
 		set .@size, getarraysize(getd("."+ currentquest$ + "_huntingmob"));
 		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]");
 			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 "--------------------------------";
 		mes "[Reward]";
 		mes "[Reward]";
@@ -163,7 +163,7 @@ prontera,129,215,5	script	Questboard	4_BOARD3,{
 		mes "--------------------------------";
 		mes "--------------------------------";
 		set .@size, getarraysize(getd("."+ .@selection + "_huntingmob"));
 		set .@size, getarraysize(getd("."+ .@selection + "_huntingmob"));
 		for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
 		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 "--------------------------------";
 		mes "[Reward]";
 		mes "[Reward]";
@@ -264,7 +264,7 @@ OnNPCKillEvent:
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
 			set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
 			if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){
 			if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){
 				setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1);
 				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){
 			if(getcharid(1) != 0 && .party_support == true){
 				getmapxy(.@map1$,.@x1,.@y1);
 				getmapxy(.@map1$,.@x1,.@y1);
@@ -282,7 +282,7 @@ OnNPCKillEvent:
 								if(.@kill_amt<.@kill_goal)
 								if(.@kill_amt<.@kill_goal)
 								{
 								{
 									setd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", .@kill_amt+1, $@partymembercid[.@j]);
 									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; }
 			if (.@guardiantype[.@UseGID] == 1) { set .@type,1287; }
 			else if (.@guardiantype[.@UseGID] == 2) { set .@type,1285; }
 			else if (.@guardiantype[.@UseGID] == 2) { set .@type,1285; }
 			else { set .@type,1286; }
 			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 "["+strnpcinfo(1)+"]";
 			mes "We completed the summoning of the Guardian. Our defenses are now increased with it in place.";
 			mes "We completed the summoning of the Guardian. Our defenses are now increased with it in place.";
 			close;
 			close;
@@ -1115,7 +1115,7 @@ OnSpawnGuardians:
 		else if (.@guardiantype[.@i] == 2) { set .@type,1285; }
 		else if (.@guardiantype[.@i] == 2) { set .@type,1285; }
 		else { set .@type,1286; }
 		else { set .@type,1286; }
 		if (GetCastleData(strnpcinfo(2),.@UseGID)) {
 		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;
 	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)
 			else if ($@arena_picture_id == 7777)
 				mes "Would you like to take a picture with a Valkyrie?";
 				mes "Would you like to take a picture with a Valkyrie?";
 			else
 			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;
 			next;
 			switch(select("Yes:No")) {
 			switch(select("Yes:No")) {
 			case 1:
 			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?";
 	mes "you're looking for?";
 	next;
 	next;
 	setarray .@item, 12184,	12185,	12241,	12242,	12243;
 	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++)
 	for (.@size = getarraysize(.@item); .@i < .@size; .@i++)
 		.@menu$ = .@menu$ + getitemname(.@item[.@i]) + ":";
 		.@menu$ = .@menu$ + getitemname(.@item[.@i]) + ":";
 	.@m = select(.@menu$)-1;
 	.@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;
 	case 6: set .@x,175;	set .@y,137;	break;
 	}
 	}
 	set .@mob,rand(1646,1651);
 	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
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,6)) {
 	switch(rand(1,6)) {
@@ -293,7 +293,7 @@ OnSummon:
 	case 6: set .@x2,139;	set .@y2,259;	break;
 	case 6: set .@x2,139;	set .@y2,259;	break;
 	}
 	}
 	set .@mob2,rand(1640,1645);
 	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;
 	end;
 
 
 OnLhzMvPDead:
 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_mag	mapflag	nobranch
 job4_tro	mapflag	nobranch
 job4_tro	mapflag	nobranch
 
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	nobranch
+
 //============================================================
 //============================================================
 // Geffen Night Arena
 // Geffen Night Arena
 //============================================================
 //============================================================

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

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

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

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

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

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

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

@@ -195,6 +195,11 @@
 1@4igd	mapflag	partylock
 1@4igd	mapflag	partylock
 1@4drk	mapflag	partylock
 1@4drk	mapflag	partylock
 
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	partylock
+
 //============================================================
 //============================================================
 // Geffen Night Arena
 // 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@4igd	mapflag	restricted	6
 1@4drk	mapflag	restricted	6
 1@4drk	mapflag	restricted	6
 
 
+//============================================================
+// Spirit Handler Job Change
+//============================================================
+1@exsh	mapflag	restricted	6
+
 //============================================================
 //============================================================
 // Geffen Night Arena
 // 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
 // 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,{
 -	script	::pss	HIDDEN_NPC,{
 	npctalk "Do you have an element for each property?", "", bc_self;
 	npctalk "Do you have an element for each property?", "", bc_self;

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

@@ -15,15 +15,15 @@
 	next;
 	next;
 	switch ( select( "Buy Arrows", "Quiver Exchange", "Sell Items", "Cancel" )) {
 	switch ( select( "Buy Arrows", "Quiver Exchange", "Sell Items", "Cancel" )) {
 	case 1:
 	case 1:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Arrow_Archer", 1;
 		callshop "Arrow_Archer", 1;
 		break;
 		break;
 	case 2:
 	case 2:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Quiver_Archer", 1;
 		callshop "Quiver_Archer", 1;
 		break;
 		break;
 	case 3:
 	case 3:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Selling_Items", 2;
 		callshop "Selling_Items", 2;
 		break;
 		break;
 	case 4:
 	case 4:
@@ -90,15 +90,15 @@ OnInit:
 	next;
 	next;
 	switch ( select( "Buy Ninjutsu Tool", "Parchment Exchange", "Sell Items", "Cancel" )) {
 	switch ( select( "Buy Ninjutsu Tool", "Parchment Exchange", "Sell Items", "Cancel" )) {
 	case 1:
 	case 1:
-		close2;
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Weapons_Ninja", 1;
 		callshop "Weapons_Ninja", 1;
 		break;
 		break;
 	case 2:
 	case 2:
-		close2;	
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Box_Exchange_Ninja", 1;
 		callshop "Box_Exchange_Ninja", 1;
 		break;
 		break;
 	case 3:
 	case 3:
-		close2;	
+		close2;	// !Fix me: official server uses "callshop" then "close"
 		callshop "Selling_Items", 2;
 		callshop "Selling_Items", 2;
 		break;
 		break;
 	case 4:
 	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
 -	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
 //= 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
 //= 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
 -	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
             Item: Shadow_Orb
             Amount: 500
             Amount: 500
       - Index: 18
       - Index: 18
-        Item: Shadow_Orb_Bundle
+        Item: SS_Charm_Box
         RequiredItems:
         RequiredItems:
           - Index: 0
           - Index: 0
-            Item: Shadow_Orb
+            Item: SS_Charm
             Amount: 500
             Amount: 500
       - Index: 19
       - Index: 19
-        Item: SS_Charm_Box
+        Item: SS_Charm_F_Box
         RequiredItems:
         RequiredItems:
           - Index: 0
           - Index: 0
             Item: SS_Charm_F
             Item: SS_Charm_F

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

@@ -1037,3 +1037,725 @@ Body:
           - Index: 0
           - Index: 0
             Item: Cachua_Coupon
             Item: Cachua_Coupon
             Amount: 10
             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.0 Initial version from replays. [Lemongrass]
 //= 1.1 Cash Hair Stylist [Kisuka]
 //= 1.1 Cash Hair Stylist [Kisuka]
 //= 1.2 Updated Hair Stylist [Lemongrass]
 //= 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,{
 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!";
 	mes "to see you again. Take care!";
 	close;
 	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
 // El Dicastes
 //=======================================================
 //=======================================================
 dic_in01,238,107,5	shop	Peddler#dic	900,601:-1,602:-1,611:-1,610:-1
 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
 // 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
 //=======================================================
 //=======================================================
-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
 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;
 		case 6:  set .@x,175;  set .@y,137;  break;
 	}
 	}
 	set .@mob,rand(1646,1651);
 	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
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,6)) {
 	switch(rand(1,6)) {
@@ -97,7 +97,7 @@ OnInit:
 		case 6:  set .@x2,139;  set .@y2,259;  break;
 		case 6:  set .@x2,139;  set .@y2,259;  break;
 	}
 	}
 	set .@mob2,rand(1640,1645);
 	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;
 	end;
 
 
 OnMyMVPDead:
 OnMyMVPDead:
@@ -141,7 +141,7 @@ OnInit:
 		case 7:  set .@x,149;  set .@y,151;  break;
 		case 7:  set .@x,149;  set .@y,151;  break;
 	}
 	}
 	set .@mob,rand(2235,2241);
 	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
 	// Select Coordinates to summon a random 99 on
 	switch(rand(1,7)) {
 	switch(rand(1,7)) {
@@ -154,7 +154,7 @@ OnInit:
 		case 7:  set .@x2,149;  set .@y2,151;  break;
 		case 7:  set .@x2,149;  set .@y2,151;  break;
 	}
 	}
 	set .@mob2,rand(2228,2234);
 	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;
 	end;
 
 
 OnLhzMvPDead:
 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 "[Cute Pet Manager]";
 		mes "You have chosen " + getitemname(.@tame_id) + ".";
 		mes "You have chosen " + getitemname(.@tame_id) + ".";
 		mes "You can use it for taming";
 		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;
 		next;
 		mes "[Cute Pet Manager]";
 		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";
 		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/CentralLaboratory.txt
 npc: npc/re/instances/CharlestonCrisis.txt
 npc: npc/re/instances/CharlestonCrisis.txt
 npc: npc/re/instances/CorOperation.txt
 npc: npc/re/instances/CorOperation.txt
+npc: npc/re/instances/DeepForest.txt
 npc: npc/re/instances/DevilTower.txt
 npc: npc/re/instances/DevilTower.txt
 npc: npc/re/instances/EclageInterior.txt
 npc: npc/re/instances/EclageInterior.txt
 npc: npc/re/instances/EddaHalfMoonInTheDaylight.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/stone_change.txt
 npc: npc/re/other/turbo_track.txt
 npc: npc/re/other/turbo_track.txt
 npc: npc/re/other/CashShop_Functions.txt
 npc: npc/re/other/CashShop_Functions.txt
+npc: npc/re/other/kachua_key.txt
 
 
 // --------------------------- Quests ---------------------------
 // --------------------------- Quests ---------------------------
 // - Eden Group -------------------------------------------------
 // - 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
 npc: npc/re/jobs/novice/supernovice_ex.txt
 // - Job Repairs
 // - Job Repairs
 npc: npc/re/jobs/repair.txt
 npc: npc/re/jobs/repair.txt
+// - Doram
+npc: npc/re/jobs/doram/spirit_handler.txt
 
 
 // ------------------------ Skill Quests ------------------------
 // ------------------------ Skill Quests ------------------------
 npc: npc/re/quests/skills/merchant_skills.txt
 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',
   `inventory_slots` smallint(6) NOT NULL default '100',
   `body_direction` tinyint(1) unsigned NOT NULL default '0',
   `body_direction` tinyint(1) unsigned NOT NULL default '0',
   `disable_call` tinyint(3) 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`),
   PRIMARY KEY  (`char_id`),
   UNIQUE KEY `name_key` (`name`),
   UNIQUE KEY `name_key` (`name`),
   KEY `account_id` (`account_id`),
   KEY `account_id` (`account_id`),
@@ -1063,7 +1064,7 @@ CREATE TABLE IF NOT EXISTS `skillcooldown_homunculus` (
   `homun_id` int(11) NOT NULL,
   `homun_id` int(11) NOT NULL,
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `tick` bigint(20) NOT NULL,
   `tick` bigint(20) NOT NULL,
-  PRIMARY KEY (`homun_id`)
+  PRIMARY KEY (`homun_id`,`skill`)
 ) ENGINE=MyISAM;
 ) ENGINE=MyISAM;
 
 
 --
 --
@@ -1074,7 +1075,7 @@ CREATE TABLE IF NOT EXISTS `skillcooldown_mercenary` (
   `mer_id` int(11) NOT NULL,
   `mer_id` int(11) NOT NULL,
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `skill` smallint(11) unsigned NOT NULL DEFAULT '0',
   `tick` bigint(20) NOT NULL,
   `tick` bigint(20) NOT NULL,
-  PRIMARY KEY (`mer_id`)
+  PRIMARY KEY (`mer_id`,`skill`)
 ) ENGINE=MyISAM;
 ) 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_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) 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_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_ep16_def` tinyint(1) unsigned DEFAULT NULL,
   `racegroup_edda_arunafeltz` 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` varchar(24) DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `element_level` tinyint(4) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,
   `walk_speed` smallint(6) unsigned DEFAULT NULL,

Some files were not shown because too many files changed in this diff