jack: (Default)
[personal profile] jack
The premise

I have a tile-based computer adventure game. The current state is represented in memory as a 2d array of tiles representing the play area, each with one (or possibly more) objects on that tile. There is also an "undo" history, tracking recent actions, and the difference (objects moved, removed or added) so the previous or following state can be recreated.

In addition, each object remembers the most recent undo step which affected it, so you can click "undo" on an object and return it to the previous state (also undoing any following actions), not just undo one at a time until you rewind to the appropriate point.

I need to check the code, but as I remember, this is represented by each object having a pointer (well, the python equivalent) to one of the elements of the undo sequence. And when you redo or undo the pointers are updated to refer to the newly-correct object.

Now I'm unsure, but IIRC the undo steps refer to an object by coordinates in the play area, not a pointer to the object (in general, we assume the play area might store game objects as just ids or something, not as ab object in memory).

What happens when we want to save the game

We need to be able to save the game -- indeed, a modern game (especially one where actions aren't irreversible) should just save as it goes along, not require a separate load/save action to do so.

This means my instinctive layout above doesn't work. You can't save "a pointer". The best option is probably to use an index into the undo list which the undo list understands.

That can also cut out other possible bugs. If you have a pointer, it could be anywhere in memory. If you have an index into the undo list, you can choose to have the list check that the dereference is valid (and retain the option to turn those checks off if performance matters).

There's other possibilities but I think that's the best one. It is uncomfortably close to designing our own ORM -- we could alternatively have ALL objects represented by a unique id and index things by that instead (either via some global list of ids or only when we load from disk).

I run into this often when I'm game programming, the best way of 'referring' somehow to another game object -- by value or reference? by game coordinates or pointer to memory? But not in other types of programming. Does this experience ring a bell to anyone else?

But now I'm thinking...

This also reminds me of a problem I ran into when I started thinking about rust's memory models. If you have a class, that creates a bunch of other classes, and those classes want to have pointers to each other, there's no easy way of doing it iirc.

I think you need to rely on reference-counted pointers even though it feels like you shouldn't. That's not a problem in practice -- the "store an index" method above also has an indirection every time you need to access the object. But it feels like, you shouldn't need to. And a similar sort of "I want to refer to one of the classes which this big class is responsible for".

But I'm not sure if there's a way of combining these thoughts.

Date: 2018-05-11 07:21 pm (UTC)
green_knight: (Konfuzius)
From: [personal profile] green_knight
(I'm currently working on a game engine, so these thoughts are super-relevant to me; I haven't reached the point where this is actually a thing I'm implementing, but I've thought about it. Had to go away and wrestle other things for a bit.)

One part of my solution to this problem is that I'm dividing the story into zones - and if you cannot get back from B to A, you'll need all of the Quests/QuestObjects before you can proceed.

In your case, I'm not sure that 'undo' is the right metaphor.

I'm also not happy with the game not offering manual saves, because sometimes I want to unroll to a certain save point. And if your game does not offer me an interface, I'm likely to find the location of the save file in the library and back it up manually and curse a lot. (Looking at you, Shadows of Mordor.)

But the other point is that you seem to know exactly where your game-breaking objects are located, so you could just take the character back to that place and let them search again, applying any other gains to their current status, and then continue the game from where they were - a 'revisit' rather than 'undo'.

But mainly, I wish people would stop putting breaking actions into their games, because playing 40h to find that you've made a mistake right at the start is a dealbreaker for me: not only will I despair, run around aimlessly and look under every rock, eventually google, and find the 'gotcha' the designers put in, I will put down the game, walk away, and tell everybody what a rotten piece of shyte that game is.

Basically, designers *literally* create the world, so when they print all the cards and then mock you that your hand sucks, I do not enjoy myself. If there's something I need to find, give me a clue. (I'm currently and for the foreseeable future playing ESO: Tamriel, and those markers are ridiculously obvious, and there's still a lot of gameplay and sneaking around trying in to find things.) I'd love to see more games where hints increase gradually: you can find it yourself, you get subtle and not-so-subtle hints, and if you made it through to room 893, there's a pedlar outside flogging hacksaws for exorbitant prices.

After a certain level of searching, I am no longer playing, I am googling solutions, and the more tedious you make it, the less I enjoy myself.

So... I'm not sure that the rewind would work for me. 'I will make you play this until you get it right' doesn't feel like gameplay to me.

At the same time I get the 'wanting to give players options' because that's one aspect of puzzle-type games that annoys me: you cannot improvise and use the items in your inventory in an innovative manner, you have to second-guess the designers. Which I find tedious.

Date: 2018-05-14 03:40 pm (UTC)
green_knight: (Default)
From: [personal profile] green_knight
The app is called WorldWalker and right now, you can create scenes, connect them, and move from one scene to the next.

Once upon a time (1984, IIRC), there was a Mac app called 'WorldBuilder'. It had two windows - an 2bit image where you could click on things, and a text window where you could type N/E/S/W and play twenty questions with the dictionary. You could equip two weapons and decide which one to swing when you - inevitably - encountered monsters, and have a really good time.

With the advent of PowerPCs, WorldBuilder no longer ran. At that point I'd used it for seven years, created dozens of apps with it, including exam preparation, and mourned its demise.

And ever since, I kept thinking 'I wish there was a tool like that'. Eventually, I realised I'd have to write it myself.

I'm keeping the image-and-text concept, I will let users choose from a menu of responses instead of making them guess keywords, but otherwise, I'm aiming for that kind of experience: scene-based, and story-driven.

Here's some concept art from the early days:

Watergate 2

Almost any problem you have as a designer, I have squared: I not only need to think about what I want, but how it can be abused. And while I cannot stop anyone from being a dick to their players, I am working very hard at making good gameplay the default option, the easy path.

Ideally, I want this to replace WorldBuilder as a tool: a way for people without a lot of programming experience to make fun games; a way to think your way through a complex idea and go 'how would this flow' even if in the end you'll choose a different engine.