Patch:Keen 6 map items

From KeenWiki
(Redirected from Patch:Stupendous sandwich)
Jump to navigation Jump to search

This page lists patches for the three items used to pass obstacles on the map in Keen 6. These are the Bloogstar rocket pass, the Rope and grappling hook and the Stupendous sandwich. Patches relating to the map obstacles themselves are covered at Patch:Map (Keen 6). This page is a sprite page, since the map items are sprites. For patches relating to other items in Keen 6 see Patch:Items.

As a note, the rope and grappling hook that is placed on the map by Keen is also covered on this page, as it is too simple to have its own page, at least at present. The Bloogstar Rocket and Grabbiter have their own pages. (But again the sandwich and rocket pass do not.) Note also that Molly technically counts as a special item, using the same sprite collision as special items. The Satellite is not counted and has its own page, though it is similar in function.

The page is divided into three sections. The first deals with the items as sprites, objects that appear in the level that do things. The second deals with the items on the map, what happens when Keen does or does not have the items. Finally there is a short section on how the items appear in the status window.


Items as sprites

This section covers all patches relating to the items as sprites. Thing such as their speeds and animations. Roughly speaking anything that does not involve the map level.


Sprite Type

The Map item's sprite types are important since they are checked in the special item collision code to determine what happens when Keen contacts the sprite. As such changing them will interfere with Keen getting items or winning the game (in the case of Moloy.)

Keen 6

#Map item sprite types
%patch $FF6E  $1B #Sandwich
%patch $FFAF  $1C #Rope
%patch $FFF0  $1D #Passcard
%patch $1007F $0C #Molly


Sprite Actions

The map items have a set of simple actions as they do not do much. Each item is spawned with its first action. The first three items proceed to do nothing, their action doesn't change. Molly however has a four action cycle she remains in indefinitely.

Actions:
$1D06W #Sandwich
$1D24W #Rope
$1D42W #Card
$1D60W #Molly 1
$1D7EW #Molly 2
$1D9CW #Molly 3
$1DBAW #Molly 4

Keen 6

#Sandwich spawned
%patch $FF83 [$1D06W]

#Sandwich sit
%patch $32A52 [$0000W]

#Rope spawned
%patch $FFC4 [$1D24W]

#Rope sit
%patch $32A70 [$0000W]

#Passcard spawned
%patch $10005 [$1D42W]

#Passcard sit
%patch $32A8E [$0000W]

#Molly spawned
%patch $100C8 [$1D60W]

#Molly cycle
%patch $32AAC [$1D7EW]
%patch $32ACA [$1D9CW]
%patch $32AE8 [$1DBAW]
%patch $32B06 [$1D60W]


Sprite Behavior

The map items have no behaviors at all. This includes Molly.

Sprite behaviors

#Sandwich
%patch $32A46 $00000000L

#Rope
%patch $32A64 $00000000L

#Passcard
%patch $32A82 $00000000L

#Molly
%patch $32AA0 $00000000L
%patch $32ABE $00000000L
%patch $32ADC $00000000L
%patch $32AFA $00000000L


Speed

As none of the map items move, their animation speeds are zero.

Sprite speeds

#Sandwich
%patch $32A42 [$0000W $0000W]

#Rope
%patch $32A60 [$0000W $0000W]

#Passcard
%patch $32A7E [$0000W $0000W]

#Molly
%patch $32A9C [$0000W $0000W]
%patch $32ABA [$0000W $0000W]
%patch $32AD8 [$0000W $0000W]
%patch $32AF6 [$0000W $0000W]


Sprite Collision

The map items all use the same collision, which is unusual since they achieve different things. Even Molly uses this collision.


Collision values

These are the collision values for the map item's actions. Notice they all use the same collision, despite being very different objects.

Keen 6

#Stupendous Sandwich
%patch $32A4A $0EFC1053RL

#Rope
%patch $32A68 $0EFC1053RL

#Rocket Passcard
%patch $32A86 $0EFC1053RL

#Molly
%patch $32AA4 $0EFC1053RL
%patch $32AC2 $0EFC1053RL
%patch $32AE0 $0EFC1053RL
%patch $32AFE $0EFC1053RL


Collision code

The special item collision is complicated but composed on simple parts. On the first line Keen's sprite type is checked for, if found the following code is run. (So only Keen can interact with special items.) After this the code checks the item's sprite type to see what should be done next.

