@@ -298,30 +298,20 @@ impl LocalDiffModelTracker {
298
298
. map ( |( e, _) | e. clone ( ) )
299
299
. collect :: < Vec < GameEffectData > > ( ) ;
300
300
301
- let filename = entity. filename ( ) ?;
302
- info. current_stains = if [
303
- "data/entities/items/pickup/physics_die.xml" ,
304
- "data/entities/items/pickup/physics_die_greed.xml" ,
305
- ]
306
- . contains ( & & * filename)
307
- {
308
- if entity
309
- . get_var ( "rolling" )
310
- . map ( |v| v. value_int ( ) . unwrap_or ( 0 ) < 8 )
311
- . unwrap_or ( false )
312
- && entity
313
- . try_get_first_component :: < SpriteComponent > ( Some ( "enable_in_world" . into ( ) ) ) ?
314
- . map ( |s| s. rect_animation ( ) . unwrap_or ( "" . into ( ) ) == "roll" )
315
- . unwrap_or ( false )
316
- {
301
+ info. current_stains = if let Some ( var) = entity. get_var ( "rolling" ) {
302
+ if var. value_int ( ) ? == 0 {
317
303
let rng = rand:: random :: < i32 > ( ) ;
318
- let var = entity. add_component :: < VariableStorageComponent > ( ) ?;
319
- var. set_name ( "ew_rng" . into ( ) ) ?;
304
+ let var = entity. get_var_or_default ( "ew_rng" ) ?;
320
305
var. set_value_int ( rng) ?;
321
306
let bytes = rng. to_le_bytes ( ) ;
322
307
u64:: from_le_bytes ( [ 0 , 0 , 0 , 0 , bytes[ 0 ] , bytes[ 1 ] , bytes[ 2 ] , bytes[ 3 ] ] )
323
308
} else {
324
- info. current_stains
309
+ let bytes = info. current_stains . to_le_bytes ( ) ;
310
+ if bytes[ 0 ] == 0 {
311
+ u64:: from_le_bytes ( [ 1 , 0 , 0 , 0 , bytes[ 4 ] , bytes[ 5 ] , bytes[ 6 ] , bytes[ 7 ] ] )
312
+ } else {
313
+ info. current_stains
314
+ }
325
315
}
326
316
} else {
327
317
entity. get_current_stains ( ) ?
@@ -493,7 +483,7 @@ impl LocalDiffModel {
493
483
let spawn_info = match entity_kind {
494
484
EntityKind :: Normal => EntitySpawnInfo :: Filename ( entity. filename ( ) ?) ,
495
485
EntityKind :: Item => EntitySpawnInfo :: Serialized {
496
- serialized_at : noita_api :: raw :: game_get_frame_num ( ) ?,
486
+ serialized_at : game_get_frame_num ( ) ?,
497
487
data : serialize_entity ( entity) ?,
498
488
} ,
499
489
} ;
@@ -1275,20 +1265,37 @@ impl RemoteDiffModel {
1275
1265
1276
1266
entity. set_game_effects ( & entity_info. game_effects ) ?;
1277
1267
1278
- let filename = entity. filename ( ) ?;
1279
- if [
1280
- "data/entities/items/pickup/physics_die.xml" ,
1281
- "data/entities/items/pickup/physics_die_greed.xml" ,
1282
- ]
1283
- . contains ( & & * filename)
1284
- {
1285
- if entity. iter_all_components_of_type_including_disabled :: < VariableStorageComponent > ( None ) ?. all ( |var| var. name ( ) . unwrap_or ( "" . into ( ) ) != "ew_rng" ) {
1286
- let var = entity. add_component :: < VariableStorageComponent > ( ) ?;
1287
- var. set_name ( "ew_rng" . into ( ) ) ?;
1288
- let bytes = entity_info. current_stains . to_le_bytes ( ) ;
1289
- let bytes: [ u8 ; 4 ] = [ bytes[ 4 ] , bytes[ 5 ] , bytes[ 6 ] , bytes[ 7 ] ] ;
1290
- let rng = i32:: from_le_bytes ( bytes) ;
1291
- var. set_value_int ( rng) ?;
1268
+ if entity. get_var ( "rolling" ) . is_some ( ) {
1269
+ let var = entity. get_var_or_default ( "ew_rng" ) ?;
1270
+ let bytes = entity_info. current_stains . to_le_bytes ( ) ;
1271
+ let is_rolling = bytes[ 0 ] ;
1272
+ let bytes: [ u8 ; 4 ] = [ bytes[ 4 ] , bytes[ 5 ] , bytes[ 6 ] , bytes[ 7 ] ] ;
1273
+ let rng = i32:: from_le_bytes ( bytes) ;
1274
+ var. set_value_int ( rng) ?;
1275
+ let var = entity. get_var_or_default ( "rolling" ) ?;
1276
+ if is_rolling == 1 {
1277
+ if var. value_int ( ) ? == 0 {
1278
+ var. set_value_int ( 4 ) ?;
1279
+ entity
1280
+ . iter_all_components_of_type :: < SpriteComponent > ( None ) ?
1281
+ . for_each ( |s| {
1282
+ let _ = s. set_rect_animation ( "roll" . into ( ) ) ;
1283
+ } )
1284
+ } else if var. value_int ( ) ? == 8 {
1285
+ let ( x, y) = entity. position ( ) ?;
1286
+ if !noita_api:: raw:: entity_get_in_radius_with_tag (
1287
+ x as f64 ,
1288
+ y as f64 ,
1289
+ 480.0 ,
1290
+ "player_unit" . into ( ) ,
1291
+ ) ?
1292
+ . is_empty ( )
1293
+ {
1294
+ game_print ( "$item_die_roll" ) ;
1295
+ }
1296
+ }
1297
+ } else {
1298
+ var. set_value_int ( 0 ) ?;
1292
1299
}
1293
1300
} else {
1294
1301
entity. set_current_stains ( entity_info. current_stains ) ?;
@@ -1578,6 +1585,7 @@ pub fn init_remote_entity(
1578
1585
"data/scripts/animals/leader_damage.lua" ,
1579
1586
"data/scripts/animals/giantshooter_death.lua" ,
1580
1587
"data/scripts/animals/blob_damage.lua" ,
1588
+ "data/scripts/items/die_roll.lua" ,
1581
1589
]
1582
1590
. contains ( & & * lua. script_damage_received ( ) ?)
1583
1591
|| [
@@ -1587,6 +1595,8 @@ pub fn init_remote_entity(
1587
1595
"data/scripts/buildings/spidernest.lua" ,
1588
1596
]
1589
1597
. contains ( & & * lua. script_source_file ( ) ?)
1598
+ || [ "data/scripts/items/die_roll.lua" ] . contains ( & & * lua. script_enabled_changed ( ) ?)
1599
+ || [ "data/scripts/items/die_roll.lua" ] . contains ( & & * lua. script_kick ( ) ?)
1590
1600
{
1591
1601
entity. remove_component ( * lua) ?;
1592
1602
}
@@ -1623,7 +1633,7 @@ pub fn init_remote_entity(
1623
1633
if name == "ew_gid_lid" {
1624
1634
let _ = entity. remove_component ( * var) ;
1625
1635
} else if name == "throw_time" {
1626
- let _ = var. set_value_int ( game_get_frame_num ( ) . unwrap_or ( 0 ) ) ;
1636
+ let _ = var. set_value_int ( game_get_frame_num ( ) . unwrap_or ( 0 ) - 4 ) ;
1627
1637
}
1628
1638
} ) ;
1629
1639
0 commit comments