Traditional Roguelike game built inside neovim and ported to love2d so it can be played without neovim too.
Game is currently a Proof of Concept.
Move your cursor to move your player.
Because you have vim motions, your player can attack and teleport from a distance.
Move to an enemy to attack it.
Delete items to pick them up.
Insert text to drop items from you inventory, then pick it up to reorder inventory.
Yank to search.
Visual mode is sneaking which searches, avoids attacking, and avoids being hit.
Install neovim, Clone the repo, and run ./start.sh
This starts neovim with a custom config designed to play the game.
Download the latest zip, unzip, run Neohack.exe
Clone the repo, run make run
- neovim for the neovim version
- which-key for the neovim menus
- love2d for the standalone version
- rotlove modified fork to add roguelike text display support to love2d
- Proof of Concept
- basic controls
- good enough performance
- explore some features
- enough vim features to try out an exe for windows
- neovim plugin mode to use your code as the map (reintroduce this mode)
- refactor all the code
- add features first
- refactor to have types
- have actually nice code
- unit tests
- performance
- basics
- track cursor movement
- bounce off walls
- collect coins
- hit enemies
- hurt by enemies
- 4 way enemy movement
- randomized movement
- player death
- enemy death
- more diverse movements
- highlight hits
- deal with player changes
- scan for new enemies when inserted
- highlight enemies
- item basics
- use items as weapons
- insert char from inventory to use it
- unknown letters are terrain
- health items
- collect your corpse
- copy to new buffer on game start
- highlight hurt
- miss hits and dodges
- move to floor in order to dodge
- delete to pickup
- insert floor on delete
- enemies drop loot
- visuals
- nerd font chars
- animate cursor
- treesitter parser highlighter
- figure out how to disable on change event listener
- stats in status line
- messages in split
- animate attacks
- highlight on attack animation
- async enemy movements
- show visible map and hide unexplored sections
- distance
- line of sight
- hand as reusable item
- actions
- show inventory
- wearable items
- wield slots
- durability on weapons
- armour
- wear on different body slots
- show stats
- eat items from inventory
- eat affects attributes
- different eat affects
- enemy corpses as items
- kick enemy corpses to get drops
- eat corpses
- configurable action leader
- use which-key to show actions and inventory
- kick
- fuse items, by merging the item's stats
- look at items to see stats
- say / speak
- say spells and cast on enemy names
- say buffs
- spells
- affect enemies
- affect items
- permanent stat effects
- temporary stat effects
- generate random spell effects
- add more specific effects
- build terrain, same but with terrain
- pick up terrain, or only for in place
- rename item
- movement
- restrict teleport with an item
- physics
- entity weight
- entity strength
- force
- knockdown
- kick acceleration
- bump acceleration
- pickup weight
- teleport acceleration?
- water and density?
- slippery floor?
- entity component system
- refactor
- extract all features into components
- all player actions can be performed by entities
- enemy sneak makes them not visible
- use the same move logic for everything
- ai for entities to choose action
- choose target
- choose other actions
- kick player
- control player movement with a spell
- enemies have inventory
- player and enemies drop inventory the same way
- enemies have view_distance
- target for enemies
- target for friends
- enemies pickup items
- but don't pickup everything
- enemies use weapons
- npcs
- refactor
- friends
- enchant enemies into friends
- friend follows player
- friend attacks enemies
- friend follows enemies
- friend instructions attack/follow/pickup
- friend does something to player heal on bumped
- bring item to life as a pet
- vim features
- normal mode - move and attack
- cut/delete - pickup items
- insert - drop items
- change/replace - both pickup and drop
- visual - move without attacking ie sneaking
- an entity stat for sneakability
- steal items from entity inventory
- yank - search, works in combination with sneaking
- paste - ???
- jumplist - ???
- use registers for inventory
- insert to run actions
- dot repeat
- doesn't seem possible, as game loop sets the last change
- macros
- marks not working
- undo?
- varied entities
- item and enemy generation from dictionary
- item and enemy variations with different colors
- map generation
- generate random map progressively
- have some structure to generated maps
- new buffer for down
- add enemies and items in a later stage
- pick a selection, not fully random
- buffer as multidimensional movement
- :bprev dig lower, :bnext dig higher
- allow entities to do it too
- performance
- write buffer once per tick
- store map as 2D array
- vim tutor/tutorial map
- teach basic vim motions as game mechanics
- easy run
- minimal neovim config with single command to run
- slash screen
- love2d
- win exe
- make run for linux
- reimplement vim motions
- hjkl
- words
- ftFT
- counts
- reimplement which-key
- modes
- v sneak
- V aiming
- C-v - other TODO: what should this mode do?
- colored cursor and status line for different modes
- try different timers for each entity
- async movement
- change events
- insert for commands