No description
Find a file
2023-08-20 16:50:00 +01:00
benches benches 2023-07-08 00:03:46 +01:00
docs docs 2023-08-19 12:05:04 +01:00
raws misc fixes 2023-08-18 23:56:49 +01:00
resources title image, ui tweaks 2023-07-29 02:21:36 +01:00
src abstracting level requirements 2023-08-20 16:50:00 +01:00
wasm week 6 - wasm build 2023-08-15 14:08:56 +01:00
.gitignore docs 2023-08-19 12:05:04 +01:00
Cargo.lock combat system overhaul - d20/hack-like 2023-07-28 06:29:59 +01:00
Cargo.toml ApproachAI {} 2023-08-15 19:03:15 +01:00
README.md Update README.md 2023-08-15 14:44:02 +01:00

a roguelike in rust, playable @ llywelwyn.github.io

using rltk/bracket-lib, and specs

image

this year for roguelikedev does the complete tutorial, i'm following along with thebracket's roguelike tutorial - in rust. for most of the 8 weeks, i'll probably just be working through the content rather than diverging too much into doing my own thing, since it's lengthy and i'd rather finish in time. that said, the ultimate aim here is to strip out the vast majority of the existing entities and replace them with my own, using the systems and components from the tutorial as a jumping-off point for something of my own making.

i'll try to remember to update the web version on my page at the end of every week


week 1
  • brogue-like colours

    • i was staring at a horrible-looking game for a while as i tried to figure out how to make it look nice, before deciding to try the brogue method of colour offsets. when a map is generated, it also generates a red, green, and blue offset value for every tile on the map, and applies them during rendering. after making that change i started to miss the previous hue, so i combined the two. as it stands, every tile starts off a subtle green/blue, has rgb offsets applied on top of that, and then has the actual tile colour applied. and it ends up making something like this

      image

  • fov

    • decided to use bracket-lib's symmetric shadowcasting for common viewsheds (i.e. sight)
    • and implemented elig's raycasting algorithm for any viewsheds that dont need that level of detail. symmetric is great, but when it comes to viewsheds that often aren't symmetric in the first place, it's not really necessary (i.e. it's not often you've got two people with: the same additional viewshed, both within range, etc.). doing it this way comes with the benefit of being able to easily define what blocks a viewshed, rather than having to make a whole new BaseMap to work through bracket-lib
  • telepaths and having brains

    • telepathy! a personal favourite rl feature, so i thought it'd be a cool test of the raycasting. right now it's simple, since the point was really just making sure the raycasting worked: there's a component for being a telepath, and for having a mind. if someone has telepathy, they'll see every entity with a mind within a given radius (defined by their telepath component), even through walls.

      image

  • atomised spawn tables

    • i tried figuring out how often things would spawn by just looking at the weighted tables, and i had no idea at a glance, so i replaced it with category tables. right now it's just rolling for an entity or a mob, and then rolling on the right table from there, but at least it means easily being able to see how often something will spawn. on average right now, there's 1 item : 3 mobs

week 2
  • most of section 3 - generating maps

    • this week was mostly just working away at the mapgen stuff. getting all the algorithms in, chaining builders, being able to do prefabs. whenever i got bored i just opened rexpaint and toyed around with making simple vaults.
  • 8-bit walls

    • i wasn't happy with how the walls looked, so i made the masks 8-bit instead of just 4-, which means being able to be a lot more specific with which glyphs are used. mainly it means no more grids of ╬. this comes with a side-effect of magic mapping looking a lot better.

      wall bitmask before-and-after


