Latest Entries »

It’s hard to live up to the name “7 Year Roguelike” – I often have to go months, even half a year, without being able to work on it in order to keep up (down?) that pace of development. Such is life.

Over the long holiday I was able to wrap up a bunch of features which have been half-baked for a number of months. The highlights include:

* Moved from 8×8 to 16×16. This was far more work than it should have been, and impacted every aspect of the rendering and tool pipelines. I also took advantage of the churn to refactor spritesheets a bit more sanely. On the plus side, 16×16 allows much better looking normals; on the downside, it (a) requires more power, and (b) requires me to find a real pixel artist to create an entire new set of tiles :P. Until then, I’m just using the original 8×8 tiles doubled in size; so it looks the same except for normals.

* High DPI support. I picked up a Retina macbook, and everything shrunk to half size. Added High DPI support to fix it. Yet another unexpectedly high cost refactoring. Lessons learned!

Completely revamped menus

As soon as the game is started, the player starts ‘in-engine’ – they walk a little dude around to select gameslot, navigate the main menu, etc. Kind of cool, but time will tell if it’s too much overhead. I’ll need to ensure there’s a quick way into the game.

Custom Room Templates

Similar to how it looks like Claustrophia works, I’ve added custom room templates; these lie somewhere between ‘standard’ rooms (default dungeon floor, walls, and adornments) and ‘vaults’ (prelaid out rooms – e.g. “Ogre King’s Throne Room”). The template specifies probabilities for floor tiles, wall tiles, and adornments. The above picture shows the same room – with lighting disabled – with various different room templates applied. I’ve only gotten the engine in place, and haven’t yet created interesting templates.

It’s completely tool-driven, so all I have to do is create the graphics and the engine takes care of the rest. Rooms still feel pretty boring to me; I’m waffling on whether or not that needs to be fixed for V1. Most classic roguelikes have pretty boring rooms when you get down to it, so maybe it’s okay?

Major tooling refactoring

The game’s toolchain is now entirely built around a common core. Players will never notice it, but my dev QoL is muuuch higher.

Message pane added in game

I added a message pane ala WoW; it spits out damage and various other actions. I still need to add skill usage and the like.

In the above image you can also make out the higher fidelity normal mapping on the outer edge of the bear.

Poison, water, and fire pipes and pools with particles

Particles in the pipes flow ‘properly’ which is a nice touch.

Up Next
Unfortunately, I’m not sure how much time I’ll have to put into 7YRL over the next few months; it feels like it’s getting close enough that I could theoretically strip a bunch of incomplete stuff out (e.g. proficiencies), add a few more roguelike basics, balance it out, and ship a v1 without too much trouble. However, my job disagrees; I recently mapped out the work I have to accomplish over the next few months and notified my boss that all I need is 17.5 days per week to get everything done. The folks reporting to me have it easier at only 10 days per week of work through Q1. Such is life.

I’ve got updated demos for Windows and Mac which include all of the features outlined in the last couple of posts. These are still very much ‘alpha’ quality, and no doubt replete with bugs and imbalancse – but honestly it’s starting to feel more like a real game which is pretty cool :).

That darned mortgage keeps chipping away at my 7yrl time, but I still managed to eke a few hours here and there over the last couple of months. The Skill and event/action rewrite mentioned in my last post was a big part of it, but there were also a bunch of other changes.

Tile Animations

I’ve added a simple Xml-based definition for animations which can be played when a player uses a skill (or other event, e.g. dies). It allows creation of short-term particle effects and tile animations to be combined.

Here’s the xml definition for the ‘immobilizeVisual’ which is played when the player uses the Poison Cloud skill – it spins up two particle generators and animates a poison pit tile fading in and out:

The net effect is this:

Hard to see in a picture, but it’s animated :). This’ll allow me to create more interesting effects as I get more into fleshing out the details.

Ranged Skills

Before skills would also trigger around the player’s location; now a Skill can be defined as being centered at either a player-selected Cell or a player-selected Mob. Here for example is the Poison Dart skill, for which the player must select a target mob:

Sound Effects

I’ve added sound effects for a wide variety of actions as well as a full set of different attack/miss/move/etc sounds for each the mobs, each of the different weapon attacks (e.g. sword vs mace) and for each of the Skills. Most sounds also have a collection of effects which are randomly chosen from for variety. I’ve also added Ambient sounds, although those aren’t fully generalized yet. I’ve had to disable the sounds on iOS for now though, as the latency of AVAudioPlayer is unacceptable and I’ll need to move to OpenAL (oy).

