Version converter fix

This commit is contained in:
Luxferre
2024-10-12 14:20:07 +03:00
parent a8d3413e8c
commit b6cf77b296
+23 -6
View File
@@ -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]
}
}