Prev: 51892 Up: Map Next: 52044
51968: Set up 'interactable' objects in current room
Used by the routine at 51359.
Deal with any objects from the room item table at 26512 that are present in the room. These are 'non-scenery' objects that Maroc or the servant can interact with.
This routine determines if an item is stationary (sitting on the floor of the room), carried by the servant, or falling/flying after being dropped by the servant.
51968 LD HL,(60228) Get item's data pointer for the room item table at 29551
51971 CALL 56959 Check room object table at 29551 to see if any items are in this room. If so, copy the item data into working buffer at 60293.
51974 LD A,(60304) For visible room objects, this is the graphic number (offset for address table at 38851)
51977 CP 124 Byte value 124 = the object is not visible (yet),e.g. a key inside a chest
51979 JR Z,51989
Object is visible on screen - get object's colour
51981 LD A,(60299) Get the colour attribute of the object
51984 AND 15 Keep the INK colour (0-7), and bit 3, which is set for objects that flash (change colour)
51986 LD (60072),A ...and store
Check if item is being carried by the servant
51989 LD A,(60238) Item properties byte
51992 LD C,A Temp store in C register
51993 AND 16 Check if this item is carried by the servant - bit 4 (16) set
51995 JR NZ,52005 If so, check/calculate item position based on servant's X/Y co-ordinates
Item is not being carried by the servant
51997 LD A,C Retrieve item properties byte
51998 AND 8 If bit 3 is set, this item is moving/falling (e.g. after being thrown/dropped by the servant)
52000 JR NZ,52059 Item is moving/falling - jump out to 52059
52002 JP 52136 Item is stationary - jump out to 52136
Item is currently held by the servant
52005 LD A,(60140) Get active spell number
52008 CP 1 Check is the servant spell still active?
52010 JR NZ,52044 If not, servant spell has just been deactivated, so the item is now falling/flying
52012 CALL 56008 If active, run routine calculating/checking item's vertical position on screen. Adjusted vertical boundary returned in E register ready for room boundary check at 52031
Servant is carrying the object, so use the servant's horizontal/vertical speed to calculate that of the object (multiplied x4 as servant speed is stored on a smaller scale):
52015 LD A,(60161) Get servant's horizontal movement rate/offset
52018 ADD A,A Multiply by 4
52019 ADD A,A
52020 LD (60236),A ...and store as item's horizontal movement rate/offset
52023 LD A,(60162) Get servant's vertical movement rate/offset
52026 ADD A,A Multiply by 4
52027 ADD A,A
52028 LD (60237),A ...and store as item's vertical movement rate/offset
52031 CALL 57401 Check room boundary and adjust item's position accordingly
52034 LD A,(60337)
52037 CP 2 This carried object status byte was set to 2 once an item has been retrieved from Maroc's backpack by the servant
52039 JR Z,52118 If this is the case, do a collision check to identify if the servant has moved outside Maroc's backpack area 'hit box' (to prevent auto-cycling through inventory objects).
If so, change the byte value (60337) to 1
52041 JP 52263
Prev: 51892 Up: Map Next: 52044