Skip to content

Commit 2973b0c

Browse files
committed
fix dice
1 parent f98b00b commit 2973b0c

File tree

3 files changed

+71
-42
lines changed

3 files changed

+71
-42
lines changed

ewext/noita_api/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ impl EntityID {
225225
.unwrap_or(None)
226226
}
227227

228+
pub fn get_var_or_default(self, name: &str) -> eyre::Result<VariableStorageComponent> {
229+
if let Some(var) = self.get_var(name) {
230+
Ok(var)
231+
} else {
232+
let var = self.add_component::<VariableStorageComponent>()?;
233+
var.set_name(name.into())?;
234+
Ok(var)
235+
}
236+
}
237+
228238
pub fn add_lua_init_component<C: Component>(self, file: &str) -> eyre::Result<C> {
229239
raw::entity_add_lua_init_component::<C>(self, file)?
230240
.ok_or_eyre("Couldn't create a component")

ewext/src/modules/entity_sync/diff_model.rs

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -298,30 +298,20 @@ impl LocalDiffModelTracker {
298298
.map(|(e, _)| e.clone())
299299
.collect::<Vec<GameEffectData>>();
300300

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 {
317303
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")?;
320305
var.set_value_int(rng)?;
321306
let bytes = rng.to_le_bytes();
322307
u64::from_le_bytes([0, 0, 0, 0, bytes[0], bytes[1], bytes[2], bytes[3]])
323308
} 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+
}
325315
}
326316
} else {
327317
entity.get_current_stains()?
@@ -493,7 +483,7 @@ impl LocalDiffModel {
493483
let spawn_info = match entity_kind {
494484
EntityKind::Normal => EntitySpawnInfo::Filename(entity.filename()?),
495485
EntityKind::Item => EntitySpawnInfo::Serialized {
496-
serialized_at: noita_api::raw::game_get_frame_num()?,
486+
serialized_at: game_get_frame_num()?,
497487
data: serialize_entity(entity)?,
498488
},
499489
};
@@ -1275,20 +1265,37 @@ impl RemoteDiffModel {
12751265

12761266
entity.set_game_effects(&entity_info.game_effects)?;
12771267

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)?;
12921299
}
12931300
} else {
12941301
entity.set_current_stains(entity_info.current_stains)?;
@@ -1578,6 +1585,7 @@ pub fn init_remote_entity(
15781585
"data/scripts/animals/leader_damage.lua",
15791586
"data/scripts/animals/giantshooter_death.lua",
15801587
"data/scripts/animals/blob_damage.lua",
1588+
"data/scripts/items/die_roll.lua",
15811589
]
15821590
.contains(&&*lua.script_damage_received()?)
15831591
|| [
@@ -1587,6 +1595,8 @@ pub fn init_remote_entity(
15871595
"data/scripts/buildings/spidernest.lua",
15881596
]
15891597
.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()?)
15901600
{
15911601
entity.remove_component(*lua)?;
15921602
}
@@ -1623,7 +1633,7 @@ pub fn init_remote_entity(
16231633
if name == "ew_gid_lid" {
16241634
let _ = entity.remove_component(*var);
16251635
} 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);
16271637
}
16281638
});
16291639

quant.ew/files/system/dice/dice.lua

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
1+
local s = "local function get_num()\n"
2+
.. "local var\n"
3+
.. 'for _, v in ipairs(EntityGetComponentIncludingDisabled(entity_id, "VariableStorageComponent") or {}) do\n'
4+
.. 'if ComponentGetValue2(v, "name") == "ew_rng" then\n'
5+
.. "var = v\n"
6+
.. "end\n"
7+
.. "end\n"
8+
.. "if var ~= nil then\n"
9+
.. 'return ComponentGetValue2(var, "value_int")\n'
10+
.. "else\n"
11+
.. "return 0\n"
12+
.. "end\n"
13+
.. "end\n"
14+
.. "SetRandomSeed(get_num(), 0)"
115
util.prepend(
216
"data/scripts/items/greed_die_status.lua",
317
"SetRandomSeed( GameGetFrameNum(), pos_x + pos_y + entity_id )",
4-
'local function get_num() if get_variable_storage_component(entity_id, "ew_rng") then return ComponentGetValue2(get_variable_storage_component(entity_id, "ew_rng"), "value_int") else return 0 end end SetRandomSeed(get_num(), 0)'
5-
)
6-
util.prepend(
7-
"data/scripts/items/die_status.lua",
8-
"SetRandomSeed( GameGetFrameNum(), pos_x + pos_y + entity_id )",
9-
'local function get_num() if get_variable_storage_component(entity_id, "ew_rng") then return ComponentGetValue2(get_variable_storage_component(entity_id, "ew_rng"), "value_int") else return 0 end end SetRandomSeed(get_num(), 0)'
18+
s
1019
)
20+
util.prepend("data/scripts/items/die_status.lua", "SetRandomSeed( GameGetFrameNum(), pos_x + pos_y + entity_id )", s)
1121
util.prepend(
1222
"data/scripts/items/die_status.lua",
1323
'bullet_circle( "fungus", 8, 300 )',
1424
'if CrossCall("ew_do_i_own", entity_id) then bullet_circle("fungus", 8, 300) end'
1525
)
16-
1726
return {}

0 commit comments

Comments
 (0)