Battlefield Vietnam

From LANCommander
Revision as of 00:38, 22 February 2024 by DoctorDalek (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Developers
Digital Illusions CE: Canada
Publishers
Electronic Arts
Release Date
Windows: March 14, 2004
Genres
Shooter
View at PCGamingWiki

Actions

Name Path Arguments Working Directory Primary
Play Battlefield Vietnam {InstallDir}\BfVietnam.exe True

Install Script

Automatically sets the 4:3 resolution for the current display in video settings. Make sure to copy the ProfileTemplate as described in the name change script.

# Bounds are accessible by $Display.Bounds.Width and $Display.Bounds.Height
#$Display = Get-PrimaryDisplay

# Bounds accessible via $Resolution.Height, $Resolution.Width
#$Resolution = Convert-AspectRatio -Width $Display.Bounds.Width -Height $Display.Bounds.Height -AspectRatio (4 / 3)

#Copy-Item -Path "$InstallDirectory\ProfileTemplate\Video.con" -Destination "$InstallDirectory\Mods\BfVietnam\settings\Video.con" -Force

# Use regex to replace text within a file. Quotes are escaped by double quoting ("")
#Write-ReplaceContentInFile -Pattern '^game.setGameDisplayMode (.+)' -Substitution "game.setGameDisplayMode $($Resolution.Width) $($Resolution.Height) 32 0" -FilePath "$InstallDirectory\Mods\BfVietname\settings\Video.con"



#######################################################################
#Updates Screen Resolution to match desktop resolution
#######################################################################

$Config1 = "$InstallDirectory\ProfileTemplate\Video.con"
$Config2 = "$InstallDirectory\ProfileTemplate\VideoCustom.con"
$Config3 = "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\Custom\Video.con"
$Config4 = "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\Custom\VideoCustom.con"

# Bounds are accessible by $Display.Bounds.Width and $Display.Bounds.Height
$Display = Get-PrimaryDisplay

# Use regex to replace text within a file. Quotes are escaped by double quoting ("")
Write-ReplaceContentInFile -Pattern '^game.setGameDisplayMode (.+)' -Substitution "game.setGameDisplayMode $($Display.Bounds.Width) $($Display.Bounds.Height) 32 60" -FilePath "$Config1"
Write-ReplaceContentInFile -Pattern '^game.setGameDisplayMode (.+)' -Substitution "game.setGameDisplayMode $($Display.Bounds.Width) $($Display.Bounds.Height) 32 60" -FilePath "$Config2"
Write-ReplaceContentInFile -Pattern '^game.setGameDisplayMode (.+)' -Substitution "game.setGameDisplayMode $($Display.Bounds.Width) $($Display.Bounds.Height) 32 0" -FilePath "$Config3"
Write-ReplaceContentInFile -Pattern '^game.setGameDisplayMode (.+)' -Substitution "game.setGameDisplayMode $($Display.Bounds.Width) $($Display.Bounds.Height) 32 0" -FilePath "$Config4"

#######################################################################

#Patch exe for desktop resolution for menus
# Default was 800x600
#######################################################################
[uint32]$Width = $Display.Bounds.Width
[uint32]$Height = $Display.Bounds.Height

# Note: Codepage 28591 returns a 1-to-1 char to byte mapping
$Encoding = [Text.Encoding]::GetEncoding(28591)

function fileToString($path) {
    $Stream = New-Object IO.FileStream -ArgumentList (Resolve-Path $path), 'Open', 'Read'    
    $StreamReader = New-Object IO.StreamReader -ArgumentList $Stream, $Encoding
    $BinaryText = $StreamReader.ReadToEnd()
    $StreamReader.Close()
    $Stream.Close()
    return $BinaryText
}

function asBytesLE($lengthDecimal) {
    $lengthAsBytes = [BitConverter]::getBytes($lengthDecimal)
    # Convert to little-endian (switch order of bytes) if system is big-endian
    if (![BitConverter]::IsLittleEndian) {
        $lengthAsBytes = [Array]::reverse($lengthAsBytes)
    }
    return $lengthAsBytes;
}

function bytesAsString($bytes) {
    return $Encoding.GetString($bytes)
}

$WidthString = bytesAsString(asBytesLE($Width))
$HeightString = bytesAsString(asBytesLE($Height))

$BinaryString = fileToString("$InstallDirectory\BfVietnam.exe")

# \xnn Matches an ASCII character, where nn is a two-digit hexadecimal character code.
$HotpatchableRegex = [Regex] '(\x20\x03\x00\x00)(?<keep>\xC7.{2,3})(\x58\x02\x00\x00)'
$matches = $HotpatchableRegex.Matches($BinaryString)

# First group (old width) is replaced with new width; second is kept the same; third group (old height) is replaced with new height
# Had to escape dollar with backticks, as it's regex matcher group, not powershell variable
# Had to use named group, otherwise heightString value as bytes might interfere (depending on what it is)
$Replacement = "${WidthString}`${keep}${HeightString}"

$Result = $HotpatchableRegex.Replace($BinaryString, $Replacement)
$ResultBytes = $Encoding.GetBytes($Result)
[System.IO.File]::WriteAllBytes("$InstallDirectory\BfVietnam.exe", $ResultBytes); -froce

Name Change Script

This script will automatically rename the old name's profile or it will scaffold a new one from a template profile located in the install directory with the name ProfileTemplate. To create this, create a profile in the game called "ProfileTemplate". Exit the game and copy the Mods/BfVietnam/settings/Profiles/ProfileTemplate directory to the root of the install.

# Clear out any existing profile with the same name
Remove-Item "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$NewPlayerAlias" -Recurse -ErrorAction Ignore

if ($OldPlayerAlias -ne "") {
    if (Test-Path -Path "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$OldPlayerAlias") {
        # Profile exists with old name
        Move-Item -Path "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$OldPlayerAlias" -Destination "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$NewPlayerAlias" -Force
    } else {
        # Old profile doesn't exist, scaffold a new one
        Copy-Item -Path "$InstallDirectory\ProfileTemplate" -Destination "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$NewPlayerAlias" -Recurse
    }
} else {
    # New install, scaffold new profile
    Copy-Item -Path "$InstallDirectory\ProfileTemplate" -Destination "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$NewPlayerAlias" -Recurse
}

Write-ReplaceContentInFile -Pattern 'rem \*\* (.+) \*\*' -Substitution "rem ** $NewPlayerAlias **" -FilePath "$InstallDirectory\Mods\BfVietnam\Settings\Profile.con"
Write-ReplaceContentInFile -Pattern 'game.setProfile "(.+)"' -Substitution "game.setProfile ""$NewPlayerAlias""" -FilePath "$InstallDirectory\Mods\BfVietnam\Settings\Profile.con"

Write-ReplaceContentInFile -Pattern 'game.setPlayerName "(.+)"' -Substitution "game.setPlayerName ""$NewPlayerAlias""" -FilePath "$InstallDirectory\Mods\BfVietnam\Settings\Profiles\$NewPlayerAlias\GeneralOptions.con"

Key Change Script

$VirtualStore = "registry::\HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE"

$AllocatedKey = $AllocatedKey.Replace("-", "")

New-Item -Path "$VirtualStore\WOW6432Node\Electronic Arts"
New-Item -Path "$VirtualStore\WOW6432Node\Electronic Arts\EA Games"
New-Item -Path "$VirtualStore\WOW6432Node\Electronic Arts\EA Games\Battlefield Vietnam"
New-Item -Path "$VirtualStore\WOW6432Node\Electronic Arts\EA Games\Battlefield Vietnam\ergc"
New-ItemProperty -Path "$VirtualStore\WOW6432Node\Electronic Arts\EA Games\Battlefield Vietnam\ergc" -Value "$AllocatedKey" -Force