summaryrefslogtreecommitdiff
path: root/conf
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2014-11-04 20:23:22 +0300
committerAndrei Karas <akaras@inbox.ru>2014-11-04 22:56:41 +0300
commitd6b5551bff867250edcdc36455ef32844ee2b935 (patch)
tree16acaf1c9a81b58ceb21bc4524a087c14f23735f /conf
parent905dada713af49bb610177c4842685628a1c0a97 (diff)
downloadserverdata-d6b5551bff867250edcdc36455ef32844ee2b935.tar.gz
serverdata-d6b5551bff867250edcdc36455ef32844ee2b935.tar.bz2
serverdata-d6b5551bff867250edcdc36455ef32844ee2b935.tar.xz
serverdata-d6b5551bff867250edcdc36455ef32844ee2b935.zip
convert server data for using with hercules.
Diffstat (limited to 'conf')
-rw-r--r--conf/atcommand.conf72
-rw-r--r--conf/atcommand_athena.conf7
-rw-r--r--conf/atcommand_local.conf.example497
-rw-r--r--conf/battle.conf61
-rw-r--r--conf/battle/battle.conf152
-rw-r--r--conf/battle/battleground.conf17
-rw-r--r--conf/battle/client.conf128
-rw-r--r--conf/battle/drops.conf134
-rw-r--r--conf/battle/exp.conf91
-rw-r--r--conf/battle/feature.conf29
-rw-r--r--conf/battle/gm.conf37
-rw-r--r--conf/battle/guild.conf49
-rw-r--r--conf/battle/homunc.conf45
-rw-r--r--conf/battle/items.conf95
-rw-r--r--conf/battle/misc.conf137
-rw-r--r--conf/battle/monster.conf218
-rw-r--r--conf/battle/party.conf54
-rw-r--r--conf/battle/pet.conf77
-rw-r--r--conf/battle/player.conf170
-rw-r--r--conf/battle/skill.conf305
-rw-r--r--conf/battle/status.conf24
-rw-r--r--conf/battle_athena.conf752
-rw-r--r--conf/battle_local.conf.example1
-rw-r--r--conf/battlegrounds.conf125
-rwxr-xr-xconf/build-magic.sh21
-rw-r--r--conf/channels.conf64
-rw-r--r--conf/char-server.conf187
-rw-r--r--conf/char_athena.conf137
-rw-r--r--conf/char_local.conf.example25
-rw-r--r--conf/charhelp.txt28
-rw-r--r--conf/eathena-monitor.conf.example14
-rw-r--r--conf/gm_account.txt.example1
-rw-r--r--conf/grf-files.txt12
-rw-r--r--conf/groups.conf276
-rw-r--r--conf/help.txt307
-rw-r--r--conf/help.txt.example193
-rw-r--r--conf/import-tmpl/battle_conf.txt0
-rw-r--r--conf/import-tmpl/char_conf.txt0
-rw-r--r--conf/import-tmpl/inter_conf.txt0
-rw-r--r--conf/import-tmpl/log_conf.txt0
-rw-r--r--conf/import-tmpl/login_conf.txt0
-rw-r--r--conf/import-tmpl/map_conf.txt0
-rw-r--r--conf/import-tmpl/msg_conf.txt0
-rw-r--r--conf/import-tmpl/packet_conf.txt0
-rw-r--r--conf/import-tmpl/script_conf.txt0
-rw-r--r--conf/inter-server.conf152
-rw-r--r--conf/inter_athena.conf31
-rw-r--r--conf/ladmin_athena.conf28
-rw-r--r--conf/ladmin_local.conf.example10
-rw-r--r--conf/lan_support.conf41
-rw-r--r--conf/login-server.conf156
-rw-r--r--conf/login_athena.conf130
-rw-r--r--conf/login_local.conf.example30
-rw-r--r--conf/logs.conf134
-rw-r--r--conf/magic.conf.template1835
-rw-r--r--conf/magic.conf.tmw.template1617
-rw-r--r--conf/map-server.conf115
-rw-r--r--conf/map_athena.conf19
-rw-r--r--conf/map_local.conf.example15
-rw-r--r--conf/maps.conf17
-rw-r--r--conf/messages.conf1538
-rw-r--r--conf/msg_athena.conf528
-rw-r--r--conf/packet.conf66
-rw-r--r--conf/plugins.conf39
-rw-r--r--conf/readme.txt22
-rw-r--r--conf/script.conf29
-rw-r--r--conf/script_athena.conf2
-rw-r--r--conf/subnet.conf6
-rw-r--r--conf/water.txt54
-rw-r--r--conf/water_height.txt68
70 files changed, 5168 insertions, 6056 deletions
diff --git a/conf/atcommand.conf b/conf/atcommand.conf
new file mode 100644
index 000000000..df4972067
--- /dev/null
+++ b/conf/atcommand.conf
@@ -0,0 +1,72 @@
+/* Atcommands and charcommands configuration file */
+
+/* The symbol that will be used to recognize commands.
+You can set any one character except:
+ - control-characters (0x00-0x1f),
+ - '%' (party chat symbol)
+ - '$' (guild chat symbol)
+ - '/' (client commands symbol)
+atcommand_symbol represents @commands used locally.
+charcommand_symbol represents #commands used on other players.
+*/
+
+atcommand_symbol : "@"
+charcommand_symbol: "#"
+
+/* Command aliases
+You can define aliases for any command. Aliases work just like the original command.
+Format is
+ <commandname>: ["<alias>", ...]
+*/
+
+aliases: {
+ mobinfo: ["monsterinfo", "mi"]
+ iteminfo: ["ii"]
+ time: ["date", "serverdate", "servertime"]
+ autotrade: ["at"]
+ help: ["h"]
+ jumpto: ["goto", "warpto"]
+ mount: ["mountpeco"]
+ who: ["whois"]
+ npctalk: ["npctalkc"]
+ gvgon: ["gpvpon"]
+ gvgoff: ["gpvpoff"]
+ jobchange: ["job"]
+ load: ["return"]
+ warp: ["rura", "mapmove"]
+ dye: ["ccolor"]
+ hairstyle: ["hstyle"]
+ haircolor: ["hcolor"]
+ monster: ["spawn"]
+ blvl: ["lvup", "blevel", "baselvl", "baselvup", "baselevel", "baselvlup"]
+ jlvl: ["jlevel", "joblvl", "joblvup", "joblevel", "joblvlup"]
+ glvl: ["glevel", "guildlvl", "guildlvup", "guildlevel", "guildlvlup"]
+ allskill: ["allskills", "skillall", "skillsall"]
+ allstats: ["allstat", "statall", "statsall"]
+ ban: ["banish"]
+ unban: ["unbanish"]
+ unjail: ["discharge"]
+ homlevel: ["hlvl", "hlevel", "homlvl", "homlvup"]
+ homevolution: ["homevolve"]
+ mutearea: ["stfu"]
+ monsterignore: ["battleignore"]
+ raise: ["revive"]
+ kill: ["die"]
+ guildstorage: ["gstorage"]
+ accinfo: ["accountinfo"]
+ itemreset: ["clearinventory"]
+ channel: ["main"]
+ autoloottype: ["aloottype"]
+}
+
+/* List of commands that should not be logged at all */
+/* Add as many commands as you like */
+nolog: {
+ iteminfo: 1
+ mobinfo: 1
+}
+
+/* Commands help file */
+help: {
+ @include "conf/help.txt"
+}
diff --git a/conf/atcommand_athena.conf b/conf/atcommand_athena.conf
deleted file mode 100644
index 82204f1a9..000000000
--- a/conf/atcommand_athena.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-// Athena atcommand Configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-
-// local settings for this server in this file
-import: conf/atcommand_local.conf
-
diff --git a/conf/atcommand_local.conf.example b/conf/atcommand_local.conf.example
deleted file mode 100644
index 0e87addc3..000000000
--- a/conf/atcommand_local.conf.example
+++ /dev/null
@@ -1,497 +0,0 @@
-// Athena atcommand Local Configuration file.
-
-// Set here the symbol that you want to use for your commands
-// Only 1 character is get (default is '@'). You can set any character,
-// except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
-// With default character, all commands begin by a '@': <example> @revive
-command_symbol: @
-
-
-// 0: normal player commands
-
-// Displays helpfile in Athena base directory.
-help: 0
-
-// Give server time. (6 same commands)
-time: 0
-date: 0
-server_date: 0
-serverdate: 0
-server_time: 0
-servertime: 0
-
-// To change your (own) email (characters protection)
-// note: this command doesn't check email itself, but check structure of the email (xxx@xxx)
-// if you want be sure of each e-mail disable this option (value: 100)
-email: 0
-
-// To become GM (need password; password is set in login_athena.conf).
-// special!: only a non-GM (player with gm level 0) need to have this command.
-// if you change the value, be sure of what you do!
-// To be able to create a gm with @gm, you must:
-// - give a level to level_new_gm (parameter of login_athena.conf) (not 0)
-// - enable to level 0 the @gm command (atcommand_athena.conf) (default 100) - Only level 0 can give access to this command
-// - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
-// - and normal player must give correct password when he use the @gm command (gm_pass paramter in login_athena.conf)
-gm: 100
-
-
-//-------------------------
-// 40: "Dev"
-
-// Broadcast to the whole server
-broadcast: 40
-
-// Broadcast to the map you are on
-local_broadcast: 40
-
-// Suicide your character.
-die: 40
-
-// Locate someone on a map, returns your coordinates if the person isn't on.
-where: 40
-
-// Spawns you to set points in major cities.
-go: 40
-
-// Warp yourself to a person.
-goto: 40
-
-// follow a player (including warping to them)
-follow: 40
-
-// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
-kick: 40
-
-// Returns list of logged in characters with their position.
-who: 40
-
-// Returns list of logged in characters with their party/guild.
-whogroup: 40
-
-// Returns list of logged in characters with their position in a specifical map.
-whomap: 40
-
-// Returns list of logged in characters with their party/guild in a specifical map.
-whomapgroup: 40
-
-// Like @who+@who2+who3, but only for GM.
-whogm: 40
-
-// Enables you to view other characters stats.
-charstats: 40
-
-// Heals a person to full HP/SP.
-heal: 40
-
-// GM Hide (hides you from monsters and most reporting functions).
-// To hide from other players use @invisible
-hide: 40
-
-// Enables you to to jump randomly on a map (that you are already on).
-jump: 40
-
-// Warps you to your last save point.
-return: 40
-
-// Warp yourself to a certain map, at (x,y) coordinates.
-warp: 40
-
-// Changes GM clothes color (2 same commands)
-dye: 40
-ccolor: 40
-
-// Changes own hair style.
-hairstyle: 40
-
-// Changes own hair color.
-haircolor: 40
-
-// Deletes all your items.
-itemreset: 40
-
-// Sets your spawn point (aka save point).
-save: 40
-
-// Send text to the GM log
-log: 40
-l: 40
-
-// Send text to the GM log and local chat
-tee: 40
-t: 40
-
-//--------------------
-// 50: Event coordinators
-
-// make yourself invisible to everyone
-invisible: 50
-
-// make yourself visible to everyone
-visible: 50
-
-// Spawns a monster, and a certain amount
-spawn: 50
-
-//Summons a monster, and a certain amount
-summon: 50
-
-//--------------------
-// 60: "GM"
-
-// Enable all wispers for a player
-inall: 60
-
-// Disable all wispers for a player
-exall: 60
-
-// Shows Stats Of All Characters Online
-charstatsall: 60
-
-// Turns PVP (Person v. Person) off on a map.
-pvpoff: 60
-
-// Enables PVP on a map.
-pvpon: 60
-
-// Sets the speed you can walk/attack at. Default is 150.
-speed: 60
-
-// Kill all monsters in map (with drops)
-killmonster: 60
-
-// Kill all monsters in map (without drops)
-killmonster2: 60
-
-// Check which characters are online from a characters IP address
-ipcheck: 60
-
-// store all your items
-storeall: 60
-
-// allow other players to hit you out of pvp
-killable: 60
-
-// look up a skill by name
-skillid: 60
-
-// use a skill by id
-useskill: 60
-
-// make another player killable
-charkillable: 60
-
-// Resurects yourself.
-alive: 60
-
-// Levels your character to specified level (adds to your level).
-blvl: 60
-
-// Raises your job level (3 same commands).
-jlvl: 60
-
-// Unmute a player
-unmute: 60
-
-// Sets another persons base level.
-charblvl: 60
-
-// Changes the sex of an online player (all characters on the account)
-charchangesex: 60
-
-// Remove items from a character
-chardelitem: 60
-
-// Sets another persons job level.
-charjlvl: 60
-
-// Gives another character status points
-charstpoint: 60
-
-// Gives another character skill points
-charskpoint: 60
-
-// Resets another character's stats
-charreset: 60
-
-// Resets another character's status, skills
-charstreset: 60
-charskreset: 60
-
-// resets a char back to when it was first created
-charwipe: 60
-
-// Saves the respawn point of another character.
-charsave: 60
-
-// Kill another character without hitting them.
-kill: 60
-
-// Enable hitting a player even when not in pvp
-killer: 60
-
-// Warps a character to you
-recall: 60
-
-// Revives a character, and heals them.
-revive: 60
-
-// Warp another person to a certain map, at (x,y) coordinates
-charwarp: 60
-
-// Change Status of your character
-str: 60
-agi: 60
-vit: 60
-int: 60
-dex: 60
-luk: 60
-
-// Gets all skills
-allskills: 60
-
-// sets GM stats to maximum
-allstats: 60
-
-// Gives you job points.
-stpoint: 60
-
-// Gives you skill points of desired amount.
-skpoint: 60
-
-// To block definitively a player
-block: 60
-
-// To unblock a player
-unblock: 60
-
-// To ban a player for a limited time
-ban: 60
-
-// To unban a player
-unban: 60
-
-// To send specified character in jails
-jail: 60
-
-// To discharge a prisoner
-unjail: 60
-
-// drop a players possessions on the ground
-chardropall: 60
-
-// put a players possessions in storage
-charstoreall: 60
-
-// iterate over players
-// forward
-hugo: 60
-// backward
-linus: 60
-
-//----------------------
-// 80: "eA Dev"
-
-// set magic properties on a char
-setmagic: 80
-
-// list magic properties on a char
-magicinfo: 80
-
-// Set your character display options. (Visual effects of your character)
-option: 80
-
-// Gives you money (zeny) of desired amount.
-zeny: 80
-
-// Changes another character's zenny
-charzeny: 80
-
-// Set options on another character.
-charoption: 80
-
-// Create a static warp portal that lasts until the next reboot
-addwarp: 80
-
-// Set the map you are on to day.
-day: 80
-
-// Kills everyone on the server.
-doom: 80
-
-// Kills everyone on the map you are on.
-doommap: 80
-
-// Set the map you are currently on to night.
-night: 80
-
-// Recalls Everyone To Your Coordinates
-recallall: 80
-
-// Revives all players on the map.
-raisemap: 80
-
-// Revives all players on the server.
-raise: 80
-
-// Enables a NPC.
-enablenpc: 80
-
-// Disables a NPC.
-disablenpc: 80
-
-// Move a NPC
-npcmove: 80
-
-// turn skills on for a map
-skillon: 80
-
-// turn skills off for a map
-skilloff: 80
-
-// Enables lost skills.
-lostskill: 80
-
-// find id of item by name
-idsearch: 80
-
-// Creates an item of your choosing, either Item ID or Name (1 command + /item).
-item: 80
-
-// Creates weapon of desired element.
-produce: 80
-
-// ??
-itemcheck: 80
-
-
-//---------------------------
-// 99: "Admin"
-
-// drop all your items
-dropall: 99
-
-// Enables GVG on a map (2 same commands).
-gvgon: 99
-gpvpon: 99
-
-// Turns GVG (Guild v. Guild) off on a map (2 same commands).
-gvgoff: 99
-gpvpoff: 99
-
-// Enables platinum skills.
-questskill: 99
-
-// Display your ignore list (people from which you ignore wisps)
-ignorelist: 99
-
-// Display ignore list of a player (people from which the player ignore wisps)
-charignorelist: 99
-
-// Brings up your guild storage wherever you are.
-gstorage: 99
-
-// Do some visual effect on your character
-effect: 99
-
-// Changes character's model
-charmodel: 99
-
-// Starts Guild Wars
-agitstart: 99
-
-// Ends Guild Wars
-agitend: 99
-
-// Levels your guild to specified level
-guildlvl: 99
-
-// craete a party/guild
-guild: 99
-party: 99
-
-// Warps all online character of a guild to you. (at least one member of that guild must be on.)
-guildrecall: 99
-
-// Warps all online character of a party to you. (at least one party member must be online.)
-partyrecall: 99
-
-// Allows you to spy on any Guilds Guild chat. (at least one member of that guild must be on.)
-guildspy: 99
-
-//Allows you to spy on any party's party chat. (at least one party member must be online.)
-partyspy: 99
-
-// Saves a warp point.
-memo: 99
-
-// To get a peco to (un)ride for another player.
-charmountpeco: 99
-
-// Change your appearence to other players to a mob.
-disguise: 99
-
-//Restore your normal appearance.
-undisguise: 99
-
-// To change disguise of another player/GM
-chardisguise: 99
-charundisguise: 99
-
-// Display all items of a player (disabled due to reformed GM guidelines)
-charitemlist: 99
-
-// Display all items of a player's storage (disabled due to reformed GM guidelines)
-charstoragelist: 99
-
-// Display all items of a player's cart (disabled due to reformed GM guidelines)
-charcartlist: 99
-
-// Enables platinum skills of another player.
-charquestskill: 99
-
-// Enables lost skills of another player.
-charlostskill: 99
-
-// Changes your apperance.
-model: 99
-
-// To get a peco to (un)ride
-mountpeco: 99
-
-// Broadcast (with or without name).
-kami: 99
-kamib: 99
-
-// Disconnect all users from the server
-kickall: 99
-
-// Closes Map-Server
-mapexit: 99
-
-// Give information about terrain/area (debug function)
-gat: 99
-
-// Enables debugging
-packet: 99
-
-// Shows information about the map
-mapinfo: 99
-
-// Re-load item database (admin command)
-reloaditemdb: 99
-
-// Re-load monsters database (admin command)
-reloadmobdb: 99
-
-// Re-load skills database (admin command)
-reloadskilldb: 99
-
-// Re-load scripts (admin command)
-reloadscript: 99
-
-// Re-load GM level (admin command)
-reloadgmdb: 99
-
-// Brings up your personal storage wherever you are.
-storage: 99
diff --git a/conf/battle.conf b/conf/battle.conf
new file mode 100644
index 000000000..1eddfae35
--- /dev/null
+++ b/conf/battle.conf
@@ -0,0 +1,61 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+// Splitted up into multiple files by Skotlex.
+//--------------------------------------------------------------
+
+//General battle-related settings.
+import: conf/battle/battle.conf
+
+//Settings specific to the client.
+import: conf/battle/client.conf
+
+//General drop-related configs.
+import: conf/battle/drops.conf
+
+//Experience rates, exp penalties, stats and max level settings.
+import: conf/battle/exp.conf
+
+//GM levels, atcommands and hack-related configs.
+import: conf/battle/gm.conf
+
+//Guild and WoE settings
+import: conf/battle/guild.conf
+
+//Battleground settings
+import: conf/battle/battleground.conf
+
+//Item/card-specific and crafting related options.
+import: conf/battle/items.conf
+
+//Mob related configuration
+import: conf/battle/monster.conf
+
+//Party related configuration
+import: conf/battle/party.conf
+
+//Pet related configuration
+import: conf/battle/pet.conf
+
+//Homunc related configuration
+import: conf/battle/homunc.conf
+
+//Player specific settings
+import: conf/battle/player.conf
+
+//Skill related settings
+import: conf/battle/skill.conf
+
+//Status change related settings
+import: conf/battle/status.conf
+
+//Feature control (on/off) settings
+import: conf/battle/feature.conf
+
+// Anything else that didn't fit anywhere else.
+// Includes duel, day/night, mute/manner, log settings.
+import: conf/battle/misc.conf
+
+//Your custom config goes here.
+import: conf/import/battle_conf.txt
diff --git a/conf/battle/battle.conf b/conf/battle/battle.conf
new file mode 100644
index 000000000..2e84a23e5
--- /dev/null
+++ b/conf/battle/battle.conf
@@ -0,0 +1,152 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//--------------------------------------------------------------
+
+// Who should have a baseatk value (makes str affect damage)? (Note 3)
+enable_baseatk: 9
+
+// Who can have perfect flee? (Note 3)
+enable_perfect_flee: 1
+
+// Who can have critical attacks? (Note 3)
+// (Note that there are some skills that always do critical hit regardless of this)
+enable_critical: 17
+
+// Critical adjustment rate for non-players (Note 2)
+mob_critical_rate: 100
+critical_rate: 100
+
+// Should normal attacks give you a walk delay? (Note 3)
+// If no, characters can move as soon as they start an attack (attack animation
+// or walk animation may be omitted client-side, causing cropped attacks or
+// monsters that teleport to you)
+// Otherwise, the delay is equal to the 'attack animation' (amotion)
+attack_walk_delay: 15
+
+// 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.
+// NOTE: Only affects the normal delay from a single attack, not the delay added by the multihit_delay option below.
+pc_damage_walk_delay_rate: 20
+damage_walk_delay_rate: 100
+
+// Move-delay adjustment for multi-hitting attacks.
+// When hit by a multi-hitting skill like Lord of Vermillion or Jupitel Thunder, characters will be
+// unable to move for an additional "(number of hits -1) * multihit_delay" milliseconds.
+// 80 is the setting that feels like Aegis (vs Sonic Blows)
+// 230 is the setting that makes walkdelay last until the last hit (vs Jupitel thunder)
+multihit_delay: 80
+
+// Damaged delay rate for players (Note 2)
+// (Setting to no/0 will be like always endure)
+player_damage_delay_rate: 100
+
+// Should race or element be used to consider someone undead?
+// 0 = element undead
+// 1 = race undead
+// 2 = both (either one works)
+undead_detect_type: 0
+
+// Does HP recover if hit by an attribute that's same as your own? (Note 1)
+// (Will not work in Renewal)
+attribute_recover: no
+
+// What is the minimum and maximum hitrate of normal attacks?
+min_hitrate: 5
+max_hitrate: 100
+
+// Type of penalty that is applied to FLEE when more than agi_penalty_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = agi_penalty_num is reduced from FLEE as a %
+// 2 = agi_penalty_num is reduced from FLEE as an exact amount
+agi_penalty_type: 1
+
+// When agi penalty is enabled, to whom it should apply to? (Note 3)
+// By default, only players get the penalty.
+agi_penalty_target: 1
+
+// Amount of enemies required to be targetting player before FLEE begins to be penalized
+agi_penalty_count: 3
+
+// Amount of FLEE penalized per each attacking monster more than agi_penalty_count
+agi_penalty_num: 10
+
+// Type of penalty that is applied to both equipment and vit DEF when more than vit_penalty_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = vit_penalty_num is reduced from DEF as a %
+// 2 = vit_penalty_num is reduced from DEF as an exact amount
+vit_penalty_type: 1
+
+// When vit penalty is enabled, to whom it should apply to? (Note 3)
+// By default, only players get the penalty.
+vit_penalty_target: 1
+
+// Amount of enemies required to be targetting player before defense begins to be penalized
+vit_penalty_count: 3
+
+// Amount of VIT defense penalized per each attacking monster more than vit_penalty_count
+vit_penalty_num: 5
+
+// Use alternate method of DEF calculation for physical attacks.
+// With 0, disabled (use normal def% reduction with further def2 reduction)
+// At 1 or more defense is subtraction of (DEF* value).
+// eg: 10 + 50 def becomes 0 + (10*type + 50)
+weapon_defense_type: 0
+
+// MDEF, same as above....(MDEF*value)
+magic_defense_type: 0
+
+// Change attacker's direction to face opponent on every attack? (Note 3)
+attack_direction_change: 15
+
+// For those who is set, their innate attack element is "not elemental"
+// (100% versus on all defense-elements) (Note 3)
+// NOTE: This is the setting that makes it so non-players can hit for full
+// damage against Ghost-type targets with normal attacks (eg: vs. Ghostring).
+attack_attr_none: 14
+
+// Rate at which equipment can break (base rate before it's modified by any skills)
+// 1 = 0.01% chance. Default for official servers: 0
+equip_natural_break_rate: 0
+
+// Overall rate of which your own equipment can break. (Note 2)
+// This rate affects penalty breaking rate of skills such as power-thrust and your natural breaking rate
+// (from equip_natural_break_rate). If a Sage's endow skill fails and this is above 0, the selected char's
+// weapon will be broken.
+equip_self_break_rate: 100
+
+// Overall rate at which you can break target's equipment. (Note 2)
+// This affects the behaviour of skills like acid terror and meltdown
+equip_skill_break_rate: 100
+
+// Do weapon attacks have a attack speed delay before actual damage is applied? (Note 1)
+// NOTE: The official setting is yes, even thought it degrades performance a bit.
+delay_battle_damage: yes
+
+// Are arrows/ammo consumed when used on a bow/gun?
+// 0 = No
+// 1 = Yes
+// 2 = Yes even for skills that do not specify arrow consumption when said
+// skill is weapon-based and used with ranged weapons (auto-guesses which
+// skills should consume ammo when it's acquired via a card or plagiarize)
+arrow_decrement: 1
+
+// Should the item script bonus 'Autospell' check for range/obstacles before casting?
+// Official behavior is "no", setting this to "yes" will make skills use their defined
+// range. For example, Sonic Blow requires a 2 cell distance before autocasting is allowed.
+// This setting also affects autospellwhenhit.
+autospell_check_range: no
+
+// If both the attacker and the target are on the same tile, should the target be knocked back to the left?
+// Official behavior is "yes", setting this to "no" will knock the target back behind the attacker.
+knockback_left: yes
+
+// Should the target be able of dodging damage by snapping away to the edge of the screen?
+// Official behavior is "no"
+snap_dodge: no
diff --git a/conf/battle/battleground.conf b/conf/battle/battleground.conf
new file mode 100644
index 000000000..b4c0b2fbd
--- /dev/null
+++ b/conf/battle/battleground.conf
@@ -0,0 +1,17 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Flee penalty on BG grounds.
+// NOTE: It's %, not absolute, so 20 is -20% of your total flee
+bg_flee_penalty: 20
+
+// Interval before updating the bg-member map mini-dots (milliseconds)
+bg_update_interval: 1000
diff --git a/conf/battle/client.conf b/conf/battle/client.conf
new file mode 100644
index 000000000..5089fa4a5
--- /dev/null
+++ b/conf/battle/client.conf
@@ -0,0 +1,128 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//--------------------------------------------------------------
+
+// Whether to enable the official packet obfuscation support (good vs WPE)
+// 0: disabled
+// 1: optional (not recommended) -- identifies whether it is required
+// 2: enabled (recommended)
+packet_obfuscation: 1
+
+// Minimum delay between whisper/global/party/guild messages (in ms)
+// Messages that break this threshold are silently omitted.
+min_chat_delay: 0
+
+// Valid range of dyes and styles on the client.
+min_hair_style: 0
+max_hair_style: 29
+min_hair_color: 0
+max_hair_color: 8
+min_cloth_color: 0
+max_cloth_color: 4
+
+// When set to yes, the damage field in packets sent from woe maps will be set
+// to -1, making it impossible for GMs, Bots and Hexed clients to know the
+// actual damage caused by attacks. (Note 1)
+hide_woe_damage: yes
+
+// "hair style" number that identifies pet.
+// NOTE: The client uses the "hair style" field in the mob packet to tell them apart from mobs.
+// This value is always higher than the max hair-style available in said client.
+// Known values to work (all 2005 clients):
+// older sakexes: 20
+// sakexe 0614: 24
+// sakexe 0628 (and later): 100
+pet_hair_style: 100
+
+// Visible area size (how many squares away from a player can they see)
+area_size: 14
+
+// Maximum walk path (how many cells a player can walk going to cursor)
+// default: 17(official)
+max_walk_path: 17
+
+// Maximum allowed 'level' value that can be sent in unit packets.
+// Use together with the aura_lv setting to tell when exactly to show the aura.
+// NOTE: You also need to adjust the client if you want this to work.
+// NOTE: Default is 99. Values above 127 will probably behave incorrectly.
+// NOTE: If you don't know what this does, don't change it!!!
+max_lv: 99
+
+// Level required to display an aura.
+// NOTE: This assumes that sending max_lv to the client will display the aura.
+// NOTE: aura_lv must not be less than max_lv.
+// Example: If max_lv is 99 and aura_lv is 150, characters with level 99~149
+// will be sent as being all level 98, and only characters with level
+// 150 or more will be reported as having level 99 and show an aura.
+aura_lv: 99
+
+// Units types affected by max_lv and aura_lv settings. (Note 3)
+// Note: If an unit type, which normally does not show an aura, is
+// set it will obtain an aura when it meets the level requirement.
+// Default: 0 (none)
+client_limit_unit_lv: 0
+
+// Will tuxedo and wedding dresses be shown when worn? (Note 1)
+wedding_modifydisplay: no
+
+// Save Clothes color. (This will degrade performance) (Note 1)
+save_clothcolor: yes
+
+// Do not display cloth colors for the wedding costume?
+// Note: Both save_clothcolor and wedding_modifydisplay have to be enabled
+// for this option to take effect. Set this to yes if your cloth palettes
+// pack doesn't has wedding palettes (or has less than the other jobs)
+wedding_ignorepalette: no
+
+// Do not display cloth colors for the Xmas costume?
+// Set this to yes if your cloth palettes pack doesn't has Xmas palettes (or has less than the other jobs)
+xmas_ignorepalette: no
+
+// Do not display cloth colors for the Summer costume?
+// Set this to yes if your cloth palettes pack doesn't has Summer palettes (or has less than the other jobs)
+summer_ignorepalette: no
+
+// Do not display cloth colors for the Hanbok costume?
+// Set this to yes if your cloth palettes pack doesn't has Hanbok palettes (or has less than the other jobs)
+hanbok_ignorepalette: no
+
+// Show Hercules version to users when the login?
+display_version: no
+
+// When affected with the "Hallucination" status effect, send the effect to client? (Note 1)
+// Note: Set to 'no' if the client lags due to the "Wavy" screen effect.
+display_hallucination: yes
+
+// Set this to 1 if your client supports status change timers and you want to use them
+// Clients from 2009 onward support this
+display_status_timers: yes
+
+// Randomizes the dice emoticon server-side, to prevent clients from forging
+// packets for the desired number. (Note 1)
+client_reshuffle_dice: yes
+
+// Sorts the character and guild storage before it is sent to the client.
+// Official servers do not sort storage. (Note 1)
+// NOTE: Enabling this option degrades performance.
+client_sort_storage: no
+
+// Duration of client's self mute in minutes.
+// Note: Do not enable this, if you enabled commands for players,
+// because the client sees multiple commands in succession as spam.
+// Default: 0 (means disabled)
+client_accept_chatdori: 0
+
+// Limits use of blank (transparent) pixels in guild emblems to a set
+// percentage of the total.
+// Official servers do not enforce this technically to date, but some disallow
+// use of blank emblems in their rules. (Note 2)
+// A value of 100 (allowing 100% blank pixels) disables this check.
+// NOTE: Enabling this option slightly degrades performance.
+client_emblem_max_blank_percent: 100
diff --git a/conf/battle/drops.conf b/conf/battle/drops.conf
new file mode 100644
index 000000000..424c46f5b
--- /dev/null
+++ b/conf/battle/drops.conf
@@ -0,0 +1,134 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+//--------------------------------------------------------------
+
+// If an item is dropped, does it go straight into the users inventory? (Note 1)
+item_auto_get: no
+
+// How long does it take for an item to disappear from the floor after it is dropped? (in milliseconds)
+flooritem_lifetime: 60000
+
+// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds)
+item_first_get_time: 3000
+
+// Grace time during which only the first and second person who did the most damage to a monster can get the item? (in milliseconds)
+// (Takes effect after item_first_get_time elapses)
+item_second_get_time: 1000
+
+// Grace time during which only the first, second and third person who did the most damage to a monster can get the item? (in milliseconds)
+// (Takes effect after the item_second_get_time elapses)
+item_third_get_time: 1000
+
+// Grace time to apply to MvP reward items when the Most Valuable Player can't get the prize item and it drops on the ground? (in milliseconds)
+mvp_item_first_get_time: 10000
+
+// Grace time for the first and second MvP so they can get the item? (in milliseconds)
+// (Takes effect after mvp_item_first_get_time elapses)
+mvp_item_second_get_time: 10000
+
+// Grace time for the first, second and third MvP so they can get the item? (in milliseconds)
+// (Takes effect after mvp_item_second_get_time elapses)
+mvp_item_third_get_time: 2000
+
+// Item drop rates (Note 2)
+
+// The rate the common items are dropped (Items that are in the ETC tab, besides card)
+item_rate_common: 100
+item_rate_common_boss: 100
+item_drop_common_min: 1
+item_drop_common_max: 10000
+
+// The rate healing items are dropped (items that restore HP or SP)
+item_rate_heal: 100
+item_rate_heal_boss: 100
+item_drop_heal_min: 1
+item_drop_heal_max: 10000
+
+// The rate at which usable items (in the item tab) other then healing items are dropped.
+item_rate_use: 100
+item_rate_use_boss: 100
+item_drop_use_min: 1
+item_drop_use_max: 10000
+
+// The rate at which equipment is dropped.
+item_rate_equip: 100
+item_rate_equip_boss: 100
+item_drop_equip_min: 1
+item_drop_equip_max: 10000
+
+// The rate at which cards are dropped
+item_rate_card: 100
+item_rate_card_boss: 100
+item_drop_card_min: 1
+item_drop_card_max: 10000
+
+// The rate adjustment for the MVP items that the MVP gets directly in their inventory
+item_rate_mvp: 100
+item_drop_mvp_min: 1
+item_drop_mvp_max: 10000
+
+// The rate adjustment for card-granted item drops.
+item_rate_adddrop: 100
+item_drop_add_min: 1
+item_drop_add_max: 10000
+
+// Rate adjustment for Treasure Box drops (these override all other modifiers)
+item_rate_treasure: 100
+item_drop_treasure_min: 1
+item_drop_treasure_max: 10000
+
+// Use logarithmic drops? (Note 1)
+// Logarithmic drops scale drop rates in a non-linear fashion using the equation
+// Droprate(x,y) = x * (5 - log(x)) ^ (ln(y) / ln(5))
+// Where x is the original drop rate and y is the drop_rate modifier (the previously mentioned item_rate* variables)
+// Use the following table for an idea of how the rate will affect drop rates when logarithmic drops are used:
+// Y: Original Drop Rate
+// X: Rate drop modifier (eg: item_rate_equip)
+// X\Y | 0.01 0.02 0.05 0.10 0.20 0.50 1.00 2.00 5.00 10.00 20.00
+// -----+---------------------------------------------------------------
+// 50 | 0.01 0.01 0.03 0.06 0.11 0.30 0.62 1.30 3.49 7.42 15.92
+// 100 | 0.01 0.02 0.05 0.10 0.20 0.50 1.00 2.00 5.00 10.00 20.00
+// 200 | 0.02 0.04 0.09 0.18 0.35 0.84 1.61 3.07 7.16 13.48 25.13
+// 500 | 0.05 0.09 0.22 0.40 0.74 1.65 3.00 5.40 11.51 20.00 33.98
+// 1000 | 0.10 0.18 0.40 0.73 1.30 2.76 4.82 8.28 16.47 26.96 42.69
+// 2000 | 0.20 0.36 0.76 1.32 2.28 4.62 7.73 12.70 23.58 36.33 53.64
+// 5000 | 0.50 0.86 1.73 2.91 4.81 9.11 14.45 22.34 37.90 53.91 72.53
+//10000 | 1.00 1.67 3.25 5.28 8.44 15.24 23.19 34.26 54.57 72.67 91.13
+//20000 | 2.00 3.26 6.09 9.59 14.83 25.49 37.21 52.55 77.70 97.95 100%
+//50000 | 5.00 7.87 13.98 21.12 31.23 50.31 69.56 92.48 100% 100% 100%
+item_logarithmic_drops: no
+
+// Can the monster's drop rate become 0? (Note 1)
+// Default: no (as in official servers).
+drop_rate0item: no
+
+// Makes your LUK value affect drop rates on an absolute basis.
+// Setting to 100 means each luk adds 0.01% chance to find items
+// (regardless of item's base drop rate).
+drops_by_luk: 0
+
+// Makes your LUK value affect drop rates on a relative basis.
+// Setting to 100 means each luk adds 1% chance to find items
+// (So at 100 luk, everything will have double chance of dropping).
+drops_by_luk2: 0
+
+// Whether or not Marine Spheres and Floras summoned by Alchemist drop items?
+// This setting has three available values:
+// 0: Nothing drops.
+// 1: Only marine spheres drop items.
+// 2: All alchemist summons drop items.
+alchemist_summon_reward: 1
+
+// Make broadcast ** Player1 won Pupa's Pupa Card (chance 0.01%) ***
+// This can be set to any value between 0~10000.
+// Note: It also announces STEAL skill usage with rare items
+// 0 = don't show announces at all
+// 1 = show announces for 0.01% drop chance items
+// 333 = show announces for 3.33% or lower drop chance items
+// 10000 = show announces for all items
+rare_drop_announce: 0
diff --git a/conf/battle/exp.conf b/conf/battle/exp.conf
new file mode 100644
index 000000000..7c781d3a3
--- /dev/null
+++ b/conf/battle/exp.conf
@@ -0,0 +1,91 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: The max level of classes is stored in the exp table.
+// See files db/exp.txt and db/exp2.txt to change them.
+//--------------------------------------------------------------
+
+// Rate at which exp. is given. (Note 2)
+base_exp_rate: 100
+
+// Rate at which job exp. is given. (Note 2)
+job_exp_rate: 100
+
+// Turn this on to allow a player to level up more than once from a kill. (Note 1)
+multi_level_up: no
+
+// Setting this can cap the max experience one can get per kill specified as a
+// % of the current exp bar. (Every 10 = 1.0%)
+// For example, set it to 500 and no matter how much exp the mob gives,
+// it can never give you above half of your current exp bar.
+max_exp_gain_rate: 0
+
+// Method of calculating earned experience when defeating a monster:
+// 0 = uses damage given / total damage as damage ratio
+// 1 = uses damage given / max_hp as damage ratio
+// NOTE: Using type 1 disables the bonus where the first attacker gets
+// his share of the exp doubled when multiple people attack the mob.
+exp_calc_type: 0
+
+// Experience increase per attacker. That is, every additional attacker to the
+// monster makes it give this much more experience
+// (eg: 5 people attack with 25 here, +(25*4)% -> +100% exp)
+exp_bonus_attacker: 25
+
+// Max number of attackers at which exp bonus is capped
+// (eg: if set at 5, the max bonus is 4*bonus-per-char regardless of attackers)
+exp_bonus_max_attacker: 12
+
+// MVP bonus exp rate. (Note 2)
+mvp_exp_rate: 100
+
+// Rate of base/job exp given by NPCs. (Note 2)
+quest_exp_rate: 100
+
+// The rate of job exp. from using Heal skill (100 is the same as the heal amount, 200 is double.
+// The balance of the exp. rate is best used with 5 to 10)
+heal_exp: 0
+
+// The rate of exp. that is gained by the process of resurrection, a unit is 0.01%.
+// Experience calculations for the experience value * level difference of the person revived / 100 * resurrection_exp/10000 which the revived player has can be got.
+resurrection_exp: 0
+
+// The rate of job exp. when using discount and overcharge on an NPC
+// (in 0.01% increments - 100 is 1%, 10000 is normal, 20000 is double.)
+// The way it is calculated is (money received * skill lv) * shop_exp / 10000.
+shop_exp: 0
+
+// PVP exp. Do players get exp in PvP maps
+// (Note: NOT exp from players, but from normal leveling)
+pvp_exp: yes
+
+// When a player dies, how should we penalize them?
+// 0 = No penalty.
+// 1 = Lose % of current level when killed.
+// 2 = Lose % of total experience when killed.
+death_penalty_type: 1
+
+// Base exp. penalty rate (Each 100 is 1% of their exp)
+death_penalty_base: 100
+
+// Job exp. penalty rate (Each 100 is 1% of their exp)
+death_penalty_job: 100
+
+// When a player dies (to another player), how much zeny should we penalize them with?
+// NOTE: It is a percentage of their zeny, so 100 = 1%
+zeny_penalty: 0
+
+// Will display experience gained from killing a monster. (Note 1)
+disp_experience: no
+
+// Will display zeny earned (from mobs, trades, etc) (Note 1)
+disp_zeny: no
+
+// Use the contents of db/statpoint.txt when doing a stats reset and leveling up? (Note 1)
+// If no, an equation will be used which preserves statpoints earned/lost
+// through external means (ie: stat point buyers/sellers)
+use_statpoint_table: yes
diff --git a/conf/battle/feature.conf b/conf/battle/feature.conf
new file mode 100644
index 000000000..161ea324d
--- /dev/null
+++ b/conf/battle/feature.conf
@@ -0,0 +1,29 @@
+//--------------------------------------------------------------
+// Hercules Feature Configuration File
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Buying store (Note 1)
+// Requires: 2010-04-27aRagexeRE or later
+feature.buying_store: on
+
+// Search stores (Note 1)
+// Requires: 2010-08-03aRagexeRE or later
+feature.search_stores: on
+
+// Atcommand suggestions (Note 1)
+// If one type incomplete atcommand, it will suggest the complete ones.
+feature.atcommand_suggestions: off
+
+// Banking (Note 1)
+// Requires: 2013-07-24aRagexe or later
+feature.banking: on
+
+// Auction (Note 1)
+// Feature became unstable on clients 2012 onwards (exact date not known),
+// it has been fixed on clients 2013-05-15 onwards however.
+feature.auction: off
diff --git a/conf/battle/gm.conf b/conf/battle/gm.conf
new file mode 100644
index 000000000..7370da6c5
--- /dev/null
+++ b/conf/battle/gm.conf
@@ -0,0 +1,37 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+//--------------------------------------------------------------
+
+// The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
+atcommand_spawn_quantity_limit: 100
+
+// Maximum number of slave-clones that can be have by using the @slaveclone at command. (0 denotes unlimited quantity)
+atcommand_slave_clone_limit: 25
+
+// If 'no', commands require exact player name. If 'yes', entering a partial
+// name will work, as long as there's only one match from all players in the
+// current map server.
+partial_name_scan: yes
+
+// (@) @allstats/@str/@agi/@vit/@int/@dex/@luk
+// allow gms to bypass the maximum stat parameter? ( if yes gm stats can go up to 32k ) default: no
+atcommand_max_stat_bypass: no
+
+// Ban people that try trade dupe.
+// Duration of the ban, in minutes (default: 5). To disable the ban, set 0.
+ban_hack_trade: 5
+
+// requires RENEWAL_DROP to be enabled (src/map/config/renewal.h)
+// modifies @mobinfo to display the users' real drop rate as per renewal_drop formula
+// modifies @iteminfo to not display the minimum item drop rate (since it can't tell the mob level)
+atcommand_mobinfo_type: 0
+
+// Ignore warpable area configuration.
+// Set the minimum group id to ignore invalid cells when warping.
+// Default group is 2. Use 100 to disable this setting.
+gm_ignore_warpable_area: 2
diff --git a/conf/battle/guild.conf b/conf/battle/guild.conf
new file mode 100644
index 000000000..91c39fe71
--- /dev/null
+++ b/conf/battle/guild.conf
@@ -0,0 +1,49 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+//--------------------------------------------------------------
+
+// When making a guild, an Emperium is consumed? (Note 1)
+guild_emperium_check: yes
+
+// Maximum tax limit on a guild member.
+guild_exp_limit: 50
+
+// Maximum castles one guild can own (0 = unlimited)
+guild_max_castles: 0
+
+// Restart guild skills cooldown by relog? (Note 1)
+// When "no", you relog with the same cooldown remaining as from when you logged out, "yes" restarts the cooldown upon login to its full duration.
+guild_skill_relog_delay: no
+
+// Damage adjustments for WOE battles against defending Guild monsters (Note 2)
+castle_defense_rate: 100
+
+// Flee penalty on gvg grounds. Official value is 20 (Note 2)
+// NOTE: It's %, not absolute, so 20 is -20% of your total flee
+gvg_flee_penalty: 20
+
+// Can the 'Glory of Guild' skill be learnt in the Guild window,
+// and does changing emblems require it? (Note 1)
+// P.S: This skill is not implemented on official servers
+require_glory_guild: no
+
+// Limit Guild alliances. Value is 0 to 3.
+// If you want to change this value, clear the guild alliance table.
+// Default is 3
+max_guild_alliance: 3
+
+// When to re-display the guild notice
+// Upon teleporting (regardless of changing maps): 2 (official)
+// Upon changing maps: 1
+// Do not re-display: 0 (disabled)
+guild_notice_changemap: 2
+
+// Can guild members invite/expel members inside guild castles in WoE/GvG? (Note 1)
+// default: no
+guild_castle_invite: no
+guild_castle_expulsion: no \ No newline at end of file
diff --git a/conf/battle/homunc.conf b/conf/battle/homunc.conf
new file mode 100644
index 000000000..a7b96cb26
--- /dev/null
+++ b/conf/battle/homunc.conf
@@ -0,0 +1,45 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Homunculus setting (Note 3)
+// Activates various 'quirks' that makes them behave unlike normal characters.
+// 0x001: Can't be targetted by support skills (except for their master)
+// 0x004: Mobs will always go after them instead of players until attacked
+// 0x008: Copy their master's speed on spawn/map-change
+// 0x010: They display luk/3+1 instead of their actual critical in the
+// stat window (by default they don't crit)
+// 0x020: Their Min-Matk is always the same as their max
+// 0x040: Skill re-use delay is reset when they are vaporized.
+hom_setting: 0x3D
+
+// The rate a homunculus will get friendly by feeding it. (Note 2)
+homunculus_friendly_rate: 100
+
+// Can you name a homunculus more then once? (Note 1)
+hom_rename: yes
+
+// Intimacy needed to use Evolved Vanilmirth's Bio Explosion
+hvan_explosion_intimate: 45000
+
+// Show stat growth to the owner when an Homunculus levels up
+homunculus_show_growth: yes
+
+// Does autoloot work, when a monster is killed by homunculus only?
+homunculus_autoloot: yes
+
+// Should homunculi Vaporize when Master dies?
+homunculus_auto_vapor: yes
+
+// Max level for regular Homunculus
+homunculus_max_level: 99
+
+// Max level for Homunculus S
+homunculus_S_max_level: 150
diff --git a/conf/battle/items.conf b/conf/battle/items.conf
new file mode 100644
index 000000000..09210a3ea
--- /dev/null
+++ b/conf/battle/items.conf
@@ -0,0 +1,95 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
+vending_max_value: 1000000000
+
+// Whether to allow buying from vending chars that are at their max. zeny limit.
+// If set to yes, the rest of the zeny above the char's capacity will disappear.
+vending_over_max: yes
+
+// Tax to apply to all vending transactions (eg: 10000 = 100%, 50 = 0.50%)
+// When a tax is applied, the item's full price is charged to the buyer, but
+// the vender will not get the whole price paid (they get 100% - this tax).
+vending_tax: 200
+
+// Show the buyer's name when successfully vended an item
+buyer_name: yes
+
+// Forging success rate. (Note 2)
+weapon_produce_rate: 100
+
+// Prepare Potion success rate. (Note 2)
+potion_produce_rate: 100
+
+// Do produced items have the maker's name on them? (Note 3)
+// 0x01: Produced Weapons
+// 0x02: Produced Potions
+// 0x04: Produced Arrows
+// 0x08: Produced Holy Water/Ancilla
+// 0x10: Produced Deadly Potions
+// 0x80: Other produced items.
+produce_item_name_input: 0x03
+
+// Is a monster summoned via dead branch aggressive? (Note 1)
+dead_branch_active: yes
+
+// Should summoned monsters check the player's base level? (dead branches) (Note 1)
+// On officials this is no - monsters summoned from dead/bloody branches can be ANY level.
+// Change to 'yes' to only summon monsters less than or equal to the player's base level.
+random_monster_checklv: no
+
+// Can any player equip any item regardless of the gender restrictions
+// NOTE: Wedding Rings and Whips/Musical Instruments will check gender regardless of setting.
+ignore_items_gender: yes
+
+// Item check? (Note 1)
+// On map change it will check for items not tagged as "available" and
+// auto-delete them from inventory/cart.
+// NOTE: An item is not available if it was not loaded from the item_db or you
+// specify it as unavailable in db/item_avail.txt
+item_check: no
+
+// How much time must pass between item uses?
+// Only affects the delay between using items, prevents healing item abuse. Recommended ~500 ms
+// On officials this is 0, but it's set to 100ms as a measure against bots/macros.
+item_use_interval: 100
+
+// How much time must pass between cash food uses? Default: 60000 (1 min)
+cashfood_use_interval: 60000
+
+// Required level of bNoMagicDamage before Status Changes are blocked (Golden Thief Bug card).
+// For example, if left at 50. An item can give bNoMagicDamage,40;
+// which reduces magic damage by 40%, but does not blocks status changes.
+gtb_sc_immunity: 50
+
+// Enable autospell card effects to stack?
+// NOTE: Different cards that grant the same skill will both
+// always work independently of each other regardless of setting.
+autospell_stacking: no
+
+// Will disabled consumables (disabled by map_zone_db.conf) be consumed when trying to use them?
+// 1 (official): yes
+// 0: no
+item_restricted_consumption_type: 1
+
+// Enable all NPC to allow changing of equipments while interacting? (Note 1)
+// Script commands 'enable_items/disable_items' will not be override. (see doc/script_commands.txt)
+// 1 : yes(official)
+// 0 : no
+item_enabled_npc: 1
+
+// Unequip the equipments that has disabled by map_zone_db.conf ?
+// 0 : disabled equipments and cards are nullify (official)
+// 1 : disabled equipments are unequip, disabled cards are nullify
+// 2 : disabled equipments are nullify, disabled cards will caused the equipment to unequip
+// 3 : disabled equipments are unequip, disabled cards will caused the equipment to unequip (1+2)
+unequip_restricted_equipment: 0
diff --git a/conf/battle/misc.conf b/conf/battle/misc.conf
new file mode 100644
index 000000000..dd3d57aaa
--- /dev/null
+++ b/conf/battle/misc.conf
@@ -0,0 +1,137 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// PK Server Mode. Turns entire server pvp(excluding towns). Experience loss is doubled if killed by another player.
+// When players hunt monsters over 20 levels higher, they will receive 15% additional exp., and 25% chance of receiving more items.
+// There is a nopvp.txt for setting up maps not to have pk on in this mode. Novices cannot be attacked and cannot attack.
+// Normal pvp counter and rank display are disabled as well.
+// Note: If pk_mode is set to 2 instead of 1 (yes), players will receive a
+// manner penalty of 5 each time they kill another player (see manner_system
+// config to adjust how this will affect players)
+pk_mode: 0
+
+// Manner/karma system configuration. Specifies how does negative manner
+// (red no chat bubble) affects players (add as needed):
+// 0: No penalties.
+// 1: Disables chatting (includes whispers, party/guild msgs, etc)
+// 2: Disables skill usage
+// 4: Disables commands usage
+// 8: Disables item usage/picking/dropping
+// 16: Disables room creation (chatrooms and vending shops)
+manner_system: 31
+
+// For PK Server Mode. Change this to define the minimum level players can start PK-ing
+pk_min_level: 55
+
+// For PK Server Mode. It specifies the maximum level difference between
+// players to let them attack each other. 0 disables said limit.
+pk_level_range: 0
+
+// Display skill usage in console? (for debug only) (default: off) (Note 3)
+skill_log: off
+
+// Display battle log? (for debug only) (default: off) (Note 1)
+battle_log: off
+
+// Display other stuff? (for debug only) (default: off) (Note 1)
+etc_log: off
+
+// Do you want to debug warp points? If set to yes, warp points will appear as flags.(Note 1)
+// It will also run on start-up a warp-check to print out which warp points lead directly on
+// top of on-touch npcs (which can lead to infinite loopback warping situations)
+warp_point_debug: no
+
+// Choose if server begin with night (yes) or day (no)
+night_at_start: no
+
+// Define duration in msec of the day (default: 7200000 = 2 hours)
+// Set to 0 to disable day cycle (but not @day GM command).
+// Except 0, minimum is 60000 (1 minute)
+day_duration: 0
+
+// Define duration in msec of the night (default: 1800000 = 30 min)
+// Set to 0 to disable night cycle (but not @night GM command).
+// Except 0, minimum is 60000 (1 minute)
+night_duration: 0
+
+// Using duel on pvp-maps
+duel_allow_pvp: no
+
+// Using duel on gvg-maps
+duel_allow_gvg: no
+
+// Allow using teleport/warp when dueling
+duel_allow_teleport: no
+
+// Autoleave duel when die
+duel_autoleave_when_die: yes
+
+// Delay between using @duel in minutes
+duel_time_interval: 60
+
+// Restrict duel usage to same map
+duel_only_on_same_map: no
+
+// Determines max number of characters that can stack within a single cell.
+// NOTE: For this setting to make effect you have to use a server compiled with
+// Cell Stack Limit support (see src/map/map.h)
+cell_stack_limit: 1
+
+// Allow autotrade only in map with autotrade flag?
+// Set this to "no" will allow autotrade where no "autotrade" mapflag is set
+// Set this to "yes" to only allow autotrade on maps with "autotrade" mapflag
+at_mapflag: no
+
+// Set this to the amount of minutes autotrade chars will be kicked from the server.
+at_timeout: 0
+
+// Auction system, fee per hour. Default is 12000
+auction_feeperhour: 12000
+
+// Auction maximum sell price
+auction_maximumprice: 500000000
+
+// Minimum delay between each store search query in seconds.
+searchstore_querydelay: 10
+
+// Maximum amount of results a store search query may yield, before
+// it is canceled.
+searchstore_maxresults: 30
+
+// Whether or not gaining and loosing of cash points is displayed (Note 1).
+// Default: no
+cashshop_show_points: no
+
+// Whether or not mail box status is displayed upon login.
+// Default: 0
+// 0 = No
+// 1 = Yes
+// 2 = Yes, when there are unread mails
+mail_show_status: 0
+
+// Is monster transformation disabled during Guild Wars?
+// If set to yes, monster transforming is automatically removed/disabled when entering castles during WoE times
+mon_trans_disable_in_gvg: no
+
+// Whether AegisName and SpriteName lookups are case sensitive
+// Default: yes (as in official servers)
+// When this is set to yes, item and monster lookups through atcommands and
+// script commands will match AegisNames and SpriteNames only when the case
+// matches. Display name lookups are not affected by this setting.
+// Example: Given the two items:
+// - { Id: 553, AegisName: "Bun", Name: "Bao" }
+// - { Id: 6115, AegisName: "Bun_", Name: "Bun" }
+// query when 'yes' when 'no'
+// @item bun # 6115 # 553
+// @item Bun # 553 # 553
+// @item Bao # 553 # 553
+// @item Bun_ # 6115 # 6115
+case_sensitive_aegisnames: yes
diff --git a/conf/battle/monster.conf b/conf/battle/monster.conf
new file mode 100644
index 000000000..9ca8df825
--- /dev/null
+++ b/conf/battle/monster.conf
@@ -0,0 +1,218 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// The HP rate of MVPs. (Note 2)
+mvp_hp_rate: 100
+
+// The HP rate of normal monsters (that is monsters that are not MVP's) (Note 2)
+monster_hp_rate: 100
+
+// The maximum attack speed of a monster
+monster_max_aspd: 199
+
+// Defines various mob AI related settings. (Note 3)
+// 0x001: When enabled mobs will update their target cell every few iterations
+// (normally they never update their target cell until they reach it while
+// chasing)
+// 0x002: Makes mob use their "rude attack" skill (usually warping away) if they
+// are attacked and they can't attack back regardless of how they were
+// attacked (eg: GrimTooth), otherwise, their rude attack" is only activated
+// if they can't melee reach the target (eg: sniping)
+// 0x004: If not set, mobs that can change target only do so when melee attacked
+// (distance player/mob < 3), otherwise mobs may change target and chase
+// ranged attackers. This flag also overrides the 'provoke' target.
+// 0x008: When set, mobs scatter as soon as they lose their target. Use this mode
+// to make it much harder to mob-train by hiding and collecting them on a
+// single spot (ie: GrimTooth training)
+// 0x010: If set, mob skills defined for friends will also trigger on themselves.
+// 0x020: When set, the monster ai is executed for all monsters in maps that
+// have players on them, instead of only for mobs who are in the vicinity
+// of players.
+// 0x040: 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)
+// 0x100: When set, a mob will pick a random skill from it's list and start from
+// that instead of checking skills in orders (when unset, if a mob has too
+// many skills, the ones near the end will rarely get selected)
+// 0x200: When set, a mob's skill re-use delay will not be applied to all entries of
+// the same skill, instead, only to that particular entry (eg: Mob has heal
+// on six lines in the mob_skill_db, only the entry that is actually used
+// will receive the delay). This will make monsters harder, especially MvPs.
+// 0x400: Set this to make mobs have a range of 9 for all skills. Otherwise, they
+// will obey the normal skill range rules.
+// Example: 0x140 -> Chase players through warps + use skills in random order.
+monster_ai: 0
+
+// How often should a monster rethink its chase?
+// 0: Every 100ms (MIN_MOBTHINKTIME)
+// 1: Every cell moved (official)
+// 2: Every 2 cells moved
+// 3: Every 3 cells moved (previous setting)
+// x: Every x cells moved
+// Regardless of this setting, a monster will always rethink its chase if it has
+// reached its target. Increase this value if you want to make monsters continue
+// moving after they lost their target (hide, loot picked, etc.).
+monster_chase_refresh: 1
+
+// Should mobs be able to be warped (add as needed)?
+// 0: Disable.
+// 1: Enable mob-warping when standing on NPC-warps
+// 2: Enable mob-warping when standing on Priest Warp Portals
+// 4: Disable warping when the target map is a 'nobranch' map.
+mob_warp: 0
+
+// If these are set above 0, they define the time (in ms) during which monsters
+// will have their 'AI' active after all players have left their vicinity.
+mob_active_time: 0
+boss_active_time: 0
+
+// Mobs and Pets view-range adjustment (range2 column in the mob_db) (Note 2)
+view_range_rate: 100
+
+// Chase Range is the base minimum-chase that a mob gives before giving up
+// (as long as the target is outside their field of view). This is the range3
+// column in the mob_db. (Note 2)
+chase_range_rate: 100
+
+// Allow monsters to be aggresive and attack first? (Note 1)
+monster_active_enable: yes
+
+// Should the mob_db names override the mob names specified in the spawn files?
+// 0: No
+// 1: always use the mob_db Name column (english mob name)
+// 2: always use the mob_db JName column (original Kro mob name)
+override_mob_names: 0
+
+// Monster damage delay rate (Note 1)
+// Setting to no/0 is like they always have endure.
+monster_damage_delay_rate: 100
+
+// Looting monster actions.
+// 0 = Monster will consume the item.
+// 1 = Monster will not consume the item.
+monster_loot_type: 0
+
+// Chance of mob casting a skill (Note 2)
+// Higher rates lead to 100% mob skill usage with no/few normal attacks.
+// Set to 0 to disable mob skills.
+mob_skill_rate: 100
+
+// Mob skill delay adjust (Note 2)
+// After a mob has casted a skill, there is a delay before being able to
+// re-cast it. Note that skills with a delay of 0 can't be affected by this
+// setting.
+mob_skill_delay: 100
+
+// Rate of monsters on a map, 200 would be twice as many as normal. (Note 2)
+mob_count_rate: 100
+
+// Respawn rate of monsters on a map. 50 would make mobs respawn twice as fast (half delay time) (Note 2)
+//Note: This does not affects mobs with immediate respawn (most normal mobs)
+mob_spawn_delay: 100
+plant_spawn_delay: 100
+boss_spawn_delay: 100
+
+// Should mobs not spawn within the viewing range of players?
+// 0 is disabled, otherwise it is the number of retries before giving up
+// and spawning the mob within player-view anyway, unless the max (100) is used,
+// in which case the mob will not be spawned, and it'll be retried again in
+// 5 seconds.
+// NOTE: This has no effect on mobs that always spawn on the very same cell
+// (like ant eggs) except if you set it to the max.
+no_spawn_on_player: 0
+
+// Should spawn coordinates in the mob-spawn files be ignored? (Note 1)
+// If set to yes, all monsters will have a random respawn spot across the whole
+// map regardless of what the mob-spawn file says.
+force_random_spawn: no
+
+// Do summon slaves inherit the passive/aggressive traits of their master?
+// 0: No, retain original mode.
+// 1: Slaves are always aggressive.
+// 2: Slaves are always passive.
+// 3: Same as master's aggressive/passive state.
+slaves_inherit_mode: 2
+
+// Do summon slaves have the same walking speed as their master?
+// NOTE: The default is 3 for official servers.
+// 0: Never.
+// 1: If the master can walk
+// 2: If the master can't walk (even motionless mobs have a speed
+// entry in their mob_db)
+// 3: Always
+slaves_inherit_speed: 3
+
+// Will summoned monsters (alchemists, or @summon'ed monsters) attack cause a
+// chance of triggering the master's autospell cards? (Note 1)
+summons_trigger_autospells: yes
+
+// When a mob is attacked by another monster, will the mob retaliate against the master of said mob instead of the mob itself?
+// NOTE: Summoned mobs are both those acquired via @summon and summoned by Alchemists
+retaliate_to_master: yes
+
+// Whether mobs should change target temporarily when a skill triggers a counter mob skill (Note 1)
+// eg: Mob attacks player B, and player A casts a skill C. If set to yes and the
+// mob has a skill that is triggered by skill C, then A will be the target of
+// the skill, otherwise B will be targetted by the reaction skill.
+mob_changetarget_byskill: no
+
+// If monster's class is changed will it fully recover HP? (Note 1)
+monster_class_change_full_recover: yes
+
+// Display some mob info next to their name? (add as needed)
+// (does not works on guardian or Emperium)
+// 1: Display mob HP (Hp/MaxHp format)
+// 2: Display mob HP (Percent of full life format)
+// 4: Display mob's level
+show_mob_info: 0
+
+// Zeny from mobs
+zeny_from_mobs: no
+
+// Monsters level up (monster will level up each time a player is killed and they will grow stronger)
+// Exp rate is calculated ((monster level-original monster level)*(exp*(mobs_level_up_exp rate/100)))
+// NOTE: Does not apply to WoE Guardians.
+mobs_level_up: no
+mobs_level_up_exp_rate: 1
+
+// Dynamic Mobs Options
+// Use dynamic mobs? (recommended for small-medium sized servers)
+dynamic_mobs: yes
+
+// Remove Mobs even if they are hurt
+mob_remove_damaged: yes
+
+// Delay before removing mobs from empty maps (default 5 min = 300 secs)
+mob_remove_delay: 300000
+
+// Defines on who the mob npc_event gets executed when a mob is killed.
+// Type 1: On the player that killed the mob (if killed by a non-player, resorts to type 0)
+// Type 0: On the player that did the most damage to the mob.
+// NOTE: This affects who gains the Castle when the Emperium is broken.
+mob_npc_event_type: 1
+
+// Time in milliseconds to activate protection against Kill Steal
+// Set to 0 to disable it.
+// If this is activated and a player is using @noks, damage from others players (KS) not in the party
+// will be reduced to 0.
+ksprotection: 0
+
+// Should MVP slaves retain their target when summoned back to their master?
+mob_slave_keep_target: yes
+
+// Whether or not to spawn the mvp tomb.
+// See http://irowiki.org/wiki/MVP#Gravestone
+mvp_tomb_enabled: yes
+
+// Whether or not the size of specially summoned mobs influences experience, drop rates,
+// and stats. The rates will be doubled for large mobs, and halved for small ones.
+// This is only invoked under the 'monster' command, @monsterbig, and @monstersmall. (Note 1)
+// Default: no
+mob_size_influence: no
diff --git a/conf/battle/party.conf b/conf/battle/party.conf
new file mode 100644
index 000000000..14d5f47c8
--- /dev/null
+++ b/conf/battle/party.conf
@@ -0,0 +1,54 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+//--------------------------------------------------------------
+
+// If someone steals (gank/steal skills), show name in party? (Note 1)
+show_steal_in_same_party: no
+
+// Interval before updating the party-member map mini-dots (milliseconds)
+party_update_interval: 1000
+
+// Method used to update party-mate hp-bars:
+// 0: Aegis - bar is updated every time HP changes (bandwidth intensive)
+// 1: Athena - bar is updated with the party map dots (up to 1 second delay)
+party_hp_mode: 0
+
+// When 'Party Share' item sharing is enabled in a party,
+// announce in the party which party-member received the item and what's he received? (Note 1)
+show_party_share_picker: yes
+
+// What types of items are going to be announced when 'show_party_share_picker' is active?
+// 1: IT_HEALING, 2: IT_UNKNOWN, 4: IT_USABLE, 8: IT_ETC,
+// 16: IT_WEAPON, 32: IT_ARMOR, 64: IT_CARD, 128: IT_PETEGG,
+// 256: IT_PETARMOR, 512: IT_UNKNOWN2, 1024: IT_AMMO, 2048: IT_DELAYCONSUME
+// 262144: IT_CASH
+show_picker.item_type: 112
+
+// Method of distribution when item party share is enabled in a party:
+//
+// 0: Normal (item goes to a random party member)
+// 1: Item Share is disabled for non-mob drops (player/pet drops)
+// 2: Round Robin (items are distributed evenly and in order among members)
+// 3: 1+2
+party_item_share_type: 0
+
+// Is exp/item sharing disabled for idle members in the party?
+// Set to no, or the amount of seconds (NOT milliseconds) that need to pass before considering
+// a character idle.
+// Characters in a chat/vending are always considered idle.
+// A character's idle status is reset upon item use/skill use/attack (auto attack counts too)/movement.
+idle_no_share: no
+
+// Give additional experience bonus per party-member involved on even-share parties (excluding yourself)?
+// ex. If set to 10, an even-share party of 5 people will receive +40% exp (4 members * 10% exp):
+// 140% party experience in total, so each member receives 140%/5 = 28% exp (instead of 20%).
+party_even_share_bonus: 0
+
+// Display party name regardless if player is in a guild.
+// Official servers do not display party name unless the user is in a guild. (Note 1)
+display_party_name: no
diff --git a/conf/battle/pet.conf b/conf/battle/pet.conf
new file mode 100644
index 000000000..e80826ce8
--- /dev/null
+++ b/conf/battle/pet.conf
@@ -0,0 +1,77 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Rate for catching pets (Note 2)
+pet_catch_rate: 100
+
+// Can you name a pet more then once? (Note 1)
+pet_rename: no
+
+// The rate a pet will get friendly by feeding it. (Note 2)
+pet_friendly_rate: 100
+
+// The rate at which a pet will become hungry. (Note 2)
+pet_hungry_delay_rate: 100
+
+// If your pet is hungry by how much will the friendlyness decrease by. (Default is 5)
+// Note: The friendlyness is 0-1000 total, at 0 the pet runs away.
+pet_hungry_friendly_decrease: 5
+
+// Does the pet need its equipment before it does its skill? (Note 1)
+pet_equip_required: yes
+
+// When the master attacks a monster, whether or not the pet will also attack. (Note 1)
+pet_attack_support: no
+
+// When the master receives damage from the monster, whether or not the pet attacks back. (Note 1)
+pet_damage_support: no
+
+// Minimum intimacy necessary for a pet to support their master. Default is 900
+// (intimacy goes from 0 to 1000). At this minimum, support rate is 50% of pet's normal value.
+// At max (1000) support rate is 150%.
+pet_support_min_friendly: 900
+
+// Same as above, but this is to use the pet_script field with official pet abilities.
+pet_equip_min_friendly: 900
+
+// Whether or not the pet's will use skills. (Note 1)
+// Note: Offensive pet skills need at least pet_attack_support or
+// pet_damage_support to work (they trigger while the pet is attacking).
+pet_status_support: no
+
+// Rate at which a pet will support it's owner in battle. (Note 2)
+// Affects pet_attack_support & pet_damage_support.
+pet_support_rate: 100
+
+// Does the pets owner receive exp from the pets damage?
+pet_attack_exp_to_master: no
+
+// The rate exp. is gained from the pet attacking monsters
+pet_attack_exp_rate: 100
+
+// Pet leveling system. Use 0 to disable (default).
+// When enabled, a pet's level is a fixed % of the master's. (Note 2)
+// If 200%, pet has double level, if 50% pet has half your level, etc.
+pet_lv_rate: 0
+
+// When pet leveling is enabled, what is the max stats for pets?
+pet_max_stats: 99
+
+// When pet leveling is enabled, these are the imposed caps on
+// min/max damage. Note that these only cap atk1 and atk2, if you
+// enable pet_str, their max damage is then their base_atk + pet_max_atk2
+pet_max_atk1: 500
+pet_max_atk2: 1000
+
+// Are pets disabled during Guild Wars?
+// If set to yes, pets are automatically returned to egg when entering castles during WoE times
+// and hatching is forbidden within as well.
+pet_disable_in_gvg: no
diff --git a/conf/battle/player.conf b/conf/battle/player.conf
new file mode 100644
index 000000000..cdfcece8d
--- /dev/null
+++ b/conf/battle/player.conf
@@ -0,0 +1,170 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field.
+//--------------------------------------------------------------
+
+// Players' maximum HP rate? (Default is 100)
+hp_rate: 100
+
+// Players' maximum SP rate? (Default is 100)
+sp_rate: 100
+
+// Whether or not cards and attributes of the left hand are applied to the right hand attack (Note 1)
+// (It is 'yes' on official servers)
+left_cardfix_to_right: yes
+
+// The amount of HP a player will respawn with, 0 is default.
+// (Unit is in percentage of total HP, 100 is full heal of HP, 0 is respawn with 1HP total.)
+restart_hp_rate: 0
+
+// The amount of SP a player will respawn with, 0 is default.
+// (Unit is in percentage of total SP, 100 is full heal of SP, 0 is respawn with 1SP total.)
+restart_sp_rate: 0
+
+// Can a normal player by-pass the skill tree? (Note 1)
+player_skillfree: no
+
+// When set to yes, forces skill points gained from 1st class to be put into 1st class
+// skills, and forces novice skill points to be put into the basic skill. (Note 1)
+player_skillup_limit: yes
+
+// Quest skills can be learned? (Note 1)
+// Setting this to yes can open an exploit on your server!
+quest_skill_learn: no
+
+// When skills are reset, quest skills are reset as well? (Note 1)
+// Setting this to yes can open an exploit on your server!
+// NOTE: If you have quest_skill_learn set to yes, quest skills are always reset.
+quest_skill_reset: no
+
+// You must have basic skills to be able to sit, trade, form a party or create a chatroom? (Note 1)
+basic_skill_check: yes
+
+// When teleporting, or spawning to a map, how long before a monster sees you if you don't move? (time is in milliseconds)
+// That is, when you go to a map and don't move, how long before the monsters will notice you.
+// When moving, attacking or doing similar actions, the effect ends instantly.
+// Value is also affected by 'invincible_time_inc' mapflag
+player_invincible_time: 5000
+
+// The time interval for HP to restore naturally. (in milliseconds)
+natural_healhp_interval: 6000
+
+// The time interval for SP to restore naturally. (in milliseconds)
+natural_healsp_interval: 8000
+
+// Automatic healing skill's time interval. (in milliseconds)
+natural_heal_skill_interval: 10000
+
+// The maximum weight for a character to carry when the character stops healing naturally. (in %)
+natural_heal_weight_rate: 50
+
+// Maximum atk speed. (Default 190, Highest allowed 199)
+max_aspd: 190
+
+// Same as max_aspd, but for 3rd classes. (Default 193, Highest allowed 199)
+max_third_aspd: 193
+
+// Maximum walk speed rate (200 would be capped to twice the normal speed)
+max_walk_speed: 300
+
+// Maximum HP. (Default is 1000000)
+max_hp: 1000000
+
+// Maximum SP. (Default is 1000000)
+max_sp: 1000000
+
+// Max limit of char stats. (agi, str, etc.)
+max_parameter: 99
+
+// Same as max_parameter, but for 3rd classes.
+max_third_parameter: 130
+
+// Same as max_parameter, but for extend classes (Ex. Super Novice, Kagero/Oboro, Rebellion).
+max_extended_parameter: 125
+
+// Same as max_parameter, but for baby classes.
+max_baby_parameter: 80
+
+// Same as max_parameter, but for baby 3rd's.
+max_baby_third_parameter: 117
+
+// Max armor def/mdef
+// NOTE: This setting have no effect if server is run on Renewal Mode (RENEWAL)
+// NOTE: does not affects skills and status effects like Mental Strength
+// If weapon_defense_type is non-zero, it won't apply to max def.
+// If magic_defense_type is non-zero, it won't apply to max mdef.
+max_def: 99
+
+// Def to Def2 conversion bonus. If the armor def/mdef exceeds max_def,
+// the remaining is converted to vit def/int mdef using this multiplier
+// (eg: if set to 10, every armor point above the max becomes 10 vit defense points)
+over_def_bonus: 0
+
+// Max weight carts can hold.
+max_cart_weight: 8000
+
+// Prevent logout of players after being hit for how long (in ms, 0 disables)?
+prevent_logout: 10000
+
+// Display the drained hp/sp values from normal attacks? (Ie: Hunter Fly card)
+show_hp_sp_drain: no
+
+// Display the gained hp/sp values from killing mobs? (Ie: Sky Deleter Card)
+show_hp_sp_gain: yes
+
+// If set, when A accepts B as a friend, B will also be added to A's friend
+// list, otherwise, only A appears in B's friend list.
+// NOTE: this setting only enables friend auto-adding; auto-deletion does not work yet
+friend_auto_add: yes
+
+// Are simultaneous trade/party/guild invite requests automatically rejected?
+invite_request_check: yes
+
+// Players' will drop a 'Skull' when killed?
+// 0 = Disabled
+// 1 = Dropped only in PvP maps
+// 2 = Dropped in all situations
+bone_drop: 0
+
+// Do mounted (on Peco) characters increase their size
+// 0 = no
+// 1 = only Normal Classes on Peco have Big Size
+// 2 = only Baby Classes on Peco have Medium Size
+// 3 = both Normal Classes on Peco have Big Size
+// and Baby Classes on Peco have Medium Size
+character_size: 0
+
+// Idle characters can receive autoloot?
+// Set to the time in seconds where an idle character will stop receiving
+// items from Autoloot (0: disabled).
+idle_no_autoloot: 0
+
+// Minimum distance a vending/chat room must be from a NPC in order to be placed
+// Default: 3 (0: disabled).
+min_npc_vendchat_distance: 3
+
+// Super Novice's fury is enabled to increments of 10%, such as at 10.0%, 20.0% - 80.0%, 90.0%
+// Changing snovice_call_type config to 1 enables its use at 0%, for maxed super novices.
+// default: 0
+snovice_call_type: 0
+
+// How the server should measure the character's idle time? (Note 3)
+// 0x001 - Walk Request
+// 0x002 - UseSkillToID Request ( targetted skill use attempt )
+// 0x004 - UseSkillToPos Request ( aoe skill use attempt )
+// 0x008 - UseItem Request ( including equip/unequip )
+// 0x010 - Attack Request
+// 0x020 - Chat Request ( whisper, party, guild, bg, etca )
+// 0x040 - Sit/Standup Request
+// 0x080 - Emotion Request
+// 0x100 - DropItem Request
+// 0x200 - @/#Command Request
+// Please note that at least 1 option has to be enabled.
+// Be mindful that the more options used, the easier it becomes to cheat features that rely on idletime (e.g. checkidle()).
+// Default: walk ( 0x1 ) + useskilltoid ( 0x2 ) + useskilltopos ( 0x4 ) + useitem ( 0x8 ) + attack ( 0x10 ) = 0x1F
+idletime_criteria: 0x1F
diff --git a/conf/battle/skill.conf b/conf/battle/skill.conf
new file mode 100644
index 000000000..1bb58211a
--- /dev/null
+++ b/conf/battle/skill.conf
@@ -0,0 +1,305 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary)
+//--------------------------------------------------------------
+
+// The rate of time it takes to cast a spell (Note 2, 0 = No casting time)
+casting_rate: 100
+
+// Delay time after casting (Note 2)
+delay_rate: 100
+
+// Does the delay time depend on the caster's DEX and/or AGI? (Note 1)
+// Note: On Official servers, neither Dex nor Agi affect delay time
+delay_dependon_dex: no
+delay_dependon_agi: no
+
+// Minimum allowed delay for ANY skills after casting (in milliseconds) (Note 1)
+// Note: Setting this to anything above 0 can stop speedhacks.
+min_skill_delay_limit: 100
+
+// This delay is the min 'can't walk delay' of all skills.
+// NOTE: Do not set this too low, if a character starts moving too soon after
+// doing a skill, the client will not update this, and the player/mob will
+// appear to "teleport" afterwards.
+default_walk_delay: 300
+
+//Completely disable skill delay of the following types (Note 3)
+//NOTE: By default mobs don't have the skill delay as specified in the skill
+// database, but follow their own 'reuse' skill delay which is specified on
+// the mob skill db. When set, the delay for all skills become
+// min_skill_delay_limit.
+no_skill_delay: 2
+
+// At what dex does the cast time become zero (instant cast)?
+castrate_dex_scale: 150
+
+// How much (dex*2+int) does variable cast turns zero?
+vcast_stat_scale: 530
+
+// What level of leniency should the skill system give for skills when
+// accounting attack motion (ASPD) for casting skills (Note 2, between 0 and 300)
+//
+// NOTE: Setting this to 100% may cause some issues with valid skills not being cast.
+// The time difference between client and server varies so allowing 90% leniency
+// should be enough to forgive very small margins of error.
+skill_amotion_leniency: 90
+
+// Will normal attacks be able to ignore the delay after skills? (Note 1)
+skill_delay_attack_enable: yes
+
+// Range added to skills after their cast time finishes.
+// Decides how far away the target can walk away after the skill began casting before the skill fails.
+// 0 disables this range checking (default)
+skill_add_range: 0
+
+// If the target moves out of range while casting, do we take the items and SP for the skill anyway? (Note 1)
+skill_out_range_consume: no
+
+// Does the distance between caster and target define if the skill is a ranged skill? (Note 3)
+// If set, when the distance between caster and target is greater than 3 the skill is considered long-range, otherwise it's a melee range.
+// If not set, then the range is determined by the skill's range (if it is above 5, the skill is ranged).
+// Default 14 (mobs + pets + homun)
+skillrange_by_distance: 14
+
+// Should the equipped weapon's range override the skill's range defined in the skill_db for most weapon-based skills? (Note 3)
+// NOTE: Skills affected by this option are those whose range in the skill_db are negative. By default always the skill range is used.
+// Note that if you want all monster skills to have a range of 9 you need to set monster_ai&0x400.
+skillrange_from_weapon: 0
+
+// Should a check on the caster's status be performed in all skill attacks?
+// When set to yes, meteors, storm gust and any other ground skills will have
+// no effect while the caster is unable to fight (eg: stunned).
+skill_caster_check: yes
+
+// Should ground placed skills be removed as soon as the caster dies? (Note 3)
+clear_skills_on_death: 0
+
+// Should ground placed skills be removed when the caster changes maps? (Note 3)
+clear_skills_on_warp: 15
+
+//Setting this to YES will override the target mode of ground-based skills with the flag 0x01 to "No Enemies"
+//The two skills affected by default are Pneuma and Safety Wall (if set to yes, those two skills will not protect everyone, but only allies)
+//See db/skill_unit_db.txt for more info.
+defunit_not_enemy: no
+
+// Do skills do at least 'hits' damage when they don't miss/are blocked?
+//(for example, will firebolts always do "number of bolts" damage versus plants?)
+//Values (add as appropriate): 1 for weapon-based attacks, 2 for magic attacks, 4 for misc attacks.
+skill_min_damage: 6
+
+// The delay rate of monk's combo (Note 2)
+combo_delay_rate: 100
+
+// Use alternate auto Counter Attack Skill Type? (Note 3)
+// For those characters on which it is set, 100% Critical,
+// Otherwise it disregard DEF and HIT+20, CRI*2
+auto_counter_type: 15
+
+// Can ground skills be placed on top of each other? (Note 3)
+// By default, skills with UF_NOREITERATION set cannot be stacked on top of
+// other skills, this setting will override that. (skill_unit_db)
+skill_reiteration: 0
+
+// Can ground skills NOT be placed underneath/near players/monsters? (Note 3)
+// If set, only skills with UF_NOFOOTSET set will be affected (skill_unit_db)
+skill_nofootset: 1
+
+// Should traps (hunter traps + quagmire) change their target to "all" inside gvg/pvp grounds? (Note 3)
+// Default on official servers: yes for player-traps
+gvg_traps_target_all: 1
+
+// Some traps settings (add as necessary):
+// 1: Traps are invisible to those who come into view of it. When unset, all traps are visible at all times.
+// (Invisible traps can be revealed through Hunter's Detecting skill)
+traps_setting: 0
+
+// Restrictions applied to the Alchemist's Summon Flora skill (add as necessary)
+// 1: Enable players to damage the floras outside of versus grounds.
+// 2: Disable having different types out at the same time
+// (eg: forbid summoning anything except hydras when there's already
+// one hydra out)
+summon_flora_setting: 3
+
+// When songs are canceled, terminated or the character goes out of the
+// area of effect, there's an additional effect that lasts for 20 seconds
+// Should that time be reset for each song?
+// 0: No, you must recast the song AFTER those 20 seconds to have the effect again (Aegis)
+// 1: Yes, recasting songs reset the 20 seconds timer (eathena)
+song_timer_reset: 0
+
+// Whether placed down skills will check walls (Note 1)
+// (Makes it so that Storm Gust/Lord of Vermillion/etc when cast next to a wall, won't hit on the other side)
+skill_wall_check: yes
+
+// When cloaking, Whether the wall is checked or not. (Note 1)
+// Note: When the skill does not checks for walls, you will always be considered
+// as if you had a wall-next to you (you always get the wall-based speed).
+// Add the settings as required, being hit always uncloaks you.
+//
+// 0 = doesn't check for walls
+// 1 = Check for walls
+// 2 = Cloaking is not canceled when attacking.
+// 4 = Cloaking is not canceled when using skills
+player_cloak_check_type: 1
+monster_cloak_check_type: 4
+
+// Can't place unlimited land skills at the same time (Note 3)
+land_skill_limit: 9
+
+//Determines which kind of skill-failed messages should be sent:
+// 1 - Disable all skill-failed messages.
+// 2 - Disable skill-failed messages due to can-act delays.
+// 4 - Disable failed message from Snatcher
+// 8 - Disable failed message from Envenom
+display_skill_fail: 2
+
+// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
+chat_warpportal: no
+
+// What should the wizard's "Sense" skill display on the defense fields?
+// 0: Do not show defense
+// 1: Base defense [RE default]
+// 2: Vit/Int defense
+// 3: Both (the addition of both)
+sense_type: 1
+
+// Which finger offensive style will be used?
+// 0 = Aegis style (single multi-hit attack)
+// 1 = Athena style (multiple consecutive attacks)
+finger_offensive_type: 0
+
+// Grandcross Settings (Don't mess with these)
+// If set to no, hit interval is increased based on the amount of mobs standing on the same cell
+// (means that when there's stacked mobs in the same cell, they won't receive all hits)
+gx_allhit: no
+
+// Grandcross display type (Default 1)
+// 0: Yellow character
+// 1: White character
+gx_disptype: 1
+
+// Max Level Difference for Devotion
+devotion_level_difference: 10
+
+// If no than you can use the ensemble skills alone. (Note 1)
+player_skill_partner_check: yes
+
+// Remove trap type
+// 0 = Aegis system : Returns 1 'Trap' item
+// 1 = Athena system : Returns all items used to deploy the trap
+skill_removetrap_type: 0
+
+// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
+backstab_bow_penalty: yes
+
+// How many times you could try to steal from a mob.
+// Note: It helps to avoid stealing exploit on monsters with few rare items
+// Use 0 to disable (max allowed value is 255)
+skill_steal_max_tries: 0
+
+// Can Rogues plagiarize advanced job skills
+// 0 = no restriction
+// 1 = only stalker may plagiarize advanced skills
+// 2 = advanced skills cannot be plagiarized by anyone
+// Official servers setting: 2
+copyskill_restrict: 2
+
+// Does Berserk/Frenzy cancel other self-buffs when used?
+berserk_cancels_buffs: no
+
+// Level and Strength of "MVP heal". When someone casts a heal of this level or
+// above, the heal formula is bypassed and this value is used instead.
+max_heal: 9999
+max_heal_lv: 11
+
+// Emergency Recall Guild Skill setting (add as appropriate).
+// Note that for the skill to be usable at all,
+// you need at least one of 1/2 and 4/8
+// 1: Skill is usable outside of woe.
+// 2: Skill is usable during woe.
+// 4: Skill is usable outside of GvG grounds
+// 8: Skill is usable on GvG grounds
+//16: Disable skill from "nowarpto" maps
+// (it will work on GVG castles even if they are set to nowarpto, though)
+emergency_call: 11
+
+// Guild Aura Skills setting (add as appropriate).
+// (This affects GD_LEADERSHIP, GD_GLORYWOUNDS, GD_SOULCOLD and GD_HAWKEYES)
+// Note that for the skill to be usable at all,
+// you need at least one of 1/2 and 4/8
+// 1: Skill works outside of woe.
+// 2: Skill works during woe.
+// 4: Skill works outside of GvG grounds
+// 8: Skill works on GvG grounds
+//16: Disable skill from affecting Guild Master
+guild_aura: 31
+
+// Allows players to skip menu when casting Teleport level 1
+// Menu contains two options. "Random" and "Cancel"
+skip_teleport_lv1_menu: no
+
+// Allow use of SG skills without proper day (Sun/Moon/Star) ?
+allow_skill_without_day: no
+
+// Allow use of ES-type magic on players?
+allow_es_magic_player: no
+
+// Miracle of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_miracle_skill_ratio: 2
+
+// Miracle of the Sun, Moon and Stars skill duration in milliseconds
+sg_miracle_skill_duration: 3600000
+
+// Angel of the Sun, Moon and Stars skill ratio (100% = 10000)
+sg_angel_skill_ratio: 10
+
+// Skills that bHealPower has effect on
+// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun
+skill_add_heal_rate: 7
+
+// Whether the damage of EarthQuake with a single target on screen is able to be reflected.
+// Note: On official server, EQ is reflectable when there is only one target on the screen,
+// which might be an exploit to hunt the MVPs.
+eq_single_target_reflectable: yes
+
+// On official server, you will receive damage from Reflection and some Tarot Card even in invincible status.
+// When this setting is enabled, it allows you to immune to all kinds of damage, including those stated previous.
+// (The number will show but no actual damage will be done)
+invincible.nodamage: no
+
+// Dancing Weapon Switch
+// On official server, a fix is in place that prevents the switching of weapons to cancel songs.
+// Default: yes
+dancing_weaponswitch_fix: yes
+
+// Skill Trap Type (GvG)
+// 0: (official) Traps in GvG only make player stop moving after its walk path is complete, and it activates other traps on the way.
+// 1: Traps in GvG make player stop moving right when stepping over it.
+skill_trap_type: 0
+
+// Max Possible Level of Monster skills
+// Note: If your MVPs are too tough, reduce it to 10.
+mob_max_skilllvl: 100
+
+// Area of Bowling Bash chain reaction
+// 0: Use official gutter line system
+// 1: Gutter line system without demi gutter bug
+// 2-20: Area around caster (2 = 5x5, 3 = 7x7, 4 = 9x9, ..., 20 = 41x41)
+// Note: If you knock the target out of the area it will only be hit once and won't do splash damage
+bowling_bash_area: 0
+
+// How many attempts should a monster need until it can escape from an icewall casted directly on it?
+// On official servers, monsters can only leave an icewall to the west and south. If their target is north or east of them
+// they will continously try to chase it but fail doing so. This brings them into a loop during which they will cast idle
+// and rudeattacked skills (if attacked). Official servers have a safety system that eventually allows monsters to escape
+// when their walk routine failed many times in row so they won't stay on the loop endlessly. The time for this seems to be
+// around 15 seconds for fast monsters and 35 seconds for slow monsters, this equals about 75 attempts.
+// Set this to 0 if you don't want monsters to be stuck in icewalls at all.
+icewall_walk_block: 75 \ No newline at end of file
diff --git a/conf/battle/status.conf b/conf/battle/status.conf
new file mode 100644
index 000000000..172706817
--- /dev/null
+++ b/conf/battle/status.conf
@@ -0,0 +1,24 @@
+//--------------------------------------------------------------
+// Hercules Battle Configuration File
+// Originally Translated by Peter Kieser <pfak@telus.net>
+// Made in to plainer English by Ancyker
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Should skill casting be canceled when inflicted by curse/stun/sleep/etc (includes silence) (Note 3)?
+status_cast_cancel: 0
+
+// Adjustment for the natural rate of resistance from status changes.
+// If 50, status defense is halved, and you need twice as much stats to block
+// them (eg: 200 vit to completely block stun)
+pc_status_def_rate: 100
+mob_status_def_rate: 100
+
+// Maximum resistance to status changes. (100 = 100%)
+// NOTE: Cards and equipment can go over this limit, so it only applies to natural resist.
+pc_max_status_def: 100
+mob_max_status_def: 100
diff --git a/conf/battle_athena.conf b/conf/battle_athena.conf
deleted file mode 100644
index 378fdea9a..000000000
--- a/conf/battle_athena.conf
+++ /dev/null
@@ -1,752 +0,0 @@
-
-//--------------------------------------------------------------
-//eAthena Battle Configuration File
-// Made in to plainer english by Ancyker
-//--------------------------------------------------------------
-//Note 1: Directives can be set using on/off, yes/no or 1/0.
-//Note 2: All rates are in percents, 100 would mean 100%, 200
-// would mean 200%, etc
-// Other Information:
-// 1000 miliseconds is 1 second.
-//--------------------------------------------------------------
-
-// Do you want to debug warp points? If set to yes, warp points will appear as flags.(Note 1)
-warp_point_debug: no
-
-// When calculating critical, should we take in to account the enimies luck? (Note 1)
-enemy_critical: yes
-
-// Enemy's Critical Rate (Note 2)
-enemy_critical_rate: 100
-
-// Are enemy attacks effected by their strength? (Note 1)
-enemy_str: yes
-
-// Can enemies have perfect flee? (Note 1)
-enemy_perfect_flee: no
-
-// The rate of time it takes to cast a spell (Note 2, 0 = No casting time)
-casting_rate: 100
-
-// Delay time after casting (Note 2)
-delay_rate: 100
-
-// Is the delay time is dependent on the caster's DEX? (Note 1)
-delay_dependon_dex: yes
-
-// At what dex does the cast time become zero (instacast)
-castrate_dex_scale: 150
-
-// Is 'Skills add a delay before you can attack' enabled? (Note 1)
-skill_delay_attack_enable: no
-
-// Whether or not cards and attributes in the left hand are enabled (Note 1)
-left_cardfix_to_right: yes
-
-// Increase player's attack range (in cells)
-player_skill_add_range: 0
-
-// If the target moves out of range while casting, do we take the items and SP for the skill anyway? (Note 1)
-skill_out_range_consume: no
-
-// Increase Monsters attack range
-monster_skill_add_range: 0
-
-// If a player is attacked, will they have a delay in being able to move? (Note 1)
-// (Setting to no will be like always endure)
-player_damage_delay: no
-
-// Damaged delay rate (Note 2)
-player_damage_delay_rate: 100
-
-// Is a player's defense NOT dependant on an enemies attack? (Note 1)
-defunit_not_enemy: yes
-
-// Are summoned monsters level greater then your base level? (I think this is for dead branches) (Note 1)
-random_monster_checklv: yes
-
-// The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
-atcommand_spawn_quantity_limit: 100
-
-// Does HP recover if hit by an attribute that's same as your own? (Note 1)
-attribute_recover: yes
-
-// If an item is droped, does it go stright into the users inventory? (Note 1)
-item_auto_get: no
-
-// How long does it take for an item to disappear from the floor after it is dropped? (in miliseconds)
-flooritem_lifetime: 120000
-
-// How long before the first person who did the most damage to a monster can get the item? (in milliseconds)
-item_first_get_time: 15000
-
-// How long before the second person who did the second most damage to a monster can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
-item_second_get_time: 10000
-
-// How long before the third person who did the third most/least damage to a monster can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time And Second Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
-item_third_get_time: 5000
-
-// How long before the first person who did the most damage to a MVP can get the item? (in milliseconds)
-mvp_item_first_get_time: 10000
-
-// How long before the second person who did the second most damage to a MVP can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
-mvp_item_second_get_time: 10000
-
-// How long before the third person who did the third most/least damage to a MVP can get the item
-//(Note the Amount is in Milliseconds and It Adds Time From The First Persons Time And Second Persons Time)
-//So It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
-mvp_item_third_get_time: 2000
-
-// Item drop rates (Note 2)
-
-// The rate the common items are droped (Items that are in the ETC tab, besides card)
-item_rate_common: 100
-item_drop_common_min: 1
-item_drop_common_max: 10000
-
-// The rate healing items are droped (items that restore HP or SP)
-item_rate_heal: 100
-item_drop_heal_min: 1
-item_drop_heal_max: 10000
-
-// The rate at which usable items (in the item tab) other then healing items are droped.
-item_rate_use: 100
-item_drop_use_min: 1
-item_drop_use_max: 10000
-
-// The rate at which equipment is droped.
-item_rate_equip: 100
-item_drop_equip_min: 1
-item_drop_equip_max: 10000
-
-// The rate at which cards are droped
-item_rate_card: 100
-item_drop_card_min: 1
-item_drop_card_max: 10000
-
-item_drop_mvp_min: 1
-item_drop_mvp_max: 10000
-
-// Can the monster's drop rate become 0? (Note 1)
-drop_rate0item: no
-
-// Rate at which exp. is given. (Note 2)
-base_exp_rate: 100
-
-// Rate at which job exp. is given. (Note 2)
-job_exp_rate: 100
-
-// PVP exp. Do players get exp during pvp
-pvp_exp: yes
-
-// When a player dies, how should we penalize them?
-// 0 = No penalty.
-// 1 = Lose % of current level when killed.
-// 2 = Lose % of total experience when killed.
-death_penalty_type: 0
-
-// Base exp. penalty rate (Each 100 is 1% of their exp)
-death_penalty_base: 100
-
-// Job exp. penalty rate (Each 100 is 1% of their exp)
-death_penalty_job: 100
-
-// When a player dies, how much zeny should we penalize them with?
-zeny_penalty: 0
-
-// The amount of HP a player will respawn with, 0 is default.
-// (Unit is in percentage of total HP, 100 is full heal of HP, 0 is respawn with 1HP total.)
-restart_hp_rate: 30
-
-// The amount of SP a player will respawn with, 0 is default.
-// (Unit is in percentage of total SP, 100 is full heal of SP, 0 is respawn with 1SP total.)
-restart_sp_rate: 0
-
-// [MVP] Summoned monsters HP rate, that is, monsters summoned by an MVP will have this much HP. (Note 2)
-mvp_hp_rate: 100
-
-// [MVP] Item drop rate, that is, the overall drop rate for items droped by an MVP. (Note 2)
-mvp_item_rate: 100
-
-// [MVP] Exp. rate. (Note 2)
-mvp_exp_rate: 100
-
-// The HP rate of normal monsters (that is monsters that are not MVP's) (Note 2)
-monster_hp_rate: 100
-
-// The maximum attack speed of a monster
-monster_max_aspd: 199
-
-// (@) GM Commands available only to GM's? (Note 1)
-// set to 'No', Normal players (gm level 0) can use GM commands _IF_ you set the command level to 0.
-// set to 'Yes', Normal players (gm level 0) can never use a GM command even if you set the command level to 0.
-atcommand_gm_only: no
-
-// [GM] Can use all skills? (No or mimimum GM level)
-gm_all_skill: no
-
-// [GM] Can use all abracadabra skills? (No minimum GM level)
-gm_all_skill_add_abra: no
-
-// [GM] Can equip anything? (No or minimum GM level, can cause client errors.)
-gm_all_equipment: no
-
-// [GM] Raise skills unconditionally, that is, put points in to a skill not in thier jobs skill tree? (no or minimum gm level)
-gm_skill_unconditional: no
-
-// Can a normal player by-pass the skill tree? (Note 1)
-player_skillfree: no
-
-// When doing a skill reset, whether the skill's restriction is to be ignored or not. (Note 1)
-player_skillup_limit: yes
-
-// Forging success rate. (Note 2)
-weapon_produce_rate: 100
-
-// Prepare Potion succsss rate. (Note 2)
-potion_produce_rate: 100
-
-// Allow monsters to be aggresive and attack first? (Note 1)
-monster_active_enable: yes
-
-// Monster damage delay rate (Note 1)
-monster_damage_delay_rate: 100
-
-// Looting monster actions.
-// 0 = Monster will consume the item.
-// 1 = Monster will not consume the item.
-monster_loot_type: 0
-
-// Enable monster skills? (Note 1)
-mob_skill_use: yes
-
-// Rate of monsters on a map, 200 would be twice as many as normal. (Note 2)
-mob_count_rate: 100
-
-// Max mobs count in each map
-mob_map_limit: 500
-
-// Max mob spawned with skills per each master
-mob_skill_spawn_limit: 20
-
-// Min mob respaw delay
-mob_spawn_min_delay: 5000
-
-// Quest skills can be learned? (Note 1)
-// Setting this to yes can open an exploit on your server!
-quest_skill_learn: yes
-
-// When skills are reset, quest skills are reset as well? (Note 1)
-// Setting this to yes can open an exploit on your server!
-quest_skill_reset: no
-
-// You must have basic skills to be able to sit, trade, form a party or create a chatroom? (Note 1)
-basic_skill_check: yes
-
-// Item to require when making a guild. Setting this to
-// 0 will disable the check. Using item 1337 for now
-// to disable creation (as it's unallocated)
-guild_emperium_check: 999
-
-// Maximum tax limit on a guild member.
-guild_exp_limit: 50
-
-// Maximum castles one guild can own (0 - unlimited)
-guild_max_castles: 0
-
-// When teleporting, or spawning to a map, how long before a monster sees you if you don't move? (time is in milliseconds)
-// That is, when you go to a map and don't move, how long before the monsters will notice you.
-// If you attack a monster, it will attack you back regaurdless of this setting. (I think)
-player_invincible_time: 5000
-
-// [PET] Rate for catching pets (Note 2)
-pet_catch_rate: 100
-
-// [PET] Can you name a pet more then once? (Note 1)
-pet_rename: no
-
-// [PET] The rate a pet will get friendly by feeding it. (Note 2)
-pet_friendly_rate: 100
-
-// [PET] The rate at which a pet will become hungry. (Note 2)
-pet_hungry_delay_rate: 100
-
-// [PET] If your pet is hungry by how much will the friendlyness decrease by. (Default is 5)
-// Note: The friendlyness is 0-1000 total, at 0 the pet runs away.
-pet_hungry_friendly_decrease: 5
-
-// [PET] Does Pet's Attack Damage Based On Str (Note 1)
-pet_str: yes
-
-// [PET] Whether or not the pet's will use skills. (Note 1)
-pet_status_support: yes
-
-// [PET] Does the pet need its equipment before it does its skill? (Note 1)
-pet_equip_required: yes
-
-// [PET] Will all pets attack? (Note 1)
-// Do NOT use this with pet skills!
-pet_attack_support: no
-
-// [PET] When the master receives damage from the monster, whether or not the pet attacks back.
-pet_damage_support: no
-
-// [PET] Rate at which a pet will support it's owner in battle. (Note 2)
-pet_support_rate: 100
-
-// [PET] Does the pets owner receive exp from the pets damage?
-pet_attack_exp_to_master: no
-
-// [PET] The rate exp. is gained from the pet attacking monsters
-pet_attack_exp_rate: 100
-
-// Will there be a minimum skill dmg even if there is a miss?
-skill_min_damage: no
-
-// Which finger offensive style can be used?
-// 0 = Aegis style
-// 1 = Athena style
-finger_offensive_type: 0
-
-// The rate of job exp. from using Heal skill (100 is the same as the heal amount, 200 is double.
-// The balance of the exp. rate is best used with 5 to 10)
-heal_exp: 0
-
-// The rate of exp. that is gained by the process of resurrection, a unit is 0.01%.
-// Experience calculations for the experience value * level difference of the person revived / 100 * resurrection_exp/10000 which the revived player has can be got.
-resurrection_exp: 0
-
-// The rate of job exp. when using discount and overcharge on an NPC (100 is normal, 200 is double.)
-// The way it is calculated is (money recieved * skill lv) * shop_exp / 100.
-shop_exp: 0
-
-// The delay rate of monk's combo (Note 2)
-combo_delay_rate: 100
-
-// Item check? (Note 1)
-// When logged in or moving in map if the item the player is holding isn't correct there will be a check.
-item_check: no
-
-// Will tuxedo and wedding dresses be shown when worn? (Note 1)
-wedding_modifydisplay: yes
-
-// The time interval for HP to restore naturally. (in milliseconds)
-natural_healhp_interval: 6000
-
-// The time interval for SP to restore naturally. (in milliseconds)
-natural_healsp_interval: 8000
-
-// Automatic healing skill's time interval. (in milliseconds)
-natural_heal_skill_interval: 10000
-
-// The maximum weight for a character to carry when the character stops healing naturally. (in %)
-natural_heal_weight_rate: 50
-
-// Override item names from GRF file? (Note 1)
-item_name_override_grffile: yes
-
-// Are arrows are consumed when used on a bow? (Note 1)
-arrow_decrement: yes
-
-// Maximum atk speed. (Default is 190)
-max_aspd: 190
-
-// Maximum HP. (Default is 32500)
-max_hp: 32500
-
-// Maximum SP. (Default is 32500)
-max_sp: 32500
-
-// Maximum user LV to send to client
-// (Default is 99.. Never go above 127)
-//
-// this is only useful if you have adjusted your client
-// to expect levels higher then 99
-max_lv: 99
-
-// Max limit of char stats. (agi, str, etc.)
-max_parameter: 255
-
-// Max weight carts can hold.
-max_cart_weight: 8000
-
-// Display player skill errors in console? (for debug only) (default: off) (Note 1)
-player_skill_log: off
-
-// Display monster skill errors in console? (for debug only) (default: off) (Note 1)
-monster_skill_log: off
-
-// Display battle log? (for debug only) (default: off) (Note 1)
-battle_log: off
-
-// Display save log? (for debug only) (default: off) (Note 1)
-save_log: off
-
-// Display errors? (for debug only) (default: off) (Note 1)
-error_log: off
-
-// Display other stuff? (for debug only) (default: off) (Note 1)
-etc_log: off
-
-// Save Clothes color. (This will degrade performance [in txt?]) (Note 1)
-save_clothcolor: yes
-
-// Undead type differeniate.
-// 0 = element undead
-// 1 = race undead
-// 2 = both
-undead_detect_type: 2
-
-// Operational mode of automatic counter.
-// 0 = disregard DEF and HIT+20 . CRI*2, 1 = 100% critical
-// Players
-player_auto_counter_type: 0
-// Monsters
-monster_auto_counter_type: 0
-
-// Type of penalty that is applied to FLEE when more than agi_penaly_count monsters are targetting player
-// 0 = no penalty is applied
-// 1 = agi_penaly_num is reduced from FLEE as a %
-// 2 = agi_penaly_num is reduced from FLEE as an exact amount
-agi_penaly_type: 1
-
-// Amount of enemies required to be targetting player before FLEE begins to be penalized
-agi_penaly_count: 3
-
-// Amount of FLEE penalized per each attacking monster more than agi_penaly_count
-agi_penaly_num: 10
-
-// Type of penalty that is applied to VIT defense when more than vit_penaly_count monsters are targetting player
-// 0 = no penalty is applied
-// 1 = vit_penaly_num is reduced from FLEE as a %
-// 2 = vit_penaly_num is reduced from FLEE as an exact amount
-vit_penaly_type: 1
-
-// Amount of enemies required to be targetting player before VIT defense begins to be penalized
-vit_penaly_count: 3
-
-// Amount of VIT defense penalized per each attacking monster more than vit_penaly_count
-vit_penaly_num: 5
-
-// When the player attacks an object, the calculation method of DEF.
-// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
-player_defense_type: 0
-
-// When the monster attacks an object, the calculation method of DEF.
-// With 0 this will be ignored, at 1 or more def = subtraction of (DEF* value).
-monster_defense_type: 0
-
-// When the pet attacks an object, the calculation method of DEF.
-// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
-pet_defense_type: 0
-
-//MDEFTame as above....(MDEF*value)
-magic_defense_type: 0
-
-// Whether or not, ground skills of the players' will stack. (Note 1)
-player_skill_reiteration: no
-
-//Whether or not, ground skills of the monsters' will pile up. (Note 1)
-monster_skill_reiteration: no
-
-//Whether or not ground based skills of a certain type such as traps can be cast straight onto other players. (Note 1)
-player_skill_nofootset: yes
-
-//Whether or not ground based skills of a certain type such as traps can be cast straight onto monsters. (Note 1)
-monster_skill_nofootset: yes
-
-// When a player is cloaking, Whether the wall is checked or not. (Note 1)
-// Note: Gravity announced that they were changing cloaking so it would
-// not need a wall, but this was never implemented. I set to no, for fun.
-player_cloak_check_type: no
-
-// When a monster is cloaking, Whether the wall is checked or not. (Note 1)
-monster_cloak_check_type: no
-
-// Melee damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_short_attack_damage_rate: 100
-
-// Ranged damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_long_attack_damage_rate: 100
-
-// Magic damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_magic_attack_damage_rate: 100
-
-// Misc damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_misc_attack_damage_rate: 100
-
-// When the empelium is broken with WoE mode on, How Long Before The Declaration Of Castle Owner
-// and Removal of Monsters/Players from Castle. (in milliseconds)
-gvg_eliminate_time: 7000
-
-// Whether or not skill is used vis-a-vis the user at the time of MOB skill motion of condition skillused. (Note 1)
-// Not sure what this means, something about monsters changing target?
-mob_changetarget_byskill: no
-
-// Player's Direction Changed When Attacking? (Note 1)
-player_attack_direction_change: yes
-
-// Monsters's Direction Changed When Attacking? (Note 1)
-monster_attack_direction_change: yes
-
-// If the player has Undead Elemental Equipment, should they be frozen or not. (Note 1)
-player_undead_nofreeze: no
-
-// Will Player Skills Stay Within Land Limit or not? (Note 1)
-player_land_skill_limit: yes
-
-// Will Monster Skills Stay Within Land Limit or not? (Note 1)
-monster_land_skill_limit: yes
-
-// If a party uses a skill with penalties do they apply? (Note 1)
-party_skill_penaly: yes
-
-// If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1)
-monster_class_change_full_recover: no
-
-// Do produced items have the maker's name on them? (Note 1)
-produce_item_name_input: yes
-
-// Do produced potions have the maker's name on them? (Note 1)
-produce_potion_name_input: yes
-
-// Do crafted arrows have the maker's name on them? (Note 1)
-making_arrow_name_input: yes
-
-// Does created holy water have the maker's name on it? (Note 1)
-holywater_name_input: yes
-
-// Stop logout for 10 seconds after a hit? (Note 1)
-prevent_logout: yes
-
-// If skill fails by delay, should it display or not. (Note 1)
-display_delay_skill_fail: yes
-
-// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
-chat_warpportal: no
-
-// Can a monster be warped by a warp portal? (Note 1)
-mob_warpportal: no
-
-// Is a monster summoned via dead branch aggresive? (Note 1)
-dead_branch_active: yes
-
-// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
-vending_max_value: 10000000
-
-// If someone loots, show name in party? (Note 1)
-show_steal_in_same_party: no
-
-// Allow upper class (Advanced 2nd Class)? (Note 1)
-// Just leave this at yes
-enable_upper_class: yes
-
-// Is a usual attack of a pet delivered withOUT an attribute? (Note 1)
-pet_attack_attr_none: no
-
-// Is a usual attack of a player delivered withOUT an attribute? (Note 1)
-pc_attack_attr_none: no
-
-// Is a usual attack of a monster delivered withOUT an attribute? (Note 1)
-mob_attack_attr_none: no
-
-// mob attacks againsts players wearing ghostring armor do full damage
-mob_ghostring_fix: no
-
-// Does the Golden Thief Bug card only work during pvp?
-// no or 0 - gtb works all the time
-// 1 - 100 - percentage of magic damage reduced only during pvp (or gvg)
-gtb_pvp_only: no
-
-// How to count the number of the enemies who do an agi penalty...
-// 1 or less: It is a count altogether.
-// 2: Full evasion exclusion
-// 3: Full evasion and evasion exclusion
-// 4 or more: Except all.
-agi_penaly_count_lv: 2
-
-// How to count the number of the enemies who do a vit penalty
-// 1 or less: It is a count altogether.
-// 2: Full evasion exclusion
-// 3: Full evasion and evasion exclusion
-// Four or more: Except all.
-vit_penaly_count_lv: 3
-
-// Grandcross Settings (Dont mess with these)
-// Even if MOB (PC) has overlapped, it HIT(s) compulsion 3. (Default no)
-gx_allhit: no
-// The effect of the arms card of a damage %UP system is set also to GX at -L effect. (default no)
-gx_cardfix: no
-// The attribute affinity of GX is calculated doubly. (Default yes)
-gx_dupele: yes
-// Grandcross display type (Default 1)
-// 0: Yellow character
-// 1: White character
-gx_disptype: 1
-
-// If no than you can use the ensemble skills alone. (Note 1)
-player_skill_partner_check: yes
-
-// Is the character of a GM account set as the object of a display by @ command etc. or not?
-hide_GM_session: no
-
-// ユニット移動処-摯-@。0で-{鯖仕-l(回線負荷→重、鯖処-掾ィ軽)、1でAthena仕-l(回線負荷→軽、鯖処-掾ィ重)
-// translation (babelfish):
-// Unit portable place - ? @.
-// With 0 - {mackerel SI -l (circuit load -> heavily, the mackerel place - the ? ? lightly),
-// With 1 - Athena SI -l (circuit load -> lightly, the mackerel place - the ? ? it is heavy)
-unit_movement_type: 0
-
-// Are other requests accepted during [various things[party,guild]] a request or not?
-// It does not accept by no accepted by yes.
-invite_request_check: yes
-
-// リムーブトラップの仕-l 0:-{鯖仕-l、罠1個 1:Athena仕-l、使ったアイテムを使った個数
-// translation (babelfish):
-// SI of ???????? -l
-// 0: - {Mackerel SI -l, trap 1
-// 1:Athena SI -l, the quantity which used the item which was used
-skill_removetrap_type: 0
-
-// Will display experience gained from killing a monster. (Note 1)
-disp_experience: no
-
-// Whether or not Marine Spheres and Floras summoned by Alchemist will drop items and give experience? (Note 1)
-alchemist_summon_reward: no
-
-// Maximum level (default 255). Requires that you have an experience table that supports more than 99 levels to go
-// any higher. It is left at 255 for default as to not cause problems for people who already have players at higher levels.
-// @lvup command will not go higher than this value, and therefor will not loop back around 0.
-maximum_level: 255
-
-// Leave at 0 to use normal drop system. Anything higher than 0 will allow luk to affect drop rates, based on a percentage.
-// Example 1: Setting of 10 with 50 luk would add 5 to the drop rate. So say a card has a drop rate of 2, it would become 7.
-// Example 2 : Setting 100 with 99 luk would add 99 to the drop rate.
-drops_by_luk: 0
-
-// Do all monsters ignore GMs unless attacked? (Note 1)
-monsters_ignore_gm: no
-
-// Turn equipment breaking on. (Note 1)
-// Turning this one will allow equipment to break in battles,
-// as well as some skills that have chance to break equipmen.
-equipment_breaking: no
-
-// Overall rate of which equipment can break. (Note 2) [100 = .01% chance to break equipment before penalties.]
-// Critical attacks will double chance to break equipment, and other skills (such as Power Thrust) will increase weapon breaking chance as well.
-// This does not effect Sage weapon enchantment failure chance.
-equipment_break_rate: 100
-
-// PK Server Mode. Turns entire server pvp(excluding towns). Experience loss is doubled if killed by another player.
-// When players hunt monsters over 20 levels higher, they will receive 15% additional exp., and 25% chance of receiving more items.
-// There is a nopvp.txt for setting up maps not to have pk on in this mode. Novices cannot be attacked and cannot attack.
-// Normal pvp counter and rank display are disabled as well.
-pk_mode: no
-
-// Turn this on to allow a player to level up more than once from a kill. (Note 1)
-multi_level_up: yes
-
-// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
-backstab_bow_penalty: yes
-
-// Choose if server begin with night (yes) or day (no)
-night_at_start: no
-
-// Define duration in msec of the day (default: 7,200,000 = 2 hours)
-// Set to 0 to disable day cycle (but not @day GM command).
-// Except 0, minimum is 60000 (1 minute).
-day_duration: 0
-
-// Define duration in msec of the night (default: 1,800,000 = 30 min)
-// Set to 0 to disable night cycle (but not @night GM command).
-// Except 0, minimum is 60000 (1 minute).
-night_duration: 0
-
-// Will display a mob's hp/maxhp when the mouse cursor is over them. (Note 1)
-// Will not display guardian or emperium hp.
-//
-// Still under testing (works but doesn't update)
-show_mob_hp: no
-
-// Ban people that try to use an other name of its name (spoof name).
-// Duration of the ban, in minutes (default: 5). Value from 0 to 32767
-// to disable the ban, set 0
-ban_spoof_namer: 5
-
-// Set here minimum level of a (online) GM that can receive all informations about any player that try to hack, spoof a name, etc.
-// Values are from 0 to 100.
-// 100: disable information
-// 0: send to any people, including normal players
-// default: 60, according to GM definition in atcommand_athena.conf
-hack_info_GM_level: 60
-
-// Set here the minimum GM level to disable the nowarp (from) and nowarpto (to) flags.
-// This option is mainly used in AT_commands (@memo, @warp, @charwarp, @go, etc...). All GM commands used to move or set a new map check nowarp and nowarpto flags.
-// default: 20 (first level after normal player or super'normal' player)
-any_warp_GM_min_level: 20
-
-// Set here which client version do you accept. Add all values of clients:
-// 1: Clients before 2004-07-06 (old clients)
-// 2: 2004-07-06 kRO client
-// 4: 2004-07-13 kRO client
-// 8: 2004-07-26 kRO client
-// 16: 2004-08-09 kRO / 2004-08-16aSakray / 2004-08-17aSakray client
-// 32: 2004-09-06aSakray client
-// default value: 63 (all clients)
-packet_ver_flag: 63
-
-// Allow GMs to mute players or not?
-muting_players: no
-
-// Mail system - Only function in sql version
-mail_system: no
-
-// valid range of dye's and styles on the client
-min_hair_style: 0
-max_hair_style: 30
-min_hair_color: 0
-max_hair_color: 30
-min_player_look: 0
-max_player_look: 2
-min_mob_look: 0
-max_mob_look: 3
-min_cloth_color: 0
-max_cloth_color: 4
-
-// Visible area size (how many squares away from a player can they see)
-area_size: 14
-
-// chat system:
-// More than flood lines in threshold seconds gets a ban
-// More than warn lines in threshold seconds gets a warning
-chat_spam_flood: 10
-chat_spam_warn: 8
-chat_spam_threshold: 10
-
-// How much to increment the line count if the content is lame.
-// Lameness is defined as mostly caps, punctuation, or a repeat of the last line.
-// Set to 1 or 2 depending on how much you hate hearing "ITEN PLZ!" 3 times in a row..
-chat_lame_penalty: 2
-
-// how many hours to auto ban spammer, 0 to disable [0-32767]. Default 6.
-chat_spam_ban: 1
-
-// Maximum line lengt, if a message is above chat_maxline, its dropped [1-512]. Default 255.
-chat_maxline: 512
-
-// Packet flood protection
-// If more than packet_spam_flood over-limits packets are recieved in
-// packet_spam_threshold seconds, we will kick the user if packet_spam_kick
-// is not set to 0. Limits on individual packets are defined in src/map/clif.c
-packet_spam_flood: 30
-packet_spam_threshold: 2
-packet_spam_kick: 0
-
-// local settings for this server in this file
-import: conf/battle_local.conf
diff --git a/conf/battle_local.conf.example b/conf/battle_local.conf.example
deleted file mode 100644
index c9ba222cb..000000000
--- a/conf/battle_local.conf.example
+++ /dev/null
@@ -1 +0,0 @@
-// Nothing needs to be done here.
diff --git a/conf/battlegrounds.conf b/conf/battlegrounds.conf
new file mode 100644
index 000000000..0aa81d35d
--- /dev/null
+++ b/conf/battlegrounds.conf
@@ -0,0 +1,125 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://hercules.ws/board/
+//====================================================
+//= Link~u! <description> <link to wiki/topic>
+//= http://hercules.ws/board/topic/928-memory-slasher-may-30-patch/
+//====================================================
+//= Fields (TODO/INCOMPLETE)
+//= arenas: ({
+//= //- allowedTypes defines what kind of applications the arena will accept, setting is not case-sensitive and is ok with whitespaces
+//= allowedTypes: "Solo | Party" //Arena Accepts solo and party-type joins
+//= allowedTypes: "guild|party" //Arena Accepts solo and guild-type joins
+//= allowedTypes: "All" //Arena Accepts solo, party and guild-type joins
+//= //- fillAnnounce (optional arena param)
+//= })
+battlegrounds: (
+{
+ /* feature is not complete */
+ feature_off:true
+ /* character variable for global bg delay */
+ global_delay_var: "BG_Delay_Tick"
+ /* how many seconds to consider a player "afk" and kick him out? */
+ maximum_afk_seconds: 30
+
+ /* one can add as many as he wishes */
+ /* for custom ones, need to edit "lua files/entryqueue/entryqueuelist.lua" [Ind/Hercules] */
+ arenas: ({
+ name: "Tierra Gorge" //must match the name in client files
+ event: "Tierra_BG2::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 3
+ loss: 1
+ draw: 1
+ }
+ minPlayers: 6 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 6 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "Tierra_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "Flavius" //must match the name in client files
+ event: "start#bat_b01::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 9
+ loss: 3
+ draw: 3
+ }
+ minPlayers: 2 /* minimum amount of players to start (DEBUG VALUE, CHANGE BACK) */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 6 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "Flavius_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 80 and up)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 80
+ maxLevel: 150
+ reward: {/* amount of badges awarded on each case */
+ win: 5
+ loss: 1
+ draw: 1
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 60~79)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 60
+ maxLevel: 79
+ reward: {/* amount of badges awarded on each case */
+ win: 2
+ loss: 0
+ draw: 1
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ },{
+ name: "KVM (Level 59 and below)" //must match the name in client files
+ event: "KvM03_BG::OnPlayerListReady"
+ allowedTypes: "All" /* Solo, Party and Guild */
+ minLevel: 1
+ maxLevel: 59
+ reward: {/* amount of badges awarded on each case */
+ win: 1
+ loss: 0
+ draw: 0
+ }
+ minPlayers: 4 /* minimum amount of players to start */
+ maxPlayers: 60 /* maximum amount of players */
+ minTeamPlayers: 5 /* minimum amount of team members required for a team (party or guild) to join */
+ delay_var: "KVM_BG_Tick" /* char variable name that will store the delay for this match */
+ maxDuration: 30 /* maximum duration in minutes, if reached game ends and highest score wins (or calls a draw if scores are equal) */
+ fillDuration: 20 /* time in seconds to wait for more applications when minimum has been reached */
+ pGameDuration: 20 /* time to wait for players to confirm their attendence after queueing process has finished */
+ }
+ )
+})
diff --git a/conf/build-magic.sh b/conf/build-magic.sh
deleted file mode 100755
index f064a2861..000000000
--- a/conf/build-magic.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /bin/bash
-
-RSCRIPT="spells-build"
-
-if [ -a $RSCRIPT ]; then printf ""; else
- echo '#! /bin/bash' > $RSCRIPT;
- echo 'sed \' >> $RSCRIPT;
- chmod a+x $RSCRIPT
-fi
-
-for n in `grep -o '"#..."' magic.conf.template`; do
- if grep $n $RSCRIPT; then printf ""; else
- CHANGES=1
- echo "'s/${n}/${n}/;'\\" >> $RSCRIPT;
- fi
-done
-
-if [ x$CHANGES == x1 ]
-then echo "${RSCRIPT} has been updated; please provide invocations for spells and/or teleport anchors.";
-else cat magic.conf.template | ./$RSCRIPT > magic.conf;
-fi
diff --git a/conf/channels.conf b/conf/channels.conf
new file mode 100644
index 000000000..9700f626c
--- /dev/null
+++ b/conf/channels.conf
@@ -0,0 +1,64 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://hercules.ws/board/
+//====================================================
+//================= More Information =================
+// http://hercules.ws/board/topic/316-introducing-hercules-channel-system/
+//====================================================
+chsys: (
+{
+ /* Default Channels (available on boot) */
+ default_channels: {
+ /* channel_name : channel_messages_color */
+ main: "Orange" /* Available as #main */
+ support: "Blue" /* Available as #support */
+ trade: "Red" /* Available as #trade */
+ offtopic: "Cyan" /* Available as #offtopic */
+ /* You may add as many channels as you like */
+ }
+ /* Colors Available */
+ colors: {
+ Default: "0xffffff" /* Custom channels use the first color listed unless a font is selected through @channel. */
+ Red: "0xff0000"
+ Blue: "0x83cfe9"
+ Orange: "0xe57c00"
+ Cyan: "0x00b89d"
+ Yellow: "0xffff90"
+ Green: "0x28bf00"
+ Light_Green: "0x3dff98"
+ Normal: "0x00ff00"
+ /* As many colors as you like */
+ }
+ /* Allow users to create their own (private) channels through @channels command? */
+ /* (must also allow players to use @channels in groups.conf) */
+ allow_user_channel_creation: true
+
+ /* "map_local_channel" is a instanced channel unique to each map. */
+ map_local_channel: true
+ map_local_channel_name: "map" /* Available as #map */
+ map_local_channel_color: "Yellow"
+ map_local_channel_autojoin: true /* You can disable autojoin in specific maps through a mapflag or zone. */
+
+ /* "ally_channel" is a channel shared by all your guild allies */
+ ally_channel_enabled: true
+ ally_channel_name: "ally" /* Available as #ally */
+ ally_channel_color: "Green"
+ ally_channel_autojoin: true /* Will members autojoin to their respective #ally chats when they log-in? */
+
+ /* "irc_channel" is a special channel connected to a specific chat room in any irc network. */
+ irc_channel_enabled: false
+ irc_channel_name: "irc" /* available as #irc */
+ irc_channel_color: "Light_Green"
+ irc_channel_network: "irc.rizon.net:6665" /* network to connect to (:and port) */
+ irc_channel_channel: "#Hercules" /* channel in the network above to join */
+ irc_channel_nick: "Hercules_chSysBot" /* nick the bot will use */
+ irc_channel_nick_pw: "" /* password to this nick (if any) to identify to nick server on the irc network */
+ irc_channel_use_ghost: false /* whether to send a GHOST command to the nick server (requires irc_channel_nick_pw to be defined) */
+}
+)
diff --git a/conf/char-server.conf b/conf/char-server.conf
new file mode 100644
index 000000000..6784a3c94
--- /dev/null
+++ b/conf/char-server.conf
@@ -0,0 +1,187 @@
+// Character Server configuration file.
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+// Server Communication username and password.
+userid: s1
+passwd: p1
+
+// Server name, use alternative character such as ASCII 160 for spaces.
+// NOTE: Do not use spaces or any of these characters which are not allowed in
+// Windows filenames \/:*?"<>|
+// ... or else guild emblems won't work client-side!
+server_name: Hercules
+
+// Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
+wisp_server_name: Server
+
+// Login Server IP
+// The character server connects to the login server using this IP address.
+// NOTE: This is useful when you are running behind a firewall or are on
+// a machine with multiple interfaces.
+//login_ip: 127.0.0.1
+
+// The character server listens on the interface with this IP address.
+// NOTE: This allows you to run multiple servers on multiple interfaces
+// while using the same ports for each server.
+//bind_ip: 127.0.0.1
+
+// Login Server Port
+login_port: 6900
+
+// Character Server IP
+// The IP address which clients will use to connect.
+// Set this to what your server's public IP address is.
+//char_ip: 127.0.0.1
+
+// Character Server Port
+char_port: 6121
+
+//Time-stamp format which will be printed before all messages.
+//Can at most be 20 characters long.
+//Common formats:
+// %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
+// %H:%M:%S (hour:minute:second, 24 hour format)
+// %d/%b/%Y (day/Month/year)
+//For full format information, consult the strftime() manual.
+//timestamp_format: [%d/%b %H:%M]
+
+//If redirected output contains escape sequences (color codes)
+stdout_with_ansisequence: no
+
+//Makes server output more silent by ommitting certain types of messages:
+//1: Hide Information messages
+//2: Hide Status messages
+//4: Hide Notice Messages
+//8: Hide Warning Messages
+//16: Hide Error and SQL Error messages.
+//32: Hide Debug Messages
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+// Type of server.
+// No functional side effects at the moment.
+// Displayed next to the server name in the client.
+// 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=F2P
+char_server_type: 0
+
+// Minimum Group ID to join char server when it is on char_server_type 1 (maintenance)
+char_maintenance_min_group_id: 99
+
+// Enable or disable creation of new characters.
+// Now it is actually supported [Kevin]
+char_new: 1
+
+// Display (New) in the server list.
+char_new_display: 0
+
+// Maximum users able to connect to the server.
+// Set to 0 to disable users to log-in. (-1 means unlimited)
+max_connect_user: -1
+
+// Group ID that is allowed to bypass the server limit of users.
+// Default: -1 = nobody (there are no groups with ID < 0)
+// See: conf/groups.conf
+gm_allow_group: -1
+
+// How often should the server save all files? (In seconds)
+// Note: Applies to all data files on TXT servers.
+// On SQL servers, it applies to guilds (character save interval is defined on the map config)
+autosave_time: 60
+
+// Display information on the console whenever characters/guilds/parties/pets are loaded/saved?
+save_log: yes
+
+// Start point, Map name followed by coordinates (x,y)
+start_point: 000-1,80,109
+
+// Starting items for new characters
+// Format is: id1,quantity1,stackable1,idN,quantityN,stackableN
+// stackable:
+// 0 - Not stackable (weapon, armor, egg, pet armor)
+// 1 - Stackable
+//start_items: 1201,1,0,2301,1,0
+
+// Starting zeny for new characters
+start_zeny: 0
+
+// Size for the fame-lists
+fame_list_alchemist: 10
+fame_list_blacksmith: 10
+fame_list_taekwon: 10
+
+// Guild earned exp modifier.
+// Adjusts taxed exp before adding it to the guild's exp. For example, if set
+// to 200, the guild receives double the player's taxed exp.
+guild_exp_rate: 100
+
+// Name used for unknown characters
+unknown_char_name: Unknown
+
+// To log the character server?
+log_char: 1
+
+// Allow or not identical name for characters but with a different case (upper/lower):
+// example: Test-test-TEST-TesT; Value: 0 not allowed (default), 1 allowed
+name_ignoring_case: no
+
+// Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
+// NOTE: Applies to character, party and guild names.
+// 0: no restriction (default)
+// 1: only letters/symbols in 'char_name_letters' option.
+// 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
+char_name_option: 1
+
+// Set the letters/symbols that you want use with the 'char_name_option' option.
+// Note: Don't add spaces unless you mean to add 'space' to the list.
+char_name_letters: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
+
+// Restrict character deletion by BaseLevel
+// 0: no restriction (players can delete characters of any level)
+// -X: you can't delete chars with BaseLevel <= X
+// Y: you can't delete chars with BaseLevel >= Y
+// e.g. char_del_level: 80 (players can't delete characters with 80+ BaseLevel)
+char_del_level: 0
+
+// Amount of time in seconds by which the character deletion is delayed.
+// Default: 86400 (24 hours)
+// NOTE: Requires client 2010-08-03aragexeRE or newer.
+char_del_delay: 86400
+
+// Block deletion if character is inside a guild or a party? (BOOL)
+// default: 0 official: 1
+// !!This check is imposed by Aegis to avoid dead entries in databases and _is_not_needed_ as we clear data properly!!
+char_aegis_delete: 0
+
+// What folder the DB files are in (item_db.conf, etc.)
+db_path: db
+
+//==================================================================
+// Pincode system
+//==================================================================
+
+// A window is opened before you can select your character and you will have to enter a pincode by using only your mouse
+// NOTE: Requires client 2011-03-09aragexeRE or newer.
+// 0: disabled
+// 1: enabled
+pincode_enabled: 0
+
+// Request Pincode only on login or on everytime char select is accessed?
+// 0: only on login (default)
+// 1: everytime the char select window is accessed
+pincode_charselect: 0
+
+// How often does a user have to change his pincode?
+// Default: 0
+// 0: never
+// X: every X minutes
+pincode_changetime: 0
+
+// How often can a user enter the wrong password?
+// Default: 3
+// NOTE: The maximum on clientside is 3
+pincode_maxtry: 3
+
+import: conf/import/char_conf.txt
diff --git a/conf/char_athena.conf b/conf/char_athena.conf
deleted file mode 100644
index d18da79b2..000000000
--- a/conf/char_athena.conf
+++ /dev/null
@@ -1,137 +0,0 @@
-// Athena Character configuration file.
-
-// Option to force a player to create an e-mail.
-// If a player have default e-mail, and if you activate this option, the player can only connect in the game (to arrive on a map) like follow:
-// - Create at least 1 character
-// - Select 1 character
-// - Select DEL to enter his/her e-mail. (if OK is choosen, client says to the player: 'invalid e-mail')
-// - If his/her e-mail is correct, the player enter in the game (an e-mail is saved definitively).
-// - If his/her e-mail is incorrect, he/she have 'incorrect e-mail' and must select again DEL.
-// - After entering in the game (when the player arrives on a map), DEL and SEL/OK button work normaly for all next connections.
-// Resume: If a player have "incorrect/invalid e-mail" when he/she click on 'OK' button,
-// the player must click 'DEL' button and register his/her NEW e-mail to enter in the game
-// So, default is 0, because administrator must explain to their players before to activate this option.
-email_creation: 0
-
-// Is Character server in maintainence mode?
-char_maintenance: 0
-
-// Enable or disable creation of new characters.
-char_new: 0
-
-// Maximum users able to connect to the server. Set to 0 for unlimited.
-max_connect_user: 0
-
-// It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-// If player doesn't have same IP, connection is refused.
-// Set to 0/off/no to not check IP of player.
-// Set to 1/on/yes if you want to check (default)
-// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
-// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
-check_ip_flag: yes
-
-// How often should the server save all files? (In seconds)
-autosave_time: 15
-
-// Character server flatfile database
-char_txt: save/athena.txt
-
-// Choose to create or not backup file (yes/no, 0/1, etc...)
-// default is 'no', because backup file take time for nothing. Actually, there is no problem on characters file creation and save.
-backup_txt_flag: no
-
-// Character server flatfile database (backup)
-backup_txt: save/athena_backup.txt
-
-// Start point, Map name followed by coordinates (x,y)
-start_point: 000-0.gat,22,24
-start_point2: 000-0.gat,22,24
-start_point3: 000-0.gat,22,24
-
-// Starting weapon for new characters
-start_weapon: 0
-
-// Starting armor for new characters
-start_armor: 0
-
-// Starting zeny for new characters
-start_zeny: 0
-
-min_hair_style: 0
-max_hair_style: 30
-min_hair_color: 0
-max_hair_color: 30
-min_player_look: 0
-max_player_look: 2
-
-max_char_class: 6
-
-// max number of char slots
-char_slots: 10
-
-// Name used for unknown characters
-unknown_char_name: Unknown
-
-// Log Filename
-char_log_filename: log/char.log
-
-// Allow or not identical name for characters but with a different case (upper/lower):
-// example: Test-test-TEST-TesT; Value: 0 not allowed (default), 1 allowed
-name_ignoring_case: 0
-
-// Manage possible letters/symbol in the name of charater. Control character (0x00-0x1f) are never accepted. Possible values are:
-// 0: no restriction (default)
-// 1: only letters/symbols in 'char_name_letters' option.
-// 2: Letters/symbols in 'char_name_letters' option are forbidden. All others are possibles.
-char_name_option: 1
-
-// Set the letters/symbols that you want use with the 'char_name_option' option.
-// Note: add 'space' between 2 others letters/symbols.
-// default: void.
-// char_name_letters: [ ] { } , . | - # @ ! ~ ` ; : " " ? / \ = + < >
-char_name_letters: abcdefghijklmnoprstquvwxyzABCDEFGHIJKLMNOPRSTQUVWXYZ1234567890- _+=!'
-
-// Filename of the file which receives the online players list in text
-online_txt_filename: online.txt
-
-// Filename of the file which receives the online players list, but in html version
-online_html_filename: online.html
-
-// Choose how to display online players.
-// (sorting operation with a lot of online players can take time on a slow computer)
-// 0: no sorting (default)
-// 1: by alphabetical order of their name
-// 2: by number of their zenys
-// 3: by their base level
-// 4: by their job (and job level inside the same job)
-// 5: by alphabetical order of their actual map location
-online_sorting_option: 0
-
-// Choose which columns that you want display in the online files. Do the addition of these values:
-// (if value is 0, no file is done)
-// 1: name (just the name, no function like 'GM')
-// 2: job
-// 4: levels
-// 8: map name
-// 16: mapname and coordonates
-// 32: zenys
-// 64: name (with 'GM' if the player is a GM)
-// default value: 1 (only name)
-online_display_option: 64
-
-// minimum GM level to display 'GM' when we want to display it (default: 1)
-online_gm_display_min_level: 60
-
-// refresh time (in sec) of the html file in the explorer (default 20)
-online_refresh_html: 20
-
-// Anti-freeze system enable
-anti_freeze_enable: 0
-// Anti-freeze system interval (in seconds)
-anti_freeze_interval: 6
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
-
-// local settings for this server in this file
-import: conf/char_local.conf
diff --git a/conf/char_local.conf.example b/conf/char_local.conf.example
deleted file mode 100644
index aabf6762c..000000000
--- a/conf/char_local.conf.example
+++ /dev/null
@@ -1,25 +0,0 @@
-// Athena Character local configuration file.
-
-// wan ip override. this ip only will sended to cleints.
-// wan_ip:1.2.3.4
-
-// Server Communication username and password.
-userid: s1
-passwd: p1
-
-// Server name, no more than 19 characters
-server_name: The Mana World
-
-// Wisp name for server: used to send wisp from server to players (between 4 to 23 characters)
-wisp_server_name: Server
-
-// Login Server IP
-login_ip:81.161.192.4
-// Login Server Port
-login_port: 6901
-
-// Character Server IP
-char_ip:81.161.192.4
-// Character Server Port
-char_port: 6122
-
diff --git a/conf/charhelp.txt b/conf/charhelp.txt
new file mode 100644
index 000000000..e3acddbb4
--- /dev/null
+++ b/conf/charhelp.txt
@@ -0,0 +1,28 @@
+ 40:--- CHARACTER CMD ---
+ 40:#statsall <char name> - Set all stats of a player to maximum.
+ 40:#itemlist <char name> - Displays all items of a player.
+ 40:#storagelist <char name> - Displays all items of a player's storage.
+ 40:#stats <char name> - Displays a characters stats.
+ 60:#option <char name> <param1> <param2> <param3> - Like @option command but only to target character.
+ 50:#mountpeco <char name> - Give/remove to a player a peco (Class is required, but not skill).
+ 50:#petrename <char name> - Re-enable pet rename to a player.
+ 60:#save <char name> <map> <x> <y> - Changes the target players respawn point.
+ 60:#baselvl/#blvl <char name> <#> - Change a characters base level.
+ 60:#joblvl/#jlvl <char name> <#> - Change a characters job level.
+ 60:#job/#jobchange <char name> <job ID> - Changes target characters job.
+ 60:#zeny <char name> <amount> - Give/take a players Zeny
+ 60:#cash <char name> <amount> - Give/take a player cash points
+ 60:#points <char name> <amount> - Give/take a player Kafra points
+ 60:#stpoint <char name> <amount> - Give/take a players stat points
+ 60:#skpoint <char name> <amount> - give/take a players skill points
+ 60:#skreset <char name> - Reset skills of a character.
+ 60:#streset <char name> - Reset stats of a character.
+ 60:#reset <char name> - Reset stats AND skills of a character.
+ 60:#questskill <char name> <#> - Gives to a player the specified quest skill.
+ 60:#lostskill <char name> <#> - Takes away the specified quest skill from the player.
+ 60:#delitem <char name> <item_name_or_ID> <quantity> - Remove items from a character
+ 50:#model <char name> <hair type> <hair color> <clothes color> - Changes a player's model
+ 60:#disguise <char name> <monster_name_or_monster_ID> - Changes disguise of a player
+ 60:#undisguise <char name> - Cancels disguise of a player
+ 60:#changesex <char name> - Changes sex of a player (all characters of the account)
+ 60:#warp/#rura+ <char name> <mapname> <x> <y> - Warps character to location of choice
diff --git a/conf/eathena-monitor.conf.example b/conf/eathena-monitor.conf.example
deleted file mode 100644
index 70dcd2e59..000000000
--- a/conf/eathena-monitor.conf.example
+++ /dev/null
@@ -1,14 +0,0 @@
-# $Id: eathena-monitor.conf,v 1.0 2006/13/10 21:42:22 Platyna Exp $
-
-# By default the eathena-monitor looks for its config file in
-# $HOME/tmwserver/conf/, creates the log file in $HOME/tmwserver/log/.
-# You may use this file to adjust these settings if needed or use predefined
-# defaults. Lines starting with hash mark or white space are ignored.
-
-# login_server=/home/athena/tmwserver/login-server
-# map_server=/home/athena/tmwserver/map-server
-# char_server=/home/athena/tmwserver/char-server
-# workdir=/home/athena/tmwserver
-# In seconds, default is 5.
-# interval=2
-# logfile=/home/athena/tmwserver/log/monitor.log
diff --git a/conf/gm_account.txt.example b/conf/gm_account.txt.example
deleted file mode 100644
index 912e1a092..000000000
--- a/conf/gm_account.txt.example
+++ /dev/null
@@ -1 +0,0 @@
-// <account ID> <level>
diff --git a/conf/grf-files.txt b/conf/grf-files.txt
index e69de29bb..6af058575 100644
--- a/conf/grf-files.txt
+++ b/conf/grf-files.txt
@@ -0,0 +1,12 @@
+//-----------------------------------------
+// GRF Files
+// Add as many as needed.
+//-----------------------------------------
+//grf: C:\Program Files\Gravity\RO\rdata.grf
+//grf: C:\Program Files\Gravity\RO\data.grf
+
+//-----------------------------------------
+// Data Directory
+// Use the base folder, not the data\ path.
+//-----------------------------------------
+//data_dir: C:\Program Files\Gravity\RO\
diff --git a/conf/groups.conf b/conf/groups.conf
new file mode 100644
index 000000000..d31f46f24
--- /dev/null
+++ b/conf/groups.conf
@@ -0,0 +1,276 @@
+/*
+
+Player groups configuration file
+---------------------------------
+
+This file defines "player groups" and their privileges.
+
+Each group has its id and name, lists of available commands and other
+permissions, and a list of other groups it inherits from.
+
+
+Group settings
+--------------
+<id>
+Unique group number. The only required field.
+
+<name>
+Any string. If empty, defaults to "Group <id>". It is used in several @who
+commands.
+
+<level>
+Equivalent of GM level, which was used in revisions before r15572. You can
+set it to any number, but usually it's between 0 (default) and 99. Members of
+groups with lower level can not perform some actions/commands (like @kick) on
+members of groups with higher level. It is what script command getgmlevel()
+returns. Group level can also be used to override trade restrictions
+(db/item_trade.txt).
+
+<commands>
+A group of settings
+ <command name> : <bool>
+or
+ <commandname> : [ <bool>, <bool> ]
+First boolean value is for atcommand, second one for charcommand. If set to
+true, group can use command. If only atcommand value is provided, false is
+assumed for charcommand. If a command name is not included, false is assumed for
+both atcommand and charcommand.
+For a full list of available commands, see: doc/atcommands.txt.
+Command names must not be aliases.
+
+<log_commands>
+Boolean value. If true then all commands used by the group will be logged to
+atcommandlog. If setting is omitted in a group definition, false is assumed.
+Requires 'log_commands' to be enabled in 'conf/logs.conf'.
+
+<permissions>
+A group of settings
+ <permission> : <bool>
+If a permission is not included, false is assumed.
+For a full list of available permissions, see: doc/permissions.txt
+
+<inherit>
+A list of group names that given group will inherit commands and permissions
+from. Group names are case-sensitive.
+
+Inheritance results
+-------------------
+Both multiple inheritance (Group 2 -> Group 1 and Group 3 -> Group 1) and
+recursive inheritance (Group 3 -> Group 2 -> Group 1) are allowed.
+
+Inheritance rules should not create cycles (eg Group 1 inherits from Group 2,
+and Group inherits from Group 1 at the same time). Configuration with cycles is
+considered faulty and can't be processed fully by server.
+
+Command or permission is inherited ONLY if it's not already defined for the
+group.
+If group inherits from multiple groups, and the same command or permission is
+defined for more than one of these groups, it's undefined which one will be
+inherited.
+
+Syntax
+------
+This config file uses libconfig syntax:
+http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-Files
+*/
+
+groups: (
+{
+ id: 0 /* group 0 is the default group for every new account */
+ name: "Player"
+ level: 0
+ inherit: ( /*empty list*/ )
+ commands: {
+ /* no commands by default */
+ }
+ permissions: {
+ /* without this basic permissions regular players could not
+ trade or party */
+ can_trade: true
+ can_party: true
+ }
+},
+{
+ id: 1
+ name: "Super Player"
+ inherit: ( "Player" ) /* can do everything Players can and more */
+ level: 0
+ commands: {
+ /* informational commands */
+ commands: true
+ charcommands: true
+ help: true
+ rates: true
+ uptime: true
+ showdelay: true
+ exp: true
+ mobinfo: true
+ iteminfo: true
+ whodrops: true
+ time: true
+ jailtime: true
+ hominfo: true
+ homstats: true
+ showexp: true
+ showzeny: true
+ whereis: true
+ /* feature commands */
+ refresh: true
+ noask: true
+ noks: true
+ autoloot: true
+ alootid: true
+ autoloottype: true
+ autotrade: true
+ request: true
+ go: true
+ breakguild: true
+ channel: true
+ }
+ permissions: {
+ }
+},
+{
+ id: 2
+ name: "Support"
+ inherit: ( "Super Player" )
+ level: 1
+ commands: {
+ version: true
+ where: true
+ jumpto: true
+ who: true
+ who2: true
+ who3: true
+ whomap: true
+ whomap2: true
+ whomap3: true
+ users: true
+ broadcast: true
+ localbroadcast: true
+ }
+ log_commands: true
+ permissions: {
+ receive_requests: true
+ view_equipment: true
+ }
+},
+{
+ id: 3
+ name: "Script Manager"
+ inherit: ( "Support" )
+ level: 1
+ commands: {
+ tonpc: true
+ hidenpc: true
+ shownpc: true
+ loadnpc: true
+ unloadnpc: true
+ npcmove: true
+ addwarp: true
+ }
+ log_commands: true
+ permissions: {
+ any_warp: true
+ }
+},
+{
+ id: 4
+ name: "Event Manager"
+ inherit: ( "Support" )
+ level: 1
+ commands: {
+ monster: true
+ monstersmall: true
+ monsterbig: true
+ killmonster2: true
+ cleanarea: true
+ cleanmap: true
+ item: [true, true]
+ zeny: [true, true]
+ disguise: [true, true]
+ undisguise: [true, true]
+ size: [true, true]
+ raise: true
+ raisemap: true
+ day: true
+ night: true
+ skillon: true
+ skilloff: true
+ pvpon: true
+ pvpoff: true
+ gvgon: true
+ gvgoff: true
+ allowks: true
+ me: true
+ marry: true
+ divorce: true
+ refreshall: true
+ }
+ log_commands: true
+ permissions: {
+ can_trade: false
+ any_warp: true
+ }
+},
+{
+ id: 10
+ name: "Law Enforcement"
+ inherit: ( "Support" )
+ level: 2
+ commands: {
+ hide: true
+ follow: true
+ kick: true
+ disguise: true
+ fakename: true
+ option: true
+ speed: true
+ warp: true
+ kill: true
+ recall: true
+ ban: true
+ block: true
+ jail: true
+ jailfor: true
+ mute: true
+ storagelist: true
+ cartlist: true
+ itemlist: true
+ stats: true
+ }
+ log_commands: true
+ permissions: {
+ join_chat: true
+ kick_chat: true
+ hide_session: true
+ who_display_aid: true
+ hack_info: true
+ any_warp: true
+ view_hpmeter: true
+ }
+},
+{
+ id: 99
+ name: "Admin"
+ level: 99
+ inherit: ( "Support", "Law Enforcement" )
+ commands: {
+ /* not necessary due to all_commands: true */
+ }
+ log_commands: true
+ permissions: {
+ can_trade: true
+ can_trade_bound: false
+ can_party: true
+ all_skill: false
+ all_equipment: false
+ skill_unconditional: false
+ use_check: true
+ use_changemaptype: true
+ all_commands: true
+ hchsys_admin: true
+ }
+}
+)
+
diff --git a/conf/help.txt b/conf/help.txt
new file mode 100644
index 000000000..a65c7de70
--- /dev/null
+++ b/conf/help.txt
@@ -0,0 +1,307 @@
+// This is help file that contains help messages for atcommands/charcommands.
+
+// Format:
+// <command>: "<help message>"
+
+// This file uses libconfig syntax.
+
+help: "Params: <command>\n" "Shows help for specified command."
+noask: "Auto rejects deals/invites."
+me: "Params: <message>\n" "Displays normal text as a message in this format: *name message* (like /me in mIRC)."
+fakename: "Params: <name>\n" "Changes your name to your choice temporarily."
+npctalk: "Params: <NPC name> <message>\n" "Forces a NPC to display a message in normal chat."
+broadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow)."
+kami: "Params: <message>\n" "Broadcasts a message without your name (in yellow)."
+kamib: "Params: <message>\n" "Broadcasts a message without your name (in blue)."
+localbroadcast: "Params: <message>\n" "Broadcasts a message with your name (in yellow) only on your map."
+commands: "Displays a list of commands that you can use."
+rates: "Displays the server's current rates."
+uptime: "Displays how long the server has been online."
+showdelay: "Shows/hides the \"There is a delay after this skill\" message."
+exp: "Displays current levels and % progress."
+mobinfo: "Params: <monster name|ID>\n" "Shows monster info (stats, exp, drops etc)."
+iteminfo: "Params: <item name|ID>\n" "Shows item info (type, price etc)."
+whodrops: "Params: <item name|ID>\n" "Shows who drops an item (monster with highest drop rates)."
+version: "Displays SVN version of the server."
+email: "Params: <current email> <new email>\n" "Changes your account e-mail address."
+where: "Params: <char name>\n" "Tells you the location of a character."
+time: "Shows the date and time of the server."
+showexp: "Displays/hides experience gained."
+showzeny: "Displays/hides Zeny gained."
+mobsearch: "Params: <monster name|ID>\n" "Shows the location of a certain mob on the current map."
+who: "Params: [<name>]\n" "Shows a list of online players and their party and guild."
+who2: "Params: [<name>]\n" "Shows a list of online players and their job."
+who3: "Params: [<name>]\n" "Shows a list of online players and their location."
+whomap: "@whomap/@whomap2/@whomap3 [map] - like @who/@who2/@who3 but only for specified map."
+whogm: "Params: [match_text] - Like @who+@who2+who3, but only for GM."
+guildspy: "Params: <guild name|id> - You will receive all messages of the guild channel (Chat logging must be enabled)"
+partyspy: "@partyspy <party name|id> - You will receive all messages of the party channel (Chat logging must be enabled)"
+mapinfo: "Params: [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat)."
+go: "Params: <city name|number>\n" "Warps you to a city.\n"
+ " -3: (Memo point 2) 14: louyang 31: mora\n"
+ " -2: (Memo point 1) 15: start point 32: dewata\n"
+ " -1: (Memo point 0) 16: prison/jail 33: malangdo island\n"
+ " 0: prontera 17: jawaii 34: malaya port\n"
+ " 1: morocc 18: ayothaya 35: eclage\n"
+ " 2: geffen 19: einbroch\n"
+ " 3: payon 20: lighthalzen\n"
+ " 4: alberta 21: einbech\n"
+ " 5: izlude 22: hugel\n"
+ " 6: aldebaran 23: rachel\n"
+ " 7: xmas (lutie) 24: veins\n"
+ " 8: comodo 25: moscovia\n"
+ " 9: yuno 26: midgard camp\n"
+ " 10: amatsu 27: manuk\n"
+ " 11: gonryun 28: splendide\n"
+ " 12: umbala 29: brasilis\n"
+ " 13: niflheim 30: el dicastes\n"
+jumpto: "Params: <char name>\n" "Warps you to selected character."
+follow: "Params: <char name>\n" "Follow a player."
+mount: "Give/remove you a peco (Class is required, but not skill)"
+disguise: "Params: <monster name|ID>\n" "Change your appearence to other players to a mob."
+undisguise: "Restore your normal appearance."
+disguiseguild: "Disguises all online characters of a guild."
+undisguiseguild: "Restore the normal appearance of all characters of a guild."
+model: "Params: <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence."
+size: "Params: <1-3> Changes your size (1-Smallest 2-Biggest 3-Normal)"
+sizeall: "Changes the size of all players."
+sizeguild: "Changes the size of all online characters of a guild."
+hide: "Makes you character invisible (GM invisibility). Type again to become visible."
+save: "Sets respawn point to current spot."
+load: "Warps you to your save point."
+warp: "Params: <mapname> [<x> <y>]\n" "Warps you to the selected map and position."
+jump: "Params: [<x> [<y>]]\n" "Randomly warps you like a flywing."
+jobchange: "Params: <job name|ID>\n" "Changes your job.\n"
+ "----- Novice / 1st Class -----\n"
+ " 0 Novice 1 Swordman 2 Magician 3 Archer\n"
+ " 4 Acolyte 5 Merchant 6 Thief\n"
+ "----- 2nd Class -----\n"
+ " 7 Knight 8 Priest 9 Wizard 10 Blacksmith\n"
+ " 11 Hunter 12 Assassin 14 Crusader 15 Monk\n"
+ " 16 Sage 17 Rogue 18 Alchemist 19 Bard\n"
+ " 20 Dancer\n"
+ "----- High Novice / High 1st Class -----\n"
+ "4001 Novice High 4002 Swordman High 4003 Magician High 4004 Archer High\n"
+ "4005 Acolyte High 4006 Merchant High 4007 Thief High\n"
+ "----- Transcendent 2nd Class -----\n"
+ "4008 Lord Knight 4009 High Priest 4010 High Wizard 4011 Whitesmith\n"
+ "4012 Sniper 4013 Assassin Cross 4015 Paladin 4016 Champion\n"
+ "4017 Professor 4018 Stalker 4019 Creator 4020 Clown\n"
+ "4021 Gypsy\n"
+ "----- 3rd Class (Regular) -----\n"
+ "4054 Rune Knight 4055 Warlock 4056 Ranger 4057 Arch Bishop\n"
+ "4058 Mechanic 4059 Guillotine Cross 4066 Royal Guard 4067 Sorcerer\n"
+ "4068 Minstrel 4069 Wanderer 4070 Sura 4071 Genetic\n"
+ "4072 Shadow Chaser\n"
+ "----- 3rd Class (Transcendent) -----\n"
+ "4060 Rune Knight 4061 Warlock 4062 Ranger 4063 Arch Bishop\n"
+ "4064 Mechanic 4065 Guillotine Cross 4073 Royal Guard 4074 Sorcerer\n"
+ "4075 Minstrel 4076 Wanderer 4077 Sura 4078 Genetic\n"
+ "4079 Shadow Chaser\n"
+ "----- Expanded Class -----\n"
+ " 23 Super Novice 24 Gunslinger 25 Ninja 4045 Super Baby\n"
+ "4046 Taekwon 4047 Star Gladiator 4049 Soul Linker 4050 Gangsi\n"
+ "4051 Death Knight 4052 Dark Collector 4190 Ex. Super Novice 4191 Ex. Super Baby\n"
+ "4211 Kagerou 4212 Oboro 4215 Rebellion\n"
+ "----- Baby Novice And Baby 1st Class -----\n"
+ "4023 Baby Novice 4024 Baby Swordman 4025 Baby Magician 4026 Baby Archer\n"
+ "4027 Baby Acolyte 4028 Baby Merchant 4029 Baby Thief\n"
+ "---- Baby 2nd Class ----\n"
+ "4030 Baby Knight 4031 Baby Priest 4032 Baby Wizard 4033 Baby Blacksmith\n"
+ "4034 Baby Hunter 4035 Baby Assassin 4037 Baby Crusader 4038 Baby Monk\n"
+ "4039 Baby Sage 4040 Baby Rogue 4041 Baby Alchemist 4042 Baby Bard\n"
+ "4043 Baby Dancer\n"
+ "---- Baby 3rd Class ----\n"
+ "4096 Baby Rune Knight 4097 Baby Warlock 4098 Baby Ranger 4099 Baby Arch Bishop\n"
+ "4100 Baby Mechanic 4101 Baby Glt. Cross 4102 Baby Royal Guard 4103 Baby Sorcerer\n"
+ "4104 Baby Minstrel 4105 Baby Wanderer 4106 Baby Sura 4107 Baby Genetic\n"
+ "4108 Baby Shadow Chaser\n"
+ "---- Modes And Others ----\n"
+ " 22 Wedding 26 Christmas 27 Summer 4048 Star Gladiator (Union)\n"
+option: "Params: <param1> <param2>(stackable) <param3>(stackable)\n" "Adds different visual effects on or around your character.\n"
+" <param1> <param2> <param3>\n"
+"01: Stone 01: Sight 01: Sight 512: Cart Lv. 4\n"
+"02: Frozen 02: Curse 02: Hiding 1024: Cart Lv. 5\n"
+"03: Stun 04: Silence 04: Cloaking 2048: Orc Head\n"
+"04: Sleep 08: Signum 08: Cart Lv. 1 4096: Wedding\n"
+"06: Petrify 16: Blind 16: Falcon 8192: Ruwach\n"
+"07: Burning 32: Angelus 32: Riding 16384: Chasewalk\n"
+"08: Imprison 64: Bleeding 64: Invisible\n"
+"16: (Nothing) 128: D. Poison 128: Cart Lv. 2\n"
+"32: (Nothing) 256: Fear 256: Cart Lv. 3"
+heal: "Params: [<HP> <SP>]\n" "Heals the desired amount of HP and SP. No value specified will do a full heal."
+dye: "Params: <clothes palette no.>\n" "Changes your characters clothes color."
+hairstyle: "Params: <hairstyle no.>\n" "Changes your hair style."
+haircolor: "Params <hair palette no.>\n" "Changes your hair color."
+speed: "Params: <1-1000>\n" "Changes you walking speed. 1 being the fastest and 1000 the slowest. Default is 150."
+effect: "Params: <effect id> [<flag>]\n" "Give an effect to your character."
+dropall: "Throws all your possession on the ground."
+storeall: "Puts all your possessions in storage."
+killable: "Make your character killable."
+memo: "Params: [memo position]\n" "Set/change a memo location (no position: display memo points)."
+spiritball: "Params: <1-100>\n" "Gives you \"spirit spheres\" like from the skill \"Call Spirits\".\n"
+questskill: "Params: <#>\n" "Gives you the specified quest skill\n"
+"Novice = 142: First Aid, 143: Act Dead\n"
+"Archer = 147: Create Arrow, 148: Charge Arrow\n"
+"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
+"Acolyte = 156: Holy Light\n"
+"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
+"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
+"Magician = 157: Energy Coat\n"
+"Hunter = 1009: Phantasmic Arrow\n"
+"Bard = 1010: Pang Voice\n"
+"Dancer = 1011: Wink of Charm\n"
+"Knight = 1001: Charge Attack\n"
+"Crusader = 1002: Shrink\n"
+"Priest = 1014: Redemptio\n"
+"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
+"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
+"Rogue = 1005: Close Confine\n"
+"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
+"Alchemist = 238: Basis of Life\n"
+"Wizard = 1006: Sight Blaster\n"
+"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
+lostskill: "Params: <#>\n" "Takes away the specified quest skill from you\n"
+"Novice = 142: First Aid, 143: Act Dead\n"
+"Archer = 147: Create Arrow, 148: Charge Arrow\n"
+"Swordman = 144: Moving HP Recovery, 145: Attack Weak Point, 146: Auto Berserk\n"
+"Acolyte = 156: Holy Light\n"
+"Thief = 149: Throw Sand, 150: Back Sliding, 151: Take Stone, 152: Throw Stone\n"
+"Merchant = 153: Cart Revolution, 154: Change Cart, 155: Crazy Uproar, 2535: Open Buying Store\n"
+"Magician = 157: Energy Coat\n"
+"Hunter = 1009: Phantasmic Arrow\n"
+"Bard = 1010: Pang Voice\n"
+"Dancer = 1011: Wink of Charm\n"
+"Knight = 1001: Charge Attack\n"
+"Crusader = 1002: Shrink\n"
+"Priest = 1014: Redemptio\n"
+"Monk = 1015: Ki Translation, 1016: Ki Explosio\n"
+"Assassin = 1003: Sonic Acceleration, 1004: Throw Venom Knife\n"
+"Rogue = 1005: Close Confine\n"
+"Blacksmith = 1012: Unfair Trick, 1013: Greed\n"
+"Alchemist = 238: Basis of Life\n"
+"Wizard = 1006: Sight Blaster\n"
+"Sage = 1007: Create Elemental Converter, 1008: Elemental Change (Water), 1017: Elemental Change (Earth), 1018: Elemental Change (Fire), 1019: Elemental Change (Wind)"
+skillid: "Params: <name>\n" "Look up a skill by name"
+useskill: "Params: <skillid> <skillv> <target>\n" "Use a skill on target"
+skilltree: "Params: <skillnum> <charname>\n" "Prints the skill tree needed to get a skill for the target player."
+marry: "Params: <player name>\n" "Marry another player."
+divorce: "Divorce player."
+alive: "Revives yourself from death."
+blvl: "Params: <number of levels>\n" "Raises your base level the desired number of levels."
+jlvl: "Params: <number of levels>\n" "Raises your job level the desired number of levels."
+allskill: "Give you all skills."
+stpoint: "Params: <number of points> - Gives you the desired number of stat points."
+skpoint: "Params: <number of points> - Gives you the desired number of skill points."
+zeny: "Params: <amount> - Gives you desired amount of Zeny."
+cash: "Params: <amount> - Gives you the specified amount of cash points."
+points: "Params: <amount> - Gives you the specified amount of Kafra Points."
+str: "Params: <amount>\n" "Raises STR by given amount."
+agi: "Params: <amount>\n" "Raises AGI by given amount."
+dex: "Params: <amount>\n" "Raises DEX by given amount."
+vit: "Params: <amount>\n" "Raises VIT by given amount."
+int: "Params: <amount>\n" "Raises INT by given amount."
+luk: "Params: <amount>\n" "Raises LUK by given amount."
+allstats: "Params: <value>\n" "Adds value in all stats (maximum if no value)."
+addwarp: "Params: <map name> <x coord> <y coord>\n"
+killmonster2: "Kills all monsters of your map (without drops)."
+monster: "Params: <monster name|ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]\n"
+ "@monster2 <desired_monster_name> <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
+"@spawn/@monster/@summon/@monster2 \"desired monster name\" <monster name|ID> [<number to spawn> [<x coord> [<y coord>]]]\n"
+"@spawn/@monster/@summon/@monster2 <monster name|ID> \"desired monster name\" [<number to spawn> [<x coord> [<y coord>]]]\n"
+" Spawns the desired monster with any desired name."
+monstersmall: "Params: <monster name|ID>\n" "Spawns a smaller version of a monster."
+monsterbig: "Params: <monster name|ID>\n" "Spawns a larger version of a monster."
+killmonster: "Params: <map>\n" "Kill all monsters of the map (they drop)"
+autoloot: "Params: <on|off|#>\n" "Makes items go straight into your inventory."
+autotrade: "Allows you to vend while you are offline."
+changegm: "Params: <charname>\n" "Changes the leader of your guild (You must be guild leader)"
+changeleader: "Params: <charname>\n" "Changes the leader of your party (You must be party leader)"
+request: "Params: <message>\n" "Sends a message to all connected GMs (via the gm whisper system)"
+sound: "Params: <path to file in data folder or GRF file>\n" "Plays a sound from the data folder or GRF file located on the client."
+clone: "Params: <charname>\n" "Spawns a supportive clone of the given player."
+slaveclone: "Params: <charname>\n" "Spawns a supportive clone of the given player that follows the creator around."
+evilclone: "Params: <charname>\n" "Spawns an aggressive clone of the given player."
+changesex: "Changes your gender."
+duel: "Starts a duel."
+invite: "Invites a player to a duel."
+accept: "Accepts an invitation to a duel."
+reject: "Rejects an invitation to a duel."
+leave: "Leaves a duel."
+mail: "Open mail box."
+storage: "Opens storage."
+itemreset: "Remove all your items."
+guildstorage: "Opens guild storage."
+idsearch: "Params: <part_of_item_name>\n" "Search all items that name have part_of_item_name"
+refine: "Params: <equip position> <+/- amount>"
+produce: "Params: <equip name or equip ID> <element> <# of very's>\n"
+" Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind\n"
+" You can add up to 3 Star Crumbs and 1 element\n"
+repairall: "Repair all items of your inventory"
+item: "Params: <item name or ID> <quantity>\n" "Gives you the desired item."
+item2: "Params: <item name or ID> <quantity> <identified_flag> <refine> <broken_flag> <Card1> <Card2> <Card3> <Card4>\n" "Gives you the desired item."
+pvpon: "Turns pvp on on the current map"
+pvpoff: "Turns pvp off on the current map"
+gvgon: "Turns gvg on on the current map"
+gvgoff: "Turns gvg off on the current map"
+agitstart: "Starts War of Emperium"
+agitend: "End War of Emperium"
+party: "Params: <party_name>\n" "Create a party."
+guild: "Params: <guild_name>\n" "Create a guild."
+glvl: "Params: <# of levels>\n" "Raise Guild by desired number of levels"
+guildrecall: "Params: <guild name|ID>\n" "Warps all online characters of a guild to you."
+partyrecall: "Params: <party name|ID>\n" "Warps all online characters of a party to you."
+petrename: "Re-enable pet rename"
+pettalk: "Params: <message>\n" "Makes your pet say a message."
+petfriendly: "Params: <#>\n" "Set pet friendly amount (0-1000) 1000 = Max"
+pethungry: "Params: <#>\n" "Set pet hungry amount (0-100) 100 = Max"
+hatch: "Create a pet from your inventory eggs list."
+makeegg: "Params: <pet_id>\n" "Gives pet egg for monster number in pet DB"
+kick: "Params: <char name>\n" "Kicks specified character off the server"
+unjail: "Params: <char name>\n" "Discharges specified character/prisoner"
+kill: "Params: <char name>\n" "Kills player."
+recall: "Params: <char name>\n" "Warps target character to you."
+raise: "Params: <char name>\n" "Revives target character."
+block: "Params: <char name>\n" "Permanently blocks an account."
+unblock: "Params: <char name>\n" "Unblocks an account."
+ban: "Params: <time> <name>\n" "Temporarily ban an account.\n"
+ " time usage: adjustment (+/- value) and element (y/a, m, d/j, h, mn, s)\n"
+ " Example: @ban +1m-2mn1s-6y testplayer\n"
+unban: "Params: <name> - Unban a account"
+jail: "Params: <char name> - Sends specified character in jails"
+trade: "Params: <char name> - Open a trade window with a another player"
+recallall: "Warps every character online to you."
+doom: "Kills all NON GM chars on the server."
+doommap: "Kills all non GM characters on the map."
+raisemap: "Resurrects all characters on the map."
+night: "Enables night mode on all maps, all characters are affected."
+day: "Disables night mode and restores regular lighting, all characters are affected."
+skillon: "turn skills on for a map"
+skilloff: "turn skills on for a map"
+snow: "Makes all maps to have the snow weather effect."
+clouds: "Makes all maps to have the cloudy weather effect."
+clouds2: "Makes all maps to have another cloudy weather effect."
+fog: "Makes all maps to have the fog weather effect."
+fireworks: "Makes all maps to have the fireworks weather effect."
+sakura: "Makes all maps to have the sakura weather effect."
+leaves: "Makes all maps to have the leaves weather effect."
+shownpc: "Params: <NPC name>\n" "Enable a NPC"
+hidenpc: "Params: <NPC name>\n" "Disable a NPC"
+loadnpc: "Params: <path to script>\n" "Load the specified script file path."
+unloadnpc: "Params: <NPC name>\n" "Unload the specified NPC according to name."
+adjgroup: "Params: <level> <char name> - Do a temporary adjustment of the GM level of a player"
+kickall: "Kick all characters off the server"
+mapexit: "Kick all players and shut down map-server."
+reloaditemdb: "Reload item database."
+reloadmobdb: "Reload monster database."
+reloadquestdb: "Reload quest database."
+reloadskilldb: "Reload skills definition database."
+reloadscript: "Reload all scripts."
+gat: "For debugging (you inspect around gat)"
+send: "For debugging (packet variety)"
+nuke: "Params: <char name>\n" "Blow somebody up, including those surrounding them."
+autoloottype: "Manage a list of autolooting item types.\n"
+" To add an item type to the list, use \"@autoloottype +<type name>\".\n"
+" To remove an item type, use \"@autoloottype -<type name>\".\n"
+" Type List: healing, usable, etc, weapon, armor, card, petegg, petarmor, ammo.\n"
+" \"@autoloottype reset\" will clear your autoloottype list."
diff --git a/conf/help.txt.example b/conf/help.txt.example
deleted file mode 100644
index c12b1a894..000000000
--- a/conf/help.txt.example
+++ /dev/null
@@ -1,193 +0,0 @@
-// put at first, the minimum level to display the line
- 0:To use one command, type it inside the message window where you usually type to chat.
- 0:@help - display this help.
- 0:@email <actual@email> <new@email> - to change your e-mail (characters protection)
- 80:
- 80:@setmagic
- 80:@magicinfo
- 0:
- 0:--- INFORMATION CMD ---
- 0:@servertime - Display the date/time of the server
- 99:@ignorelist - Displays your ignore list
- 40:@where [char name] - Tells you the location of a character
- 40:@who/@whois [match_text] - Display a listing of who is online and where
- 40:@whogroup [match_text] - Display a listing of who is online and their party/guild
- 40:@whomap/@whomapgroup [map] - like @who/@who2/@who3 but only for specifical map
- 40:@whogm [match_text] - Like @who+@who2+who3, but only for GM.
- 60:@charstatsall - Displays stats of all characters.
- 60:@charitemlist <char name> - Displays all items of a player.
- 60:@charstoragelist <char name> - Displays all items of a player's storage.
- 60:@charcartlist <char name> - Displays all items of a player's cart.
- 60:@ipcheck <char name> - Display all characters online from a characters IP address
- 99:@mapinfo [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
- 99:
- 99:@guildspy <guild_name/id> - You will receive all messages of the guild channel
- 99:@partyspy <party_name/id> - You will receive all messages of the party channel
- 60:
- 60:--- MESSAGE CMD ---
- 60:@broadcast <message> - Broadcasts a GM message with name of the GM
- 60:@kami/@kamib <message> - Broadcasts a GM message without name of the GM
- 60:@localbroadcast <message> - Broadcasts a GM message with name of the GM
- 40:
- 40:--- CHANGE GM STATE CMD ---
- 40:@die ---- suicide
- 40:@hide - Makes you invisible to monsters and other reporting functions. Type @hide again become visible.
- 60:@invisible - Makes your character invisible (complete)
- 60:@visible - Makes your character visible (opposite of @invisible)
- 40:@save - Sets respawn point to current spot
- 40:@return - Warps you to your save point
- 40:@warp <mapname> <x> <y> - Warps you to the selected position
- 40:@jump [x [y]]- Randomly warps you like a flywing.
- 40:@goto <char name> - Warps you to selected character
- 40:@follow <char_name> - follow a player
- 40:@go <number/city_name> - Warps you to a city.
- 40: -3: (Memo point 2) 1: morocc 5: izlude 9: yuno 13: niflheim
- 40: -2: (Memo point 1) 2: geffen 6: aldebaran 10: amatsu 14: louyang
- 40: -1: (Memo point 0) 3: payon 7: xmas (lutie) 11: gonryun 15: start point
- 40: 0: prontera 4: alberta 8: comodo 12: umbala 16: prison/jail
- 60:@hugo - iterate over players forward
- 60:@linus - iterator over players backwards
- 40:
- 40:@log/@l - Send text to the GM log
- 40:@tee/@t - Send text to the GM log and local chat
- 40:
- 60:@alive - Revives yourself from death
- 40:@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
- 40:
- 60:@blvl <number of levels> - Raises your base level the desired number of levels. The max is 255 (User Defined).
- 60:@jlvl <number of levels> -Raises your job level the desired number of levels. The max is 50 For Basic Classes. For Super Novice and Advanced Classes it is 70.
- 60:@allskills - Give you all skills.
- 80:@option <param1> <param2> <param3> - Adds different visual effects on or around your character
- 80: <param1> <param2> <p3>(stackable) <param3> <param3>
- 80: 1 Petrified (stackable) 01 Sight 32 Peco Peco riding 2048 Orc Head
- 80: 2 Frozen 01 Poison 02 Hide 64 GM Perfect Hide 4096 Wedding Sprites
- 80: 3 Stunned 02 Cursed 04 Cloak 128 Level 2 Cart 8192 Ruwach
- 80: 4 Sleeping 04 Silenced 08 Level 1 Cart 256 Level 3 Cart
- 80: 6 darkness 08 ??? 16 Falcon 512 Level 4 Cart
- 80: 16 darkness 1024 Level 5 Cart
- 99:@mountpeco - Give/remove you a peco (Class is required, but not skill)
- 99:@disguise <monster_name_or_monster_ID> - Change your appearence to other players to a mob.
- 99:@undisguise - Restore your normal appearance.
- 99:@model <hair ID: 0-17> <hair color: 0-8> <clothes color: 0-4> - Changes your characters appearence.
- 40:@dye/@ccolor <clothes color: 0-4> - Changes your characters appearence (only clothes color).
- 40:@hairstyle <hair ID: 0-17> - Changes your characters appearence (only hair style).
- 40:@haircolor <hair color: 0-8> - Changes your characters appearence (only hair color).
- 40:@speed <1-1000> - Changes you walking speed. 1 being the fastest and 1000 the slowest. Default 150.
- 99:@effect <effect_id> [flag] - Give an efect to your character.
- 60:@dropall - throws all your possession on the ground
- 60:@storeall - puts all your possessions in storage
- 60:@killable - make your character killable
- 60:@stpoint <number of points> - Gives you the desired number of stat points.
- 60:@skpoint <number of points> - Gives you the desired number of skill points.
- 80:@zeny <amount> - Gives you desired amount of Zeny.
- 60:@str,@agi,@vit,@int,@dex,@luk <amount> - Adds desired amount to any stat. For example "@str 10" raises your str by 10
- 60:@allstats [value] - Adds value in all stats (maximum if no value).
- 99:@memo [memo_position] - set/change a memo location (no position: display memo points).
- 99:@questskill <#> - Gives you the specified quest skill
- 80:@lostskill <#> - Takes away the specified quest skill from you
- 60:@skillid <name> - look up a skill by name
- 60:@useskill <skillid> <skillv> <target> - use a skill on target
- 80:@addwarp <map name> <x coord> <y coord>
- 60:
- 60:--- MONSTERS CMD ---
- 60:@spawn <monster_name_or_monster_ID> [<number to spawn> [<x coord> [<y coord>]]]
- 60:@summon <monster_name_or_monster_ID> [<number to spawn> [<desired_monster_name> [<x coord> [<y coord>]]]]
- 60:@killmonster [map] - kill all monsters of the map (they drop)
- 60:@killmonster2 - kill all monsters of your map (without drops)
- 40:
- 40:--- ITEMS CMD ---
- 40:@storage - Opens storage
- 99:@gstorage - Opens guild storage
- 80:@item <item name or ID> <quantity> - Gives you the desired item.
- 40:@itemreset - Remove all your items.
- 80:@itemcheck - Check your items with authorised items.
- 80:@idsearch <part_of_item_name> - Search all items that name have part_of_item_name
- 60:@produce <equip name or equip ID> <element> <# of very's>
- 60: Element: 0=None 1=Ice 2=Earth 3=Fire 4=Wind
- 60: It has separately with fragment 3 of the attribute + stars, you can apply.
- 60:
- 60:--- PVP CMD ---
- 60:@pvpon - Turns pvp on on the current map
- 60:@pvpoff - Turns pvp off on the current map
- 99:@gvgon/@gpvpon - Turns gvg on on the current map
- 99:@gvgoff/@gpvpoff - Turns gvg off on the current map
- 99:@agitstart - Starts War of Emperium
- 99:@agitend - End War of Emperium
- 99:
- 99:--- GROUPS CMD ---
- 99:@party <party_name> - Create a party.
- 99:@guild <guild_name> - Create a guild.
- 99:@guildlvl <# of levels> - Raise Guild by desired number of levels
- 99:@guildrecall <guild_name/id> - Warps all online characters of a guild to you.
- 99:@partyrecall <party_name/id> - Warps all online characters of a party to you.
- 40:
- 40:--- REMOTE CHAR CMD ---
- 60:@kill <char name> - Kills specified character.
- 60:@charkillable <char name> - make another character killable
- 60:@chardropall <char name> - throws all a chars possession on the ground
- 60:@charstoreall <char name> - puts all of anothers charactes possessions in storage
- 60:@recall <char name> - Warps target character to you.
- 80:@recallall - Warps every character online to you.
- 60:@charwarp <mapname> <x> <y> <char name> - Warps character to location of choice
- 60:@revive <char name> - Revives target character.
- 40:@charstats <char name> - Displays a characters stats.
- 99:@charignorelist <char name> - Displays ignore list of the player
- 60:@inall <char name> - Allows all wispers for the player
- 60:@exall <char name> - Blocks all wispers for the player
- 80:@charoption <param1> <param2> <param3> <charname> - Like @option command but only to target character.
- 99:@charmountpeco <charname> - Give/remove to a player a peco (Class is required, but not skill).
- 60:@charsave <map> <x> <y> <charname> - Changes the target players respawn point.
- 60:@charblvl <#> <nickname> - Change a characters base level.
- 60:@charjlvl <#> <nickname> - Change a characters job level.
- 80:@charzeny <amount> <name> - Give/take a players Zeny
- 60:@charstpoint <amount> <name> - Give/take a players stat points
- 60:@charskpoint <amount> <name> - give/take a players skill points
- 60:@charskreset <charname> - Reset skills of a character.
- 60:@charstreset <charname> - Reset stats of a character.
- 60:@charreset <charname> - Reset stats AND skills of a character.
- 99:@charquestskill <#> <charname> - Gives to a player the specified quest skill.
- 99:@charlostskill <#> <charname> - Takes away the specified quest skill from the player.
- 60:@chardelitem <item_name_or_ID> <quantity> <player> - Remove items from a character
- 99:@charmodel <hair type> <hair color> <clothes color> <name> - Changes a player's model
- 99:@chardisguise <monster_name_or_monster_ID> <char name> - Changes disguise of a player
- 99:@charundisguise <char name> - Cancels disguise of a player
- 60:@charchangesex <name> - Changes sex of a player (all characters of the account)
- 60:@block <name> - Blocks definitively a account
- 60:@unblock <name> - Unblocks a account
- 60:@ban <time> <name> - Ban temporarily a account
- 60: time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
- 60: Example: @ban +1m-2mn1s-6y testplayer
- 60:@unban <name> - Unban a account
- 60:@jail <char_name> - Sends specified character in jails
- 60:@unjail <char_name> - Discharges specified character/prisoner
- 60:@trade <char_name> - Open a trade window with a another player
- 40:@kick <charname> - Kicks specified character off the server
- 99:@kickall - Kick all characters off the server
- 99:@mapexit - Kick all players and shut down map-server.
- 80:@doom - Kills all NON GM chars on the server.
- 80:@doommap - Kills all non GM characters on the map.
- 80:@raise - Resurrects all characters on the server.
- 80:@raisemap - Resurrects all characters on the map.
- 80:
- 80:--- ENVIRONMENT CMD ---
- 80:@night - Uses @option 00 16 00 on all characters. All characters are in darkness.
- 80:@day - Uses @option 00 00 00 on all characters.
- 80:@skillon - turn skills on for a map
- 80:@skilloff - turn skills on for a map
- 80:
- 80:--- ADMIN CMD ---
- 99:@reloaditemdb - Reload item database (admin command)
- 99:@reloadmobdb - Reload monster database (admin command)
- 99:@reloadskilldb - Reload skills definition database (admin command)
- 99:@reloadscript - Reload all scripts (admin command)
- 99:@reloadgmdb - Reload GM levels (admin command)
- 99:@adjgmlvl - Do a temporary adjustment of the GM level of a player (admin command)
- 99:@adjcmdlvl - Do a temporary adjustment of the GM level of a command (admin command)
- 80:@enablenpc <NPC_name> - Enable a NPC (admin command)
- 80:@disablenpc <NPC_name> - Disable a NPC (admin command)
- 80:@npcmove
- 80:
- 99:@gat - For debugging (you inspect around gat)
- 99:@packet - For debugging (packet variety)
- 99:
-100:@GM <password> - it becomes GM!
diff --git a/conf/import-tmpl/battle_conf.txt b/conf/import-tmpl/battle_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/battle_conf.txt
diff --git a/conf/import-tmpl/char_conf.txt b/conf/import-tmpl/char_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/char_conf.txt
diff --git a/conf/import-tmpl/inter_conf.txt b/conf/import-tmpl/inter_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/inter_conf.txt
diff --git a/conf/import-tmpl/log_conf.txt b/conf/import-tmpl/log_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/log_conf.txt
diff --git a/conf/import-tmpl/login_conf.txt b/conf/import-tmpl/login_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/login_conf.txt
diff --git a/conf/import-tmpl/map_conf.txt b/conf/import-tmpl/map_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/map_conf.txt
diff --git a/conf/import-tmpl/msg_conf.txt b/conf/import-tmpl/msg_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/msg_conf.txt
diff --git a/conf/import-tmpl/packet_conf.txt b/conf/import-tmpl/packet_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/packet_conf.txt
diff --git a/conf/import-tmpl/script_conf.txt b/conf/import-tmpl/script_conf.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/conf/import-tmpl/script_conf.txt
diff --git a/conf/inter-server.conf b/conf/inter-server.conf
new file mode 100644
index 000000000..184285cfd
--- /dev/null
+++ b/conf/inter-server.conf
@@ -0,0 +1,152 @@
+// Hercules InterServer (settings shared/used by more than 1 server) configuration.
+
+// Options for both versions
+
+// Log Inter Connections, etc.?
+log_inter: 1
+
+// Inter Log Filename
+inter_log_filename: log/inter.log
+
+// Level range for sharing within a party
+party_share_level: 15
+
+// SQL version options only
+
+// You can specify the codepage to use in your mySQL tables here.
+// (Note that this feature requires MySQL 4.1+)
+//default_codepage:
+
+
+// For IPs, ideally under linux, you want to use localhost instead of 127.0.0.1
+// Under windows, you want to use 127.0.0.1. If you see a message like
+// "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"
+// and you have localhost, switch it to 127.0.0.1
+
+// Global SQL settings
+// overridden by local settings when the hostname is defined there
+// (currently only the login-server reads/obeys these settings)
+sql.db_hostname: 127.0.0.1
+sql.db_port: 3306
+sql.db_username: ragnarok
+sql.db_password: ragnarok
+sql.db_database: ragnarok
+sql.codepage:
+
+// MySQL Character SQL server
+char_server_ip: 127.0.0.1
+char_server_port: 3306
+char_server_id: ragnarok
+char_server_pw: ragnarok
+char_server_db: ragnarok
+
+// MySQL Map SQL Server
+map_server_ip: 127.0.0.1
+map_server_port: 3306
+map_server_id: ragnarok
+map_server_pw: ragnarok
+map_server_db: ragnarok
+
+// MySQL Log SQL Database
+log_db_ip: 127.0.0.1
+log_db_port: 3306
+log_db_id: ragnarok
+log_db_pw: ragnarok
+log_db_db: ragnarok
+log_codepage:
+log_login_db: loginlog
+
+// == MySQL Reconnect Settings
+// ===========================
+// - mysql_reconnect_type
+// - 1: when mysql disconnects during runtime, the server tries to reconnect mysql_reconnect_count times and,
+// -- if unsuccessful, the server is shut down
+// - 2: when mysql disconnects during runtime it tries to reconnect indefinitely
+mysql_reconnect_type:2
+// - mysql_reconnect_count
+// - number of reconnect attempts the server should do when the database disconnects during runtime
+// - only used when mysql_reconnect_type is 1
+mysql_reconnect_count:1
+
+// DO NOT CHANGE ANYTHING BEYOND THIS LINE UNLESS YOU KNOW YOUR DATABASE DAMN WELL
+// this is meant for people who KNOW their stuff, and for some reason want to change their
+// database layout. [CLOWNISIUS]
+
+// ALL MySQL Database Table names
+
+//Shared
+interreg_db: interreg
+global_acc_reg_num_db: global_acc_reg_num_db
+global_acc_reg_str_db: global_acc_reg_str_db
+
+// Char Database Tables
+char_db: char
+hotkey_db: hotkey
+scdata_db: sc_data
+cart_db: cart_inventory
+inventory_db: inventory
+charlog_db: charlog
+storage_db: storage
+skill_db: skill
+interlog_db: interlog
+memo_db: memo
+guild_db: guild
+guild_alliance_db: guild_alliance
+guild_castle_db: guild_castle
+guild_expulsion_db: guild_expulsion
+guild_member_db: guild_member
+guild_skill_db: guild_skill
+guild_position_db: guild_position
+guild_storage_db: guild_storage
+party_db: party
+pet_db: pet
+friend_db: friends
+mail_db: mail
+auction_db: auction
+quest_db: quest
+homunculus_db: homunculus
+skill_homunculus_db: skill_homunculus
+mercenary_db: mercenary
+mercenary_owner_db: mercenary_owner
+ragsrvinfo_db: ragsrvinfo
+elemental_db: elemental
+account_data_db: account_data
+acc_reg_num_db: acc_reg_num_db
+acc_reg_str_db: acc_reg_str_db
+char_reg_str_db: char_reg_str_db
+char_reg_num_db: char_reg_num_db
+
+// Map Database Tables
+item_db_db: item_db
+item_db_re_db: item_db_re
+item_db2_db: item_db2
+mob_db_db: mob_db
+mob_db2_db: mob_db2
+mob_skill_db_db: mob_skill_db
+mob_skill_db2_db: mob_skill_db2
+mapreg_db: mapreg
+autotrade_merchants_db: autotrade_merchants
+autotrade_data_db: autotrade_data
+npc_market_data_db: npc_market_data
+
+// == SQL item, mob, mob skill databases
+// =====================================
+// Note: the following databases may get out of date at times, or not be
+// thoroughly tested (if at all, since they're auto-generated). As such it is
+// not advisable to rely on them other than for informative reasons (Control
+// Panels, websites, etc.)
+// Unless you know what you're doing, please consider using their txt version.
+// Note2: It is perfectly legit (and recommended) to use txt databases in
+// Hercules, while still loading the SQL tables we provide to be used
+// exclusively by your Control Panel or Website.
+
+// Use SQL for item_db? (not recommended)
+use_sql_item_db: no
+
+// Use SQL for mob_db? (not recommended)
+use_sql_mob_db: no
+
+// Use SQL for mob_skill_db? (not recommended)
+use_sql_mob_skill_db: no
+
+import: conf/import/inter_conf.txt
diff --git a/conf/inter_athena.conf b/conf/inter_athena.conf
deleted file mode 100644
index 72a88bd96..000000000
--- a/conf/inter_athena.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-// Athena InterServer configuration.
-
-// Storage flatfile database, used for Karfa storage.
-storage_txt: save/storage.txt
-
-// Party flatfile database, for party names, members and other party info.
-party_txt: save/party.txt
-
-// Guild flatfile database, for guild names, members, and other guild info.
-guild_txt: save/guild.txt
-
-// Pet flatfile database, for pet names, and other pet info.
-pet_txt: save/pet.txt
-
-// Castle flatfile database, for emperium war castles, etc.
-castle_txt: save/castle.txt
-
-// Inter Log Filename
-inter_log_filename: log/inter.log
-
-// Level range for sharing within a party
-party_share_level: 10
-
-// The lowest GM level on your server
-lowest_gm_level: 1
-
-// How often the GM accounts will be reloaded by the map-server in minutes
-read_gm_interval: 10
-
-
-
diff --git a/conf/ladmin_athena.conf b/conf/ladmin_athena.conf
deleted file mode 100644
index 2a91a35b6..000000000
--- a/conf/ladmin_athena.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-// Athena Ladmin configuration file.
-
-// Encoding type of the password
-// 0: not encoded
-// 1: key+password
-// 2: password+key
-passenc: 2
-
-// Language of ladmin
-// F: Fran軋is
-// E: English (default)
-defaultlanguage: E
-
-// Log Filename. All operations done by the software are logged in this file.
-ladmin_log_filename: log/ladmin.log
-
-// Indicate how to display date in logs, to players, etc.
-// 0: 31-12-2004 23:59:59
-// 1: 12-31-2004 23:59:59
-// 2: 2004-31-12 23:59:59
-// 3: 2004-12-31 23:59:59 (default)
-date_format: 3
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
-
-// local settings for this server in this file
-import: conf/ladmin_local.conf
diff --git a/conf/ladmin_local.conf.example b/conf/ladmin_local.conf.example
deleted file mode 100644
index b3f88e8df..000000000
--- a/conf/ladmin_local.conf.example
+++ /dev/null
@@ -1,10 +0,0 @@
-// Athena Ladmin local configuration file.
-
-// Login Server IP
-login_ip:217.172.177.27
-// Login Server Port
-login_port: 6900
-
-// Administrative password, used to connect remotely to server.
-// NOTICE: If you enable remote administration, you should change its value for security
-admin_pass: admin
diff --git a/conf/lan_support.conf b/conf/lan_support.conf
deleted file mode 100644
index bfaec6966..000000000
--- a/conf/lan_support.conf
+++ /dev/null
@@ -1,41 +0,0 @@
-// Athena TXT version LAN configure file.
-// Support Client Connect to Local Area Network (LAN) IP Address Server.
-// put this fle into conf/ directory
-//
-// HOWTO:
-// To use this file, the login-server, char-server and map-server must be on the same subnetwork
-// (not necessary on the same computer). You can not use eAthena if you want to install the servers on 2 or more different LAN.
-//
-// First of all: you must configure your router to forward your WAN IP (one or more) and port (default: 6900, 6121 and 5121)
-// to the right concerned computer(s) (if default port, forward 6900 port to the (LAN IP) login-server, 6121 port to the (LAN IP) char-server, etc.).
-// After, set in char_athena.conf and map_athena.conf files the WAN IP and the right ports that you use.
-// Give to WAN people (client that are not on your LAN) your WAN IP to have an access to your server.
-// At this point, all players outside your LAN can access to your server(s).
-//
-// Now, you must parameter your LAN for the servers.
-// Set the LAN IP of the char-server and the map-server in this file (lan_char_ip and lan_map_ip).
-// Set the definition of your LAN in this file (subnet and subnetmask).
-// When you load/start login-server and char-server, read what the server displays, and specially the section ---LAN CONFIGURATION---.
-// If you see a warning or something not good, correct it.
-// Now LAN client can access to your server.
-//
-// NB: if you want that nobody of your LAN can access to your server, put 127.0.0.1 in IP and 255.255.255.255 for the mask.
-// So only the localhost computer would access to your server.
-// NB2: you can use LAN name if you have some instead of IP and/or mask.
-// NB3: if you want set your server only for LAN people, set your LAN IP instead of the WAN IP, and set 127.0.0.1/255.255.255.255 for the LAN IP.
-//
-// HOW THAT WORKS:
-// When someone tries to connect to your server(s), the login-server/char-server checks its IP with the LAN subnet (subnet and subnetmask parameters).
-// If it matches, the login-server sends the LAN IP of the char-server (lan_char_ip); and char-server do same for map-server (lan_map_ip).
-// If not, the login-server sends the WAN IP of the char-server that it have received (char_ip in char_athena.conf)
-// and the char-server sends the WAN IP of the map-server that it have received (map_ip in map_athena.conf)
-
-// put here the LAN IP of your char-server
-lan_char_ip: 127.0.0.1
-
-// put here the LAN IP of your map-server
-lan_map_ip: 127.0.0.1
-
-// put here the Subnet mask of your LAN
-subnet: 127.0.0.1
-subnetmask: 255.255.255.255
diff --git a/conf/login-server.conf b/conf/login-server.conf
new file mode 100644
index 000000000..06e0eb18b
--- /dev/null
+++ b/conf/login-server.conf
@@ -0,0 +1,156 @@
+// Hercules Login Server configuration file.
+// Translated by Peter Kieser <pfak@telus.net>
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+// The login server listens on the interface with this IP address.
+// NOTE: This allows you to run multiple servers on multiple interfaces
+// while using the same ports for each server.
+//bind_ip: 127.0.0.1
+
+// Login Server Port
+login_port: 6900
+
+//Time-stamp format which will be printed before all messages.
+//Can at most be 20 characters long.
+//Common formats:
+// %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
+// %H:%M:%S (hour:minute:second, 24 hour format)
+// %d/%b/%Y (day/Month/year)
+//For full format information, consult the strftime() manual.
+//timestamp_format: [%d/%b %H:%M]
+
+//If redirected output contains escape sequences (color codes)
+stdout_with_ansisequence: no
+
+//Makes server output more silent by omitting certain types of messages:
+//1: Hide Information messages
+//2: Hide Status messages
+//4: Hide Notice Messages
+//8: Hide Warning Messages
+//16: Hide Error and SQL Error messages.
+//32: Hide Debug Messages
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+// Can you use _M/_F to make new accounts on the server?
+new_account: yes
+
+//If new_account is enabled, minimum length to userid and passwords should be 4?
+//Must be 'Yes' unless your client uses both 'Disable 4 LetterUserID/Password' Diffs
+new_acc_length_limit: yes
+
+// Account registration flood protection system
+// allowed_regs is the number of registrations allowed in time_allowed (in seconds)
+allowed_regs: 1
+time_allowed: 10
+
+// To log the login server?
+// NOTE: The login-sql server needs the login logs to enable dynamic pass failure bans.
+log_login: yes
+
+// Indicate how to display date in logs, to players, etc.
+date_format: %Y-%m-%d %H:%M:%S
+
+// Required account group id to connect to server.
+// -1: disabled
+// 0 or more: group id
+group_id_to_connect: -1
+
+// Minimum account group id required to connect to server.
+// Will not function if group_id_to_connect config is enabled.
+// -1: disabled
+// 0 or more: group id
+min_group_id_to_connect: -1
+
+// Starting additional sec from now for the limited time at creation of account
+// -1: new account are created with UNlimited time (default value)
+// 0 or more: new accounts was created by addition of the value (in sec) to the actual time (to set first limited time)
+start_limited_time: -1
+
+// Check The clientversion set in the clientinfo ?
+check_client_version: no
+
+// What version we would allow to connect? (if the options above is enabled..)
+client_version_to_connect: 20
+
+// Store passwords as MD5 hashes instead of plaintext ?
+// NOTE: Will not work with clients that use <passwordencrypt>
+use_MD5_passwords: no
+
+// Ipban features (SQL only)
+ipban.enable: yes
+//ipban.sql.db_hostname: 127.0.0.1
+//ipban.sql.db_port: 3306
+//ipban.sql.db_username: ragnarok
+//ipban.sql.db_password: ragnarok
+//ipban.sql.db_database: ragnarok
+//ipban.sql.codepage:
+//ipban.sql.ipban_table: ipbanlist
+// Dynamic password failure ipban system
+ipban.dynamic_pass_failure_ban: yes
+ipban.dynamic_pass_failure_ban_interval: 5
+ipban.dynamic_pass_failure_ban_limit: 7
+ipban.dynamic_pass_failure_ban_duration: 5
+
+// Interval (in seconds) to clean up expired IP bans. 0 = disabled. default = 60.
+// NOTE: Even if this is disabled, expired IP bans will be cleaned up on login server start/stop.
+// Players will still be able to login if an ipban entry exists but the expiration time has already passed.
+ipban_cleanup_interval: 60
+
+// Interval (in minutes) to execute a DNS/IP update. Disabled by default.
+// Enable it if your server uses a dynamic IP which changes with time.
+//ip_sync_interval: 10
+
+// DNS Blacklist Blocking
+// If enabled, each incoming connection will be tested against the blacklists
+// on the specified dnsbl_servers (comma-separated list)
+use_dnsbl: no
+dnsbl_servers: bl.blocklist.de, socks.dnsbl.sorbs.net
+// Here are some free DNS Blacklist Services: http://en.wikipedia.org/wiki/Comparison_of_DNS_blacklists
+//==============================================================================
+// dnsbl_servers Description
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// bl.blocklist.de IP-Addresses who attack other servers/honeypots over SSH, FTP, IMAP, etc.
+// ircbl.ahbl.org AHBL (open proxies, compromised machines, comment spammers)
+// safe.dnsbl.sorbs.net All zones in dnsbl.sorbs.net except "recent" and "escalations"
+// sbl-xbl.spamhaus.org Spamhaus blacklist (spammers, open proxies)
+// socks.dnsbl.sorbs.net Open SOCKS proxy servers
+// tor.ahbl.org Current tor relay and exit nodes
+
+
+// Account data storage configuration
+// SQL
+//account.sql.db_hostname: 127.0.0.1
+//account.sql.db_port: 3306
+//account.sql.db_username: ragnarok
+//account.sql.db_password: ragnarok
+//account.sql.db_database: ragnarok
+//account.sql.codepage:
+//account.sql.case_sensitive: no
+//account.sql.account_db: login
+//account.sql.accreg_db: global_reg_value
+
+// Client MD5 hash check
+// If turned on, the login server will check if the client's hash matches
+// the value below, and will not connect tampered clients.
+// Note: see doc/md5_hashcheck.txt for more details.
+client_hash_check: off
+
+// Client MD5 hashes
+// The client with the specified hash can be used to log in by players with
+// a group_id equal to or greater than the given value.
+// If you specify 'disabled' as hash, players with a group_id greater than or
+// equal to the given value will be able to log in regardless of hash (and even
+// if their client does not send a hash at all.)
+// Format: group_id, hash
+// Note: see doc/md5_hashcheck.txt for more details.
+//client_hash: 0, 113e195e6c051bb1cfb12a644bb084c5
+//client_hash: 10, cb1ea78023d337c38e8ba5124e2338ae
+//client_hash: 99, disabled
+
+
+import: conf/inter-server.conf
+import: conf/import/login_conf.txt
diff --git a/conf/login_athena.conf b/conf/login_athena.conf
deleted file mode 100644
index 9a486cdd6..000000000
--- a/conf/login_athena.conf
+++ /dev/null
@@ -1,130 +0,0 @@
-// Athena Login Server configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-// Level of new GM created with @gm command. (default: 60)
-// If you set to 0, you disable creation of new GM with @gm.
-// To be able to create a gm with @gm, you must:
-// - give a level to this value (not 0)
-// - enable to level 0 the @gm command (atcommand_athena.conf) (default 100)
-// - enable gm commands to normal player (battle_athena.conf, atcommand_gm_only parameter)
-// - and normal player must give correct password when he use the @gm command
-level_new_gm: 60
-
-// Can you make new accounts on the server? (1 for Yes, 0 for no)
-new_account: 1
-
-// Manage possible letters/symbol in account name. Control character (0x00-0x1f) are never accepted. Possible values are:
-// 0: no restriction (default)
-// 1: only letters/symbols in 'account_name_letters' option.
-// 2: Letters/symbols in 'account_name_letters' option are forbidden. All others are possibles.
-account_name_option: 1
-
-// Set the letters/symbols that you want use with the 'account_name_option' option.
-// Note: add 'space' between 2 others letters/symbols.
-// default: void.
-// account_name_letters: [ ] { } , . | - # @ ! ~ ` ; : " " ? / \ = + < >
-account_name_letters: abcdefghijklmnoprstquvwxyzABCDEFGHIJKLMNOPRSTQUVWXYZ1234567890- _+=!'
-
-
-// Account flatfile database, stores account information.
-account_filename: save/account.txt
-
-// What account AIDs have GM privs, and what level?
-gm_account_filename: conf/gm_account.txt
-
-// Timer to check if GM_account file has been changed and reload GM account automaticaly
-// (in seconds; default: 15; value: 0 (disabled), or 2 or more)
-gm_account_filename_check_timer: 15
-
-// Log Filename. All operations received by the server are logged in this file.
-login_log_filename: log/login.log
-
-// Name of the file of that logs the unknown packets (for debug or hack check)
-login_log_unknown_packets_filename: log/login_unknown_packets.log
-
-// Indicate if the unknown packets are saved or not
-//(the unknown packets coming from the char-server or ladministration does not relate to, which is always saved)
-// Be careful: if you receive an attack, your hard disk can cause lag...
-// So, active this option with a speed hard disk or for debug only.
-save_unknown_packets: 0
-
-// Indicate if you want display the parse of the packets received in a normal connection
-// It's useful for debug. Possible values: 0: no (default), 1: yes
-display_parse_login: 0
-
-// Indicate if you want display the parse of the packets received in administration connection
-// It's useful for debug. Possible values: 0: no (default), 1: yes
-display_parse_admin: 0
-
-// Indicate if you want display the parse of the packets received from a char-server
-// It's useful for debug. Possible values: 0: no (default), 1: yes (without packet 0x2714), 2: all packets
-display_parse_fromchar: 0
-
-// Indicate how to display date in logs, to players, etc.
-// 0: 31-12-2004 23:59:59
-// 1: 12-31-2004 23:59:59
-// 2: 2004-31-12 23:59:59
-// 3: 2004-12-31 23:59:59 (default)
-date_format: 3
-
-// Indicate the minimum GM level of player that the server accepts to connection.
-// 0: all players (normal player are 0. it's default), 1-99: GM level at least with level x
-min_level_to_connect: 0
-
-// Give possibility to adjust (ladmin command: timeadd) the time of an unlimited account.
-// If set to on/1/yes..., the adjustment is be done from actual time to set the final time of the account.
-// If set to no/0/no..., the adjustment can not be done on an unlimited account. You must set (ladmin command: timeset) a final time before to adjust (ladmin command: timeadd)
-add_to_unlimited_account: off
-
-// Starting additional sec from now for the limited time at creation of account
-// -1: new account are created with UNlimited time (default value)
-// 0 or more: new accounts was created by addition of the value (in sec) to the actual time (to set first limited time)
-start_limited_time: -1
-
-// It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-// If player doesn't have same IP, connection is refused.
-// Set to 0/off/no to not check IP of player.
-// Set to 1/on/yes if you want to check (default)
-// Note: if you enable this option, be sure that your (local/lan/wan) players use correct ip (in xml file) to contact servers,
-// and that your LAN is correctly configured (!), and that LAN configuration of eathena is right.
-// if not correct, you can read list of char-servers, but not look slots of characters (rejected by server).
-check_ip_flag: no
-
-// Specify order of IP control if necessary (option: 'deny,allow', 'allow,deny', or 'mutual-failture')
-// (how to use 'allow' and 'deny' information)
-//order: allow,deny
-
-// Indicate the IP that the server accept.
-// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
-// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
-// or 'clear' to suppress previous parameter (use it in import file mainly)
-// Add as many IP's as you wish.
-//allow: all
-
-// Indicate the IP that the server refuse.
-// Add as many IP's as you wish, as long as you put deny: before it.
-//deny: 123.123.123.123
-//deny: 234.234.234.234
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
-
-//Passwords in Login DB are MD5 - <passwordencrypt> cannot b used on client with this on
-use_MD5_passwords: no
-
-//Ban features: read readme for more info if you dont know this.
-ipban: 1
-dynamic_pass_failure_ban: 1
-dynamic_pass_failure_ban_time: 5
-dynamic_pass_failure_ban_how_many: 3
-dynamic_pass_failure_ban_how_long: 60
-dynamic_account_ban: 1
-dynamic_account_ban_class: 0
-
-// Anti-freeze system enable
-anti_freeze_enable: 0
-// Anti-freeze system interval (in seconds)
-anti_freeze_interval: 15
-
-// local settings for this server in this file
-import: conf/login_local.conf
diff --git a/conf/login_local.conf.example b/conf/login_local.conf.example
deleted file mode 100644
index bf892f33a..000000000
--- a/conf/login_local.conf.example
+++ /dev/null
@@ -1,30 +0,0 @@
-// Athena Login Server local configuration file.
-
-// wan ip override. this ip only will sended to cleints.
-// wan_ip:1.2.3.4
-
-// Port to bind Login Server to (always binds to all IP addresses)
-login_port: 6901
-
-// Whether remote administration is enabled or disabled (1 for enabled, 0 for disabled)
-admin_state: 1
-
-// Administrative password, used by ladmin (perl software) to connect remotely to server.
-// NOTICE: If you enable remote administration, you should change its value for security
-admin_pass: p1
-
-// Indicate the IP that the server accepts for remote administration.
-// put: 'all', or 'xxx.xxx.' (begin of an ip finished by '.' or a complete ip),
-// or a network and its mask (example: '123.456.789.012/24' or '123.456.789.012/255.255.255.0')
-// or 'clear' to suppress previous parameter (use it in import file mainly)
-// Add as many IP's as you wish.
-ladminallowip: all
-
-// Gamemaster password, used with the @gm command to obtain GM commands (level of gm set with level_new_gm parameter).
-// NOTICE: You should also change this one.
-gm_pass: gm
-
-// Update host
-// Tells the client that an alternative updatehost is available if the client
-// supports this. If left out nothing will be sent. max length 127.
-update_host: http://updates.themanaworld.org/
diff --git a/conf/logs.conf b/conf/logs.conf
new file mode 100644
index 000000000..6933e84fe
--- /dev/null
+++ b/conf/logs.conf
@@ -0,0 +1,134 @@
+//--------------------------------------------------------------
+// Hercules Log Configuration File
+//--------------------------------------------------------------
+// Note 1: Value is a config switch (on/off, yes/no or 1/0)
+// Note 2: Value is in percents (100 means 100%)
+// Note 3: Value is a bit field. If no description is given,
+// assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun)
+//--------------------------------------------------------------
+
+// Enable Logs? (Note 3)
+// 0x00000 - Don't log at all
+// 0x00001 - (T) Log trades
+// 0x00002 - (V) Log vending transactions
+// 0x00004 - (P) Log items drop/picked by players
+// 0x00008 - (L) Log items drop/looted by monsters
+// 0x00010 - (S) Log NPC transactions (buy/sell)
+// 0x00020 - (N) Log Script transactions (items deleted/acquired through quests)
+// 0x00040 - (D) Log items stolen from mobs (Steal/Gank)
+// 0x00080 - (C) Log player-used items (consumables/pet&hom&merc food/items used for skills&attacks)
+// 0x00100 - (O) Log produced/ingredient items
+// 0x00200 - (U) Log MVP prize items
+// 0x00400 - (A) Log player created/deleted items (through @/# commands)
+// 0x00800 - (R) Log items placed/retrieved from storage.
+// 0x01000 - (G) Log items placed/retrieved from guild storage.
+// 0x02000 - (E) Log mail system transactions.
+// 0x04000 - (I) Log auction system transactions.
+// 0x08000 - (B) Log buying store transactions
+// 0x20000 - (K) Log account bank transactions
+// 0x10000 - (X) Log all other transactions (rentals expiring/inserting cards/items removed by item_check/
+// rings deleted by divorce/pet egg (un)hatching/pet armor (un)equipping/Weapon Refine skill/Remove Trap skill)
+// Example: Log trades+vending+script items+created items: 1+2+32+1024 = 1059
+// Please note that moving items from inventory to cart and back is not logged by design.
+enable_logs: 0xFFFFF
+
+// Use MySQL Logs? [SQL Version Only] (Note 1)
+sql_logs: yes
+
+// LOGGING FILTERS
+// =============================================================
+// if any condition is true then the item will be logged
+// 0 = Don't log at all
+// 1 = Log any item
+// Advanced Filter Bits by item type: ||
+// 0002 - Healing items (0)
+// 0004 - Etc Items(3) + Arrows (10)
+// 0008 - Usable Items(2) + Lures,Scrolls(11) + Usable Cash Items(18)
+// 0016 - Weapon(4)
+// 0032 - Shields,Armor,Headgears,Accessories,etc(5)
+// 0064 - Cards(6)
+// 0128 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
+// 0256 - Log expensive items ( >= price_items_log)
+// 0512 - Log big amount of items ( >= amount_items_log)
+// 1024 - Log refined items (if their refine >= refine_items_log )
+// 2048 - Log rare items (if their drop chance <= rare_items_log )
+
+// Examples: (log filters)
+// log_filter: 1 = logs ANY items
+// log_filter: 2 = logs only HEALING items
+// log_filter: 4 = logs only Etc Items and Arrows
+// log_filter: 64 = logs only Cards
+// log_filter: 322 = logs only Healing items, Cards and those items which price is >= price_items_log
+// log_filter: 4080 = logs all items (including all rare, big amount) exept healing, etc, arrows and useble ones
+log_filter: 1
+
+// Log Items which Refine >= refine_items_log
+refine_items_log: 5
+// Log Items whith min drop rate <= rare_items_log
+// 1 = 0.01%, 100 = 1% drop chance, etc
+rare_items_log: 100
+// don't log it if the current item buy price < price_items_log
+price_items_log: 1000
+// don't log it if the current item amount < amount_items_log
+amount_items_log: 100
+//=============================================================
+
+// Log Dead Branch Usage (Note 1)
+log_branch: no
+
+// Track Zeny Changes
+// Filter settings
+// 0 - don't log; 1 - log any zeny changes; 2.....1000000 - minimal absolute logging zeny value
+log_zeny: 0
+
+// Log MVP Monster Drops (Note 1)
+// Outdated. Use Pick_Log instead. But this log could be useful to keep track slayed MVPs
+log_mvpdrop: no
+
+// Log AtCommands & Charcommands (Note 1)
+// Only commands issued by player groups ('conf/groups.conf') with
+// 'log_commands' setting set to 'true' will be logged.
+log_commands: yes
+
+// Log NPC 'logmes' commands (Note 1)
+log_npc: no
+
+// Log CHAT (Global, Whisper, Party, Guild, Main chat) (Note 3)
+// LOGGING FILTERS
+// =============================================================
+// 0 = Don't log at all
+// 1 - Log Global messages
+// 2 - Log Whisper messages
+// 4 - Log Party messages
+// 8 - Log Guild messages
+// 16 - Log Main chat messages
+// Example:
+// log_chat: 5 = logs both Whisper & Party messages
+// log_chat: 8 = logs only Guild messages
+// log_chat: 31 = logs everything
+log_chat: 0
+
+// Disable chat logging when WoE is running? (Note 1)
+log_chat_woe_disable: no
+
+// Logging files/tables
+// Following settings specify where to log to. If 'sql_logs' is
+// enabled, SQL tables are assumed, otherwise flat files.
+
+// log_gm_db: log/atcommandlog.log
+// log_branch_db: log/branchlog.log
+// log_chat_db: log/chatlog.log
+// log_mvpdrop_db: log/mvplog.log
+// log_npc_db: log/npclog.log
+// log_pick_db: log/picklog.log
+// log_zeny_db: log/zenylog.log
+
+log_gm_db: atcommandlog
+log_branch_db: branchlog
+log_chat_db: chatlog
+log_mvpdrop_db: mvplog
+log_npc_db: npclog
+log_pick_db: picklog
+log_zeny_db: zenylog
+
+import: conf/import/log_conf.txt
diff --git a/conf/magic.conf.template b/conf/magic.conf.template
deleted file mode 100644
index c440bf39e..000000000
--- a/conf/magic.conf.template
+++ /dev/null
@@ -1,1835 +0,0 @@
-# Special-purpose globals
-obscure_chance = 95
-min_casttime = 200
-
-# Schools of magic
-CONST MAGIC = 340
-CONST LIFE = 341
-CONST WAR = 342
-CONST TRANSMUTE = 343
-CONST NATURE = 344
-CONST NECROMANCY = 345
-
-# Elements
-CONST ELT_NEUTRAL = 0
-CONST ELT_WATER = 1
-CONST ELT_EARTH = 2
-CONST ELT_FIRE = 3
-CONST ELT_WIND = 4
-CONST ELT_POISON = 5
-CONST ELT_SHADOW = 6
-CONST ELT_HOLY = 7
-CONST ELT_GHOST = 8
-CONST ELT_UNDEAD = 9
-
-# Status effects
-
-CONST SC_WINDWALK = 116
-CONST SC_POISON = 132
-CONST SC_SHEARED = 194 # This is the same as SC_HIDE, since mobs can't hide and shearing is only used for mobs. Feel free to fix!
-CONST SC_HIDE = 194
-CONST SC_HALT_REGENERATE = 195
-CONST SC_FLYING_BACKPACK = 196
-CONST SC_MBARRIER = 197
-CONST SC_HASTE = 198
-CONST SC_PHYS_SHIELD = 199
-CONST EVOL_GUILD = 500
-CONST EVOL_CRAFT = 501
-CONST EVOL_DYE = 502
-
-CONST SO_GMINVISIBLE = 4096
-
-# Spells constants
-
-
-CONST LESSER_HEAL_HP =50
-CONST MEDIUM_HEAL_HP =250
-CONST FULL_HEAL_HP =1000000
-CONST LESSER_GROUP_HEAL_HP =30
-CONST MEDIUM_GROUP_HEAL_HP =150
-CONST FULL_GROUP_HEAL_HP_PERC =80
-
-
-# Special effects
-CONST SFX_DEFAULT = 10
-CONST SFX_SUMMON_START = 21
-CONST SFX_SUMMON_FIRE = 22
-CONST SFX_TELEPORT = 24
-CONST SFX_RAIN = 25
-CONST SFX_HIT = 25
-CONST SFX_ARROW_HAIL = 27
-CONST SFX_SNOW = 33
-CONST SFX_BARRIER = 10
-CONST SFX_UNBARRIER = 10
-CONST SFX_HEAL = 3
-
-CONST MAX_RAIN_SPELL_RADIUS = 15
-
-CONST MAX_MAGIC_LEVEL = 2 # Increase up to 5 as each new magic level is completed.
-
-CONST MAGIC_FLAGS = "MAGIC_FLAGS"
-CONST MFLAG_MADE_CONC_POTION = 16384
-CONST MFLAG_MADE_CONC_POTION_SHIFT = 14
-
-CONST SCRIPT_XP = "MAGIC_EXPERIENCE"
-CONST SCRIPT_XP_MASK = 0xffff
-CONST SCRIPT_XP_SHIFT = 0
-CONST SCRIPT_LASTSPELL_MASK = 0xff
-CONST SCRIPT_LASTSPELL_SHIFT = 16
-CONST SCRIPT_HEALSPELL_MASK = 0xff
-CONST SCRIPT_HEALSPELL_SHIFT = 24
-CONST DEBUG = 0
-
-CONST ATTACK_ICON_GENERIC = 2000
-CONST ATTACK_ICON_SHEARING = 2001
-
-# Default sfx on caster
-PROCEDURE default_effect() =
- sfx(caster, school - MAGIC + 2, 0);
-
-PROCEDURE sfx_generic(target) =
- sfx(target, SFX_DEFAULT, 0);
-
-PROCEDURE set_var(name, mask, shift, value) =
- set_script_variable(caster, name, script_int(caster, name) & (neg (mask << shift)) | ((value & mask) << shift));
-
-PROCEDURE gain_heal_xp(value, # How many HP we healed
- gain, # how many life magic experience points we can potentially gain
- heal_xp_value_divisor, # 1 for instaheal, 2 for slow heal
- base_exp_factor) = # factor for how many base experience points (max) the player should be allowed to gain
- last_heal_xp = (script_int(caster, SCRIPT_XP) >> SCRIPT_HEALSPELL_SHIFT) & SCRIPT_HEALSPELL_MASK;
- IF (target <> caster
- && (value / heal_xp_value_divisor) > (10 + last_heal_xp + random(last_heal_xp + 1) + random(last_heal_xp + 1)))
- THEN (
- heal_xp = last_heal_xp + gain;
- IF (heal_xp > SCRIPT_HEALSPELL_MASK)
- THEN heal_xp = SCRIPT_HEALSPELL_MASK;
- CALL set_var(SCRIPT_XP, SCRIPT_HEALSPELL_MASK, SCRIPT_HEALSPELL_SHIFT, heal_xp);
- )
- IF target <> caster
- THEN gain_experience(caster, base_exp_factor * extract_healer_experience(target, value), 0, 1);
-
-PROCEDURE gain_xp(gain) =
- IF (level + 3 > skill(caster, MAGIC)) # Level 4 and 5 magic users don't gain anything from spell levels 0 resp. 0+1
- THEN (
- index = spell_index(self_spell);
- last_index = (script_int(caster, SCRIPT_XP) >> SCRIPT_LASTSPELL_SHIFT) & SCRIPT_LASTSPELL_MASK;
- last_xp = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- IF (index != last_index)
- THEN ( # Some variation observed
- xp = last_xp + gain;
- IF (xp > SCRIPT_XP_MASK)
- THEN xp = SCRIPT_XP_MASK;
- CALL set_var(SCRIPT_XP, SCRIPT_XP_MASK, SCRIPT_XP_SHIFT, xp);
- CALL set_var(SCRIPT_XP, SCRIPT_LASTSPELL_MASK, SCRIPT_LASTSPELL_SHIFT, index);
- IF DEBUG THEN message(caster, "Spell xp = " + xp);
- ) ELSE IF DEBUG THEN message(caster, "Re-cast same spell, xp remain at " + last_xp);
- )
-
-PROCEDURE create_item(good_item, count, bad_item, difficulty) =
- success = 1;
- score = experience + random(min(spellpower, (experience / 3) + 1));
- IF (score >= difficulty)
- THEN create_item(caster, good_item, count);
- ELSE (
- success = 0;
- score = score + random(luk(caster)) + random(luk(caster));
- IF (score < difficulty / 3)
- THEN (
- message(caster, "Your spell backfires!");
- IF (random(110) < (luk(caster)))
- THEN itemheal(caster, 0 - ((level + 1) * (level + 2) * (3 + random(28))), 0);
- ELSE itemheal(caster, 0 - (level + 1), 0);
- ) ELSE IF (score < (difficulty * 2) / 3)
- THEN (
- IF random(5) = 0
- THEN (message(caster, "Your spell solidifies into the shape of a mysterious object!");
- create_item(caster, "Iten", 1);)
- ELSE message(caster, "Your spell escapes!");
- ) ELSE (
- message(caster, "Your spell takes on a mind of its own!");
- IF random(3) = 0
- THEN create_item(caster, bad_item, 1);
- )
- )
-
-# Increase spellpower by school and general magic skill
-PROCEDURE adjust_spellpower(school) =
- experience = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- spellpower = spellpower + (skill(caster, MAGIC) + skill(caster, school)) * 10;
- # Below, we adjust by special items
- IF (not(failed(target)) && (school = LIFE || school = NATURE))
- THEN IF (target)
- THEN IF (pc(target) = partner(caster))
- THEN (spellpower = spellpower + 200;
- IF is_equipped(caster, "WeddingRing")
- THEN spellpower = spellpower + 50;
- IF is_equipped(pc(target), "WeddingRing")
- THEN spellpower = spellpower + 50;)
-
-PROCEDURE heal(target, max_heal) =
- CALL default_effect();
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0);
- power = spellpower + vit(caster);
- power = min(max_heal, (max_heal * power) / 250);
- itemheal(target, power, 0);
-
-# Goes through instaheal instead of itemheal
-PROCEDURE quickheal(target, power) =
- CALL default_effect();
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0);
- instaheal(target, power, 0);
-
-# Can attack the target? Imports attack_range from dynamic environment
-PROCEDURE attack_check(target) =
- IF (not (line_of_sight(location(caster), location(target))))
- THEN ABORT;
- IF (not (rdistance(location(caster), location(target)) <= attack_range))
- THEN ABORT;
-
-# Cause elemental damage. bonus_elt grants an attack bonus, malus_elt reduces the attack. `effect' is the sfx ID.
-PROCEDURE elt_damage(target, damage, dmgplus, bonus_elt, malus_elt, effect) =
- d = damage + random(dmgplus);
- evade = level(target) + mdef(target);
- IF (element(target) = malus_elt)
- THEN d = d / 3;
- IF (element(target) = bonus_elt)
- THEN d = (d * (4 + element_level(target))) / 4;
- #message(caster, "bonus=" + (element(target) = bonus_elt) + " malus=" + (element(target) = malus_elt) + " damage=" + damage + " + r(" + dmgplus + ") -> " + d);
- sfx(target, effect, 0);
- IF (spellpower - random(100) < evade)
- THEN d = 0;
- injure(caster, target, d, 0);
-
-PROCEDURE melee_damage(target, damage, dmgplus) =
- CALL attack_check(target);
- d = damage + random(dmgplus);
- evade = level(target) + mdef(target);
- IF (spellpower - random(100) < evade)
- THEN d = 0;
- injure(caster, target, d, 0);
-
-
-PROCEDURE install_attack_spell(charges, base_delay, range, attack_animation) =
- CALL default_effect();
- attack_range = range;
- override_attack(caster, charges, ((200 - agi(caster)) * base_delay) / 200,
- range, ATTACK_ICON_GENERIC, attack_animation, 0);
-
-PROCEDURE install_melee_spell(charges, base_delay, attack_animation) =
- CALL install_attack_spell(charges, base_delay, 1, attack_animation);
-
-PROCEDURE summon_spell(mob_id, count, delay, lifetime, control_level) =
- CALL default_effect();
- sfx(location, SFX_SUMMON_START, 0);
- WAIT delay;
- sfx(location, SFX_SUMMON_FIRE, 0);
- spawn(rbox(location, 2), caster, mob_id,
- if_then_else(skill(caster, ASTRAL) >= control_level, 2, 1), # pets when level is high enough
- count, lifetime);
-
-
-PROCEDURE abort_on_area_shield(pos) =
- IF (is_exterior(pos) = 1 && (map_nr(pos) = 1 # Tulimshar
- ||map_nr(pos) = 9 # Hurnscald
- ||map_nr(pos) = 20
- ||map_nr(pos) = 99)) # Nivalis
- THEN (message(caster, "A powerful magic drains your spell just as it is beginning to take shape!");
- ABORT;)
-
-
-#--------------------------------------------------------------------------------
-# Level 0 spells
-#--------------------------------------------------------------------------------
-
-SPELL ask-magic-exp : "#G01" =
- LET level = 0
- school = MAGIC
- IN (MANA 1, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- level = skill (caster, MAGIC);
- experience = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- IF (experience == SCRIPT_XP_MASK && level > 4)
- THEN message (caster, "You are as proficient at magic as you can possibly be.");
- ELSE (
- # This duplicates the table in mana-seed.txt
- IF level > 4
- THEN max_experience = SCRIPT_XP_MASK;
- ELSE IF level = 4
- THEN max_experience = 40000;
- ELSE IF level = 3
- THEN max_experience = 8000;
- ELSE IF level = 2
- THEN max_experience = 1200;
- ELSE max_experience = 100;
-
- ratio = (10 * experience - random(max_experience / 30)) / max_experience; #Randomness: jitter a bit at the transitions to give more precise information if used frequently
-
- IF ratio >= 45
- THEN message(caster, "Magic flows naturally from you, readily and with ease. Your understanding of what you can currently control at present is flawless, far beyond your requirements to cast magic at this level." + if_then_else(level >= MAX_MAGIC_LEVEL,""," Surely the Mana Seed will more than readily offer more magic for such a proficient user."));
- ELSE IF ratio >= 20
- THEN message(caster, "You have perfect control of what you understand now, but there is now a distinct sensation of something more, something indescribable. If only the Mana Seed would give more magic to you...");
- ELSE IF ratio >= 10
- THEN message(caster, "You feel in perfect control of your magic" + if_then_else(level >= MAX_MAGIC_LEVEL,".",", and seem on the verge of something more... perhaps you should see the Mana Seed to ask for more magic?"));
- ELSE IF ratio >= 9
- THEN message(caster, "You feel in almost perfect control of your magic.");
- ELSE IF ratio >= 8
- THEN message(caster, "You feel that you have very good control of your magic.");
- ELSE IF ratio >= 7
- THEN message(caster, "You feel quite in control of your magic.");
- ELSE IF ratio >= 6
- THEN message(caster, "You feel mostly in control of your magic.");
- ELSE IF ratio >= 5
- THEN message(caster, "You feel somewhat in control of your magic.");
- ELSE IF ratio >= 4
- THEN message(caster, "You feel you still have a few difficulties in controlling your magic.");
- ELSE IF ratio >= 3
- THEN message(caster, "Trying to control your magic is still rather troublesome.");
- ELSE IF ratio >= 2
- THEN message(caster, "You feel that you have only the bare minimum of control over your magic.");
- ELSE IF ratio >= 1
- THEN message(caster, "You feel quite overwhelmed by your magic, but are beginning to see patterns.");
- ELSE message (caster, "You feel completely overwhelmed by your magic.");
- )
-
-# SPELL ask-life-magic-exp : "#G02" =
-# LET level = 0
-# school = MAGIC
-# IN (MANA 1, CASTTIME 1000,
-# REQUIRE skill(caster, MAGIC) > level)
-# => EFFECT CALL adjust_spellpower(school);
-# CALL default_effect();
-# message(caster, "You have " + ((script_int(caster, "MAGIC_EXPERIENCE") >> 24) & 0xff) + " Life Magic Experience points.");
-
-SPELL transmute-wood-to-figurine (name : STRING) : "#T00" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 5, CASTTIME 4000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["RawLog"])
- => ( REQUIRE name = "boo" =>
- EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("MoubooFigurine", 1, "WarpedLog", 40);
- CALL gain_xp(1);
- | REQUIRE name = "lurk" =>
- EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("WarpedLog", 1, "WarpedLog", 40);
- message (caster, "You have no idea what a Skrytlurk looks like.");
- )
-
-
-#--------------------------------------------------------------------------------
-# Evol Level 0 Life magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL lesser-heal (target : STRING) : "#L00" =
- LET level = 0
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF failed(pc(target))
- THEN (target = caster;)
- ELSE (target = pc(target);
- IF is_dead(target)
- THEN ABORT;)
- CALL gain_heal_xp(min(200, max_hp(target) - hp(target)), 1, 2, 2); # report half values for non-instaheal
- CALL heal(target, LESSER_HEAL_HP);
- CALL gain_xp(1);
-
-
-SPELL cure-poison (target : PC) : "#L01" =
- LET level = 0
- school = LIFE
- IN (MANA 15, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE (rdistance(location(caster),
- location(pc(target))) < 1 + (spellpower / 60)),
- CATALYSTS ["Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (running_status_update (target, SC_POISON))
- THEN (CALL gain_heal_xp(40, 1, 2, 2);
- stop_status_change (target, SC_POISON);
- CALL gain_xp(2);
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0););
-
-
-SPELL lesser-group-heal : "#L02" =
- LET level = 0
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH PC target IN rbox(location(caster), 4) DO
- IF ( is_dead(target) = 0 && target <> caster && line_of_sight(location(caster), location(target)))
- THEN (CALL sfx_generic(target);
- CALL quickheal(target, LESSER_GROUP_HEAL_HP);
- CALL gain_heal_xp(min(LESSER_GROUP_HEAL_HP, max_hp(target) - hp(target)), 1, 2, 2);)
- CALL gain_xp(1);
-
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 0 Life magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 1 Life magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL medium-group-heal : "#L10" =
- LET level = 1
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH PC target IN rbox(location(caster), 6) DO
- IF ( is_dead(target) = 0 && target <> caster && line_of_sight(location(caster), location(target)))
- THEN (CALL sfx_generic(target);
- CALL quickheal(target, MEDIUM_GROUP_HEAL_HP);
- CALL gain_heal_xp(min(MEDIUM_GROUP_HEAL_HP, max_hp(target) - hp(target)), 1, 2, 2);)
- CALL gain_xp(1);
-
-SPELL transfusion (target : STRING) : "#L11" =
- LET level = 1
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF failed(pc(target))
- THEN (target = caster;)
- ELSE (target = pc(target);
- IF is_dead(target)
- THEN ABORT;)
- CALL gain_heal_xp(min(200, max_hp(target) - hp(target)), 1, 2, 2); # report half values for non-instaheal
- points = min(500, hp(caster) - 1);
- CALL quickheal(caster, -1 * points);
- CALL quickheal(target, points);
- CALL gain_xp(1);
-
-SPELL medium-heal (target : STRING) : "#L12" =
- LET level = 1
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF failed(pc(target))
- THEN (target = caster;)
- ELSE (target = pc(target);
- IF is_dead(target)
- THEN ABORT;)
- CALL gain_heal_xp(min(200, max_hp(target) - hp(target)), 1, 2, 2); # report half values for non-instaheal
- CALL heal(target, MEDIUM_HEAL_HP);
- CALL gain_xp(1);
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 1 Life magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 2 Life magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL revive (target : PC) : "#L20" =
- LET level = 2
- school = LIFE
- IN (MANA 12, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["Acorn"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (target <> caster)
- #resurrect the target with 100% hp, 100% mp (1 flag to use %, 0 to use absolute values)
- THEN(resurrect(target, 1, 1, 0);
- CALL gain_xp(10);
- sfx(target, school - MAGIC + 2, 0);)
-
-
-SPELL full-group-heal : "#L21" =
- LET level = 2
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH PC target IN rbox(location(caster), 10) DO
- IF ( is_dead(target) = 0 && target <> caster && line_of_sight(location(caster), location(target)))
- THEN (CALL sfx_generic(target);
- CALL quickheal(target, max_hp(target) * (FULL_GROUP_HEAL_HP_PERC / 100));
- CALL gain_heal_xp(min(max_hp(target) * (FULL_GROUP_HEAL_HP_PERC / 100), max_hp(target) - hp(target)), 1, 2, 2);)
- CALL gain_xp(1);
-
-
-SPELL full-heal (target : STRING) : "#L22" =
- LET level = 2
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (CATALYSTS ["Acorn"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF failed(pc(target))
- THEN (target = caster;)
- ELSE (target = pc(target);
- IF is_dead(target)
- THEN ABORT;)
- CALL gain_heal_xp(min(200, max_hp(target) - hp(target)), 1, 2, 2); # report half values for non-instaheal
- CALL heal(target, FULL_HEAL_HP);
- CALL gain_xp(1);
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 2 Life magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 0 Nature magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL rain : "#N00" =
- LET level = 0
- school = NATURE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- CATALYSTS ["Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- #CALL abort_on_area_shield(location(caster));
- CALL gain_xp(1);
- range = min(MAX_RAIN_SPELL_RADIUS, 3 + min(spellpower, 200) / 30);
- area = rbox(location(caster), range);
- FOR i = 0 TO (spellpower / 3) DO (
- FOR j = 0 TO min(spellpower / 2, 200) / 100 DO (
- location = random_location(area);
- sfx(location, SFX_RAIN, 0);
- )
- WAIT 400 + random(100);
- );
-
-SPELL speed : "#N02" =
- LET level = 0
- school = NATURE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- CATALYSTS ["Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- status_change(caster, SC_WINDWALK, 16, -50, 0, 0, 30000);
- CALL gain_xp(1);
- message(caster, "You feel you can move fast");
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 0 Nature magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 1 Nature magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL snow : "#N10" =
- LET level = 0
- school = NATURE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- CATALYSTS ["Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- #CALL abort_on_area_shield(location(caster));
- CALL gain_xp(1);
- range = min(MAX_RAIN_SPELL_RADIUS, 3 + min(spellpower, 200) / 30);
- area = rbox(location(caster), range);
- FOR i = 0 TO (spellpower / 3) DO (
- FOR j = 0 TO min(spellpower / 2, 200) / 100 DO (
- location = random_location(area);
- sfx(location, SFX_SNOW, 0);
- )
- #WAIT 100 + random(100);
- );
-
-SPELL anti-magic (target : PC) : "#N12" =
- LET level = 1
- school = NATURE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- CATALYSTS ["Acorn"],
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- sfx(target, 11, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_MBARRIER, 20 + max(30, spellpower / 8), 0, 0, 0, 2000 + (spellpower * 200));
- status_change(target, SC_PHYS_SHIELD, 5 + max(15, spellpower / 20), 0, 0, 0, 5000 + (spellpower * 1000));
- message (target, "You are surrounded by a magical barrier.");
- CALL gain_xp(5);
- ATEND message (target, "Your magical barrier dissipates.");
- sfx(target, 111, 0);
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 1 Nature magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 1 Necromancy magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL destruction : "#NE12" =
- LET level = 2
- school = NECROMANCY
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- CATALYSTS ["Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH MOB target IN rbox(location(caster), 10) DO (
- injure(caster, target, 1000, 0);)
- #sfx(target, 16, 0);)
- itemheal(caster, -1 * hp(caster) + 1, -10000);
- CALL gain_xp(1);
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 1 Necromancy magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 0 Transmutation magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL herb-transmut (target : PC) : "#T00" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- CATALYSTS ["Acorn"],
- CATALYSTS [646] OR CATALYSTS [647] OR CATALYSTS [648] OR CATALYSTS [649])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- esc = random(30);
- IF (esc = 0) THEN (
- message (caster, "Your spell escapes!");
- ABORT;
- )
- {
- set @herbs[0], 646;
- set @herbs[1], 647;
- set @herbs[2], 648;
- set @herbs[3], 649;
- set @c, 4;
- set @herb, rand(@c);
- l_RandHerb:
- if (countitem(@herbs[@herb])) goto l_Delete;
- set @c, @c - 1;
- set @herbs[@herb], @herbs[@c];
- set @herb, rand(@c);
- goto l_RandHerb;
- l_Delete:
- set @herb, @herbs[@herb];
- delitem @herb, 1;
- l_NewHerb:
- set @herbs[0], 646;
- set @herbs[1], 647;
- set @herbs[2], 648;
- set @herbs[3], 649;
- set @c, 4;
- set @newherb, rand(@c);
- l_RandNewHerb:
- if (@herbs[@newherb] != @herb) goto l_Create;
- set @c, @c - 1;
- set @herbs[@newherb], @herbs[@c];
- set @newherb, rand(@c);
- goto l_RandNewHerb;
- l_Create:
- getitem @herbs[@newherb], 1;
- if (@sec) goto l_Finish;
- set @sec, rand(29);
- if (@sec == 1) goto l_NewHerb;
- l_Finish:
- set @sec, 0;
- };
-
-SPELL make-turtle : "#T02" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- #REQUIRE skill(caster, school) > level,
- COMPONENTS ["Acorn", "Acorn", "Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- spawn(rbox(location(caster), 2), caster, 1002, 1, 1, 1000000000);
-
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 0 Transmutation magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Evol Level 1 Transmutation magic spells (change acorns with the real component)
-#--------------------------------------------------------------------------------
-
-SPELL make-bee : "#T12" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- #REQUIRE skill(caster, school) > level,
- COMPONENTS ["Acorn", "Acorn", "Acorn", "Acorn"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- spawn(rbox(location(caster), 2), caster, 1005, 1, 1, 1000000000);
-
-
-#--------------------------------------------------------------------------------
-# End of Evol Level 1 Transmutation magic spells
-#--------------------------------------------------------------------------------
-
-#--------------------------------------------------------------------------------
-# Old TMW spells (to get rid of)
-#--------------------------------------------------------------------------------
-
-SPELL aggravate : "#N00" =
- LET level = 0
- school = NATURE
- IN (MANA 3, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH MOB target IN rbox(location(caster), 2 + spellpower / 50) DO
- IF line_of_sight(location(caster), location(target))
- THEN (CALL sfx_generic(target);
- aggravate(target, 0, caster);)
-
-SPELL grow-mauve : "#N01" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["MauveHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1029, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-alizarin : "#N02" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["AlizarinHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1032, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-gamboge : "#N03" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["GambogeHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1031, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-cobalt : "#N04" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["CobaltHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1030, 1, skill(caster, school) / 2 + 1, 10000);
-
-
-LOCAL SPELL summon-maggots : "#A00" =
- LET level = 0
- school = ASTRAL
- IN (MANA 21, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["MaggotSlime", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL gain_xp(1);
- CALL summon_spell(1002,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 5),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-SPELL detect-magic : "#G00" =
- LET level = 0
- school = MAGIC
- IN (MANA 3, CASTTIME 6000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- range = 1 + spellpower / 50;
- FOREACH NPC n IN rbox(location(caster), range)
- DO IF (contains_string(name_of(n), "#MAGIC") || contains_string(name_of(n), "#_M"))
- THEN sfx(n, SFX_DEFAULT, 0);
- FOREACH SPELL s IN rbox(location(caster), range)
- DO IF (s <> self_invocation)
- THEN sfx(s, SFX_DEFAULT, 0);
-
-
-#--------------------------------------------------------------------------------
-# Level 1 spells
-#--------------------------------------------------------------------------------
-
-SPELL make-arrows : "#T10" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["RawLog"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("Arrow", 1 + spellpower / 40 + (random(max(1, 800 - spellpower)) / 80), "WarpedLog", 500);
- CALL gain_xp(1);
-
-SPELL make-shirt : "#T11" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [5 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("CottonShirt", 1, "CottonCloth", 425);
- CALL gain_xp(2);
-
-SPELL make-tanktop : "#T12" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [4 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("TankTop", 1, "CottonCloth", 350);
- CALL gain_xp(2);
-
-SPELL make-short-tanktop : "#T13" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [3 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("ShortTankTop", 1, "CottonCloth", 250);
- CALL gain_xp(2);
-
-SPELL make-iron-powder : "#T14" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["IronOre"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("IronPowder", 1 + spellpower / 140 + (random(max(1, 900 - spellpower)) / 220), "IronOre", 700);
- CALL gain_xp(3);
-
-SPELL make-concentration-potion : "#T15" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["BottleOfWater", 2 * "CobaltHerb", 2 * "Petal"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item( if_then_else(random(2000 + experience) < experience, "ConcentrationPotion", "DarkConcentrationPotion"), 1,
- if_then_else(random(2), 744, "DarkConcentrationPotion"),
- 2000);
- IF (success)
- THEN CALL set_var(MAGIC_FLAGS, 1, MFLAG_MADE_CONC_POTION_SHIFT, 1);
- CALL gain_xp(4);
-
-SPELL merge-concentration-potions : "#T16" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["DarkConcentrationPotion", 744])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("ConcentrationPotion", 1, 744, 1000);
- message (caster, "success = " + success);
- IF (success)
- THEN CALL set_var(MAGIC_FLAGS, 1, MFLAG_MADE_CONC_POTION_SHIFT, 1);
- CALL gain_xp(4);
-
-
-SPELL lay-on-hands (target : STRING) : "#L10" =
- LET level = 1
- school = LIFE
- IN (MANA 10, CASTTIME 500,
- REQUIRE hp(caster) > max_hp(caster) / 20,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- (pc(target) <> caster)
- &&
- (rdistance(location(caster),
- location(pc(target))) < 2 + (spellpower / 50))
- && not (running_status_update(pc(target), SC_HALT_REGENERATE))
- ))
- => EFFECT CALL adjust_spellpower(school);
- IF (not (target)) THEN ABORT;
- IF failed(pc(target))
- THEN (IF ((target = "mouboo" || target = "Mouboo")
- && (rdistance(location(caster), location(npc("Mouboo"))) < 2 + (spellpower / 100)))
- THEN (needed = 1000;
- {
- set @spell, 1;
- callfunc "QuestMoubooHeal";
- })
- ELSE ABORT;
- )
- ELSE (target = pc(target);
- needed = max_hp(target) - hp(target);)
-
- pay_fraction = max(80, 200 - (vit(caster) + (spellpower / 10))); # Pay at least 40%
- payment = (needed * pay_fraction) / 200;
- available = hp(caster) - (max_hp(caster) / 20);
-
- IF payment < available
- THEN power = needed;
- ELSE (payment = available;
- power = (available * 200) / pay_fraction;
- )
- CALL gain_heal_xp(power, 1, 1, 3);
- CALL quickheal(target, power);
- status_change(caster, SC_HALT_REGENERATE, 0, 0, 0, 0, 10000);
- CALL gain_xp(min(4, payment / 100));
-
-SPELL lightning-strike : "#ingrav" =
- LET level = 1
- school = WAR
- IN (MANA 20, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["IronPowder"]))
- => EFFECT CALL adjust_spellpower(school);
- damage = spellpower;
- damage_bonus = 1 + spellpower / 2;
- CALL install_attack_spell(1 + spellpower / 90,
- 3000,
- 8, 31);
- CALL gain_xp(2);
- ATTRIGGER CALL attack_check(target);
- in_rain = 0;
- area = location(caster);
- FOREACH SPELL s IN rbox(location(caster), MAX_RAIN_SPELL_RADIUS + 1) DO
- IF name_of(s) = "rain" THEN (
- IF is_in (location(caster), s.area)
- THEN (in_rain = in_rain | 1;
- area = area + s.area;);
- IF is_in (location(target), s.area)
- THEN in_rain = in_rain | 2;
- );
- IF (in_rain & 1) || (check_status_change(caster,SC_DRUNK))
- THEN (# caster standing in the rain? This is going to be fun.
- used = 0;
- FOREACH TARGET t IN area DO
- IF (random(200) + luk(caster) > 175)
- THEN (used = used + 1;
- CALL elt_damage (t, damage / 6, 1 + (damage_bonus / 3), ELT_EARTH, ELT_WIND, 17 + random(3)););
- IF (not(used) || (random(200) + luk(caster) < 150))
- THEN (sfx(caster, 17 + random(3), 0);
- itemheal(caster, 0 - damage - (random(damage_bonus)), 0););
- ) ELSE
- CALL elt_damage (target, damage, damage_bonus, ELT_EARTH, ELT_WIND, 17 + random(3));
-
-LOCAL SPELL arrow-hail : "#W11" =
- LET level = 1
- school = WAR
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_exterior(location(caster)),
- (COMPONENTS [20 * "Arrow"] OR COMPONENTS [20 * "IronArrow"]),
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SulphurPowder"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL abort_on_area_shield(location(caster));
-
- range = 7;
- area = rbox(awayfrom(location(caster), dir(caster), 1 + range), range);
-
- FOREACH SPELL s IN rbox(awayfrom(location(caster), dir(caster), 1 + range), range * 2) DO
- IF (s <> self_invocation) && (name_of(s) = "arrow-hail")
- THEN (message (caster, "A nearby arrow hail spell absorbs your magic!");
- ABORT;)
-
- damage = 125;
- damage_bonus = spellpower / 5;
- CALL gain_xp(2);
- FOR i = 0 TO spellpower / 8 DO (
- FOR j = 0 TO 2 DO (
- location = random_location(area);
- sfx(location, SFX_ARROW_HAIL, 0);
- done = 0;
- FOREACH TARGET target IN rbox(location, 0) DO (
- injure(caster, target, damage + random(damage_bonus) + random(damage_bonus), 0);
- done = 1;
- BREAK;
- )
- IF location(caster) = location && not(done)
- THEN (itemheal(caster, 0 - (damage + random(damage_bonus) + random(damage_bonus)), 0);
- sfx(caster, SFX_HIT, 0);
- )
- );
- WAIT 250 + random(50) + random(50);
- );
-
-SPELL magic-knuckles : "#W12" =
- LET level = 1
- school = WAR
- IN (MANA 20, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["Beer"]))
- =>
- EFFECT CALL adjust_spellpower(WAR);
- str = str(caster);
- CALL install_melee_spell(10 + spellpower / 10, 1300, 34);
- ATTRIGGER CALL melee_damage(target, 30, 5 + (str * 2));
-
-SPELL flying-backpack (target : PC) : "#N10" =
- LET level = 1
- school = NATURE
- IN (MANA 12, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SilkCocoon"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (caster <> target)
- THEN sfx(caster, 2, 0);
- status_change(target, SC_FLYING_BACKPACK, 0, 0, 0, 0, 5000 + (spellpower * 500));
- message (target, "Your backpack is lifted by a mystical force; you no longer feel it pressing on your back.");
- CALL gain_xp(1);
- ATEND message (target, "Your backpack is no longer levitating.");
- sfx(target, 2, 0);
-
-SPELL protect (target : PC) : "#N11" =
- LET level = 1
- school = NATURE
- IN (MANA 14, CASTTIME 1500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["HardSpike"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, 11, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_PHYS_SHIELD, 5 + max(15, spellpower / 20), 0, 0, 0, 5000 + (spellpower * 1000));
- message (target, "You feel more protected.");
- CALL gain_xp(2);
- ATEND message (target, "You feel less protected.");
- sfx(target, 111, 0);
-
-SPELL happy-curse (target : PC) : "#N12" =
- LET level = 1
- school = NATURE
- IN (MANA 13, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["GingerBreadMan"]),
- REQUIRE rdistance(location(target), location(caster)) < 1 + spellpower / 100)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOR i = 0 TO (spellpower / 10) DO (emote(target, 3); WAIT 500;);
- CALL gain_xp(1);
-
-LOCAL SPELL rain : "#N13" =
- LET level = 1
- school = NATURE
- IN (MANA 17, CASTTIME 3000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_exterior(location(caster)),
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["BottleOfWater"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL abort_on_area_shield(location(caster));
- FOREACH SPELL s IN rbox(location(caster), MAX_RAIN_SPELL_RADIUS + 1) DO
- IF (s <> self_invocation) && (name_of(s) = "rain")
- THEN (message (caster, "A nearby raincloud absorbs your magic.");
- ABORT;)
-
- CALL gain_xp(1);
- range = min(MAX_RAIN_SPELL_RADIUS, 3 + min(spellpower, 200) / 30);
- area = rbox(location(caster), range);
- IF (is_in(location(npc("#DruidTree0#_M")), area)
- || is_in(location(npc("#DruidTree1#_M")), area))
- THEN {
- set @flag, 1;
- callfunc "QuestTreeTrigger";
- };
- FOR i = 0 TO (spellpower / 3) DO (
- FOR j = 0 TO min(spellpower / 2, 200) / 100 DO (
- location = random_location(area);
- sfx(location, SFX_RAIN, 0);
- FOREACH TARGET target IN rbox(location, 1) DO
- IF element(target) = ELT_FIRE
- THEN injure(caster, target, 2 + random(5 + spellpower / 15), 0);
- )
- WAIT 400 + random(100);
- );
-
-LOCAL SPELL snow : "#N23" =
- LET level = 1
- school = NATURE
- IN (MANA 18, CASTTIME 3000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_exterior(location(caster)),
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["BottleOfWater"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL abort_on_area_shield(location(caster));
- FOREACH SPELL s IN rbox(location(caster), MAX_RAIN_SPELL_RADIUS + 1) DO
- IF (s <> self_invocation) && (name_of(s) = "snow")
- THEN (message (caster, "A nearby snowcloud absorbs your magic.");
- ABORT;)
- CALL gain_xp(1);
- range = min(MAX_RAIN_SPELL_RADIUS, 3 + min(spellpower, 200) / 30);
- area = rbox(location(caster), range);
-
- FOR i = 0 TO (spellpower / 8) DO (
- FOR j = 0 TO min(spellpower / 2, 200) / 100 DO (
- location = random_location(area);
- sfx(location, 29, 0);
- FOREACH TARGET target IN rbox(location(area), 0) DO
- IF element(target) = ELT_FIRE
- THEN injure(caster, target, 2 + random(5 + spellpower / 15), 0);
- )
- WAIT 200 + random(100);
- );
-
-PROCEDURE shear-drop(target, target2, item, prob) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);)
-
-PROCEDURE shear-drop2(target, target2, item, prob, item2, prob2) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);
- ELSE CALL shear-drop(target, target2, item2, prob2 + prob);)
-
-PROCEDURE shear-drop3(target, target2, item, prob, item2, prob2, item3, prob3) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);
- ELSE CALL shear-drop2(target, target2, item2, prob2 + prob, item3, prob3 + prob);)
-
-
-SPELL shear : "#N14" =
- LET level = 1
- school = NATURE
- IN (MANA 23, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- override_attack (caster, 1, 2000, 1, ATTACK_ICON_SHEARING, 30, 0);
- ATTRIGGER IF not(is_pc(target))
- THEN (score = random (1000 - (random (spellpower))); # lower score -> more valuable item
- name = name_of(target);
- place = random_location(rbox(location(target), 1));
- IF running_status_update(target, SC_SHEARED)
- THEN ABORT;
- status_change(target, SC_SHEARED, 1, 1, 1, 1, 600000); # 10 minutes
- CALL shear-drop("Fluffy", "Fluffy", "WhiteFur", 300);
- CALL shear-drop("EasterFluffy", "Easter Fluffy", "WhiteFur", 300);
- CALL shear-drop("SpikyMushroom", "Spiky Mushroom", "HardSpike", 250);
- CALL shear-drop("Mouboo", "Mouboo", "CottonCloth", 175);
- CALL shear-drop("Cobalt", "CobaltPlant", "CobaltHerb", 700);
- CALL shear-drop("Alizarin", "AlizarinPlant", "AlizarinHerb", 700);
- CALL shear-drop("Gamboge", "GambogePlant", "GambogeHerb", 700);
- CALL shear-drop("Mauve", "MauvePlant", "MauveHerb", 700);
- CALL shear-drop("SilkWorm", "Silkworm", "SilkCocoon", 300);
- IF ((name = "Fluffy" || name = "Mouboo") && random(2))
- THEN { set @value, 1; callfunc "QuestSagathaHappy"; };
- )
-
-
-
-SPELL barrier (target : PC) : "#A10" =
- LET level = 1
- school = ASTRAL
- IN (MANA 16, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SmallMushroom"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, SFX_BARRIER, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_MBARRIER, 20 + max(30, spellpower / 8), 0, 0, 0, 2000 + (spellpower * 200));
- message (target, "You are surrounded by a magical barrier.");
- CALL gain_xp(3);
- ATEND message (target, "Your magical barrier dissipates.");
- sfx(target, SFX_UNBARRIER, 0);
-
-
-LOCAL SPELL summon-spiky-mushrooms : "#A11" =
- LET level = 1
- school = ASTRAL
- IN (MANA 33, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["HardSpike", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- CALL summon_spell(1019, 1 + spellpower / 120, 5000 - (spellpower * 9), spellpower * 400, 2);
-
-LOCAL SPELL summon-fluffies : "#A12" =
- LET level = 1
- school = ASTRAL
- IN (MANA 39, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["WhiteFur", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- CALL summon_spell(1020, 1 + spellpower / 170 + spellpower / 430, 5000 - (spellpower * 8), spellpower * 350, 3);
-
-
-SPELL detect-players : "#G10" =
- LET level = 1
- school = MAGIC
- IN (MANA 7, CASTTIME 300,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- message = "";
- FOREACH PC target IN rbox(location(caster), spellpower / 2)
- DO IF ((target <> caster)
- && not (running_status_update(pc(target), SC_HIDE))
- && not (status_option(target, SO_GMINVISIBLE)))
- THEN (IF message <> ""
- THEN message = message + ", ";
- message = message + name_of (target);
- IF spellpower > 99
- THEN message = message + "(" + level(target) + ")";
- )
- IF message = ""
- THEN message(caster, "You sense no-one else nearby.");
- ELSE message(caster, "You sense the following: " + message);
-
-SPELL reveal : "#G11" =
- LET level = 1
- school = MAGIC
- IN (MANA 18, CASTTIME 3000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH PC target IN rbox(location(caster), 1 + spellpower / 100)
- DO IF has_shroud(target) && level(caster) * 2 > level(target)
- THEN (unshroud(target);
- sfx(target, SFX_DEFAULT, 500);)
-
-
-SPELL enchant-lifestone : "#G12" =
- LET level = 1
- school = MAGIC
- IN (MANA 15, CASTTIME 4000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (COMPONENTS["BugLeg"] OR COMPONENTS ["MaggotSlime"]
- OR COMPONENTS ["MauveHerb", "AlizarinHerb", "CobaltHerb", "GambogeHerb"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- create_item(caster, "Lifestone", 1);
- CALL gain_xp(1);
-
-SPELL sense-spouse : "#G13" =
- LET level = 1
- school = MAGIC
- IN (MANA 7, CASTTIME 400,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_married(caster),
- REQUIRE is_equipped(caster, "WeddingRing"))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (failed(partner(caster)) || not(is_equipped(partner(caster), "WeddingRing")))
- THEN (message(caster, "You cannot sense your partner.");
- ABORT;)
- partner = partner(caster);
- name = name_of(partner);
- IF (is_dead(partner) || (map_nr(location(partner)) <> map_nr(location(caster))))
- THEN (message(caster, "You cannot sense " + name + " nearby.");
- ABORT;)
- IF (map_level(location(partner)) > 2 && map_level(location(caster)) < map_level(location(partner)))
- THEN (message(caster, "You sense " + name + " somewhere below.");
- ABORT;)
- IF (map_level(location(caster)) > 2 && map_level(location(partner)) < map_level(location(caster)))
- THEN (message(caster, "You sense " + name + " somewhere above.");
- ABORT;)
- IF (map_level(location(caster)) <> map_level(location(partner)))
- THEN message(caster, "You sense " + name + " somewhere in the vincinity.");
- ELSE (distance = rdistance(location(caster), location(partner));
- dir = dir_towards(location(caster), location(partner), 1);
- IF (distance < 3)
- THEN message(caster, "You sense " + name + " right next to you.");
- ELSE IF (distance < 30)
- THEN message(caster, "You sense " + name + " close by, towards the " + dir + ".");
- ELSE IF (distance < 200)
- THEN message(caster, "You sense " + name + " nearby, towards the " + dir + ".");
- ELSE message(caster, "You sense " + name + " in the " + dir + ".");
- )
-
-SPELL hide (target : PC) : "#A13" =
- LET level = 1
- school = ASTRAL
- IN (MANA 11, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["CottonCloth"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, SFX_DEFAULT, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_HIDE, 0, 0, 0, 0, 5000 + (spellpower * 2500));
- CALL gain_xp(2);
- message(target, "You are hidden!");
- IF (caster <> target) THEN message(caster, "You hid someone!");
- ATEND message(target, "You are no longer hidden.");
-
-#--------------------------------------------------------------------------------
-# Level 2 spells
-#--------------------------------------------------------------------------------
-
-
-SPELL fire-ball : "#W22" =
- LET level = 2
- school = WAR
- IN (MANA 30, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["PileOfAsh"])
- => EFFECT CALL adjust_spellpower(school);
- damage = min(50 + skill(caster, school) * 40,
- 30 + ((spellpower * 3) / 2));
- damage_bonus = level(caster) + spellpower * 2;
- radius = 2 + spellpower / 50;
- CALL install_attack_spell(1 + spellpower / 60,
- 5000,
- 10, 31);
- ATTRIGGER CALL attack_check(target);
- loc = location(target);
- #WAIT 500;
- sfx(loc, 16, 0);
- FOREACH TARGET target IN rbox(loc, radius)
- DO IF line_of_sight(loc, location(target))
- THEN (divisor = (3 + rdistance(loc, location(target)));
- CALL elt_damage (target, (damage * 3) / divisor, (damage_bonus * 3) / divisor, ELT_WATER, ELT_FIRE, 15);
- )
-
-SPELL summon-partner : "#A23" =
- LET level = 2
- school = ASTRAL
- IN (MANA 30, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_married(caster),
- REQUIRE is_equipped(caster, "WeddingRing"))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (failed (partner (caster)))
- THEN message (caster, "You call out for your partner, but there is no response.");
- ELSE (message (caster, "You call out for " + (name_of (partner (caster))) + ".");
- message (partner(caster), name_of(caster) + " is calling for your aid!");
- sfx(partner(caster), 2, 0);
- WAIT (max (5000, 30000 - (spellpower * 60)));
- IF (failed (partner (caster)))
- THEN message (caster, "Your partner has abandoned you.");
- ELSE IF (is_dead (partner (caster)))
- THEN message (caster, "Something seems to have happened to " + (name_of(partner(caster))) + ".");
- ELSE (sfx(location(partner(caster)), SFX_TELEPORT, 0);
- dest = awayfrom(location(caster), random_dir(1), 1);
- warp(partner(caster), dest);
- sfx(dest, SFX_TELEPORT, 0);
- )
- )
-
-
-#--------------------------------------------------------------------------------
-# Level 1 (magic level 2)
-#--------------------------------------------------------------------------------
-LOCAL SPELL summon-cow : "#A32" =
- LET level = 1
- school = ASTRAL
- IN (MANA 33, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- CALL summon_spell(1021, 1 + spellpower / 120, 5000 - (spellpower * 9), spellpower * 400, 2);
-
-LOCAL SPELL summon-bats : "#kalbalark" =
- LET level = 1
- school = ASTRAL
- IN (MANA 25, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["BatTeeth", "BatWing", "BatTeeth", "BatWing", "BatTeeth", "BatWing", "BatTeeth", "BatWing", "BatTeeth", "BatWing", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(2);
- mob = 1017;
- IF(check_status_change(caster,200))
- THEN mob = 1021;
- CALL summon_spell(mob,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 5),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-
-#--------------------------------------------------------------------------------
-# Level 2 (magic level 3)
-#--------------------------------------------------------------------------------
-
-LOCAL SPELL summon-whiteghost : "#kalshiro" =
- LET level = 2
- school = ASTRAL
- IN (MANA 25, CASTTIME 30000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["YggdrasilHerb", "YggdrasilHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(10);
- CALL summon_spell(1119,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 5),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-LOCAL SPELL summon-cobaltghost : "#kalbaoi" =
- LET level = 2
- school = ASTRAL
- IN (MANA 25, CASTTIME 30000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["CobaltHerb", "CobaltHerb", "CobaltHerb", "CobaltHerb", "CobaltHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(10);
- CALL summon_spell(1120,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 10),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-LOCAL SPELL summon-mauveghost : "#kaliziorn" =
- LET level = 2
- school = ASTRAL
- IN (MANA 25, CASTTIME 30000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["MauveHerb", "MauveHerb", "MauveHerb", "MauveHerb", "MauveHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL gain_xp(10);
- CALL summon_spell(1121,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 10),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-
-LOCAL SPELL summon-alizaringhost : "#kalizeden" =
- LET level = 2
- school = ASTRAL
- IN (MANA 25, CASTTIME 30000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["AlizarinHerb", "AlizarinHerb", "AlizarinHerb", "AlizarinHerb", "AlizarinHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL gain_xp(10);
- CALL summon_spell(1122,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 10),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-LOCAL SPELL summon-gambogeghost : "#kalambodge" =
- LET level = 2
- school = ASTRAL
- IN (MANA 25, CASTTIME 30000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [5 * "GambogeHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(10);
- CALL summon_spell(1123,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 10),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-
-
-#--------------------------------------------------------------------------------
-# Level 4 spells
-#--------------------------------------------------------------------------------
-
-SPELL shroud : "#N40" =
- LET level = 4
- school = NATURE
- IN (MANA 40, CASTTIME 400,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL default_effect();
- shroud(caster, 0x04);
-
-SPELL teleport (destination : STRING) : "#A40" =
- LET level = 4
- school = ASTRAL
- IN (MANA 80, CASTTIME 400,
- # COMPONENT ["EtherEssence"],
- # CATALYST ["TeleportCrystal"],
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL default_effect();
- WAIT 1000 + (200000 / (spellpower + 10));
- sfx(location(caster), SFX_TELEPORT, 200);
- warp(caster, random_location(anchor(destination)));
- sfx(caster, SFX_TELEPORT, 200);
-
-#--------------------------------------------------------------------------------
-# Debug keywords
-#--------------------------------------------------------------------------------
-
-SPELL debug : "debug" =
- REQUIRE DEBUG
- => EFFECT message (caster, "FLAGS: "
- + "drank=" + ((script_int(caster, "MAGIC_FLAGS") & 1) > 0) + ", "
- + "Kmseed=" + ((script_int(caster, "MAGIC_FLAGS") & 2) > 0) + ", "
- + "touched-mseed=" + ((script_int(caster, "MAGIC_FLAGS") & 4) > 0) + ", "
- + "mseed-max=" + ((script_int(caster, "MAGIC_FLAGS") & 8) > 0) + ", "
- + "Kauldsbel=" + ((script_int(caster, "MAGIC_FLAGS") & 16) > 0) + ", "
- + "Kwyara=" + ((script_int(caster, "MAGIC_FLAGS") & 32) > 0) + ", "
- + "Ksagatha=" + ((script_int(caster, "MAGIC_FLAGS") & 64) > 0) + ", "
- + "Kmpotion=" + ((script_int(caster, "MAGIC_FLAGS") & 128) > 0) + ", "
- + "mseed-rumour=" + ((script_int(caster, "MAGIC_FLAGS") & 256) > 0) + ", "
- + "Kcuttree=" + ((script_int(caster, "MAGIC_FLAGS") & 512) > 0) + ", "
- + "cut=" + ((script_int(caster, "MAGIC_FLAGS") & 1024) > 0) + ", "
- + "Kdruidtree=" + ((script_int(caster, "MAGIC_FLAGS") & 2048) > 0) + ", "
- + "Kimp=" + ((script_int(caster, "MAGIC_FLAGS") & 4096) > 0) + ", "
- + "Koldwiz=" + ((script_int(caster, "MAGIC_FLAGS") & 8192) > 0) + ", "
- + "made-conc=" + ((script_int(caster, "MAGIC_FLAGS") & 16384) > 0) + ", "
- + "elanore-omar=" + ((script_int(caster, "MAGIC_FLAGS") & 32768) > 0));
- message (caster, "EXP: " + (script_int(caster, "MAGIC_EXPERIENCE") & 0xffff)
- + ", lastspell=" + ((script_int(caster, "MAGIC_EXPERIENCE") >> 16) & 0xff)
- + ", healexp=" + ((script_int(caster, "MAGIC_EXPERIENCE") >> 24) & 0xff));
- message (caster, "STATUS: "
- + "auldsbel:" + (script_int(caster, "QUEST_MAGIC") & 0x1f) + "," + ((script_int(caster, "QUEST_MAGIC") >> 5) & 0x7) + ", "
- + "dt/mb:" + ((script_int(caster, "QUEST_MAGIC") >> 8) & 0xf) + ", "
- + "s-unhappy:" + ((script_int(caster, "QUEST_MAGIC") >> 12) & 0xf) + ", "
- + "sagatha:" + ((script_int(caster, "QUEST_MAGIC") >> 16) & 0xff) + ", "
- + "swords:" + ((script_int(caster, "QUEST_MAGIC") >> 24) & 0xff) + ", "
- + "imp:" + ((script_int(caster, "QUEST_MAGIC2") >> 0) & 0xf) + ", "
- + "elanore:" + ((script_int(caster, "QUEST_MAGIC2") >> 4) & 0xf) + ", "
- + "elanore-sub:" + ((script_int(caster, "QUEST_MAGIC2") >> 12) & 0xf) + ", "
- + "wyara:" + ((script_int(caster, "QUEST_MAGIC2") >> 8) & 0xf));
-
-PROCEDURE debug_xmod(name, mask, shift, gain) =
- value = ((script_int(caster, name) >> shift) & mask) + gain;
- IF (value < 0)
- THEN value = 0;
- IF (value > mask)
- THEN value = mask;
- CALL set_var(name, mask, shift, value);
-
-PROCEDURE debug_mod(name, delta) =
- IF (name = "mexp") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xffff, 0, delta);
- ELSE IF (name = "lastspell") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xff, 16, delta);
- ELSE IF (name = "healexp") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xff, 24, delta);
- ELSE IF (name = "drank") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 0, delta);
- ELSE IF (name = "Kmseed") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 1, delta);
- ELSE IF (name = "touched-mseed") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 2, delta);
- ELSE IF (name = "mseed-max") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 3, delta);
- ELSE IF (name = "Kauldsbel") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 4, delta);
- ELSE IF (name = "Kwyara") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 5, delta);
- ELSE IF (name = "Ksagatha") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 6, delta);
- ELSE IF (name = "Kmpotion") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 7, delta);
- ELSE IF (name = "mseed-rumour") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 8, delta);
- ELSE IF (name = "Kcuttree") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 9, delta);
- ELSE IF (name = "cut") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 10, delta);
- ELSE IF (name = "Kdruidtree") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 11, delta);
- ELSE IF (name = "Kimp") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 12, delta);
- ELSE IF (name = "oldwiz") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 13, delta);
- ELSE IF (name = "made-conc") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 14, delta);
- ELSE IF (name = "elanore-omar") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 15, delta);
- ELSE IF (name = "auldsbel") THEN CALL debug_xmod("QUEST_MAGIC", 0x1f, 0, delta);
- ELSE IF (name = "Qauldsbel") THEN CALL debug_xmod("QUEST_MAGIC", 0x7, 5, delta);
- ELSE IF (name = "dt") THEN CALL debug_xmod("QUEST_MAGIC", 0x3, 10, delta);
- ELSE IF (name = "mb") THEN CALL debug_xmod("QUEST_MAGIC", 0x3, 8, delta);
- ELSE IF (name = "s-unhappy") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 12, delta);
- ELSE IF (name = "sagatha") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 16, delta);
- ELSE IF (name = "swords") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 24, delta);
- ELSE IF (name = "imp") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 0, delta);
- ELSE IF (name = "elanore") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 4, delta);
- ELSE IF (name = "wyara") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 8, delta);
- ELSE IF (name = "elanore-sub") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 12, delta);
- ELSE message(caster, "Unknown");
-
-SPELL debug-up1 (name : STRING) : "debug+1" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 1);
-
-SPELL debug-down1 (name : STRING) : "debug-1" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 1);
-
-SPELL debug-up16 (name : STRING) : "debug+16" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 16);
-
-SPELL debug-down16 (name : STRING) : "debug-16" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 16);
-
-SPELL debug-up256 (name : STRING) : "debug+256" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 256);
-
-SPELL debug-down256 (name : STRING) : "debug-256" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 256);
-
-SPELL debug-reset : "debug-reset" =
- REQUIRE DEBUG
- => EFFECT set_script_variable(caster, "QUEST_MAGIC", 0);
- set_script_variable(caster, "QUEST_MAGIC2", 0);
- set_script_variable(caster, "MAGIC_FLAGS", 0);
- set_script_variable(caster, "MAGIC_EXP", 0);
-
-
-#--------------------------------------------------------------------------------
-# Special-purpose quasispells
-#--------------------------------------------------------------------------------
-
-CONST MIN_MARRY_LEVEL = 32;
-
-NONMAGIC SILENT SPELL marriage (target : PC) : "marry" =
- (REQUIRE (is_in(location(caster), @("014-1.gat", 28,39) @+ (8, 6)) || is_in(location(caster), @("021-2.gat", 20,25) @+ (4, 4)) ))=>
- EFFECT IF target == caster # no valid target or tried to marry self?
- THEN ABORT;
-
- IF (level(caster) < MIN_MARRY_LEVEL)
- THEN (message(caster, "You must be level " + MIN_MARRY_LEVEL + " or higher to marry!"); ABORT;)
-
- IF (level(target) < MIN_MARRY_LEVEL)
- THEN (message(caster, "Your partner must be level " + MIN_MARRY_LEVEL + " or higher to marry!"); ABORT;)
-
- IF partner(caster) = target
- THEN (message(caster, "You and " + name_of(target) + " are already married."); ABORT;)
-
- IF is_married(caster)
- THEN (message(caster, "You are already married!"); ABORT;)
-
- IF is_married(target)
- THEN (message(caster, name_of(target) + " is already married."); ABORT;);
-
- IF distance(location(caster), location(target)) <> 1
- THEN (message(caster, "You need to stand next to each other."); ABORT;);
-
- IF (count_item(caster, "WeddingRing") == 0 || count_item(target, "WeddingRing") == 0)
- THEN (message(caster, "You must both be wearing your wedding rings!"); ABORT;)
-
- script_target = target;
- {
- announce @caster_name$ + " is asking " + strcharinfo(0) + " for marriage.", 2;
- mes @caster_name$ + " wishes to marry you.";
- mes "Do you accept?";
- next;
- menu "Yes, I do!", L_yes,
- "No.", -;
- close;
-
- L_yes:
- if marriage(@caster_name$)
- announce @caster_name$ + " and " + strcharinfo(0) + " are now married!", 0;
- close;
- }
-
- IF not (is_married(caster))
- THEN message(caster, name_of(target) + " turned down your marriage offer.");
-
-# SPELL change-hair-colour (colour : STRING) : "trapa" =
-# (MANA 20) => EFFECT IF colour = "nworbl"
-# THEN x = 0; # light brown
-# ELSE IF colour = "der"
-# THEN x = 1; # red
-# ELSE IF colour = "neerg"
-# THEN x = 2; # green
-# ELSE IF colour = "elprup"
-# THEN x = 3; # purple
-# ELSE IF colour = "yerg"
-# THEN x = 4; # grey
-# ELSE IF colour = "wolley"
-# THEN x = 5; # yellow
-# ELSE IF colour = "eulb"
-# THEN x = 6; # blue
-# ELSE IF colour = "nwrob"
-# THEN x = 7; # brown
-# ELSE IF colour = "elpropl"
-# THEN x = 8; # light purple
-# ELSE IF colour = "elpropd"
-# THEN x = 9; # dark purple
-# ELSE x = random(10);
-# sfx(caster, 2, 0);
-# set_hair_colour(caster, x);
-
-
-# SPELL trick-or-treat : "trick-or-treat" =
-# (CASTTIME 30000, MANA 20,
-# COMPONENTS [ "BugLeg" ]) => EFFECT IF (random(2))
-# THEN (sfx(caster, 2, 0);
-# FOR i = 0 TO random(10) DO
-# drop_item_for (random_location(rbox(location(caster), 5)),
-# "Candy", 1, 10000 + random(10000), caster, 3000);
-# FOR i = 0 TO random(10) DO
-# drop_item_for (random_location(rbox(location(caster), 5)),
-# "ChocolateBar", 1, 10000 + random(10000), caster, 3000);
-# )
-# ELSE (sfx(caster, 5, 0);
-# message(caster, "No treat for you!");
-# spawn(rbox(location(caster), 3), caster, 1010, 0, 1 + random(3), 10000 + random(20000));
-# FOREACH MOB target IN rbox(location(caster), 5) DO
-# (sfx(target, 5, 0);
-# aggravate(target, 0, caster);))
-
-
-LOCAL SPELL mouboo-groan : "#g" =
- (MANA 1,
- REQUIRE name_of(caster) = "MOUBOOTAUR") =>
- EFFECT FOREACH PC p IN rbox(location(caster), 200) DO
- distance = rdistance(location(caster), location(p));
- IF (distance < 15)
- THEN message(p, "The moubootaur's groaning rings in your ears!");
- ELSE IF (distance < 70)
- THEN message(p, "You hear a loud groaning noise, not far away...");
- ELSE message(p, "You hear an odd groaning noise in the distance...");
-
-
-LOCAL SPELL mouboo-smell : "#s" =
- (MANA 1,
- REQUIRE name_of(caster) = "MOUBOOTAUR") =>
- EFFECT WAIT 30000;
- FOREACH PC p IN rbox(location(caster), 30) DO
- message(p, "You notice a strange smell all around you.");
-
-
-PROCEDURE hug_tree(target) =
- IF (target = ""
- || target = "tree" || target = "tree*"
- || target = "Tree" || target = "Tree*"
- || target = "druid" || target = "druid*"
- || target = "Druid" || target = "Druid*")
- THEN {
- set @flag, 2;
- callfunc "QuestTreeTrigger";
- };
-
-NONMAGIC SPELL hug0 (target : STRING) : "hug" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug1 (target : STRING) : "*hug*" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug2 (target : STRING) : "*hug" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug3 (target : STRING) : "hugs" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug4 (target : STRING) : "*hugs*" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug5 (target : STRING) : "*hugs" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-
-#--------------------------------------------------------------------------------
-# Teleport anchors
-#--------------------------------------------------------------------------------
-
-TELEPORT-ANCHOR tulimshar : "tulimshar" = @("001-1.gat", 43, 66) @+ (3, 3);
-TELEPORT-ANCHOR hurnscald : "hurnscald" = @("009-1.gat", 55, 37) @+ (3, 3);
-TELEPORT-ANCHOR nivalis : "nivalis" = @("020-1.gat", 75, 63) @+ (19, 12);
-TELEPORT-ANCHOR wizardhut : "##00" = @("013-1.gat", 41, 92) @+ (3, 3);
-TELEPORT-ANCHOR pachua : "##01" = @("006-1.gat", 22, 101) @+ (3, 3);
-TELEPORT-ANCHOR desert : "##02" = @("005-1.gat", 160, 64) @+ (5, 5);
-TELEPORT-ANCHOR forest : "##03" = @("015-1.gat", 35, 35) @+ (40, 40);
-TELEPORT-ANCHOR snakecave : "##04" = @("011-4.gat", 50, 75) @+ (3, 3);
-TELEPORT-ANCHOR dimondscove : "##05" = @("010-2.gat", 23, 79) @+ (3, 3);
-
-
diff --git a/conf/magic.conf.tmw.template b/conf/magic.conf.tmw.template
deleted file mode 100644
index 931fb678a..000000000
--- a/conf/magic.conf.tmw.template
+++ /dev/null
@@ -1,1617 +0,0 @@
-# Special-purpose globals
-obscure_chance = 95
-min_casttime = 200
-
-# Schools of magic
-CONST MAGIC = 340
-CONST LIFE = 341
-CONST WAR = 342
-CONST TRANSMUTE = 343
-CONST NATURE = 344
-CONST ASTRAL = 345
-
-# Elements
-CONST ELT_NEUTRAL = 0
-CONST ELT_WATER = 1
-CONST ELT_EARTH = 2
-CONST ELT_FIRE = 3
-CONST ELT_WIND = 4
-CONST ELT_POISON = 5
-CONST ELT_SHADOW = 6
-CONST ELT_HOLY = 7
-CONST ELT_GHOST = 8
-CONST ELT_UNDEAD = 9
-
-# Status effects
-CONST SC_POISON = 132
-CONST SC_SHEARED = 194 # This is the same as SC_HIDE, since mobs can't hide and shearing is only used for mobs. Feel free to fix!
-CONST SC_HIDE = 194
-CONST SC_HALT_REGENERATE = 195
-CONST SC_FLYING_BACKPACK = 196
-CONST SC_MBARRIER = 197
-CONST SC_HASTE = 198
-CONST SC_PHYS_SHIELD = 199
-
-CONST SO_GMINVISIBLE = 4096
-
-# Special effects
-CONST SFX_DEFAULT = 10
-CONST SFX_SUMMON_START = 21
-CONST SFX_SUMMON_FIRE = 22
-CONST SFX_TELEPORT = 24
-CONST SFX_RAIN = 25
-CONST SFX_HIT = 25
-CONST SFX_ARROW_HAIL = 27
-CONST SFX_BARRIER = 10
-CONST SFX_UNBARRIER = 10
-CONST SFX_HEAL = 3
-
-CONST MAX_RAIN_SPELL_RADIUS = 15
-
-CONST MAX_MAGIC_LEVEL = 2 # Increase up to 5 as each new magic level is completed.
-
-CONST MAGIC_FLAGS = "MAGIC_FLAGS"
-CONST MFLAG_MADE_CONC_POTION = 16384
-CONST MFLAG_MADE_CONC_POTION_SHIFT = 14
-
-CONST SCRIPT_XP = "MAGIC_EXPERIENCE"
-CONST SCRIPT_XP_MASK = 0xffff
-CONST SCRIPT_XP_SHIFT = 0
-CONST SCRIPT_LASTSPELL_MASK = 0xff
-CONST SCRIPT_LASTSPELL_SHIFT = 16
-CONST SCRIPT_HEALSPELL_MASK = 0xff
-CONST SCRIPT_HEALSPELL_SHIFT = 24
-CONST DEBUG = 0
-
-CONST ATTACK_ICON_GENERIC = 2000
-CONST ATTACK_ICON_SHEARING = 2001
-
-# Default sfx on caster
-PROCEDURE default_effect() =
- sfx(caster, school - MAGIC + 2, 0);
-
-PROCEDURE sfx_generic(target) =
- sfx(target, SFX_DEFAULT, 0);
-
-PROCEDURE set_var(name, mask, shift, value) =
- set_script_variable(caster, name, script_int(caster, name) & (neg (mask << shift)) | ((value & mask) << shift));
-
-PROCEDURE gain_heal_xp(value, # How many HP we healed
- gain, # how many life magic experience points we can potentially gain
- heal_xp_value_divisor, # 1 for instaheal, 2 for slow heal
- base_exp_factor) = # factor for how many base experience points (max) the player should be allowed to gain
- last_heal_xp = (script_int(caster, SCRIPT_XP) >> SCRIPT_HEALSPELL_SHIFT) & SCRIPT_HEALSPELL_MASK;
- IF (target <> caster
- && (value / heal_xp_value_divisor) > (10 + last_heal_xp + random(last_heal_xp + 1) + random(last_heal_xp + 1)))
- THEN (
- heal_xp = last_heal_xp + gain;
- IF (heal_xp > SCRIPT_HEALSPELL_MASK)
- THEN heal_xp = SCRIPT_HEALSPELL_MASK;
- CALL set_var(SCRIPT_XP, SCRIPT_HEALSPELL_MASK, SCRIPT_HEALSPELL_SHIFT, heal_xp);
- )
- IF target <> caster
- THEN gain_experience(caster, base_exp_factor * extract_healer_experience(target, value), 0, 1);
-
-PROCEDURE gain_xp(gain) =
- IF (level + 3 > skill(caster, MAGIC)) # Level 4 and 5 magic users don't gain anything from spell levels 0 resp. 0+1
- THEN (
- index = spell_index(self_spell);
- last_index = (script_int(caster, SCRIPT_XP) >> SCRIPT_LASTSPELL_SHIFT) & SCRIPT_LASTSPELL_MASK;
- last_xp = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- IF (index != last_index)
- THEN ( # Some variation observed
- xp = last_xp + gain;
- IF (xp > SCRIPT_XP_MASK)
- THEN xp = SCRIPT_XP_MASK;
- CALL set_var(SCRIPT_XP, SCRIPT_XP_MASK, SCRIPT_XP_SHIFT, xp);
- CALL set_var(SCRIPT_XP, SCRIPT_LASTSPELL_MASK, SCRIPT_LASTSPELL_SHIFT, index);
- IF DEBUG THEN message(caster, "Spell xp = " + xp);
- ) ELSE IF DEBUG THEN message(caster, "Re-cast same spell, xp remain at " + last_xp);
- )
-
-PROCEDURE create_item(good_item, count, bad_item, difficulty) =
- success = 1;
- score = experience + random(min(spellpower, (experience / 3) + 1));
- IF (score >= difficulty)
- THEN create_item(caster, good_item, count);
- ELSE (
- success = 0;
- score = score + random(luk(caster)) + random(luk(caster));
- IF (score < difficulty / 3)
- THEN (
- message(caster, "Your spell backfires!");
- IF (random(110) < (luk(caster)))
- THEN itemheal(caster, 0 - ((level + 1) * (level + 2) * (3 + random(28))), 0);
- ELSE itemheal(caster, 0 - (level + 1), 0);
- ) ELSE IF (score < (difficulty * 2) / 3)
- THEN (
- IF random(5) = 0
- THEN (message(caster, "Your spell solidifies into the shape of a mysterious object!");
- create_item(caster, "Iten", 1);)
- ELSE message(caster, "Your spell escapes!");
- ) ELSE (
- message(caster, "Your spell takes on a mind of its own!");
- IF random(3) = 0
- THEN create_item(caster, bad_item, 1);
- )
- )
-
-# Increase spellpower by school and general magic skill
-PROCEDURE adjust_spellpower(school) =
- experience = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- spellpower = spellpower + (skill(caster, MAGIC) + skill(caster, school)) * 10;
- # Below, we adjust by special items
- IF (not(failed(target)) && (school = LIFE || school = NATURE))
- THEN IF (target)
- THEN IF (pc(target) = partner(caster))
- THEN (spellpower = spellpower + 200;
- IF is_equipped(caster, "WeddingRing")
- THEN spellpower = spellpower + 50;
- IF is_equipped(pc(target), "WeddingRing")
- THEN spellpower = spellpower + 50;)
-
-PROCEDURE heal(target, max_heal) =
- CALL default_effect();
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0);
- power = spellpower + vit(caster);
- power = min(max_heal, (max_heal * power) / 250);
- itemheal(target, power, 0);
-
-# Goes through instaheal instead of itemheal
-PROCEDURE quickheal(target, power) =
- CALL default_effect();
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0);
- instaheal(target, power, 0);
-
-# Can attack the target? Imports attack_range from dynamic environment
-PROCEDURE attack_check(target) =
- IF (not (line_of_sight(location(caster), location(target))))
- THEN ABORT;
- IF (not (rdistance(location(caster), location(target)) <= attack_range))
- THEN ABORT;
-
-# Cause elemental damage. bonus_elt grants an attack bonus, malus_elt reduces the attack. `effect' is the sfx ID.
-PROCEDURE elt_damage(target, damage, dmgplus, bonus_elt, malus_elt, effect) =
- d = damage + random(dmgplus);
- IF (element(target) = malus_elt)
- THEN d = d / 3;
- IF (element(target) = bonus_elt)
- THEN d = (d * (4 + element_level(target))) / 4;
- #message(caster, "bonus=" + (element(target) = bonus_elt) + " malus=" + (element(target) = malus_elt) + " damage=" + damage + " + r(" + dmgplus + ") -> " + d);
- sfx(target, effect, 0);
- injure(caster, target, d, 0);
-
-PROCEDURE melee_damage(target, damage, dmgplus) =
- CALL attack_check(target);
- d = damage + random(dmgplus);
- evade = level(target) + mdef(target);
- IF (spellpower - random(100) < evade)
- THEN d = 0;
- injure(caster, target, d, 0);
-
-
-PROCEDURE install_attack_spell(charges, base_delay, range, attack_animation) =
- CALL default_effect();
- attack_range = range;
- override_attack(caster, charges, ((200 - agi(caster)) * base_delay) / 200,
- range, ATTACK_ICON_GENERIC, attack_animation, 0);
-
-PROCEDURE install_melee_spell(charges, base_delay, attack_animation) =
- CALL install_attack_spell(charges, base_delay, 1, attack_animation);
-
-PROCEDURE summon_spell(mob_id, count, delay, lifetime, control_level) =
- CALL default_effect();
- sfx(location, SFX_SUMMON_START, 0);
- WAIT delay;
- sfx(location, SFX_SUMMON_FIRE, 0);
- spawn(rbox(location, 2), caster, mob_id,
- if_then_else(skill(caster, ASTRAL) >= control_level, 2, 1), # pets when level is high enough
- count, lifetime);
-
-PROCEDURE abort_on_area_shield(pos) =
- IF (is_exterior(pos) = 1 && (map_nr(pos) = 1 # Tulimshar
- ||map_nr(pos) = 9 # Hurnscald
- ||map_nr(pos) = 20)) # Nivalis
- THEN (message(caster, "A powerful magic drains your spell just as it is beginning to take shape!");
- ABORT;)
-
-
-#--------------------------------------------------------------------------------
-# Level 0 spells
-#--------------------------------------------------------------------------------
-
-SPELL ask-magic-exp : "#G01" =
- LET level = 0
- school = MAGIC
- IN (MANA 1, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- level = skill (caster, MAGIC);
- experience = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK;
- IF (experience == SCRIPT_XP_MASK && level > 4)
- THEN message (caster, "You are as proficient at magic as you can possibly be.");
- ELSE (
- # This duplicates the table in mana-seed.txt
- IF level > 4
- THEN max_experience = SCRIPT_XP_MASK;
- ELSE IF level = 4
- THEN max_experience = 40000;
- ELSE IF level = 3
- THEN max_experience = 8000;
- ELSE IF level = 2
- THEN max_experience = 1200;
- ELSE max_experience = 100;
-
- ratio = (10 * experience - random(max_experience / 30)) / max_experience; #Randomness: jitter a bit at the transitions to give more precise information if used frequently
-
- IF ratio >= 45
- THEN message(caster, "Magic flows naturally from you, readily and with ease. Your understanding of what you can currently control at present is flawless, far beyond your requirements to cast magic at this level." + if_then_else(level >= MAX_MAGIC_LEVEL,""," Surely the Mana Seed will more than readily offer more magic for such a proficient user."));
- ELSE IF ratio >= 20
- THEN message(caster, "You have perfect control of what you understand now, but there is now a distinct sensation of something more, something indescribable. If only the Mana Seed would give more magic to you...");
- ELSE IF ratio >= 10
- THEN message(caster, "You feel in perfect control of your magic" + if_then_else(level >= MAX_MAGIC_LEVEL,".",", and seem on the verge of something more... perhaps you should see the Mana Seed to ask for more magic?"));
- ELSE IF ratio >= 9
- THEN message(caster, "You feel in almost perfect control of your magic.");
- ELSE IF ratio >= 8
- THEN message(caster, "You feel that you have very good control of your magic.");
- ELSE IF ratio >= 7
- THEN message(caster, "You feel quite in control of your magic.");
- ELSE IF ratio >= 6
- THEN message(caster, "You feel mostly in control of your magic.");
- ELSE IF ratio >= 5
- THEN message(caster, "You feel somewhat in control of your magic.");
- ELSE IF ratio >= 4
- THEN message(caster, "You feel you still have a few difficulties in controlling your magic.");
- ELSE IF ratio >= 3
- THEN message(caster, "Trying to control your magic is still rather troublesome.");
- ELSE IF ratio >= 2
- THEN message(caster, "You feel that you have only the bare minimum of control over your magic.");
- ELSE IF ratio >= 1
- THEN message(caster, "You feel quite overwhelmed by your magic, but are beginning to see patterns.");
- ELSE message (caster, "You feel completely overwhelmed by your magic.");
- )
-
-# SPELL ask-life-magic-exp : "#G02" =
-# LET level = 0
-# school = MAGIC
-# IN (MANA 1, CASTTIME 1000,
-# REQUIRE skill(caster, MAGIC) > level)
-# => EFFECT CALL adjust_spellpower(school);
-# CALL default_effect();
-# message(caster, "You have " + ((script_int(caster, "MAGIC_EXPERIENCE") >> 24) & 0xff) + " Life Magic Experience points.");
-
-SPELL transmute-wood-to-figurine (name : STRING) : "#T00" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 5, CASTTIME 4000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["RawLog"])
- => ( REQUIRE name = "boo" =>
- EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("MoubooFigurine", 1, "WarpedLog", 40);
- CALL gain_xp(1);
- | REQUIRE name = "lurk" =>
- EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("WarpedLog", 1, "WarpedLog", 40);
- message (caster, "You have no idea what a Skrytlurk looks like.");
- )
-
-
-SPELL make-sulphur : "#T01" =
- LET level = 0
- school = TRANSMUTE
- IN (MANA 4, CASTTIME 4000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["PileOfAsh"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("SulphurPowder", 1 + spellpower / 100 + (random(max(1, 800 - spellpower)) / 180), "PileOfAsh", 50);
- CALL gain_xp(1);
-
-SPELL lesser-heal (target : STRING) : "#L00" =
- LET level = 0
- school = LIFE
- IN (MANA 6, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)),
- (COMPONENTS ["Lifestone"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF failed(pc(target))
- THEN (IF ((target = "mouboo" || target = "Mouboo")
- && rdistance(location(caster), location(npc("Mouboo"))) < 2 + (spellpower / 100))
- THEN { mes "Your spell seems to have no effect on the mouboo."; close; }
- ELSE target = caster;)
- ELSE (target = pc(target);
- IF is_dead(target)
- THEN ABORT;)
- CALL gain_heal_xp(min(200, max_hp(target) - hp(target)), 1, 2, 2); # report half values for non-instaheal
- CALL heal(target, 200);
- CALL gain_xp(1);
-
-
-SPELL flare-dart : "#W00" =
- LET level = 0
- school = WAR
- IN (MANA 10, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- (REQUIRE skill(caster, school) > 2 OR COMPONENTS ["SulphurPowder"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- damage = 5 * sqrt(spellpower);
- damage_bonus = 5 + level(caster) / 3;
- CALL install_attack_spell(3 + spellpower / 50,
- 1200,
- 4, 31);
- CALL gain_xp(1);
- ATTRIGGER CALL attack_check(target);
- CALL elt_damage (target, damage, damage_bonus, ELT_WATER, ELT_FIRE, 15);
-
-
-SPELL magic-blade : "#W01" =
- LET level = 0
- school = WAR
- IN (MANA 9, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level)
- => ( COMPONENTS ["SharpKnife"] =>
- EFFECT CALL adjust_spellpower(WAR);
- CALL default_effect();
- CALL install_melee_spell(10 + spellpower / 15, 1200, 30);
- CALL gain_xp(1);
- ATTRIGGER CALL melee_damage(target, 60, 5 + str(caster));
- | COMPONENTS ["Knife"] =>
- EFFECT CALL adjust_spellpower(WAR);
- CALL default_effect();
- CALL install_melee_spell(10 + spellpower / 15, 1200, 30);
- CALL gain_xp(1);
- ATTRIGGER CALL melee_damage(target, 40, 5 + str(caster));
- )
-
-SPELL aggravate : "#N00" =
- LET level = 0
- school = NATURE
- IN (MANA 3, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH MOB target IN rbox(location(caster), 2 + spellpower / 50) DO
- IF line_of_sight(location(caster), location(target))
- THEN (CALL sfx_generic(target);
- aggravate(target, 0, caster);)
-
-SPELL grow-mauve : "#N01" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["MauveHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1029, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-alizarin : "#N02" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["AlizarinHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1032, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-gamboge : "#N03" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["GambogeHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1031, 1, skill(caster, school) / 2 + 1, 10000);
-
-SPELL grow-cobalt : "#N04" =
- LET level = 0
- school = NATURE
- IN (MANA 4, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["CobaltHerb", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- spawn(rbox(location, 2), caster, 1030, 1, skill(caster, school) / 2 + 1, 10000);
-
-
-LOCAL SPELL summon-maggots : "#A00" =
- LET level = 0
- school = ASTRAL
- IN (MANA 21, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- COMPONENTS ["MaggotSlime", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL gain_xp(1);
- CALL summon_spell(1002,
- 1 + ((sqrt(spellpower) + (spellpower / 15)) / 5),
- 5000 - (spellpower * 5),
- 10000 + (spellpower * 50), 1);
-
-SPELL detect-magic : "#G00" =
- LET level = 0
- school = MAGIC
- IN (MANA 3, CASTTIME 6000,
- REQUIRE skill(caster, MAGIC) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- range = 1 + spellpower / 50;
- FOREACH NPC n IN rbox(location(caster), range)
- DO IF (contains_string(name_of(n), "#MAGIC") || contains_string(name_of(n), "#_M"))
- THEN sfx(n, SFX_DEFAULT, 0);
- FOREACH SPELL s IN rbox(location(caster), range)
- DO IF (s <> self_invocation)
- THEN sfx(s, SFX_DEFAULT, 0);
-
-
-#--------------------------------------------------------------------------------
-# Level 1 spells
-#--------------------------------------------------------------------------------
-
-SPELL make-arrows : "#T10" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["RawLog"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("Arrow", 1 + spellpower / 40 + (random(max(1, 800 - spellpower)) / 80), "WarpedLog", 500);
- CALL gain_xp(1);
-
-SPELL make-shirt : "#T11" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [5 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("CottonShirt", 1, "CottonCloth", 425);
- CALL gain_xp(2);
-
-SPELL make-tanktop : "#T12" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [4 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("TankTop", 1, "CottonCloth", 350);
- CALL gain_xp(2);
-
-SPELL make-short-tanktop : "#T13" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS [3 * "CottonCloth"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("ShortTankTop", 1, "CottonCloth", 250);
- CALL gain_xp(2);
-
-SPELL make-iron-powder : "#T14" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["IronOre"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("IronPowder", 1 + spellpower / 140 + (random(max(1, 900 - spellpower)) / 220), "IronOre", 700);
- CALL gain_xp(3);
-
-SPELL make-concentration-potion : "#T15" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["BottleOfWater", 2 * "CobaltHerb", 2 * "PinkPetal"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item( if_then_else(random(2000 + experience) < experience, "ConcentrationPotion", "DarkConcentrationPotion"), 1,
- if_then_else(random(2), 744, "DarkConcentrationPotion"),
- 2000);
- IF (success)
- THEN CALL set_var(MAGIC_FLAGS, 1, MFLAG_MADE_CONC_POTION_SHIFT, 1);
- CALL gain_xp(4);
-
-SPELL merge-concentration-potions : "#T16" =
- LET level = 1
- school = TRANSMUTE
- IN (MANA 8, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["DarkConcentrationPotion", 744])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL create_item("ConcentrationPotion", 1, 744, 1000);
- message (caster, "success = " + success);
- IF (success)
- THEN CALL set_var(MAGIC_FLAGS, 1, MFLAG_MADE_CONC_POTION_SHIFT, 1);
- CALL gain_xp(4);
-
-
-SPELL lay-on-hands (target : STRING) : "#L10" =
- LET level = 1
- school = LIFE
- IN (MANA 10, CASTTIME 500,
- REQUIRE hp(caster) > max_hp(caster) / 20,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE if_then_else(failed(pc(target)), 1,
- (pc(target) <> caster)
- &&
- (rdistance(location(caster),
- location(pc(target))) < 2 + (spellpower / 50))
- && not (running_status_update(pc(target), SC_HALT_REGENERATE))
- ))
- => EFFECT CALL adjust_spellpower(school);
- IF (not (target)) THEN ABORT;
- IF failed(pc(target))
- THEN (IF ((target = "mouboo" || target = "Mouboo")
- && (rdistance(location(caster), location(npc("Mouboo"))) < 2 + (spellpower / 100)))
- THEN (needed = 1000;
- {
- set @spell, 1;
- callfunc "QuestMoubooHeal";
- })
- ELSE ABORT;
- )
- ELSE (target = pc(target);
- needed = max_hp(target) - hp(target);)
-
- pay_fraction = max(80, 200 - (vit(caster) + (spellpower / 10))); # Pay at least 40%
- payment = (needed * pay_fraction) / 200;
- available = hp(caster) - (max_hp(caster) / 20);
-
- IF payment < available
- THEN power = needed;
- ELSE (payment = available;
- power = (available * 200) / pay_fraction;
- )
- CALL gain_heal_xp(power, 1, 1, 3);
- CALL quickheal(target, power);
- status_change(caster, SC_HALT_REGENERATE, 0, 0, 0, 0, 10000);
- CALL gain_xp(min(4, payment / 100));
-
-SPELL lightning-strike : "#W10" =
- LET level = 1
- school = WAR
- IN (MANA 20, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["IronPowder"]))
- => EFFECT CALL adjust_spellpower(school);
- damage = spellpower;
- damage_bonus = 1 + spellpower / 2;
- CALL install_attack_spell(1 + spellpower / 90,
- 3000,
- 8, 31);
- CALL gain_xp(2);
- ATTRIGGER CALL attack_check(target);
- in_rain = 0;
- area = location(caster);
- FOREACH SPELL s IN rbox(location(caster), MAX_RAIN_SPELL_RADIUS + 1) DO
- IF name_of(s) = "rain" THEN (
- IF is_in (location(caster), s.area)
- THEN (in_rain = in_rain | 1;
- area = area + s.area;);
- IF is_in (location(target), s.area)
- THEN in_rain = in_rain | 2;
- );
- IF in_rain & 1
- THEN (# caster standing in the rain? This is going to be fun.
- used = 0;
- FOREACH TARGET t IN area DO
- IF (random(200) + luk(caster) > 175)
- THEN (used = used + 1;
- CALL elt_damage (t, damage / 6, 1 + (damage_bonus / 3), ELT_EARTH, ELT_WIND, 17 + random(3)););
- IF (not(used) || (random(200) + luk(caster) < 150))
- THEN (sfx(caster, 17 + random(3), 0);
- itemheal(caster, 0 - damage - (random(damage_bonus)), 0););
- ) ELSE
- CALL elt_damage (target, damage, damage_bonus, ELT_EARTH, ELT_WIND, 17 + random(3));
-
-LOCAL SPELL arrow-hail : "#W11" =
- LET level = 1
- school = WAR
- IN (MANA 25, CASTTIME 5000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_exterior(location(caster)),
- (COMPONENTS [20 * "Arrow"] OR COMPONENTS [20 * "IronArrow"]),
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SulphurPowder"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL abort_on_area_shield(location(caster));
-
- range = 7;
- area = rbox(awayfrom(location(caster), dir(caster), 1 + range), range);
-
- FOREACH SPELL s IN rbox(awayfrom(location(caster), dir(caster), 1 + range), range * 2) DO
- IF (s <> self_invocation) && (name_of(s) = "arrow-hail")
- THEN (message (caster, "A nearby arrow hail spell absorbs your magic!");
- ABORT;)
-
- damage = 125;
- damage_bonus = spellpower / 5;
- CALL gain_xp(2);
- FOR i = 0 TO spellpower / 8 DO (
- FOR j = 0 TO 2 DO (
- location = random_location(area);
- sfx(location, SFX_ARROW_HAIL, 0);
- done = 0;
- FOREACH TARGET target IN rbox(location, 0) DO (
- injure(caster, target, damage + random(damage_bonus) + random(damage_bonus), 0);
- done = 1;
- BREAK;
- )
- IF location(caster) = location && not(done)
- THEN (itemheal(caster, 0 - (damage + random(damage_bonus) + random(damage_bonus)), 0);
- sfx(caster, SFX_HIT, 0);
- )
- );
- WAIT 250 + random(50) + random(50);
- );
-
-SPELL magic-knuckles : "#W12" =
- LET level = 1
- school = WAR
- IN (MANA 20, CASTTIME 500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["Beer"]))
- =>
- EFFECT CALL adjust_spellpower(WAR);
- str = str(caster);
- CALL install_melee_spell(10 + spellpower / 10, 1300, 34);
- ATTRIGGER CALL melee_damage(target, 30, 5 + (str * 2));
-
-SPELL flying-backpack (target : PC) : "#N10" =
- LET level = 1
- school = NATURE
- IN (MANA 12, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SilkCocoon"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (caster <> target)
- THEN sfx(caster, 2, 0);
- status_change(target, SC_FLYING_BACKPACK, 0, 0, 0, 0, 5000 + (spellpower * 500));
- message (target, "Your backpack is lifted by a mystical force; you no longer feel it pressing on your back.");
- CALL gain_xp(1);
- ATEND message (target, "Your backpack is no longer levitating.");
- sfx(target, 2, 0);
-
-SPELL protect (target : PC) : "#N11" =
- LET level = 1
- school = NATURE
- IN (MANA 14, CASTTIME 1500,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["HardSpike"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, 11, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_PHYS_SHIELD, 5 + max(15, spellpower / 20), 0, 0, 0, 5000 + (spellpower * 1000));
- message (target, "You feel more protected.");
- CALL gain_xp(2);
- ATEND message (target, "You feel less protected.");
- sfx(target, 111, 0);
-
-SPELL happy-curse (target : PC) : "#N12" =
- LET level = 1
- school = NATURE
- IN (MANA 13, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["GingerBreadMan"]),
- REQUIRE rdistance(location(target), location(caster)) < 1 + spellpower / 100)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOR i = 0 TO (spellpower / 10) DO (emote(target, 3); WAIT 500;);
- CALL gain_xp(1);
-
-LOCAL SPELL rain : "#N13" =
- LET level = 1
- school = NATURE
- IN (MANA 17, CASTTIME 3000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_exterior(location(caster)),
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["BottleOfWater"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL abort_on_area_shield(location(caster));
- FOREACH SPELL s IN rbox(location(caster), MAX_RAIN_SPELL_RADIUS + 1) DO
- IF (s <> self_invocation) && (name_of(s) = "rain")
- THEN (message (caster, "A nearby raincloud absorbs your magic.");
- ABORT;)
-
- CALL gain_xp(1);
- range = min(MAX_RAIN_SPELL_RADIUS, 3 + min(spellpower, 200) / 30);
- area = rbox(location(caster), range);
- IF (is_in(location(npc("#DruidTree0#_M")), area)
- || is_in(location(npc("#DruidTree1#_M")), area))
- THEN {
- set @flag, 1;
- callfunc "QuestTreeTrigger";
- };
- FOR i = 0 TO (spellpower / 3) DO (
- FOR j = 0 TO min(spellpower / 2, 200) / 100 DO (
- location = random_location(area);
- sfx(location, SFX_RAIN, 0);
- FOREACH TARGET target IN rbox(location, 1) DO
- IF element(target) = ELT_FIRE
- THEN injure(caster, target, 2 + random(5 + spellpower / 15), 0);
- )
- WAIT 400 + random(100);
- );
-
-PROCEDURE shear-drop(target, target2, item, prob) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);)
-
-PROCEDURE shear-drop2(target, target2, item, prob, item2, prob2) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);
- ELSE CALL shear-drop(target, target2, item2, prob2 + prob);)
-
-PROCEDURE shear-drop3(target, target2, item, prob, item2, prob2, item3, prob3) =
- IF (target = name || target2 = name)
- THEN (IF (score < prob)
- THEN drop_item_for(place, item, 1, 60000, caster, 5000);
- ELSE CALL shear-drop2(target, target2, item2, prob2 + prob, item3, prob3 + prob);)
-
-
-SPELL shear : "#N14" =
- LET level = 1
- school = NATURE
- IN (MANA 23, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- override_attack (caster, 1, 2000, 1, ATTACK_ICON_SHEARING, 30, 0);
- ATTRIGGER IF not(is_pc(target))
- THEN (score = random (1000 - (random (spellpower))); # lower score -> more valuable item
- name = name_of(target);
- place = random_location(rbox(location(target), 1));
- IF running_status_update(target, SC_SHEARED)
- THEN ABORT;
- status_change(target, SC_SHEARED, 1, 1, 1, 1, 600000); # 10 minutes
- CALL shear-drop("Fluffy", "Fluffy", "WhiteFur", 300);
- CALL shear-drop("EasterFluffy", "Easter Fluffy", "WhiteFur", 300);
- CALL shear-drop("SpikyMushroom", "Spiky Mushroom", "HardSpike", 250);
- CALL shear-drop("Mouboo", "Mouboo", "CottonCloth", 175);
- CALL shear-drop("Cobalt", "CobaltPlant", "CobaltHerb", 700);
- CALL shear-drop("Alizarin", "AlizarinPlant", "AlizarinHerb", 700);
- CALL shear-drop("Gamboge", "GambogePlant", "GambogeHerb", 700);
- CALL shear-drop("Mauve", "MauvePlant", "MauveHerb", 700);
- CALL shear-drop("SilkWorm", "Silkworm", "SilkCocoon", 300);
- IF ((name = "Fluffy" || name = "Mouboo") && random(2))
- THEN { set @value, 1; callfunc "QuestSagathaHappy"; };
- )
-
-
-
-SPELL barrier (target : PC) : "#A10" =
- LET level = 1
- school = ASTRAL
- IN (MANA 16, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SmallMushroom"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, SFX_BARRIER, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_MBARRIER, 20 + max(30, spellpower / 8), 0, 0, 0, 2000 + (spellpower * 200));
- message (target, "You are surrounded by a magical barrier.");
- CALL gain_xp(3);
- ATEND message (target, "Your magical barrier dissipates.");
- sfx(target, SFX_UNBARRIER, 0);
-
-
-LOCAL SPELL summon-spiky-mushrooms : "#A11" =
- LET level = 1
- school = ASTRAL
- IN (MANA 33, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["HardSpike", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- CALL summon_spell(1019, 1 + spellpower / 120, 5000 - (spellpower * 9), spellpower * 400, 2);
-
-LOCAL SPELL summon-fluffies : "#A12" =
- LET level = 1
- school = ASTRAL
- IN (MANA 39, CASTTIME 20000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["WhiteFur", "Root"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- CALL gain_xp(1);
- CALL summon_spell(1020, 1 + spellpower / 170 + spellpower / 430, 5000 - (spellpower * 8), spellpower * 350, 3);
-
-
-SPELL detect-players : "#G10" =
- LET level = 1
- school = MAGIC
- IN (MANA 7, CASTTIME 300,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- message = "";
- FOREACH PC target IN rbox(location(caster), spellpower / 2)
- DO IF ((target <> caster)
- && not (running_status_update(pc(target), SC_HIDE))
- && not (status_option(target, SO_GMINVISIBLE)))
- THEN (IF message <> ""
- THEN message = message + ", ";
- message = message + name_of (target);
- IF spellpower > 99
- THEN message = message + "(" + level(target) + ")";
- )
- IF message = ""
- THEN message(caster, "You sense no-one else nearby.");
- ELSE message(caster, "You sense the following: " + message);
-
-SPELL reveal : "#G11" =
- LET level = 1
- school = MAGIC
- IN (MANA 18, CASTTIME 3000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- FOREACH PC target IN rbox(location(caster), 1 + spellpower / 100)
- DO IF has_shroud(target) && level(caster) * 2 > level(target)
- THEN (unshroud(target);
- sfx(target, SFX_DEFAULT, 500);)
-
-
-SPELL enchant-lifestone : "#G12" =
- LET level = 1
- school = MAGIC
- IN (MANA 15, CASTTIME 4000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (COMPONENTS["BugLeg"] OR COMPONENTS ["MaggotSlime"]
- OR COMPONENTS ["MauveHerb", "AlizarinHerb", "CobaltHerb", "GambogeHerb"]))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- create_item(caster, "Lifestone", 1);
- CALL gain_xp(1);
-
-SPELL sense-spouse : "#G13" =
- LET level = 1
- school = MAGIC
- IN (MANA 7, CASTTIME 400,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_married(caster),
- REQUIRE is_equipped(caster, "WeddingRing"))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (failed(partner(caster)) || not(is_equipped(partner(caster), "WeddingRing")))
- THEN (message(caster, "You cannot sense your partner.");
- ABORT;)
- partner = partner(caster);
- name = name_of(partner);
- IF (is_dead(partner) || (map_nr(location(partner)) <> map_nr(location(caster))))
- THEN (message(caster, "You cannot sense " + name + " nearby.");
- ABORT;)
- IF (map_level(location(partner)) > 2 && map_level(location(caster)) < map_level(location(partner)))
- THEN (message(caster, "You sense " + name + " somewhere below.");
- ABORT;)
- IF (map_level(location(caster)) > 2 && map_level(location(partner)) < map_level(location(caster)))
- THEN (message(caster, "You sense " + name + " somewhere above.");
- ABORT;)
- IF (map_level(location(caster)) <> map_level(location(partner)))
- THEN message(caster, "You sense " + name + " somewhere in the vincinity.");
- ELSE (distance = rdistance(location(caster), location(partner));
- dir = dir_towards(location(caster), location(partner), 1);
- IF (distance < 3)
- THEN message(caster, "You sense " + name + " right next to you.");
- ELSE IF (distance < 30)
- THEN message(caster, "You sense " + name + " close by, towards the " + dir + ".");
- ELSE IF (distance < 200)
- THEN message(caster, "You sense " + name + " nearby, towards the " + dir + ".");
- ELSE message(caster, "You sense " + name + " in the " + dir + ".");
- )
-
-SPELL hide (target : PC) : "#A13" =
- LET level = 1
- school = ASTRAL
- IN (MANA 11, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["CottonCloth"]),
- REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30)
- => EFFECT CALL adjust_spellpower(school);
- sfx(target, SFX_DEFAULT, 0);
- IF (caster <> target)
- THEN CALL default_effect();
- status_change(target, SC_HIDE, 0, 0, 0, 0, 5000 + (spellpower * 2500));
- CALL gain_xp(2);
- message(target, "You are hidden!");
- IF (caster <> target) THEN message(caster, "You hid someone!");
- ATEND message(target, "You are no longer hidden.");
-
-#--------------------------------------------------------------------------------
-# Level 2 spells
-#--------------------------------------------------------------------------------
-
-SPELL cure-poison (target : PC) : "#L20" =
- LET level = 2
- school = LIFE
- IN (MANA 15, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE (rdistance(location(caster),
- location(pc(target))) < 1 + (spellpower / 60)),
- COMPONENTS ["GambogeHerb"])
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (running_status_update (target, SC_POISON))
- THEN (CALL gain_heal_xp(40, 1, 2, 2);
- stop_status_change (target, SC_POISON);
- CALL gain_xp(2);
- IF caster <> target
- THEN sfx(target, SFX_HEAL, 0););
-
-
-SPELL fire-ball : "#W22" =
- LET level = 2
- school = WAR
- IN (MANA 30, CASTTIME 1000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- COMPONENTS ["PileOfAsh"])
- => EFFECT CALL adjust_spellpower(school);
- damage = min(50 + skill(caster, school) * 40,
- 30 + ((spellpower * 3) / 2));
- damage_bonus = level(caster) + spellpower * 2;
- radius = 2 + spellpower / 50;
- CALL install_attack_spell(1 + spellpower / 60,
- 5000,
- 10, 31);
- ATTRIGGER CALL attack_check(target);
- loc = location(target);
- #WAIT 500;
- sfx(loc, 16, 0);
- FOREACH TARGET target IN rbox(loc, radius)
- DO IF line_of_sight(loc, location(target))
- THEN (divisor = (3 + rdistance(loc, location(target)));
- CALL elt_damage (target, (damage * 3) / divisor, (damage_bonus * 3) / divisor, ELT_WATER, ELT_FIRE, 15);
- )
-
-SPELL summon-partner : "#A23" =
- LET level = 2
- school = ASTRAL
- IN (MANA 30, CASTTIME 2000,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level,
- REQUIRE is_married(caster),
- REQUIRE is_equipped(caster, "WeddingRing"))
- => EFFECT CALL adjust_spellpower(school);
- CALL default_effect();
- IF (failed (partner (caster)))
- THEN message (caster, "You call out for your partner, but there is no response.");
- ELSE (message (caster, "You call out for " + (name_of (partner (caster))) + ".");
- message (partner(caster), name_of(caster) + " is calling for your aid!");
- sfx(partner(caster), 2, 0);
- WAIT (max (5000, 30000 - (spellpower * 60)));
- IF (failed (partner (caster)))
- THEN message (caster, "Your partner has abandoned you.");
- ELSE IF (is_dead (partner (caster)))
- THEN message (caster, "Something seems to have happened to " + (name_of(partner(caster))) + ".");
- ELSE (sfx(location(partner(caster)), SFX_TELEPORT, 0);
- dest = awayfrom(location(caster), random_dir(1), 1);
- warp(partner(caster), dest);
- sfx(dest, SFX_TELEPORT, 0);
- )
- )
-
-
-
-#--------------------------------------------------------------------------------
-# Level 4 spells
-#--------------------------------------------------------------------------------
-
-SPELL shroud : "#N40" =
- LET level = 4
- school = NATURE
- IN (MANA 40, CASTTIME 400,
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL default_effect();
- shroud(caster, 0x04);
-
-SPELL teleport (destination : STRING) : "#A40" =
- LET level = 4
- school = ASTRAL
- IN (MANA 80, CASTTIME 400,
- # COMPONENT ["EtherEssence"],
- # CATALYST ["TeleportCrystal"],
- REQUIRE skill(caster, MAGIC) > level,
- REQUIRE skill(caster, school) > level)
- => EFFECT CALL default_effect();
- WAIT 1000 + (200000 / (spellpower + 10));
- sfx(location(caster), SFX_TELEPORT, 200);
- warp(caster, random_location(anchor(destination)));
- sfx(caster, SFX_TELEPORT, 200);
-
-#--------------------------------------------------------------------------------
-# Debug keywords
-#--------------------------------------------------------------------------------
-
-SPELL debug : "debug" =
- REQUIRE DEBUG
- => EFFECT message (caster, "FLAGS: "
- + "drank=" + ((script_int(caster, "MAGIC_FLAGS") & 1) > 0) + ", "
- + "Kmseed=" + ((script_int(caster, "MAGIC_FLAGS") & 2) > 0) + ", "
- + "touched-mseed=" + ((script_int(caster, "MAGIC_FLAGS") & 4) > 0) + ", "
- + "mseed-max=" + ((script_int(caster, "MAGIC_FLAGS") & 8) > 0) + ", "
- + "Kauldsbel=" + ((script_int(caster, "MAGIC_FLAGS") & 16) > 0) + ", "
- + "Kwyara=" + ((script_int(caster, "MAGIC_FLAGS") & 32) > 0) + ", "
- + "Ksagatha=" + ((script_int(caster, "MAGIC_FLAGS") & 64) > 0) + ", "
- + "Kmpotion=" + ((script_int(caster, "MAGIC_FLAGS") & 128) > 0) + ", "
- + "mseed-rumour=" + ((script_int(caster, "MAGIC_FLAGS") & 256) > 0) + ", "
- + "Kcuttree=" + ((script_int(caster, "MAGIC_FLAGS") & 512) > 0) + ", "
- + "cut=" + ((script_int(caster, "MAGIC_FLAGS") & 1024) > 0) + ", "
- + "Kdruidtree=" + ((script_int(caster, "MAGIC_FLAGS") & 2048) > 0) + ", "
- + "Kimp=" + ((script_int(caster, "MAGIC_FLAGS") & 4096) > 0) + ", "
- + "Koldwiz=" + ((script_int(caster, "MAGIC_FLAGS") & 8192) > 0) + ", "
- + "made-conc=" + ((script_int(caster, "MAGIC_FLAGS") & 16384) > 0) + ", "
- + "elanore-omar=" + ((script_int(caster, "MAGIC_FLAGS") & 32768) > 0));
- message (caster, "EXP: " + (script_int(caster, "MAGIC_EXPERIENCE") & 0xffff)
- + ", lastspell=" + ((script_int(caster, "MAGIC_EXPERIENCE") >> 16) & 0xff)
- + ", healexp=" + ((script_int(caster, "MAGIC_EXPERIENCE") >> 24) & 0xff));
- message (caster, "STATUS: "
- + "auldsbel:" + (script_int(caster, "QUEST_MAGIC") & 0x1f) + "," + ((script_int(caster, "QUEST_MAGIC") >> 5) & 0x7) + ", "
- + "dt/mb:" + ((script_int(caster, "QUEST_MAGIC") >> 8) & 0xf) + ", "
- + "s-unhappy:" + ((script_int(caster, "QUEST_MAGIC") >> 12) & 0xf) + ", "
- + "sagatha:" + ((script_int(caster, "QUEST_MAGIC") >> 16) & 0xff) + ", "
- + "swords:" + ((script_int(caster, "QUEST_MAGIC") >> 24) & 0xff) + ", "
- + "imp:" + ((script_int(caster, "QUEST_MAGIC2") >> 0) & 0xf) + ", "
- + "elanore:" + ((script_int(caster, "QUEST_MAGIC2") >> 4) & 0xf) + ", "
- + "elanore-sub:" + ((script_int(caster, "QUEST_MAGIC2") >> 12) & 0xf) + ", "
- + "wyara:" + ((script_int(caster, "QUEST_MAGIC2") >> 8) & 0xf));
-
-PROCEDURE debug_xmod(name, mask, shift, gain) =
- value = ((script_int(caster, name) >> shift) & mask) + gain;
- IF (value < 0)
- THEN value = 0;
- IF (value > mask)
- THEN value = mask;
- CALL set_var(name, mask, shift, value);
-
-PROCEDURE debug_mod(name, delta) =
- IF (name = "mexp") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xffff, 0, delta);
- ELSE IF (name = "lastspell") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xff, 16, delta);
- ELSE IF (name = "healexp") THEN CALL debug_xmod("MAGIC_EXPERIENCE", 0xff, 24, delta);
- ELSE IF (name = "drank") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 0, delta);
- ELSE IF (name = "Kmseed") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 1, delta);
- ELSE IF (name = "touched-mseed") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 2, delta);
- ELSE IF (name = "mseed-max") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 3, delta);
- ELSE IF (name = "Kauldsbel") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 4, delta);
- ELSE IF (name = "Kwyara") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 5, delta);
- ELSE IF (name = "Ksagatha") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 6, delta);
- ELSE IF (name = "Kmpotion") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 7, delta);
- ELSE IF (name = "mseed-rumour") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 8, delta);
- ELSE IF (name = "Kcuttree") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 9, delta);
- ELSE IF (name = "cut") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 10, delta);
- ELSE IF (name = "Kdruidtree") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 11, delta);
- ELSE IF (name = "Kimp") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 12, delta);
- ELSE IF (name = "oldwiz") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 13, delta);
- ELSE IF (name = "made-conc") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 14, delta);
- ELSE IF (name = "elanore-omar") THEN CALL debug_xmod("MAGIC_FLAGS", 0x1, 15, delta);
- ELSE IF (name = "auldsbel") THEN CALL debug_xmod("QUEST_MAGIC", 0x1f, 0, delta);
- ELSE IF (name = "Qauldsbel") THEN CALL debug_xmod("QUEST_MAGIC", 0x7, 5, delta);
- ELSE IF (name = "dt") THEN CALL debug_xmod("QUEST_MAGIC", 0x3, 10, delta);
- ELSE IF (name = "mb") THEN CALL debug_xmod("QUEST_MAGIC", 0x3, 8, delta);
- ELSE IF (name = "s-unhappy") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 12, delta);
- ELSE IF (name = "sagatha") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 16, delta);
- ELSE IF (name = "swords") THEN CALL debug_xmod("QUEST_MAGIC", 0xff, 24, delta);
- ELSE IF (name = "imp") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 0, delta);
- ELSE IF (name = "elanore") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 4, delta);
- ELSE IF (name = "wyara") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 8, delta);
- ELSE IF (name = "elanore-sub") THEN CALL debug_xmod("QUEST_MAGIC2", 0xf, 12, delta);
- ELSE message(caster, "Unknown");
-
-SPELL debug-up1 (name : STRING) : "debug+1" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 1);
-
-SPELL debug-down1 (name : STRING) : "debug-1" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 1);
-
-SPELL debug-up16 (name : STRING) : "debug+16" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 16);
-
-SPELL debug-down16 (name : STRING) : "debug-16" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 16);
-
-SPELL debug-up256 (name : STRING) : "debug+256" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 256);
-
-SPELL debug-down256 (name : STRING) : "debug-256" =
- REQUIRE DEBUG
- => EFFECT CALL debug_mod(name, 0 - 256);
-
-SPELL debug-reset : "debug-reset" =
- REQUIRE DEBUG
- => EFFECT set_script_variable(caster, "QUEST_MAGIC", 0);
- set_script_variable(caster, "QUEST_MAGIC2", 0);
- set_script_variable(caster, "MAGIC_FLAGS", 0);
- set_script_variable(caster, "MAGIC_EXP", 0);
-
-
-#--------------------------------------------------------------------------------
-# Special-purpose quasispells
-#--------------------------------------------------------------------------------
-
-CONST MIN_MARRY_LEVEL = 32;
-
-NONMAGIC SILENT SPELL marriage (target : PC) : "marry" =
- (REQUIRE (is_in(location(caster), @("014-1.gat", 28,39) @+ (8, 6)) || is_in(location(caster), @("021-2.gat", 20,25) @+ (4, 4)) ))=>
- EFFECT IF target == caster # no valid target or tried to marry self?
- THEN ABORT;
-
- IF (level(caster) < MIN_MARRY_LEVEL)
- THEN (message(caster, "You must be level " + MIN_MARRY_LEVEL + " or higher to marry!"); ABORT;)
-
- IF (level(target) < MIN_MARRY_LEVEL)
- THEN (message(caster, "Your partner must be level " + MIN_MARRY_LEVEL + " or higher to marry!"); ABORT;)
-
- IF partner(caster) = target
- THEN (message(caster, "You and " + name_of(target) + " are already married."); ABORT;)
-
- IF is_married(caster)
- THEN (message(caster, "You are already married!"); ABORT;)
-
- IF is_married(target)
- THEN (message(caster, name_of(target) + " is already married."); ABORT;);
-
- IF distance(location(caster), location(target)) <> 1
- THEN (message(caster, "You need to stand next to each other."); ABORT;);
-
- IF (count_item(caster, "WeddingRing") == 0 || count_item(target, "WeddingRing") == 0)
- THEN (message(caster, "You must both be wearing your wedding rings!"); ABORT;)
-
- script_target = target;
- {
- announce @caster_name$ + " is asking " + strcharinfo(0) + " for marriage.", 2;
- mes @caster_name$ + " wishes to marry you.";
- mes "Do you accept?";
- next;
- menu "Yes, I do!", L_yes,
- "No.", -;
- close;
-
- L_yes:
- if marriage(@caster_name$)
- announce @caster_name$ + " and " + strcharinfo(0) + " are now married!", 0;
- close;
- }
-
- IF not (is_married(caster))
- THEN message(caster, name_of(target) + " turned down your marriage offer.");
-
-# SPELL change-hair-colour (colour : STRING) : "trapa" =
-# (MANA 20) => EFFECT IF colour = "nworbl"
-# THEN x = 0; # light brown
-# ELSE IF colour = "der"
-# THEN x = 1; # red
-# ELSE IF colour = "neerg"
-# THEN x = 2; # green
-# ELSE IF colour = "elprup"
-# THEN x = 3; # purple
-# ELSE IF colour = "yerg"
-# THEN x = 4; # grey
-# ELSE IF colour = "wolley"
-# THEN x = 5; # yellow
-# ELSE IF colour = "eulb"
-# THEN x = 6; # blue
-# ELSE IF colour = "nwrob"
-# THEN x = 7; # brown
-# ELSE IF colour = "elpropl"
-# THEN x = 8; # light purple
-# ELSE IF colour = "elpropd"
-# THEN x = 9; # dark purple
-# ELSE x = random(10);
-# sfx(caster, 2, 0);
-# set_hair_colour(caster, x);
-
-
-# SPELL trick-or-treat : "trick-or-treat" =
-# (CASTTIME 30000, MANA 20,
-# COMPONENTS [ "BugLeg" ]) => EFFECT IF (random(2))
-# THEN (sfx(caster, 2, 0);
-# FOR i = 0 TO random(10) DO
-# drop_item_for (random_location(rbox(location(caster), 5)),
-# "Candy", 1, 10000 + random(10000), caster, 3000);
-# FOR i = 0 TO random(10) DO
-# drop_item_for (random_location(rbox(location(caster), 5)),
-# "ChocolateBar", 1, 10000 + random(10000), caster, 3000);
-# )
-# ELSE (sfx(caster, 5, 0);
-# message(caster, "No treat for you!");
-# spawn(rbox(location(caster), 3), caster, 1010, 0, 1 + random(3), 10000 + random(20000));
-# FOREACH MOB target IN rbox(location(caster), 5) DO
-# (sfx(target, 5, 0);
-# aggravate(target, 0, caster);))
-
-
-LOCAL SPELL mouboo-groan : "#g" =
- (MANA 1,
- REQUIRE name_of(caster) = "MOUBOOTAUR") =>
- EFFECT FOREACH PC p IN rbox(location(caster), 200) DO
- distance = rdistance(location(caster), location(p));
- IF (distance < 15)
- THEN message(p, "The moubootaur's groaning rings in your ears!");
- ELSE IF (distance < 70)
- THEN message(p, "You hear a loud groaning noise, not far away...");
- ELSE message(p, "You hear an odd groaning noise in the distance...");
-
-
-LOCAL SPELL mouboo-smell : "#s" =
- (MANA 1,
- REQUIRE name_of(caster) = "MOUBOOTAUR") =>
- EFFECT WAIT 30000;
- FOREACH PC p IN rbox(location(caster), 30) DO
- message(p, "You notice a strange smell all around you.");
-
-
-CONST E10_FLAG_USED_FREE_WARP_SHIFT = 17
-
-#NONMAGIC SILENT SPELL easter (type : STRING) : "#m" =
-# (REQUIRE name_of(caster) == "Freeyorp") =>
-# EFFECT IF (type == "EE_RF") THEN (
-# {
-# doevent("Old Woman::OnReplenish");
-# }
-# ) ELSE IF (type == "EE_SUS") THEN (
-# {
-# doevent "Old Woman::OnManualStopTimer";
-# }
-# ) ELSE IF (type == "EE_INIT") THEN (
-# {
-# doevent "Old Woman::OnManualStartTimer";
-# }
-# ) ELSE IF (type == "BLOCKER_DISABLE") THEN (
-# {
-# set $Easter_2010_Npc_State2, ($Easter_2010_Npc_State2 & ~(E10_BARRIER_MASK << E10_BARRIER_SHIFT)) | (E10_BARRIER_OPEN << E10_BARRIER_SHIFT);
-# }
-# ) ELSE IF (type == "BLOCKER_ENABLE") THEN (
-# {
-# set $Easter_2010_Npc_State2, ($Easter_2010_Npc_State2 & ~(E10_BARRIER_MASK << E10_BARRIER_SHIFT)) | (E10_BARRIER_ACTIVE << E10_BARRIER_SHIFT);
-# }
-# ) ELSE message(caster, "Unknown action '" + type + "'!");
-
-# Invader spells
-
-#NONMAGIC SILENT SPELL easter-invader-init : "#i" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT warp(caster, @("028-1.gat", 139, 46));
-# {
-# gmcommand "@blvl -255";
-# gmcommand "@blvl 199";
-# gmcommand "@setmagic all 5 Xakelbael the Dark";
-# gmcommand "@allstats";
-# savepoint "028-1.gat", 130, 46;
-# }
-# create_item(caster, "DarkTalisman", 1);
-
-#NONMAGIC SILENT SPELL easter-invader-hide : "#h" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT { if (checkoption(4096)) goto L_toggle;
-# setoption(4096);
-# end;
-# L_toggle:
-# setoption(0);
-# end; };
-# warp(caster, location(caster));
-
-#NONMAGIC SILENT SPELL easter-invader-warp-taunt : "#o" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT warp(caster, @("009-1.gat", 48, 35));
-# WAIT 80;
-# sfx(caster, 32, 0);
-# WAIT 80;
-# FOREACH PC p IN rbox(location(caster), 50)
-# DO IF (p <> caster) THEN (
-# message(p, "A powerful explosion " + if_then_else(distance(location(caster), location(p)) < 10, "right around you nearly deafens you!", if_then_else(distance(location(caster), location(p)) < 30, "nearby shocks you!", "in the distance erupts... you're not sure of the source, but it will be something big...")));
-# itemheal(p, -1 - random(hp(p)), 0-(random(sp(p) >> 2)));
-# )
-# WAIT 1000;
-# FOREACH PC p IN rbox(location(caster), 15)
-# DO (
-# message(p, "As the smoke clears, you hear a distant, sickly laughing ringing in your ears...");
-# )
-
-#NONMAGIC SILENT SPELL easter-invader-warp-taunt-explosion : "#q" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT sfx(caster, 32, 0);
-# WAIT 100;
-# sfx(caster, 31, 0);
-# WAIT 30;
-# sfx(caster, 30, 0);
-# WAIT 30;
-# sfx(caster, 30, 0);
-# WAIT 20;
-# sfx(caster, 30, 0);
-# WAIT 10;
-# sfx(caster, 30, 0);
-# WAIT 10;
-
-#NONMAGIC SILENT SPELL easter-invader-warp-taunt-end : "#p" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT FOREACH PC p IN rbox(location(caster), 50) DO IF (p <> caster)
-# THEN ( script_target = p;
-# { gmcommand "@jump"; }
-# message(p, "A powerful force sends you flying!");
-# )
-# warp(caster, @("028-1.gat", 130, 46));
-
-
-#NONMAGIC SILENT SPELL easter-invader-attack-pulse : "#a" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT IF (script_int(caster, "InvState") == 1) THEN ( set_script_variable(caster, "InvState", 0); ABORT; );
-# set_script_variable(caster, "InvState", 1);
-# FOR i = 1 TO 500
-# DO ( sfx(caster, 31, 0);
-# WAIT 80;
-# FOREACH PC p IN rbox(location(caster), 4)
-# DO IF (p <> caster) THEN ( injure(caster, p, 30 - random(random(25)) - random(5) + random(i), 0); )
-# WAIT 420;
-# IF (script_int(caster, "InvState") == 0) THEN ABORT;
-# )
-# set_script_variable(caster, "InvState", 0);
-
-#NONMAGIC SILENT SPELL easter-invader-command : "#d" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT override_attack(caster, 3, ((200 - agi(caster)) * 5000) / 200,
-# 8, ATTACK_ICON_GENERIC, 31, 0);
-# ATTRIGGER CALL attack_check(target);
-# area = rbox(location(target), 8);
-# FOREACH MOB m IN area
-# DO (message(caster, "Class Id: " + mob_id(m));
-# IF (mob_id(m) = 1040 || mob_id(m) == 1042 || mob_id(m) == 1047) THEN (
-# CALL sfx_generic(m);
-# aggravate(m, 0, target);
-# )
-# )
-
-#NONMAGIC SILENT SPELL easter-invader-spike : "#w" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT FOR i = 1 TO 40
-# DO ( point = random_location(rbox(location(caster), sqrt(i) << 1));
-# IF (random(3))
-# THEN (sfx(point, 32, 0);
-# WAIT 50;
-# FOREACH PC p IN rbox(point, sqrt(i) >> 1)
-# DO IF (p <> caster)
-# THEN (injure(caster, p, i + random(i << 1), random(random(i)));)
-# ) ELSE (sfx(point, 31, 0);
-# WAIT 50;
-# FOREACH PC p IN rbox(point, sqrt(i))
-# DO IF (p <> caster)
-# THEN (injure(caster, p, i + random(i << 2), random(random(i)));)
-# )
-# WAIT 400 - (i << 3);
-# )
-
-#NONMAGIC SILENT SPELL easter-invader-jump (t : STRING) : "#j" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT IF not (status_option(caster, 4096)) THEN ( sfx(caster, 33, 0);
-# WAIT 200; );
-# IF (t == "r") THEN ( warp(caster, @("028-1.gat", 129, 46)); )
-# ELSE IF (t == "s") THEN ( warp(caster, @("028-1.gat", 69, 96)); )
-# ELSE IF (t == "c") THEN ( warp(caster, @("028-3.gat", 50, 58)); )
-# ELSE IF (t == "t") THEN ( warp(caster, @("009-1.gat", 48, 35)); )
-# ELSE { gmcommand "@jump"; };
-
-#NONMAGIC SILENT SPELL easter-invader-taunt-local (s : STRING) : "#l" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT FOREACH PC p IN rbox(location(caster), 20) DO message(p, s);
-
-#NONMAGIC SILENT SPELL easter-invader-taunt-global (s : STRING) : "#b" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT FOREACH PC p IN rbox(location(caster), 100) DO message(p, s);
-
-#NONMAGIC SILENT SPELL easter-invader-spawn : "#c" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT spawn(rbox(location(caster), 20), caster, 1040, random(random(5)), 1, 100000);
-# spawn(rbox(location(caster), 20), caster, 1042, random(random(5)), 1, 100000);
-# spawn(rbox(location(caster), 20), caster, 1047, random(random(5)), 1, 100000);
-
-NONMAGIC SILENT SPELL world-shift : "#S00" =
- (REQUIRE (script_int(caster, "Easter_2010_QuestState") >> 16) & 1 == 1 && (script_int(caster, "Easter_2010_QuestState") >> 7) & 3 == 2) => # Travel only works when you have both helped the doctor at least thrice and have defeated the invader - top level requirement.
- ( (REQUIRE count_item(caster, "DarkPetal")) # Allow unlimited travel with the petal
- => ((REQUIRE rdistance(location(caster), @("028-1.gat", 63, 67)) < 5) =>
- EFFECT sfx(location(caster), SFX_TELEPORT, 200);
- WAIT 8000;
- { savepoint "009-1", 52, 39; };
- warp(caster, @("009-1.gat", 55, 37));
- sfx(location(caster), SFX_TELEPORT, 200);
- |
- (REQUIRE map_nr(location(caster)) != 28) =>
- EFFECT inithp = hp(caster); // Store this value.
- sfx(location(caster), SFX_TELEPORT, 200);
- IF (map_nr(location(caster)) == 9 || map_nr(location(caster)) == 1 || map_nr(location(caster)) == 21 || map_nr(location(caster)) == 20) THEN WAIT 8000;
- ELSE WAIT 20000;
- IF (hp(caster) < inithp) THEN ABORT; // Cancel teleport if the player took damage during channel time (hacky, but for most purposes should work.)
- { savepoint "028-1", 63, 68; };
- warp(caster, @("028-1.gat", 63, 67));
- sfx(location(caster), SFX_TELEPORT, 200);
- )
- | (REQUIRE (rdistance(location(caster), @("028-1.gat", 63, 67)) < 5 )
- => EFFECT set_script_variable(caster, "Easter_2010_QuestState", script_int(caster, "Easter_2010_QuestState") | (1 << 17));
- sfx(location(caster), SFX_TELEPORT, 200);
- WAIT 8000;
- { savepoint "009-1", 52, 39; };
- warp(caster, @("009-1.gat", 55, 37));
- sfx(location(caster), SFX_TELEPORT, 200);
- | (REQUIRE map_nr(location(caster)) != 28 && (script_int(caster, "Easter_2010_QuestState") >> 17) & 1 == 0) # Allow for one free warp home without the petal
- => EFFECT inithp = hp(caster); // Store this value.
- sfx(location(caster), SFX_TELEPORT, 200);
- IF (map_nr(location(caster)) == 9 || map_nr(location(caster)) == 1 || map_nr(location(caster)) == 21 || map_nr(location(caster)) == 20) THEN WAIT 8000;
- ELSE WAIT 20000;
- IF (hp(caster) < inithp) THEN ABORT; // Cancel teleport if the player took damage during channel time (hacky, but for most purposes should work.)
- set_script_variable(caster, "Easter_2010_QuestState", script_int(caster, "Easter_2010_QuestState") | (1 << 17));
- { savepoint "028-1", 63, 68; };
- warp(caster, @("028-1.gat", 63, 67));
- sfx(location(caster), SFX_TELEPORT, 200);
- )
- )
-
-#NONMAGIC SILENT SPELL easter-invader-killer : "#z" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT { gmcommand "@killer"; }
-
-#NONMAGIC SILENT SPELL easter-invader-killable : "#x" =
-# (REQUIRE name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT { gmcommand "@killable"; }
-
-#NONMAGIC SILENT SPELL easter-debug-reset (s : STRING) : "#r" =
-# (REQUIRE name_of(caster) == "Freeyorp") =>
-# EFFECT set_script_variable(pc(s), "Easter_2010_QuestState", 0);
-
-#NONMAGIC SILENT SPELL easter-set-flag (s : PC) : "#k" =
-# (REQUIRE name_of(caster) == "Freeyorp" || name_of(caster) == "Xakelbael the Dark") =>
-# EFFECT IF (s == caster) THEN ABORT;
-# IF ((script_int(s, "Easter_2010_QuestState") >> 16) & 1) THEN ( message(caster, s + " already has the flag set!"); ABORT; )
-# script_target = s;
-# { set Easter_2010_QuestState, Easter_2010_QuestState | (1 << 16); // RETURN_READY flag
-# mes "As the smoke clears, you feel stronger, vivified.";
-# next;
-# mes "The world seems more vibrant. It looks the same as ever, but you get a sense of something more.";
-# next;
-# mes "You feel something familiar.";
-# next;
-# mes "This sensation... could it be home?";
-# next;
-# mes "A single word comes to your mind - " + getspellinvocation("world-shift") + ". While it sounds magical, you know with certainty that you will not need any magical power to use it.";
-# next;
-# mes "Could this be the way to move to and from the worlds? Either way, the dark petal the rose vanished into seems to be the key.";
-# next;
-# mes "Though you might be able to succeed in one trip without it, returning home.";
-# if ((Easter_2010_QuestState >> E10_STATE_ROSE_SHIFT) & E10_STATE_ROSE_MASK == E10_STATE_ROSE_ROSE_COMPLETE) close;
-# next;
-# mes "But the world is still not quite right. Perhaps there is someone you should help before the world releases its hold on you?";
-# close;
-# }
-
-NONMAGIC SILENT SPELL easter-get-debug (p : PC) : "#e" =
- (REQUIRE name_of(caster) == "Freeyorp" || name_of(caster) == "Xakelbael the Dark") =>
- EFFECT { message strcharinfo(0), "Global state egg1: " + $Easter_2010_Egg_Loc_State1;
- message strcharinfo(0), "Global state egg2: " + $Easter_2010_Egg_Loc_State2;
- message strcharinfo(0), "Global state egg3: " + $Easter_2010_Egg_Loc_State3;
- message strcharinfo(0), "Global state egg4: " + $Easter_2010_Egg_Loc_State4;
- message strcharinfo(0), "Global state egg5: " + $Easter_2010_Egg_Loc_State5;
- message strcharinfo(0), "Global npc state1: " + $Easter_2010_Npc_State1;
- message strcharinfo(0), "Global npc state2: " + $Easter_2010_Npc_State2;
- };
- message(caster, "Local state egg1: " + script_int(p, "Easter_2010_EggState1"));
- message(caster, "Local state egg2: " + script_int(p, "Easter_2010_EggState2"));
- message(caster, "Local state egg3: " + script_int(p, "Easter_2010_EggState3"));
- message(caster, "Local state egg4: " + script_int(p, "Easter_2010_EggState4"));
- message(caster, "Local state egg5: " + script_int(p, "Easter_2010_EggState5"));
- message(caster, "Local state quest: " + script_int(p, "Easter_2010_QuestState"));
-
-
-
-
-PROCEDURE hug_tree(target) =
- IF (target = ""
- || target = "tree" || target = "tree*"
- || target = "Tree" || target = "Tree*"
- || target = "druid" || target = "druid*"
- || target = "Druid" || target = "Druid*")
- THEN {
- set @flag, 2;
- callfunc "QuestTreeTrigger";
- };
-
-NONMAGIC SPELL hug0 (target : STRING) : "hug" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug1 (target : STRING) : "*hug*" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug2 (target : STRING) : "*hug" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug3 (target : STRING) : "hugs" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug4 (target : STRING) : "*hugs*" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-NONMAGIC SPELL hug5 (target : STRING) : "*hugs" = REQUIRE ((rdistance(location(caster), location(npc("#DruidTree0#_M"))) <= 1
- || rdistance(location(caster), location(npc("#DruidTree1#_M"))) <= 1))
- => EFFECT CALL hug_tree(target);
-
-
-#--------------------------------------------------------------------------------
-# Teleport anchors
-#--------------------------------------------------------------------------------
-
-TELEPORT-ANCHOR tulimshar : "tulimshar" = @("001-1.gat", 43, 66) @+ (3, 3);
-TELEPORT-ANCHOR hurnscald : "hurnscald" = @("009-1.gat", 55, 37) @+ (3, 3);
-TELEPORT-ANCHOR nivalis : "nivalis" = @("020-1.gat", 75, 63) @+ (19, 12);
-TELEPORT-ANCHOR wizardhut : "##00" = @("013-1.gat", 41, 92) @+ (3, 3);
-TELEPORT-ANCHOR pachua : "##01" = @("006-1.gat", 22, 101) @+ (3, 3);
-TELEPORT-ANCHOR desert : "##02" = @("005-1.gat", 160, 64) @+ (5, 5);
-TELEPORT-ANCHOR forest : "##03" = @("015-1.gat", 35, 35) @+ (40, 40);
-TELEPORT-ANCHOR snakecave : "##04" = @("011-4.gat", 50, 75) @+ (3, 3);
-TELEPORT-ANCHOR dimondscove : "##05" = @("010-2.gat", 23, 79) @+ (3, 3);
-
-
diff --git a/conf/map-server.conf b/conf/map-server.conf
new file mode 100644
index 000000000..ad156ce1d
--- /dev/null
+++ b/conf/map-server.conf
@@ -0,0 +1,115 @@
+//--------------------------------------------------------------
+// Hercules Map-Server Configuration File
+//--------------------------------------------------------------
+
+// Note: "Comments" are all text on the right side of a double slash "//"
+// Whatever text is commented will not be parsed by the servers, and serves
+// only as information/reference.
+
+//--------------------------------------------------------------
+// Configuration Info
+//--------------------------------------------------------------
+// Interserver communication passwords, set in account.txt (or equiv.)
+userid: s1
+passwd: p1
+
+// Character Server IP
+// The map server connects to the character server using this IP address.
+// NOTE: This is useful when you are running behind a firewall or are on
+// a machine with multiple interfaces.
+//char_ip: 127.0.0.1
+
+// The map server listens on the interface with this IP address.
+// NOTE: This allows you to run multiple servers on multiple interfaces
+// while using the same ports for each server.
+//bind_ip: 127.0.0.1
+
+// Character Server Port
+char_port: 6121
+
+// Map Server IP
+// The IP address which clients will use to connect.
+// Set this to what your server's public IP address is.
+//map_ip: 127.0.0.1
+
+// Map Server Port
+map_port: 5121
+
+//Time-stamp format which will be printed before all messages.
+//Can at most be 20 characters long.
+//Common formats:
+// %I:%M:%S %p (hour:minute:second 12 hour, AM/PM format)
+// %H:%M:%S (hour:minute:second, 24 hour format)
+// %d/%b/%Y (day/Month/year)
+//For full format information, consult the strftime() manual.
+//timestamp_format: [%d/%b %H:%M]
+
+//If redirected output contains escape sequences (color codes)
+stdout_with_ansisequence: no
+
+//Makes server log selected message types to a file in the /log/ folder
+//1: Log Warning Messages
+//2: Log Error and SQL Error messages.
+//4: Log Debug Messages
+//Example: "console_msg_log: 7" logs all 3 kinds
+//Messages logged by this overrides console_silent setting
+console_msg_log: 7
+
+//Makes server output more silent by omitting certain types of messages:
+//1: Hide Information messages
+//2: Hide Status messages
+//4: Hide Notice Messages
+//8: Hide Warning Messages
+//16: Hide Error and SQL Error messages.
+//32: Hide Debug Messages
+//Example: "console_silent: 7" Hides information, status and notice messages (1+2+4)
+console_silent: 0
+
+//Where should all database data be read from?
+db_path: db
+
+// Enable the @guildspy and @partyspy at commands?
+// Note that enabling them decreases packet sending performance.
+enable_spy: no
+
+// Read map data from GATs and RSWs in GRF files or a data directory
+// as referenced by grf-files.txt rather than from the mapcache?
+use_grf: no
+
+// Database autosave time
+// All characters are saved on this time in seconds (example:
+// autosave of 60 secs with 60 characters online -> one char is saved every
+// second)
+autosave_time: 300
+
+// Min database save intervals (in ms)
+// Prevent saving characters faster than at this rate (prevents char-server
+// save-load getting too high as character-count increases)
+minsave_time: 100
+
+// Apart from the autosave_time, players will also get saved when involved
+// in the following (add as needed):
+// 1: After every successful trade
+// 2: After every vending transaction
+// 4: After closing storage/guild storage.
+// 8: After hatching/returning to egg a pet.
+// 16: After successfully sending a mail with attachment
+// 32: After successfully submitting an item for auction
+// 64: After successfully get/delete/complete a quest
+// 128: After every buying store transaction
+// 256: After every bank transaction (deposit/withdraw)
+// NOTE: These settings decrease the chance of dupes/lost items when there's a
+// server crash at the expense of increasing the map/char server lag. If your
+// server rarely crashes, but experiences interserver lag, you may want to set
+// these off.
+save_settings: 511
+
+// When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
+help_txt: conf/help.txt
+help2_txt: conf/help2.txt
+charhelp_txt: conf/charhelp.txt
+
+// Maps:
+import: conf/maps.conf
+
+import: conf/import/map_conf.txt
diff --git a/conf/map_athena.conf b/conf/map_athena.conf
deleted file mode 100644
index cade67293..000000000
--- a/conf/map_athena.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-// eAthena Map-Server Configuration File
-
-// Database autosave time, in seconds.
-autosave_time: 60
-
-// Message of the day file, when a character logs on, this message is displayed.
-motd_txt: conf/motd.txt
-
-// When @help or @h is typed when you are a gm, this is displayed for helping new gms understand gm commands.
-help_txt: conf/help.txt
-
-mapreg_txt: save/mapreg.txt
-
-import: npc/scripts.conf
-
-gm_log: gm/gm.log
-
-// local settings for this server in this file
-import: conf/map_local.conf
diff --git a/conf/map_local.conf.example b/conf/map_local.conf.example
deleted file mode 100644
index 0f09bf593..000000000
--- a/conf/map_local.conf.example
+++ /dev/null
@@ -1,15 +0,0 @@
-// eAthena Map-Server local Configuration File
-
-// Interserver communication passwords, set in account.txt (or equiv.)
-userid: s1
-passwd: p1
-
-// Character Server IP
-char_ip:81.161.192.4
-// Character Server Port
-char_port: 6122
-
-// Map Server IP
-map_ip:81.161.192.4
-// Map Server Port
-map_port: 5122
diff --git a/conf/maps.conf b/conf/maps.conf
new file mode 100644
index 000000000..7a32fdd4d
--- /dev/null
+++ b/conf/maps.conf
@@ -0,0 +1,17 @@
+map: 000-0
+map: 000-1
+map: 001-1
+map: 000-0-0
+map: 000-2-0
+map: 000-2-1
+map: 000-2-2
+map: 000-2-3
+map: 001-2-0
+map: 001-2-2
+map: 001-2-3
+map: 001-2-4
+map: 001-2-5
+map: 001-2-6
+map: 001-2-7
+map: 001-2-8
+map: 001-2-9
diff --git a/conf/messages.conf b/conf/messages.conf
new file mode 100644
index 000000000..d9d4e9411
--- /dev/null
+++ b/conf/messages.conf
@@ -0,0 +1,1538 @@
+//===== Hercules Message Configuration =======================
+//= Hercules messages.conf
+//===== Description: =========================================
+//= This file handles all messages set throughout the server.
+//============================================================
+// For translation, just change msg here (second line),
+// no need to modify source code or alternatively,
+// use conf/import/msg_conf.txt.
+//============================================================
+// Format:
+// // English message
+// msg_number: translated message
+//============================================================
+
+// 0-499: reserved for GM commands
+// 500-549: reserved for others
+// 550-699: reserved for job names (also loaded by char server)
+// 900-1500: @atcommand
+
+// To disable a string (%s) field, make it's max length 0:
+// eg:
+// 270: *%s %s* (@me format)
+// 270: *%.0s%s* (remove the character's name from it)
+
+// Messages of GM commands
+// -----------------------
+
+0: Warped.
+1: Map not found.
+2: Invalid coordinates, using random target cell.
+3: Character not found.
+4: Jump to %s
+5: Jump to %d %d
+6: Your save point has been changed.
+7: Warping to save point.
+8: Speed changed.
+9: Options changed.
+10: Invisible: Off
+11: Invisible: On
+12: Your job has been changed.
+13: You've died.
+14: Character killed.
+15: Unknown
+16: You've been revived!
+17: HP, SP recovered.
+18: Item created.
+19: Invalid item ID or name.
+20: All of your items have been removed.
+21: Base level raised.
+22: Base level lowered.
+23: Job level can't go any higher.
+24: Job level raised.
+25: Job level lowered.
+//26-27 FREE
+28: No player found.
+29: 1 player found.
+30: %d players found.
+31: PvP: Off.
+32: PvP: On.
+33: GvG: Off.
+34: GvG: On.
+//35 FREE
+36: Appearance changed.
+37: An invalid number was specified.
+38: Invalid location number, or name.
+39: All monsters summoned!
+40: Invalid monster ID or name.
+41: Unable to decrease the number/value.
+42: Stat changed.
+43: You're not in a guild.
+44: You're not the master of your guild.
+45: Guild level change failed.
+46: %s recalled!
+47: Base level can't go any higher.
+//48-52 FREE
+53: '%s' stats:
+54: No player found in map '%s'.
+55: 1 player found in map '%s'.
+56: %d players found in map '%s'.
+//57-58 FREE
+59: Night Mode Activated.
+60: Day Mode Activated.
+61: The holy messenger has given judgement.
+62: Judgement has passed.
+63: Mercy has been shown.
+64: Mercy has been granted.
+//65-69 FREE
+70: You have learned the skill.
+71: You have forgotten the skill.
+72: War of Emperium has been initiated.
+73: War of Emperium is currently in progress.
+74: War of Emperium has been ended.
+75: War of Emperium is currently not in progress.
+76: All skills have been added to your skill tree.
+77: Search results for '%s' (name: id):
+78: %s: %d
+79: %d results found.
+80: Please specify a display name or monster name/id.
+81: Your GM level doesn't authorize you to perform this action on the specified player.
+//82-83 FREE
+84: All stats changed!
+85: Invalid time for ban command.
+//86-87 FREE
+88: Sending request to login server...
+89: Night mode is already enabled.
+90: Day mode is already enabled.
+//91 FREE
+92: All characters recalled!
+93: All online characters of the %s guild have been recalled to your position.
+94: Incorrect name/ID, or no one from the specified guild is online.
+95: All online characters of the %s party have been recalled to your position.
+96: Incorrect name/ID, or no one from the specified party is online.
+97: Item database has been reloaded.
+98: Monster database has been reloaded.
+99: Skill database has been reloaded.
+100: Scripts have been reloaded.
+//101 FREE
+102: You have mounted a Peco Peco.
+103: No longer spying on the %s guild.
+104: Spying on the %s guild.
+105: No longer spying on the %s party.
+106: Spying on the %s party.
+107: All items have been repaired.
+108: No item need to be repaired.
+109: Player has been nuked!
+110: NPC Enabled.
+111: This NPC doesn't exist.
+112: NPC Disabled.
+113: %d item(s) removed by a GM.
+114: %d item(s) removed from the player.
+115: %d item(s) removed. Player had only %d on %d items.
+116: Character does not have the specified item.
+117: You have been jailed by a GM.
+118: Player warped to jail.
+119: This player is not in jail.
+120: A GM has discharged you from jail.
+121: Player unjailed.
+122: Disguise applied.
+123: Invalid Monster/NPC name/ID specified.
+124: Disguise removed.
+125: You're not disguised.
+//Clone Messages
+126: Cannot clone a player of higher GM level than yourself.
+127: You've reached your slave clones limit.
+128: Evil clone spawned.
+129: Unable to spawn evil clone.
+130: Clone spawned.
+131: Unable to spawn clone.
+132: Slave clone spawned.
+133: Unable to spawn slave clone.
+//134-142 FREE (possibly for other clone types)
+143: Commands are disabled in this map.
+144: Invalid e-mail. If your email hasn't been set, use a@a.com.
+145: Invalid new e-mail. Please enter a real e-mail address.
+146: New e-mail must be a real e-mail address.
+147: New e-mail must be different from the current e-mail address.
+148: Information sent to login-server via char-server.
+149: Impossible to increase the number/value.
+150: No GM found.
+151: 1 GM found.
+152: %d GMs found.
+153: %s is Unknown Command.
+154: %s failed.
+155: You are unable to change your job.
+156: HP or/and SP modified.
+157: HP and SP have already been recovered.
+158: Base level can't go any lower.
+159: Job level can't go any lower.
+160: PvP is already Off.
+161: PvP is already On.
+162: GvG is already Off.
+163: GvG is already On.
+//164 FREE
+165: All monsters killed!
+166: No item has been refined.
+167: 1 item has been refined.
+168: %d items have been refined.
+169: The item (%d: '%s') is not equipable.
+170: The item is not equipable.
+171: %d - void
+172: Speed returned to normal.
+//173 FREE
+174: Number of status points changed.
+175: Number of skill points changed.
+176: Current amount of zeny changed.
+177: You cannot decrease that stat anymore.
+178: You cannot increase that stat anymore.
+179: Guild level changed.
+180: The monster/egg name/ID doesn't exist.
+181: You already have a pet.
+182: Pet intimacy changed.
+183: Pet intimacy is already at maximum.
+184: Sorry, but you have no pet.
+185: Pet hunger changed.
+186: Pet hunger is already at maximum.
+187: You can now rename your pet.
+188: You can already rename your pet.
+//189-194 FREE
+195: All players have been kicked!
+196: You already have this quest skill.
+197: This skill number doesn't exist or isn't a quest skill.
+198: This skill number doesn't exist.
+//199-200 FREE
+201: You don't have this quest skill.
+//202-203 FREE
+204: You can't open a shop on this cell.
+205: Maybe you meant:
+206: '%s' skill points reset.
+207: '%s' stats points reset.
+208: '%s' skill and stat points have been reset.
+//209-211 FREE
+212: Cannot mount while in disguise.
+213: You need %s to mount!
+214: You have released your Peco Peco.
+215: Your class can't mount!
+//216-218 FREE
+219: %d day
+220: %d days
+221: %d hour
+222: %d hours
+223: %d minute
+224: %d minutes
+225: and %d second
+226: and %d seconds
+227: Party modification is disabled in this map.
+228: Guild modification is disabled in this map.
+229: Your effect has changed.
+230: Server time (normal time): %A, %B %d %Y %X.
+231: Game time: The game is in permanent daylight.
+232: Game time: The game is in permanent night.
+233: Game time: The game is in night for %s.
+//234 FREE
+235: Game time: The game is in daylight for %s.
+//236 FREE
+237: Game time: After, the game will be in night for %s.
+238: Game time: A day cycle has a normal duration of %s.
+239: Game time: After, the game will be in daylight for %s.
+240: %d monster(s) summoned!
+241: You can now attack and kill players freely.
+242: You can now be attacked and killed by players.
+243: Skills have been disabled in this map.
+244: Skills have been enabled in this map.
+245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
+246: Your GM level doesn't authorize you to perform this action.
+247: You are not authorized to warp to this map.
+248: You are not authorized to warp from your current map.
+249: You are not authorized to warp to your save map.
+250: You have already opened your storage. Close it first.
+251: You have already opened your guild storage. Close it first.
+252: You are not in a guild.
+253: You already are at your destination!
+254: GM command configuration has been reloaded.
+255: Battle configuration has been reloaded.
+256: Status database has been reloaded.
+257: Player database has been reloaded.
+258: Sent packet 0x%x (%d)
+259: Invalid packet
+260: This item cannot be traded.
+261: Script could not be loaded.
+262: Script loaded.
+263: This item cannot be dropped.
+264: This item cannot be stored.
+265: %s has bought your item(s).
+266: Some of your items cannot be vended and were removed from the shop.
+//267-268 FREE
+269: Displaying first %d out of %d matches
+//@me output format
+270: * :%s %s: *
+271: You can't drop items in this map
+272: You can't trade in this map
+273: Available commands:
+274: %d commands found.
+//275 FREE
+276: You can't open a shop in this map
+277: Usage: @request <petition/message to online GMs>.
+278: (@request): %s
+279: @request sent.
+280: Invalid name.
+281: You can't create chat rooms in this map
+//Party-related
+282: You need to be a party leader to use this command.
+283: Target character must be online and in your current party.
+284: Leadership transferred.
+285: You've become the party leader.
+286: There's been no change in the setting.
+287: You cannot change party leaders in this map.
+//Missing stuff for @killer related commands.
+288: You are no longer killable.
+//289-290 FREE
+291: Weather effects will disappear after teleporting or refreshing.
+292: Killer state reset.
+//Item Bind System
+293: This bound item cannot be traded to that character.
+294: This bound item cannot be stored there.
+295: Please enter an item name or ID (usage: @itembound <item name/ID> <quantity> <bound_type>).
+296: Please enter all parameters (usage: @itembound2 <item name/ID> <quantity>
+297: <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4> <bound_type>).
+298: Invalid bound type. Valid types are - 1:Account 2:Guild 3:Party 4:Character
+//299 FREE
+// Guild Castles Number
+// --------------------
+300: None Taken
+301: One Castle
+302: Two Castles
+303: Three Castles
+304: Four Castles
+305: Five Castles
+306: Six Castles
+307: Seven Castles
+308: Eight Castles
+309: Nine Castles
+310: Ten Castles
+311: Eleven Castles
+312: Twelve Castles
+313: Thirteen Castles
+314: Fourteen Castles
+315: Fifteen Castles
+316: Sixteen Castles
+317: Seventeen Castles
+318: Eighteen Castles
+319: Nineteen Castles
+320: Twenty Castles
+321: Twenty-One Castles
+322: Twenty-Two Castles
+323: Twenty-Three Castles
+324: Twenty-Four Castles
+325: Twenty-Five Castles
+326: Twenty-Six Castles
+327: Twenty-Seven Castles
+328: Twenty-Eight Castles
+329: Twenty-Nine Castles
+330: Thirty Castles
+331: Thirty-One Castles
+332: Thirty-Two Castles
+333: Thirty-Three Castles
+// 334: Thirty-Four Castles
+334: Total Domination
+
+//335-342 FREE
+
+// Templates for @who output
+343: Name: %s
+344: (%s)
+345: | Party: '%s'
+346: | Guild: '%s'
+//You may omit the last %s, then you won't see players job name
+347: | Lv:%d/%d | Job: %s
+//You may omit 2 last %d, then you won't see players coordinates, just map name
+348: | Location: %s %d %d
+//349 FREE
+
+// @duel
+350: Duel: You can't use @invite. You aren't a duelist.
+351: Duel: The limit of players has been reached.
+352: Duel: Player name not found.
+353: Duel: The Player is in the duel already.
+354: Duel: Invitation has been sent.
+355: Duel: You can't use @duel without @reject.
+356: Duel: You can take part in duel once per %d minutes.
+357: Duel: Invalid value.
+358: Duel: You can't use @leave. You aren't a duelist.
+359: Duel: You've left the duel.
+360: Duel: You can't use @accept without a duel invitation.
+361: Duel: The duel invitation has been accepted.
+362: Duel: You can't use @reject without a duel invitation.
+363: Duel: The duel invitation has been rejected.
+364: Duel: You can't invite %s because he/she isn't in the same map.
+365: Duel: Can't use %s in duel.
+//366-369 FREE
+370: -- Duels: %d/%d, Members: %d/%d, Max players: %d --
+371: -- Duels: %d/%d, Members: %d/%d --
+372: -- Duel has been created (Use @invite/@leave) --
+373: -- Player %s invites %s to duel --
+374: Blue -- Player %s invites you to PVP duel (Use @accept/@reject) --
+375: <- Player %s has left the duel --
+376: -> Player %s has accepted the duel --
+377: -- Player %s has rejected the duel --
+//378-385 FREE
+// Main chat
+386: %s :Main: %s
+//387-389 FREE
+//NoAsk
+390: Autorejecting is activated.
+391: Autorejecting is deactivated.
+392: You request has been rejected by autoreject option.
+393: Autorejected trade request from %s.
+394: Autorejected party invite from %s.
+395: Autorejected guild invite from %s.
+396: Autorejected alliance request from %s.
+397: Autorejected opposition request from %s.
+398: Autorejected friend request from %s.
+//399 FREE
+400: Usage: @jailfor <time> <character name>
+//401 FREE
+402: %s in jail for %d years, %d months, %d days, %d hours and %d minutes
+// WoE SE (@agitstart2)
+403: War of Emperium SE has been initiated.
+404: War of Emperium SE is currently in progress.
+405: War of Emperium SE has been ended.
+406: War of Emperium SE is currently not in progress.
+//407 FREE
+//chrif related
+408: Disconnecting to perform change-sex request...
+409: Your sex has been changed (disconnection required to complete the process)...
+//410-411 used by cash shop
+412: Your account has 'Unregistered'.
+413: Your account has an 'Incorrect Password'...
+414: Your account has expired.
+415: Your account has been rejected from server.
+416: Your account has been blocked by the GM Team.
+417: Your Game's EXE file is not the latest version.
+418: Your account has been prohibited to log in.
+419: Server is jammed due to over populated.
+420: Your account has not more authorized.
+421: Your account has been totally erased.
+//422 FREE
+423: Your account has been banished until
+424: Login-server has been asked to %s the player '%.*s'.
+425: The player '%.*s' doesn't exist.
+426: Your GM level doesn't authorize you to %s the player '%.*s'.
+427: Login-server is offline. Impossible to %s the player '%.*s'.
+428: block
+429: ban
+430: unblock
+431: unban
+432: change the sex of
+433: This character has been banned until
+434: Char-server has been asked to %s the character '%.*s'.
+//435-449 FREE
+// Homunculus messages
+450: You already have a homunculus
+
+// Return pet to egg message
+451: You can't return your pet because your inventory is full.
+//452-497 FREE
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+// @itembound / @itembound2
+498: Cannot create bound pet eggs or pet armors.
+
+//499-500 FREE
+501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+502: Day Mode is activated
+503: Night Mode is activated
+
+// Cash point change messages
+504: Used %d Kafra points and %d cash points. %d Kafra and %d cash points remaining.
+505: Gained %d cash points. Total %d points.
+506: Gained %d Kafra points. Total %d points.
+410: Removed %d cash points. Total %d points.
+411: Removed %d Kafra points. Total %d points.
+
+// Trade Spoof Messages
+507: This player has been banned for %d minute(s).
+508: This player hasn't been banned (Ban option is disabled).
+//509 FREE
+
+// mail system
+//----------------------
+510: You have %d new emails (%d unread)
+//511-537 FREE
+
+// Trade Spoof Messages
+538: Hack on trade: character '%s' (account: %d) try to trade more items that he has.
+539: This player has %d of a kind of item (id: %d), and tried to trade %d of them.
+540: This player has been definitively blocked.
+// Rare Items Drop/Steal announce
+541: '%s' got %s's %s (chance: %0.02f%%)
+//541: %.0s%.0sSomeone got %s
+542: '%s' stole %s's %s (chance: %0.02f%%)
+//542: %.0s%.0sSomeone stole %s
+//543-545 FREE
+// @showmobs
+546: Please enter a mob name/id (usage: @showmobs <mob name/id>)
+547: Invalid mob name %s!
+// @clearcart
+548: You can't clean a cart while vending!
+// @Autotrade
+549: You should have a shop open in order to use @autotrade.
+
+//550 -> 699: Job Names
+550: Novice
+551: Swordsman
+552: Magician
+553: Archer
+554: Acolyte
+555: Merchant
+556: Thief
+557: Knight
+558: Priest
+559: Wizard
+560: Blacksmith
+561: Hunter
+562: Assassin
+563: Crusader
+564: Monk
+565: Sage
+566: Rogue
+567: Alchemist
+568: Bard
+569: Dancer
+570: Wedding
+571: Super Novice
+572: Gunslinger
+573: Ninja
+574: Christmas
+575: High Novice
+576: High Swordsman
+577: High Magician
+578: High Archer
+579: High Acolyte
+580: High Merchant
+581: High Thief
+582: Lord Knight
+583: High Priest
+584: High Wizard
+585: Whitesmith
+//585: Mastersmith //iRO name
+586: Sniper
+587: Assassin Cross
+588: Paladin
+589: Champion
+590: Professor
+//590: Scholar //iRO name
+591: Stalker
+592: Creator
+//592: Biochemist //iRO Name
+593: Clown
+//593: Minstrel //iRO Name
+594: Gypsy
+595: Baby Novice
+596: Baby Swordsman
+597: Baby Magician
+598: Baby Archer
+599: Baby Acolyte
+600: Baby Merchant
+601: Baby Thief
+602: Baby Knight
+603: Baby Priest
+604: Baby Wizard
+605: Baby Blacksmith
+606: Baby Hunter
+607: Baby Assassin
+608: Baby Crusader
+609: Baby Monk
+610: Baby Sage
+611: Baby Rogue
+612: Baby Alchemist
+613: Baby Bard
+614: Baby Dancer
+615: Super Baby
+616: Taekwon
+617: Star Gladiator
+618: Soul Linker
+//619 FREE
+620: Unknown Job
+621: Summer
+622: Gangsi
+623: Death Knight
+624: Dark Collector
+625: Rune Knight
+626: Warlock
+627: Ranger
+628: Arch Bishop
+629: Mechanic
+630: Guillotine Cross
+631: Royal Guard
+632: Sorcerer
+633: Minstrel
+//633: Maestro //iRO Name
+634: Wanderer
+635: Sura
+636: Genetic
+//636: Geneticist //iRO Name
+637: Shadow Chaser
+638: Baby Rune Knight
+639: Baby Warlock
+640: Baby Ranger
+641: Baby Arch Bishop
+642: Baby Mechanic
+643: Baby Guillotine Cross
+644: Baby Royal Guard
+645: Baby Sorcerer
+646: Baby Minstrel
+647: Baby Wanderer
+648: Baby Sura
+649: Baby Genetic
+650: Baby Shadow Chaser
+651: Expanded Super Novice
+652: Expanded Super Baby
+653: Kagerou
+654: Oboro
+655: Rebellion
+
+656: Rune Knight T
+657: Warlock T
+658: Ranger T
+659: Arch Bishop T
+660: Mechanic T
+661: Guillotine Cross T
+662: Royal Guard T
+663: Sorcerer T
+664: Minstrel T
+665: Wanderer T
+666: Sura T
+667: Genetic T
+668: Shadow Chaser T
+
+//669-855 FREE (please start using from the top if you need, leave the 669+ range for new jobs)
+
+// MvP Tomb
+856: Tomb
+857: [ ^EE0000%s^000000 ]
+858: Has met its demise
+859: Time of death : ^EE0000%s^000000
+860: Defeated by
+861: [^EE0000%s^000000]
+
+// Etc messages from source
+862: You're too close to a NPC, you must be at least %d cells away from any NPC.
+863: Duel: Can't use this item in duel.
+864: You cannot use this command when dead.
+865: Can't create chat rooms in this area.
+866: Pets are not allowed in Guild Wars.
+867: You're not dead.
+868: Your current memo positions are:
+869: You broke the target's weapon.
+870: You can't leave battleground guilds.
+871: Friend already exists.
+872: Name not found in list.
+873: This action can't be performed at the moment. Please try again later.
+874: Friend removed.
+875: Cannot send mails too fast!!
+876: Alliances cannot be made during Guild Wars!
+877: Alliances cannot be broken during Guild Wars!
+878: You are no longer the Guild Master.
+879: You have become the Guild Master!
+880: You have been recovered!
+881: Shop is out of stock! Come again later!
+//882-899 FREE
+
+//------------------------------------
+// More atcommands message
+//------------------------------------
+
+// @send
+900: Usage:
+901: @send len <packet hex number>
+902: @send <packet hex number> {<value>}*
+903: Value: <type=B(default),W,L><number> or S<length>"<string>"
+904: Packet 0x%x length: %d
+905: Unknown packet: 0x%x
+906: Not a string:
+907: Not a hexadecimal digit:
+908: Unknown type of value in:
+
+// @rura
+909: Please enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).
+
+// @where
+910: Please enter a player name (usage: @where <char name>).
+
+// @jumpto
+911: Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>).
+
+// @who
+912: (CID:%d/AID:%d)
+
+// @whogm
+913: Name: %s (GM)
+914: Name: %s (GM:%d) | Location: %s %d %d
+915: BLvl: %d | Job: %s (Lvl: %d)
+916: Party: '%s' | Guild: '%s'
+917: None
+
+// @speed
+918: Please enter a speed value (usage: @speed <%d-%d>).
+
+// @storage
+919: Storage opened.
+
+// @guildstorage
+920: Guild storage opened.
+
+// @option
+921: Please enter at least one option.
+
+//922 FREE
+
+// @jobchange
+923: You can not change to this job by command.
+//924-979 FREE
+
+// @kami
+980: Please enter a message (usage: @kami <message>).
+981: Please enter color and message (usage: @kamic <color> <message>).
+982: Invalid color.
+
+// @item
+983: Please enter an item name or ID (usage: @item <item name/ID> <quantity>).
+
+// @item2
+984: Please enter all parameters (usage: @item2 <item name/ID> <quantity>).
+985: <identify_flag> <refine> <attribute> <card1> <card2> <card3> <card4>).
+
+// @baselevelup
+986: Please enter a level adjustment (usage: @lvup/@blevel/@baselvlup <number of levels>).
+
+// @joblevelup
+987: Please enter a level adjustment (usage: @joblvup/@jlevel/@joblvlup <number of levels>).
+
+// @help
+988: There is no help for %c%s.
+989: Help for command %c%s:
+990: Available aliases:
+
+// @model
+991: Please enter at least one value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).
+
+// @dye
+992: Please enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).
+
+// @hairstyle
+993: Please enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).
+
+// @haircolor
+994: Please enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).
+
+//995 FREE
+
+// @refine
+996: Please enter a position and an amount (usage: @refine <equip position> <+/- amount>).
+997: %d: Lower Headgear
+998: %d: Right Hand
+999: %d: Garment
+1000: %d: Left Accessory
+1001: %d: Body Armor
+1002: %d: Left Hand
+1003: %d: Shoes
+1004: %d: Right Accessory
+1005: %d: Top Headgear
+1006: %d: Mid Headgear
+
+// @produce
+1007: Please enter at least one item name/ID (usage: @produce <equip name/ID> <element> <# of very's>).
+
+// @memo
+1008: Please enter a valid position (usage: @memo <memo_position:%d-%d>).
+
+// @displaystatus
+1009: Please enter a status type/flag (usage: @displaystatus <status type> <flag> <tick> {<val1> {<val2> {<val3>}}}).
+
+// @stpoint
+1010: Please enter a number (usage: @stpoint <number of points>).
+
+// @skpoint
+1011: Please enter a number (usage: @skpoint <number of points>).
+
+// @zeny
+1012: Please enter an amount (usage: @zeny <amount>).
+
+// @param
+1013: Please enter a valid value (usage: @str/@agi/@vit/@int/@dex/@luk <+/-adjustment>).
+
+// @guildlevelup
+1014: Please enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).
+
+// @makeeg
+1015: Please enter a monster/egg name/ID (usage: @makeegg <pet>).
+
+// @petfriendly
+1016: Please enter a valid value (usage: @petfriendly <0-1000>).
+
+// @pethungry
+1017: Please enter a valid number (usage: @pethungry <0-100>).
+
+// @recall
+1018: Please enter a player name (usage: @recall <char name/ID>).
+1019: You are not authorized to warp someone to this map.
+
+// @recall
+1020: You are not authorized to warp this player from their map.
+
+// @block
+1021: Please enter a player name (usage: @block <char name>).
+
+// @ban
+1022: Please enter ban time and a player name (usage: @ban <time> <char name>).
+1023: You are not allowed to reduce the length of a ban.
+
+// @unblock
+1024: Please enter a player name (usage: @unblock <char name>).
+
+// @unban
+1025: Please enter a player name (usage: @unban <char name>).
+
+// @kick
+1026: Please enter a player name (usage: @kick <char name/ID>).
+
+// @questskill / @lostskill
+1027: Please enter a quest skill ID.
+
+// @spiritball
+1028: Please enter an amount (usage: @spiritball <number: 0-%d>).
+
+// @party
+1029: Please enter a party name (usage: @party <party_name>).
+
+// @guild
+1030: Please enter a guild name (usage: @guild <guild_name>).
+
+// @idsearch
+1031: Please enter part of an item name (usage: @idsearch <part_of_item_name>).
+
+// @recallall / @guildrecall / @partyrecall
+1032: You are not authorized to warp someone to your current map.
+1033: Because you are not authorized to warp from some maps, %d player(s) have not been recalled.
+
+// @guildrecall
+1034: Please enter a guild name/ID (usage: @guildrecall <guild_name/ID>).
+
+// @partyrecall
+1035: Please enter a party name/ID (usage: @partyrecall <party_name/ID>).
+
+// @reloadatcommand
+1036: Error reading groups.conf, reload failed.
+1037: Error reading atcommand.conf, reload failed.
+
+// @mapinfo
+1038: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+1039: ------ Map Info ------
+1040: Map: %s (Zone:%s) | Players: %d | NPCs: %d | Chats: %d | Vendings: %d
+1041: ------ Map Flags ------
+1042: Town Map
+1043: Autotrade Enabled
+1044: Autotrade Disabled
+1045: Battlegrounds ON
+1046: PvP Flags:
+1047: Pvp ON |
+1048: NoGuild |
+1049: NoParty |
+1050: NightmareDrop |
+1051: NoCalcRank |
+1052: GvG Flags:
+1053: GvG ON |
+1054: GvG Dungeon |
+1055: GvG Castle |
+1056: NoParty |
+1057: Teleport Flags:
+1058: NoTeleport |
+1059: Monster NoTeleport |
+1060: NoWarp |
+1061: NoWarpTo |
+1062: NoReturn |
+//1063 FREE
+1064: NoMemo |
+1065: No Exp Penalty: %s | No Zeny Penalty: %s
+1066: On
+1067: Off
+1068: No Save (Return to last Save Point)
+1069: No Save, Save Point: %s,Random
+1070: No Save, Save Point: %s,%d,%d
+1071: Weather Flags:
+1072: Snow |
+1073: Fog |
+1074: Sakura |
+1075: Clouds |
+1076: Clouds2 |
+1077: Fireworks |
+1078: Leaves |
+//1079 FREE
+1080: Displays Night |
+1081: Other Flags:
+1082: NoBranch |
+1083: NoTrade |
+1084: NoVending |
+1085: NoDrop |
+1086: NoSkill |
+1087: NoIcewall |
+1088: AllowKS |
+1089: Reset |
+1090: Other Flags:
+1091: NoCommand |
+1092: NoBaseEXP |
+1093: NoJobEXP |
+1094: NoMobLoot |
+1095: NoMVPLoot |
+1096: PartyLock |
+1097: GuildLock |
+1098: ----- Players in Map -----
+1099: Player '%s' (session #%d) | Location: %d,%d
+1100: ----- NPCs in Map -----
+1101: North
+1102: North West
+1103: West
+1104: South West
+1105: South
+1106: South East
+1107: East
+1108: North East
+1109: North
+1110: Unknown
+1111: NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d
+1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d
+1113: ----- Chats in Map -----
+1114: Chat: %s | Player: %s | Location: %d %d
+1115: Users: %d/%d | Password: %s | Public: %s
+1116: Yes
+1117: No
+1118: Please enter at least one valid list number (usage: @mapinfo <0-3> <map>).
+
+// @mount
+1119: You have mounted your Dragon.
+1120: You have released your Dragon.
+1121: You have mounted your Warg.
+1122: You have released your Warg.
+1123: You have mounted your Mado Gear.
+1124: You have released your Mado Gear.
+
+// @guildspy
+1125: The mapserver has spy command support disabled.
+1126: Please enter a guild name/ID (usage: @guildspy <guild_name/ID>).
+
+// @partyspy
+1127: Please enter a party name/ID (usage: @partyspy <party_name/ID>).
+
+// @nuke
+1128: Please enter a player name (usage: @nuke <char name>).
+
+// @tonpc
+1129: Please enter a NPC name (usage: @tonpc <NPC_name>).
+
+// @enablenpc
+1130: Please enter a NPC name (usage: @enablenpc <NPC_name>).
+
+// @hidenpc
+1131: Please enter a NPC name (usage: @hidenpc <NPC_name>).
+
+// @loadnpc
+1132: Please enter a script file name (usage: @loadnpc <file name>).
+
+// @npcoff
+1133: Please enter a NPC name (usage: @npcoff <NPC_name>).
+
+// @jail
+1134: Please enter a player name (usage: @jail <char_name>).
+
+// @unjail
+1135: Please enter a player name (usage: @unjail/@discharge <char_name>).
+
+// @jailfor
+1136: Invalid time for jail command.
+1137: You are now
+1138: This player is now
+
+// @jailtime
+1139: You are not in jail.
+1140: You have been jailed indefinitely.
+1141: You have been jailed for an unknown amount of time.
+1142: You will remain
+
+// @disguise
+1143: Please enter a Monster/NPC name/ID (usage: @disguise <name/ID>).
+1144: Character cannot be disguised while mounted.
+
+// @disguiseall
+1145: Please enter a Monster/NPC name/ID (usage: @disguiseall <name/ID>).
+
+// @disguiseguild
+1146: Please enter a mob name/ID and guild name/ID (usage: @disguiseguild <mob name/ID>, <guild name/ID>).
+
+// @undisguiseguild
+1147: Please enter guild name/ID (usage: @undisguiseguild <guild name/ID>).
+
+// @exp
+1148: Base Level: %d (%.3f%%) | Job Level: %d (%.3f%%)
+
+// @broadcast
+1149: Please enter a message (usage: @broadcast <message>).
+
+// @localbroadcast
+1150: Please enter a message (usage: @localbroadcast <message>).
+
+// @email
+1151: Please enter two e-mail addresses (usage: @email <current@email> <new@email>).
+
+// @effect
+1152: Please enter an effect number (usage: @effect <effect number>).
+
+// @npcmove
+1153: Usage: @npcmove <X> <Y> <npc_name>
+1154: NPC is not in this map.
+1155: NPC moved.
+
+// @addwarp
+1156: Usage: @addwarp <mapname> <X> <Y> <npc name>
+1157: Unknown map '%s'.
+1158: New warp NPC '%s' created.
+
+// @follow
+1159: Follow mode OFF.
+1160: Follow mode ON.
+
+// @storeall
+1161: You currently cannot open your storage.
+1162: All items stored.
+
+// @skillid
+1163: Please enter a skill name to look up (usage: @skillid <skill name>).
+1164: skill %d: %s (%s)
+
+// @useskill
+1165: Usage: @useskill <skill ID> <skill level> <target>
+
+// @displayskill
+1166: Usage: @displayskill <skill ID> {<skill level>}
+
+// @skilltree
+1167: Usage: @skilltree <skill ID> <target>
+1168: Player is using %s skill tree (%d basic points).
+1169: The player cannot use that skill.
+1170: Player requires level %d of skill %s.
+1171: The player meets all the requirements for that skill.
+
+// @marry
+1172: Usage: @marry <char name>
+1173: They are married... wish them well.
+1174: The two cannot wed because one is either a baby or already married.
+
+// @divorce
+1175: '%s' is not married.
+1176: '%s' and his/her partner are now divorced.
+
+// @changelook
+1177: Usage: @changelook {<position>} <view id>
+1178: Position: 1:Top 2:Middle 3:Bottom 4:Weapon 5:Shield 6:Shoes 7:Robe
+
+// @autotrade
+1179: Autotrade is not allowed in this map.
+1180: You cannot autotrade when dead.
+
+// @changegm
+1181: You need to be a Guild Master to use this command.
+1182: You cannot change guild leaders in this map.
+1183: Usage: @changegm <guild_member_name>
+1184: Target character must be online and be a guild member.
+
+// @changeleader
+1185: Usage: @changeleader <party_member_name>
+
+// @partyoption
+1186: Usage: @partyoption <pickup share: yes/no> <item distribution: yes/no>
+
+// @autoloot
+1187: Autolooting items with drop rates of %0.02f%% and below.
+1188: Autoloot is now off.
+
+// @autolootitem
+1189: Item not found.
+1190: You're already autolooting this item.
+1191: Your autolootitem list is full. Remove some items first with @autolootid -<item name or ID>.
+1192: Autolooting item: '%s'/'%s' {%d}
+1193: You're currently not autolooting this item.
+1194: Removed item: '%s'/'%s' {%d} from your autolootitem list.
+1195: You can have %d items on your autolootitem list.
+1196: To add an item to the list, use "@alootid +<item name or ID>". To remove an item, use "@alootid -<item name or ID>".
+1197: "@alootid reset" will clear your autolootitem list.
+1198: Your autolootitem list is empty.
+1199: Items on your autolootitem list:
+1200: Your autolootitem list has been reset.
+
+// @guildstorage
+1201: Your guild's storage has already been opened by another member, try again later.
+
+//1202 FREE
+
+// @snow
+1203: Snow has stopped falling.
+1204: It has started to snow.
+
+// @sakura
+1205: Cherry tree leaves no longer fall.
+1206: Cherry tree leaves have begun to fall.
+
+// @clouds
+1207: Clouds have disappeared.
+1208: Clouds appeared.
+
+// @clouds2
+1209: Alternative clouds have disappeared.
+1210: Alternative clouds appeared.
+
+// @fog
+1211: The fog has gone.
+1212: Fog hangs over.
+
+// @leaves
+1213: Leaves have stopped falling.
+1214: Leaves started falling.
+
+// @fireworks
+1215: Fireworks have ended.
+1216: Fireworks are launched.
+
+// @sound
+1217: Please enter a sound filename (usage: @sound <filename>).
+
+// @mobsearch
+1218: Please enter a monster name (usage: @mobsearch <monster name>).
+1219: Invalid mob ID %s!
+1220: Mob Search... %s %s
+
+// @cleanmap
+1221: All dropped items have been cleaned up.
+
+// @npctalk
+1222: Please enter the correct parameters (usage: @npctalk <npc name>, <message>).
+1223: Please enter the correct parameters (usage: @npctalkc <color> <npc name>, <message>).
+
+// @pettalk
+1224: Please enter a message (usage: @pettalk <message>).
+
+// @summon
+1225: Please enter a monster name (usage: @summon <monster name> {duration}).
+
+// @adjgroup
+1226: Usage: @adjgroup <group_id>
+1227: Specified group does not exist.
+1228: Group changed successfully.
+1229: Your group has been changed.
+
+// @trade
+1230: Please enter a player name (usage: @trade <char name>).
+
+// @setbattleflag
+1231: Usage: @setbattleflag <flag> <value>
+1232: Unknown battle_config flag.
+1233: Set battle_config as requested.
+
+// @unmute
+1234: Please enter a player name (usage: @unmute <char name>).
+1235: Player is not muted.
+1236: Player unmuted.
+
+// @mute
+1237: Usage: @mute <time> <char name>
+
+// @identify
+1238: There are no items to appraise.
+
+// @mobinfo
+1239: Please enter a monster name/ID (usage: @mobinfo <monster_name_or_monster_ID>).
+1240: MVP Monster: '%s'/'%s'/'%s' (%d)
+1241: Monster: '%s'/'%s'/'%s' (%d)
+1242: Lv:%d HP:%d Base EXP:%u Job EXP:%u HIT:%d FLEE:%d
+1243: DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d
+1244: ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d)
+1245: Drops:
+1246: This monster has no drops.
+1247: MVP Bonus EXP:%u
+1248: MVP Items:
+1249: This monster has no MVP prizes.
+
+// @showmobs
+1250: Invalid mob id %s!
+1251: Can't show boss mobs!
+1252: Mob Search... %s %s
+
+// @homlevel
+1253: Please enter a level adjustment (usage: @homlevel <number of levels>).
+
+// @homlevel / @homevolve / @homfriendly / @homhungry / @homtalk / @hominfo / @homstats
+1254: You do not have a homunculus.
+
+// @homevolve
+1255: Your homunculus doesn't evolve.
+
+// @makehomun
+1256: Please enter a homunculus ID (usage: @makehomun <homunculus id>).
+1257: Invalid Homunculus ID.
+
+// @homfriendly
+1258: Please enter an intimacy value (usage: @homfriendly <intimacy value [0-1000]>).
+
+// @homhungry
+1259: Please enter a hunger value (usage: @homhungry <hunger value [0-100]>).
+
+// @homtalk
+1260: Please enter a message (usage: @homtalk <message>).
+
+// @hominfo
+1261: Homunculus stats:
+1262: HP: %d/%d - SP: %d/%d
+1263: ATK: %d - MATK: %d~%d
+1264: Hungry: %d - Intimacy: %u
+1265: Stats: Str %d / Agi %d / Vit %d / Int %d / Dex %d / Luk %d
+
+// @homstats
+1266: Homunculus growth stats (Lv %d %s):
+1267: Max HP: %d (%d~%d)
+1268: Max SP: %d (%d~%d)
+1269: Str: %d (%d~%d)
+1270: Agi: %d (%d~%d)
+1271: Vit: %d (%d~%d)
+1272: Int: %d (%d~%d)
+1273: Dex: %d (%d~%d)
+1274: Luk: %d (%d~%d)
+
+// @homshuffle
+1275: Homunculus stats altered.
+
+// @iteminfo
+1276: Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>).
+1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
+1278: None
+1279: With script
+1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
+1281: - Available in shops only.
+1282: - Maximal monsters drop chance: %02.02f%%
+1283: - Monsters don't drop this item.
+
+// @whodrops
+1284: Please enter item name/ID (usage: @whodrops <item name/ID>).
+1285: Item: '%s'[%d]
+1286: - Item is not dropped by any mobs.
+1287: - Common mobs with highest drop chance (only max %d are listed):
+
+// @whereis
+1288: Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>).
+1289: %s spawns in:
+1290: This monster does not spawn normally.
+
+//1291-1294 FREE
+
+// @version
+1295: %s revision '%s' (src) / '%s' (scripts)
+1296: Hercules %d-bit for %s
+
+// @mutearea
+1297: Please enter a time in minutes (usage: @mutearea/@stfu <time in minutes>).
+
+// @rates
+1298: Experience rates: Base %.2fx / Job %.2fx
+1299: Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1300: Boss Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
+1301: Other Drop Rates: MvP %.2fx / Card-Based %.2fx / Treasure %.2fx
+
+// @me
+1302: Please enter a message (usage: @me <message>).
+
+// @size / @sizeall / @sizeguild
+1303: Size change applied.
+
+// @sizeguild
+1304: Please enter guild name/ID (usage: @sizeguild <size> <guild name/ID>).
+
+// @monsterignore
+1305: You are now immune to attacks.
+1306: Returned to normal state.
+
+// @fakename
+1307: Returned to real name.
+1308: You must enter a name.
+1309: Fake name must be at least two characters.
+1310: Fake name enabled.
+
+// @mapflag
+1311: Enabled Mapflags in this map:
+1312: Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On)
+1313: Type "@mapflag available" to list the available mapflags.
+1314: Invalid flag name or flag.
+1315: Available Flags:
+
+// @showexp
+1316: Gained exp will not be shown.
+1317: Gained exp is now shown.
+
+// @showzeny
+1318: Gained zeny will not be shown.
+1319: Gained zeny is now shown.
+
+// @showdelay
+1320: Skill delay failures will not be shown.
+1321: Skill delay failures are now shown.
+
+// @cash
+1322: Please enter an amount.
+
+// @clone
+1323: You must enter a player name or ID.
+
+// @feelreset
+1324: Reset 'Feeling' maps.
+
+// @noks
+1325: [ K.S Protection Inactive ]
+1326: [ K.S Protection Active - Option: Party ]
+1327: [ K.S Protection Active - Option: Self ]
+1328: [ K.S Protection Active - Option: Guild ]
+1329: Usage: @noks <self|party|guild>
+
+// @allowks
+1330: [ Map K.S Protection Active ]
+1331: [ Map K.S Protection Inactive ]
+
+// @itemlist
+1332: ------ %s items list of '%s' ------
+1333: | equipped:
+1334: garment,
+1335: left accessory,
+1336: body/armor,
+1337: right hand,
+1338: left hand,
+1339: both hands,
+1340: feet,
+1341: right accessory,
+1342: lower head,
+1343: top head,
+1344: lower/top head,
+1345: mid head,
+1346: lower/mid head,
+1347: lower/mid/top head,
+1348: -> (pet egg, pet id: %u, named)
+1349: -> (pet egg, pet id: %u, unnamed)
+1350: -> (crafted item, creator id: %u, star crumbs %d, element %d)
+1351: -> (produced item, creator id: %u)
+1352: -> (card(s):
+1353: No item found in this player's %s.
+1354: %d item(s) found in %d %s slots.
+
+// @delitem
+1355: Please enter an item name/ID, a quantity, and a player name (usage: #delitem <player> <item_name_or_ID> <quantity>).
+
+// @font
+1356: Returning to normal font.
+1357: Use @font <1-9> to change your message font.
+1358: Use 0 or no parameter to return to normal font.
+1359: Invalid font. Use a value from 0 to 9.
+1360: Font changed.
+1361: Already using this font.
+
+// @new_mount
+1362: NOTICE: If you crash with mount your LUA is outdated.
+1363: You have mounted.
+1364: You have released your mount.
+
+// @accinfo
+1365: Usage: @accinfo/@accountinfo <account_id/char name>
+1366: You may search partial name by making use of '%' in the search, ex. "@accinfo %Mario%" lists all characters whose name contains "Mario".
+
+// @set
+1367: Usage: @set <variable name> <value>
+1368: Usage: ex. "@set PoringCharVar 50"
+1369: Usage: ex. "@set PoringCharVarSTR$ Super Duper String"
+1370: Usage: ex. "@set PoringCharVarSTR$" outputs its value, Super Duper String.
+1371: NPC variables may not be used with @set.
+1372: Instance variables may not be used with @set.
+1373: %s value is now :%d
+1374: %s value is now :%s
+1375: %s is empty
+1376: %s data type is not supported :%u
+
+// @reloadquestdb
+1377: Quest database has been reloaded.
+
+// @addperm
+1378: Usage: %s <permission_name>
+1379: -- Permission List
+1380: '%s' is not a known permission.
+1381: User '%s' already possesses the '%s' permission.
+1382: User '%s' doesn't possess the '%s' permission.
+1383: -- User '%s' Permissions
+1384: User '%s' permissions updated successfully. The changes are temporary.
+
+// @unloadnpcfile
+1385: Usage: @unloadnpcfile <file name>
+1386: File unloaded. Be aware that mapflags and monsters spawned directly are not removed.
+1387: File not found.
+
+// General command messages
+1388: Charcommand failed (usage: %c<command> <char name> <parameters>).
+1389: %s failed. Player not found.
+
+// @cart
+1390: Unknown Cart (usage: %s <0-%d>).
+1391: You do not possess a cart to be removed
+1392: Cart Added.
+
+// atcommand.c::is_atcommand
+1393: You can't use commands while dead.
+
+// @clearstorage
+1394: Your storage was cleaned.
+1395: Your guild storage was cleaned.
+
+// @clearcart
+1396: You do not have a cart to be cleaned.
+1397: Your cart was cleaned.
+
+// @skillid (extension)
+1398: -- Displaying first %d partial matches
+
+// @join
+1399: Unknown Channel (usage: %s <#channel_name>)
+1400: Unknown Channel '%s' (usage: %s <#channel_name>)
+1401: '%s' Channel is password protected (usage: %s <#channel_name> <password>)
+//1402 used by hercules chat feature
+1403: You're now in the '%s' channel
+
+// Hercules Chat Feature
+1402: You're not in that channel, type '@join <#channel_name>'
+1435: You're now in the '#%s' channel for '%s'
+1436: You're already in the '%s' channel
+
+// @channel
+1404: %s failed
+1405: Channel name must start with a '#'
+1406: Channel length must be between 3 and %d
+1407: Channel '%s' is not available
+1408: Channel password may not contain spaces
+1409: - #%s ( %d users )
+1410: -- Public Channels
+1411: Unknown color '%s'
+1412: You're not the owner of channel '%s'
+1413: '%s' channel color updated to '%s'
+1414: --- Available options:
+1415: -- %s create <channel name> <channel password>
+1416: - creates a new channel
+1417: -- %s list
+1418: - lists public channels
+1419: -- %s list colors
+1420: - lists colors available to select for custom channels
+1421: -- %s setcolor <channel name> <color name>
+1422: - changes <channel name> color to <color name>
+1423: -- %s leave <channel name>
+1424: - leaves <channel name>
+1425: You're not part of the '%s' channel
+1426: You've left the '%s' channel
+1427: -- %s bindto <channel name>
+1428: - binds your global chat to <channel name>, making anything you type in global be sent to the channel
+1429: -- %s unbind
+1430: - unbinds your global chat from its attached channel (if binded)
+1431: Your global chat is now bound to the '%s' channel
+1432: Your global chat is not bound to any channel
+1433: Your global chat is no longer bound to the '#%s' channel
+1434: Player '%s' was not found
+//1435-1436 used by hercules chat feature
+1437: Player '%s' has now been banned from the '%s' channel
+1438: You cannot join the '%s' channel because you've been banned from it
+1439: Channel '%s' has no banned players
+1440: Player '%s' is not banned from this channel
+1441: Player '%s' has now been unbanned from the '%s' channel
+1442: Removed all bans from the '%s' channel
+1443: -- '%s' ban list
+1444: - %s
+1445: - %s (%d)
+1446: You need to input a option
+1447: '%s' is not a known channel option
+1448: -- Available options
+1449: option '%s' is already enabled, if you'd like to disable it type '@channel opt %s 0'
+1450: option '%s' is now enabled for channel '%s'
+1451: value '%d' for option '%s' is out of range (limit is 0-10)
+1452: option '%s' is now enabled for channel '%s' with %d seconds
+1453: option '%s' is now disabled for channel '%s'
+1454: option '%s' is not enabled on channel '%s'
+1455: You're talking too fast!
+1456: -- %s ban <channel name> <character name>
+1457: - bans <character name> from <channel name> channel
+1458: -- %s banlist <channel name>
+1459: - lists all banned characters from <channel name> channel
+1460: -- %s unban <channel name> <character name>
+1461: - unbans <character name> from <channel name> channel
+1462: -- %s setopt <channel name> <option name> <option value>
+1463: - adds or removes <option name> with <option value> to <channel name> channel
+1464: Ban failed, it is not possible to ban this user.
+1465: Player '%s' is already banned from this channel
+1466: For '%s' you need the amount of seconds (from 0 to 10)
+1467: -- %s unbanall <channel name>
+1468: - unbans everyone from <channel name>
+
+// @costume
+1469: '%s' is not a known costume
+1470: You're already with a '%s' costume, type '@costume' to remove it.
+1471: -- %s
+1472: - Available Costumes
+1473: Costume '%s' removed.
+
+//src/map/pc.c::pc_isUseitem
+1474: You cannot use this item while sitting
+1475: You cannot use this item while your storage is open
+
+1476: You are already mounting something else
+
+//src/map/pc.c::pc_isUseitem
+1477: Item cannot be opened when inventory is full
+
+//@homlv
+1478: Homunculus reached its maximum level of '%d'
+
+//src/map/clif.c::clif_parse_GlobalMessage
+1479: Dear angel, can you hear my voice?
+1480: I am %s Super Novice~
+1481: Help me out~ Please~ T_T
+
+//Banking
+1482: You can't withdraw that much money
+1483: Banking is disabled
+
+//src/map/atcommand.c::ACMD(auction)
+1484: Auction is disabled
+
+//Monster Transformation
+1485: Traaaansformation-!! %s form!!
+1486: Cannot transform into monster while in disguise.
+1487: Character cannot be disguised while in monster form.
+1488: Transforming into monster is not allowed in Guild Wars.
+
+//CashShop mapflag
+1489: Cash Shop is disabled in this map
+
+// @autoloottype
+1490: You're already autolooting this item type.
+1491: Item type not found.
+1492: Autolooting item type: '%s'
+1493: You're currently not autolooting this item type.
+1494: Removed item type: '%s' from your autoloottype list.
+1495: Your autoloottype list is empty.
+1496: Item types on your autoloottype list:
+1497: Your autoloottype list has been reset.
+
+//Item Bind
+1498: You can't add a party bound item to a character without party!
+1499: You can't add a guild bound item to a character without guild!
+
+//Custom translations
+import: conf/import/msg_conf.txt
diff --git a/conf/msg_athena.conf b/conf/msg_athena.conf
deleted file mode 100644
index 313d22b72..000000000
--- a/conf/msg_athena.conf
+++ /dev/null
@@ -1,528 +0,0 @@
-// eAthena msg_athena.conf
-// Message Configuration
-// For translation, just change msg here (second line), no need to modify source code.
-// Format:
-// // English message
-// msg_number: translated message
-
-// 0-499: reserved for GM commands
-// 500-999 reserved for others
-
-// Messages of GM commands
-// -----------------------
-
-//0: Warped.
-0: Warped.
-//1: Map not found.
-1: Map not found.
-//2: Coordinates out of range.
-2: Coordinates out of range.
-//3: Character not found.
-3: Character not found.
-//4: Jump to %s
-4: Jump to %s
-//5: Jump to %d %d
-5: Jump to %d %d
-//6: Character data respawn point saved.
-6: Character data respawn point saved.
-//7: Warping to respawn point.
-7: Warping to respawn point.
-//8: Speed changed.
-8: Speed changed.
-//9: Options changed.
-9: Options changed.
-//10: Invisible: Off.
-10: Invisible: Off.
-//11: Invisible: On.
-11: Invisible: On.
-//12: Your job has been changed.
-12: Your job has been changed.
-//13: A pity! You've died.
-13: A pity! You've died.
-//14: Character killed.
-14: Character killed.
-//15: Player warped (message sends to player too).
-15: Player warped (message sends to player too).
-//16: You've been revived! It's a miracle!
-16: You've been revived! It's a miracle!
-//17: HP, SP recovered.
-17: HP, SP recovered.
-//18: Item created.
-18: Item created.
-//19: Invalid item ID or name.
-19: Invalid item ID or name.
-//20: All of your items have been removed.
-20: All of your items have been removed.
-//21: Base level raised.
-21: Base level raised.
-//22: Base level lowered.
-22: Base level lowered.
-//23: Job level can't go any higher.
-23: Job level can't go any higher.
-//24: Job level raised.
-24: Job level raised.
-//25: Job level lowered.
-25: Job level lowered.
-//26: Help commands:
-26: Help commands:
-//27: File help.txt not found.
-27: File help.txt not found.
-//28: No player found.
-28: No player found.
-//29: 1 player found.
-29: 1 player found.
-//30: %d players found.
-30: %d players found.
-//31: PvP: Off.
-31: PvP: Off.
-//32: PvP: On.
-32: PvP: On.
-//33: GvG: Off.
-33: GvG: Off.
-//34: GvG: On.
-34: GvG: On.
-//35: You can't use this command with this class.
-35: You can't use this command with this class.
-//36: Appearence changed.
-36: Appearence changed.
-//37: An invalid number was specified.
-37: An invalid number was specified.
-//38: Invalid location number or name.
-38: Invalid location number or name.
-//39: All monster summoned!
-39: All monster summoned!
-//40: Invalid monster ID or name.
-40: Invalid monster ID or name.
-//41: Impossible to decrease the number/value.
-41: Impossible to decrease the number/value.
-//42: Stat changed.
-42: Stat changed.
-//43: You're not in a guild.
-43: You're not in a guild.
-//44: You're not the master of your guild.
-44: You're not the master of your guild.
-//45: Guild level change failed.
-45: Guild level change failed.
-//46: %s recalled!
-46: %s recalled!
-//47: Base level can't go any higher.
-47: Base level can't go any higher.
-//48: Character's job changed.
-48: Character's job changed.
-//49: Invalid job ID.
-49: Invalid job ID.
-//50: You already have some GM powers.
-50: You already have some GM powers.
-//51: Character revived.
-51: Character revived.
-//52: This option cannot be used in PK Mode.
-52: This option cannot be used in PK Mode.
-//53: '%s' stats:
-53: '%s' stats:
-//54: No player found in map '%s'.
-54: No player found in map '%s'.
-//55: 1 player found in map '%s'.
-55: 1 player found in map '%s'.
-//56: %d players found in map '%s'.
-56: %d players found in map '%s'.
-//57: Character's respawn point changed.
-57: Character's respawn point changed.
-//58: Character's options changed.
-58: Character's options changed.
-//59: Night has fallen.
-59: Night has fallen.
-//60: Day has arrived.
-60: Day has arrived.
-//61: The holy messenger has given judgement.
-61: The holy messenger has given judgement.
-//62: Judgement was made.
-62: Judgement was made.
-//63: Mercy has been shown.
-63: Mercy has been shown.
-//64: Mercy has been granted.
-64: Mercy has been granted.
-//65: Character's base level raised.
-65: Character's base level raised.
-//66: Character's base level lowered.
-66: Character's base level lowered.
-//67: Character's job level can't go any higher.
-67: Character's job level can't go any higher.
-//68: character's job level raised.
-68: character's job level raised.
-//69: Character's job level lowered.
-69: Character's job level lowered.
-//70: You have learned the skill.
-70: You have learned the skill.
-//71: You have forgotten the skill.
-71: You have forgotten the skill.
-//72: Guild siege warfare start!
-72: Guild siege warfare start!
-//73: Already it has started siege warfare.
-73: Already it has started siege warfare.
-//74: Guild siege warfare end!
-74: Guild siege warfare end!
-//75: Siege warfare hasn't started yet.
-75: Siege warfare hasn't started yet.
-//76: You have received all skills.
-76: You have received all skills.
-//77: The reference result of '%s' (name: id):
-77: The reference result of '%s' (name: id):
-//78: %s: %d
-78: %s: %d
-//79: It is %d affair above.
-79: It is %d affair above.
-//80: Give a display name and monster name/id please.
-80: Give a display name and monster name/id please.
-//81: Your GM level don't authorise you to do this action on this player.
-81: Your GM level don't authorise you to do this action on this player.
-//82: Please, use one of this number/name:
-82: Please, use one of this number/name:
-//83: Cannot spawn emperium.
-83: Cannot spawn emperium.
-//84: All stats changed!
-84: All stats changed!
-//85: Invalid time for ban command.
-85: Invalid time for ban command.
-//86: Sorry, but a player name have at least 4 characters.
-86: Sorry, but a player name have at least 4 characters.
-//87: Sorry, but a player name have 23 characters maximum.
-87: Sorry, but a player name have 23 characters maximum.
-//88: Character name sends to char-server to ask it.
-88: Character name sends to char-server to ask it.
-//89: Sorry, it's already the night. Impossible to execute the command.
-89: Sorry, it's already the night. Impossible to execute the command.
-//90: Sorry, it's already the day. Impossible to execute the command.
-90: Sorry, it's already the day. Impossible to execute the command.
-//91: Character's base level can't go any higher.
-91: Character's base level can't go any higher.
-//92: All characters recalled!
-92: All characters recalled!
-//93: All online characters of the %s guild are near you.
-93: All online characters of the %s guild are near you.
-//94: Incorrect name/ID, or no one from the guild is online.
-94: Incorrect name/ID, or no one from the guild is online.
-//95: All online characters of the %s party are near you.
-95: All online characters of the %s party are near you.
-//96: Incorrect name or ID, or no one from the party is online.
-96: Incorrect name or ID, or no one from the party is online.
-//97: Item database reloaded.
-97: Item database reloaded.
-//98: Monster database reloaded.
-98: Monster database reloaded.
-//99: Skill database reloaded.
-99: Skill database reloaded.
-//100: Scripts reloaded.
-100: Scripts reloaded.
-//101: Login-server asked to reload GM accounts and their level.
-101: Login-server asked to reload GM accounts and their level.
-//102: Mounted Peco.
-102: Mounted Peco.
-//103: No longer spying on the %s guild.
-103: No longer spying on the %s guild.
-//104: Spying on the %s guild.
-104: Spying on the %s guild.
-//105: No longer spying on the %s party.
-105: No longer spying on the %s party.
-//106: Spying on the %s party.
-106: Spying on the %s party.
-//107: All items have been repaired.
-107: All items have been repaired.
-//108: No item need to be repaired.
-108: No item need to be repaired.
-//109: Player has been nuked!
-109: Player has been nuked!
-//110: Npc Enabled.
-110: Npc Enabled.
-//111: This NPC doesn't exist.
-111: This NPC doesn't exist.
-//112: Npc Disabled.
-112: Npc Disabled.
-//113: %d item(s) removed by a GM.
-113: %d item(s) removed by a GM.
-//114: %d item(s) removed from the player.
-114: %d item(s) removed from the player.
-//115: %d item(s) removed. Player had only %d on %d items.
-115: %d item(s) removed. Player had only %d on %d items.
-//116: Character does not have the item.
-116: Character does not have the item.
-//117: GM has send you in jails.
-117: GM has send you in jails.
-//118: Player warped in jails.
-118: Player warped in jails.
-//119: This player is not in jails.
-119: This player is not in jails.
-//120: GM has discharge you.
-120: GM has discharge you.
-//121: Player warped to Prontera.
-121: Player warped to Prontera.
-//122: Disguise applied.
-122: Disguise applied.
-//123: Monster/NPC name/id hasn't been found.
-123: Monster/NPC name/id hasn't been found.
-//124: Undisguise applied.
-124: Undisguise applied.
-//125: You're not disguised.
-125: You're not disguised.
-//126: You accept any wisp (no wisper is refused).
-126: You accept any wisp (no wisper is refused).
-//127: You accept any wisp, except thoses from %d player(s):
-127: You accept any wisp, except thoses from %d player(s):
-//128: You refuse all wisps (no specifical wisper is refused).
-128: You refuse all wisps (no specifical wisper is refused).
-//129: You refuse all wisps, AND refuse wisps from %d player(s):
-129: You refuse all wisps, AND refuse wisps from %d player(s):
-//130: '%s' accept any wisp (no wisper is refused).
-130: '%s' accept any wisp (no wisper is refused).
-//131: '%s' accept any wisp, except thoses from %d player(s):
-131: '%s' accept any wisp, except thoses from %d player(s):
-//132: '%s' refuse all wisps (no specifical wisper is refused).
-132: '%s' refuse all wisps (no specifical wisper is refused).
-//133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
-133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
-//134: '%s' already accepts all wispers.
-134: '%s' already accepts all wispers.
-//135: '%s' now accepts all wispers.
-135: '%s' now accepts all wispers.
-//136: A GM has authorised all wispers for you.
-136: A GM has authorised all wispers for you.
-//137: '%s' already blocks all wispers.
-137: '%s' already blocks all wispers.
-//138: '%s' blocks now all wispers.
-138: '%s' blocks now all wispers.
-//139: A GM has blocked all wispers for you.
-139: A GM has blocked all wispers for you.
-//140: Character's disguise applied.
-140: Character's disguise applied.
-//141: Character's undisguise applied.
-141: Character's undisguise applied.
-//142: Character is not disguised.
-142: Character is not disguised.
-//143: Give a monster name/id please.
-143: Give a monster name/id please.
-//144: Invalid actual email. If you have default e-mail, type a@a.com.
-144: Invalid actual email. If you have default e-mail, type a@a.com.
-//145: Invalid new email. Please enter a real e-mail.
-145: Invalid new email. Please enter a real e-mail.
-//146: New email must be a real e-mail.
-146: New email must be a real e-mail.
-//147: New email must be different of the actual e-mail.
-147: New email must be different of the actual e-mail.
-//148: Information sended to login-server via char-server.
-148: Information sended to login-server via char-server.
-//149: Impossible to increase the number/value.
-149: Impossible to increase the number/value.
-//150: No GM found.
-150: No GM found.
-//151: 1 GM found.
-151: 1 GM found.
-//152: %d GMs found.
-152: %d GMs found.
-//153: %s is Unknown Command.
-153: %s is Unknown Command.
-//154: %s failed.
-154: %s failed.
-//155: Impossible to change your job.
-155: Impossible to change your job.
-//156: HP or/and SP modified.
-156: HP or/and SP modified.
-//157: HP and SP are already with the good value.
-157: HP and SP are already with the good value.
-//158: Base level can't go any lower.
-158: Base level can't go any lower.
-//159: Job level can't go any lower.
-159: Job level can't go any lower.
-//160: PvP is already Off.
-160: PvP is already Off.
-//161: PvP is already On.
-161: PvP is already On.
-//162: GvG is already Off.
-162: GvG is already Off.
-//163: GvG is already On.
-163: GvG is already On.
-//164: Your memo point #%d doesn't exist.
-164: Your memo point #%d doesn't exist.
-//165: All monsters killed!
-165: All monsters killed!
-//166: No item has been refined!
-166: No item has been refined!
-//167: 1 item has been refined!
-167: 1 item has been refined!
-//168: %d items have been refined!
-168: %d items have been refined!
-//169: This item (%d: '%s') is not an equipment.
-169: This item (%d: '%s') is not an equipment.
-//170: This item is not an equipment.
-170: This item is not an equipment.
-//171: %d - void
-171: %d - void
-//172: You replace previous memo position %d - %s (%d,%d).
-172: You replace previous memo position %d - %s (%d,%d).
-//173: Note: you don't have the 'Warp' skill level to use it.
-173: Note: you don't have the 'Warp' skill level to use it.
-//174: Number of status points changed!
-174: Number of status points changed!
-//175: Number of skill points changed!
-175: Number of skill points changed!
-//176: Number of zenys changed!
-176: Number of zenys changed!
-//177: Impossible to decrease a stat.
-177: Impossible to decrease a stat.
-//178: Impossible to increase a stat.
-178: Impossible to increase a stat.
-//179: Guild level changed.
-179: Guild level changed.
-//180: The monter/egg name/id doesn't exist.
-180: The monter/egg name/id doesn't exist.
-//181: You already have a pet.
-181: You already have a pet.
-//182: Pet friendly value changed!
-182: Pet friendly value changed!
-//183: Pet friendly is already the good value.
-183: Pet friendly is already the good value.
-//184: Sorry, but you have no pet.
-184: Sorry, but you have no pet.
-//185: Pet hungry value changed!
-185: Pet hungry value changed!
-//186: Pet hungry is already the good value.
-186: Pet hungry is already the good value.
-//187: You can now rename your pet.
-187: You can now rename your pet.
-//188: You can already rename your pet.
-188: You can already rename your pet.
-//189: This player can now rename his/her pet.
-189: This player can now rename his/her pet.
-//190: This player can already rename his/her pet.
-190: This player can already rename his/her pet.
-//191: Sorry, but this player has no pet.
-191: Sorry, but this player has no pet.
-//192: Impossible to change the character's job.
-192: Impossible to change the character's job.
-//193: Character's base level can't go any lower.
-193: Character's base level can't go any lower.
-//194: Character's job level can't go any lower.
-194: Character's job level can't go any lower.
-//195: All players have been kicked!
-195: All players have been kicked!
-//196: You already have this quest skill.
-196: You already have this quest skill.
-//197: This skill number doesn't exist or isn't a quest skill.
-197: This skill number doesn't exist or isn't a quest skill.
-//198: This skill number doesn't exist.
-198: This skill number doesn't exist.
-//199: This player has learned the skill.
-199: This player has learned the skill.
-//200: This player already has this quest skill.
-200: This player already has this quest skill.
-//201: You don't have this quest skill.
-201: You don't have this quest skill.
-//202: This player has forgotten the skill.
-202: This player has forgotten the skill.
-//203: This player doesn't have this quest skill.
-203: This player doesn't have this quest skill.
-//204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-//205: You already have this number of spiritballs.
-205: You already have this number of spiritballs.
-//206: '%s' skill points reseted!
-206: '%s' skill points reseted!
-//207: '%s' stats points reseted!
-207: '%s' stats points reseted!
-//208: '%s' skill and stats points reseted!
-208: '%s' skill and stats points reseted!
-//209: Character's number of skill points changed!
-209: Character's number of skill points changed!
-//210: Character's number of status points changed!
-210: Character's number of status points changed!
-//211: Character's number of zenys changed!
-211: Character's number of zenys changed!
-//212: Cannot mount a Peco while in disguise.
-212: Cannot mount a Peco while in disguise.
-//213: You can not mount a peco with your job.
-213: You can not mount a peco with your job.
-//214: Unmounted Peco.
-214: Unmounted Peco.
-//215: This player cannot mount a Peco while in disguise.
-215: This player cannot mount a Peco while in disguise.
-//216: Now, this player mounts a peco.
-216: Now, this player mounts a peco.
-//217: This player can not mount a peco with his/her job.
-217: This player can not mount a peco with his/her job.
-//218: Now, this player has not more peco.
-218: Now, this player has not more peco.
-//219: %d day
-219: %d day
-//220: %d days
-220: %d days
-//221: %s %d hour
-221: %s %d hour
-//222: %s %d hours
-222: %s %d hours
-//223: %s %d minute
-223: %s %d minute
-//224: %s %d minutes
-224: %s %d minutes
-//225: %s and %d second
-225: %s and %d second
-//226: %s and %d seconds
-226: %s and %d seconds
-//227: Cannot wear disguise while riding a Peco.
-227: Cannot wear disguise while riding a Peco.
-//228: Character cannot wear disguise while riding a Peco.
-228: Character cannot wear disguise while riding a Peco.
-//229: Your Effect Has Changed.
-229: Your Effect Has Changed.
-//230: Server time (normal time): %A, %B %d %Y %X.
-230: Server time (normal time): %A, %B %d %Y %X.
-//231: Game time: The game is in permanent daylight.
-231: Game time: The game is in permanent daylight.
-//232: Game time: The game is in permanent night.
-232: Game time: The game is in permanent night.
-//233: Game time: The game is actualy in night for %s.
-233: Game time: The game is actualy in night for %s.
-//234: Game time: After, the game will be in permanent daylight.
-234: Game time: After, the game will be in permanent daylight.
-//235: Game time: The game is actualy in daylight for %s.
-235: Game time: The game is actualy in daylight for %s.
-//236: Game time: After, the game will be in permanent night.
-236: Game time: After, the game will be in permanent night.
-//237: Game time: After, the game will be in night for %s.
-237: Game time: After, the game will be in night for %s.
-//238: Game time: A day cycle has a normal duration of %s.
-238: Game time: A day cycle has a normal duration of %s.
-//239: Game time: After, the game will be in daylight for %s.
-239: Game time: After, the game will be in daylight for %s.
-//240: %d monster(s) summoned!
-240: %d monster(s) summoned!
-//241: You be a killa...
-241: You be a killa...
-//242: You gonna be own3d...
-242: You gonna be own3d...
-//243: Map skills are off.
-243: Map skills are off.
-//244: Map skills are on.
-244: Map skills are on.
-//245: Muting is disabled.
-245: Muting is disabled.
-
-// Messages of others (not for GM commands)
-// ----------------------------------------
-
-//500: Actually, it's the night...
-500: Actually, it's the night...
-//501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-//502: The day has arrived!
-502: The day has arrived!
-//503: The night has fallen...
-503: The night has fallen...
-// 504-508: Chat validation.
-//504: You cannot page yourself.
-504: You cannot page yourself.
-//505: Your message could not be sent.
-505: Your message could not be sent.
-//506: WARNING: You are about to be automatically banned for spam!
-506: WARNING: You are about to be automatically banned for spam!
-//507: WARNING: Please slow down, do not repeat, and do not SHOUT!
-507: WARNING: Please slow down, do not repeat, and do not SHOUT!
-//508: You have been banned for %s spamming. Please do not spam.
-508: You have been banned for %s spamming. Please do not spam.
diff --git a/conf/packet.conf b/conf/packet.conf
new file mode 100644
index 000000000..85996f4e3
--- /dev/null
+++ b/conf/packet.conf
@@ -0,0 +1,66 @@
+//===== Hercules Sockets Configuration =======================
+//= Hercules Sockets Configuration File
+//===== Translated by: =======================================
+// Davidsiaw
+//============================================================
+
+// Display debug reports (When something goes wrong during the report, the report is saved.)
+debug: no
+
+// How long can a socket stall before closing the connection (in seconds)?
+stall_time: 60
+
+// Maximum allowed size for clients packets in bytes (default: 24576).
+// NOTE: To reduce the size of reported packets, lower the values of defines, which
+// have been customized, such as MAX_STORAGE, MAX_GUILD_STORAGE or MAX_CART.
+// NOTE: Do not modify this setting, unless the client has been modified to support
+// larger packets. The client will crash, when it receives larger packets.
+socket_max_client_packet: 24576
+
+//----- IP Rules Settings -----
+
+// If IP's are checked when connecting.
+// This also enables DDoS protection.
+enable_ip_rules: yes
+
+// Order of the checks
+// deny,allow : Checks deny rules, then allow rules. Allows if no rules match.
+// allow,deny : Checks allow rules, then deny rules. Allows if no rules match.
+// mutual-failure : Allows only if an allow rule matches and no deny rules match.
+// (default is deny,allow)
+
+order: deny,allow
+// order: allow,deny
+// order: mutual-failture
+
+// IP rules
+// allow : Accepts connections from the ip range (even if flagged as DDoS)
+// deny : Rejects connections from the ip range
+// The rules are processed in order, the first matching rule of each list (allow and deny) is used
+
+// allow: 127.0.0.1
+// allow: 192.168.0.0/16
+// allow: 10.0.0.0/255.0.0.0
+// allow: all
+
+// deny: 127.0.0.1
+
+
+//---- DDoS Protection Settings ----
+// If ddos_count connection request are made within ddos_interval msec, it assumes it's a DDoS attack
+
+// Consecutive attempts interval (msec)
+// (default is 3000 msecs, 3 seconds)
+ddos_interval: 3000
+
+// Consecutive attempts trigger
+// (default is 5 attemps)
+ddos_count: 5
+
+// The time interval after which the threat of DDoS is assumed to be gone. (msec)
+// After this amount of time, the DDoS restrictions are lifted.
+// (default is 600000 msecs, 10 minutes)
+ddos_autoreset: 600000
+
+
+import: conf/import/packet_conf.txt
diff --git a/conf/plugins.conf b/conf/plugins.conf
new file mode 100644
index 000000000..066e701a3
--- /dev/null
+++ b/conf/plugins.conf
@@ -0,0 +1,39 @@
+//====================================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//=
+//= http://hercules.ws/board/
+//====================================================
+//== Topic Discussion ================================
+//== http://hercules.ws/board/topic/549-introducing-hercules-plugin-manager/
+//====================================================
+//== Description =====================================
+//The plugin system allows you to create customized scripts
+//outside of the source. These scripts won't conflict with any
+//future source updates - think of it as a /conf/import/ for the source.
+//====================================================
+
+/* --------------- Format ---------------
+After you have listed your plugin(s) in "quotations",
+you need to put in a comma, to separate the plugins.
+-----------------------------------------
+plugins_list: [
+ "example",
+ "other",
+]
+-----------------------------------------
+Please note that your scripts need to be saved
+in the .c (source code) extension and placed in the /src/plugin/ folder.
+-----------------------------------------
+*/
+plugins_list: [
+ /* Enable HPMHooking when plugins in use rely on Hooking */
+ "HPMHooking",
+ //"db2sql",
+ "libevol_map",
+ //"other",
+]
diff --git a/conf/readme.txt b/conf/readme.txt
new file mode 100644
index 000000000..3323b5689
--- /dev/null
+++ b/conf/readme.txt
@@ -0,0 +1,22 @@
+What is the import folder for?
+-------------------------------------------------------------------------------
+
+The folder provides a way for you to change your config settings without having
+to update the files every time you update your server. You store your changes,
+and the rest is updated with Hercules (usually though GIT).
+
+How does this work?
+-------------------------------------------------------------------------------
+
+Place only the settings you have changed in the import files.
+For example, if you want to change a value in conf/battle/exp.conf:
+
+ // Rate at which exp. is given. (Note 2)
+ base_exp_rate: 700
+
+You could instead copy the setting into conf/import/battle_conf.txt,
+and you'll eliminate any problems updating in the future.
+
+Neat, isn't it?
+
+- Semi-guide by Ajarn / Euphy
diff --git a/conf/script.conf b/conf/script.conf
new file mode 100644
index 000000000..57442e87f
--- /dev/null
+++ b/conf/script.conf
@@ -0,0 +1,29 @@
+//--------------------------------------------------------
+// Hercules Script Configuration File
+//--------------------------------------------------------
+
+
+warn_func_mismatch_paramnum: yes
+
+check_cmdcount: 655360
+
+check_gotocount: 2048
+
+// Default value of the 'min' argument of the script command 'input'.
+// When the 'min' argument isn't provided, this value is used instead.
+// Defaults to 0.
+//input_min_value: 0
+
+// Default value of the 'max' argument of the script command 'input'.
+// When the 'max' argument isn't provided, this value is used instead.
+// Defaults to INT_MAX.
+//input_max_value: 2147483647
+input_max_value: 10000000
+
+// Specifies whether or not each built-in function's arguments are checked for
+// correct type. When a function is given an argument different from what it
+// expects, a warning is thrown before the function is ran anyway.
+// Default: yes
+warn_func_mismatch_argtypes: yes
+
+import: conf/import/script_conf.txt
diff --git a/conf/script_athena.conf b/conf/script_athena.conf
deleted file mode 100644
index 21d4a6f45..000000000
--- a/conf/script_athena.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-// When choosing those which it refines setting the letter which is indicated. (Those for word use other than Japanese?)
-refine_posword: Head,Body,Left hand,Right hand,Robe,Shoes,Accessory 1,Accessory 2,Head 2,Head 3,Not Equipped
diff --git a/conf/subnet.conf b/conf/subnet.conf
new file mode 100644
index 000000000..e91fb7376
--- /dev/null
+++ b/conf/subnet.conf
@@ -0,0 +1,6 @@
+// Subnet support file
+// Format is:
+// subnet: net-submask:char_ip:map_ip
+// you can add more than one subnet
+
+subnet: 255.0.0.0:127.0.0.1:127.0.0.1
diff --git a/conf/water.txt b/conf/water.txt
deleted file mode 100644
index 71f98470d..000000000
--- a/conf/water.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// 水の設定。
-// waterは水ありでall_waterは全て水だと判断するマップ。
-
-mjolnir_12.gat mapflag water
-mjolnir_02.gat mapflag water
-glast_01.gat mapflag water
-gef_fild04.gat mapflag water
-prt_fild02.gat mapflag water
-prt_fild01.gat mapflag water
-prt_fild00.gat mapflag water
-gef_fild00.gat mapflag water
-gef_fild07.gat mapflag water
-gef_fild13.gat mapflag water
-gef_fild09.gat mapflag water
-gef_fild01.gat mapflag water
-prt_fild05.gat mapflag water
-gef_fild03.gat mapflag water
-gef_fild10.gat mapflag water
-prt_fild10.gat mapflag water
-pay_arche.gat mapflag water
-moc_ruins.gat mapflag water
-comodo.gat mapflag water
-cmd_fild01.gat mapflag water
-cmd_fild02.gat mapflag water
-cmd_fild03.gat mapflag water
-cmd_fild04.gat mapflag water
-cmd_fild05.gat mapflag water
-moc_fild11.gat mapflag water
-ama_fild01.gat mapflag water
-
-iz_dun00.gat mapflag water
-iz_dun01.gat mapflag water
-iz_dun02.gat mapflag water
-//iz_dun03.gat mapflag all_water
-//iz_dun04.gat mapflag all_water
-treasure01.gat mapflag water
-treasure02.gat mapflag water
-mjo_dun01.gat mapflag water
-orcsdun02.gat mapflag water
-pay_dun01.gat mapflag water
-pay_dun02.gat mapflag water
-pay_dun03.gat mapflag water
-prt_sewb2.gat mapflag water
-prt_sewb3.gat mapflag water
-gl_prison1.gat mapflag water
-alde_dun03.gat mapflag water
-alde_dun04.gat mapflag water
-beach_dun.gat mapflag water
-beach_dun2.gat mapflag water
-beach_dun3.gat mapflag water
-tur_dun01.gat mapflag water
-gld_dun02.gat mapflag water
-gld_dun03.gat mapflag water
-gld_dun04.gat mapflag water
diff --git a/conf/water_height.txt b/conf/water_height.txt
deleted file mode 100644
index 9a89e29c0..000000000
--- a/conf/water_height.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// 水場の高さを設定
-//water_height.txt@AthenaDB計画 2004/03/31 18:52:09 +0900 (JST)
-
-xmas.gat 3
-mjolnir_01.gat 0
-mjolnir_02.gat -19
-mjolnir_12.gat 15
-prt_fild00.gat 11
-prt_fild01.gat 25
-prt_fild02.gat 42
-prt_fild04.gat 14
-prt_fild05.gat 14
-prt_fild10.gat 40
-gef_fild00.gat 10
-gef_fild01.gat 14
-gef_fild03.gat 82
-gef_fild04.gat 14
-gef_fild07.gat 19
-gef_fild09.gat 11
-gef_fild10.gat 24
-moc_fild01.gat 26
-moc_fild11.gat 9
-iz_dun00.gat 5
-iz_dun01.gat 5
-iz_dun02.gat -58
-mjo_dun01.gat 7
-orcsdun02.gat 3
-pay_dun01.gat 8
-pay_dun02.gat 5
-pay_dun03.gat 10
-prt_sewb2.gat 5
-prt_sewb3.gat 5
-treasure01.gat -4
-treasure02.gat -1
-moc_ruins.gat 6
-pay_arche.gat 8
-glast_01.gat 8
-alde_dun03.gat 2
-alde_dun04.gat 0
-gl_prison1.gat 35
-gl_sew01.gat 56
-gl_sew02.gat 12
-gl_sew03.gat 15
-gl_sew04.gat 70
-comodo.gat 14
-cmd_fild01.gat 46
-cmd_fild02.gat 4
-cmd_fild03.gat 0
-cmd_fild04.gat 4
-cmd_fild05.gat 46
-beach_dun2.gat 6
-beach_dun3.gat 0
-beach_dun.gat 9
-gef_fild13.gat 19
-gld_dun02.gat 5
-gld_dun03.gat 14
-gld_dun04.gat 3
-aldeg_cas01.gat 40
-aldeg_cas02.gat 35
-aldeg_cas03.gat 16
-aldeg_cas04.gat 31
-aldeg_cas05.gat 25
-gefg_cas02.gat 8
-gefg_cas04.gat 15
-gefg_cas05.gat 5
-prtg_cas05.gat 13
-tur_dun01.gat -65
-ama_fild01.gat 5