7DRL 2013: Husk

My 7DRL 2013 entry is titled Husk. I’ve written a post about Day 1 here.

Marching into Hell

Between my six months working at Romney for President, my vacation to San Francisco, and my new job at AppNeta I’ve had a hell of a time working on Hellmouth. I have a great development roadmap that should land me at a beta before the end of the year, and I’ve made some really exciting backend changes, but as a game it doesn’t play any different than it did a year ago. In some sense, it’s actually buggier – there have been a lot of regressions that I haven’t yet addressed since I’m regularly gutting entire portions of the codebase.

About a month ago, I decided to dedicate as many Saturdays as possible to Hellmouth development. This decision was partially prompted by the announcement of 7DRL 2013, which will be using Hellmouth’s (currently unnamed) framework. I’m arbitrarily defining success as spending at least 12 hours exclusively coding to the extent possible (I already plan too much, and eating is optional).

I wasn’t so successful the first few attempts, but it’s starting to pay off, and yesterday I managed to program for about 20 hours with minimal breaks. And apparently, it’s paying off! There’s a noticeable LOC uptick even though my recent commits have involved a ton of churn. Here’s what the line count looks like file-by-file:

eronarn@Carcosa:~/Code/Hellmouth$ find . -name '*.py' | xargs wc -l | sort -nk 1
 4 ./src/games/hellmouth/main.py
 5 ./src/games/hellmouth/info.py
 5 ./src/games/meat_arena/info.py
 9 ./src/lib/util/mixin.py
 11 ./src/lib/util/dynamic.py
 11 ./src/lib/util/log.py
 11 ./src/lib/util/math.py
 11 ./src/lib/util/time.py
 13 ./src/lib/data/dialogue.py
 17 ./src/lib/objects/items/collection.py
 17 ./src/lib/util/system.py
 18 ./src/lib/objects/items/armor.py
 19 ./src/games/meat_arena/levels/screens.py
 25 ./src/lib/components/views/screens/help.py
 25 ./src/lib/util/event.py
 28 ./src/lib/data/help.py
 31 ./src/lib/util/debug.py
 32 ./src/lib/agents/actors/player.py
 32 ./src/lib/objects/items/modifiers.py
 35 ./src/lib/agents/components/movement.py
 36 ./src/lib/objects/items/carrion.py
 37 ./test.py
 41 ./traits.py
 44 ./src/lib/agents/components/component.py
 46 ./src/lib/data/art.py
 50 ./src/lib/generators/points.py
 50 ./src/lib/util/color.py
 63 ./src/lib/data/generators/items.py
 67 ./src/lib/util/text.py
 76 ./src/lib/data/generators/points.py
 77 ./src/lib/data/traits.py
 80 ./src/lib/objects/terrain.py
 80 ./src/lib/wip/overworld.py
 81 ./src/games/meat_arena/agents/actors/monsters.py
 81 ./src/lib/data/generators/equipment.py
 85 ./main.py
 86 ./src/lib/util/key.py
 87 ./src/lib/generators/items.py
 93 ./src/lib/generators/generator.py
 94 ./src/lib/util/result.py
 104 ./src/lib/agents/actors/npc.py
 118 ./src/lib/util/db.py
 120 ./src/lib/agents/components/status.py
 120 ./src/lib/util/dice.py
 122 ./src/lib/data/generators/text.py
 129 ./src/lib/util/command.py
 132 ./src/lib/agents/contexts/combat.py
 141 ./src/lib/generators/maps/meat.py
 142 ./src/lib/agents/contexts/context.py
 142 ./src/lib/generators/maps/mapgen.py
 142 ./src/lib/util/define.py
 144 ./src/games/meat_arena/levels/chargen/lifepath.py
 146 ./src/games/meat_arena/levels/arena.py
 147 ./src/lib/components/views/screens/screen.py
 147 ./src/lib/generators/text/describe.py
 150 ./src/lib/generators/text/combat.py
 155 ./src/lib/agents/components/action.py
 159 ./src/lib/components/views/view.py
 163 ./src/lib/data/screens.py
 167 ./src/games/meat_arena/main.py
 174 ./src/lib/components/component.py
 182 ./src/lib/agents/actors/ai/astar.py
 184 ./src/lib/agents/components/container.py
 201 ./src/lib/maps/encounter.py
 225 ./src/lib/maps/cell.py
 246 ./src/lib/maps/map.py
 247 ./src/lib/data/skills.py
 247 ./src/lib/util/hex.py
 266 ./src/lib/agents/components/equipment.py
 273 ./src/lib/agents/agent.py
 278 ./src/lib/agents/components/combat.py
 284 ./src/lib/components/input.py
 296 ./src/lib/objects/items/item.py
 329 ./src/games/meat_arena/levels/chargen/chargen.py
 414 ./src/lib/agents/components/bodies/body.py
 456 ./src/lib/agents/components/bodies/parts.py
 519 ./src/lib/agents/components/manipulation.py
 601 ./src/lib/data/items.py
 624 ./src/lib/util/hex_fov.py
 671 ./src/lib/components/views/tactical.py
 984 ./src/lib/agents/actors/actor.py
 998 ./src/lib/data/lifepaths.py
 13202 total