Doors

I’ve added Doors. Yeah, sounds simple enough, but man was there a lot of under-the-covers work necessary for Doors. Open/Close actions, specifying which mobs can open/close doors and which can’t, accounting for them in exploration, etc. The one thing I just couldn’t get to work (given how my shadowing system works) is obscuring vision through closed doors. You can see a door in the above image in its closed state.

Layout engine rewrite

I was finding myself adding more and more iOS-specific hacks to make layouts work correctly. This was getting ridiculous so I stepped back and ripped out pretty much all of the layout code for everything. This was a metric ton of work (especially ensuring that it worked correctly across all of Windows, Mac, iPhone, and iPad), but it now contains far fewer hacks, and does about 1/2 as many relayouts as it had to do before, so there are some perf benefits there as well.

Tons of little changes

And as always I’ve made a slew of smaller improvements, including:

Mob buffs appear in tooltips

Secondary item actions. On iOS, you can press on the secondary cab slot and slide up to get quick access to other actions. This is most useful when you’ve picked up an item you don’t want; rather than opening your inventory, just slide up and select drop.

Skill cooldowns; after using a skill you have to wait a set number of turns before using it again. I’ve also added a 20-turn cooldown when activating a new skill.

Named vaults: I want vaults (prefab rooms) to be special events; so now when you enter one, it stops exploration and displays a modeless vault entrance popup to let you know.

One of the aspects that I most like in ‘true’ roguelikes is the permanence of death; it makes every move that much more important. Unfortunately, one of the things I hate most in roguelikes is the moment right after death. I’ve found myself gravitating towards games that find a balance between the two; when your character dies, they die – but you maintain some semblence of progression. Rogue Legacy is the game that most immediately comes to mind, but there are plenty of others

Persistence beyond death in 7yrl

In that vein, I want 7YRL to be replete with persistence-beyond-death themes. I’ve rationalized them through a series of “Tomes” that will be passed down from character to character (generic backstory pending). Here are some of the ways that knowledge will get passed down to benefit subsequent characters:

Proficiencies – the more you use a weapon/armor/item, the better you get at using them. Higher bonuses, improved effects, maybe even unlocking new powers.

Crafting items – When a player starts a new gameslot (e..g from nothing), the Dungeon is populated with only a bare minimum of weapon, armor, and item types. The player can increase the variety of objects by crafting them using Plans and Ingredients that they find and decipher. Once deciphered, the item can now appear in all subsequent games as drops.

Professions – there will be 7 professions in the game which each have 10 levels that you can gain. Each level within each profession will provide a substantial, game-changing benefit (e.g. +100% gold drop; ability to add powers to items; double bag space in inventory; unlock alchemy & ability to craft potions; etc). Players will gain profession levels by crafting items; deciphering a plan will gain a profession point; gain enough profession points and you’ll gain a level and the corresponding benefit.

Skills – As the player plays, they can discover “Skill Recipes” – these recipes can be inscribed into the player’s Skill Tome, and give the ability to learn powerful new abilities (offensive, defensive, and utility). These inscribed skills carry over from character to character – however, in order to learn the skill so that they can use it, each character has to find a set of Runes (specific to the skill) and use them to learn the skill. I have 120 skills mapped out and ready to implement; while every class can learn any skill, each class has 30 skills that are “theirs” and can be learned using the required runes – the other 90 skills (which belong to other classes) are harder for the player to learn and so require additional runes. This will make for some interesting mixing and matching…

Augmenting items – Players can also use Runes to augment items. I haven’t fully decided how best to do this yet, but the gist is that you can turn a common item (e.g. dagger) into a magic item (e.g. holy dagger) and these augmented items can then appear as random drops in subsequent games. This provides another min/max opportunity for the player; given a handful of Runes, you can learn a Skill that helps just that character, or augment a weapon that helps that character and all subsequent characters. Items can be augmented up to four times, from common to uncommon, to rare, to epic, and finally to legendary.

Mob mastery – Killing a monster of specific type gives you an awareness of its weaknesses – e.g. a rat is susceptible to blunt damage (hammer = +25% damage) but is agile so takes less damage from large, sharp damage (sword = -25%). This knowledge is written in your Mob Tome so later characters gain it. The current character also get flat % bonuses the more you kill a specific type of mob (e.g. kill 10 rats, get +10% damage against them) – that flat bonus probably won’t carry across characters.

