summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--conf/atcommand_local.conf.example43
-rw-r--r--db/const.txt3
-rw-r--r--db/item_db.txt69
-rw-r--r--db/mob_db.txt10
-rw-r--r--news.txt12
-rw-r--r--npc/008-1_Hurnscald_outskirts/_import.txt2
-rw-r--r--npc/008-1_Hurnscald_outskirts/dock.txt6
-rw-r--r--npc/008-1_Hurnscald_outskirts/dock_worker.txt7
-rw-r--r--npc/021-2_Tulimshar/bakery.txt2
-rw-r--r--npc/022-1_Tulimshar/_import.txt3
-rw-r--r--npc/022-1_Tulimshar/dock.txt6
-rw-r--r--npc/022-1_Tulimshar/elanore.txt3
-rw-r--r--npc/022-1_Tulimshar/ferry_master.txt16
-rw-r--r--npc/functions/ferry.txt42
-rw-r--r--npc/scripts.conf1
-rw-r--r--tools/retab.sml15
17 files changed, 197 insertions, 46 deletions
diff --git a/.gitignore b/.gitignore
index 443b910d..b518008d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,9 @@ char-server
login-server
map-server
+# Tools executables
+tools/retab
+
# Server files
log/
gm.log.*
diff --git a/conf/atcommand_local.conf.example b/conf/atcommand_local.conf.example
index db127c60..b28b84fe 100644
--- a/conf/atcommand_local.conf.example
+++ b/conf/atcommand_local.conf.example
@@ -140,18 +140,6 @@ kamib: 60
// Shows Stats Of All Characters Online
charstatsall: 60
-// Turns PVP (Person v. Person) off on a map.
-pvpoff: 60
-
-// Enables PVP on a map.
-pvpon: 60
-
-// Sets the speed you can walk/attack at. Default is 150.
-speed: 60
-
-// Kill all monsters in map (with drops)
-killmonster: 60
-
// Kill all monsters in map (without drops)
killmonster2: 60
@@ -170,18 +158,12 @@ dropall: 60
// store all your items
storeall: 60
-// allow other players to hit you out of pvp
-killable: 60
-
// look up a skill by name
skillid: 60
// use a skill by id
useskill: 60
-// make another player killable
-charkillable: 60
-
// Spawns a monster, and a certain amount
spawn: 60
@@ -234,9 +216,6 @@ charsave: 60
// Kill another character without hitting them.
kill: 60
-// Enable hitting a player even when not in pvp
-killer: 60
-
// Creates weapon of desired element.
produce: 60
@@ -308,6 +287,28 @@ visible: 60
//----------------------
// 80: "eA Dev"
+
+// Turns PVP (Person v. Person) off on a map.
+pvpoff: 80
+
+// Enables PVP on a map.
+pvpon: 80
+
+// Sets the speed you can walk/attack at. Default is 150.
+speed: 80
+
+// Kill all monsters in map (with drops)
+killmonster: 80
+
+// make another player killable
+charkillable: 80
+
+// Enable hitting a player even when not in pvp
+killer: 80
+
+// allow other players to hit you out of pvp
+killable: 80
+
// set magic properties on a char
setmagic: 80
diff --git a/db/const.txt b/db/const.txt
index b51e3aa1..99f14f38 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -225,3 +225,6 @@ MFLAG_KNOWS_IMP 4096 // Knows about the imprisoned forest spirit
MFLAG_KNOWS_OLD_WIZARD 8192 // Knows Bjorn's old wizard
MFLAG_MADE_CONC_POTION 16384 // Made a concentration potion with T15 and/or T16
MFLAG_ELANORE_OMAR 32768 // Told Omar about Elanore's involvement
+
+DOCK_tulimshar 1
+DOCK_hurnscald 2
diff --git a/db/item_db.txt b/db/item_db.txt
index 88c1f51c..fb9e1510 100644
--- a/db/item_db.txt
+++ b/db/item_db.txt
@@ -86,11 +86,29 @@
584, Jackal, Jackal, 4, 8000, 4000, 100, 100, , 1, , 0, 2, 2, 1, 1, 1, {}, {}
585, ScarabArmlet, Scarab Armlet, 5, 8000, 4000, 100, , 0, , 5, 0, 2, 32, , 1, 1, {}, {}
586, CottonShorts, Cotton Shorts, 5, 1000, 500, 10, , 2, , -4, 0, 2, 1, , 1, 0, {}, {}
-//, , A bunch of unfinished weapons
-//, , The brit shield
+//587, RESERVED, Sword, , , , , , , , , , , , , , , {}, {}
+//588, RESERVED, Bastard Sword, , , , , , , , , , , , , , , {}, {}
+//589, RESERVED, Broad Sword, , , , , , , , , , , , , , , {}, {}
+//590, RESERVED, Baselard, , , , , , , , , , , , , , , {}, {}
+//591, RESERVED, Long Sword, , , , , , , , , , , , , , , {}, {}
+//592, RESERVED, Stiletto, , , , , , , , , , , , , , , {}, {}
+//593, RESERVED, Rapier, , , , , , , , , , , , , , , {}, {}
+//594, RESERVED, Spear, , , , , , , , , , , , , , , {}, {}
+//595, RESERVED, Heavy Spear, , , , , , , , , , , , , , , {}, {}
+//596, RESERVED, Pike, , , , , , , , , , , , , , , {}, {}
+//597, RESERVED, Heavy Pike, , , , , , , , , , , , , , , {}, {}
+//598, RESERVED, Dual Spear, , , , , , , , , , , , , , , {}, {}
+//599, RESERVED, Fire Sword, , , , , , , , , , , , , , , {}, {}
+//600, RESERVED, Brit Shield, , , , , , , , , , , , , , , {}, {}
601, SteelShield, Steel Shield, 5, 40000, 3000, 180, , 20, , -200, 0, 2, 32, , , 0, {}, {}
602, WoodenShield, Wooden Shield, 5, 10000, 2000, 100, , 14, , -70, 0, 2, 32, , , 0, {}, {}
603, LeatherShield, Leather Shield, 5, 2000, 1000, 60, , 7, , -35, 0, 2, 32, , , 0, {}, {}
+//604, RESERVED, Knight Shield, , , , , , , , , , , , , , , {}, {}
+//605, RESERVED, Meat Cleaver, , , , , , , , , , , , , , , {}, {}
+//606, RESERVED, Hatchet, , , , , , , , , , , , , , , {}, {}
+//607, RESERVED, Trident, , , , , , , , , , , , , , , {}, {}
+//608, RESERVED, Blade Shield, , , , , , , , , , , , , , , {}, {}
+//609, RESERVED, Club, , , , , , , , , , , , , , , {}, {}
610, JeansShorts, Jeans Shorts, 5, 2000, 1000, 10, , 4, , -8, 0, 2, 1, , 0, 0, {}, {}
611, WhiteFur, White Fur, 3, 8, 4, 10, , , , , , , , , , , {}, {}
612, CaveSnakeLamp, Cave Snake Lamp, 3, 80, 40, 10, , , , , , , , , , , {}, {}
@@ -129,12 +147,12 @@
645, GoldenPlatemail, Golden Platemail, 5, 9999000,3000, 240, , 25, , -100, 0, 2, 512, , 0, 0, {}, {}
646, Crown, Crown, 5, 5000, 1000, 50, , 4, , 0, 0, 2, 256, , 0, 0, {}, {}
647, DevelopersCap, Developer's Cap, 5, 2000, 500, 10, , 5, , 5, 0, 2, 256, , 0, 0, {}, {}
-//648, Stat ring
-//649, Stat ring
-//650, Stat ring
-//651, Stat ring
-//652, Stat ring
-//653, Stat ring
+//648, RESERVED, Rough Strength Ring, , , , , , , , , , , , , , , {}, {}
+//649, RESERVED, Rough Agility Ring, , , , , , , , , , , , , , , {}, {}
+//650, RESERVED, Rough Dexterity Ring, , , , , , , , , , , , , , , {}, {}
+//651, RESERVED, Rough Vitality Ring, , , , , , , , , , , , , , , {}, {}
+//652, RESERVED, Rough Intelligence Ring, , , , , , , , , , , , , , , {}, {}
+//653, RESERVED, Rough Willpower Ring, , , , , , , , , , , , , , , {}, {}
654, Cap, Cap, 5, 2000, 500, 20, , 5, , 0, 0, 2, 256, , 0, 0, {}, {}
655, FurBoots, Fur Boots, 5, 5000, 600, 250, , 3, , -3, 0, 2, 64, , 0, 0, {}, {}
656, SerfHat, Serf Hat, 5, 500, 100, 20, , 2, , 0, 0, 2, 256, , 0, 0, {}, {}
@@ -200,7 +218,7 @@
716, GrassSnakeEgg, Grass Snake Egg, 0, 100, 50, 4, , , , , , 2, , , 0, , { itemheal 50, 0; }, {}
717, CaveSnakeEgg, Cave Snake Egg, 0, 60, 30, 4, , , , , , 2, , , 0, , { itemheal 20, 0; }, {}
718, SilkCocoon, Silk Cocoon, 3, 200, 3, 1, , , , , , , , , , , {}, {}
-//, , RESERVED
+//719, RESERVED, Silk Thread, , , , , , , , , , , , , , , {}, {}
720, SilkRobe, Silk Robe, 5, 8000, 4000, 5, , 5, , 0, 0, 2, 512, , 0, 0, {}, {}
721, HighPriestCrown, High Priest Crown, 5, 20000, 5000, 60, , 4, , 20, 0, 2, 256, , 0, 0, {}, { bonus bMaxSP, 20; }
722, MonsterSkullHelmet, Monster Skull Helmet, 5, 15000, 3000, 40, , 7, , 10, 0, 2, 256, , 0, 0, {}, { bonus bMdef, 20; }
@@ -236,9 +254,22 @@
752, FluffyHat, Fluffy Hat, 5, 7000, 2000, 10, , 2, , -5, 0, 2, 256, , 0, 0, {}, {}
753, BatWing, Bat Wing, 3, 500, 100, 3, , , , , , , , , , , {}, {}
754, BatTeeth, Bat Teeth, 3, 600, 150, 2, , , , , , , , , , , {}, {}
-755, AssassinShirt, Assassin Shirt, 5, 10000, 3000, 15, , 10, , -5, 0, 2, 512, , 0, 0, {}, { bonus bAgi, 10; }
-756, AssassinGloves, Assassin Gloves, 5, 7000, 2000, 9, , 5, , -3, 0, 2, 4, , 0, 0, {}, { bonus bAgi, 5; }
-757, AssassinBoots, Assassin Boots, 5, 7000, 2000, 10, , 5, , -3, 0, 2, 64, , 0, 0, {}, { bonus bAgi, 5; }
+755, AssassinShirt, Assassin Shirt, 5, 10000, 3000, 15, , 10, , -5, 0, 2, 512, , 0, 0, {}, { bonus bAgi, 10; }
+756, AssassinGloves, Assassin Gloves, 5, 7000, 2000, 9, , 5, , -3, 0, 2, 4, , 0, 0, {}, { bonus bAgi, 5; }
+757, AssassinBoots, Assassin Boots, 5, 7000, 2000, 10, , 5, , -3, 0, 2, 64, , 0, 0, {}, { bonus bAgi, 5; }
+//758, WoodenStaff, Wooden Staff, , , , , , , , , , , , , , , {}, {}
+//759, PaladinsHelmet, Paladin's Helmet, , , , , , , , , , , , , , , {}, {}
+//760, OverlordsHelmet, Overlord's Helmet, , , , , , , , , , , , , , , {}, {}
+//761, DesertHelmet, Desert Helmet, , , , , , , , , , , , , , , {}, {}
+//762, TerraniteArrow, Terranite Arrow, , , , , , , , , , , , , , , {}, {}
+//763, TerraniteOre, Terranite Ore, , , , , , , , , , , , , , , {}, {}
+//764, SailorHat, Sailor Hat, , , , , , , , , , , , , , , {}, {}
+//765, CaptainsHat, Captain's Hat, , , , , , , , , , , , , , , {}, {}
+//766, TerraniteHelmet, Terranite Helmet, , , , , , , , , , , , , , , {}, {}
+//767, TerraniteChestArmor, Terranite Chest Armor, , , , , , , , , , , , , , , {}, {}
+//768, TerraniteLegsArmor, Terranite Legs Armor, , , , , , , , , , , , , , , {}, {}
+//769, GuyFawkesMask, Guy Fawkes' Mask, , , , , , , , , , , , , , , {}, {}
+//770, FairyHat, Fairy Hat, , , , , , , , , , , , , , , {}, {}
1198, JackOSoul, Jack O Soul, 3, 100000, 1, 1, , , , , , , , , , , {}, {}
1199, Arrow, Arrow, 10, 3, 1, 1, 25, 0, 0, , 0, 2, 32768, , , , {}, {}
@@ -259,10 +290,18 @@
1214, BunnyEars, Bunny Ears, 5, 5000, 2000, 10, , 10, , 1, 0, 2, 256, , 0, 0, {}, {}
1215, ToySabre, Toy Sabre, 4, 50, 25, 1, 1, , 1, , 0, 2, 2, 1, 1, 1, {}, {}
1216, MoubooHead, Mouboo Head, 5, 10, 1, 20, , 1, , 0, 0, 2, 256, , 0, 0, {}, {}
-1217, CatEars, Cat Ears, 5, 100, 50, 2, , 1, , 1, 0, 2, 256, , 0, 0, {}, { bonus bAgi, 3; }
-1218, PaperBag, Paper Bag, 5, 1000, 5, 1, , 1, , -1, 0, 2, 256, , 0, 0, {}, { bonus bAgi, -1; }
+1217, CatEars, Cat Ears, 5, 100, 50, 2, , 1, , 1, 0, 2, 256, , 0, 0, {}, { bonus bAgi, 3; }
+1218, PaperBag, Paper Bag, 5, 1000, 5, 1, , 1, , -1, 0, 2, 256, , 0, 0, {}, { bonus bAgi, -1; }
1219, MoubootaurHead, Moubootaur Head, 5, 10, 1, 20, , 1, , 0, 0, 2, 256, , 0, 0, {}, {}
-1220, BunchOfParsley, Bunch of Parsley, 5, 3, 1, 1, , 1, , 0, 0, 2, 256, , 0, 0, {}, { bonus bDeaf, 1; }
+1220, BunchOfParsley, Bunch of Parsley, 5, 3, 1, 1, , 1, , 0, 0, 2, 256, , 0, 0, {}, { bonus bDeaf, 1; }
+//1221, SkullMask, Skull Mask, , , , , , , , , , , , , , , {}, {}
+//1222, SmallPieceOfClay, Small Piece of Clay, , , , , , , , , , , , , , , {}, {}
+//1223, BigPieceOfWhiteClay, Big Piece of White Clay, , , , , , , , , , , , , , , {}, {}
+//1224, ScrollOfPaper, Scroll of Paper, , , , , , , , , , , , , , , {}, {}
+//1225, FireScroll, Fire Scroll, , , , , , , , , , , , , , , {}, {}
+//1226, SilverBell, Silver Bell, , , , , , , , , , , , , , , {}, {}
+//1227, EnchantersAmulet, Enchanter's Amulet, , , , , , , , , , , , , , , {}, {}
+//1228, SilverFourLeafAmulet, Silver Four-Leaf Amulet, , , , , , , , , , , , , , , {}, {}
2050, RedCottonShirt, Red Cotton Shirt, 5, 10, 5, 100, , 2, , -4, 0, 2, 512, , 0, 0, {}, {}
2051, GreenCottonShirt, Green Cotton Shirt, 5, 10, 5, 100, , 2, , -4, 0, 2, 512, , 0, 0, {}, {}
diff --git a/db/mob_db.txt b/db/mob_db.txt
index ccaf4f67..7d1a9163 100644
--- a/db/mob_db.txt
+++ b/db/mob_db.txt
@@ -33,6 +33,14 @@
1033, SeaSlime, Sea Slime, 70, 600, 0, 0, 9, 1, 30, 50, 3, 7, 1, 25, 1, 0, 30, 30, 1, 1, 1, 0, 41, 131, 1500, 1872, 672, 480, 535, 800, 657, 800, 518, 500, 510, 1000, 700, 100, 1199, 5000, 568, 100, 541, 50, 0, 0, 0, 0, , , , , , , 0, 0
1034, GrassSnake, Grass Snake, 140, 1000, 0, 0, 100, 1, 80, 120, 2, 10, 20, 40, 10, 10, 40, 50, 1, 1, 1, 0, 20, 133, 500, 1100, 672, 480, 716, 400, 716, 400, 712, 500, 676, 500, 660, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 1, 40
1035, Silkworm, Silkworm, 20, 1, 0, 0, 1, 1, 0, 0, 2, 10, 20, 11, 10, 10, 40, 10, 1, 1, 1, 0, 20, 129, 1300, 1100, 672, 480, 718, 5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 2, 40
-// , Zombie, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
+1036, Zombie, Zombie, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
1037, CloverPatch, Clover Patch, 1, 1, 0, 0, 1, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 1, 1, 3, 22, 0, 800, 800, 672, 480, 742, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
1038, Squirrel, Squirrel, 15, 160, 1, 0, 1, 1, 15, 25, 1, 6, 1, 3, 1, 0, 15, 40, 1, 1, 1, 3, 20, 129, 800, 800, 672, 480, 743, 7000, 680, 1000, 681, 1000, 682, 1000, 683, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 1, 15
+//1039, FireLizard
+1040, Wisp, Wisp, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
+//1041, Snail
+1042, Spectre, Spectre, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
+1043, Skeleton, Skeleton, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
+1044, LadySkeleton, Lady Skeleton, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
+1045, Fallen, Fallen, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 129, 800, 1872, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
+1046, SnakeLord, Snake Lord, 300, 40000, 0, 0, 8000, 2, 80, 120, 10, 10, 20, 40, 10, 10, 40, 10, 1, 1, 1, 0, 20, 132, 200, 1500, 672, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , 0, 0
diff --git a/news.txt b/news.txt
index 0cedbce4..458a5048 100644
--- a/news.txt
+++ b/news.txt
@@ -1,3 +1,15 @@
+##3 Skill Changes
+##3 ?
+
+##0 For simplification and realism purposes, the old
+##0 basic skill has been removed. Emote, trade, and
+##0 party-related abilities are now available in
+##0 three completely new and independent skills. To
+##0 get these new skills, you'll need to find NPCs
+##0 that give them out in Tulimshar. Don't worry,
+##0 this won't affect existing parties, and sitting
+##0 will always be available from now on.
+
##3 Magic Fixes
##3 2009-09-15
diff --git a/npc/008-1_Hurnscald_outskirts/_import.txt b/npc/008-1_Hurnscald_outskirts/_import.txt
index ee2463a5..2bdd6303 100644
--- a/npc/008-1_Hurnscald_outskirts/_import.txt
+++ b/npc/008-1_Hurnscald_outskirts/_import.txt
@@ -2,6 +2,6 @@ map: 008-1.gat
npc: npc/008-1_Hurnscald_outskirts/_mobs.txt
npc: npc/008-1_Hurnscald_outskirts/_warps.txt
npc: npc/008-1_Hurnscald_outskirts/andra.txt
-npc: npc/008-1_Hurnscald_outskirts/dock_worker.txt
+npc: npc/008-1_Hurnscald_outskirts/dock.txt
npc: npc/008-1_Hurnscald_outskirts/george.txt
npc: npc/008-1_Hurnscald_outskirts/hinnak.txt
diff --git a/npc/008-1_Hurnscald_outskirts/dock.txt b/npc/008-1_Hurnscald_outskirts/dock.txt
new file mode 100644
index 00000000..46aa5a92
--- /dev/null
+++ b/npc/008-1_Hurnscald_outskirts/dock.txt
@@ -0,0 +1,6 @@
+// The ferry dock
+
+008-1.gat,140,64,0 script #hurnscalddock 127,2,1,{
+ set @loc, DOCK_hurnscald;
+ callfunc "Ferry";
+}
diff --git a/npc/008-1_Hurnscald_outskirts/dock_worker.txt b/npc/008-1_Hurnscald_outskirts/dock_worker.txt
deleted file mode 100644
index 1da75718..00000000
--- a/npc/008-1_Hurnscald_outskirts/dock_worker.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-
-008-1.gat,136,65,0 script Construction Worker 155,{
- mes "[Construction worker]";
- mes "\"I'm builing a dock here. I don't know any details about how it will be used. Sorry.\"";
- close;
-}
diff --git a/npc/021-2_Tulimshar/bakery.txt b/npc/021-2_Tulimshar/bakery.txt
index 6458c781..bcb2ba28 100644
--- a/npc/021-2_Tulimshar/bakery.txt
+++ b/npc/021-2_Tulimshar/bakery.txt
@@ -4,7 +4,7 @@
021-2.gat,95,21,0 script Riskim 148,{
mes "[Riskim]";
mes "\"Welcome to our bakery!\"";
-
+ next;
callfunc "KadiyaSubquestConsts";
if ((@Q_kadiya_status == @Q_STATUS_WANTS_CHOCOCAKE) && (countitem ("MopoxCurePotion") > 0))
goto L_lace_chococake;
diff --git a/npc/022-1_Tulimshar/_import.txt b/npc/022-1_Tulimshar/_import.txt
index e3e6f0d8..f2c7098b 100644
--- a/npc/022-1_Tulimshar/_import.txt
+++ b/npc/022-1_Tulimshar/_import.txt
@@ -1,3 +1,6 @@
map: 022-1.gat
npc: npc/022-1_Tulimshar/_mobs.txt
npc: npc/022-1_Tulimshar/_warps.txt
+npc: npc/022-1_Tulimshar/dock.txt
+npc: npc/022-1_Tulimshar/elanore.txt
+npc: npc/022-1_Tulimshar/ferry_master.txt
diff --git a/npc/022-1_Tulimshar/dock.txt b/npc/022-1_Tulimshar/dock.txt
new file mode 100644
index 00000000..72d28486
--- /dev/null
+++ b/npc/022-1_Tulimshar/dock.txt
@@ -0,0 +1,6 @@
+// The ferry dock
+
+022-1.gat,84,72,0 script #tulimshardock 127,6,1,{
+ set @loc, DOCK_tulimshar;
+ callfunc "Ferry";
+}
diff --git a/npc/022-1_Tulimshar/elanore.txt b/npc/022-1_Tulimshar/elanore.txt
new file mode 100644
index 00000000..f94344a7
--- /dev/null
+++ b/npc/022-1_Tulimshar/elanore.txt
@@ -0,0 +1,3 @@
+//
+
+022-1.gat,68,79,0 duplicate(Elanore#_M) Elanore 108
diff --git a/npc/022-1_Tulimshar/ferry_master.txt b/npc/022-1_Tulimshar/ferry_master.txt
new file mode 100644
index 00000000..3cc10ce3
--- /dev/null
+++ b/npc/022-1_Tulimshar/ferry_master.txt
@@ -0,0 +1,16 @@
+//
+
+022-1.gat,73,71,0 script Ferry Master 138,{
+ mes "[Ferry Master]";
+ mes "\"Hello! Do you need something?\"";
+ next;
+ menu
+ "How do I use the ferry?", L_Explain,
+ "Nothing I guess", -;
+ close;
+
+L_Explain:
+ mes "[Ferry Master]";
+ mes "\"You'll setup on the dock and select your destination. Each destination has an associated price that you need to pay. You don't have to go anywhere. Choosing the current port will result in nothing.\"";
+ close;
+}
diff --git a/npc/functions/ferry.txt b/npc/functions/ferry.txt
new file mode 100644
index 00000000..0e33c6ac
--- /dev/null
+++ b/npc/functions/ferry.txt
@@ -0,0 +1,42 @@
+// The ferry system
+
+function script Ferry {
+ set @cost_tulimshar, 5;
+ set @cost_hurnscald, 5;
+ mes "Where would you like to go?";
+ next;
+
+ menu
+ "Tulimshar (" + @cost_tulimshar + "GP)", L_Tulimshar,
+ "Hurnscald (" + @cost_hurnscald + "GP)", L_Hurnscald,
+ "Nevermind", -;
+ close;
+
+L_Tulimshar:
+ if (@loc == DOCK_tulimshar)
+ goto L_AlreadyThere;
+ if (zeny < @cost_tulimshar)
+ goto L_NotEnoughGP;
+
+ set zeny, zeny - @cost_tulimshar;
+ warp "022-1.gat", 76, 72;
+ close;
+
+L_Hurnscald:
+ if (@loc == DOCK_hurnscald)
+ goto L_AlreadyThere;
+ if (zeny < @cost_hurnscald)
+ goto L_NotEnoughGP;
+
+ set zeny, zeny - @cost_hurnscald;
+ warp "008-1.gat", 137, 64;
+ close;
+
+L_AlreadyThere:
+ mes "You're already here!";
+ close;
+
+L_NotEnoughGP:
+ mes "You don't have enough money to go there!";
+ close;
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index dda7d1ff..a419722f 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -4,6 +4,7 @@
npc: npc/functions/banker.txt
npc: npc/functions/barber.txt
npc: npc/functions/clear_vars.txt
+npc: npc/functions/ferry.txt
npc: npc/functions/game_rules.txt
npc: npc/functions/inn.txt
npc: npc/functions/magic.txt
diff --git a/tools/retab.sml b/tools/retab.sml
index b374eff2..8e2a054e 100644
--- a/tools/retab.sml
+++ b/tools/retab.sml
@@ -1,3 +1,18 @@
+(*
+ * retab (c) 2009 The Mana World development team
+ * License: GPL, version 2 or later
+ *
+ * Compilation, e.g. (depends on SML implementation):
+ * mlton retab.sml
+ *
+ * Example usage:
+ * tools/retab < db/mob_db.txt > db/mob_db.txt.new && mv db/mob_db.txt.new db/mob_db.txt
+ *
+ * TODO:
+ * - Commas inside {} need to be seen as just one field when tabified
+ * - Commented lines should be left untabified
+ *)
+
fun width (#"\t", i) = let val m = i mod 8 in if m = 0 then 8 else m end
| width (c, i) = 1