You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.4 KiB
Perl
146 lines
3.4 KiB
Perl
#!/usr/bin/perl
|
|
# rAthena Monster Mode Converter
|
|
# Upgrades monster's mode to the new structure.
|
|
#
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Getopt::Long;
|
|
use File::Basename;
|
|
use Scalar::Util qw(looks_like_number);
|
|
|
|
my $sFileins;
|
|
my @aFilein = ("../db/re/mob_db.txt","../db/pre-re/mob_db.txt","../db/mob_db2.txt");
|
|
my $sFileouts;
|
|
my @aFileout = ("../db/re/mob_db.txt","../db/pre-re/mob_db.txt","../db/mob_db2.txt");
|
|
my $sHelp = 0;
|
|
|
|
Main();
|
|
|
|
sub convertmode {
|
|
my $bits = hex(shift);
|
|
my $mexp = shift;
|
|
|
|
if ($bits&32) { # MD_BOSS
|
|
$bits -= 32;
|
|
$bits |= 69206016; # Doesn't include MD_DETECTOR
|
|
}
|
|
|
|
if ($bits&64) { # MD_PLANT
|
|
$bits -= 64;
|
|
$bits |= 1507328;
|
|
}
|
|
|
|
if ($bits&256) { # MD_DETECTOR
|
|
$bits -= 256;
|
|
$bits |= 33554432;
|
|
}
|
|
|
|
if ($bits&4194304) { # MD_NORANDOM_WALK
|
|
$bits -= 4194304;
|
|
$bits |= 32;
|
|
}
|
|
|
|
if ($bits&8388608) { # MD_NOCAST_SKILL
|
|
$bits -= 8388608;
|
|
$bits |= 64;
|
|
}
|
|
|
|
if ($mexp > 0) { # MD_MVP
|
|
$bits |= 524288;
|
|
}
|
|
|
|
return $bits;
|
|
}
|
|
|
|
sub GetArgs {
|
|
GetOptions(
|
|
'i=s' => \$sFileins, #Output file name.
|
|
'o=s' => \$sFileouts, #Input file name.
|
|
'help!' => \$sHelp,
|
|
) or $sHelp=1; #Display help if invalid options are supplied.
|
|
|
|
if( $sHelp ) {
|
|
print "Incorrect option specified. Available options:\n"
|
|
."\t --o=filename => Output file name. (file must be separate by coma if multiple) \n"
|
|
."\t --i=filenames => Input files name. (file must be separate by coma if multiple) \n";
|
|
exit;
|
|
}
|
|
if($sFileins){
|
|
chomp($sFileins);
|
|
@aFilein = split(",",$sFileins);
|
|
}
|
|
if($sFileouts){
|
|
chomp($sFileouts);
|
|
@aFileout = split(",",$sFileouts);
|
|
}
|
|
unless(scalar(@aFileout)==scalar(@aFilein)){
|
|
print "ERROR: Number of input files doesn't match number of output files. You must specify an output for each input:\n"
|
|
."afilein = [ @aFilein ] \n"
|
|
."afileout = [ @aFileout ] \n";
|
|
exit;
|
|
}
|
|
}
|
|
|
|
sub Main {
|
|
my $sI=0;
|
|
my($filename, $dir, $suffix) = fileparse($0);
|
|
chdir $dir; #put ourself like was called in tool folder
|
|
GetArgs();
|
|
print "Running rAthena's Monster Mode Converter...\n";
|
|
print "Files to be converted: '@aFilein' into '@aFileout'.\n";
|
|
foreach my $sFile (@aFilein){
|
|
my $sReplace=0; #should we replace file when finished
|
|
my $sFileouttmp=$aFileout[$sI];
|
|
if($sFile eq $sFileouttmp){
|
|
$sReplace=1;
|
|
$sFileouttmp = $sFileouttmp.".out";
|
|
print "Asking to replace file tmp fileout= $sFileouttmp \n";
|
|
}
|
|
unless(open FHIN,"$sFile"){
|
|
print "ERROR: Can't read or locate $sFile.\n";
|
|
next;
|
|
}
|
|
unless(open FHOUT,">$sFileouttmp"){
|
|
print "ERROR: Can't write or locate $aFileout[$sI].\n";
|
|
next;
|
|
}
|
|
$sI++;
|
|
while (<FHIN>){
|
|
if( $_ =~ /^\s*$/) { #ignore empty line
|
|
print FHOUT $_;
|
|
next;
|
|
}
|
|
my @champ = split(",",$_);
|
|
my $sDoconvertion=0; #should this comment be converted
|
|
if( $_ =~ /^\/\// ) { # // line
|
|
if(scalar(@champ)>0){
|
|
$champ[0] =~ s!\/\/!!g;
|
|
$sDoconvertion=looks_like_number($champ[0]);
|
|
$champ[0] = "//".$champ[0]; #recomment it
|
|
}
|
|
if($sDoconvertion==0) {
|
|
print FHOUT $_;
|
|
next;
|
|
}
|
|
}
|
|
if(scalar(@champ>0)){
|
|
if($champ[25] =~ /^0[xX]/) {
|
|
$champ[25] = sprintf("0x%X", convertmode($champ[25], $champ[30]));
|
|
} else {
|
|
$champ[25] = sprintf("0x%X", convertmode(sprintf("0x%X", $champ[25]), $champ[30]));
|
|
}
|
|
my $newline = join(",",@champ);
|
|
print FHOUT $newline;
|
|
}
|
|
else { print FHOUT $_; }
|
|
}
|
|
close FHOUT;
|
|
close FHIN;
|
|
if($sReplace){
|
|
unlink $sFile;
|
|
rename $sFileouttmp, $sFile;
|
|
}
|
|
}
|
|
}
|