Archive

Archive for December, 2008

Free Game: Spelunky (and an accidental diatribe on exquisiteness in games)

December 31st, 2008 doctorfrog No comments

Source: Horrible Things » roguelike

Spelunky is an Indy Jones-like treasure grab platformer, and like many small indie games these days, it borrows play elements from a number of other games in an attempt to synthesize something fresh and new, yet familiar, and therefore intuitive.

Recent Winners

December 28th, 2008 njerpe No comments

Source: Legerdemain

We’re pleased to announce that Blume and Hegemoth have joined the ranks of those who have completed Legerdemain.

We’re looking to tabulate these reports as they come in, so send your winning save game files to legerdemain@bellsouth.net. We’re hoping to build something along the lines of a high score table, indexable by philosophy, number of game turns, date reported, and so on. To our knowledge there are no Logos or Chronos manipulators who have succeeded yet; perhaps you can be the first? Visit the forums if you have ideas or enhancements you’d like to see implemented in this area.

A big thank you, too, for those who’ve been chiming in on the forums recently. There have been a lot of good suggestions raised in recent weeks and we have efforts underway to get these implemented in future versions.

Categories: Legerdemain, Planet Roguelike Tags:

Bug found

December 25th, 2008 Krice No comments

Source: Rogue Hut

I found a bug from Teemu. You can play the game without entering a name, just press enter when name is asked. Funny thing is that it seems to work fine, it doesn't crash the game. I don't even know if it's a bug, but I'm fixing it in v1.1.

With limited inventory of Teemu I created a tool inventory with items you can only (u)se. This new invention will also prevent extra checks with tool items and makes more room in the inventory for new items.
Categories: Planet Roguelike, Rogue Hut Tags:

Dungeon Crawl Stone Soup 0.4.4 released!

December 20th, 2008 greensnark No comments

Source: Dungeon Crawl Stone Soup

Stone Soup 0.4.4 has been released, finally officially fixing bugs that have long since been put to rest on CAO and CDO. For a list of changes, click here.

Entity Composition: Doing It Wrong

December 17th, 2008 Snut No comments

Source: The Oblong

So, despite the lack of updates I've been working on this quietly. Unfortunately recent progress has been entirely on the game logic and architecture, rather than anything readily screenshotable, hence no real drive to blog.

But here I am, writing a new post. This can only mean one thing: rambling, waffly code-oriented braindump!

My current obsession is the structure of entities, going right back to basics. Entity is a deliberately ambiguous term, which I'm taking to mean any gameplay-relevant object that can be affected by the actions of agents in the game. Doors, monsters, AI, buffs... many things potentially fall under this umbrella.

I tried splitting the potential abilities of an entity into traits/mixins:

abstract class EntityAbility
trait HasPosition extends EntityAbility {
val position : Vector
val blocksTravel : Boolean
}
trait HasHealth extends EntityAbility {
val currentHealth : Int
val maxHealth : Int
}
abstract class Entity extends EntityAbility {
val id : Int
}

class Character(val id:Int) extends Entity with HasPosition with HasHealth {
val (position,blocksTravel) = ((2,2),true)
val (currentHealth,maxHealth) = (100,100)
}


This is nicer in many ways than a traditional hierarchy, allowing for more code reuse and less chance that required functionality will come with a bundle of meaningless state.

Unfortunately there are also some interesting problems with this approach. Mainly they concern the immutable update step. If only the position (say) is changed in a given timestep, objects can be dealt with as instances of the HasPosition trait. However this trait has no concept of the entity that it's being mixed into, and so cannot instantiate a copy of the entity with an updated position. Dropping the requirement for immutable world state allows for this easily, but that's no fun.

In addition, information about capabilities of an entity are defined at compile time, bound up in the type system. There's no way to define these things in a data file read at runtime. Whilst this isn't as big a concern for me (this is a small game and only needs a handful of basic types to define most of the game) it is an unfortunate restriction.

Another approach is to use actual composition...

sealed abstract class Position
final case class HasPosition( position: Vector, block: Boolean ) extends Position
final object NonPositional extends Position

sealed abstract class Health
final case class HasHealth( current: Int, max: Int ) extends Health
final object Invulnerable extends Health

final case class Entity( id: Int, position: Position, health: Health )

