Archive

Archives pour 08/2008

Greetings from Dragon*Con, and a note to Mac users

Source: Legerdemain

Well, here in Atlanta we’ve almost reached the halfway point at Dragon*Con and it has been an absolute blast. A big thanks goes out to everyone who has fanned the flames of indie game development by showing their support for Legerdemain here at the Con.

If you’re in town this weekend drop by and see us; we’re in the Marriott Exhibition Hall, Booth 208 in the Marquis Ballroom.

And a note to my Mac users who have had trouble getting the game to run from a CD: everything is better than it seems. Turns out my .command file isn’t as flexible as it could be, if you just copy everything on the CD to the *root folder* of your ‘Macintosh HD’ then the .command file will cooperate smoothly. Copying to the Desktop is not enough; you need to make sure that the /Legerdemain folder is at the root of your filesystem (along with /Applications, etc.)

Feel free to use the contact info on my business card if you have any further questions.

 

Categories: Legerdemain, Planet Roguelike Tags:

COLUMN: @Play: Eye of the Vulture

Source: GameSetWatch Column @Play

Roguelike column thumbnail ['@ Play' is a kinda-sorta bi-weekly column by John Harris which discusses the history, present and future of the Roguelike dungeon exploring genre.] Here's a look at a roguelike game that some of you might not quite be familiar with. The graphics are very well-done, at least. It's got an isometric view, fairly detailed character and monster art, and decorated room walls and floors. Looked at with unfocused eyes, it even begins to resemble Diablo. So what game might this be? scree008.pngOf course, it's Nethack.

Continue reading "COLUMN: @Play: Eye of the Vulture" »

-- Delivered by Feed43 service

Visual fluffs

27/08/2008 Snut Aucun commentaire

Source: The Oblong


As my other post is waffly and dull, I thought I'd post some equally dull screenshots.

First, we have soft shadows and a general framerate improvement. I found I wasn't using buffer objects for my mesh streams (bad!), switched to position-only streams for shadow rendering when possible and changed the shadow buffer format to rgba16f. All this has reduced the frame time hugely, even after I started adding more crazy stuff. For comparison, a similar scene with blurred shadows was previously in the single-figure frame rate. Ouch. Still vastly too slow at the moment of course, but moving in the correct direction.

The soft shadows are done with a simple 3x3 guassian blur over the cube. It has errors on the cube edges for some reason, as can be seen in the nice black line across the lower right quarter of the image, but even with fairly low res maps and a small kernel the reduction in aliasing makes things look nicer. Hooray!


The second screenshot shows a half-finished unsmoothed SSAO post process. It's using a deferred rendering setup, with a few render targets for diffuse, normal, depth and lighting information at the moment, although for this screenshot only the depth info is used of course. Lots to do here, and I'd like to get a scene with more interesting visual fluff to show off the AO effect better...

Anyway, hopefully that helped balance up the wordiness of the previous post.

Functional Update Musings

27/08/2008 Snut Aucun commentaire

Source: The Oblong

Recently I've been focussing a lot on the rendering part of this project. Quite fruitfully at times, but it certainly wasn't my intention.

The reason for this is simply when I sat down to work on some gameplay stuff, I found a hard problem, and the solutions I've arrived at so far have not been... nice.

As fair warning, this is a brain dump, and a long, boring one at that. It contains much partly-functional waffle because my brain is full of partially functional waffle.

Background: Mostly for my own illumination, I've been trying to use more functional idioms in this game than is strictly sensible. I've mentioned before that I wish to have a (mostly) immutable world, for example. The world update step therefore creates a new world state every 'turn'. The current world state is stored in a mutable variable at the end of each update, but other than that the entire update should be immutable and cuddly from a gameplay viewpoint.

Problem: Creating a suitable update step for my basic case is very easy. The only entities that can affect the world are Agents. Each agent has a (poorly named) 'energy' integer value. When an agent has zero energy, it can act. Actions themselves are the things that change the world state, they are essentially partial functions of type Action :: WorldState -> WorldState, and almost all have the secondary effect of reducing the current agent's energy value when they're executed. After the current agent has acted, the agent list is sorted, some simple transformations are applied to the entity list (dead creature agents are replaced with corpse entities, for example) and time is advanced to bring another agent into relevancy.

This works after a fashion, but certain things are more sensibly represented as continuous functions of time than as agents that act with some (possibly inconsistent) frequency. A better way might be to allow these functions of time to run after the current agent acts, as conveniently we implicitly have the delta time before the next agent is ready to act. This will allow us to damage creatures in lava/acid, or heal creatures that are regenerating, for example. Easy enough, we can make something like TimeFunction :: Int -> WorldState -> WorldState. This is very ugly in practise, especially if there is no ordering defined over the set of active TimeFunctions (consider the joyous difference in observed state if a timefunction spawns a monster and then another damages/kills it, versus damaging monsters then spawning them). There are also potentially huge problems if the list of active TimeFunctions is part of the world state, subject to being updated by TimeFunctions as they run. Blurgh!

There's another big source of ugly too: edge detection. In general, we're quite interested in observing certain changes in world state. An example which Andrew Doull writes about here is a quest to scare seven goblins, which I think can be done by detecting changes in the afraid state of goblin entities. If we perform a comparison of world state before and after the player-controlled agent acts, we can in theory unambiguously attribute any newly-scared goblins to the player and update quest progress. Again we can create something like: EdgeDetector :: WorldState -> WorldState -> WorldState, but it's even nastier now than the case for TimeFunctions. We also have three transitions that may be of interest and could have associated detectors: comparing the original world state to that after the current agent acts; post-agent-action world state to post-timefunction world state; and original state to post-timefunction world state. This would allow us to differentiate between the player killing a goblin with a mace and the goblin burning to death because it stupidly fell into some lava, even in the absence of creatures storing their last attacker or whatever.

