Prev: 63576 Up: Map Next: 63743
63586: Deal with a stinkbomb when dropped
The address of this routine is placed into 32727 by the routine at 28992 when ERIC drops a stinkbomb. It creates a stinkbomb cloud and deals with it until it has dissipated, which includes checking whether MR WACKER and a closed window are nearby, and making the former set off for the latter if so.
63586 LD HL,32747 32747 holds the inventory flags
63589 LD A,(HL) Pick these up in A
63590 AND 224 Keep only the stinkbomb bits (bits 5-7)
63592 ADD A,A Shift these bits left, losing the leftmost bit
63593 LD C,A Store the new stinkbomb bits in C briefly
63594 LD A,(HL) Pick up the inventory flags in A again
63595 AND 31 Discard the old stinkbomb bits
63597 OR C Superimpose the new stinkbomb bits
63598 LD (HL),A Restore the inventory flags, minus one stinkbomb
63599 CALL 31746 Print the inventory
63602 CALL 57910 Prepare buffer 213 for the stinkbomb cloud (or return to the main loop if the buffer is already in use by a stinkbomb cloud)
63605 LD L,0 Point HL at byte 0 of ERIC's buffer
63607 LD A,(HL) A=ERIC's animatory state
63608 INC L L=1
63609 RLCA Set A to -1 if ERIC is facing left, 1 if he's facing right
63610 SBC A,A
63611 ADD A,A
63612 CPL
63613 ADD A,(HL) Add ERIC's x-coordinate to get the x-coordinate for the stinkbomb cloud
63614 LD E,A Copy this to E
63615 INC L L=2
63616 LD D,(HL) D=ERIC's y-coordinate, which will also be the y-coordinate for the stinkbomb cloud
63617 LD HL,54547 Point HL at byte 19 of the stinkbomb cloud's buffer
63620 LD (HL),29 Initialise the counter that determines when the cloud will disappear
63622 LD A,71 71: stinkbomb cloud (phase 1)
63624 CALL 30534 Update the SRB for the stinkbomb cloud's appearance and place address 63627 (below) into bytes 17 and 18 of the cloud's buffer
The address of the entry point below is placed into bytes 17 and 18 of the cloud's buffer by the instruction above.
63627 LD L,19 Byte 19 of the cloud's buffer holds the counter that determines how much longer the cloud will stick around (which starts off at 29)
63629 DEC (HL) Is it time for the cloud to disappear?
63630 JP Z,29903 Jump if so
63633 LD A,(HL) Pick up the counter's value in A
63634 CP 28 Is it time for a teacher to give lines?
63636 JR NZ,63646 Jump if not
63638 LD A,1 Message 1: NO STINKBOMBS
This entry point is used by the routines at 24175, 24263, 24296 and 63915 with A holding a reprimand message number.
63640 SUB 62 Subtract 62 now (it's added back later on)
63642 CP A Set the zero flag to indicate that any teacher may give ERIC lines (including the one who last gave him lines)
63643 JP 32282 Make any teacher within range give ERIC lines
Now deal with animating the stinkbomb cloud and checking whether it's near a window.
63646 CALL 25648 Toggle between cloud animation phases 1 (71) and 2 (199) and update the SRB accordingly
63649 LD L,0 Point HL at byte 0 of the cloud's buffer
63651 BIT 0,(HL) Bit 0 of the cloud's animatory state (71 or 199) is always set, so this RET never happens
63653 RET Z
63654 INC L L=1
63655 LD A,(HL) A=stinkbomb cloud's x-coordinate
63656 CP 84 The head's right study door is at x-coordinate 84
63658 RET C Return if the cloud is to the left of this
63659 CP 96 The boys' skool door is at x-coordinate 96
63661 RET NC Return if the cloud is to the right of this
63662 INC L L=2
63663 LD A,(HL) A=stinkbomb cloud's y-coordinate
63664 CP 17 Is the cloud on the bottom floor?
63666 RET Z Return if so
The stinkbomb cloud is on the top floor or middle floor, somewhere between the head's right study door and the boys' skool door. Check the windows.
63667 EX DE,HL Point DE at byte 2 of the cloud's buffer
63668 LD HL,32756 32756 holds the door/window status flags
63671 CP 3 Is the cloud on the top floor?
63673 JR Z,63683 Jump if so
63675 BIT 7,(HL) Is the middle-floor window already open?
63677 RET NZ Return if so
63678 LD BC,32861 B=128 (middle floor window), C=93 (x-coordinate)
63681 JR 63689
63683 BIT 6,(HL) Is the top-floor window already open?
63685 RET NZ Return if so
63686 LD BC,16475 B=64 (top-floor window), C=91 (x-coordinate)
Now B holds the identifier of a closed window on the same floor as the stinkbomb cloud, and C holds its x-coordinate. Is MR WACKER in the vicinity?
63689 LD HL,51202 Point HL at byte 2 of MR WACKER's buffer
63692 CP (HL) Is MR WACKER on the same floor as the stinkbomb cloud?
63693 RET NZ Return if not
63694 DEC L L=1
63695 DEC E E=1
63696 LD A,(DE) A=x-coordinate of the stinkbomb cloud
63697 SUB 3 Return if MR WACKER is more than 2 spaces to the left of the cloud
63699 CP (HL)
63700 RET NC
63701 ADD A,5 Return if MR WACKER is more than 2 spaces to the right of the cloud
63703 CP (HL)
63704 RET C
MR WACKER is close enough to the stinkbomb cloud to be affected by its stench. Check whether he's available for a spot of window-opening.
63705 LD E,(HL) E=MR WACKER's x-coordinate
63706 LD L,18 Is there an uninterruptible subcommand routine address in bytes 17 and 18 of MR WACKER's buffer (meaning he is otherwise occupied at the moment)?
63708 LD A,(HL)
63709 AND A
63710 RET NZ Return if so
63711 LD L,A L=0
63712 LD A,(HL) A=MR WACKER's animatory state
63713 RRCA Is MR WACKER midstride?
63714 RET C Return if so
63715 RLCA A=MR WACKER's animatory state
63716 LD L,19 Store MR WACKER's current x-coordinate and animatory state in bytes 19 and 20 of his buffer for later retrieval
63718 LD (HL),E
63719 INC L
63720 LD (HL),A
63721 INC L Store the x-coordinate of the window in byte 21
63722 LD (HL),C
63723 INC L Byte 22 holds 128 (middle-floor window) or 64 (top-floor window)
63724 LD (HL),B
63725 CALL 25012 Update the SRB for MR WACKER's current animatory state and location
63728 SET 7,A A=animatory state of MR WACKER facing right
63730 CALL 30534 Place address 63733 (below) into bytes 17 and 18 of MR WACKER's buffer and update his animatory state
The address of the entry point below is placed into bytes 17 and 18 of MR WACKER's buffer by the instruction above.
63733 LD L,0 Point HL at byte 0 of MR WACKER's buffer
63735 BIT 0,(HL) Is MR WACKER midstride?
63737 JP NZ,25597 Finish his stride if so
63740 JP 63801 Otherwise set MR WACKER off on his journey to the window
Prev: 63576 Up: Map Next: 63743