Ultimately, the persistence of the above will make the earlier levels easier and get the player into later (less experienced) levels quicker, reducing the redundancy of those earlier levels.

Event/Action infrastructure rewritten

As I started implemented more complex Skills, I realized that the existing event/action infrastructure didn’t provide enough granularity for targets, especially when I started getting into chaining events; e.g.

a player uses a skill (action)

which adds a celleffect (action)

which when entered (event) by an enemy of the player,

adds a buff (action) to the mob that entered the cell

which poisons the mob

But what if I wanted the buff to heal the player? ala:

a player uses a skill (action)

which adds a celleffect (action)

which when entered (event) by an enemy of the player,

adds a buff (action) to the mob that entered the cell

which heals the player

… or cast it when a friend of the player enters the cell?

a player uses a skill (action)

which adds a celleffect (action)

which when entered (event) by a friend of the player,

adds a buff (action) to the mob that entered the cell

which heals the player

… etc. This can chain farther along; at any point, the event or action can target one of a variety of different targets in the event chain. I implemented this by specifying the Trigger/Target in the Skill definition. e.g. the following:

it’s complex, but it says:

[this line is implicit since it’s coming from skillDefn] – when a player uses a skill

Apply a CellEffect to a Cell that the player selects which adds an adornment and

when an enemy of the mob that used the skill (ie the player) enters the cell

apply a celleffect centered around that enemy mob which adds an adornment to random cells and

when those cells are entered by friends of the mob that used the skill (the player)

heal the mob that entered

Put in English: this is the “healTrap” skill; it places a trap that when a mob steps on it, sprays healing globes all around which the player can pick up.

Almost any part of that can be changed, allowing me to quickly and easily create new skills. Item powers (e.g. healing potion, renew potion, magic weapon) work exactly the same way.

This required a complete rewrite of the Event/Action system; it’s much better now, but was a ton of effort to do. Glad it’s done!

Skills implemented

Once the Event/Action code was rewritten, I implemented the infrastructure that allows for skills to be inscribed (persisting between characters), learned (enabling it for the current character) and activated (allowing the player to chose between learned skills). Skills are categorized as Offensive, Defensive, Utility, and Passive – a character can have only one of each type active at a time.

Here’s what the (obviously interim) UI for the skill pane looks like:

Here, the player has inscribed 5 skills (these skills remain inscribed for all subsequent players), has one active skill, and has 3 of the 4 runes necessary to Learn the inscribed ‘Fleet Foot’ skill. Once the player finds that last rune, they can Learn and Activate the skill, and it can appear in the R/G/B slots at the bottom of the screen.

Here’s the list of skills that I’ve implemented so far – while these were mostly just test-bed skills, I suspect most will make it into the final product:

Minor Heal: Heals self for a small amount

Heal: Heals self for 50 HP

Renew: Heals for a small amount over time

Renew (passive): Grants 1HP every turn

Heal Trap: Places a trap that when an enemy mob steps on it, sprays healing globes

Poison Dart: Shoots a poison dart at an enemy

Poison Cloud: Casts a poison cloud around the caster

Flame Path: Leaves a trail of destruction behind you

Immobilize Group: Immobilizes mobs in an area for 5 turns

Flame Blast: Blasts an area which burns enemies for 10 turns

Fleet Foot: Dodge all attacks for 6 turns

Stoneskin: Reduces damage taken by 75% for 10 turns

Stonefist: Increases damage dealt 2.5x for 10 turns

Immobilize: Immobilizes a foe for 10 turns

Here’s what a player sees when they discover a Skill Recipe:

All in all, I’m quite happy with how flexible the skill infrastructure worked out to be, and am looking forward to using it to create a wide variety of different skill types once the infrastructure work is all complete.

It’s been too long since the last update, but work on 7YRL has moved on regardless. It’s hard to capture everything that’s new in the game over the last few weeks, but here are the top items:

Character pane completely redone

I’m still playing around with what the final look and feel will be for the game. I’m playing a bit with a richer/deeper color style to see how it feels. I like it, but have yet to convince myself that mixing non-8bit interfaces in a predominantly 8bit game is a good idea. Still, I think it looks good as a placeholder.

Dragging items around

Items can now be dragged to/from the inventory slots and the equipped item slots. The dragged tile also appears as a “ghost” image in the target locations.

Dual wield support

This was a unexpectedly large amount of work, mostly in the equip/unequip flows and the sheer number of edge cases; e.g. user has a one-handed dagger and a shield equipped – when they drag a bow over to one of the weapon slots, both the dagger and shield should automatically be unequipped and moved into the player’s inventory when they equip the bow. But what if they have a full inventory? Or, what if the dagger is unequipped but then the shield fails to unequip because it has a curse on it? All of those sorts of cases are handled.

