#!/usr/bin/perl # To run this file: # item_db.pl --i=../db/pre-re/item_db.txt --o=../sql-files/item_db.sql --t=pre # item_db.pl --i=../db/re/item_db.txt --o=../sql-files/item_db_re.sql --t=re # For a list of options: # item_db.pl --help use strict; use warnings; use Getopt::Long; my $sFilein = ""; my $sFileout = ""; my $sTarget = ""; my $sType = ""; my $sHelp = 0; my $stable = ""; my $db; my $nb_columns; my @str_col = (); #use basic escape my @str_col2 = (); #use second escape (for script currently my $line_format; my $create_table; my @defaults = (); Main(); sub GetArgs { GetOptions( 'i=s' => \$sFilein, #output file 'o=s' => \$sFileout, #input file 't=s' => \$sTarget, # re/pre-re 'm=s' => \$sType, #item/mob 'table=s' => \$stable, 'help!' => \$sHelp, ) or $sHelp=1; #Display help if invalid options are supplied. my $sValidTarget = "Re|Pre"; my $sValidType = "Item|Mob|Mob_skill"; if( $sHelp ) { print "Incorrect option specified. Available options:\n" ."\t --o=filename => output filename \n" ."\t --i=filename => intput filename \n" ."\t --table=tablename => tablename to create \n" ."\t --t=target => specify target ([$sValidTarget]) \n" ."\t --m=type => specify type ([$sValidType]) \n"; exit; } unless($sFilein or $sFileout){ print "ERROR: Filename_in and Filename_out are required to continue.\n"; exit; } unless($sTarget =~ /$sValidTarget/i){ print "ERROR: Incorrect target specified. Available targets:\n" ."\t --t => target (specify which kind of table_struct to build [$sValidTarget])\n"; exit; } unless($sType =~ /$sValidType/i){ print "ERROR: Incorrect type specified. Available type:\n" ."\t --m => type (specify which data entry to use [$sValidType])\n"; exit; } } sub Main { GetArgs(); BuildDataForType($sTarget,$sType); ConvertFile($sFilein,$sFileout,$sType); print "Conversion ended.\n"; } sub ConvertFile { my($sFilein,$sFileout,$sType)=@_; my $sFHout; print "Starting ConvertFile with: \n\t filein=$sFilein \n\t fileout=$sFileout \n"; open FHIN,"$sFilein" or die "ERROR: Can't read or locate $sFilein.\n"; open $sFHout,">$sFileout" or die "ERROR: Can't write $sFileout.\n"; printf $sFHout ("%s\n",$create_table); while(my $ligne=) { if ($ligne =~ /^\s*$/ ){ print $sFHout "\n"; next; } if ($ligne =~ /[^\r\n]+/) { $ligne = $&; if ($ligne =~ /^\/\//) { printf $sFHout ("#"); $ligne = substr($ligne, 2); } my @champ = (); if ($sType =~ /mob_skill/i ) { if ($ligne =~ $line_format ) { @champ = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19); } } elsif ($sType =~ /mob/i) { @champ = split(",",$ligne); } elsif ($sType =~ /item/i ) { if ($ligne =~ $line_format) { @champ = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22); } } if ($#champ != $nb_columns - 1) { # Can't parse, it's a real comment printf $sFHout ("%s\n", $ligne); } else { printf $sFHout ("REPLACE INTO `%s` VALUES (", $db); for (my $i=0; $i<$#champ; $i++) { printField($sFHout,$champ[$i],",",$i); } printField($sFHout,$champ[$#champ],");\n",$#champ); } } } print $sFHout "\n"; } sub printField { my ($sFHout,$str, $suffix, $idCol) = @_; # Remove first { and last } if ($str =~ /{.*}/) { $str = substr($&,1,-1); } # If nothing, put NULL if ($str eq "") { my $sDef; if(scalar(@defaults)) { $sDef = $defaults[$idCol]; } #Use default in array. else { $sDef = "NULL" unless($sDef); } #Let SQL handle the default. print $sFHout "$sDef$suffix"; } else { my $flag = 0; # Search if it's a string column? foreach my $col (@str_col) { if ($col == $idCol) { $flag |= 1; last; } } foreach my $col (@str_col2) { if ($col == $idCol) { $flag |= 2; last; } } if ($flag & 3) { # String column, so escape , remove trailing and add '' my $string; $string = escape($str,"'","\\'") if($flag & 1) ; $string =~ s/\s+$//; #Remove trailing spaces. $string =~ s/^\s+//; #Remove leading spaces. $string = escape($string,'\\\"','\\\\\"') if($flag & 2) ; printf $sFHout ("'%s'%s", $string, $suffix); } else { # Not a string column. printf $sFHout ("%s%s", $str,$suffix); } } } sub escape { my ($str,$sregex,$sreplace) = @_; my @str_splitted = split($sregex, $str); my $result = ""; for (my $i=0; $i<=$#str_splitted; $i++) { if ($i == 0) { $result = $str_splitted[0]; } else { $result = $result.$sreplace.$str_splitted[$i]; } } return $result } sub BuildDataForType{ my($sTarget,$sType) = @_; print "Starting BuildDataForType with: \n\t Target=$sTarget, Type=$sType \n"; if($sType =~ /item/i) { if($sTarget =~ /Pre/i){ $db = $stable; $db = "item_db" unless($db); $nb_columns = 22; @str_col = (1,2,19,20,21); @str_col2 = (19,20,21); $line_format = "([^\,]*),"x($nb_columns-3)."(\{.*\}),"x(2)."(\{.*\})"; #Last 3 columns are scripts. $create_table = " # # Table structure for table `$db` # DROP TABLE IF EXISTS `$db`; CREATE TABLE `$db` ( `id` smallint(5) unsigned NOT NULL default '0', `name_english` varchar(50) NOT NULL default '', `name_japanese` varchar(50) NOT NULL default '', `type` tinyint(2) unsigned NOT NULL default '0', `price_buy` mediumint(10) unsigned default NULL, `price_sell` mediumint(10) unsigned default NULL, `weight` smallint(5) unsigned NOT NULL default '0', `attack` smallint(3) unsigned default NULL, `defence` smallint(5) NULL default NULL, `range` tinyint(2) unsigned default NULL, `slots` tinyint(2) unsigned default NULL, `equip_jobs` int(12) unsigned default NULL, `equip_upper` tinyint(8) unsigned default NULL, `equip_genders` tinyint(2) unsigned default NULL, `equip_locations` smallint(4) unsigned default NULL, `weapon_level` tinyint(2) unsigned default NULL, `equip_level` tinyint(3) unsigned default NULL, `refineable` tinyint(1) unsigned default NULL, `view` smallint(3) unsigned default NULL, `script` text, `equip_script` text, `unequip_script` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM; "; #NOTE: These do not match the table struct defaults. @defaults = ('0','\'\'','\'\'','0','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'); } elsif($sTarget =~ /Re/i){ $db = $stable; $db = "item_db_re" unless($db); $nb_columns = 22; @str_col = (1,2,7,16,19,20,21); @str_col2 = (19,20,21); $line_format = "([^\,]*),"x($nb_columns-3)."(\{.*\}),"x(2)."(\{.*\})"; #Last 3 columns are scripts. $create_table = " # # Table structure for table `$db` # DROP TABLE IF EXISTS `$db`; CREATE TABLE `$db` ( `id` smallint(5) unsigned NOT NULL default '0', `name_english` varchar(50) NOT NULL default '', `name_japanese` varchar(50) NOT NULL default '', `type` tinyint(2) unsigned NOT NULL default '0', `price_buy` mediumint(10) unsigned default NULL, `price_sell` mediumint(10) unsigned default NULL, `weight` smallint(5) unsigned NOT NULL default '0', `atk:matk` varchar(11) default '', `defence` smallint(5) NULL default NULL, `range` tinyint(2) unsigned default NULL, `slots` tinyint(2) unsigned default NULL, `equip_jobs` int(12) unsigned default NULL, `equip_upper` tinyint(8) unsigned default NULL, `equip_genders` tinyint(2) unsigned default NULL, `equip_locations` smallint(4) unsigned default NULL, `weapon_level` tinyint(2) unsigned default NULL, `equip_level` varchar(10) default '', `refineable` tinyint(1) unsigned default NULL, `view` smallint(3) unsigned default NULL, `script` text, `equip_script` text, `unequip_script` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM; "; #NOTE: These do not match the table struct defaults. @defaults = ('0','\'\'','\'\'','0','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'); } } #end item type elsif($sType =~ /mob_skill/i) { #same format for pre and re $db = "mob_skill_db" unless($db); $nb_columns = 19; @str_col = (1,2,8,9,10,11,17,18); $line_format = "([^\,]*),"x($nb_columns-1)."([^\,]*)"; $create_table = " # # Table structure for table `$db` # DROP TABLE IF EXISTS `$db`; CREATE TABLE IF NOT EXISTS `$db` ( `MOB_ID` smallint(6) NOT NULL, `INFO` text NOT NULL, `STATE` text NOT NULL, `SKILL_ID` smallint(6) NOT NULL, `SKILL_LV` tinyint(4) NOT NULL, `RATE` smallint(4) NOT NULL, `CASTTIME` mediumint(9) NOT NULL, `DELAY` int(9) NOT NULL, `CANCELABLE` text NOT NULL, `TARGET` text NOT NULL, `CONDITION` text NOT NULL, `CONDITION_VALUE` text, `VAL1` mediumint(9) DEFAULT NULL, `VAL2` mediumint(9) DEFAULT NULL, `VAL3` mediumint(9) DEFAULT NULL, `VAL4` mediumint(9) DEFAULT NULL, `VAL5` mediumint(9) DEFAULT NULL, `EMOTION` text, `CHAT` text ) ENGINE=MyISAM; "; } elsif($sType =~ /mob/i) { #same format for pre and re $db = "mob_db" unless($db); $nb_columns = 57; @str_col = (1,2,3); $line_format = "([^\,]*),"x($nb_columns-1)."([^\,]*)"; $create_table = " # # Table structure for table `$db` # DROP TABLE IF EXISTS `$db`; CREATE TABLE `$db` ( `ID` mediumint(9) unsigned NOT NULL default '0', `Sprite` text NOT NULL, `kName` text NOT NULL, `iName` text NOT NULL, `LV` tinyint(6) unsigned NOT NULL default '0', `HP` int(9) unsigned NOT NULL default '0', `SP` mediumint(9) unsigned NOT NULL default '0', `EXP` mediumint(9) unsigned NOT NULL default '0', `JEXP` mediumint(9) unsigned NOT NULL default '0', `Range1` tinyint(4) unsigned NOT NULL default '0', `ATK1` smallint(6) unsigned NOT NULL default '0', `ATK2` smallint(6) unsigned NOT NULL default '0', `DEF` smallint(6) unsigned NOT NULL default '0', `MDEF` smallint(6) unsigned NOT NULL default '0', `STR` smallint(6) unsigned NOT NULL default '0', `AGI` smallint(6) unsigned NOT NULL default '0', `VIT` smallint(6) unsigned NOT NULL default '0', `INT` smallint(6) unsigned NOT NULL default '0', `DEX` smallint(6) unsigned NOT NULL default '0', `LUK` smallint(6) unsigned NOT NULL default '0', `Range2` tinyint(4) unsigned NOT NULL default '0', `Range3` tinyint(4) unsigned NOT NULL default '0', `Scale` tinyint(4) unsigned NOT NULL default '0', `Race` tinyint(4) unsigned NOT NULL default '0', `Element` tinyint(4) unsigned NOT NULL default '0', `Mode` smallint(6) unsigned NOT NULL default '0', `Speed` smallint(6) unsigned NOT NULL default '0', `aDelay` smallint(6) unsigned NOT NULL default '0', `aMotion` smallint(6) unsigned NOT NULL default '0', `dMotion` smallint(6) unsigned NOT NULL default '0', `MEXP` mediumint(9) unsigned NOT NULL default '0', `MVP1id` smallint(9) unsigned NOT NULL default '0', `MVP1per` smallint(9) unsigned NOT NULL default '0', `MVP2id` smallint(9) unsigned NOT NULL default '0', `MVP2per` smallint(9) unsigned NOT NULL default '0', `MVP3id` smallint(9) unsigned NOT NULL default '0', `MVP3per` smallint(9) unsigned NOT NULL default '0', `Drop1id` smallint(9) unsigned NOT NULL default '0', `Drop1per` smallint(9) unsigned NOT NULL default '0', `Drop2id` smallint(9) unsigned NOT NULL default '0', `Drop2per` smallint(9) unsigned NOT NULL default '0', `Drop3id` smallint(9) unsigned NOT NULL default '0', `Drop3per` smallint(9) unsigned NOT NULL default '0', `Drop4id` smallint(9) unsigned NOT NULL default '0', `Drop4per` smallint(9) unsigned NOT NULL default '0', `Drop5id` smallint(9) unsigned NOT NULL default '0', `Drop5per` smallint(9) unsigned NOT NULL default '0', `Drop6id` smallint(9) unsigned NOT NULL default '0', `Drop6per` smallint(9) unsigned NOT NULL default '0', `Drop7id` smallint(9) unsigned NOT NULL default '0', `Drop7per` smallint(9) unsigned NOT NULL default '0', `Drop8id` smallint(9) unsigned NOT NULL default '0', `Drop8per` smallint(9) unsigned NOT NULL default '0', `Drop9id` smallint(9) unsigned NOT NULL default '0', `Drop9per` smallint(9) unsigned NOT NULL default '0', `DropCardid` smallint(9) unsigned NOT NULL default '0', `DropCardper` smallint(9) unsigned NOT NULL default '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM; "; } #end mob type }