The Jam Website: https://itch.io/jam/game-off-2022
I would like to make a minimal, atmospheric 2D platformer directly inspired by the game Knytt.
The world will be comprised of a grid of screens, each of which having its own character and “area”. There will be occasional background music clips of 10-20 seconds as well as atmospheric noise in some areas.
The goal will be to explore and pick up a series of items you need to win the game.
You can run around around the world freely, climb up walls and jump over obstacles.
You might be able to pick up powerup items that enable you to reach new areas a la Metroid.
There might be a mechanic for helping you find your way to the next item like in Knytt.
Cliche Ideas
- He left no stone unturned
- Clear the air
- As old as time
- Ear to the ground
- Built to last
- Back to square one
The concept:
You are a character who lives in a realm where there has been peace for a long time. One day, the Puria Stones that protect the realm were stolen and hidden across the land. Since then, the air has become unclean and it it is not safe to stay.
Your character must venture through the different areas of the realm to find all the missing stones and reassemble them so that the air becomes clear once again. The stones all make their own special sound, so you need to listen for them to find your way.
Once you find them, you must head back to the town square (the starting location) to reassemble the altar of the Puria Stones!
- The Sound of Stones
- Call of the Stones
Let’s imagine that there are 4 stones to pick up. Each stone should exist in its own ideally unique area, so that means 4 zones. There would also be the starting zone that is the nexus to all the other zones.
Number of screens needed: 15 + 16 + 12 + 15 = 58
- The starting point of the game is here
- Green, vegetation
- Open expanses, easy to traverse, light platforming
- 5x3: You start in the center of the 3-wide and the adjacent screens lead you to the stone zones
Starting screen of the game is at 4x1
- A dark cave
- Larger zone (4x4)
- More like a maze than other areas
- Cave connects to underground magma system
- Long and flat (maybe like 6x2)
- Lots of platforming, jumping over obstacles
- Buttons and doors that have to be pressed to proceed
- 3x5
Since we know that each area will have a predetermine screen arrangement, we can name the screen based on their position in their own zone, for example:
peace-1-1.stm
dark-3-2.stm
The map editor will be very simple. Hit TAB to enter edit mode and then click anywhere to place a tile.
The number row keys will let you change which tile to use:
- 0: Empty tile
- 1: Block tile
- 2: top left corner
- 3: top surface
- 4: top right corner
- 5: left wall
- 6: right wall
- 7: bottom left corner
- 8: bottom surface
- 9: bottom right corner
- Each zone will have a stone you need to collect to bring back to the starting screen.
- Each stone will be placed a specific location, it won’t be randomly selected (for now)
- The game engine knows the location of all stones regardless of which map you’re on
- If you press the listen button (K) then a sound should play to direct you toward the nearest stone
Locations:
- peace-5-1
- cave-1-1
- tech-2-3
- lava-3-1
Tiles we need at first:
- 1: Internal wall/ground tile
- 2: Top left corner
- 3: Top surface for walking
- 4: Top right corner
- 5: Left wall: the wall is facing the player from the left
- 6: Right wall: the wall is facing the player from the right
- 7: Bottom left corner
- 8: Bottom surface: basically the ceiling
- 9: Bottom right corner
Tile size is 64x64 Max tile amount: 100, 10x10 in tile graphic Tile graphic is 640x640
- The UI library will basically create a tree of UI elements
- The root element covers the whole screen but doesn’t render anything
- Any real UI elements are children of that root element
- Any UI element can have its own children
- Game inputs events are sent to the root element
- If the root element can’t handle a particular event, it sends the event to each of its children until one of them can handle it
What we need:
- Text prompts entering or editing the name of screens or portals
- Possibly buttons that have actions
- Maybe some kind of selector element for displaying tiles to select, but at the very least something that can display the currently selected tile image/color
- The concept of a screen, maybe the same size as the screen itself, reasonable tile size
- Transitions between screens
- Basic platformer movement
- Sprite animations
- Collision detection against tile map
- Picking up items
- Providing audio cues to find items in the world
- Ability to play sounds and music files (maybe using OpenAL?)
- Compiling to Emscripten for playing in the browser (audio)
- Loading OGG files for music and sound effects (stb_vorbis)
- State “DONE” from “TODO” [2022-11-06 Sun 15:35]
- State “DONE” from “TODO” [2022-11-06 Sun 15:36]
- State “DONE” from “TODO” [2022-11-06 Sun 16:22]
- State “DONE” from “TODO” [2022-11-06 Sun 17:06]
- State “DONE” from “TODO” [2022-11-06 Sun 17:06]
- State “DONE” from “TODO” [2022-11-06 Sun 12:56]
- State “DONE” from “TODO” [2022-11-13 Sun 13:23]
- State “DONE” from “TODO” [2022-11-13 Sun 13:23]
- State “DONE” from “TODO” [2022-11-19 Sat 16:05]
- State “DONE” from “TODO” [2022-11-19 Sat 16:05]
- State “DONE” from “TODO” [2022-11-20 Sun 16:56]
- State “DONE” from “TODO” [2022-11-27 Sun 17:09]
- State “DONE” from “TODO” [2022-11-27 Sun 17:09]
- State “DONE” from “TODO” [2022-11-27 Sun 17:09]
- State “DONE” from “TODO” [2022-11-27 Sun 17:09]
Mesche no longer reports when local variables don’t exist. Why does t
and others work half the time when they don’t exist?
(if (equal? state 'editing)
(if (input-event-key-down? input-event)
(if (and (input-event-modifier-ctrl? input-event)
(equal? (input-event-key-code input-event)
input-key-code-s))
(save-screen current-screen
(string-append "assets/screens/"
(screen-name current-screen)
".stm"))
(check-tile-select-input input-event)))
;; If not editing, handle player input
(handle-player-input player input-event))
- Define a portal by name and associate tile locations with it, so it can have an arbitrary position and size
- However, we need to figure out how transition points map between screens
- Maybe make x or y axis optional so that it triggers on the whole other axis