week 3
  • (better) vault loot

    • moved over to using raws and atomised spawn tables into a bunch of sub-categories in the process, like wands, equipment, potions, etc. now there's options for rolling just out of subsets of items - useful for adding a specific spawn to a vault, or ensuring there's always an amount of food on a given level, etc. can also use this in the future for categorising groups of mobs, to only spawn x mobtype on a given map too.

      image

  • actions with directions

    • made a new runstate that prompts the player to pick a direction, and takes a function as an argument. after the player picks a direction, it calls the function with that direction as the args. right now it's being used for door stuff, but now it'll be super easy to make anything else that needs the same parameters

      week 3 - kicking doors

  • ui stuff

    • there's a help screen now with controls, accessed with [?], and a death screen that actually logs some stuff

      image

    • finally, identical items in the inventory stack. i waited with this until figuring out a way that would work with extra parameters in the future like BUC. current solution is using a BTreeMap with a tuple containing the parameters that need to be the same (right now just the name) as the key, and the number of those items in the inventory as the value.

    • wand uses are tracked now with a number of asterisks next to their name -- i'll change this once i add in identification

      image


week 4
  • d20/hacklike combat overhaul

    • the framework for levels, attributes, and skills are all in, as well as a lot of the associated systems. it now uses a system that trends way closer to the -hack brand of roguelikes (it's almost identical). i thought about doing something more novel just because then i could say i made it on my own, but then i decided i'd rather lean on the 35 years of balance tweaks nethack has had than start all over from scratch. not having to worry so much about balance gives me time to do other stuff, and i think the familiarity for players will be nice too. my favourite addition is a MULTIATTACK flag for mobs - if they have it, they'll use all their natural attacks in a turn instead of picking a random one
  • extremely free-form loot tables (like rats spawning... lambs?)

    • i realised my loot table structure wasn't very different from the spawn tables i'd been using for mapgen. other than one field, the structures were identical, so i decided to massively generalise how loot spawning works. instead of only allowing mobs to drop items from the specifically defined loot tables, they now have the capability to drop anything from any table -- for example, an animal can drop stuff from the animal drop table, or it could be set to drop a random scroll, or literally any other entity... including other mobs! i decided to test this with rats that had a 25% chance to "drop" anything from the mobs spawn table on death. in this case, one rat left behind a lamb, and another left behind a fawn.

      image

  • and a huge visual overhaul!

    • a whole new ui, a new font (a 14x16 curses variant), a system to spawn particles on a delay for proper - if basic - animation, and a couple new features to fill in the expanded ui space (like being able to see a list of entities in view on the sidebar).

    week 4 - visual overhaul


week 5
  • not a whole lot
    • busy week for me, so the only things i managed this week were finishing up some small things from the previous week. i started on combining logs that happen on the same tick (You hit the goblin. The goblin hits you.), and fixed up the chance to spawn a guy each turn system to work with the groupsize flags, so there's a chance to spawn a pack of creatures each game turn rather than packs only spawning on map generation.

week 6
  • visuals (contd.)

    • i'll start here, because it pretty much shows all the other things i did this week in the one image. the biggest change is nixing the rainbow colours i did in week 4 - having all the names on the sidebar and inventory be coloured by the colour of their glyph made for a difficult to parse ui. i swapped everything out for being coloured by their rarity (white for common and nonmagical items, grey for unidentified, and green-to-gold for uncommon-legendary rarities), and decided to add the glyph of the entity beside the name. overall, a big win i think. it provides more information more cleanly.

    image

  • backtracking

    • short and sweet, maps are persistent now. entities don't get deleted when you descend, they just get frozen, and you can return anytime. stair-dancing is a thing now, and something i haven't decided how to handle yet.
  • item identification (no BUC yet!)

    • unique schemes for unidentified items in the big categories (i.e. "effervescent green potions", "octagonal wands", and "GIB BERISH scrolls"), as well as the option of defining one-off obfuscated names for special cases
  • encumbrance

    • varying levels of being overweight, with the limit determined by strength, slowing entities down by ~25% per level over unencumbered. right now it's pretty forgiving, and i'd probably like it to stay that way. my ideal balance here would be roughly how it ends up in 5e DnD: everyone can carry a good supply of consumables, but strength characters usually don't carry a much higher quantity of items than anyone else, because the strongest armour is extremely heavy. sort of like a soft strength requirement for the heaviest gear - rather than requiring specific stats or levels to equip it, it's heavy enough that you need to be strong to lug it around. but if someone weaker wanted to, they could, they'd just have to leave some other items behind to do so. or take the speed penalty for being encumbered