summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2019-08-18 15:05:32 -0300
committerJesusaves <cpntb1@ymail.com>2019-08-18 15:05:32 -0300
commitc9173a4e2e55b0fdf4df0d99920c556548a81e4b (patch)
tree885d66f5e10289843fa71a4316fe49a454c47c01
parent9222961a0b3b38aee2f01a1d53c8a08e174488e2 (diff)
parent7c8417bb63afb65516852da1b9eb8ff0b4d2877f (diff)
downloadserverdata-c9173a4e2e55b0fdf4df0d99920c556548a81e4b.tar.gz
serverdata-c9173a4e2e55b0fdf4df0d99920c556548a81e4b.tar.bz2
serverdata-c9173a4e2e55b0fdf4df0d99920c556548a81e4b.tar.xz
serverdata-c9173a4e2e55b0fdf4df0d99920c556548a81e4b.zip
Merge branch 'master' into testserver
Conflicts solved with -X theirs
-rw-r--r--conf/atcommand.conf3
-rw-r--r--conf/groups.conf4
-rw-r--r--conf/map/battle/battle.conf2
-rw-r--r--conf/map/battle/drops.conf2
-rw-r--r--conf/map/battle/exp.conf2
-rw-r--r--conf/map/maps.conf1
-rw-r--r--db/constants.conf16
-rw-r--r--db/craft_db.conf116
-rw-r--r--db/item_options.conf26
-rw-r--r--db/map_index.txt153
-rw-r--r--db/quest_db.conf14
-rw-r--r--db/re/exp_group_db.conf13
-rw-r--r--db/re/homunculus_db.txt16
-rw-r--r--db/re/item_chain.conf23
-rw-r--r--db/re/item_combo_db.txt2
-rw-r--r--db/re/item_db.conf276
-rw-r--r--db/re/job_db.conf28
-rw-r--r--db/re/mob_db.conf72
-rw-r--r--db/re/mob_skill_db.conf18
-rw-r--r--db/re/skill_db.conf162
-rw-r--r--db/re/skill_tree.conf2
-rw-r--r--maps/re/003-0-1.mcachebin220 -> 223 bytes
-rw-r--r--maps/re/017-10.mcachebin0 -> 411 bytes
-rw-r--r--npc/000-0-0/sailors.txt23
-rw-r--r--npc/000-0/sailors.txt4
-rw-r--r--npc/001-10/scripts.txt42
-rw-r--r--npc/001-7/celestia_bossfight.txt3
-rw-r--r--npc/002-1/juliet.txt3
-rw-r--r--npc/002-3/nard.txt12
-rw-r--r--npc/003-0-1/audsbel.txt185
-rw-r--r--npc/003-0/_import.txt1
-rw-r--r--npc/003-0/enzo.txt59
-rw-r--r--npc/003-0/luca.txt2
-rw-r--r--npc/003-0/notes6
-rw-r--r--npc/003-0/recepcionist.txt4
-rw-r--r--npc/003-1/ishi.txt16
-rw-r--r--npc/003-1/magic.txt2
-rw-r--r--npc/003-2/eistein.txt17
-rw-r--r--npc/003-2/lua.txt40
-rw-r--r--npc/003-3/malindou.txt19
-rw-r--r--npc/007-1/dracoula.txt1
-rw-r--r--npc/007-1/pylon.txt4
-rw-r--r--npc/007-1/tycoon.txt58
-rw-r--r--npc/008-0/master.txt1
-rw-r--r--npc/009-6/utils.txt62
-rw-r--r--npc/009-7/utils.txt62
-rw-r--r--npc/012-1/guards.txt4
-rw-r--r--npc/012-2/GonzoDark.txt52
-rw-r--r--npc/012-2/Saulc.txt52
-rw-r--r--npc/012-2/rakinorf.txt6
-rw-r--r--npc/012-7/celestia.txt2
-rw-r--r--npc/012-8/utils.txt68
-rw-r--r--npc/014-2/mouboo.txt4
-rw-r--r--npc/014-4/thorn.txt30
-rw-r--r--npc/014-5-1/sagratha.txt2
-rw-r--r--npc/014-5/blossom.txt31
-rw-r--r--npc/015-2/ben.txt1
-rw-r--r--npc/015-2/contrabandist.txt147
-rw-r--r--npc/016-6/_mobs.txt2
-rw-r--r--npc/017-1/_import.txt1
-rw-r--r--npc/017-1/misc.txt2
-rw-r--r--npc/017-1/townhall.txt63
-rw-r--r--npc/017-10/_import.txt4
-rw-r--r--npc/017-10/_warps.txt6
-rw-r--r--npc/017-10/dispatcher.txt404
-rw-r--r--npc/017-7/utils.txt69
-rw-r--r--npc/017-8/utils.txt69
-rw-r--r--npc/018-2-1/dustman.txt1
-rw-r--r--npc/018-2-2/main.txt3
-rw-r--r--npc/018-2-4/lv1.txt1
-rw-r--r--npc/018-2-4/lv2.txt1
-rw-r--r--npc/018-2-4/lv3.txt3
-rw-r--r--npc/018-2-4/lv4.txt1
-rw-r--r--npc/018-4-2/susanne.txt11
-rw-r--r--npc/020-5/bracco.txt25
-rw-r--r--npc/020-7-2/connor.txt6
-rw-r--r--npc/021-4/main.txt29
-rw-r--r--npc/022-1/sign.txt3
-rw-r--r--npc/024-13/manager.txt4
-rw-r--r--npc/024-14/doorbell.txt2
-rw-r--r--npc/024-14/utils.txt90
-rw-r--r--npc/024-15/lilanna.txt44
-rw-r--r--npc/_import.txt1
-rw-r--r--npc/boss/throne.txt4
-rw-r--r--npc/commands/exp.txt12
-rw-r--r--npc/commands/ipcheck.txt30
-rw-r--r--npc/commands/music.txt6
-rw-r--r--npc/craft/options.txt2
-rw-r--r--npc/craft/recipes.txt29
-rw-r--r--npc/craft/smith.txt14
-rw-r--r--npc/functions/clientversion.txt174
-rw-r--r--npc/functions/estate.txt170
-rw-r--r--npc/functions/estate2.txt275
-rw-r--r--npc/functions/fishing.txt14
-rw-r--r--npc/functions/gmbot.txt24
-rw-r--r--npc/functions/hub.txt15
-rw-r--r--npc/functions/main.txt7
-rw-r--r--npc/functions/math.txt4
-rw-r--r--npc/functions/mobpoint.txt5
-rw-r--r--npc/functions/news.txt11
-rw-r--r--npc/functions/refine.txt16
-rw-r--r--npc/functions/scoreboards.txt10
-rw-r--r--npc/functions/seasons.txt16
-rw-r--r--npc/functions/siege.txt5
-rw-r--r--npc/functions/treasure.txt4
-rw-r--r--npc/functions/util.txt53
-rw-r--r--npc/guilds/alchemy.txt1
-rw-r--r--npc/guilds/forge.txt1
-rw-r--r--npc/items/alcohol.txt11
-rw-r--r--npc/items/books.txt4
-rw-r--r--npc/items/legacy_heal.txt11
-rw-r--r--npc/items/lofteleporter.txt11
-rw-r--r--npc/items/rand_sc_heal.txt10
-rw-r--r--npc/items/shovel.txt2
-rw-r--r--npc/magic/mkpot.txt70
-rw-r--r--npc/magic/transmigration.txt321
-rw-r--r--npc/scripts.conf3
-rw-r--r--npc/soren-2/main.txt2
-rw-r--r--npc/soren/main.txt56
119 files changed, 2902 insertions, 1322 deletions
diff --git a/conf/atcommand.conf b/conf/atcommand.conf
index dbab7578b..169ae9035 100644
--- a/conf/atcommand.conf
+++ b/conf/atcommand.conf
@@ -70,6 +70,7 @@ aliases: {
nolog: {
iteminfo: 1
mobinfo: 1
+ hominfo: 1
time: 1
whereis: 1
whodrops: 1
@@ -85,6 +86,8 @@ nolog: {
who3: 1
users: 1
where: 1
+ homtalk: 1
+ pettalk: 1
hugo: 1
linus: 1
}
diff --git a/conf/groups.conf b/conf/groups.conf
index 3e63b5876..da7521fb4 100644
--- a/conf/groups.conf
+++ b/conf/groups.conf
@@ -105,6 +105,8 @@ groups: (
inherit: ( "Player" ) /* sponsors can do everything Players can and more */
level: 1
commands: {
+ hominfo: true
+ homtalk: true
pettalk: true
refresh: true
}
@@ -132,7 +134,7 @@ groups: (
whodrops: true
time: true
jailtime: true
- hominfo: true
+ hominfo: [true, true]
homstats: true
showexp: true
showzeny: true
diff --git a/conf/map/battle/battle.conf b/conf/map/battle/battle.conf
index 37913881c..5785d7df5 100644
--- a/conf/map/battle/battle.conf
+++ b/conf/map/battle/battle.conf
@@ -40,7 +40,7 @@ enable_perfect_flee: 1
// Who can have critical attacks? (Note 3)
// (Note that there are some skills that always do critical hit regardless of this)
-enable_critical: 28
+enable_critical: 27
// Critical adjustment rate for non-players (Note 2)
mob_critical_rate: 70
diff --git a/conf/map/battle/drops.conf b/conf/map/battle/drops.conf
index a251e111f..e5b667ec5 100644
--- a/conf/map/battle/drops.conf
+++ b/conf/map/battle/drops.conf
@@ -34,7 +34,7 @@
item_auto_get: false
// How long does it take for an item to disappear from the floor after it is dropped? (in milliseconds)
-flooritem_lifetime: 60000
+flooritem_lifetime: 180000
// Grace time during which only the person who did the most damage to a monster can get the item? (in milliseconds)
item_first_get_time: 5000
diff --git a/conf/map/battle/exp.conf b/conf/map/battle/exp.conf
index 2abd50540..d576d80bb 100644
--- a/conf/map/battle/exp.conf
+++ b/conf/map/battle/exp.conf
@@ -96,7 +96,7 @@ pvp_exp: true
death_penalty_type: 1
// Base exp. penalty rate (Each 100 is 1% of their exp)
-death_penalty_base: 724
+death_penalty_base: 624
// Job exp. penalty rate (Each 100 is 1% of their exp)
death_penalty_job: 298
diff --git a/conf/map/maps.conf b/conf/map/maps.conf
index 394d59d6f..58891b763 100644
--- a/conf/map/maps.conf
+++ b/conf/map/maps.conf
@@ -99,6 +99,7 @@ map_list: (
"016-6",
"016-7",
"017-1",
+ "017-10",
"017-2-1",
"017-2-2",
"017-2",
diff --git a/db/constants.conf b/db/constants.conf
index e9319f9db..c90f94094 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -695,7 +695,8 @@ constants_db: {
RC_Brute: 2
RC_Plant: 3
RC_Insect: 4
- RC_Fish: 5
+ //RC_Fish: 5
+ RC_Mineral: 5
RC_Demon: 6
RC_DemiHuman: 7
RC_Angel: 8
@@ -3814,7 +3815,7 @@ constants_db: {
INVENTORY_INCREASE_STEP: 10
// for disable warning
- ITMCHAIN_ORE: 1
+ //ITMCHAIN_ORE: 1
/* ==================================================== */
/** evol constants **/
@@ -4358,6 +4359,17 @@ constants_db: {
BS_SNEST9: 256
BS_SNESTALL: 511
+ comment__: "Homunculus deployment constants"
+ HCD_PIOUFIELDS: 1
+ HCD_HERBFIELDS: 2
+ HCD_OREMINES: 3
+ HCD_RAREMINES: 4
+ HCD_SLIMENEST: 5
+ HCD_SNAKEPIT: 6
+ HCD_DANGERAREA: 7
+ HCD_MKBASEMENT: 8
+ HCD_MARKET: 10
+
comment__: "Being actions"
ACTION_STAND: 0
ACTION_MOVE: 1
diff --git a/db/craft_db.conf b/db/craft_db.conf
index ef9231d76..81dadb061 100644
--- a/db/craft_db.conf
+++ b/db/craft_db.conf
@@ -124,6 +124,12 @@ craft_db: (
CreateItems:
(
{
+ StatusResetPotion: 2
+ },
+ {
+ StatusResetPotion: 1
+ },
+ {
StatusResetPotion: 1
},
)
@@ -144,7 +150,16 @@ craft_db: (
CreateItems:
(
{
- MoveSpeedPotion: 1
+ MoveSpeedPotion: 6
+ },
+ {
+ MoveSpeedPotion: 4
+ },
+ {
+ MoveSpeedPotion: 3
+ },
+ {
+ MoveSpeedPotion: 2
},
)
Priority: 10
@@ -164,6 +179,12 @@ craft_db: (
CreateItems:
(
{
+ PrecisionPotion: 2
+ },
+ {
+ PrecisionPotion: 2
+ },
+ {
PrecisionPotion: 1
},
)
@@ -184,6 +205,9 @@ craft_db: (
CreateItems:
(
{
+ DodgePotion: 2
+ },
+ {
DodgePotion: 1
},
)
@@ -594,7 +618,13 @@ craft_db: (
CreateItems:
(
{
- SacredLifePotion: 1
+ SacredLifePotion: 3
+ },
+ {
+ SacredLifePotion: 3
+ },
+ {
+ SacredLifePotion: 2
},
)
Priority: 10
@@ -615,7 +645,13 @@ craft_db: (
CreateItems:
(
{
- SacredManaPotion: 1
+ SacredManaPotion: 3
+ },
+ {
+ SacredManaPotion: 3
+ },
+ {
+ SacredManaPotion: 2
},
)
Priority: 10
@@ -1038,6 +1074,74 @@ craft_db: (
Priority: 20
},
/****************************************************************************/
+// ID 63 Priority 30 reserved for Kanabo or successor
+/****************************************************************************/
+// ID 64 Priority 40 reserved for Zambacutou or successor
+/****************************************************************************/
+{
+ Id: 65
+ Name: "CraftHalberd"
+ Flag: 16
+ ReturnCode: 3534
+ //Halberd
+ SourceItems:
+ (
+ {
+ SilverIngot: 45
+ TinIngot: 5
+ Coal: 34
+ EverburnPowder: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ TinIngot: 1
+ PileOfAsh: 2
+ },
+ {
+ TinIngot: 2
+ PileOfAsh: 1
+ },
+ {
+ PileOfAsh: 3
+ },
+ )
+ Priority: 50
+},
+/****************************************************************************/
+{
+ Id: 66
+ Name: "CraftImmortalSword"
+ Flag: 16
+ ReturnCode: 3532
+ //ImmortalSword
+ SourceItems:
+ (
+ {
+ SilverIngot: 40
+ PlatinumIngot: 2
+ IridiumIngot: 3
+ BlueManaPearl: 1
+ },
+ )
+ CreateItems:
+ (
+ {
+ SilverIngot: 1
+ PileOfAsh: 2
+ },
+ {
+ SilverIngot: 2
+ PileOfAsh: 1
+ },
+ {
+ PileOfAsh: 3
+ },
+ )
+ Priority: 50
+},
+/****************************************************************************/
// 51~71 → Swords
// 72~76 → Bows
@@ -1259,7 +1363,7 @@ craft_db: (
WoodenLog: 60
ManaPiouFeathers: 90
FluoPowder: 12
- GemPowder: 2
+ GemPowder: 1
},
)
CreateItems:
@@ -1290,7 +1394,7 @@ craft_db: (
WoodenLog: 100
ManaPiouFeathers: 120
FluoPowder: 15
- GemPowder: 3
+ GemPowder: 1
},
)
CreateItems:
@@ -1322,7 +1426,7 @@ craft_db: (
WoodenLog: 110
GoldenApple: 3
FluoPowder: 20
- GemPowder: 5
+ GemPowder: 1
},
)
CreateItems:
diff --git a/db/item_options.conf b/db/item_options.conf
index 750aecfc9..9eabad237 100644
--- a/db/item_options.conf
+++ b/db/item_options.conf
@@ -523,16 +523,18 @@ item_options_db: (
bonus2(bSubRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE));
">
},
+/*
{
Id: 92
Name: "RACE_TOLERACE_FISHS"
Script: <"
if (RENEWAL)
- bonus2(bAddRaceTolerance, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE));
+ bonus2(bAddRaceTolerance, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE));
else
- bonus2(bSubRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE));
+ bonus2(bSubRace, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE));
">
},
+*/
{
Id: 93
Name: "RACE_TOLERACE_DEVIL"
@@ -598,11 +600,13 @@ item_options_db: (
Name: "RACE_DAMAGE_INSECT"
Script: <" bonus2(bAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+/*
{
Id: 102
Name: "RACE_DAMAGE_FISHS"
- Script: <" bonus2(bAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+ Script: <" bonus2(bAddRace, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+*/
{
Id: 103
Name: "RACE_DAMAGE_DEVIL"
@@ -648,11 +652,13 @@ item_options_db: (
Name: "RACE_MDAMAGE_INSECT"
Script: <" bonus2(bMagicAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+/*
{
Id: 112
Name: "RACE_MDAMAGE_FISHS"
- Script: <" bonus2(bMagicAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+ Script: <" bonus2(bMagicAddRace, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+*/
{
Id: 113
Name: "RACE_MDAMAGE_DEVIL"
@@ -698,11 +704,13 @@ item_options_db: (
Name: "RACE_CRI_PERCENT_INSECT"
Script: <" bonus2(bCriticalAddRace, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
},
+/*
{
Id: 122
Name: "RACE_CRI_PERCENT_FISHS"
- Script: <" bonus2(bCriticalAddRace, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
+ Script: <" bonus2(bCriticalAddRace, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE) / 10); ">
},
+*/
{
Id: 123
Name: "RACE_CRI_PERCENT_DEVIL"
@@ -748,11 +756,13 @@ item_options_db: (
Name: "RACE_IGNORE_DEF_PERCENT_INSECT"
Script: <" bonus2(bIgnoreDefRate, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+/*
{
Id: 132
Name: "RACE_IGNORE_DEF_PERCENT_FISHS"
- Script: <" bonus2(bIgnoreDefRate, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+ Script: <" bonus2(bIgnoreDefRate, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+*/
{
Id: 133
Name: "RACE_IGNORE_DEF_PERCENT_DEVIL"
@@ -798,11 +808,13 @@ item_options_db: (
Name: "RACE_IGNORE_MDEF_PERCENT_INSECT"
Script: <" bonus2(bIgnoreMdefRate, RC_Insect, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+/*
{
Id: 142
Name: "RACE_IGNORE_MDEF_PERCENT_FISHS"
- Script: <" bonus2(bIgnoreMdefRate, RC_Fish, getequippedoptioninfo(IT_OPT_VALUE)); ">
+ Script: <" bonus2(bIgnoreMdefRate, RC_Mineral, getequippedoptioninfo(IT_OPT_VALUE)); ">
},
+*/
{
Id: 143
Name: "RACE_IGNORE_MDEF_PERCENT_DEVIL"
diff --git a/db/map_index.txt b/db/map_index.txt
index b3b921704..aacf197c5 100644
--- a/db/map_index.txt
+++ b/db/map_index.txt
@@ -96,79 +96,80 @@
016-6 96
016-7 97
017-1 98
-017-2-1 99
-017-2-2 100
-017-2 101
-017-3 102
-017-4 103
-017-5 104
-017-6 105
-017-7 106
-017-8 107
-018-1-1 108
-018-1 109
-018-2-1 110
-018-2-2 111
-018-2-3 112
-018-2-4 113
-018-2-5 114
-018-2 115
-018-3 116
-018-4-1 117
-018-4-2 118
-018-4 119
-018-5-0 120
-018-5-1 121
-018-5-2 122
-018-5-3 123
-018-5-boss 124
-018-5 125
-019-1-1 126
-019-1 127
-019-2 128
-019-3 129
-019-4-1 130
-019-4 131
-020-1 132
-020-2 133
-020-3 134
-020-4 135
-020-5 136
-020-6 137
-020-7-1 138
-020-7-2 139
-020-7 140
-021-1 141
-021-2 142
-021-3 143
-021-4 144
-022-1 145
-023-1 146
-023-2 147
-023-3-1 148
-023-3-2 149
-023-3 150
-024-1 151
-024-10 152
-024-11 153
-024-12 154
-024-13 155
-024-14 156
-024-15 157
-024-16 158
-024-2 159
-024-3 160
-024-4 161
-024-5 162
-024-6 163
-024-7 164
-024-8 165
-024-9 166
-boss 167
-botcheck 168
-guilds 169
-sec_pri 170
-soren-2 171
-soren 172
-test 173
-testbg 174
+017-10 99
+017-2-1 100
+017-2-2 101
+017-2 102
+017-3 103
+017-4 104
+017-5 105
+017-6 106
+017-7 107
+017-8 108
+018-1-1 109
+018-1 110
+018-2-1 111
+018-2-2 112
+018-2-3 113
+018-2-4 114
+018-2-5 115
+018-2 116
+018-3 117
+018-4-1 118
+018-4-2 119
+018-4 120
+018-5-0 121
+018-5-1 122
+018-5-2 123
+018-5-3 124
+018-5-boss 125
+018-5 126
+019-1-1 127
+019-1 128
+019-2 129
+019-3 130
+019-4-1 131
+019-4 132
+020-1 133
+020-2 134
+020-3 135
+020-4 136
+020-5 137
+020-6 138
+020-7-1 139
+020-7-2 140
+020-7 141
+021-1 142
+021-2 143
+021-3 144
+021-4 145
+022-1 146
+023-1 147
+023-2 148
+023-3-1 149
+023-3-2 150
+023-3 151
+024-1 152
+024-10 153
+024-11 154
+024-12 155
+024-13 156
+024-14 157
+024-15 158
+024-16 159
+024-2 160
+024-3 161
+024-4 162
+024-5 163
+024-6 164
+024-7 165
+024-8 166
+024-9 167
+boss 168
+botcheck 169
+guilds 170
+sec_pri 171
+soren-2 172
+soren 173
+test 174
+testbg 175
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 5614640b7..2e40442f4 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -309,6 +309,14 @@ quest_db: (
Id: 104
Name: "HurnscaldQuest_Sagratha"
},
+{
+ Id: 105
+ Name: "HurnscaldQuest_Blossom"
+},
+{
+ Id: 106
+ Name: "HurnscaldQuest_Thorn"
+},
// ID 111 to 130: Nivalis Quests
{
@@ -373,7 +381,11 @@ quest_db: (
Id: 193
Name: "MineQuest_Caelum"
},
-// 194~199: Overflow Quests (Unused)
+{
+ Id: 194
+ Name: "MineQuest_Pickaxe"
+},
+// 195~199: Overflow Quests (Unused)
{
Id: 200
Name: "General_MobHunting1"
diff --git a/db/re/exp_group_db.conf b/db/re/exp_group_db.conf
index 9873c0aa7..60d95d7ed 100644
--- a/db/re/exp_group_db.conf
+++ b/db/re/exp_group_db.conf
@@ -29,7 +29,7 @@
base_exp_group_db: {
EvolClasses: {
- MaxLevel: 150
+ MaxLevel: 90
Exp: [
9,16,25,36,77,112,153,200,253,320,
385,490,585,700,830,970,1120,1260,1420,1620,
@@ -39,7 +39,12 @@ base_exp_group_db: {
128692,142784,157528,178184,196300,215198,234879,255341,310188,365914,
402508,442769,487051,535756,589342,648281,713112,784421,862867,949158,
1044076,1148484,1263331,1389671,1528642,1681509,1849671,2034639,2238111,2461928,
- 2708132,2978946,3276840,3604530,3964987,4361495,4797656,5277432,5805184,6095442,
+ 2708132,2978946,3276840,3604530,3964987,4361495,4797656,5277432,5805184,
+ ]
+ }
+}
+/*
+ 6095442,
6400217,6720231,7056251,7409070,7779531,8168509,8576941,9005793,9456080,9928893,
10425342,10946613,11493946,12068655,12672087,13305690,13970980,14669530,15403013,16173172,
16981833,17830934,18722479,19658611,20641552,21673632,22757319,23895184,25089950,25591758,
@@ -196,7 +201,7 @@ base_exp_group_db: {
// These spaces are so EXP table starts at line 200, making easier to calc max level positions. Max level: 255
job_exp_group_db: {
EvolClasses: {
- MaxLevel: 60
+ MaxLevel: 70
Exp: [
5,12,20,30,42,93,153,207,270,342,
412,522,642,782,917,1072,1200,1368,1450,1668,
@@ -204,12 +209,12 @@ job_exp_group_db: {
17207,18772,20488,23050,24334,27812,30912,35330,36223,
39009,39935,40862,45974,49049,52318,53440,55664,59152,64088,
66657,71795,74558,75950,78762,85927,90448,92012,95193,99956,
+ 103297,106635,111719,117042,120708,128258,138129,146262,152627,154806,
]
}
}
/*
- 103297,106635,111719,117042,120708,128258,138129,146262,152627,154806,
163917,175629,182946,193120,198351,200965,203582,214303,219806,233553,
245239,248228,260651,273064,279564,292878,306829,320780,324386,335203,
338884,342571,346253,357430,365039,376452,388221,400356,404405,412504,
diff --git a/db/re/homunculus_db.txt b/db/re/homunculus_db.txt
index c72f5b8d8..01271cc4d 100644
--- a/db/re/homunculus_db.txt
+++ b/db/re/homunculus_db.txt
@@ -19,12 +19,12 @@
// NOTE: Only the growth values are in a 1/10 scale, the other stats are 1/1 (eg: 5 gmAGI means 0.5 agi)
// Class,EvoClass,Name,FoodID,HungryDelay,BaseSize,EvoSize,Race,Element,bASPD,bHP,bSP,bSTR,bAGI,bVIT,bINT,bDEX,bLUK,gnHP,gxHP,gnSP,gxSP,gnSTR,gxSTR,gnAGI,gxAGI,gnVIT,gxVIT,gnINT,gxINT,gnDEX,gxDEX,gnLUK,gxLUK,enHP,exHP,enSP,exSP,enSTR,exSTR,enAGI,exAGI,enVIT,exVIT,enINT,exINT,enDEX,exDEX,enLUK,exLUK
-6001,6001,Mage,502,300000,0,1,7,0,700,300,40,12,20,15,35,24,14,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6002,6002,Tanker,502,300000,0,1,7,0,700,300,40,20,15,35,24,14,12,45,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6003,6003,Agile,502,300000,0,1,7,0,700,300,40,15,35,24,14,12,20,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6004,6004,Strong,502,300000,0,1,7,0,700,300,40,35,24,14,12,20,15,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6005,6005,Lucky,502,300000,0,1,7,0,700,300,40,24,14,12,20,15,35,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6006,6006,Accurate,502,300000,0,1,7,0,700,300,40,14,12,20,15,35,24,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6007,6007,All Rounder,502,300000,0,1,7,0,700,300,40,20,20,20,20,20,20,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
-6008,6008,Superior Machine,502,300000,0,1,7,0,700,300,40,15,10,30,20,30,10,40,60,6,9,10,20,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6001,6001,Mage,502,300000,0,1,7,0,700,300,40,12,20,15,35,24,14,40,55,6,9,10,20,4,15,5,14,15,25,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6002,6002,Tanker,502,300000,0,1,7,0,700,300,40,20,15,35,24,14,12,45,60,6,9,10,20,4,15,15,25,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6003,6003,Agile,502,300000,0,1,7,0,700,300,40,15,35,24,14,12,20,40,60,6,9,10,20,14,25,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6004,6004,Strong,502,300000,0,1,7,0,700,300,40,35,24,14,12,20,15,40,60,6,9,20,30,4,15,5,15,5,15,5,15,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6005,6005,Lucky,502,300000,0,1,7,0,700,300,40,24,14,12,20,15,35,40,60,6,9,10,20,4,15,5,15,5,15,5,15,15,25,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6006,6006,Accurate,502,300000,0,1,7,0,700,300,40,14,12,20,15,35,24,40,60,6,9,10,20,4,15,5,15,5,15,15,25,5,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6007,6007,All Rounder,502,300000,0,1,7,0,700,300,40,20,20,20,20,20,20,40,60,6,9,15,20,8,15,10,15,10,15,10,15,10,15,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
+6008,6008,Superior Machine,502,300000,0,1,7,0,700,300,40,15,10,30,20,30,10,40,60,6,9,10,25,4,20,5,20,5,20,5,20,5,20,800,2400,220,480,10,30,30,50,20,40,20,40,10,30,10,20
diff --git a/db/re/item_chain.conf b/db/re/item_chain.conf
index 9d0026e4f..228c1192d 100644
--- a/db/re/item_chain.conf
+++ b/db/re/item_chain.conf
@@ -19,3 +19,26 @@
*/
+ITMCHAIN_ORE: {
+ Coal: 500
+ IronOre: 380
+ CopperOre: 250
+ SilverOre: 100
+ GoldOre: 80
+ TinOre: 67
+ LeadOre: 54
+ TitaniumOre: 35
+ IridiumOre: 10
+ PlatinumOre: 5
+}
+
+
+ITMCHAIN_HERB: {
+ ArtichokeHerb: 800
+ CobaltHerb: 400
+ GambogeHerb: 400
+ MauveHerb: 400
+ AlizarinHerb: 400
+ ShadowHerb: 100
+}
+
diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt
index 636753787..5ca1d3017 100644
--- a/db/re/item_combo_db.txt
+++ b/db/re/item_combo_db.txt
@@ -27,6 +27,8 @@
// Miner Set Bonus: +1 to all stats, Vit +2
// Shirt, Gloves, Hat and Knife
1338:2006:2991:3529,{bonus bAllStats,1;bonus bVit,2;}
+// Shirt, Gloves, Hat and Pickaxe: Luk +5 instead
+1338:2006:2991:3535,{bonus bAllStats,1;bonus bLuk,5;}
// Warlord Set
// Allstats +1, Blocking +2%
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index e7b288ba5..4f26faaac 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -322,7 +322,8 @@ item_db: (
ViewSprite: 508
UseEffect: "EFFECT_HEAL"
Script: <"
- sc_start SC_POISON, 30000, 0;
+ if (rand(10000) < 1000)
+ sc_start SC_POISON, 7000, 0;
@type = 1;
@rarity=2;
doevent "rand_sc_heal::OnUse";
@@ -1185,7 +1186,7 @@ item_db: (
Delay: 500
UseEffect: "EFFECT_HEAL"
Script: <"
- @delay = 30;
+ @delay = rand(30,90);
@type = 4;
@rarity=6;
doevent "rand_sc_heal::OnUse";
@@ -1492,7 +1493,11 @@ item_db: (
Script: <"
@type = 3;
@rarity=2;
- itemheal 0, rand(32,96);
+ .@val=rand(32,96);
+ // Re-roll
+ if (.@val > 64)
+ .@val=rand(32,96);
+ itemheal 0, .@val;
sc_start SC_ATTHASTE_POTION1, 10000, 3;
doevent "rand_sc_heal::OnUse";
">
@@ -1755,7 +1760,7 @@ item_db: (
noauction: true
}
Script: <"
- setarray .@r, StrangeCoin, StrangeCoin, CasinoCoins, IronIngot, SaxsoKey, GoldenApple, GoldenRing, GoldOre, PoisonAmmoBox, CursedAmmoBox, MercBoxA, SilverGift;
+ setarray .@r, StrangeCoin, StrangeCoin, CasinoCoins, IronIngot, SaxsoKey, GoldenApple, GoldenRing, GoldOre, PoisonAmmoBox, CursedAmmoBox, MercBoxA, AncientBlueprint, SilverGift;
.@n=rand(getarraysize(.@r));
if (.@n > 2)
@@ -1782,7 +1787,7 @@ item_db: (
noauction: true
}
Script: <"
- setarray .@r, StrangeCoin, StrangeCoin, IronIngot, CopperIngot, TinIngot, SilverIngot, GoldIngot, PlatinumOre, IridiumOre, TitaniumOre, LeadOre, FourLeafClover, MercBoxA, MercBoxB, GoldenGift, ThornAmmoBox, PoisonAmmoBox, PolishedDiamond, PolishedRuby, PolishedEmerald, PolishedSapphire, PolishedAmethyst, PolishedTopaz, SacredLifePotion, SacredManaPotion, ArcmageBoxset;
+ setarray .@r, StrangeCoin, StrangeCoin, IronIngot, CopperIngot, TinIngot, SilverIngot, GoldIngot, PlatinumOre, IridiumOre, TitaniumOre, LeadOre, FourLeafClover, MercBoxA, MercBoxB, GoldenGift, ThornAmmoBox, PoisonAmmoBox, PolishedDiamond, PolishedRuby, PolishedEmerald, PolishedSapphire, PolishedAmethyst, PolishedTopaz, SacredLifePotion, SacredManaPotion, AncientBlueprint, ArcmageBoxset;
.@n=rand(getarraysize(.@r));
if (.@n > 1)
@@ -1872,7 +1877,6 @@ item_db: (
@min = 180;
@max = 800;
@delay = 3;
- @type = 1;
doevent "legacy_heal::OnUse";
if (rand(1,7) != 4)
getitem EmptyBottle, 1;
@@ -2045,7 +2049,6 @@ item_db: (
@min = 18;
@max = 40;
@delay = 3;
- @type = 1;
doevent "legacy_heal::OnUse";
getitem EmptyBottle, 1;
">
@@ -2218,6 +2221,8 @@ item_db: (
$REFERRAL_IDS[#REFERRAL_PROG]=$REFERRAL_IDS[#REFERRAL_PROG]+1;
// I can't warrant this won't break stuff so I left commented out
//message(#REFERRAL_PROG, strcharinfo(0)+" accepted your invite to play TMW2.");
+ .@charid=callfunc("gf_charid", #REFERRAL_PROG);
+ rodex_sendmail(.@charid, "TMW2 Team", "Invite Accepted", strcharinfo(0)+" accepted your invite and got level 5!\nAs they get stronger, more rewards will be sent to you!", rand(25,50));
}
">
},
@@ -2776,7 +2781,7 @@ item_db: (
Script: <"
@min = 150;
@max = 150;
- @delay = 5;
+ @delay = rand(5,15);
@type = SC_WALKSPEED;
doevent "inc_sc_bonus::OnUse";
">
@@ -4276,7 +4281,7 @@ item_db: (
Name: "Iron Ingot"
Type: "IT_ETC"
Buy: 37500
- Sell: 924
+ Sell: 1680
Weight: 260
Refine: false
},
@@ -4286,7 +4291,7 @@ item_db: (
Name: "Iron Ore"
Type: "IT_ETC"
Buy: 500
- Sell: 180
+ Sell: 130
Weight: 40
Refine: false
},
@@ -4486,8 +4491,8 @@ item_db: (
AegisName: "GemPowder"
Name: "Gem powder"
Type: "IT_ETC"
- Buy: 1500
- Sell: 500
+ Buy: 18000
+ Sell: 6000
Weight: 20
Refine: false
},
@@ -4665,7 +4670,7 @@ item_db: (
Name: "Quill"
Type: "IT_ETC"
Buy: 10000
- Sell: 500
+ Sell: 2500
Weight: 20
Refine: false
ViewSprite: 810
@@ -5028,7 +5033,7 @@ item_db: (
Name: "Copper Ore"
Type: "IT_ETC"
Buy: 10000
- Sell: 300
+ Sell: 200
Weight: 1000
},
{
@@ -5037,7 +5042,7 @@ item_db: (
Name: "Lead Ore"
Type: "IT_ETC"
Buy: 11000
- Sell: 1000
+ Sell: 900
Weight: 1000
},
{
@@ -5046,7 +5051,7 @@ item_db: (
Name: "Tin Ore"
Type: "IT_ETC"
Buy: 9000
- Sell: 800
+ Sell: 750
Weight: 1000
},
{
@@ -5055,7 +5060,7 @@ item_db: (
Name: "Silver Ore"
Type: "IT_ETC"
Buy: 10000
- Sell: 600
+ Sell: 500
Weight: 1000
},
{
@@ -5073,7 +5078,7 @@ item_db: (
Name: "Platinum Ore"
Type: "IT_ETC"
Buy: 40000
- Sell: 5000
+ Sell: 6000
Weight: 1000
},
{
@@ -5091,7 +5096,7 @@ item_db: (
Name: "Titanium Ore"
Type: "IT_ETC"
Buy: 20000
- Sell: 3000
+ Sell: 1500
Weight: 1000
},
{
@@ -5100,7 +5105,7 @@ item_db: (
Name: "Copper Ingot"
Type: "IT_ETC"
Buy: 20000
- Sell: 500
+ Sell: 1500
Weight: 1000
},
{
@@ -5109,7 +5114,7 @@ item_db: (
Name: "Lead Ingot"
Type: "IT_ETC"
Buy: 22000
- Sell: 580
+ Sell: 3700
Weight: 1000
},
{
@@ -5118,7 +5123,7 @@ item_db: (
Name: "Tin Ingot"
Type: "IT_ETC"
Buy: 18000
- Sell: 560
+ Sell: 3900
Weight: 1000
},
{
@@ -5127,7 +5132,7 @@ item_db: (
Name: "Silver Ingot"
Type: "IT_ETC"
Buy: 20000
- Sell: 520
+ Sell: 2200
Weight: 1000
},
{
@@ -5136,7 +5141,7 @@ item_db: (
Name: "Gold Ingot"
Type: "IT_ETC"
Buy: 24000
- Sell: 540
+ Sell: 3000
Weight: 1000
},
{
@@ -5145,7 +5150,7 @@ item_db: (
Name: "Platinum Ingot"
Type: "IT_ETC"
Buy: 180000
- Sell: 10000
+ Sell: 19000
Weight: 1000
},
{
@@ -5153,8 +5158,8 @@ item_db: (
AegisName: "IridiumIngot"
Name: "Iridium Ingot"
Type: "IT_ETC"
- Buy: 20000
- Sell: 620
+ Buy: 100000
+ Sell: 17000
Weight: 1000
},
{
@@ -5163,7 +5168,7 @@ item_db: (
Name: "Titanium Ingot"
Type: "IT_ETC"
Buy: 20000
- Sell: 600
+ Sell: 6900
Weight: 1000
},
{
@@ -8889,6 +8894,22 @@ item_db: (
Refine: false
ViewSprite: 2719
},
+{
+ Id: 2720
+ AegisName: "EnchantedHerbBag"
+ Name: "Enchanted Herb Bag"
+ Type: "IT_ARMOR"
+ Buy: 5000
+ Sell: 800
+ Weight: 180
+ Def: 0
+ Loc: "EQP_HAND_L"
+ EquipLv: 1
+ Refine: false
+ Script: <"
+ bonus2 bAddMonsterDropChainItem,ITMCHAIN_HERB,RC_Plant;
+ ">
+},
// <!-- Head Gear -->
{
@@ -10551,6 +10572,9 @@ item_db: (
EquipLv: 40
Refine: false
ViewSprite: 3205
+ Script: <"
+ bonus2 bResEff,Eff_Blind,10;
+ ">
},
{
Id: 3206
@@ -10594,8 +10618,10 @@ item_db: (
Refine: false
ViewSprite: 3208
Script: <"
- if (getskilllv(TF_STEAL))
+ if (getskilllv(TF_STEAL)) {
addtoskill(TF_STEAL, 1, 2);
+ bonus bAddStealRate,10;
+ }
">
},
{
@@ -11218,6 +11244,7 @@ item_db: (
Sell: 32000
Weight: 1000
Atk: 132
+ Matk: 22
Range: 1
Loc: "EQP_HAND_R"
WeaponLv: 1
@@ -11244,6 +11271,7 @@ item_db: (
// [22:27:11] <{41444d494e}> bonus3 bAutoSpell,SKILLNAME,SKILLELVEL,PARAM1;
Script: <"
bonus3 bAutoSpell,SM_MAGNUM,1,100;
+ bonus bAtk, BaseLevel;
">
//DropAnnounce: true
},
@@ -11498,6 +11526,7 @@ item_db: (
Script: <"
bonus bCritical, 12;
bonus2 bAddEff,Eff_Blind,5;
+ bonus2 bAddMonsterDropChainItem,ITMCHAIN_ORE,RC_Mineral;
">
},
{
@@ -11663,6 +11692,152 @@ item_db: (
id5040: 1
}
},
+{
+ Id: 3532
+ AegisName: "ImmortalSword"
+ Name: "Immortal Heavy Sword"
+ Type: "IT_WEAPON"
+ Buy: 15000
+ Sell: 6500
+ Weight: 1600
+ Atk: 526
+ Matk: 50
+ Range: 1
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 96
+ Refine: true
+ Subtype: "W_2HMACE"
+ Slots: 1
+ AllowCards: {
+ id5022: 1
+ id5023: 1
+ id5024: 1
+ id5025: 1
+ id5026: 1
+ id5027: 1
+ id5028: 1
+ id5029: 1
+ id5037: 1
+ id5038: 1
+ id5039: 1
+ id5040: 1
+ }
+ Script: <"
+ bonus bAgi, -9;
+ bonus bDex, -9;
+ bonus bDef, -77;
+ bonus bCritical, 19;
+ ">
+},
+{
+ Id: 3533
+ AegisName: "Zambacutou"
+ Name: "Zambacutou Heavy Sword"
+ Type: "IT_WEAPON"
+ Buy: 15000
+ Sell: 6500
+ Weight: 1400
+ Atk: 477
+ Range: 1
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 72
+ Refine: true
+ Subtype: "W_2HMACE"
+ Slots: 1
+ AllowCards: {
+ id5022: 1
+ id5023: 1
+ id5024: 1
+ id5025: 1
+ id5026: 1
+ id5027: 1
+ id5028: 1
+ id5029: 1
+ id5037: 1
+ id5038: 1
+ id5039: 1
+ id5040: 1
+ }
+ Script: <"
+ bonus bAgi, -7;
+ bonus bDex, -7;
+ bonus bDef, -57;
+ bonus bCritical, 14;
+ ">
+},
+{
+ Id: 3534
+ AegisName: "Halberd"
+ Name: "Halberd"
+ Type: "IT_WEAPON"
+ Buy: 15000
+ Sell: 6500
+ Weight: 1500
+ Atk: 375
+ Range: 2
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 84
+ Refine: true
+ Subtype: "W_2HSPEAR"
+ Slots: 1
+ AllowCards: {
+ id5022: 1
+ id5023: 1
+ id5024: 1
+ id5025: 1
+ id5026: 1
+ id5027: 1
+ id5028: 1
+ id5029: 1
+ id5037: 1
+ id5038: 1
+ id5039: 1
+ id5040: 1
+ }
+ Script: <"
+ bonus bAgi, -8;
+ bonus bDex, -8;
+ bonus bDef, -67;
+ bonus bCritical, 16;
+ ">
+},
+{
+ Id: 3535
+ AegisName: "Pickaxe"
+ Name: "Pickaxe"
+ Type: "IT_WEAPON"
+ Buy: 2000
+ Sell: 650
+ Weight: 360
+ Atk: 0
+ Range: 1
+ Loc: ["EQP_HAND_R", "EQP_HAND_L"]
+ WeaponLv: 1
+ EquipLv: 1
+ Refine: true
+ Subtype: "W_2HSPEAR"
+ Slots: 1
+ AllowCards: {
+ id5022: 1
+ id5023: 1
+ id5024: 1
+ id5025: 1
+ id5026: 1
+ id5027: 1
+ id5028: 1
+ id5029: 1
+ id5037: 1
+ id5038: 1
+ id5039: 1
+ id5040: 1
+ }
+ Script: <"
+ bonus2 bAddMonsterDropChainItem,ITMCHAIN_ORE,RC_Mineral;
+ ">
+},
// Insert new weapons above this line
// ID 3600 to 3610 SYSTEM RESERVED FOR LEGENDARY WEAPONS
{
@@ -11850,7 +12025,7 @@ item_db: (
Buy: 9999999
Sell: 0
Weight: 3000
- Range: 1
+ Range: 9
Loc: ["EQP_HAND_R", "EQP_HAND_L"]
WeaponLv: 1
EquipLv: 1
@@ -11941,6 +12116,7 @@ item_db: (
// Will always be higher than shields (except Savior shield at right level)
// However, it comes at an expensive price.
bonus bDef,BaseLevel*2;
+ bonus bMaxHP, JobLevel*5; // Why not, if you're the ultimate tanker?
bonus bAtkRate,-100;
bonus bMatkRate,-100;
bonus bRestartFullRecover,1;
@@ -12582,8 +12758,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12627,8 +12803,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12671,8 +12847,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12716,8 +12892,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12761,8 +12937,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12806,8 +12982,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bFleeRate,-100;
@@ -12851,8 +13027,8 @@ item_db: (
Id6504: 1
Id6505: 1
Id6506: 1
- Id6507: 1
- Id6508: 1
+ Id6507: 1
+ Id6508: 1
}
Script: <"
bonus bHPDrainValue,-15;
@@ -13242,7 +13418,7 @@ item_db: (
}
ViewSprite: 7000
Script: <"
- bonus bAttack2,-100;
+ //bonus bAttack2,-100;
bonus bMaxSP,10;
bonus bSPrecovRate,20;
">
@@ -13280,7 +13456,7 @@ item_db: (
}
ViewSprite: 7001
Script: <"
- bonus bAttack2,-150;
+ //bonus bAttack2,-150;
bonus bMaxSP,20;
bonus bSPrecovRate,20;
">
@@ -13318,7 +13494,7 @@ item_db: (
}
ViewSprite: 7002
Script: <"
- bonus bAttack2,-200;
+ //bonus bAttack2,-200;
bonus bMaxSP,30;
bonus bSPrecovRate,20;
">
@@ -13356,7 +13532,7 @@ item_db: (
}
ViewSprite: 7003
Script: <"
- bonus bAttack2,-250;
+ //bonus bAttack2,-250;
bonus bMaxSP,40;
bonus bSPrecovRate,20;
">
@@ -13394,7 +13570,7 @@ item_db: (
}
ViewSprite: 7004
Script: <"
- bonus bAttack2,-300;
+ //bonus bAttack2,-300;
bonus bMaxSP,50;
bonus bSPrecovRate,20;
">
@@ -13432,7 +13608,7 @@ item_db: (
}
ViewSprite: 7005
Script: <"
- bonus bAttack2,-125;
+ //bonus bAttack2,-125;
bonus bMaxSP,25;
bonus bSPrecovRate,20;
">
diff --git a/db/re/job_db.conf b/db/re/job_db.conf
index 730fac2b7..76e8f7bd3 100644
--- a/db/re/job_db.conf
+++ b/db/re/job_db.conf
@@ -64,8 +64,8 @@ Human: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
@@ -121,8 +121,8 @@ Ukar: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
@@ -148,8 +148,8 @@ Redy: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
@@ -175,8 +175,8 @@ Elven: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 75
}
InheritHP: ( "Human" );
@@ -196,8 +196,8 @@ Orc: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
@@ -223,8 +223,8 @@ Raijin: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
@@ -250,8 +250,8 @@ Tritan: {
Mace: 50
TwoHandMace: 75
TwoHandSpear: 67
- Rod: 70
- TwoHandRod: 70
+ Rod: 92
+ TwoHandRod: 92
Bow: 90
Knuckle: 20
Katar: 45
diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf
index 78b83a67f..18432d742 100644
--- a/db/re/mob_db.conf
+++ b/db/re/mob_db.conf
@@ -242,6 +242,7 @@ mob_db: (
Hp: 500
Sp: 0
Exp: 9
+ JExp: 1
AttackRange: 1
Attack: [81, 83]
Def: 13
@@ -285,6 +286,7 @@ mob_db: (
Hp: 1900
Sp: 0
Exp: 18
+ JExp: 1
AttackRange: 1
Attack: [124, 129]
Def: 54
@@ -748,7 +750,7 @@ mob_db: (
SpriteName: "Dummy"
Name: "Dummy"
Lv: 1
- Hp: 20
+ Hp: 15
Sp: 0
Exp: 4
AttackRange: 1
@@ -1348,7 +1350,7 @@ mob_db: (
DamageMotion: 200
Drops: {
CaveSnakeLamp: 900
- CaveSnakeTongue: 400
+ CaveSnakeTongue: 500
CaveSnakeEgg: 400
CaveSnakeEgg: 100
CaveSnakeSkin: 41
@@ -2065,7 +2067,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -2166,6 +2168,8 @@ mob_db: (
DamageMotion: 200
Drops: {
ChocolateBiscuit: 800
+ Coal: 500
+ LeadOre: 400
DarkEggshellHat: 2
}
},
@@ -3304,7 +3308,7 @@ mob_db: (
Hp: 860
Sp: 0
Exp: 12
- JExp: 3
+ JExp: 0
AttackRange: 1
Attack: [30, 350]
Def: 12
@@ -3869,6 +3873,7 @@ mob_db: (
CasinoCoins: 444
IronOre: 300
CasinoCoins: 222
+ MinerHat: 18
LavaManaPearl: 1
}
WeaponAttacks: {
@@ -3897,7 +3902,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -3935,7 +3940,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -3974,7 +3979,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4013,7 +4018,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4051,7 +4056,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4090,7 +4095,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4129,7 +4134,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4167,7 +4172,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4206,7 +4211,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4245,7 +4250,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4283,7 +4288,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4322,7 +4327,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4361,7 +4366,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4399,7 +4404,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4438,7 +4443,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4477,7 +4482,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4515,7 +4520,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4554,7 +4559,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4593,7 +4598,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4632,7 +4637,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -4671,7 +4676,7 @@ mob_db: (
Luk: 1
}
ChaseRange: 12
- Race: 3
+ Race: 5
Element: (2, 1)
Mode: {
Plant: true
@@ -6836,7 +6841,7 @@ mob_db: (
Drops: {
HastePotion: 2500
StrengthPotion: 2500
- ArcmageBoxset: 100
+ DragonScales: 2000
DragonStar: 2
WarlordHelmet: 1
WarlordPlate: 1
@@ -7605,6 +7610,7 @@ mob_db: (
Coal: 3000
IronOre: 1000
Ruby: 100
+ MinerHat: 12
}
},
// ok
@@ -7713,7 +7719,7 @@ mob_db: (
SpriteName: "MonsterKing"
Name: "The Monster King"
Lv: 150
- Hp: 58713
+ Hp: 108713
Sp: 1665
Exp: 65000
JExp: 2100
@@ -8818,6 +8824,7 @@ mob_db: (
}
},
+// WARNING: ID 1250~1400 PERMANENTLY RESERVED - USE PROHIBTED
// Reserved
{
Id: 1495
@@ -8861,7 +8868,7 @@ mob_db: (
Drops: {
HastePotion: 500
StrengthPotion: 500
- ArcmageBoxset: 100
+ ArcmageBoxset: 200
}
WeaponAttacks: {
All: 8000
@@ -8907,7 +8914,7 @@ mob_db: (
AttackMotion: 672
DamageMotion: 480
Drops: {
- ArcmageBoxset: 500
+ ArcmageBoxset: 1000
HastePotion: 500
StrengthPotion: 500
}
@@ -8955,7 +8962,7 @@ mob_db: (
AttackMotion: 672
DamageMotion: 480
Drops: {
- ArcmageBoxset: 1000
+ ArcmageBoxset: 2000
HastePotion: 500
StrengthPotion: 500
}
@@ -9003,7 +9010,7 @@ mob_db: (
AttackMotion: 672
DamageMotion: 480
Drops: {
- ArcmageBoxset: 1750
+ ArcmageBoxset: 3500
HastePotion: 500
StrengthPotion: 500
}
@@ -9051,7 +9058,7 @@ mob_db: (
AttackMotion: 672
DamageMotion: 480
Drops: {
- ArcmageBoxset: 2250
+ ArcmageBoxset: 4500
HastePotion: 500
StrengthPotion: 500
}
@@ -9100,4 +9107,5 @@ mob_db: (
StrangeCoin: 1
}
},
+// WARNING: ID 1900~2500 PERMANENTLY RESERVED - USE PROHIBTED
)
diff --git a/db/re/mob_skill_db.conf b/db/re/mob_skill_db.conf
index faf304290..018bacd2c 100644
--- a/db/re/mob_skill_db.conf
+++ b/db/re/mob_skill_db.conf
@@ -728,7 +728,7 @@ SKILL_COND2 = {
SkillLevel: 2
Rate: 10000
CastTime: 2000
- Delay: 90000
+ Delay: 180000
Cancelable: false
SkillTarget: "MST_SELF"
CastCondition: "MSC_LONGRANGEATTACKED"
@@ -997,7 +997,7 @@ SKILL_COND2 = {
MonsterKing: {
NPC_SUMMONSLAVE: {
SkillState: "MSS_ANYTARGET"
- SkillLevel: 1
+ SkillLevel: 5
Rate: 10000
CastTime: 10000
Delay: 180000
@@ -1021,14 +1021,14 @@ SKILL_COND2 = {
}
NPC_SUMMONSLAVE: {
SkillState: "MSS_ANYTARGET"
- SkillLevel: 1
+ SkillLevel: 3
Rate: 9000
CastTime: 200
- Delay: 6000
+ Delay: 60000
Cancelable: true
SkillTarget: "MST_SELF"
CastCondition: "MSC_MYHPLTMAXRATE"
- ConditionData: 80
+ ConditionData: 70
val0: 1064
}
SM_BASH: {
@@ -1052,10 +1052,10 @@ SKILL_COND2 = {
}
NPC_SUMMONSLAVE: {
SkillState: "MSS_ANYTARGET"
- SkillLevel: 1
+ SkillLevel: 4
Rate: 8000
CastTime: 200
- Delay: 6000
+ Delay: 60000
Cancelable: true
SkillTarget: "MST_SELF"
CastCondition: "MSC_ALWAYS"
@@ -1063,10 +1063,10 @@ SKILL_COND2 = {
}
NPC_SUMMONSLAVE: {
SkillState: "MSS_ANYTARGET"
- SkillLevel: 1
+ SkillLevel: 3
Rate: 8000
CastTime: 200
- Delay: 6000
+ Delay: 60000
Cancelable: true
SkillTarget: "MST_SELF"
CastCondition: "MSC_ALWAYS"
diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf
index acfd0c5ef..8dd019385 100644
--- a/db/re/skill_db.conf
+++ b/db/re/skill_db.conf
@@ -886,16 +886,16 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 125
- Lv3: 150
- Lv4: 175
- Lv5: 200
- Lv6: 250
- Lv7: 300
- Lv8: 350
- Lv9: 400
- Lv10: 450
+ Lv1: 80
+ Lv2: 100
+ Lv3: 120
+ Lv4: 145
+ Lv5: 160
+ Lv6: 180
+ Lv7: 200
+ Lv8: 220
+ Lv9: 240
+ Lv10: 250
}
}
},
@@ -911,44 +911,44 @@ skill_db: (
}
AttackType: "Magic"
Element: "Ele_Nature"
- InterruptCast: true
+ InterruptCast: false
SkillInstances: 3
KnockBackTiles: 2
CastTime: {
- Lv1: 1600
- Lv2: 1440
- Lv3: 1280
- Lv4: 1120
- Lv5: 960
- Lv6: 880
- Lv7: 800
- Lv8: 720
- Lv9: 640
- Lv10: 560
+ Lv1: 1300
+ Lv2: 1140
+ Lv3: 1080
+ Lv4: 920
+ Lv5: 860
+ Lv6: 780
+ Lv7: 600
+ Lv8: 520
+ Lv9: 440
+ Lv10: 360
}
SkillData1: {
- Lv1: 5000
- Lv2: 6000
- Lv3: 7000
- Lv4: 8000
- Lv5: 9000
- Lv6: 10000
- Lv7: 11000
- Lv8: 12000
- Lv9: 13000
- Lv10: 14000
+ Lv1: 7500
+ Lv2: 10000
+ Lv3: 12000
+ Lv4: 14000
+ Lv5: 16000
+ Lv6: 18000
+ Lv7: 20000
+ Lv8: 22000
+ Lv9: 24000
+ Lv10: 26000
}
FixedCastTime: {
- Lv1: 400
- Lv2: 360
- Lv3: 320
- Lv4: 280
- Lv5: 240
- Lv6: 220
- Lv7: 200
- Lv8: 180
- Lv9: 160
- Lv10: 140
+ Lv1: 300
+ Lv2: 260
+ Lv3: 220
+ Lv4: 180
+ Lv5: 140
+ Lv6: 120
+ Lv7: 100
+ Lv8: 80
+ Lv9: 60
+ Lv10: 40
}
Requirements: {
SPCost: 140
@@ -1052,15 +1052,15 @@ skill_db: (
AttackType: "Magic"
Element: "Ele_Wind"
NumberOfHits: {
- Lv1: 1
- Lv2: 2
- Lv3: 3
- Lv4: 4
- Lv5: 5
- Lv6: 6
- Lv7: 7
- Lv8: 8
- Lv9: 9
+ Lv1: 2
+ Lv2: 3
+ Lv3: 4
+ Lv4: 5
+ Lv5: 6
+ Lv6: 7
+ Lv7: 8
+ Lv8: 9
+ Lv9: 10
Lv10: 10
}
InterruptCast: true
@@ -1966,7 +1966,7 @@ skill_db: (
NoDamage: true
}
Requirements: {
- SPCost: 30
+ SPCost: 15
}
},
{
@@ -3411,9 +3411,10 @@ skill_db: (
Name: "WZ_FROSTNOVA"
Description: "Frost Nova"
MaxLevel: 10
+ Range: 9
Hit: "BDT_SKILL"
SkillType: {
- Self: true
+ Place: true
}
AttackType: "Magic"
Element: "Ele_Water"
@@ -11062,9 +11063,9 @@ skill_db: (
}
Requirements: {
SPCost: {
- Lv1: 44
- Lv2: 58
- Lv3: 72
+ Lv1: 24
+ Lv2: 38
+ Lv3: 52
Lv4: 86
Lv5: 100
Lv6: 114
@@ -12400,16 +12401,16 @@ skill_db: (
FixedCastTime: 350
Requirements: {
SPCost: {
- Lv1: 100
- Lv2: 120
- Lv3: 140
- Lv4: 160
- Lv5: 180
- Lv6: 200
- Lv7: 220
- Lv8: 240
- Lv9: 260
- Lv10: 280
+ Lv1: 95
+ Lv2: 100
+ Lv3: 110
+ Lv4: 120
+ Lv5: 130
+ Lv6: 140
+ Lv7: 150
+ Lv8: 160
+ Lv9: 170
+ Lv10: 180
}
}
},
@@ -28107,6 +28108,18 @@ skill_db: (
Lv10: 26
}
CastTime: 1000
+ CoolDown: {
+ Lv1: 10000
+ Lv2: 13000
+ Lv3: 16000
+ Lv4: 19000
+ Lv5: 20000
+ Lv6: 20000
+ Lv7: 20000
+ Lv8: 20000
+ Lv9: 20000
+ Lv10: 20000
+ }
AfterCastActDelay: 1000
SkillData1: 12000
FixedCastTime: -1
@@ -28126,7 +28139,7 @@ skill_db: (
}
Unit: {
Id: 0xdc
- Interval: 300
+ Interval: 500
Target: "Enemy"
Flag: {
UF_NOREITERATION: true
@@ -34286,7 +34299,18 @@ skill_db: (
}
FixedCastTime: -1
Requirements: {
- SPCost: 120
+ SPCost: {
+ Lv1: 80
+ Lv2: 120
+ Lv3: 150
+ Lv4: 200
+ Lv5: 220
+ Lv6: 240
+ Lv7: 260
+ Lv8: 280
+ Lv9: 300
+ Lv10: 400
+ }
}
},
{
@@ -38520,8 +38544,8 @@ skill_db: (
},
{
Id: 20027
- Name: "TMW2_MKPOT"
- Description: "Make Potion"
+ Name: "TMW2_TRANSMIGRATION"
+ Description: "Transmutation"
MaxLevel: 20
SkillType: {
Self: true
diff --git a/db/re/skill_tree.conf b/db/re/skill_tree.conf
index 4bd4d4793..62a80a57f 100644
--- a/db/re/skill_tree.conf
+++ b/db/re/skill_tree.conf
@@ -47,7 +47,7 @@ Human: {
TMW2_ZARKOR: 3
TMW2_PARUM: 0
TMW2_KALMURK: 4
- TMW2_MKPOT: 20
+ TMW2_TRANSMIGRATION: 10
TMW2_DEMURE: 15
TMW2_DRAGOKIN: 5
TMW2_LIMERIZER: 5
diff --git a/maps/re/003-0-1.mcache b/maps/re/003-0-1.mcache
index 4eba6370b..c76805edf 100644
--- a/maps/re/003-0-1.mcache
+++ b/maps/re/003-0-1.mcache
Binary files differ
diff --git a/maps/re/017-10.mcache b/maps/re/017-10.mcache
new file mode 100644
index 000000000..84c823ec1
--- /dev/null
+++ b/maps/re/017-10.mcache
Binary files differ
diff --git a/npc/000-0-0/sailors.txt b/npc/000-0-0/sailors.txt
index cbc99e968..793c76282 100644
--- a/npc/000-0-0/sailors.txt
+++ b/npc/000-0-0/sailors.txt
@@ -133,6 +133,7 @@ L_Step4:
l("T.T \"Someone else killed my Dummy!\""),
l("'.' \"I forgot how to allocate status!\""),
l("-.- \"I forgot how to fight!\""),
+ l("._. \"What are these status useful for?\""),
l("^.^ \"Nothing is wrong, don't worry!\"");
mes "";
@@ -178,6 +179,28 @@ L_Step4:
mesn "Elmo";
mesq l("Another way to attack it is clicking on it.");
break;
+ case 5:
+ mesn "Elmo";
+ mes l("@@ helps you carry more items and also gives you a more forceful blow, but ends up not being very interesting if you focus on weapons that use projectiles, such as the bow.", b(l("Strength")));
+ next;
+ mesn "Elmo";
+ mes l("Greater @@ allows you to attack faster and has a greater chance of evading attacks.", b(l("agility")));
+ next;
+ mesn "Elmo";
+ mes l("@@ determines how many blows you can take before you die. It also affects status effects, like poison.", b(l("Vitality")));
+ next;
+ mesn "Elmo";
+ mes l("@@ is very useful for alchemy and magic, but nowadays there are few opportunities to use it.", b(l("Intelligence")));
+ next;
+ mesn "Elmo";
+ mes l("Your @@ determines your ability to hit monsters and is valuable to players who prefer weapons that use projectiles.", b(l("dexterity")));
+ next;
+ mesn "Elmo";
+ mes l("Your @@ determines several small things, including critical attacks and, limited to a certain extent, affect drop rates.", b(l("luck")));
+ next;
+ mesn "Elmo";
+ mes l("But to defeat this dummy, I would say that %s should do the trick.", b(l("assigning 5 points to str, agi, dex and luck")));
+ break;
}
close;
diff --git a/npc/000-0/sailors.txt b/npc/000-0/sailors.txt
index c50f687b9..de33b9d59 100644
--- a/npc/000-0/sailors.txt
+++ b/npc/000-0/sailors.txt
@@ -87,9 +87,7 @@ OnTouch:
l("(Don't respond)");
mes "";
- Karma=100;
if (@menu == 1) {
- Karma=Karma-1;
mesn l("Sailor");
mesq l("What do you mean? Do you at least have a rowboat with you?!");
next;
@@ -97,7 +95,7 @@ OnTouch:
mesq l("We can't let you die from hunger! That wouldn't be cool at all! And I'm very cool!");
next;
} else if (@menu == 2) {
- Karma=Karma+1;
+ mes ""; // You don't need to thank us!
} else {
mesn l("Sailor");
mesq lg("Oh noes! She fainted! Quick, rescue her!!", "Oh noes! He fainted! Quick, rescue him!!");
diff --git a/npc/001-10/scripts.txt b/npc/001-10/scripts.txt
index f06a6abb8..305b29887 100644
--- a/npc/001-10/scripts.txt
+++ b/npc/001-10/scripts.txt
@@ -72,44 +72,58 @@ OnTouch:
// Death handlers
OnWLDeath:
- if (rand(0,1000) <= 20)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 20)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnWLDeath", 0, 0, 200, 150, 1, 1);
end;
OnNDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnNDeath", 0, 10, 200, 25);
end;
OnSDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnSDeath", 0, 129, 200, 150);
end;
OnCDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnCDeath", 73, 45, 132, 86);
end;
OnWDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnWDeath", 10, 25, 72, 122);
end;
OnEDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnEDeath", 160, 45, 190, 130);
end;
OnDeath:
- if (rand(0,1000) <= 40)
- getitem BottledDust, 1;
+ if (playerattached()) {
+ if (rand2(0,1000) <= 40)
+ getitem BottledDust, 1;
+ }
spawner("#CODMASTER::OnDeath");
end;
diff --git a/npc/001-7/celestia_bossfight.txt b/npc/001-7/celestia_bossfight.txt
index cd2a45d4f..6ea951075 100644
--- a/npc/001-7/celestia_bossfight.txt
+++ b/npc/001-7/celestia_bossfight.txt
@@ -35,12 +35,11 @@ L_Survivor:
$YETIKING_WINNER$=strcharinfo(0);
channelmes("#world", $YETIKING_WINNER$+" is the first player to finish Yeti King Quest!! GG, dude! %%N");
announce "All hail ##B"+$YETIKING_WINNER$+"##b, first to complete the ##3Yeti King Quest!", bc_all|bc_npc;
- Karma=Karma+1;
getexp 0, 2000;
getitembound Runestaff, 1, 1;
getitem PrismGift, 1;
mesc l("CONGRATULATIONS! You are the first player to finish Yeti King quest!!"), 2;
- mesc l("You just gained a Karma point, a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
+ mesc l("You just gained a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
next;
}
mesn col(l("The Yeti King"), 3);
diff --git a/npc/002-1/juliet.txt b/npc/002-1/juliet.txt
index 2507d8064..d51254c36 100644
--- a/npc/002-1/juliet.txt
+++ b/npc/002-1/juliet.txt
@@ -193,5 +193,6 @@ OnInit:
sellitem Cheese;
sellitem Aquada;
sellitem Piberries;
-
+ sellitem Bread;
+ end;
}
diff --git a/npc/002-3/nard.txt b/npc/002-3/nard.txt
index ce0e513f2..f4b08c1cf 100644
--- a/npc/002-3/nard.txt
+++ b/npc/002-3/nard.txt
@@ -78,7 +78,7 @@ L_Checker:
mesn;
mesq l("The Alliance can help you in finding out about who you are, why you are here, or from where you came from. So, about the tasks I want completed.");
next;
- .@price=1200;
+ .@price=800;
mesc b(l(".:: Main Quest 1-3 ::.")), 3;
msObjective(getq(CandorQuest_HAS) >= 4, l("* Help Ayasha to take care of the kids."));
msObjective(getq(CandorQuest_Trainer) >= 12, l("* Get trained by Valon, in the big house."));
@@ -152,7 +152,7 @@ L_CandorIsland:
goto L_NotYet;
L_NotYet:
- .@price=1200;
+ .@price=800;
mesc b(l(".:: Main Quest 1-1 ::.")), 3;
msObjective(getq(CandorQuest_HAS) >= 4, l("* Help Ayasha to take care of the kids."));
msObjective(getq(CandorQuest_Trainer) >= 12, l("* Get trained by Valon, in the big house."));
@@ -179,6 +179,14 @@ L_NotYet:
mesc l("NOTE: It is possible to play the game as a crafter/merchant/fisherman, avoiding to kill as much as possible. However, it is not possible to play the game with a total kill count of zero.");
close;
}
+ // If you did less than 50% Candor quests, please be warned.
+ if (reputation("Candor") < 50) {
+ mesc l("WARNING: You have done less than 50% of Candor Quests!"), 1;
+ mesc l("It may be expensive to return here. Are you sure?"), 1;
+ next;
+ if (askyesno() == ASK_NO)
+ close;
+ }
if (Zeny >= .@price) {
inventoryplace TulimMap, 1;
mesq l("Ten, fifty, thousand... Yep, this is the amount I've asked for.");
diff --git a/npc/003-0-1/audsbel.txt b/npc/003-0-1/audsbel.txt
index 8964202ad..04e88dee0 100644
--- a/npc/003-0-1/audsbel.txt
+++ b/npc/003-0-1/audsbel.txt
@@ -3,7 +3,7 @@
// Jesusalva
// Description:
// One of the Mana Magic Leaders
-// Planned, there are only the four Mana Wizards: Auldsbel (Tulimshar), Sagratha (Woodlands), Morgan (Candor), Blue Sage (Nivalis), Lalica (LoF).
+// Planned, there are only the five Mana Wizards: Auldsbel (Tulimshar), Sagratha (Woodlands), Morgan (Candor), Blue Sage (Nivalis), Lalica (LoF).
// Gives #parum
// Gives #mkpot
@@ -250,13 +250,13 @@ L_Magic:
mesn;
mesq l("Hmm, I think I can teach you a basic Mana Skill now. This one is more advanced, though.");
next;
- skill(TMW2_MKPOT,1,0);
+ skill(TMW2_TRANSMIGRATION,1,0);
setq General_Auldsbel, 5;
mesn;
- mesq l("This is the @@ skill. It transmutes @@ @@ and a single @@ in @@.", "##B@sk-mkpot##b", 10, getitemlink(Plushroom), getitemlink(Milk), getitemlink(HastePotion));
+ mesq l("This is the @@ skill. It transmutes stuff into other stuff. I'll teach you some more recipes as class drag on.", "##B@sk-trans##b");
next;
mesn;
- mesq l("It may fail, and you might end up with something entirely unexpected!");
+ mesq l("It may fail, and you might end up with something entirely unexpected, or nothing at all!");
next;
mesn;
mesq l("Unlike Parum, you can use the skill points you get every time your job level rises. That will lower the mana cost and increase success chances.");
@@ -267,6 +267,180 @@ L_Magic:
mesn;
mesq l("Also, job levels get really hard to obtain after a while. The decision is up to you, just be aware there's that possibility.");
break;
+ // Help on research to gain his favor
+ case 5:
+ mesn;
+ mesq l("Well, I decided to resume an old research of mine, now that I have a minion (you) to gather stuff for me.");
+ next;
+ mesn;
+ mesq l("Now please be a good helper, and aid me by bringing:");
+ mesc l("* @@/@@ @@", countitem(HastePotion), 10, getitemlink(HastePotion));
+ mesc l("* @@/@@ @@", countitem(StrengthPotion), 10, getitemlink(StrengthPotion));
+ mesc l("* @@/@@ @@", countitem(HerbalTea), 10, getitemlink(HerbalTea));
+ mesc l("* @@/@@ @@", countitem(RedScorpionStinger), 25, getitemlink(RedScorpionStinger));
+ mesc l("* @@/@@ @@", countitem(SilkCocoon), 100, getitemlink(SilkCocoon));
+ next;
+ select
+ l("I'll try to find them."),
+ l("I actually have them, here.");
+ if (@menu == 2) {
+ mes "";
+ mesn;
+ mesq l("Excellent! Let me see...");
+ next;
+ if (!transcheck(
+ HastePotion, 10,
+ StrengthPotion, 10,
+ HerbalTea, 10,
+ RedScorpionStinger, 25,
+ SilkCocoon, 100))
+ goto L_Lie;
+ getexp 7500, 0;
+ Zeny=Zeny+1250;
+ setq General_Auldsbel, 6;
+ mesn;
+ mesq l("Thanks. I'm actually conducting experiments with scorpions. Please come back later.");
+ mesc l("Gained 7500 XP and 1250 GP");
+ }
+ break;
+ // Learn transmigration: Scorpion Stinger and Claw
+ case 6:
+ if (MAGIC_LVL < 2)
+ goto L_Magicless;
+ mesn;
+ mesq l("Well, I'm currently researching scorpions, as you can imagine.");
+ next;
+ setq General_Auldsbel, 7;
+ mesn;
+ mesq l("I'll teach you how to transmute some parts of theirs. You can use it to convert a @@ into a @@, but not the other way around, for example.", getitemlink(BlackScorpionStinger), getitemlink(RedScorpionStinger));
+ next;
+ mesn;
+ mesq l("This have many uses. Maybe. Anyway, I'm soon done with my experiment, so please come back later.");
+ close; // On purpose
+ break;
+ // Help on research to gain his favor
+ case 7:
+ mesn;
+ mesq l("Hmm... See, the thing is that transmuting living beings is not normally something that transmutation magic can do.");
+ next;
+ mesn;
+ mesq l("But I will not give up on my little experiment. Incidentally, Snakes are shaddy enough for my experiment. I promise you, I'll succeed this time.");
+ next;
+ mesn;
+ mesq l("Oh. And don't mention anyone what I'm researching here. No need to fuss over minor things, don't you agree? It's totally not shaddy. Not shaddy at all!");
+ next;
+ mesn;
+ mesq l("Now please be a good helper, and aid me by bringing:");
+ mesc l("* @@/@@ @@", countitem(MountainSnakeTongue), 15, getitemlink(MountainSnakeTongue));
+ mesc l("* @@/@@ @@", countitem(SnakeTongue), 15, getitemlink(SnakeTongue));
+ mesc l("* @@/@@ @@", countitem(CaveSnakeTongue), 15, getitemlink(CaveSnakeTongue));
+ mesc l("* @@/@@ @@", countitem(MountainSnakeEgg), 15, getitemlink(MountainSnakeEgg));
+ mesc l("* @@/@@ @@", countitem(SnakeEgg), 15, getitemlink(SnakeEgg));
+ mesc l("* @@/@@ @@", countitem(CaveSnakeEgg), 15, getitemlink(CaveSnakeEgg));
+ next;
+ select
+ l("I'll try to find them."),
+ l("I actually have them, here.");
+ if (@menu == 2) {
+ mes "";
+ mesn;
+ mesq l("Excellent! Let me see...");
+ next;
+ if (!transcheck(
+ MountainSnakeTongue, 15,
+ SnakeTongue, 15,
+ CaveSnakeTongue, 15,
+ MountainSnakeEgg, 15,
+ SnakeEgg, 15,
+ CaveSnakeEgg, 15))
+ goto L_Lie;
+ getexp 20000, 0;
+ Zeny=Zeny+2500;
+ setq General_Auldsbel, 8;
+ mesn;
+ mesq l("Thanks. Snakes seems promising indeed! Maybe they work where scorpions failed. If I succeed, I promise I'll teach you the spell. But for now...");
+ mesc l("Gained 20000 XP and 2500 GP");
+ }
+ break;
+ // Learn transmigration: Snake Egg, Tongue, Skin
+ case 8:
+ if (MAGIC_LVL < 3)
+ goto L_Magicless;
+ mesn;
+ mesq l("Well, I have not finished my research on snakes yet, but I'm pretty sure in how to transmute their parts.");
+ next;
+ setq General_Auldsbel, 9;
+ mesn;
+ mesq l("Here, look at how it is done. Focus. You can use it to convert a @@ into a @@, but not the other way around, for example.", getitemlink(MountainSnakeSkin), getitemlink(SnakeSkin));
+ next;
+ mesn;
+ mesq l("Be careful as not everybody likes transmuted monster parts. Some may even see it as a foul thing. Anyway. Come back later.");
+ close; // On purpose
+ break;
+ // Help on research to gain his favor
+ case 10:
+ mesn;
+ mesq l("So... I think I'm almost done! My plan is to force a @@ into being a pretty Butterfly. Hey, I like cute things!", getitemlink(SilkWorm));
+ next;
+ mesn;
+ mesq l("Besides, there are no Butterflies in Tulimshar, and they could help the farm in getting producing food.");
+ next;
+ mesn;
+ mesq l("This time, I only a few last reagents and I'll finally attempt it... I want you to witness it. I'll teach you the spell later, of course.");
+ mesc l("* @@/@@ @@", countitem(ManaPiouFeathers), 5, getitemlink(ManaPiouFeathers));
+ mesc l("* @@/@@ @@", countitem(IceCube), 1, getitemlink(IceCube));
+ mesc l("* @@/@@ @@", countitem(OceanCrocClaw), 1, getitemlink(OceanCrocClaw));
+ next;
+ select
+ l("I'll try to find them."),
+ l("I actually have them, here.");
+ if (@menu == 2) {
+ mes "";
+ mesn;
+ mesq l("Excellent! Let me see...");
+ next;
+ if (!transcheck(
+ ManaPiouFeathers, 5,
+ IceCube, 1,
+ OceanCrocClaw, 1))
+ goto L_Lie;
+ mesn;
+ mesq l("Now lo and behold... The ultimate... TRANSMUTATION!");
+ // Pray that you don't get disconnected now
+ next;
+ getexp 10000, 500;
+ setq General_Auldsbel, 11;
+ npctalk l("@@... I think something went wrong... RUN!!", strcharinfo(0));
+ .@mob=monster(.map$, .x, .y, "Failed Experiment", GrassSnake, 1, .name$+"::OnSnakeDeath");
+ specialeffect FX_MAGIC, SELF, getcharid(3);
+ specialeffect FX_MGWARP, SELF, .name$;
+ specialeffect FX_ATTACK, AREA, .@mob;
+ closeclientdialog;
+ close;
+ }
+ break;
+ // Learn Halhiss, completing Audsbel Quest
+ case 11:
+ // Actually, that's lv 60... Learning a lv 40 spell '-'
+ if (MAGIC_LVL < 3)
+ goto L_Magicless;
+ if (mobcount(.map$, .name$+"::OnSnakeDeath")) {
+ mesn;
+ mesq l("Could you please dispose my failed experiment, first?");
+ close;
+ }
+ mesn;
+ mesq l("*sigh* Yet another failure... Transmutation and Nature Magic doesn't marry well.");
+ next;
+ skill(TMW2_HALHISS,1,0);
+ setq General_Auldsbel, 12;
+ mesn;
+ mesq l("Next time, I'll ask Sagratha to help. Heh. I doubt that's going to happen. By the way, this is the @@ spell. It summons snakes...", b("@sk-halhiss"));
+ next;
+ mesn;
+ mesq l("You need a @@ for it. Ah, back to research I guess...", getitemlink(SnakeEgg));
+ next;
+ break;
default:
mesn;
mesq l("Uhm, no, not really. Maybe later, who knows?");
@@ -311,6 +485,9 @@ L_Lame:
// If that is true or not, remains to be checked. Uh... I never used setparam() before! :D
close;
+OnSnakeDeath:
+ end;
+
OnInit:
.sex=G_MALE;
.distance=5;
diff --git a/npc/003-0/_import.txt b/npc/003-0/_import.txt
index 0ec5970cb..3ed596714 100644
--- a/npc/003-0/_import.txt
+++ b/npc/003-0/_import.txt
@@ -2,6 +2,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/003-0/_warps.txt",
"npc/003-0/colin.txt",
+"npc/003-0/enzo.txt",
"npc/003-0/luca.txt",
"npc/003-0/recepcionist.txt",
"npc/003-0/saves.txt",
diff --git a/npc/003-0/enzo.txt b/npc/003-0/enzo.txt
new file mode 100644
index 000000000..6ebdefec6
--- /dev/null
+++ b/npc/003-0/enzo.txt
@@ -0,0 +1,59 @@
+// TMW2 Script
+// Author:
+// Jesusalva
+// Description:
+// Forgetful
+
+003-0,68,25,0 script Enzo NPC_BLACKWIZARD,{
+ mesn l("Enzo, the Forgetful");
+ mesq l("What was I doing before...? I forgot!");
+ next;
+ mesc l("Teaching Enzo your skills will make you both forget them."), 1;
+ mesc l("Once your skill is forgotten, the Magic Skill Points used will be freed."), 1;
+ mesc l("But be careful: Only 1MSP-costed skills can be forgotten, and learning fees WON'T be given back!"), 1;
+ do
+ {
+ next;
+ mesc l("Which skill will you FORGET permanently today?"), 1;
+ menuint
+ l("Uhm... Bye?"), 0,
+ rif(getskilllv(AL_HEAL), l("Healing")), AL_HEAL,
+ rif(getskilllv(TMW2_SAGE), l("Mana Wisdom")), TMW2_SAGE,
+ rif(getskilllv(HW_MAGICPOWER), l("Accumulate Power")), HW_MAGICPOWER,
+ rif(getskilllv(SM_PROVOKE), l("Provoke")), SM_PROVOKE,
+ rif(getskilllv(SA_FREECAST), l("Free Casting")), SA_FREECAST,
+ rif(getskilllv(TF_BACKSLIDING), l("Tactical Retreat")), TF_BACKSLIDING,
+ rif(getskilllv(MG_FIREWALL), l("Nature Wall")), MG_FIREWALL,
+ rif(getskilllv(ALL_FULL_THROTTLE), l("Last Resort")), ALL_FULL_THROTTLE,
+ rif(getskilllv(SM_BASH), l("Falkon Punch!")), SM_BASH,
+ rif(getskilllv(MC_MAMMONITE), l("Supreme Attack")), MC_MAMMONITE,
+ rif(getskilllv(AC_SHOWER), l("Arrow Shower")), AC_SHOWER,
+ rif(getskilllv(MG_FIREBALL), l("Fireball")), MG_FIREBALL,
+ rif(getskilllv(AL_HOLYLIGHT), l("Holy Light")), AL_HOLYLIGHT,
+ rif(getskilllv(MG_SOULSTRIKE), l("Magic Strike")), MG_SOULSTRIKE,
+ l("None at the moment!"), 0;
+ if (!@menuret)
+ close;
+ mes "";
+ mesc l("Skill @@ will be permanently lost!", @menuret), 1;
+ mesc l("Continue anyway?"), 1;
+ if (askyesno() == ASK_YES) {
+ .@lv=getskilllv(@menuret);
+ skill @menuret, 0, 0;
+ MAGIC_PTS-=.@lv;
+ mesc l("Skill @@ has been lost", @menuret), 3;
+ mesc l("You recovered @@ magic skill points", .@lv), 3;
+ } else {
+ mesn l("Enzo, the Forgetful");
+ mesq l("Uh, what?");
+ }
+ } while (@menuret);
+ close;
+
+OnInit:
+ .sex = G_MALE;
+ .distance = 5;
+ end;
+
+}
+
diff --git a/npc/003-0/luca.txt b/npc/003-0/luca.txt
index b5a271f52..dc5720ebd 100644
--- a/npc/003-0/luca.txt
+++ b/npc/003-0/luca.txt
@@ -50,7 +50,7 @@
mesc l("You do not meet all requisites for this skill."), 1;
break;
case ASC_METEORASSAULT:
- if (!mlearn(ASC_METEORASSAULT, 5, 3, FluoPowder, 3))
+ if (!mlearn(ASC_METEORASSAULT, 5, 2, FluoPowder, 3))
mesc l("You do not meet all requisites for this skill."), 1;
break;
case SN_SHARPSHOOTING:
diff --git a/npc/003-0/notes b/npc/003-0/notes
index e6a9a3193..f5ce8d630 100644
--- a/npc/003-0/notes
+++ b/npc/003-0/notes
@@ -85,9 +85,11 @@ UNUSED/SPECIAL
GS_SNAKEEYE (→AC_VULTURE)
THIEF/MERCHANT-POLICE
- ALL_INCCARRY
TF_STEAL
- ...?
+ ALL_INCCARRY
+ TF_MISS / TF_DOUBLE ?
+ MC_DISCOUNT / MC_OVERCHARGE (FIXME) ?
+ TF_HIDING?
MC_PUSHCART?
MC_VENDING?
diff --git a/npc/003-0/recepcionist.txt b/npc/003-0/recepcionist.txt
index 7bd39ef0f..e2133a2ae 100644
--- a/npc/003-0/recepcionist.txt
+++ b/npc/003-0/recepcionist.txt
@@ -5,13 +5,13 @@
// Magic School recepcionist (TODO: Give S. Badge)
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;
+ if (MGQUEST && 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;
mesn;
- mesq l("Unfortunately, we're shutting down. This building is too old.");
+ mesq l("Thankfully, we'll be moving soon. This building is old and the roof is falling.");
next;
mesn;
mesq l("I hope our new campus get built soon. It'll be much better than here.");
diff --git a/npc/003-1/ishi.txt b/npc/003-1/ishi.txt
index 9ebcc83d9..64c6ecee3 100644
--- a/npc/003-1/ishi.txt
+++ b/npc/003-1/ishi.txt
@@ -59,9 +59,9 @@
// Push blueprints based on your Job Level
array_push(@Rares, AlchemyBlueprintA);
- array_push(@Rares, (JobLevel/4));
+ array_push(@Rares, (JobLevel/3));
array_push(@Rares, EquipmentBlueprintA);
- array_push(@Rares, (JobLevel/4));
+ array_push(@Rares, (JobLevel/3));
// Additional Loot for level 45+
if (BaseLevel >= 45) {
@@ -75,9 +75,9 @@
array_push(@Items, ShadowHerb);
array_push(@Rares, AlchemyBlueprintB);
- array_push(@Rares, (JobLevel/8));
+ array_push(@Rares, (JobLevel/6));
array_push(@Rares, EquipmentBlueprintB);
- array_push(@Rares, (JobLevel/8));
+ array_push(@Rares, (JobLevel/6));
}
// Additional Loot for level 75+
@@ -93,9 +93,9 @@
array_push(@Rares, MercBoxA);
array_push(@Rares, 40);
array_push(@Rares, AlchemyBlueprintC);
- array_push(@Rares, (JobLevel/12));
+ array_push(@Rares, (JobLevel/9));
array_push(@Rares, EquipmentBlueprintC);
- array_push(@Rares, (JobLevel/12));
+ array_push(@Rares, (JobLevel/9));
}
mesn l("Ishi, the Rewards Master");
@@ -121,10 +121,10 @@
.@var=@menuret;
// Special cases
- if (.@var < 1)
- goto L_Give_all;
if (!.@var)
goto L_Close;
+ if (.@var < 0)
+ goto L_Give_all;
goto L_Items;
diff --git a/npc/003-1/magic.txt b/npc/003-1/magic.txt
index cd0366739..4582bad6d 100644
--- a/npc/003-1/magic.txt
+++ b/npc/003-1/magic.txt
@@ -15,6 +15,6 @@ OnTouch:
}
*/
warp "003-0", 48, 51;
- dispbottom col(l("CONDEMNED: This building has been condemned. The roof may fall. Be careful!"), 1);
+ //dispbottom col(l("CONDEMNED: This building has been condemned. The roof may fall. Be careful!"), 1);
end;
}
diff --git a/npc/003-2/eistein.txt b/npc/003-2/eistein.txt
index 2b88aa499..31dd985ab 100644
--- a/npc/003-2/eistein.txt
+++ b/npc/003-2/eistein.txt
@@ -7,13 +7,18 @@
003-2,35,34,0 script Eistein NPC_UKAR,{
- // Level, Reward
+ // Level, Reward{, Reward2}
function is_level {
if (BaseLevel >= getarg(0)) {
getitem getarg(1),1;
+ if (getarg(2, 0))
+ getitem getarg(2),1;
setq TulimsharQuest_Eistein, getq(TulimsharQuest_Eistein)+1;
- speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
- l("Congrats you passed the level cap of @@! Here is a(n) @@, you deserve it.",getarg(0), getitemlink(getarg(1)));
+ mes "";
+ mesn;
+ mesq l("Congrats you passed the level cap of @@! Here is a(n) @@, you deserve it.",getarg(0), getitemlink(getarg(1)));
+ if (getarg(2,0))
+ mesc l("Item obtained: @@", getitemlink(getarg(2)));
} else {
speech S_FIRST_BLANK_LINE | S_LAST_NEXT,
l("You are level @@/@@. Keep building levels, you need them!", BaseLevel, getarg(0));
@@ -27,11 +32,11 @@
case 0:
is_level(25, BronzeGift); break;
case 1:
- is_level(50, GraduationCap); break;
+ is_level(50, SilverGift, GraduationCap); break;
case 2:
- is_level(75, SilverGift); break;
+ is_level(75, GoldenGift, GraduationRobe); break;
case 3:
- is_level(100, GoldenGift); break;
+ is_level(100, PrismGift); break;
case 4:
is_level(125, PrismGift); break;
case 5:
diff --git a/npc/003-2/lua.txt b/npc/003-2/lua.txt
index 627960f17..557d6dfee 100644
--- a/npc/003-2/lua.txt
+++ b/npc/003-2/lua.txt
@@ -62,6 +62,11 @@ L_GMItems:
goto L_Menu;
L_GMEvent:
+OnGMCoinClaim:
+ if (!is_gm() || #GMEVENT_T > gettimetick(2)) {
+ dispbottom l("ERROR: You already took the coins today. Please wait @@ more.", FuzzyTime(#GMEVENT_T)), 1;
+ end;
+ }
#GMEVENT_T=gettimetick(2)+(60*60*24);
getitem StrangeCoin, 30;
//logmes(strcharinfo(0)+" just took thirty event coins.");
@@ -72,6 +77,7 @@ L_GMEvent:
mes "";
goto L_Menu;
+OnGMEventShop:
L_GMEventShop:
// Inflaction: Non-admins pay more out of main events (for whatever reasons)
.@inf=1;
@@ -123,7 +129,7 @@ L_NewHero:
mes l("Current hero: @@", $MOST_HEROIC$);
input .@MH$;
logmes "Changing hero from "+$MOST_HEROIC$+" to "+.@MH$;
- logmes(strcharinfo(0)+" changed the world's hero.", LOGMES_ATCOMMAND);
+ logmes(strcharinfo(0)+" changed the world's hero ("+$MOST_HEROIC$+"->"+.@MH$+")", LOGMES_ATCOMMAND);
$MOST_HEROIC$ = .@MH$;
goto L_Menu;
@@ -249,10 +255,11 @@ L_Task:
close;
L_Finish:
- inventoryplace MercBoxAA, 1;
+ inventoryplace MercBoxAA, 1, TreasureKey, 1;
getexp BaseLevel*60, JobLevel*10; // Reference Levels: (20, 6)
setq General_Narrator, 3, 0;
getitem MercBoxAA, 1;
+ getitem TreasureKey, 1;
mesn;
mesq l("Great job! You can keep these items, they will be crucial to your journey.");
next;
@@ -265,6 +272,9 @@ L_Finish:
mesn;
mesq l("Still, they can be useful when you're trying to solo a boss and need help. The number of stars on the card is the strength and rarity. Use them wisely.");
next;
+ mesn;
+ mesq l("Ah, you might have seen a treasure chest on the mines. There are several of these chests to loot, and loot again! Here is a @@. Try it!", getitemlink(TreasureKey));
+ next;
L_Complete:
mesn;
mesq l("You see the docks on the other side of the town? There should be a ship docked there.");
@@ -304,14 +314,14 @@ L_Complete:
L_Tips:
mesn;
- mesq l("Hmm... First of, I would really add some agility. Agility helps you to don't be hit, and not being hit is awesome.");
- mesq l("Hm, I would also do some quests if I needed money... On other hand, maybe I could go fishing? Do I know any fisher?");
- mesq l("Ah, getting experience is hard, too... I would stay within the city. Hit and Run tactics works the best.");
+ mes l("Hmm... First of, I would really add some agility. Agility helps you to don't be hit, and not being hit is awesome.");
+ mes l("Hm, I would also do some quests if I needed money... On other hand, maybe I could go fishing? Do I know any fisher?");
+ mes l("Ah, getting experience is hard, too... I would stay within the city. Hit and Run tactics works the best.");
next;
mesn;
- mesq l("Hit'n'run is not so hard... One hit, one step back... One hit, another step back... One miss, two steps back...");
- mesq l("That works with most of monsters. Well, but we all know from @@ that it is better to stay put and let mobs kill us, right?", "Apane");
- mesq l("Heh, there is death penalty indoors and outside the town. You better watch out. The mobs are on a foul mood today, very easy to get killed.");
+ mes l("Hit'n'run is not so hard... One hit, one step back... One hit, another step back... One miss, two steps back...");
+ mes l("That works with most of monsters. Well, but we all know from @@ that it is better to stay put and let mobs kill us, right?", "Apane");
+ mes l("Heh, there is death penalty outside the town. You better watch out. The mobs are on a foul mood today, very easy to get killed.");
close;
L_Check:
@@ -378,19 +388,19 @@ L_Contributor:
case 1:
getitem BugLeg, 30; #CRW=#CRW|128 ; break;
case 2:
- Zeny=Zeny-10000; getitembound "LegendaryMount", 1, 1; #CRW=#CRW|32 ; break;
+ Zeny=Zeny-10000; getitembound LegendaryMouboo, 1, 1; #CRW=#CRW|32 ; break;
case 3:
- getitem "DeliciousCookie", 1; #CRW=#CRW|16 ; break;
+ getitem DeliciousCookie, 1; #CRW=#CRW|16 ; break;
case 4:
getitem BugLeg, 20; #CRW=#CRW|64 ; break;
case 5:
- getitem "DEVCap", 1; #CRW=#CRW|8 ; break;
+ getitem DEVCap, 1; #CRW=#CRW|8 ; break;
case 6:
- getitem "ContributorSweater", 1; #CRW=#CRW|4 ; break;
+ getitem ContributorSweater, 1; #CRW=#CRW|4 ; break;
case 7:
- getitem "CommunityShirt", 1; #CRW=#CRW|2 ; break;
+ getitem CommunityShirt, 1; #CRW=#CRW|2 ; break;
case 8:
- getitem "StrangeCoin", 5; #CRW=#CRW|1 ; break;
+ getitem StrangeCoin, 5; #CRW=#CRW|1 ; break;
case 9:
mes l("10000 - 30x @@", getitemlink(BugLeg));
mes l("5000 (+10,000 GP) - @@", getitemlink(LegendaryTortuga));
@@ -416,6 +426,8 @@ OnInit:
setunitdata(.@npcId, UDT_WEAPON, BugSlayer);
setunitdata(.@npcId, UDT_HAIRSTYLE, 12);
setunitdata(.@npcId, UDT_HAIRCOLOR, 5);
+ bindatcmd "strangecoin", "Lua#003-2::OnGMCoinClaim", 60, 100, 1;
+ bindatcmd "strangeshop", "Lua#003-2::OnGMEventShop", 60, 100, 1;
.sex = G_FEMALE;
.distance = 4;
diff --git a/npc/003-3/malindou.txt b/npc/003-3/malindou.txt
index 9e41b9196..f2efd46ce 100644
--- a/npc/003-3/malindou.txt
+++ b/npc/003-3/malindou.txt
@@ -452,11 +452,12 @@ OnInit:
htput($@CONTRIBUTORS, "skydragon", 75);
htput($@CONTRIBUTORS, "xanthem", 46);
htput($@CONTRIBUTORS, "liangtai", 36);
+ htput($@CONTRIBUTORS, "kolchak", 31);
htput($@CONTRIBUTORS, "msawis", 30);
htput($@CONTRIBUTORS, "xanthem", 28);
htput($@CONTRIBUTORS, "dragonstar", 26);
htput($@CONTRIBUTORS, "demure", 24);
- htput($@CONTRIBUTORS, "kolchak", 11);
+ htput($@CONTRIBUTORS, "seeds", 21);
htput($@CONTRIBUTORS, "aisen", 8);
htput($@CONTRIBUTORS, "lilanna", 7);
htput($@CONTRIBUTORS, "maisquestce",5);
@@ -474,9 +475,25 @@ OnPCBaseLvUpEvent:
sc_end SC_CASH_RECEIVEITEM;
break;
case 25:
+ if (#REFERRAL_PROG && BaseLevel == 25 && #REFERRAL_CTRL < 1) {
+ #REFERRAL_CTRL=1;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 25!", strcharinfo(0)+" just got level 25!\nAs they get stronger, more rewards will be sent to you!", 0, SilverGift, 1);
+ }
case 50:
+ if (#REFERRAL_PROG && BaseLevel == 50 && #REFERRAL_CTRL < 2) {
+ #REFERRAL_CTRL=2;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 50!", strcharinfo(0)+" just got level 50!\nAs they get stronger, more rewards will be sent to you!", 0, ArcmageBoxset, 1);
+ }
case 75:
+ if (#REFERRAL_PROG && BaseLevel == 75 && #REFERRAL_CTRL < 3) {
+ #REFERRAL_CTRL=3;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 75!", strcharinfo(0)+" just got level 75!\nAs they get stronger, more rewards will be sent to you!", 0, PrismGift, 1);
+ }
case 100:
+ if (#REFERRAL_PROG && BaseLevel == 100 && #REFERRAL_CTRL < 4) {
+ #REFERRAL_CTRL=4;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 100!", strcharinfo(0)+" just got level 100!\nTime to reap what you've sow for so long!", 0, SupremeGift, 1);
+ }
case 125:
case 150:
dispbottom l("Milestone levelup: A reward can now be claimed in Tulimshar.");
diff --git a/npc/007-1/dracoula.txt b/npc/007-1/dracoula.txt
index 4e7a5216f..fb63a4c14 100644
--- a/npc/007-1/dracoula.txt
+++ b/npc/007-1/dracoula.txt
@@ -128,6 +128,7 @@ L_Miner:
next;
mesn;
mesq l("He is the Miners leader.");
+ compareandsetq MineQuest_Pickaxe, 0, 1;
next;
goto L_Menu;
diff --git a/npc/007-1/pylon.txt b/npc/007-1/pylon.txt
index c5d32e54e..3d9236cf2 100644
--- a/npc/007-1/pylon.txt
+++ b/npc/007-1/pylon.txt
@@ -88,7 +88,7 @@ L_MenuOre:
L_OreOk:
// Amount iron ore
- .@amo=rand(1,2);
+ .@amo=rand2(1,2);
delitem IronOre, 1;
Zeny = Zeny - 100;
@@ -109,7 +109,7 @@ L_Powder:
.@pw=DiamondPowder+@menu-2;
// Amount
- .@am=rand(1,3);
+ .@am=rand2(1,3);
delitem .@id, 1;
Zeny = Zeny - 100;
diff --git a/npc/007-1/tycoon.txt b/npc/007-1/tycoon.txt
index 38874d9aa..48f23c348 100644
--- a/npc/007-1/tycoon.txt
+++ b/npc/007-1/tycoon.txt
@@ -3,7 +3,7 @@
// Saulc
// Jesusalva
// Description:
-// Miner leader asks you to purge mine from monsters. Currently disabled.
+// Miner leader asks you to purge mine from monsters.
// Variable:
// MineQuest_Tycoon
// Reference:
@@ -60,6 +60,7 @@ L_Menu:
mesn strcharinfo(0);
menu
rif(getq(MineQuest_Tycoon) < 15, l("I am a brave adventurer! How can I help you?")), L_Purge,
+ rif(getq(MineQuest_Pickaxe) == 1, l("Can I become a miner?")), L_Miner,
l("What does miners do in cave?"), L_CaveMiner,
l("Can you give me a tip?"), L_Tip,
l("Are you a terranite?"), L_Terranite,
@@ -163,10 +164,63 @@ L_NoLevel:
+L_Miner:
+ .@price=800;
+ if (getq(MineQuest_Tycoon) >= 9)
+ .@price-=200;
+ if (getq(MineQuest_Tycoon) >= 12)
+ .@price-=100;
+ if (getq(MineQuest_Tycoon) == 15)
+ .@price-=300;
+ if (getq(MineQuest_Caelum) >= 2)
+ .@price-=150;
+
+ mes "";
+ mesn;
+ mesq l("Well, I'm the miner leader, indeed. A miner need to have the full set.");
+ next;
+ mesn;
+ mesq l("The uniform would be: @@, @@, @@ and @@", getitemlink(LeatherShirt), getitemlink(MinerHat), getitemlink(MinerGloves), getitemlink(Pickaxe));
+ next;
+ mesn;
+ mesq l("I can sell you the Pickaxe for @@ GP if you have and @@ the remaining equipment.", .@price, b(l("equip")));
+ if (Zeny < .@price)
+ close;
+
+ // Allow you to change
+ enable_items();
+ next;
+ disable_items();
+ // If you're in proper uniform, DO NOT ASK FOR CONFIRMATION
+ if (
+ getequipid(EQI_HEAD_TOP) == MinerHat &&
+ getequipid(EQI_HEAD_MID) == LeatherShirt &&
+ getequipid(EQI_GARMENT) == MinerGloves &&
+ Zeny >= .@price) {
+
+ inventoryplace Pickaxe, 1;
+ Zeny-=.@price;
+ getitem Pickaxe, 1;
+ setq MineQuest_Pickaxe, 2;
+ mesn;
+ mesq l("Good. You look like a real miner! Take this @@ and go mine bifs!");
+ if (TUTORIAL) {
+ next;
+ mesc l("@@ is a two-handed weapon with very low damage and attack speed.", getitemlink(Pickaxe));
+ mesc l("While it may not be suitable for fighting, by using it against Bifs and other mineral formations, you'll be able to get more ore.");
+ next;
+ mesc l("You may even obtain ores which you wouldn't otherwise obtain normally, and the drop rate is fixed.");
+ mesc l("A Miner is a must-have for a craftsman/craftswoman, as they are in constant need of ores and coal.");
+ }
+ next;
+ }
+ goto L_Menu;
+
+
L_CaveMiner:
mes "";
mesn;
- mesq l("Tulimshar miners mainly try to optain gems.");
+ mesq l("Tulimshar miners mainly try to obtain gems.");
next;
mesq l("In this cave we can easily find Coal, Iron ore, and sometimes @@.", getitemlink(Ruby)); // maybe add link for coal and iron ?
next;
diff --git a/npc/008-0/master.txt b/npc/008-0/master.txt
index b4809358c..86a62d9bb 100644
--- a/npc/008-0/master.txt
+++ b/npc/008-0/master.txt
@@ -92,6 +92,7 @@ L_TODO:
mesn;
mesq l("It's not hard to repair, but nobody is bothering Jesusalva on #world as of late. %%n");
mesq l("Because this, the national budget is going to other silly, under-rewarding, minor things...");
+ mesc l("If you think this should be a priority, please ask Jesusalva."), 1;
close;
// Only the party leader can start this. But you can rejoin, as long map leader is on 008-x
diff --git a/npc/009-6/utils.txt b/npc/009-6/utils.txt
index 971bcf5b6..1053d7f6e 100644
--- a/npc/009-6/utils.txt
+++ b/npc/009-6/utils.txt
@@ -82,67 +82,7 @@ OnInit:
009-6,34,25,0 script Piano#RES_0096 NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "009-6", .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/009-7/utils.txt b/npc/009-7/utils.txt
index bf4fef132..5bd8520c4 100644
--- a/npc/009-7/utils.txt
+++ b/npc/009-7/utils.txt
@@ -82,67 +82,7 @@ OnInit:
009-7,34,25,0 script Piano#RES_0097 NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "009-7", .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/012-1/guards.txt b/npc/012-1/guards.txt
index 63d75200a..214ef3529 100644
--- a/npc/012-1/guards.txt
+++ b/npc/012-1/guards.txt
@@ -374,9 +374,7 @@ OnTimer240000:
end;
OnXtreem:
- if (rand(0,100) <= 50)
- Karma=Karma+1;
- else
+ if (rand2(0,100) > 50)
getitem StrangeCoin, 2;
// Here, the drop is a Bronze Gift, based on living players and players nearby.
// You have 0.1% of base chance, plus 0.2% each fighting player + 1% each near player.
diff --git a/npc/012-2/GonzoDark.txt b/npc/012-2/GonzoDark.txt
index f5e65314f..38a74ae3f 100644
--- a/npc/012-2/GonzoDark.txt
+++ b/npc/012-2/GonzoDark.txt
@@ -8,54 +8,6 @@
// Quest ID: 2
012-2,50,81,0 script GonzoDark Sponsor NPC_LUCAS,{
- function resetSQS {
- setq SQuest_Sponsor, 0, gettime(GETTIME_MONTH);
- }
- // Check monthly quest
- .@d=getq2(SQuest_Sponsor);
- if (.@d != gettime(GETTIME_MONTH)) resetSQS();
-
- // Are you a sponsor or a guest?
- if (!getgmlevel())
- goto L_Guest;
-
- // Core
- .@q=getq(SQuest_Sponsor);
- mesn;
- mesq l("Ahh, I hate @@.", getmonsterlink(BlackScorpion));
- if (!(.@q & .questID)) goto L_Menu;
- close;
-
-L_Menu:
- mesq l("I will reward you for 7 @@.", getitemlink(.itemID));
- mes "";
- menu
- rif(countitem(.itemID) >= 7, l("Here they are!")), L_Finish,
- l("Where can I find them?"),L_Where,
- l("No, thanks."),L_Close;
-
-L_Finish:
- delitem .itemID, 7;
- Zeny=Zeny+700; // 100 GP each
- getitem StrangeCoin, rand(1,4);
- .@q=getq(SQuest_Sponsor);
- setq1 SQuest_Sponsor, .@q | .questID;
- mes "";
- mesn;
- mesq l("Many thanks! Come back later to bring me extra @@!", getitemlink(.itemID));
- close;
-
-L_Where:
- mes "";
- mesq l("Ah, there are lots on dark mines.");
- next;
-
-L_Close:
- closedialog;
- goodbye;
- close;
-
-L_Guest:
mesn;
mesq lg("Yo, girl.", "Yo, man.");
next;
@@ -63,13 +15,11 @@ L_Guest:
mesq l("I sponsor the alliance and all I got was a NPC and access to this ugly room.");
next;
mesn;
- mesq l("Well, I did got some other things more, but I don't want to be an snob.");
+ mesq l("Well, I don't want to be an snob.");
close;
OnInit:
.sex = G_MALE;
.distance = 5;
- .questID=2;
- .itemID=BlackScorpionStinger;
end;
}
diff --git a/npc/012-2/Saulc.txt b/npc/012-2/Saulc.txt
index e4f790475..3b5cadc32 100644
--- a/npc/012-2/Saulc.txt
+++ b/npc/012-2/Saulc.txt
@@ -8,54 +8,6 @@
// Quest ID: 1
012-2,46,81,0 script Saulc Sponsor NPC_HUMAN_MALE_CHIEF,{
- function resetSQS {
- setq SQuest_Sponsor, 0, gettime(GETTIME_MONTH);
- }
- // Check monthly quest
- .@d=getq2(SQuest_Sponsor);
- if (.@d != gettime(GETTIME_MONTH)) resetSQS();
-
- // Are you a sponsor or a guest?
- if (!getgmlevel())
- goto L_Guest;
-
- // Core
- .@q=getq(SQuest_Sponsor);
- mesn;
- mesq l("Ahh, I hate @@.", getmonsterlink(Pinkie));
- if (!(.@q & .questID)) goto L_Menu;
- close;
-
-L_Menu:
- mesq l("I will reward you for 7 @@.", getitemlink(.itemID));
- mes "";
- menu
- rif(countitem(.itemID) >= 7, l("Here they are!")), L_Finish,
- l("Where can I find them?"),L_Where,
- l("No, thanks."),L_Close;
-
-L_Finish:
- delitem .itemID, 7;
- Zeny=Zeny+84; // 12 GP each
- getitem StrangeCoin, rand(1,4);
- .@q=getq(SQuest_Sponsor);
- setq1 SQuest_Sponsor, .@q | .questID;
- mes "";
- mesn;
- mesq l("Many thanks! Come back later to bring me extra @@!", getitemlink(.itemID));
- close;
-
-L_Where:
- mes "";
- mesq l("Ah, there are lots on the fields.");
- next;
-
-L_Close:
- closedialog;
- goodbye;
- close;
-
-L_Guest:
mesn;
mesq lg("Yo, girl.", "Yo, man.");
next;
@@ -63,13 +15,11 @@ L_Guest:
mesq l("I sponsor the alliance and all I got was a NPC and access to this ugly room.");
next;
mesn;
- mesq l("Well, I did got some other things more, but I don't want to be an snob.");
+ mesq l("Well, I don't want to be an snob.");
close;
OnInit:
.sex = G_MALE;
.distance = 5;
- .questID=1;
- .itemID=PinkAntenna;
end;
}
diff --git a/npc/012-2/rakinorf.txt b/npc/012-2/rakinorf.txt
index daf2c9b32..d6dc1fd7a 100644
--- a/npc/012-2/rakinorf.txt
+++ b/npc/012-2/rakinorf.txt
@@ -155,10 +155,12 @@ L_MainStory:
l("Maybe you do, your jerk! Stop drinking! Lua told me that you could help me! DO YOUR JOB!!"),
l("Sorry, Mister Rakinorf, but it was Lua that said you could help me.");
next;
+ /*
if (@menu == 1)
- Karma=Karma-1;
- else
Karma=Karma+1;
+ else
+ Karma=Karma-1;
+ */
setq2 General_Narrator, 4;
mesn strcharinfo(0);
mesq l("All she told me was that I needed to visit Halinarzo, but was too weak, and should look for you instead.");
diff --git a/npc/012-7/celestia.txt b/npc/012-7/celestia.txt
index 4c1b8aa2b..d204c4d4a 100644
--- a/npc/012-7/celestia.txt
+++ b/npc/012-7/celestia.txt
@@ -222,7 +222,7 @@ L_QuestionTea:
next;
mesc l("Celestia then picks up the cup of tea and drinks it in front of you to demonstrate that it is not only harmless but also quite delectable.");
if (.@q2 < gettimetick(2)) {
- getitem CelestiaTea, rand(1,3);
+ getitem CelestiaTea, rand2(1,3);
setq2 HurnscaldQuest_TeaParty, gettimetick(2)+(60*60*2);
}
close;
diff --git a/npc/012-8/utils.txt b/npc/012-8/utils.txt
index 53c68e588..952a3221b 100644
--- a/npc/012-8/utils.txt
+++ b/npc/012-8/utils.txt
@@ -83,11 +83,7 @@ OnInit:
012-8,29,24,0 script Cauldron#RES_0128 NPC_NO_SPRITE,{
- mesc l("What will you brew today?");
- if (AlchemySystem(CRAFT_PLAYER))
- mesc l("Success!"), 3;
- else
- mesc l("That didn't work!"), 1;
+ realestate_cauldron();
close;
OnInit:
@@ -97,67 +93,7 @@ OnInit:
012-8,34,25,0 script Piano#RES_0128 NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "012-8", .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/014-2/mouboo.txt b/npc/014-2/mouboo.txt
index 45f349723..038f0aec0 100644
--- a/npc/014-2/mouboo.txt
+++ b/npc/014-2/mouboo.txt
@@ -96,13 +96,12 @@ L_Begin:
if (.@id == ElixirOfLife)
setq2 HurnscaldQuest_InjuriedMouboo, 9999;
else
- setq2 HurnscaldQuest_InjuriedMouboo, .@q2+((@min+@max)/10);
+ setq2 HurnscaldQuest_InjuriedMouboo, .@q2+((@val1)/10);
.@q2=getq2(HurnscaldQuest_InjuriedMouboo);
if (.@q2 > 1000) {
mesc l("This will be remembered."), 6;
setq HurnscaldQuest_InjuriedMouboo, 2;
- Karma=Karma+1;
getexp 800, 0;
close;
}
@@ -149,7 +148,6 @@ L_Begin:
mes l("Is... Dan... Ger... Ous...");
mes l("...Help... Me...");
setq HurnscaldQuest_InjuriedMouboo, 9;
- Karma=Karma-1;
getexp 800, 0;
next;
diff --git a/npc/014-4/thorn.txt b/npc/014-4/thorn.txt
index 2b9846981..6a06704df 100644
--- a/npc/014-4/thorn.txt
+++ b/npc/014-4/thorn.txt
@@ -22,7 +22,35 @@
goto L_SpringQuest;
L_Main:
- close;
+ next;
+ .@q=getq(HurnscaldQuest_Thorn);
+ if (.@q == 0) {
+ mesn;
+ mesq l("I'm actually half-wose. This means part of me is tree.");
+ next;
+ mesn;
+ mesq l("I can walk, I'm just... Trapped here. That's why I need someone to help me to cultivate my wose part!");
+ next;
+ mesn;
+ mesq l("Could you please bring me @@ @@ and @@ @@? I'll give you a bunch of herbs if you help me!", 12, getitemlink(Root), 35, getitemlink(Acorn));
+ next;
+ mesc l("Give him the materials he asked for?");
+ if (askyesno() == ASK_YES) {
+ inventoryplace ShadowHerb, 20, ArtichokeHerb, 20;
+ if (!transcheck(Root, 12, Acorn, 35))
+ close;
+ getitem ShadowHerb, 20;
+ getitem ArtichokeHerb, 20;
+ getexp 600, 120; // Reference: Level 20
+ mesn;
+ mesq l("Thanks for helping me out. I know this is nothing, but please accept these herbs I've collected.");
+ setq HurnscaldQuest_Thorn, 1;
+ next;
+ }
+ }
+ closeclientdialog;
+ goodbye;
+ end;
L_OutOfSeason:
mesn;
diff --git a/npc/014-5-1/sagratha.txt b/npc/014-5-1/sagratha.txt
index c22cf5d75..5ac046a61 100644
--- a/npc/014-5-1/sagratha.txt
+++ b/npc/014-5-1/sagratha.txt
@@ -432,7 +432,7 @@ function teachMagic {
Limerizer Lv 30 → Unused
Mouboo Lv 35
- Halhiss Lv 40 → Unused
+ Halhiss Lv 40
Wolvern Lv 45
Fairy Kingdom Lv 50
diff --git a/npc/014-5/blossom.txt b/npc/014-5/blossom.txt
index b8bf502b3..e5a359cf0 100644
--- a/npc/014-5/blossom.txt
+++ b/npc/014-5/blossom.txt
@@ -19,7 +19,36 @@
goto L_SpringQuest;
L_Main:
- close;
+ next;
+ .@q=getq(HurnscaldQuest_Blossom);
+ if (.@q == 0) {
+ mesn;
+ mesq l("Anyway, I got this really nice @@ from Audsbel. He said I could collect herbs more efficiently with it.", getitemlink(EnchantedHerbBag));
+ next;
+ mesn;
+ mesq l("I am willing to give it to you, if help me out. I promise it won't be a bother, and it'll really be useful for you, I swear.");
+ next;
+ mesn;
+ mesq l("I would like @@ @@, @@ @@ and @@ @@!", 30, getitemlink(HalfEggshell), 7, getitemlink(RedApple), 1, getitemlink(Orange));
+ mesc l("@@ drolls without realizing.", .name$);
+ next;
+ mesc l("Give her the materials she asked for?");
+ if (askyesno() == ASK_YES) {
+ inventoryplace EnchantedHerbBag, 1;
+ if (!transcheck(HalfEggshell, 30, RedApple, 7, Orange, 1))
+ close;
+ getitem HalfEggshell, 1;
+ getexp 600, 120; // Reference: Level 20
+ mesn;
+ mesq l("Thanks for helping me out! Here, take this bag. Now if you excuse me...");
+ mesc l("*drolls*");
+ setq HurnscaldQuest_Blossom, 1;
+ next;
+ }
+ }
+ closeclientdialog;
+ goodbye;
+ end;
L_OutOfSeason:
mesn;
diff --git a/npc/015-2/ben.txt b/npc/015-2/ben.txt
index 2957b2e47..d64a9619f 100644
--- a/npc/015-2/ben.txt
+++ b/npc/015-2/ben.txt
@@ -40,6 +40,7 @@ L_Quest:
} else {
mesn;
mesq l("Well, you need more experience. Keep trying!");
+ mesc l("You may obtain Thief Exp by using @@.", getitemlink(Lockpicks));
}
goto L_Menu;
close;
diff --git a/npc/015-2/contrabandist.txt b/npc/015-2/contrabandist.txt
index be56e51f1..67dfd1885 100644
--- a/npc/015-2/contrabandist.txt
+++ b/npc/015-2/contrabandist.txt
@@ -6,92 +6,94 @@
015-2,166,250,0 script #Contraband NPC_NO_SPRITE,{
-// Store not available
-if (!.active)
- end;
-
-openshop;
-close;
-
- /*
- function Contraband_Unload {
- if ($ARKIM_ST > 7500)
- stopselling(DarkDesertMushroom);
-
- if (getarg(0,0) & 1)
- stopselling(IronOre);
- if (getarg(0,0) & 2)
- stopselling(TitaniumOre);
- if (getarg(0,0) & 4)
- stopselling(LeatherPatch);
- if (getarg(0,0) & 8)
- stopselling(GoldenPearlRing);
- if (getarg(0,0) & 16)
- stopselling(ThornArrow);
- if (getarg(0,0) & 32)
- stopselling(StrangeCoin);
- if (getarg(0,0) & 64)
- stopselling(CasinoCoins);
- if (getarg(0,0) & 128)
- stopselling(RawLog);
- return;
- }
- function Contraband_Load {
- .DDMPrice=max(30000,50000-($ARKIM_ST/2)+(7500/2));
- if ($ARKIM_ST > 7500)
- sellitem DarkDesertMushroom, .DDMPrice, 1;
-
- if (getarg(0,0) & 1)
- sellitem IronOre, 2900, 1;
- if (getarg(0,0) & 2)
- sellitem TitaniumOre, 4900, 1;
- if (getarg(0,0) & 4)
- sellitem LeatherPatch, 3200, 1;
- if (getarg(0,0) & 8)
- sellitem GoldenPearlRing, 1000000, 1;
- if (getarg(0,0) & 16)
- sellitem ThornArrow, -1, 3;
- if (getarg(0,0) & 32)
- sellitem StrangeCoin, rand(400,5000), 1;
- if (getarg(0,0) & 64)
- sellitem CasinoCoins, rand(100,3000), 1;
- if (getarg(0,0) & 128)
- sellitem RawLog, 1950, 1;
- return;
+ // Store not available
+ if (!.active)
+ end;
+
+ mesn;
+ mesc l("I have a few items for sale...");
+ next;
+ menuint
+ rif(.CurrentValue & 1, l("Treasure Map")), 1,
+ rif(.CurrentValue & 2, l("Lock Picks")), 2,
+ rif(.CurrentValue & 4, l("Return Potion")), 4,
+ rif(.CurrentValue & 8, l("Golden Pearl Ring")), 8,
+ rif(.CurrentValue & 16, l("Mysterious Bottle")), 16,
+ rif(.CurrentValue & 32, l("Ancient Blueprint")), 32,
+ rif(.CurrentValue & 64, l("Arcmage Boxset")), 64,
+ rif($ARKIM_ST > 7500 && .CurrentValue & 128, l("Dark Desert Mushroom")), 128,
+ l("Nothing"), 0;
+ mes "";
+ switch (@menuret) {
+ case 1:
+ .@price=600;
+ .@prize=TreasureMap;
+ break;
+ case 2:
+ .@price=1000;
+ .@prize=Lockpicks;
+ break;
+ case 4:
+ .@price=2200;
+ .@prize=ReturnPotion;
+ break;
+ case 8:
+ .@price=1000000;
+ .@prize=GoldenPearlRing;
+ break;
+ case 16:
+ .@price=4000;
+ .@prize=MysteriousBottle;
+ break;
+ case 32:
+ .@price=18000;
+ .@prize=AncientBlueprint;
+ break;
+ case 64:
+ .@price=21000;
+ .@prize=ArcmageBoxset;
+ break;
+ case 128:
+ .@price=.DDMPrice;
+ .@prize=DarkDesertMushroom;
+ break;
+ default:
+ .@price=999999999;
+ .@prize=Acorn;
+ break;
}
-
-OnInit:
- .active=0;
- .sex = G_OTHER;
- .distance = 12;
- .CurrentValue=255;
-
- if (debug) {
- setnpcdisplay .name$, NPC_KOGA;
- .active=1;
+ mesc l("Only @@ GP.", .@price);
+ if (Zeny < .@price)
+ close;
+ if (askyesno() == ASK_YES) {
+ if (!(.CurrentValue & @menuret)) {
+ mesc l("Out of Stock."), 1;
+ close;
+ }
+ .CurrentValue=.CurrentValue^@menuret;
+ Zeny-=.@price;
+ getitem .@prize, 1;
+ mesc l("Item sold!"), 2;
}
+ close;
- tradertype(NST_MARKET);
- sellitem Arrow, -1, 1;
- end;
-
+// Load
OnMinute21:
OnMinute46:
setnpcdisplay .name$, NPC_KOGA;
.active=1;
- .CurrentValue=rand(1,255);
- Contraband_Load(.CurrentValue);
+ .CurrentValue=rand2(1,255);
+ .DDMPrice=max(30000,50000-($ARKIM_ST/2)+(7500/2));
end;
+// Unload
OnMinute23:
OnMinute48:
setnpcdisplay .name$, NPC_NO_SPRITE;
.active=0;
-
- Contraband_Unload(.CurrentValue);
end;
-*/
+
OnInit:
.active=0;
.sex = G_OTHER;
@@ -101,9 +103,6 @@ OnInit:
setnpcdisplay .name$, NPC_KOGA;
.active=1;
}
-
- tradertype(NST_MARKET);
- sellitem Arrow, -1, 1;
end;
}
diff --git a/npc/016-6/_mobs.txt b/npc/016-6/_mobs.txt
index 7ad33cfe5..06d4415d0 100644
--- a/npc/016-6/_mobs.txt
+++ b/npc/016-6/_mobs.txt
@@ -1,3 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Map 016-6: Ocean mobs
-016-6,33,32,9,2 monster Ocean Croc 1133,4,36000,30000
+016-6,33,32,9,2 monster Ocean Croc 1133,4,16000,10000
diff --git a/npc/017-1/_import.txt b/npc/017-1/_import.txt
index 51b49f981..42925f9bb 100644
--- a/npc/017-1/_import.txt
+++ b/npc/017-1/_import.txt
@@ -20,4 +20,5 @@
"npc/017-1/soul-menhir.txt",
"npc/017-1/stranger.txt",
"npc/017-1/town.txt",
+"npc/017-1/townhall.txt",
"npc/017-1/wateranimation.txt",
diff --git a/npc/017-1/misc.txt b/npc/017-1/misc.txt
index c49665201..32cdbfac5 100644
--- a/npc/017-1/misc.txt
+++ b/npc/017-1/misc.txt
@@ -262,7 +262,7 @@ OnInit:
sellitem CrystallizedMaggot, 6000;
sellitem Sunglasses, 6000;
sellitem BunnyEars, 800;
- sellitem StrangeCoin, 10;
+ sellitem StrangeCoin, 30;
// Gamble
sellitem SupremeGift,30000;
diff --git a/npc/017-1/townhall.txt b/npc/017-1/townhall.txt
new file mode 100644
index 000000000..35482d5ed
--- /dev/null
+++ b/npc/017-1/townhall.txt
@@ -0,0 +1,63 @@
+// TMW2/LoF scripts.
+// Authors:
+// Jesusalva
+// Description:
+// LoF Townhall Access Control
+
+017-1,180,20,0 script #LoF_Townhall01 NPC_HIDDEN,{
+ end;
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 56, 78;
+ }
+ end;
+OnInit:
+ .distance=1;
+ end;
+
+}
+
+017-1,182,20,0 script #LoF_Townhall02 NPC_HIDDEN,{
+ end;
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 60, 78;
+ }
+ end;
+OnInit:
+ .distance=1;
+ end;
+}
+
+017-1,171,20,0 script #LoF_Townhall03 NPC_HIDDEN,{
+ end;
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 36, 78;
+ }
+ end;
+OnInit:
+ .distance=1;
+ end;
+}
+
+017-1,190,20,0 script #LoF_Townhall04 NPC_HIDDEN,{
+ end;
+OnTouch:
+ // Sponsor and Main Quest 17+ - access granted
+ .@q=getq(General_Narrator);
+ if (.@q >= 17 || getgmlevel()) {
+ warp "017-10", 80, 78;
+ }
+ end;
+OnInit:
+ .distance=1;
+ end;
+}
+
diff --git a/npc/017-10/_import.txt b/npc/017-10/_import.txt
new file mode 100644
index 000000000..ce6916310
--- /dev/null
+++ b/npc/017-10/_import.txt
@@ -0,0 +1,4 @@
+// Map 017-10: Tech-User Forge
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/017-10/_warps.txt",
+"npc/017-10/dispatcher.txt",
diff --git a/npc/017-10/_warps.txt b/npc/017-10/_warps.txt
new file mode 100644
index 000000000..636b97e54
--- /dev/null
+++ b/npc/017-10/_warps.txt
@@ -0,0 +1,6 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 017-10: Tech-User Forge warps
+017-10,36,79,0 warp #017-10_36_79 0,0,017-1,171,21
+017-10,56,79,0 warp #017-10_56_79 0,0,017-1,180,21
+017-10,60,79,0 warp #017-10_60_79 0,0,017-1,182,21
+017-10,80,79,0 warp #017-10_80_79 0,0,017-1,190,21
diff --git a/npc/017-10/dispatcher.txt b/npc/017-10/dispatcher.txt
new file mode 100644
index 000000000..82be5fd2a
--- /dev/null
+++ b/npc/017-10/dispatcher.txt
@@ -0,0 +1,404 @@
+// TMW2/LoF scripts.
+// Authors:
+// Jesusalva
+// Description:
+// Deploys an Homunculus in a mission during your offline time
+// Variables
+// HOMUN_DEPLOYDATE
+// When the Homunculus is scheduled to arrive
+// HOMUN_DEPLOYFIELD
+// ID of the field which Homunculus was deployed
+
+017-10,61,34,0 script Erik NPC_JOURNALMAN,{
+ function lootField;
+ mesn;
+ mesq l("Hello. My name is Erik, and I have Homunculus go out in errands in my stead.");
+
+ // If you haven't summoned yet, or killed it...
+ if (!gethominfo(0)) {
+ mesc l("You do not own an Homunculus."), 1;
+ close;
+ }
+
+ // Check what your homunculus is up to
+ switch (homstatus()) {
+ case 0:
+ mesc l("Your homunculus is ready!"), 2;
+ break;
+ case 1:
+ mesc l("Your homunculus is sleeping! Wake them up!"), 3;
+ close;
+ break;
+ case 2:
+ mesc l("Your homunculus is already on a mission!"), 1;
+ mesc l("It should be back in @@", FuzzyTime(HOMUN_DEPLOYDATE)), 1;
+ close;
+ break;
+ default:
+ Exception("ERROR! homstatus code "+homstatus(), RB_DEFAULT|RB_SPEECH|RB_ISFATAL);
+ break;
+ }
+
+ // This is a bug: They are ready but shouldn't be.
+ if (gettimetick(2) < HOMUN_DEPLOYDATE) {
+ Exception("ERROR: YOU WERE BANNED FROM USING ERIK SERVICES. (might be a bug).", RB_SPEECH|RB_ISFATAL);
+ close;
+ }
+
+ // Homunculus should return from mission
+ if (homstatus()) {
+ select
+ l("Recall");
+ recallhomunculus();
+ .@xp=lootField(HOMUN_DEPLOYFIELD);
+ gethomunexp(.@xp);
+ getexp 0, (.@lv*min(10000, gethominfo(3))/10000)*5;
+ close;
+ }
+
+L_Main:
+ select
+ l("Deploy to Piou Fields [1h]"),
+ l("Deploy to Herb Fields [1h]"),
+ rif(gethominfo(6) >= 10, l("Deploy to Ore Mines [2h]")),
+ rif(gethominfo(6) >= 10, l("Deploy to Rare Mines [2h]")),
+ rif(gethominfo(6) >= 15, l("Deploy to Slime Nest [2h]")),
+ rif(gethominfo(6) >= 30, l("Deploy to Snake Pit [3h]")),
+ rif(gethominfo(6) >= 55, l("Deploy to Dangerous Area [6h]")),
+ rif(gethominfo(6) >= 80 && $GAME_STORYLINE >= 4, l("Deploy to Monster King Basement [8h]")),
+ "",
+ l("Deploy to The Market [1h]"),
+ l("Don't deploy");
+ mes "";
+ // Common drops: At least 90% drop
+ // Rare drops: 5% or less drop rate
+ switch (@menu) {
+ case 1:
+ mesc ".:: " + l("Piou Fields") + " ::.";
+ mesc l("The most basic grinding camp for your homunculus.");
+ mesc l("Average EXP: "+100), 3;
+ mesc l("Common Drops: "+
+ getitemlink(PiouFeathers));
+ mesc l("Regular Drops: "+
+ getitemlink(PiouLegs)+
+ getitemlink(HalfEggshell));
+ mesc l("Rare Drops: "+
+ getitemlink(GoldenApple));
+ next;
+ .@dest=HCD_PIOUFIELDS;
+ .@hours=1;
+ break;
+ case 2:
+ mesc ".:: " + l("Herb Fields") + " ::.";
+ mesc l("If you need more herbs, the best place to look.");
+ mesc l("Average EXP: "+5), 3;
+ mesc l("Common Drops: "+
+ getitemlink(ArtichokeHerb));
+ mesc l("Regular Drops: "+
+ getitemlink(CobaltHerb)+
+ getitemlink(GambogeHerb)+
+ getitemlink(MauveHerb)+
+ getitemlink(AlizarinHerb));
+ mesc l("Rare Drops: "+
+ getitemlink(ReedBundle));
+ next;
+ .@dest=HCD_HERBFIELDS;
+ .@hours=1;
+ break;
+ case 3:
+ mesc ".:: " + l("Ore Mines") + " ::.";
+ mesc l("Send your Homunculus to mineration!");
+ mesc l("Average EXP: "+12), 3;
+ mesc l("Common Drops: "+
+ getitemlink(Coal));
+ mesc l("Regular Drops: "+
+ getitemlink(IronOre)+
+ getitemlink(CopperOre)+
+ getitemlink(SilverOre)+
+ getitemlink(GoldOre));
+ mesc l("Rare Drops: "+
+ getitemlink(TinOre)+
+ getitemlink(LeadOre)+
+ getitemlink(TitaniumOre)+
+ getitemlink(IridiumOre)+
+ getitemlink(PlatinumOre));
+ next;
+ .@dest=HCD_OREMINES;
+ .@hours=2;
+ break;
+ case 4:
+ mesc ".:: " + l("Rare Mines") + " ::.";
+ mesc l("Send your Homunculus to mineration!");
+ mesc l("Average EXP: "+15), 3;
+ mesc l("Common Drops: "+
+ getitemlink(Pearl));
+ mesc l("Regular Drops: "+
+ getitemlink(Diamond)+
+ getitemlink(Ruby)+
+ getitemlink(Emerald)+
+ getitemlink(Sapphire)+
+ getitemlink(Topaz)+
+ getitemlink(Amethyst));
+ mesc l("Rare Drops: "+
+ getitemlink(LightGreenDiamond)+
+ getitemlink(BlackPearl)+
+ getitemlink(BlueManaPearl));
+ next;
+ .@dest=HCD_RAREMINES;
+ .@hours=2;
+ break;
+ case 5:
+ mesc ".:: " + l("Slime Nest") + " ::.";
+ mesc l("Send your Homunculus to a slime nest!");
+ mesc l("Average EXP: "+800), 3;
+ mesc l("Common Drops: "+
+ getitemlink(MaggotSlime)+
+ getitemlink(Arrow));
+ mesc l("Regular Drops: "+
+ getitemlink(IronArrow)+
+ getitemlink(TreasureKey)+
+ getitemlink(CactusDrink)+
+ getitemlink(CoinBag)+
+ getitemlink(CasinoCoins)+
+ getitemlink(Coal)+
+ getitemlink(Dagger)+
+ getitemlink(Candy)+
+ getitemlink(ChocolateBar));
+ mesc l("Rare Drops: "+
+ getitemlink(Milk)+
+ getitemlink(IcedBottle));
+ next;
+ .@dest=HCD_SLIMENEST;
+ .@hours=3;
+ break;
+ case 6:
+ mesc ".:: " + l("Snake Pit") + " ::.";
+ mesc l("Send your Homunculus to hold off snakes!");
+ mesc l("Average EXP: "+format_number(2250)), 3;
+ mesc l("Common Drops: "+
+ getitemlink(SnakeEgg)+
+ getitemlink(SnakeTongue));
+ mesc l("Regular Drops: "+
+ getitemlink(SnakeSkin));
+ mesc l("Rare Drops: "+
+ getitemlink(JeansShorts)+
+ getitemlink(DivineApple)+
+ getitemlink(Kanabo));
+ next;
+ .@dest=HCD_SNAKEPIT;
+ .@hours=3;
+ break;
+ case 7:
+ mesc ".:: " + l("Dangerous Area") + " ::.";
+ mesc l("Send your Homunculus to hold off snakes!");
+ mesc l("Average EXP: "+format_number(70000)), 3;
+ mesc l("Common Drops: None");
+ mesc l("Regular Drops: "+
+ getitemlink(MoubooSteak)+
+ getitemlink(HastePotion)+
+ getitemlink(StrengthPotion)+
+ getitemlink(SmokeGrenade)+
+ getitemlink(Grenade)+
+ getitemlink(MercBoxA)+
+ getitemlink(AncientBlueprint)+
+ getitemlink(Lockpicks)+
+ getitemlink(StatusResetPotion)+
+ getitemlink(TreasureMap));
+ mesc l("Rare Drops: "+
+ getitemlink(MagicApple));
+ next;
+ .@dest=HCD_DANGERAREA;
+ .@hours=6;
+ break;
+ case 8:
+ mesc ".:: " + l("Monster King Basement") + " ::.";
+ mesc l("Send your Homunculus to one of the most dangerous...!");
+ mesc l("Average EXP: "+format_number(1000000)), 3;
+ mesc l("Common Drops: None");
+ mesc l("Regular Drops: "+
+ getitemlink(Curshroom)+
+ getitemlink(HastePotion)+
+ getitemlink(StrengthPotion)+
+ getitemlink(SmokeGrenade)+
+ getitemlink(Grenade)+
+ getitemlink(AncientBlueprint)+
+ getitemlink(TreasureMap)+
+ getitemlink(CrazyRum)+
+ getitemlink(MercBoxB));
+ mesc l("Rare Drops: "+
+ getitemlink(WhiskeyAle)+
+ getitemlink(GoldenApple)+
+ getitemlink(DivineApple)+
+ getitemlink(MagicApple));
+ next;
+ .@dest=HCD_MKBASEMENT;
+ .@hours=8;
+ break;
+ case 10:
+ mesc ".:: " + l("The Market") + " ::.";
+ mesc l("Send your Homunculus to make money!");
+ mesc l("Average EXP: 8"), 3;
+ mesc l("Maximum Profit: 10000 GP"), 3;
+ mesc l("Common Drops: "+
+ getitemlink(Piberries));
+ mesc l("Regular Drops: "+
+ getitemlink(Bread)+
+ getitemlink(Cheese)+
+ getitemlink(Beer));
+ mesc l("Rare Drops: "+
+ getitemlink(TreasureMap));
+ next;
+ .@dest=HCD_MARKET;
+ .@hours=1;
+ break;
+ default:
+ close;
+ }
+
+ // Confirmation
+ mesc l("Really deploy your homunculus?"), 1;
+ if (askyesno() == ASK_NO)
+ goto L_Main;
+
+ // Deploy Homunculus (if possible)
+ if (!homstatus() && gethominfo(0)) {
+ deployhomunculus();
+ mesc l("Deployed!"), 2;
+ HOMUN_DEPLOYFIELD=.@dest;
+ HOMUN_DEPLOYDATE=gettimetick(2)+(60*.@hours);
+ }
+ close;
+
+// lootField (Field ID)
+// Returns amount of Homunculus EXP to get
+function lootField {
+ // Ensure you have free space
+ inventoryplace Iten, 3, NPCEyes, 10;
+ .@lv=gethominfo(6);
+
+ // Base EXP is based on Homunculus level and intimacy
+ .@val=.@lv*min(10000, gethominfo(3))/10000;
+
+ switch (getarg(0)) {
+ case HCD_PIOUFIELDS:
+ .@val+=100;
+ anyloot(PiouFeathers, .@lv, 10000,
+ PiouLegs, max(1, .@lv/2), 8000,
+ HalfEggshell, .@lv, 6000,
+ GoldenApple, 1, 100);
+ break;
+ case HCD_HERBFIELDS:
+ .@val+=5;
+ anyloot(ArtichokeHerb, .@lv, 10000,
+ CobaltHerb, max(1, .@lv/2), 6000,
+ GambogeHerb, max(1, .@lv/2), 6000,
+ MauveHerb, max(1, .@lv/2), 6000,
+ AlizarinHerb, max(1, .@lv/2), 6000,
+ ShadowHerb, max(1, .@lv/3), 4000,
+ ReedBundle, 2, 800);
+ break;
+ case HCD_OREMINES:
+ .@val+=12;
+ anyloot(Coal, .@lv, 9999,
+ IronOre, max(1, .@lv/2), 2000,
+ CopperOre, max(1, .@lv/2), 1000,
+ SilverOre, max(1, .@lv/3), 700,
+ GoldOre, max(1, .@lv/4), 450,
+ TinOre, max(1, .@lv/5), 350,
+ LeadOre, max(1, .@lv/6), 300,
+ TitaniumOre, max(1, .@lv/8), 100,
+ IridiumOre, max(1, .@lv/10), 80,
+ PlatinumOre, 1, 20);
+ break;
+ case HCD_RAREMINES:
+ .@val+=15;
+ anyloot(Pearl, 1, 9999,
+ Diamond, limit(1, .@lv/2, 3), 2000,
+ Ruby, limit(1, .@lv/2, 3), 1700,
+ Emerald, limit(1, .@lv/2, 3), 1400,
+ Sapphire, limit(1, .@lv/2, 3), 1100,
+ Topaz, limit(1, .@lv/2, 3), 800,
+ Amethyst, limit(1, .@lv/2, 3), 500,
+ LightGreenDiamond, 1, 100,
+ BlackPearl, 1, 10,
+ BlueManaPearl, 1, 1);
+ break;
+ case HCD_SLIMENEST:
+ .@val+=800;
+ anyloot(MaggotSlime, .@lv, 10000,
+ Arrow, .@lv, 9000,
+ IronArrow, .@lv, 4000,
+ TreasureKey, max(1, .@lv/10), 6000,
+ CactusDrink, limit(1, .@lv/10, 3), 4000,
+ CoinBag, limit(1, .@lv/8, 5), 4000,
+ CasinoCoins, limit(1, .@lv/6, 10), 3200,
+ Coal, limit(1, .@lv/10, 3), 3000,
+ Dagger, limit(1, .@lv/15, 3), 3000,
+ Candy, limit(1, .@lv/5, 6), 2000,
+ ChocolateBar, limit(1, .@lv/20, 3), 1000,
+ Milk, 1, 200,
+ IcedBottle, 1, 60);
+ break;
+ case HCD_SNAKEPIT:
+ .@val+=2250;
+ anyloot(SnakeEgg, limit(1, .@lv/8, 10), 9600,
+ SnakeTongue, limit(1, .@lv/16, 5), 9500,
+ SnakeSkin, limit(1, .@lv/20, 3), 7000,
+ JeansShorts, 1, 300,
+ DivineApple, 1, 10,
+ Kanabo, 1, 1); // Teasing Xanthem for mapping here
+ break;
+ case HCD_DANGERAREA:
+ .@val+=70000;
+ anyloot(MoubooSteak, limit(1, .@lv/28, 6), 2500,
+ HastePotion, limit(1, .@lv/20, 10), 2000,
+ StrengthPotion, limit(1, .@lv/20, 10), 2000,
+ SmokeGrenade, limit(1, .@lv/18, 8), 2000,
+ Grenade, limit(1, .@lv/28, 6), 2000,
+ MercBoxA, 1, 1500,
+ AncientBlueprint, 1, 1500,
+ Lockpicks, limit(1, .@lv/30, 4), 1000,
+ StatusResetPotion, 1, 1000,
+ TreasureMap, 1, 700,
+ MagicApple, 1, 40);
+ break;
+ case HCD_MKBASEMENT:
+ .@val+=1000000;
+ anyloot(Curshroom, limit(1, .@lv/28, 6), 3000,
+ HastePotion, limit(1, .@lv/20, 10), 3000,
+ StrengthPotion, limit(1, .@lv/20, 10), 3000,
+ SmokeGrenade, limit(1, .@lv/18, 8), 3000,
+ Grenade, limit(1, .@lv/28, 6), 3000,
+ AncientBlueprint, 1, 2500,
+ TreasureMap, 1, 2000,
+ CrazyRum, 1, 1500,
+ MercBoxB, 1, 1000,
+ WhiskeyAle, 1, 400,
+ GoldenApple, 1, 80,
+ DivineApple, 1, 60,
+ MagicApple, 1, 45);
+ break;
+ case HCD_MARKET:
+ .@val+=8;
+ // Maximum Profit: 10,000 GP
+ // Sending a fresh homun in market may yield no GP.
+ Zeny+=min(10000, 1000*.@lv*min(10000, gethominfo(3))/10000);
+ anyloot(Piberries, .@lv, 9000,
+ Bread, .@lv, 7000,
+ Cheese, .@lv, 5000,
+ Beer, limit(1, .@lv/10, 10), 1200,
+ TreasureMap, 1, 420);
+ break;
+ }
+ // A final boost for sake of randomness
+ .@val+=rand2(0, 3);
+ return .@val;
+}
+
+OnInit:
+ .sex=G_MALE;
+ .distance=5;
+ end;
+
+}
+
diff --git a/npc/017-7/utils.txt b/npc/017-7/utils.txt
index 0e8275b41..604bf19fe 100644
--- a/npc/017-7/utils.txt
+++ b/npc/017-7/utils.txt
@@ -83,13 +83,8 @@ OnInit:
017-7,29,24,0 script Cauldron#RES_0177 NPC_NO_SPRITE,{
- mesc l("What will you brew today?");
- if (AlchemySystem(CRAFT_PLAYER))
- mesc l("Success!"), 3;
- else
- mesc l("That didn't work!"), 1;
+ realestate_cauldron();
close;
- end;
OnInit:
.distance=3;
@@ -98,67 +93,7 @@ OnInit:
017-7,34,25,0 script Piano#RES_0177 NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "017-7", .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/017-8/utils.txt b/npc/017-8/utils.txt
index eab10357d..ec0966b7d 100644
--- a/npc/017-8/utils.txt
+++ b/npc/017-8/utils.txt
@@ -83,13 +83,8 @@ OnInit:
017-8,29,24,0 script Cauldron#RES_0178 NPC_NO_SPRITE,{
- mesc l("What will you brew today?");
- if (AlchemySystem(CRAFT_PLAYER))
- mesc l("Success!"), 3;
- else
- mesc l("That didn't work!"), 1;
+ realestate_cauldron();
close;
- end;
OnInit:
.distance=3;
@@ -98,67 +93,7 @@ OnInit:
017-8,34,25,0 script Piano#RES_0178 NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "017-8", .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/018-2-1/dustman.txt b/npc/018-2-1/dustman.txt
index dfe6e0d9b..ba4d76692 100644
--- a/npc/018-2-1/dustman.txt
+++ b/npc/018-2-1/dustman.txt
@@ -202,6 +202,7 @@ OnInit:
// CoD Exchange Booth Selection
sellitem Dustynator,3000;
+ sellitem ArcmageBoxset,880;
sellitem StrangeCoin,10;
sellitem HeroCoin,1;
end;
diff --git a/npc/018-2-2/main.txt b/npc/018-2-2/main.txt
index 7bd3204b0..5bd683233 100644
--- a/npc/018-2-2/main.txt
+++ b/npc/018-2-2/main.txt
@@ -59,12 +59,11 @@ OnMasterBossKilled:
$HEROESHOLD_WINNER$=strcharinfo(0);
channelmes("#world", $HEROESHOLD_WINNER$+" is the first player to finish HEROES HOLD Master Dungeon!! GG, dude! %%N");
announce "All hail ##B"+$HEROESHOLD_WINNER$+"##b, first to complete the ##3HEROES HOLD Master Dungeon!", bc_all|bc_npc;
- Karma=Karma+1;
getexp 0, 2000;
getitembound Tyranny, 1, 1;
getitem PrismGift, 1;
mesc l("CONGRATULATIONS! You are the first player to finish Heroes Hold Master Dungeon!!"), 2;
- mesc l("You just gained a Karma point, a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
+ mesc l("You just gained a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
}
DungeonClear();
monster "018-2-5@Ma", any(52,188), any(29,196), "Master Dungeon Boss", MonsterKing, 1, "#HH_CONTROLLER01::OnMasterBossKilled";
diff --git a/npc/018-2-4/lv1.txt b/npc/018-2-4/lv1.txt
index de38a69cc..0e08e2d7c 100644
--- a/npc/018-2-4/lv1.txt
+++ b/npc/018-2-4/lv1.txt
@@ -28,6 +28,7 @@ OnInit:
tradertype(NST_CUSTOM);
+ sellitem EquipmentBlueprintA,2000;
sellitem RaidTrousers,1200;
sellitem BugSlayer,800;
sellitem LeatherShield,600;
diff --git a/npc/018-2-4/lv2.txt b/npc/018-2-4/lv2.txt
index 4f20b4625..3738e8efb 100644
--- a/npc/018-2-4/lv2.txt
+++ b/npc/018-2-4/lv2.txt
@@ -28,6 +28,7 @@ OnInit:
tradertype(NST_CUSTOM);
+ sellitem EquipmentBlueprintB,3000;
sellitem ShortSword,1800;
sellitem Chainmail,1400;
diff --git a/npc/018-2-4/lv3.txt b/npc/018-2-4/lv3.txt
index 2fd244be2..e0927ce61 100644
--- a/npc/018-2-4/lv3.txt
+++ b/npc/018-2-4/lv3.txt
@@ -29,7 +29,8 @@ OnInit:
tradertype(NST_CUSTOM);
sellitem Kanabo,5400;
- sellitem ArcmageBoxset,3750;
+ sellitem EquipmentBlueprintC,4200;
+ sellitem ArcmageBoxset,3250;
sellitem SteelShovel,2000;
sellitem MercBoxA,1200;
diff --git a/npc/018-2-4/lv4.txt b/npc/018-2-4/lv4.txt
index ee74bd4cc..f91d7ade8 100644
--- a/npc/018-2-4/lv4.txt
+++ b/npc/018-2-4/lv4.txt
@@ -31,6 +31,7 @@ OnInit:
sellitem BlacksmithAxe,30000;
sellitem Judgement,16200;
+ sellitem EquipmentBlueprintD,5500;
sellitem MercBoxB,2200;
sellitem GoldenGift,1920;
diff --git a/npc/018-4-2/susanne.txt b/npc/018-4-2/susanne.txt
index 2d2678e44..165f0b170 100644
--- a/npc/018-4-2/susanne.txt
+++ b/npc/018-4-2/susanne.txt
@@ -4,6 +4,7 @@
// Jesusalva
// Description:
// Slay the Fafi Dragon quest. Due the OP monster, you better find yourself a good team!
+// {quest status, respawns issued}
018-4-2,31,26,0 script Susanne NPC_FAIRY_A,{
.@q=getq(LoFQuest_Fairy);
@@ -51,7 +52,7 @@ OnKillFafi:
message strcharinfo(0), "You killed the Fafi Dragon.";
.@q=getq(LoFQuest_Fairy);
if (.@q == 1) {
- setq LoFQuest_Fairy, 2;
+ setq LoFQuest_Fairy, 2, 0;
mapannounce "018-4-2", "" +strcharinfo(0)+ " has killed the Fafi Dragon!", 0;
mapannounce "018-4-1", "" +strcharinfo(0)+ " has killed the Fafi Dragon!", 0;
mapannounce "018-4", "" +strcharinfo(0)+ " has killed the Fafi Dragon!", 0;
@@ -113,6 +114,11 @@ L_Check:
mesn;
mesq l("Just wait. Fafi dragons are slow to show up...");
} else {
+ .@q=limit(0, getq2(LoFQuest_Fairy), 3);
+ // First time is ALWAYS free
+ if (!.@q)
+ goto L_Spawn;
+
mesn;
mesq l("The Fafi knows you are here to kill him. They are smart. But I can make a trap.");
next;
@@ -153,8 +159,9 @@ L_Spawn:
mesn;
mesc l("Screams");
mesq l("I hear a Fafi Dragon on THIS very island!!");
- .respawnTime=gettimetick(2)+(60*90);
+ .respawnTime=gettimetick(2)+(60*30);
monster "018-4", any(64,83,100,123,139), any(64,74,89), strmobinfo(1, FafiDragon), FafiDragon, 1, "Susanne::OnKillFafi";
+ setq2 LoFQuest_Fairy, getq2(LoFQuest_Fairy)+1;
}
close;
diff --git a/npc/020-5/bracco.txt b/npc/020-5/bracco.txt
index 3a3c33b3c..9452de333 100644
--- a/npc/020-5/bracco.txt
+++ b/npc/020-5/bracco.txt
@@ -127,13 +127,13 @@ L_Forge:
case 1:
close; break;
case 2:
- blacksmith_create(LeatherPatch, 50, TitaniumIngot, 1, Armbands, 6500);
+ blacksmith_create(LeatherPatch, 40, TitaniumIngot, 1, Armbands, 6500);
break;
case 3:
- blacksmith_create(CopperIngot, 30, Coal, 40, CopperArmbands, 11000);
+ blacksmith_create(CopperIngot, 10, Coal, 30, CopperArmbands, 11000);
break;
case 4:
- blacksmith_create(IronIngot, 90, Coal, 80, IronArmbands, 21000);
+ blacksmith_create(IronIngot, 40, Coal, 80, IronArmbands, 21000);
break;
}
goto L_Forge;
@@ -151,6 +151,7 @@ L_Meltdown:
mes "";
// Returns 50~70% of invested ingots, rounded down. Never returns Coal.
switch (.@id) {
+ // Special Exceptions
case SilverMirror:
Meltdown(.@it, 500, SilverOre, rand2(2, 5)); // Exception
break;
@@ -169,6 +170,7 @@ L_Meltdown:
case Dagger:
Meltdown(.@it, 100, IronOre, any(2, 2, 3, 3, 4, 5)); // Exception
break;
+ // Official Weapons
case WoodenSword:
Meltdown(.@it, 500, WoodenLog, rand2(5,10)); // Exception: 25~50% returned
break;
@@ -190,6 +192,23 @@ L_Meltdown:
case Broadsword:
Meltdown(.@it, 2000, SilverIngot, rand2(13,18));
break;
+ // Bows can go up to 100% but only wood is returned
+ case ShortBow:
+ Meltdown(.@it, 2000, WoodenLog, rand2(9,18));
+ break;
+ case ForestBow:
+ Meltdown(.@it, 2000, WoodenLog, rand2(12,24));
+ break;
+ case ElficBow:
+ Meltdown(.@it, 1500, WoodenLog, rand2(16,33));
+ break;
+ case ChampionshipBow:
+ Meltdown(.@it, 1000, WoodenLog, rand2(24,48));
+ break;
+ case BansheeBow:
+ Meltdown(.@it, 500, WoodenLog, rand2(35,70));
+ break;
+
// Wands have no warranted min. and are more expensive because they are sold
case TrainingWand:
Meltdown(.@it, 12000, WoodenLog, rand2(1,14), ManaPiouFeathers, rand2(0, 21), FluoPowder, rand2(0,3));
diff --git a/npc/020-7-2/connor.txt b/npc/020-7-2/connor.txt
index 18dce7d2c..9e8701ecb 100644
--- a/npc/020-7-2/connor.txt
+++ b/npc/020-7-2/connor.txt
@@ -20,13 +20,13 @@
mesq l("Well, I could burn @@ @@ to make Raw Coal and the Blue Sage would be none the wiser.", 15, getitemlink(RawLog));
next;
mesn;
- mesq l("I can even share with you @@ @@, whaddaya say?", l("a couple of"), getitemlink(Coal)); // ie. whaddaya say -> what do you say
+ mesq l("I can even share with you @@ @@, whaddaya say?", l("three"), getitemlink(Coal)); // ie. whaddaya say -> what do you say
if (countitem(RawLog) < 15)
close;
if (askyesno() == ASK_YES) {
- inventoryplace Coal, 2;
+ inventoryplace Coal, 3;
delitem RawLog, 15;
- getitem Coal, 2;
+ getitem Coal, 3;
CONNOR_LASTDAY=.@t;
getexp getiteminfo(Coal, ITEMINFO_SELLPRICE)+BaseLevel+JobLevel, 15;
mes "";
diff --git a/npc/021-4/main.txt b/npc/021-4/main.txt
index 659f77232..2bbbda804 100644
--- a/npc/021-4/main.txt
+++ b/npc/021-4/main.txt
@@ -107,7 +107,24 @@ OnInit:
areamonster "021-4", 20, 20, 100, 80, "Moggun", Moggun, .@pl, "Cindy#Outside::OnPetDeath";
areamonster "021-4", 20, 20, 100, 80, "Slime Blast", SlimeBlast, $@CINDY_STATE+1;
}
- hello; end;
+
+ // If a major bug happened, do it now
+ // This finishes the quest
+ .@y=mobcount("021-4", "Cindy#Outside::OnPetDeath");
+ if (.@y == 0 && .canfinish) {
+ $@CINDY_STATE=gettimetick(2)+60*rand2(55,65)*rand2(4,36); // It is way too random to I say how long it takes (220min ~ 39 hours)
+ mapannounce "021-4", "Nivalis: Cindy is now safe!",bc_all|bc_npc;
+ areatimer "021-4", 20, 20, 100, 80, 10, "Cindy#Outside::OnReward";
+ setnpcdisplay .name$, NPC_CINDY;
+ stopnpctimer;
+ end;
+ }
+
+ if (.canfinish)
+ npctalk l("*scream*");
+ else
+ npctalk3 l("Please get me out of here!");
+ end;
// Start
L_Start:
@@ -179,13 +196,12 @@ L_Winner:
if ($CINDY_WINNER$ == "") {
$CINDY_WINNER$=strcharinfo(0);
channelmes("#world", $CINDY_WINNER$+" is the first player to finish Cindy Quest!! GG, dude! %%N");
- announce "All hail ##B"+$CINDY_WINNER$+"##b, first to complete the ##3Cindy Quesy!", bc_all|bc_npc;
- Karma=Karma+1;
+ announce "All hail ##B"+$CINDY_WINNER$+"##b, first to complete the ##3Cindy Quest!", bc_all|bc_npc;
getexp 0, 2000;
getitembound DemureAxe, 1, 1;
getitem PrismGift, 1;
mesc l("CONGRATULATIONS! You are the first player to finish Cindy Quest!!"), 2;
- mesc l("You just gained a Karma point, a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
+ mesc l("You just gained a Prism Gift, and 2000 Job Exp for your bravery!"), 2;
} else {
if (getcharid(1) > 0)
.@v$=getpartyname(getcharid(1));
@@ -267,10 +283,11 @@ OnTimer2000:
// This finishes the quest
if (.@y == 0 && .canfinish) {
- $@CINDY_STATE=gettimetick(2)+60*rand(55,65)*rand(4,36); // It is way too random to I say how long it takes (220min ~ 39 hours)
+ $@CINDY_STATE=gettimetick(2)+60*rand2(55,65)*rand2(4,36); // It is way too random to I say how long it takes (220min ~ 39 hours)
mapannounce "021-4", "Nivalis: Cindy is now safe!",bc_all|bc_npc;
areatimer "021-4", 20, 20, 100, 80, 10, "Cindy#Outside::OnReward";
setnpcdisplay .name$, NPC_CINDY;
+ stopnpctimer;
end;
}
.wtime+=2;
@@ -307,7 +324,7 @@ OnTimer2000:
// To make easier, we spawn some Mogguns, too.
// The ratio is Yeti 2:1 Moggun. (Third Yeti is replaced)
.@mogg=.@value/3;
- .@yeti=.@value-@mogg;
+ .@yeti=.@value-.@mogg;
areamonster "021-4", 20, 20, 100, 80, "Yeti", Yeti, .@yeti, "Cindy#Outside::OnPetDeath";
areamonster "021-4", 20, 20, 100, 80, "Moggun", Moggun, .@mogg, "Cindy#Outside::OnPetDeath";
npctalk any("Yetis!",
diff --git a/npc/022-1/sign.txt b/npc/022-1/sign.txt
index d914d16eb..60accb37c 100644
--- a/npc/022-1/sign.txt
+++ b/npc/022-1/sign.txt
@@ -6,8 +6,9 @@
022-1,38,44,0 script Sign#02213844 NPC_SWORDS_SIGN,{
mesc b(l(".:: PVP King Imperial Arena ::."));
- mesc l("The Arena is currently closed for maintenance, and will be open at Release 9.");
+ mesc l("The Arena is currently closed for maintenance.");
mesc l("It's advised to collect PVP equipment.");
+ mesc l("If you think this should be a priority, please ask Jesusalva."), 1;
close;
OnInit:
diff --git a/npc/024-13/manager.txt b/npc/024-13/manager.txt
index d65897405..9931f4c9f 100644
--- a/npc/024-13/manager.txt
+++ b/npc/024-13/manager.txt
@@ -102,8 +102,8 @@ OnTouch:
// Record important stuff & load furniture
ESTATE_ID=.@INSTID;
- addtimer(20, "Doorbell#RES_PPL::OnReload");
- addtimer(70, "NPCs#RES_PPL::OnReload");
+ addtimer(20, instance_npcname("Doorbell#RES_PPL", .@INSTID)+"::OnReload");
+ addtimer(70, instance_npcname("NPCs#RES_PPL", .@INSTID)+"::OnReload");
// It'll be self-destroyed eventually...
instance_set_timeout(1000000, 1000000, .@INSTID);
diff --git a/npc/024-14/doorbell.txt b/npc/024-14/doorbell.txt
index ef0a04246..166a1b387 100644
--- a/npc/024-14/doorbell.txt
+++ b/npc/024-14/doorbell.txt
@@ -62,7 +62,7 @@ L_Manage:
goto L_Furniture;
break;
case 3:
- addtimer2(150, "NPCs#RES_PPL::OnReload");
+ addtimer2(150, instance_npcname("NPCs#RES_PPL")+"::OnReload");
close;
break;
}
diff --git a/npc/024-14/utils.txt b/npc/024-14/utils.txt
index 646493b2d..ad9c51134 100644
--- a/npc/024-14/utils.txt
+++ b/npc/024-14/utils.txt
@@ -60,33 +60,7 @@ OnInit:
024-14,28,27,0 script Cauldron#RES_PPL NPC_NO_SPRITE,{
- select
- l("Alchemy"),
- l("Crafting");
- mes "";
- if (@menu == 1) {
- do {
- mesc l("What will you brew today?");
- if (AlchemySystem(CRAFT_PLAYER))
- mesc l("Success!"), 3;
- else
- mesc l("That didn't work!"), 1;
- next;
- mesc l("Try again?");
- } while (askyesno() == ASK_YES);
- }
- else if (@menu == 2) {
- do {
- mesc l("What will you craft today?");
- if (SmithSystem(CRAFT_PLAYER))
- mesc l("Success!"), 3;
- else
- mesc l("That didn't work!"), 1;
- next;
- mesc l("Try again?");
- } while (askyesno() == ASK_YES);
- }
-
+ realestate_cauldron();
close;
OnInit:
@@ -96,67 +70,7 @@ OnInit:
024-14,32,26,0 script Piano#RES_PPL NPC_NO_SPRITE,{
- mesc l("Do you want to play a song?");
- mesc l("This is not saved.");
- select
- l("Nothing"),
- l("Default"),
- l("Indoors 1 (Peace)"),
- l("Indoors 2 (Dimonds)"),
- l("TMW Adventure"),
- l("Sailing Away!"),
- l("Magick Real"),
- l("The Forest"),
- l("Dragons and Toast"),
- l("Unforgiving Lands"),
- l("Arabesque (Action)"),
- l("No Chains (Tulimshar)"),
- l("School of Quirks (Candor)"),
- l("Cake Town (Hurnscald)"),
- l("Steam (LoF Village)"),
- l("Woodland Fantasy"),
- l("Birds in the Sunrise");
-
- mes "";
- .@m$="";
- switch (@menu) {
- case 1:
- close;
- case 2:
- .@m$="8bit_the_hero.ogg"; break;
- case 3:
- .@m$="peace.ogg"; break;
- case 4:
- .@m$="peace2.ogg"; break;
- case 5:
- .@m$="tmw_adventure.ogg"; break;
- case 6:
- .@m$="sail_away.ogg"; break;
- case 7:
- .@m$="magick_real.ogg"; break;
- case 8:
- .@m$="dariunas_forest.ogg"; break;
- case 9:
- .@m$="dragon_and_toast.ogg"; break;
- case 10:
- .@m$="Unforgiving_Lands.ogg"; break;
- case 11:
- .@m$="Arabesque.ogg"; break;
- case 12:
- .@m$="mvrasseli_nochains.ogg"; break;
- case 13:
- .@m$="school_of_quirks.ogg"; break;
- case 14:
- .@m$="caketown.ogg"; break;
- case 15:
- .@m$="steam.ogg"; break;
- case 16:
- .@m$="woodland_fantasy.ogg"; break;
- case 17:
- .@m$="tws_birds_in_the_sunrise.ogg"; break;
-
- }
- changemusic "ples@"+getcharid(0), .@m$;
+ realestate_piano();
close;
OnInit:
diff --git a/npc/024-15/lilanna.txt b/npc/024-15/lilanna.txt
index fab4ca3f5..5c349a9b8 100644
--- a/npc/024-15/lilanna.txt
+++ b/npc/024-15/lilanna.txt
@@ -19,6 +19,7 @@ L_Loop:
l("Thanks."),
l("What ANISE INC. Does?"),
l("How to use best Warp Technology?"),
+ l("I would like to buy a Warp Crystal."),
rif(countitem(BrokenWarpCrystal), l("My warp crystal broke!"));
mes "";
switch (@menu) {
@@ -60,6 +61,11 @@ L_Loop:
next;
break;
case 4:
+ openshop();
+ closeclientdialog;
+ end;
+ break;
+ case 5:
FixSelect();
break;
}
@@ -96,25 +102,25 @@ function FixSelect {
mes l("You have: @@ Broken crystals", countitem(BrokenWarpCrystal));
select
l("Don't fix."),
- rif(true, l("Candor - 2,500 GP")),
- rif(TELEPORTERS & TP_TULIM, l("Tulimshar - 7,500 GP")),
- rif(TELEPORTERS & TP_HURNS, l("Hurnscald - 7,500 GP")),
- rif(TELEPORTERS & TP_NIVAL, l("Nivalis - 7,500 GP")),
- rif(TELEPORTERS & TP_FROST|TP_HALIN, l("Land Of Fire - 12,000 GP")),
- rif(TELEPORTERS & TP_HALIN, l("Halinarzo - 20,000 GP")),
- rif(TELEPORTERS & TP_FROST, l("Frostia - 30,000 GP")),
- rif(TELEPORTERS & TP_LILIT, l("Lilit - 50,000 GP (not exchangeable)"));
+ rif(true, l("Candor - @@ GP", format_number(1500))),
+ rif(TELEPORTERS & TP_TULIM, l("Tulimshar - @@ GP", format_number(2500))),
+ rif(TELEPORTERS & TP_HURNS, l("Hurnscald - @@ GP", format_number(2500))),
+ rif(TELEPORTERS & TP_NIVAL, l("Nivalis - @@ GP", format_number(2500))),
+ rif(TELEPORTERS & TP_FROST|TP_HALIN, l("Land Of Fire - @@ GP", format_number(5000))),
+ rif(TELEPORTERS & TP_HALIN, l("Halinarzo - @@ GP", format_number(10000))),
+ rif(TELEPORTERS & TP_FROST, l("Frostia - @@ GP", format_number(10000))),
+ rif(TELEPORTERS & TP_LILIT, l("Lilit - @@ GP (not exchangeable)", format_number(20000)));
mes "";
switch (@menu) {
case 1: return;
- case 2: FixCrystal(CandorWarpCrystal, 2500); break;
- case 3: FixCrystal(TulimWarpCrystal, 7500); break;
- case 4: FixCrystal(HurnsWarpCrystal, 7500); break;
- case 5: FixCrystal(NivalWarpCrystal, 7500); break;
- case 6: FixCrystal(LoFWarpCrystal, 12000); break;
- case 7: FixCrystal(HalinWarpCrystal, 20000); break;
- case 8: FixCrystal(FrostiaWarpCrystal, 30000); break;
- case 9: FixCrystal(LilitWarpCrystal, 50000); break;
+ case 2: FixCrystal(CandorWarpCrystal, 1500); break;
+ case 3: FixCrystal(TulimWarpCrystal, 2500); break;
+ case 4: FixCrystal(HurnsWarpCrystal, 2500); break;
+ case 5: FixCrystal(NivalWarpCrystal, 2500); break;
+ case 6: FixCrystal(LoFWarpCrystal, 5000); break;
+ case 7: FixCrystal(HalinWarpCrystal, 10000); break;
+ case 8: FixCrystal(FrostiaWarpCrystal, 10000); break;
+ case 9: FixCrystal(LilitWarpCrystal, 20000); break;
}
} while (countitem(BrokenWarpCrystal));
return;
@@ -159,9 +165,15 @@ OnInit:
"wait", 10, 0;
initialmove;
initnpctimer;
+ tradertype(NST_MARKET);
+ sellitem BrokenWarpCrystal, 50000, 1;
.sex = G_MALE;
.distance = 5;
end;
+
+OnClock2358:
+ restoreshopitem BrokenWarpCrystal, 50000, 1;
+ end;
}
diff --git a/npc/_import.txt b/npc/_import.txt
index e004b6aaf..d568e0aaf 100644
--- a/npc/_import.txt
+++ b/npc/_import.txt
@@ -98,6 +98,7 @@
@include "npc/016-6/_import.txt"
@include "npc/016-7/_import.txt"
@include "npc/017-1/_import.txt"
+@include "npc/017-10/_import.txt"
@include "npc/017-2-1/_import.txt"
@include "npc/017-2-2/_import.txt"
@include "npc/017-2/_import.txt"
diff --git a/npc/boss/throne.txt b/npc/boss/throne.txt
index dcc601b03..ebf2a29cc 100644
--- a/npc/boss/throne.txt
+++ b/npc/boss/throne.txt
@@ -20,8 +20,8 @@ OnBegin:
$@MK_CHALLENGE=true;
.MK=monster("boss", 45, 45, "The Monster King", MonsterKing, 1, .name$+"::OnVictory");
.@bhp=getunitdata(.MK, UDT_MAXHP);
- setunitdata(.MK, UDT_MAXHP, .@bhp+50000+2000*.FAILS);
- setunitdata(.MK, UDT_HP, .@bhp+50000+2000*.FAILS);
+ setunitdata(.MK, UDT_MAXHP, .@bhp+2000*.FAILS);
+ setunitdata(.MK, UDT_HP, .@bhp+2000*.FAILS);
// Spawn reinforcements
.@mobId=MonsterLieutenant;
diff --git a/npc/commands/exp.txt b/npc/commands/exp.txt
index 763653f94..7f9d15d6f 100644
--- a/npc/commands/exp.txt
+++ b/npc/commands/exp.txt
@@ -18,6 +18,18 @@ OnCall:
getexp .@d, 0;
end;
+OnHomun:
+ if (!gethominfo(0)) {
+ dispbottom l("No homunculus found!");
+ end;
+ }
+ .@delta$ = .@atcmd_parameters$[0];
+ .@d = atoi(.@delta$);
+
+ gethomunexp .@d;
+ end;
+
OnInit:
bindatcmd "getexp", "@getexp::OnCall", 5, 99, 1;
+ bindatcmd "gethexp", "@getexp::OnHomun", 99, 99, 1;
}
diff --git a/npc/commands/ipcheck.txt b/npc/commands/ipcheck.txt
index a610c84cd..a1f9345c2 100644
--- a/npc/commands/ipcheck.txt
+++ b/npc/commands/ipcheck.txt
@@ -20,6 +20,34 @@ OnCall:
end;
OnInit:
- bindatcmd "ipcheck", "@ipcheck::OnCall", 80, 80, 1;
+ bindatcmd "ipcheck", "@ipcheck::OnCall", 80, 100, 1;
end;
}
+
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// @checkidle <player_name>
+// #checkidle <player_name>
+//
+// Returns user idle time in seconds.
+// Useful when the game prohibits warping to player.
+
+
+- script @checkidle 32767,{
+ end;
+
+OnCall:
+ if (.@atcmd_numparameters == 0)
+ .@request$ = strcharinfo(0);
+ else
+ .@request$ = implode(.@atcmd_parameters$, " ");
+ dispbottom strip(.@request$)+" idle time: "+checkidle(.@request$);
+ //dispbottom strcharinfo(0)+": IP "+getcharip(.@request$);
+ end;
+
+OnInit:
+ bindatcmd "checkidle", "@checkidle::OnCall", 60, 80, 1;
+ end;
+}
+
diff --git a/npc/commands/music.txt b/npc/commands/music.txt
index e419487c8..410a24421 100644
--- a/npc/commands/music.txt
+++ b/npc/commands/music.txt
@@ -29,8 +29,8 @@ OnCall:
if (.@m$ == "Not found") {
//.@m$ = implode(.@atcmd_parameters$[0], " ");
dispbottom "Invalid music key. Current accepted values are:";
- dispbottom "ship, city, ghoul, surreal, magic, forest, mythica, acid, misuse, prelude, sunrise, peace, peace2, toast, woodland2";
- dispbottom "unforgiving, deepcave, 8bit, action, hurns, fields, tulim, candor, lof, icecave, manacave, adventure, dance";
+ dispbottom "ship, city, ghoul, surreal, magic, forest, mythica, acid, misuse, prelude, sunrise, peace, peace2, peace3, toast, woodland2";
+ dispbottom "unforgiving, deepcave, 8bit, action, hurns, fields, tulim, candor, lof, icecave, manacave, adventure, dance, academy";
} else {
changemusic .@map$, .@m$;
}
@@ -53,6 +53,7 @@ OnInit:
htput(.hash, "sunrise", "tws_birds_in_the_sunrise.ogg");
htput(.hash, "peace", "peace.ogg");
htput(.hash, "peace2", "peace2.ogg");
+ htput(.hash, "peace3", "peace3.ogg");
htput(.hash, "toast", "dragon_and_toast.ogg");
htput(.hash, "woodland2", "New_Woodlands.ogg");
htput(.hash, "unforgiving","Unforgiving_Lands.ogg");
@@ -68,4 +69,5 @@ OnInit:
htput(.hash, "adventure", "tmw_adventure.ogg");
htput(.hash, "manacave", "tws_green_island.ogg");
htput(.hash, "dance", "dance_monster.ogg");
+ htput(.hash, "academy", "academy_bells.ogg");
}
diff --git a/npc/craft/options.txt b/npc/craft/options.txt
index 37e19e8be..c0ad5c8b7 100644
--- a/npc/craft/options.txt
+++ b/npc/craft/options.txt
@@ -708,7 +708,7 @@ function script csysGUI_OptReq {
case CRGROUP_BOSSATK:
return (getskilllv(TMW2_CRAFT) >= 4 &&
CRAFTSYS[CRGROUP_ATK] >= 3 &&
- CRAFTSYS[CRGROUP_HIT] >= 3 &&
+ CRAFTSYS[CRGROUP_ACC] >= 3 &&
CRAFTSYS[CRGROUP_BASE] >= 4);
case CRGROUP_FINAL:
return (getskilllv(TMW2_CRAFT) >= 5 &&
diff --git a/npc/craft/recipes.txt b/npc/craft/recipes.txt
index c8a3362ca..65409aee8 100644
--- a/npc/craft/recipes.txt
+++ b/npc/craft/recipes.txt
@@ -223,6 +223,19 @@ function readCrafting {
1, TinIngot,
20, Coal,
1, EverburnPowder);
+ // Reserved ID 63 and 64
+ // Halberd is really cheap as it doesn't uses Platinum/Iridium :P
+ showRecipe(CraftHalberd, Halberd,
+ 45, SilverIngot,
+ 5, TinIngot,
+ 34, Coal,
+ 1, EverburnPowder);
+ showRecipe(CraftImmortalSword, ImmortalSword,
+ 40, SilverIngot,
+ 2, PlatinumIngot,
+ 3, IridiumIngot,
+ 1, BlueManaPearl);
+
next;
// Archery Weapons: Always use Wood, Root and Carp.
mesc "----------"+l("Archery Weapon Recipes")+"----------", 2;
@@ -382,11 +395,12 @@ function script MakeBlueprint {
// Now you'll learn some recipe!
.@rcp=any_of(.@recipes);
if (RECIPES_ALCHEMY[.@rcp]) {
- dispbottom l("It was a recipe you already knew...");
+ .@mpot=rand2(900, 1000*.@rarity);
+ dispbottom l("It was a recipe you already knew... (+ @@ Mobpt)", .@mpot);
getexp (BaseLevel+JobLevel)*rand2(1,.@rarity), JobLevel+rand2(1,.@rarity);
// Give you some Monster Points to use with Intense Beard
// You do NOT need to be registered with Aidan for this.
- Mobpt+=rand2(900, 1000*.@rarity);
+ Mobpt+=.@mpot;
} else {
dispbottom l("Learned a new recipe!");
RECIPES_ALCHEMY[.@rcp]=true;
@@ -406,6 +420,7 @@ function script MakeBlueprint {
if (.@rarity & CRAFT_INTERMEDIARY) {
array_push(.@recipes, CraftBugSlayer);
array_push(.@recipes, CraftShortGladius);
+ array_push(.@recipes, CraftMiereCleaver);
array_push(.@recipes, CraftBladeShield);
array_push(.@recipes, CraftNoviceWand);
array_push(.@recipes, CraftForestBow);
@@ -415,7 +430,7 @@ function script MakeBlueprint {
array_push(.@recipes, CraftShortsword);
array_push(.@recipes, CraftBoneKnife);
array_push(.@recipes, CraftKitana);
- array_push(.@recipes, CraftMiereCleaver);
+ array_push(.@recipes, CraftBroadsword);
array_push(.@recipes, CraftPynRevolver);
array_push(.@recipes, CraftApprenticeWand);
array_push(.@recipes, CraftElficBow);
@@ -424,7 +439,7 @@ function script MakeBlueprint {
array_push(.@recipes, CraftGoldenRing);
array_push(.@recipes, CraftLongSword);
array_push(.@recipes, CraftRockKnife);
- array_push(.@recipes, CraftBroadsword);
+ array_push(.@recipes, CraftHalberd);
array_push(.@recipes, CraftPynRifle);
array_push(.@recipes, CraftPynGatling);
array_push(.@recipes, CraftLeaderWand);
@@ -432,6 +447,7 @@ function script MakeBlueprint {
}
if (.@rarity & CRAFT_MASTER) {
array_push(.@recipes, CraftDivineSword);
+ array_push(.@recipes, CraftImmortalSword);
array_push(.@recipes, CraftPynShotgun);
array_push(.@recipes, CraftLegendaryWand);
array_push(.@recipes, CraftBansheeBow);
@@ -440,11 +456,12 @@ function script MakeBlueprint {
// Now you'll learn some recipe!
.@rcp=any_of(.@recipes);
if (RECIPES_EQUIPMENT[.@rcp]) {
- dispbottom l("It was a recipe you already knew...");
+ .@mpot=rand2(900, 1000*.@rarity);
+ dispbottom l("It was a recipe you already knew... (+ @@ Mobpt)", .@mpot);
getexp (BaseLevel+JobLevel)*rand2(1,.@rarity), JobLevel+rand2(1,.@rarity);
// Give you some Monster Points to use with Intense Beard
// You do NOT need to be registered with Aidan for this.
- Mobpt+=rand2(900, 1000*.@rarity);
+ Mobpt+=.@mpot;
} else {
dispbottom l("Learned a new recipe!");
RECIPES_EQUIPMENT[.@rcp]=true;
diff --git a/npc/craft/smith.txt b/npc/craft/smith.txt
index 87dc9d55d..fa866f7eb 100644
--- a/npc/craft/smith.txt
+++ b/npc/craft/smith.txt
@@ -17,15 +17,14 @@
// Usage: SmithSystem ({scope})
// Scopes: CRAFT_NPC, CRAFT_PLAYER, CRAFT_GUILD
-// If an invalid scope is passed, .knowledge won't be set but will be required
+// CRAFT_NPC - Unlocks all recipes
+// CRAFT_PLAYER - Normal behavior
+// CRAFT_GUILD - Items created will be Guild-bound
// Returns true on success, false on failure
function script SmithSystem {
// Set .scope, .knowledge and .success
.scope=getarg(0, CRAFT_PLAYER);
- if (.scope == CRAFT_PLAYER)
- copyarray(.knowledge,RECIPES_EQUIPMENT,getarraysize(RECIPES_EQUIPMENT));
- else if (.scope == CRAFT_GUILD)
- copyarray(.knowledge,$@RECIPES_EQUIPMENT[getcharid(2)],getarraysize($@RECIPES_EQUIPMENT[getcharid(2)]));
+ copyarray(.knowledge,RECIPES_EQUIPMENT,getarraysize(RECIPES_EQUIPMENT));
.success=false;
setskin "craft4";
@@ -49,7 +48,10 @@ function script SmithSystem {
// Mark the crafting in your score book (except dagger)
if (.@it != Dagger)
CRAFTING_SCORE+=1;
- getnameditem(.@it, strcharinfo(0));
+ if (.scope == CRAFT_GUILD)
+ getitembound(.@it, 1, 2); // Create a guild-bound item
+ else
+ getnameditem(.@it, strcharinfo(0));
if (getskilllv(TMW2_CRAFT)) {
delinventorylist(); // Needed, because we'll rely on rfind()
getinventorylist();
diff --git a/npc/functions/clientversion.txt b/npc/functions/clientversion.txt
index 873873018..51e5eab84 100644
--- a/npc/functions/clientversion.txt
+++ b/npc/functions/clientversion.txt
@@ -284,8 +284,8 @@ function script clientupdater {
}
// General Updates
// seg jul 15 16:41:35 -03 2019
- if (UPDATE < 1563219695) {
- UPDATE=1563219695;
+ if (UPDATE < 1565039378) {
+ UPDATE=1565039378;
.@dg=true;
mesc l(".:: This is Release 9.5 Academy ::."), 0;
//mesc l(".:: This is Release 10.0 Infinity ::."), 0;
@@ -416,6 +416,170 @@ function script clientupdater {
}
// Cleanup
deletearray RNGTREASURE_DATE;
+
+ // Open Beta 2019 Main Event Rewards
+ .@u$=strtolower(strcharinfo(0));
+ setarray .@officialnick$, "jesusalva", "kolchak", "xanthem", "seeds", "dangerduck", "test123", "sertrop", "lawncable", "pookie", "saulc",
+ "apane", "omatt";
+ setarray .@expval, 211625, 1955041, 938439, 59663, 73899, 10338, 7494, 7857, 1992, 360, 443, 193, 5180;
+ setarray .@gpval, 150321, 863215, 3263, 973137, 5650, 18343, 45227, 42002, 37381, 50000, 50450, 50275, 49988;
+ setarray .@summer, 19, 30, 55, 0, 4, 2, 3, 4, 0, 0, 0, 0, 2;
+ /* Data for python
+ # import exp from exptable
+ i=0
+ THEARRAY=[]
+ while i < len(names):
+ raw=overflow[i]
+ c=0
+ while c < level[i]:
+ raw+=exp[c]
+ c+=1
+ print("%s: %d exp" % (names[i], raw))
+ THEARRAY.append(int(raw*0.3))
+ i+=1
+
+ setarray .@levelval, 48, 66, 60, 39, 40, 28, 25, 26, 17, 10, 10, 8, 23;
+ setarray .@overflow, 25762, 338713, 55746, 1275, 14516, 504, 2855, 640, 360, 0, 277, 18, 598;
+ */
+
+ // Open Beta 2019
+ .@ranking=array_find(.@officialnick$, .@u$);
+ // Mishana LawnCable bObr Jesusalva demure
+ showavatar NPC_LOF_RICH;
+ mes "";
+ mes "*************************************";
+ mes "";
+ mesn ("TMW2 Staff");
+ mesc l("Hello, @@! We are proud to announce the @@ RESULTS!", strcharinfo(0) , b(l("Open Beta 2019"))), 3;
+ mes "";
+ mesc l("1st Place - Jesusalva (65)");
+ mesc l("2nd Place - Kolchak (63)");
+ mesc l("3rd Place - Xanthem (56)");
+ mesc l("4th Place - seeds (43)");
+ mesc l("5th Place - dangerDuck (23)");
+ mesc l("6th Place - test123 (20)");
+ mesc l("7th Place - Sertrop (17)");
+ mesc l("8th Place - Pookie (13)");
+ mesc l("9th Place - LawnCable (13)");
+ mesc l("10th Place - Saulc (8)");
+ mes "";
+ mesc l("It was a reeeeeealy close dispute for the podium, but Jesusalva crafted an item at the last minute and took the first place!");
+ mesc l("Although KOLCHAK managed to rank first in almost every ranking, Jesusalva was too close, and the Crafting gave him the edge he needed to take first place.");
+ mesc l("Congratulations to everyone who participated on the event, even those who didn't made to the top 10!");
+ if (.@ranking >= 0) {
+ #ADD_LVL=.@expval[.@ranking];
+
+ // Force Ched quest start if you haven't done so already
+ .@year=getq(SQuest_Ched);
+ if (.@year != (gettime(GETTIME_YEAR)-2000))
+ setq SQuest_Ched, (gettime(GETTIME_YEAR)-2000), 0, 0;
+
+
+ @ched=getq2(SQuest_Ched);
+ .@pts=.@summer[.@ranking];
+ if (.@pts) {
+ getexp rand2(.@pts-1, .@pts*11/10), rand2(0,.@pts/25);
+ setq2 SQuest_Ched, @ched+.@pts;
+ }
+
+ switch (.@ranking+1) {
+ case 1:
+ getitembound Tyranny, 1, 1;
+ getitem MercBoxEE, 1;
+ getitem EquipmentBlueprintE, 1;
+ getitem HousingLetterI, 1;
+ getitem StrangeCoin, 150;
+ break;
+ case 2:
+ getitem MercBoxEE, 1;
+ getitem EquipmentBlueprintE, 1;
+ getitem HousingLetterI, 1;
+ getitem StrangeCoin, 100;
+ break;
+ case 3:
+ getitem MercBoxDD, 1;
+ getitem EquipmentBlueprintD, 1;
+ getitem HousingLetterI, 1;
+ getitem StrangeCoin, 100;
+ break;
+ case 4:
+ case 5:
+ getitem MercBoxCC, 1;
+ getitem EquipmentBlueprintC, 1;
+ getitem HousingLetterI, 1;
+ getitem StrangeCoin, 50;
+ break;
+ case 6:
+ case 7:
+ getitem MercBoxBB, 1;
+ getitem StrangeCoin, 30;
+ break;
+ case 8:
+ case 9:
+ getitem MercBoxAA, 1;
+ getitem StrangeCoin, 10;
+ break;
+ case 10:
+ getitem MercBoxAA, 1;
+ break;
+ } // switch(ranking)
+
+ // GP conversion rules
+ // if you have less than 50k, we'll return you to initial amount
+ // Because it is a thankyou for participating on the event ;-)
+ .@trugp=max(50000, .@gpval[.@ranking]);
+
+ // You get to carry over 1 GP for each 1000 GP too (max 1000 GP bonus)
+ Zeny+=min(1000, .@trugp/1000);
+
+ // You'll get 1 Rare Point for every 1k GP obtained
+ // Top was 1,000,000 → 1000 rare points
+ #RARE_POINTS+=.@trugp/1000;
+
+ } // if ranking
+ }
+ // Negative Karma = good. And positive karma allows PvP. So...
+ // sex ago 9 18:10:20 -03 201
+ if (UPDATE < 1565385020) {
+ UPDATE=1565385020;
+ // PVP bugfix
+ Karma=0;
+ // Allow to skip quest if you already have the Grimorium
+ if (countitem(JesusalvaGrimorium) && getskilllv(TMW2_SKILLPERMIT) == 2) {
+ skill TMW2_SKILLPERMIT, 3, 0;
+ }
+ // This can't happen but anyway, just in case...
+ if (getskilllv(TMW2_TRANSMIGRATION) > 10) {
+ skill TMW2_TRANSMIGRATION, 10, 0;
+ }
+ // Magic Skill Points for this skill went from 3 to 2
+ if (getskilllv(ASC_METEORASSAULT))
+ MAGIC_PTS-=1;
+ // Treasure Key from Lua
+ if (getq(General_Narrator) >= 3)
+ getitem TreasureKey, 1;
+
+ // Post-poned Referral Rewards
+ if (#REFERRAL_PROG && BaseLevel >= 25 && #REFERRAL_CTRL < 1) {
+ #REFERRAL_CTRL=1;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 25!", strcharinfo(0)+" just got level 25!\nAs they get stronger, more rewards will be sent to you!", 0, SilverGift, 1);
+ }
+ if (#REFERRAL_PROG && BaseLevel >= 50 && #REFERRAL_CTRL < 2) {
+ #REFERRAL_CTRL=2;
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 50!", strcharinfo(0)+" just got level 50!\nAs they get stronger, more rewards will be sent to you!", 0, ArcmageBoxset, 1);
+ }
+ #REFERRAL_CTRL=3;
+ if (#REFERRAL_PROG && BaseLevel >= 75 && #REFERRAL_CTRL < 3) {
+ rodex_sendmail(gf_charid(#REFERRAL_PROG), "TMW2 Team", "Recruited Player got Lv 75!", strcharinfo(0)+" just got level 75!\nAs they get stronger, more rewards will be sent to you!", 0, PrismGift, 1);
+ }
+ // Eisten Rewards
+ if (BaseLevel >= 50 && getq(TulimsharQuest_Eistein) == 2)
+ getitem SilverGift, 1;
+ if (BaseLevel >= 75 && getq(TulimsharQuest_Eistein) == 3)
+ getitem GoldenGift, 1;
+ if (BaseLevel >= 75 && getq(TulimsharQuest_Eistein) >= 3)
+ getitem GraduationRobe, 1;
+
}
// Test Server Updates
// seg jul 22 21:23:00 -03 2019
@@ -431,6 +595,7 @@ function script clientupdater {
// #ADD_LVL means the user have to right to get some levels. This is a sketch. The code might be deleted.
if (#ADD_LVL) {
.@dg=1;
+ /*
mesn "Jesus Saves";
mesc l("Oh - Welcome to TMW2: Moubootaur Legends!"), 3;
next;
@@ -448,6 +613,7 @@ function script clientupdater {
//atcommand "@blvl "+#ADD_LVL;
//getitem TimeFlask, 1;
#ADD_LVL=(#ADD_LVL*9)/10;
+ */
if ((readparam(BaseExp)+#ADD_LVL > readparam(NextBaseExp))) {
do {
.@v=readparam(NextBaseExp)-readparam(BaseExp);
@@ -462,8 +628,10 @@ function script clientupdater {
}
- if (.@dg)
+ if (.@dg) {
+ next;
closeclientdialog;
+ }
return;
}
diff --git a/npc/functions/estate.txt b/npc/functions/estate.txt
index e0290a12d..6f8c2acfd 100644
--- a/npc/functions/estate.txt
+++ b/npc/functions/estate.txt
@@ -3,7 +3,7 @@
// Jesusalva
// Description:
// Real Estate System
-// Script Helpers
+// Primary Script Helpers
// WARNING: They affect directly the real estate global variables!
// This function reduces payment accordingly
@@ -94,171 +94,3 @@ function script realestate_hasmobilia {
return false;
}
-
-
-//////////////////////////////////////////////////////////////////////////////
-///////////// Dialog Helpers
-// "If you copy-paste the same line too often, make a function for it"
-
-
-// Rent_Available Label
-// Returns true regardless of player decision
-// realestate_rent ( estate_id, price, <rent time> )
-function script realestate_rent {
- .id=getarg(0);
- .price=getarg(1);
- .time=getarg(2, 2592000); // Defaults to 30 days
-
- do
- {
- mesc l("This Real Estate is available for rent for only @@ GP!", format_number(.price));
- .@gp=REAL_ESTATE_CREDITS+Zeny;
- mesc l("You currently have: @@ GP and mobiliary credits", format_number(.@gp));
- next;
- select
- rif(.@gp > .price, l("Rent it! Make it mine!")),
- l("Information"),
- l("Don't rent it");
-
- // You want to rent
- if (@menu == 1) {
- if ($ESTATE_RENTTIME[.id] > gettimetick(2)) {
- mesc l("Somebody already rented it before you!");
- close;
- }
- REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
- if (REAL_ESTATE_CREDITS < 0) {
- Zeny+=REAL_ESTATE_CREDITS;
- REAL_ESTATE_CREDITS=0;
- }
-
- // Payment done, you can now acquire the house for a month
- $ESTATE_RENTTIME[.id]=gettimetick(2)+.time;
-
- // If you're not the previous owner
- // Remove previous owner furniture and reset room password
- if ($ESTATE_OWNER[.id] != getcharid(3)) {
- /*
- $ESTATE_MOBILIA_2[.id]=0;
- $ESTATE_MOBILIA_4[.id]=0;
- $ESTATE_MOBILIA_8[.id]=0;
- $ESTATE_MOBILIA_32[.id]=0;
- $ESTATE_MOBILIA_64[.id]=0;
- $ESTATE_MOBILIA_128[.id]=0;
- */
- $ESTATE_PASSWORD$[.id]="";
- $ESTATE_DOORBELL[.id]=false;
- }
-
- // Register your info so you can manage it
- $ESTATE_OWNER[.id]=getcharid(3);
- $ESTATE_OWNERNAME$[.id]=strcharinfo(0);
-
- mesc l("Rent successful for 30 days!");
- } else if (@menu == 2) {
- mesc l("You can rent this house to make it yours.") + " " + l("The rent lasts 30 days.");
- mesc l("Then you'll be able to buy furniture and utility.");
- mesc l("The door is password-protected, so your friends can enter but strangers stay outside.");
- next;
- mesc l("Both rent and furniture are bought using money, however, there are mobiliary credits.");
- mesc l("Mobiliary Credits is a special currency which can only be used on real estate.");
- mesc l("It's obtained with ADMINS or by selling furniture. It is sumed to money and used first.");
- next;
- }
- } while (@menu == 2);
- return true;
-}
-
-
-
-
-
-// L_Manage Label
-// Returns true regardless of player decision
-// realestate_manage ( estate_id, price, <rent time> )
-function script realestate_manage {
- .id=getarg(0);
- .price=getarg(1);
- .time=getarg(2, 2592000); // Defaults to 30 days
-
- do
- {
- mesc l("@@'s Estate", strcharinfo(0));
- mesc ".:: "+ l("Managment Menu") + " ::.";
-
- .@gp=REAL_ESTATE_CREDITS+Zeny;
- mesc l("Rent time available: @@", FuzzyTime($ESTATE_RENTTIME[.id]));
- mesc l("Total Credits and GP: @@", format_number(.@gp));
- mes "";
- mesc l("Rent Renew Price: @@ GP", format_number(.price));
- mesc l("Room password: @@", $ESTATE_PASSWORD$[.id]);
- if ($ESTATE_DOORBELL[.id])
- mesc l("Doorbell is disabled"), 1;
-
- next;
- select
- l("Leave"),
- l("Enable/disable doorbell"),
- l("Set room password"),
- rif(.@gp >= .price && $ESTATE_RENTTIME[.id] < gettimetick(2)+.time, l("Renew Rent")),
- rif($@GM_OVERRIDE, l("Destroy all mobilia")),
- rif($@GM_OVERRIDE, l("Expire rent time"));
-
- switch (@menu) {
- case 1:
- break;
- case 2:
- $ESTATE_DOORBELL[.id]=!$ESTATE_DOORBELL[.id];
- break;
- case 3:
- mesc l("(Leave the password blank to disable)");
- mesc l("Current Room password: @@", $ESTATE_PASSWORD$[.id]);
- mesc l("Input new password: ");
- input .@password$;
- mesc l("Repeat new password: ");
- input .@passwordc$;
- if (.@password$ == .@passwordc$) {
- $ESTATE_PASSWORD$[.id]=.@password$;
- mesc l("Password changed with success!"), 3;
- } else {
- mesc l("The passwords doesn't match."), 1;
- }
- break;
- case 4:
- // The check is performed before showing the menu option
- // I guess it could be hacked, but I'll probably see negative GP...
- REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
- if (REAL_ESTATE_CREDITS < 0) {
- Zeny+=REAL_ESTATE_CREDITS;
- REAL_ESTATE_CREDITS=0;
- }
-
- // Payment done, you can now acquire the house for a month
- // If you lost the rent on the meanwhile, it'll renew
- // If you lost the rent and somebody else rented it, you lose the GP
- $ESTATE_RENTTIME[.id]+=.time;
- break;
- case 5:
- mesc l("Are you sure? This cannot be undone!"), 1;
- next;
- if (validatepin()) {
- $ESTATE_MOBILIA_2[.id]=0;
- $ESTATE_MOBILIA_4[.id]=0;
- $ESTATE_MOBILIA_8[.id]=0;
- $ESTATE_MOBILIA_32[.id]=0;
- $ESTATE_MOBILIA_64[.id]=0;
- $ESTATE_MOBILIA_128[.id]=0;
- $ESTATE_PASSWORD$[.id]="";
- $ESTATE_DOORBELL[.id]=false;
- }
- case 6:
- mesc l("Are you sure? This cannot be undone!"), 1;
- next;
- if (validatepin()) {
- $ESTATE_RENTTIME[.id]=gettimetick(2);
- }
- }
- } while (@menu != 1);
- return true;
-}
-
diff --git a/npc/functions/estate2.txt b/npc/functions/estate2.txt
new file mode 100644
index 000000000..758a73e4b
--- /dev/null
+++ b/npc/functions/estate2.txt
@@ -0,0 +1,275 @@
+// TMW2: Moubootaur Legends scripts.
+// Author:
+// Jesusalva
+// Description:
+// Real Estate System
+// Secondary Script Helpers
+// WARNING: They affect directly the real estate global variables!
+//////////////////////////////////////////////////////////////////////////////
+///////////// Dialog Helpers
+// "If you copy-paste the same line too often, make a function for it"
+
+// Rent_Available Label
+// Returns true regardless of player decision
+// realestate_rent ( estate_id, price, <rent time> )
+function script realestate_rent {
+ .id=getarg(0);
+ .price=getarg(1);
+ .time=getarg(2, 2592000); // Defaults to 30 days
+
+ do
+ {
+ mesc l("This Real Estate is available for rent for only @@ GP!", format_number(.price));
+ .@gp=REAL_ESTATE_CREDITS+Zeny;
+ mesc l("You currently have: @@ GP and mobiliary credits", format_number(.@gp));
+ next;
+ select
+ rif(.@gp > .price, l("Rent it! Make it mine!")),
+ l("Information"),
+ l("Don't rent it");
+
+ // You want to rent
+ if (@menu == 1) {
+ if ($ESTATE_RENTTIME[.id] > gettimetick(2)) {
+ mesc l("Somebody already rented it before you!");
+ close;
+ }
+ REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
+ if (REAL_ESTATE_CREDITS < 0) {
+ Zeny+=REAL_ESTATE_CREDITS;
+ REAL_ESTATE_CREDITS=0;
+ }
+
+ // Payment done, you can now acquire the house for a month
+ $ESTATE_RENTTIME[.id]=gettimetick(2)+.time;
+
+ // If you're not the previous owner
+ // Remove previous owner furniture and reset room password
+ if ($ESTATE_OWNER[.id] != getcharid(3)) {
+ /*
+ $ESTATE_MOBILIA_2[.id]=0;
+ $ESTATE_MOBILIA_4[.id]=0;
+ $ESTATE_MOBILIA_8[.id]=0;
+ $ESTATE_MOBILIA_32[.id]=0;
+ $ESTATE_MOBILIA_64[.id]=0;
+ $ESTATE_MOBILIA_128[.id]=0;
+ */
+ $ESTATE_PASSWORD$[.id]="";
+ $ESTATE_DOORBELL[.id]=false;
+ }
+
+ // Register your info so you can manage it
+ $ESTATE_OWNER[.id]=getcharid(3);
+ $ESTATE_OWNERNAME$[.id]=strcharinfo(0);
+
+ mesc l("Rent successful for 30 days!");
+ } else if (@menu == 2) {
+ mesc l("You can rent this house to make it yours.") + " " + l("The rent lasts 30 days.");
+ mesc l("Then you'll be able to buy furniture and utility.");
+ mesc l("The door is password-protected, so your friends can enter but strangers stay outside.");
+ next;
+ mesc l("Both rent and furniture are bought using money, however, there are mobiliary credits.");
+ mesc l("Mobiliary Credits is a special currency which can only be used on real estate.");
+ mesc l("It's obtained with ADMINS or by selling furniture. It is sumed to money and used first.");
+ next;
+ }
+ } while (@menu == 2);
+ return true;
+}
+
+
+
+
+
+// L_Manage Label
+// Returns true regardless of player decision
+// realestate_manage ( estate_id, price, <rent time> )
+function script realestate_manage {
+ .id=getarg(0);
+ .price=getarg(1);
+ .time=getarg(2, 2592000); // Defaults to 30 days
+
+ do
+ {
+ mesc l("@@'s Estate", strcharinfo(0));
+ mesc ".:: "+ l("Managment Menu") + " ::.";
+
+ .@gp=REAL_ESTATE_CREDITS+Zeny;
+ mesc l("Rent time available: @@", FuzzyTime($ESTATE_RENTTIME[.id]));
+ mesc l("Total Credits and GP: @@", format_number(.@gp));
+ mes "";
+ mesc l("Rent Renew Price: @@ GP", format_number(.price));
+ mesc l("Room password: @@", $ESTATE_PASSWORD$[.id]);
+ if ($ESTATE_DOORBELL[.id])
+ mesc l("Doorbell is disabled"), 1;
+
+ next;
+ select
+ l("Leave"),
+ l("Enable/disable doorbell"),
+ l("Set room password"),
+ rif(.@gp >= .price && $ESTATE_RENTTIME[.id] < gettimetick(2)+.time, l("Renew Rent")),
+ rif($@GM_OVERRIDE, l("Destroy all mobilia")),
+ rif($@GM_OVERRIDE, l("Expire rent time"));
+
+ switch (@menu) {
+ case 1:
+ break;
+ case 2:
+ $ESTATE_DOORBELL[.id]=!$ESTATE_DOORBELL[.id];
+ break;
+ case 3:
+ mesc l("(Leave the password blank to disable)");
+ mesc l("Current Room password: @@", $ESTATE_PASSWORD$[.id]);
+ mesc l("Input new password: ");
+ input .@password$;
+ mesc l("Repeat new password: ");
+ input .@passwordc$;
+ if (.@password$ == .@passwordc$) {
+ $ESTATE_PASSWORD$[.id]=.@password$;
+ mesc l("Password changed with success!"), 3;
+ } else {
+ mesc l("The passwords doesn't match."), 1;
+ }
+ break;
+ case 4:
+ // The check is performed before showing the menu option
+ // I guess it could be hacked, but I'll probably see negative GP...
+ REAL_ESTATE_CREDITS=REAL_ESTATE_CREDITS-.price;
+ if (REAL_ESTATE_CREDITS < 0) {
+ Zeny+=REAL_ESTATE_CREDITS;
+ REAL_ESTATE_CREDITS=0;
+ }
+
+ // Payment done, you can now acquire the house for a month
+ // If you lost the rent on the meanwhile, it'll renew
+ // If you lost the rent and somebody else rented it, you lose the GP
+ $ESTATE_RENTTIME[.id]+=.time;
+ break;
+ case 5:
+ mesc l("Are you sure? This cannot be undone!"), 1;
+ next;
+ if (validatepin()) {
+ $ESTATE_MOBILIA_2[.id]=0;
+ $ESTATE_MOBILIA_4[.id]=0;
+ $ESTATE_MOBILIA_8[.id]=0;
+ $ESTATE_MOBILIA_32[.id]=0;
+ $ESTATE_MOBILIA_64[.id]=0;
+ $ESTATE_MOBILIA_128[.id]=0;
+ $ESTATE_PASSWORD$[.id]="";
+ $ESTATE_DOORBELL[.id]=false;
+ }
+ case 6:
+ mesc l("Are you sure? This cannot be undone!"), 1;
+ next;
+ if (validatepin()) {
+ $ESTATE_RENTTIME[.id]=gettimetick(2);
+ }
+ }
+ } while (@menu != 1);
+ return true;
+}
+
+
+// Piano Mobilia
+// realestate_piano ( {mapname} )
+function script realestate_piano {
+ .@loc$=getarg(0, getmap());
+ mesc l("Do you want to play a song?");
+ mesc l("This is not saved.");
+ select
+ l("Nothing"),
+ l("Default"),
+ l("Indoors 1 (Peace)"),
+ l("Indoors 2 (Dimonds)"),
+ l("TMW Adventure"),
+ l("Sailing Away!"),
+ l("Magick Real"),
+ l("The Forest"),
+ l("Dragons and Toast"),
+ l("Unforgiving Lands"),
+ l("Arabesque (Action)"),
+ l("No Chains (Tulimshar)"),
+ l("School of Quirks (Candor)"),
+ l("Cake Town (Hurnscald)"),
+ l("Steam (LoF Village)"),
+ l("Woodland Fantasy"),
+ l("Birds in the Sunrise");
+
+ mes "";
+ .@m$="";
+ switch (@menu) {
+ case 1:
+ return; break;
+ case 2:
+ .@m$="8bit_the_hero.ogg"; break;
+ case 3:
+ .@m$="peace.ogg"; break;
+ case 4:
+ .@m$="peace2.ogg"; break;
+ case 5:
+ .@m$="tmw_adventure.ogg"; break;
+ case 6:
+ .@m$="sail_away.ogg"; break;
+ case 7:
+ .@m$="magick_real.ogg"; break;
+ case 8:
+ .@m$="dariunas_forest.ogg"; break;
+ case 9:
+ .@m$="dragon_and_toast.ogg"; break;
+ case 10:
+ .@m$="Unforgiving_Lands.ogg"; break;
+ case 11:
+ .@m$="Arabesque.ogg"; break;
+ case 12:
+ .@m$="mvrasseli_nochains.ogg"; break;
+ case 13:
+ .@m$="school_of_quirks.ogg"; break;
+ case 14:
+ .@m$="caketown.ogg"; break;
+ case 15:
+ .@m$="steam.ogg"; break;
+ case 16:
+ .@m$="woodland_fantasy.ogg"; break;
+ case 17:
+ .@m$="tws_birds_in_the_sunrise.ogg"; break;
+
+ }
+ changemusic .@loc$, .@m$;
+ return;
+}
+
+
+
+// Cauldron Mobilia
+// realestate_cauldron ( )
+function script realestate_cauldron {
+ select
+ l("Alchemy"),
+ l("Crafting");
+ mes "";
+ if (@menu == 1) {
+ do {
+ mesc l("What will you brew today?");
+ if (AlchemySystem(CRAFT_PLAYER))
+ mesc l("Success!"), 3;
+ else
+ mesc l("That didn't work!"), 1;
+ next;
+ mesc l("Try again?");
+ } while (askyesno() == ASK_YES);
+ }
+ else if (@menu == 2) {
+ do {
+ mesc l("What will you craft today?");
+ if (SmithSystem(CRAFT_PLAYER))
+ mesc l("Success!"), 3;
+ else
+ mesc l("That didn't work!"), 1;
+ next;
+ mesc l("Try again?");
+ } while (askyesno() == ASK_YES);
+ }
+ return;
+}
+
diff --git a/npc/functions/fishing.txt b/npc/functions/fishing.txt
index 52f9fcc9a..a68984cfa 100644
--- a/npc/functions/fishing.txt
+++ b/npc/functions/fishing.txt
@@ -40,7 +40,8 @@ OnBite:
setnpcdir @fishing_spot$, LEFT;
@fishing_tick = gettimetick(0);
- specialeffect(getvariableofnpc(.bite_fx, @fishing_spot$), SELF, playerattached());
+ .@bite_fx=getvariableofnpc(.bite_fx, @fishing_spot$);
+ specialeffect(.@bite_fx ? .@bite_fx : 30, SELF, playerattached());
end;
OnCleanUp:
@@ -245,6 +246,7 @@ function script fishing {
.@fish_id = 0;
}
+ @fishing_spot$="";
return .@fish_id;
}
@@ -256,6 +258,16 @@ function script fishing {
return -5;
}
+ // This "hack" will prevent you from fishing at two spots (buggy)
+ // It'll cancel the previous fishing too, per logical rule.
+ if (@fishing_spot$ != "") {
+ deltimer "global fishing handler::OnCleanUp"; // cancel auto cleanup
+ deltimer "global fishing handler::OnBite";
+ fishing_cleanup(@fishing_spot$); // clean up manually
+ @fishing_spot$="";
+ dispbottom l("You left your fishing spot!");
+ return -4;
+ }
// begin fishing
narrator S_LAST_NEXT,
diff --git a/npc/functions/gmbot.txt b/npc/functions/gmbot.txt
index 9c164ff7d..b04c40002 100644
--- a/npc/functions/gmbot.txt
+++ b/npc/functions/gmbot.txt
@@ -141,39 +141,44 @@ OnTimer90000:
debugmes "Monster King (bot): "+.mp$+" ("+.@x+", "+.@y+")";
// If too few players are online, we don't need an event AT ALL!
- if (.users < rand(2,4)) {
+ if (.users < rand2(2,4)) {
initnpctimer;
end;
}
// Siege events (req. 300 aggro, 3 users, and 70% chances to begin)
if ($@MK_AGGRO >= 300 && .users >= 3 && rand(0,100) < 70 &&
- $GAME_STORYLINE == 2 && $@MK_THROTTLE < gettimetick(2)){
+ is_between(1, 3, $GAME_STORYLINE) && $@MK_THROTTLE < gettimetick(2)){
+ // Delta handles the compulsory wait time between waves.
+ // 6 hours normally, 12 hours if the army is in disarray.
+ .@delta=6;
+ if ($GAME_STORYLINE == 3)
+ .@delta=12;
// Tulimshar
if (.mp$ ~= "003-*") {
announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc;
- $@MK_THROTTLE=gettimetick(2)+3*60*60;
+ $@MK_THROTTLE=gettimetick(2)+.@delta*60*60;
$@MK_SCENE=MK_SIEGE_TULIM;
donpcevent("Lieutenant Dausen::OnMKSiege");
}
// Halinarzo
else if (.mp$ ~= "009-*") {
announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc;
- $@MK_THROTTLE=gettimetick(2)+3*60*60;
+ $@MK_THROTTLE=gettimetick(2)+.@delta*60*60;
$@MK_SCENE=MK_SIEGE_HALIN;
donpcevent("Lieutenant Jacob::OnMKSiege");
}
// Hurnscald
else if (.mp$ ~= "012-*") {
announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc;
- $@MK_THROTTLE=gettimetick(2)+3*60*60;
+ $@MK_THROTTLE=gettimetick(2)+.@delta*60*60;
$@MK_SCENE=MK_SIEGE_HURNS;
donpcevent("#HurnscaldSiege::OnMKSiege");
}
// Nivalis
else if (.mp$ ~= "020-*") {
announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc;
- $@MK_THROTTLE=gettimetick(2)+3*60*60;
+ $@MK_THROTTLE=gettimetick(2)+.@delta*60*60;
$@MK_SCENE=MK_SIEGE_NIVAL;
donpcevent("Lieutenant Joshua::OnMKSiege");
}
@@ -182,18 +187,15 @@ OnTimer90000:
// If a player is nearby while the Monster King prepares, event may happen
// Minimum 60 Aggro
if (.nearby > 1 && $@MK_AGGRO >= 80 &&
- ($GAME_STORYLINE == 1 || $GAME_STORYLINE == 3)){
+ ($GAME_STORYLINE == 1 || ($GAME_STORYLINE == 3 && $@MK_THROTTLE >= gettimetick(2)) )){
// We should decide event kind, but that's NYI
announce ("Monster King: I smell humans! Humans must die!"), bc_map|bc_npc;
getmapxy(.@m$, .@x, .@y, UNITTYPE_MOB, $@MK);
- // 50% more monsters at night time
- if (is_night())
- $@MK_AGGRO=$@MK_AGGRO*3/2;
// Spawn stuff
areamonster(.@m$, .@x-20, .@y-20, .@x+20, .@y+20, "Monster", ManaGhost, ($@MK_AGGRO/10)+.nearby, "Monster King::OnSlaveDie");
- $@MK_AGGRO=$@MK_AGGRO/5;
+ $@MK_AGGRO=($@MK_AGGRO*$GAME_STORYLINE)/5;
}
// Maybe, just maybe, game storyline must be updated here
diff --git a/npc/functions/hub.txt b/npc/functions/hub.txt
index 8632b3e0d..eb535d9f6 100644
--- a/npc/functions/hub.txt
+++ b/npc/functions/hub.txt
@@ -63,6 +63,18 @@ function script HUB_Logout {
if (.@mapa$ == "020-7-1") {
callfunc("BSClearNest", @nestid);
}
+ // Died or logged out on Player Story 5 - Forgotten Throne Room
+ if (.@mapa$ ~= "hmc*") {
+ .@n$=instance_npcname("#Core02331");
+ deltimer(.@n$+"::OnW01");
+ deltimer(.@n$+"::OnW02");
+ deltimer(.@n$+"::OnE07");
+ deltimer(.@n$+"::OnE08");
+ deltimer(.@n$+"::OnE09");
+ deltimer(.@n$+"::OnE10");
+ deltimer(.@n$+"::OnE11");
+ deltimer(.@n$+"::OnE12");
+ }
// Died or logged out during Sagratha Fight
if (.@mapa$ ~= "sgt2*") {
setq1 HurnscaldQuest_Sagratha, 3;
@@ -94,6 +106,7 @@ function script HUB_Logout {
if (!getmapflag(.@mapa$, mf_pvp) && !getmapflag(.@mapa$, mf_pvp_noparty) && !getmapflag(.@mapa$, mf_pvpnoguild)) {
recovery(getcharid(3));
warp .@mapa$, .@a, .@b;
+ percentheal 100, 100;
dispbottom l("REVENGE TIME!");
.@trueid=getcharid(3);
//detachrid();
@@ -104,6 +117,8 @@ function script HUB_Logout {
sc_end SC_OVERLAPEXPUP;
sc_start SC_OVERLAPEXPUP, 300000, -20;
dispbottom l("For cowardingly killing in a \"secure\" area, you will be severely punished.");
+ //Karma+=1;
+ sc_start SC_STUN, 15000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK;
addtimer(15000, "#mobptsys::OnUnlock");
percentheal -88, -100;
detachrid();
diff --git a/npc/functions/main.txt b/npc/functions/main.txt
index 5e897901b..e1b93fa46 100644
--- a/npc/functions/main.txt
+++ b/npc/functions/main.txt
@@ -337,6 +337,13 @@ function script gf_charname {
return .@value$[0];
}
+// Get some char ID from account ID, even if offline
+// ( Name )
+function script gf_charid {
+ .@nb = query_sql("SELECT char_id FROM `char` WHERE account_id="+escape_sql(getarg(0))+" LIMIT 1", .@value$);
+ return .@value$[0];
+}
+
// Request pincode and validate it. Use any non-4-digits code to cancel. Failure will dc you.
// Returns 1 if pin check is OK.
function script validatepin {
diff --git a/npc/functions/math.txt b/npc/functions/math.txt
index 068d46cba..fc27bec40 100644
--- a/npc/functions/math.txt
+++ b/npc/functions/math.txt
@@ -73,7 +73,9 @@ function script log2 {
// is_between ( lower, higher, target)
function script is_between {
.@val=getarg(2);
- return (getarg(0) < .@val && getarg(1) >= .@val);
+ .@min=getarg(0);
+ .@max=getarg(1);
+ return (.@min < .@val && .@val <= .@max);
}
diff --git a/npc/functions/mobpoint.txt b/npc/functions/mobpoint.txt
index 8133c938f..9c901bc3d 100644
--- a/npc/functions/mobpoint.txt
+++ b/npc/functions/mobpoint.txt
@@ -43,10 +43,11 @@ OnNPCKillEvent:
// Remove undue Job exp
// The check is probably correct, but setparam is not working =/
/*
+ */
if (strmobinfo(7, killedrid) == 0 && readparam(JobExp) > 0) {
- setparam(JobExp, readparam(JobExp)-1);
+ //setparam(JobExp, readparam(JobExp)-1);
+ JobExp-=1;
}
- */
// call functions
callfunc "mobpoint";
diff --git a/npc/functions/news.txt b/npc/functions/news.txt
index 4ee44f102..ee5ac2d25 100644
--- a/npc/functions/news.txt
+++ b/npc/functions/news.txt
@@ -424,8 +424,17 @@ function script Journalman {
mesc l("The Monster King Army is attacking towns at random, but players already reduced their organization to @@ %%!", .@def);
mesc l("With recent player activity, the Monster king is @@!", .@st$);
break;
+ case 3:
+ mesc l("The Monster Army is in complete disarray, sieges are much less frequent.");
+ mesc l("The mist over the Impregnable Fortress Peak finally lowered down, and it seems... The peaks are no more!");
+ mesc l("The Monster King Lair is not in a impregnable mountain, but in a small island now!!");
+ break;
+ case 4:
+ mesc l("We must defeat the Monster King on his evil lair!");
+ mesc l("Only then we may have peace!!");
+ break;
default:
- Exception(l("I do now know what this means: GS-@@-ICXN-@@", $GAME_STORYLINE, $@MK_TEMPVAR), RB_DEFAULT|RB_SPEECH); break;
+ Exception(l("I do now know what this means: GS-@@-ICXN-@@", $GAME_STORYLINE, $MK_TEMPVAR), RB_DEFAULT|RB_SPEECH); break;
}
next;
diff --git a/npc/functions/refine.txt b/npc/functions/refine.txt
index 74f72857f..1936b5542 100644
--- a/npc/functions/refine.txt
+++ b/npc/functions/refine.txt
@@ -90,7 +90,7 @@ function script refineMaster {
}
mesn;
mesq l("This @@ is a nice stuff. I can refine it for @@ GP and @@ @@.", getitemlink(.@item), .@price, .@amount, getitemlink(.@rg));
- mesc l("Success ratio is of aprox. @@ %", (100-(.@rlv*7))+rand(-6,6));
+ mesc l("Success ratio is of aprox. @@ %", (100-(.@rlv*7))+rand2(-6,6));
next;
if (askyesno() != ASK_YES)
close;
@@ -144,7 +144,7 @@ function script refineMaster {
}
// Were we successful?
- if (getequippercentrefinery(.@it) > rand(100)) {
+ if (getequippercentrefinery(.@it) > rand2(100)) {
successrefitem .@it;
mesn;
mesq l("HAHAHAHAH! Shiny as new, and stronger than ever! Have fun!");
@@ -152,7 +152,7 @@ function script refineMaster {
mesc l("Armors: +3~5 defense");
next;
// Perhaps the item has broken?
- } else if (rand(100) < .@rvl*2) {
+ } else if (rand2(100) < .@rlv) {
failedrefitem .@it;
mesc l("*CRASH*");
next;
@@ -163,7 +163,7 @@ function script refineMaster {
mesq l("Well, you were warned. Do you have any other stuff for me?");
next;
// Item is weakened.
- } else {
+ } else if (rand2(100) < .@rlv) {
downrefitem .@it, 1;
mesn;
mesq l("A masterpiece!... Whaaaat, this stuff got ##Bweaker##b??");
@@ -174,6 +174,14 @@ function script refineMaster {
mesn;
mesq l("I'm sure I could refine this again, if you bring me the payment and the reagents again.");
next;
+ // Nothing happens
+ } else {
+ mesn;
+ mesq l("Well, I did my best, but this had been so refined, that it was difficult to find my way.");
+ next;
+ mesn;
+ mesq l("I'm sure I could refine this again, if you bring me the payment and the reagents again.");
+ next;
}
return;
}
diff --git a/npc/functions/scoreboards.txt b/npc/functions/scoreboards.txt
index 9ceac8265..fb1c4974c 100644
--- a/npc/functions/scoreboards.txt
+++ b/npc/functions/scoreboards.txt
@@ -386,10 +386,20 @@ function script HallOf2019 {
mes l(".:: Ched's Summer 2019 ::.");
mesc l("June 21st - September 21st");
mes "";
+ /*
mes l(".:: Chocolate Day ::.");
mesc l("Event Canceled"), 1;
//mesc l("Scheduled: July 7th");
mes "";
+ */
+ mes l(".:: Open Beta 2019 ::.");
+ mes l("1. Jesusalva - 65");
+ mes l("2. Kolchak - 63");
+ mes l("3. Xanthem - 56");
+ mesc l("4. seeds - 43");
+ mesc l("5. dangerDuck - 23");
+ //mesc l("Scheduled: July 20th ~ 31st");
+ mes "";
mes l(".:: Free Software Day ::.");
mesc l("Scheduled: September 9th");
mes "";
diff --git a/npc/functions/seasons.txt b/npc/functions/seasons.txt
index cb742e558..51fee458f 100644
--- a/npc/functions/seasons.txt
+++ b/npc/functions/seasons.txt
@@ -204,31 +204,31 @@ function script SeasonReload {
OnSummerStart:
addmonsterdrop(SaxsoGhost, CherryCocktail, 450);
- addmonsterdrop(DesertBandit, CherryCocktail, 410);
+ addmonsterdrop(DesertBandit, CherryCocktail, 410); // INVALID
addmonsterdrop(Duck, CherryCocktail, 360);
addmonsterdrop(Croc, CherryCocktail, 180);
addmonsterdrop(RedButterfly, CherryCocktail, 100);
-
+
addmonsterdrop(Centaur, CactusCocktail, 1000);
- addmonsterdrop(GiantMaggot, CactusCocktail, 290);
- addmonsterdrop(FireGoblin, CactusCocktail, 220);
+ addmonsterdrop(GiantMaggot, CactusCocktail, 290); // INVALID
+ addmonsterdrop(FireGoblin, CactusCocktail, 220); // INVALID
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);
addmonsterdrop(Croc, Sunglasses, 1);
addmonsterdrop(SaxsoGhost, Sunglasses, 1);
- addmonsterdrop(DesertMaggot, Sunglasses, 1);
+ addmonsterdrop(DesertMaggot, Sunglasses, 1); // INVALID
addmonsterdrop(Scorpion, Sunglasses, 1);
- addmonsterdrop(GiantMaggot, Sunglasses, 1);
+ addmonsterdrop(GiantMaggot, Sunglasses, 1); // INVALID
addmonsterdrop(Centaur, Sunglasses, 3);
addmonsterdrop(AlphaMouboo, Sunglasses, 1);
addmonsterdrop(OceanCroc, Sunglasses, 1);
diff --git a/npc/functions/siege.txt b/npc/functions/siege.txt
index d4d56ac45..e8f40b229 100644
--- a/npc/functions/siege.txt
+++ b/npc/functions/siege.txt
@@ -191,10 +191,11 @@ function script siege_check {
.@mb+=mobcount(.@m$, "#SiegeCtrl::OnColonelDeath");
.@mb+=mobcount(.@m$, "#SiegeCtrl::OnGeneralDeath");
- // Players failed, so reduce score in 1
+ // Players failed, so reduce score in 1~10 (like Sergeant~General).
+ // In future, it could be inverse proportion (-9 for sergeant, -1 for general)
if (.@mb) {
if ($GAME_STORYLINE == 2)
- $MK_TEMPVAR-=1;
+ $MK_TEMPVAR-=rand2(1, 10);
kamibroadcast("Players failed to defend the city!!");
debugmes "Number of boss grade monsters found: %d", .@mb;
$SIEGE_DIFFICULTY=max(1, ($SIEGE_DIFFICULTY/2));
diff --git a/npc/functions/treasure.txt b/npc/functions/treasure.txt
index 83da812e4..e97dced4f 100644
--- a/npc/functions/treasure.txt
+++ b/npc/functions/treasure.txt
@@ -40,8 +40,8 @@ function script TreasureBox {
.@loot=any(SmokeGrenade, SnakeEgg, LachesisBrew, ArrowAmmoBox, CoinBag, SilverGift, TerraniteOre, LeadOre, TinOre, SilverOre, GoldOre, TitaniumOre, FluoPowder, AlchemyBlueprintB, AncientBlueprint);
else if (.@r < 1000 || .@t == 0)
.@loot=any(MoubooSteak, ClothoLiquor, Coal, RedPlushWine, HastePotion, StrengthPotion, Dagger, BronzeGift, IronOre, CopperOre, AlchemyBlueprintA);
- else if (.@r < 4000)
- .@loot=any(Croconut, Potatoz, MoubooSteak, ClothoLiquor, Coal, SmallMushroom, HastePotion, StrengthPotion, Beer);
+ else if (.@r < 5000)
+ .@loot=any(Croconut, Potatoz, MoubooSteak, ClothoLiquor, Coal, SmallMushroom, HastePotion, StrengthPotion, WoodenLog, LeatherPatch, Beer);
else
.@loot=any(FatesPotion, ChocolateBar, Plushroom, Chagashroom, RawLog, LeatherPatch, BugLeg, ScorpionStinger, SmallKnife, StrangeCoin);
diff --git a/npc/functions/util.txt b/npc/functions/util.txt
index 0e50e2d30..21abcd1f2 100644
--- a/npc/functions/util.txt
+++ b/npc/functions/util.txt
@@ -142,7 +142,7 @@ function script nard_reputation {
function script reputation {
.@nr=0; // Base reputation
- // Tulimshar Quests (14 points)
+ // Tulimshar Quests (16 points)
if (getarg(0) == "Tulim") {
// Eugene Quest (+1 rep)
if (getq(TulimsharQuests_Fishman) >= 2)
@@ -223,7 +223,7 @@ function script reputation {
- // Hurnscald Quests (9 points)
+ // Hurnscald Quests (11 points)
} else if (getarg(0) == "Hurns") {
// Alan Quest (+1 rep)
@@ -269,8 +269,16 @@ function script reputation {
if (getq(HurnscaldQuest_Lieutenant) >= 10)
.@nr=.@nr+1;
+ // Thorn Quest (+1 rep)
+ if (getq(HurnscaldQuest_Thorn) >= 1)
+ .@nr=.@nr+1;
+
+ // Blossom Quest (+1 rep)
+ if (getq(HurnscaldQuest_Blossom) >= 1)
+ .@nr=.@nr+1;
+
// HURNSCALD Magical Forumula
- .@nr=.@nr*100/9;
+ .@nr=.@nr*100/11;
@@ -309,7 +317,7 @@ function script reputation {
- // Nivalis Quests (2 points)
+ // Nivalis Quests (6 points)
} else if (getarg(0) == "Nival") {
// Nivalis Well Quest (+1 rep)
@@ -397,7 +405,7 @@ function script reputation {
- // Candor Quests (9 points)
+ // Candor Quests (10 points)
} else if (getarg(0) == "Candor") {
// Valon Quest (+1 rep)
@@ -699,6 +707,26 @@ function script mlearn {
return true;
}
*/
+// transcheck( {item 1, amount 1}, {item 2, amount 2}... )
+// returns true upon success
+function script transcheck {
+ if (getargcount() < 2 || getargcount() % 2 != 0)
+ return Exception("Faulty learning skill command invoked - error");
+
+ // Count items
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ if (countitem(getarg(.@i)) < getarg(.@i+1))
+ return false;
+ .@i++;
+ }
+
+ // Delete Items
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ delitem getarg(.@i), getarg(.@i+1);
+ .@i++;
+ }
+ 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.
@@ -708,6 +736,21 @@ function script abizit {
return min(MAGIC_EXP/.@base, 5);
}
+// anyloot( {item 1, amount 1, chance 1}, {item 2, amount 2, chance 2}... )
+// Give chance (standard 1~10000 roll) to obtain item, capped at amount.
+function script anyloot {
+ if (getargcount() < 3 || getargcount() % 3 != 0)
+ return Exception("Faulty anyloot skill command invoked - error");
+
+ // Get Items
+ for (.@i=0;.@i < getargcount(); .@i++) {
+ if (rand2(10000) < getarg(.@i+2))
+ getitem getarg(.@i), rand2(1, getarg(.@i+1));
+ .@i++;
+ }
+ return true;
+}
+
// Returns, based on a 1-5 range, the title for both thief and merc ranks
// thiefrank() / mercrank()
diff --git a/npc/guilds/alchemy.txt b/npc/guilds/alchemy.txt
index 008e2c2b6..99da224c7 100644
--- a/npc/guilds/alchemy.txt
+++ b/npc/guilds/alchemy.txt
@@ -8,6 +8,7 @@ guilds,24,35,0 script Guild Chemistry NPC_NO_SPRITE,{
do
{
mesc l("What will you brew today?");
+ mesc l("Note: Items brewed here will use a Guild Recipe instead!");
if (AlchemySystem(CRAFT_GUILD))
{
mesc l("Success!"), 3;
diff --git a/npc/guilds/forge.txt b/npc/guilds/forge.txt
index 5f3468167..6f2b3c842 100644
--- a/npc/guilds/forge.txt
+++ b/npc/guilds/forge.txt
@@ -10,6 +10,7 @@ guilds,24,27,0 script Guild Blacksmith NPC_NO_SPRITE,{
{
mesc l("What will you forge today?");
//mesc l("You might need to have a @@ equipped for some recipes!", getitemlink(Knife));
+ mesc l("Note: Items forged here will be guild-bound, but will use player recipes and bonuses!");
if (SmithSystem(CRAFT_GUILD))
{
mesc l("Success!"), 3;
diff --git a/npc/items/alcohol.txt b/npc/items/alcohol.txt
index ad91da8db..1c157584b 100644
--- a/npc/items/alcohol.txt
+++ b/npc/items/alcohol.txt
@@ -51,8 +51,13 @@ OnUse:
end;
}
}
- .@deltatime=60*1000; // How long (in ms) each Alcohol point works? (max. 100 points)
- // Default value is 1 minute per alcohol point - you'll be somber after at most two hours.
+ .@deltatime=2*60*1000; // How long (in ms) each Alcohol point works? (max. 100 points)
+ // Default value is 2 minutes per alcohol point - you'll be somber after at most four hours.
+ // Beer (7): 14 minutes
+ // Wine (16): 32 minutes
+ // Sake (25): 50 minutes
+ // Rum (40) : 80 minutes (1h20)
+ // Ale (70) : 140 minutes (2h20)
// Taste is affected by users near you.
// Each user raises exp bonus in 1.5%, capped to the beverage taste
@@ -100,6 +105,6 @@ OnUse:
function script ALCReset {
if (ALC_DELAYTIME < gettimetick(2))
ALC_THRESHOLD=0;
- end;
+ return;
}
diff --git a/npc/items/books.txt b/npc/items/books.txt
index bafb5be07..918a87ccd 100644
--- a/npc/items/books.txt
+++ b/npc/items/books.txt
@@ -207,8 +207,8 @@ OnInit:
mesc l("Summon Maggot - @sk-kalmurk");
if (getskilllv(TMW2_PARUM))
mesc l("Wood Manipulation - @sk-parum");
- if (getskilllv(TMW2_MKPOT))
- mesc l("Make Potion - @sk-mkpot");
+ if (getskilllv(TMW2_TRANSMIGRATION))
+ mesc l("Transmutation - @sk-trans");
if (getskilllv(TMW2_DEMURE))
mesc l("Divine Rage - @sk-demure");
if (getskilllv(TMW2_DRAGOKIN))
diff --git a/npc/items/legacy_heal.txt b/npc/items/legacy_heal.txt
index c2e1693a9..106b92b8d 100644
--- a/npc/items/legacy_heal.txt
+++ b/npc/items/legacy_heal.txt
@@ -27,7 +27,7 @@ OnUse:
.@skill = SC_S_LIFEPOTION;
// minimum between @min and bVit / 2 * BaseLevel / 10
- @min = min(@max, readparam(bVit) * BaseLevel / 20);
+ //@min = min(@max, readparam(bVit) * BaseLevel / 20);
@val1 = rand2(@min, @max);
@delay *= 1000; // Put the delay in ms
@@ -38,18 +38,23 @@ OnUse:
.@d=getstatus(.@skill, 4) * 1000;
// If there WAS an effect previously, get ponderate average
+ // Note: never use double-precision ponderate averages
if (.@v > 0) {
@val1=ponderate_avg(@val1, @delay, .@v, .@d);
- @delay=ponderate_avg(@delay, @val1, .@d, .@v);
+ // Overflow and Underflow protection
+ if (@delay+.@d < @delay*5 && .@d > 0)
+ @delay=@delay+.@d;
+ //@delay=ponderate_avg(@delay, @val1, .@d, .@v);
}
// Apply the effect and finish
sc_end .@skill;
sc_start2 .@skill, @delay, @val1, 1;
+ // @val1 must be preserved for cross-reading
@delay=0;
@min=0;
@max=0;
- @val1=0;
+ // @val1=0;
end;
}
diff --git a/npc/items/lofteleporter.txt b/npc/items/lofteleporter.txt
index 2540c90dc..8c895387b 100644
--- a/npc/items/lofteleporter.txt
+++ b/npc/items/lofteleporter.txt
@@ -52,6 +52,7 @@ OnUse:
select
l("Don't warp"),
l("Land Of Fire Village (@@m)", 40-.@x),
+ l("Tulimshar (@@m)", 40-.@x),
rif(TELEPORTERS & TP_FROST, l("Frostia (@@m)", 120-.@x)),
rif(TELEPORTERS & TP_HALIN, l("Halinarzo (@@m)", 120-.@x)),
rif(GSET_SOULMENHIR_MANUAL, l("Save Point (@@m)", 20-.@x));
@@ -74,18 +75,24 @@ OnUse:
@timer_navio_running=0;
break;
case 3:
+ warp "003-1", 41, 49;
+ TELEPORTER_TIME=loftel_time(40, .@x);
+ LOCATION$="Tulim";
+ @timer_navio_running=0;
+ break;
+ case 4:
warp "024-1", 155, 82;
TELEPORTER_TIME=loftel_time(120, .@x);
LOCATION$="Frostia";
@timer_navio_running=0;
break;
- case 4:
+ case 5:
warp "009-1", 113, 91;
TELEPORTER_TIME=loftel_time(120, .@x);
LOCATION$="Halin";
@timer_navio_running=0;
break;
- case 5:
+ case 6:
warp "Save", 0, 0;
TELEPORTER_TIME=loftel_time(20, .@x);
//LOCATION$="Save";
diff --git a/npc/items/rand_sc_heal.txt b/npc/items/rand_sc_heal.txt
index c0610b223..c14f33a97 100644
--- a/npc/items/rand_sc_heal.txt
+++ b/npc/items/rand_sc_heal.txt
@@ -85,7 +85,7 @@ OnUse:
@max=max(3, MaxHp*@max/100);
// Calculate how much you'll heal
- @val1 = rand(@min, @max);
+ @val1 = rand2(@min, @max);
// Calculate delay if it was not given
if (!@delay || @delay > 60) {
@@ -123,12 +123,12 @@ OnUse:
sc_start2 .@skill, @delay, @val1, 1;
// Clear stuff
- // @min and @max must be preserved for cross-reading
+ // @val1 must be preserved for cross-reading
@delay=0;
@type=0;
@rarity=0;
- // @min=0;
- // @max=0;
- @val1=0;
+ @min=0;
+ @max=0;
+ // @val1=0;
end;
}
diff --git a/npc/items/shovel.txt b/npc/items/shovel.txt
index 8722cdb0e..ff9d956bd 100644
--- a/npc/items/shovel.txt
+++ b/npc/items/shovel.txt
@@ -289,7 +289,7 @@ OnInit:
.PlayerTiredTime = 25;
// You can bury & dig on all mines
- AddDigRect("007-1", 20, 20, 180, 180);
+ AddDigRect("007-1", 20, 20, 180, 190);
AddDigRect("011-1", 20, 20, 180, 180);
AddDigRect("015-1", 20, 20, 180, 180);
diff --git a/npc/magic/mkpot.txt b/npc/magic/mkpot.txt
deleted file mode 100644
index 576de7ebc..000000000
--- a/npc/magic/mkpot.txt
+++ /dev/null
@@ -1,70 +0,0 @@
-// TMW2 script
-// Author: Jesusalva <admin@tmw2.org>
-//
-// Magic Script: TMW2_MKPOT
-//
-// Attempts to make a haste potion from Mouboo Milk and Plushroom.
-// May make sewer water on failure.
-// TODO: Using too much transmutation magic may have dire consequences! Like, uh, transmutating your head!
-// Nah, it is probably just propaganda... I hope. ¬.¬
-
-- script sk#mkpot 32767,{
- end;
-
-/*
-OnFriendlyDeath:
- emote 4;
- end;
-*/
-
-OnCall:
- // Other requeriments
- if (countitem(Plushroom) < 10 || !countitem(Milk)) {
- dispbottom l("You need @@ @@ and @@ to cast this skill.", 10, getitemlink(Plushroom), getitemlink(Milk));
- end;
- }
-
- // Check cooldown
- if (@mkpot_at > gettimetick(2)) {
- dispbottom l("Skill is in cooldown for @@.", FuzzyTime(@mkpot_at));
- end;
- }
-
- // Check requisites
- if (!MagicCheck(TMW2_MKPOT, 185, -5))
- end;
-
- // Consume items
- delitem Plushroom, 10;
- delitem Milk, 1;
-
- // Create the stuff based on MAGIC_EXP
- // The closer to zero, best;
- // Each 3 mexp reduces chance to get a fail
- // Each skill level reduces chances to get a fail
- .@r=rand(141,181)-(MAGIC_EXP/3)-getskilllv(TMW2_MKPOT);
- if (.@r < 21) {
- // Get up to 6 Haste Potions depending on your skill.
- getitem HastePotion, abizit()+1;
- } else if (.@r < 82) {
- getitem any(BottleOfTonoriWater, BottleOfWoodlandWater, BottleOfDivineWater, Milk, CelestiaTea, PileOfAsh), 1;
- } else if (.@r < 122) {
- getitem any(BottleOfSewerWater, Milk, CelestiaTea, PileOfAsh), 1;
- } else if (.@r < 162) {
- getitem any(BottleOfSewerWater, BottleOfSewerWater, PileOfAsh), 1;
- } else {
- dispbottom l("Your items vanishes into thin air. What?!");
- }
-
- // set cooldown
- @mkpot_at=gettimetick(2);
- @mkpot_at=@mkpot_at+6;
-
- // Get a few mana experience points (this is NOT used by Mana Stone)
- GetManaExp(TMW2_MKPOT, rand(4,11));
- end;
-
-OnInit:
- bindatcmd "sk-mkpot", "sk#mkpot::OnCall", 0, 100, 0;
- end;
-}
diff --git a/npc/magic/transmigration.txt b/npc/magic/transmigration.txt
new file mode 100644
index 000000000..d04dc9e85
--- /dev/null
+++ b/npc/magic/transmigration.txt
@@ -0,0 +1,321 @@
+// TMW2 script
+// Author: Jesusalva <admin@tmw2.org>
+//
+// Magic Script: TMW2_TRANSMIGRATION
+//
+// Attempts to make stuff from other stuff
+// This is actually referred as transmutation in human-readable forms, and
+// transmigration in scripts.
+
+- script sk#mkpot 32767,{
+ end;
+OnCall:
+ // Check cooldown
+ if (@mkpot_at > gettimetick(2)) {
+ dispbottom l("Skill is in cooldown for @@.", FuzzyTime(@mkpot_at));
+ end;
+ }
+
+ // Check requisites
+ if (!MagicCheck(TMW2_TRANSMIGRATION, 185, -5))
+ end;
+
+ .@q=getq(General_Auldsbel);
+
+ do {
+ mes ".:: " + l("Transmutation Skill") + " ::.";
+ mesc l("What will you transmute today?");
+ mes "";
+ menuint
+ l("Crazy Rum"), CrazyRum,
+ l("Coal"), 9901, // 9901 cheat code
+ l("Mouboo Figurine"), MoubooFigurine,
+ rif(.@q >= 9, l("Downgrade Snake Skin")), SnakeSkin,
+ rif(.@q >= 9, l("Downgrade Snake Egg")), SnakeEgg,
+ rif(.@q >= 9, l("Downgrade Snake Tongue")), SnakeTongue,
+ rif(.@q >= 7, l("Downgrade Scorpion Stinger")), ScorpionStinger,
+ rif(.@q >= 7, l("Downgrade Scorpion Claw")), ScorpionClaw,
+ l("Downgrade Ore"), IronOre;
+
+ mes "";
+ mesc l("Transmutating @@ will require:", getitemlink(@menuret));
+
+ // Requeriments listing
+ switch (@menuret) {
+ case CrazyRum:
+ mesc l("* @@/@@ @@", countitem(Plushroom), 10, getitemlink(Plushroom));
+ mesc l("* @@/@@ @@", countitem(Milk), 1, getitemlink(Milk));
+ break;
+ case Coal:
+ mesc l("* @@/@@ @@", countitem(WoodenLog), 5, getitemlink(WoodenLog));
+ break;
+ case MoubooFigurine:
+ mesc l("* @@/@@ @@", countitem(WoodenLog), 1, getitemlink(WoodenLog));
+ break;
+ case SnakeSkin:
+ menuint
+ l("Black Mamba Skin -> Mountain Snake Skin"), MountainSnakeSkin,
+ l("Mountain Snake Skin -> Snake Skin"), SnakeSkin,
+ l("Snake Skin -> Cave Snake Skin"), CaveSnakeSkin,
+ l("Cancel");
+ break;
+ case SnakeEgg:
+ menuint
+ l("Black Mamba Egg -> Mountain Snake Egg"), MountainSnakeEgg,
+ l("Mountain Snake Egg -> Snake Egg"), SnakeEgg,
+ l("Snake Egg -> Cave Snake Egg"), CaveSnakeEgg,
+ l("Cancel");
+ break;
+ case SnakeTongue:
+ menuint
+ l("Black Mamba Tongue -> Mountain Snake Tongue"), MountainSnakeTongue,
+ l("Mountain Snake Tongue -> Snake Tongue"), SnakeTongue,
+ l("Snake Tongue -> Cave Snake Tongue"), CaveSnakeTongue,
+ l("Cancel");
+ break;
+ case ScorpionStinger:
+ menuint
+ l("Black Scorpion Stinger -> Red Scorpion Stinger"), RedScorpionStinger,
+ l("Red Scorpion Stinger -> Scorpion Stinger"), ScorpionStinger,
+ l("Cancel");
+ break;
+ case ScorpionClaw:
+ menuint
+ l("Golden Scorpion Claw -> Black Scorpion Claw"), BlackScorpionClaw,
+ l("Black Scorpion Claw -> Red Scorpion Claw"), RedScorpionClaw,
+ l("Red Scorpion Claw -> Scorpion Claw"), ScorpionClaw,
+ l("Cancel");
+ break;
+ case IronOre:
+ menuint
+ l("Platinum Ore -> Iridium Ore"), IridiumOre,
+ l("Iridium Ore -> Titanium Ore"), TitaniumOre,
+ l("Titanium Ore -> Lead Ore"), LeadOre,
+ l("Lead Ore -> Tin Ore"), TinOre,
+ l("Tin Ore -> Gold Ore"), GoldOre,
+ l("Gold Ore -> Silver Ore"), SilverOre,
+ l("Silver Ore -> Copper Ore"), CopperOre,
+ l("Copper Ore -> Iron Ore"), IronOre,
+ l("Iron Ore -> Coal"), Coal,
+ l("Cancel");
+ break;
+ default:
+ Exception("ERROR, INVALID TRANSMIGRATION OPTION", RB_DEFAULT|RB_SPEECH); @menuret=0; break;
+ }
+ // Confirmation
+ if (@menuret) {
+ next;
+ mesc l("Transmute?!");
+ if (askyesno() == ASK_NO)
+ @menuret=0;
+ }
+ } while (!@menuret);
+
+ // Close the dialog
+ closeclientdialog;
+
+ // Check and Consume the reagents
+ switch (@menuret) {
+ case CrazyRum:
+ if (!transcheck(Plushroom, 10, Milk, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case MoubooFigurine:
+ if (!transcheck(WoodenLog, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case 9901: // Coal cheat code
+ if (!transcheck(WoodenLog, 5)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ @menuret=Coal;
+ break;
+ // Snake Skin Chain
+ case MountainSnakeSkin:
+ if (!transcheck(BlackMambaSkin, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case SnakeSkin:
+ if (!transcheck(MountainSnakeSkin, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case CaveSnakeSkin:
+ if (!transcheck(SnakeSkin, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ // Snake Egg Chain
+ case MountainSnakeEgg:
+ if (!transcheck(BlackMambaEgg, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case SnakeEgg:
+ if (!transcheck(MountainSnakeEgg, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case CaveSnakeEgg:
+ if (!transcheck(SnakeEgg, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ // Snake Tongue Chain
+ case MountainSnakeTongue:
+ if (!transcheck(BlackMambaTongue, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case SnakeTongue:
+ if (!transcheck(MountainSnakeTongue, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case CaveSnakeTongue:
+ if (!transcheck(SnakeTongue, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ // Scorpion Stinger Chain
+ case RedScorpionStinger:
+ if (!transcheck(BlackScorpionStinger, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case ScorpionStinger:
+ if (!transcheck(RedScorpionStinger, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ // Scorpion Claw Chain
+ case BlackScorpionClaw:
+ if (!transcheck(GoldenScorpionClaw, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case RedScorpionClaw:
+ if (!transcheck(BlackScorpionClaw, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case ScorpionClaw:
+ if (!transcheck(RedScorpionClaw, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ // Ore Chain (the biggest one)
+ case IridiumOre:
+ if (!transcheck(PlatinumOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case TitaniumOre:
+ if (!transcheck(IridiumOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case LeadOre:
+ if (!transcheck(TitaniumOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case TinOre:
+ if (!transcheck(LeadOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case GoldOre:
+ if (!transcheck(TinOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case SilverOre:
+ if (!transcheck(GoldOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case CopperOre:
+ if (!transcheck(SilverOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case IronOre:
+ if (!transcheck(CopperOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+ case Coal:
+ if (!transcheck(IronOre, 1)) {
+ dispbottom l("Not enough items!");
+ end;
+ }
+ break;
+
+ default:
+ Exception("ERROR, INVALID TRANSMIGRATION REAGENTS", RB_DEFAULT|RB_SPEECH|RB_ISFATAL); break;
+ }
+
+ // Do the roll from 1 to 100
+ // Base success chance is 0%
+ // Each abizit() point gives you 18% success rate (max 90%)
+ // Each skill level gives you 1% success rate (max 10%)
+ .@r=rand2(1, 100)-abizit()*18-getskilllv(TMW2_TRANSMIGRATION);
+
+ // Backfire chance: 30%
+ if (.@r >= 70) {
+ dispbottom l("The spell backfires!");
+ percentheal -(rand2(5, 15)), 0;
+ // Chance for nothing to happen
+ } else if (.@r >= 30) {
+ dispbottom l("Your reagents vanish into emptiness!");
+ // Chance for you getting a junk item
+ } else if (.@r > 0) {
+ dispbottom l("Your spell takes a mind of its own and shapes in something else!");
+ getitem WarpedLog, 1;
+ // You were successful
+ } else {
+ dispbottom l("*plim*");
+ getitem @menuret, 1;
+ }
+
+ // set cooldown
+ @mkpot_at=gettimetick(2);
+ @mkpot_at=@mkpot_at+6;
+
+ // Get a few mana experience points (this is NOT used by Mana Stone)
+ GetManaExp(TMW2_TRANSMIGRATION, rand2(4,11));
+ end;
+
+OnInit:
+ bindatcmd "sk-trans", "sk#mkpot::OnCall", 0, 100, 0;
+ end;
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index a4ab72b4a..db4c0ca55 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -120,13 +120,14 @@
"npc/magic/kalspike.txt",
"npc/magic/kalwulf.txt",
"npc/magic/limerizer.txt",
-"npc/magic/mkpot.txt",
+"npc/magic/transmigration.txt",
"npc/magic/parum.txt",
"npc/magic/plantkingdom.txt",
"npc/magic/stoneheart.txt",
"npc/magic/zarkor.txt",
// These are to be proccessed later
+"npc/functions/estate2.txt",
"npc/functions/hub.txt",
"npc/functions/gmbot.txt",
"npc/functions/instances.txt",
diff --git a/npc/soren-2/main.txt b/npc/soren-2/main.txt
index be4c65d7c..5fbd492e0 100644
--- a/npc/soren-2/main.txt
+++ b/npc/soren-2/main.txt
@@ -59,7 +59,7 @@ OnSanctum:
// Decide if we'll spawn or add items. Previous failures are NOT considerated.
.@odds=rand(1, 10000);
- .@amount=(rand(0, 5)/2)+1;
+ .@amount=(rand2(0, 5)/2)+1;
.@lx=24; .@ly=27;
.@ux=40; .@uy=36;
diff --git a/npc/soren/main.txt b/npc/soren/main.txt
index 591900d40..db098f63f 100644
--- a/npc/soren/main.txt
+++ b/npc/soren/main.txt
@@ -90,6 +90,10 @@ soren,105,92,0 script Soren's Fountain NPC_NO_SPRITE,{
.st=1;
npctalk l("@@ started disarm process. Please stand by.", strcharinfo(0));
initnpctimer;
+ if (getvariableofnpc(.casterId, "Soren's Fountain") == .casterId)
+ @sorenp=10;
+ else
+ @sorenp=0;
}
close;
@@ -128,14 +132,14 @@ OnTimer31000:
.@val=.@val-10;
if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId)
.@val=.@val-10;
- if (getvariableofnpc(.casterId, "Soren's Fountain") == .casterId)
- .@val=.@val-10;
+ if (@sorenp)
+ .@val-=@sorenp;
percentheal (.@val/2), -13+.@val;
// Monster Gen
- .@amount=rand(.st/3+1, .st/2+1)+getareausers("001-7", 12);
- .@mid=rand(1,3)+.st;
+ .@amount=rand2(.st/3+1, .st/2+1)+getareausers("soren", 12);
+ .@mid=rand2(1,3)+.st;
switch (.@mid) {
case 1:
case 2:
@@ -173,9 +177,9 @@ OnTimer31000:
case 11:
.@itemId = GingerBreadMan ; break;
case 12:
- .@itemId = rand(Diamond, Amethyst) ; break;
+ .@itemId = rand2(Diamond, Amethyst) ; break;
default: // case 13
- .@itemId = rand(CopperOre, TitaniumOre) ; break;
+ .@itemId = rand2(CopperOre, TitaniumOre) ; break;
}
// Defines
.@lx=.x-.distance;
@@ -189,8 +193,8 @@ OnTimer31000:
// If we're done with waves
if (.st >= 7) {
- getexp rand(1, 100), rand(1, 10);
- .lifetime=gettimetick(2)+330+rand(0, 60);
+ getexp rand2(1, 100), rand2(1, 10);
+ .lifetime=gettimetick(2)+330+rand2(0, 60);
npctalk l("Disarmed with success for: @@", FuzzyTime(.lifetime, 2, 2));
stopnpctimer; .st=0;
specialeffect(27);
@@ -241,6 +245,10 @@ soren,104,143,0 script Soren's Lake NPC_NO_SPRITE,{
.st=1;
npctalk l("@@ started disarm process. Please stand by.", strcharinfo(0));
initnpctimer;
+ if (getvariableofnpc(.casterId, "Soren's Lake") == .casterId)
+ @sorenp=10;
+ else
+ @sorenp=0;
}
close;
@@ -279,14 +287,14 @@ OnTimer30900:
.@val=.@val-10;
if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId)
.@val=.@val-10;
- if (getvariableofnpc(.casterId, "Soren's Lake") == .casterId)
- .@val=.@val-10;
+ if (@sorenp)
+ .@val-=@sorenp;
percentheal (.@val/2), -13+.@val;
// Monster Gen. Lake spawns less
- .@amount=rand(.st/3+1, .st/2+1)+getareausers("001-7", 12)-1;
- .@mid=rand(1,3)+.st;
+ .@amount=rand2(.st/3+1, .st/2+1)+getareausers("soren", 12)-1;
+ .@mid=rand2(1,3)+.st;
switch (.@mid) {
case 1:
case 2:
@@ -324,9 +332,9 @@ OnTimer30900:
case 11:
.@itemId = HastePotion ; break;
case 12:
- .@itemId = rand(Diamond, Amethyst) ; break;
+ .@itemId = rand2(Diamond, Amethyst) ; break;
default: // case 13
- .@itemId = rand(CopperOre, TitaniumOre) ; break;
+ .@itemId = rand2(CopperOre, TitaniumOre) ; break;
}
// Defines for Lake are fixed on the same spot.
.@lx=104; .@ux=104;
@@ -337,7 +345,7 @@ OnTimer30900:
// If we're done with waves
if (.st >= 7) {
- .lifetime=gettimetick(2)+330+rand(0, 60);
+ .lifetime=gettimetick(2)+330+rand2(0, 60);
npctalk l("Disarmed with success for: @@", FuzzyTime(.lifetime, 2, 2));
stopnpctimer; .st=0;
}
@@ -389,6 +397,10 @@ soren,107,37,0 script Soren's Gizmo NPC_NO_SPRITE,{
.st=1;
npctalk l("@@ started disarm process. Please stand by.", strcharinfo(0));
initnpctimer;
+ if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId)
+ @sorenp=10;
+ else
+ @sorenp=0;
}
close;
@@ -427,14 +439,14 @@ OnTimer31200:
.@val=.@val-10;
if (getvariableofnpc(.casterId, "Soren's Fountain") == .casterId)
.@val=.@val-10;
- if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId)
- .@val=.@val-10;
+ if (@sorenp)
+ .@val-=@sorenp;
percentheal (.@val/2), -13+.@val;
// Monster Gen. Gizmo spawns more monsters because you can move more
- .@amount=rand(.st/3+1, .st/2+1)+getareausers("001-7", 12)+1;
- .@mid=rand(1,3)+.st;
+ .@amount=rand2(.st/3+1, .st/2+1)+getareausers("soren", 12)+1;
+ .@mid=rand2(1,3)+.st;
switch (.@mid) {
case 1:
case 2:
@@ -472,9 +484,9 @@ OnTimer31200:
case 11:
.@itemId = HastePotion ; break;
case 12:
- .@itemId = rand(Diamond, Amethyst) ; break;
+ .@itemId = rand2(Diamond, Amethyst) ; break;
default: // case 13
- .@itemId = rand(CopperOre, TitaniumOre) ; break;
+ .@itemId = rand2(CopperOre, TitaniumOre) ; break;
}
// Defines
.@lx=.x-.distance;
@@ -487,7 +499,7 @@ OnTimer31200:
// If we're done with waves
if (.st >= 7) {
- .lifetime=gettimetick(2)+330+rand(0, 60);
+ .lifetime=gettimetick(2)+330+rand2(0, 60);
npctalk l("Disarmed with success for: @@", FuzzyTime(.lifetime, 2, 2));
stopnpctimer; .st=0;
}