Prev: 37490 Up: Map Next: 39655
38379: UpdateRoomActors — per-frame ship-simulation driver
Despite the old name, this block is the SHIP-SIMULATION layer: it drives the destruct countdown, fixture proximity events, the oxygen clock, engine states and the alien encounter animation, and hosts the fixture-action handlers (destruct lever, hypersleep pods, fires, airlocks, launch console) that the action key dispatches into.
Input
Used by the routine at 36457.
38379 CALL 38846 DestructTicker: countdown + border flash
38382 CALL 38903 fixture-proximity checks on strip cells 6/7/20
38385 CALL 39531 oxygen clock / status line
38388 CALL 39171 event pacing / ambient events
38391 CALL 39041 EngineStateScan: engine damage/repair states
38394 CALL 39718 alien encounter animation layers
38397 RET
FixtureAction: the action-key (key 0) handler for corridor fixtures, dispatched via the RoomDispatchTable tail. Reads the corridor cell under the cursor and dispatches on the CELL VALUE: 70 -> arm self-destruct 72 -> abort self-destruct 74 -> enter hypersleep pod 76 -> fight fire (engine rooms) 78 -> Narcissus launch 53/54 -> blow airlock #1/#2 55/56 -> seal airlock #1/#2
38398 CALL 45846
38401 LD HL,29630 corridor position table
38404 LD E,A
38405 LD D,0
38407 ADD HL,DE
38408 LD A,(HL) A = cell value under the cursor
38409 LD (33685),A
38412 CP 70 destruct lever (off)?
38414 JR Z,38454
38416 CP 72 destruct lever (armed)?
38418 JR Z,38483
38420 CP 74 hypersleep pod?
38422 JR Z,38529
38424 CP 76 fire?
This entry point is used by the routine at 37490.
38426 JR Z,38546
38428 CP 78 launch console?
38430 JP Z,40212
38433 CP 53 airlock #1 door (closed)?
38435 JP Z,38645 blow it
38438 CP 54 airlock #2 door (closed)?
38440 JP Z,38645 blow it
38443 CP 55 airlock #1 door (blown)?
38445 JP Z,38588 seal it
38448 CP 56 airlock #2 door (blown)?
38450 JP Z,38588 seal it
38453 RET anything else: no action
38454 LD A,13 msg #13 "DESTRUCT SEQUENCE INITIATED"
38456 CALL 37176
38459 LD A,72 cells 15/16 := armed lever sprites 72/73
38461 LD (29645),A
38464 LD HL,20502
38467 LD (31257),HL
38470 CALL 31634
38473 LD A,73
38475 LD (29646),A
38478 CALL 31634
38481 JR 38510
38483 LD A,14 msg #14 "DESTRUCT SEQUENCE ABORTED"
38485 CALL 37176
38488 LD A,70 cells 15/16 := off lever sprites 70/71
38490 LD (29645),A
38493 LD HL,20502
38496 LD (31257),HL
38499 CALL 31634
38502 LD A,71
38504 LD (29646),A
38507 CALL 31634
38510 LD HL,12336 HL = "00" in ASCII
38513 LD (38366),HL DestructSeconds := "00"
38516 LD HL,38364
38519 LD (HL),53 DestructMinutes := '5' -> 5:00 countdown
38521 LD HL,31253
38524 LD A,(HL)
38525 XOR 1 toggle ShipSystemFlags bit 0 (destruct armed)
38527 LD (HL),A
38528 RET
38529 LD (IX+3),6 action state 6 = entering hypersleep
38533 LD (IX+0),255
38537 LD A,11 msg #11 "{actor} prepares for hypersleep"
38539 LD HL,(31241)
38542 CALL 37176
38545 RET
38546 LD A,(31248) A = actor's corridor cell
38549 CP 8 fire cells occupy positions 8-11
38551 RET C
38552 CP 12
38554 RET NC
38555 LD E,A
38556 LD D,0
38558 LD HL,33746
38561 ADD HL,DE HL -> extinguisher charges for this position
38562 XOR A
38563 CP (HL)
38564 JR NZ,38575
38566 LD HL,(31241) empty:
38569 LD A,6 msg #6 "{actor}'s extinguisher is empty"
38571 CALL 37176
38574 RET
38575 DEC (HL) use one extinguisher charge
38576 LD A,(31242)
38579 SUB 17 engine-room index 0-2 (rooms 17/18/19)
38581 LD E,A
38582 LD HL,38351
38585 ADD HL,DE
38586 INC (HL) bump this engine room's fire-fighting progress
38587 RET
38588 LD HL,31253 SealLock: repressurise an airlock
38591 LD A,(33683)
38594 SUB 15 cursor cell - 15 -> 0 = airlock #1, 1 = #2
38596 AND A
38597 JR Z,38617
38599 RES 2,(HL) clear "airlock #2 blown" flag
38601 LD A,54 cell := closed-door sprite 54
38603 LD (29646),A
38606 LD HL,20534
38609 LD (31257),HL
38612 CALL 31634
38615 JR 38633
38617 RES 1,(HL) clear "airlock #1 blown" flag
38619 LD A,53 cell := closed-door sprite 53
38621 LD (29645),A
38624 LD HL,20502
38627 LD (31257),HL
38630 CALL 31634
38633 LD A,(33683)
38636 SUB 15
38638 LD L,A L = airlock room (0/1) for the {sprite} field
38639 LD A,17 msg #17 "{room} PRESSURE RESTORED"
38641 CALL 37176
38644 RET
38645 LD HL,31253 BlowLock: blow an airlock open
38648 LD A,(33683)
38651 SUB 15 cursor cell - 15 -> 0 = airlock #1, 1 = #2
38653 AND A
38654 JR Z,38674
38656 SET 2,(HL) set "airlock #2 blown" flag
38658 LD A,56 cell := blown-door sprite 56
38660 LD (29646),A
38663 LD HL,20534
38666 LD (31257),HL
38669 CALL 31634
38672 JR 38690
38674 LD A,55 cell := blown-door sprite 55
38676 SET 1,(HL) set "airlock #1 blown" flag
38678 LD (29645),A
38681 LD HL,20502
38684 LD (31257),HL
38687 CALL 31634
38690 LD A,(33683)
38693 SUB 15 A = the depressurised room (0/1)
38695 PUSH IX
38697 LD B,8 sweep all 8 actor slots (alien included!)
38699 LD IX,29566
38703 LD DE,8
38706 CP (IX+1) actor in the depressurised room?
38709 JR NZ,38719
38711 LD (IX+1),255 yes: swept into space - room := none,
38715 LD (IX+7),1 status := dead
38719 ADD IX,DE
38721 DJNZ 38706
38723 POP IX
38725 LD HL,29940 clear their markers from the corridor strip
38728 LD B,22
38730 CP (HL)
38731 JR NZ,38735
38733 LD (HL),255
38735 INC HL
38736 DJNZ 38730
38738 LD L,A
38739 LD A,16 msg #16 "WARNING: {room} DEPRESSURISED"
38741 CALL 37176
38744 LD HL,29567 was the ALIEN in there?
38747 LD A,255
38749 CP (HL) alien's room = 255 means it was swept out
38750 RET NZ
38751 LD A,(29570) alien already wounded 3+ times:
38754 CP 3
38756 JP NC,44125 it dies in space -> endgame/rating screen
38759 CALL 33589 else ROM-script roll: nibble >= 2
38762 CP 2
38764 JP NC,44125 (14 in 16): the alien dies -> endgame
38767 LD A,32 survived! it crawls back in:
38769 LD (29567),A alien's room := 32 (ShuttleBay)
38772 LD L,A
38773 LD A,18 msg #18 "INTRUDER ENTERING {ShuttleBay}"
38775 CALL 37176
38778 LD HL,29566
38781 LD (HL),0 reset the alien's action byte
38783 RET
CrewAction6_Handler — dispatched via CrewActionDispatch entry 6.
38784 LD HL,(33700)
38787 LD A,12
38789 CALL 37176
38792 LD (IX+7),255
38796 LD (IX+1),255
38800 LD HL,29940
38803 LD A,(33700)
38806 ADD A,128
38808 LD E,A
38809 ADD A,32
38811 LD D,A
38812 LD C,(IX+1)
38815 LD B,22
38817 LD A,(HL)
38818 CP E
38819 JR Z,38824
38821 CP D
38822 JR NZ,38826
38824 LD (HL),15
38826 INC HL
38827 DJNZ 38817
38829 LD A,(31252)
38832 CP 1
38834 RET NZ
38835 LD A,(31241)
38838 LD HL,33700
38841 JP 45676
38844 NOP
38845 NOP
38846 LD HL,31253 DestructTicker (per frame)
38849 BIT 0,(HL) destruct armed?
38851 RET Z no: done
38852 LD A,(38367) flash the border from the seconds digit
38855 AND 3
38857 OUT (254),A
38859 LD HL,38355
38862 DEC (HL)
38863 RET NZ
38864 LD (HL),20 every 20 frames = one game second
38866 LD A,47 '/' = '0'-1: ASCII underflow sentinel
38868 LD HL,(38366) L = seconds tens, H = seconds units
38871 DEC H
38872 CP H
38873 JR NZ,38897
38875 LD H,57 units wrapped: back to '9'
38877 DEC L
38878 CP L
38879 JR NZ,38897
38881 LD L,53 tens wrapped: back to '5' (fresh :59..:50)
38883 LD (38366),HL
38886 LD HL,38364
38889 DEC (HL) borrow into the minutes digit
38890 CP (HL)
38891 JP Z,38317 minutes below '0': BOOM - flash + game over
38894 JP 39572 redraw countdown / oxygen status
38897 LD (38366),HL
38900 JP 39572
38903 LD HL,33692
38906 LD A,(29946)
38909 CP 160
38911 CALL NC,38941
38914 INC HL
38915 LD A,(29947)
38918 CP 160
38920 CALL NC,38941
38923 INC HL
38924 LD A,(29960)
38927 CP 160
38929 CALL NC,38941
38932 LD A,(29961)
38935 CP 160
38937 CALL NC,38941
38940 RET
38941 CP 255
38943 RET Z
38944 PUSH HL
38945 SUB 160
38947 ADD A,A
38948 ADD A,A
38949 ADD A,A
38950 LD E,A
38951 LD D,0
38953 LD HL,29567
38956 ADD HL,DE
38957 LD A,(HL)
38958 LD (38356),A
38961 LD BC,29171
38964 BIT 6,A
38966 JR Z,38971
38968 CALL 45683
38971 LD L,A
38972 LD H,0
38974 PUSH HL
38975 ADD HL,HL
38976 ADD HL,HL
38977 POP DE
38978 ADD HL,DE
38979 ADD HL,BC
38980 LD DE,8
38983 LD B,5
38985 PUSH BC
38986 PUSH HL
38987 LD C,(HL)
38988 LD A,(38356)
38991 CP C
38992 JR Z,39023
38994 LD A,(33706)
38997 JP 45705
This entry point is used by the routine at 45401.
39000 LD B,8
39002 LD HL,29567
39005 LD A,(HL)
39006 AND 63
39008 CP C
39009 JR NZ,39020
39011 PUSH HL
39012 ADD HL,DE
39013 DEC HL
39014 DEC HL
39015 XOR A
39016 CP (HL)
39017 JR Z,39034
39019 POP HL
39020 ADD HL,DE
39021 DJNZ 39005
39023 POP HL
39024 INC HL
39025 POP BC
39026 DJNZ 38985
39028 POP HL
39029 LD A,(38356)
39032 LD (HL),A
39033 RET
39034 POP HL
This entry point is used by the routine at 45401.
39035 POP HL
39036 POP BC
39037 POP HL
39038 LD (HL),255
39040 RET
39041 LD D,8
39043 LD A,(31253)
39046 LD E,17
39048 BIT 3,A
39050 CALL NZ,39077
39053 SLA D
39055 INC E
39056 BIT 4,A
39058 CALL NZ,39077
39061 SLA D
39063 INC E
39064 BIT 5,A
39066 CALL NZ,39077
39069 LD HL,38354
39072 DEC (HL)
39073 RET NZ
39074 LD (HL),100
39076 RET
39077 PUSH AF
39078 PUSH DE
39079 LD C,1
39081 LD B,D
39082 LD D,0
39084 LD HL,30006
39087 ADD HL,DE
39088 ADD HL,DE
39089 LD A,(HL)
39090 CP 54
39092 JR C,39100
39094 INC C
39095 CP 56
39097 JR C,39100
39099 INC C
39100 LD HL,38334
39103 ADD HL,DE
39104 LD A,(HL)
39105 CP C
39106 JR C,39159
39108 LD A,(31253)
39111 XOR B
39112 LD (31253),A
39115 LD A,(31252)
39118 CP 1
39120 JR NZ,39149
39122 LD A,(31242)
39125 CP E
39126 JR NZ,39149
39128 LD HL,65535
39131 LD (29645),HL
39134 LD A,L
39135 LD HL,20502
39138 LD (31257),HL
39141 CALL 31634
39144 LD A,255
39146 CALL 31634
39149 POP HL
39150 PUSH HL
39151 LD A,15 msg #15 "Fire extinguished in {room}"
39153 CALL 37176
39156 POP DE
39157 POP AF
39158 RET
39159 LD A,(38354)
39162 DEC A
39163 LD A,1
39165 CALL Z,38186
39168 POP DE
39169 POP AF
39170 RET
39171 LD A,(31252)
39174 CP 1
39176 RET NZ
39177 LD A,(31241)
39180 ADD A,160
39182 LD C,A
39183 LD HL,33692
39186 LD A,(29946)
39189 CP C
39190 JR Z,39213
39192 LD A,(29947)
39195 INC HL
39196 CP C
39197 JR Z,39213
39199 INC HL
39200 LD A,(29960)
39203 CP C
39204 JR Z,39228
39206 LD A,(29961)
39209 CP C
39210 JR Z,39228
39212 RET
39213 LD A,(HL)
39214 CP 255
39216 RET NZ
39217 LD HL,38378
39220 INC (HL)
39221 LD A,(HL)
39222 AND 7
39224 CALL Z,39242
39227 RET
39228 LD A,(HL)
39229 CP 255
39231 RET NZ
39232 LD A,(31242)
39235 LD L,A L = current room
39236 LD A,19 msg #19 "Jones is looking uneasy"
39238 CALL 37176
39241 RET
This entry point is used by the routine at 42821.
39242 PUSH IX
39244 LD DE,5
39247 LD HL,549
39250 CALL 949
39253 POP IX
39255 RET
CrewAction5_Investigate — dispatched via CrewActionDispatch entry 5.
39256 LD HL,65535
39259 LD (33696),HL
39262 LD DE,33695
39265 LD A,255
39267 LD (DE),A
39268 XOR A
39269 CALL 37891
39272 LD C,0
39274 LD HL,33695
39277 LD A,255
39279 LD B,3
39281 CP (HL)
39282 JR Z,39285
39284 INC C
39285 INC HL
39286 DJNZ 39281
39288 LD A,C
39289 AND A
39290 RET Z
39291 CP 1
39293 JR NZ,39298
39295 XOR A
39296 JR 39317
39298 CP 2
39300 JR NZ,39309
39302 CALL 33589
39305 AND 1
39307 JR 39317
39309 CALL 33589
39312 AND 7
39314 CALL 36763
39317 LD E,A
39318 LD D,0
39320 LD HL,33695
39323 ADD HL,DE
39324 LD C,(HL)
39325 LD (HL),255
39327 LD A,C
39328 ADD A,A
39329 ADD A,A
39330 ADD A,A
39331 ADD A,7
39333 LD E,A
39334 LD D,0
39336 LD HL,29566
39339 ADD HL,DE
39340 XOR A
39341 CP (HL)
39342 JP NZ,39459
39345 DEC HL
39346 DEC HL
39347 DEC HL HL -> victim's +4 strength
39348 DEC (HL) the alien drains one strength point
39349 LD A,(HL)
39350 CP 2 below 2: victim collapses
39352 JR C,39400
39354 CP 4 2-3: wounded
39356 JR C,39365
39358 LD L,C still healthy:
39359 LD A,1 msg #1 "The ALIEN is attacking {actor}"
39361 CALL 37176
39364 RET
39365 LD L,C
39366 LD A,10 msg #10 "{actor} is being wounded"
39368 CALL 37176
39371 LD A,(31252)
39374 CP 1
39376 RET NZ
39377 PUSH IX
39379 LD A,(31241)
39382 ADD A,A
39383 ADD A,A
39384 ADD A,A
39385 LD IX,29566
39389 LD E,A
39390 LD D,0
39392 ADD IX,DE
39394 CALL 32385
39397 POP IX
39399 RET
This entry point is used by the routine at 40439.
39400 INC HL
39401 INC HL
39402 CALL 45476
39405 LD DE,65529
39408 ADD HL,DE
39409 LD (HL),0
39411 LD A,C
39412 PUSH AF
39413 ADD A,128
39415 LD E,A
39416 ADD A,32
39418 LD D,A
39419 LD C,(IX+1)
39422 LD B,22
39424 LD HL,29940
39427 LD A,(HL)
39428 CP E
39429 JR Z,39434
39431 CP D
39432 JR NZ,39435
39434 LD (HL),C
39435 INC HL
39436 DJNZ 39427
39438 POP AF
39439 LD L,A
39440 LD A,(31252)
39443 CP 1
39445 RET NZ
39446 LD A,(31241)
39449 CP L
39450 RET NZ
39451 LD A,21 msg #21 "{actor} has collapsed"
39453 CALL 37176
39456 JP 31417
39459 XOR A
39460 CP (IX+5)
39463 JR NZ,39484
39465 PUSH HL
39466 CALL 33589
39469 POP HL
39470 CP 4
39472 JR NC,39484
39474 LD DE,65530
39477 ADD HL,DE
39478 LD (HL),255
39480 CALL 45533
39483 RET
39484 LD DE,1
39487 LD HL,33695
39490 CP 7
39492 JR C,39500
39494 LD DE,65535
39497 LD HL,33697
39500 LD B,3
39502 LD A,(HL)
39503 CP 255
39505 JR Z,39516
39507 CP C
39508 JR Z,39516
39510 LD (HL),255
39512 LD C,A
39513 JP 39328
39516 ADD HL,DE
39517 DJNZ 39502
39519 CALL 36717
39522 LD (IX+0),40
39526 LD (IX+3),1
39530 RET
39531 LD HL,38357
39534 DEC (HL)
39535 RET NZ
39536 LD HL,29573
39539 LD DE,8
39542 LD BC,2048
39545 XOR A
39546 CP (HL)
39547 JR Z,39550
39549 INC C
39550 ADD HL,DE
39551 DJNZ 39546
39553 LD A,C
39554 ADD A,A
39555 LD (38357),A
39558 LD A,47
39560 LD HL,38377
39563 DEC (HL)
39564 CP (HL)
39565 JR NZ,39572
39567 LD (HL),57
39569 DEC HL
39570 JR 39563
This entry point is used by the routines at 31577 and 31634.
39572 LD HL,(38374)
39575 LD A,L
39576 CP 48
39578 JR NZ,39601
39580 LD A,H
39581 CP 53
39583 JR NZ,39601
39585 LD HL,(38376)
39588 LD A,48
39590 CP L
39591 JR NZ,39601
39593 CP H
39594 JR NZ,39601
39596 LD A,26
39598 CALL 37176
39601 LD A,(38373)
39604 CP 32
39606 JP NZ,44277
39609 LD A,(31252)
39612 CP 2
39614 RET Z
39615 CP 3
39617 RET Z
39618 LD HL,20598
39621 LD (31257),HL
39624 LD DE,38368
39627 LD HL,31253
39630 BIT 0,(HL)
39632 JR Z,39637
39634 LD DE,38358
39637 LD B,10
39639 PUSH BC
39640 PUSH DE
39641 CALL 31369
39644 POP DE
39645 POP BC
39646 INC DE
39647 LD HL,31257
39650 INC (HL)
39651 DJNZ 39639
39653 RET
39654 RET
Prev: 37490 Up: Map Next: 39655