From b6cf77b296c5d4d4e313a3f1871b47312d36f598 Mon Sep 17 00:00:00 2001 From: Luxferre Date: Sat, 12 Oct 2024 14:20:07 +0300 Subject: [PATCH] Version converter fix --- armagedec.tcl | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/armagedec.tcl b/armagedec.tcl index 599ab73..15817cc 100755 --- a/armagedec.tcl +++ b/armagedec.tcl @@ -299,8 +299,8 @@ proc fixed2float {fpint} { } proc float2fixed {flt} { - set whole [expr {int(float($flt))}] - set frac [expr {float($flt) - $whole}] + set whole [expr {int(double($flt))}] + set frac [expr {double($flt) - $whole}] return [expr {($whole << 16) | int($frac * 65536)}] } @@ -333,12 +333,16 @@ proc fullscanscheme {version} { foreach weap $wa_weapons { set offs [dict get $weap offset] set offs [expr {int($offs)}] - # limit weapons for v1 schemes - if {($offs >= 0xDD) && ($version < 2)} {break} set poweroffs [expr {$offs + 1}] set delayoffs [expr {$offs + 2}] set proboffs [expr {$offs + 3}] - binary scan [string range $rawschemedata $offs [expr {$offs + 4}]] cucucucu ammo power delay prob + set ammo 0 + set power 0 + set delay 0 + set prob 0 + catch { + binary scan [string range $rawschemedata $offs [expr {$offs + 4}]] cucucucu ammo power delay prob + } set wsc_data($offs) $ammo set wsc_data($poweroffs) $power set wsc_data($delayoffs) $delay @@ -393,6 +397,20 @@ proc savescheme {fname} { # guard the version if {int($wsc_data(version)) < 1} {set wsc_data(version) 1} if {int($wsc_data(version)) > 3} {set wsc_data(version) 3} + # detect the target size + set datasize 221 + if {int($wsc_data(version)) eq 2} {set datasize 297} + if {int($wsc_data(version)) eq 3} {set datasize 407} + # expand/truncate rawschemedata according to the detected size + set diffbytes [expr {$datasize - [string length $rawschemedata]}] + if {$diffbytes > 0} { # expand with nulls + set rawschemedata [string cat $rawschemedata [binary format x$diffbytes]] + } else { # truncate + set rawschemedata [string range 0 [expr {$datasize - 1}] + } + # write the version itself + set binval [binary format cu $wsc_data(version)] + set rawschemedata [string replace $rawschemedata 4 4 $binval] # write normal options foreach opt $wa_opts { set offs [dict get $opt offset] @@ -441,7 +459,6 @@ proc savescheme {fname} { set val [float2fixed $val] } set binval [binary format $fmt $val] - set wsc_data($offs) $wscval set rawschemedata [string replace $rawschemedata $offs [expr {$offs + $size - 1}] $binval] } }