The first check is for the Rope's sprite type, $001CW. If this is found code is skipped to the end of line 4, setting the level state to $000AW (Get rope, exit level.)

Right after this Molly's type is checked for and if found, code is skipped to line 6, setting the level state to $000CW (Win game.)

After this the Sandwich's type is checked for and if found, code is skipped to the start of line 4, setting the level state to $0009W (Get Sandwich, exit level.)

Finally the Card's type is checked for and if found, code is skipped to the middle of line 5, setting the level state to $000BW (Get Card, exit level.)

Keen 6

#Special item collision
%patch $10013 $55 $8B $EC $56 $57 $8B $76 $06 $8B $7E $08 $83 $3D [$02] {$75} $44
              $8B $04 $3D [$001CW]  {$74} $23 $7F $0E $3D [$000CW]  {$74} $30 $3D [$001BW]
                  {$74} $0D $5F $5E $5D $CB $3D [$001DW]  {$74} $18 $5F $5E $5D $CB
              $C7 $06 {$75ACW}  [$0009W] $5F $5E $5D $CB $C7 $06 {$75ACW}  [$000AW]
              $5F $5E $5D $CB $C7 $06 {$75ACW}  [$000BW] $5F $5E $5D $CB $C7 $06
              {$75ACW}  [$000CW] $5F $5E $5D $CB


Level state and items

