Skip to content

Latest commit

 

History

History
597 lines (585 loc) · 32.2 KB

todo.md

File metadata and controls

597 lines (585 loc) · 32.2 KB

todo:

Game Engine:

  • Add tile flipping to render function
  • Entities
    • Determine which entity should be player character on map load
  • Handle player input
  • Add entity render ordering by coordinate of bottom edge
  • Add support for entity animation timing
    • Make an array of uint16s that just hold the current frame for entities; it doesn't need to be hackable, just stateful
    • Reset
  • Port over the sdl_toy_0 button & LED state emulation
    • Start rendering the background graphic
    • Collect the Button coordinates
    • Render the Buttons
    • Collect the LED coordinates
    • Render the LEDs
    • Handle all inputs for the buttons
    • Toggle the button renderable states when buttons are down
    • Toggle the LED/Boolean values when the buttons are pressed
  • Generate a bunch of different WAV files of different sample rates for Dovid
  • Port over the Hex Editor
    • Build Monaco 9 as an AdaGFXFont because we need a good monospace font
    • Start rendering the text for the byte grid
    • Render byte selection cursor behind the text
    • Arrows navigate cursor on byte grid when hex editor is open
    • Pass states of currently selected byte to the LEDs
    • Build the entity RAM <-> uint8_t array mapper/typecasting?
    • Build hex ops handler functions
    • Trigger swap of hex ops enum
    • Build hex bit handler functions
    • Trigger hex bit handler to change value of bits on selected byte
    • Build MEM button handler functions
    • Add ability to offset visible page of RAM by pages
    • Render something on screen to see which RAM PAGE you're on
    • Add PAGE handler; Hold page + arrows to jump pages of bytes?
    • Start adding error handling for when indexing outside of supported types ROM data
  • Move functions for reading from the ROM into mage_rom.cpp
  • Create some get_*_by_index functions for validating hackable datas
    • getValidEntityId
    • getValidMapId
    • getValidPrimaryIdType
    • getValidTilesetId
    • getValidTileId
    • getValidAnimationId
    • getValidAnimationFrame
    • getValidEntityTypeId
    • getValidEntityTypeAnimationId
    • getValidEntityTypeDirection
  • In the ROM header, add a timestamp so we know if the game.dat should be replaced with SD card versions.
  • Make a list of some C functions we want scripts to be able to call
  • Decide on a common script function signature
  • Define an encoding format for scripts
  • Adjust entity animation system to allow for multiple actions that can be called from scripts
  • Make it so that maps denote a player entity by ID in the game.dat file, and only has ONE or ZERO players per map.
  • Change map reset keybind to be XOR+MEM3 and make it work even in dialogs and the hex editor
  • Script system
    • Binary Encoder parts
    • Scripts
      • What is a script?
        • It's a length + sequence of Actions
        • Scripts shouldn't be able to be called when the player has opened the hex editor, but scripts should be able to open the hex editor when called from elsewhere.
        • We'll need entity-based state variables to track pathing and other transient values between ticks.
      • Map
        • onMapLoad(uint16_t scriptId); //called once when the map loads
        • onMapTick(uint16_t scriptId); //called every tick, used for doors, other static events when moving around map.
      • Entity
        • onEntityTick(uint16_t scriptId, uint8_t entityId); //called every tick, entityId is the entity calling that script.
        • onEntityInteract(uint16_t scriptId); //called when the player interacts with the entity
    • Actions (see mage_defines.h for structs detailing arguments for each action type below:)
      • NULL_ACTION
      • CHECK_ENTITY_NAME
      • CHECK_ENTITY_X
      • CHECK_ENTITY_Y
      • CHECK_ENTITY_INTERACT_SCRIPT
      • CHECK_ENTITY_TICK_SCRIPT
      • CHECK_ENTITY_LOOK_SCRIPT
      • CHECK_ENTITY_TYPE
      • CHECK_ENTITY_PRIMARY_ID
      • CHECK_ENTITY_SECONDARY_ID
      • CHECK_ENTITY_PRIMARY_ID_TYPE
      • CHECK_ENTITY_CURRENT_ANIMATION
      • CHECK_ENTITY_CURRENT_FRAME
      • CHECK_ENTITY_DIRECTION
      • CHECK_ENTITY_GLITCHED
      • CHECK_ENTITY_PATH
      • CHECK_SAVE_FLAG
      • CHECK_IF_ENTITY_IS_IN_GEOMETRY
      • CHECK_FOR_BUTTON_PRESS
      • CHECK_FOR_BUTTON_STATE
      • CHECK_WARP_STATE
      • RUN_SCRIPT
      • BLOCKING_DELAY
      • NON_BLOCKING_DELAY
      • SET_ENTITY_NAME
      • SET_ENTITY_X
      • SET_ENTITY_Y
      • SET_ENTITY_INTERACT_SCRIPT
      • SET_ENTITY_TICK_SCRIPT
      • SET_ENTITY_LOOK_SCRIPT
      • SET_ENTITY_TYPE
      • SET_ENTITY_PRIMARY_ID
      • SET_ENTITY_SECONDARY_ID
      • SET_ENTITY_PRIMARY_ID_TYPE
      • SET_ENTITY_CURRENT_ANIMATION - Encoder needs to lookup animation NAME, not index
      • SET_ENTITY_CURRENT_FRAME
      • SET_ENTITY_DIRECTION
      • SET_ENTITY_DIRECTION_RELATIVE
      • SET_ENTITY_DIRECTION_TARGET_ENTITY
      • SET_ENTITY_DIRECTION_TARGET_GEOMETRY
      • SET_ENTITY_GLITCHED
      • SET_ENTITY_PATH
      • SET_SAVE_FLAG
      • SET_PLAYER_CONTROL
      • SET_MAP_TICK_SCRIPT
      • SET_HEX_CURSOR_LOCATION
      • SET_WARP_STATE
      • SET_HEX_EDITOR_STATE
      • SET_HEX_EDITOR_DIALOG_MODE
      • SET_HEX_EDITOR_CONTROL
      • LOAD_MAP
      • SHOW_DIALOG
      • PLAY_ENTITY_ANIMATION
      • TELEPORT_ENTITY_TO_GEOMETRY
      • WALK_ENTITY_TO_GEOMETRY
      • WALK_ENTITY_ALONG_GEOMETRY
      • LOOP_ENTITY_ALONG_GEOMETRY
      • SET_CAMERA_TO_FOLLOW_ENTITY
      • TELEPORT_CAMERA_TO_GEOMETRY
      • PAN_CAMERA_TO_ENTITY
      • PAN_CAMERA_TO_GEOMETRY
      • PAN_CAMERA_ALONG_GEOMETRY
      • LOOP_CAMERA_ALONG_GEOMETRY
      • SET_SCREEN_SHAKE
      • SCREEN_FADE_OUT
      • SCREEN_FADE_IN
      • MUTATE_VARIABLE
      • MUTATE_VARIABLES
      • COPY_VARIABLE
      • CHECK_VARIABLE
      • CHECK_VARIABLES
  • Geometry
    • polygon(uint8_t count, x points[count])
    • polyline(uint8_t count, x points[count])
    • point(uint16_t x, uint16_t y)
    • Geometry::inside_poly(point) collision detection function
    • draw() renders geometry to screen
  • Collision System
    • For Tiles
    • [!] For Entities
  • Dialog Data Type Implementation:
    • Display Name - either stringId, or entityId
    • The actual text to display, probably with line breaks hard coded in to keep things simple.
    • byte to encode position (i.e. is the text on the top or bottom of the screen, is the portrait on the left or right side of the screen, should we display a portrait at all?, etc.).
      • flags for position encoding byte:
        • Top or Bottom
        • Portrait on or off
        • portrait left or right
    • Portraits
      • Encoder
        • Needs new top-level protrait type
        • Needs to store portrait on entityType
        • Dialog
          • Needs to store portrait not associated with entityType on dialog
          • Manually specifyable even if not associated with any entity
          • Needs to store flip_x
      • Engine
        • Should match current entityType of speaking entities
        • Support Entity Hacked state
        • look at dialog alignment, and if it's "RIGHT", toggle flip_x into the flags byte
    • tilesetId and tileId for the portrait picture.
    • Support for string templates that make use of hacked entity names
    • Support for string templates that make use of numeric variables
    • Please stop player walking when a dialog shows
    • display font
    • voice sound Id
    • Dialog Responses:
      • response TypeId:
        • NO_RESPONSE = 0
        • SELECT_FROM_SHORT_LIST = 1
        • SELECT_FROM_LONG_LIST = 2
        • ENTER_NUMBER = 2
        • ENTER_ALPHANUMERIC = 3
        • etc...
      • Player responses to dialog may be desired:
        • Assuming pop-up happens while dialog is still active:
          • select from a list of options
          • enter a numerical value
          • enter an alphanumeric value (put on-screen keyboard over dialog? Cycle through all letter options like arcade name entry?)
        • new script and/or dialog to call depending on player response
          • from a list of options
          • from a numerical value
          • from an alphanumeric value
      • Show bouncing arrow at bottom of dialog to indicate that the player should press button to continue
    • Dialog editor:
      • File selector
      • List of Dialogs by name in file
      • Show the dialog phases in a dialog
        • Add phase
        • Delete phase
        • Preview/edit phase
          • Preview message
          • Select current message
          • edit message
          • add message
          • delete message
          • text entry for entity name
          • text entry for entity portrait
  • Strings
    • uint16_t Length
    • char array with null termination Length bytes long
  • Save system with flags
    • Player Name (12 bytes, like all other entities)
    • On map init, replace player name into PlayerEntity
    • Use bit flags in a specific region of the ROM chip to encode SAVE
  • Allow upload of game.dat to ROM chip using nrfjprog
  • Fix name not sticking to player when changing rooms
  • Look into why EtherNettles puzzle is not triggering
    • it's probably a modulo issue on tileId and tilesetId
  • Make a new dialog tileset that is mostly transparent for the main menu
  • Make some background artwork for the main menu
  • Create action for setBackground
  • Fix portrait from last conversation being used on dialogScreens that have none
  • Remove AnimationFrames to free enough ram to run on Hardware again
  • Fix Color palette corruption bug
    • Add corruption detection and logging
    • Now just reproduce it again - what could possibly have been causing this?
      • Turns out it was something indexing into entities[255] and mutating that entity - but entities were only allocated to 64. Entities were allocated just before the ColorPalettes.