It may help to constrain these ugly bits somewhat. For example mandating that TimeFunctions must define a strict ordering and only affect the list of entities and their own internal state, whilst EdgeDetectors can only update their internal state. This in turn means that some other object has to dig through the EdgeDetectors to extract useful data, but I suppose that's not too evil. Both edge detectors and time functions are created and destroyed only by agents, which is closer to the simplicity of the initial design.

But even with these slightly draconian measures in place, a single update is a far nastier affair than I feel it has any right to be, with multiple intermediate world states, and I'm unwilling to set this down in code outside my messy prototype framework.

I've been wrestling with the few papers I've found talking extensively about reactive/game programming in functional languages (by which I mean Haskell) but it's dense, dry, nearly unintelligible stuff as far as I'm concerned. Admittedly they're generally solving the far harder problem of realtime games, whereas I currently go the cheatsy route of using a great deal of mutable state for all realtime code paths such as rendering.

Anyway, brain dump complete. I hope I'll find a better solution and can come back and mock my doubtless shocking ignorance in this post, but right now it just makes me uneasy. The net result of which is my experimented with deferred rendering pipelines and funky post process effects, so its not all bad.

Version 0.3.4 made available

Source: The Reptoran Saga

Sorry for the long delay between updates; I had some issues with my web host that were only just resolved. That said, LoR v0.3.4 is done and on the site, so feel free to take a look. Also, the error that prevented downloading v0.3.3 has been fixed.
Download Link
Version Page
Categories: Planet Roguelike, The Reptoran Saga Tags:

Transcendence 0.99c

Source: Transcendence

Transcendence 0.99c is ready with some important bug fixes. Consult the Version History page for a full list of changes.

Download 0.99c here.

Categories: Planet Roguelike, Transcendence Tags:

Back!

Source: Mirage Developer Diary

Summer has been quite busy. The last post I made was sometime before I went to Australia and since then I haven't had much time to work on Mirage. I have worked on it a little bit in the past week or so, and my interest has been revived.

A big problem I had earlier on was that I was being too ambitious and trying to think of everything I wanted to end up doing. This resulted in me not being able to focus on the little parts that I did need to do. I'm sure this will happen in waves but for now I've refocused on some smaller chunks that I can get done without having to think about the big picture.

The current state of the project is pretty good. I have a solid engine created that I can work off of and add to. Everything right now is very simple, but I have player and non-player characters working. The non-player characters that I do have just move around aimlessly, but that is something that I can work on later when I have a better base game worked out.

I've finished a cavern algorithm which is working very nicely. I still want make some tweaks to it because
occasionally I get maps with very small caverns. I might make some variables on the algorithm so I can set a minimum and maximum cavern size. This will give me more flexibility in the future if I want to re-use the algorithm for multiple types of caves.

I'm also working on a simple dungeon algorithm. Work on this one is very preliminary, but it's coming along nice. My plan is to work on many different dungeon generation algorithms so I get a lot of variety in the final game. Since I plan on open-sourcing the engine as well I feel the more different types of algorithms I have the better. The system is set up so that adding new dungeon generation algorithms is a breeze.

I have a short list of things that I want to implement next. They shouldn't be overly difficult but I just have to find time to do them. Everything is listed in the order I want to complete them.

  • Collision detection

  • Line of sight

  • Dungeon Connection

  • Dungeon Persistence


There are also a handful of other things that I want to implement as well. For the most part I have been doing whatever comes to mind, but I want to implement enough to have a playable game. Hopefully I find time to work more on the game once the summer is over.

Transcendence 0.99b

Source: Transcendence

The latest version of Transcendence has another batch of fixes to bugs reported by players. In addition to fixing several crashes and save file corruption bugs, this new release also fixes some problems with Korolov and Huari missions.

As always, the Version History page has a full list of changes.

Download 0.99b here.

Categories: Planet Roguelike, Transcendence Tags:

ANN: Roguestar 0.2.2

17/08/2008 Lane Aucun commentaire

Source: Lane's Blog » Roguestar

Roguestar 0.2.2 is up correcting various minor issues, and eliminating the runtime dependency on netpipes.


$ cabal update
$ cabal install roguestar-engine
$ cabal install roguestar-gl
$ ~/.cabal/bin/roguestar

There are no new gameplay features, although I expect to have some interesting screenshots up in the next week.

Baby Steps

15/08/2008 Snut Aucun commentaire

Source: The Oblong


No big changes, but:
  • Hex floor generation cleaned up
  • Block-edge normals much less broken
  • Mipmap brokenness caused by discontinuous texture coordinates fixed
  • Shadow res bumped up (shadows are currently a huge rendering bottleneck, hence terrible frame rate)
  • Shadow acne removed with a teeny epsilon
The mipmap fixes have also introduced a LoD bias, but I quite like the way it looks. Textures do repeat too much at this scale though, and there's little to break up the tiling. Will be looking at potential fixes for this soon.

My big low-res chasm-filling geometry seems to have wandered off as well, not sure why. Eh, it'll come back when it's hungry...