summaryrefslogtreecommitdiff
path: root/tools/itemdbconverter.pl
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2013-11-08 07:18:40 +0100
committerHaru <haru@dotalux.com>2013-11-14 20:15:28 +0100
commited72a947a6c97804c1eef5b80bfa49d99f7d7586 (patch)
treef9196c943010e26c13c12d38c7a622d43301a4cd /tools/itemdbconverter.pl
parent7d0a63b72f93c05b302c08cfb19d5651cef1cdb8 (diff)
downloadhercules-ed72a947a6c97804c1eef5b80bfa49d99f7d7586.tar.gz
hercules-ed72a947a6c97804c1eef5b80bfa49d99f7d7586.tar.bz2
hercules-ed72a947a6c97804c1eef5b80bfa49d99f7d7586.tar.xz
hercules-ed72a947a6c97804c1eef5b80bfa49d99f7d7586.zip
Item DB overhaul
http://hercules.ws/board/topic/2954-item-db-file-structure-overhaul - Item db was changed to libconfig format. - This new format is larger than the original format, but it's less subject to conflicts when some items are edited and the file gets updated. - It is no longer necessary to specify fields with no value, and only the actually used fields are specified. - Items scripts (especially the long ones) are made more readable by splitting them into multiple lines, with proper indentation. - A converter perl script is provided in the tools directory (and a link to the web-based version of the same script canbe found in the above forum topic) - All of this was made possible thanks to Ind, Yommy. Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'tools/itemdbconverter.pl')
-rwxr-xr-xtools/itemdbconverter.pl194
1 files changed, 194 insertions, 0 deletions
diff --git a/tools/itemdbconverter.pl b/tools/itemdbconverter.pl
new file mode 100755
index 000000000..747f9e84f
--- /dev/null
+++ b/tools/itemdbconverter.pl
@@ -0,0 +1,194 @@
+#!/usr/bin/perl
+#
+# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
+# See the LICENSE file
+# Base Author: Haru @ http://hercules.ws
+#
+# This script converts an item_db(2).txt to the new item_db(2).conf format.
+# usage example: perl tools/itemdbconverter.pl < db/item_db2.txt > db/item_db2.conf
+#
+use strict;
+use warnings;
+
+sub prettifyscript ($) {
+ my ($orig) = @_;
+ $orig =~ s/^[\s\t]*//; $orig =~ s/[\s\t]*$//;
+ return '' unless $orig =~ /[^\s\t]/;
+ my ($p, $script) = ($orig, '');
+ my ($curly, $lines, $comment) = (2, 0, 0);
+ my ($linebreak, $needindent) = (0, 0);
+ while ($p =~ /[^\s\t]/) {
+ $linebreak = 0;
+ if ($comment && $p =~ s|^\s*\*/\s*||) {
+ $comment = 0;
+ next;
+ } elsif ($p =~ s/^\s*({)\s*//) {
+ $curly++ unless $comment;
+ $comment++ if $comment;
+ $script .= " ";
+ $linebreak = 1;
+ $lines++;
+ } elsif ($p =~ s/^\s*(})\s*//) {
+ $curly-- unless $comment;
+ $comment-- if $comment - 1 > 0;
+ $linebreak = 1;
+ $lines++;
+ } elsif ($p =~ s/^\s*(;)\s*//) {
+ if ($p && (!$comment || $p !~ m|^[\s\t]*(?:\*/)[\s\t]*$|)) {
+ $linebreak = 1;
+ $lines++
+ }
+ } elsif ($p =~ s/^("[^"]*")//) {
+ } elsif ($p =~ s|^\s*/\*\s*||) {
+ $comment = 1;
+ next;
+ } elsif ($p !~ s/^(.)//) {
+ last;
+ }
+ $script .= "\t" x $curly if $needindent;
+ $script .= "//" . ("\t" x ($comment-1)) if ($comment && ($needindent || $script eq ''));
+ $script .= "$1";
+ if ($linebreak) {
+ $script .= "\n";
+ $needindent = 1;
+ } else {
+ $needindent = 0;
+ }
+ }
+ if ($curly != 2) {
+ printf STDERR "Parse error, curly braces count ". ($curly-2) .". returning unmodified script:\n$orig\n\n";
+ return $orig;
+ }
+ if ($lines) {
+ $script = "\n\t\t$script\n\t";
+ } else {
+ $script = " $script ";
+ }
+ return $script;
+}
+
+sub parsedb (@) {
+ my @input = @_;
+ foreach (@input) {
+ chomp $_;
+# ID,AegisName,Name,Type,Buy,Sell,Weight,ATK,DEF,Range,Slots,Job,Upper,Gender,Loc,wLV,eLV,Refineable,View,{ Script },{ OnEquip_Script },{ OnUnequip_Script }
+ if( $_ =~ qr/^
+ (?<prefix>(?:\/\/[^0-9]*)?)
+ (?<ID>[0-9]+),
+ (?<AegisName>[^,]+),
+ (?<Name>[^,]+),
+ (?<Type>[0-9]+),
+ (?<Buy>[0-9]*),
+ (?<Sell>[0-9]*),
+ (?<Weight>[0-9]*),
+ (?<ATK>[0-9-]*)(?<hasmatk>:(?<MATK>[0-9-]*))?,
+ (?<DEF>[0-9-]*),
+ (?<Range>[0-9]*),
+ (?<Slots>[0-9]*),
+ (?<Job>[x0-9A-F]*),
+ (?<Upper>[0-9]*),
+ (?<Gender>[0-9]*),
+ (?<Loc>[0-9]*),
+ (?<wLV>[0-9]*),
+ (?<eLV>[0-9]*)(?<hasmaxlv>:(?<eLVmax>[0-9]*))?,
+ (?<Refineable>[0-9]*),
+ (?<View>[0-9]*),
+ {(?<Script>.*)},
+ {(?<OnEquip>.*)},
+ {(?<OnUnequip>.*)}
+ /x ) {
+ my %cols = map { $_ => $+{$_} } keys %+;
+ print "/*\n" if $cols{prefix};
+ print "$cols{prefix}\n" if $cols{prefix} and $cols{prefix} !~ m|^//[\s\t]*$|;
+ print "{\n";
+ print "\tId: $cols{ID}\n";
+ print "\tAegisName: \"$cols{AegisName}\"\n";
+ print "\tName: \"$cols{Name}\"\n";
+ print "\tType: $cols{Type}\n";
+ print "\tBuy: $cols{Buy}\n" if $cols{Buy} || $cols{Buy} eq '0';
+ print "\tSell: $cols{Sell}\n" if $cols{Sell} || $cols{Sell} eq '0';
+ print "\tWeight: $cols{Weight}\n" if $cols{Weight};
+ print "\tAtk: $cols{ATK}\n" if $cols{ATK};
+ print "\tMatk: $cols{MATK}\n" if $cols{MATK};
+ print "\tDef: $cols{DEF}\n" if $cols{DEF};
+ print "\tRange: $cols{Range}\n" if $cols{Range};
+ print "\tSlots: $cols{Slots}\n" if $cols{Slots};
+ $cols{Job} = '0xFFFFFFFF' unless $cols{Job};
+ print "\tJob: $cols{Job}\n" unless $cols{Job} =~ /0xFFFFFFFF/i;
+ print "\tUpper: $cols{Upper}\n" if $cols{Upper} && (($cols{hasmatk} && $cols{Upper} != 0x3f) || (!$cols{hasmatk} && $cols{Upper} != 7));
+ $cols{Gender} = '2' unless $cols{Gender};
+ print "\tGender: $cols{Gender}\n" unless $cols{Gender} eq '2';
+ print "\tLoc: $cols{Loc}\n" if $cols{Loc};
+ print "\tWeaponLv: $cols{wLV}\n" if $cols{wLV};
+ if ($cols{hasmaxlv} and $cols{eLVmax}) {
+ $cols{eLV} = 0 unless $cols{eLV};
+ print "\tEquipLv: [$cols{eLV}, $cols{eLVmax}]\n";
+ } else {
+ print "\tEquipLv: $cols{eLV}\n" if $cols{eLV};
+ }
+ print "\tRefine: false\n" if !$cols{Refineable} and ($cols{Type} == 4 or $cols{Type} == 5);
+ print "\tView: $cols{View}\n" if $cols{View};
+ $cols{Script} = prettifyscript($cols{Script});
+ print "\tScript: <\"$cols{Script}\">\n" if $cols{Script};
+ $cols{OnEquip} = prettifyscript($cols{OnEquip});
+ print "\tOnEquipScript: <\"$cols{OnEquip}\">\n" if $cols{OnEquip};
+ $cols{OnUnequip} = prettifyscript($cols{OnUnequip});
+ print "\tOnUnequipScript: <\"$cols{OnUnequip}\">\n" if $cols{OnUnequip};
+ print "},\n";
+ print "*/\n" if $cols{prefix};
+ } elsif( $_ =~ /^\/\/(.*)$/ ) {
+ my $s = $1;
+ print "// $s\n" unless $s =~ /^[\s\t]*$/;
+ } elsif( $_ !~ /^\s*$/ ) {
+ print "// Error parsing: $_\n";
+ }
+
+ }
+}
+print <<"EOF";
+item_db: (
+/******************************************************************************
+ ************* Entry structure ************************************************
+ ******************************************************************************
+{
+ // =================== Mandatory fields ===============================
+ Id: ID (int)
+ AegisName: "Aegis_Name" (string, optional if Inherit: true)
+ Name: "Item Name" (string, optional if Inherit: true)
+ // =================== Optional fields ================================
+ Type: Item Type (int, defaults to 3 = etc item)
+ Buy: Buy Price (int, defaults to Sell * 2)
+ Sell: Sell Price (int, defaults to Buy / 2)
+ Weight: Item Weight (int, defaults to 0)
+ Atk: Attack (int, defaults to 0)
+ Matk: Magical Attack (int, defaults to 0, ignored in pre-re)
+ Def: Defense (int, defaults to 0)
+ Range: Attack Range (int, defaults to 0)
+ Slots: Slots (int, defaults to 0)
+ Job: Job mask (int, defaults to all jobs = 0xFFFFFFFF)
+ Upper: Upper mask (int, defaults to any = 0x3f)
+ Gender: Gender (int, defaults to both = 2)
+ Loc: Equip location (int, required value for equipment)
+ WeaponLv: Weapon Level (int, defaults to 0)
+ EquipLv: Equip required level (int, defaults to 0)
+ EquipLv: [min, max] (alternative syntax with min / max level)
+ Refine: Refineable (boolean, defaults to true)
+ View: View ID (int, defaults to 0)
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+ OnEquipScript: <" OnEquip Script (can also be multi-line) ">
+ OnUnequipScript: <" OnUnequip Script (can also be multi-line) ">
+ // =================== Optional fields (item_db2 only) ================
+ Inherit: true/false (boolean, if true, inherit the values
+ that weren't specified, from item_db.conf,
+ else override it and use default values)
+},
+******************************************************************************/
+
+EOF
+
+parsedb(<>);
+
+print ")\n";