Tag Archives: python

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!)

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 »


Yes, this actually happened on the first time I went to take a screenshot.

Hellmouth progress update

I’ve been putting my free time to good use working on Hellmouth. Here’s what I’ve added to the game since my last post about it:

  • combat
  • cross-level travel
  • A* pathfinding
  • an attribute and skill system
  • random map generation
  • random item generation
  • elemental color support
  • several major new interface features
  • folder structure

If I keep working at my current pace, the first beta release will be within a week or so. I’ve created a page for Hellmouth on Roguebasin, and I’ll fill that out with more information about the game when it happens.

There are some new development screenshots below the fold. Read more »

Lifepaths, flowcharts, Edge, and human greed

Hellmouth was my semi-failed entry into the 2012 7DRL competition. I’ve continued to work on it over the past few months, and while the game is still sorely lacking in features, I’ve made some real progress by focusing on building components in isolation from each other as much as possible.

One such component is the character generation system. Hellmouth uses a lifepath system where your decisions about your character’s history affect their capabilities. Here’s what one of Hellmouth’s lifepath nodes looks like: Read more »