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} { proc float2fixed {flt} {
set whole [expr {int(float($flt))}] set whole [expr {int(double($flt))}]
set frac [expr {float($flt) - $whole}] set frac [expr {double($flt) - $whole}]
return [expr {($whole << 16) | int($frac * 65536)}] return [expr {($whole << 16) | int($frac * 65536)}]
} }
@@ -333,12 +333,16 @@ proc fullscanscheme {version} {
foreach weap $wa_weapons { foreach weap $wa_weapons {
set offs [dict get $weap offset] set offs [dict get $weap offset]
set offs [expr {int($offs)}] set offs [expr {int($offs)}]
# limit weapons for v1 schemes
if {($offs >= 0xDD) && ($version < 2)} {break}
set poweroffs [expr {$offs + 1}] set poweroffs [expr {$offs + 1}]
set delayoffs [expr {$offs + 2}] set delayoffs [expr {$offs + 2}]
set proboffs [expr {$offs + 3}] 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($offs) $ammo
set wsc_data($poweroffs) $power set wsc_data($poweroffs) $power
set wsc_data($delayoffs) $delay set wsc_data($delayoffs) $delay
@@ -393,6 +397,20 @@ proc savescheme {fname} {
# guard the version # guard the version
if {int($wsc_data(version)) < 1} {set wsc_data(version) 1} if {int($wsc_data(version)) < 1} {set wsc_data(version) 1}
if {int($wsc_data(version)) > 3} {set wsc_data(version) 3} 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 # write normal options
foreach opt $wa_opts { foreach opt $wa_opts {
set offs [dict get $opt offset] set offs [dict get $opt offset]
@@ -441,7 +459,6 @@ proc savescheme {fname} {
set val [float2fixed $val] set val [float2fixed $val]
} }
set binval [binary format $fmt $val] set binval [binary format $fmt $val]
set wsc_data($offs) $wscval
set rawschemedata [string replace $rawschemedata $offs [expr {$offs + $size - 1}] $binval] set rawschemedata [string replace $rawschemedata $offs [expr {$offs + $size - 1}] $binval]
} }
} }