mirror of https://github.com/stella-emu/stella.git
189 lines
4.8 KiB
Perl
Executable File
189 lines
4.8 KiB
Perl
Executable File
package PropSet;
|
|
|
|
# NOTE: If the property types ever change in Stella, the following hashmap
|
|
# and array must be updated (and stay in sequence)
|
|
my %prop_type = (
|
|
"Cart.MD5" => 0,
|
|
"Cart.Manufacturer" => 1,
|
|
"Cart.ModelNo" => 2,
|
|
"Cart.Name" => 3,
|
|
"Cart.Note" => 4,
|
|
"Cart.Rarity" => 5,
|
|
"Cart.Sound" => 6,
|
|
"Cart.StartBank" => 7,
|
|
"Cart.Type" => 8,
|
|
"Cart.Highscore" => 9,
|
|
"Cart.Url" => 10,
|
|
"Console.LeftDiff" => 11,
|
|
"Console.RightDiff" => 12,
|
|
"Console.TVType" => 13,
|
|
"Console.SwapPorts" => 14,
|
|
"Controller.Left" => 15,
|
|
"Controller.Left1" => 16,
|
|
"Controller.Left2" => 17,
|
|
"Controller.Right" => 18,
|
|
"Controller.Right1" => 19,
|
|
"Controller.Right2" => 20,
|
|
"Controller.SwapPaddles" => 21,
|
|
"Controller.PaddlesXCenter" => 22,
|
|
"Controller.PaddlesYCenter" => 23,
|
|
"Controller.MouseAxis" => 24,
|
|
"Display.Format" => 25,
|
|
"Display.VCenter" => 26,
|
|
"Display.Phosphor" => 27,
|
|
"Display.PPBlend" => 28
|
|
);
|
|
my @prop_type_as_string = (
|
|
"Cart.MD5",
|
|
"Cart.Manufacturer",
|
|
"Cart.ModelNo",
|
|
"Cart.Name",
|
|
"Cart.Note",
|
|
"Cart.Rarity",
|
|
"Cart.Sound",
|
|
"Cart.StartBank",
|
|
"Cart.Type",
|
|
"Cart.Highscore",
|
|
"Cart.Url",
|
|
"Console.LeftDiff",
|
|
"Console.RightDiff",
|
|
"Console.TVType",
|
|
"Console.SwapPorts",
|
|
"Controller.Left",
|
|
"Controller.Left1",
|
|
"Controller.Left2",
|
|
"Controller.Right",
|
|
"Controller.Right1",
|
|
"Controller.Right2",
|
|
"Controller.SwapPaddles",
|
|
"Controller.PaddlesXCenter",
|
|
"Controller.PaddlesYCenter",
|
|
"Controller.MouseAxis",
|
|
"Display.Format",
|
|
"Display.VCenter",
|
|
"Display.Phosphor",
|
|
"Display.PPBlend"
|
|
);
|
|
|
|
my @prop_defaults = (
|
|
"", # Cart.MD5
|
|
"", # Cart.Manufacturer
|
|
"", # Cart.ModelNo
|
|
"", # Cart.Name
|
|
"", # Cart.Note
|
|
"", # Cart.Rarity
|
|
"MONO", # Cart.Sound
|
|
"AUTO", # Cart.StartBank
|
|
"AUTO", # Cart.Type
|
|
"", # Cart.Highscore
|
|
"", # Cart.Url
|
|
"B", # Console.LeftDiff
|
|
"B", # Console.RightDiff
|
|
"COLOR", # Console.TVType
|
|
"NO", # Console.SwapPorts
|
|
"", # Controller.Left
|
|
"", # Controller.Left1
|
|
"", # Controller.Left2
|
|
"", # Controller.Right
|
|
"", # Controller.Right1
|
|
"", # Controller.Right2
|
|
"NO", # Controller.SwapPaddles
|
|
"0", # Controller.PaddlesXCenter
|
|
"0", # Controller.PaddlesYCenter
|
|
"AUTO", # Controller.MouseAxis
|
|
"AUTO", # Display.Format
|
|
"0", # Display.VCenter
|
|
"NO", # Display.Phosphor
|
|
"0" # Display.PPBlend
|
|
);
|
|
|
|
# Load and parse a properties file into an hash table of property
|
|
# objects, indexed by md5sum
|
|
sub load_prop_set($) {
|
|
my $file = $_[0];
|
|
print "Loading properties from file: $file\n";
|
|
|
|
my @props = ();
|
|
while(($key, $value) = each(%prop_type)) {
|
|
$props[$value] = "";
|
|
}
|
|
|
|
my %propset = ();
|
|
open(INFILE, $file);
|
|
foreach $line (<INFILE>) {
|
|
chomp $line;
|
|
|
|
# Start a new item
|
|
if ($line =~ /^""/) {
|
|
my $key = $props[$prop_type{'Cartridge.MD5'}];
|
|
# print "Inserting properties for key = $key\n";
|
|
|
|
if(defined($propset{$key})) {
|
|
print "Duplicate: $key\n";
|
|
}
|
|
$propset{$key} = [ @props ];
|
|
|
|
undef @props;
|
|
while(($key, $value) = each(%prop_type)) {
|
|
$props[$value] = "";
|
|
}
|
|
} elsif ($line !~ /^$/) {
|
|
($key, $value) = ($line =~ m/"(.*)" "(.*)"/);
|
|
if (defined $prop_type{$key}) {
|
|
$index = $prop_type{$key};
|
|
$props[$index] = $value;
|
|
} else {
|
|
print "ERROR: $line\n";
|
|
print "Invalid key = \'$key\' for md5 = \'$props[0]\', ignoring ...\n";
|
|
}
|
|
}
|
|
}
|
|
close(INFILE);
|
|
return %propset;
|
|
}
|
|
|
|
# Load and parse a properties file into an hash table of property
|
|
# objects, indexed by md5sum
|
|
sub save_prop_set {
|
|
my $file = shift;
|
|
my $hashref = shift;
|
|
print "Saving " . keys(%$hashref) . " properties to file: $file\n";
|
|
|
|
open(OUTFILE, ">$file");
|
|
foreach my $md5 (sort keys %$hashref) {
|
|
my $props = %$hashref{$md5};
|
|
my @array = @$props;
|
|
for (my $i = 0; $i < @array; $i++) {
|
|
if ($array[$i] ne "") {
|
|
print OUTFILE "\"$prop_type_as_string[$i]\" \"$array[$i]\"\n";
|
|
}
|
|
}
|
|
print OUTFILE "\"\"\n\n";
|
|
}
|
|
close(OUTFILE);
|
|
}
|
|
|
|
# Get the number of property tags in one PropSet element
|
|
sub num_prop_types {
|
|
return keys( %prop_type );
|
|
}
|
|
|
|
# Convert a properties set into a C++ compatible string
|
|
sub build_prop_string {
|
|
my @array = @_;
|
|
my $result = " { ";
|
|
my @items = ();
|
|
for (my $i = 0; $i < @array; $i++) {
|
|
if($prop_defaults[$i] ne $array[$i]) {
|
|
push(@items, "\"$array[$i]\"");
|
|
} else {
|
|
push(@items, "\"\"");
|
|
}
|
|
}
|
|
|
|
$result .= join(", ", @items);
|
|
$result .= " }";
|
|
|
|
return $result;
|
|
}
|