Files
swg-src/tools/perllib/VehicleCustomizationVariableGenerator.pm
2015-08-01 22:04:39 -05:00

292 lines
9.5 KiB
Perl

# ======================================================================
# VehicleCustomizationVariableGenerator.pm
# Copyright 2003, Sony Online Entertainment
# All rights reserved.
# ======================================================================
package VehicleCustomizationVariableGenerator;
use strict;
use CustomizationVariableCollector;
use Perforce;
use TreeFile;
# ======================================================================
# VehicleCustomizationVariableGenerator public variables.
# ======================================================================
# our $relativePathName;
# ======================================================================
# Setup variables that can be imported by Exporter into user modules.
# ======================================================================
use vars qw(@ISA @EXPORT_OK $VERSION);
use Exporter;
$VERSION = 1.00;
@ISA = qw(Exporter);
# These symbols are okay to export if specifically requested.
#@EXPORT_OK = qw(&buildFileLookupTable &saveFileLookupTable &loadFileLookupTable &getFullPathName);
@EXPORT_OK = qw(&install &collectData);
# ======================================================================
# VehicleCustomizationVariableGenerator private variables.
# ======================================================================
# my %handlerByTag;
my $debug = 0;
my %variableInfoByName;
my %vehicleSatToSaddleAppearanceMap;
# ======================================================================
# VehicleCustomizationVariableGenerator public functions.
# ======================================================================
sub install
{
}
# ----------------------------------------------------------------------
sub loadVehicleCustomizations
{
# Process args.
my $customizationsFileName = shift;
my $fileHandle;
open($fileHandle, '< ' . $customizationsFileName) or die "failed to load vehicle variable customizations file [$customizationsFileName]: $!";
# Skip first two lines: the tab file header.
$_ = <$fileHandle>;
$_ = <$fileHandle>;
# Grab all variable definitions.
while (<$fileHandle>)
{
chomp;
# Pattern: <name>\t<min val>\t<max val>\t<default>\t<conversion comment>
if (m/([^\t]+)\t([^\t]+)\t([^\t]+)\t([^\t]+)\t/)
{
my $name = $1;
my $minValue = $2;
my $maxValue = $3;
my $defaultValue = $4;
print "vehicle customization definition: var=[$name], min=[$minValue], max=[$maxValue], default=[$defaultValue].\n" if $debug;
$variableInfoByName{$name} = $minValue . ':' . $maxValue . ':' . $defaultValue;
print "assigned as [$variableInfoByName{$name}]\n" if $debug;
}
else
{
print STDERR "failed to parse vehicle customization entry [$_] in file [$customizationsFileName]\n";
}
}
close($fileHandle) or die "failed to close file handle for [$customizationsFileName]: $!";
}
# ----------------------------------------------------------------------
sub applyCustomizationsToVehicles
{
# Handle args.
my $appearanceTableFileName = shift;
my $fileHandle;
open($fileHandle, '< ' . $appearanceTableFileName) or die "failed to load vehicle variable customizations file [$appearanceTableFileName]: $!";
# Skip first two lines: the tab file header.
$_ = <$fileHandle>;
$_ = <$fileHandle>;
# Get keys for the vehicle info array.
my @variableNameArray = sort keys %variableInfoByName;
# Loop through all appearances.
my @saddleAppearanceNameArray;
while (<$fileHandle>)
{
chomp;
if (m/^(\S+)/)
{
my $appearanceName = $1;
print "vehicle appearance: processing [$appearanceName]\n" if $debug;
foreach my $variableName (@variableNameArray)
{
my $variableInfo = $variableInfoByName{$variableName};
my @variableInfoArray = split /:/, $variableInfo;
my $variableCount = scalar(@variableInfoArray);
die "Internal error: variableInfoArray does not contain expected 3 elements [$variableCount]" if $variableCount != 3;
my $minValueInclusive = $variableInfoArray[0];
my $maxValueExclusive = $variableInfoArray[1];
my $defaultValue = $variableInfoArray[2];
CustomizationVariableCollector::logBasicRangedIntVariable($appearanceName, $variableName, $minValueInclusive, $maxValueExclusive, $defaultValue);
}
# Link this .sat appearance name to all saddle appearances (non-sat, static)
# so that the top-level .sat appearance appears to expose all the customization
# variables exposed by the non-sat, visible vehicle saddle appearances.
my $nameArrayString = $vehicleSatToSaddleAppearanceMap{$appearanceName};
if (defined($nameArrayString))
{
@saddleAppearanceNameArray = split(/:/, $nameArrayString);
foreach my $saddleAppearanceName (@saddleAppearanceNameArray)
{
CustomizationVariableCollector::logAssetLink($appearanceName, $saddleAppearanceName);
}
}
}
}
}
# ----------------------------------------------------------------------
sub buildSatLinkageMap
{
# Setup args.
my $logicalSaddleNameMapFileName = shift;
my $saddleAppearanceMapFileName = shift;
# Load mapping of mount/vehicle appearance to logical saddle name.
# This can be a one to many mapping.
my %appearanceToLsmMap;
my $fileHandle;
my @columns;
open($fileHandle, '< ' . $logicalSaddleNameMapFileName) or die "buildSatLinkageMap(): could not open file [$logicalSaddleNameMapFileName]: $!";
# Skip first two lines: the tab file header.
$_ = <$fileHandle>;
$_ = <$fileHandle>;
# Loop through rest of file.
while (<$fileHandle>)
{
# Remove end of line.
chomp();
# Break line entry into array elements based on tab.
@columns = split(/\t/);
# Column 0 is sat_or_skt_name
# Column 1 is logical_saddle_name
my $appearanceName = $columns[0];
my $logicalSaddleName = $columns[1];
# Add mapping.
if (exists $appearanceToLsmMap{$appearanceName})
{
$appearanceToLsmMap{$appearanceName} .= ':' . $logicalSaddleName;
}
else
{
$appearanceToLsmMap{$appearanceName} = $logicalSaddleName;
}
}
close($fileHandle) or die "buildSatLinkageMap(): could not close file [$logicalSaddleNameMapFileName]: $!";
# Load mapping of logical saddle name to saddle appearance name.
# This can be a one to many mapping.
my %lsmToSaddleAppearanceMap;
open($fileHandle, '< ' . $saddleAppearanceMapFileName) or die "buildSatLinkageMap(): could not open file [$saddleAppearanceMapFileName]: $!";
# Skip first two lines: the tab file header.
$_ = <$fileHandle>;
$_ = <$fileHandle>;
# Loop through contents.
while (<$fileHandle>)
{
# Remove end of line.
chomp();
# Break line entry into array elements based on tab.
@columns = split(/\t/);
# Column 0 is logical_saddle_name
# Column 2 is saddle_appearance_name
my $logicalSaddleName = $columns[0];
my $saddleAppearanceName = $columns[2];
# add mapping
if (exists $lsmToSaddleAppearanceMap{$logicalSaddleName})
{
$lsmToSaddleAppearanceMap{$logicalSaddleName} .= ':' . $saddleAppearanceName;
}
else
{
$lsmToSaddleAppearanceMap{$logicalSaddleName} = $saddleAppearanceName;
}
}
close($fileHandle) or die "buildSatLinkageMap(): could not close file [$saddleAppearanceMapFileName]: $!";
# Finally, build global mapping of vehicle appearance name to saddle appearance names.
# This is a one to many mapping.
my @logicalSaddleNameArray;
my @saddleAppearanceNameArray;
foreach my $vehicleAppearanceName (keys %appearanceToLsmMap)
{
my $lsmArrayString = $appearanceToLsmMap{$vehicleAppearanceName};
@logicalSaddleNameArray = split(/:/, $lsmArrayString);
foreach my $logicalSaddleName (@logicalSaddleNameArray)
{
my $appearanceArrayString = $lsmToSaddleAppearanceMap{$logicalSaddleName};
next if !defined($appearanceArrayString);
@saddleAppearanceNameArray = split(/:/, $appearanceArrayString);
foreach my $saddleAppearanceName (@saddleAppearanceNameArray)
{
# Add a mapping from the vehicle appearance name to this saddle appearance name.
if (exists $vehicleSatToSaddleAppearanceMap{$logicalSaddleName})
{
$vehicleSatToSaddleAppearanceMap{$vehicleAppearanceName} .= ':' . $saddleAppearanceName;
}
else
{
$vehicleSatToSaddleAppearanceMap{$vehicleAppearanceName} = $saddleAppearanceName;
}
}
}
}
}
# ----------------------------------------------------------------------
sub collectData
{
# Process args. Default the branch to "current" if not specified.
my $branch = shift;
$branch = "current" if !defined($branch);
# Constants.
my $vehicleDataP4Root = "//depot/swg/$branch/dsrc/sku.0/sys.shared/compiled/game/customization/";
# Load up the vehicle customizations to associate with every ridable vehicle.
my $customizationsFileName = Perforce::findOnDiskFileName($vehicleDataP4Root . "vehicle_customizations.tab");
loadVehicleCustomizations($customizationsFileName);
# Load up mapping of vehicle .sat appearance (invisible) to vehicle saddle appearance (visible).
# This is a one-to-many mapping.
my $saddleDataP4Root = "//depot/swg/$branch/dsrc/sku.0/sys.shared/compiled/game/datatables/mount/";
my $logicalSaddleNameMapFileName = Perforce::findOnDiskFileName($saddleDataP4Root . "logical_saddle_name_map.tab");
my $saddleAppearanceMapFileName = Perforce::findOnDiskFileName($saddleDataP4Root . "saddle_appearance_map.tab");
buildSatLinkageMap($logicalSaddleNameMapFileName, $saddleAppearanceMapFileName);
# Add appropriate variable declarations for each vehicle appearance listed in the vehicle appearances table.
my $appearanceTableFileName = Perforce::findOnDiskFileName($vehicleDataP4Root . "vehicle_appearances.tab");
applyCustomizationsToVehicles($appearanceTableFileName);
}
# ======================================================================
1;