Action bar support

I’ve enabled the quick action slots in the control panel. You can drag potions and scrolls from your inventory into these slots and then quickly get to them. Tooltips are also enabled when you mouseover them:

iPhone and iPad support – major refactoring of whole UI

This is probably 2.5 of the last 3 weeks. The UI engine is written to be resolution-agnostic, allowed me to quickly get it up and running on any monitor or device. While it works, the unfortunate reality is that it ends up creating UI that is way too small on a 4″ screen, and also not optimized for how you hold it. So I’ve completely refactored the UI for mobile.

Here’s the updated main menu screen. The design (etc) is obviously placeholder, but it gives a sense of how I’m trying to emphasize large clickable items in menus.

Here’s what the UI looks like on a phone in portrait mode:

I spent a bunch of time creating different prototype of where the buttons would go, trying to find the combination that felt best when holding the phone vertically. I really like where it ended up – I’ve removed the action slots, but the result is buttons that are very clickable and are in a very natural place for where your thumb happens to land. Well, if you’re right-handed, that is; but don’t worry south paws, I’ll have a mirrored version of the controls for you as well.

Here’s what it looks like when you rotate to landscape:

Again, the controls are very intentionally laid out so that the primary CAB button is right where your thumb happens to naturally fall. I can play a surprising amount of the game without moving my hands.

I’ve also built a vertically optimized version of the character pane shown above; this is used in portrait mode as well:

And finally, the iPad currently uses the existing pc/mac layout – the buttons are the right size for it, but they aren’t in the optimal position for someone holding the device; I’ll tweak that in time.

Stackable items in inventory

Items can now stack in the player’s inventory. ’nuff said.

Buff tooltips

As with skills, CAB actions, items, mobs, and action slots, buffs now have tooltips when moused over (on pc/mac) or pressed (on mobile):

Improved pathing

Before you could only tap on visited or currently lit cells – so if you tapped near the edge of where you could see it sometimes would say “no.” It now checks to see if there’s a path of 5 or less tiles from the tapped-tile to a visible tile, and if so accepts it. This makes tap-based exploration feel much better

Full inventory scenarios

Man was this a pain. So many edge cases!

Mobile performance

Perf on the iPhone had dropped below acceptable levels (e.g. 20fps with ~20 lights on screen). I made a few changes so that it rarely drops below 30, but there’s definitely still work to be done here.

Tons and tons of gameplay bugs

Dungeons and Hunters suddenly became a bit more interesting in the world of 7YRL…

Ranged attacks and animations

Bows and crossbows can now attack from a distance. When you attack a mob that’s within range, it fires a bolt that does damage. Uncommon and rare bows and crossbows have higher range. There’s currently infinite ammo (and no balancing) so bows are over-powered for the moment. I’d like to avoid ammo if I can, but may need it as an offset to the benefits of being able to attack from range…

Here’s a shot shortly after firing a bolt. You can’t tell from the picture, but the arrow rotates to face the right direction when fired. All in all it feels pretty good.

Dungeon Editor

I’ve created a new tool that will help me tweak and test the dungeon generation code. The dungeon editor allows me to modify parameters, build dungeons, and also batch-build a slew of dungeons to fuzz-test the generation code. Here’s what it looks like:

Not much to look at, but very useful in testing and tweaking.

Dungeon Generation Parameters

The Dungeon editor makes it easier for me to add and see how new parameters look when generating dungeons. Tweaking those parameters gives dungeons that look pretty different – e.g.:

Different theme:

RoomFillRate of 1:

Sparser dungeon:

You can also see the various themes in the list on the left. I’m not leveraging this fully yet, but once I get the rest of the game up and running and am coming back to tweak things, this’ll help a ton in ensuring dungeons feel less repetitive.

More test vaults

I also created a few more test vaults; you can see them in the pictures above. Also, very large rooms will sometimes have a vault dropped into them to break up the large empty space. I’ll have to see if this feels too artificial or not.

Task tracking sheet

I’ve created a tracking site up on Trello here: https://trello.com/b/T9aMWWsv. If you want to see what I’m working on or what’s next for 7YRL, check it out!

These took a good bit longer than expected, but the joy of a seven year dev cycle is that that’s okay :).

Maps

