Prev: 55616 Up: Map Next: 55818
55628: Deal with room items when Maroc leaves the room
Used by the routines at 48992 and 55616.
Evaluates objects in data sets at 31744 and store state of any DOORS, CREATURES or OBJECTS.
55628 LD A,(60080) Room number
55631 CP 0
55633 JP Z,50870 If it's zero, it means that room's all set up, so jump to the main game cycle
55636 LD A,0
Start preparing the room items that will need dealing with:
55638 LD (60343),A Set the creatures in the room to zero
55641 LD HL,(56046) Pointer to start of the room data sets at 31744
55644 LD DE,16 Skip pointer past first data set, which deals with the room/viewport setup
55647 ADD HL,DE
Check each data set in the room item list at 31744 in turn:
55648 LD A,(HL) Get first byte of data set
55649 CP 255 Check for end-of-data marker
55651 JP Z,55818 If found, skip copying routine
55654 LD DE,16
55657 CP 0 If first data byte <> 0, there's some data to copy for this set
55659 JR NZ,55664
55661 ADD HL,DE First data byte is zero, so skip to next data set and keep checking data sets
55662 JR 55648
Copy 16 bytes of data from this set at 31744 to the data buffer at 60227:
55664 LD BC,16 16 bytes to copy
55667 LD DE,60227 Start of buffer (destination)
55670 LDIR
55672 LD (60094),HL Store data pointer ready at the start of the next data bank
Check what the item in the data set is:
55675 LD A,(60227) Get first byte of data set which indicates the item type
55678 CP 2 Door
55680 JR Z,55692
55682 CP 4 Interactable object
55684 JR Z,55706
55686 CP 3 Creature
55688 JR Z,55765
55690 JR 55648 If not one of these three items, no extra processing needed at this point, so jump back and continue copying data sets
DOOR
55692 LD HL,(60228) Address pointer to door connector data set in the table at 26512
55695 INC HL Move to 3rd byte of data set
55696 INC HL
55697 LD A,(60238) This is the door properties byte
55700 LD (HL),A Store in the 3rd byte of the room connector data set
55701 LD HL,(60094) Retrieve address pointer to current data set at 31744
55704 JR 55648 ...and continue to check data sets
INTERACTABLE OBJECT
55706 LD HL,(60228) Address pointer to object data set in the table at 29551
55709 LD A,(60087) Get room number...
55712 LD (HL),A Store in object set as the room number for this item (first byte of set)
55713 INC HL Move to the next item data byte...
55714 LD (60228),HL ...And store the address pointer to this object's set
Calculate item's vertical & horizontal co-ordinates (in relation to the room viewport's position) and store in the object's data set (in the table at 29551)
55717 LD HL,(60152) Horizontal position of current screen viewport in 4-pixel/half-character steps - to be used as a calculation offset for the item's position
55720 EX DE,HL Swap into DE
55721 LD HL,(60231) Item graphic's horizontal position in room - H register contains value in 4-pixel/half-character steps (L = pixel fraction/overflow)
55724 SCF Clear/reset the carry flag (set, then toggle)
55725 CCF
55726 SBC HL,DE Subtract the offset to get the item's room position
55728 LD A,H Get the high byte (contains the object's adjusted horizontal position in 4-pixel steps)
55729 LD HL,(60228)
55732 LD (HL),A Store as the 2nd byte of the object's data set at 29551
55733 INC HL Move address pointer to next byte (which stores the item's vertical pixel position)
55734 LD (60228),HL Store the address pointer
55737 LD HL,(60150) Get vertical room pixel position
55740 EX DE,HL Swap into DE
55741 LD HL,(60233) Item graphic's vertical position in room - H register contains value in pixels (L = pixel fraction/overflow)
55744 SCF Clear/reset the carry flag (set, then toggle)
55745 CCF
55746 SBC HL,DE Subtract the offset to get the item's room position in pixels
55748 LD A,H Get the high byte (contains the adjusted vertical pixel position)
55749 LD HL,(60228) Retrieve the address pointer to the 3rd byte of the object's data set at 29551
55752 LD (HL),A Store the item's vertical room position
55753 INC HL Move along to the next byte of the object's data set
Store item properties byte:
55754 LD A,(60238) Get item properties byte
55757 AND 239 Reset bit 4 (if set, indicates item carried by servant).
In most cases it's unlikely for Maroc to be able to switch room while the servant spell is active however
55759 LD (HL),A Store in item data set
55760 LD HL,(60094) Restore pointer to data set at 31744
55763 JR 55648 Continue to copy data sets
CREATURE
55765 LD B,0 The B register will hold a value indicating the type and number of creatures in the room
55767 LD A,(60238) Creature properties byte
55770 AND 224 Check if any of the top 3 bits are set:
Bit 6/7 = creature materializing
Bit 5 = creature disintegrating
55772 JR NZ,55805 If any of these are set, the creature isn't considered present, so don't add this creature's value
Check creature type at 60230, and determine which bit values (see 27532) to add to the byte value at 60343.
55774 LD A,(60230) Creature type
55777 CP 8 Byte value < 8, it's a warlock (no action to take as they're not 'stored')
55779 JR C,55805
55781 CP 8
55783 JR NZ,55787
55785 LD B,64 Byte value = 8, it's a guardian of chaos (set value = 64, these creatures are stored in bits 6 & 7)
55787 CP 9
55789 JR NZ,55793
55791 LD B,16 Byte value = 9, it's a goblin warrior (set value = 16, these creatures are stored in bits 4 & 5)
55793 CP 10
55795 JR NZ,55799
55797 LD B,4 Byte value = 10 it's a goblin missile thrower (set value = 4, these creatures are stored in bits 2 & 3)
55799 CP 11
55801 JR NZ,55805
55803 LD B,1 Byte value = 11, it's a wraith (set value = 1, these creatures are stored in bits 0 & 1)
Add this creature's value (in B register) to the creature data byte for this room.
55805 LD A,(60343) Creature data byte for room
55808 ADD A,B Add the creature type value
55809 LD (60343),A ...and re-store
55812 LD HL,(60094) Retrieve address pointer to the next data set (at 31744)
55815 JP 55648
Prev: 55616 Up: Map Next: 55818