diff options
51 files changed, 662 insertions, 156 deletions
diff --git a/GNUmakefile b/GNUmakefile index 508cfea2..d08a2409 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -23,7 +23,7 @@ indent-items: tools/aligncsv indent-mobs: tools/aligncsv tools/aligncsv world/map/db/mob_db.txt -world/map/news.txt world/map/news.html: tools/news.py tools/_news_colors.py world/map/news.d/* +world/map/news.txt world/map/news.html: tools/news.py tools/_news_colors.py world/map/news.d/* world/map/news.d/ tools/news.py world/map/ world/map/news.d/ news: world/map/news.txt world/map/news.html diff --git a/client-data b/client-data -Subproject 8d9264bcae8835e2ea0bc0dd1d429fb04d4dee6 +Subproject a2fd108c1ca8cf389575eca833fc12c18d7e097 diff --git a/tools/tmx_converter.py b/tools/tmx_converter.py index 17773dc6..94cf0b2c 100755 --- a/tools/tmx_converter.py +++ b/tools/tmx_converter.py @@ -328,11 +328,13 @@ def main(argv): mob_names[int(k)] = v.strip() npc_master = [] + map_basenames = [] for arg in os.listdir(tmx_dir): base, ext = posixpath.splitext(arg) if ext == '.tmx': + map_basenames.append(base) tmx = posixpath.join(tmx_dir, arg) wlk = posixpath.join(wlk_dir, base + '.wlk') this_map_npc_dir = posixpath.join(npc_dir, base) @@ -344,6 +346,9 @@ def main(argv): xml.sax.parse(tmx, ContentHandler(wlk, this_map_npc_dir, mobs, warps, imports)) npc_master.append('import: %s\n' % posixpath.join(SERVER_NPCS, base, NPC_IMPORTS)) + with open(posixpath.join(wlk_dir, 'resnametable.txt'), 'w') as resname: + for base in sorted(map_basenames): + resname.write('%s.gat#%s.wlk#\n' % (base, base)) with open(posixpath.join(npc_dir, NPC_MASTER_IMPORTS), 'w') as out: out.write('// %s\n\n' % MESSAGE) npc_master.sort() diff --git a/tools/web/README b/tools/web/README new file mode 100644 index 00000000..dc7bc55b --- /dev/null +++ b/tools/web/README @@ -0,0 +1,3 @@ +This is a flask app to manage accounts. + +It implements a full-featured webserver, but is usually proxied by nginx. diff --git a/tools/web/main.py b/tools/web/main.py new file mode 100755 index 00000000..b7501c5c --- /dev/null +++ b/tools/web/main.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python2.6 + +from flask import Flask + +from with_xml import Node + +app = Flask(__name__) + +@app.route('/') +def index(): + content = Node() + tag = content.tag + put = content.put + a = tag('a') + with tag('html'): + with tag('head'): + with tag('title'): + put('Title') + with tag('body'): + with tag('h1'): + put('Header') + put('This is ') + with a(href='http://google.com/'): + put('a link to Google.') + return str(content) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/tools/web/with_xml.py b/tools/web/with_xml.py new file mode 100644 index 00000000..bc49a94e --- /dev/null +++ b/tools/web/with_xml.py @@ -0,0 +1,71 @@ +''' A stupid little way of generating xml +''' + +import re + +from flask import escape + +PRETTY = True + +class Context(object): + __slots__ = ('_node', '_name', '_kwargs') + pattern = re.compile(r'[A-Za-z]\w*') + + def __init__(self, node, name, kwargs): + self._node = node + self._name = name + self._kwargs = kwargs + + def __enter__(self): + _node = self._node + _buffer = _node._buffer + _node.nl() + _buffer.extend(['<', escape(self._name)]) + for k, v in self._kwargs.iteritems(): + assert Context.pattern.match(k) + _buffer.extend([' ', k, '="', escape(v), '"']) + _buffer.append('>') + _node._indent += 1 + _node.nl() + + def __exit__(self, exc_type, exc_value, traceback): + _node = self._node + _buffer = _node._buffer + _node._indent -= 1 + _node.nl() + if _buffer[-1] == '>' and _buffer[-3] != '</': + _buffer[-1] = '/>' + else: + _buffer.extend(['</', escape(self._name), '>']) + _node.nl() + + def __call__(_self, **kwargs): + new_kwargs = dict(_self._kwargs) + new_kwargs.update(kwargs) + return Context(_self._node, _self._name, new_kwargs) + +class Node(object): + __slots__ = ('_buffer', '_indent') + + def __init__(self): + self._buffer = ['<?xml version="1.0" encoding="utf-8"?>', '\n', ''] + self._indent = 0 + + def tag(_self, _name, **kwargs): + return Context(_self, _name, kwargs) + + + def put(self, text): + self._buffer.append(escape(text)) + + def __str__(self): + return ''.join(self._buffer) + + def nl(self): + if PRETTY: + _buffer = self._buffer + if _buffer[-2] == '\n': + _buffer.pop() + else: + _buffer.append('\n') + _buffer.extend([' ' * self._indent]) diff --git a/world/map/data/008-1.wlk b/world/map/data/008-1.wlk Binary files differindex 63cde59b..c6d58b43 100644 --- a/world/map/data/008-1.wlk +++ b/world/map/data/008-1.wlk diff --git a/world/map/data/010-1.wlk b/world/map/data/010-1.wlk Binary files differindex e87cfc56..2abcbead 100644 --- a/world/map/data/010-1.wlk +++ b/world/map/data/010-1.wlk diff --git a/world/map/data/021-1.wlk b/world/map/data/021-1.wlk Binary files differindex 9f7730d8..2e18e65f 100644 --- a/world/map/data/021-1.wlk +++ b/world/map/data/021-1.wlk diff --git a/world/map/data/021-2.wlk b/world/map/data/021-2.wlk Binary files differindex be26d54e..82581b05 100644 --- a/world/map/data/021-2.wlk +++ b/world/map/data/021-2.wlk diff --git a/world/map/data/022-1.wlk b/world/map/data/022-1.wlk Binary files differindex ce2d225a..56193c3f 100644 --- a/world/map/data/022-1.wlk +++ b/world/map/data/022-1.wlk diff --git a/world/map/data/034-2.wlk b/world/map/data/034-2.wlk Binary files differnew file mode 100644 index 00000000..21fcee6d --- /dev/null +++ b/world/map/data/034-2.wlk diff --git a/world/map/data/resnametable.txt b/world/map/data/resnametable.txt index a865b707..07f1f6a2 100644 --- a/world/map/data/resnametable.txt +++ b/world/map/data/resnametable.txt @@ -2,7 +2,6 @@ 001-2.gat#001-2.wlk# 001-3.gat#001-3.wlk# 002-1.gat#002-1.wlk# -002-2.gat#002-2.wlk# 002-3.gat#002-3.wlk# 002-4.gat#002-4.wlk# 003-1.gat#003-1.wlk# @@ -55,9 +54,7 @@ 020-3.gat#020-3.wlk# 021-1.gat#021-1.wlk# 021-2.gat#021-2.wlk# -021-8.gat#021-8.wlk# 022-1.gat#022-1.wlk# -023-1.gat#023-1.wlk# 024-1.gat#024-1.wlk# 024-2.gat#024-2.wlk# 024-3.gat#024-3.wlk# @@ -84,6 +81,7 @@ 032-3.gat#032-3.wlk# 033-1.gat#033-1.wlk# 034-1.gat#034-1.wlk# +034-2.gat#034-2.wlk# 041-1.gat#041-1.wlk# 042-1.gat#042-1.wlk# 042-2.gat#042-2.wlk# diff --git a/world/map/db/item_db.txt b/world/map/db/item_db.txt index 9481ee81..f31e0203 100644 --- a/world/map/db/item_db.txt +++ b/world/map/db/item_db.txt @@ -97,7 +97,7 @@ //591, RESERVED, LongSword, , , , , , , , , , , , , , , {}, {} //592, RESERVED, Stiletto, , , , , , , , , , , , , , , {}, {} //593, RESERVED, Rapier, , , , , , , , , , , , , , , {}, {} -594, Spear, Spear, 4, 1000, 500, 200, 15, , 1, , 0, 2, 2, 1, 1, 1, {}, {callfunc "UnreleasedItem";} +//594, Spear, Spear, 4, 1000, 500, 200, 15, , 1, , 0, 2, 2, 1, 1, 1, {}, {callfunc "UnreleasedItem";} //595, RESERVED, HeavySpear, , , , , , , , , , , , , , , {}, {} //596, RESERVED, Pike, , , , , , , , , , , , , , , {}, {} //597, RESERVED, HeavyPike, , , , , , , , , , , , , , , {}, {} @@ -351,9 +351,9 @@ 835, HyvernStinger, Hyvern Stinger, 3, 100, 25, 10, , , , 0, 0, 2, , , 0, 0, {}, {} 836, GrubSlime, Grub Slime, 3, 40, 10, 2, , , , 0, 0, 2, , , 0, 0, {}, {} //837, RESERVED, WitchRoot, , , , , , , , , , , , , , , {}, {} -838, CranberryLollipop, Cranberry Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} -839, GrapeLollipop, Grape Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} -840, OrangeLollipop, Orange Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} +838, CranberryLollipop, Cranberry Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} +839, GrapeLollipop, Grape Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} +840, OrangeLollipop, Orange Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 750, 0;}, {} 841, RedDottedWrap, Red Dotted Wrap, 3, 50, 25, 500, , , , , , , , , , , {}, {} 842, YellowDottedWrap, Yellow Dotted Wrap, 3, 50, 25, 500, , , , , , , , , , , {}, {} 843, BlueDottedWrap, Blue Dotted Wrap, 3, 50, 25, 500, , , , , , , , , , , {}, {} @@ -405,6 +405,7 @@ 888, MagicGMTopHat, Magic GM Top Hat, 5, 4200, 1900, 30, , 60, , 20, 0, 2, 256, , 0, 0, {}, {set @minLvl, 60; callfunc "RestrictedItem"; bonus bMaxHP, 31000; bonus bFlee, -200; bonus bHPrecovRate, -400; bonus bCriticalDef, 250; bonus bMdef, 89;} 889, MurdererCrown, Murderer Crown, 5, 75000, 12000, 240, , 4, , 0, 0, 2, 256, , 0, 0, {}, {} 890, BeanieCopter, Beanie Copter, 5, 8000, 2000, 20, , 4, , 2, 0, 2, 256, , 0, 0, {}, {} +891, SilkSheet, Silk Sheet, 3, 1000, 250, 5, , , , , , , , , , , {}, {} 892, OrangeSummonFlower, Orange Summon Flower, 3, 50, 25, 1, , , , , , , , , , , {}, {} 893, PurpleSummonFlower, Purple Summon Flower, 3, 100, 50, 1, , , , , , , , , , , {}, {} 894, WhiteSummonFlower, White Summon Flower, 3, 200, 100, 1, , , , , , , , , , , {}, {} @@ -453,10 +454,10 @@ //1227, EnchantersAmulet, Enchanter's Amulet, , , , , , , , , , , , , , , {}, {} 1228, LightCrystal, Light Crystal, 3, 1000, 250, 10, , , , , , , , , , , {}, {} 1229, CaramelApple, Caramel Apple, 0, 500, 75, 5, , , , , , 2, , , 0, , {itemheal 1000, 0;}, {} -1230, LollipopColor1, Booberry Blue Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} -1231, LollipopColor2, Ghastly Green Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} -1232, LollipopColor3, Blood Red Lollipop, 0, 20, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} -1233, FakeFangs, Cheap Plastic Fangs, 3, 20, 10000, 1, , , , , , 2, , , 0, , {}, {} +1230, LollipopColor1, Booberry Blue Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} +1231, LollipopColor2, Ghastly Green Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} +1232, LollipopColor3, Blood Red Lollipop, 0, 100, 50, 1, , , , , , 2, , , 0, , {itemheal 800, 0;}, {} +1233, FakeFangs, Cheap Plastic Fangs, 3, 20000, 10000, 1, , , , , , 2, , , 0, , {}, {} 1234, RedOrnament, Red Christmas Ornament, 3, 5000, 1, 1, , , , , , 2, , , 0, , {}, {} 1235, YellowOrnament, Yellow Christmas Ornament, 3, 5000, 1, 1, , , , , , 2, , , 0, , {}, {} 1236, GreenOrnament, Green Christmas Ornament, 3, 5000, 1, 1, , , , , , 2, , , 0, , {}, {} @@ -673,7 +674,7 @@ 2204, LightBlueWizardHat, Light Blue Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} #ID, Name, Label, Type, Price, Sell, Weight, ATK, DEF, Range, Mbonus, Slot, Gender, Loc, wLV, eLV, View, {UseScript}, {EquipScript} 2205, PinkWizardHat, Pink Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} -2206, BlackWizardHat, Red Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} +2206, BlackWizardHat, Black Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} 2207, OrangeWizardHat, Orange Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} 2208, PurpleWizardHat, Purple Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} 2209, DarkGreenWizardHat, Dark Green Wizard Hat, 5, 5000, 2500, 20, , 5, , 5, 0, 2, 256, , 1, 0, {}, {bonus bInt, 3;} @@ -737,11 +738,11 @@ 3003, JarofBlood, Jar of Blood, 3, 200, 100, 375, , , , , , , , , , , {}, {} 3004, Tongue, Tongue, 3, 5, 1, 5, , , , , , , , , , , {}, {} //3005 -3006, TonoriDelight, Tonori Delight, 0, 5, 1, 2, , , , , , 2, , , 0, , {}, {} -3007, Marshmallow, Marshmallow, 0, 5, 1, 2, , , , , , 2, , , 0, , {}, {} +3006, TonoriDelight, Tonori Delight, 3, 5, 1, 2, , , , , , 2, , , 0, , {}, {} +3007, Marshmallow, Marshmallow, 3, 5, 1, 2, , , , , , 2, , , 0, , {}, {} //3008 -3009, JellySkull, Jelly Skull, 0, 5, 1, 2, , , , , , 2, , , 0, , {}, {} -3010, CandyPumpkin, Candy Pumpkin, 0, 5, 1, 2, , , , , , 2, , , 0, , {}, {} +3009, JellySkull, Jelly Skull, 3, 5, 1, 2, , , , , , 2, , , 0, , {}, {} +3010, CandyPumpkin, Candy Pumpkin, 3, 5, 1, 2, , , , , , 2, , , 0, , {}, {} 3011, PumpkinSeeds, Pumpkin Seeds, 3, 5, 1, 1, , , , , , , , , , , {}, {} // No new additions to the 3000s please. Add to the bottom of the < 1000s for regular entries and the 2000s for dyed entries. 4000, AngryScorpionStinger, Angry Scorpion Stinger, 3, 50, 25, 1, , , , , , , , , , , {}, {} diff --git a/world/map/news.d/19-double-exp-drop.txt b/world/map/news.d/19-double-exp-drop.txt new file mode 100644 index 00000000..85140414 --- /dev/null +++ b/world/map/news.d/19-double-exp-drop.txt @@ -0,0 +1,21 @@ +{date:2013-06-07} + +This weekend we're temporarily doubling both the +experience rate and the drop rates for all monsters, +to give the chance to recover from the rollback +we had due to filesystem corruption. + +There are also some bug fixes and new content: + +The craftsmen of Tulimshar have finally moved to the +renovated Forge at the Northern Market, so the +Wizard's Inn is back to offering a calm stay for visitors. + +In the woodland area the mysterious Evil Obelisk which +summons beings from the astral plane for the mundane +price of gold has drastically reduced its demands. + +On the technical side, in case of network congestion, +you will no longer be kicked with an invalid packet error. + +{author: TMW Development Team} diff --git a/world/map/news.html b/world/map/news.html index 9760aa1a..e017ff80 100644 --- a/world/map/news.html +++ b/world/map/news.html @@ -1,6 +1,30 @@ <!-- Generated by tools/news.py for index.php --> <div> <p/> +<font color="#0000ff">2013-06-07</font> +<p/> +This weekend we're temporarily doubling both the +experience rate and the drop rates for all monsters, +to give the chance to recover from the rollback +we had due to filesystem corruption. +<p/> +There are also some bug fixes and new content: +<p/> +The craftsmen of Tulimshar have finally moved to the +renovated Forge at the Northern Market, so the +Wizard's Inn is back to offering a calm stay for visitors. +<p/> +In the woodland area the mysterious Evil Obelisk which +summons beings from the astral plane for the mundane +price of gold has drastically reduced its demands. +<p/> +On the technical side, in case of network congestion, +you will no longer be kicked with an invalid packet error. +<p/> +-<font color="#009000"> TMW Development Team</font> +</div> +<div> +<p/> <font color="#0000ff">2013-04-28</font> <p/> We're having a bugfix release today. diff --git a/world/map/news.php b/world/map/news.php index d5208e44..48ba5e00 100644 --- a/world/map/news.php +++ b/world/map/news.php @@ -1,40 +1,130 @@ <?php -header("Content-type: text/plain"); -header("Cache-Control: no-store, no-cache, must-revalidate"); -header("Cache-Control: post-check=0, pre-check=0", false); -header("Pragma: no-cache"); -$agent = $_SERVER['HTTP_USER_AGENT']; +// configuration variables +$min_version = '0.5.1'; +$min_manaplus = '1.1.2.20'; +$cur_version = '0.6.1'; + +// utility functions +function failure_headers() +{ + header('HTTP/1.0 403 Upgrade your client'); + common_headers(); +} + +function common_headers() +{ + header('Content-type: text/plain'); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Cache-Control: post-check=0, pre-check=0', false); + header('Pragma: no-cache'); +} -if (substr($agent, 0, 3) == "TMW" || substr($agent, 0, 4) == "Mana") +function starts_with($haystack, $needle) +{ + // avoid allocation + return strpos($haystack, $needle, 0) === 0; +} + +function record_version($agent) { $file = 'versions/' . date('Y-m-d') . '.txt'; + // is touching this really needed? touch($file); file_put_contents($file, '[' . date('H:i') . "] $agent\n", FILE_APPEND); } -$min_version = '0.5.0'; -$cur_version = '0.6.1'; - -if (substr($agent, 0, 3) == "TMW") +// response functions +function handle_tmw($agent) { + failure_headers(); echo "##1 The client you're using is really old!\n", "##1 Please upgrade to a Mana or ManaPlus client.\n", "##1 TMW Staff\n \n"; } -if (substr($agent, 0, 5) == "Mana/" - and $agent < 'Mana/' . $min_version) +function handle_mana($agent, $min_version) { - echo "##1 The client you're using is no longer\n". - "##1 supported! Please upgrade to $min_version or\n". - "##1 higher, or use ManaPlus!\n \n". - "##1 TMW Staff\n \n"; + $version_pos = 5; + $version_end = strpos($agent, ' '); + $agent_version = substr($agent, $version_pos, $version_end - $version_pos); + if (version_compare($agent_version, $min_version) < 0) + { + failure_headers(); + echo "##1 The client you're using is no longer\n". + "##1 supported! Please upgrade to $min_version or\n". + "##1 higher, or use ManaPlus!\n \n". + "##1 TMW Staff\n \n"; + } + else + { + common_headers(); + } +} + +function handle_manaplus($agent, $min_version) +{ + $version_pos = strpos($agent, '4144 v') + 6; + $version_end = strpos($agent, ')', $version_pos); + $agent_version = substr($agent, $version_pos, $version_end - $version_pos); + if (version_compare($agent_version, $min_version) < 0) + { + failure_headers(); + echo "##1 The client you're using is no longer\n", + "##1 supported! Please upgrade to $min_version or\n", + "##1 higher!\n \n", + "##1 TMW Staff\n \n"; + } + else + { + common_headers(); + } +} + +function handle_other($agent) +{ + common_headers(); + echo "##1 I have no clue what client you're using. Good luck!\n"; +} + +function handle_browser($agent) +{ + common_headers(); + echo "##1 It looks like this is a web browser, not a game client\n"; +} + +// main body +$agent = $_SERVER['HTTP_USER_AGENT']; + +if (starts_with($agent, 'TMW')) +{ + handle_tmw($agent); + record_version($agent); +} +else if (starts_with($agent, 'Mana')) +{ + if (starts_with($agent, 'ManaPlus')) + { + handle_manaplus($agent, $min_manaplus); + } + else if (starts_with($agent, 'Mana/')) + { + handle_mana($agent, $min_version); + } + else + { + handle_other($agent); + } + record_version($agent); +} +else +{ + handle_browser($agent); } echo "##9 Latest client version: ##6$cur_version\n \n"; echo "##7 TMW Staff will never ask you for your password.\n"; echo "##7 Anyone doing so is trying to scam you.\n \n"; -print file_get_contents("news.txt"); +print file_get_contents('news.txt'); ?> diff --git a/world/map/news.txt b/world/map/news.txt index be962a6d..f54b41ca 100644 --- a/world/map/news.txt +++ b/world/map/news.txt @@ -1,3 +1,26 @@ +##32013-06-07##0 + +This weekend we're temporarily doubling both the +experience rate and the drop rates for all monsters, +to give the chance to recover from the rollback +we had due to filesystem corruption. + +There are also some bug fixes and new content: + +The craftsmen of Tulimshar have finally moved to the +renovated Forge at the Northern Market, so the +Wizard's Inn is back to offering a calm stay for visitors. + +In the woodland area the mysterious Evil Obelisk which +summons beings from the astral plane for the mundane +price of gold has drastically reduced its demands. + +On the technical side, in case of network congestion, +you will no longer be kicked with an invalid packet error. + +-##2 TMW Development Team##0 + + ##32013-04-28##0 We're having a bugfix release today. diff --git a/world/map/npc/009-3/warp.txt b/world/map/npc/009-3/warp.txt index 7f709abd..9bb9ab28 100644 --- a/world/map/npc/009-3/warp.txt +++ b/world/map/npc/009-3/warp.txt @@ -1,4 +1,4 @@ -009-3.gat,162,80,0|script|#PVPCaveBarrier|45,1,1,{ +009-3.gat,162,80,0|script|#PVPCaveBarrier|45,0,0,{ mes "Do you want to enter the PVP cave? It costs 150GP."; menu "No.", L_Exit, diff --git a/world/map/npc/010-2/loratay.txt b/world/map/npc/010-2/loratay.txt index 978c3712..f34d9c57 100644 --- a/world/map/npc/010-2/loratay.txt +++ b/world/map/npc/010-2/loratay.txt @@ -2,6 +2,9 @@ set @ROBE_COCOONS_NR, 150; // must be multiple of ten set @ROBE_ZENY, 10000; + set @ROBE_SHEETS_NR, 6; // number of silk sheets required for the silk robe. Must be less than 10. + set @ROBE_SHEETS_ZENY, 6000; // price of the silk robe when bringing silk sheets. + set @Robe_with_sheets, 0; // will be set to 1 if silk robe is made with sheets set @FINEDRESS_COCOONS, 180; set @SORCERER_ROBE_SEW_ZENY, 25000; set @SORCERER_ROBE_NUM_COTTON_CLOTH, 2; @@ -683,13 +686,13 @@ L_robe: mes "[Lora Tay the Seamstress]"; mes "\"A robe? Well, as long as you're not asking me to make it out of cotton...\""; next; - if (countitem("SilkCocoon") == 0) + if (countitem("SilkCocoon")== 0 && countitem("SilkSheet")== 0) goto L_robe_nosilk; L_robe_menu: menu "Here, I have some silk cocoons!", -, - "Here, I have some silk sheets!", L_robe_nosilk, + "Here, I have some silk sheets!", L_robe_sheets, "Where can I find silk?", L_where_silk, "How much silk do you need?", L_how_much_silk, "Oh, never mind.", L_main_menu; @@ -723,10 +726,33 @@ L_robe_menu: goto L_TooMany; set Zeny, Zeny - @ROBE_ZENY; delitem "SilkCocoon", @ROBE_COCOONS_NR; - getitem "SilkRobe", 1; mes "[Lora Tay the Seamstress]"; mes "The seamstress puts your cocoons and GP away, takes your measurements and pulls out several silk sheets. She asks you to stretch out your arms, then pins the silk sheets in place all over your body."; next; + goto L_get_robe; + +L_robe_sheets: + set @Robe_with_sheets, 1; + mes "[Lora Tay the Seamstress]"; + mes "\"Let's see... " + @ROBE_SHEETS_NR + " silk sheets and " + @ROBE_SHEETS_ZENY + " GP should just about cover that.\""; + next; + menu + "I'm not interested.", L_main_menu, + "Very well then, here you are.", -; + if (countitem("SilkSheet") < @ROBE_SHEETS_NR) + goto L_robe_missing_sheets; + if (Zeny < @ROBE_SHEETS_ZENY) + goto L_robe_sheet_missing_Zeny; + getinventorylist; + if (@inventorylist_count == 100 && countitem("SilkSheet") > @ROBE_SHEETS_NR) + goto L_TooMany; + set Zeny, Zeny - @ROBE_SHEETS_ZENY; + delitem "SilkSheet", @ROBE_SHEETS_NR; + mes "[Lora Tay the Seamstress]"; + mes "The seamstress puts your GP away, takes your measurements and puts the silk sheets on the table. She asks you to stretch out your arms, then pins the silk sheets in place all over your body."; + next; + +L_get_robe: mes "[Lora Tay the Seamstress]"; mes "She proceeds to make a number of mysterious marks on the sheets with a charcoal pen. Meanwhile, your arms are getting tired, but you're afraid to lower them-- she used a lot of pins to put everything into place, and you lost track of where they went..."; next; @@ -736,10 +762,18 @@ L_robe_menu: next; mes "[Lora Tay the Seamstress]"; mes "She then treats the seams with some odorless liquid, making them vanish completely. Finally she hands you the finished robe."; + getitem "SilkRobe", 1; + if (@Robe_with_sheets == 1) + goto L_robe_sheet_end; mes "\"Here you are now, this will fit. And don't you dare tell anyone that I did this! I'm not about to start a silk cocoon collection!\""; next; goto L_main_menu; +L_robe_sheet_end: + mes "\"Here you are now, this will fit. Thank you for bringing the sheets. People are so lazy nowadays! \""; + next; + goto L_main_menu; + L_robe_missing_cocoons: mes "[Lora Tay the Seamstress]"; mes "\"" + @ROBE_COCOONS_NR + " cocoons is what I said, not " + countitem("SilkCocoon") + "."; @@ -753,6 +787,19 @@ L_robe_missing_Zeny: next; goto L_main_menu; +L_robe_missing_sheets: + mes "[Lora Tay the Seamstress]"; + mes "\"" + @ROBE_SHEETS_NR + " silk sheets is what I said, not " + countitem("SilkSheet") + "."; + mes @ROBE_SHEETS_NR + " is " + (10-@ROBE_SHEETS_NR) + " less than you have fingers, in case that helps.\""; + next; + goto L_main_menu; + +L_robe_sheet_missing_Zeny: + mes "[Lora Tay the Seamstress]"; + mes "\"No, no no. The way this works is that you give me the GP first and I give you the robe afterwards. You're " + (@ROBE_SHEETS_ZENY - Zeny) + " GP short, so come back when you can afford the robe!\""; + next; + goto L_main_menu; + L_where_silk: mes "[Lora Tay the Seamstress]"; mes "\"Oh, Hetchel on the Tulimshar Marketplace can weave them for you.\""; @@ -776,6 +823,11 @@ L_robe_nosilk: goto L_main_menu; L_end: + set @ROBE_COCOONS_NR, 0; + set @ROBE_ZENY, 0; + set @ROBE_SHEETS_NR, 0; + set @ROBE_SHEETS_ZENY, 0; + set @Robe_with_sheets, 0; close; // Input: @items (array of items you want to choose from) diff --git a/world/map/npc/018-3/evil-obelisk.txt b/world/map/npc/018-3/evil-obelisk.txt index c80e3b59..aec1345b 100644 --- a/world/map/npc/018-3/evil-obelisk.txt +++ b/world/map/npc/018-3/evil-obelisk.txt @@ -3,8 +3,16 @@ 018-3.gat,67,28,0|script|Evil Obelisk|185,{ callfunc "ClearVariables"; set @map$, "018-3.gat"; - set @x, 67; - set @y, 28; + set @x0, 56; + set @y0, 22; + set @x1, 77; + set @y1, 37; callfunc "EvilObelisk"; +//clearing vars + set @map$, ""; + set @x0, 0; + set @y0, 0; + set @x1, 0; + set @y1, 0; close; } diff --git a/world/map/npc/020-1/soul-menhir.txt b/world/map/npc/020-1/soul-menhir.txt index 68a81acc..cdcc05c1 100644 --- a/world/map/npc/020-1/soul-menhir.txt +++ b/world/map/npc/020-1/soul-menhir.txt @@ -3,8 +3,8 @@ 020-1.gat,63,89,0|script|Soul Menhir|346,{ callfunc "ClearVariables"; set @map$, "020-1.gat"; - setarray @Xs, 62, 63, 64, 62, 64, 62, 63, 64; - setarray @Ys, 88, 88, 88, 89, 89, 90, 90, 90; + setarray @Xs, 62, 63, 64, 62, 64, 62, 64; + setarray @Ys, 88, 88, 88, 89, 89, 90, 90; set @x, 0; set @y, 0; callfunc "SoulMenhir"; diff --git a/world/map/npc/021-1/_import.txt b/world/map/npc/021-1/_import.txt index 30acb5b8..9fa30a77 100644 --- a/world/map/npc/021-1/_import.txt +++ b/world/map/npc/021-1/_import.txt @@ -7,12 +7,12 @@ npc: npc/021-1/bakery.txt npc: npc/021-1/banu.txt npc: npc/021-1/eurni.txt npc: npc/021-1/gate_guards.txt +npc: npc/021-1/hetchel.txt npc: npc/021-1/hideandseek.txt npc: npc/021-1/imec.txt npc: npc/021-1/inac.txt npc: npc/021-1/mapflags.txt npc: npc/021-1/north_shops.txt npc: npc/021-1/npcs.txt -npc: npc/021-1/royal_guards.txt npc: npc/021-1/weellos.txt npc: npc/021-1/workers.txt diff --git a/world/map/npc/021-1/_warps.txt b/world/map/npc/021-1/_warps.txt index 5d620e74..618c057a 100644 --- a/world/map/npc/021-1/_warps.txt +++ b/world/map/npc/021-1/_warps.txt @@ -7,10 +7,14 @@ 021-1.gat,55,134|warp|To Government Building|-1,-1,021-2.gat,33,29 021-1.gat,57,134|warp|To Government Building|-1,-1,021-2.gat,39,29 021-1.gat,103,100|warp|To Tulimshar Bakery|-1,-1,021-2.gat,91,27 -021-1.gat,103,96|warp|toBakery|-1,-1,021-2.gat,122,23 +021-1.gat,103,96|warp|To Bakery|-1,-1,021-2.gat,122,23 021-1.gat,49,64|warp|To Tulimshar Canyon|3,-1,024-1.gat,86,73 -021-1.gat,53,99|warp|To Tulimshar Forge|-1,-1,021-2.gat,25,66 -021-1.gat,52,95|warp|To Tulimshar Forge|-1,-1,021-2.gat,23,98 +021-1.gat,53,99|warp|To Wizard's Rest|-1,-1,021-2.gat,25,66 +021-1.gat,52,95|warp|To Wizard's Rest|-1,-1,021-2.gat,23,98 021-1.gat,73,22|warp|To Tulimshar Port|3,-1,022-1.gat,73,109 021-1.gat,113,22|warp|To Tulimshar Port|3,-1,022-1.gat,113,109 -021-1.gat,43,110|warp|to Store|-1,-1,021-2.gat,28,129 +021-1.gat,43,110|warp|To Store|-1,-1,021-2.gat,28,129 +021-1.gat,132,31|warp|To Tulimshar Forge|-1,-1,021-2.gat,79,138 +021-1.gat,133,24|warp|To Tulimshar Forge|-1,-1,021-2.gat,75,92 +021-1.gat,125,27|warp|To Tulimshar Forge|-1,-1,021-2.gat,124,68 +021-1.gat,125,31|warp|To Tulimshar Forge|-1,-1,021-2.gat,72,138 diff --git a/world/map/npc/021-1/gate_guards.txt b/world/map/npc/021-1/gate_guards.txt index 6af33f2f..ad0e80b4 100644 --- a/world/map/npc/021-1/gate_guards.txt +++ b/world/map/npc/021-1/gate_guards.txt @@ -21,20 +21,25 @@ } // Guards by the gates to East Tulimshar +021-1.gat,146,23,0|script|Guard|104,{ + mes "[Guard]"; + mes "\"I make sure less desirables don't enter the Noble District.\""; + close; +} 021-1.gat,156,42,0|script|Guard|104,{ mes "[Guard]"; - mes "\"It's still a mess in East Tulimshar. The volcano and earthquake did a lot of damage.\""; + mes "\"The volcano and earthquake did a lot of damage, but the citizens of Tulimshar sure did a good job of cleaning up.\""; close; } 021-1.gat,156,95,0|script|Guard|104,{ mes "[Guard]"; - mes "\"It can get quite dangerous east of town. But for now, the passage is closed.\""; + mes "\"The Palace is East of here. That is where you will find the Council of Wizards.\""; close; } // Near the bazaar, outside the government building -021-1.gat,58,135,0|script|Guard|123,{ +021-1.gat,55,136,0|script|Guard|123,{ mes "[Guard]"; mes "\"This is a government building. They have some clerical and tax offices in here. There is also a jail in the subbasement.\""; close; diff --git a/world/map/npc/021-1/hetchel.txt b/world/map/npc/021-1/hetchel.txt new file mode 100644 index 00000000..e7ca7bd9 --- /dev/null +++ b/world/map/npc/021-1/hetchel.txt @@ -0,0 +1,144 @@ +// Hetchel the Silk Weaver +// bh28, +// 2013-03, GPLv2. +// +// Hetchel is referred to by Lora Tay. +// She weaves and sells standard double elbow square silk sheets. +// She could also sell, dyed sheets, Silk robes from Lora Tay. +// (6000 with cocoons, 40000 (?) with no cocoons). +// +// Hetchel's workshop is actually under repair, Shé'll be back in 021-2 when workers have finished their job. +// +// QUEST_WG_state: Global variable indicating winter gloves status. +// Lora Tay proposes silk Robe if (QUEST_WG_state>= 11). +// @SHEET_COCOONS_NR : Number of cocoons required per sheet. +// Might ne calculated from @ROBE_COCOONS_NR/@ROBE_SHEETS_NR +// Actually: 150∕6 = 25 +// @SHEET_ZENY : Money to pay per sheet: A sixth of 10000-2*500-6000 +// @SheetCount Number of sheets to buy (variable). + +021-1.gat,120,39,0|script|Hetchel|376,{ + set @SHEET_COCOONS_NR, 25; + set @SHEET_ZENY, 500; + set @SheetCount, 0; + + if (QUEST_WG_state < 11) + goto L_WG_quest_not_done; + mes "[Hetchel the weaver]"; + mes "\"Hello I am Hetchel, I weave fine textiles, what can I do for you?\""; + menu + "Sorry to bother, I'm just visiting.", L_end, + "I am looking for silk sheets, Lora Tay told me that I could find some in this market. Can you help?", -; + next; + goto L_main_menu; + +L_WG_quest_not_done: + mes "[Hetchel the weaver]"; + mes "\"Hello I am Hetchel, I weave fine textiles."; + mes "My best client is Lora Tay, at Dimond's."; + mes "What can I do for you?\""; + menu + "Sorry to bother, I'm new to this country, just visting.", L_end, + "What are you selling?", -; + next; + +L_main_menu: + mes "[Hetchel]"; + mes "\"I have some silk sheets: double-elbow squares.\""; + menu + "I'm not interested at the moment, maybe later; thanks anyway.", L_end, + "Can I buy some?", -; +// "Do you have any silk robe I could buy?", L_robe, +// "Goodbye.", L_end; + mes "[Hetchel]"; + mes "\"Sure but you need to provide raw materials."; + mes "I'll need " + @SHEET_COCOONS_NR +" silk cocoons per sheet,"; + mes "and also " + @SHEET_ZENY +" GP per sheet for my work.\""; + next; + if (countitem("SilkCocoon") == 0) + goto L_sheet_no_cocoon; + +L_sheet_menu: + menu + "I have what you asked for.", -, + "Sorry I didn't pay attention enough, what do you need?", L_how_many_cocoons, + "Oops! Sorry, I'll come back soon with them.", L_end; + next; + mes "[Hetchel]"; + mes "\"How many would you like?\""; + input @SheetCount; + if (@SheetCount == 0) + goto L_zero_sheet; + if (countitem("SilkCocoon") < @SheetCount * @SHEET_COCOONS_NR) + goto L_sheet_missing_cocoons; + if (Zeny < @SheetCount * @SHEET_ZENY) + goto L_sheet_missing_Zeny; + getinventorylist; + if (@inventorylist_count == 100 && countitem("SilkSheet") < 1 && countitem("SilkCocoon") > @SheetCount * @SHEET_COCOONS_NR) + goto L_TooMany; + set Zeny, Zeny - @SheetCount * @SHEET_ZENY; + delitem "SilkCocoon", @SheetCount * @SHEET_COCOONS_NR; + getitem "Silksheet", @SheetCount; + mes "[Hetchel]"; + mes "\"Thank you, I hope the sheets will fit your needs."; + mes "Please greet Lora for me when you see her.\""; + emotion EMOTE_HAPPY; + goto L_end; + +L_sheet_missing_cocoons: + mes "[Hetchel]"; + mes "\"I'm sorry, but I need " + @SheetCount * @SHEET_COCOONS_NR + ", not " + countitem("SilkCocoon") + ".\""; + goto L_end; + +L_sheet_missing_Zeny: + mes "[Hetchel]"; + mes "\"No, no no. The way this works is that you give me the GP first and I give you the sheets afterwards."; + mes "You're " + (@SheetCount * @SHEET_ZENY - Zeny) + " GP short, so come back when you can afford the sheets you asked for!\""; + goto L_end; + +L_how_many_cocoons: + mes "[Hetchel]"; + mes "\"I need an average of " + @SHEET_COCOONS_NR + " cocoons per sheet"; + mes "and also " + @SHEET_ZENY + " GP per sheet for my work.\""; + next; + goto L_sheet_menu; + +L_sheet_no_cocoon: + mes "[Hetchel]"; + mes "\"You don't have any cocoon? I'm sorry I can't do anything for you.\""; + menu + "I'll seek for them.", L_end, + "Where can I get cocoons?", -; + next; + mes "[Hetchel]"; + mes "\"Silk cocoons come from Silkworms. Silkworms live in the woodland area around Hurnscald."; + mes "Silkworms like especially woods and dark areas. You can go there by ferry.\""; + goto L_end; + +//L_robe: +// mes "[Hetchel]"; +// mes "\"I am not a seamstress but I have a few silk robes from Lora Tay left."; +// mes "It is not your size as Lora made them for me, but Tondar was kind enough"; +// mes "to cast a spell on it, so that it will fit to you as soon as you wear it."; +// mes "However his prices are not that low.\""; +// next; +// +//L_robe_menu: +// goto L_main_menu; + +L_zero_sheet: + mes "[Hetchel]"; + mes "\"It's the best way to get quickly served!\""; + goto L_end; + +L_TooMany: + mes "[Hetchel]"; + mes "\"Your bag hasn't room enough. Store some things and come back.\""; + +L_end: + set @SHEET_COCOONS_NR, 0; + set @SHEET_ZENY, 0; + set @SheetCount, 0; + close; +} + diff --git a/world/map/npc/021-1/imec.txt b/world/map/npc/021-1/imec.txt index 5ad150f8..ac541c87 100644 --- a/world/map/npc/021-1/imec.txt +++ b/world/map/npc/021-1/imec.txt @@ -10,7 +10,7 @@ OnInit: end; } -021-1.gat,128,36,0|script|Imec|162,{ +021-1.gat,120,33,0|script|Imec|162,{ set @state, ((QUEST_NorthTulimshar & $@ImecShopNT_MASK) >> $@ImecShopNT_SHIFT); set @money, 500; diff --git a/world/map/npc/021-1/north_shops.txt b/world/map/npc/021-1/north_shops.txt index 75df89e0..71b9e757 100644 --- a/world/map/npc/021-1/north_shops.txt +++ b/world/map/npc/021-1/north_shops.txt @@ -3,7 +3,18 @@ // More high-end stuff to satisfy the richer people in Royal Tulimshar // Some clothing -021-1.gat,136,38,0|shop|Inar|108,CottonShirt :-1,CottonShorts :-1,CottonBoots :-1,DesertShirt :-1,SilkRobe :-5,DesertHat :-4 +021-1.gat,135,38,0|shop|Inar|108,CottonShirt :-1,CottonShorts :-1,CottonBoots :-1,DesertShirt :-1,SilkRobe :-5,DesertHat :-4 + +021-1.gat,129,40,0|script|Well|400,{ + callfunc "WaterBottle"; +} + +// An officer (for security) +021-1.gat,128,36,0|script|Officer|150,{ + mes "[Officer]"; + mes "I'm here for extra security for this market."; + close; +} // A snobby store that won't sell to the player // takes part in quest given by 021-2/kylian.txt @@ -25,31 +36,3 @@ L_Close: close; } -// A barber (later we can make it so certain styles need to come from him, for a price) -021-1.gat,119,29,0|script|Issay|156,{ - mes "[Issay the Barber]"; - mes "\"Do you need a change of style?\""; - next; - callfunc "Barber"; - mes "[Issay the Barber]"; - mes "\"Come again!\""; - close; -} - -// Another banker -021-1.gat,122,32,0|script|Hydusun|149,{ - set @npcname$, "Hydusun"; - callfunc "Banker"; - close; -} - -021-1.gat,129,40,0|script|Well|400,{ - callfunc "WaterBottle"; -} - -// An officer (for security) -021-1.gat,130,38,0|script|Officer|150,{ - mes "[Officer]"; - mes "I'm here for extra security for this market."; - close; -} diff --git a/world/map/npc/021-1/npcs.txt b/world/map/npc/021-1/npcs.txt index 89a3111e..662a69e2 100644 --- a/world/map/npc/021-1/npcs.txt +++ b/world/map/npc/021-1/npcs.txt @@ -10,7 +10,7 @@ close; } -021-1.gat,75,67,0|script|Silvia|207,{ +021-1.gat,76,67,0|script|Silvia|207,{ set @npcname$, "Silvia"; mes "[" + @npcname$ + "]"; @@ -22,7 +22,7 @@ close; } -021-1.gat,45,77,0|script|Pauline|208,{ +021-1.gat,55,66,0|script|Pauline|208,{ set @npcname$, "Pauline"; mes "[" + @npcname$ + "]"; @@ -32,7 +32,7 @@ close; } -021-1.gat,49,123,0|script|Michel|215,{ +021-1.gat,51,123,0|script|Michel|215,{ set @npcname$, "Michel"; mes "[" + @npcname$ + "]"; diff --git a/world/map/npc/021-1/royal_guards.txt b/world/map/npc/021-1/royal_guards.txt deleted file mode 100644 index 1920e43b..00000000 --- a/world/map/npc/021-1/royal_guards.txt +++ /dev/null @@ -1,13 +0,0 @@ -// - -021-1.gat,141,23,0|script|Guard|126,{ - mes "[Guard]"; - mes "\"Stay away.\""; - close; -} - -021-1.gat,147,23,0|script|Guard|126,{ - mes "[Guard]"; - mes "\"Stay away.\""; - close; -} diff --git a/world/map/npc/021-2/_import.txt b/world/map/npc/021-2/_import.txt index bb80fc32..7b955fb5 100644 --- a/world/map/npc/021-2/_import.txt +++ b/world/map/npc/021-2/_import.txt @@ -4,11 +4,13 @@ map: 021-2.gat npc: npc/021-2/_mobs.txt npc: npc/021-2/_warps.txt npc: npc/021-2/bakery.txt +npc: npc/021-2/bank.txt +npc: npc/021-2/barber.txt npc: npc/021-2/government_building.txt npc: npc/021-2/heathin.txt +npc: npc/021-2/hotel_receptionist.txt npc: npc/021-2/inya.txt npc: npc/021-2/jhedia.txt npc: npc/021-2/kylian.txt npc: npc/021-2/mapflags.txt -npc: npc/021-2/workshop.txt npc: npc/021-2/yanis.txt diff --git a/world/map/npc/021-2/_warps.txt b/world/map/npc/021-2/_warps.txt index ad18520c..4614f970 100644 --- a/world/map/npc/021-2/_warps.txt +++ b/world/map/npc/021-2/_warps.txt @@ -2,7 +2,6 @@ // North Tulimshar Indoor warps 021-2.gat,27,30|warp|To Outside|-1,-1,021-1.gat,53,135 -021-2.gat,33,30|warp|To Outside|-1,-1,021-1.gat,55,135 021-2.gat,39,30|warp|To Outside|-1,-1,021-1.gat,57,135 021-2.gat,91,28|warp|To Outside|-1,-1,021-1.gat,103,101 021-2.gat,122,24|warp|To Roof|-1,-1,021-1.gat,103,97 @@ -13,4 +12,12 @@ 021-2.gat,46,97|warp|To First Floor|0,-1,021-2.gat,46,58 021-2.gat,46,57|warp|To Second Floor|0,-1,021-2.gat,46,96 021-2.gat,70,58|warp|To Main Room|-1,-1,021-2.gat,42,54 -021-2.gat,28,130|warp|to Outside|-1,-1,021-1.gat,43,111 +021-2.gat,28,130|warp|To Outside|-1,-1,021-1.gat,43,111 +021-2.gat,28,130|warp|To Outside|-1,-1,021-1.gat,43,111 +021-2.gat,84,93|warp|To First Floor|-1,0,021-2.gat,80,125 +021-2.gat,84,123|warp|To Second Floor|-1,0,021-2.gat,81,95 +021-2.gat,79,139|warp|To Outside|-1,-1,021-1.gat,132,32 +021-2.gat,72,139|warp|To Outside|-1,-1,021-1.gat,125,32 +021-2.gat,124,69|warp|To Outside|-1,-1,021-1.gat,125,28 +021-2.gat,75,93|warp|To Outside|-1,-1,021-1.gat,133,25 +021-2.gat,33,30|warp|To Outside|-1,-1,021-1.gat,55,135 diff --git a/world/map/npc/021-2/bank.txt b/world/map/npc/021-2/bank.txt new file mode 100644 index 00000000..5ebbe5ea --- /dev/null +++ b/world/map/npc/021-2/bank.txt @@ -0,0 +1,7 @@ +// Another banker +021-2.gat,69,135,0|script|Hydusun|149,{ + set @npcname$, "Hydusun"; + callfunc "Banker"; + close; +} + diff --git a/world/map/npc/021-2/barber.txt b/world/map/npc/021-2/barber.txt new file mode 100644 index 00000000..d0ff401e --- /dev/null +++ b/world/map/npc/021-2/barber.txt @@ -0,0 +1,11 @@ +// A barber (later we can make it so certain styles need to come from him, for a price) +021-2.gat,72,101,0|script|Issay|156,{ + mes "[Issay the Barber]"; + mes "\"Do you need a change of style?\""; + next; + callfunc "Barber"; + mes "[Issay the Barber]"; + mes "\"Come again!\""; + close; +} + diff --git a/world/map/npc/021-2/heathin.txt b/world/map/npc/021-2/heathin.txt index 526e64e0..681f40df 100644 --- a/world/map/npc/021-2/heathin.txt +++ b/world/map/npc/021-2/heathin.txt @@ -1,6 +1,6 @@ //Items for NPC are incomplete. Makes "simple ring" which can be crafted into a useful ring by Inya and terranite armor. -021-2.gat,29,55,0|script|Heathin|147,{ +021-2.gat,70,129,0|script|Heathin|147,{ set @TARROW_REQ_TERRA_ORE, 1; set @TARROW_REQ_COAL, 5; diff --git a/world/map/npc/021-2/workshop.txt b/world/map/npc/021-2/hotel_receptionist.txt index ed23ab5b..0a7fcbb2 100644 --- a/world/map/npc/021-2/workshop.txt +++ b/world/map/npc/021-2/hotel_receptionist.txt @@ -3,9 +3,9 @@ // The receptionist 021-2.gat,22,63,0|script|Sonir|118,{ mes "[Sonir]"; - mes "\"This is Tulimshar's main workshop. Much crafting happens here.\""; + mes "\"Welcome to The Wizards's Rest!\""; next; mes "[Sonir]"; - mes "\"We also have limited housing on the second floor.\""; + mes "\"We have limited housing on the second floor.\""; close; -}
\ No newline at end of file +} diff --git a/world/map/npc/021-2/inya.txt b/world/map/npc/021-2/inya.txt index 946bdb33..4a70730c 100644 --- a/world/map/npc/021-2/inya.txt +++ b/world/map/npc/021-2/inya.txt @@ -1,7 +1,7 @@ //Gemstones: Diamond (white) , Ruby (red), Emerald (green), Sapphire (blue), Topaz (yellow), Amethyst (purple) //The power of the gems is important to future balance of these rings. Are they related to stats, tiers of power, schools of magic? -021-2.gat,43,62,0|script|Inya|106,{ +021-2.gat,80,134,0|script|Inya|106,{ mes "[Inya]"; mes "\"I am Inya, a jeweler of fine rings. If you have a Simple Ring and a gem, I can make a nice ring for you for 1,000,000 gold pieces.\""; diff --git a/world/map/npc/021-2/jhedia.txt b/world/map/npc/021-2/jhedia.txt index 32f043f3..1bffd0eb 100644 --- a/world/map/npc/021-2/jhedia.txt +++ b/world/map/npc/021-2/jhedia.txt @@ -1,6 +1,6 @@ // Ingot maker takes iron ore, gives ingots for future crafting purposes. -021-2.gat,23,55,0|script|Jhedia|160,{ +021-2.gat,70,124,0|script|Jhedia|160,{ set @Cost_Per_Ingot, 1000; set @Iron_Ore_Per, 5; diff --git a/world/map/npc/029-1/barrier.txt b/world/map/npc/029-1/barrier.txt index 85882c89..54ef3878 100644 --- a/world/map/npc/029-1/barrier.txt +++ b/world/map/npc/029-1/barrier.txt @@ -1,4 +1,4 @@ -029-1.gat,54,36,0|script|#CandorBarrier|45,1,1,{ +029-1.gat,54,37,0|script|#CandorBarrier|45,0,0,{ if ($@FIGHT_CAVE_STATUS == 1) goto L_Block; warp "029-3.gat", 46, 23; end; diff --git a/world/map/npc/029-3/barrier.txt b/world/map/npc/029-3/barrier.txt index acfb642c..bfd4e3be 100644 --- a/world/map/npc/029-3/barrier.txt +++ b/world/map/npc/029-3/barrier.txt @@ -1,4 +1,4 @@ -029-3.gat,45,20,0|script|#FightCaveBarrier|45,1,1,{ +029-3.gat,46,21,0|script|#FightCaveBarrier|45,0,0,{ if ($@FIGHT_CAVE_STATUS == 1) goto L_Block; warp "029-1.gat", 54, 39; end; diff --git a/world/map/npc/031-1/house.txt b/world/map/npc/031-1/house.txt index 70093c3f..b35d816f 100644 --- a/world/map/npc/031-1/house.txt +++ b/world/map/npc/031-1/house.txt @@ -2,7 +2,7 @@ // player can enter, if Cindy is already saved and the player has been invited, quest status > 2 // author: Jenalya -031-1.gat,95,80,0|script|#Door|45,1,1,{ +031-1.gat,95,80,0|script|#Door|45,0,0,{ set @Q_Nivalis_state_MASK, NIBBLE_5_MASK; set @Q_Nivalis_state_SHIFT, NIBBLE_5_SHIFT; diff --git a/world/map/npc/031-3/labyrinth.txt b/world/map/npc/031-3/labyrinth.txt index ed06cf60..39a8ba90 100644 --- a/world/map/npc/031-3/labyrinth.txt +++ b/world/map/npc/031-3/labyrinth.txt @@ -1,9 +1,9 @@ // Conditional warp for yeti cave // Authors: Jenalya -031-3.gat,46,24,0|script|#YetiBarrier|45,1,1,{ +031-3.gat,46,24,0|script|#YetiBarrier|45,0,0,{ if ($@FIGHT_YETI_STATUS == 1) goto L_Blocked; - warp "031-4.gat", 40, 69; + warp "031-4.gat", 40, 70; end; L_Blocked: diff --git a/world/map/npc/031-4/barrier.txt b/world/map/npc/031-4/barrier.txt index 243bb0d1..83daffd7 100644 --- a/world/map/npc/031-4/barrier.txt +++ b/world/map/npc/031-4/barrier.txt @@ -1,6 +1,6 @@ -031-4.gat,40,71,0|script|#YetiBarrier|45,1,1,{ +031-4.gat,40,71,0|script|#YetiBarrier|45,0,0,{ if ($@FIGHT_YETI_STATUS == 1) goto L_Block; - warp "031-3.gat", 46, 27; + warp "031-3.gat", 46, 25; end; L_Block: diff --git a/world/map/npc/034-1/_warps.txt b/world/map/npc/034-1/_warps.txt index 9c0acf36..be29b7b1 100644 --- a/world/map/npc/034-1/_warps.txt +++ b/world/map/npc/034-1/_warps.txt @@ -5,3 +5,5 @@ 034-1.gat,16,103|warp|To Deep Snow Forest|-1,1,045-1.gat,176,133 034-1.gat,15,31|warp|To Deep Snow Forest|-1,0,045-1.gat,174,59 034-1.gat,95,18|warp|ToHighlands1|0,-1,046-1.gat,95,116 +034-1.gat,31,68|warp|To Trapper|-1,-1,034-2.gat,28,31 +034-1.gat,64,99|warp|To Cabin|-1,-1,034-2.gat,73,29 diff --git a/world/map/npc/034-2/_import.txt b/world/map/npc/034-2/_import.txt new file mode 100644 index 00000000..07dfa138 --- /dev/null +++ b/world/map/npc/034-2/_import.txt @@ -0,0 +1,5 @@ +// Map 034-2: Trappers Huts +// This file is generated automatically. All manually changes will be removed when running the Converter. +map: 034-2.gat +npc: npc/034-2/_mobs.txt +npc: npc/034-2/_warps.txt diff --git a/world/map/npc/034-2/_mobs.txt b/world/map/npc/034-2/_mobs.txt new file mode 100644 index 00000000..9cabee2a --- /dev/null +++ b/world/map/npc/034-2/_mobs.txt @@ -0,0 +1,8 @@ +// This file is generated automatically. All manually changes will be removed when running the Converter. +// Trappers Huts mobs + + + +034-2.gat,0,0,0|script|Mob034-2|-1,{ + end; +} diff --git a/world/map/npc/034-2/_warps.txt b/world/map/npc/034-2/_warps.txt new file mode 100644 index 00000000..3f06da7f --- /dev/null +++ b/world/map/npc/034-2/_warps.txt @@ -0,0 +1,5 @@ +// This file is generated automatically. All manually changes will be removed when running the Converter. +// Trappers Huts warps + +034-2.gat,28,32|warp|To Outside|-1,-1,034-1.gat,31,69 +034-2.gat,73,30|warp|To Outside|-1,-1,034-1.gat,64,100 diff --git a/world/map/npc/056-2/barrier.txt b/world/map/npc/056-2/barrier.txt index c72a17f7..dc26dbfb 100644 --- a/world/map/npc/056-2/barrier.txt +++ b/world/map/npc/056-2/barrier.txt @@ -1,4 +1,4 @@ -056-2.gat,23,33,0|script|#Barrier|45,1,1,{ +056-2.gat,23,33,0|script|#Barrier|45,0,0,{ if (Mirak_Bantime > gettimetick(2)) goto L_Block; if (BaseLevel < 25) diff --git a/world/map/npc/_import.txt b/world/map/npc/_import.txt index c16ab26e..05d7791e 100644 --- a/world/map/npc/_import.txt +++ b/world/map/npc/_import.txt @@ -83,6 +83,7 @@ import: npc/032-1/_import.txt import: npc/032-3/_import.txt import: npc/033-1/_import.txt import: npc/034-1/_import.txt +import: npc/034-2/_import.txt import: npc/041-1/_import.txt import: npc/042-1/_import.txt import: npc/042-2/_import.txt diff --git a/world/map/npc/functions/evil_obelisk.txt b/world/map/npc/functions/evil_obelisk.txt index 30fe927d..f1447375 100644 --- a/world/map/npc/functions/evil_obelisk.txt +++ b/world/map/npc/functions/evil_obelisk.txt @@ -3,62 +3,67 @@ function|script|EvilObelisk|{ mes "(A mystical aura surrounds this stone. It seems to crave money.)"; next; + set @cost_jacko, 6500; + set @cost_gy1, 4000; + set @cost_gy2, 3000; + set @cost_skull, 2800; + set @cost_snake, 2500; + menu - "Pay it 200,000 gold", L_JACKO, - "Pay it 100,000 gold", L_GRAVEYARD1, - "Pay it 75,000 gold", L_GRAVEYARD2, - "Pay it 50,000 gold", L_SKULL, - "Pay it 25,000 gold", L_SNAKE, - "Don't pay it anything.", -; - close; - return; + "Don't pay it anything.", -, + "Pay it " + @cost_jacko + " gold.", L_JACKO, + "Pay it " + @cost_gy1 + " gold.", L_GRAVEYARD1, + "Pay it " + @cost_gy2 + " gold.", L_GRAVEYARD2, + "Pay it " + @cost_skull + " gold.", L_SKULL, + "Pay it " + @cost_snake + " gold.", L_SNAKE; + goto L_Close; L_JACKO: - if (Zeny < 200000) + if (Zeny < @cost_jacko) goto L_NotEnough; - set Zeny, Zeny - 200000; + set Zeny, Zeny - @cost_jacko; set @mob_id, 1022; - set @mob_count, rand(2) + 1; + set @mob_count, rand(1,2); goto L_Summon; L_GRAVEYARD1: - if (Zeny < 100000) + if (Zeny < @cost_gy1) goto L_NotEnough; set @temp, rand(2); if(@temp == 0) set @mob_id, 1036; // Zombie if(@temp == 1) set @mob_id, 1045; // Fallen - set @mob_count, rand(2) + 1; - set Zeny, Zeny - 100000; + set @mob_count, rand(1,2); + set Zeny, Zeny - @cost_gy1; goto L_Summon; L_GRAVEYARD2: - if (Zeny < 75000) + if (Zeny < @cost_gy2) goto L_NotEnough; set @temp, rand(2); if(@temp == 0) set @mob_id, 1044; // Lady Skelly if(@temp == 1) set @mob_id, 1043; // Normal Skelly - set @mob_count, rand(2) + 1; - set Zeny, Zeny - 75000; + set @mob_count, rand(1,2); + set Zeny, Zeny - @cost_gy2; goto L_Summon; L_SKULL: - if (Zeny < 50000) + if (Zeny < @cost_skull) goto L_NotEnough; set @temp, rand(2); if(@temp == 0) set @mob_id, 1024; // Poison if(@temp == 1) set @mob_id, 1023; // Fire - set @mob_count, rand(4) + 1; - set Zeny, Zeny - 50000; + set @mob_count, rand(1,4); + set Zeny, Zeny - @cost_skull; goto L_Summon; L_SNAKE: - if (Zeny < 25000) + if (Zeny < @cost_snake) goto L_NotEnough; set @temp, rand(4); if(@temp == 0) @@ -69,17 +74,24 @@ L_SNAKE: set @mob_id, 1010; // Normal if(@temp == 3) set @mob_id, 1021; // Cave - set @mob_count, rand(4) + 1; - set Zeny, Zeny - 25000; + set @mob_count, rand(1,4); + set Zeny, Zeny - @cost_snake; goto L_Summon; L_Summon: - monster @map$, @x, @y, "Evil", @mob_id, @mob_count; - close; - return; + areamonster @map$, @x0, @y0, @x1, @y1, "Evil", @mob_id, @mob_count; + goto L_Close; L_NotEnough: mes "You don't have that much money"; - close; + goto L_Close; + +L_Close: + set @cost_jacko, 0; + set @cost_gy1, 0; + set @cost_gy2, 0; + set @cost_skull, 0; + set @cost_snake, 0; return; + } diff --git a/world/map/npc/functions/game_rules.txt b/world/map/npc/functions/game_rules.txt index 01fc163c..7cc2bd63 100644 --- a/world/map/npc/functions/game_rules.txt +++ b/world/map/npc/functions/game_rules.txt @@ -30,13 +30,13 @@ L_English: goto L_End; L_German: - mes "Wir bitten um das Einhalten der folgenden Regeln:"; + mes "Wir bitten um das Einhalten folgender Regeln:"; mes "1. Keine Beleidigungen, Schimpfwörter, Schmähungen oder Rufmord."; mes "2. Keine 'bots' (automatisierte Spieler). Dies beinhaltet JEGLICHE Teilnahme am Spiel während der Abwesenheit des Spielers. Es beinhaltet auch das automatisierte Folgen anderer Spieler."; mes "3. Kein 'spamming' oder 'flooding' (schnelles Wiederholen von Nachrichten oder Aufforderungen zum Warenhandel)."; mes "4. Kein Betteln."; - mes "5. Englisch ist die einzige zulässige Sprache im öffentlichen Raum."; - mes "6. Behandelt andere so, wie Ihr behandelt werden wollt."; + mes "5. Englisch ist die einzig zulässige Sprache im öffentlichen Raum."; + mes "6. Behandele andere so, wie du selbst behandelt werden willst."; mes "Jegliche Regelverstöße können bestraft werden, entweder durch ein Zurücksetzen der Charaktereigenschaften und -besitztümer auf den Ausgangszustand, oder durch einen temporären oder permanenten Ausschluss aus dem Spiel."; next; mes "Automatisiertes Spielverhalten liegt vor, wenn ein sich bewegender/kämpfender Spieler nicht intelligent auf Gesprächsaufforderungen reagiert."; @@ -86,30 +86,29 @@ L_French: goto L_End; L_Spanish: - mes "ATTENTION: this translation is outdated. Please refer to the English version and submit a patch."; - mes "Los jugadores que infringan las normas siguientes pueden ser censurados( incluso de forma permanente) o se podran resetear sus cuentas a la discrecion de los administradores:"; - mes "1. No abuse de otros jugadores (incluye insultos, palabras mal sonantes , y demas dirigidos a una o varias personas en particular)"; - mes "2. No utilizar programas automaticos ( se entiende por esto cualquier actividad realizada sin que el jugador este tocando el teclado fisicamente)"; + mes "Los jugadores que infringan las siguientes reglas pueden ser bloqueados (incluso permanentemente) o sus personajes reseteados segun la discrecion de los administradores."; + mes "1. No abuse de otros jugadores (esto incluye insultos, palabras mal sonantes, burlas, etc. dirigidas a una o varias personas)"; + mes "2. No utilizar programas automaticos (esto hace referencia a cualquier tipo de actividad llevada a cabo sin que el jugador este tocando el teclado directamente o al seguimiento automatico)"; mes "3. No envie mensajes publicitarios o inunde el chat de mensajes (incluyendo los mensajes referidos al comercio en el juego)"; - mes "4. Esta prohibida cualquier forma de mendicidad"; - mes "5. Hable solamente en Ingles en el chat publico"; - mes "6. Trata a los demas de la misma manera que te gustaria ser tratado"; + mes "4. No mendigar."; + mes "5. Escriba unicamente en Ingles en el chat publico"; + mes "6. Trate a los demas de la misma forma que le gustaria ser tratado"; next; - mes "El uso de programas automaticos se investigara hablando con jugadores que esten moviendose y/o atacando."; + mes "El uso de programas automaticos para jugar sin estar frente al teclado se determinara hablando con los jugadores que esten moviendose y/o atacando."; + mes "El seguimiento automatizado sera determinado por observacion."; next; goto L_End; L_Swedish: - mes "ATTENTION: this translation is outdated. Please refer to the English version and submit a patch."; - mes "Spelare som bryter mot dessa regler riskerar att helt sonika bli utkastade (antingen under kort period eller permanent), den som kastats ut kan be en GM om att starta om sitt konto."; - mes "1. Skymfa inte andra (svordomar och annat riktat till att skada en eller flera individer)"; - mes "2. Inga bottar (med bottande avses ALLA aktiviteter som sker bortom tangentbordet)"; + mes "Spelare som bryter mot dessa regler riskerar att bli utkastade eller portade (antingen under kort period eller permanent), den som blivit portad/bannlyst ut kan be en GM om att starta om sitt konto."; + mes "1. Förolämpa inte medspelare (svordomar och annat riktat till att skada en eller flera individer)"; + mes "2. Inga bottar (med bottande avses ALLA aktiviteter som sker när spelaren inte aktivt spelar eller styr sin karraktär)"; mes "3. Inget spammande/floodande (inklusive meddelanden om byteshandel)"; mes "4. Tigg inte"; mes "5. Prata bara engelska i den offentliga chatten"; mes "6. Behandla andra som du vill bli behandlad"; next; - mes "Hysta misstankar om bottande kontrolleras genom att prata med spelaren under dess kringvandrande eller attackerande."; + mes "Vid misstankar om bottande kontrolleras detta genom att prata med spelaren under dess kringvandrande eller attackerande."; next; goto L_End; |