//Elsewhere...
def move( e: Entity, newPos: Vector ) = e.position match {
case HasPosition( _, b ) => Entity( e.id, HasPosition(newPos,b), e.health )
case NonPositional => error("can't move nonpositional entities")
}


Well, changing entities becomes trivial (and supports using a Builder pattern or helper methods to remove those ugly constructor calls everywhere, plus enabling runtime construction of new entity 'types') but I end up having pattern matching all over the place. When you're operating on several components that becomes very messy, very quickly. There's also the issue that there seem to be vastly more potential runtime errors visible in the code, even if in practise I always check that a given component is of the correct type the compiler will whinge if pattern matching is not exhaustive (and correctly so).

I've fiddled with some other approaches such as conventional inheritance and a slightly COM-like abomination, but so far the above two feel most natural in Scala. I can't help but think that I'm missing some obvious alternatives though, as neither is particularly elegant when implementing common operations. Clearly I'm doing something wrong...
Categories: Planet Roguelike, The Oblong Tags:

LambdaRogue 1.3

December 15th, 2008 Krice No comments

Source: Rogue Hut

Still don't like the 5 tile height gameview in large tile mode. It's ridiculous. I think Mario should just dump all other modes and make one good graphical view to the game with enough visible tiles both in vertical and horizontal direction.

I don't like the dungeon algorithm either. It's maze-like and boring to explore. When I think of mazes and particulary corridors I think they shouldn't just run here and there. The dungeon should have a clear idea, whether it's just for storage room or place that someone actually lives. No one lives in a maze but minotaurs.

There are more dungeon features like barrels to kick open. It's nice, but if they are all just scattered randomly in a maze it gets boring quite fast. I think that distinct level themes are the proper way to create nice gameplay, which then form the game world with different locations to visit.
Categories: Planet Roguelike, Rogue Hut Tags:

Ideas of Teemu

December 14th, 2008 Krice No comments

Source: Rogue Hut

This entry contains some spoilers from Teemu so win it first and read this next. Before the release I was talking about some new (for me) ideas I had while developing Teemu:

1. The strategic situation in spider cave. Spiders don't want to go in water, but there are lots of them and you need to wipe out them in some way or quickly get to the chest and get the item. This kind of strategic situation could be set up in many different ways.

2. Moving platform (the ship). In Teemu it's only a part of the end scene, but could really be used to travel on water. Ships or smaller vehicles are less used in roguelike games.

3. Grab command, something that could be more complex, giving new kind of interactions with the game world.

I think all these will find their way to Kaduria.
Categories: Planet Roguelike, Rogue Hut Tags:

Bugs and the Fixes That Love Them

December 11th, 2008 JHaas No comments

Source: Lukos Software Development

I just released MG 1.2. I feel pretty good about this release; hunted down every bug reported about 1.1.1 that I felt I could fix without massive rewriting. All that remains are minor things, generally linked into the display code.

I'm currently waffling back and forth between working on new stuff for MG 2.0, and working on other projects. I need to focus on one or the other, I think. At this point, I'm leaning toward other projects. I've had a fairly steady flow of ideas for MG 2.0 for quite some time, but many of them aren't mature yet, and other projects are a fine occupation while they ripen.

Teemu v1.0 released

December 7th, 2008 Krice No comments

Source: Rogue Hut

Here it is. Fixed the "last" bug and it was uninitialized member variable, a counter that determined how long monster is searching with the pathfinding. That uninitialized value was random so monsters sometimes got stuck on walls and didn't respond to anything. I hope it's fixed now. The game is Windows only and should work without M$.NET.

http://koti.mbnet.fi/paulkp/teemu/teemu.htm
Categories: Planet Roguelike, Rogue Hut Tags:

Release version bugs

December 7th, 2008 Krice No comments

Source: Rogue Hut

The problem is not in gcc, because VC++ release compile also has the same bug: monsters just go somewhere and get stuck in walls. It could be uninitialized variable, because debug and release versions might have different values for them. I think I have to double check the routines that take direction as parameter, because some functions assume that it's a valid direction and nothing else.

Then there was a bug with endianess of wst file (my tile editor's native format). For some weird reason it's reversed in release version vs. debug version of VC++. I have no idea why. Anyway, I don't want to do anything more today. I wanted to release the game today, but this difference with release version was an unpleasant surprise.
Categories: Planet Roguelike, Rogue Hut Tags: