Prev: 49965 Up: Map Next: 50218
49993: New room - door setup
Used by the routine at 49965.
Follows previous routine if a door is found in one of the room item data sets.
This routine:
  • Identifies each of the doors in the new room
  • Determines which one Maroc entered from, and set his entry co-ordinates and direction accordingly
  • Calculates and stores each door's orientation, position, graphic address, and number of animation frames
49993 LD HL,(60282) Pointer to the current data byte for the room (from the room data set at 25001)
49996 LD A,(HL) Get byte from room data
49997 INC HL Increment pointer
49998 LD (60282),HL ...and re-store
50001 LD C,A Temp store of connecting door set number (26512) in C register
50002 LD A,(60230) Flag indicating where this door appears in the room:
0 = Back wall door
1 = Right wall door
2 = Left wall door
50005 LD (60287),A Copy this byte to working data buffer
50008 LD A,C Retrieve connecting door set number
50009 LD (60230),A ...and store (replace) in room element data buffer
50012 LD A,(60084) Current/existing connecting door set
50015 CP C Compare with the set for this door - is this the door that Maroc has entered from?
50016 JR NZ,50062 If not, jump over the next two sets of instructions (which set Maroc's room position based on this door)
Maroc entered the room through this door, so set his new room position accordingly.
50018 LD A,(60232) Horizontal position of door within current room, in half character (4 pixel) steps.
50021 LD (60277),A Copy to Maroc's horizontal room entry position store
50024 LD A,(60234) Vertical position within current room, in pixels, from top of room playing area
50027 SUB 12 Slight height adjustment for the new room height entry point, so that Maroc enters through the lower part of right/left doors, or near the top of the room for vertical room entry
50029 LD (60278),A Copy to Maroc's vertical room entry position store
Next, set his vertical/horizontal facing direction
The next conditional checks use the door's wall location byte at 60287 is used for this check:
  • 0 = Back wall door - set 60076 (vertical direction) to 254 (down)
  • 1 = Right wall door - set 60075 (horizontal direction) to 2 (left)
  • 2 = Left wall door - set 60075 (horizontal direction) to 254 (right)
50032 LD A,(60287)
50035 CP 0
50037 JR Z,50057
50039 CP 1
50041 JR Z,50050
50043 LD A,254
50045 LD (60075),A Maroc is entering the room through a door on the left wall
50048 JR 50062
50050 LD A,2
50052 LD (60075),A Maroc is entering the room through a door on the right wall
50055 JR 50062
50057 LD A,254
50059 LD (60076),A Maroc is entering the room through a door on the back wall
Calculate the address pointer to this door's connecting door set (at 26512), using the set number x 4 (as each set contains 4 bytes)
50062 LD HL,(56053) Address pointer to the start of the connecting door sets - 26512
50065 LD A,C Retrieve the connecting door data set number
50066 LD D,0 The offset will be calculated in the DE register pair, so set the high byte (D) to zero
50068 RLA x2
50069 RL D
50071 RLA x4
50072 RL D If this causes a carry, rotate it into the D register
50074 AND 252 Offset will be a multiple of 4, so filter out bits 0 & 1 as not needed
50076 LD E,A
50077 ADD HL,DE Add the offset, so HL now points to the connecting door set for this door in the tables at 26512
50078 LD (60228),HL Store this address pointer in the door data buffer
50081 INC HL Move along to byte 3 of 4 in the set (door properties)
50082 INC HL
50083 LD A,(HL)
50084 OR 5 Set bits 0 (item visible on-screen) and 2 (item will need erasing before re-drawing)
50086 AND 253 Filter out bit 1 (2) - (assume door is not hidden)
50088 LD (60238),A ...and re-store
The byte at 60287 is now used to determine which door graphic need to be set up/mirrored when Maroc enters a room.
  • This depends on which wall the door is in (back/left/right) and whether it's open or closed
  • There are 6 possible door graphics. These correspond to the 6 graphic addresses pointers stored from 38867
  • Door 3 is only used for opening/closing animations, though its mirrored version (Door 4) is the open version of the door on the back wall.
For each door identified, the following routine sets the following registers:
Register Contents
H Door number/type (1-6)
B Horizontal position offset in 4-pixel/half-character steps
L Vertical position offset in pixels
D Positive/negative offset for door graphic frame (used in routine at 51892)
Indicates number of frames (bits 0-2) and opening/closing direction
E Number of animation frames needed to open/close for the door (used in routine at 51892)
50091 LD C,A Store filtered byte in C register
50092 LD D,17 Default frame offset value
50094 LD E,5 Default value - total number of animation frames needed for door opening/closing. Back wall doors have 4 animation frames, side wall doors 5.
50096 LD L,0 Height position offset of door (in pixels)
50098 LD A,(60287) 0 = Back wall door
1 = Right wall door
2 = Left wall door
50101 CP 1
50103 JR Z,50128
50105 CP 0
50107 JR Z,50145
Door on LEFT wall - set graphic address offset and door position offset
50109 LD B,2 Horizontal position offset (in half-characters/4-pixel increments)
50111 LD L,246 Height pixel position offset of door (-10)
50113 LD H,5 Door 5 - closed door on left wall. Mirrored version of Door 2.
50115 LD D,245
50117 LD A,C Check bit 3 (open/closed)
50118 AND 8
50120 JR Z,50162
50122 LD D,17
50124 LD H,1 Door 1 - open door on left wall.
50126 JR 50162
Door on RIGHT wall - set graphic address offset and door position offset
50128 LD B,254 Horizontal position offset (in half-characters/4-pixel increments)
50130 LD L,246 Height pixel position offset of door (-10)
50132 LD H,2 Door 2 - closed door on right wall.
50134 LD A,C Check bit 3 (open/closed)
50135 AND 8
50137 JR Z,50162
50139 LD D,245
50141 LD H,6 Door 6 - open door on right wall. Mirrored version of Door 1.
50143 JR 50162
Door on BACK wall - set graphic address offset and door position offset
50145 LD B,253 Horizontal position offset (in half-characters/4-pixel increments)
50147 LD E,4 Number of animation frames needed for door opening/closing. Back wall doors have 4, side wall doors 5.
50149 LD H,4 Door 4 - open door on back wall. Mirrored version of Door 3.
50151 LD D,244
50153 LD A,C Check bit 3 (open/closed)
50154 AND 8
50156 JR NZ,50162
50158 LD D,17
50160 LD H,1 Door 1 - closed door on back wall.
Store door graphic address and position offsets
50162 LD A,(60232) Horizontal (X) position of door in room (half-character/4 pixel increments)
50165 ADD A,B Add calculated horizontal offset
50166 LD (60232),A ...and store
50169 LD A,(60234) Vertical (Y) position of door in room (in pixels)
50172 ADD A,L Add calculated vertical offset
50173 LD (60234),A ...and store
50176 LD A,D Door frame byte for particular door - indicates graphic offset and open/close direction, i.e. which way to advance through the graphic pointers
50177 LD (60288),A
50180 LD A,E Number of animation frames needed for door. Back wall doors have 4, side wall doors 5.
50181 LD (60289),A
50184 LD A,H Offset for the calculated door graphic frame number (1-6)
50185 LD (60240),A
50188 LD A,9 Offset for base door graphics address (38851) [offset = (17-1)*2]. Door graphic addresses start from 38867.
50190 CALL 57538 Prep/mirror door graphics
Update pre-graphic byte with the number of (animation) frames for this door (4 for back wall doors, 5 for side doors)
50193 LD A,(60239) Get pre-graphics data byte
50196 AND 240 Filter out bits 0-3 (the default number of frames in the byte)
50198 LD C,A
50199 LD A,(60289) Add the number of animation frames needed for the door
50202 OR C
50203 LD (60239),A Re-store amended pre-graphics byte
50206 LD A,(60288) Copy graphic frame address offset into working data buffer
50209 LD (60240),A
50212 CALL 57520 Copy the 16 bytes of door data from 60227 into a room item data set at 31744.
50215 JP 49965 Keep checking if there are any more doors to set up in this room
Prev: 49965 Up: Map Next: 50218