123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- #!/usr/bin/perl
- # Mob Database:
- # --i=../db/pre-re/mob_db.txt --o=../sql-files/mob_db.sql --t=pre --m=mob --table=mob_db
- # --i=../db/re/mob_db.txt --o=../sql-files/mob_db_re.sql --t=re --m=mob --table=mob_db_re
- #
- # Mob Skill Database:
- # --i=../db/pre-re/mob_skill_db.txt --o=../sql-files/mob_skill_db.sql --t=pre --m=mob_skill --table=mob_skill_db
- # --i=../db/re/mob_skill_db.txt --o=../sql-files/mob_skill_db_re.sql --t=re --m=mob_skill --table=mob_skill_db_re
- #
- # List of options:
- # convert_sql.pl --help
- use strict;
- use warnings;
- use Getopt::Long;
- use File::Basename;
- 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 (currently for scripts).
- my $line_format;
- my $create_table;
- my @defaults = ();
- Main();
- sub GetArgs {
- GetOptions(
- 'i=s' => \$sFilein, #Output file name.
- 'o=s' => \$sFileout, #Input file name.
- 't=s' => \$sTarget, #Renewal setting: pre-re, re.
- 'm=s' => \$sType, #Database: mob, mob_skill.
- 'table=s' => \$sTable, #Table name.
- 'help!' => \$sHelp,
- ) or $sHelp=1; #Display help if invalid options are supplied.
- my $sValidTarget = "re|pre";
- my $sValidType = "mob|mob_skill";
- if( $sHelp ) {
- print "Incorrect option specified. Available options:\n"
- ."\t --o=filename => Output file name. \n"
- ."\t --i=filename => Input file name. \n"
- ."\t --table=tablename => Table name 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 types:\n"
- ."\t --m => Type (specify which data entry to use [$sValidType]).\n";
- exit;
- }
- }
- sub Main {
- GetArgs();
- my($filename, $dir, $suffix) = fileparse($0);
- chdir $dir; #put ourself like was called in tool folder
- BuildDataForType($sTarget,$sType);
- ConvertFile($sFilein,$sFileout,$sType);
- print "Conversion ended.\n";
- }
- sub ConvertFile { my($sFilein,$sFileout,$sType)=@_;
- my $sFHout;
- my %hAEgisName = ();
- 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=<FHIN>) {
- my $sWasCom = 0;
- if ($ligne =~ /^\s*$/ ) {
- print $sFHout "\n";
- next;
- }
- if ($ligne =~ /[^\r\n]+/) {
- $ligne = $&;
- if ($ligne =~ /^\/\//) {
- printf $sFHout ("#");
- $ligne = substr($ligne, 2);
- $sWasCom = 1;
- }
- 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); }
- 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 =~ /mob_skill/i) { #Same format for Pre-Renewal and Renewal.
- $db = $sTable;
- if($sTarget =~ /Pre/i){
- $db = "mob_skill_db" unless($db);
- }else{
- $db = "mob_skill_db_re" 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-Renewal and Renewal.
- $db = $sTable;
- if($sTarget =~ /Pre/i){
- $db = "mob_db" unless($db);
- }else{
- $db = "mob_db_re" 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` int(11) 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` int(10) unsigned NOT NULL default '0',
- `MVP1per` smallint(9) unsigned NOT NULL default '0',
- `MVP2id` int(10) unsigned NOT NULL default '0',
- `MVP2per` smallint(9) unsigned NOT NULL default '0',
- `MVP3id` int(10) unsigned NOT NULL default '0',
- `MVP3per` smallint(9) unsigned NOT NULL default '0',
- `Drop1id` int(10) unsigned NOT NULL default '0',
- `Drop1per` smallint(9) unsigned NOT NULL default '0',
- `Drop2id` int(10) unsigned NOT NULL default '0',
- `Drop2per` smallint(9) unsigned NOT NULL default '0',
- `Drop3id` int(10) unsigned NOT NULL default '0',
- `Drop3per` smallint(9) unsigned NOT NULL default '0',
- `Drop4id` int(10)) unsigned NOT NULL default '0',
- `Drop4per` smallint(9) unsigned NOT NULL default '0',
- `Drop5id` int(10) unsigned NOT NULL default '0',
- `Drop5per` smallint(9) unsigned NOT NULL default '0',
- `Drop6id` int(10) unsigned NOT NULL default '0',
- `Drop6per` smallint(9) unsigned NOT NULL default '0',
- `Drop7id` int(10) unsigned NOT NULL default '0',
- `Drop7per` smallint(9) unsigned NOT NULL default '0',
- `Drop8id` int(10) unsigned NOT NULL default '0',
- `Drop8per` smallint(9) unsigned NOT NULL default '0',
- `Drop9id` int(10) unsigned NOT NULL default '0',
- `Drop9per` smallint(9) unsigned NOT NULL default '0',
- `DropCardid` int(10) unsigned NOT NULL default '0',
- `DropCardper` smallint(9) unsigned NOT NULL default '0',
- PRIMARY KEY (`ID`)
- ) ENGINE=MyISAM;
- ";
- }
- }
|