These patches allow simple alterations of the level state each item sets when it is obtained. This is in fact responsible for things like getting the item or (in Molly's case) winning the game. A value of '0' will do nothing.

Keen 6

#Level state items set
%patch $10047 [$0009W] #Sandwich
%patch $10051 [$000AW] #Rope
%patch $1005B [$000BW] #Rocket Pass
%patch $10065 [$000CW] #Molly


Item doesn't win level

This patch makes an item (In this case the Grappling Hook) not win the level when obtained, merely vanish after its window has appeared. To do this the item must be given a new collision that makes it disappear. (This patch assumes that the mod does not use the Dreams-style level entry window patch.)

Here $0E420A8ARL calls the grappling hook window. $0E4209FCRL would call the Sandwich and $0E420B18RL the Passcard.

Keen 6

#Grappling hook continues level = $125A1641RL
%patch $32A68 $125A1641RL
%patch $13BE1 $55 $8B $EC $56 $57 $8B $76 $06 $8B $7E $08 $83 $3D $02 $75 $10
              $9A $0E420A8ARL     $C7 $44 $1C $0000W  $C7 $06 $75ACW  $0006W
              $5F $5E $5D $CB


Animations

Each item has a single animation to itself, and does not animate at all by default, though this can easily be changed. There are two other animations related to the rope and grappling hook, one for the rope being thrown by Keen, the second for the rope sitting on the map. Notice that the rope being thrown animates.

Interestingly each item has its own cache despite only using a single animation. (In other games only this animation is cached at spawning and no dedicated cache would be needed.)

Keen 6 map item animations

#Rope cache
%patch $32452 {$00B7W} #Rope cache start
%patch $324A2 {$00B7W} #Rope cache end

#Sandwich cache
%patch $32454 {$00B6W} #Sandwich cache start
%patch $324A4 {$00B6W} #Sandwich cache end

#Rocket pass cache
%patch $32458 {$01B3W} #Card cache start
%patch $324A8 {$01B3W} #Card cache end

#Stupendous Sandwich
%patch $32A36 $00B6W $00B6W
%patch $32A40 $0000W        #Animation speed

#Grappling Hook
%patch $32A54 $00B7W $00B7W
%patch $32A5E $0000W        #Animation speed

#Rocket Passcard
%patch $32A72 $01B3W $01B3W
%patch $32A7C $0000W        #Animation speed

#Molly McMire
%patch $32A90 $01B1W $01B1W
%patch $32A9A $0014W        #Animation speed
%patch $32AAE $01B2W $01B2W
%patch $32AB8 $0028W        #Animation speed
%patch $32ACC $01B1W $01B1W
%patch $32AD6 $0028W        #Animation speed
%patch $32AEA $01B2W $01B2W
%patch $32AF4 $0014W        #Animation speed


Clipping and foreground

Molly's clipping cannot be patched as it uses a default value. The remaining items have no clipping by default meaning they will ignore tiles. Molly's foreground variable is 0 meaning that she appears behind all tiles while the other items have a value of 2 which allows them to appear in front of most tiles and sprites, making them more prominent.

Keen 6

#Clipping variables
%patch $FF65  [$0000W] #Sandwich
%patch $FFA6  [$0000W] #Rope
%patch $FFE7  [$0000W] #Rocket Passcard

Keen 6

#Foreground variables
%patch $FF6A  [$0002W] #Sandwich
%patch $FFAB  [$0002W] #Rope
%patch $FFEC  [$0002W] #Rocket Passcard
%patch $10089 [$0000W] #Molly


Item sounds

The sprites themselves have no sounds but sounds are played when various text windows appear relating to the items. These are covered in the second section of this page.


Probability

Molly is the only map item with any sort of randomness. As an artifact of her being intended to walk she randomly starts the level moving right or left with a 50:50 chance of either.

Keen 6

#Chance of Molly initially moving right
%patch $100A6 $80


Sprite-tile interaction

None of the items interact with tiles in any complex way, so they use a generic interaction code.This includes Molly and is part of the reason why she could clip through doors in version 1.4 of the game.

Sprite tile interactions

#Sandwich
%patch $32A4E $08F4180ARL

#Rope
%patch $32A6C $08F4180ARL

#Passcard
%patch $32A8A $08F4180ARL

#Molly
%patch $32AA8 $08F4180ARL
%patch $32AC6 $08F4180ARL
%patch $32AE4 $08F4180ARL
%patch $32B02 $08F4180ARL


Action type

Needing to react quickly to Keen the three most basic items have type 2 actions. Molly's actions are type 0, as she doesn't need to do anything particular involved.

Sprite action types

#Sandwich
%patch $32A3A [$0002W]

#Rope
%patch $32A58 [$0002W]

#Passcard
%patch $32A76 [$0002W]

#Molly
%patch $32A94 [$0000W]
%patch $32AB2 [$0000W]
%patch $32AD0 [$0000W]
%patch $32AEE [$0000W]


Deprotect and stick to ground

The map items, including Molly, have no need for either of these variables and so has a value of 0 for both in all of their actions.

Sprite deprotect, stick

#Sandwich
%patch $32A3C [$0000W $0000W]

#Rope
%patch $32A5A [$0000W $0000W]

#Passcard
%patch $32A78 [$0000W $0000W]

#Molly
%patch $32A96 [$0000W $0000W]
%patch $32AB4 [$0000W $0000W]
%patch $32AD2 [$0000W $0000W]
%patch $32AF0 [$0000W $0000W]


Sprite spawn code

The first three items have near identical spawning codes while that of Molly is more complex and is contained on a different page. There is only one kind of each item initiation pointer.

The initiation codes are quite simple, they spawn the item and set the item's cache in the code $C7 $06 $CDxxW $0001W.

In the spawning code the last blue highlighted value is the sprite action the sprite uses as it proceeds to act in-level. $C7 $02 $xxxxW sets the sprite activity, $C7 $07 $xxxxW sets the sprite type, $C7 $20 $xxxxW sets the foreground value. Finally $D3 $E0 $05 $xxxx is how far down (Or more usually up) the sprite is spawned from where it is placed. This is necessary for sprites that walk on the ground as they can only be placed in the level at multiples of 16 pixels high while their actual height can be anything. Molly uses this to position herself in-level.

Molly, but no other map items always starts the level moving down and randomly chooses whether to move left or right. (This is an artifact of when she was designed to be able to move.) $C7 $47 $10 $xxxxW is the vertical direction the sprite starts moving in, either $0001W (Facing down), $FFFFW (Facing up) or $0000W (Neither, seldom used.) $C7 $47 $0E $xxxxW is the horizontal direction. The random check is $9A $1CF30034RL $3D $0080W

Keen 6

#Location of items' initiation codes
%patch $EA16 [$0440W] #Rope and grappling hook (At $E860)
%patch $EA18 [$0452W] #Sandwich (At $E872)
%patch $EA1A [$0464W] #Rocket pass (At $E884)

#Rope initiation code
%patch $E860 $57 $56 $9A {$0EFC0FD1RL}     $83 $C4 $04 $C7 $06 $CD3FW  $0001W
             $EB $55

#Sandwich initiation code
%patch $E872 $57 $56 $9A {$0EFC0F90RL}     $83 $C4 $04 $C7 $06 $CD41W  $0001W
             $EB $43

#Rocket pass initiation code
%patch $E884 $57 $56 $9A {$0EFC1012RL}     $83 $C4 $04 $C7 $06 $CD45W  $0001W
             $EB $31

#Sandwich spawning code
%patch $FF50 $55 $8B $EC $33 $C0 $50 $9A $069A1E25RL     $83 $C4 $02 $8B $1E
             $66 $A9 $C7 $47 $06 [$0000W]  $C7 $47 $20 [$0002W]  $C7 $07 [$001BW]
             $8B $46 $06 $B1 $08 $D3 $E0 $89 $47 $0A $8B $46 $08 $D3 $E0 $89
             $47 $0C $B8 [$1D06W]  $50 $53 $9A $08F41219RL     $83 $C4 $04 $5D
             $CB

#Rope spawning code
%patch $FF91 $55 $8B $EC $33 $C0 $50 $9A $069A1E25RL     $83 $C4 $02 $8B $1E
             $66 $A9 $C7 $47 $06 [$0000W]  $C7 $47 $20 [$0002W]  $C7 $07 [$001CW]
             $8B $46 $06 $B1 $08 $D3 $E0 $89 $47 $0A $8B $46 $08 $D3 $E0 $89
             $47 $0C $B8 [$1D24W]  $50 $53 $9A $08F41219RL     $83 $C4 $04 $5D
             $CB

#Passcard spawning code
%patch $FFD2 $55 $8B $EC $33 $C0 $50 $9A $069A1E25RL     $83 $C4 $02 $8B $1E
             $66 $A9 $C7 $47 $06 [$0000W]  $C7 $47 $20 [$0002W]  $C7 $07 [$001DW]
             $8B $46 $06 $B1 $08 $D3 $E0 $89 $47 $0A $8B $46 $08 $D3 $E0 $89
             $47 $0C $B8 [$1D42W]  $50 $53 $9A $08F41219RL     $83 $C4 $04 $5D
             $CB

#Molly spawning code
%patch $1006B $55 $8B $EC $33 $C0 $50 $9A $069A1E25RL     $83 $C4 $02 $8B $1E
              $66 $A9 $C7 $07 [$000CW]  $C7 $47 $02 [$0001W]  $C7 $47 $20 [$0000W]
              $8B $46 $06 $B1 $08 $D3 $E0 $89 $47 $0A $8B $46 $08 $D3 $E0 $05
              [$FF80W]  $89 $47 $0C $9A $1CF30034RL     $3D [$0080W]  $7D $0B $8B
              $1E $66 $A9 $C7 $47 $0E [$0001W]  $EB $09 $8B $1E $66 $A9 $C7 $47
              $0E [$FFFFW]  $8B $1E $66 $A9 $C7 $47 $10 [$0001W]  $B8 [$1D60W]  $50
              $53 $9A $08F41219RL     $83 $C4 $04 $5D $CB


Items on the map

This section of the page contains patches relating to the various text windows produced on the map relating to the items.


Map item checks

On the map there are three checks to see if Keen has a particular item. If he does not one sequence will occur. (A text window.) and if he does another will occur. See Patch:Game stats and Patch:Jump conditions. By default the game checks to see whether or not the item's value is 0.

Keen 6 sounds

#Passcard check
%patch $F6EC {$7598W} $0B $C0 {$74}

#Rope and hook check
%patch $FB98 {$7596W} $0B $C0 {$74}


Don't need items

These patches skip the item checks; Keen will not need the item to pass a map obstacle.

Keen 6

#Keen can always use the Bloogstar Rocket
%patch $F6EE $E9 $00B0W

#Keen can always scale the cliff
%patch $FB9C $90 $90


Sounds

These are the various sounds relating to the map items. They are produced when items are got, used or when Keen attempts to do something without the correct item. Each sound can be silenced.

Keen 6 map item sounds

%patch $EE25 $2D     #Got Sandwich sound
%patch $EE24 $EB $0A #Don't play got Sandwich sound

%patch $EEB3 $2D     #Get Rope sound
%patch $EEB2 $EB $0A #Don't play Get Rope sound

%patch $EF41 $2D     #Get Rocket Passcard sound
%patch $EF40 $EB $0A #Don't play Get Rocket Passcard sound

%patch $F55A $39     #Keen meets Grabbiter with Sandwich sound
%patch $F559 $EB $0A #Don't play Keen meets Grabbiter with Sandwich sound

%patch $F5B1 $0E     #Keen meets Grabbiter without Sandwich sound
%patch $F5B0 $EB $0A #Don't play Keen meets Grabbiter without Sandwich sound

%patch $F756 $0E     #Keen tries to use rocket without passcard sound
%patch $F755 $EB $0A #Don't play Keen tries to use rocket without passcard sound

%patch $F7DA $38     #Keen enter rocket sound
%patch $F7D9 $EB $0A #Don't play Keen enter rocket sound

%patch $F846 $36     #Rocket fly sound
%patch $F845 $EB $0A #Don't play Rocket fly sound

%patch $FC0A $0E     #Keen touch cliff without grappling hook sound
%patch $FC09 $EB $0A #Don't play Keen touch cliff without grappling hook sound

%patch $FC5A $35     #Keen throw rope sound
%patch $FC59 $EB $0A #Don't play Keen throw rope sound


Items text windows

This is the text used in levels when Keen runs into an item or item obstacle with and without his items. There are around eight variables for each window that must be considered. Most windows play a sound (patches that block this sound can be found in the subsection above.)

The windows must cache the graphics they are using before they appear. In this case there will be two matching values, one to cache and one to display. Notice that bitmaps are referred to by their 'chunk number', that is, what graphic chunk they are in EGAGRAPH.CK6; this is the bitmap number (When exported via ModKeen, Keengraph numbers the bitmaps 'correctly') plus six. The bitmap is placed right in the window by a certain number of pixels. By default this is the same as the image's width so that the displayed bitmap is 'right aligned'. Paired with this is a second, equal variable that moves the text in the opposite direction so that it is not centered in the window (and thus overwriting the bitmap.) These variables can be 'reversed' by making them negative. (Changing $0030W to $00D0W and $30 to $D0 for example.)

There is also the window height and width which are self explanatory and finally the text call which determines where the window's text is called from. (See Patch:Text patches and Patch:Text windows.)

Keen 6 item map texts

#Sandwich
%patch $EE25  [$0039W] #Play sound
%patch $EE36  [$0023W] #Cache Keen's head
%patch $EE52  [$0023W] #Display Keen's head
%patch $EE61  [$0030W] #Rightwards location of Keen's head bitmap
%patch $EE70  [$30]    #Leftwards location of text
%patch $EE42  [$0008W] #Window height
%patch $EE46  [$001AW] #Window width
%patch $EE77  [$1886W] #Text called from
#Stupendous Sandwich of Chungella IV:
%patch $325B6 "This is the second" $0A
              "biggest sandwich" $0A
              "I ever saw!" $0A $00

#Grabbiter without sandwich:
%patch $F55A  [$0039W] #Play sound
%patch $F54E  [$0023W] #Cache Keen's head
%patch $F57B  [$0023W] #Display Keen's head
%patch $F58A  [$0030W] #Rightwards location of Keen's head bitmap
%patch $F59A  [$30]    #Leftwards location of text
%patch $F56B  [$0008W] #Window height
%patch $F56F  [$001AW] #Window width
%patch $F5A0  [$22EAW] #Text called from
%patch $3301A "Oh, no!" $0A
              "It's a slavering" $0A
              "Grabbiter! He says," $0A
          $22 "Get me lunch and" $0A
              "I'll tell ya a secret!" $22 $00

#Grabbiter with sandwich:
%patch $33071 "The Grabbiter grabs" $0A
              "the gigantic sandwich," $0A
              "downs it in one bite," $0A
              "and says," $22 "Here's your" $0A
              "secret. Big meals" $0A
              "make me sleepy!" $22 $00

#Rope and grappling hook:
%patch $EF16  [$000EW] #Play sound
%patch $EEC4  [$0023W] #Cache Keen's head
%patch $EEE0  [$0023W] #Display Keen's head
%patch $EEEF  [$0030W] #Rightwards location of Keen's head bitmap
%patch $EEFE  [$30]    #Leftwards location of text
%patch $EED0  [$0008W] #Window height
%patch $EED4  [$001AW] #Window width
%patch $EF05  [$18B7W] #Text called from
%patch $325E7 "Wow! A rope and" $0A
              "grappling hook!" $0A
              "They look useful!" $0A $00

#Cliff without rope + hook:
%patch $FC0A  [$000EW] #Play sound
%patch $FBB3  [$0023W] #Cache Keen's head
%patch $FBD4  [$0023W] #Display Keen's head
%patch $FBE3  [$0030W] #Rightwards location of Keen's head bitmap
%patch $FBF2  [$30]    #Leftwards location of text
%patch $FBC4  [$0008W] #Window height
%patch $FBC8  [$001AW] #Window width
%patch $FBF9  [$2409W] #Text called from
%patch $33139 "What a tall cliff" $0A
              "Wish I had a rope" $0A
              "and grappling hook." $0A $00

#Rocket passcard
%patch $EF41  [$002DW] #Play sound
%patch $EF52  [$0023W] #Cache Keen's head
%patch $EF6E  [$0023W] #Display Keen's head
%patch $EF7D  [$0030W] #Rightwards location of Keen's head bitmap
%patch $EF8C  [$30]    #Leftwards location of text
%patch $EF5E  [$0008W] #Window height
%patch $EF62  [$001AW] #Window width
%patch $EF93  [$18EAW] #Text called from
%patch $3261A "What's this? Cool!" $0A
              "A passcard for" $0A
              "the Bloogstar Rocket!" $0A
              "(It can fly through" $0A
              "their force field.)" $0A $00

#Rocket without passcard
%patch $F756  [$000EW] #Play sound
%patch $F6F3  [$0023W] #Cache Keen's head
%patch $F720  [$0023W] #Display Keen's head
%patch $F72F  [$0030W] #Rightwards location of Keen's head bitmap
%patch $F710  [$0008W] #Window height
%patch $F714  [$001AW] #Window width
%patch $F745  [$23BBW] #Text called from
%patch $330EB "The door makes a loud" $0A
              "blooping noise." $0A
              "It says," $0A
          $22 "Passcard required" $0A
              "for entry." $22 $00


Don't show Keen's bitmap in windows

These patches prevent Keen's portrait bitmap appearing in the various windows. This slightly reduces the memory each window takes.

Don't show Keen's bitmap in windows

#Don't show Keen's bitmap in window - Sandwich window
%patch $EE35  $EB $0A
%patch $EE51  $EB $19

#Don't show Keen's bitmap in window - Bloogstar Rocket Pass window
%patch $EF51 $EB $0A
%patch $EF6D $EB $19

#Don't show Keen's bitmap in window - Grabbiter without Sandwich window
%patch $F54D  $EB $0A
%patch $F57A  $EB $19

#Don't show Keen's bitmap in window - Bloogstar Rocket without Pass window
%patch $F6F2  $EB $0A
%patch $F71F  $EB $19

#Don't show Keen's bitmap in window - Cliff window
%patch $FBB2  $EB $0A
%patch $FBD3  $EB $19


Complete window codes

These patches are the entire codes for various map item windows. They are rather simple once understood. See Patch:Text windows.


Rope Obtained window

This is the complete window code for the window that appears when the rope is obtained. The first line plays sound $2D, the second line caches Keen's head bitmap ($0023W) which is then displayed on line 4. Notice that bitmaps are referred to by their 'chunk number', that is, what graphic chunk they are in EGAGRAPH.CK6; this is the bitmap number (When exported via ModKeen, Keengraph numbers the bitmaps 'correctly') plus six. The window's size is set on line 3 as being $08x$1A

The image is aligned right by $0030W pixels. By default this is the same as the image's width so that the displayed bitmap is 'right aligned'. Paired with this is a second, equal variable that moves the text in the opposite direction so that it is not centered in the window (and thus overwriting the bitmap.) These variables can be 'reversed' by making them negative. (Changing $0030W to $00D0W and $30 to $D0 for example.)

Finally the text call on line 6 which determines where the window's text is called from. (See Patch:Text patches.) The value $001EW is the 'pause' before the player can dismiss the window by pressing a key. Finally after the window has been displayed the sandwich variable is set to 1 on the last line. (The rope is given.)

Keen 6

#Complete Rope got window code
%patch $EEAA $55 $8B $EC $9A $183B0AFDRL    $B8 [$002DW]  $50 $9A $183B09F1RL
                 $83 $C4 $02 $9A $125A14BERL     $B8 [$0023W]  $50 $9A $125A1108RL
                     $83 $C4 $02 $B8 [$0008W]  $50 $B8 [$001AW]  $50 $9A $18F81070RL
                     $83 $C4 $04 $B8 [$0023W]  $50 $FF $36 $6C $A9 $A1 $C1 $A6
             $03 $06 $BF $A6 $2D [$0030W]  $50 $9A $1CF70C83RL     $83 $C4 $06
             $83 $2E $BF $A6 [$30] $83 $06 $C3 $A6 $0C $B8 [$18B7W]  $50 $9A 
          $18F80EBDRL    $83 $C4 $02 $9A $1CF70AA5RL     $B8 [$001EW]  $50 $9A
             $1DFB0ADDRL     $83 $C4 $02 $9A $141308A9RL     $9A $14130EE0RL
             $9A $125A14DERL     $C7 $06 {$7596W}  [$0001W]  $5D $CB


Sandwich Obtained window

This is the complete window code for the window that appears when the sandwich is obtained. The first line plays sound $2D, the second line caches Keen's head bitmap ($0023W) which is then displayed on line 4. Notice that bitmaps are referred to by their 'chunk number', that is, what graphic chunk they are in EGAGRAPH.CK6; this is the bitmap number (When exported via ModKeen, Keengraph numbers the bitmaps 'correctly') plus six. The window's size is set on line 3 as being $08x$1A

The image is aligned right by $0030W pixels. By default this is the same as the image's width so that the displayed bitmap is 'right aligned'. Paired with this is a second, equal variable that moves the text in the opposite direction so that it is not centered in the window (and thus overwriting the bitmap.) These variables can be 'reversed' by making them negative. (Changing $0030W to $00D0W and $30 to $D0 for example.)

Finally the text call on line 6 which determines where the window's text is called from. (See Patch:Text patches.) The value $001EW is the 'pause' before the player can dismiss the window by pressing a key. Finally after the window has been displayed the sandwich variable is set to 1 on the last line. (The sandwich is given.)

Keen 6

#Complete Sandwich got window code
%patch $EF38 $55 $8B $EC $9A $183B0AFDRL     $B8 [$002DW]  $50 $9A $183B09F1RL
                 $83 $C4 $02 $9A $125A14BERL     $B8 [$0023W]  $50 $9A $125A1108RL
                     $83 $C4 $02 $B8 [$0008W]  $50 $B8 [$001AW]  $50 $9A $18F81070RL
                 $83 $C4 $04 $B8 [$0023W]  $50 $FF $36 $6C $A9 $A1 $C1 $A6
             $03 $06 $BF $A6 $2D [$0030W]  $50 $9A $1CF70C83RL     $83 $C4 $06
             $83 $2E $BF $A6 [$30] $83 $06 $C3 $A6 $0C $B8 [$1886W]  $50 $9A
         $18F80EBDRL     $83 $C4 $02 $9A $1CF70AA5RL     $B8 [$001EW]  $50 $9A
             $1DFB0ADDRL     $83 $C4 $02 $9A $141308A9RL     $9A $14130EE0RL
             $9A $125A14DERL     $C7 $06 {$7594W}  [$0001W]  $5D $CB


Rocket Passcard Obtained window

This is the complete window code for the window that appears when the Rocket Passcard is obtained. The first line plays sound $2D, the second line caches Keen's head bitmap ($0023W) which is then displayed on line 4. Notice that bitmaps are referred to by their 'chunk number', that is, what graphic chunk they are in EGAGRAPH.CK6; this is the bitmap number (When exported via ModKeen, Keengraph numbers the bitmaps 'correctly') plus six. The window's size is set on line 3 as being $08x$1A

The image is aligned right by $0030W pixels. By default this is the same as the image's width so that the displayed bitmap is 'right aligned'. Paired with this is a second, equal variable that moves the text in the opposite direction so that it is not centered in the window (and thus overwriting the bitmap.) These variables can be 'reversed' by making them negative. (Changing $0030W to $00D0W and $30 to $D0 for example.)

Finally the text call on line 6 which determines where the window's text is called from. (See Patch:Text patches.) The value $001EW is the 'pause' before the player can dismiss the window by pressing a key. Finally after the window has been displayed the rocket passcard variable is set to 1 on the last line. (The card is given.)

Keen 6

#Complete Rocket Pass got window code
%patch $EF38 $55 $8B $EC $9A $183B0AFDRL     $B8 [$002DW]  $50 $9A $183B09F1RL
                 $83 $C4 $02 $9A $125A14BERL     $B8 [$0023W]  $50 $9A $125A1108RL
                     $83 $C4 $02 $B8 [$0008W]  $50 $B8 [$001AW]  $50 $9A $18F81070RL
                 $83 $C4 $04 $B8 [$0023W]  $50 $FF $36 $6C $A9 $A1 $C1 $A6
             $03 $06 $BF $A6 $2D [$0030W]  $50 $9A $1CF70C83RL     $83 $C4 $06
             $83 $2E $BF $A6 [$30] $83 $06 $C3 $A6 $04 $B8 [$18EAW]  $50 $9A
         $18F80EBDRL     $83 $C4 $02 $9A $1CF70AA5RL     $B8 [$001EW]  $50 $9A
             $1DFB0ADDRL     $83 $C4 $02 $9A $141308A9RL     $9A $14130EE0RL
             $9A $125A14DERL     $C7 $06 {$7598W}  [$0001W]  $5D $CB


Items and the status window

These patches relate to the display of the special items in the game's status window; for an explanation of how the patches work see here.

Keen 6 status window items placement

#Item text
%patch $7C3C [$0050W] #Vertical
%patch $7C42 [$0060W] #Horizontal
%patch $7C45 [$05BBW] #Text read from
%patch $312EB "ITEMS" $00 

#Background rectangle
%patch $7C54 [$000AW] #Height
%patch $7C58 [$001AW] #Width
%patch $7C5C [$005FW] #Vertical position
%patch $7C60 [$007FW] #Horizontal position

#Sandwich counter
%patch $7C6D {$7594W} $01 $75 #Track sandwich (If 1 draw tile 2, else draw tile 1)
%patch $7C73 [$0002W] #Tile if got
%patch $7C77 [$0060W] #Vertical position if got
%patch $7C7B [$0080W] #Horizontal position if got
%patch $7C89 [$0001W] #Tile if not got
%patch $7C8D [$0060W] #Vertical position if not got
%patch $7C91 [$0080W] #Horizontal position if not got

#Rope+hook counter
%patch $7C9E {$7596W} $01 $75 #Track Rope+hook (If 1 draw tile 4, else draw tile 3)
%patch $7CA4 [$0004W] #Tile if got
%patch $7CA8 [$0060W] #Vertical position if got
%patch $7CAC [$0088W] #Horizontal position if got
%patch $7CBA [$0003W] #Tile if not got
%patch $7CBE [$0060W] #Vertical position if not got
%patch $7CC2 [$0088W] #Horizontal position if not got

#Rocket card counter
%patch $7CCF {$7598W} $01 $75 #Track Rocket card (If 1 draw tile 6, else draw tile 5)
%patch $7CD5 [$0006W] #Tile if got
%patch $7CD9 [$0060W] #Vertical position if got
%patch $7CDD [$0090W] #Horizontal position if got
%patch $7CEB [$0005W] #Tile if not got
%patch $7CEF [$0060W] #Vertical position if not got
%patch $7CF3 [$0090W] #Horizontal position if not got


#Don't draw
%patch $7C48 $90 $90 $90 $90 $90 #Items text
%patch $7C63 $90 $90 $90 $90 $90 #Background rectangle

%patch $7C7E $90 $90 $90 $90 $90 #Sandwich if got
%patch $7C94 $90 $90 $90 $90 $90 #Sandwich not got
%patch $7C6B $EB $2F		 #Sandwich at all

%patch $7CAF $90 $90 $90 $90 $90 #Rope+hook if got
%patch $7CC5 $90 $90 $90 $90 $90 #Rope+hook not got
%patch $7C9C $EB $2F		 #Rope+hook at all

%patch $7CE0 $90 $90 $90 $90 $90 #Rocket card if got
%patch $7CF6 $90 $90 $90 $90 $90 #Rocket card not got
%patch $7CCD $EB $2F		 #Rocket card at all