Shining Online

January 20th, 2015 20:50 Development Diary

Project Update – January 20th, 2015

I was hoping to have this entry posted last year, but there were still some bugs and ugly bits I wanted to iron out before writing about what I’ve been up to.

It’s been a busy few months, but progress has been good. The largest task I’ve been working on is the scripting system, and there’s finally enough of it implemented to be able to “play” a short part of the game. There is still a huge amount to do, but I’m pleased with how things are currently working.

Previously I was using a system of triggers, conditions and actions to run scriptable events. This worked well enough for simple things, such as an NPC that says one line of text, but it started to struggle once more complicated actions and cutscenes were required.

In the end I felt the best course of action was to build a scripting language into the game, rather than trying to turn the existing system into something more powerful. It took a few weeks of development, but it’s finally usable. Here’s a comparison between the old and new systems:

Before:

[template_triggers] {
    [*] {
        event*     = EVENT_INSPECT_ENTITY;
        condition* = global_flag_equals('vagabond.has_spoken_to_tensai', 0);
        action*    = display_textbox('[Text goes here]');
    }
}

The above configuration would add a “template_triggers” component to the entity, and assign a single trigger that would listen for the EVENT_INSPECT_ENTITY. When the entity receives the event, it would then check to make sure the “vagabond.has_spoken_to_tensai” flag, and would then display some text if flag wasn’t set.

It’s good for simple things like doorways and one-line NPC’s, but it quickly gets unreadable once more complicated decision trees are needed. You can very quickly end up with a dozen or more repeated conditions. Not good.

After:

(listen :event-inspect-entity
  (when (not (global-flag? "vagabond.has_spoken_to_tensai"))
    (message-box "[Text goes here]")))

I went with a Lisp style syntax, mostly because there is a wealth of information about writing Lisp parsers. The plan is to have a few dozen commands baked into the engine, and then the rest defined in the script engine itself. So far it has worked pretty well, but I expect I might not be so optimistic in a few months.

Probably the hardest problem was pausing the various script processes without blocking the rest of the application. The original script interpreter would run all functions sequentially, which made it easier to implement but impossible to pause a script for external input. In the end I added a stack-based VM and a very (very) simple “process” system, which allows multiple scripts to run in parallel. Processes can pause themselves (and other processes), which makes for some interesting possibilities.

It was a lot of work, and probably not the best way of handling things, but it’s now possible to create some more interesting behaviour purely through scripting.

August 8th, 2014 08:05 Development Diary

Project Update – August 8th, 2014

It’s been a while since my last worklog entry. I’m currently working on improving the scripting system so that it can handle more complex stuff like cutscenes and actual interaction. It’s a bit tough and is taking longer than I’d like, but that’s how these things go. I was originally using a simple trigger/action system, but it didn’t really support some of the more complex things I needed. I have a habit of getting distracted I guess.

I also spent far too long rebuilding the entity system to separate the graphical representation (the actual sprite image) from the logical position (co-ordinates on the map). The main reason was so the server doesn’t need image libraries in order to run. Plus it doesn’t really need to know the actual image details, just the position of the character. I probably wasted a week getting it all switched, but I think it’s better to do it now than later.

Another thing I’ve been working on is getting the various menus up and running:

Shining Online - Demo 5

This is my first effort at the status screen. It’s a little different from the usual Shining Force style, but I think it works. There’s still some changes I’d like to make (such as the health bars), but overall I’m pretty happy with the layout.

January 20th, 2014 01:26 Development Diary

Project Update – January 19th, 2014

Shining Online - Demo 5_003

Nothing too exciting in this update, as most of the work lately has been on getting the scripting system working in a nicer fashion.

  • Treasure chest now stores its state in the game session, which can then be checked during trigger evaluation. In other words, it knows if it has been opened
  • NPC’s can respond to events and display messages (as seen in the screenshot)
  • Cleaned up the rendering system so screens don’t have to access the render service directly. Each screen has its own render group which it can add items to, and these are automatically added and removed from the global queue

Like I said, nothing too exciting, but progress is progress.

December 27th, 2013 18:51 Development Diary

Project Update – December 27th, 2013

The holiday break is always productive for me, and this year was no exception:

  • Added a new trigger-based event system to the overworld
  • Added basic actions for playing sounds, animations and displaying messages
  • Added basic session service, so that entities can store some state information between play sessions
  • Updated the treasure chest script – it now plays sound and animates as it opens
  • Lots of little bits of internal code re-shuffling to try and make things easier to manage

So far I’m quite pleased with how things are going. The whole kernel-based system has really helped, and coupled with the entity system approach I’m finding it easier to add the basic game functionality. It’s still tricky to add some of the more complex stuff, such as shops and cut-scenes, but overall it’s starting to look a little more like a game each time I work on it.

 

October 9th, 2013 02:05 Development Diary

Project Update – October 8th, 2013

I’m afraid it’s another boring update. The last few weeks have brought some good progress, and it’s starting to feel like the seed of a game is in there somewhere. There’s still a very long way to go, but each week brings a little more functionality. Recent changes to the engine include:

  • A new camera system for the town — Previously it automatically centered on the player’s character, but if you’ve played Shining Force II you’ll know the camera has an almost elastic quality to it. It took a while to get everything working the way I wanted it to, but it’s pretty faithful to Shining Force II.
  • An NPC — They don’t move (yet), but I plan to add path-based movement so the game can finally have people walking around.
  • Something interactive — The first level now contains a treasure chest that can be inspected. Nothing happens in the game, but internally it recognizes the action and can keep track of if it’s been opened. It’s all data-driven, too, so nearly all the behaviour comes from the scripting system. There’s a lot more to add to this part of the engine, but the basics are there and seem to work quite well.

That’s it for now. I promise the next update will have something to look at!