Prev: 8666 Up: Map Next: 8824
8749: Handler: Location Choice
Used by the routine at GameInitialise.
Handler_LocationChoice 8749 LD A,($7811) A=*TemporaryScreenLocation.
874C OR %00001000 Set bit 3.
874E LD C,A C=A.
874F LD A,$88 Initialise *TemporaryScreenLocation with 88.
8751 LD ($7811),A
8754 PUSH BC Stash BC on the stack.
8755 CALL Print_ArrowSymbol Call Print_ArrowSymbol.
8758 CALL PauseCheck Call PauseCheck.
Loop round until player input is detected.
Handler_LocationChoice_InputLoop 875B LD B,$0A Call 8055 with a count of 0A.
875D CALL $8055
8760 CALL Handler_Controls Call Handler_Controls.
8763 LD A,E Jump to ProcessLocationChoiceInput_Up if "up" was pressed.
8764 CP $18
8766 JP Z,ProcessLocationChoiceInput_Up
8769 CP $08 Jump to ProcessLocationChoiceInput_Down if "down" was pressed.
876B JP Z,ProcessLocationChoiceInput_Down
876E CP $20 Jump to Handler_LocationChoice_InputLoop if anything other than "fire" was pressed.
8770 JR NZ,Handler_LocationChoice_InputLoop
Process the player pressing "fire".
8772 LD IX,($EFF2) IX=*Pointer_ActivePlayer.
8776 LD L,(IX+$08) Fetch the players current location and store it in HL.
8779 LD H,(IX+$09)
877C LD BC,$0004 Set the increment between destinations in BC.
877F LD A,($7811) Set the selected position from *TemporaryScreenLocation in E.
8782 LD E,A
8783 LD A,$88 Set the position of the top destination in A.
With the selected position being in E, start with A being the position of the top entry (88) and check if the values match, if they don't - loop back round adding 20 to the checking value in A until a a match is found (and the destination will be in HL).
CalculateSelectedDestination_Loop 8785 ADD HL,BC Move HL to the next destination.
8786 CP E Jump to FoundSelectedDestination if A is equal to the selected position.
8787 JR Z,FoundSelectedDestination
8789 ADD A,$20 Move down one line.
878B JR CalculateSelectedDestination_Loop Jump to CalculateSelectedDestination_Loop.
Destination has been found.
FoundSelectedDestination 878D LD C,(HL) C=*HL.
878E INC HL Increment HL by one.
878F LD A,$60 Jump to Handler_SubGame if *HL is lower than 60.
8791 CP (HL)
8792 JP NC,Handler_SubGame
8795 LD B,(HL) B=*HL.
8796 INC HL Increment HL by one.
8797 LD E,(HL) Stash the pointer to the cost on the stack.
8798 PUSH HL
8799 INC HL Load the cost of this trip into DE.
879A LD D,(HL)
879B LD L,(IX+$0D) Load the players cash balance into HL.
879E LD H,(IX+$0E)
87A1 AND A Jump to NotEnoughMoneyToFly if the players cash balance is lower than the cost of this trip.
87A2 SBC HL,DE
87A4 JR C,NotEnoughMoneyToFly
The player can afford the trip, so continue.
87A6 LD (IX+$08),C Update the players current destination with the new destination.
87A9 LD (IX+$09),B
87AC LD HL,$0002 Move HL to point to the co-ordinates of the destination.
87AF ADD HL,BC
87B0 LD C,(HL) Load the map co-ordinates into BC.
87B1 INC HL
87B2 LD B,(HL)
87B3 LD ($7807),BC Write the map co-ordinates to *DestinationLocationCoordinates.
Spent the money on the air fare.
87B7 LD HL,($EFF2) Store a pointer to the players cash balance in DE.
87BA LD DE,$000D
87BD ADD HL,DE
87BE EX DE,HL
87BF POP HL Restore the pointer to the cost of this trip from the stack into HL.
87C0 LD B,$02 Call SpendMoney with 02 digits to process.
87C2 CALL SpendMoney
Print the updated cash balance to the screen.
87C5 DEC DE Decrease the cash balance pointer by one to point to the correct starting position (the print call moved it). Move this to HL.
87C6 EX DE,HL
87C7 LD DE,$403B DE=403B (screen buffer location).
87CA LD BC,$0202 BC=0202.
87CD CALL PrintNumbers Call PrintNumbers.
87D0 POP HL Restore HL from the stack (housekeeping, this is immediately thrown away).
87D1 LD HL,$EFFA Set bit 7 ("Flying To New Destination") of *GameState_1.
87D4 SET 7,(HL)
87D6 CALL Messaging_GenerateTicker Call Messaging_GenerateTicker.
87D9 CALL ClearMenuScreenAreas Call ClearMenuScreenAreas.
87DC JP CalculateFlightPath Jump to CalculateFlightPath.
Prints "No DiscountsAllowed".
NotEnoughMoneyToFly 87DF POP DE Restore DE from the stack (housekeeping, this is immediately thrown away).
Prints "No ".
87E0 LD HL,$8C10 HL=Messaging_No.
87E3 LD DE,$50A3 DE=50A3 (screen buffer location).
87E6 CALL Print_String Call Print_String.
Prints "Discounts".
87E9 LD DE,$50C0 DE=50C0 (screen buffer location).
87EC CALL Print_String Call Print_String.
Prints "Allowed".
87EF LD DE,$50E1 DE=50E1 (screen buffer location).
87F2 CALL Print_String Call Print_String.
87F5 JP Handler_LocationChoice_InputLoop Jump to Handler_LocationChoice_InputLoop.
Process the player pressing "up".
ProcessLocationChoiceInput_Up 87F8 CALL Erase_ArrowSymbol Call Erase_ArrowSymbol.
87FB POP BC Restore BC from the stack.
87FC LD A,($7811) Jump to LocationChoice_MoveChoice if *TemporaryScreenLocation is equal to with 88.
87FF CP $88
8801 JR Z,LocationChoice_MoveChoice
8803 SUB $20 A-=20.
UpdateDestinationChoice 8805 LD ($7811),A Write A to *TemporaryScreenLocation.
8808 PUSH BC Stash BC on the stack.
8809 CALL Print_ArrowSymbol Call Print_ArrowSymbol.
880C JP Handler_LocationChoice_InputLoop Jump to Handler_LocationChoice_InputLoop.
Process the player pressing "down".
ProcessLocationChoiceInput_Down 880F CALL Erase_ArrowSymbol Call Erase_ArrowSymbol.
8812 POP BC Restore BC from the stack.
8813 LD A,($7811) Jump to LocationChoice_BackToTop if *TemporaryScreenLocation is equal to C.
8816 CP C
8817 JR Z,LocationChoice_BackToTop
8819 ADD A,$20 A+=20.
881B JR UpdateDestinationChoice Jump to UpdateDestinationChoice.
Set the cursor position back to the initial "top" choice.
LocationChoice_BackToTop 881D LD A,$88 A=88.
881F JR UpdateDestinationChoice Jump to UpdateDestinationChoice.
LocationChoice_MoveChoice 8821 LD A,C A=C.
8822 JR UpdateDestinationChoice Jump to UpdateDestinationChoice.
Prev: 8666 Up: Map Next: 8824