Skip to content

Commit 9157c24

Browse files
Dmytro Lysaipingw33n
authored andcommitted
[script] Implement create_object_sid() properly
1 parent 39d53b0 commit 9157c24

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

src/vm/instruction/impls/game.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ use std::cmp;
88
use std::convert::{TryFrom, TryInto};
99

1010
use super::*;
11-
use crate::asset::{Flag, Perk, Skill, Stat, Trait};
11+
use crate::asset::{ExactEntityKind, Flag, Perk, Skill, Stat, Trait};
1212
use crate::asset::proto::ProtoId;
1313
use crate::asset::script::ProgramId;
1414
use crate::game::dialog::Dialog;
15-
use crate::game::object::{Object, SubObject};
1615
use crate::game::script::ScriptPId;
1716
use crate::game::world::floating_text;
1817
use crate::graphics::{EPoint, Point};
@@ -183,9 +182,9 @@ pub fn combat_is_initialized(ctx: Context) -> Result<()> {
183182
}
184183

185184
pub fn create_object_sid(ctx: Context) -> Result<()> {
186-
let sid = ctx.prg.data_stack.pop()?.into_int()?;
187-
let sid = if sid >= 0 {
188-
Some(ScriptPId::from_packed(sid as u32)
185+
let prg_id = ctx.prg.data_stack.pop()?.into_int()?;
186+
let prg_id = if prg_id >= 0 {
187+
Some(ProgramId::new(prg_id as u32)
189188
.ok_or(Error::BadValue(BadValue::Content))?)
190189
} else {
191190
None
@@ -203,17 +202,33 @@ pub fn create_object_sid(ctx: Context) -> Result<()> {
203202
Error::BadValue(BadValue::Content)
204203
})?;
205204

206-
// FIXME add proper impl
207-
let fid = proto.borrow().fid;
205+
let (fid, spid) = {
206+
let proto = proto.borrow();
207+
let fid = proto.fid;
208+
let kind = match proto.kind() {
209+
ExactEntityKind::Item(_) | ExactEntityKind::Scenery(_) => ScriptKind::Item,
210+
ExactEntityKind::Critter => ScriptKind::Critter,
211+
_ => ScriptKind::System,
212+
};
213+
let prg_id = prg_id.or_else(|| proto.script.map(|sid| {
214+
assert_eq!(sid.kind(), kind);
215+
sid.program_id()
216+
}));
217+
(fid, prg_id.map(|prg_id| ScriptPId::new(kind, prg_id)))
218+
};
219+
208220
let pos = ctx.ext.world.hex_grid().from_linear_inv(tile_num);
209221
let pos = pos.elevated(elevation);
210-
let obj = Object::new(fid, proto.into(), Some(pos), SubObject::None);
211-
let objh = ctx.ext.world.insert_object(obj);
222+
let objh = ctx.ext.world.new_object(fid, Some(proto), Some(pos), ctx.ext.rpg);
223+
if let Some(spid) = spid {
224+
let mut obj = ctx.ext.world.objects().get_mut(objh);
225+
let siid = ctx.ext.new_scripts.new_script(spid.kind(), spid.program_id());
226+
obj.script = Some((siid, spid.program_id()));
227+
}
212228

213229
ctx.prg.data_stack.push(Value::Object(Some(objh)))?;
214230

215-
log_a4r1!(ctx.prg, pid, tile_num, elevation, sid, objh);
216-
log_stub!(ctx.prg);
231+
log_a4r1!(ctx.prg, pid, tile_num, elevation, spid, objh);
217232

218233
Ok(())
219234
}

0 commit comments

Comments
 (0)