summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusalva Jesusalva <jesusalva@themanaworld.org>2022-10-17 23:09:51 +0000
committerJesusalva Jesusalva <jesusalva@themanaworld.org>2022-10-17 23:09:51 +0000
commit861814c9ae1ee81bd69c71dca0645c96ffbb566f (patch)
tree7e8477ec114d5efb82cf9f4a9e1f5866748ec10d
parent01992b738bbaa6716c86514d24b13ce5fe1144a8 (diff)
downloadserverdata-861814c9ae1ee81bd69c71dca0645c96ffbb566f.tar.gz
serverdata-861814c9ae1ee81bd69c71dca0645c96ffbb566f.tar.bz2
serverdata-861814c9ae1ee81bd69c71dca0645c96ffbb566f.tar.xz
serverdata-861814c9ae1ee81bd69c71dca0645c96ffbb566f.zip
TMW rEvolt Alt. Gameplay
-rw-r--r--conf/map/battle/exp.conf16
-rw-r--r--conf/map/battle/player.conf12
-rw-r--r--db/constants.conf26
-rw-r--r--db/re/exp_group_db.conf30
-rw-r--r--db/re/item_db.conf263
-rw-r--r--db/re/job_db.conf140
-rw-r--r--db/re/mob_db.conf600
-rw-r--r--db/re/skill_tree.conf10
-rw-r--r--db/re/statpoint.txt379
-rw-r--r--npc/000-0/sailors.txt50
-rw-r--r--npc/000-1/lean.txt19
-rw-r--r--npc/000-1/panels.txt3
-rw-r--r--npc/000-1/sapartan.txt1
-rw-r--r--npc/000-1/shop.txt5
-rw-r--r--npc/000-2-1/arpan.txt15
-rw-r--r--npc/000-2-3/nard.txt5
-rw-r--r--npc/001-1/beuss.txt9
-rw-r--r--npc/001-1/enora.txt49
-rw-r--r--npc/001-1/rumly.txt120
-rw-r--r--npc/001-1/salem.txt13
-rw-r--r--npc/001-1/shop.txt4
-rw-r--r--npc/001-2-4/books.txt4
-rw-r--r--npc/001-2-4/terry.txt38
-rw-r--r--npc/001-2-5/books.txt2
-rw-r--r--npc/001-2-5/tutorial.txt1
-rw-r--r--npc/001-2-6/books.txt16
-rw-r--r--npc/001-2-6/dolfina.txt6
-rw-r--r--npc/001-2-6/leonard.txt1
-rw-r--r--npc/008-2-16/stove.txt1
-rw-r--r--npc/008-2-16/yannika.txt7
-rw-r--r--npc/009-2-7/leofwin.txt3
-rw-r--r--npc/012-2-4/morgan.txt2
-rw-r--r--npc/012-3-3/manatree.txt82
-rw-r--r--npc/020-1/inar.txt2
-rw-r--r--npc/020-1/malivox.txt2
-rw-r--r--npc/020-1/neko.txt2
-rw-r--r--npc/020-2-20/riskim.txt1
-rw-r--r--npc/commands/info.txt99
-rw-r--r--npc/commands/rate-management.txt10
-rw-r--r--npc/functions/casino.txt4
-rw-r--r--npc/functions/crafting.txt6
-rw-r--r--npc/functions/fishing.txt4
-rw-r--r--npc/functions/foraging.txt148
-rw-r--r--npc/functions/global_event_handler.txt13
-rw-r--r--npc/functions/hunting.txt64
-rw-r--r--npc/functions/mining.txt49
-rw-r--r--npc/functions/mmo.txt538
-rw-r--r--npc/functions/rebirth.txt97
-rw-r--r--npc/functions/resetstatus.txt117
-rw-r--r--npc/functions/skills.txt71
-rw-r--r--npc/functions/string.txt4
-rw-r--r--npc/functions/util.txt4
-rw-r--r--npc/functions/vault.txt38
-rw-r--r--npc/scripts.conf10
54 files changed, 2182 insertions, 1033 deletions
diff --git a/conf/map/battle/exp.conf b/conf/map/battle/exp.conf
index 0db88b71..797497ab 100644
--- a/conf/map/battle/exp.conf
+++ b/conf/map/battle/exp.conf
@@ -33,13 +33,13 @@
//=========================================================================
// Rate at which exp. is given. (Note 2)
-base_exp_rate: 100
+base_exp_rate: 0
// Rate at which job exp. is given. (Note 2)
-job_exp_rate: 100
+job_exp_rate: 0
// Turn this on to allow a player to level up more than once from a kill. (Note 1)
-multi_level_up: false
+multi_level_up: true
// Setting this can cap the max experience one can get per kill specified as a
// % of the current exp bar. (Every 10 = 1.0%)
@@ -57,11 +57,11 @@ 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: 30
+exp_bonus_attacker: 20
// 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: 10
+exp_bonus_max_attacker: 12
// MVP bonus exp rate. (Note 2)
mvp_exp_rate: 100
@@ -90,13 +90,13 @@ pvp_exp: true
// 0 = No penalty.
// 1 = Lose % of current level when killed.
// 2 = Lose % of total experience when killed.
-death_penalty_type: 1
+death_penalty_type: 0
// Base exp. penalty rate (Each 100 is 1% of their exp)
-death_penalty_base: 100
+death_penalty_base: 0
// Job exp. penalty rate (Each 100 is 1% of their exp)
-death_penalty_job: 100
+death_penalty_job: 0
// 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%
diff --git a/conf/map/battle/player.conf b/conf/map/battle/player.conf
index aa9cf92f..81455d36 100644
--- a/conf/map/battle/player.conf
+++ b/conf/map/battle/player.conf
@@ -105,22 +105,22 @@ max_hp: 1000000
max_sp: 1000000
// Max limit of char stats. (agi, str, etc.)
-max_parameter: 99
+max_parameter: 255
// Same as max_parameter, but for 3rd classes.
-max_third_parameter: 130
+max_third_parameter: 255
// Same as max_parameter, but for extended classes (Ex. Super Novice, Kagero/Oboro, Rebellion).
-max_extended_parameter: 125
+max_extended_parameter: 255
// Same as max_parameter, but for summoner class
-max_summoner_parameter: 120
+max_summoner_parameter: 255
// Same as max_parameter, but for baby classes.
-max_baby_parameter: 80
+max_baby_parameter: 255
// Same as max_parameter, but for baby 3rd's.
-max_baby_third_parameter: 117
+max_baby_third_parameter: 255
// Max armor def/mdef
// NOTE: This setting have no effect if server is run on Renewal Mode (RENEWAL)
diff --git a/db/constants.conf b/db/constants.conf
index 895d575f..55258740 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -717,8 +717,8 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
RC_Undead: 1
RC_Brute: 2
RC_Plant: 3
- RC_Insect: 4
- RC_Fish: 5
+ RC_Forage: 4
+ RC_Mineral: 5
RC_Demon: 6
RC_DemiHuman: 7
RC_Angel: 8
@@ -732,6 +732,10 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
RC_NonDemiPlayer: 17
RC_All: 255
+ comment__: "Deprecated Races"
+ RC_Insect: 4
+ RC_Fish: 5
+
comment__: "Subraces"
RC2_None: 0
RC2_Goblin: 1
@@ -5279,5 +5283,23 @@ more than one separator can be used in a row (so 12_3___456 is illegal).
KYLIAN_HETCHEL: 16
KYLIAN_HOCUS: 32
+ comment__: "OnPCBonusEvent constants"
+ PCB_ATKBONUS: 1
+ PCB_MATKBONUS: 2
+ PCB_DEFBONUS: 4
+ PCB_MDEFBONUS: 8
+ PCB_EVDBONUS: 16
+ PCB_HITBONUS: 32
+ PCB_CRITBONUS: 64
+ PCB_DOUBLEATK: 128
+ PCB_ALLSTATS: 256
+ PCB_HPBONUS: 512
+ PCB_MPBONUS: 1024
+ PCB_ASPDBONUS: 2048
+ PCB_WSPDBONUS: 4096
+ PCB_WEIGHTBONUS: 8192
+ PCB_EXPBONUS: 16384
+ PCB_NOKNOCKBACK: 32768
+
@include "conf/import/constants.conf"
}
diff --git a/db/re/exp_group_db.conf b/db/re/exp_group_db.conf
index 07522675..ae5f46f1 100644
--- a/db/re/exp_group_db.conf
+++ b/db/re/exp_group_db.conf
@@ -29,9 +29,8 @@
base_exp_group_db: {
EvolClasses: {
- MaxLevel: 99
+ MaxLevel: 110
Exp: [
- 9,16,25,36,77,112,153,200,253,320,
385,490,585,700,830,970,1120,1260,1420,1620,
1860,1990,2240,2504,2950,3426,3934,4474,6889,7995,
9174,10425,11748,13967,15775,17678,19677,21773,30543,34212,
@@ -40,25 +39,28 @@ base_exp_group_db: {
403224,442116,482590,536948,585191,635278,687211,740988,925400,1473746,
1594058,1718928,1848355,1982340,2230113,2386162,2547417,2713878,3206160,3681024,
4022472,4377024,4744680,5125440,5767272,6204000,6655464,7121664,7602600,9738720,
- 11649960,13643520,18339300,23836800,35658000,48687000,58135000,99999998,
+ 11649960,13643520,18339300,23836800,35658000,48687000,58135000,99999999,103000000,
+ 107000000, 112000000, 116000000, 121000000, 125000000, 130000000, 134000000, 139000000, 145000000, 152200000,
+ 160840000, 171200000, 191930000, 202290000, 214720000, 229640000, 247550000, 283370000, 301280000, 322770000,
]
}
}
job_exp_group_db: {
EvolClasses: {
- MaxLevel: 99
+ MaxLevel: 110
Exp: [
- 30, 43, 58, 76, 116, 180, 220, 272, 336, 520,
- 604, 699, 802, 948, 1125, 1668, 1937, 2226, 3040, 3988,
- 5564, 6272, 7021, 9114, 11473, 15290, 16891, 18570, 23229, 28359,
- 36478, 39716, 43088, 52417, 62495, 78160, 84175, 90404, 107611, 125915,
- 153941, 191781, 204351, 248352, 286212, 386371, 409795, 482092, 509596, 982092,
- 992092, 1002092, 1012092, 1022092, 1032092, 1042092, 1052092, 1062092, 1072092, 1082092,
- 1092092, 1102092, 1112092, 1122092, 1132092, 1142092, 1152092, 1162092, 1172092, 1182092,
- 1192092, 1202092, 1212092, 1222092, 1232092, 1242092, 1252092, 1262092, 1272092, 1282092,
- 1292092, 1302092, 1312092, 1322092, 1332092, 1342092, 1352092, 1362092, 1372092, 1382092,
- 1392092, 1402092, 1412092, 1422092, 1432092, 1442092, 1452092, 1462092,
+ 385,490,585,700,830,970,1120,1260,1420,1620,
+ 1860,1990,2240,2504,2950,3426,3934,4474,6889,7995,
+ 9174,10425,11748,13967,15775,17678,19677,21773,30543,34212,
+ 38065,42102,46323,53026,58419,64041,69892,75973,102468,115254,
+ 128692,142784,157528,178184,196300,215198,234879,255341,330188,365914,
+ 403224,442116,482590,536948,585191,635278,687211,740988,925400,1473746,
+ 1594058,1718928,1848355,1982340,2230113,2386162,2547417,2713878,3206160,3681024,
+ 4022472,4377024,4744680,5125440,5767272,6204000,6655464,7121664,7602600,9738720,
+ 11649960,13643520,18339300,23836800,35658000,48687000,58135000,99999999,103000000,
+ 107000000, 112000000, 116000000, 121000000, 125000000, 130000000, 134000000, 139000000, 145000000, 152200000,
+ 160840000, 171200000, 191930000, 202290000, 214720000, 229640000, 247550000, 283370000, 301280000, 322770000,
]
}
}
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 436698ad..5f710423 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -2563,8 +2563,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 1
+ Matk: 2
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2584,8 +2584,8 @@ item_db: (
Buy: 20000
Sell: 1000
Weight: 70
- Atk: 10
- Matk: 30
+ Atk: 1
+ Matk: 3
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2605,8 +2605,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 25
- Matk: 50
+ Atk: 2
+ Matk: 5
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2626,8 +2626,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 50
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2647,8 +2647,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 50
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2668,8 +2668,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 50
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 2
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2689,8 +2689,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 50
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 3
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2710,8 +2710,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 50
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 4
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2731,7 +2731,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 70
- Atk: 10
+ Atk: 1
Matk: 0
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
@@ -2749,7 +2749,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 20
+ Atk: 2
Matk: 0
Slots: 1
Loc: "EQP_COSTUME_HEAD_TOP"
@@ -2770,7 +2770,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 120
- Atk: 40
+ Atk: 4
Matk: 0
Slots: 2
Loc: "EQP_COSTUME_HEAD_TOP"
@@ -2791,8 +2791,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 150
- Atk: 5
- Matk: 10
+ Matk: 1
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2809,8 +2808,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 150
- Atk: 10
- Matk: 15
+ Atk: 1
+ Matk: 1
Slots: 0
Loc: "EQP_COSTUME_HEAD_TOP"
WeaponLv: 0
@@ -2846,8 +2845,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 1
+ Matk: 2
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2864,8 +2863,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 1
+ Matk: 3
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2882,8 +2881,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 2
+ Matk: 3
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2900,8 +2899,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 2
+ Matk: 4
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2918,8 +2917,8 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Atk: 1
+ Matk: 1
Slots: 0
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2936,8 +2935,7 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Matk: 2
Slots: 1
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2957,8 +2955,8 @@ item_db: (
Buy: 20000
Sell: 1000
Weight: 70
- Atk: 10
- Matk: 30
+ Atk: 1
+ Matk: 3
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -2979,8 +2977,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 25
- Matk: 50
+ Atk: 2
+ Matk: 5
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3001,8 +2999,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 3
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3023,8 +3021,7 @@ item_db: (
Buy: 10000
Sell: 400
Weight: 50
- Atk: 5
- Matk: 25
+ Matk: 2
Slots: 1
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3044,8 +3041,8 @@ item_db: (
Buy: 20000
Sell: 1000
Weight: 70
- Atk: 10
- Matk: 30
+ Atk: 1
+ Matk: 3
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3066,8 +3063,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 25
- Matk: 50
+ Atk: 2
+ Matk: 5
Slots: 2
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3088,8 +3085,8 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Atk: 40
- Matk: 80
+ Atk: 4
+ Matk: 8
Slots: 3
Loc: "EQP_COSTUME_HEAD_MID"
WeaponLv: 0
@@ -3112,7 +3109,7 @@ item_db: (
Sell: 5000
Weight: 80
Atk: 0
- Matk: 10
+ Matk: 1
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
@@ -3151,7 +3148,7 @@ item_db: (
Sell: 5000
Weight: 120
Atk: 0
- Matk: 20
+ Matk: 2
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
@@ -3169,7 +3166,7 @@ item_db: (
Sell: 5000
Weight: 220
Atk: 0
- Matk: 30
+ Matk: 3
Slots: 0
Loc: "EQP_ACC_L"
WeaponLv: 0
@@ -3460,7 +3457,7 @@ item_db: (
Buy: 150000
Sell: 45000
Weight: 3500
- Def: 65
+ Def: 32
Slots: 2
Loc: "EQP_HEAD_MID"
WeaponLv: 0
@@ -3512,7 +3509,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Def: 50
+ Def: 5
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
@@ -3529,7 +3526,7 @@ item_db: (
Buy: 50000
Sell: 5000
Weight: 100
- Def: 100
+ Def: 18
Slots: 0
Loc: "EQP_HEAD_MID"
WeaponLv: 0
@@ -4381,7 +4378,7 @@ item_db: (
Buy: 10000
Sell: 1000
Weight: 100
- Def: 10
+ Def: 8
Slots: 0
Loc: "EQP_HEAD_LOW"
WeaponLv: 0
@@ -4417,7 +4414,7 @@ item_db: (
Buy: 150
Sell: 50
Weight: 400
- Def: 100
+ Def: 10
Slots: 0
Loc: "EQP_HAND_L"
WeaponLv: 0
@@ -4425,10 +4422,11 @@ item_db: (
Refine: false
ViewSprite: 2700
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAspd, -30;
bonus bCriticalDef, 15;
bonus bAtkRange, -5;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4439,14 +4437,15 @@ item_db: (
Buy: 2000
Sell: 250
Weight: 100
- Def: 50
+ Def: 5
Loc: "EQP_HAND_L"
EquipLv: 7
Refine: false
ViewSprite: 2701
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4457,14 +4456,15 @@ item_db: (
Buy: 5000
Sell: 750
Weight: 2450
- Def: 100
+ Def: 10
Loc: "EQP_HAND_L"
EquipLv: 27
Refine: false
ViewSprite: 2702
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4475,7 +4475,7 @@ item_db: (
Buy: 25000
Sell: 2630
Weight: 5500
- Def: 150
+ Def: 15
Matk: -200
Slots: 1
Loc: "EQP_HAND_L"
@@ -4483,8 +4483,9 @@ item_db: (
Refine: false
ViewSprite: 2703
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
AllowCards: {
id5503: 1 // Crude Gem
@@ -4498,14 +4499,15 @@ item_db: (
Buy: 5000
Sell: 750
Weight: 2450
- Def: 180
+ Def: 18
Loc: "EQP_HAND_L"
EquipLv: 57
Refine: false
ViewSprite: 2704
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4516,14 +4518,15 @@ item_db: (
Buy: 5000
Sell: 750
Weight: 2450
- Def: 100
+ Def: 10
Loc: "EQP_HAND_L"
EquipLv: 67
Refine: false
ViewSprite: 2705
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4534,14 +4537,15 @@ item_db: (
Buy: 5000
Sell: 750
Weight: 2450
- Def: 210
+ Def: 21
Loc: "EQP_HAND_L"
EquipLv: 77
Refine: false
ViewSprite: 2706
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
{
@@ -4552,14 +4556,15 @@ item_db: (
Buy: 5000
Sell: 750
Weight: 850
- Def: 685
+ Def: 68
Loc: "EQP_HAND_L"
EquipLv: 17
Refine: false
ViewSprite: 2707
BindOnEquip: false
- OnEquipScript: <"
+ Script: <"
bonus bAtkRange, -1;
+ bonus bMaxHPrate, 10;
">
},
// Headgear
@@ -4737,7 +4742,7 @@ item_db: (
Sell: 750
Weight: 50
Atk: 0
- Matk: 25
+ Matk: 3
Def: 1
Slots: 0
Loc: "EQP_HEAD_TOP"
@@ -5063,7 +5068,7 @@ item_db: (
Weight: 100
Atk: 0
Matk: -10
- Def: 1
+ Def: 12
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
@@ -5255,7 +5260,7 @@ item_db: (
Weight: 100
Atk: 0
Matk: -10
- Def: 12
+ Def: 8
Slots: 0
Loc: "EQP_HEAD_TOP"
WeaponLv: 0
@@ -5420,7 +5425,7 @@ item_db: (
Buy: 6500
Sell: 450
Weight: 8
- Def: 8
+ Def: 6
Loc: "EQP_ACC_R"
EquipLv: 65
Refine: false
@@ -5466,7 +5471,7 @@ item_db: (
Buy: 90
Sell: 25
Weight: 6
- Atk: 10
+ Atk: 1
Matk: 0
Range: 0
Slots: 0
@@ -5488,7 +5493,7 @@ item_db: (
Buy: 1100
Sell: 300
Weight: 26
- Atk: 25
+ Atk: 3
Matk: 0
Range: 0
Slots: 0
@@ -5510,7 +5515,7 @@ item_db: (
Buy: 5000
Sell: 400
Weight: 58
- Atk: 40
+ Atk: 4
Matk: 0
Range: 0
Slots: 0
@@ -5532,7 +5537,7 @@ item_db: (
Buy: 500
Sell: 50
Weight: 25
- Atk: 40
+ Atk: 4
Matk: 0
Range: 0
Slots: 0
@@ -5554,7 +5559,7 @@ item_db: (
Buy: 25800
Sell: 1200
Weight: 86
- Atk: 120
+ Atk: 12
Matk: 0
Range: 0
Slots: 0
@@ -5576,8 +5581,8 @@ item_db: (
Buy: 20000
Sell: 1500
Weight: 67
- Atk: 10
- Matk: 250
+ Atk: 1
+ Matk: 25
Range: 0
Slots: 0
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -5606,8 +5611,8 @@ item_db: (
Buy: 12500
Sell: 1000
Weight: 150
- Atk: 10
- Matk: 150
+ Atk: 1
+ Matk: 15
Range: 0
Slots: 0
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -5636,7 +5641,7 @@ item_db: (
Buy: 104800
Sell: 1750
Weight: 1200
- Atk: 100
+ Atk: 10
Matk: 0
Def: 2
Range: 2
@@ -5659,7 +5664,7 @@ item_db: (
Buy: 2500
Sell: 500
Weight: 350
- Atk: 120
+ Atk: 12
Matk: 0
Range: 0
Slots: 0
@@ -5681,7 +5686,7 @@ item_db: (
Buy: 25000
Sell: 5000
Weight: 250
- Atk: 150
+ Atk: 15
Matk: 0
Range: 0
Slots: 0
@@ -5703,7 +5708,7 @@ item_db: (
Buy: 17500
Sell: 3700
Weight: 250
- Atk: 130
+ Atk: 13
Matk: 0
Range: 0
Slots: 0
@@ -5725,7 +5730,7 @@ item_db: (
Buy: 2500
Sell: 500
Weight: 100
- Atk: 85
+ Atk: 8
Matk: 0
Range: 0
Slots: 0
@@ -5751,7 +5756,7 @@ item_db: (
Buy: 12000
Sell: 2000
Weight: 500
- Atk: 80
+ Atk: 8
Matk: 0
Def: 2
Range: 0
@@ -5774,9 +5779,9 @@ item_db: (
Buy: 10000
Sell: 1500
Weight: 800
- Atk: 80
+ Atk: 8
Matk: 0
- Def: 50
+ Def: 5
Range: 2
Slots: 0
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -5797,7 +5802,7 @@ item_db: (
Buy: 25000
Sell: 7500
Weight: 1200
- Atk: 170
+ Atk: 17
Matk: 0
Def: 8
Range: 2
@@ -5820,7 +5825,7 @@ item_db: (
Buy: 180
Sell: 50
Weight: 15
- Atk: 120
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 1
@@ -5839,7 +5844,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5858,7 +5863,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5877,7 +5882,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 13
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5896,7 +5901,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 13
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5915,7 +5920,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5934,7 +5939,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5953,7 +5958,7 @@ item_db: (
Buy: 20000
Sell: 4000
Weight: 250
- Atk: 125
+ Atk: 12
Loc: "EQP_HAND_R"
WeaponLv: 1
EquipLv: 15
@@ -5972,7 +5977,7 @@ item_db: (
Buy: 25000
Sell: 7500
Weight: 1200
- Atk: 170
+ Atk: 17
Matk: 0
Def: 8
Range: 2
@@ -5995,7 +6000,7 @@ item_db: (
Buy: 25000
Sell: 7500
Weight: 1200
- Atk: 170
+ Atk: 17
Matk: 0
Def: 8
Range: 2
@@ -6018,9 +6023,9 @@ item_db: (
Buy: 10000
Sell: 1500
Weight: 800
- Atk: 80
- Matk: 500
- Def: 50
+ Atk: 8
+ Matk: 50
+ Def: 5
Range: 4
Slots: 1
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6044,9 +6049,9 @@ item_db: (
Buy: 10000
Sell: 1500
Weight: 800
- Atk: 80
- Matk: 500
- Def: 50
+ Atk: 8
+ Matk: 50
+ Def: 5
Range: 4
Slots: 1
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6070,9 +6075,9 @@ item_db: (
Buy: 10000
Sell: 1500
Weight: 800
- Atk: 80
- Matk: 500
- Def: 50
+ Atk: 8
+ Matk: 50
+ Def: 5
Range: 4
Slots: 3
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6096,9 +6101,9 @@ item_db: (
Buy: 10000
Sell: 1500
Weight: 75
- Atk: 50
- Matk: 200
- Def: 10
+ Atk: 5
+ Matk: 20
+ Def: 1
Range: 3
Slots: 1
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6705,7 +6710,7 @@ item_db: (
Buy: 550
Sell: 52
Weight: 12
- Atk: 40
+ Atk: 4
Range: 4
MinRange: 2
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6728,7 +6733,7 @@ item_db: (
Buy: 1200
Sell: 250
Weight: 260
- Atk: 115
+ Atk: 12
Range: 5
MinRange: 2
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6751,7 +6756,7 @@ item_db: (
Buy: 7500
Sell: 1250
Weight: 480
- Atk: 150
+ Atk: 15
Range: 6
MinRange: 2
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6774,7 +6779,7 @@ item_db: (
Buy: 7500
Sell: 1250
Weight: 390
- Atk: 250
+ Atk: 25
Range: 7
MinRange: 2
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6797,7 +6802,7 @@ item_db: (
Buy: 7500
Sell: 1250
Weight: 580
- Atk: 350
+ Atk: 35
Range: 6
MinRange: 1
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6820,7 +6825,7 @@ item_db: (
Buy: 7500
Sell: 1250
Weight: 480
- Atk: 450
+ Atk: 45
Range: 6
MinRange: 1
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
@@ -6843,7 +6848,7 @@ item_db: (
Buy: 7500
Sell: 1250
Weight: 100
- Atk: 250
+ Atk: 25
Range: 4
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
WeaponLv: 1
@@ -6862,7 +6867,7 @@ item_db: (
Buy: 3
Sell: 1
Weight: 1
- Atk: 100
+ Atk: 10
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
@@ -6874,7 +6879,7 @@ item_db: (
Buy: 6
Sell: 2
Weight: 2
- Atk: 150
+ Atk: 15
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
@@ -6886,7 +6891,7 @@ item_db: (
Buy: 8
Sell: 3
Weight: 0
- Atk: 180
+ Atk: 18
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
@@ -6898,7 +6903,7 @@ item_db: (
Buy: 10
Sell: 3
Weight: 1
- Atk: 200
+ Atk: 20
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
@@ -6910,7 +6915,7 @@ item_db: (
Buy: 12
Sell: 4
Weight: 1
- Atk: 250
+ Atk: 25
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
@@ -6922,7 +6927,7 @@ item_db: (
Buy: 2
Sell: 0
Weight: 1
- Atk: 200
+ Atk: 20
Loc: "EQP_AMMO"
Subtype: "A_ARROW"
},
diff --git a/db/re/job_db.conf b/db/re/job_db.conf
index 770da909..35a12219 100644
--- a/db/re/job_db.conf
+++ b/db/re/job_db.conf
@@ -70,22 +70,18 @@ Talpan: {
Bow: 80
Katar: 65
}
- HPTable:[ 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, // 1 - 10
- 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, // 11 - 20
- 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850, // 21 - 30
- 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, // 31 - 40
- 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, // 41 - 50
- 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, // 51 - 60
- 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, // 61 - 70
- 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, // 71 - 80
- 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, // 81 - 90
- 4900, 4950, 5000, 5050, 5100, 5150, 5200, 5250, 5300, 5350, // 91 - 100
- 5400, 5450, 5500, 5550, 5600, 5650, 5700, 5750, 5800, 5850, // 101 - 110
- 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, // 111 - 120
- 6400, 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, // 121 - 130
- 6900, 6950, 7000, 7050, 7100, 7150, 7200, 7250, 7300, 7350, // 131 - 140
- 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, 7850, // 141 - 150
- 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 835] // 151 - 160
+ HPTable:[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 1 - 10
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, // 11 - 20
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 21 - 30
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, // 31 - 40
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // 41 - 50
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, // 51 - 60
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, // 61 - 70
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 71 - 80
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, // 81 - 90
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, // 91 - 100
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 101 - 110
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169] // 111 - 120
SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
@@ -123,22 +119,18 @@ CaveUkar: {
Bow: 80
Katar: 65
}
- HPTable:[ 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, // 1 - 10
- 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, // 11 - 20
- 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850, // 21 - 30
- 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, // 31 - 40
- 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, // 41 - 50
- 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, // 51 - 60
- 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, // 61 - 70
- 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, // 71 - 80
- 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, // 81 - 90
- 4900, 4950, 5000, 5050, 5100, 5150, 5200, 5250, 5300, 5350, // 91 - 100
- 5400, 5450, 5500, 5550, 5600, 5650, 5700, 5750, 5800, 5850, // 101 - 110
- 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, // 111 - 120
- 6400, 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, // 121 - 130
- 6900, 6950, 7000, 7050, 7100, 7150, 7200, 7250, 7300, 7350, // 131 - 140
- 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, 7850, // 141 - 150
- 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 835] // 151 - 160
+ HPTable:[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 1 - 10
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, // 11 - 20
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 21 - 30
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, // 31 - 40
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // 41 - 50
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, // 51 - 60
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, // 61 - 70
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 71 - 80
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, // 81 - 90
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, // 91 - 100
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 101 - 110
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169] // 111 - 120
SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
@@ -175,22 +167,18 @@ FireKralog: {
Bow: 80
Katar: 65
}
- HPTable:[ 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, // 1 - 10
- 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, // 11 - 20
- 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850, // 21 - 30
- 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, // 31 - 40
- 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, // 41 - 50
- 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, // 51 - 60
- 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, // 61 - 70
- 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, // 71 - 80
- 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, // 81 - 90
- 4900, 4950, 5000, 5050, 5100, 5150, 5200, 5250, 5300, 5350, // 91 - 100
- 5400, 5450, 5500, 5550, 5600, 5650, 5700, 5750, 5800, 5850, // 101 - 110
- 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, // 111 - 120
- 6400, 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, // 121 - 130
- 6900, 6950, 7000, 7050, 7100, 7150, 7200, 7250, 7300, 7350, // 131 - 140
- 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, 7850, // 141 - 150
- 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 835] // 151 - 160
+ HPTable:[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 1 - 10
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, // 11 - 20
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 21 - 30
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, // 31 - 40
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // 41 - 50
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, // 51 - 60
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, // 61 - 70
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 71 - 80
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, // 81 - 90
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, // 91 - 100
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 101 - 110
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169] // 111 - 120
SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
@@ -228,22 +216,18 @@ LightRaijin: {
Bow: 80
Katar: 65
}
- HPTable:[ 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, // 1 - 10
- 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, // 11 - 20
- 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850, // 21 - 30
- 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, // 31 - 40
- 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, // 41 - 50
- 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, // 51 - 60
- 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, // 61 - 70
- 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, // 71 - 80
- 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, // 81 - 90
- 4900, 4950, 5000, 5050, 5100, 5150, 5200, 5250, 5300, 5350, // 91 - 100
- 5400, 5450, 5500, 5550, 5600, 5650, 5700, 5750, 5800, 5850, // 101 - 110
- 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, // 111 - 120
- 6400, 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, // 121 - 130
- 6900, 6950, 7000, 7050, 7100, 7150, 7200, 7250, 7300, 7350, // 131 - 140
- 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, 7850, // 141 - 150
- 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 835] // 151 - 160
+ HPTable:[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 1 - 10
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, // 11 - 20
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 21 - 30
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, // 31 - 40
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // 41 - 50
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, // 51 - 60
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, // 61 - 70
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 71 - 80
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, // 81 - 90
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, // 91 - 100
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 101 - 110
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169] // 111 - 120
SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
@@ -281,22 +265,18 @@ SeaTritan: {
Bow: 80
Katar: 65
}
- HPTable:[ 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, // 1 - 10
- 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, // 11 - 20
- 1400, 1450, 1500, 1550, 1600, 1650, 1700, 1750, 1800, 1850, // 21 - 30
- 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, // 31 - 40
- 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, // 41 - 50
- 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, // 51 - 60
- 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, // 61 - 70
- 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, // 71 - 80
- 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, // 81 - 90
- 4900, 4950, 5000, 5050, 5100, 5150, 5200, 5250, 5300, 5350, // 91 - 100
- 5400, 5450, 5500, 5550, 5600, 5650, 5700, 5750, 5800, 5850, // 101 - 110
- 5900, 5950, 6000, 6050, 6100, 6150, 6200, 6250, 6300, 6350, // 111 - 120
- 6400, 6450, 6500, 6550, 6600, 6650, 6700, 6750, 6800, 6850, // 121 - 130
- 6900, 6950, 7000, 7050, 7100, 7150, 7200, 7250, 7300, 7350, // 131 - 140
- 7400, 7450, 7500, 7550, 7600, 7650, 7700, 7750, 7800, 7850, // 141 - 150
- 7900, 7950, 8000, 8050, 8100, 8150, 8200, 8250, 8300, 835] // 151 - 160
+ HPTable:[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, // 1 - 10
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, // 11 - 20
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 21 - 30
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, // 31 - 40
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, // 41 - 50
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, // 51 - 60
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, // 61 - 70
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, // 71 - 80
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, // 81 - 90
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, // 91 - 100
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, // 101 - 110
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169] // 111 - 120
SPTable:[ 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, // 1 - 10
65, 70, 75, 80, 85, 90, 95, 100, 105, 110, // 11 - 20
115, 120, 125, 130, 135, 140, 145, 150, 155, 160, // 21 - 30
diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf
index f86731e1..38631ef6 100644
--- a/db/re/mob_db.conf
+++ b/db/re/mob_db.conf
@@ -130,12 +130,11 @@ mob_db: (
SpriteName: "Piou"
Name: "Piou"
Lv: 1
- Hp: 110
+ Hp: 11
Sp: 0
Exp: 3
- JExp: 0
AttackRange: 1
- Attack: [22, 25]
+ Attack: [2, 5]
Def: 0
Mdef: 0
WalkMask: "WALK_AIR"
@@ -171,12 +170,11 @@ mob_db: (
SpriteName: "Piousse"
Name: "Piousse"
Lv: 2
- Hp: 220
+ Hp: 22
Sp: 0
Exp: 7
- JExp: 0
AttackRange: 1
- Attack: [38, 40]
+ Attack: [3, 4]
Def: 1
Mdef: 0
Stats: {
@@ -212,12 +210,11 @@ mob_db: (
SpriteName: "Tortuga"
Name: "Tortuga"
Lv: 3
- Hp: 325
+ Hp: 32
Sp: 0
Exp: 6
- JExp: 0
AttackRange: 1
- Attack: [44, 45]
+ Attack: [4, 5]
Def: 5
Mdef: 0
WalkMask: "WALK_WATER"
@@ -263,12 +260,11 @@ mob_db: (
SpriteName: "Ratto"
Name: "Ratto"
Lv: 5
- Hp: 540
+ Hp: 54
Sp: 0
Exp: 10
- JExp: 0
AttackRange: 1
- Attack: [49, 50]
+ Attack: [4, 5]
Def: 8
Mdef: 0
Stats: {
@@ -308,12 +304,11 @@ mob_db: (
SpriteName: "Croc"
Name: "Croc"
Lv: 8
- Hp: 900
+ Hp: 90
Sp: 0
Exp: 12
- JExp: 0
AttackRange: 1
- Attack: [64, 70]
+ Attack: [6, 7]
Def: 15
Mdef: 1
Stats: {
@@ -352,12 +347,11 @@ mob_db: (
SpriteName: "LittleBlub"
Name: "Little Blub"
Lv: 4
- Hp: 440
+ Hp: 44
Sp: 0
Exp: 7
- JExp: 0
AttackRange: 1
- Attack: [25, 30]
+ Attack: [2, 3]
Def: 6
Mdef: 1
WalkMask: "WALK_WATER"
@@ -399,12 +393,12 @@ mob_db: (
SpriteName: "Blub"
Name: "Blub"
Lv: 8
- Hp: 1300
+ Hp: 130
Sp: 0
Exp: 27
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 14
Mdef: 3
WalkMask: "WALK_WATER"
@@ -447,12 +441,11 @@ mob_db: (
SpriteName: "ToppyBlub"
Name: "Toppy Blub"
Lv: 11
- Hp: 1200
+ Hp: 120
Sp: 0
Exp: 16
- JExp: 0
AttackRange: 1
- Attack: [150, 180]
+ Attack: [15, 18]
Def: 21
Mdef: 3
WalkMask: "WALK_WATER"
@@ -494,12 +487,11 @@ mob_db: (
SpriteName: "Crocotree"
Name: "Crocotree"
Lv: 10
- Hp: 1100
+ Hp: 110
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [10, 10]
+ Attack: [1, 1]
Def: 19
Mdef: 3
Stats: {
@@ -513,7 +505,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 12
Size: 0
- Race: 3
+ Race: 4
Element: (2, 1)
MoveSpeed: 800
AttackDelay: 800
@@ -529,10 +521,9 @@ mob_db: (
SpriteName: "PlushroomField"
Name: "Plushroom Field"
Lv: 1
- Hp: 50
+ Hp: 5
Sp: 0
Exp: 0
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 0
@@ -565,12 +556,11 @@ mob_db: (
SpriteName: "Frostiana"
Name: "Frostiana"
Lv: 9
- Hp: 980
+ Hp: 98
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [95, 100]
+ Attack: [9, 10]
Def: 17
Mdef: 2
Stats: {
@@ -604,12 +594,11 @@ mob_db: (
SpriteName: "Pikpik"
Name: "Pikpik"
Lv: 10
- Hp: 1120
+ Hp: 112
Sp: 0
Exp: 16
- JExp: 0
AttackRange: 0
- Attack: [65, 100]
+ Attack: [6, 10]
Def: 19
Mdef: 3
Stats: {
@@ -642,12 +631,11 @@ mob_db: (
SpriteName: "CroconutMob"
Name: "CroconutMob"
Lv: 5
- Hp: 50
+ Hp: 5
Sp: 0
Exp: 0
- JExp: 0
AttackRange: 1
- Attack: [80, 95]
+ Attack: [8, 9]
Def: 1
Mdef: 0
Stats: {
@@ -681,12 +669,12 @@ mob_db: (
SpriteName: "Tipiu"
Name: "Tipiu"
Lv: 20
- Hp: 2200
+ Hp: 220
Sp: 0
Exp: 42
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [75, 100]
+ Attack: [7, 10]
Def: 46
Mdef: 8
WalkMask: "WALK_AIR"
@@ -726,12 +714,12 @@ mob_db: (
SpriteName: "Tipiou"
Name: "Tipiou"
Lv: 45
- Hp: 5000
+ Hp: 500
Sp: 0
Exp: 340
- JExp: 9
+ JExp:0 //9
AttackRange: 1
- Attack: [220, 250]
+ Attack: [22, 25]
Def: 128
Mdef: 22
WalkMask: "WALK_AIR"
@@ -770,12 +758,11 @@ mob_db: (
SpriteName: "MananaTree"
Name: "Manana Tree"
Lv: 5
- Hp: 600
+ Hp: 60
Sp: 0
Exp: 9
- JExp: 0
AttackRange: 1
- Attack: [10, 10]
+ Attack: [1, 1]
Def: 15
Mdef: 1
Stats: {
@@ -789,7 +776,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 12
Size: 1
- Race: 3
+ Race: 4
Element: (2, 1)
MoveSpeed: 1000
AttackDelay: 800
@@ -805,12 +792,12 @@ mob_db: (
SpriteName: "Crafty"
Name: "Crafty"
Lv: 7
- Hp: 760
+ Hp: 76
Sp: 0
Exp: 12
- JExp: 1
+ JExp:0 //1
AttackRange: 1
- Attack: [25, 30]
+ Attack: [2, 3]
Def: 12
Mdef: 1
Stats: {
@@ -848,12 +835,11 @@ mob_db: (
SpriteName: "PumpkinMob"
Name: "PumpkinMob"
Lv: 1
- Hp: 1900
+ Hp: 190
Sp: 0
Exp: 2
- JExp: 0
AttackRange: 1
- Attack: [10, 10]
+ Attack: [1, 1]
Def: 20
Mdef: 0
Stats: {
@@ -883,12 +869,11 @@ mob_db: (
SpriteName: "Cuco"
Name: "Cuco"
Lv: 25
- Hp: 2700
+ Hp: 270
Sp: 0
Exp: 37
- JExp: 0
AttackRange: 1
- Attack: [150, 200]
+ Attack: [15, 20]
Def: 60
Mdef: 10
Stats: {
@@ -929,9 +914,8 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
- Attack: [10, 10]
+ Attack: [1, 1]
Def: 100
Mdef: 1
Stats: {
@@ -960,12 +944,11 @@ mob_db: (
SpriteName: "Fluffy"
Name: "Fluffy"
Lv: 4
- Hp: 440
+ Hp: 44
Sp: 0
Exp: 6
- JExp: 0
AttackRange: 1
- Attack: [70, 90]
+ Attack: [7, 9]
Def: 6
Mdef: 0
Stats: {
@@ -1002,12 +985,11 @@ mob_db: (
SpriteName: "Mouboo"
Name: "Mouboo"
Lv: 16
- Hp: 1600
+ Hp: 160
Sp: 0
Exp: 24
- JExp: 0
AttackRange: 2
- Attack: [300, 350]
+ Attack: [30, 35]
Def: 35
Mdef: 6
Stats: {
@@ -1045,12 +1027,12 @@ mob_db: (
SpriteName: "Slime"
Name: "Green Slime"
Lv: 10
- Hp: 1080
+ Hp: 108
Sp: 0
Exp: 16
- JExp: 1
+ JExp:0 //1
AttackRange: 1
- Attack: [85, 100]
+ Attack: [8, 10]
Def: 19
Mdef: 3
Stats: {
@@ -1090,12 +1072,11 @@ mob_db: (
SpriteName: "LittleSlime"
Name: "Little Green Slime"
Lv: 8
- Hp: 700
+ Hp: 70
Sp: 0
Exp: 12
- JExp: 0
AttackRange: 1
- Attack: [75, 100]
+ Attack: [7, 10]
Def: 14
Mdef: 1
Stats: {
@@ -1131,12 +1112,11 @@ mob_db: (
SpriteName: "Maggot"
Name: "Maggot"
Lv: 10
- Hp: 1100
+ Hp: 110
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -1174,12 +1154,12 @@ mob_db: (
SpriteName: "CaveMaggot"
Name: "Cave Maggot"
Lv: 12
- Hp: 1300
+ Hp: 130
Sp: 0
Exp: 20
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [75, 100]
+ Attack: [7, 10]
Def: 24
Mdef: 4
Stats: {
@@ -1219,12 +1199,11 @@ mob_db: (
SpriteName: "ForestMaggot"
Name: "Forest Maggot"
Lv: 13
- Hp: 1400
+ Hp: 140
Sp: 0
Exp: 20
- JExp: 0
AttackRange: 1
- Attack: [125, 150]
+ Attack: [12, 15]
Def: 27
Mdef: 5
Stats: {
@@ -1263,12 +1242,11 @@ mob_db: (
SpriteName: "Bee"
Name: "Bee"
Lv: 5
- Hp: 540
+ Hp: 54
Sp: 0
Exp: 11
- JExp: 0
AttackRange: 1
- Attack: [85, 100]
+ Attack: [8, 10]
Def: 8
Mdef: 0
WalkMask: "WALK_AIR"
@@ -1309,12 +1287,12 @@ mob_db: (
SpriteName: "Pinkie"
Name: "Pinkie"
Lv: 12
- Hp: 1300
+ Hp: 130
Sp: 0
Exp: 19
- JExp: 1
+ JExp:0 //1
AttackRange: 1
- Attack: [235, 250]
+ Attack: [23, 25]
Def: 32
Mdef: 5
Stats: {
@@ -1353,12 +1331,11 @@ mob_db: (
SpriteName: "LogHead"
Name: "Log Head"
Lv: 15
- Hp: 1625
+ Hp: 162
Sp: 0
Exp: 21
- JExp: 0
AttackRange: 1
- Attack: [235, 250]
+ Attack: [23, 25]
Def: 32
Mdef: 5
Stats: {
@@ -1372,7 +1349,7 @@ mob_db: (
ViewRange: 4
ChaseRange: 8
Size: 0
- Race: 2
+ Race: 4
Element: (5, 1)
Mode: {
CanMove: true
@@ -1396,12 +1373,11 @@ mob_db: (
SpriteName: "Butterfly"
Name: "Butterfly"
Lv: 11
- Hp: 1200
+ Hp: 120
Sp: 0
Exp: 18
- JExp: 0
AttackRange: 1
- Attack: [75, 100]
+ Attack: [7, 10]
Def: 24
Mdef: 4
WalkMask: "WALK_AIR"
@@ -1443,7 +1419,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -1478,10 +1453,9 @@ mob_db: (
SpriteName: "PinkFlower"
Name: "Pink Flower"
Lv: 15
- Hp: 1500
+ Hp: 150
Sp: 0
Exp: 23
- JExp: 0
AttackRange: 2
Attack: [15, 20]
Def: 20
@@ -1516,12 +1490,12 @@ mob_db: (
SpriteName: "ManaBug"
Name: "Mana Bug"
Lv: 15
- Hp: 1580
+ Hp: 158
Sp: 0
Exp: 28
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 32
Mdef: 5
WalkMask: "WALK_AIR"
@@ -1564,7 +1538,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -1603,7 +1576,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -1642,7 +1614,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -1681,7 +1652,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -1720,7 +1690,6 @@ mob_db: (
Hp: 10
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [1, 10]
Def: 5
@@ -1758,12 +1727,11 @@ mob_db: (
SpriteName: "Squirrel"
Name: "Squirrel"
Lv: 11
- Hp: 1180
+ Hp: 118
Sp: 0
Exp: 16
- JExp: 0
AttackRange: 1
- Attack: [55, 75]
+ Attack: [5, 7]
Def: 21
Mdef: 3
Stats: {
@@ -1801,12 +1769,12 @@ mob_db: (
SpriteName: "GrassSnake"
Name: "Grass Snake"
Lv: 20
- Hp: 2200
+ Hp: 220
Sp: 0
Exp: 30
- JExp: 4
+ JExp:0 //4
AttackRange: 1
- Attack: [75, 100]
+ Attack: [25, 50]
Def: 46
Mdef: 8
Stats: {
@@ -1843,12 +1811,12 @@ mob_db: (
SpriteName: "Scorpion"
Name: "Scorpion"
Lv: 14
- Hp: 1500
+ Hp: 150
Sp: 0
Exp: 21
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [110, 150]
+ Attack: [11, 15]
Def: 35
Mdef: 6
Stats: {
@@ -1885,12 +1853,12 @@ mob_db: (
SpriteName: "Spider"
Name: "Spider"
Lv: 22
- Hp: 2350
+ Hp: 235
Sp: 0
Exp: 29
- JExp: 4
+ JExp:0 //4
AttackRange: 1
- Attack: [140, 150]
+ Attack: [14, 15]
Def: 52
Mdef: 9
Stats: {
@@ -1930,7 +1898,6 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -1946,7 +1913,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -1978,7 +1945,6 @@ mob_db: (
Hp: 15
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -1994,7 +1960,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2025,7 +1991,6 @@ mob_db: (
Hp: 10
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2041,7 +2006,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2072,7 +2037,6 @@ mob_db: (
Hp: 7
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2088,7 +2052,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2116,12 +2080,11 @@ mob_db: (
SpriteName: "SpikyMushroom"
Name: "Spiky Mushroom"
Lv: 19
- Hp: 2050
+ Hp: 205
Sp: 0
Exp: 32
- JExp: 0
AttackRange: 1
- Attack: [45, 50]
+ Attack: [25, 30]
Def: 43
Mdef: 7
Stats: {
@@ -2159,12 +2122,12 @@ mob_db: (
SpriteName: "WickedMushroom"
Name: "Wicked Mushroom"
Lv: 26
- Hp: 2800
+ Hp: 280
Sp: 0
Exp: 37
- JExp: 3
+ JExp:0 //3
AttackRange: 1
- Attack: [60, 100]
+ Attack: [30, 35]
Def: 64
Mdef: 11
Stats: {
@@ -2204,7 +2167,6 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2220,7 +2182,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2252,7 +2214,6 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2268,7 +2229,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2300,7 +2261,6 @@ mob_db: (
Hp: 25
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2316,7 +2276,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2348,7 +2308,6 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2364,7 +2323,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2396,7 +2355,6 @@ mob_db: (
Hp: 22
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2412,7 +2370,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2444,7 +2402,6 @@ mob_db: (
Hp: 10
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -2480,12 +2437,11 @@ mob_db: (
SpriteName: "BadBee"
Name: "Bad Bee"
Lv: 15
- Hp: 1600
+ Hp: 160
Sp: 0
Exp: 33
- JExp: 0
AttackRange: 1
- Attack: [100, 120]
+ Attack: [10, 12]
Def: 32
Mdef: 5
WalkMask: "WALK_AIR"
@@ -2529,7 +2485,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -2566,7 +2521,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -2603,7 +2557,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -2641,7 +2594,6 @@ mob_db: (
Hp: 1
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [0, 0]
Def: 1
@@ -2677,12 +2629,12 @@ mob_db: (
SpriteName: "Bandit"
Name: "Bandit"
Lv: 26
- Hp: 2800
+ Hp: 280
Sp: 0
Exp: 48
- JExp: 6
+ JExp:0 //6
AttackRange: 1
- Attack: [120, 150]
+ Attack: [12, 15]
Def: 64
Mdef: 10
Stats: {
@@ -2723,12 +2675,12 @@ mob_db: (
SpriteName: "RobinBandit"
Name: "Robin Bandit"
Lv: 35
- Hp: 3400
+ Hp: 340
Sp: 0
Exp: 140
- JExp: 12
- AttackRange: 5
- Attack: [149, 152]
+ JExp:0 //12
+ AttackRange: 6
+ Attack: [14, 15]
Def: 90
Mdef: 22
Stats: {
@@ -2771,12 +2723,12 @@ mob_db: (
SpriteName: "BanditLord"
Name: "Bandit Lord"
Lv: 55
- Hp: 12000
+ Hp: 1200
Sp: 0
Exp: 500
- JExp: 60
+ JExp:0 //60
AttackRange: 5
- Attack: [572, 600]
+ Attack: [57, 60]
Def: 150
Mdef: 44
Stats: {
@@ -2818,12 +2770,12 @@ mob_db: (
SpriteName: "LegionSwordswoman"
Name: "Legion Swordswoman"
Lv: 20
- Hp: 2220
+ Hp: 222
Sp: 0
Exp: 27
- JExp: 3
+ JExp:0 //3
AttackRange: 1
- Attack: [75, 100]
+ Attack: [15, 20]
Def: 46
Mdef: 7
Stats: {
@@ -2859,12 +2811,12 @@ mob_db: (
SpriteName: "LegionHalberdier"
Name: "Legion Halberdier"
Lv: 22
- Hp: 2200
+ Hp: 220
Sp: 0
Exp: 30
- JExp: 4
+ JExp:0 //4
AttackRange: 2
- Attack: [200, 240]
+ Attack: [20, 24]
Def: 50
Mdef: 9
Stats: {
@@ -2900,12 +2852,12 @@ mob_db: (
SpriteName: "LegionLieutenant"
Name: "Legion Lieutenant"
Lv: 30
- Hp: 2900
+ Hp: 290
Sp: 0
Exp: 75
- JExp: 8
+ JExp:0 //8
AttackRange: 2
- Attack: [125, 150]
+ Attack: [12, 15]
Def: 60
Mdef: 14
Stats: {
@@ -2946,7 +2898,6 @@ mob_db: (
Hp: 20
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -2962,7 +2913,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -3001,7 +2952,6 @@ mob_db: (
Hp: 15
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -3017,7 +2967,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -3053,7 +3003,6 @@ mob_db: (
Hp: 7
Sp: 0
Exp: 1
- JExp: 0
AttackRange: 0
Attack: [0, 0]
Def: 1
@@ -3069,7 +3018,7 @@ mob_db: (
ViewRange: 1
ChaseRange: 1
Size: 1
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -3101,12 +3050,11 @@ mob_db: (
SpriteName: "Moubi"
Name: "Moubi"
Lv: 26
- Hp: 3600
+ Hp: 360
Sp: 0
Exp: 69
- JExp: 0
AttackRange: 2
- Attack: [690, 960]
+ Attack: [69, 96]
Def: 96
Mdef: 69
Stats: {
@@ -3143,12 +3091,11 @@ mob_db: (
SpriteName: "YellowSlime"
Name: "Yellow Slime"
Lv: 10
- Hp: 1050
+ Hp: 105
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -3185,12 +3132,11 @@ mob_db: (
SpriteName: "RedSlime"
Name: "Red Slime"
Lv: 15
- Hp: 1650
+ Hp: 165
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -3227,12 +3173,12 @@ mob_db: (
SpriteName: "Snake"
Name: "Snake"
Lv: 25
- Hp: 2640
+ Hp: 264
Sp: 0
Exp: 45
- JExp: 5
+ JExp:0 //5
AttackRange: 1
- Attack: [150, 225]
+ Attack: [22, 27]
Def: 55
Mdef: 10
Stats: {
@@ -3269,12 +3215,12 @@ mob_db: (
SpriteName: "GiantMaggot"
Name: "Giant Maggot"
Lv: 20
- Hp: 2407
+ Hp: 247
Sp: 0
Exp: 63
- JExp: 5
+ JExp:0 //5
AttackRange: 1
- Attack: [300, 450]
+ Attack: [30, 45]
Def: 23
Mdef: 145
Stats: {
@@ -3310,12 +3256,12 @@ mob_db: (
SpriteName: "DesertSnake"
Name: "Desert Snake"
Lv: 35
- Hp: 3640
+ Hp: 364
Sp: 0
Exp: 85
- JExp: 7
+ JExp:0 //7
AttackRange: 1
- Attack: [250, 425]
+ Attack: [35, 42]
Def: 65
Mdef: 10
Stats: {
@@ -3352,12 +3298,12 @@ mob_db: (
SpriteName: "DesertScorpion"
Name: "Desert Scorpion"
Lv: 28
- Hp: 3000
+ Hp: 300
Sp: 0
Exp: 44
- JExp: 5
+ JExp:0 //5
AttackRange: 1
- Attack: [220, 350]
+ Attack: [22, 35]
Def: 40
Mdef: 15
Stats: {
@@ -3394,12 +3340,12 @@ mob_db: (
SpriteName: "BlackSlime"
Name: "Black Slime"
Lv: 25
- Hp: 2650
+ Hp: 265
Sp: 0
Exp: 35
- JExp: 4
+ JExp:0 //4
AttackRange: 1
- Attack: [290, 400]
+ Attack: [29, 40]
Def: 25
Mdef: 5
Stats: {
@@ -3436,12 +3382,12 @@ mob_db: (
SpriteName: "FireGoblin"
Name: "Fire Goblin"
Lv: 37
- Hp: 4042
+ Hp: 404
Sp: 0
Exp: 75
- JExp: 8
+ JExp:0 //8
AttackRange: 1
- Attack: [396,499]
+ Attack: [39, 49]
Def: 35
Mdef: 25
Stats: {
@@ -3476,12 +3422,12 @@ mob_db: (
SpriteName: "BrotherhoodFighter"
Name: "Brotherhood Fighter"
Lv: 30
- Hp: 3220
+ Hp: 322
Sp: 0
Exp: 37
- JExp: 6
+ JExp:0 //6
AttackRange: 1
- Attack: [175, 300]
+ Attack: [18, 30]
Def: 50
Mdef: 10
Stats: {
@@ -3518,12 +3464,12 @@ mob_db: (
SpriteName: "BrotherhoodArcher"
Name: "Brotherhood Archer"
Lv: 32
- Hp: 3200
+ Hp: 320
Sp: 0
Exp: 50
- JExp: 6
+ JExp:0 //6
AttackRange: 2
- Attack: [300, 440]
+ Attack: [30, 44]
Def: 20
Mdef: 20
Stats: {
@@ -3561,12 +3507,12 @@ mob_db: (
SpriteName: "BrotherhoodLeader"
Name: "Brotherhood Leader"
Lv: 40
- Hp: 3900
+ Hp: 390
Sp: 0
Exp: 110
- JExp: 13
+ JExp:0 //13
AttackRange: 2
- Attack: [425, 550]
+ Attack: [42, 55]
Def: 70
Mdef: 25
Stats: {
@@ -3604,12 +3550,12 @@ mob_db: (
SpriteName: "Skeleton"
Name: "Skeleton"
Lv: 38
- Hp: 4100
+ Hp: 410
Sp: 0
Exp: 140
- JExp: 17
+ JExp:0 //17
AttackRange: 1
- Attack: [525, 650]
+ Attack: [52, 65]
Def: 40
Mdef: 10
Stats: {
@@ -3644,12 +3590,12 @@ mob_db: (
SpriteName: "MisterPrickel"
Name: "Mister Prickel"
Lv: 40
- Hp: 4407
+ Hp: 440
Sp: 0
Exp: 130
- JExp: 11
+ JExp:0 //11
AttackRange: 1
- Attack: [400, 750]
+ Attack: [40, 75]
Def: 23
Mdef: 145
Stats: {
@@ -3685,12 +3631,11 @@ mob_db: (
SpriteName: "FrogSmall"
Name: "Small Frog"
Lv: 10
- Hp: 1100
+ Hp: 110
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -3728,12 +3673,11 @@ mob_db: (
SpriteName: "FrogBig"
Name: "Big Frog"
Lv: 10
- Hp: 1100
+ Hp: 110
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -3773,12 +3717,11 @@ mob_db: (
SpriteName: "Bluepar"
Name: "Bluepar"
Lv: 20
- Hp: 2100
+ Hp: 210
Sp: 0
Exp: 40
- JExp: 0
AttackRange: 1
- Attack: [210, 340]
+ Attack: [21, 34]
Def: 25
Mdef: 20
Stats: {
@@ -3815,12 +3758,12 @@ mob_db: (
SpriteName: "JackO"
Name: "Jack-O"
Lv: 60
- Hp: 11100
+ Hp: 1110
Sp: 200
Exp: 1080
- JExp: 69
+ JExp:0 //69
AttackRange: 2
- Attack: [550, 850]
+ Attack: [55, 85]
Def: 180
Mdef: 100
Stats: {
@@ -3860,12 +3803,12 @@ mob_db: (
SpriteName: "IceGoblin"
Name: "Ice Goblin"
Lv: 47
- Hp: 5042
+ Hp: 504
Sp: 0
Exp: 95
- JExp: 12
+ JExp:0 //12
AttackRange: 1
- Attack: [500,620]
+ Attack: [50,62]
Def: 45
Mdef: 35
Stats: {
@@ -3901,12 +3844,12 @@ mob_db: (
SpriteName: "Nutcracker"
Name: "Nutcracker"
Lv: 60
- Hp: 8900
+ Hp: 890
Sp: 0
Exp: 1720
- JExp: 55
+ JExp:0 //55
AttackRange: 1
- Attack: [700, 850]
+ Attack: [70, 85]
Def: 70
Mdef: 25
Stats: {
@@ -3945,12 +3888,12 @@ mob_db: (
SpriteName: "Penguin"
Name: "Penguin"
Lv: 41
- Hp: 3042
+ Hp: 304
Sp: 0
Exp: 75
- JExp: 24
+ JExp:0 //24
AttackRange: 1
- Attack: [200,440]
+ Attack: [20, 44]
Def: 35
Mdef: 0
Stats: {
@@ -3987,12 +3930,12 @@ mob_db: (
SpriteName: "Reaper"
Name: "Reaper"
Lv: 80
- Hp: 22400
+ Hp: 2240
Sp: 0
Exp: 7560
- JExp: 420
+ JExp:0 //420
AttackRange: 6
- Attack: [1000, 1200]
+ Attack: [100, 120]
Def: 200
Mdef: 120
Stats: {
@@ -4032,12 +3975,12 @@ mob_db: (
SpriteName: "MudSlime"
Name: "Mud Slime"
Lv: 20
- Hp: 1650
+ Hp: 165
Sp: 0
Exp: 25
- JExp: 3
+ JExp:0 //3
AttackRange: 1
- Attack: [190, 300]
+ Attack: [19, 30]
Def: 25
Mdef: 5
Stats: {
@@ -4073,10 +4016,10 @@ mob_db: (
SpriteName: "GreenSlimeProgenitor"
Name: "Green Slime Progenitor"
Lv: 60
- Hp: 5270
+ Hp: 527
Sp: 0
Exp: 700
- JExp: 10
+ JExp:0 //10
AttackRange: 6
Attack: [87, 94]
Def: 70
@@ -4116,12 +4059,12 @@ mob_db: (
SpriteName: "MudSlimeProgenitor"
Name: "Mud Slime Progenitor"
Lv: 65
- Hp: 5500
+ Hp: 550
Sp: 0
Exp: 850
- JExp: 10
+ JExp:0 //10
AttackRange: 6
- Attack: [180, 200]
+ Attack: [100, 200]
Def: 75
Mdef: 90
Stats: {
@@ -4160,12 +4103,12 @@ mob_db: (
SpriteName: "YellowSlimeProgenitor"
Name: "Yellow Slime Progenitor"
Lv: 63
- Hp: 5370
+ Hp: 537
Sp: 0
Exp: 775
- JExp: 10
+ JExp:0 //10
AttackRange: 6
- Attack: [174, 196]
+ Attack: [74, 96]
Def: 72
Mdef: 84
Stats: {
@@ -4203,12 +4146,12 @@ mob_db: (
SpriteName: "PoisonSkull"
Name: "Poison Skull"
Lv: 50
- Hp: 5100
+ Hp: 510
Sp: 0
Exp: 420
- JExp: 45
+ JExp:0 //45
AttackRange: 2
- Attack: [250, 300]
+ Attack: [25, 30]
Def: 135
Mdef: 25
Stats: {
@@ -4247,12 +4190,12 @@ mob_db: (
SpriteName: "ManaGhost"
Name: "Mana Ghost"
Lv: 40
- Hp: 3900
+ Hp: 390
Sp: 0
Exp: 180
- JExp: 25
+ JExp:0 //25
AttackRange: 2
- Attack: [120, 150]
+ Attack: [12, 15]
Def: 90
Mdef: 25
Stats: {
@@ -4288,12 +4231,12 @@ mob_db: (
SpriteName: "GameBalance"
Name: "Game Balance"
Lv: 40
- Hp: 11000
+ Hp: 1100
Sp: 0
Exp: 380
- JExp: 35
+ JExp:0 //35
AttackRange: 2
- Attack: [260, 300]
+ Attack: [26, 30]
Def: 75
Mdef: 60
Stats: {
@@ -4332,10 +4275,9 @@ mob_db: (
SpriteName: "AngryCrafty"
Name: "AngryCrafty"
Lv: 7
- Hp: 750
+ Hp: 75
Sp: 0
Exp: 13
- JExp: 0
AttackRange: 1
Attack: [25, 50]
Def: 12
@@ -4377,12 +4319,12 @@ mob_db: (
SpriteName: "BlackScorpion"
Name: "Black Scorpion"
Lv: 18
- Hp: 2000
+ Hp: 200
Sp: 0
Exp: 26
- JExp: 2
+ JExp:0 //2
AttackRange: 1
- Attack: [120, 150]
+ Attack: [12, 15]
Def: 35
Mdef: 7
Stats: {
@@ -4419,12 +4361,11 @@ mob_db: (
SpriteName: "ThiefSlime"
Name: "Thief Slime"
Lv: 10
- Hp: 1050
+ Hp: 105
Sp: 0
Exp: 15
- JExp: 0
AttackRange: 1
- Attack: [90, 100]
+ Attack: [9, 10]
Def: 19
Mdef: 3
Stats: {
@@ -4461,12 +4402,12 @@ mob_db: (
SpriteName: "SpiderQueen"
Name: "Spider Queen"
Lv: 45
- Hp: 16000
+ Hp: 1600
Sp: 0
Exp: 1250
- JExp: 125
+ JExp:0 //125
AttackRange: 3
- Attack: [300, 350]
+ Attack: [30, 35]
Def: 120
Mdef: 80
Stats: {
@@ -4512,7 +4453,6 @@ mob_db: (
Hp: 20
Sp: 1000
Exp: 1
- JExp: 0
AttackRange: 1
Attack: [100, 100]
Def: 100
@@ -4547,12 +4487,11 @@ mob_db: (
SpriteName: "Swampling"
Name: "Swampling"
Lv: 16
- Hp: 1600
+ Hp: 160
Sp: 0
Exp: 24
- JExp: 0
AttackRange: 2
- Attack: [300, 350]
+ Attack: [30, 35]
Def: 35
Mdef: 6
Stats: {
@@ -4593,12 +4532,12 @@ mob_db: (
SpriteName: "GoldenScorpion"
Name: "Golden Scorpion"
Lv: 40
- Hp: 18000
+ Hp: 1800
Sp: 0
Exp: 1600
- JExp: 200
+ JExp:0 //200
AttackRange: 2
- Attack: [470, 520]
+ Attack: [47, 52]
Def: 90
Mdef: 50
Stats: {
@@ -4640,10 +4579,9 @@ mob_db: (
SpriteName: "SnowFlower"
Name: "Snow Flower"
Lv: 15
- Hp: 1500
+ Hp: 150
Sp: 0
Exp: 23
- JExp: 0
AttackRange: 2
Attack: [15, 20]
Def: 20
@@ -4681,12 +4619,12 @@ mob_db: (
SpriteName: "DemonicSpirit"
Name: "Demonic Spirit"
Lv: 65
- Hp: 4640
+ Hp: 464
Sp: 0
Exp: 205
- JExp: 13
+ JExp:0 //13
AttackRange: 1
- Attack: [450, 625]
+ Attack: [45, 62]
Def: 65
Mdef: 10
Stats: {
@@ -4719,12 +4657,12 @@ mob_db: (
SpriteName: "Terranite"
Name: "Terranite"
Lv: 70
- Hp: 8900
+ Hp: 890
Sp: 0
Exp: 1720
- JExp: 55
+ JExp:0 //55
AttackRange: 1
- Attack: [700, 850]
+ Attack: [70, 85]
Def: 95
Mdef: 25
Stats: {
@@ -4761,12 +4699,12 @@ mob_db: (
SpriteName: "Troll"
Name: "Troll"
Lv: 50
- Hp: 7900
+ Hp: 790
Sp: 0
Exp: 320
- JExp: 23
+ JExp:0 //23
AttackRange: 4
- Attack: [500, 650]
+ Attack: [50, 65]
Def: 50
Mdef: 75
Stats: {
@@ -4806,12 +4744,12 @@ mob_db: (
SpriteName: "FireWisp"
Name: "Fire Wisp"
Lv: 50
- Hp: 6310
+ Hp: 631
Sp: 0
Exp: 373
- JExp: 20
+ JExp:0 //20
AttackRange: 1
- Attack: [537, 599]
+ Attack: [54, 59]
Def: 55
Mdef: 25
WalkMask: "WALK_AIR"
@@ -4847,12 +4785,12 @@ mob_db: (
SpriteName: "WaterWisp"
Name: "Water Wisp"
Lv: 50
- Hp: 6310
+ Hp: 631
Sp: 0
Exp: 373
- JExp: 20
+ JExp:0 //20
AttackRange: 1
- Attack: [537, 599]
+ Attack: [54, 60]
Def: 55
Mdef: 25
WalkMask: "WALK_AIR"
@@ -4889,12 +4827,12 @@ mob_db: (
SpriteName: "Wolvern"
Name: "Wolvern"
Lv: 46
- Hp: 5699
+ Hp: 570
Sp: 0
Exp: 295
- JExp: 16
+ JExp:0 //16
AttackRange: 1
- Attack: [615, 682]
+ Attack: [62, 68]
Def: 46
Mdef: 27
Stats: {
@@ -4931,12 +4869,12 @@ mob_db: (
SpriteName: "Zombie"
Name: "Zombie"
Lv: 45
- Hp: 5900
+ Hp: 590
Sp: 0
Exp: 620
- JExp: 17
+ JExp:0 //17
AttackRange: 1
- Attack: [700, 850]
+ Attack: [70, 85]
Def: 25
Mdef: 50
Stats: {
@@ -4974,11 +4912,11 @@ mob_db: (
SpriteName: "Serqet"
Name: "Serqet"
Lv: 50
- Hp: 4023
+ Hp: 402
Exp: 245
- JExp: 10
+ JExp:0 //10
AttackRange: 1
- Attack: [900, 1209]
+ Attack: [90, 121]
Def: 44
Mdef: 25
Stats: {
@@ -5014,12 +4952,12 @@ mob_db: (
SpriteName: "Tengu"
Name: "Tengu"
Lv: 80
- Hp: 12500
+ Hp: 1250
Sp: 0
Exp: 5000
- JExp: 100
+ JExp:0 //100
AttackRange: 2
- Attack: [470, 500]
+ Attack: [47, 50]
Def: 260
Mdef: 80
Stats: {
@@ -5061,12 +4999,12 @@ mob_db: (
SpriteName: "Golem"
Name: "Golem"
Lv: 80
- Hp: 12500
+ Hp: 1250
Sp: 0
Exp: 5000
- JExp: 100
+ JExp:0 //100
AttackRange: 2
- Attack: [470, 500]
+ Attack: [47, 50]
Def: 320
Mdef: 40
Stats: {
@@ -5110,10 +5048,10 @@ mob_db: (
SpriteName: "GeneralKrukan"
Name: "General Krukan"
Lv: 85
- Hp: 13255
+ Hp: 1552
Sp: 0
Exp: 57
- JExp: 10
+ JExp:0 //10
AttackRange: 1
Attack: [81, 93]
Def: 80
@@ -5151,10 +5089,10 @@ mob_db: (
SpriteName: "GeneralRazha"
Name: "General Razha"
Lv: 85
- Hp: 13255
+ Hp: 1552
Sp: 0
Exp: 57
- JExp: 10
+ JExp:0 //10
AttackRange: 1
Attack: [81, 93]
Def: 80
@@ -5192,10 +5130,10 @@ mob_db: (
SpriteName: "GeneralTerogan"
Name: "General Terogan"
Lv: 85
- Hp: 13255
+ Hp: 1552
Sp: 0
Exp: 57
- JExp: 10
+ JExp:0 //10
AttackRange: 1
Attack: [81, 93]
Def: 80
@@ -5233,12 +5171,12 @@ mob_db: (
SpriteName: "CraftyGhost"
Name: "Crafty Ghost"
Lv: 42
- Hp: 2400
+ Hp: 240
Sp: 0
Exp: 70
- JExp: 5
+ JExp:0 //5
AttackRange: 1
- Attack: [250, 300]
+ Attack: [25, 30]
Def: 12
Mdef: 1
Stats: {
@@ -5273,12 +5211,12 @@ mob_db: (
SpriteName: "SnakeGhost"
Name: "Snake Ghost"
Lv: 50
- Hp: 4200
+ Hp: 420
Sp: 0
Exp: 70
- JExp: 4
+ JExp:0 //4
AttackRange: 1
- Attack: [375, 400]
+ Attack: [37, 40]
Def: 87
Mdef: 15
Stats: {
@@ -5312,12 +5250,12 @@ mob_db: (
SpriteName: "ScorpionGhost"
Name: "Scorpion Ghost"
Lv: 55
- Hp: 6500
+ Hp: 650
Sp: 0
Exp: 120
- JExp: 20
+ JExp:0 //20
AttackRange: 1
- Attack: [410, 550]
+ Attack: [41, 55]
Def: 80
Mdef: 20
Stats: {
@@ -5351,12 +5289,12 @@ mob_db: (
SpriteName: "SpiderGhost"
Name: "Spider Ghost"
Lv: 46
- Hp: 4350
+ Hp: 435
Sp: 0
Exp: 89
- JExp: 10
+ JExp:0 //10
AttackRange: 1
- Attack: [340, 450]
+ Attack: [34, 45]
Def: 75
Mdef: 10
Stats: {
@@ -5390,12 +5328,12 @@ mob_db: (
SpriteName: "SkeletonGhost"
Name: "Skeleton Ghost"
Lv: 70
- Hp: 28000
+ Hp: 2800
Sp: 0
Exp: 2600
- JExp: 250
+ JExp:0 //250
AttackRange: 2
- Attack: [670, 820]
+ Attack: [67, 82]
Def: 120
Mdef: 50
Stats: {
diff --git a/db/re/skill_tree.conf b/db/re/skill_tree.conf
index 3ccf91ff..5c8539b8 100644
--- a/db/re/skill_tree.conf
+++ b/db/re/skill_tree.conf
@@ -80,7 +80,6 @@ Talpan: {
WE_MALE: 0
WE_FEMALE: 0
WE_CALLPARTNER: 0
- MG_COLDBOLT: 0
EVOL_PHYSICAL_SHIELD: 0
EVOL_MONSTER_IDENTIFY: 0
@@ -115,6 +114,7 @@ Talpan: {
MG_FIREBALL: 0
SO_FIREWALK: 0
SA_FROSTWEAPON: 0
+ MG_COLDBOLT: 0
MG_FROSTDIVER: 0
WZ_FROSTNOVA: 0
SM_PROVOKE: 0
@@ -183,7 +183,6 @@ CaveUkar: {
WE_MALE: 0
WE_FEMALE: 0
WE_CALLPARTNER: 0
- MG_COLDBOLT: 0
EVOL_PHYSICAL_SHIELD: 0
EVOL_MONSTER_IDENTIFY: 0
@@ -218,6 +217,7 @@ CaveUkar: {
MG_FIREBALL: 0
SO_FIREWALK: 0
SA_FROSTWEAPON: 0
+ MG_COLDBOLT: 0
MG_FROSTDIVER: 0
WZ_FROSTNOVA: 0
SM_PROVOKE: 0
@@ -286,7 +286,6 @@ FireKralog: {
WE_MALE: 0
WE_FEMALE: 0
WE_CALLPARTNER: 0
- MG_COLDBOLT: 0
EVOL_PHYSICAL_SHIELD: 0
EVOL_MONSTER_IDENTIFY: 0
@@ -321,6 +320,7 @@ FireKralog: {
MG_FIREBALL: 0
SO_FIREWALK: 0
SA_FROSTWEAPON: 0
+ MG_COLDBOLT: 0
MG_FROSTDIVER: 0
WZ_FROSTNOVA: 0
SM_PROVOKE: 0
@@ -389,7 +389,6 @@ LightRaijin: {
WE_MALE: 0
WE_FEMALE: 0
WE_CALLPARTNER: 0
- MG_COLDBOLT: 0
EVOL_PHYSICAL_SHIELD: 0
EVOL_MONSTER_IDENTIFY: 0
@@ -424,6 +423,7 @@ LightRaijin: {
MG_FIREBALL: 0
SO_FIREWALK: 0
SA_FROSTWEAPON: 0
+ MG_COLDBOLT: 0
MG_FROSTDIVER: 0
WZ_FROSTNOVA: 0
SM_PROVOKE: 0
@@ -492,7 +492,6 @@ SeaTritan: {
WE_MALE: 0
WE_FEMALE: 0
WE_CALLPARTNER: 0
- MG_COLDBOLT: 0
EVOL_PHYSICAL_SHIELD: 0
EVOL_MONSTER_IDENTIFY: 0
@@ -527,6 +526,7 @@ SeaTritan: {
MG_FIREBALL: 0
SO_FIREWALK: 0
SA_FROSTWEAPON: 0
+ MG_COLDBOLT: 0
MG_FROSTDIVER: 0
WZ_FROSTNOVA: 0
SM_PROVOKE: 0
diff --git a/db/re/statpoint.txt b/db/re/statpoint.txt
index 5b232998..ace4703a 100644
--- a/db/re/statpoint.txt
+++ b/db/re/statpoint.txt
@@ -1,255 +1,150 @@
48
-51
-54
-57
+48
+48
+48
+48
+48
+48
+48
+48
+60
60
-64
-68
-72
-76
+60
+60
+60
+60
+60
+60
+60
+60
+80
80
-85
-90
-95
-100
-105
-111
-117
+80
+80
+80
+80
+80
+80
+80
+80
+123
+123
+123
+123
+123
+123
+123
+123
+123
123
-129
-135
142
-149
-156
-163
+142
+142
+142
+142
+142
+142
+142
+142
+142
+170
+170
+170
+170
+170
+170
+170
+170
170
-178
-186
-194
+170
+202
+202
+202
+202
+202
+202
+202
+202
202
-210
-219
-228
+202
+237
+237
+237
+237
+237
+237
+237
237
-246
-255
-265
+237
+237
+275
+275
+275
+275
+275
+275
+275
275
-285
-295
-305
-316
+275
+275
+327
+327
+327
+327
+327
+327
327
-338
-349
+327
+327
+327
+360
+360
+360
+360
+360
+360
360
+360
+360
+360
+360
+372
+372
+372
+372
372
-384
+372
+372
+372
+372
+396
+396
+396
+396
+396
396
-408
-420
-433
-446
-459
-472
-485
-499
-513
-527
-541
-555
-570
-585
-600
-615
-630
-646
-662
-678
-694
-710
-727
-744
-761
-778
-795
-813
-831
-849
-867
-885
-904
-923
-942
-961
-980
-1000
-1020
-1040
-1060
-1080
-1101
-1122
-1143
-1164
-1185
-1207
-1229
-1251
-1273
-1295
-1318
-1341
-1364
-1387
-1410
-1433
-1456
-1479
-1502
-1525
-1549
-1573
-1597
-1621
-1645
-1669
-1693
-1717
-1741
-1765
-1790
-1815
-1840
-1865
-1890
-1915
-1940
-1965
-1990
-2015
-2041
-2067
-2093
-2119
-2145
-2171
-2197
-2223
-2249
-2275
-2302
-2329
-2356
-2383
-2410
-2437
-2464
-2491
-2518
-2545
-2573
-2601
-2629
-2657
-2685
-2713
-2741
-2770
-2799
-2828
-2857
-2886
-2915
-2944
-2974
-3004
-3034
-3064
-3094
-3124
-3154
-3185
-3216
-3247
-3278
-3295
-3325
-3355
-3385
-3415
-3446
-3477
-3508
-3539
-3570
-3601
-3632
-3663
-3694
-3725
-3757
-3789
-3821
-3853
-3885
-3917
-3949
-3981
-4013
-4045
-4078
-4111
-4114
-4177
-4210
-4243
-4276
-4309
-4342
-4375
-4409
-4443
-4477
-4511
-4545
-4579
-4613
-4647
-4681
-4715
-4750
-4785
-4820
-4855
-4890
-4925
-4960
-5030
-5065
-5100
-5136
-5172
-5208
-5244
-5280
-5316
-5352
-5388
-5424
-5460
-5497
-5537
-5571
-5608
-5645
-5682
-5719
-5793
-5830
-5868
-5906
-5944
-5982
-6020
-6058
+396
+396
+396
+396
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
+420
diff --git a/npc/000-0/sailors.txt b/npc/000-0/sailors.txt
index d19d4f39..d5a55a81 100644
--- a/npc/000-0/sailors.txt
+++ b/npc/000-0/sailors.txt
@@ -15,6 +15,48 @@ OnTouch:
.@lang = requestlang();
if (.@lang >= 0 && .@lang <= MAX_LANG) Lang = .@lang;
+ mesc l("Welcome to The Mana World: rEvolt!"), 2;
+ mes "";
+ mesc l("Unlike other The Mana World games, in rEvolt, monsters ##Bdo not give any experience##b to the player.");
+ mes "";
+ mesc l("Instead, your fighting and playing style will increase one of the six specific attributes.");
+ mesc l("You start with everything you need to collect stones (ammo) for a ranged gameplay, a knife (melee gameplay), and a basic magic spell, and can start using them right away.");
+ mesc l("Quests will still give you experience. When certain levels are reached, you'll gain stat points which can be allocated to any attribute or which are assigned as bonuses depending on your race, but every level up will make you more powerful in general.");
+ mes "";
+ mesc l("Keep in mind that stat allocation ##Bis irreversible##b, so choose well your playstyle. There's no way to transfer your experience in sword fighting to a ranged style.");
+ mes "";
+ mesc l("This is a renewal-based game, meaning stats have a similar meaning as in ##BMoubootaur Legends##b.");
+ mesc l("The manual can be read with %s and you can see your level bars with %s.", b("@tutorial"), b("@player"));
+ mes "";
+ mesc l("Have fun!"), 3;
+ // TODO: How to see the exp bars?
+ next;
+ clear;
+ // TODO: For this to work, you must be able to forage stones for the slingshot
+ // TODO: And also start with a basic magic skill (confringo or similar)
+
+ // TODO: For foraging, similar logic to fishing (timer-based).
+ // You find the spot, interact with it, wait some time without moving to get
+ // the foraged items. After foraging, you cannot use the same spot for a while.
+
+ // Some spots give fruits (bushes), others give ores. We'll also bump drop
+ // rates to 10%~30% range and also beef up monsters slightly (double attack).
+ // You can get 2× the loot if you have the appropriate tool (basket, pickaxe)
+
+ // Foraging and Mining also have their own levels. You can also cut trees by
+ // attacking them and mine ore by attacking veins (increase their own skills)
+ // (based on race. When increased, a passive flares up increasing drop rates)
+
+ // Cooking, Fishing and Forging also have their own levels.
+ // Using magic causes your experience with a certain element to go up,
+ // and each element have its own level. So an offensive magic will have a hard
+ // time healing and a versatile mage will be weaker :)
+ // Magic grows per skill use, so less than fighting (increase per kill)
+
+ // Actually: Tools could cause a 2× roll or have same logic as weapons?
+ // Btw kills should also take in account defeated monster level.
+ // This completes the rEvolt progression system.
+
mesn l("Narrator");
mesc(l("You are on a raft, adrift in the sea."), 9);
next;
@@ -58,11 +100,11 @@ OnTouch:
// So allow them now.
if (islegacyaccount()) {
// Rebirth system
- if (getlegacylevel() > 90)
- REBIRTH=1;
-
// Race selection
- BarberChangeRace();
+ if (getlegacylevel() > 90)
+ RebirthPrompt();
+ else
+ BarberChangeRace();
}
setcamnpc;
diff --git a/npc/000-1/lean.txt b/npc/000-1/lean.txt
index 0cd3a1dd..16fc93b9 100644
--- a/npc/000-1/lean.txt
+++ b/npc/000-1/lean.txt
@@ -13,6 +13,7 @@
}
.@gugli = getq(ShipQuests_Gugli);
+ .@knife = getq(ShipQuests_Knife);
mesn;
mesq l("Hi! I can finally see you under the sunlight!");
@@ -26,6 +27,7 @@
menu
rif(.@gugli == 1, l("Well, I was in fact looking for them. Where are they now?")), L_Sailors,
+ rif(.@knife < 2, l("I see... monsters? creatures? out there. What if I need to fight?")), L_Weapon,
l("Wait... Where are we going?"), L_Artis;
L_Artis:
@@ -60,7 +62,24 @@ L_Sailors:
mesq l("I'm not sure. They probably left the ship early this morning. I was not awake yet.");
next;
mesq l("You should ask Maxe. He's an early riser.");
+ close;
+L_Weapon:
+ mes "";
+ mesn;
+ mesq l("Well, you fight! I heard some stuff about a so-called \"%s\" being used for that, or chanting \"%s\" bringing up a reference book but... To be honest, the most important is a weapon.", b(l("Ctrl Key")), b("@tutorial"));
+ next;
+ if (!.@knife) {
+ mesn;
+ mesq l("You should try getting a Knife. Ask Chef Gado or... Maybe Maxe knows a secret way to get one.");
+ } else if (.@knife == 1) {
+ inventoryplace Slingshot, 1, StoneProjectile, 50;
+ mesn;
+ mesq l("Try out this %s. I bought it from Fexil but ranged is not my style, too hard to move while shooting! If you run out of stones, try foraging some before purchasing.", getitemlink(Slingshot));
+ setq ShipQuests_Knife, 2;
+ getitem Slingshot, 1;
+ getitem StoneProjectile, 50;
+ }
close;
L_Close:
diff --git a/npc/000-1/panels.txt b/npc/000-1/panels.txt
index 93f25beb..3b1a84a2 100644
--- a/npc/000-1/panels.txt
+++ b/npc/000-1/panels.txt
@@ -39,7 +39,7 @@ OnInit:
next;
mesq l("Vitality raises your maximum health points and defense.");
next;
- mesq l("Intelligence raises your maximum mana points (good for mages) and your mind abilities. Please note: Magic system has not yet been implemented in this world.");
+ mesq l("Intelligence raises your maximum mana points (good for mages) and your mind abilities.");
next;
mesq l("Dexterity increases your bow damage and your accuracy.");
next;
@@ -52,3 +52,4 @@ OnInit:
.distance = 2;
end;
}
+
diff --git a/npc/000-1/sapartan.txt b/npc/000-1/sapartan.txt
index 5e33a086..6e7ed1a1 100644
--- a/npc/000-1/sapartan.txt
+++ b/npc/000-1/sapartan.txt
@@ -42,6 +42,7 @@
mesq l("Come on, Sap! Do not always scare others with your horror stories.");
next;
mesq l("I'm sure this brave fellow will soon be able to fight all of the creatures living here without any problem.");
+ mesc l("*whispering* And failing that, you could just forage the flower field at Sap's feet, right?");
next;
restorecam;
diff --git a/npc/000-1/shop.txt b/npc/000-1/shop.txt
index be588e99..76dd888e 100644
--- a/npc/000-1/shop.txt
+++ b/npc/000-1/shop.txt
@@ -17,6 +17,8 @@ OnInit:
sellitem Armbands, -1, 20;
sellitem LousyMoccasins, -1, 20;
sellitem PiouSlayer, -1, 15;
+ sellitem Slingshot, -1, 10;
+ sellitem StoneProjectile, -1, 1000;
.distance = 3;
end;
@@ -29,4 +31,7 @@ OnClock0000:
restoreshopitem Armbands, 20;
restoreshopitem LousyMoccasins, 20;
restoreshopitem PiouSlayer, 15;
+ restoreshopitem Slingshot, 10;
+ restoreshopitem StoneProjectile, 1000;
+ end;
}
diff --git a/npc/000-2-1/arpan.txt b/npc/000-2-1/arpan.txt
index 106d9aaa..6b1e8c8a 100644
--- a/npc/000-2-1/arpan.txt
+++ b/npc/000-2-1/arpan.txt
@@ -156,6 +156,7 @@ L_Menu:
l("Could you tell me where I am?"), L_Where,
l("Where can I find Julia?"), L_Julia,
l("Who are you?"), L_Who,
+ rif(!getskilllv(MG_COLDBOLT), l("Can you teach me a magic spell?")), L_Magic,
rif(getq(ShipQuests_ArpanMoney) == 1, l("Do you know what happened to the gold I had when you guys saved me?")), L_WhereMoney,
rif(getq(ShipQuests_ArpanMoney) < 2, l("Where are my old clothes?")), L_WhereOldClothes,
rif(getq(ShipQuests_ArpanMoney) == 2 && islegacyaccount(), l("About my my old clothes...")), L_LegacyClothes,
@@ -198,6 +199,20 @@ L_Who:
goto L_Menu;
+L_Magic:
+ mes "";
+ mesn;
+ mesq l("Ya. I'll teach you a cold shot, it is not exceptional but is a solid basic ice attack.");
+ next;
+ mesn;
+ mesq l("You won't acquire other magic skills so easily, but if you're really interested, Tulimshar is the best place to learn magic.");
+ next;
+ mesn;
+ mesq l("I also heard the Grandmaster Hocus was a cake addict but took a vow to only eat salad, yayaya!");
+ next;
+ skill MG_COLDBOLT, 1, 0;
+ goto L_Menu;
+
L_WhereOldClothes:
mes "";
mesn;
diff --git a/npc/000-2-3/nard.txt b/npc/000-2-3/nard.txt
index 05630e05..4c7f4cb1 100644
--- a/npc/000-2-3/nard.txt
+++ b/npc/000-2-3/nard.txt
@@ -28,6 +28,7 @@
.@nard = getq(ShipQuests_Nard);
.@gugli = getq(ShipQuests_Gugli);
.@gado = getq(ShipQuests_ChefGado);
+ if (#ADD_LVL > 30) "Mana Tree?"::mtConvert(); // Mirror Lake Safety Call
L_Checker:
if (.@gado > 3 && .@nard == 3) goto L_ChefQuestComplete;
@@ -246,7 +247,7 @@ L_Skip:
mesn;
mesq l("Are you absolutely, totally, certainly, completely sure, that you want a free, effortless ride to Artis, as weak and poorly equipped as you currently are?");
next;
- mesc l("This decision cannot be reverted. Think with attention!"), 1;
+ mesc l("This decision cannot be reverted. Think carefully!"), 1;
select
l("Actually, lets do the tutorial."),
l("Lemme do Drasil Island!"),
@@ -260,7 +261,7 @@ L_Skip:
setq ShipQuests_Alige, 3;
setq ShipQuests_Peter, 15;
setq ShipQuests_Nard, 5; // NOTE: Completes the Beta
- setq ShipQuests_Knife, 1;
+ setq ShipQuests_Knife, 2;
setq ShipQuests_ArpanMoney, 3;
setq ShipQuests_Door, 1;
setq ShipQuests_Couwan, 2;
diff --git a/npc/001-1/beuss.txt b/npc/001-1/beuss.txt
index fd334392..99018684 100644
--- a/npc/001-1/beuss.txt
+++ b/npc/001-1/beuss.txt
@@ -4,7 +4,7 @@
// Description:
// Angry member of the Legion of Aemil.
-001-1,45,48,0 script Beuss NPC_BEUSS,{
+001-1,45,48,0 script Beuss NPC_BEUSS,0,0,{
stopnpctimer;
initnpctimer;
.dir = 4;
@@ -21,6 +21,13 @@ OnTimer10000:
stopnpctimer;
end;
+OnTouch:
+ if (@enora_race == 1) {
+ @enora_race = 2;
+ dispbottom l("Now run back to Enora!");
+ }
+ end;
+
OnInit:
.distance = 2;
end;
diff --git a/npc/001-1/enora.txt b/npc/001-1/enora.txt
index d676407f..f96244ea 100644
--- a/npc/001-1/enora.txt
+++ b/npc/001-1/enora.txt
@@ -20,6 +20,7 @@
// 11 Fluffy killed.
001-1,176,113,0 script Enora#001-1 NPC_HUMAN_FEMALE_NOOB,{
+ function enora_train;
function enora_don {
speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
@@ -358,6 +359,30 @@
return;
}
+ /////////////////////////////////////////////////////////////////////////////
+ if (@enora_race == 2) {
+ EXP_AGI+=2;
+ EXP_VIT+=2;
+ @enora_race = 0;
+
+ // Verify for stat up
+ .@nxt = NEXT_Agi();
+ if (EXP_AGI > .@nxt) {
+ statusup2(bAgi, 1);
+ EXP_AGI -= .@nxt;
+ }
+
+ // Verify for stat up
+ .@nxt = NEXT_Vit();
+ if (EXP_VIT > .@nxt) {
+ statusup2(bVit, 1);
+ EXP_VIT -= .@nxt;
+ }
+
+ mesn;
+ mesq l("Good job! I'm sure you gained some agility and vitality out of this. But really, fighting is usually more effective!");
+ next;
+ }
if (getq(ArtisQuests_Enora) == 0)
{
@@ -390,6 +415,7 @@
rif(.@q >= 10, l("Where is the hill?")),
rif(.@q >= 1, l("What is this \"legion\"?")),
l("I wish I could remember something..."),
+ rif(.@q >= 10, l("I am too weak to fight. Is there anywhere I can train?")),
rif(.@q != 0, l("Nothing."));
switch (@menu)
@@ -433,15 +459,36 @@
enora_memories;
break;
case 12:
+ enora_train;
+ break;
+ case 13:
speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
l("Please come back anytime!");
}
- } while (@menu != 12);
+ } while (@menu != 13);
closeclientdialog;
goodbye;
close;
+function enora_train {
+ mesn;
+ mesq l("Mhm, the Legion of Aemil obviously has facilities, but lemme see...");
+ next;
+ mesn;
+ mesq l("I do not advise, but you could train strength working in the docks or intelligence helping out Terry at the library.");
+ mesc l("However, there's nothing to do in the docks right now, so strength training outside combat is out of question.");
+ next;
+ mesn;
+ mesq l("I am not aware of anywhere you can train dexterity. As for luck, you can try gambling, not sure where as gambling in Artis is illegal.");
+ next;
+ mesn;
+ mesq l("And... Oh. You could train agility and vitality by running! There should be a rude man close to the Legion building called Beuss. Run to him and then run to me! Ready? Go!");
+ @enora_race=1;
+ next;
+ return;
+}
+
OnInit:
.distance = 5;
.maxLevel = 20;
diff --git a/npc/001-1/rumly.txt b/npc/001-1/rumly.txt
index 6cc625ff..43c1534d 100644
--- a/npc/001-1/rumly.txt
+++ b/npc/001-1/rumly.txt
@@ -27,10 +27,11 @@ L_Menu:
.@visited = getq(General_Rumly);
.@plush_count = lognbaselvl(1, 10);
+ if (.@visited >= 2) goto L_ResetStats;
+
select
l("Plushrooms you say?"),
l("Who are you?"),
- rif(.@visited > 0, l("Can you reset my stats please?")),
l("You are weird, I have to go sorry.");
switch (@menu)
@@ -58,14 +59,12 @@ L_Menu:
speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
l("I won't forget it, I swear on my precious plushrooms!"),
- l("There is an unknown side effect to these plushrooms, they can free you from your past mistakes."),
- l("You can use it to clear your stats, to start freshly if you see what I mean..."),
+ l("There is an unknown side effect to these plushrooms, they can make you more powerful."),
l("Bring me some of these plushrooms and I will show you how it works!"),
l("Although the more powerful you are, the more plushrooms you will need.");
select
l("Sounds good!"),
- rif(countitem(Plushroom) >= .@plush_count, l("I think I have enough plushrooms on me.")),
l("We will talk about it later."),
l("My stats are too good, I won't need it.");
@@ -82,19 +81,13 @@ L_Menu:
goto L_Menu;
case 2:
- goto L_ResetStats;
- case 3:
goto L_Later;
- case 4:
+ case 3:
goto L_Never;
}
case 3:
- goto L_ResetStats;
- case 4:
- if (.@visited < 2) goto L_Quit;
-
- .@rand = rand(2);
+ .@rand = any(true, false);
if (.@rand)
{
@@ -116,73 +109,48 @@ L_Menu:
}
L_ResetStats:
- if (.@visited == 1)
- {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Changed your mind, uh?"),
- l("Very good."),
- l("Status point reset can't be undone. Do you really want this?"),
- l("Are you sure about this?");
- }
- else
- {
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Are you sure about this?");
- }
-
-L_ConfirmReset:
- switch (select(l("Yes, I am sure."),
- l("I need to think about it..."),
- l("I won't need it, thank you.")))
- {
- case 1:
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Let me just have a quick look at you. Hm... I will need @@ @@s to reset your stats.", .@plush_count, getitemlink(Plushroom));
-
- select
- rif(countitem(Plushroom) >= .@plush_count, l("Here, take as many as you need, I have plenty!")),
- rif(countitem(Plushroom) > 0 && countitem(Plushroom) < .@plush_count, l("I don't have enough plushrooms...")),
- rif(countitem(Plushroom) == 0, l("Oh no, I don't have any plushroom on me right now.")),
- l("I have to go, sorry.");
-
- if (@menu > 1)
- {
- goto L_Later;
- }
+ mesn;
+ mesq l("Did you brought me some %s?", getitemlink(Plushroom));
+ next;
+ if (askyesno() == ASK_YES) goto L_Exchange;
+ mesn;
+ mesq l("By the way, did you knew it is impossible to reassign your training?");
+ next;
+ mesn;
+ mesq l("If you used swords during all your life, and decide to become a mage, you'll need to build your magic skills from ground up.");
+ next;
+ mesn;
+ mesq l("However, unless you are reborn, you'll never forget what you've learned.");
+ next;
+ mesn;
+ mesq l("I also heard different races had different affinities to the basic attributes, but I would not be able to say.");
+ next;
+ goto L_Quit;
+L_Exchange:
+ mes "";
+ mesn;
+ mesq l("Great! For %d %s, I'll show you the purple power!", .@plush_count);
+ next;
+ if (countitem(Plushroom) > .@plush_count) {
+ mesc l("Deliver the %s?", getitemlink(Plushroom));
+ if (askyesno() == ASK_YES) {
+ mes "";
delitem Plushroom, .@plush_count;
-
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Thank you."),
- l("Now stand still... It should not take much time...");
-
- .@wasSP = StatusPoint;
- resetstatus;
- if (.@visited < 3)
- {
- setq General_Rumly, 3;
- }
- if (StatusPoint == .@wasSP)
- {
- speech S_LAST_NEXT,
- l("It seems that you have no status points to reset!"),
- l("But the plushroom you brought was really awesome you know."),
- l("Come back when you will really need me. And bring more plushrooms with you!");
- }
- else
- {
- speech S_LAST_NEXT,
- l("Let's see... @@ of your status points have just been reset!", StatusPoint - .@wasSP),
- l("Spend it wisely this time."),
- l("But you are welcome to reset your stats again if you bring me some more plushrooms!");
- }
- goto L_Quit;
-
- case 2:
- goto L_Later;
- case 3:
- goto L_Never;
+ getexp .@plush_count, 0;
+ EXP_STR += BaseLevel / 3 + 1;
+ EXP_AGI += BaseLevel / 3 + 1;
+ EXP_DEX += BaseLevel / 3 + 1;
+ EXP_VIT += BaseLevel / 3 + 1;
+ EXP_INT += BaseLevel / 3 + 1;
+ EXP_LUK += BaseLevel / 3 + 1;
+ percentheal 100, 100;
+ sc_start SC_ATTHASTE_POTION1, 180000, 20;
+ mesn;
+ mesq l("Here, drink this. It is just a matter of time before you feel the power surging inside you.");
+ }
}
+ goto L_Quit;
L_Later:
if (.@visited < 2)
diff --git a/npc/001-1/salem.txt b/npc/001-1/salem.txt
index 913db476..8f218595 100644
--- a/npc/001-1/salem.txt
+++ b/npc/001-1/salem.txt
@@ -81,6 +81,19 @@
setq ArtisQuests_CatchPiou, 2;
.@q = getq(ArtisQuests_CatchPiou);
+
+ AGI_EXP+=32;
+ mesc l("Gained %d Agility Experience.", 32);
+ .@nxt = NEXT_Agi();
+ if (EXP_AGI > .@nxt) {
+ statusup2(bAgi, 1);
+ EXP_AGI -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+
+
.LastPiouHunter$ = "";
ArtisQuests_CatchPiou_Difficulcy = 0;
.@BoughtPiou = BuyPiou(@ArtisQuests_PiouPrice);
diff --git a/npc/001-1/shop.txt b/npc/001-1/shop.txt
index f33ee4ac..54fd31b7 100644
--- a/npc/001-1/shop.txt
+++ b/npc/001-1/shop.txt
@@ -17,6 +17,8 @@ OnInit:
sellitem Armbands, -1, 20;
sellitem LousyMoccasins, -1, 20;
sellitem PiouSlayer, -1, 15;
+ sellitem Slingshot, -1, 10;
+ sellitem StoneProjectile, -1, 1000;
.distance = 3;
end;
@@ -29,6 +31,8 @@ OnClock0000:
restoreshopitem Armbands, 20;
restoreshopitem LousyMoccasins, 20;
restoreshopitem PiouSlayer, 15;
+ restoreshopitem Slingshot, 10;
+ restoreshopitem StoneProjectile, 1000;
}
001-1,46,125,0 trader Cotton#Dye001-1 NPC_NO_SPRITE,{
diff --git a/npc/001-2-4/books.txt b/npc/001-2-4/books.txt
index 96f9ae5e..1bcf1ae7 100644
--- a/npc/001-2-4/books.txt
+++ b/npc/001-2-4/books.txt
@@ -6,6 +6,8 @@
// moar books
001-2-4,28,29,0 script #001-2-4-Book1 NPC_NO_SPRITE,{
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Legal";
doevent "@rules::OnShelfUse";
close;
@@ -84,6 +86,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Utility";
if (openbookshelf())
read_book;
closeclientdialog();
diff --git a/npc/001-2-4/terry.txt b/npc/001-2-4/terry.txt
index ec13c53e..8f450b77 100644
--- a/npc/001-2-4/terry.txt
+++ b/npc/001-2-4/terry.txt
@@ -1,15 +1,51 @@
// Evol scripts.
// Author:
// Reid
+// Jesusalva
// Description:
// Librarian
001-2-4,51,35,2 script Terry NPC_TERRY,{
+ if (@terry_goal$ != "") goto L_Waiting;
mesn;
- mesq l("Hi.");
+ mesq l("Hi. Do you want to help at sorting some books? You may grow your intelligence and I'll pay a smaall coin change for it.");
+ next;
+ if (askyesno() == ASK_NO) {
+ closeclientdialog;
+ close;
+ }
+ @terry_goal$ = any("History", "Novel", "Legal", "Utility", "Dolfina's");
+ @terry_section$ = "";
+ goto L_Waiting;
+
+// TODO: Possibly ask riddles about the books or send you to talk with other
+// librarians or just read a book near to Delfina (time wait) for diversity
+L_Waiting:
+ if (@terry_goal$ == @terry_section$) goto L_Submit;
+ mesn;
+ mesq l("Okay, good, please bring me a %s book. Just find one on the shelves and go talk to me.", b(@terry_goal$));
+ close;
+
+L_Submit:
+ mesn;
+ mesq l("Thanks, come back later if you need more.");
+ @terry_goal$="";
+ @terry_section$="";
+ Zeny+=1+rand2(5);
+ EXP_INT+=rand2(1);
+ if (EXP_INT > .@nxt) {
+ statusup2(bInt, 1);
+ EXP_INT -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
close;
+ // Dock warehouse: 001-2-18 and 001-2-42
+
OnInit:
.distance = 2;
end;
}
+
diff --git a/npc/001-2-5/books.txt b/npc/001-2-5/books.txt
index fc5e3abe..b991ee48 100644
--- a/npc/001-2-5/books.txt
+++ b/npc/001-2-5/books.txt
@@ -17,6 +17,8 @@
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Utility";
if (openbookshelf())
read_book;
close;
diff --git a/npc/001-2-5/tutorial.txt b/npc/001-2-5/tutorial.txt
index 75835957..25f90d7f 100644
--- a/npc/001-2-5/tutorial.txt
+++ b/npc/001-2-5/tutorial.txt
@@ -224,6 +224,7 @@
l("%s will help when the client starts lagging. If you see an attack but no monsters, that's the cause.", b("@resync")),
l("%s allows you to change game language, anytime, anywhere.", b("@lang")),
l("%s will tell you all the rules once again.", b("@rules")),
+ l("%s will tell you how much experience you have gathered.", b("@player")),
//mes l("@toevent will warp you to event island, if an event is happening, of course.");
//mes l("@discord allows you to setup Discord integration settings.");
//mes l("@ucp allows you to manage your account, eg. recover lost email.");
diff --git a/npc/001-2-6/books.txt b/npc/001-2-6/books.txt
index 8e6f4997..64409b61 100644
--- a/npc/001-2-6/books.txt
+++ b/npc/001-2-6/books.txt
@@ -41,6 +41,8 @@
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Novel";
if (openbookshelf())
read_book();
close;
@@ -95,6 +97,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Novel";
if (openbookshelf())
read_book();
close;
@@ -127,6 +131,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Novel";
if (openbookshelf())
read_book();
close;
@@ -189,6 +195,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "Utility";
if (openbookshelf())
read_book();
close;
@@ -222,6 +230,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "History";
if (openbookshelf())
read_book();
close;
@@ -257,6 +267,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "History";
if (openbookshelf())
read_book();
close;
@@ -294,6 +306,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "History";
if (openbookshelf())
read_book();
close;
@@ -328,6 +342,8 @@ OnInit:
}
OnShelfUse:
+ // History, Fiction, Science, Novel, Legal, Utility
+ @terry_section$ = "History";
if (openbookshelf())
read_book();
close;
diff --git a/npc/001-2-6/dolfina.txt b/npc/001-2-6/dolfina.txt
index d5cc1610..1197386c 100644
--- a/npc/001-2-6/dolfina.txt
+++ b/npc/001-2-6/dolfina.txt
@@ -7,7 +7,11 @@
001-2-6,31,44,0 script Dolfina NPC_ELVEN_FEMALE_READING,{
mesn;
mesq l("Stop disturbing me, I already re-read that part twice because of you!");
-
+ if (@terry_goal$ == "Dolfina's") {
+ next;
+ mesc l("After some brief conversation, she understands what Terry wants and give you one of the books she has finished reading.");
+ @terry_section$ = "Dolfina's";
+ }
goto L_Close;
L_Close:
diff --git a/npc/001-2-6/leonard.txt b/npc/001-2-6/leonard.txt
index 9d0346c1..89966e33 100644
--- a/npc/001-2-6/leonard.txt
+++ b/npc/001-2-6/leonard.txt
@@ -3,6 +3,7 @@
// Reid
// Description:
// Librarian
+// TODO: Cast not_so_loud() whenever player speak on this map, with a listener?
001-2-6,52,28,0 script Leonard NPC_LEONARD,{
diff --git a/npc/008-2-16/stove.txt b/npc/008-2-16/stove.txt
index d4389f7a..82478200 100644
--- a/npc/008-2-16/stove.txt
+++ b/npc/008-2-16/stove.txt
@@ -55,6 +55,7 @@
if (RECIPES[.@entry])
{
usecraft .@craft;
+ EXP_COOK+=3; // FIXME
narrator
l("Done!"),
l("Do you want to try again?");
diff --git a/npc/008-2-16/yannika.txt b/npc/008-2-16/yannika.txt
index 05c8a41e..8ee5b9ca 100644
--- a/npc/008-2-16/yannika.txt
+++ b/npc/008-2-16/yannika.txt
@@ -228,6 +228,7 @@
else
{
usecraft .@craft;
+ EXP_COOK+=1; // FIXME
speech
l("@@ skillfully cuts the bread in half, throws the ingredients in air, and they land in the sandwich!", .name$),
l("There you go. Please enjoy yourself! ^.^");
@@ -250,12 +251,12 @@
function teach_cooking
{
// Check if your stats aren't enough (bonuses aren't counted)
- if (readparam(bInt) < 10 ||
- readparam(bDex) < 20)
+ if (readparam2(UDT_INT) < 10 ||
+ readparam2(UDT_DEX) < 20)
{
speech
l("Well, cooking is an art, and thus, you need intelligence and dexterity to learn."),
- l("Please come again with at least 10 INT and 20 DEX. Stat Bonuses aren't counted.");
+ l("Please come again with at least 10 INT and 20 DEX.");
close;
}
diff --git a/npc/009-2-7/leofwin.txt b/npc/009-2-7/leofwin.txt
index c634b9fb..47cde6b4 100644
--- a/npc/009-2-7/leofwin.txt
+++ b/npc/009-2-7/leofwin.txt
@@ -6,9 +6,6 @@
// THIS IS A PLACEHOLDER!
009-2-7,36,30,0 script Leofwin NPC_LEOFWIN,{
- speech
- l("Do you want a Status Reset?");
-
ConfirmStatusReset();
close;
diff --git a/npc/012-2-4/morgan.txt b/npc/012-2-4/morgan.txt
index e044f509..71b2c1ba 100644
--- a/npc/012-2-4/morgan.txt
+++ b/npc/012-2-4/morgan.txt
@@ -11,7 +11,7 @@
l("I am Morgan, the alchemist."),
l("(People do not like to hear the word 'witch' so much, as we live close to Hurnscald)."),
l("Unfortunately my apprentice Zitoni does not bring me fresh potions, so if you need something you should come back later."),
- l("Unless you want a Status Reset?");
+ l("By the way. About stat resets.");
ConfirmStatusReset();
close;
diff --git a/npc/012-3-3/manatree.txt b/npc/012-3-3/manatree.txt
index 7f37ad30..eca75c8c 100644
--- a/npc/012-3-3/manatree.txt
+++ b/npc/012-3-3/manatree.txt
@@ -1,18 +1,86 @@
-// Evol scripts.
+// The Mana World scripts.
// Author:
// Micksha
+// Jesusalva
// Description:
// The Manatree.
// THIS IS A PLACEHOLDER!
-012-3-3,39,33,0 script Manatree#012-3-3 NPC_MANATREE,{
- speech
- l("Magic is all around."),
- l("You just must listen to it, and feel it deep inside."),
- l("Now go, search for the unknown.");
-
+012-3-3,39,33,0 script Mana Tree? NPC_MANATREE,{
+ function mtRebirth;
+ function mtConvert;
+ mesc l("Magic is all around.");
+ next;
+ mesc l("You just must listen to it, and feel it deep inside.");
+ next;
+ if (#ADD_LVL > 30) mtConvert();
+ if (BaseLevel >= 99) mtRebirth();
+ mesc l("Now go, search for the unknown.");
close;
+function mtRebirth {
+ /* TODO: When player reaches level cap he can do a quest (should be one that
+requires quite some time to fullfill and collect items etc.). It also is a quest
+that ends in his death (kind of a "last fight" situation where he goes into a
+monster investead area and fights until he dies). They then goes to afterlife and
+talk with a godlike figure and can choose either to stay death and get name
+engraved in eternal hall of heroes or be reborn with some benefits (can choose
+other races, has some boni or traits he can choose from and depending on how many
+monsters he killed before he died he gets some equippment, too, the more monster
+the better).
+ The quest itself might even happen at the afterworld.
+ */
+ mesc l("Do you want to rebirth?"), 1;
+ mesc l("(Base Level will go to 1 and exp bar will be zero-ed)");
+ mesc l("(Will be able to change race and chose a trait)");
+ mesc l("You'll keep %s your equipment, magic, quest progression, craft recipes, money, and other levels. Only the base level is reset.", b(l("ALL")));
+ next;
+ if (askyesno() == ASK_NO) return;
+ RebirthPrompt();
+ return;
+}
+
+function mtConvert {
+ mesc l("You have %s account conversion points to spend.", fnum(#ADD_LVL)), 1;
+ mesc l("Please select your focus");
+ .@focus = select("Strength:Agility:Vitality:Intelligence:Dexterity:Luck:Do not assign");
+ if (.@focus > 6) return;
+ mesc l("Please select your sub focus");
+ .@subfo = select("Strength:Agility:Vitality:Intelligence:Dexterity:Luck");
+ mesc l("Please select your main activity");
+ .@activ = select("Foraging, Mining, Fishing:Cooking, Brewing, Forging:Hunting");
+ mesc l("Please select your main magic element");
+ .@elem = select("Fire:Water:Nature:Harmony:Combat:Support");
+ // NEXT_(1) / 20 = one "step" is 5% of the level 1 req (roughly)
+ // One point is 30 convert exp, and applied to everything
+ .@pt = #ADD_LVL/30;
+ #ADD_LVL -= .@pt * 30;
+ // Basic levels
+ EXP_STR+=(.@focus == 1 ? 3:1) * (.@subfo == 1 ? 2:1) * .@pt * NEXT_Str(1) / 20;
+ EXP_AGI+=(.@focus == 2 ? 3:1) * (.@subfo == 2 ? 2:1) * .@pt * NEXT_Agi(1) / 20;
+ EXP_VIT+=(.@focus == 3 ? 3:1) * (.@subfo == 3 ? 2:1) * .@pt * NEXT_Vit(1) / 20;
+ EXP_INT+=(.@focus == 4 ? 3:1) * (.@subfo == 4 ? 2:1) * .@pt * NEXT_Int(1) / 20;
+ EXP_DEX+=(.@focus == 5 ? 3:1) * (.@subfo == 5 ? 2:1) * .@pt * NEXT_Dex(1) / 20;
+ EXP_LUK+=(.@focus == 6 ? 3:1) * (.@subfo == 6 ? 2:1) * .@pt * NEXT_Luk(1) / 20;
+ // Classes
+ EXP_FORA+=(.@activ == 1 ? 2:1) * .@pt * NEXT_Fora(1) / rand2(22,24);
+ EXP_MINE+=(.@activ == 1 ? 2:1) * .@pt * NEXT_Mine(1) / rand2(22,24);
+ EXP_FISH+=(.@activ == 1 ? 2:1) * .@pt * NEXT_Fish(1) / rand2(22,24);
+ EXP_COOK+=(.@activ == 2 ? 2:1) * .@pt * NEXT_Cook(1) / rand2(20,22);
+ EXP_FORG+=(.@activ == 2 ? 2:1) * .@pt * NEXT_Forg(1) / rand2(20,22);
+ EXP_HUNT+=(.@activ == 3 ? 2:1) * .@pt * NEXT_Hunt(1) / 20;
+ // Elements
+ EXP_MF+=(.@elem == 1 ? 3:1) * .@pt * NEXT_Mf(1) / rand2(24, 28);
+ EXP_MW+=(.@elem == 2 ? 3:1) * .@pt * NEXT_Mw(1) / rand2(24, 28);
+ EXP_MN+=(.@elem == 3 ? 3:1) * .@pt * NEXT_Mn(1) / rand2(24, 28);
+ EXP_MH+=(.@elem == 4 ? 3:1) * .@pt * NEXT_Mh(1) / rand2(24, 28);
+ EXP_MC+=(.@elem == 5 ? 3:1) * .@pt * NEXT_Mc(1) / rand2(24, 28);
+ EXP_MS+=(.@elem == 6 ? 3:1) * .@pt * NEXT_Ms(1) / rand2(24, 28);
+ // TODO: Handle level up
+ mes "";
+ return;
+}
+
OnInit:
.distance = 2;
end;
diff --git a/npc/020-1/inar.txt b/npc/020-1/inar.txt
index 2954bcaf..dae71405 100644
--- a/npc/020-1/inar.txt
+++ b/npc/020-1/inar.txt
@@ -12,7 +12,7 @@
speech
l("Hi there."),
l("Sorry, we are sold out for today."),
- lg("Come back later.");
+ l("Come back later.");
} else {
speech
diff --git a/npc/020-1/malivox.txt b/npc/020-1/malivox.txt
index 583574c5..5fa9291e 100644
--- a/npc/020-1/malivox.txt
+++ b/npc/020-1/malivox.txt
@@ -12,7 +12,7 @@
l("This is due to lazyness of Micksha to prepare placeholders."),
l("Don't steal stuff from them, though. Or you will be imprisoned."),
l("What I sell? Well, you can see Mananas... Aquadas... Croc claws..."),
- l("But they are not for sale! I use them for my custom brew of status reset potions. Are you interested?");
+ l("But they are not for sale! I use them for my custom brew of potions. By the way.");
ConfirmStatusReset();
close;
diff --git a/npc/020-1/neko.txt b/npc/020-1/neko.txt
index d4c38dd3..2f9d75eb 100644
--- a/npc/020-1/neko.txt
+++ b/npc/020-1/neko.txt
@@ -13,7 +13,7 @@
speech
l("Hi there."),
l("Sorry, we are sold out for today."),
- lg("Come back later.");
+ l("Come back later.");
} else {
speech
diff --git a/npc/020-2-20/riskim.txt b/npc/020-2-20/riskim.txt
index f68b9825..7b1e4f99 100644
--- a/npc/020-2-20/riskim.txt
+++ b/npc/020-2-20/riskim.txt
@@ -115,6 +115,7 @@ function foodQuestline {
if (RECIPES[.@entry])
{
usecraft .@craft;
+ EXP_COOK+=3; // FIXME
narrator
l("Done!"),
l("Do you want to try again?");
diff --git a/npc/commands/info.txt b/npc/commands/info.txt
new file mode 100644
index 00000000..b333cded
--- /dev/null
+++ b/npc/commands/info.txt
@@ -0,0 +1,99 @@
+// Evol script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// Main player information (@player)
+// TODO: Magic Levels do nothing (how do we even fix this under Native C Magic D:)
+// TODO: Quest Experience need to be tweaked. Again. Monsters could give some XP?
+// TODO: Cooking & Brewing level does nothing
+
+- script @info 32767,{
+ end;
+
+function barHandler {
+ .@bf$=" ";
+ .@min=getarg(0);
+ .@max=getarg(1);
+
+ //▒
+ for (.@i=1; .@i <= 10; .@i++) {
+ if (.@min / .@i >= .@max / 10)
+ .@bf$+="##2▒";
+ else
+ .@bf$+="##9▒";
+ }
+ .@bf$ += sprintf("##0 %s/%s", fnum(.@min), fnum(.@max));
+ return .@bf$;
+}
+
+// Your information
+OnCall:
+ mes b(".:: " + l("Basic Stats") + " ::.");
+ mes "";
+ mes b(l("Strength"));
+ mes l("%s (Lv %d)", barHandler(EXP_STR, NEXT_Str()), readparam(bStr));
+ mes "";
+ mes b(l("Agility"));
+ mes l("%s (Lv %d)", barHandler(EXP_AGI, NEXT_Agi()), readparam(bAgi));
+ mes "";
+ mes b(l("Vitality"));
+ mes l("%s (Lv %d)", barHandler(EXP_VIT, NEXT_Vit()), readparam(bVit));
+ mes "";
+ mes b(l("Intelligence"));
+ mes l("%s (Lv %d)", barHandler(EXP_INT, NEXT_Int()), readparam(bInt));
+ mes "";
+ mes b(l("Dexterity"));
+ mes l("%s (Lv %d)", barHandler(EXP_DEX, NEXT_Dex()), readparam(bDex));
+ mes "";
+ mes b(l("Luck"));
+ mes l("%s (Lv %d)", barHandler(EXP_LUK, NEXT_Luk()), readparam(bLuk));
+ next;
+ clear;
+
+ mes b(".:: " + l("Job Stats") + " ::.");
+ mes "";
+ mes b(l("Foraging & Woodcutting"));
+ mes l("%s (Lv %d)", barHandler(EXP_FORA, NEXT_Fora()), LVL_FORA);
+ mes "";
+ mes b(l("Mining"));
+ mes l("%s (Lv %d)", barHandler(EXP_MINE, NEXT_Mine()), LVL_MINE);
+ mes "";
+ mes b(l("Fishing"));
+ mes l("%s (Lv %d)", barHandler(EXP_FISH, NEXT_Fish()), LVL_FISH);
+ mes "";
+ mes b(l("Cooking & Brewing"));
+ mes l("%s (Lv %d)", barHandler(EXP_COOK, NEXT_Cook()), LVL_COOK);
+ mes "";
+ mes b(l("Forging & Tailoring"));
+ mes l("%s (Lv %d)", barHandler(EXP_FORG, NEXT_Forg()), LVL_FORG);
+ mes "";
+ mes b(l("Hunting"));
+ mes l("%s (Lv %d)", barHandler(EXP_HUNT, NEXT_Hunt()), LVL_HUNT);
+ next;
+ clear;
+
+ mes b(".:: " + l("Magic Stats") + " ::.");
+ mes "";
+ mes b(l("Fire"));
+ mes l("%s (Lv %d)", barHandler(EXP_MF, NEXT_Mf()), LVL_M_FIRE);
+ mes "";
+ mes b(l("Water"));
+ mes l("%s (Lv %d)", barHandler(EXP_MW, NEXT_Mw()), LVL_M_WATER);
+ mes "";
+ mes b(l("Nature"));
+ mes l("%s (Lv %d)", barHandler(EXP_MN, NEXT_Mn()), LVL_M_NATURE);
+ mes "";
+ mes b(l("Harmony"));
+ mes l("%s (Lv %d)", barHandler(EXP_MH, NEXT_Mh()), LVL_M_HARMONY);
+ mes "";
+ mes b(l("Combat"));
+ mes l("%s (Lv %d)", barHandler(EXP_MC, NEXT_Mc()), LVL_M_COMBAT);
+ mes "";
+ mes b(l("Support"));
+ mes l("%s (Lv %d)", barHandler(EXP_MS, NEXT_Ms()), LVL_M_SUPPORT);
+ close;
+
+OnInit:
+ bindatcmd "player", "@info::OnCall", 0, 100, 0;
+ bindatcmd "ucp", "@info::OnCall", 0, 100, 0;
+ end;
+}
diff --git a/npc/commands/rate-management.txt b/npc/commands/rate-management.txt
index 995ef940..9bfe6c44 100644
--- a/npc/commands/rate-management.txt
+++ b/npc/commands/rate-management.txt
@@ -7,7 +7,7 @@
.max_hours = 0;
.current_rate = .original_exp_rate;
setbattleflag("base_exp_rate", .original_exp_rate);
- setbattleflag("quest_exp_rate", .original_quest_rate);
+ //setbattleflag("quest_exp_rate", .original_quest_rate);
charcommand("@reloadmobdb"); // this is on purpose (callable without RID)
charcommand("@reloadquestdb");
}
@@ -29,6 +29,12 @@ OnCall:
.@new_rate = min(atoi(.@special$), 1000); // or just a regular integer
.@hours = min(0x7FFFFFFE, max(1, atoi(strip(.@atcmd_parameters$[1])))); // number of hours
+ if (.@new_rate > 199 && !is_admin())
+ {
+ dispbottom l("ERROR: Cowardly refusing to commit a %d%% -> %d%% exp modification without admin rights!", .original_exp_rate, .@new_rate);
+ end;
+ }
+
if (.@new_rate > 0)
{
// set new exp rate
@@ -36,7 +42,7 @@ OnCall:
.max_hours = .@hours;
.current_rate = .@new_rate;
setbattleflag("base_exp_rate", .@new_rate);
- setbattleflag("quest_exp_rate", .@new_rate);
+ //setbattleflag("quest_exp_rate", .original_quest_rate);
charcommand("@reloadmobdb");
charcommand("@reloadquestdb");
initnpctimer; // start counting
diff --git a/npc/functions/casino.txt b/npc/functions/casino.txt
index 87b71a4d..3e5f6151 100644
--- a/npc/functions/casino.txt
+++ b/npc/functions/casino.txt
@@ -78,12 +78,15 @@ L_Spin:
if (.@a == .@b && .@a == .@c && .@a == 7) {
getitem .itemid, 1;
mesc l("Jackpot! You got a(n) %s!", getitemlink(.itemid)), 3;
+ EXP_LUK+=22;
} else if (.@a == .@b && .@a == .@c) {
getitem .coinid, 18;
mesc l("Congrats! A pity it was not 777..."), 3;
+ EXP_LUK+=7;
} else if (.@a == .@b || .@a == .@c || .@b == .@c) {
getitem .coinid, 1;
mesc l("Lucky! You got the coin back!"), 3;
+ EXP_LUK+=1;
} else {
mesc l("It wasn't this time..."), 3;
}
@@ -228,6 +231,7 @@ L_Spin:
*/
mesc l("Your current win streak is @@!", @gambler_winstreak);
Zeny+=min(((@gambler_winstreak-1)*.gpbonus), .minprize); // Never 2x
+ EXP_LUK+=@gambler_winstreak;
} else {
.@bypass=0;
}
diff --git a/npc/functions/crafting.txt b/npc/functions/crafting.txt
index fa5fa84e..25c39d34 100644
--- a/npc/functions/crafting.txt
+++ b/npc/functions/crafting.txt
@@ -33,8 +33,8 @@ function script SmithSystem {
.@lv=getiteminfo(.@it, ITEMINFO_ELV);
.@skill=getskilllv(EVOL_CRAFTING);
- // Update your CRAFTING_SCORE
- CRAFTING_SCORE+=.@lv;
+ // Update your CRAFTING_SCORE accordingly
+ EXP_FORG += .@lv;
// Obtain the item. No bounds or restrictions applied.
getitem(.@it, 1);
@@ -59,7 +59,7 @@ function script SmithSystem {
// Apply the bonuses. They're capped by equip level and based on:
// Equip level, crafting experience and crafting skill
- .@val=min(.@lv, (.@skill*CRAFTING_SCORE)/100+.@skill);
+ .@val=min(.@lv, .@skill+LVL_FORG+1);
// MDEF rule range is 99 while DEF rule range is 399
// This is a really hackish way, for the record
diff --git a/npc/functions/fishing.txt b/npc/functions/fishing.txt
index 4dcb4882..e995595c 100644
--- a/npc/functions/fishing.txt
+++ b/npc/functions/fishing.txt
@@ -187,6 +187,7 @@ function script fishing {
if (rand(gettimetick(0) - @fishing_tick) <= .@pull_rand_max + (100 * @FISHING_BOOSTER[getnpcid()]))
{
specialeffect(.@success_fx, SELF, playerattached()); // event success
+ EXP_FISH += 1; // TODO: It could be done better
if(!checkweight(.@fish_id, 1))
{
@@ -245,7 +246,8 @@ function script fishing {
if (getvariableofnpc(.bait_ids[.@i], .@npc$) == .@bait)
{
.@bait_c = true;
- @FISHING_BOOSTER[getnpcid()] = getvariableofnpc(.bait_ids[.@i + 1], .@npc$);
+ @FISHING_BOOSTER[getnpcid()] = getvariableofnpc(.bait_ids[.@i + 1], .@npc$) + min(5, LVL_FISH/3); // TODO: Currently, every 3 levels give +1 rare
+ // ...rate, up to a +5 at level 15 (baits can only give up to +2)
break;
}
}
diff --git a/npc/functions/foraging.txt b/npc/functions/foraging.txt
new file mode 100644
index 00000000..f67af736
--- /dev/null
+++ b/npc/functions/foraging.txt
@@ -0,0 +1,148 @@
+// rEvolt functions.
+// Description:
+// Foraging functions.
+//
+// Just a timer and some graphical effects, don't move while harvesting
+// Also need to know the region for the obtainable forage
+// Foraging:
+// Stone = 100 + (FORAGE_LVL * 1000)
+// Pibery = 0 + (FORAGE_LVL * 1000)
+// Manana = -100 + (FORAGE_LVL * 1000)
+// ...
+// Level also reduces the time you must wait.
+// For drop chance, luck is added to the level
+// And you gain some luck experience when you get a good roll?
+// What about other stats? Agility and Vitality in special.
+// We also need int and dex to learn cooking >.<
+// How about reading books to get INT? (on Library, and once by reading WH Books)
+// Some sort of training which you pay some esperins and gain:
+// DEX (archery, might reuse Gwendolyn game)
+// AGI (running, might reuse Miriam game)
+// STR (helping the dock workers)? VIT (resistance)?
+
+function script foraging {
+ .@npc$ = strnpcinfo(0); // the full name of the spot
+
+ // Array of (loot, base chance)
+ // All rolls are standard RNG rolls (10.000)
+ // Negative is OK
+ if (getvariableofnpc(.loot_ids[1], .@npc$) < 1)
+ {
+ // default loot: <array: 0, {[loot, probability]..}>
+ setarray getvariableofnpc(.loot_ids[1], .@npc$),
+ StoneProjectile, 9500,
+ StoneProjectile, 8100,
+ StoneProjectile, 7000,
+ StoneProjectile, 6400,
+ Piberries, 4500,
+ Blueberries, 3800,
+ Moss, 2400,
+ Acorn, 1800,
+ Plushroom, 1200,
+ MauveHerb, 1000,
+ AlizarinHerb, 900,
+ CobaltHerb, 900,
+ GambogeHerb, 900,
+ //PumpkinSeeds, 400,
+ SilkCocoon, 100,
+ Curshroom, 0,
+ BugLeg, -100,
+ Manana, -300,
+ GrassSeeds, -500,
+ RawLog, -800,
+ HardSpike, -1200,
+ Carrot, -1800;
+ }
+
+ // Cooldown
+ if (@last_used[getnpcid(.@npc$)] > gettimetick(2) && !is_dev()) {
+ dispbottom l("You just foraged this spot, please wait %s.", FuzzyTime(@last_used[getnpcid(.@npc$)], 2, 2));
+ end;
+ }
+
+ getmapxy(.@m$, .@x, .@y, 0);
+ sit();
+ dispbottom l("You started foraging. Do not stand nor move until you're done.");
+ // Wait time. Foraging level can make foraging up to 67% faster
+ .@wait = 10+rand2(30);
+ .@wait = (.@wait*1000) - (min(.@wait*2, LVL_FORA) * 300);
+
+ // TODO: Play a Foraging Animation or it is just boring
+ freeloop(true);
+ for (.@t = 0; .@t < .@wait; .@t += 500) {
+ if (!issit()) {
+ dispbottom l("In hurry, you give up foraging.");
+ end;
+ }
+ sleep2(500);
+ }
+ freeloop(false);
+
+ // Did you move?
+ if (!isin(.@m$, .@x, .@y, 0)) {
+ dispbottom l("You left your foraging spot.");
+ end;
+ }
+
+ // Let the bush recover (5 minutes)
+ @last_used[getnpcid(.@npc$)] = gettimetick(2) + 300;
+
+ // Give you the forage
+ .@lcount=0;
+ .@loots=getarraysize(getvariableofnpc(.loot_ids[0], .@npc$));
+ copyarray(.@loot, getvariableofnpc(.loot_ids[0], .@npc$), .@loots);
+ .@buff = min(100, LVL_FORA)*((readbattleparam(getcharid(3), UDT_LUK)/2)+1);
+ .@buff = min(10000, .@buff);
+ freeloop(true);
+ for (.@i = .@loots; .@i > 0; .@i -= 2) {
+ if (.@i == 1) continue;
+ // Foraging level multiplies luck with bonus
+ // But getting a loot inflict a 5% penalty on next loot roll
+ .@luck = rand2(10000) + (.@lcount*500) - .@buff;
+ if (.@luck < .@loot[.@i-1]) {
+ getitem .@loot[.@i-2], 1;
+ .@lcount+=1;
+ }
+ }
+ freeloop(false);
+
+ dispbottom l("You have foraged some items!");
+ EXP_FORA+=1;
+ return;
+}
+
+
+// This should not be here
+000-1,73,113,0 script #forage001 NPC_NO_SPRITE,{
+ foraging();
+OnInit:
+ .distance=1;
+ end;
+}
+
+// Drasil spots
+000-1,33,112,0 duplicate(#forage001) #forage002 NPC_NO_SPRITE
+000-1,67,97,0 duplicate(#forage001) #forage003 NPC_NO_SPRITE
+000-1,55,90,0 duplicate(#forage001) #forage004 NPC_NO_SPRITE
+000-1,44,62,0 duplicate(#forage001) #forage005 NPC_NO_SPRITE
+000-1,26,36,0 duplicate(#forage001) #forage006 NPC_NO_SPRITE
+000-1,42,25,0 duplicate(#forage001) #forage007 NPC_NO_SPRITE
+000-1,50,26,0 duplicate(#forage001) #forage008 NPC_NO_SPRITE
+000-1,76,29,0 duplicate(#forage001) #forage009 NPC_NO_SPRITE
+000-1,81,40,0 duplicate(#forage001) #forage010 NPC_NO_SPRITE
+000-1,85,47,0 duplicate(#forage001) #forage011 NPC_NO_SPRITE
+
+// Artis spots
+001-1,181,33,0 duplicate(#forage001) #forage012 NPC_NO_SPRITE
+001-1,178,59,0 duplicate(#forage001) #forage013 NPC_NO_SPRITE
+001-1,156,30,0 duplicate(#forage001) #forage014 NPC_NO_SPRITE
+001-1,156,33,0 duplicate(#forage001) #forage015 NPC_NO_SPRITE
+001-1,115,31,0 duplicate(#forage001) #forage016 NPC_NO_SPRITE
+001-1,112,37,0 duplicate(#forage001) #forage017 NPC_NO_SPRITE
+001-1,81,44,0 duplicate(#forage001) #forage018 NPC_NO_SPRITE
+001-1,72,62,0 duplicate(#forage001) #forage019 NPC_NO_SPRITE
+001-1,103,69,0 duplicate(#forage001) #forage020 NPC_NO_SPRITE
+001-1,91,92,0 duplicate(#forage001) #forage021 NPC_NO_SPRITE
+001-1,81,117,0 duplicate(#forage001) #forage022 NPC_NO_SPRITE
+001-1,95,119,0 duplicate(#forage001) #forage023 NPC_NO_SPRITE
+
diff --git a/npc/functions/global_event_handler.txt b/npc/functions/global_event_handler.txt
index 3f10ae73..31a6b76a 100644
--- a/npc/functions/global_event_handler.txt
+++ b/npc/functions/global_event_handler.txt
@@ -58,16 +58,29 @@ OnNPCKillEvent:
callfunc("refineupdate");
if ($MONSTERS_KILLED % 1000000 == 0)
callfunc("GetBeanieCopter");
+ callfunc("mining");
+ callfunc("hunting");
+
+ //debugmes "Attacked with a %d (changed? %d) - Enemy killed with %d hits and %d defense used.", @weaponId, @weaponNew, @weaponAtk, @defend;
+ //debugmes "Absorbed %d DMG. Did %d crits; Missed %d Dodged %d.", @weaponDef, @weaponCrit, @weaponMiss, @weaponDodge;
+
+ // FIXME: Track status effect for VIT (SC resistance)
+ // FIXME: Track drops (LUK)
+ callfunc("GameplayCore");
end;
OnPCKillEvent:
$PLAYERS_KILLED+=1;
PLAYERS_KILLED+=1;
+ callfunc("GameplayCore");
end;
OnSkillInvoke:
callfunc("SkillInvoked");
end;
+OnPCBonusEvent:
+ callfunc("RebirthBonus");
+ end;
}
diff --git a/npc/functions/hunting.txt b/npc/functions/hunting.txt
new file mode 100644
index 00000000..3b036ae8
--- /dev/null
+++ b/npc/functions/hunting.txt
@@ -0,0 +1,64 @@
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// Magic Script: TMW2_DROPS
+//
+// Realm of Drops - A passive skill which drastically improves drop rates
+
+function script hunting {
+ if (!LVL_HUNT) return;
+ .@mobId=getarg(0, killedrid);
+ if (.@mobId <= 0)
+ return;
+ if (@skdrop[.@mobId] < 0)
+ return;
+
+ // Keep in mind that it is reset on logout
+ @skdrop[.@mobId]+=1;
+ .@lv=getmonsterinfo(.@mobId, MOB_LV);
+ .@min=30-min(30, LVL_HUNT)+(.@lv/10);
+
+ // Maybe we are in condition for the bonus drop
+ if (@skdrop[.@mobId] % .@min == 0) {
+ // This creates .@item and .@rate with same index
+ deletearray($@MobDrop_item);
+ deletearray($@MobDrop_rate);
+ getmobdrops(.@mobId);
+ .@count = $@MobDrop_count;
+ copyarray(.@item[0], $@MobDrop_item[0], .@count);
+ copyarray(.@rate[0], $@MobDrop_rate[0], .@count);
+
+ // .@total => sum of all drop rates
+ // .@array => The real array for relative_array_random()
+ .@total = 0;
+ .@array = -1;
+ for (.@i = 0; .@i < .@count; ++.@i) {
+ .@s = getarraysize(.@array);
+ array_push(.@array, .@item[.@i]);
+ array_push(.@array, .@rate[.@i]);
+ .@total+=.@rate[.@i];
+ }
+
+ // Now we determine if you can, or cannot, get a bonus drop
+ if (.@total < 500) {
+ if (.@total < 200) {
+ // Hard limit: 2% of total drop rate (-1 prevents execution)
+ @skdrop[.@mobId]=-1;
+ return;
+ } else {
+ // Soft limit: Half the efficiency
+ if (@skdrop[.@mobId] % (.@min*2) != 0)
+ return;
+ }
+ }
+
+ // You can! So give you a random bonus drop with proper ponderation
+ .@drop = relative_array_random(.@array);
+ getmapxy(.@m$, .@x, .@y, 0);
+ makeitem(.@drop, 1, .@m$, .@x, .@y);
+ if ($@GM_OVERRIDE || debug)
+ consolemes(CONSOLEMES_DEBUG, "Realm of Drops: Created %d as bonus drop in (%d,%d) [TDR %d KL %d]", .@drop, .@x, .@y, .@total, @skdrop[.@mobId]);
+ }
+ return;
+}
+
diff --git a/npc/functions/mining.txt b/npc/functions/mining.txt
new file mode 100644
index 00000000..7d6928e6
--- /dev/null
+++ b/npc/functions/mining.txt
@@ -0,0 +1,49 @@
+// rEvolt functions.
+// Description:
+// Mining functions.
+//
+// Called after you kill a mineral to check mining skill and optionally giving +ore
+
+function script mining {
+ if (!LVL_MINE) return;
+ // It works essentially the same to hunting, but only with minerables
+ // At mining level 100, you always get an extra mining loot
+ if (rand2(100) >= LVL_MINE) return;
+ // default loot: <array: 0, {[loot, probability]..}>
+ setarray .@loot_id,
+ Coal, 500,
+ IronOre, 240,
+ TreasureKey, 110,
+ GoldNuggets, 80,
+ DiamondShard, 16,
+ SilverOre, 15,
+ RubyShard, 12,
+ CopperOre, 10,
+ TopazShard, 9,
+ EmeraldShard, 8,
+ AmethystShard, 7,
+ GoldOre, 6,
+ TerraniteOre, 5,
+ SapphireShard, 5,
+ DiamondPowder, 4,
+ RubyPowder, 4,
+ EmeraldPowder, 4,
+ SapphirePowder, 4,
+ TopazPowder, 4,
+ AmethystPowder, 4,
+ PlatinumOre, 3,
+ RotoniumOre, 2,
+ CrudeDiamond, 2,
+ CrudeRuby, 2,
+ CrudeEmerald, 2,
+ CrudeSapphire, 2,
+ CrudeTopaz, 2,
+ CrudeAmethyst, 2,
+ ZealiteOre, 1;
+
+ .@drop = relative_array_random(.@loot_id);
+ getmapxy(.@m$, .@x, .@y, 0);
+ makeitem(.@drop, 1, .@m$, .@x, .@y);
+ return;
+}
+
diff --git a/npc/functions/mmo.txt b/npc/functions/mmo.txt
new file mode 100644
index 00000000..eafd792f
--- /dev/null
+++ b/npc/functions/mmo.txt
@@ -0,0 +1,538 @@
+// The Mana World scripts.
+// Author:
+// The Mana World Team
+// Description:
+// Controls TMW rEvolt gameplay
+
+function script GameplayCore {
+ /* Arguments
+ killedrid → RID of the killed monster OR player (check for range)
+ @defend → DEF used
+ @weaponNew → Weapon switch detector
+ @weaponAtk → Nº of Hits
+ @weaponCrit → Nº of Crits
+ @weaponMiss → Nº of Miss
+ @weaponDef → Total DMG aborbed
+ @weaponDodge → Nº of dodges
+
+ @skillMMOId → Array of used skills ID
+ @skillMMOLv → Array of used skills Level
+
+ .@rg → Your attack range (only used if @weaponNew is false)
+
+ .@mobLv → Level of opponent
+ .@mobHp → Max HP of opponent
+ .@mobAtk → DMG of opponent
+ .@mobRng → Attack range of opponent
+ .@boss → If opponent was a boss or not
+
+ EXP_STR → Exp for STR stat (etc)
+ */
+
+ // Build your own data
+ .@rg = readbattleparam(getcharid(3), UDT_ATKRANGE);
+ .@str = readparam(bStr);
+ .@agi = readparam(bAgi);
+ .@dex = readparam(bDex);
+ .@vit = readparam(bVit);
+ .@int = readparam(bInt);
+ .@luk = readparam(bLuk);
+ .@max = getbattleflag("max_parameter");
+
+ // Build the defeated opponent data (PC or MD)
+ if (killedrid > 2000000 && killedrid < 2100000) {
+ .@mobLv = readbattleparam(killedrid, UDT_LEVEL) * 7; // *ahem* PvP
+ .@mobHp = readbattleparam(killedrid, UDT_MAXHP);
+ .@mobAtk = readbattleparam(killedrid, UDT_ATKMIN);
+ .@boss = false;
+ } else {
+ .@mobLv = getmonsterinfo(killedrid, MOB_LV);
+ .@mobHp = getmonsterinfo(killedrid, MOB_MAXHP);
+ .@mobAtk = getmonsterinfo(killedrid, MOB_ATK1);
+ .@boss = getmonsterinfo(killedrid, MOB_MODE) & 32; // 32 = MD_BOSS
+ }
+
+ /* Grants STR */
+ if (.@str < .@max)
+ callfunc("GC_strength", .@mobHp);
+
+ /* Grants AGI */
+ if (.@agi < .@max)
+ callfunc("GC_agility", .@mobLv);
+
+ /* Grants DEX */
+ if (.@dex < .@max)
+ callfunc("GC_dexterity", .@mobHp);
+
+ /* Grants VIT */
+ if (.@vit < .@max)
+ callfunc("GC_vitality", .@max);
+
+ /* Grants INT */
+ if (.@int < .@max)
+ callfunc("GC_intelligence", .@boss);
+
+ /* Grants LUK */
+ if (.@luk < .@max)
+ callfunc("GC_luck", .@mobLv, .@mobAtk);
+
+ /* Grants hunting exp */
+ callfunc("GC_Hunt", .@mobLv);
+
+ /* May grant mining or foraging exp */
+ callfunc("GC_Mine", killedrid);
+
+ // Cleanup GameplayCore variables
+ @defend = 0;
+ @weaponId = 0;
+ @weaponNew = 0;
+ @weaponAtk = 0;
+ @weaponCrit = 0;
+ @weaponMiss = 0;
+ @weaponDef = 0;
+ @weaponDodge = 0;
+ deletearray @skillMMOId;
+ deletearray @skillMMOLv;
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+function script NEXT_Str {
+ .@str = getarg(0, readparam(bStr));
+ .@nxt = 1200 + (.@str / 10 * 10);
+ .@nxt = .@str * .@nxt * 125 / 10; // EXP_STR is already divided by 10
+ return .@nxt;
+}
+
+function script NEXT_Agi {
+ .@agi = getarg(0, readparam(bAgi));
+ return .@agi * 132; // 120 × 11 ÷ 10
+}
+
+function script NEXT_Vit {
+ .@vit = getarg(0, readparam(bVit));
+ return 200 * .@vit * 115 / 100; // Variable is saved truncated, hence 200
+}
+
+function script NEXT_Int {
+ .@int = getarg(0, readparam(bInt));
+ return .@int * 150 / 10;
+}
+
+function script NEXT_Dex {
+ .@dex = getarg(0, readparam(bDex));
+ return .@dex * 132; // 120 × 11 ÷ 10
+}
+
+function script NEXT_Luk {
+ .@luk = getarg(0, readparam(bLuk));
+ return .@luk * 62; // 20 * 1.75
+}
+
+
+function script NEXT_Fora {
+ .@stat = getarg(0, LVL_FORA);
+ return .@stat * 92;
+}
+
+function script NEXT_Mine {
+ .@stat = getarg(0, LVL_MINE);
+ return .@stat * 92;
+}
+
+function script NEXT_Fish {
+ .@stat = getarg(0, LVL_FISH);
+ return .@stat * 24;
+}
+
+function script NEXT_Cook {
+ .@stat = getarg(0, LVL_COOK);
+ return .@stat * 26;
+}
+
+function script NEXT_Forg {
+ .@stat = getarg(0, LVL_FORG);
+ return .@stat * 96;
+}
+
+function script NEXT_Hunt {
+ .@stat = getarg(0, LVL_HUNT);
+ return .@stat * 221;
+}
+
+
+function script NEXT_Mf {
+ .@stat = getarg(0, LVL_M_FIRE);
+ return .@stat * 44;
+}
+
+function script NEXT_Mw {
+ .@stat = getarg(0, LVL_M_WATER);
+ return .@stat * 44;
+}
+
+function script NEXT_Mn {
+ .@stat = getarg(0, LVL_M_NATURE);
+ return .@stat * 44;
+}
+
+function script NEXT_Mh {
+ .@stat = getarg(0, LVL_M_HARMONY);
+ return .@stat * 44;
+}
+
+function script NEXT_Mc {
+ .@stat = getarg(0, LVL_M_COMBAT);
+ return .@stat * 44;
+}
+
+function script NEXT_Ms {
+ .@stat = getarg(0, LVL_M_SUPPORT);
+ return .@stat * 44;
+}
+
+function script GC_Hunt {
+ EXP_HUNT+=(getarg(0)/10);
+ if (EXP_HUNT > NEXT_Hunt()) {
+ EXP_HUNT-=NEXT_Hunt();
+ LVL_HUNT+=1;
+ }
+ return;
+}
+
+function script GC_Mine {
+ .@rc = getmonsterinfo(getarg(0), MOB_RACE);
+ if (.@rc == RC_Forage)
+ EXP_FORA+=1;
+ else if (.@rc == RC_Mineral)
+ EXP_MINE+=1;
+
+ if (EXP_MINE > NEXT_Mine()) {
+ EXP_MINE-= NEXT_Mine();
+ LVL_MINE+= 1;
+ }
+
+ if (EXP_FORA > NEXT_Fora()) {
+ EXP_FORA-= NEXT_Fora();
+ LVL_FORA+= 1;
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants STR */
+function script GC_strength {
+ /* Rule:
+ - Granted based on total damage inflicted
+ - Not granted if weapon was changed
+ - Not granted for ranged weapons
+ - Not granted if skills were used
+ - Rule: 1200 total damage inflicted × 1.25 × STR (FIXME)
+ - Every 10 STR raises total damage in 10
+ - PS. Still "easy" - only 4 mi for max level
+ */
+ .@mobHp = getarg(0);
+
+ // Switched weapon
+ if (@weaponNew)
+ return;
+
+ // Ranged weaponry
+ .@rg = readbattleparam(getcharid(3), UDT_ATKRANGE);
+ if (.@rg > 3)
+ return;
+
+ // FIXME: Used magic - But must discard physical skills =/
+ //if (getarraysize(@skillMMOId) > 0)
+ // return;
+
+ // Grant Strength Experience
+ EXP_STR += .@mobHp / 11;
+
+ // Verify for stat up
+ .@nxt=NEXT_Str();
+ if (EXP_STR > .@nxt) {
+ statusup2(bStr, 1);
+ EXP_STR -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants AGI */
+function script GC_agility {
+ /* Rule:
+ - Granted based on your own evasion
+ - Every (50+agi*3) defense used counts as 1 evasion
+ - Every (5+agi/10) hits also count as 1 evasion
+ - Less is granted if overweight (roughly proportional)
+ - Not granted if ?
+ - Rule: 120 dodges × 1.10 × AGI
+ */
+ .@mobLv = getarg(0);
+ .@agi = readparam(bAgi);
+
+ // Calculate
+ .@exp = @weaponDodge;
+ .@exp += @defend / (47 + .@agi * 3);
+ .@exp += @weaponAtk / (5 + .@agi / 10);
+ // Weight proportion
+ .@rat = 100 * Weight / MaxWeight;
+ .@rat = cap_value(100 - .@rat, 0, 90);
+ .@exp = .@exp * rat / 90;
+
+ // Brawling gives extra exp
+ if (!@weaponNew && @weaponId < 1)
+ .@exp += .@mobLv/10;
+
+
+ // Grant Agility Experience
+ EXP_AGI += .@exp;
+
+ // Verify for stat up
+ .@nxt = NEXT_Agi();
+ if (EXP_AGI > .@nxt) {
+ statusup2(bAgi, 1);
+ EXP_AGI -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants DEX */
+function script GC_dexterity {
+ /* Rule:
+ - More misses grant more dex
+ - If ranged, then every 500 damage = 0.1 miss (FIXME: Mobs don't have HP)
+ - (TODO) Maybe also grant dex per hit...?
+ - Less is granted for every critical
+ - Not granted if ?
+ - Rule: 12 misses × 1.10 × DEX
+ */
+ .@mobHp = getarg(0);
+ .@dex = readparam(bDex);
+ .@rg = readbattleparam(getcharid(3), UDT_ATKRANGE);
+
+ // Calculate
+ .@exp = (@weaponMiss - @weaponCrit) * 5; // Reduced the bonus from (miss-crit)
+ if (!@weaponNew && .@rg > 3) {
+ .@exp += (.@mobHp / 100); // Increased bonus from Ranged Attacks
+ }
+
+ // Grant Dexterity Experience
+ EXP_DEX += max(.@exp, 0);
+
+ // Verify for stat up
+ // Note each miss is counted as 5 misses
+ .@nxt = NEXT_Dex();
+ if (EXP_DEX > .@nxt) {
+ statusup2(bDex, 1);
+ EXP_DEX -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants VIT */
+function script GC_vitality {
+ /* Rule:
+ - Granted based on damage absorbed
+ - Defended damage counts as 20%
+ - Each dodge counts as (max_stat - vit) damage absorb
+ - If weapon changed, only 70% is granted
+ - Not granted if ?
+ - Rule: 2000 damage × 1.15 × VIT [FIXME]
+ */
+ .@max = getarg(0);
+ .@vit = readparam(bVit);
+
+ // Calculate
+ .@exp = @weaponDef;
+ .@exp += @defend * 2 / 10;
+ .@exp += (.@max - .@vit) * @weaponDodge;
+ // Weapon swap penalty
+ if (@weaponNew)
+ .@exp = .@exp * 7 / 10;
+ .@exp = .@exp / 10;
+
+ // Grant Vitality Experience
+ EXP_VIT += .@exp;
+
+ // Verify for stat up
+ .@nxt = NEXT_Vit();
+ if (EXP_VIT > .@nxt) {
+ statusup2(bVit, 1);
+ EXP_VIT -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants INT */
+function script GC_intelligence {
+ /* Rule:
+ - 1 point per every spell per every level
+ - +1 point if target was a boss (always)
+ - Not granted to utility spells (e.g. resync)
+ - Each 7 points grants +1 DEX exp (even if melee)
+ - The above rule is up to 1+(int/10)
+ - Each attack reduces this in 2%
+ - Rule: 10 spells × 1.5 × INT
+ */
+ .@boss = getarg(0);
+ .@int = readparam(bInt);
+
+ // Calculate
+ .@exp = (.@boss ? 1 : 0);
+ setarray .@excl_sk, EVOL_SUPER_MENU, EVOL_MONSTER_IDENTIFY, EVOL_CRAFTING;
+
+ // array_sum() would be neat, but... We need to remove "weeds"
+ freeloop(true);
+ for (.@i = 0; .@i < getarraysize(@skillMMOId); .@i++) {
+ .@skillId = @skillMMOId[.@i];
+ .@skillLv = @skillMMOLv[.@i];
+ if (array_find(.@excl_sk, .@skillId) < 0)
+ .@exp += .@skillLv;
+ }
+ freeloop(false);
+
+ // Dex bonus must be handled now
+ EXP_DEX += min(.@exp / 7, 1 + .@int / 10);
+
+ // Penalty calculation for int
+ .@exp -= .@exp * min(@weaponAtk, 50) / 50;
+
+ // Grant Intel Experience
+ EXP_INT += .@exp;
+
+ // Verify for stat up
+ .@nxt = NEXT_Int();
+ if (EXP_INT > .@nxt) {
+ statusup2(bInt, 1);
+ EXP_INT -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+/* *************************************************************************** */
+/* Grants LUK */
+function script GC_luck {
+ /* Rule:
+ - Granted based on your criticals
+ - Every 10 evasion counts as 1 crit
+ - Every 10 levels of foe counts as 1 crit
+ - Every (27 + luck) mob damage counts as 1 crit [FIXME]
+ - Less is granted if ?
+ - Not granted if ?
+ - (Really should read drops, instead?)
+ - Rule: 24 crits × 1.75 × LUK
+ */
+ .@mobLv = getarg(0);
+ .@mobAtk = getarg(1);
+ .@luk = readparam(bLuk);
+
+ // Calculate
+ .@exp = @weaponCrit;
+ .@exp += @weaponDodge / 10;
+ .@exp += .@mobLv / 10;
+ .@exp += .@mobAtk / (26 + .@luk);
+
+ // Grant Luck Experience
+ EXP_LUK += .@exp;
+
+ // Verify for stat up
+ .@nxt = NEXT_Luk();
+ if (EXP_LUK > .@nxt) {
+ statusup2(bLuk, 1);
+ EXP_LUK -= .@nxt;
+
+ // FIXME: Use a color-coded special effect
+ specialeffect(1, SELF, getcharid(3));
+ }
+ return;
+}
+
+
diff --git a/npc/functions/rebirth.txt b/npc/functions/rebirth.txt
new file mode 100644
index 00000000..3a5aac5c
--- /dev/null
+++ b/npc/functions/rebirth.txt
@@ -0,0 +1,97 @@
+// TMW scripts.
+// Authors:
+// Jesusalva
+// Hocus
+// Description:
+// Controls rebirth logic
+
+// RebirthBonus ()
+function script RebirthBonus {
+ if (PCBONUS & PCB_ATKBONUS) {
+ bonus bAtk, 25;
+ }
+ if (PCBONUS & PCB_MATKBONUS) {
+ bonus bMatk, 25;
+ }
+ if (PCBONUS & PCB_DEFBONUS) {
+ bonus bDef, 20;
+ }
+ if (PCBONUS & PCB_MDEFBONUS) {
+ bonus bMdef, 10;
+ }
+ if (PCBONUS & PCB_EVDBONUS) {
+ bonus bFlee, 20;
+ }
+ if (PCBONUS & PCB_HITBONUS) {
+ bonus bHit, 25;
+ }
+ if (PCBONUS & PCB_CRITBONUS) {
+ bonus bCritical, 5;
+ }
+ if (PCBONUS & PCB_DOUBLEATK) {
+ bonus bDoubleAddRate, 5;
+ }
+ if (PCBONUS & PCB_ALLSTATS) {
+ bonus bAllStats, 1;
+ }
+ if (PCBONUS & PCB_HPBONUS) {
+ bonus bMaxHP, 500;
+ }
+ if (PCBONUS & PCB_MPBONUS) {
+ bonus bMaxSP, 200;
+ }
+ if (PCBONUS & PCB_ASPDBONUS) {
+ bonus bAspd, 10;
+ }
+ if (PCBONUS & PCB_WSPDBONUS) {
+ bonus bSpeedAddRate, 5;
+ }
+ if (PCBONUS & PCB_WEIGHTBONUS) {
+ bonus bAddMaxWeight, 1000;
+ }
+ if (PCBONUS & PCB_EXPBONUS) {
+ bonus2 bExpAddRace, RC_All, 10;
+ }
+ if (PCBONUS & PCB_NOKNOCKBACK) {
+ bonus bNoKnockback, 1;
+ }
+ return;
+}
+
+
+// RebirthPrompt ()
+function script RebirthPrompt {
+ setnpcdialogtitle l("Rebirth Trait Selection");
+ mesc l("Please select a trait.");
+ mesc l("This choice CANNOT be undone later."), 1;
+ menuint
+ l("Cancel"), 0,
+ rif(!(PCBONUS & PCB_ATKBONUS), l("Atk +25")), PCB_ATKBONUS,
+ rif(!(PCBONUS & PCB_MATKBONUS), l("Matk +25")), PCB_MATKBONUS,
+ rif(!(PCBONUS & PCB_DEFBONUS), l("Def +20")), PCB_DEFBONUS,
+ rif(!(PCBONUS & PCB_MDEFBONUS), l("MDEF +10")), PCB_MDEFBONUS,
+ rif(!(PCBONUS & PCB_EVDBONUS), l("Evasion +20")), PCB_EVDBONUS,
+ rif(!(PCBONUS & PCB_HITBONUS), l("Accuracy +25")), PCB_HITBONUS,
+ rif(!(PCBONUS & PCB_CRITBONUS), l("Crit +5%")), PCB_CRITBONUS,
+ rif(!(PCBONUS & PCB_DOUBLEATK), l("Double Attack +5%")), PCB_DOUBLEATK,
+ rif(!(PCBONUS & PCB_ALLSTATS), l("All Stats +1")), PCB_ALLSTATS,
+ rif(!(PCBONUS & PCB_HPBONUS), l("HP +500")), PCB_HPBONUS,
+ rif(!(PCBONUS & PCB_MPBONUS), l("MP +200")), PCB_MPBONUS,
+ rif(!(PCBONUS & PCB_ASPDBONUS), l("Atk. Speed +10")), PCB_ASPDBONUS,
+ rif(!(PCBONUS & PCB_WSPDBONUS), l("Walk +5%")), PCB_WSPDBONUS,
+ rif(!(PCBONUS & PCB_WEIGHTBONUS), l("Max Weight +1kg")), PCB_WEIGHTBONUS,
+ //rif(!(PCBONUS & PCB_EXPBONUS), l("EXP Gain +10%")), PCB_EXPBONUS,
+ rif(!(PCBONUS & PCB_NOKNOCKBACK), l("Knockback Immunity")), PCB_NOKNOCKBACK;
+ if (@menuret == 0) return;
+ PCBONUS=PCBONUS|@menuret;
+ REBIRTH+=1;
+ resetlvl(3); // TODO: This makes little to no sense at rEvolt
+ setnpcdialogtitle l("Rebirth Race Selection");
+ mesc l("Do you want to change your race?");
+ mesc l("This can only be reverted at rebirth! Beware!");
+ next;
+ if (askyesno() == ASK_NO) return;
+ BarberChangeRace();
+ return;
+}
+
diff --git a/npc/functions/resetstatus.txt b/npc/functions/resetstatus.txt
index d5d4fdda..8a58c99b 100644
--- a/npc/functions/resetstatus.txt
+++ b/npc/functions/resetstatus.txt
@@ -5,112 +5,19 @@
// Description:
// Status Reset NPC utils
-// Reset status and return permanent bonuses
-// StatusResetReinvest( {script=True} )
-function script StatusResetReinvest {
- /* XXX: Uncommment this for ML Permanent Boost Status Fruit System :XXX
- // Compulsory check
- if (getarg(0, true)) {
- inventoryplace NPCEyes, 6;
- } else if (!checkweight(NPCEyes, 6)) {
- getitembound StatusResetPotion, 1, 4;
- dispbottom l("You cannot carry the fruits.");
- end; // Die
- }
-
- // Permanent boosts were now lost, return the fruits
- if (STATUSUP_STR) {
- getitembound StrengthFruit, STATUSUP_STR, 4;
- STATUSUP_STR=0;
- }
- if (STATUSUP_AGI) {
- getitembound AgilityFruit, STATUSUP_AGI, 4;
- STATUSUP_AGI=0;
- }
- if (STATUSUP_VIT) {
- getitembound VitalityFruit, STATUSUP_VIT, 4;
- STATUSUP_VIT=0;
- }
- if (STATUSUP_INT) {
- getitembound IntelligenceFruit, STATUSUP_INT, 4;
- STATUSUP_INT=0;
- }
- if (STATUSUP_DEX) {
- getitembound DexterityFruit, STATUSUP_DEX, 4;
- STATUSUP_DEX=0;
- }
- if (STATUSUP_LUK) {
- getitembound LuckFruit, STATUSUP_LUK, 4;
- STATUSUP_LUK=0;
- }
- */
- resetstatus();
- return true;
-}
-
-// Return wasSP on success, 0 on failure
-// ConfirmReset( {price} )
+// ConfirmStatusReset( )
function script ConfirmStatusReset {
- if (BaseLevel >= 15)
- .@raw_price=(1000-BaseLevel*10+(BaseLevel*18));
- else if (BaseLevel >= 10)
- .@raw_price=(BaseLevel*210-(10*210))/(BaseLevel/10);
- else
- .@raw_price=1;
-
- if (getarg(0,-1) >= 0)
- .@raw_price=getarg(0,-1);
-
- //mesc l("WARNING: Permanent boosts will return to their fruit form."), 1;
- mesc l("WARNING: Status resets cannot be reverted!"), 1;
-
- switch (select(l("Yes, I am sure. Please reset my status!"),
- l("I need to think about it..."),
- l("I won't need it, thank you.")))
- {
- case 1:
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Let me just have a quick look at you. Hm... I will need %d GP to reset your stats.", .@raw_price);
-
- select
- rif(Zeny >= .@raw_price, l("Here, take as much as you need, I have plenty!")),
- rif(Zeny > 0 && Zeny < .@raw_price, l("I don't have enough money...")),
- rif(Zeny == 0, l("Oh no, I don't have any money on me right now.")),
- l("I have to go, sorry.");
-
- if (@menu > 1) {
- return 0;
- }
-
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Thank you."),
- l("Now stand still... It should not take much time...");
-
- // Reset status have an inventorycheck, so we charge later.
- .@wasSP = StatusPoint;
- StatusResetReinvest();
-
- // Nothing to do: Do not charge (eg. you just got the fruits back)
- if (StatusPoint == .@wasSP) {
- speech S_LAST_NEXT,
- l("It seems that you have no status points to reset!"),
- l("Come back when you will really need me.");
- } else {
- Zeny-=.@raw_price;
- speech S_LAST_NEXT,
- l("Let's see... @@ of your status points have just been reset!", StatusPoint - .@wasSP),
- l("Spend it wisely this time."),
- l("But you are welcome to reset your stats again! I need the money.");
- }
- return .@wasSP;
-
- case 2:
- return 0;
- case 3:
- return 0;
- }
- //Exception("Unknown Error: ConfirmStatusReset() failed");
- consolemes(CONSOLEMES_ERROR, "Unknown Error: ConfirmStatusReset() failed");
+ mesn;
+ mesq l("Did you knew it is impossible to reassign your training?");
+ next;
+ mesn;
+ mesq l("If you used swords during all your life, and decide to become a mage, you'll need to build your magic skills from ground up.");
+ next;
+ mesn;
+ mesq l("However, unless you are reborn, you'll never forget what you've learned.");
+ next;
+ mesn;
+ mesq l("I also heard different races had different affinities to the basic attributes, but I would not be able to say.");
return 0;
}
diff --git a/npc/functions/skills.txt b/npc/functions/skills.txt
index 5273de34..d32b9248 100644
--- a/npc/functions/skills.txt
+++ b/npc/functions/skills.txt
@@ -7,6 +7,8 @@
function script SkillInvoked {
// Record to database that you used the skill
skillInvoke[@skillId] = skillInvoke[@skillId] + 1;
+ array_push(@skillMMOId, @skillId);
+ array_push(@skillMMOLv, @skillLv);
// Switch though skills for additional effects
switch (@skillId) {
@@ -15,6 +17,75 @@ function script SkillInvoked {
callfunc("GetManaExp", @skillId, 1);
break;
}
+
+ // Switch through skills for experience gains
+ // TODO: Element Level does nothing, no buffs and no cost reduction
+ // ...Yet
+ switch (@skillId) {
+ case NV_FIRSTAID:
+ case AL_HEAL:
+ case AB_HIGHNESSHEAL:
+ case ALL_FULL_THROTTLE:
+ case TF_DETOXIFY:
+ EXP_MS += 1;
+ if (EXP_MS > NEXT_Ms()) {
+ EXP_MS -=NEXT_Ms();
+ LVL_MS +=1;
+ }
+ break;
+ case AL_HOLYLIGHT:
+ case MG_SOULSTRIKE:
+ case MG_NAPALMBEAT:
+ if (EXP_MH > NEXT_Mh()) {
+ EXP_MH -=NEXT_Mh();
+ LVL_MH +=1;
+ }
+ EXP_MH += 1;
+ break;
+ case SA_FROSTWEAPON:
+ case MG_FROSTDIVER:
+ case WZ_FROSTNOVA:
+ EXP_MW += 1;
+ if (EXP_MW > NEXT_Mw()) {
+ EXP_MW -=NEXT_Mw();
+ LVL_MW +=1;
+ }
+ break;
+ case SA_FLAMELAUNCHER:
+ case MG_FIREBOLT:
+ case MG_FIREBALL:
+ case SO_FIREWALK:
+ EXP_MF += 1;
+ if (EXP_MF > NEXT_Mf()) {
+ EXP_MF -=NEXT_Mf();
+ LVL_MF +=1;
+ }
+ break;
+ case SA_SEISMICWEAPON:
+ case MG_LIGHTNINGBOLT:
+ case MG_FIREWALL:
+ case SN_WINDWALK:
+ EXP_MN += 1;
+ if (EXP_MN > NEXT_Mn()) {
+ EXP_MN -=NEXT_Mn();
+ LVL_MN +=1;
+ }
+ break;
+ case KN_AUTOCOUNTER:
+ case SN_SHARPSHOOTING:
+ case ASC_METEORASSAULT:
+ case AC_SHOWER:
+ case AC_CHARGEARROW:
+ case SM_BASH:
+ case MC_MAMMONITE:
+ case GC_DARKILLUSION:
+ EXP_MC += 1;
+ if (EXP_MC > NEXT_Mc()) {
+ EXP_MC -=NEXT_Mc();
+ LVL_MC +=1;
+ }
+ break;
+ }
return;
}
diff --git a/npc/functions/string.txt b/npc/functions/string.txt
index ef2e4c2a..002c5dfd 100644
--- a/npc/functions/string.txt
+++ b/npc/functions/string.txt
@@ -114,6 +114,10 @@ function script format_number {
return .@number$;
}
+// Alias
+function script fnum {
+ return format_number(getarg(0));
+}
// strip("<string>")
diff --git a/npc/functions/util.txt b/npc/functions/util.txt
index cedd4202..275dced6 100644
--- a/npc/functions/util.txt
+++ b/npc/functions/util.txt
@@ -65,6 +65,10 @@ function script setqtime {
return;
}
+function script readparam2 {
+ return readbattleparam(getcharid(3), getarg(0));
+}
+
// gettimeparam(GETTIME_X)
// Returns the number of seconds/minutes/hours/days/months/years since 01/01/1970
// This is for truly daily quests, which doesn't imposes a timed wait in hours
diff --git a/npc/functions/vault.txt b/npc/functions/vault.txt
index 1cfe7c99..17f0457b 100644
--- a/npc/functions/vault.txt
+++ b/npc/functions/vault.txt
@@ -73,6 +73,44 @@ function script setvaultvar {
return set(getvaultvar(getarg(0), getarg(2, "")), getarg(1));
}
+// This function comes from Moubootaur Legends
+// getvaultexp(Exp)
+function script getvaultexp {
+ .@exp=getarg(0);
+ // Illegal, do nothing
+ if (.@exp > 100)
+ return;
+ // Illegal, do nothing
+ if (!SERVER_USES_VAULT)
+ return;
+ // Assign the Experience
+ if (getvaultid()) {
+ ##VAULT_EXP+=.@exp;
+ consolemes(CONSOLEMES_INFO,
+ "Granting %d Soul Exp to %d under the rEvolution's authority.",
+ .@exp, getvaultid());
+ }
+ return;
+}
+
+// This function comes from Moubootaur Legends
+// MirrorLakeSendTo(World, Lake)
+function script MirrorLakeSendTo {
+ .@w=getarg(0);
+ .@t=getarg(1);
+ // Illegal, do nothing
+ if (!SERVER_USES_VAULT)
+ return;
+ ##VAULT_GOTO=.@w;
+ ##VAULT_MLTO=.@t;
+ closeclientdialog;
+ dispbottom l("Darkness fills your vision...");
+ sleep2(1000);
+ kick(getcharid(3), 7); // 7 is not a valid kick reason
+ //atcommand("@kick "+strcharinfo(0));
+ end;
+}
+
/**
* handles Vault hooks on player login
*/
diff --git a/npc/scripts.conf b/npc/scripts.conf
index 210a1d78..1acf575a 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -45,6 +45,9 @@
"npc/functions/villagertalk.txt",
"npc/functions/npcmovegraph.txt",
"npc/functions/fishing.txt",
+"npc/functions/foraging.txt",
+"npc/functions/hunting.txt",
+"npc/functions/mining.txt",
"npc/functions/mouboofunc.txt",
"npc/functions/generic-text.txt",
"npc/functions/asklanguage.txt",
@@ -56,13 +59,13 @@
"npc/functions/treasure.txt",
"npc/functions/afk.txt",
"npc/functions/resetstatus.txt",
+"npc/functions/rebirth.txt",
// May rely on custom functions and thus must be handled by last
"npc/functions/util.txt",
"npc/functions/faction.txt",
"npc/functions/scoreboards.txt",
"npc/functions/manhole.txt",
-"npc/functions/skills.txt",
"npc/functions/lockpicks.txt",
"npc/functions/crafting.txt",
"npc/functions/referral.txt",
@@ -169,6 +172,11 @@
"npc/config/location.txt",
"npc/config/magic.txt",
+// rEvolt gameplay core
+"npc/functions/mmo.txt",
+"npc/commands/info.txt",
+"npc/functions/skills.txt",
+
// placeholder scripts
//"npc/placeholder/angus.txt",
//"npc/placeholder/caul.txt",