freenode/#shirakumo - IRC Chatlog
Search
13:40:00
Shinmera
My game does not have a separated "editor" and "runtime" phase. The editor is part of the game runtime, and so far all content was made by just starting the game, hitting the "enter editor" button, and then placing things. Hitting "save" then traverses the scene and writes all entities and their propeties to a save file. When loading the same region, it would then reconstruct the scene from that
13:40:07
Shinmera
Things get more complicated now that we're planning for the longer story and all the scripting and shit associated with that. For instance -- imagine you're testing out a section of the game. You realise you have a change to make, so you open the editor and make that change. But now, because you were testing, the player (and NPCS, and other stuff) is at a different place than it was when
13:40:09
Shinmera
originally loaded, so when saving these new positions are going to be saved instead.
13:40:20
Shinmera
I'm trying to figure out a system to prevent that from happening -- meaning ensuring the same "initial state" is preserved even if you make changes in the middle of things.
13:40:53
Shinmera
Trying to think about this especially in terms of the story progression, where things need to spawn in at different places at different points in the story makes my head spin.
13:42:26
Shinmera
Essentially I suppose I need some way to differentiate intended "initial states" of entities from the current states, and a way to select the set the intended initial state as the story progresses.
14:07:48
splittist
In what sense are the intended states 'initial' states? When restarting, do you want the narrative elements to reset to some checkpoint status?
14:09:29
Shinmera
When a region is loaded in, the engine needs to know whath things to spawn and what state they should have.
14:10:01
Shinmera
But for some entities, like the player, and especially NPCs and enemies, it changes depending on where you are during the story.
14:10:15
Shinmera
So for instance if you load into the hub world during chapter 2, there should be a merchant there.
14:11:35
Shinmera
Or if you start the quest "fix the pipes", one of the npcs should accompany you, and be there with you when you switch over to the caves region.
14:11:44
splittist
So you already have a concept of a 'chapter'. Is the game so complex/large you need more granular measures of narrative state?
14:12:56
Shinmera
I have the concept of a 'quest', which has several 'tasks' to complete, which each have several 'interactions' that contribute towards the tasks' completion. When an interaction,task, or quest is started or completed, arbitrary code can be executed.
14:15:23
Shinmera
Though I'm beginning to wonder whether doing away with them would actually simplify things.
14:16:29
splittist
Does that code get associated with a narrative state object? So you can load in the world and run through the state - (shot-greedo t) (has-excalibur t) (discovered-friday nil) ... Hmmm.
14:18:05
Shinmera
'ephemeral' entities save their state when you create a save file, and simply restore it on load. Non-ephemeral entities are saved wholly and created anew.
14:18:23
Shinmera
Meaning 'ephemeral' entities are never deleted, so they're essential NPCs and other world objects.
14:19:24
Shinmera
Quest progress is saved when you create a save state, but it's not saved into the 'world file' that the editor saves.
14:23:08
splittist
So there are separate 'editing' systems for NPC behaviour and, say, scenery? And if you edit the scenery to add a hill, the 'npc editor' (narrative process editor) thinks the npc is at a point inside the hill? Crudely speaking
14:25:22
Shinmera
So far there's only been the concept of 'interactions'. The game starts and it reads from a save state which quests and tasks should be active. These then install 'interactions' on certain named entities. Which interactions are installed and what they are is written in source files at the moment.
14:26:11
Shinmera
Separate from this is a 'region file' which is a list of entities and their initargs. When the game starts it reads this list and instantiates stuff. Then it reads a save-state and updates the state accordingly.
14:26:34
Shinmera
In the in-game editor, when you hit save, it writes this region file based on the currently existing entities and their state (it writes only ephemeral entities).
14:30:07
Shinmera
So if you start the game, move the player around some, hit save, and restart, the player is now going to spawn where it was when you hit save.
14:34:04
splittist
Ah! What if you had a kind of save that just skipped the entities that were going to be spawned (because they're in the file/thing you haven't saved over yet)?
14:40:38
Shinmera
One idea would be to, when you open the editor, create a save state, reload to initial state, and on editor close reload the save state.
14:41:29
Shinmera
We still need a way to script events in the story to make entities appear at certain points and perform certain actions depending on where you are.
14:43:13
Shinmera
If we forget about different regions and only assume there's one "initial load" things become a bit more simple.
14:43:39
Shinmera
Then restoring state is just a matter of reactivating the quests and tasks and completing them in the right order.
14:44:30
Shinmera
and I suppose since a save state would always contain the full entity state anyway we don't even need to perform any of the quest code changes, just mark whether it's done or not.
14:45:15
Shinmera
The only problem is scripting things to take on certain state and positions, for which I suppose we could introduce named 'spawning points' and in the script just say 'move to spawning point x'
14:50:38
Shinmera
I'm... gonna go and write one of my patented crazy note sheets to try and figure this mess out.
14:55:31
Colleen
www.youtube.com/watch?v=yxw... Website (HTML), Title: Guy explaining (Meme template) - YouTube
15:19:53
Shinmera
First, I need a way to place 'markers' in the world that can be used to spawn or move things in story scripts. That way you have an easy and forward-compatible way of placing stuff even if things move during dev.
15:20:04
Shinmera
Second, the story integration is no problem at all -- the save state system takes care of persisting any changes the story might have made. All it needs to do on load is restore the state of the entities.
15:20:35
Shinmera
Third, in order to control what you're saving as the "beginning of the game state", I think I'll have a dedicated save state file. Meaning, what you save in the editor doesn't really matter for any properties that can actually change during gameplay and are thus put into the save state. To do this there could be separate buttons in the editor UI where you first load initial state before you
15:22:00
Shinmera
Fourth, any ephemeral entities /have/ to be present at all times regardless of region, so that their state can be changed from scripts and so forth. This is messy if there's multiple regions, so I think it would be best to instead try and optimise the game so we don't have to do load zones.
15:24:31
Shinmera
The optimisation is most definitely going to require a very fast spatial query structure, so that's gonna be "fun
15:27:47
Shinmera
I feel like I could get away best with a BVH. The chunks Kandria already have would serve well for that. Might just need to subdivide them and create bigger volumes for collections of chunks.
15:28:30
Shinmera
On the other hand, a quadtree can make far faster tests since the grid can be regular....
15:28:50
Shinmera
as in, you just do some integer arithmetic and a lookup, rather having to iterate and test.