|
1 | 1 | #include "scriptcommon.h" |
2 | 2 |
|
| 3 | +/* |
| 4 | +* Caskey, Damon V. |
| 5 | +* 2025-05-04 |
| 6 | +* |
| 7 | +* Handle float/double get and set casting. |
| 8 | +* |
| 9 | +* This is used because script-side uses double, |
| 10 | +* but property fields are floats, so we need to |
| 11 | +* downcast carefully to avoid memory overwrites. |
| 12 | +*/ |
| 13 | + |
| 14 | +static inline double property_access_get_property_float(const void* field) |
| 15 | +{ |
| 16 | + float value = *(float*)field; |
| 17 | + return (double)value; |
| 18 | +} |
| 19 | + |
| 20 | +static inline void property_access_set_property_float(const void* field, const double value) |
| 21 | +{ |
| 22 | + *(float*)field = (float)value; |
| 23 | + |
| 24 | + //printf("DEBUG: Writing %.6f to float field at %p\n", value, field); |
| 25 | +} |
| 26 | + |
3 | 27 | /* |
4 | 28 | * Caskey, Damon V. |
5 | 29 | * 2023-04-17 |
@@ -114,7 +138,7 @@ void property_access_dump_members(property_access_map get_property_map, const in |
114 | 138 |
|
115 | 139 | case VT_DECIMAL: |
116 | 140 |
|
117 | | - printf(" | %f", *(DOUBLE*)property_map.field); |
| 141 | + printf(" | %f", property_access_get_property_float(property_map.field)); |
118 | 142 | break; |
119 | 143 | case VT_STR: |
120 | 144 |
|
@@ -188,7 +212,9 @@ HRESULT property_access_get_member(const s_property_access_map* property_map, Sc |
188 | 212 | case VT_DECIMAL: |
189 | 213 |
|
190 | 214 | //printf("\n\t VT_DECIMAL"); |
191 | | - pretvar->dblVal = *(DOUBLE*)property_map->field; |
| 215 | + //pretvar->dblVal = *(DOUBLE*)property_map->field; |
| 216 | + pretvar->dblVal = property_access_get_property_float(property_map->field); |
| 217 | + |
192 | 218 | break; |
193 | 219 | case VT_STR: |
194 | 220 |
|
@@ -256,8 +282,11 @@ HRESULT property_access_set_member(const void* const acting_object, const s_prop |
256 | 282 | case VT_DECIMAL: |
257 | 283 |
|
258 | 284 | if (SUCCEEDED(ScriptVariant_DecimalValue(acting_value, &temp_float))) |
259 | | - { |
260 | | - *(DOUBLE*)property_map->field = temp_float; |
| 285 | + { |
| 286 | + property_access_set_property_float(property_map->field, temp_float); |
| 287 | + |
| 288 | + // Legacy. |
| 289 | + //*(float*)property_map->field = (float)temp_float; |
261 | 290 | } |
262 | 291 | break; |
263 | 292 |
|
|
0 commit comments