In the latest batch of changes I’ve written a base Agent class shared by everything from Actors to Terrain, switched over to an entity-component system for Agents, refactored almost all Agent methods as mixins, rewritten key handling and added more generic event handling, added a variety of nifty decorators, and rewritten some important parts of action logic as Python generators.

Unfortunately, most of those changes haven’t actually make the game play any differently, so it looks basically the same as it did a year ago. However, the most recent round of changes has at least made the framework much more flexible, which should help me during the 7DRL. (Fingers crossed!)

Cataclysm server is now up and updated

A #rgrd visitor informed me that my Cataclysm server had failed. It turns out that Whales, the developer of Cataclysm, has stopped maintaining his repository in a state that won’t compile. Luckily, there are many forks! I chose to switch my scripts over to point at DarklingWolf’s mod, CataclysmDDA, primarily because that’s what the internet told me to do. The website for the mod is located here, and here’s the information about the SSH setup.

Happy surviving!


New year, new job

AppNeta logo

My new employers!

I’m now a sales engineer at AppNeta, and I’ve written about the experience of my first few weeks on the company blog. Probably my favorite thing about the job is not mentioned in that post. Originally I was told that I might see more like a 90-10 or 80-20 breakdown of time doing sales to time engineering. I’ve actually been able to do much better than that! I’ve already worked on instrumentation for Drupal, Solr, and Varnish and I’ll be working on Twisted instrumentation next week at the Boston Python meetup. A lot of that work is far off from production, but some has already been merged into master! :D

I’m still a little mystified, though, by the way they play music (incl. dubstep!) on the sales floor. Oh well, maybe that will change when we move to a new building…

Returning to the internet

I never thought I’d be saying these words, but: I spent most of the past six months working as a web developer on Mitt Romney’s website (built using Drupal 6).

Mitt 'n Me!

I wasn’t particularly secretive about this with my close friends, but I was bound by a “no social media” agreement, so I curtailed my blogging and tweeting. Hopefully that can now change.

(I’ll do some posts about the job later, but for now let me just state that it was weird as heck.)

Tattoo number two

My tattoo of atropa belladonna, by Dia Moeller.

I’ve been planning this one for a few years (using an image sourced from here) and finally decided to stop putting it off. The artist is Dia Moeller, of The Painted Bird in Boston, MA and I’m thrilled with the work so far. Unfortunately, after about 4 hours of tattooing time we had to stop for the day. I’ll be in to get the rest some time in December.

With a little help from my friends…

(Screenshots at the bottom of this post.)

One of my design goals in Hellmouth is to emphasize knowledge and perception as alternative playstyles by making them as game-changing as combat attributes are in most games. Consequently, there will typically be a lot of information about a situation available to the player at any one time. Games that provide a lot of information can be very intimidating, and unfortunately one of my favorite games is well-known for failing to usefully communicate its rich complexity.

One of the ways that I’ll get a handle on information overload is by providing reasonable defaults but allowing the player a lot of control over the ultimate level of detail dislayed. There will be many LOD-based implementations throughout the game (such as item descriptions or combat text), but one of the most important to have is also one of the simplest to implement: a zoom control for the tactical map. Read more »

Meat Arena v0.2

I’ve been putting a lot of time into Hellmouth lately. Since I’ve made enough progress that I feel comfortable doing an alpha release, I just pushed the 0.2-meat tag on Github. It’s the first tag since the 7DRL version, and trying to assemble a full changelist would be insane. However, I’ve touched upon some of the improvements here.

That page also details your options for playing Meat Arena.

Screenshots from the past few days below the fold.
Read more »

Editing color schemes of console applications

Lately I’ve been working on Hellmouth‘s combat interface. While I’ll be giving weapon choice a dedicated submenu, I’d like it to appear on the main screen as well. Unfortunately, I didn’t properly account for this in the initial interface design document. While I can change that design, I’m almost completely out of room so any change needs to be done carefully. Since it’s irritating to have to restart the game and seek out appropriate test cases after editing code, I started looking for a way to take an HTML screenshot of a console application.

About thirty seconds later, I remembered that I had Hellmouth running in shellinabox on my server! Read more »

Better black bean burgers?

I think I may have stumbled on a really good black bean burger recipe! I tried making this one, since it’s vegan, but I used beans straight out of the oven instead of canned ones. Even though I didn’t add the crumbled bread, and added some extra oil, the patties held together better than ground beef ones and produced a nice crispy crust when cooked. Admittedly, the flavor is a bit lacking with only beans and onions, but I’m going to try and replicate/extend my results next time I make a batch.

I served them with these, by the way. Best recipe for fries that I’ve seen!