Playtesting night notes:

  • Text changes: "No! Not Tuesday, T.U.E.S.D.A.Y.!"
  • People hit escape to close the hex editor, and it closes the program. Oops. Default it to Alt+F4.
  • An idea: I didn't see anyone saving after completing puzzles. Perhaps after each puzzle is solved, show the save dialog, so nobody loses any progress. Perhaps show this after the TUESDAY cutscene as well.
  • We really need to rearrange the Elder's speeches "I'm X, and I do Y" so that it is outside of the lodge. Nobody talked with them out side of the lodge without direction.
  • People talk to a lot of objects in the greenhouse, but don't get interactions. Add more interactions there.
  • People talked to the quest board, and it said nothing. Oops. Add some dialog.
  • There is still a debug exa in the beatrice puzzle room. Oops.
  • After switching delmar from to sheep to man, you can't talk with him. Player expected to talk with him.
  • Fix a bug where modulo on the animation always picks (whatever, mage walking north, blitzball) when the currentAnimation is cycled - it glitches across palettes.
    • This is not actually a bug, because the byte changing was primaryIdType. This is expected behavior.
  • [?] When you load from the main menu on desktop before you've created a save, it crashes.
  • NewGnu tried to set the corrupted byte on the Big Bad Name Book to uncorrupt the name. He was really fixated on learning about that.
    • We should make it do a rot 13 of RED HERRING
  • Add Desvio to special thanks
  • Add AdwareHunter to special thanks
  • Add a book that mentions that you can press XOR and MEM3 to reset the map.
  • Rax asks: Is there a place to snag a copy of the books outside of the game, other than to go parse the source code?
    • Me: Oh man. Not a bad idea! Perhaps we could release a little "Game Manual" with those! Perhaps a print out that's empty, and they player can fill in the values.
  • NewGnu found that if you set the onTick index to the save action, you can write every tick. FRY ROM STORAGE REAL QUICK
    • Solution? Show a "Save completed" dialog after save completes, because then it can only burn through as fast as they can confirm the "Save completed" dialog.
  • Desvio says that Bert should say something different if his name is changed to "Bart" or "Bort" - reference to Simpsons "Who would name a kid Bort" sketch
  • If player moves the flowers, Trekkie should yell at the player for uprooting the flowers, and then reset the position of all flowers.
  • Talking with the modem should cause the mage to say "Yup, looks like it's not connecting." or "Yay, it's connecting now!"
  • When loading a new map, put the hex cursor back at the player
  • There is a table tile that is on layer 3 in the inner sanctum, but the rest of them are below?
  • [!] Possibly redesign the layout of the sheep quest so that the pen is not obscured by the old lady's house.
  • NewGnu tried to glitch the pipscat so it was in the where the cat construction crew was. Very reasonable. Should this be an alternate solution?
    • I think that this should be countered with "When the cat is glitched off their stump, he should automatically walk back to the point where he started."
  • During CorfidBizna's playthrough, she triggered a "fade to black" script, and reloading the map didn't make things playable again.
    • To fix, LoadMap should set fadeFraction to 0
  • Fix the ???Mystery Sink??? in the player's house?!?
  • Each of the members of the cat construction crew should say something different to the player when they are the PipsCat
  • The path leading north of the Library should take the player to an "UNDER CONSTRUCTION" zone, saying something about how it's not ready yet.
  • The wrap-around at the bottom of the map should fade out and then in again
  • Re-do the handling of the right side buttons when in the HexEditor
    • Create Clipboard system
      • Create a buffer that is sizeof(MageEntity)
      • A value to indicate the length of what's on the clipboard
      • Display current clipboard value in header or footer, truncated to 4 bytes and '...'
      • Copy method
      • Paste method
        • When your paste changes the entityType AND position, it doesn't move to the pasted location for the first tick because the "Did the tile size change this tick" entity jump protection kicks in
      • Store the clipboard value + length into save file as well
    • △ should increment the current byte's value by 1
    • ◯ should copy the current byte's value into the copy buffer
      • while holding ◯, moving the left/right arrows will select additional cells
    • ✕ should decrement the current byte's value by 1
    • ◻ should paste the copy buffer into the current byte's value
    • The value +/- operations should be slowed down
    • The "triangle to open on an entity + cooldown before normal hex operation" should actually restore normal hex control via "on release handler"
  • Add an action to enable/disable copy & paste. It's too powerful to start the game with; Perhaps it is granted by an artifact from a dungeon in 2021?
  • Re-do the handling of the MEM buttons in the HexEditor
    • Make the addresses stored relative to the currently selected entity
    • How to set relative MEM addresses?
      • Hold PAGE and press MEM* to set
      • Long-Hold MEM* to set?
    • Press MEM* to move cursor there, both in and out of the editor
    • Store your 4 MEM addresses into the save file as uint8_t, because MEMs are now relative
  • Prepare scenario data for bootloader's USB-C/magic drive update flavor
    • game.dat gets a new header:
      • MAGEGAME
      • uint32_t CRC32 of the game.dat before the CRC32 is added
      • uint32_t length of game.dat
    • save_[0,1,2].dat gets a new header:
      • MAGESAVE
      • uint32_t CRC32 from game.dat (so we know if versions match)
      • uint32_t length of the save_[0,1,2].dat
  • Improve the "Power on" experience of the hardware
    • ROM is valid,
      • and SD is not present, start game
      • and SD is present, hash is same, start game
      • and SD is present, hash is diff, show options
      • and SD is present, MEM3 is held, show options
    • ROM is not valid,
      • and SD is not present, engine panic with message about no rom
      • and SD is present, do not show options and just copy
    • Desktop build should also ENGINE_PANIC if ROM Magic is bad
  • Entity "Action" animation continues playing during dialog but only sometimes
  • Entities go to space when the duration of a walk path is less than the milliseconds per frame of the current fps
  • Hamster has a bug report. The save icon's background dialog tileset is missing.
  • Use entity property is_debug (true) to make certain entities "Debug mode only"
    • Set the "Warp Fish" is_debug true
    • Set the Exa entity_type property is_debug true by default
    • Add kaitai render_flags type to entity instance direction help show what's up
    • Make encoder set the 0b0100000 renderFlags so those entities can be filtered out at runtime
    • In engine, implement runtime "show debug entities" mode
      • Add is_debug for 0b0100000 bit on renderFlags
      • Pick a key combination to toggle this mode
        • Pressing the key combination reloads the current map and disables the filter
      • Filter the entities by the 0b0100000 renderFlags, while tracking the original + filtered entityId
        • Make an array that maps mapLocalEntityId to filteredMapLocalEntityId
        • Change the getEntity* methods to use this
      • Diligence:
        • Review all usages of MAX_ENTITIES_PER_MAP
        • Review all usages of map.EntityCount()
        • Review all usages of entities[
        • Review all usages of entityRenderableData[ -> getEntityRenderableDataByMapLocalId
        • Review all usages of filteredMapLocalEntityIds
        • Review all usages of mapLocalEntityIds
        • Review all usages of playerEntityIndex
        • Review all usages of cameraFollowEntityId
        • Make sure that entity hacking still doesn't jank the player
        • Make sure that camera wiggle functions still work
        • Test it on the hardware
  • Make a "Warp Zone" map that can take players to all of the debug maps
    • Make the "Warp Fish" send the player the "Warp Zone"
    • Add the "Warp Fish" fish to all the debug maps
  • Fix bug where loading an un-initialized save doesn't start with default values
  • In the Dialog, when there are choices, the cursor will loop to the top when you press the down arrow, but not when pressing up from the top item, but it should
  • Purge all the actions that didn't get implemented
    • PAUSE_GAME
    • PAUSE_ENTITY_SCRIPT
    • PLAY_SOUND_CONTINUOUS
    • PLAY_SOUND_INTERRUPT
    • SET_HEX_BITS
    • LOCK_HAX_CELL
    • UNLOCK_HAX_CELL
    • Now playtest the game
  • Add a proper encoder enum for property button_id so you can refer to buttons by name
  • Add support for the elusive any key to the button handlers
  • Change CHECK_ENTITY_PATH to use geometry instead of expected_u2

Development VM TODO:

  • Set the XFCE GUI "theme" to dark mode
  • Set the VSCode default "debug" script to "Debug desktop"
  • Add a few bookmarks to the browser
    • Github repo
    • ide.kaitai.io
      • pre-load the mage_game.ksy into kaitai

Web Build TODO:

  • Get it to be playable in the browser, at all
  • Desktop build should be able to "ctrl-r/refresh" the game.dat from filesystem
  • Default game.dat should be cached between refreshes
  • User should be able to drag in a game.dat and play it
    • Verify that the header of dragged file contains MAGEGAME
    • Change of game.dat should call the EngineInit function and reload contents from virtual filesystem
    • Reloading the page starts game fresh from original game.dat in IndexedDB
  • !!!CRITICAL!!! Make HTTP HEAD request for game.dat on server, compare size/modification to local, and re-download on change
  • Fancy extra game.dat features
    • The dragged-in game.dat should be cached between refreshes
    • Should show the Path/CRC32/Length of each game.dat
    • Display a list of the available game.dat files, filenames + CRC32
      • Original
      • Each dragged version
      • Multiple endorsed scenarios(?)
    • Add ability to erase a dragged file from that list
  • Save files should persist between refreshes
  • Add Web Build setup instructions to EnvironmentSetup.md
  • Add Web Build env config to the public dev VM
  • Add public link to main README.md
  • Add usage instructions to content authoring documentation
  • Find a way to display the ENGINE_PANIC screens in Emscripten before we get into the main loop, otherwise the browser gets stuck in a broken infinite loading state where the screen doesn't display at all
  • Add collision detection to the EngineWindowFrame so a player can click on GUI buttons
    • Implement easiest possible click + release of buttons
    • Add ability to start dragging off a button, and then on to trigger a "press"
    • Add ability to start dragging on a button, and then off to trigger a "release"
    • Add multi-touch support for phones

Encoder TODO:

  • Throw error when > 1 entities have is_player
  • Build a test map with no entities and make sure it does not crash
  • Fix bug where empty string for script on map or entity does not encode as null_script
  • Music/SFX encoding in the binary asset encoder
  • Error for missing json file at path in encoder is not explicit enough - should show which file it was not able to find

Hardware TODO:

  • Get keyboard chip working and reliably updating button states
  • Get LED control chip working and update LED control functions
  • Update FrameBuffer.h to work with the new larger screen
  • Use SD card for testing game until ROM chip is functional
  • Get ROM chip read/write working reliably
  • Verify function of all desktop testing build features are working correctly on badge hardware
  • Fix audio driver and initialize communication with audio chip

MAJOR GAMEPLAY AND QUEST SPOILERS BELOW!

Assets we need

  • More villagers
    • [!] One of the children's actions should be a sneeze
  • The other mystical artifacts, which do not pick the mage
  • Ring Zero, spinning
  • Chicken
  • Sparkles that could be overlayed on anything to draw attention
  • Character Portraits for the Dialog system
    • [!] Mouth open, closed
  • The Quest Board tiles
  • The 9-slice image for "Quest List" screen
  • The 9-slice image for dialog borders
  • Tiles for the inside of village houses
  • Tiles for Dungeons
  • Set Dressing
    • Bed
    • Flower Pots
    • Windows
    • Kitchen table
    • Kitchen chairs at table
    • Pots
    • Interior Doors for all 4 walls
    • Fireplace
    • Shelves with things on them
    • Fruits on table
    • [!] Fence Posts to paint, so we need 2 states
    • Dancy Flowers
    • A rake, for the lake
  • [!] A knob that has never turned, but must be turned to get the fountain to turn on again
  • [!] A well, for Timmy to get stuck in
  • Tiles for village elder's basement/dungeon
  • Bender + shiny metal ass

2022 big picture objectives

  • How to version the game.dat and the engine together?
    • [!] Programmatically? No, the security boundary of the browser file:// path prevents us from reading the mage_dat.ksy
    • Manually? Yes, just update the docs for "Adding new actions" to manually include a data file version in these places
      • kaitai
      • encoder
      • c code decoder
    • Add data version to kaitai
    • Add data version to encoder
    • Throw error on mismatch in C
    • Fix web build issues with infinite loop in the ENGINE_PANIC screen
    • Add the docs to the actions update instructions
  • New actions
    • SET_CONNECT_SERIAL_DIALOG (serial_dialog_id)
    • SHOW_SERIAL_DIALOG (serial_dialog_id)
      • Output text
      • Sanitize & handle input
    • INVENTORY_GET (item_name)
    • INVENTORY_DROP (item_name)
    • CHECK_INVENTORY (item_name, expected_state, success_script)
    • SET_MAP_LOOK_SCRIPT (script_name)
    • SET_ENTITY_LOOK_SCRIPT (entity_name, script_name)
    • SET_TELEPORT_ENABLED (bool_value)
    • CHECK_MAP (map_name, expected_state, success_script)
    • SET_BLE_FLAG (flag_constant_name, bool_value)
    • CHECK_BLE_FLAG (flag_constant_name, expected_state, success_script)
    • [!] Don't implement because this introduces more state to track. Item use/look scripts will be stateless like the map go scripts
      • [!] SET_ITEM_LOOK (item_name, script_name)
      • [!] SET_ITEM_USE (item_name, script_name)
  • Add numeric "constants" support to encoder
  • Serial Dungeon
    • Create a new maps.json; Maps are named keys full of objects:
      • path example "maps/map-main_menu.json"
      • on_tick script
      • on_load script
      • on_look script
      • items is an array of strings that map to global item names
      • directions is an object of "direction_name": "script_name", so go $DIRECTION calls a script
        • JSON looks like:
           directions: {
           	north: 'go_main_hall_north',
           	east: 'go_torii_gate',
           	south: 'go_goat_room',
           	west: 'go_west_room',
           }
          
    • Map struct changes
      • on_look script
      • script_padding 2 bytes
        • Change the encoder to handle this new shape
        • Update the kaitai struct
        • Update the C
      • direction_count uint8_t
      • directions is an array, so go $DIRECTION calls a script
        • name 12 bytes script ids,
        • script_id 2 bytes
        • padding 2 bytes to get us back into 16 alignment
    • Entity struct changes
      • on_look script, stored in bytes 30 & 31
    • Action setEntityScript needs some TLC and testing for setting look scripts
    • New Item struct - managed in items.json
      • There may not be more than 64 items in the whole universe
      • 16 of these items need to be held in ram because the scripts need to be mutable to allow branching
      • When you load map, loop through the ItemLocationArray and load items in the room, or in player inventory, into 1 of 16 slots in ram
      • Struct details
        • name 12 chars
        • The following script IDs are GLOBAL SCRIPT IDS because they can be run from ANY room!
          • on_look script ID
          • on_use script ID
    • New ItemLocationArray
      • Part of the save struct
      • It's an array of 64 long, matching the items limit
      • 2 bytes per item current_location value
        • 0x0000 means nowhere
        • 0x0001 0xFFFE means it's on a map
        • 0xFFFF means it's in the player's inventory
    • Web build should get a toggleable "console" area below the gameplay window, that basically looks like the text_based_adventure_prototype
    • Text based adventure
      • Player loses control over the joysticks and things are instead done over the serial CLI
      • Serial command processing system
        • Complete list of possible command formats
          • Verb: 'look', 'inventory' 'help'
          • Verb, Target: 'look flask', 'get flask', 'go north'
        • Verbs to implement
          • help - shows a list of available commands and their syntax
          • look - Without an argument, runs the current room's on_look script, or a fallback to "There is nothing here but sadness". If there is an argument, looks to the items in that room, and then the inventory to try and find an item with a matching name.
            • Implement execution of on_look script
            • Implement listing of available directions
            • Implement listing of items on map/in room
            • Implement running on_look for items
            • Implement running on_look for entities
            • If teleport is enabled, the on_look output is prefixed with the name of the room that the player is in
          • go - Looks up the directions in the current room, and if there is one that matches the second argument, runs the script for going that direction
          • get/take
          • drop/yeet
          • inventory - Shows the names of current inventory items
          • use - runs the item's on_use script from any item in the current room, or your inventory
          • teleport - allows you to teleport to any room that you know the name of. This functions as a "fast travel" after you have built the server. Becomes enabled via a specific flag like the Hex Editor.
      • The tileset actually just looks like a Zelda MiniMap
      • This dungeon can has an inventory system
      • What powers do the Serial artifact give you?
        • Having an inventory at all
        • Teleport - if you know the name of a room anywhere in the game, you can type warp $ROOM_NAME
      • The end goal of the Serial Dungeon + having inventory
      • We need an interactive character named PuTTY
        • It should be illustrated or described as a Morph suit like the PUTTYs from Power Rangers
    • You need to be able to build a PC Server from multiple components found in the Serial Dungeon
      • In the story, you need to build a server so that you can access/use the serial commands outside of the serial dungeon, and progress in the game by finding secret parts of rooms you've already been in with the look command.
      • You need a Case
      • You need a Motherboard
      • You need a Power Supply
      • You need a CPU
      • You need RAM
      • You need a Keyboard - but you can only find a Keytar, or a midi-enabled Button Accordion with a midi to USB keyboard adapter
      • There's a cat, and you need to convince it to give you its mouse
      • There's a Bitcoin Mine, and you need to convince them to stop burning down the planet and free the video cards
      • When you have all of the components are ready, the EXA says: Now all we need is a Banana, and some Hope!
        • Procure Banana
        • Procure Hope
        • In the end, the hope doesn't help, and you must resort to percussive maintenance to get the server to turn on
  • Filesystem Dungeon
    • Figure out how to create a USB Mass Storage disk from of the contents of like 4KB of RAM.
      • Use a super tiny block size.
    • Serial command mount will cause Mass Storage device to mount
    • Serial command open will uhh... invoke a file on the virtual FS
      • Somewhere there should be a sesame.sh, and open sesame.sh should solve that puzzle
    • A chmod/chown puzzle.
      • Enemy dies. drops weapon on to the FileSystem.
      • Player can't pick up weapon because its permissions are wrong.
      • Chmod/chown that file/weapon. Now player can pick it up, enemy can't.
  • Uhhh more Hex Dungeon
    • Change the layout of the dungeon from spelling FF to 0x because that's more awesome.
    • Perhaps unlock/add more in-game memory than just the entity structs for the HexEditor?
  • When the player approaches a puzzle that they have not seen before, we should blink the light on the board that corresponds to the interface used to solve that puzzle

Story ideas

  • After you have all of the artifacts, someone/something should steal them.
    • Hacking the save file to restore your artifacts
  • When you are directed to go get the 3 artifacts, it is super easy to go get them.
    • Then when you give them to SPOILERS, everything goes terrible.
    • They are teleported back into the dungeons, but much deeper, and you have to go the long way to get them back

Puzzle ideas

  • There's an exit somewhere in a forest that you can't get to any way other than being in that room, but using serial to go $SECRET_ROOM_NAME when you're in there
  • There's a sleeping Snorlax blocking your path in one of the forests.
    • You need the inventory system so that you can cary an otamatone to play music and wake him up.
  • A floor might be on fire. The player has to turn off the "firewall" to cross that part.
  • Liar'sville puzzle. Start unsolveable. Two black-hats
    • Must change one of the color of one of their hats so at least one tells truth
  • You need to read a value from Bluetooth to open a certain door?