Prev: CF58 Up: Map Next: D019
CF99: Warlock or creature - materialization & disintegration events
Used by the routine at CD88.
Materialization or disintegration routine - warlocks/demons materializing, or creatures disintegrating.
This routine determines the post-materialization/disintegration actions to take. This information is held in bits 5-7 of the creature properties byte (EB4E).
CF99 LD A,($EB50) Graphic frame number/offset
CF9C AND $07 Only bits 0-2 (values 0-7) needed for the number of frames
CF9E CP $07 There are 6 animation frames in the materialization graphics (A847). Have we reached frame #7?
CFA0 JP NZ,$D27D If not, jump out of routine at this point
Final materialization/disintegration frame has been reached.
CFA3 LD A,($EB4E) Creature/room item properties byte
CFA6 LD C,A Temp store in C register
CFA7 AND $07 Filter out/resets bits 4-7
CFA9 OR $05 Set bits 0 (indicating creature is on-screen) and 2 (indicating creature will need to be erased before drawing)
CFAB LD ($EB4E),A ...and re-store.
This routine is running because bit 5, 6 or 7 of the item (creature) properties byte (EB4E) is set. This bit indicates what action to take after a creature materialization or disintegration animation.
CFAE LD A,C Retrieve item (creature) properties byte
CFAF AND $80 Bit 7 of properties byte set = trigger WARLOCK/DEMON APPEARANCE after materialization animation is complete
CFB1 JR NZ,$CFBA
CFB3 LD A,C
CFB4 AND $40 Bit 6 of properties byte set = trigger warlock DISAPPEARANCE post-materialization animation (CE89) - e.g. successful object trade
CFB6 JR NZ,$CFC8
CFB8 JR $CFF0 (If not either of the above) - Bit 5 of properties byte set = trigger CREATURE REMOVAL post-disintegration animation
Creature has just materialized - setup graphic for this creature:
CFBA LD A,$01 Set graphic frame number/offset at 1 (first frame/no frame offset)
CFBC LD ($EB50),A
CFBF LD A,($EBAB) Graphic number (offset for address pointers in table at 97C3)
CFC2 CALL $E0C2 Set up creature graphics
CFC5 JP $D27D
Warlock has been successfully traded with - remove warlock and initialize object trade
CFC8 LD A,$00 Set creature type to 0 (nothing to setup/draw)
CFCA LD ($EB43),A
CFCD LD A,$E0 Timer indicating how long before a warlock is likely to materialize in the current room
CFCF LD ($EBB4),A The warlocks will still appear again after a successful trade, but it'll be some time
Warlock has gone - either off-screen, or disappeared after being traded an object successfully:
CFD2 LD A,$00
CFD4 LD ($EBAD),A Set warlock 'aggression' (likelihood of firing a missile at Maroc) to 0 (as it's gone)
CFD7 LD A,($EBB6) Count of creatures in current room
CFDA DEC A ...reduce by 1...
CFDB LD ($EBB6),A ...and re-store.
CFDE LD A,($EBAE) Check if the warlock is carrying an object
CFE1 CP $00
CFE3 JP Z,$D27D
CFE6 LD ($EB46),A ...If so, copy the item set number into the warlock's data set
CFE9 LD A,$00
CFEB LD ($EBAE),A ...and set the held item data buffer byte to 0
CFEE JR $D019 ...then skip over to the next routine
Creature has been destroyed - remove from existence:
CFF0 LD A,$00
CFF2 LD ($EB43),A Set creature type to 0 (no creature to deal with any more)
CFF5 LD HL,($EB44) Get address pointer to relevant creature/warlock data set at 6C7C
CFF8 INC HL
CFF9 INC (HL) Increment the second byte of the set. This byte holds the number of these creatures Maroc has destroyed
CFFA LD A,($EBB6) Reduce count of creatures in current room by 1
CFFD DEC A
CFFE LD ($EBB6),A Get creature type
D001 LD A,($EB46)
D004 CP $08
D006 JP NC,$D27D If creature >=8, it's not a warlock so jump out of the routine here
D009 LD A,$00 Creature destroyed is a warlock. Set warlock 'aggression' (likelihood of firing a missile at Maroc) to 0, as the warlock is no more.
D00B LD ($EBAD),A
If a warlock is destroyed, it will drop the object it's carrying
D00E LD A,($EBA8) Get object number carried by the warlock
D011 CP $00
D013 LD ($EB46),A ...Copy this value into the warlock's data buffer
D016 JP Z,$D27D If the warlock isn't carrying anything, can jump out at this point
Prev: CF58 Up: Map Next: D019