What’s a roguelike without a map? 7YRL players can now bring up a map of the current level by pressing ‘M’ or tapping on the minimap (more on that below). The map supports dragging around or zooming in/out. The cool thing techwise is that it’s using the same texture as the ‘memory’ map (which tracks what the player has seen) so it has a more realistic feel to it. Here are a couple of shots:

And here’s zoomed in. The map window also increases in size if the user resizes/fullscreens the game.

Minimap

This update also adds a smaller version of the main map into the upper right corner of the screen. Tapping on this brings up the main map. I also moved the bufflist under the player to make better use of space. You can see the minimap and new bufflist location here:

CAB

When I first started working on 7YRL, I was primarily targeting mobile devices. On those devices, roguelikes tend to suffer when it comes to moving the character around; tapping on small tiles on a small phone can be hit-and-miss. My solution is the ‘Contextual Action Bar’, or CAB – the intent of these is that they display the most common two actions that the user might want to perform. When a mob appears, attacking that mob is the primary action; when an item drops, picking it up is the primary (upon picking it up, equipping it becomes the secondary action).

The most common action is sen in the picture above – Explore. This is the command I use most often in DC:SS and I think it works wonderfully – it just does the exploring for you. And that’s not a “Progress Quest“-esque experience; it just removes the extensive UDLR needs of a roguelike and gets you to the interesting content and interesting decisions without a bunch of walking from Point A to Point B.

The biggest challenge to getting the CAB right will be ensuring it’s consistent enough that players can build muscle memory to the point of knowing what will happen when they select primary or secondary even without looking at the CAB. That said, I ultimately like the Primary/Secondary CAB slots so much that I’m bringing them into the PC/Mac experience as well.

Here’s the CAB right after you encounter a new mob. The player’s “normal” action is to attack a mob so that’s primary; they may not care about it though so explore is the second action. The game keeps a queue of objects-of-interest (eg in case 4 monsters appear at once) and does a good bit of work in the background to pick the one the player most likely wants.

The CAB’s not perfect; it can’t be – two actions can’t encapsulate all options available to a player. This becomes most apparent when a lot is going on on the screen. That said, it’s not supposed to be perfect – users will still tap around on the screen, especially when things get more strategic. This is just intended to make it quicker and more enjoyable to get to those moments

Bug fixes

Lots of bug fixes this time around as well. In particular, a bug slipped in last time that caused an intermittent crash when ascending/descending between levels. That’s been squashed.

Next up

Phase 4 is all about getting 7YRL to that baseline “it’s a real playable roguelike” stage. Maps and CAB stuff bring it closer. The next couple are less interesting but important to have:

Ranged attacking, including ranged AoE attacks. This will work for both weapons (bows, wands, etc) and skills (e.g. a targeted AoE poison cloud skill). The latter will require a chunk of infrastructure work to the event/action system – e.g. ability to target a particular mob or a particular cell, max distance on AoE attacks, etc.

Stackable items in inventory. Making items stackable is straightforward, but it requires some grunt-work UI to make it usable.

Fleshing out the character pane. It’s very basic (and with placeholder UI for now). I need to clean it up and also get stats and skills incorporated into it

Keyboard in itemgrids. 7YRL already supports keyboard in most of the UI, but not in itemgrids (eg when picking up multiple items or when looking at inventory). I’d ship v1 without it, but I’d like to go ahead and get that done now if possible just to get it off the list.

Figure out mouse-over equivalent for tablets and phones. On the PC or Mac you can mouse over items, mobs, or skills and see a tooltip with information about it. I need to figure out the best approach to that for devices without mice. Press-and-hold is the default answer which I’ll probably go with, but I’d like to find something more discoverable if possible. Failing that, I’ll move forward with press-and-hold and have to figure out how that impacts the input systems.

Only a few more updates after that before Phase 4 is complete and I can move on to the more interesting stuff in Phase 5 – Skills, Professions, Proficiencies, and Crafting (oh my!)

New demos uploaded!

I’ve uploaded new demos for both PC and Mac and will update the links over there –> once they’re accepted. Check back soon!

Phase 4: A real roguelike

I do love starting a new phase as it lets me do a bunch of fun stuff up front. That said, this particular phase will be the most grudging as it consists of me paying down tech debt I’ve been building up, and turning 7yrl into a real (albeit unbalanced) roguelike. There are a bunch of things to do, but I’ll be glad once they’re done and behind me so that I can start focusing on Phase 5 where I get to extend beyond ‘vanilla’ roguelikes and bring in less common features; Crafting, Professions, and Skills.