summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2019-07-19 22:12:20 -0300
committerJesusaves <cpntb1@ymail.com>2019-07-19 22:12:20 -0300
commitb12e8c507851f727b9f19617baa4633ce24bee51 (patch)
tree6027623a46452029760e7e39ef4543d1656869b7
parent436e290ae17f7bd8f14f497f920e2c07a9098d18 (diff)
parent6208b601a081455c80b26cb2b81f364b996e26e8 (diff)
downloadserverdata-b12e8c507851f727b9f19617baa4633ce24bee51.tar.gz
serverdata-b12e8c507851f727b9f19617baa4633ce24bee51.tar.bz2
serverdata-b12e8c507851f727b9f19617baa4633ce24bee51.tar.xz
serverdata-b12e8c507851f727b9f19617baa4633ce24bee51.zip
Merge branch 'master' into testserver
-rw-r--r--db/constants.conf1
-rw-r--r--db/re/item_db.conf4
-rw-r--r--db/re/skill_db.conf671
-rw-r--r--db/re/skill_tree.conf132
-rw-r--r--maps/re/003-0.mcachebin140 -> 139 bytes
-rw-r--r--npc/003-0-2/_import.txt1
-rw-r--r--npc/003-0-2/manastone.txt76
-rw-r--r--npc/003-0/_import.txt10
-rw-r--r--npc/003-0/berserk.txt222
-rw-r--r--npc/003-0/colin.txt390
-rw-r--r--npc/003-0/luca.txt375
-rw-r--r--npc/003-0/mages.txt42
-rw-r--r--npc/003-0/paladin.txt224
-rw-r--r--npc/003-0/priest.txt279
-rw-r--r--npc/003-0/recepcionist.txt318
-rw-r--r--npc/003-0/sage.txt188
-rw-r--r--npc/003-0/saves.txt99
-rw-r--r--npc/003-0/tanker.txt221
-rw-r--r--npc/003-0/trickmaster.txt87
-rw-r--r--npc/003-0/warriors.txt41
-rw-r--r--npc/003-0/wizard.txt191
-rw-r--r--npc/003-1/jakod.txt69
-rw-r--r--npc/003-2/lua.txt12
-rw-r--r--npc/005-6/morgan.txt22
-rw-r--r--npc/009-3/barzil.txt2
-rw-r--r--npc/011-1/manastone.txt1
-rw-r--r--npc/012-1/gwendolyn.txt8
-rw-r--r--npc/014-3/fountain.txt5
-rw-r--r--npc/functions/seasons.txt29
-rw-r--r--npc/functions/util.txt74
-rw-r--r--npc/guilds/logs.txt1
-rw-r--r--npc/items/books.txt10
32 files changed, 1247 insertions, 2558 deletions
diff --git a/db/constants.conf b/db/constants.conf
index 58c03213f..16d5c0522 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -4051,6 +4051,7 @@ constants_db: {
NPC_GLASS_OLD_LADY: 211
NPC_BARD_TRUMP: 213
NPC_INJURIED_MOUBOO: 215
+ NPC_SITTED_NINJA: 219
NPC_CRUSADER: 221
NPC_LOF_RICH: 223
NPC_BARD_DRUMS: 227
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 4c4b6a2cf..33bb56f43 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -13159,8 +13159,8 @@ item_db: (
AegisName: "NoviceWand"
Name: "Novice Wand"
Type: "IT_WEAPON"
- Buy: 2000
- Sell: 800
+ Buy: 4500
+ Sell: 1600
Weight: 158
Atk: 0
Matk: 280
diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf
index 3c7d3ae37..c818dab3c 100644
--- a/db/re/skill_db.conf
+++ b/db/re/skill_db.conf
@@ -306,16 +306,16 @@ skill_db: (
Element: "Ele_Weapon"
Requirements: {
SPCost: {
- Lv1: 70
- Lv2: 80
- Lv3: 90
- Lv4: 100
- Lv5: 110
- Lv6: 120
- Lv7: 130
- Lv8: 140
- Lv9: 150
- Lv10: 160
+ Lv1: 60
+ Lv2: 70
+ Lv3: 80
+ Lv4: 90
+ Lv5: 100
+ Lv6: 110
+ Lv7: 120
+ Lv8: 130
+ Lv9: 140
+ Lv10: 150
}
WeaponTypes: {
NoWeapon: true
@@ -328,7 +328,6 @@ skill_db: (
2HAxes: true
Maces: true
2HMaces: true
- Staves: true
Knuckles: true
Instruments: true
Whips: true
@@ -336,10 +335,6 @@ skill_db: (
Katars: true
Revolvers: true
Rifles: true
- GatlingGuns: true
- Shotguns: true
- GrenadeLaunchers: true
- FuumaShurikens: true
}
}
},
@@ -359,7 +354,7 @@ skill_db: (
DamageType: {
NoDamage: true
}
- SkillData1: 10000
+ SkillData1: 30000
FixedCastTime: 0
Requirements: {
SPCost: {
@@ -624,7 +619,7 @@ skill_db: (
Enemy: true
}
AttackType: "Magic"
- Element: "Ele_Ghost"
+ Element: "Ele_Neutral"
NumberOfHits: {
Lv1: 1
Lv2: 1
@@ -640,30 +635,30 @@ skill_db: (
InterruptCast: true
CastTime: 400
AfterCastActDelay: {
- Lv1: 1200
- Lv2: 1200
- Lv3: 1600
- Lv4: 1600
- Lv5: 2000
+ Lv1: 800
+ Lv2: 1000
+ Lv3: 1200
+ Lv4: 1500
+ Lv5: 1800
Lv6: 2000
Lv7: 2400
Lv8: 2400
Lv9: 2800
- Lv10: 2500
+ Lv10: 3000
}
FixedCastTime: 100
Requirements: {
SPCost: {
- Lv1: 18
- Lv2: 14
- Lv3: 24
- Lv4: 20
- Lv5: 30
- Lv6: 26
- Lv7: 36
- Lv8: 32
- Lv9: 42
- Lv10: 38
+ Lv1: 40
+ Lv2: 60
+ Lv3: 80
+ Lv4: 100
+ Lv5: 110
+ Lv6: 120
+ Lv7: 130
+ Lv8: 140
+ Lv9: 150
+ Lv10: 160
}
}
},
@@ -730,16 +725,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 120
- Lv3: 140
- Lv4: 160
- Lv5: 180
- Lv6: 200
- Lv7: 220
- Lv8: 240
- Lv9: 260
- Lv10: 300
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
}
}
},
@@ -760,29 +755,29 @@ skill_db: (
AfterCastActDelay: 1500
SkillData2: {
Lv1: 3000
- Lv2: 6000
- Lv3: 9000
- Lv4: 12000
- Lv5: 15000
- Lv6: 18000
- Lv7: 21000
- Lv8: 24000
- Lv9: 27000
- Lv10: 30000
+ Lv2: 3500
+ Lv3: 4000
+ Lv4: 4500
+ Lv5: 5000
+ Lv6: 5500
+ Lv7: 6000
+ Lv8: 6500
+ Lv9: 7000
+ Lv10: 7500
}
FixedCastTime: 160
Requirements: {
SPCost: {
- Lv1: 25
- Lv2: 24
- Lv3: 23
- Lv4: 22
- Lv5: 21
- Lv6: 20
- Lv7: 19
- Lv8: 18
- Lv9: 17
- Lv10: 16
+ Lv1: 200
+ Lv2: 210
+ Lv3: 220
+ Lv4: 230
+ Lv5: 240
+ Lv6: 250
+ Lv7: 260
+ Lv8: 270
+ Lv9: 280
+ Lv10: 290
}
}
},
@@ -840,7 +835,18 @@ skill_db: (
SplashArea: true
//SplitDamage: true
}
- SplashRange: 1
+ SplashRange: {
+ Lv1: 1
+ Lv2: 1
+ Lv3: 2
+ Lv4: 2
+ Lv5: 2
+ Lv6: 2
+ Lv7: 3
+ Lv8: 3
+ Lv9: 3
+ Lv10: 3
+ }
InterruptCast: true
CastTime: {
Lv1: 1280
@@ -878,17 +884,19 @@ skill_db: (
Lv9: 200
Lv10: 200
}
- SPCost: {
- Lv1: 100
- Lv2: 125
- Lv3: 150
- Lv4: 175
- Lv5: 200
- Lv6: 250
- Lv7: 300
- Lv8: 350
- Lv9: 400
- Lv10: 450
+ Requirements: {
+ SPCost: {
+ Lv1: 100
+ Lv2: 125
+ Lv3: 150
+ Lv4: 175
+ Lv5: 200
+ Lv6: 250
+ Lv7: 300
+ Lv8: 350
+ Lv9: 400
+ Lv10: 450
+ }
}
},
{
@@ -943,7 +951,7 @@ skill_db: (
Lv10: 140
}
Requirements: {
- SPCost: 40
+ SPCost: 140
}
Unit: {
Id: 0x7f
@@ -1018,16 +1026,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 120
- Lv3: 140
- Lv4: 160
- Lv5: 180
- Lv6: 200
- Lv7: 220
- Lv8: 240
- Lv9: 260
- Lv10: 300
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
}
}
},
@@ -1094,16 +1102,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 120
- Lv3: 140
- Lv4: 160
- Lv5: 180
- Lv6: 200
- Lv7: 220
- Lv8: 240
- Lv9: 260
- Lv10: 300
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
}
}
},
@@ -1380,15 +1388,15 @@ skill_db: (
Requirements: {
SPCost: {
Lv1: 100
- Lv2: 130
- Lv3: 160
- Lv4: 190
- Lv5: 220
- Lv6: 250
- Lv7: 280
- Lv8: 310
- Lv9: 340
- Lv10: 370
+ Lv2: 120
+ Lv3: 140
+ Lv4: 160
+ Lv5: 180
+ Lv6: 200
+ Lv7: 220
+ Lv8: 240
+ Lv9: 260
+ Lv10: 280
}
}
},
@@ -1425,16 +1433,16 @@ skill_db: (
Requirements: {
HPCost: 15
SPCost: {
- Lv1: 18
- Lv2: 21
- Lv3: 24
- Lv4: 27
- Lv5: 30
- Lv6: 33
- Lv7: 36
- Lv8: 39
- Lv9: 42
- Lv10: 45
+ Lv1: 60
+ Lv2: 80
+ Lv3: 100
+ Lv4: 120
+ Lv5: 140
+ Lv6: 160
+ Lv7: 180
+ Lv8: 200
+ Lv9: 220
+ Lv10: 240
}
}
},
@@ -1716,18 +1724,36 @@ skill_db: (
AttackType: "Weapon"
Element: "Ele_Weapon"
Requirements: {
- SPCost: 5
- ZenyCost: {
- Lv1: 100
- Lv2: 200
- Lv3: 300
- Lv4: 400
- Lv5: 500
- Lv6: 600
- Lv7: 700
- Lv8: 800
- Lv9: 900
- Lv10: 1000
+ SPCost: {
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
+ }
+ WeaponTypes: {
+ NoWeapon: true
+ Daggers: true
+ 1HSwords: true
+ 2HSwords: true
+ 1HSpears: true
+ 2HSpears: true
+ 1HAxes: true
+ 2HAxes: true
+ Maces: true
+ 2HMaces: true
+ Knuckles: true
+ Instruments: true
+ Whips: true
+ Books: true
+ Katars: true
+ Revolvers: true
+ Rifles: true
}
}
},
@@ -1735,15 +1761,21 @@ skill_db: (
Id: 43
Name: "AC_OWL"
Description: "Owl's Eye"
- MaxLevel: 10
+ MaxLevel: 20
NumberOfHits: 0
+ SkillInfo: {
+ Quest: true
+ }
},
{
Id: 44
Name: "AC_VULTURE"
Description: "Vulture's Eye"
- MaxLevel: 10
+ MaxLevel: 1
NumberOfHits: 0
+ SkillInfo: {
+ Quest: true
+ }
},
{
Id: 45
@@ -1754,6 +1786,9 @@ skill_db: (
SkillType: {
Self: true
}
+ SkillInfo: {
+ Quest: true
+ }
AttackType: "Weapon"
DamageType: {
NoDamage: true
@@ -1765,26 +1800,26 @@ skill_db: (
Lv2: 80000
Lv3: 100000
Lv4: 120000
- Lv5: 140000
- Lv6: 160000
- Lv7: 180000
- Lv8: 200000
- Lv9: 220000
- Lv10: 240000
+ Lv5: 130000
+ Lv6: 140000
+ Lv7: 150000
+ Lv8: 160000
+ Lv9: 170000
+ Lv10: 180000
}
FixedCastTime: 0
Requirements: {
SPCost: {
- Lv1: 25
- Lv2: 30
- Lv3: 35
- Lv4: 40
- Lv5: 45
- Lv6: 50
- Lv7: 55
- Lv8: 60
- Lv9: 65
- Lv10: 70
+ Lv1: 65
+ Lv2: 70
+ Lv3: 75
+ Lv4: 80
+ Lv5: 85
+ Lv6: 90
+ Lv7: 95
+ Lv8: 100
+ Lv9: 105
+ Lv10: 110
}
}
},
@@ -1851,22 +1886,27 @@ skill_db: (
FixedCastTime: 0
Requirements: {
SPCost: {
- Lv1: 250
- Lv2: 300
- Lv3: 350
- Lv4: 400
- Lv5: 450
- Lv6: 500
- Lv7: 550
- Lv8: 600
- Lv9: 650
- Lv10: 700
+ Lv1: 90
+ Lv2: 110
+ Lv3: 130
+ Lv4: 150
+ Lv5: 170
+ Lv6: 190
+ Lv7: 210
+ Lv8: 230
+ Lv9: 250
+ Lv10: 270
}
WeaponTypes: {
Bows: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
}
AmmoTypes: {
A_ARROW: true
+ A_BULLET: true
}
AmmoAmount: 5
}
@@ -2032,7 +2072,7 @@ skill_db: (
Lv1: 4800
Lv2: 3200
Lv3: 1600
- Lv4: 0
+ Lv4: 800
Lv5: 1
Lv6: 1
Lv7: 1
@@ -2043,8 +2083,8 @@ skill_db: (
AfterCastActDelay: {
Lv1: 500
Lv2: 1000
- Lv3: 2000
- Lv4: 3000
+ Lv3: 1500
+ Lv4: 2000
Lv5: 4000
Lv6: 5000
Lv7: 6000
@@ -2056,7 +2096,7 @@ skill_db: (
Lv1: 1200
Lv2: 800
Lv3: 400
- Lv4: 0
+ Lv4: 100
Lv5: 1
Lv6: 1
Lv7: 1
@@ -2065,7 +2105,7 @@ skill_db: (
Lv10: 1
}
Requirements: {
- SPCost: 60
+ SPCost: 200
// Items: {
// Blue_Gemstone: 1
// }
@@ -2245,7 +2285,7 @@ skill_db: (
IgnoreDefense: true
}
SkillData1: {
- Lv1: 1000
+ Lv1: 1300
Lv2: 2000
Lv3: 3000
Lv4: 4000
@@ -2260,15 +2300,15 @@ skill_db: (
Requirements: {
SPCost: {
Lv1: 100
- Lv2: 180
- Lv3: 260
- Lv4: 340
- Lv5: 420
- Lv6: 500
- Lv7: 580
- Lv8: 660
- Lv9: 740
- Lv10: 620
+ Lv2: 140
+ Lv3: 180
+ Lv4: 220
+ Lv5: 260
+ Lv6: 300
+ Lv7: 340
+ Lv8: 380
+ Lv9: 420
+ Lv10: 460
}
WeaponTypes: {
NoWeapon: true
@@ -2281,7 +2321,6 @@ skill_db: (
2HAxes: true
Maces: true
2HMaces: true
- Staves: true
Knuckles: true
Instruments: true
Whips: true
@@ -3395,18 +3434,18 @@ skill_db: (
Lv9: 384
Lv10: 384
}
- AfterCastActDelay: 200
+ AfterCastActDelay: 300
SkillData2: {
Lv1: 4000
- Lv2: 5000
- Lv3: 6000
- Lv4: 8000
- Lv5: 10000
- Lv6: 12000
- Lv7: 13000
- Lv8: 15000
- Lv9: 16000
- Lv10: 17000
+ Lv2: 4500
+ Lv3: 5000
+ Lv4: 6000
+ Lv5: 7000
+ Lv6: 8500
+ Lv7: 10000
+ Lv8: 12000
+ Lv9: 14000
+ Lv10: 16000
}
FixedCastTime: {
Lv1: 160
@@ -3422,16 +3461,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 45
- Lv2: 43
- Lv3: 41
- Lv4: 39
- Lv5: 37
- Lv6: 35
- Lv7: 33
- Lv8: 31
- Lv9: 29
- Lv10: 27
+ Lv1: 140
+ Lv2: 160
+ Lv3: 180
+ Lv4: 200
+ Lv5: 220
+ Lv6: 240
+ Lv7: 260
+ Lv8: 280
+ Lv9: 290
+ Lv10: 300
}
}
},
@@ -3554,16 +3593,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 120
- Lv3: 140
- Lv4: 160
- Lv5: 180
- Lv6: 200
- Lv7: 220
- Lv8: 240
- Lv9: 260
- Lv10: 300
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 140
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 260
}
}
},
@@ -5226,12 +5265,17 @@ skill_db: (
KnockBackTiles: 6
FixedCastTime: 1500
Requirements: {
- SPCost: 15
+ SPCost: 150
WeaponTypes: {
Bows: true
+ Revolvers: true
+ Rifles: true
+ GatlingGuns: true
+ Shotguns: true
}
AmmoTypes: {
A_ARROW: true
+ A_BULLET: true
}
AmmoAmount: 1
}
@@ -5270,12 +5314,13 @@ skill_db: (
Quest: true
}
AttackType: "Weapon"
+ CoolDown: 15000
DamageType: {
NoDamage: true
}
KnockBackTiles: 5
Requirements: {
- SPCost: 7
+ SPCost: 40
}
},
{
@@ -5413,7 +5458,7 @@ skill_db: (
CastTime: 1600
FixedCastTime: 400
Requirements: {
- SPCost: 75
+ SPCost: 60
}
},
{
@@ -7650,7 +7695,7 @@ skill_db: (
Id: 257
Name: "CR_DEFENDER"
Description: "Defending Aura"
- MaxLevel: 5
+ MaxLevel: 4
Hit: "BDT_SKILL"
SkillType: {
Self: true
@@ -11017,16 +11062,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 14
- Lv2: 18
- Lv3: 22
- Lv4: 26
- Lv5: 30
- Lv6: 34
- Lv7: 38
- Lv8: 42
- Lv9: 46
- Lv10: 50
+ Lv1: 44
+ Lv2: 58
+ Lv3: 72
+ Lv4: 86
+ Lv5: 100
+ Lv6: 114
+ Lv7: 128
+ Lv8: 142
+ Lv9: 156
+ Lv10: 170
}
}
},
@@ -11589,7 +11634,7 @@ skill_db: (
Id: 382
Name: "SN_SHARPSHOOTING"
Description: "Focused Arrow Strike"
- MaxLevel: 5
+ MaxLevel: 1
Range: 7
Hit: "BDT_MULTIHIT"
SkillType: {
@@ -11660,16 +11705,16 @@ skill_db: (
}
AfterCastActDelay: 2000
SkillData1: {
- Lv1: 130000
- Lv2: 160000
- Lv3: 190000
- Lv4: 220000
- Lv5: 250000
- Lv6: 280000
- Lv7: 310000
- Lv8: 340000
- Lv9: 370000
- Lv10: 400000
+ Lv1: 60000
+ Lv2: 70000
+ Lv3: 80000
+ Lv4: 90000
+ Lv5: 100000
+ Lv6: 110000
+ Lv7: 120000
+ Lv8: 140000
+ Lv9: 160000
+ Lv10: 180000
}
FixedCastTime: {
Lv1: 500
@@ -11686,15 +11731,15 @@ skill_db: (
Requirements: {
SPCost: {
Lv1: 146
- Lv2: 252
- Lv3: 358
- Lv4: 464
- Lv5: 570
- Lv6: 676
- Lv7: 782
- Lv8: 888
- Lv9: 994
- Lv10: 1100
+ Lv2: 167
+ Lv3: 188
+ Lv4: 209
+ Lv5: 330
+ Lv6: 351
+ Lv7: 372
+ Lv8: 393
+ Lv9: 414
+ Lv10: 425
}
}
},
@@ -12338,33 +12383,33 @@ skill_db: (
IgnoreCards: true
}
SplashRange: 2
- CastTime: 250
+ CastTime: 350
AfterCastActDelay: 500
SkillData2: {
Lv1: 10000
- Lv2: 5000
- Lv3: 120000
- Lv4: 120000
- Lv5: 120000
- Lv6: 120000
- Lv7: 120000
- Lv8: 120000
- Lv9: 120000
- Lv10: 120000
+ Lv2: 20000
+ Lv3: 30000
+ Lv4: 40000
+ Lv5: 50000
+ Lv6: 60000
+ Lv7: 70000
+ Lv8: 80000
+ Lv9: 90000
+ Lv10: 100000
}
- FixedCastTime: 250
+ FixedCastTime: 350
Requirements: {
SPCost: {
- Lv1: 10
- Lv2: 12
- Lv3: 14
- Lv4: 16
- Lv5: 18
- Lv6: 20
- Lv7: 22
- Lv8: 24
- Lv9: 26
- Lv10: 28
+ Lv1: 100
+ Lv2: 120
+ Lv3: 140
+ Lv4: 160
+ Lv5: 180
+ Lv6: 200
+ Lv7: 220
+ Lv8: 240
+ Lv9: 260
+ Lv10: 280
}
}
},
@@ -18491,7 +18536,7 @@ skill_db: (
SkillData1: 17000
FixedCastTime: 200
Requirements: {
- SPCost: 20
+ SPCost: 100
}
},
{
@@ -19350,7 +19395,7 @@ skill_db: (
}
AttackType: "Weapon"
Element: "Ele_Weapon"
- NumberOfHits: -7
+ NumberOfHits: -4
AfterCastActDelay: {
Lv1: 2500
Lv2: 2000
@@ -19365,7 +19410,7 @@ skill_db: (
}
FixedCastTime: -1
Requirements: {
- SPCost: 25
+ SPCost: 750
State: "Moveable"
}
},
@@ -19396,16 +19441,16 @@ skill_db: (
FixedCastTime: -1
Requirements: {
SPCost: {
- Lv1: 20
- Lv2: 25
- Lv3: 30
- Lv4: 35
- Lv5: 40
- Lv6: 45
- Lv7: 50
- Lv8: 55
- Lv9: 60
- Lv10: 65
+ Lv1: 120
+ Lv2: 125
+ Lv3: 130
+ Lv4: 135
+ Lv5: 140
+ Lv6: 145
+ Lv7: 150
+ Lv8: 155
+ Lv9: 160
+ Lv10: 165
}
}
},
@@ -20363,20 +20408,20 @@ skill_db: (
InterruptCast: true
CastTime: 1000
AfterCastActDelay: 1000
- CoolDown: 3000
+ CoolDown: 5000
FixedCastTime: -1
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 130
- Lv3: 160
- Lv4: 190
- Lv5: 220
- Lv6: 250
- Lv7: 280
- Lv8: 310
- Lv9: 340
- Lv10: 370
+ Lv1: 120
+ Lv2: 150
+ Lv3: 180
+ Lv4: 210
+ Lv5: 240
+ Lv6: 270
+ Lv7: 300
+ Lv8: 330
+ Lv9: 360
+ Lv10: 400
}
Items: {
Lifestone: 1
@@ -28067,16 +28112,16 @@ skill_db: (
FixedCastTime: -1
Requirements: {
SPCost: {
- Lv1: 30
- Lv2: 34
- Lv3: 38
- Lv4: 42
- Lv5: 46
- Lv6: 50
- Lv7: 54
- Lv8: 58
- Lv9: 62
- Lv10: 66
+ Lv1: 130
+ Lv2: 134
+ Lv3: 138
+ Lv4: 142
+ Lv5: 146
+ Lv6: 150
+ Lv7: 154
+ Lv8: 158
+ Lv9: 162
+ Lv10: 166
}
}
Unit: {
@@ -32654,7 +32699,7 @@ skill_db: (
Id: 5001
Name: "GC_DARKCROW"
Description: "Dark Claw"
- MaxLevel: 5
+ MaxLevel: 1
Range: 1
Hit: "BDT_MULTIHIT"
SkillType: {
@@ -32664,21 +32709,21 @@ skill_db: (
Element: "Ele_Weapon"
NumberOfHits: 3
AfterCastActDelay: 1500
- SkillData1: 5000
+ SkillData1: 10000
CoolDown: 60000
- FixedCastTime: -1
+ FixedCastTime: 2000
Requirements: {
SPCost: {
- Lv1: 22
- Lv2: 34
- Lv3: 46
- Lv4: 58
- Lv5: 70
- Lv6: 82
- Lv7: 94
- Lv8: 106
- Lv9: 118
- Lv10: 130
+ Lv1: 160
+ Lv2: 340
+ Lv3: 460
+ Lv4: 580
+ Lv5: 700
+ Lv6: 820
+ Lv7: 940
+ Lv8: 1060
+ Lv9: 1180
+ Lv10: 1300
}
}
},
@@ -33153,7 +33198,7 @@ skill_db: (
Lv9: 50000
Lv10: 55000
}
- SkillData2: 10000
+ SkillData2: 20000
CoolDown: 1800000
FixedCastTime: -1
Requirements: {
@@ -38352,6 +38397,7 @@ skill_db: (
Hit: "BDT_SKILL"
SkillType: {
Place: true
+ Self: true
}
SkillInfo: {
Quest: true
@@ -38375,12 +38421,12 @@ skill_db: (
InterruptCast: true
CastTime: 3000
AfterCastActDelay: 100
- SkillData2: 9000
+ SkillData2: 15000
CoolDown: 1000
//FixedCastTime: -1
TargetMiscEffect: "EFFECT_PROVOKE"
Requirements: {
- SPCost: 14
+ SPCost: 35
}
},
{
@@ -38416,18 +38462,9 @@ skill_db: (
},
{
Id: 20010
- Name: "MAGIC_WARRIOR"
- Description: "Magic Warrior"
- MaxLevel: 5
- SkillType: {
- Passive: true
- }
-},
-{
- Id: 20011
- Name: "WIZARD_MAGE"
- Description: "Wizard Mage"
- MaxLevel: 5
+ Name: "TMW2_SKILLPERMIT"
+ Description: "Skill Permit"
+ MaxLevel: 10
SkillType: {
Passive: true
}
diff --git a/db/re/skill_tree.conf b/db/re/skill_tree.conf
index 96730bdc3..4bd4d4793 100644
--- a/db/re/skill_tree.conf
+++ b/db/re/skill_tree.conf
@@ -31,21 +31,17 @@ Human: {
NV_BASIC: 0
TMW2_FAKESKILL: 0
TMW2_FAKESKILL2: 0
+ TMW2_SKILLPERMIT: 0
TMW2_CRAFT: 0
TMW2_ANCIENTLANGUAGES: 0
TMW2_SPEECH: 0
WE_MALE: 0
WE_FEMALE: 0
- SN_SHARPSHOOTING: 0
GD_EXTENSION: 0
AM_CALLHOMUN: 0
AM_REST: 0
AM_RESURRECTHOMUN: 6
-
- // Magical
- AL_HEAL: 4
- SM_PROVOKE: 5
- EVOL_MASS_PROVOKE: 10
+ AL_DP: 0
// Mana Skills
TMW2_ZARKOR: 3
@@ -65,83 +61,97 @@ Human: {
TMW2_CUTEHEART: 5
TMW2_PLANTKINGDOM: 5
- // Unrelated
+ // Thieves/Merchant-Police
ALL_INCCARRY: 0
TF_STEAL: 0
+ MC_PUSHCART: 0
- ///////////////// Main class
- // Magic Warrior
- MAGIC_WARRIOR: 0
- NV_TRICKDEAD: 0
- SM_BASH: 0
-
- // Wizard Mage
- WIZARD_MAGE: 0
+ ///////////////// Wizard class
+ // Destructive Magic (AOE)
+ MG_NAPALMBEAT: 0
MG_FIREBALL: 0
- AL_DP: 10
+ WZ_FROSTNOVA: 0
- ///////////////// Subclass
- // Paladin
- CR_TRUST: 0
- AL_ANGELUS: 0
- PR_REDEMPTIO: 0
- MER_INCAGI: 0
+ // Destructive Magic (ST)
+ AL_HOLYLIGHT: 0
+ MG_SOULSTRIKE: 0
+ MG_COLDBOLT: 0
+ MG_FIREBOLT: 0
+ MG_LIGHTNINGBOLT: 0
+ WZ_EARTHSPIKE: 0
+ MG_FROSTDIVER: 0
- // Tanker
- //CR_TRUST already defined on Paladin
- CR_AUTOGUARD: 0
- CR_DEFENDER: 0
- SM_RECOVERY: 0
- // Berserker
+ ///////////////// Assassin Class
+ // Physical Science (AOE)
+ ASC_METEORASSAULT: 0
+ AC_SHOWER: 0
+
+ // Physical Science (ST)
+ SM_BASH: 0
+ MC_MAMMONITE: 0
KN_AUTOCOUNTER: 0
- SM_ENDURE: 0
- SM_AUTOBERSERK: 0
- KN_TWOHANDQUICKEN: 0
+ AC_CHARGEARROW: 0
+ SN_SHARPSHOOTING: 0
- // Ranger
- AC_VULTURE: 0
- AC_OWL: 0
- AC_SHOWER: 0
+ ///////////////// Support Class
+ // Scholarship (SELF)
+ AC_OWL: 20
+ SA_DRAGONOLOGY: 0
+ TMW2_SAGE: 0
+ SM_RECOVERY: 0
+ MG_SRECOVERY: 0
+ //PF_HPCONVERSION: 0
+ //HP_MEDITATIO: 0
SN_WINDWALK: 0
+ CR_TRUST: 0
+ AC_VULTURE: 0
- // Sniper
- GS_SNAKEEYE: 0
- GS_SINGLEACTION: 0
- GS_INCREASING: 0
- GS_CHAINACTION: 0
- GS_MAGICALBULLET: 0
-
- // Wizards
- MG_COLDBOLT: 0
- MG_LIGHTNINGBOLT: 0
- WZ_EARTHSPIKE: 0
- MG_NAPALMBEAT: 0
- MG_ENERGYCOAT: 0
- MG_FIREBOLT: 0
+ // Scholarship (MMO)
+ AL_HEAL: 0
+ AL_INCAGI: 0
+ HW_MAGICPOWER: 0
+ SM_PROVOKE: 0
+ AL_ANGELUS: 0
+ TF_DETOXIFY: 0
+ AC_CONCENTRATION: 0
+ AB_HIGHNESSHEAL: 0
+ ALL_RESURRECTION: 0
+ EVOL_MASS_PROVOKE: 0
+ GC_DARKCROW: 0
- // Sages
- SA_FREECAST: 0
+ // Scholarship (Weapon)
+ PR_ASPERSIO: 0
SA_FLAMELAUNCHER: 0
SA_FROSTWEAPON: 0
SA_LIGHTNINGLOADER: 0
SA_SEISMICWEAPON: 0
- SA_DRAGONOLOGY: 0
- // Priests
- AL_PNEUMA: 0
- AL_HOLYLIGHT: 0
- MG_SRECOVERY: 10
- ALL_RESURRECTION: 0
- PR_ASPERSIO: 0
- TF_DETOXIFY: 0
- // Unused
+ ///////////////// Trickster Class
+ // Trickmasters (INOFFENSIVE)
+ SA_FREECAST: 0
+ TF_BACKSLIDING: 0
+ NV_TRICKDEAD: 0
+
+ // Trickmasters (OFFENSIVE)
+ MG_FIREWALL: 0
+ SO_FIREWALK: 0
+ GC_DARKILLUSION: 0
+
+
+ //////////////////////////////////////////
+ ///////////////// Unused /////////////////
+ //////////////////////////////////////////
+ ALL_FULL_THROTTLE: 0
+ BA_PANGVOICE: 0
+ SM_ENDURE: 0
+ CR_DEFENDER: 0
+
RG_GRAFFITI: 0
RG_CLEANER: 0
SC_INVISIBILITY: 0
MC_VENDING: 0
- MC_PUSHCART: 0
ALL_BUYING_STORE: 0
KN_RIDING: 0
/*
diff --git a/maps/re/003-0.mcache b/maps/re/003-0.mcache
index 85e5086b3..4a60efd02 100644
--- a/maps/re/003-0.mcache
+++ b/maps/re/003-0.mcache
Binary files differ
diff --git a/npc/003-0-2/_import.txt b/npc/003-0-2/_import.txt
index 8a8c8134b..84cd659b6 100644
--- a/npc/003-0-2/_import.txt
+++ b/npc/003-0-2/_import.txt
@@ -1,3 +1,4 @@
// Map 003-0-2: The Magic Guild Council Room
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/003-0-2/_warps.txt",
+"npc/003-0-2/manastone.txt",
diff --git a/npc/003-0-2/manastone.txt b/npc/003-0-2/manastone.txt
new file mode 100644
index 000000000..3339e29b3
--- /dev/null
+++ b/npc/003-0-2/manastone.txt
@@ -0,0 +1,76 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Mana Stone owned by the Magic Council
+//
+// Variables:
+// $MANA_BINT => Base Intelligence for Mana Stone
+// $MANA_BLVL => Base Level for Mana Stone
+// $MANA_JLVL => Base Job Level for Mana Stone
+// .int => Int Increment
+// .lvl => Lvl Increment
+// .jlvl => Jlv Increment
+
+003-0-2,35,19,0 script Mana Stone#Tulim NPC_MANA_STONE,{
+
+ // You need 50% more base level
+ if (BaseLevel < $MANA_BLVL*15/10) goto L_NotWorthy;
+ mesn;
+ mes l("The mighty Mana Stone does not reacts against you.");
+ mes l("Although this particular one seems to hate everyone and everything, it recognizes your strength.");
+ mes l("If you fell ready, perhaps you should touch it?");
+ mes "";
+ menu
+ l("Touch it!"), L_Level,
+ l("Take it!"), L_NotWorthy2,
+ l("Break it!"), L_NotWorthy2,
+ l("Leave it alone!"), -;
+ close;
+
+
+
+L_NotWorthy2:
+ npctalk3 l("You are not worthy!");
+ percentheal -20, -50;
+ if (!MAGIC_LVL)
+ dispbottom l("I should train my intelligence, have full MP, and don't neglect even Job Level.");
+ end;
+
+L_Level:
+ // See functions/util.txt for *mstone() details
+ if (mstone(0)) goto L_LevelUp;
+ if (mstone(1)) goto L_LevelUp;
+ if (mstone(2)) goto L_LevelUp;
+ if (mstone(3)) goto L_LevelUp;
+ if (mstone(4)) goto L_LevelUp;
+ if (mstone(5)) goto L_LevelUp;
+ if (mstone(6)) goto L_LevelUp;
+ if (MAGIC_LVL >= 7) npctalk3 l("You already got all power I could grant you!");
+ if (is_gm()) percentheal -20, -50;
+ if (MAGIC_LVL >= 7 || is_gm()) close;
+
+L_NotWorthy:
+ if (readparam(Sp) != readparam(MaxSp))
+ dispbottom l("I must have full MP to touch it... Which I don't.");
+ else
+ dispbottom l("I should train my intelligence, and level up, both my base as my Job Level.");
+ npctalk3 l("You are not worthy!");
+ percentheal min(-10, -70+BaseLevel), min(-10, -100+BaseLevel);
+ end;
+
+L_LevelUp:
+ mes "";
+ mes l("A great rush of mana flows though you.");
+ if (!MAGIC_LVL) mes l("Magic Power is granted to you, but you die from it.");
+ if (MAGIC_LVL) mes l("More Magic Power is granted to you, but you die from it.");
+ MAGIC_LVL = MAGIC_LVL+1;
+ sk_lvup(AL_DP);
+ percentheal -100, -100;
+ close;
+
+OnInit:
+ .sex = G_OTHER;
+ .distance = 2;
+ end;
+}
diff --git a/npc/003-0/_import.txt b/npc/003-0/_import.txt
index 1601700b1..0ec5970cb 100644
--- a/npc/003-0/_import.txt
+++ b/npc/003-0/_import.txt
@@ -1,14 +1,8 @@
// Map 003-0: Magic Academy
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/003-0/_warps.txt",
-"npc/003-0/berserk.txt",
"npc/003-0/colin.txt",
"npc/003-0/luca.txt",
-"npc/003-0/mages.txt",
-"npc/003-0/paladin.txt",
-"npc/003-0/priest.txt",
"npc/003-0/recepcionist.txt",
-"npc/003-0/sage.txt",
-"npc/003-0/tanker.txt",
-"npc/003-0/warriors.txt",
-"npc/003-0/wizard.txt",
+"npc/003-0/saves.txt",
+"npc/003-0/trickmaster.txt",
diff --git a/npc/003-0/berserk.txt b/npc/003-0/berserk.txt
deleted file mode 100644
index a4af50e2f..000000000
--- a/npc/003-0/berserk.txt
+++ /dev/null
@@ -1,222 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the BERSERK class
-
-003-0,34,45,4 script Ragger Master NPC_PLAYER,{
- if (!(MAGIC_SUBCLASS & CL_BERSERKER))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(MAGIC_WARRIOR) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Berserk (Ragger) Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_BERSERKER;
- mesn;
- mesq l("Welcome to the berserker guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Ragger
-// KN_AUTOCOUNTER (Counter any attack with 2x critical rate and block attack for 0.5s)
-// SM_ENDURE (deny stun penalty when hit, and MDEF bonus, for 10s)
-// KN_TWOHANDQUICKEN (raise attack speed in 30%, if you are with a 2-hands sword) (30s/level)
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(SM_BASH) && getskilllv(SM_BASH) < (3+degree_subclass()), l("Improve Bash Skill")),
- rif(sk_intcost(SM_ENDURE) && sk_canlvup(SM_ENDURE), l("Improve Endure Skill")),
- rif(sk_intcost(KN_AUTOCOUNTER) && sk_canlvup(KN_AUTOCOUNTER), l("Improve Counter Defense")),
- rif(sk_intcost(KN_TWOHANDQUICKEN) && sk_canlvup(KN_TWOHANDQUICKEN), l("Improve Two Hands Quicken")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Bash]");
- mesc l("Blow with increased attack and precision.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(ManaPiouFeathers), (getskilllv(SM_BASH)+1)*15, getitemlink(ManaPiouFeathers));
- mesc l("@@/@@ @@", countitem(CaveSnakeSkin), (getskilllv(SM_BASH)+1)*3, getitemlink(CaveSnakeSkin));
- mesc l("@@/@@ @@", countitem(RubyPowder), (getskilllv(SM_BASH)+1)*2, getitemlink(RubyPowder));
- mesc l("@@/@@ @@", countitem(StrengthPotion), (getskilllv(SM_BASH)+1)*2, getitemlink(StrengthPotion));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(ManaPiouFeathers) < (getskilllv(SM_BASH)+1)*15 ||
- countitem(CaveSnakeSkin) < (getskilllv(SM_BASH)+1)*3 ||
- countitem(RubyPowder) < (getskilllv(SM_BASH)+1)*2 ||
- countitem(StrengthPotion) < (getskilllv(SM_BASH)+1)*2) goto L_Missing;
-
- delitem ManaPiouFeathers, (getskilllv(SM_BASH)+1)*15;
- delitem CaveSnakeSkin, (getskilllv(SM_BASH)+1)*3;
- delitem RubyPowder, (getskilllv(SM_BASH)+1)*2;
- delitem StrengthPotion, (getskilllv(SM_BASH)+1)*2;
-
- sk_lvup(SM_BASH);
-
- next;
- }
- break;
- case 2:
- mesc l("[Endure]");
- mesc l("Temporary immunity to move stun when hit, and MDEF bonus.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(SM_ENDURE)+1)*10, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(DiamondPowder), (getskilllv(SM_ENDURE)+1)*2, getitemlink(DiamondPowder));
- mesc l("@@/@@ @@", countitem(MoubooSteak), (getskilllv(SM_ENDURE)+1)*4, getitemlink(MoubooSteak));
- mesc l("@@/@@ @@", countitem(IronIngot), (getskilllv(SM_ENDURE)+1)*1, getitemlink(IronIngot));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(PiberriesInfusion) < (getskilllv(SM_ENDURE)+1)*10 ||
- countitem(DiamondPowder) < (getskilllv(SM_ENDURE)+1)*2 ||
- countitem(MoubooSteak) < (getskilllv(SM_ENDURE)+1)*4 ||
- countitem(IronIngot) < (getskilllv(SM_ENDURE)+1)*1) goto L_Missing;
-
- delitem PiberriesInfusion, (getskilllv(SM_ENDURE)+1)*10;
- delitem DiamondPowder, (getskilllv(SM_ENDURE)+1)*2;
- delitem MoubooSteak, (getskilllv(SM_ENDURE)+1)*4;
- delitem IronIngot, (getskilllv(SM_ENDURE)+1)*1;
-
- sk_lvup(SM_ENDURE);
-
- next;
- }
- break;
- case 3:
- mesc l("[Counter Defense]");
- mesc l("During a very small amount of time, you'll counter any attack with double critical, and won't take the damage.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(PinkAntenna), (getskilllv(KN_AUTOCOUNTER)+1)*10, getitemlink(PinkAntenna));
- mesc l("@@/@@ @@", countitem(CaveSnakeSkin), (getskilllv(KN_AUTOCOUNTER)+1)*3, getitemlink(CaveSnakeSkin));
- mesc l("@@/@@ @@", countitem(RubyPowder), (getskilllv(KN_AUTOCOUNTER)+1)*2, getitemlink(RubyPowder));
- mesc l("@@/@@ @@", countitem(StrengthPotion), (getskilllv(KN_AUTOCOUNTER)+1)*2, getitemlink(StrengthPotion));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(PinkAntenna) < (getskilllv(KN_AUTOCOUNTER)+1)*10 ||
- countitem(CaveSnakeSkin) < (getskilllv(KN_AUTOCOUNTER)+1)*3 ||
- countitem(RubyPowder) < (getskilllv(KN_AUTOCOUNTER)+1)*2 ||
- countitem(StrengthPotion) < (getskilllv(KN_AUTOCOUNTER)+1)*2) goto L_Missing;
-
- delitem PinkAntenna, (getskilllv(KN_AUTOCOUNTER)+1)*10;
- delitem CaveSnakeSkin, (getskilllv(KN_AUTOCOUNTER)+1)*3;
- delitem RubyPowder, (getskilllv(KN_AUTOCOUNTER)+1)*2;
- delitem StrengthPotion, (getskilllv(KN_AUTOCOUNTER)+1)*2;
-
- sk_lvup(KN_AUTOCOUNTER);
-
- next;
- }
- break;
- case 4:
- mesc l("[Two Hands Quicken]");
- mesc l("Triggers an attack speed buff when using two swords.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Cheese), (getskilllv(KN_TWOHANDQUICKEN)+1)*50, getitemlink(Cheese));
- mesc l("@@/@@ @@", countitem(Coral), (getskilllv(KN_TWOHANDQUICKEN)+1)*30, getitemlink(Coral));
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(KN_TWOHANDQUICKEN)+1)*20, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(HastePotion), (getskilllv(KN_TWOHANDQUICKEN)+1)*10, getitemlink(HastePotion));
- mesc l("@@/@@ @@", countitem(DiamondPowder), (getskilllv(KN_TWOHANDQUICKEN)+1)*3, getitemlink(DiamondPowder));
- mesc l("@@/@@ @@", countitem(ElixirOfLife), (getskilllv(KN_TWOHANDQUICKEN)+1)*1, getitemlink(ElixirOfLife));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Cheese) < (getskilllv(KN_TWOHANDQUICKEN)+1)*50 ||
- countitem(Coral) < (getskilllv(KN_TWOHANDQUICKEN)+1)*30 ||
- countitem(PiberriesInfusion) < (getskilllv(KN_TWOHANDQUICKEN)+1)*20 ||
- countitem(HastePotion) < (getskilllv(KN_TWOHANDQUICKEN)+1)*10 ||
- countitem(DiamondPowder) < (getskilllv(KN_TWOHANDQUICKEN)+1)*3 ||
- countitem(ElixirOfLife) < (getskilllv(KN_TWOHANDQUICKEN)+1)*1) goto L_Missing;
-
- delitem Cheese, (getskilllv(KN_TWOHANDQUICKEN)+1)*50;
- delitem Coral, (getskilllv(KN_TWOHANDQUICKEN)+1)*30;
- delitem PiberriesInfusion, (getskilllv(KN_TWOHANDQUICKEN)+1)*20;
- delitem HastePotion, (getskilllv(KN_TWOHANDQUICKEN)+1)*10;
- delitem DiamondPowder, (getskilllv(KN_TWOHANDQUICKEN)+1)*3;
- delitem ElixirOfLife, (getskilllv(KN_TWOHANDQUICKEN)+1)*1;
-
- sk_lvup(KN_TWOHANDQUICKEN);
-
- next;
- }
- break;
- case 5:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill KN_TWOHANDQUICKEN, 0, 0;
- skill KN_AUTOCOUNTER, 0, 0;
- skill SM_ENDURE, 0, 0;
- skill SM_BASH, 2, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_BERSERKER;
- mesc l("You abandoned the BERSERKER class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- setunitdata(.@npcId, UDT_HEADTOP, WarlordHelmet);
- setunitdata(.@npcId, UDT_HEADMIDDLE, GoldenWarlordPlate);
- setunitdata(.@npcId, UDT_HEADBOTTOM, ShortGladius);
- setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-0/colin.txt b/npc/003-0/colin.txt
index 526f0d2ef..7d8bbf77b 100644
--- a/npc/003-0/colin.txt
+++ b/npc/003-0/colin.txt
@@ -3,88 +3,75 @@
// Saulc
// Jesusalva
// Description:
-// Luca and Colin assigns player a class. Colin is the Wizard Master.
+// Colin, of Destructive Magic Class.
-003-0,41,25,0 script Colin NPC_PLAYER,{
- mesn;
- mesq l("I am the @@ master.", l("Wizard Mages"));
+003-0,58,29,0 script Colin NPC_PLAYER,{
if (!MAGIC_LVL) goto L_NoMagic;
- if (getskilllv(MAGIC_WARRIOR) && !is_admin()) close;
- if (getskilllv(WIZARD_MAGE) == 0) goto L_SignUp;
-
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 0) goto L_Tier2;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER >= 1) goto L_T2_S0;
-
- // Sanity check
- if (getskilllv(WIZARD_MAGE) >= 1) {
- mesn;
- mesq l("The Wizards have three other subclasses:");
- mesn lg("Wizard");
- mesc l("The offensive guy, with every attack skill a mage could need.");
- mesn lg("Sage");
- mesc l("The wise guy, which doesn't relies on magic, and loves summon.");
- mesn lg("Priest");
- mesc l("The defensive guy, with every support skill a mage could need.");
- }
- close;
-
-L_SignUp:
- next;
- mesn;
- mesq l("You have some magic power. Do you want to join the @@? ##BThis cannot be undone##b.", l("Wizard Mages"));
- next;
- mesn;
- mesq l("We use swords and bows to protect the people, and we use magic to spice things up! Because we're strong even without it!");
- next;
- menu
- l("What do I need to do to join?"), L_JoinReq,
- l("I'm not interested, sorry."), -;
- close;
-
-L_JoinReq:
- mesn;
- mesq l("Ah, nothing too major, as you already have magic.");
- next;
- mesn;
- mesq l("We only require a small fee of 1 @@, or 40 @@, or 500 @@ if you are poor adventurer.", getitemlink(DivineApple), getitemlink(SnakeEgg), getitemlink(MaggotSlime));
- next;
- switch(select(
- rif(countitem(DivineApple) >= 1, l("I got the apple.")),
- rif(countitem(SnakeEgg) >= 40, l("I got the eggs.")),
- rif(countitem(MaggotSlime) >= 500, l("I got the maggots slimes.")),
- l("I will apply later."))) {
+ mes l(".:: Destructive Magic Class ::.");
+ mesc l("Specialized in destructive, magical skills.");
+ next;
+ mesn;
+ do {
+ mesc l("You have @@ magic skill points available.", sk_points());
+ next;
+ mesc l("Fireball - Basic AoE (Area Of Effect) Skill");
+ mesc l("Holy Light - Standard Holy Magical Attack");
+ mesc l("Magic Strike - Standard Magical Attack");
+
+ mesc l("Napalm Beat - Spammable AoE Skill");
+ mesc l("Frost Diver - Attempt to freeze an enemy, dealing damage");
+
+ mesc l("Frost Nova - Freeze everything in a range");
+ mesc l("Note: You can exchange 1 @@ for 3 @@", getitemlink(GemPowder), getitemlink(Quill)), 1;
+ menuint
+ l("Fireball"), MG_FIREBALL,
+ l("Holy Light"), AL_HOLYLIGHT,
+ l("Magic Strike"), MG_SOULSTRIKE,
+ l("Napalm Beat"), MG_NAPALMBEAT,
+ l("Frost Diver"), MG_FROSTDIVER,
+ l("Frost Nova"), WZ_FROSTNOVA,
+ rif(countitem(GemPowder), l("Exchange Gempowder for Quill")), -1,
+ l("Cancel"), 0;
+ mes "";
- case 1:
- delitem DivineApple, 1;
- getexp $MANA_BLVL*100, $MANA_JLVL*10;
- goto L_Tier1Ok;
+ switch (@menuret) {
+ case -1:
+ inventoryplace Quill, 3;
+ delitem GemPowder, 1;
+ getitem Quill, 3;
+ break;
+ case MG_FIREBALL:
+ if (!mlearn(MG_FIREBALL, 10, 1, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case AL_HOLYLIGHT:
+ if (!mlearn(AL_HOLYLIGHT, 1, 1, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
- case 2:
- // If player had 40 eggs, and eat 1 - they are clearly cheating.
- // It will delete all 39 eggs, and when it tries to delete the 40th,
- // it won't find and will terminate the script. No lame cheating.
- // Of course, all 39 eggs are gone for and I can't do anything about it.
- delitem SnakeEgg, 40;
- getexp $MANA_BLVL*100, $MANA_JLVL*10;
- goto L_Tier1Ok;
+ case MG_SOULSTRIKE:
+ if (!mlearn(MG_SOULSTRIKE, 10, 1, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
- case 3:
- delitem MaggotSlime, 500;
- goto L_Tier1Ok;
+ case MG_NAPALMBEAT:
+ if (!mlearn(MG_NAPALMBEAT, 5, 2, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case MG_FROSTDIVER:
+ if (!mlearn(MG_FROSTDIVER, 7, 2, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case WZ_FROSTNOVA:
+ if (!mlearn(WZ_FROSTNOVA, 7, 3, Quill, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
default:
+ if (@menuret)
+ Exception("ERROR skill not implemented", RB_DEFAULT|RB_SPEECH);
+ else
+ closeclientdialog;
break;
}
-
- close;
-
-L_Tier1Ok:
- // The last argument is duration: 0 - permanent 1- temporary. If omitted, defaults to 1.
- skill(MG_FIREBALL,1,0);
- skill(WIZARD_MAGE,1,0);
- mes "";
- mesn;
- mesq l("Here, learn this awesome skill. It is on the skills tab. You can drag it to the shortcut list. Use it to protect people!");
+ } while (@menuret);
close;
L_NoMagic:
@@ -99,263 +86,6 @@ L_NoMagic:
mesq l("Perhaps, in the city, someone knows rumors about Mana Stones and can teach you. Other than that, you're on your own.");
close;
-// progressbar("<color>", <seconds>)
-// Script will be canceled if character moves :D
-// So I probably could *try* to reuse TMW-BR Magic Tier 2 Scripts.
-L_Tier2:
- next;
- mesn;
- mesq l("Wha, your magic power increased! How?! Ah, nevermind. You are eligible to get tier 2!");
- next;
- mesn;
- mesq l("But whoa, not so fast! You must pass the seven steps of a trial first!");
- next;
- mesn;
- mesq l("The first trial is simple, I'm not doing anything in special. Bring me 1 @@, or 200 @@ and 20 @@.", getitemlink(DivineApple), getitemlink(SilkCocoon), getitemlink(ChocolateMouboo));
- next;
- switch(select(
- rif(countitem(DivineApple) >= 1, l("I got the apple.")),
- rif(countitem(SilkCocoon) >= 200 && countitem(ChocolateMouboo) >= 20, l("I got the silk and chocolate.")),
- l("I will apply later."))) {
-
- case 1:
- delitem DivineApple, 1;
- goto L_Tier2Ok;
- break;
- case 2:
- delitem SilkCocoon, 200;
- delitem ChocolateMouboo, 20;
- goto L_Tier2Ok;
- break;
- default:
- break;
- }
-
- close;
-
-L_Tier2Ok:
- // The last argument is duration: 0 - permanent 1- temporary. If omitted, defaults to 1.
- addtoskill(MG_FIREBALL,2,0);
- getexp 10000, 0;
- ST_TIER=1;
- mes "";
- mesn;
- mesq l("Good, good. The skill you got earlier just raised a single level. I'll also impair some experience on you, no biggies.");
- next;
- mesn;
- mesq l("Now, the real challenge will start. You have a lot of raw power, but that doesn't gives you a lot of skills to learn.");
- next;
- mesn;
- mesq l("I can make a nice, simple potion for you. That will help the raw mana to settle on your body.");
- next;
- mesn;
- mesq l("However, beware! That potion is short-lived, you'll be running against time. Get ready to travel a lot.");
- next;
- if (nard_reputation() < 8) {
- mesn;
- mesq l("I advise you to do more quests on Tulimshar and Candor, otherwise, you might fail right at the end.");
- next;
- }
- mesn;
- mesq l("Come talk to me when you're ready, and we can begin.");
- close;
-
-L_T2_Fail:
- if (ST_TIER == 3) {
- if (countitem(SunnyCrystal) > 0) {
- delitem SunnyCrystal, 1;
- } else {
- mesn;
- mesc l("WARNING. YOU ARE CHEATING THE SUNNY CRYSTAL QUEST."), 1;
- next;
- mesn;
- mesc l("YOU WILL BE PENALIZED WITH 60% OF HEALTH."), 1;
- mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
- percentheal -60, -100;
- close;
- }
- }
-
- if (ST_TIER == 10) {
- if (countitem(JesusalvaGrimorium) > 0) {
- delitem JesusalvaGrimorium, 1;
- } else {
- mesn;
- mesc l("WARNING. YOU ARE CHEATING THE GRIMORIE QUEST."), 1;
- next;
- mesn;
- mesc l("YOU WILL BE PENALIZED WITH 70% OF HEALTH."), 1;
- mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
- percentheal -70, -100;
- close;
- }
- }
-
- mesc l(".:: Mission Failed ::."), 1;
- mesc l("You ran out of time."), 1;
- mes "";
- mes l("You should have gotten here @@.", FuzzyTime(QUEST_ELEVARTEMPO,0,2));
- ST_TIER=1;
- close;
-
-L_T2_S0:
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 1) goto L_T2_S1;
- if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T2_Fail;
-
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 2) goto L_T2_S2;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 3) goto L_T2_S3;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 4) goto L_T2_S4;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 5) goto L_T2_S5;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 6) goto L_T2_S6;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER <= 9) goto L_T2_S7;
- if (getskilllv(WIZARD_MAGE) == 1 && MAGIC_LVL >= 2 && ST_TIER == 10) goto L_T2_Final;
- mesc l("Error, error, L_T2_S0 General Error, REPORT ME");
- close;
-
-L_T2_S1:
- //WIZARD_MAGE l("Wizard Mages") MAGIC_WARRIOR
- mes "";
- mesn;
- mesq l("So, young disciple! I wish I could just chant some gibberish words and that automatically granted you more skills, but alas, that won't work.");
- next;
- if (nard_reputation() < 8) {
- mesn;
- mesc l("I advise you to do more quests on Tulimshar and Candor, otherwise, you will fail right at the end."), 1;
- next;
- }
- mesn;
- mesq l("I can, however, prepare you a potion. But beware, that potion will only last 35 minutes once baked.");
- next;
- mesn; // PiberriesInfusion
- mesq l("If it expires, you'll need to do another. To bake it I need 1 @@, 10 @@ and a @@. Have Mauve and Money, lots of it.", getitemlink(EverburnPowder), getitemlink(MaggotSlime), getitemlink(EmptyBottle));
- next;
- select
- rif(countitem(MaggotSlime) >= 10 && countitem(EverburnPowder) && countitem(EmptyBottle), l("I have everything.")),
- l("I'm not ready.");
-
- mes "";
- if (@menu == 2) {
- mesn;
- mesq l("Yes, as you see, the costs are high. Prepare yourself.");
- close;
- }
-
- delitem EmptyBottle, 1;
- delitem EverburnPowder, 1;
- delitem MaggotSlime, 10;
- ST_TIER=2;
- set QUEST_ELEVARTEMPO, gettimetick(2) + (60 * 35);
- getexp 400, 0;
- mesn;
- mesc l("The class master mix the powder with the slime inside the bottle, and makes some weird mixture.");
- next;
- mesn;
- mesc l("He pours something on it, you're not sure what. He then utters some magic words.");
- next;
- // Reset timer, this is the place where it should really happen.
- set QUEST_ELEVARTEMPO, gettimetick(2) + (60 * 35);
- mesn;
- mesq l("The potion is baked, you have thirty five minutes! Read as fast as you can, don't miss details!");
- next;
- mesn;
- mesq l("First thing is to get a @@. One from black market won't do, go to Halinarzo!", getitemlink(SunnyCrystal));
- next;
- mesn;
- mesq l("Speak with ##BBarzil##b. Tell him I need it, he'll give you one from my inventory. HURRY UP!");
- close;
-
-L_T2_S2:
- mesn;
- mesq l("Hurry up! Bring my @@ from Barzil in Halinarzo!! You only have @@ left!", getitemlink(SunnyCrystal), FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-L_T2_S3:
- if (countitem(SunnyCrystal) == 0) {
- mesn;
- mesq l("Where's the Sunny Crystal? Hurry up, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- }
- delitem SunnyCrystal, 1;
- ST_TIER=4;
- getexp 250, 0;
- mesn;
- mesq l("Good, you did it!");
- next;
- mesn;
- mesc l("*chants more words, while the crystal hovers the potion*");
- next;
-
-L_T2_S4:
- mesn;
- mesq l("I will need many Mauve Herbs! Do you have them with you? If you don't have enough, we'll lose everything! You need at most @@!", BaseLevel+40);
- select
- rif(countitem(MauveHerb), l("Yes, I have herbs. I assume the risks.")),
- l("No I don't have herbs. I'll be back.");
-
- if (@menu == 2)
- close;
-
- if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T2_Fail;
- .@req=rand(BaseLevel-20, BaseLevel+40);
- // Minimum is 40, max is unknown, defaults to 100
-
- mesn;
- mesq l("I need @@ Herbs!", .@req);
- //next; // If you comment this next, you'll allow players to logout and prevent penalty.
- mes "";
-
- if (countitem(MauveHerb) < .@req) goto L_T2_Fail;
- delitem MauveHerb, .@r;
- ST_TIER=5;
- getexp .@r*3, 0;
- //getitem MagicPotion, 1;
-
- mesc l("You quickly give him the herbs, and he skillfully mix them on a potion.");
- next;
- // You'll get a random amount of time, based on spent herbs
- // Usually, 10~73 sec, being 73 sec = 1m13s
- QUEST_ELEVARTEMPO=QUEST_ELEVARTEMPO+rand(10,.@r-27);
-
-L_T2_S5:
- mesn;
- mesq l("Good! Last step! West of Hurnscald, there is a magic fountain.");
- next;
- mesn;
- mesq l("Talk to the Fountain. Pour the potion on it. I advise you to put all your points on int if possible.");
- next;
- mesn;
- mesq l("Hurry up, you'll run out of time in @@!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-L_T2_S6:
- ST_TIER=7;
- mesn;
- mesq l("You did it! You're now on the last stage of this BORING and LONG quest!");
- next;
-
-L_T2_S7:
- mesn;
- mesq l("Jesusaves wrote a grimorie, with ancient secrets of our world.");
- next;
- mesn;
- mesq l("Captain Nard have it. Fetch it with him! Quick, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-// You gain two skills: Provoke (works better, but limited usability) and the class skill
-L_T2_Final:
- skill(AL_DP,1,0);
- skill(SM_PROVOKE, 1, 0);
- addtoskill(WIZARD_MAGE,2,0);
- getexp 40000, 0; // Yes, 40k experience points. Waw.
- mesc l(".:: Congratulations! ::."), 2;
- mesc l("You advanced your tier!"), 2;
- next;
- mesn;
- mesq l("Keep the Grimorie with you. It's the proof you are now Tier 2. The book shall guide your advances!");
- next;
- mesn;
- mesq lg("Yes, courageous and worthy adventurer. You did well. I won't babysit you anymore. Embrace the new world opening before you!");
- close;
-
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
diff --git a/npc/003-0/luca.txt b/npc/003-0/luca.txt
index 882ffeead..b5a271f52 100644
--- a/npc/003-0/luca.txt
+++ b/npc/003-0/luca.txt
@@ -3,88 +3,68 @@
// Saulc
// Jesusalva
// Description:
-// Luca and Colin assigns player a class. Luca is the Warrior Master.
+// Luca, of Physical Science Class.
-003-0,31,26,0 script Luca NPC_PLAYER,{
- mesn;
- mesq l("I am the @@ master.", l("Magic Warriors"));
+003-0,34,41,0 script Luca NPC_PLAYER,{
if (!MAGIC_LVL) goto L_NoMagic;
- if (getskilllv(WIZARD_MAGE) && !is_admin()) close;
- if (getskilllv(MAGIC_WARRIOR) == 0) goto L_SignUp;
-
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 0) goto L_Tier2;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER >= 1) goto L_T2_S0;
-
- // Sanity check
- if (getskilllv(MAGIC_WARRIOR) >= 1) {
- mesn;
- mesq l("The Warriors have three other subclasses:");
- mesn lg("Paladin");
- mesc l("The well-round guy, with reasonable def, attack, and support skills.");
- mesn lg("Berserker");
- mesc l("The full-attack guy. Two hand swords works best!");
- mesn lg("Tanker");
- mesc l("The full-defense guy. Most skills require a shield.");
- }
- close;
-
-L_SignUp:
- next;
- mesn;
- mesq l("You have some magic power. Do you want to join the @@? ##BThis cannot be undone##b.", l("Magic Warriors"));
+ mes l(".:: Physical Sciences Class ::.");
+ mesc l("Specialized in skills with weapon-based damage and Assassination.");
next;
mesn;
- mesq l("We use swords and bows to protect the people, and we use magic to spice things up! Because we're strong even without it!");
+ do {
+ mesc l("You have @@ magic skill points available.", sk_points());
next;
- menu
- l("What do I need to do to join?"), L_JoinReq,
- l("I'm not interested, sorry."), -;
- close;
+ mesc l("Falkon Punch - Bash your weapon against your enemies with raised damage and accuracy.");
+ mesc l("Supreme Attack - Cause a very strong attack with lowered accuracy.");
+ mesc l("Arrow Shower - Shoot FIVE arrows or bullets to the air and cause Area Of Effect Damage.");
-L_JoinReq:
- mesn;
- mesq l("Ah, nothing too major, as you already have magic.");
- next;
- mesn;
- mesq l("We only require a small fee of 1 @@, or 40 @@, or 500 @@ if you are poor adventurer.", getitemlink(DivineApple), getitemlink(SnakeEgg), getitemlink(MaggotSlime));
- next;
- switch(select(
- rif(countitem(DivineApple) >= 1, l("I got the apple.")),
- rif(countitem(SnakeEgg) >= 40, l("I got the eggs.")),
- rif(countitem(MaggotSlime) >= 500, l("I got the maggots slimes.")),
- l("I will apply later."))) {
+ mesc l("Counter Attack - Next attack will be retaliated, with twice critical ratio.");
+
+ mesc l("Ground Strike - Hit the ground, exploding the surroundings and disabling enemies.");
+ mesc l("Sharpshooter - Shoot an arrow or bullet which damages everything on its way.");
+ menuint
+ l("Falkon Punch"), SM_BASH,
+ l("Supreme Attack"), MC_MAMMONITE,
+ l("Arrow Shower"), AC_SHOWER,
+ l("Counter Attack"), KN_AUTOCOUNTER,
+ l("Ground Strike"), ASC_METEORASSAULT,
+ l("Sharpshooter"), SN_SHARPSHOOTING,
+ l("Cancel"), 0;
+ mes "";
- case 1:
- delitem DivineApple, 1;
- getexp $MANA_BLVL*100, $MANA_JLVL*10;
- goto L_Tier1Ok;
+ switch (@menuret) {
+ case SM_BASH:
+ if (!mlearn(SM_BASH, 10, 1, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case MC_MAMMONITE:
+ if (!mlearn(MC_MAMMONITE, 10, 1, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
- case 2:
- // If player had 40 eggs, and eat 1 - they are clearly cheating.
- // It will delete all 39 eggs, and when it tries to delete the 40th,
- // it won't find and will terminate the script. No lame cheating.
- // Of course, all 39 eggs are gone for and I can't do anything about it.
- delitem SnakeEgg, 40;
- getexp $MANA_BLVL*100, $MANA_JLVL*10;
- goto L_Tier1Ok;
+ case AC_SHOWER:
+ if (!mlearn(AC_SHOWER, 10, 1, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
- case 3:
- delitem MaggotSlime, 500;
- goto L_Tier1Ok;
+ case KN_AUTOCOUNTER:
+ if (!mlearn(KN_AUTOCOUNTER, 5, 2, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case ASC_METEORASSAULT:
+ if (!mlearn(ASC_METEORASSAULT, 5, 3, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case SN_SHARPSHOOTING:
+ if (!mlearn(SN_SHARPSHOOTING, 1, 3, FluoPowder, 3))
+ mesc l("You do not meet all requisites for this skill."), 1;
break;
default:
+ if (@menuret)
+ Exception("ERROR skill not implemented", RB_DEFAULT|RB_SPEECH);
+ else
+ closeclientdialog;
break;
}
-
- close;
-
-L_Tier1Ok:
- // The last argument is duration: 0 - permanent 1- temporary. If omitted, defaults to 1.
- skill(SM_BASH,1,0);
- skill(MAGIC_WARRIOR,1,0);
- mes "";
- mesn;
- mesq l("Here, learn this awesome skill. It is on the skills tab. You can drag it to the shortcut list. Use it to protect people!");
+ } while (@menuret);
close;
L_NoMagic:
@@ -99,263 +79,6 @@ L_NoMagic:
mesq l("Perhaps, in the city, someone knows rumors about Mana Stones and can teach you. Other than that, you're on your own.");
close;
-// progressbar("<color>", <seconds>)
-// Script will be canceled if character moves :D
-// So I probably could *try* to reuse TMW-BR Magic Tier 2 Scripts.
-L_Tier2:
- next;
- mesn;
- mesq l("Wha, your magic power increased! How?! Ah, nevermind. You are eligible to get tier 2!");
- next;
- mesn;
- mesq l("But whoa, not so fast! You must pass the seven steps of a trial first!");
- next;
- mesn;
- mesq l("The first trial is simple, I'm not doing anything in special. Bring me 1 @@, or 200 @@ and 20 @@.", getitemlink(DivineApple), getitemlink(SilkCocoon), getitemlink(ChocolateMouboo));
- next;
- switch(select(
- rif(countitem(DivineApple) >= 1, l("I got the apple.")),
- rif(countitem(SilkCocoon) >= 200 && countitem(ChocolateMouboo) >= 20, l("I got the silk and chocolate.")),
- l("I will apply later."))) {
-
- case 1:
- delitem DivineApple, 1;
- goto L_Tier2Ok;
- break;
- case 2:
- delitem SilkCocoon, 200;
- delitem ChocolateMouboo, 20;
- goto L_Tier2Ok;
- break;
- default:
- break;
- }
-
- close;
-
-L_Tier2Ok:
- // The last argument is duration: 0 - permanent 1- temporary. If omitted, defaults to 1.
- addtoskill(SM_BASH,2,0);
- getexp 10000, 0;
- ST_TIER=1;
- mes "";
- mesn;
- mesq l("Good, good. The skill you got earlier just raised a single level. I'll also impair some experience on you, no biggies.");
- next;
- mesn;
- mesq l("Now, the real challenge will start. You have a lot of raw power, but that doesn't gives you a lot of skills to learn.");
- next;
- mesn;
- mesq l("I can make a nice, simple potion for you. That will help the raw mana to settle on your body.");
- next;
- mesn;
- mesq l("However, beware! That potion is short-lived, you'll be running against time. Get ready to travel a lot.");
- next;
- if (nard_reputation() < 8) {
- mesn;
- mesq l("I advise you to do more quests on Tulimshar and Candor, otherwise, you might fail right at the end.");
- next;
- }
- mesn;
- mesq l("Come talk to me when you're ready, and we can begin.");
- close;
-
-L_T2_Fail:
- if (ST_TIER == 3) {
- if (countitem(SunnyCrystal) > 0) {
- delitem SunnyCrystal, 1;
- } else {
- mesn;
- mesc l("WARNING. YOU ARE CHEATING THE SUNNY CRYSTAL QUEST."), 1;
- next;
- mesn;
- mesc l("YOU WILL BE PENALIZED WITH 60% OF HEALTH."), 1;
- mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
- percentheal -60, -100;
- close;
- }
- }
-
- if (ST_TIER == 10) {
- if (countitem(JesusalvaGrimorium) > 0) {
- delitem JesusalvaGrimorium, 1;
- } else {
- mesn;
- mesc l("WARNING. YOU ARE CHEATING THE GRIMORIE QUEST."), 1;
- next;
- mesn;
- mesc l("YOU WILL BE PENALIZED WITH 70% OF HEALTH."), 1;
- mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
- percentheal -70, -100;
- close;
- }
- }
-
- mesc l(".:: Mission Failed ::."), 1;
- mesc l("You ran out of time."), 1;
- mes "";
- mes l("You should have gotten here @@.", FuzzyTime(QUEST_ELEVARTEMPO,0,2));
- ST_TIER=1;
- close;
-
-L_T2_S0:
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 1) goto L_T2_S1;
- if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T2_Fail;
-
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 2) goto L_T2_S2;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 3) goto L_T2_S3;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 4) goto L_T2_S4;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 5) goto L_T2_S5;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 6) goto L_T2_S6;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER <= 9) goto L_T2_S7;
- if (getskilllv(MAGIC_WARRIOR) == 1 && MAGIC_LVL >= 2 && ST_TIER == 10) goto L_T2_Final;
- mesc l("Error, error, L_T2_S0 General Error, REPORT ME");
- close;
-
-L_T2_S1:
- //MAGIC_WARRIOR l("Magic Warriors") WIZARD_MAGE
- mes "";
- mesn;
- mesq l("So, young disciple! I wish I could just chant some gibberish words and that automatically granted you more skills, but alas, that won't work.");
- next;
- if (nard_reputation() < 8) {
- mesn;
- mesc l("I advise you to do more quests on Tulimshar and Candor, otherwise, you will fail right at the end."), 1;
- next;
- }
- mesn;
- mesq l("I can, however, prepare you a potion. But beware, that potion will only last 35 minutes once baked.");
- next;
- mesn; // PiberriesInfusion
- mesq l("If it expires, you'll need to do another. To bake it I need 1 @@, 10 @@ and a @@. Have Mauve and Money, lots of it.", getitemlink(EverburnPowder), getitemlink(MaggotSlime), getitemlink(EmptyBottle));
- next;
- select
- rif(countitem(MaggotSlime) >= 10 && countitem(EverburnPowder) && countitem(EmptyBottle), l("I have everything.")),
- l("I'm not ready.");
-
- mes "";
- if (@menu == 2) {
- mesn;
- mesq l("Yes, as you see, the costs are high. Prepare yourself.");
- close;
- }
-
- delitem EmptyBottle, 1;
- delitem EverburnPowder, 1;
- delitem MaggotSlime, 10;
- ST_TIER=2;
- set QUEST_ELEVARTEMPO, gettimetick(2) + (60 * 35);
- getexp 400, 0;
- mesn;
- mesc l("The class master mix the powder with the slime inside the bottle, and makes some weird mixture.");
- next;
- mesn;
- mesc l("He pours something on it, you're not sure what. He then utters some magic words.");
- next;
- // Reset timer, this is the place where it should really happen.
- set QUEST_ELEVARTEMPO, gettimetick(2) + (60 * 35);
- mesn;
- mesq l("The potion is baked, you have thirty five minutes! Read as fast as you can, don't miss details!");
- next;
- mesn;
- mesq l("First thing is to get a @@. One from black market won't do, go to Halinarzo!", getitemlink(SunnyCrystal));
- next;
- mesn;
- mesq l("Speak with ##BBarzil##b. Tell him I need it, he'll give you one from my inventory. HURRY UP!");
- close;
-
-L_T2_S2:
- mesn;
- mesq l("Hurry up! Bring my @@ from Barzil in Halinarzo!! You only have @@ left!", getitemlink(SunnyCrystal), FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-L_T2_S3:
- if (countitem(SunnyCrystal) == 0) {
- mesn;
- mesq l("Where's the Sunny Crystal? Hurry up, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- }
- delitem SunnyCrystal, 1;
- ST_TIER=4;
- getexp 250, 0;
- mesn;
- mesq l("Good, you did it!");
- next;
- mesn;
- mesc l("*chants more words, while the crystal hovers the potion*");
- next;
-
-L_T2_S4:
- mesn;
- mesq l("I will need many Mauve Herbs! Do you have them with you? If you don't have enough, we'll lose everything! You need at most @@!", BaseLevel+40);
- select
- rif(countitem(MauveHerb), l("Yes, I have herbs. I assume the risks.")),
- l("No I don't have herbs. I'll be back.");
-
- if (@menu == 2)
- close;
-
- if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T2_Fail;
- .@req=rand(BaseLevel-20, BaseLevel+40);
- // Minimum is 40, max is unknown, defaults to 100
-
- mesn;
- mesq l("I need @@ Herbs!", .@req);
- //next; // If you comment this next, you'll allow players to logout and prevent penalty.
- mes "";
-
- if (countitem(MauveHerb) < .@req) goto L_T2_Fail;
- delitem MauveHerb, .@r;
- ST_TIER=5;
- getexp .@r*3, 0;
- //getitem MagicPotion, 1;
-
- mesc l("You quickly give him the herbs, and he skillfully mix them on a potion.");
- next;
- // You'll get a random amount of time, based on spent herbs
- // Usually, 10~73 sec, being 73 sec = 1m13s
- QUEST_ELEVARTEMPO=QUEST_ELEVARTEMPO+rand(10,.@r-27);
-
-L_T2_S5:
- mesn;
- mesq l("Good! Last step! West of Hurnscald, there is a magic fountain.");
- next;
- mesn;
- mesq l("Talk to the Fountain. Pour the potion on it. I advise you to put all your points on int if possible.");
- next;
- mesn;
- mesq l("Hurry up, you'll run out of time in @@!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-L_T2_S6:
- ST_TIER=7;
- mesn;
- mesq l("You did it! You're now on the last stage of this BORING and LONG quest!");
- next;
-
-L_T2_S7:
- mesn;
- mesq l("Jesusaves wrote a grimorie, with ancient secrets of our world.");
- next;
- mesn;
- mesq l("Captain Nard have it. Fetch it with him! Quick, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
- close;
-
-// You gain two skills: Provoke (works better, but limited usability) and the class skill
-L_T2_Final:
- skill(NV_TRICKDEAD,1,0);
- skill(SM_PROVOKE, 1, 0);
- addtoskill(MAGIC_WARRIOR,2,0);
- getexp 40000, 0; // Yes, 40k experience points. Waw.
- mesc l(".:: Congratulations! ::."), 2;
- mesc l("You advanced your tier!"), 2;
- next;
- mesn;
- mesq l("Keep the Grimorie with you. It's the proof you are now Tier 2. The book shall guide your advances!");
- next;
- mesn;
- mesq lg("Yes, courageous and worthy adventurer. You did well. I won't babysit you anymore. Embrace the new world opening before you!");
- close;
-
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
diff --git a/npc/003-0/mages.txt b/npc/003-0/mages.txt
deleted file mode 100644
index 4b057850a..000000000
--- a/npc/003-0/mages.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// (C) Jesusalva, 2018
-// TMW2 Script
-
-// Wizard
-// MG_COLDBOLT (ice)
-// MG_LIGHTNINGBOLT (wind)
-// WZ_EARTHSPIKE (earth)
-// MG_NAPALMBEAT (ghost)
-// MG_ENERGYCOAT (For 5 minutes, raise damage reduction, but that eats MP)
-// TODO: We have many other cool skills for Wizard (more AoE skills, more damage, etc)
-// I will worry with that later, as that also means providing extra skills for Sage & Priest
-
-// Sage
-// SA_FREECAST (allows to move/attack while casting)
-// SA_DRAGONOLOGY (+4% ATK, +2% MATK, +1 INT and +4% resist against DRAGONS)
-// TMW2_SAGE (grants up to 1.5 extra mana exp point/level)
-// SA_FLAMELAUNCHER (bestow fire element on weapon for 2m, 70% cth)
-// SA_FROSTWEAPON (bestow water element on weapon for 2m, 70% cth)
-// SA_LIGHTNINGLOADER (bestow wind element on weapon for 2m, 70% cth)
-// SA_SEISMICWEAPON (bestow earth element on weapon for 2m, 70% cth)
-
-// Priest
-// Broken //AL_PNEUMA (BLOCKS ranged (4+ tiles) physical attacks on a 3x3 area. No bows :D)
-// AL_HOLYLIGHT (standard holy magic attack - 125% of MATK)
-// MG_SRECOVERY (small increase to SP Recovery while idle each 10 sec.)
-// ALL_RESURRECTION (Revive at 10% HP. May insta-kill undead.)
-// PR_ASPERSIO (Change anyone weapon to holy for 60s. Or 40 defense-disregard holy dmg to undead/evil)
-// TF_DETOXIFY (cancels poison. 40% MP.)
-
-
-// New skills for storyline:
-// Health Conversion (Skill ID# 373, iRO Name: Indulge)
-// Converts 10% of your HP into SP. The higher the skill level the more effective the conversion will be. The conversion rate is 10:1 modified by SkillLV, so a 2000 HP Professor with Health Conversion LV 3 would consume 2000*10%=200 HP and obtain a total of 200*30%=60 SP.
-
-
-// Meditatio (Skill ID# 363)
-// When meditating (sitting), you will have a better SP Recovery as well as increase your Maximum SP. This skill also improves the amount of HP that are healed by the Heal skill by 2% per SkillLV (sitting is of course not required).
-// 1 Maximum SP +1%, SP Rec +3%, +2% Heal
-// 2 Maximum SP +2%, SP Rec +6%, +4% Heal
-// 3 Maximum SP +3%, SP Rec +9%, +6% Heal
-// 10 Maximum SP +10%, SP Rec +30%, +20% Heal
-
diff --git a/npc/003-0/paladin.txt b/npc/003-0/paladin.txt
deleted file mode 100644
index 224fd5bdf..000000000
--- a/npc/003-0/paladin.txt
+++ /dev/null
@@ -1,224 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the PALADIN class
-
-003-0,34,37,0 script Paladin Master NPC_PLAYER,{
- /*
- if (!is_staff())
- goto L_Close;
- */
- if (!(MAGIC_SUBCLASS & CL_PALADIN))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(MAGIC_WARRIOR) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Paladin Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- mesc b(l("Warning: This class haven't been tested/balanced yet. Feedback is required!")), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_PALADIN;
- mesn;
- mesq l("Welcome to the paladin guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Paladin
-// CR_TRUST (raise Max HP in 200 and Holy Resistance in 5%, passive)
-// AL_ANGELUS (DEF Increase 5% for 15s/LVL, 14x14 area for PARTY)
-// PR_REDEMPTIO (suicide with death penalty. Revive dead party members on a 29x29 area. Min. 1% xp. 0.01% xp penalty reduction per revive)
-// MER_INCAGI (raise agi and move speed for 20s/LVL. Have an HP cost.)
-// SM_BASH up to level 4 (+220% dmg and +20% acc). PS. If you have MP, SM_BASH is very powerful.
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(SM_BASH) && getskilllv(SM_BASH) < (3+degree_subclass()/2), l("Improve Bash Skill")),
- rif(sk_intcost(AL_ANGELUS) && sk_canlvup(AL_ANGELUS), l("Improve Party Area Defense")),
- "","",
- //rif(sk_intcost(MER_INCAGI) && sk_canlvup(MER_INCAGI), l("Improve Increase Agility")),
- //rif(sk_intcost(PR_REDEMPTIO) && !getskilllv(PR_REDEMPTIO), l("Learn Redemption")),
- rif(sk_intcost(CR_TRUST) && !getskilllv(CR_TRUST), l("Learn Last Standing Man")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Bash]");
- mesc l("Blow with increased attack and precision.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(ManaPiouFeathers), (getskilllv(SM_BASH)+1)*15, getitemlink(ManaPiouFeathers));
- mesc l("@@/@@ @@", countitem(CaveSnakeSkin), (getskilllv(SM_BASH)+1)*4, getitemlink(CaveSnakeSkin));
- mesc l("@@/@@ @@", countitem(RubyPowder), (getskilllv(SM_BASH)+1)*2, getitemlink(RubyPowder));
- mesc l("@@/@@ @@", countitem(StrengthPotion), (getskilllv(SM_BASH)+1)*2, getitemlink(StrengthPotion));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(ManaPiouFeathers) < (getskilllv(SM_BASH)+1)*15 ||
- countitem(CaveSnakeSkin) < (getskilllv(SM_BASH)+1)*4 ||
- countitem(RubyPowder) < (getskilllv(SM_BASH)+1)*2 ||
- countitem(StrengthPotion) < (getskilllv(SM_BASH)+1)*2) goto L_Missing;
-
- delitem PiberriesInfusion, (getskilllv(SM_BASH)+1)*15;
- delitem CaveSnakeSkin, (getskilllv(SM_BASH)+1)*4;
- delitem RubyPowder, (getskilllv(SM_BASH)+1)*2;
- delitem StrengthPotion, (getskilllv(SM_BASH)+1)*2;
-
- sk_lvup(SM_BASH);
-
- next;
- }
- break;
- case 2:
- mesc l("[Party Area Defense]");
- mesc l("Raises defense of the whole party in 5% for a while.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(AL_ANGELUS)+1)*10, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(BlackMambaEgg), (getskilllv(AL_ANGELUS)+1)*2, getitemlink(BlackMambaEgg));
- mesc l("@@/@@ @@", countitem(MoubooSteak), (getskilllv(AL_ANGELUS)+1)*4, getitemlink(MoubooSteak));
- mesc l("@@/@@ @@", countitem(IronIngot), (getskilllv(AL_ANGELUS)+1)*1, getitemlink(IronIngot));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(PiberriesInfusion) < (getskilllv(AL_ANGELUS)+1)*10 ||
- countitem(BlackMambaEgg) < (getskilllv(AL_ANGELUS)+1)*2 ||
- countitem(MoubooSteak) < (getskilllv(AL_ANGELUS)+1)*4 ||
- countitem(IronIngot) < (getskilllv(AL_ANGELUS)+1)*1) goto L_Missing;
-
- delitem PiberriesInfusion, (getskilllv(AL_ANGELUS)+1)*10;
- delitem BlackMambaEgg, (getskilllv(AL_ANGELUS)+1)*2;
- delitem MoubooSteak, (getskilllv(AL_ANGELUS)+1)*4;
- delitem IronIngot, (getskilllv(AL_ANGELUS)+1)*1;
-
- sk_lvup(AL_ANGELUS);
-
- next;
- }
- break;
- case 3:
- mesc l("[Increase Agility]");
- mesc l("Temporaly raise your agility and move speed, in exchange of HP.");
- mes "";
- // TODO: Requirem, quest, agree
- sk_lvup(MER_INCAGI);
- break;
- case 4:
- mesc l("[Redemption]");
- mesc l("Kills yourself, but revives everyone in a range. You'll take the death penalty.");
- mes "";
- // TODO: Requirem, quest, agree
- sk_lvup(PR_REDEMPTIO);
- break;
- case 5:
- mesc l("[Last Standing Man]");
- mesc l("Raises max HP and holy resistance. Passive.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Cheese), (getskilllv(CR_TRUST)+1)*50, getitemlink(Cheese));
- mesc l("@@/@@ @@", countitem(Coral), (getskilllv(CR_TRUST)+1)*30, getitemlink(Coral));
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(CR_TRUST)+1)*20, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(CR_TRUST)+1)*15, getitemlink(FluoPowder));
- mesc l("@@/@@ @@", countitem(HastePotion), (getskilllv(CR_TRUST)+1)*10, getitemlink(HastePotion));
- mesc l("@@/@@ @@", countitem(DiamondPowder), (getskilllv(CR_TRUST)+1)*3, getitemlink(DiamondPowder));
- mesc l("@@/@@ @@", countitem(GrassCarp), (getskilllv(CR_TRUST)+1)*1, getitemlink(GrassCarp));
- mesc l("@@/@@ @@", countitem(ElixirOfLife), (getskilllv(CR_TRUST)+1)*1, getitemlink(ElixirOfLife));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Cheese) < (getskilllv(CR_TRUST)+1)*50 ||
- countitem(Coral) < (getskilllv(CR_TRUST)+1)*30 ||
- countitem(PiberriesInfusion) < (getskilllv(CR_TRUST)+1)*20 ||
- countitem(FluoPowder) < (getskilllv(CR_TRUST)+1)*15 ||
- countitem(HastePotion) < (getskilllv(CR_TRUST)+1)*10 ||
- countitem(DiamondPowder) < (getskilllv(CR_TRUST)+1)*3 ||
- countitem(GrassCarp) < (getskilllv(CR_TRUST)+1)*1 ||
- countitem(ElixirOfLife) < (getskilllv(CR_TRUST)+1)*1) goto L_Missing;
-
- delitem Cheese, (getskilllv(CR_TRUST)+1)*50;
- delitem Coral, (getskilllv(CR_TRUST)+1)*30;
- delitem PiberriesInfusion, (getskilllv(CR_TRUST)+1)*20;
- delitem FluoPowder, (getskilllv(CR_TRUST)+1)*15;
- delitem HastePotion, (getskilllv(CR_TRUST)+1)*10;
- delitem DiamondPowder, (getskilllv(CR_TRUST)+1)*3;
- delitem GrassCarp, (getskilllv(CR_TRUST)+1)*1;
- delitem ElixirOfLife, (getskilllv(CR_TRUST)+1)*1;
-
- sk_lvup(CR_TRUST);
-
- next;
- }
- break;
- case 6:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill CR_TRUST, 0, 0;
- skill AL_ANGELUS, 0, 0;
- skill PR_REDEMPTIO, 0, 0;
- skill MER_INCAGI, 0, 0;
- skill SM_BASH, 2, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_PALADIN;
- mesc l("You abandoned the PALADIN class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- setunitdata(.@npcId, UDT_HEADTOP, WarlordHelmet);
- setunitdata(.@npcId, UDT_HEADMIDDLE, GoldenWarlordPlate);
- setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
- setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-0/priest.txt b/npc/003-0/priest.txt
deleted file mode 100644
index 958c9d710..000000000
--- a/npc/003-0/priest.txt
+++ /dev/null
@@ -1,279 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the PRIEST class
-
-003-0,58,30,0 script Priest Master NPC_PLAYER,{
- /*
- if (!is_staff())
- goto L_Close;
- */
- if (!(MAGIC_SUBCLASS & CL_PRIEST))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(WIZARD_MAGE) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Priest Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- mesc b(l("Warning: This class haven't been tested/balanced yet. Feedback is required!")), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_PRIEST;
- mesn;
- mesq l("Welcome to the Priest guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Priest
-// AL_HOLYLIGHT (standard holy magic attack - 125% of MATK)
-// MG_SRECOVERY (small increase to SP Recovery while idle each 10 sec.)
-// ALL_RESURRECTION (Revive at 10% HP. May insta-kill undead. Max Level 3~4)
-// PR_ASPERSIO (Change anyone weapon to holy for 60s. Or 40 defense-disregard holy dmg to undead/evil)
-// TF_DETOXIFY (cancels poison. 40% MP.)
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(AL_HOLYLIGHT) && !getskilllv(AL_HOLYLIGHT), l("Learn Holy Light")),
- rif(sk_intcost(TF_DETOXIFY) && !getskilllv(TF_DETOXIFY), l("Learn Detoxify")),
- rif(sk_intcost(ALL_RESURRECTION) && getskilllv(ALL_RESURRECTION) < (1+degree_subclass()/2), l("Learn Ressurection")),
- rif(sk_intcost(MG_SRECOVERY) && sk_canlvup(MG_SRECOVERY), l("Improve Mana Recovery")),
- rif(sk_intcost(PR_ASPERSIO) && sk_canlvup(PR_ASPERSIO), l("Improve Blessed Weapon")),
- rif(sk_intcost(AB_HIGHNESSHEAL) && sk_canlvup(AB_HIGHNESSHEAL), l("Improve Luma")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Holy Light]");
- mesc l("The basic magic attack from a Priest. No effect against Holy Monsters.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(MoubooFigurine), (getskilllv(AL_HOLYLIGHT)+1)*3, getitemlink(MoubooFigurine));
- mesc l("@@/@@ @@", countitem(GemPowder), (getskilllv(AL_HOLYLIGHT)+1)*1, getitemlink(GemPowder));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(MoubooFigurine) < (getskilllv(AL_HOLYLIGHT)+1)*3 ||
- countitem(GemPowder) < (getskilllv(AL_HOLYLIGHT)+1)*1) goto L_Missing;
-
- delitem MoubooFigurine, (getskilllv(AL_HOLYLIGHT)+1)*3;
- delitem GemPowder, (getskilllv(AL_HOLYLIGHT)+1)*1;
-
- sk_lvup(AL_HOLYLIGHT);
-
- next;
- }
- break;
- case 2:
- mesc l("[Detoxify]");
- mesc l("Cancels Poison. Antidotes are hard to come by, anyway.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Candy), (getskilllv(TF_DETOXIFY)+1)*70, getitemlink(Candy));
- mesc l("@@/@@ @@", countitem(Root), (getskilllv(TF_DETOXIFY)+1)*10, getitemlink(Root));
- mesc l("@@/@@ @@", countitem(Mashmallow), (getskilllv(TF_DETOXIFY)+1)*2, getitemlink(Mashmallow));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(TF_DETOXIFY)+1)*1, getitemlink(FluoPowder));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Candy) < (getskilllv(TF_DETOXIFY)+1)*70 ||
- countitem(Root) < (getskilllv(TF_DETOXIFY)+1)*10 ||
- countitem(Mashmallow) < (getskilllv(TF_DETOXIFY)+1)*2 ||
- countitem(FluoPowder) < (getskilllv(TF_DETOXIFY)+1)*1) goto L_Missing;
-
- delitem Candy, (getskilllv(TF_DETOXIFY)+1)*70;
- delitem Root, (getskilllv(TF_DETOXIFY)+1)*10;
- delitem Mashmallow, (getskilllv(TF_DETOXIFY)+1)*2;
- delitem FluoPowder, (getskilllv(TF_DETOXIFY)+1)*1;
-
- sk_lvup(TF_DETOXIFY);
-
- next;
- }
- break;
- case 3:
- mesc l("[Ressurection]");
- mesc l("Raise fallen party members so they can keep fighting.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Acorn), (getskilllv(ALL_RESURRECTION)+1)*60, getitemlink(Acorn));
- mesc l("@@/@@ @@", countitem(Bread), (getskilllv(ALL_RESURRECTION)+1)*20, getitemlink(Bread));
- mesc l("@@/@@ @@", countitem(SmallMushroom), (getskilllv(ALL_RESURRECTION)+1)*20, getitemlink(SmallMushroom));
- mesc l("@@/@@ @@", countitem(PinkBlobime), (getskilllv(ALL_RESURRECTION)+1)*15, getitemlink(PinkBlobime));
- mesc l("@@/@@ @@", countitem(Pearl), (getskilllv(ALL_RESURRECTION)+1)*2, getitemlink(Pearl));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Acorn) < (getskilllv(ALL_RESURRECTION)+1)*60 ||
- countitem(Bread) < (getskilllv(ALL_RESURRECTION)+1)*20 ||
- countitem(SmallMushroom) < (getskilllv(ALL_RESURRECTION)+1)*15 ||
- countitem(PinkBlobime) < (getskilllv(ALL_RESURRECTION)+1)*20 ||
- countitem(Pearl) < (getskilllv(ALL_RESURRECTION)+1)*2) goto L_Missing;
-
- delitem Acorn, (getskilllv(ALL_RESURRECTION)+1)*60;
- delitem Bread, (getskilllv(ALL_RESURRECTION)+1)*20;
- delitem SmallMushroom, (getskilllv(ALL_RESURRECTION)+1)*20;
- delitem PinkBlobime, (getskilllv(ALL_RESURRECTION)+1)*15;
- delitem Pearl, (getskilllv(ALL_RESURRECTION)+1)*2;
-
- sk_lvup(ALL_RESURRECTION);
-
- next;
- }
- break;
- case 4:
- mesc l("[MP Regen]");
- mesc l("Heals more mana while standing.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Acorn), (getskilllv(MG_SRECOVERY)+1)*70, getitemlink(Acorn));
- mesc l("@@/@@ @@", countitem(Root), (getskilllv(MG_SRECOVERY)+1)*10, getitemlink(Root));
- mesc l("@@/@@ @@", countitem(FrozenYetiTear),(getskilllv(MG_SRECOVERY)+1)*2, getitemlink(FrozenYetiTear));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(MG_SRECOVERY)+1)*1, getitemlink(FluoPowder));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Acorn) < (getskilllv(MG_SRECOVERY)+1)*70 ||
- countitem(Root) < (getskilllv(MG_SRECOVERY)+1)*10 ||
- countitem(FrozenYetiTear) < (getskilllv(MG_SRECOVERY)+1)*2 ||
- countitem(FluoPowder) < (getskilllv(MG_SRECOVERY)+1)*1) goto L_Missing;
-
- delitem Acorn, (getskilllv(MG_SRECOVERY)+1)*70;
- delitem Root, (getskilllv(MG_SRECOVERY)+1)*10;
- delitem FrozenYetiTear, (getskilllv(MG_SRECOVERY)+1)*2;
- delitem FluoPowder, (getskilllv(MG_SRECOVERY)+1)*1;
-
- sk_lvup(MG_SRECOVERY);
-
- next;
- }
- break;
- case 5:
- mesc l("[Bless Weapon]");
- mesc l("Changes anyone's weapon to Holy elemental. Causes small damage when used on offensive.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Acorn), (getskilllv(PR_ASPERSIO)+1)*70, getitemlink(Acorn));
- mesc l("@@/@@ @@", countitem(Root), (getskilllv(PR_ASPERSIO)+1)*10, getitemlink(Root));
- mesc l("@@/@@ @@", countitem(FrozenYetiTear),(getskilllv(PR_ASPERSIO)+1)*2, getitemlink(FrozenYetiTear));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(PR_ASPERSIO)+1)*1, getitemlink(FluoPowder));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Acorn) < (getskilllv(PR_ASPERSIO)+1)*70 ||
- countitem(Root) < (getskilllv(PR_ASPERSIO)+1)*10 ||
- countitem(FrozenYetiTear) < (getskilllv(PR_ASPERSIO)+1)*2 ||
- countitem(FluoPowder) < (getskilllv(PR_ASPERSIO)+1)*1) goto L_Missing;
-
- delitem Acorn, (getskilllv(PR_ASPERSIO)+1)*70;
- delitem Root, (getskilllv(PR_ASPERSIO)+1)*10;
- delitem FrozenYetiTear, (getskilllv(PR_ASPERSIO)+1)*2;
- delitem FluoPowder, (getskilllv(PR_ASPERSIO)+1)*1;
-
- sk_lvup(PR_ASPERSIO);
-
- next;
- }
- break;
- case 6:
- mesc l("[Luma]");
- mesc l("More powerful version of healing. Requires @@ each cast.", getitemlink(Lifestone));
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Lifestone), (getskilllv(AB_HIGHNESSHEAL)+1)*70, getitemlink(Lifestone));
- mesc l("@@/@@ @@", countitem(Root), (getskilllv(AB_HIGHNESSHEAL)+1)*10, getitemlink(Root));
- mesc l("@@/@@ @@", countitem(FrozenYetiTear),(getskilllv(AB_HIGHNESSHEAL)+1)*2, getitemlink(FrozenYetiTear));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(AB_HIGHNESSHEAL)+1)*1, getitemlink(FluoPowder));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Lifestone) < (getskilllv(AB_HIGHNESSHEAL)+1)*70 ||
- countitem(Root) < (getskilllv(AB_HIGHNESSHEAL)+1)*10 ||
- countitem(FrozenYetiTear) < (getskilllv(AB_HIGHNESSHEAL)+1)*2 ||
- countitem(FluoPowder) < (getskilllv(AB_HIGHNESSHEAL)+1)*1) goto L_Missing;
-
- delitem Lifestone, (getskilllv(AB_HIGHNESSHEAL)+1)*70;
- delitem Root, (getskilllv(AB_HIGHNESSHEAL)+1)*10;
- delitem FrozenYetiTear, (getskilllv(AB_HIGHNESSHEAL)+1)*2;
- delitem FluoPowder, (getskilllv(AB_HIGHNESSHEAL)+1)*1;
-
- sk_lvup(AB_HIGHNESSHEAL);
-
- next;
- }
- break;
- case 7:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill AL_HOLYLIGHT, 0, 0;
- skill TF_DETOXIFY, 0, 0;
- skill ALL_RESURRECTION, 0, 0;
- skill MG_SRECOVERY, 0, 0;
- skill PR_ASPERSIO, 0, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_PRIEST;
- mesc l("You abandoned the PRIEST class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- //setunitdata(.@npcId, UDT_HEADTOP, WarlordHelmet); // TODO: wizard hat
- setunitdata(.@npcId, UDT_HEADMIDDLE, SorcererRobe);
- setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
- setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-0/recepcionist.txt b/npc/003-0/recepcionist.txt
index 8476af6db..3cb3e89de 100644
--- a/npc/003-0/recepcionist.txt
+++ b/npc/003-0/recepcionist.txt
@@ -5,6 +5,8 @@
// Magic School recepcionist
003-0,47,44,4 script Recepcionist#003-0 NPC_FEMALE,{
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER >= 1) goto L_T3_S0;
+
mesn;
mesq l("Hello, and welcome to the Magic School of Tulimshar.");
next;
@@ -13,17 +15,327 @@
next;
mesn;
mesq l("I hope our new campus get built soon. It'll be much better than here.");
+ if (!MAGIC_LVL)
+ close;
+ next;
+ switch (getskilllv(TMW2_SKILLPERMIT)) {
+ case 0:
+ if (MAGIC_LVL >= 1)
+ goto L_Tier1;
+ break;
+ case 1:
+ if (MAGIC_LVL >= 2)
+ goto L_Tier2;
+ break;
+ case 2:
+ if (MAGIC_LVL >= 3)
+ goto L_Tier3;
+ break;
+ }
+ closeclientdialog;
+ goodbye;
+ close;
+
+////////////////
+/* First Tier */
+////////////////
+L_Tier1:
+ mesn;
+ mesq l("Also, I see you're a newly registered mage. Am I right?");
+ next;
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Alright. I wish you good luck in your studies.");
+ close;
+ }
+ mesn;
+ mesq l("Good. Did you knew you could register to the Special Class, in order to get an extra skill point?");
+ next;
+ mesn;
+ mesq l("We only require a small fee of 1 @@, or 40 @@, or 500 @@ if you are poor adventurer.", getitemlink(DivineApple), getitemlink(SnakeEgg), getitemlink(MaggotSlime));
+ next;
+ switch(select(
+ rif(countitem(DivineApple) >= 1, l("I got the apple.")),
+ rif(countitem(SnakeEgg) >= 40, l("I got the eggs.")),
+ rif(countitem(MaggotSlime) >= 500, l("I got the maggots slimes.")),
+ l("I will apply later."))) {
+
+ case 1:
+ delitem DivineApple, 1;
+ getexp $MANA_BLVL*100, $MANA_JLVL*10;
+ break;
+ case 2:
+ delitem SnakeEgg, 40;
+ getexp $MANA_BLVL*100, $MANA_JLVL*10;
+ break;
+ case 3:
+ delitem MaggotSlime, 500;
+ break;
+ default:
+ close;
+ break;
+ }
+ skill TMW2_SKILLPERMIT, 1, 0;
+ mes "";
+ mesn;
+ mesq l("Many thanks, your help has been invaluable. You now have an extra point, use it wisely.");
+ close;
+
+/////////////////
+/* Second Tier */
+/////////////////
+L_Tier2:
+ mesn;
+ mesq l("Maybe you're interested in the Special Class again? An extra magic skill point for a lot of items, what do ya say?");
+ next;
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Alright. I wish you good luck in your studies.");
+ close;
+ }
+ mesn;
+ mesq l("Great news! Then please bring me 1 @@, or 200 @@ and 20 @@.", getitemlink(DivineApple), getitemlink(SilkCocoon), getitemlink(ChocolateMouboo));
+ next;
+ switch(select(
+ rif(countitem(DivineApple) >= 1, l("I got the apple.")),
+ rif(countitem(SilkCocoon) >= 200 && countitem(ChocolateMouboo) >= 20, l("I got the silk and chocolate.")),
+ l("I will apply later."))) {
+
+ case 1:
+ delitem DivineApple, 1;
+ break;
+ case 2:
+ delitem SilkCocoon, 200;
+ delitem ChocolateMouboo, 20;
+ break;
+ default:
+ close;
+ break;
+ }
+ skill TMW2_SKILLPERMIT, 2, 0;
+ getexp 10000, 0;
+ mes "";
+ mesn;
+ mes l("Many thanks, and once again, your help has been invaluable.");
+ mes l("You now have an extra point, use it wisely.");
+ close;
+
+/////////////////
+/* Third Tier */
+/////////////////
+L_Tier3:
+ ST_TIER=1;
+ mesn;
+ mesq l("Maybe you're interested in the Special Class again? An extra magic skill point, but this time in a dangerous journey, what do ya say?");
+ next;
+ if (nard_reputation() < 8) {
+ mesn;
+ mesc l("I advise you to do more quests on Tulimshar and Candor, otherwise, you will fail right at the end."), 1;
+ next;
+ }
+ if (askyesno() == ASK_NO) {
+ mesn;
+ mesq l("Alright. I wish you good luck in your studies.");
+ close;
+ }
+ mesn;
+ mesq l("I will prepare you a potion. But beware, that potion will only last 20 minutes. You should assign some intelligence points to succeed.");
+ next;
+ mesn;
+ mes l("If it expires, you'll need to do another. To bake it I need 1 @@, 10 @@ and an @@.", getitemlink(EverburnPowder), getitemlink(MaggotSlime), getitemlink(EmptyBottle));
+ mesc l("Have Maggot Slimes, Bug Legs, Mauve Herbs and Money, lots of them."), 1;
+ next;
+ select
+ rif(countitem(MaggotSlime) >= 10 && countitem(EverburnPowder) && countitem(EmptyBottle), l("I have everything.")),
+ l("I'm not ready.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Yes, as you see, the costs are high. Prepare yourself.");
+ close;
+ }
+
+ delitem EmptyBottle, 1;
+ delitem EverburnPowder, 1;
+ delitem MaggotSlime, 10;
+ ST_TIER=2;
+ QUEST_ELEVARTEMPO=gettimetick(2) + (60 * 20);
+ getexp 400, 0;
+ mesn;
+ mesc l("She mix the powder with the slime inside the bottle, and makes some weird mixture.");
+ next;
+ mesn;
+ mesc l("She pours something on it, you're not sure what. And then utters some magic words.");
+ next;
+ // Reset timer, this is the place where it should really happen.
+ QUEST_ELEVARTEMPO=gettimetick(2) + (60 * 20);
+ mesn;
+ mesq l("The potion is baked, and the time is now running! Read as fast as you can, don't miss details!");
+ next;
+ mesn;
+ mesq l("First thing is to get a @@. One from black market won't do, go to Halinarzo!", getitemlink(SunnyCrystal));
+ next;
+ mesn;
+ mesq l("Speak with ##BBarzil##b. Tell him it is for the Magic Academy. HURRY UP!");
+ close;
+
+// Logic handler
+L_T3_S0:
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 1) goto L_Tier3;
+ if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T3_Fail;
+
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 2) goto L_T3_S2;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 3) goto L_T3_S3;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 4) goto L_T3_S4;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 5) goto L_T3_S5;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 6) goto L_T3_S6;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER <= 9) goto L_T3_S7;
+ if (getskilllv(TMW2_SKILLPERMIT) == 2 && MAGIC_LVL >= 3 && ST_TIER == 10) goto L_T3_Final;
+ mesc l("Error, error, L_T3_S0 General Error, REPORT ME");
+ close;
+
+L_T3_S2:
+ mesn;
+ mesq l("Hurry up! Bring a @@ from Barzil in Halinarzo!! You only have @@ left!", getitemlink(SunnyCrystal), FuzzyTime(QUEST_ELEVARTEMPO,2,2));
+ close;
+
+L_T3_S3:
+ if (countitem(SunnyCrystal) == 0) {
+ mesn;
+ mesq l("Where's the Sunny Crystal? Hurry up, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
+ }
+ delitem SunnyCrystal, 1;
+ ST_TIER=4;
+ getexp 250, 0;
+ mesn;
+ mesq l("Good, you did it!");
+ next;
+ mesn;
+ mesc l("*chants more words, while the crystal hovers the potion*");
+ next;
+
+L_T3_S4:
+ mesn;
+ mesq l("I will need many Mauve Herbs! Do you have them with you? If you don't have enough, we'll lose everything! You need at most @@!", BaseLevel+40);
+ select
+ rif(countitem(MauveHerb), l("Yes, I have herbs. I assume the risks.")),
+ l("No I don't have herbs. I'll be back.");
+
+ if (@menu == 2)
+ close;
+
+ if (gettimetick(2) > QUEST_ELEVARTEMPO) goto L_T3_Fail;
+ .@req=rand2(BaseLevel-20, BaseLevel+40);
+ // Minimum is 40, max is unknown, defaults to 100
+
+ mesn;
+ mesq l("I need @@ Herbs!", .@req);
+ //next; // If you comment this next, you'll allow players to logout and prevent penalty.
+ mes "";
+
+ if (countitem(MauveHerb) < .@req) goto L_T3_Fail;
+ delitem MauveHerb, .@r;
+ ST_TIER=5;
+ getexp .@r*3, 0;
+ //getitem MagicPotion, 1;
+
+ mesc l("You quickly give her the herbs, and she skillfully mix them on a potion.");
+ next;
+ // You'll get a random amount of time, based on spent herbs
+ // Usually, 10~73 sec, being 73 sec = 1m13s
+ QUEST_ELEVARTEMPO=QUEST_ELEVARTEMPO+rand2(10,.@r-27);
+
+L_T3_S5:
+ mesn;
+ mesq l("Good! Last step! West of Hurnscald, there is a magic fountain.");
+ next;
+ mesn;
+ mesq l("Talk to the Fountain. Pour the potion on it. I advise you to put all your points on int if possible.");
+ next;
+ mesn;
+ mesq l("Hurry up, you'll run out of time in @@!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
+ close;
+
+L_T3_S6:
+ ST_TIER=7;
+ mesn;
+ mesq l("You did it! You're now on the last stage of this BORING and LONG quest!");
+ next;
+
+L_T3_S7:
+ mesn;
+ mesq l("Jesusaves wrote a grimorie, with ancient secrets of our world.");
+ next;
+ mesn;
+ mesq l("Captain Nard have it. Fetch it with him! Quick, you only have @@ left!", FuzzyTime(QUEST_ELEVARTEMPO,2,2));
+ close;
+
+L_T3_Final:
+ skill TMW2_SKILLPERMIT, 3, 0;
+ getexp 40000, 0; // Yes, 40k experience points. Waw.
+ mesc l(".:: Congratulations! ::."), 2;
+ mesc l("You have completed the Jesusaves Grimorium Quest!"), 2;
+ next;
+ mesn;
+ mesq l("Keep the Grimorie with you. It's a rare book which holds data from all others. The book shall guide your advances!");
+ next;
+ mesn;
+ mesq lg("Yes, courageous and worthy adventurer. You did well!");
+ next;
+ mesn;
+ mesc l("*sigh*");
+ mesq l("Now I can turn in my report to Professor Volrtaw... I should not have stayed behind the classes.");
+ close;
+
+/// Fail handlers
+L_T3_Fail:
+ if (ST_TIER == 3) {
+ if (countitem(SunnyCrystal) > 0) {
+ delitem SunnyCrystal, 1;
+ } else {
+ mesn;
+ mesc l("WARNING. YOU ARE CHEATING THE SUNNY CRYSTAL QUEST."), 1;
+ next;
+ mesn;
+ mesc l("YOU WILL BE PENALIZED WITH 60% OF HEALTH."), 1;
+ mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
+ percentheal -60, -100;
+ close;
+ }
+ }
+
+ if (ST_TIER == 10) {
+ if (countitem(JesusalvaGrimorium) > 0) {
+ delitem JesusalvaGrimorium, 1;
+ } else {
+ mesn;
+ mesc l("WARNING. YOU ARE CHEATING THE GRIMORIE QUEST."), 1;
+ next;
+ mesn;
+ mesc l("YOU WILL BE PENALIZED WITH 70% OF HEALTH."), 1;
+ mesc l("IF YOU DIE, YOU'LL SUFFER THE EXP PENALTY."), 1;
+ percentheal -70, -100;
+ close;
+ }
+ }
+
+ mesc l(".:: Mission Failed ::."), 1;
+ mesc l("You ran out of time."), 1;
+ mes "";
+ mes l("You should have gotten here @@.", FuzzyTime(QUEST_ELEVARTEMPO,0,2));
+ ST_TIER=1;
close;
+/// Core code
OnTimer1000:
domovestep;
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, FancyHat);
- setunitdata(.@npcId, UDT_HEADMIDDLE, CreasedShirt);
+ setunitdata(.@npcId, UDT_HEADMIDDLE, SorcererRobe);
//setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
- setunitdata(.@npcId, UDT_WEAPON, JeansShorts);
+ //setunitdata(.@npcId, UDT_WEAPON, JeansShorts);
setunitdata(.@npcId, UDT_HAIRSTYLE, any(8,11,20));
setunitdata(.@npcId, UDT_HAIRCOLOR, 5);
@@ -31,7 +343,7 @@ OnInit:
initpath "move", 47, 44,
"dir", UP, 0,
"wait", 7, 0,
- "move", 48, 45,
+ "move", 48, 46,
"dir", DOWN, 0,
"wait", 7, 0,
"move", 49, 44,
diff --git a/npc/003-0/sage.txt b/npc/003-0/sage.txt
deleted file mode 100644
index 9df6a2dec..000000000
--- a/npc/003-0/sage.txt
+++ /dev/null
@@ -1,188 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the SAGE class
-
-003-0,61,25,0 script Sage Master NPC_PLAYER,{
- /*
- if (!is_staff())
- goto L_Close;
- */
- if (!(MAGIC_SUBCLASS & CL_SAGE))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(WIZARD_MAGE) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Sage Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- mesc b(l("Warning: This class haven't been tested/balanced yet. Feedback is required!")), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_SAGE;
- mesn;
- mesq l("Welcome to the sage guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Sage
-// CR_TRUST (raise Max HP in 200 and Holy Resistance in 5%, passive)
-// AL_ANGELUS (DEF Increase 5% for 15s/LVL, 14x14 area for PARTY)
-// PR_REDEMPTIO (suicide with death penalty. Revive dead party members on a 29x29 area. Min. 1% xp. 0.01% xp penalty reduction per revive)
-// MER_INCAGI (raise agi and move speed for 20s/LVL. Have an HP cost.)
-// SM_BASH up to level 4 (+220% dmg and +20% acc). PS. If you have MP, SM_BASH is very powerful.
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(SA_FREECAST) && getskilllv(SA_FREECAST) < (1+degree_subclass()/2), l("Learn Action Casting")),
- rif(sk_intcost(SA_DRAGONOLOGY) && getskilllv(SA_DRAGONOLOGY) < (1+degree_subclass()/2), l("Learn Dragon Slayer")),
- rif(sk_intcost(TMW2_SAGE) && sk_canlvup(TMW2_SAGE), l("Improve Mana Wisdom")),
- rif(sk_intcost(SA_FLAMELAUNCHER) && sk_canlvup(SA_FLAMELAUNCHER), l("Improve Fire Weapon")),
- rif(sk_intcost(SA_FROSTWEAPON) && sk_canlvup(SA_FROSTWEAPON), l("Improve Ice Weapon")),
- rif(sk_intcost(SA_LIGHTNINGLOADER) && sk_canlvup(SA_LIGHTNINGLOADER), l("Improve Wind Weapon")),
- rif(sk_intcost(SA_SEISMICWEAPON) && sk_canlvup(SA_SEISMICWEAPON), l("Improve Earth Weapon")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Action Casting]");
- mesc l("Allows to move/attack while casting. (Melee attacks still interrupt casting!)");
- mes "";
- mesn;
- if (!mlearn(SA_FREECAST,
- Tentacles, 10,
- MushroomSpores, 5,
- WolvernTooth, 3,
- RedScorpionClaw, 1))
- goto L_Missing;
- break;
- case 2:
- mesc l("[Dragon Slayer]");
- mesc l("Raises attack and resistance against dragons. Also raises int. Passive.");
- mes "";
- mesn;
- if (!mlearn(SA_DRAGONOLOGY,
- Acorn, 70,
- Root, 10,
- FrozenYetiTear, 2,
- FluoPowder, 1))
- goto L_Missing;
- break;
- case 3:
- mesc l("[Mana Wisdom]");
- mesc l("Increase mana experience gain, when using mana skills.");
- mes "";
- mesn;
- if (!mlearn(TMW2_SAGE,
- Acorn, 60,
- Bread, 25,
- PinkBlobime, 20,
- SmallMushroom, 15,
- RedApple, 12))
- goto L_Missing;
- break;
- // Weapon Enhance
- case 4:
- case 5:
- case 6:
- case 7:
- setarray .@ASkill, SA_FLAMELAUNCHER, SA_FROSTWEAPON, SA_LIGHTNINGLOADER, SA_SEISMICWEAPON;
- setarray .@AItem, Curshroom, Coral, BatWing, PileOfAsh;
- setarray .@BItem, Ruby, Sapphire, Emerald, Topaz;
- setarray .@ASkill$, "Fire", "Ice", "Wind", "Earth";
-
- .@index=@menu-4;
-
- .@Skill$=.@ASkill$[.@index];
- .@Skill=.@ASkill[.@index];
- .@Item=.@AItem[.@index];
- .@ItemB=.@BItem[.@index];
-
- deletearray(.@ASkill);
- deletearray(.@AItem);
- deletearray(.@BItem);
- deletearray(.@ASkill$);
-
- mesc l("[@@ Weapon]", .@Skill$);
- mesc l("Temporaly switch weapon element to @@. Success rate is fixed at 70%.", .@Skill$);
- mes "";
- mesn;
- if (!mlearn(.@Skill,
- .@Item, 30,
- FluoPowder, 10,
- WoodenLog, 5,
- HerbalTea, 3,
- .@ItemB, 1))
- goto L_Missing;
- break;
- case 8:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill SA_FREECAST, 0, 0;
- skill SA_DRAGONOLOGY, 0, 0;
- skill TMW2_SAGE, 0, 0;
- skill SA_FLAMELAUNCHER, 0, 0;
- skill SA_FROSTWEAPON, 0, 0;
- skill SA_LIGHTNINGLOADER, 0, 0;
- skill SA_SEISMICWEAPON, 0, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_SAGE;
- mesc l("You abandoned the SAGE class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- //setunitdata(.@npcId, UDT_HEADTOP, WarlordHelmet); // TODO: wizard hat
- setunitdata(.@npcId, UDT_HEADMIDDLE, SorcererRobe);
- setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
- setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-0/saves.txt b/npc/003-0/saves.txt
new file mode 100644
index 000000000..f28fb44bb
--- /dev/null
+++ b/npc/003-0/saves.txt
@@ -0,0 +1,99 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Mr. Saves of Scholar Class
+
+003-0,34,25,0 script Mr Saves NPC_BLACKALCHEMIST,{
+ if (!MAGIC_LVL) goto L_NoMagic;
+ mes l(".:: Scholarship Class ::.");
+ mesc l("Specialized in support, buff, debuff and strengthening skills.");
+ next;
+ mesn;
+ do {
+ mesc l("You have @@ magic skill points available.", sk_points());
+ next;
+ mesc l("Healing - The most basic healing skill, requires no items to use.");
+ mesc l("Mana Wisdom - Passive - Raise Mana EXP Gain rate");
+ mesc l("Accumulate Power - Raise damage of next skill.");
+ mesc l("Provoke - Provoke a single monster");
+
+ mesc l("Mass Provoke - Provoke all monsters under your cursor");
+ mesc l("High Healing - Use a Lifestone for supreme healing.");
+
+ mesc l("Windwalker - Increase walk speed and flee rate.");
+ mesc l("Last Standing Man - Passive - Raise Max HP and Holy Defense");
+ menuint
+ l("Healing"), AL_HEAL,
+ l("Mana Wisdom"), TMW2_SAGE,
+ l("Accumulate Power"), HW_MAGICPOWER,
+ l("Provoke"), SM_PROVOKE,
+ l("Mass Provoke"), EVOL_MASS_PROVOKE,
+ l("High Healing"), AB_HIGHNESSHEAL,
+ l("Windwalker"), SN_WINDWALK,
+ l("Last Standing Man"), CR_TRUST,
+ l("Cancel"), 0;
+ mes "";
+
+ switch (@menuret) {
+ case AL_HEAL:
+ if (!mlearn(AL_HEAL, 4, 1, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case TMW2_SAGE:
+ if (!mlearn(TMW2_SAGE, 5, 1, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case HW_MAGICPOWER:
+ if (!mlearn(HW_MAGICPOWER, 5, 1, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case SM_PROVOKE:
+ if (!mlearn(SM_PROVOKE, 1, 1, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case EVOL_MASS_PROVOKE:
+ if (!mlearn(EVOL_MASS_PROVOKE, 10, 2, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case AB_HIGHNESSHEAL:
+ if (!mlearn(AB_HIGHNESSHEAL, 1, 2, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case SN_WINDWALK:
+ if (!mlearn(SN_WINDWALK, 3, 3, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case CR_TRUST:
+ if (!mlearn(CR_TRUST, 2, 3, SpellBookPage, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ default:
+ if (@menuret)
+ Exception("ERROR skill not implemented", RB_DEFAULT|RB_SPEECH);
+ else
+ closeclientdialog;
+ break;
+ }
+ } while (@menuret);
+ close;
+
+L_NoMagic:
+ next;
+ mesn;
+ mesq l("Your lack of magical power is critical. I dare say, you might never in your life get access to a Mana Stone.");
+ next;
+ mesn;
+ mesq l("Besides the Magic Council, Andrei Sakar have his own Mana Stone, but I doubt he would train the likes of you, or share his Mana Stone.");
+ next;
+ mesn;
+ mesq l("Perhaps, in the city, someone knows rumors about Mana Stones and can teach you. Other than that, you're on your own.");
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+
+}
+
diff --git a/npc/003-0/tanker.txt b/npc/003-0/tanker.txt
deleted file mode 100644
index 0b4c443e7..000000000
--- a/npc/003-0/tanker.txt
+++ /dev/null
@@ -1,221 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the TANKER class
-
-003-0,38,41,2 script Tanker Master NPC_PLAYER,{
- /*
- if (!is_staff())
- goto L_Close;
- */
- if (!(MAGIC_SUBCLASS & CL_TANKER))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(MAGIC_WARRIOR) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Tanker Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- mesc b(l("Warning: This class haven't been tested/balanced yet. Feedback is required!")), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_TANKER;
- mesn;
- mesq l("Welcome to the tanker guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Tanker
-// CR_TRUST (raise Max HP in 200 and Holy Resistance in 5%, passive)
-// CR_AUTOGUARD (5% chance to complety block attack. Freeze you for a while. Req. Shield. Last 5m.)
-// CR_DEFENDER (less damage from ranged attacks, but lowers move & attack speed. Req. Shield) - max lv 4 plz. Last 3m.
-// SM_RECOVERY (insignificant HP recovery every 10s without moving. Better with higher level.) - low mp cost
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(CR_TRUST) && getskilllv(CR_TRUST) < 1+(degree_subclass()/2), l("Learn Last Standing Man")),
- "",
- //rif(sk_intcost(CR_AUTOGUARD) && sk_canlvup(CR_AUTOGUARD), l("Improve Guard")),
- rif(sk_intcost(CR_DEFENDER) && sk_canlvup(CR_DEFENDER), l("Improve Arrow Shield")),
- rif(sk_intcost(SM_RECOVERY) && sk_canlvup(SM_RECOVERY), l("Improve Standing HP Regen")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Last Standing Man]");
- mesc l("Raises max HP and holy resistance. Passive.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(Cheese), (getskilllv(CR_TRUST)+1)*50, getitemlink(Cheese));
- mesc l("@@/@@ @@", countitem(Coral), (getskilllv(CR_TRUST)+1)*30, getitemlink(Coral));
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(CR_TRUST)+1)*20, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(FluoPowder), (getskilllv(CR_TRUST)+1)*15, getitemlink(FluoPowder));
- mesc l("@@/@@ @@", countitem(HastePotion), (getskilllv(CR_TRUST)+1)*10, getitemlink(HastePotion));
- mesc l("@@/@@ @@", countitem(DiamondPowder), (getskilllv(CR_TRUST)+1)*3, getitemlink(DiamondPowder));
- mesc l("@@/@@ @@", countitem(GrassCarp), (getskilllv(CR_TRUST)+1)*1, getitemlink(GrassCarp));
- mesc l("@@/@@ @@", countitem(ElixirOfLife), (getskilllv(CR_TRUST)+1)*1, getitemlink(ElixirOfLife));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(Cheese) < (getskilllv(CR_TRUST)+1)*50 ||
- countitem(Coral) < (getskilllv(CR_TRUST)+1)*30 ||
- countitem(PiberriesInfusion) < (getskilllv(CR_TRUST)+1)*20 ||
- countitem(FluoPowder) < (getskilllv(CR_TRUST)+1)*15 ||
- countitem(HastePotion) < (getskilllv(CR_TRUST)+1)*10 ||
- countitem(DiamondPowder) < (getskilllv(CR_TRUST)+1)*3 ||
- countitem(GrassCarp) < (getskilllv(CR_TRUST)+1)*1 ||
- countitem(ElixirOfLife) < (getskilllv(CR_TRUST)+1)*1) goto L_Missing;
-
- delitem Cheese, (getskilllv(CR_TRUST)+1)*50;
- delitem Coral, (getskilllv(CR_TRUST)+1)*30;
- delitem PiberriesInfusion, (getskilllv(CR_TRUST)+1)*20;
- delitem FluoPowder, (getskilllv(CR_TRUST)+1)*15;
- delitem HastePotion, (getskilllv(CR_TRUST)+1)*10;
- delitem DiamondPowder, (getskilllv(CR_TRUST)+1)*3;
- delitem GrassCarp, (getskilllv(CR_TRUST)+1)*1;
- delitem ElixirOfLife, (getskilllv(CR_TRUST)+1)*1;
-
- sk_lvup(CR_TRUST);
-
- next;
- }
- break;
- case 2:
- mesc l("[Guard]");
- mesc l("Raises chance to entirely block an attack, but freezes you for a while. Req. Shield.");
- mes "";
- // TODO: Requirem, quest, agree
- sk_lvup(CR_AUTOGUARD);
- break;
- case 3:
- mesc l("[Arrow Shield]");
- mesc l("Decrease ranged damage taken for a few minutes, in exchange of agi and move speed. Req. Shield.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(PiouFeathers), (getskilllv(CR_DEFENDER)+1)*60, getitemlink(PiouFeathers));
- mesc l("@@/@@ @@", countitem(PoisonArrow), (getskilllv(CR_DEFENDER)+1)*10, getitemlink(PoisonArrow));
- mesc l("@@/@@ @@", countitem(CursedArrow), (getskilllv(CR_DEFENDER)+1)*10, getitemlink(CursedArrow));
- mesc l("@@/@@ @@", countitem(OrangeCupcake), (getskilllv(CR_DEFENDER)+1)*6, getitemlink(OrangeCupcake));
- mesc l("@@/@@ @@", countitem(Mashmallow), (getskilllv(CR_DEFENDER)+1)*5, getitemlink(Mashmallow));
- mesc l("@@/@@ @@", countitem(Orange), (getskilllv(CR_DEFENDER)+1)*4, getitemlink(Orange));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(PiouFeathers) < (getskilllv(CR_DEFENDER)+1)*60 ||
- countitem(PoisonArrow) < (getskilllv(CR_DEFENDER)+1)*10 ||
- countitem(CursedArrow) < (getskilllv(CR_DEFENDER)+1)*10 ||
- countitem(OrangeCupcake) < (getskilllv(CR_DEFENDER)+1)*6 ||
- countitem(Mashmallow) < (getskilllv(CR_DEFENDER)+1)*5 ||
- countitem(Orange) < (getskilllv(CR_DEFENDER)+1)*4) goto L_Missing;
-
- delitem PiouFeathers, (getskilllv(CR_DEFENDER)+1)*60;
- delitem PoisonArrow, (getskilllv(CR_DEFENDER)+1)*10;
- delitem CursedArrow, (getskilllv(CR_DEFENDER)+1)*10;
- delitem PrangeCupcake, (getskilllv(CR_DEFENDER)+1)*6;
- delitem Mashmallow, (getskilllv(CR_DEFENDER)+1)*5;
- delitem Orange, (getskilllv(CR_DEFENDER)+1)*4;
-
- sk_lvup(CR_DEFENDER);
-
- next;
- }
- break;
- case 4:
- mesc l("[Standing Regen]");
- mesc l("Regenerate HP every 5 seconds, as if you were always eating a healing item.");
- mes "";
- mesn;
- mesq l("This useful skill will only require:");
- mesc l("@@/@@ @@", countitem(PiberriesInfusion), (getskilllv(SM_RECOVERY)+1)*10, getitemlink(PiberriesInfusion));
- mesc l("@@/@@ @@", countitem(BlackMambaEgg), (getskilllv(SM_RECOVERY)+1)*6, getitemlink(BlackMambaEgg));
- mesc l("@@/@@ @@", countitem(MoubooSteak), (getskilllv(SM_RECOVERY)+1)*4, getitemlink(MoubooSteak));
- mesc l("@@/@@ @@", countitem(TonoriDelight), (getskilllv(SM_RECOVERY)+1)*8, getitemlink(TonoriDelight));
- next;
- if (askyesno() == ASK_YES) {
- if (
- countitem(PiberriesInfusion) < (getskilllv(SM_RECOVERY)+1)*10 ||
- countitem(BlackMambaEgg) < (getskilllv(SM_RECOVERY)+1)*6 ||
- countitem(MoubooSteak) < (getskilllv(SM_RECOVERY)+1)*4 ||
- countitem(TonoriDelight) < (getskilllv(SM_RECOVERY)+1)*8) goto L_Missing;
-
- delitem PiberriesInfusion, (getskilllv(SM_RECOVERY)+1)*10;
- delitem BlackMambaEgg, (getskilllv(SM_RECOVERY)+1)*6;
- delitem MoubooSteak, (getskilllv(SM_RECOVERY)+1)*4;
- delitem TonoriDelight, (getskilllv(SM_RECOVERY)+1)*8;
-
- sk_lvup(SM_RECOVERY);
- //mesc l("This skill can be further improved with Job Points");
-
- next;
- }
- break;
- case 5:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill CR_TRUST, 0, 0;
- skill CR_AUTOGUARD, 0, 0;
- skill CR_DEFENDER, 0, 0;
- skill SM_RECOVERY, 0, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_TANKER;
- mesc l("You abandoned the TANKER class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- setunitdata(.@npcId, UDT_HEADTOP, WarlordHelmet);
- setunitdata(.@npcId, UDT_HEADMIDDLE, WarlordPlate);
- setunitdata(.@npcId, UDT_HEADBOTTOM, SteelShield);
- setunitdata(.@npcId, UDT_WEAPON, JeansChaps);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 4);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-0/trickmaster.txt b/npc/003-0/trickmaster.txt
new file mode 100644
index 000000000..8a51c2c58
--- /dev/null
+++ b/npc/003-0/trickmaster.txt
@@ -0,0 +1,87 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Trickmaster of Tricksters Class
+
+003-0,40,30,0 script Trickmaster NPC_SITTED_NINJA,{
+ if (!MAGIC_LVL) goto L_NoMagic;
+ mes l(".:: Trickster Class ::.");
+ mesc l("Specialized in miscellaneous skills.");
+ next;
+ mesn;
+ mesc l("You have @@ magic skill points available.", sk_points());
+ mesc l("Trickster uses an experimental window, you might need to resize it to see all skills.");
+ do {
+ next;
+ setskin "academy_trickster";
+ menuint
+ "freecast", SA_FREECAST,
+ "backslide", TF_BACKSLIDING,
+ "firewall", MG_FIREWALL,
+ "fullthrottle", ALL_FULL_THROTTLE,
+ "darkillusion", GC_DARKILLUSION,
+ "trickdead", NV_TRICKDEAD,
+ "firewalk", SO_FIREWALK,
+ "Cancel", 0;
+ mes "";
+ setskin "";
+
+ switch (@menuret) {
+ case SA_FREECAST:
+ if (!mlearn(SA_FREECAST, 1, 1, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case TF_BACKSLIDING:
+ if (!mlearn(TF_BACKSLIDING, 1, 1, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case MG_FIREWALL:
+ if (!mlearn(MG_FIREWALL, 10, 1, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case ALL_FULL_THROTTLE:
+ if (!mlearn(ALL_FULL_THROTTLE, 1, 1, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case GC_DARKILLUSION:
+ if (!mlearn(GC_DARKILLUSION, 1, 2, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case NV_TRICKDEAD:
+ if (!mlearn(NV_TRICKDEAD, 1, 2, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ case SO_FIREWALK:
+ if (!mlearn(SO_FIREWALK, 2, 2, Lockpicks, 1))
+ mesc l("You do not meet all requisites for this skill."), 1;
+ break;
+ default:
+ if (@menuret)
+ Exception("ERROR skill not implemented", RB_DEFAULT|RB_SPEECH);
+ else
+ closeclientdialog;
+ break;
+ }
+ } while (@menuret);
+ close;
+
+L_NoMagic:
+ next;
+ mesn;
+ mesq l("Your lack of magical power is critical. I dare say, you might never in your life get access to a Mana Stone.");
+ next;
+ mesn;
+ mesq l("Besides the Magic Council, Andrei Sakar have his own Mana Stone, but I doubt he would train the likes of you, or share his Mana Stone.");
+ next;
+ mesn;
+ mesq l("Perhaps, in the city, someone knows rumors about Mana Stones and can teach you. Other than that, you're on your own.");
+ close;
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 5;
+ end;
+
+}
+
diff --git a/npc/003-0/warriors.txt b/npc/003-0/warriors.txt
deleted file mode 100644
index d514130f1..000000000
--- a/npc/003-0/warriors.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// (C) Jesusalva, 2018
-// TMW2 Script
-
-// Paladin
-// CR_TRUST (raise Max HP in 200 and Holy Resistance in 5%, passive)
-// AL_ANGELUS (DEF Increase 5% for 15s/LVL, 14x14 area for PARTY)
-// Broken //PR_REDEMPTIO (suicide with death penalty. Revive dead party members on a 29x29 area. Min. 1% xp. 0.01% xp penalty reduction per revive)
-// Broken? //MER_INCAGI (raise agi and move speed for 20s/LVL. Have an HP cost.)
-// SM_BASH up to level 4 (+220% dmg and +20% acc). PS. If you have MP, SM_BASH is very powerful.
-
-// Warrior - Class extinct
-// Simply makes no sense now.
-
-// Tanker
-// CR_TRUST (raise Max HP in 200 and Holy Resistance in 5%, passive)
-// Broken? //CR_AUTOGUARD (5% chance to complety block attack. Freeze you for a while. Req. Shield. Last 5m.)
-// CR_DEFENDER (less damage from ranged attacks, but lowers move & attack speed. Req. Shield) - max lv 4 plz. Last 3m.
-// SM_RECOVERY (insignificant HP recovery every 10s without moving. Better with higher level.) - low mp cost
-
-// Berserker
-// KN_AUTOCOUNTER (Counter any attack with 2x critical rate and block attack for 0.5s)
-// SM_ENDURE (deny stun penalty when hit, and MDEF bonus, for 10s)
-// Broken? //SM_AUTOBERSERK (when < 25% hp, get +32% ATK and -55% VIT DEF. Drain SP and keep working even with 0 MP. Trigerrable passive.)
-
-
-
-
-// Ranger (Arrows)
-// AC_VULTURE (raise range and cth)
-// AC_OWL (raise 1 DEX per level)
-// AC_SHOWER (3x3 attack)
-// SN_WINDWALK (raise walking speed and flee rate on the screen area)
-
-// Sniper (guns)
-// GS_SNAKEEYE (passive, range and acc + 1)
-// GS_SINGLEACTION (passive, acc +2 and aspd +1%) (?)
-// GS_INCREASING (+20 Acc, +4 Dex and +4 Agi for 60s)
-// GS_CHAINACTION (revolver may shoot twice) ?
-// GS_MAGICALBULLET (adds MATK to your regular attack) ?
-
-// TODO: What about GS_GATLINGFEVER or improving SN_SHARPSHOOTER?
diff --git a/npc/003-0/wizard.txt b/npc/003-0/wizard.txt
deleted file mode 100644
index d4ca14a52..000000000
--- a/npc/003-0/wizard.txt
+++ /dev/null
@@ -1,191 +0,0 @@
-// TMW2 scripts.
-// Authors:
-// Jesusalva
-// Description:
-// Leader of the WIZARD class
-// TODO: Improve Fireball
-
-003-0,55,25,0 script Wizard Master NPC_PLAYER,{
- if (!(MAGIC_SUBCLASS & CL_WIZARD))
- goto L_SignUp;
- goto L_Member;
-
-// Sign Up
-L_SignUp:
- // Not allowed if subclass filled or not from main class
- if (total_subclass() >= max_subclass() || getskilllv(WIZARD_MAGE) < 2)
- goto L_Close;
- mesn;
- mesq l("Hey there! Do you want to join the Wizard Class?");
- mesc l("Warning: If you join a subclass, you can't leave it later!"), 1;
- //mesc b(l("Warning: This class haven't been tested/balanced yet. Feedback is required!")), 1;
- next;
- if (askyesno() != ASK_YES)
- close;
- // TODO: Requeriment for signing up to a subclass? Or is the tier + skill quest hard enough?
- MAGIC_SUBCLASS=MAGIC_SUBCLASS|CL_WIZARD;
- mesn;
- mesq l("Welcome to the wizard guild!");
- close;
-
-// Close
-L_Close:
- goodbye;
- closedialog;
- close;
-
-L_Missing:
- mesn;
- mesq l("Hey hey! You don't have that stuff, CAN'T YOU READ?!");
- percentheal 0, -10;
- next;
- goto L_Member;
-
-// Membership area
-// Wizard
-// MG_COLDBOLT (ice)
-// MG_LIGHTNINGBOLT (wind)
-// WZ_EARTHSPIKE (earth)
-// MG_NAPALMBEAT (ghost)
-// MG_ENERGYCOAT (For 5 minutes, raise damage reduction, but that eats MP)
-// TODO: We have many other cool skills for Wizard (more AoE skills, more damage, etc)
-// I will worry with that later, as that also means providing extra skills for Sage & Priest
-// Note: the number of hits of bolts is the same as the skill level :D
-
-L_Member:
- mesn;
- mesq l("Hey there! Do you want to learn new skills for a very small teaching fee?");
- select
- rif(sk_intcost(MG_ENERGYCOAT) && !getskilllv(MG_ENERGYCOAT), l("Learn Energy Coating")),
- rif(sk_intcost(MG_NAPALMBEAT) && sk_canlvup(MG_NAPALMBEAT), l("Improve Napalm Beat")),
- rif(sk_intcost(MG_COLDBOLT) && sk_canlvup(MG_COLDBOLT), l("Improve Cold Bolt")),
- rif(sk_intcost(MG_LIGHTNINGBOLT) && sk_canlvup(MG_LIGHTNINGBOLT), l("Improve Thunder Bolt")),
- rif(sk_intcost(WZ_EARTHSPIKE) && sk_canlvup(WZ_EARTHSPIKE), l("Improve Earth Spike")),
- rif(sk_intcost(MG_FIREBOLT) && sk_canlvup(MG_FIREBOLT), l("Improve Fire Bolt")),
- rif(sk_intcost(MG_FIREBALL) && getskilllv(MG_FIREBALL) < (3+degree_subclass()), l("Improve Fire Ball")),
- l("Leave Subclass"),
- l("Nothing at the moment.");
- mes "";
- switch (@menu) {
- case 1:
- mesc l("[Energy Coating]");
- mesc l("Drains Mana to reduce damage taken. The only defensive skill from wizards.");
- mes "";
- mesn;
- if (!mlearn(MG_ENERGYCOAT,
- Tentacles, 10,
- MushroomSpores, 5,
- WolvernTooth, 3,
- RedScorpionClaw, 1))
- goto L_Missing;
- break;
- case 2:
- mesc l("[Napalm Beat]");
- mesc l("Neutral attack with low damage value, but with low cost, high range and wide Effect Area.");
- //mesc l("Useful in PvP when your enemy have equipped a @@", getitemlink(AstralCube));
- mes "";
- mesn;
- if (!mlearn(MG_NAPALMBEAT,
- Acorn, 60,
- Bread, 30,
- SmallMushroom, 20,
- PinkBlobime, 20,
- RedApple, 15))
- goto L_Missing;
- break;
- // Magic Bolts
- case 3:
- case 4:
- case 5:
- case 6:
- setarray .@ASkill, MG_COLDBOLT, MG_LIGHTNINGBOLT, WZ_EARTHSPIKE, MG_FIREBOLT;
- setarray .@AItem, Coral, BatWing, PileOfAsh, Curshroom;
- setarray .@BItem, Sapphire, Emerald, Topaz, Ruby;
- setarray .@ASkill$, "Ice", "Wind", "Earth", "Fire";
-
- .@index=@menu-3;
-
- .@Skill$=.@ASkill$[.@index];
- .@Skill=.@ASkill[.@index];
- .@Item=.@AItem[.@index];
- .@ItemB=.@BItem[.@index];
-
- deletearray(.@ASkill);
- deletearray(.@AItem);
- deletearray(.@BItem);
- deletearray(.@ASkill$);
-
- mesc l("[@@ Bolt]", .@Skill$);
- mesc l("Causes a @@ bolt on the enemy. Number of hits is the skill level.", .@Skill$);
- mes "";
- mesn;
- if (!mlearn(.@Skill,
- .@Item, 30,
- FluoPowder, 8,
- HerbalTea, 3,
- DiamondPowder, 2,
- .@ItemB, 1))
- goto L_Missing;
- break;
- case 7:
- mesc l("[Fire Ball]");
- mesc l("Standard fireball skill.");
- mes "";
- mesn;
- if (!mlearn(MG_FIREBALL,
- Curshroom, 10,
- SulfurPowder, 10,
- FluoPowder, 10,
- PolishedRuby, 3,
- HerbalTea, 1))
- goto L_Missing;
- break;
- case 8:
- // All skills related may include the basic class skills if they're related.
- mesc l("WARNING: If you leave the subclass, you'll lose all skills related to it!"), 1;
- mesc l("This cannot be undone. Are you sure?"), 1;
- mes "";
- if (askyesno() == ASK_YES) {
- mes "";
- if (validatepin()) {
- skill MG_ENERGYCOAT, 0, 0;
- skill SA_DRAGONOLOGY, 0, 0;
- skill MG_NAPALMBEAT, 0, 0;
- skill MG_COLDBOLT, 0, 0;
- skill MG_LIGHTNINGBOLT, 0, 0;
- skill WZ_EARTHSPIKE, 0, 0;
- skill MG_FIREBOLT, 0, 0;
- skill MG_FIREBALL, 2, 0;
- MAGIC_SUBCLASS=MAGIC_SUBCLASS^CL_WIZARD;
- mesc l("You abandoned the WIZARD class!"), 1;
- close;
- } else {
- mesc l("Failed to validate pin. Aborting.");
- next;
- }
- } else {
- mes "";
- mesc l("Operation aborted. Phew!");
- next;
- }
- break;
- default:
- goto L_Close;
- }
-
- goto L_Member;
-
-OnInit:
- .@npcId = getnpcid(.name$);
- setunitdata(.@npcId, UDT_HEADTOP, FancyHat); // TODO: wizard hat
- setunitdata(.@npcId, UDT_HEADMIDDLE, SorcererRobe);
- setunitdata(.@npcId, UDT_HEADBOTTOM, NPCEyes);
- setunitdata(.@npcId, UDT_WEAPON, JeansShorts);
- setunitdata(.@npcId, UDT_HAIRSTYLE, 2);
- setunitdata(.@npcId, UDT_HAIRCOLOR, 5);
-
- .sex=G_MALE;
- .distance=5;
- end;
-}
-
diff --git a/npc/003-1/jakod.txt b/npc/003-1/jakod.txt
index e0955e1d3..bd393a2d2 100644
--- a/npc/003-1/jakod.txt
+++ b/npc/003-1/jakod.txt
@@ -14,19 +14,25 @@
if (BaseLevel < $MANA_BLVL) close;
mes l("\"Ah, hello there, @@. You've grown quite skilled lately.", strcharinfo(0));
- if (MAGIC_LVL) mes l("I also see you have a level @@ magic skill!\"", MAGIC_LVL);
- if (!MAGIC_LVL) mes l("But you lack magic! That's a pity.\"");
-
- menu
- rif(!MAGIC_LVL, l("How do I get magic?")), L_HowTo,
- rif(MAGIC_LVL >= 1 && !getskilllv(AL_HEAL), l("Can you teach me a basic tier 1 magic skill?")), L_Tier1,
- rif(MAGIC_LVL >= 2 && !getskilllv(EVOL_MASS_PROVOKE), l("Can you teach me a basic tier 2 magic skill?")), L_Tier2,
- //rif(MAGIC_LVL >= 3 && !getskilllv(AL_TELEPORT), SM_ENDURE is in ragger
- l("Good bye."), -;
-
- close;
+ if (MAGIC_LVL) {
+ mes l("I also see you have a level @@ magic skill!\"", MAGIC_LVL);
+ next;
+ mes l("Did you got an @@ yet? That book have great insight on several details concerning mana and its usages!", getitemlink(JesusavesGrimorium));
+ next;
+ mes l("Anyway, you can see how skilled using Mana Magic with @@. Mana Magic is the one which requires concentration, to bring things into existence, for example.", b("@sk-abizit"));
+ next;
+ mes l("Well, if you ever need help, do not hesit reading the wiki ;-)");
+ close;
+ } else {
+ mes l("But you lack magic! That's a pity.\"");
+ select
+ l("How do I get magic?"),
+ l("Good bye.");
+ if (@menu == 2)
+ close;
+ mes "";
+ }
-L_HowTo:
mes "";
mesn;
mesq l("Well, the first thing would be to get access to a Mana Stone. Halinarzo had the biggest mana stone mines, but it's now depleted.");
@@ -36,50 +42,15 @@ L_HowTo:
mes l("...If you're lucky, you can touch it and receive magic power.\"");
next;
mesn;
- mesq l("Having magic power is useless by itself, so you must visit the Magic Council and sign up in one of two classes.");
- next;
- mesn;
- mesq l("Your class selection is ##BPermanent##b and cannot be changed later. Do their tasks, and you'll be able to harness magic!");
+ mesq l("Having magic power is useless by itself, so you must visit the Academy. I guess that involves approval and acknowledgment of the Mage Council that you are a mage!");
next;
mesn;
- mesq l("The more levels and intelligence you have, more likely the Mana Stone will grant you more Magic Power. But that means nothing.");
+ mesq l("Keep in mind, the more levels and intelligence you have, more likely the Mana Stone will grant you more Magic Power. But that means nothing.");
next;
mesn;
mesq l("Because in the end, you are in the hands of your class leader!"); // Rare: Some loner NPCs may grant you EXTRA skills beyond that.
close;
-L_Tier1:
- mes "";
- mesn;
- mesq l("Yeah, of course. I will teach you how to give first aid to people.");
- next;
- mesn;
- mesq l("It takes a lot of mana, and is not very powerful, but it is a must have for everyone.");
- next;
- mesn;
- mesq l("I'll charge you the irrelevant amount of 100 GP. Come on, it's a pinch!");
- select
- rif(Zeny >= 100, l("Buy it")),
- l("Don't buy it");
- if (@menu == 1) {
- Zeny=Zeny-100;
- skill(AL_HEAL,1,0);
- }
- close;
-
-L_Tier2:
- mes "";
- mesn;
- mesq l("Yeah, of course. This one is rather useless and difficult to use, though.");
- next;
- mesn;
- mesq l("It's called Mass Provoke. You'll basically try to convince monsters to attack you.");
- next;
- mesn;
- mesq l("Ah... I am too lazy to ask for anything in exchange. Here. Take it. Free.");
- skill(EVOL_MASS_PROVOKE,1,0);
- close;
-
OnInit:
.@npcId = getnpcid(.name$);
setunitdata(.@npcId, UDT_HEADTOP, NPCEyes);
diff --git a/npc/003-2/lua.txt b/npc/003-2/lua.txt
index 94da648bf..696261e2d 100644
--- a/npc/003-2/lua.txt
+++ b/npc/003-2/lua.txt
@@ -181,6 +181,8 @@ L_Task:
msObjective(Zeny >= 1000, l("* @@/@@ GP", Zeny, 1000));
+ msObjective(CRAFTQUEST || MPQUEST, l("* Register as a Crafter or Hunter"));
+
msObjective(countitem(TulimsharGuardCard), l("* @@/@@ @@", countitem(TulimsharGuardCard), 1, getitemlink(TulimsharGuardCard)));
msObjective(countitem(FishingRod), l("* @@/@@ @@", countitem(FishingRod), 1, getitemlink(FishingRod)));
@@ -191,6 +193,7 @@ L_Task:
if (BaseLevel >= 20 &&
JobLevel >= 6 &&
Zeny >= 1000 &&
+ (CRAFTQUEST || MPQUEST) &&
countitem(TulimsharGuardCard) &&
countitem(FishingRod) &&
countitem(LifestonePendant))
@@ -198,7 +201,8 @@ L_Task:
mesn;
if (!countitem(TulimsharGuardCard)) {
- mes l("The Guard Card will prove your intentions. Talk to the Lieutenant.");
+ mes l("The Guard Card will prove your intentions. Talk to the Lieutenant in front of the Guard House.");
+ mesc l("Completing this quest will allow access to the Guard House, where you can pick Daily Bounties for monsters.");
mes "";
}
if (!countitem(FishingRod)) {
@@ -214,6 +218,12 @@ L_Task:
mes l("There are some sailors near the forge. Think outside the box - or rather, inside it, unless you have a fortune to buy the items.");
mes "";
}
+ if (CRAFTQUEST || MPQUEST) {
+ mes lg("To register as a craftswoman, you need to talk to Intense Beard in Terranite Forge. The forge is in the Bazar.", "To register as a craftsman, you need to talk to Intense Beard in Terranite Forge. The forge is in the Bazar.");
+ mes l("To register as a hunter, talk to Aidan, also in the marketplace - the Bazar.");
+ mesc l("You can, and @@, register on both programs, but only one is required for this quest.", b("SHOULD"));
+ mes "";
+ }
if (BaseLevel < 20) {
mes l("If you are in need to get lots of experience quickly, you should try to engage the bigger and stronger monsters in the town. However, if they hit you, it's Soul Menhir for you.");
mes "";
diff --git a/npc/005-6/morgan.txt b/npc/005-6/morgan.txt
index 660b7f9e8..692f7e3b0 100644
--- a/npc/005-6/morgan.txt
+++ b/npc/005-6/morgan.txt
@@ -43,12 +43,12 @@ L_Shop:
// Magic Subsystem
L_Magic:
mesn;
- mesq l("I see you are a mage too. Have you joined a class already? Luca and Colin are always recruiting on Tulimshar Magic Council.");
+ mesq l("I see you have magical powers. Have you been acknowledge by the Alliance as a mage? If not, you should regularize yourself as a @@º degree mage in Tulimshar Magic Council.", MAGIC_LVL);
L_MagicCore:
select
- l("What is a class?"),
- l("How difficult it is to obtain a class?"),
+ l("Acknowledgment? What do you mean?"),
+ l("Magic Council? What's that?"),
rif(!getskilllv(TMW2_KALMURK), l("Can you teach me a spell?")),
rif(getskilllv(TMW2_KALMURK), l("I keep failing to summon maggots...")),
l("Thanks for the help!");
@@ -56,20 +56,26 @@ L_MagicCore:
switch (@menu) {
case 1:
mesn;
- mesq l("We have two main groups, entitled classes: The Magic Warriors, and the Wizard Mages.");
+ mesq l("You won't learn any skill without a good professor to teach them to you.");
next;
mesn;
- mesq l("I don't think you can be part of more than one class, but you can accumulate subclasses. These will only unlock at tier 2, though.");
+ mesq l("And unless you have a mage permit from the Magic Council, you won't be going to CR1 - Academy Island either.");
break;
case 2:
mesn;
- mesq l("You know the Tulimshar Magic Council? The big building on Tulimshar North? There you can obtain a class.");
+ mesq l("You know the Tulimshar Magic Council? The big building on Tulimshar North?");
next;
mesn;
- mesq l("Getting in a class is easy, difficult is mastering it. But the more you advance, more powerful skills are unlocked.");
+ mesq l("It rules Tulimshar, and is also one of the superior bodies of the Alliance. They have the last Mana Stone in the world on their meeting hall.");
next;
mesn;
- mesq l("Of course, if you don't ask from the Mana Stone for more magic, that means nothing...");
+ mesq l("They restrict access to it to prevent new Monster Kings from emerging. They also keep record on every mage in the world.");
+ next;
+ mesn;
+ mesq l("In general, by touching the Mana Stone once, will make you a first degree mage. But these degrees goes up to seven and beyond, I think.");
+ next;
+ mesn;
+ mesq l("Of course, if you don't ask from the Mana Stone for more magic, you will stay on the first degree forever...");
break;
case 3:
mesn;
diff --git a/npc/009-3/barzil.txt b/npc/009-3/barzil.txt
index 4b1ea3c57..d4462bdc1 100644
--- a/npc/009-3/barzil.txt
+++ b/npc/009-3/barzil.txt
@@ -12,7 +12,7 @@
L_Tier2:
mesn strcharinfo(0);
- mesq l("I need my master's @@, fast!", getitemlink(SunnyCrystal));
+ mesq l("I need for the Magic Academy a @@, fast!", getitemlink(SunnyCrystal));
next;
mesn;
mesq l("Of course! Quick, take it!!");
diff --git a/npc/011-1/manastone.txt b/npc/011-1/manastone.txt
index e4a2255e9..53be3b59f 100644
--- a/npc/011-1/manastone.txt
+++ b/npc/011-1/manastone.txt
@@ -73,6 +73,7 @@ L_LevelUp:
if (!MAGIC_LVL) mes l("Magic Power is granted to you, but you die from it.");
if (MAGIC_LVL) mes l("More Magic Power is granted to you, but you die from it.");
MAGIC_LVL = MAGIC_LVL+1;
+ sk_lvup(AL_DP);
// No penalty for death provoked by Mana Stone, see npc/001-8/hub.txt for more info
@deathpenalty_realvalue=readparam(BaseExp);
@deathpenalty_realvaljob=readparam(JobExp);
diff --git a/npc/012-1/gwendolyn.txt b/npc/012-1/gwendolyn.txt
index be66c26f9..d1a62a221 100644
--- a/npc/012-1/gwendolyn.txt
+++ b/npc/012-1/gwendolyn.txt
@@ -444,7 +444,7 @@ L_Success:
setq HurnscaldQuest_HarkEye, 6;
- skill SN_SHARPSHOOTING, 1, 0;
+ skill AC_CHARGEARROW, 1, 0;
getexp .QUEST_HAWK_EXP, 0;
mesn l("Gwendolyn Bowmaker");
mesq l("Perfect indeed! Congratulations!");
@@ -572,11 +572,11 @@ OnInit:
// how many eggs do you need of each kind?
.CAVE_EGGS_AMOUNT = 21;
- .SNAKE_EGGS_AMOUNT = 18;
- .MOUNTAIN_EGGS_AMOUNT = 9;
+ .SNAKE_EGGS_AMOUNT = 15;
+ .MOUNTAIN_EGGS_AMOUNT = 7;
// experience for eggs
- .QUEST_EGG_EXP = 6500;
+ .QUEST_EGG_EXP = 7500;
// The needed level for the minigame:
.BASELEVEL_GAME = 45;
diff --git a/npc/014-3/fountain.txt b/npc/014-3/fountain.txt
index b721fd2ae..c32610885 100644
--- a/npc/014-3/fountain.txt
+++ b/npc/014-3/fountain.txt
@@ -115,11 +115,8 @@ L_Tier2Ok:
mes l("I predict you're closer to find the Secret Of Mana, and therefore, be part on saving our world.");
next;
mesn;
- mes l("I will empower you with raw mana, and your time will start running out again.");
+ mes l("I will empower you with raw mana now.");
next;
- // 30~60 s + 4~6 minutes to finish in average. Each level grants 4~6 extra seconds.
- // You will also get extra time for int, but randomly.
- QUEST_ELEVARTEMPO=gettimetick(2)+rand(30,60)+rand((BaseLevel*4),(BaseLevel*6))+rand(1,readparam(bInt));
ST_TIER=6;
// Ref. 240 xp. You will be penalized with 1 xp for over-level. (waw...)
if (BaseLevel < 300)
diff --git a/npc/functions/seasons.txt b/npc/functions/seasons.txt
index 1eef20034..cb742e558 100644
--- a/npc/functions/seasons.txt
+++ b/npc/functions/seasons.txt
@@ -203,25 +203,24 @@ function script SeasonReload {
end;
OnSummerStart:
- addmonsterdrop(RedButterfly, CherryCocktail, 100);
- addmonsterdrop(Croc, CherryCocktail, 180);
- addmonsterdrop(Duck, CherryCocktail, 360);
- addmonsterdrop(DesertBandit, CherryCocktail, 410);
addmonsterdrop(SaxsoGhost, CherryCocktail, 450);
+ addmonsterdrop(DesertBandit, CherryCocktail, 410);
+ addmonsterdrop(Duck, CherryCocktail, 360);
+ addmonsterdrop(Croc, CherryCocktail, 180);
+ addmonsterdrop(RedButterfly, CherryCocktail, 100);
-
- addmonsterdrop(Maggot, CactusCocktail, 140);
- addmonsterdrop(Scorpion, CactusCocktail, 165);
- addmonsterdrop(DesertMaggot, CactusCocktail, 190);
- addmonsterdrop(FireGoblin, CactusCocktail, 220);
- addmonsterdrop(GiantMaggot, CactusCocktail, 290);
addmonsterdrop(Centaur, CactusCocktail, 1000);
-
- addmonsterdrop(Pinkie, AppleCocktail, 70);
- addmonsterdrop(RedScorpion, AppleCocktail, 120);
- addmonsterdrop(Mouboo, AppleCocktail, 280);
- addmonsterdrop(OceanCroc, AppleCocktail, 480);
+ addmonsterdrop(GiantMaggot, CactusCocktail, 290);
+ addmonsterdrop(FireGoblin, CactusCocktail, 220);
+ addmonsterdrop(DesertMaggot, CactusCocktail, 190);
+ addmonsterdrop(Scorpion, CactusCocktail, 165);
+ addmonsterdrop(Maggot, CactusCocktail, 140);
+
addmonsterdrop(AlphaMouboo, AppleCocktail, 850);
+ addmonsterdrop(OceanCroc, AppleCocktail, 480);
+ addmonsterdrop(Mouboo, AppleCocktail, 280);
+ addmonsterdrop(RedScorpion, AppleCocktail, 120);
+ addmonsterdrop(Pinkie, AppleCocktail, 70);
addmonsterdrop(Duck, Sunglasses, 1);
diff --git a/npc/functions/util.txt b/npc/functions/util.txt
index 01ed71056..f41c343fc 100644
--- a/npc/functions/util.txt
+++ b/npc/functions/util.txt
@@ -551,6 +551,7 @@ function script mstone {
readparam(Sp) == readparam(MaxSp));
}
+/*
// Gets how many subclasses were actually filled
// total_subclass( )
function script total_subclass {
@@ -579,40 +580,76 @@ function script total_subclass {
function script max_subclass {
return (MAGIC_LVL/2);
}
+*/
+
+// MAGIC_PTS → Amount of used Magic Skill Points
+// sk_maxpoints() → Max Magic Skill Points you may use
+// Returns how many points you can use
+function script sk_maxpoints {
+ // 2 points per magic level
+ .@val=(MAGIC_LVL)*2;
+ // 1 point every twice magic level
+ .@val+=(MAGIC_LVL/2);
+ // Excluding first 15, 1 point every 10 job levels
+ .@val+=((JobLevel-15)/10);
+ // 1 point per skill permit level
+ .@val+=getskilllv(TMW2_SKILLPERMIT);
+ return .@val;
+}
-
-// Gets subclass current degree
-// degree_subclass()
-function script degree_subclass {
- return (MAGIC_LVL/2)+(MAGIC_LVL%2);
+// Returns how many points you can allocate
+function script sk_points {
+ return sk_maxpoints()-MAGIC_PTS;
}
-// Returns true if a skill can be leveled up, based on degree_subclass().
-// sk_canlvup( sk )
+// Returns true if a skill can be leveled up.
+// sk_canlvup( {cost=1} )
function script sk_canlvup {
- if (getskilllv(getarg(0)) <= degree_subclass())
- return 1;
- return 0;
+ return ((MAGIC_PTS+getarg(0,1)) <= sk_maxpoints());
}
// Level up a skill in 1 level
-// sk_lvup( sk )
+// TODO: Return the point if leveling about Max Level
+// sk_lvup( sk{, cost=0} )
function script sk_lvup {
.@lvl=getskilllv(getarg(0));
getexp 0, 50*(.@lvl+1);
addtoskill(getarg(0),.@lvl+1,0);
+ if (getarg(1,0)) {
+ MAGIC_PTS+=getarg(1,0);
+ }
return;
}
-// Returns the intelligence cost based on skill level
-// sk_intcost( sk )
-function script sk_intcost {
- .@cost=(getskilllv(getarg(0))+1)*10;
- if (readparam(bInt) >= .@cost)
- return 1;
- return 0;
+// NEW Magic School Learning Interface
+// mlearn( skill, MAX_LV, AP cost, item, amount )
+// returns false if cheater
+function script mlearn {
+ .@sk=getarg(0);
+ .@ff=getarg(1);
+ .@ap=getarg(2);
+ .@it=getarg(3);
+ .@am=getarg(4);
+ if (getskilllv(.@sk) >= .@ff) {
+ mesc l("You've reached the maximum level for this skill."), 1;
+ return true;
+ }
+ mesc l("To learn @@ you'll need @@/@@ point(s).", .@sk, .@ap, sk_points());
+ mesc l("You'll also need to pay a fee of @@x @@", .@am, getitemlink(.@it));
+ next;
+ if (askyesno() == ASK_NO)
+ return true;
+ if (countitem(.@it) < .@am)
+ return false;
+ if (!sk_canlvup(.@ap))
+ return false;
+
+ delitem .@it, .@am;
+ sk_lvup(.@sk, .@ap);
+ return true;
}
+/*
// Magic School Learning Interface
// mlearn( skill, {item 1, amount 1}, {item 2, amount 2}... )
// returns false if cheater
@@ -651,6 +688,7 @@ function script mlearn {
return true;
}
+*/
// Returns a value defining your current magic control (affects success ratio, higher is better)
// A value of '5' means perfect control, and a value of '0' means overwhelm.
diff --git a/npc/guilds/logs.txt b/npc/guilds/logs.txt
index a255eb566..f374c8800 100644
--- a/npc/guilds/logs.txt
+++ b/npc/guilds/logs.txt
@@ -116,6 +116,7 @@ guilds,47,39,0 script Guild Logs NPC_NO_SPRITE,{
if (@menu == 1 && $GUILD_BANK[.@gid] >= .@price)
{
$GUILD_BANK[.@gid]-=.@price;
+ // guildskill()?
skill GD_EXTENSION, getskilllv(GD_EXTENSION)+1, 0;
break;
}
diff --git a/npc/items/books.txt b/npc/items/books.txt
index 23469db7b..176af98e1 100644
--- a/npc/items/books.txt
+++ b/npc/items/books.txt
@@ -177,9 +177,9 @@ OnInit:
mes "";
select
- rif2(1, MAGIC_LVL >= 2, l("Ch 1 — Prologue")),
+ rif2(1, MAGIC_LVL, l("Ch 1 — Prologue")),
rif2(2, MAGIC_EXP, l("Ch 2 — Mana Magic vs Common Magic")),
- rif2(3, MAGIC_LVL >= 2, l("Ch 3 — Subclass")),
+ rif2(3, MAGIC_LVL, l("Ch 3 — Subclass")),
rif2(4, true, l("Open Fishing Book")),
rif2(5, true, l("Open Petcaring Book")),
rif2(6, getq(NivalisQuest_BlueSageSlimes) >= 2, l("Open Recipe Book")),
@@ -193,7 +193,7 @@ OnInit:
l("Mana is something which existed since the being, but nobody knows much about."),
l("This book will write itself, and reveal you the Secret Of Mana."),
l("Give it time, increase your magic power, and you'll find out the truth."),
- l("Your current maximum magic efficiency is @@. This book allows you many new possibilities.", MAGIC_LVL);
+ l("You are a @@º degree mage. This book allows you many new possibilities.", MAGIC_LVL);
break;
case 2:
narrator S_FIRST_BLANK_LINE | S_LAST_NEXT,
@@ -239,6 +239,7 @@ OnInit:
next;
break;
case 3:
+ /*
mesc l("You currently have @@/@@ subclass(es).", total_subclass(),max_subclass());
if (MAGIC_SUBCLASS & CL_PALADIN)
mesc lg("Paladin");
@@ -256,6 +257,9 @@ OnInit:
mesc lg("Sage");
if (MAGIC_SUBCLASS & CL_PRIEST)
mesc lg("Priest");
+ */
+ mesc l("You have @@/@@ magic skill points available.", b(sk_points()), sk_maxpoints());
+ mesc l("Currently, there is no way to reset them. So use them wisely!");
next;
break;
case 4: