@@ -8,11 +8,10 @@ use std::cmp;
8
8
use std:: convert:: { TryFrom , TryInto } ;
9
9
10
10
use super :: * ;
11
- use crate :: asset:: { Flag , Perk , Skill , Stat , Trait } ;
11
+ use crate :: asset:: { ExactEntityKind , Flag , Perk , Skill , Stat , Trait } ;
12
12
use crate :: asset:: proto:: ProtoId ;
13
13
use crate :: asset:: script:: ProgramId ;
14
14
use crate :: game:: dialog:: Dialog ;
15
- use crate :: game:: object:: { Object , SubObject } ;
16
15
use crate :: game:: script:: ScriptPId ;
17
16
use crate :: game:: world:: floating_text;
18
17
use crate :: graphics:: { EPoint , Point } ;
@@ -183,9 +182,9 @@ pub fn combat_is_initialized(ctx: Context) -> Result<()> {
183
182
}
184
183
185
184
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 )
189
188
. ok_or ( Error :: BadValue ( BadValue :: Content ) ) ?)
190
189
} else {
191
190
None
@@ -203,17 +202,33 @@ pub fn create_object_sid(ctx: Context) -> Result<()> {
203
202
Error :: BadValue ( BadValue :: Content )
204
203
} ) ?;
205
204
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
+
208
220
let pos = ctx. ext . world . hex_grid ( ) . from_linear_inv ( tile_num) ;
209
221
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
+ }
212
228
213
229
ctx. prg . data_stack . push ( Value :: Object ( Some ( objh) ) ) ?;
214
230
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) ;
217
232
218
233
Ok ( ( ) )
219
234
}
0 commit comments