Prev: 24551 Up: Map Next: 25216
24553: Main Game Loop
Used by the routine at Game_Initialise.
Main game loop handler. Reads player input (either from Kempston joystick or keyboard), moves Percy, checks for collisions with the room scenery, handles room transitions, item collection and updates Percy's animation frame.
MainGameLoop 24553 LD A,(24487) If *FallingState is unset, call Initialise_Lives.
24556 OR A
24557 CALL Z,UpdateEnergyBar
Seed the chick animation states and introduce a short random delay using the Memory Refresh Register.
24560 LD A,R L=the contents of the Memory Refresh Register.
24562 LD L,A
24563 LD H,0 Set the low byte in H to 0 so only low memory is accessed.
24565 LD A,(HL) Fetch a byte from low memory and write it to *ChickAnimationStates.
24566 LD (24500),A
24569 AND %00000111 Keep only bits 0-2.
24571 LD B,A Set the same byte value as a delay counter in B.
MainGameLoop_RandomDelay 24572 NOP No operation.
24573 DJNZ MainGameLoop_RandomDelay Decrease the delay counter by one and loop back to MainGameLoop_RandomDelay until done.
Read the Kempston joystick port to check for input.
MainGameLoop_ReadInput 24575 LD BC,61438 BC=61438.
24578 LD IX,56000 IX=Percy_X_Position.
24582 LD A,31 Write 31 to *InputState (default: no direction pressed).
24584 LD (24482),A
24587 IN A,(C) Read from the Kempston joystick port.
24589 AND %00011111 Keep only bits 0-4.
24591 CP 31 Jump to MainGameLoop_JoystickInput if any joystick direction was detected.
24593 JR NZ,MainGameLoop_JoystickInput
24595 JR MainGameLoop_CheckInputMode Jump to MainGameLoop_CheckInputMode.
MainGameLoop_JoystickInput 24597 LD (24482),A Write A to *InputState.
24600 JP MainGameLoop_HandleEggDrop Jump to MainGameLoop_HandleEggDrop.
Check whether to read from Kempston joystick or keyboard. Bit 7 of *InputMode indicates keyboard mode.
MainGameLoop_CheckInputMode 24603 LD A,(24486) A=*InputMode.
24606 BIT 7,A Jump to MainGameLoop_ReadKeyboard if keyboard mode is active (bit 7 is set).
24608 JR NZ,MainGameLoop_ReadKeyboard
24610 LD BC,31 BC=0031.
24613 OR A Jump to MainGameLoop_ReadJoystick if A is non-zero.
24614 JR NZ,MainGameLoop_ReadJoystick
Auto-detect input method. Poll the joystick port repeatedly and if any input is detected, switch to joystick mode; otherwise switch to keyboard.
24616 LD E,240 E=240 (poll retry counter).
MainGameLoop_AutoDetect_Loop 24618 IN A,(C) Read from the joystick port.
24620 AND %00011111 Keep only bits 0-4.
24622 CP 31 Jump to MainGameLoop_SetKeyboardMode if no joystick was input detected.
24624 JR Z,MainGameLoop_SetKeyboardMode
24626 DEC E Decrease the retry counter.
24627 JR NZ,MainGameLoop_AutoDetect_Loop Jump to MainGameLoop_AutoDetect_Loop until all the retries have been used.
Joystick input was detected so set joystick mode.
24629 LD A,31 Write 31 to *InputMode (joystick mode).
24631 LD (24486),A
24634 JR MainGameLoop_ReadJoystick Jump to MainGameLoop_ReadJoystick.
No joystick was detected so set keyboard mode.
MainGameLoop_SetKeyboardMode 24636 LD A,128 Write 128 to *InputMode (keyboard mode).
24638 LD (24486),A
24641 JR MainGameLoop_ReadKeyboard Jump to MainGameLoop_ReadKeyboard.
Read the Kempston joystick and remap the direction bits into the game's internal input format stored in *InputState.
Joystick Bit Direction Game Bit
4 Fire 0
0 Right 3
1 Left 4
2 Down 2
3 Up 1
MainGameLoop_ReadJoystick 24643 IN A,(C) Read from the joystick port.
24645 LD E,31 E=31 (all directions inactive).
MainGameLoop_Joystick_TestFire 24647 BIT 4,A Jump to MainGameLoop_Joystick_TestRight if fire is not being pressed.
24649 JR Z,MainGameLoop_Joystick_TestRight
24651 RES 0,E Reset bit 0 of E (fire active).
MainGameLoop_Joystick_TestRight 24653 BIT 0,A Jump to MainGameLoop_Joystick_TestLeft if right is not being pressed.
24655 JR Z,MainGameLoop_Joystick_TestLeft
24657 RES 3,E Reset bit 3 of E (right active).
MainGameLoop_Joystick_TestLeft 24659 BIT 1,A Jump to MainGameLoop_Joystick_TestDown if left is not being pressed.
24661 JR Z,MainGameLoop_Joystick_TestDown
24663 RES 4,E Reset bit 4 of E (left active).
MainGameLoop_Joystick_TestDown 24665 BIT 2,A Jump to MainGameLoop_Joystick_TestUp if down is not being pressed.
24667 JR Z,MainGameLoop_Joystick_TestUp
24669 RES 2,E Reset bit 2 of E (down active).
MainGameLoop_Joystick_TestUp 24671 BIT 3,A Jump to MainGameLoop_Joystick_Store if up is not being pressed.
24673 JR Z,MainGameLoop_Joystick_Store
24675 RES 1,E Reset bit 1 of E (up active).
MainGameLoop_Joystick_Store 24677 LD A,E Write E to *InputState.
24678 LD (24482),A
24681 JR MainGameLoop_HandleEggDrop Jump to MainGameLoop_HandleEggDrop.
Read keyboard input. Scans multiple keyboard half-rows and maps them into the same internal input format.
Port Keys Game Bit
32766 SPACE..B 0 (fire)
49150 ENTER..H 2 (down)
57342 P..Y 1 (up)
64510 Q (bit 0) 4 (left)
64510 W (bit 1) 3 (right)
MainGameLoop_ReadKeyboard 24683 LD BC,32766 BC=32766.
24686 LD E,31 E=31 (all directions inactive).
Read SPACE-B row for fire.
24688 IN A,(C) Read from the keyboard port.
24690 AND %00011111 Keep only bits 0-4.
24692 CP 31 Jump to MainGameLoop_Keyboard_TestDown if no key was being pressed.
24694 JR Z,MainGameLoop_Keyboard_TestDown
24696 RES 0,E Reset bit 0 of E (fire active).
Read ENTER-H row for down.
MainGameLoop_Keyboard_TestDown 24698 LD B,191 B=191.
24700 IN A,(C) Read from the keyboard port.
24702 AND %00011111 Jump to MainGameLoop_Keyboard_TestUp if no key was being pressed.
24704 CP 31
24706 JR Z,MainGameLoop_Keyboard_TestUp
24708 RES 2,E Reset bit 2 of E (down active).
Read P-Y row for up.
MainGameLoop_Keyboard_TestUp 24710 LD B,223 B=223.
24712 IN A,(C) Read from the keyboard port.
24714 AND %00011111 Jump to MainGameLoop_Keyboard_TestLeftRight if no key was being pressed.
24716 CP 31
24718 JR Z,MainGameLoop_Keyboard_TestLeftRight
24720 RES 1,E Reset bit 1 of E (up active).
Read Q-T row for left (Q, bit 0) and right (W, bit 1).
MainGameLoop_Keyboard_TestLeftRight 24722 LD B,251 B=251.
24724 IN A,(C) Read from the keyboard port.
24726 AND %00000001 Jump to MainGameLoop_Keyboard_TestRight if Q is not being pressed.
24728 JR NZ,MainGameLoop_Keyboard_TestRight
24730 RES 4,E Reset bit 4 of E (left active).
MainGameLoop_Keyboard_TestRight 24732 IN A,(C) Read from the keyboard port again.
24734 AND %00000010 Jump to MainGameLoop_Keyboard_Store if W is not being pressed.
24736 JR NZ,MainGameLoop_Keyboard_Store
24738 RES 3,E Reset bit 3 of E (right active).
MainGameLoop_Keyboard_Store 24740 LD A,E Write E to *InputState.
24741 LD (24482),A
Handle Percy's egg drop state. If *EggDropFlag is set, Percy has dropped an egg and it is currently in flight.
MainGameLoop_HandleEggDrop 24744 LD A,(24489) Jump to MainGameLoop_TestFirePressed if *EggDropFlag is unset (no egg active).
24747 OR A
24748 JR Z,MainGameLoop_TestFirePressed
Egg is in flight so advance its Y position.
24750 LD A,(IX+33) A=*IX+33 (Egg_Y_Position).
24753 ADD A,4 A+=4.
24755 CP 168 Has the egg reached Y position 168?
24757 JR C,MainGameLoop_UpdateEggY Jump to MainGameLoop_UpdateEggY if not yet reached.
Egg has reached its target so end the egg drop state.
24759 LD (IX+35),0 Write 0 to *IX+35 (Egg_Frame_ID).
24763 XOR A Write 0 to *EggDropFlag (egg drop complete).
24764 LD (24489),A
MainGameLoop_UpdateEggY 24767 LD (IX+33),A Write A to *IX+33 (Egg_Y_Position).
Play a rising sound effect while the egg is in flight.
24770 PUSH IX Stash IX on the stack.
24772 LD HL,(24503) HL=*BeepPitch.
24775 LD BC,16 HL+=16.
24778 ADD HL,BC
24779 LD (24503),HL Write HL to *BeepPitch.
24782 LD DE,4 DE=0004.
24785 CALL 949 Call BEEP.
24788 DI Disable interrupts.
24789 POP IX Restore IX from the stack.
24791 JR MainGameLoop_ApplyMovement Jump to MainGameLoop_ApplyMovement.
Check if fire is pressed and conditions are met to drop an egg.
MainGameLoop_TestFirePressed 24793 LD A,(24482) Jump to MainGameLoop_ApplyMovement if *InputState states that fire has not been pressed.
24796 BIT 0,A
24798 JR NZ,MainGameLoop_ApplyMovement
24800 LD A,(24493) Jump to MainGameLoop_ApplyMovement if *LandedOnPlatformFlag is set.
24803 OR A
24804 JR NZ,MainGameLoop_ApplyMovement
Percy must be below Y position 132 to drop an egg.
24806 LD A,(IX+1) Jump to MainGameLoop_ApplyMovement if Percy's Y position (*IX+1) is greater than or equal to 132 (too high to drop an egg).
24809 CP 132
24811 JR NC,MainGameLoop_ApplyMovement
Start the egg drop sequence and set the egg's target position/ activate the egg state.
24813 ADD A,16 A+=16.
24815 PUSH AF Stash AF on the stack.
24816 CALL DropWorm Call DropWorm.
24819 POP AF Restore AF from the stack.
24820 LD (IX+33),A Write A to *IX+33 (egg target Y).
24823 LD (IX+35),15 Write 15 to *IX+35 (Egg_Frame_ID).
24827 LD A,(IX+0) A=*IX+0 (Percy's X position).
24830 ADD A,5 A+=5.
24832 LD (IX+32),A Write A to *IX+32 (egg target X).
24835 OR %11111111 Write 255 to *EggDropFlag (egg drop in progress).
24837 LD (24489),A
24840 LD HL,100 Write 0100 to *BeepPitch (initial beep pitch).
24843 LD (24503),HL
Apply the direction input to Percy's movement. First ensure fire is flagged as released, then dispatch to the appropriate movement handler for each direction.
MainGameLoop_ApplyMovement 24846 LD A,(24482) Set bit 0 of *InputState (mark fire as handled).
24849 SET 0,A
24851 LD (24482),A
If Percy is falling (*FallingState is non-zero), handle the falling state.
24854 LD A,(24487) Jump to MainGameLoop_MovePercy if *FallingState is unset.
24857 OR A
24858 JR Z,MainGameLoop_MovePercy
24860 CP 254 Jump to MainGameLoop_Falling if A is 254.
24862 JR Z,MainGameLoop_Falling
Start falling and set the fall state and initial beep pitch.
24864 LD A,254 Write 254 to *FallingState.
24866 LD (24487),A
24869 LD HL,130 Write 130 to *BeepPitch.
24872 LD (24503),HL
Percy is falling so play a descending beep and move downward.
MainGameLoop_Falling 24875 LD BC,16 Write *BeepPitch + 0016 back to *BeepPitch.
24878 LD HL,(24503)
24881 ADD HL,BC
24882 LD (24503),HL
24885 LD DE,4 DE=0004.
24888 PUSH IX Stash IX on the stack.
24890 CALL 949 Call BEEP.
24893 POP IX Restore IX from the stack.
24895 LD (IX+2),255 Write 255 to *IX+2.
Override input and force all directions inactive and only allow down.
24899 LD HL,24482 Write 31 to *InputState.
24902 LD (HL),31
If Percy has fallen below Y position 141 lose a life.
24904 LD A,(IX+1) A=*IX+1 (Percy's Y position).
24907 CP 141 Jump to Handle_Level_Complete if Percy has fallen off the screen (Percy's Y position is greater than 141).
24909 JP NC,Lose_Life
24912 RES 2,(HL) Reset bit 2 of *HL (force downward movement).
Apply directional movement. Each handler moves Percy in the corresponding direction, checking screen boundaries.
MainGameLoop_MovePercy 24914 LD C,(IX+0) C=*IX+0 (Percy's X position).
24917 LD B,(IX+1) B=*IX+1 (Percy's Y position).
24920 PUSH BC Stash Percy's position on the stack.
24921 LD A,(24482) E=*InputState.
24924 LD E,A
If no direction is pressed, decelerate.
24925 CP 31 Call UpdateMovementSpeed_Decelerate if no direction has been pressed.
24927 CALL Z,UpdateMovementSpeed_Decelerate
24930 LD A,(24494) D=*MovementSpeed.
24933 LD D,A
Dispatch to each direction handler if active.
24934 BIT 4,E Call MovePercyLeft if left is active.
24936 CALL Z,MovePercyLeft
24939 BIT 3,E Call MovePercyRight if right is active.
24941 CALL Z,MovePercyRight
24944 BIT 1,E Call MovePercyUp if up is active.
24946 CALL Z,MovePercyUp
24949 BIT 2,E Call MovePercyDown if down is active.
24951 CALL Z,MovePercyDown
Update the movement speed.
24954 CALL UpdateMovementSpeed Call UpdateMovementSpeed.
If any direction was pressed, store it for animation purposes.
24957 LD A,(24482) A=*InputState.
24960 CP 31 Jump to MainGameLoop_CollisionDetection if there was no input.
24962 JR Z,MainGameLoop_CollisionDetection
24964 LD (24484),A Write A to *PreviousInputState.
Collision detection with room scenery. Converts Percy's position to a room attribute buffer address and checks if Percy overlaps any solid tiles.
MainGameLoop_CollisionDetection 24967 LD D,0 D=0.
24969 LD A,0 Write 0 to *CollisionFlag.
24971 LD (24488),A
24974 LD E,7 E=7.
Load Percy's current position.
24976 LD C,(IX+0) C=*IX+0 (Percy's X position).
24979 LD B,(IX+1) B=*IX+1 (Percy's Y position).
Check if Percy's X position is on a pixel boundary.
24982 LD A,C A=C.
24983 AND %00000111 Keep only bits 0-2 (sub-character X offset).
24985 OR A Jump to MainGameLoop_CalcAttributeAddress if A is zero (aligned to character).
24986 JR Z,MainGameLoop_CalcAttributeAddress
24988 SET 0,D Set bit 0 of D (not X-aligned).
Calculate the room attribute buffer address from Percy's position.
MainGameLoop_CalcAttributeAddress 24990 LD A,C A=C.
24991 RRCA Rotate right three positions (divide X by 8).
24992 RRCA
24993 RRCA
24994 AND %00011111 Keep only bits 0-4 (character column).
24996 LD L,A L=A.
24997 LD A,B A=B.
24998 AND %00000111 Keep only bits 0-2 (sub-character Y offset).
25000 OR A Jump to MainGameLoop_CalcAttributeAddress_2 if A is zero (aligned to character row).
25001 JR Z,MainGameLoop_CalcAttributeAddress_2
25003 SET 1,D Set bit 1 of D (not Y-aligned).
MainGameLoop_CalcAttributeAddress_2 25005 LD A,B A=B.
25006 RLCA Rotate left two positions.
25007 RLCA
25008 AND %11100000 Keep only bits 5-7.
25010 OR L Merge in the column from L.
25011 LD L,A L=A.
25012 LD A,B A=B.
25013 RLCA Rotate left two positions.
25014 RLCA
25015 AND %00000011 Keep only bits 0-1.
25017 OR %11011000 Set bits 3-4 and 6-7 for room attribute buffer at RoomAttributeBuffer.
25019 LD H,A H=A.
Check a vertical strip of attribute cells for solid tiles. The height of the strip depends on whether Percy is Y-aligned.
25020 LD B,2 B=2 (rows to check).
25022 BIT 1,D Jump to MainGameLoop_CollisionCheck_Loop if Y-aligned.
25024 JR Z,MainGameLoop_CollisionCheck_Loop
25026 INC B Check an extra row if not Y-aligned.
MainGameLoop_CollisionCheck_Loop 25027 PUSH BC Stash the row counter on the stack.
Check the current attribute cell and the one to its right.
25028 LD A,(HL) A=*HL.
25029 AND E Mask with E.
25030 CP E Jump to MainGameLoop_CollisionDetected if a collision was detected (not all bits set).
25031 JR NZ,MainGameLoop_CollisionDetected
25033 INC HL Move to the next column.
25034 LD A,(HL) A=*HL.
25035 AND E Mask with E.
25036 CP E Jump to MainGameLoop_CollisionDetected if a collision was detected.
25037 JR NZ,MainGameLoop_CollisionDetected
25039 DEC HL Move back to the original column.
If Percy is not X-aligned, also check the cell two columns right.
25040 BIT 0,D Jump to MainGameLoop_CollisionCheck_NextRow if X-aligned.
25042 JR Z,MainGameLoop_CollisionCheck_NextRow
25044 INC HL Move two columns right.
25045 INC HL
25046 LD A,(HL) A=*HL.
25047 AND E Mask with E.
25048 CP E Jump to MainGameLoop_CollisionDetected if a collision was detected.
25049 JR NZ,MainGameLoop_CollisionDetected
25051 DEC HL Move back two columns.
25052 DEC HL
Move down one row in the attribute buffer and continue.
MainGameLoop_CollisionCheck_NextRow 25053 LD BC,32 HL+=0032.
25056 ADD HL,BC
25057 POP BC Restore the row counter from the stack.
25058 DJNZ MainGameLoop_CollisionCheck_Loop Decrease the row counter by one and loop back to MainGameLoop_CollisionCheck_Loop until all rows are checked.
No collision detected so Percy can move freely. Restore the position from the stack and update the sprite frame.
MainGameLoop_NoCollision 25060 POP BC Restore Percy's previous position from the stack.
25061 LD (IX+2),7 Write 7 to *IX+2.
If Percy is not falling, check for ground beneath.
25065 LD A,(24487) Jump to MainGameLoop_ClearLandedFlag if Percy is falling (*FallingState is set).
25068 OR A
25069 JR NZ,MainGameLoop_ClearLandedFlag
Check if there is ground below Percy's feet. Calculate the attribute address one character row below Percy's position.
MainGameLoop_CheckGround 25071 LD C,(IX+0) C=*IX+0 (Percy's X position).
25074 LD B,(IX+1) B=*IX+1 (Percy's Y position)..
25077 LD A,C A=C.
25078 AND %00000111 Keep only bits 0-2 (sub-character X offset).
25080 PUSH AF Stash the X offset on the stack.
25081 LD A,C A=C.
25082 RRCA Rotate right three positions (divide X by 8).
25083 RRCA
25084 RRCA
25085 AND %00011111 Keep only bits 0-4 (character column).
25087 LD L,A L=A.
Add 16 pixels to the Y position to check below Percy's feet.
25088 LD A,B A=B.
25089 ADD A,16 B=A + 16.
25091 LD B,A
25092 RLCA Rotate left two positions.
25093 RLCA
25094 AND %11100000 Keep only bits 5-7.
25096 OR L Merge in the column.
25097 LD L,A L=A.
25098 LD A,B A=B.
25099 AND %11000000 Keep only bits 6-7.
25101 RRCA Rotate right three positions.
25102 RRCA
25103 RRCA
25104 OR %11000000 Set bits 6-7 for the room attribute buffer at RoomBuffer.
25106 LD H,A H=A.
25107 POP AF Restore the X offset from the stack.
If Percy is X-aligned, skip the extra column check.
25108 OR A Jump to MainGameLoop_CheckGround_ExtraCol if the X offset is non-zero.
25109 JR NZ,MainGameLoop_CheckGround_ExtraCol
25111 LD A,(24485) Jump to MainGameLoop_CheckGround_Test if *PercyFacingDirection is zero (Percy is facing right).
25114 OR A
25115 JR Z,MainGameLoop_CheckGround_Test
MainGameLoop_CheckGround_ExtraCol 25117 INC L Move one column right.
Check if the tile below is a platform (attribute 170).
MainGameLoop_CheckGround_Test 25118 LD A,(HL) Jump to MainGameLoop_ClearLandedFlag if there's no platform below Percy (by checking if the attribute is 170/ INK:RED, PAPER:CYAN (FLASH: ON)).
25119 CP 170
25121 JR NZ,MainGameLoop_ClearLandedFlag
Platform detected so check if Percy should land.
25123 LD A,(24482) Jump to MainGameLoop_CheckGround_TestUp if *InputState states that down is not being pressed.
25126 BIT 2,A
25128 JR NZ,MainGameLoop_CheckGround_TestUp
Down is pressed while on a platform so snap Percy's Y to the platform.
25130 LD A,(IX+1) A=*IX+1.
25133 AND %11111000 Keep only bits 3-7 (snap to character row).
25135 LD (IX+1),A Write A to *IX+1.
25138 OR %11111111 Write 255 to *LandedOnPlatformFlag (landed on platform flag).
25140 LD (24493),A
25143 JR MainGameLoop_UpdateAnimation Jump to MainGameLoop_UpdateAnimation.
Check if up is pressed while on a platform.
MainGameLoop_CheckGround_TestUp 25145 BIT 1,A Jump to MainGameLoop_UpdateAnimation if up is not pressed.
25147 JR NZ,MainGameLoop_UpdateAnimation
No platform below so clear the landed flag.
MainGameLoop_ClearLandedFlag 25149 XOR A Write 0 to clear *LandedOnPlatformFlag.
25150 LD (24493),A
MainGameLoop_UpdateAnimation 25153 JP UpdatePercyAnimation Jump to UpdatePercyAnimation.
Collision with solid scenery detected so reject the move and restore Percy's previous position.
MainGameLoop_CollisionDetected 25156 POP BC Restore the row counter and overwrite it with Percy's previous position from the stack.
25157 POP BC
If Percy is falling, handle the impact.
25158 LD A,(24487) Jump to MainGameLoop_FallImpact if Percy is falling (*FallingState is set).
25161 OR A
25162 JR NZ,MainGameLoop_FallImpact
Check if Percy has hit the bottom of the screen.
25164 LD A,(IX+1) Jump to MainGameLoop_SnapPosition if Percy's Y position (*IX+1) is greater than or equal to 145 and Percy is at the bottom of the screen.
25167 CP 145
25169 JR NC,MainGameLoop_SnapPosition
Special case; if in room 6 treat collision differently.
25171 LD A,(24517) Jump to MainGameLoop_SnapPosition if *CurrentRoom is room 6.
25174 CP 6
25176 JR Z,MainGameLoop_SnapPosition
Check if the collision cell is empty.
25178 LD A,(HL) A=*HL.
25179 AND E Mask with E.
25180 OR A Jump to MainGameLoop_SnapPosition if the cell is empty.
25181 JR Z,MainGameLoop_SnapPosition
Handle Percy falling and hitting something.
MainGameLoop_FallImpact 25183 CP 254 Jump to MainGameLoop_FallImpact_Done if A is 254.
25185 JR Z,MainGameLoop_FallImpact_Done
25187 OR %11111111 Write 255 to *FallingState.
25189 LD (24487),A
25192 LD (IX+2),255 Write 255 to *IX+2.
MainGameLoop_FallImpact_Done 25196 JP UpdatePercyAnimation Jump to UpdatePercyAnimation.
Percy has moved past a screen boundary so trigger a room transition. The direction determines which room to move to.
MainGameLoop_SnapPosition 25199 LD A,1 Write 1 to;
25201 LD (24494),A
25204 LD (24488),A
Restore Percy's position from before the rejected move.
25207 LD (IX+0),C Write C to *IX+0 (Percy's X position).
25210 LD (IX+1),B Write B to *IX+1 (Percy's Y position).
25213 JP UpdatePercyAnimation Jump to UpdatePercyAnimation.
Prev: 24551 Up: Map Next: 25216