two more perl scripts for use
the first one you provide a filename for input, and a number (that you can get with the script I provided a page or two back), and it retrieves that move data at that location and spits it out into a file like NAME.dat. like if you call it on GKI.cmn.emz w/ number 156 then it spits out AIR_TATSUMAKI_L.dat in the same directory.
the second script takes 3 arguments, the first is the original file, the index, and a .dat that contains a move. it then takes the original file and creates a new file with the name the original file but with a 2 at the end, this file has the move at the index replaced by the one from the .dat file and all the pointer tables are updated accordingly and correctly.
this is how i copy and pasted akuma’s dive kick (92MK) and dhalsim’s teleport (AIR_TELEPO_A) to c viper like in the video in my above post
#/usr/bin/perl -w
use strict;
use warnings;
if(defined($ARGV[1])) {
print "ok good
";
} else {
print "not enough params
";
exit 0;
}
print "----------------------------------------------------------------------
";
open(IN,$ARGV[0]);
binmode(IN);
# debugging mainly
sub printadd {
my $a = shift;
return $a . " - " . sprintf("%x",$a);
}
# loc, amount, buffer
sub sread {
# bad programming here but whatev
seek(IN, $_[0], 0) or die "seek:$!";
read(IN, $_[2], $_[1]);
}
# endian stuff
sub convert {
return unpack("V", shift);
}
# (start, end). returns array.
sub slurptable {
my ($s, $e) = (shift,shift);
my $buffer = "";
my @out;
my $i = 0;
while($s < $e) {
sread($s, 4, $buffer);
$buffer = convert($buffer);
if($buffer != 0) {
$out[$i] = $buffer;
$i++;
}
$s += 4;
}
return @out;
}
my $buffer = "";
my $pointer = 0;
sread(0x48, 4, $buffer);
my $bac = convert($buffer);
print printadd($bac) . " - header BAC
";
sread($bac, 256, $buffer);
#print $buffer . "
";
$bac += rindex($buffer, "#BAC");
print printadd($bac) . " - actual BAC
"; # 779040
# get animation table
sread($bac + 12, 4, $buffer);
$pointer = convert($buffer);
my $addanimation = $pointer+$bac;
print printadd($bac + 12) . " - pointer to animation table
contents - " . printadd($pointer) . " or " . printadd($addanimation) . "
";
# get end of animation table
sread($bac + 16, 4, $buffer);
$pointer = convert($buffer);
my $addname = $pointer+$bac;
print printadd($bac + 16) . " - pointer to name table
contents - " . printadd($pointer) . " or " . printadd($addname) . "
";
# get hit table start (so know end of name table)
sread($bac + 20, 4, $buffer);
$pointer = convert($buffer);
my $addhit = $pointer+$bac;
print printadd($bac + 20) . " - pointer to hit table
contents - " . printadd($pointer) . " or " . printadd($addhit) . "
";
my @animtable = slurptable($addanimation, $addname);
my @nametable = slurptable($addname, $addhit);
# not slurping the hit table for now except for the first value.
# get hit table start (so know end of name table)
sread($addhit, 4, $buffer);
$pointer = convert($buffer);
my $firsthit = $pointer+$bac;
print printadd($addhit) . " - hit table first value
contents - " . printadd($pointer) . " or " . printadd($firsthit) . "
";
print "------------------------------------
";
print "length of animtable - " . scalar(@animtable) . "
";
print "length of nametable - " . scalar(@nametable) . "
";
my $length = scalar(@nametable);
push(@nametable, $firsthit - $bac);
my @names = ();
for(my $i = 0; $i < $length; $i++)
{
sread($nametable[$i]+$bac, $nametable[$i+1]-$nametable[$i], $buffer);
$buffer =~ s/\x00+$//;
push @names, $buffer;
$buffer = $i . ". " . $buffer;
$buffer .= " "x(30-length($buffer));
print $buffer . printadd($animtable[$i] + $bac) . "
";
}
print printadd($nametable[199]) . "
";
# cleanup
my $target = $ARGV[1];
print "getting " . $target . ". " . $names[$target] . ": " . printadd($animtable[$target] + $bac) . " and ends at " . printadd($animtable[$target+1] + $bac) . "
";
open(OUT, ">".$names[$target] . ".dat");
binmode(OUT);
sread($animtable[$target]+$bac, $animtable[$target+1]-$animtable[$target], $buffer);
print OUT $buffer;
close(OUT);
close(IN);
#/usr/bin/perl -w
use strict;
use warnings;
if(defined($ARGV[2])) {
print "ok good
";
} else {
print "not enough params
";
exit 0;
}
print "----------------------------------------------------------------------
";
open(IN,$ARGV[0]) or die "$!";
binmode(IN);
# debugging mainly
sub printadd {
my $a = shift;
return $a . " - " . sprintf("%x",$a);
}
# loc, amount, buffer
sub sread {
# bad programming here but whatev
seek(IN, $_[0], 0) or die "seek:$!";
read(IN, $_[2], $_[1]);
}
# endian stuff
sub convert {
return unpack("V", shift);
}
# (start, end). returns array.
sub slurptable {
my ($s, $e) = (shift,shift);
my $buffer = "";
my @out;
my $i = 0;
while($s < $e) {
sread($s, 4, $buffer);
$buffer = convert($buffer);
if($buffer != 0) {
$out[$i] = $buffer;
$i++;
}
$s += 4;
}
return @out;
}
# (start, end). returns array.
sub slurptablewithzeros {
my ($s, $e) = (shift,shift);
my $buffer = "";
my @out;
my $i = 0;
while($s < $e) {
sread($s, 4, $buffer);
$buffer = convert($buffer);
$out[$i] = $buffer;
$i++;
$s += 4;
}
return @out;
}
# give array returns big fat table with incremented
sub addtable {
my ($s, $e, $dsize) = (shift,shift, shift);
my @in = slurptablewithzeros($s,$e);
my $out = "";
foreach(@in)
{
if($_ != 0) {
$out .= pack("V", $_ - $dsize)
} else {
$out .= pack("V", $_)
}
}
return $out;
}
my $buffer = "";
my $pointer = 0;
sread(0x48, 4, $buffer);
my $bac = convert($buffer);
print printadd($bac) . " - header BAC
";
sread($bac, 256, $buffer);
#print $buffer . "
";
$bac += rindex($buffer, "#BAC");
print printadd($bac) . " - actual BAC
"; # 779040
# get animation table
sread($bac + 12, 4, $buffer);
$pointer = convert($buffer);
my $addanimation = $pointer+$bac;
print printadd($bac + 12) . " - pointer to animation table
contents - " . printadd($pointer) . " or " . printadd($addanimation) . "
";
# get end of animation table
sread($bac + 16, 4, $buffer);
$pointer = convert($buffer);
my $addname = $pointer+$bac;
print printadd($bac + 16) . " - pointer to name table
contents - " . printadd($pointer) . " or " . printadd($addname) . "
";
# get hit table start (so know end of name table)
sread($bac + 20, 4, $buffer);
$pointer = convert($buffer);
my $addhit = $pointer+$bac;
print printadd($bac + 20) . " - pointer to hit table
contents - " . printadd($pointer) . " or " . printadd($addhit) . "
";
my @animtable = slurptable($addanimation, $addname);
my @nametable = slurptable($addname, $addhit);
my @animtablez = slurptablewithzeros($addanimation, $addname);
my @nametablez = slurptablewithzeros($addname, $addhit);
# not slurping the hit table for now except for the first value.
# get hit table start (so know end of name table)
sread($addhit, 4, $buffer);
$pointer = convert($buffer);
my $firsthit = $pointer+$bac;
print printadd($addhit) . " - hit table first value
contents - " . printadd($pointer) . " or " . printadd($firsthit) . "
";
print "------------------------------------
";
print "length of animtable - " . scalar(@animtable) . "
";
print "length of nametable - " . scalar(@nametable) . "
";
my $length = scalar(@nametable);
push(@nametable, $firsthit - $bac);
my @names = ();
for(my $i = 0; $i < $length; $i++)
{
sread($nametable[$i]+$bac, $nametable[$i+1]-$nametable[$i], $buffer);
$buffer =~ s/\x00+$//;
push @names, $buffer;
$buffer = $i . ". " . $buffer;
$buffer .= " "x(30-length($buffer));
print $buffer . printadd($animtable[$i] + $bac) . "
";
}
print printadd($nametable[199]) . "
";
# cleanup
my $target = $ARGV[1];
my $oldsize = $animtable[$target+1]-$animtable[$target];
my $newsize = -s $ARGV[2];
my $dsize = $oldsize - $newsize;
print "old size: $oldsize
";
print "new size: $newsize
";
print "size diff: $dsize
";
print "going for " . $target . ". " . $names[$target] . ": " . printadd($animtable[$target] + $bac) . " and ends at " . printadd($animtable[$target+1] + $bac) . "
";
print "aka " . printadd($animtable[$target]) . "
";
open(NEWM, $ARGV[2]) or die "$!";
binmode(NEWM);
open(OUT, ">" . $ARGV[0] . "2") or die "$!";
binmode(OUT);
print "writing EMB before
";
sread(0, 0x4C, $buffer);
print OUT $buffer;
print "getting EMB after
";
print OUT addtable(0x4C, 0x74, $dsize);
print "getting ALL THE WAY TO BAC
";
sread(0x74, $addanimation - 0x74, $buffer);
print OUT $buffer;
print "getting animtable
";
my $truetarget = 0;
my $temp = "";
foreach(@animtablez) {
if($_ == $animtable[$target] or $truetarget)
{
#print "truetarget! $animtable[$target]
";
$truetarget = 1;
if($_ != 0 and $_ != $animtable[$target]) {
$temp .= pack("V", $_ - $dsize)
} else {
$temp .= pack("V", $_)
}
} else {
$temp .= pack("V", $_)
}
}
print OUT $temp;
print "getting next tables
";
print OUT addtable($addname, $animtable[0]+$bac, $dsize);
sread($animtable[0]+$bac, $animtable[$target] - $animtable[0], $buffer);
print OUT $buffer;
print "getting new anim
";
read(NEWM, $buffer, $newsize);
print OUT $buffer;
my $insize = -s $ARGV[0];
print "getting data till EOF at $insize
";
sread($animtable[$target+1] + $bac, $insize - ($animtable[$target+1] + $bac), $buffer);
print OUT $buffer;
close(OUT);
close(NEWM);