2012-08-11 22:16:16 (edited by Ian Reed 2013-03-10 22:00:24)

Hi everyone,

It's been ages since I've released a new version of the adventure game engine.

For quite some time Nina0116 has been working on the ShadowGate adventure which is a port from ShadowGate for the original Nintendo.

I'm happy to announce that Nina0116 has completed the adventure and now you can try it for yourselves.

The ShadowGate adventure is really the highlight of the whole release but I'll include a changelog so you know about the other engine updates.

I want to give a big thanks to Nina0116 as the engine has been a bit of a pain to work with and Nina's feedback and willingness to trudge forward despite the engine's problems have really served to improve the engine.
I'd also like to thank Allan Thompson for his very thorough job of testing the engine and ShadowGate adventure.
Even now he has found a few minor bugs that I'm sure Nina0116 will fix soon, but we wanted to release the game as the game is completely playable and a really fun experience.

The game can be downloaded from http://BlindAudioGames.com

Here are the changes for AGE 1.04:
1 When calling the music() function the filename is now case insensitive.
2 A getItem() function is now exposed which works just like getInventoryItem() but for items in the current location.
3 A createLocationItem() function now exists.
4 A destroyLocationItem() function now exists.
5 An onArrive event now exists for locations and should be used instead of onEnter.
6 Saving and loading is now supported
7 Javascript errors now report line and column numbers
8 You can now include menus in your adventure folder.
9 Made it so a location description is announced the first time you enter that location.
10 Updated loading of your game to reparse the adventure scripts rather than loading them from the saved game.  This allows saved games to benefit from bug fixes in script updates and makes debugging considerably better for scripters.
11 Added a goToActionList() function.
12 I've re-written the user guide.
13 Added some visuals for menus so low vision users can take advantage of them.

I hope you all enjoy Nina's hard work.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-12 00:19:23

I like the engine so far. is three a way to see a list of all the functions available when scripting?

Deep in the human unconscious is a pervasive need for a logical universe that makes sense. But the real universe is always one step beyond logic.

2012-08-12 02:53:35

Sounds great.
Gonna get it now!

“Can we be casual in the work of God — casual when the house is on fire, and people are in danger of being burned?” — Duncan Campbell
“There are four things that we ought to do with the Word of God – admit it as the Word of God, commit it to our hearts and minds, submit to it, and transmit it to the world.” — William Wilberforce

Thumbs up

2012-08-12 09:21:46 (edited by stefan_ilioaica 2012-08-12 09:56:19)

Hi!
the enging is fantastic!
But I have a question: I'm playing the game called the mysteries of  pyramids, and I'm in the goard room. I took the objects from the table, and the watch, and now I don't know what to do.
can anyone help me?

Thumbs up

2012-08-12 13:57:52

Hi,

Hmmmm, I'm confused.
I can't get the concepts of the enginges working principles, even after reading the user guide.
The thing which mostly confuses me, that all scripts are in *.txt format. How they're interpreted? When I hear about a game engine, then I'm expecting something with it's own scripting language and file format like Bgt or Dragonflame. Here, a interpreter sems to be completely missing.

Check me out on soundcloud:
http://soundcloud.com/gamefighter

Thumbs up

2012-08-12 18:33:06

@stewie, Here is the list of javascript functions you may find useful:
say("Hello");
music("Anasazi.mp3");
stopMusic();
loadAdventure("Pyramids"); // where pyramids is the name of the folder the adventure is in
context("outside the pyramid"); // context takes you to a location or menu with the name specified.
createItem("rope"); // creates an item from the objects folder in the current location.
destroyItem("rope"); // destroys an item in the current location.
createInventoryItem("rope"); // creates an item in your inventory.
destroyInventoryItem("rope"); // destroys an item in your inventory
getInventoryItem("rope"); // returns an inventory object or null, you can check if this is null to determine if you have the specified item or not.  See using the rope and bucket on the well in the ChilingHam sample.
addLocation("the guard room"); // adds a location you can visit from the current location.  See the use_door function in Door.txt of the pyramids game.
switchToActionMenu();  // returns you to the main action menu with options like inspect, take, use, talk, select, go.
reloadActionHandler(); // reloads the current action menu, this is useful if you are doing an action on an item and it destroys that item, you then want to reload the action menu so the item does not show up anymore.

And some sound functions that I will explain in more detail.
The first parameter is obviously the name of the sound file.  The second parameter is a json object with certain property specifying options you want.
Options have reasonable defaults if you do not set them.
sound("Footsteps outside pyramid.mp3", { end : 4, synchronous : true });
The above function ends the playing of the footsteps sound after 4 seconds, it does this because the sound actually plays for a much longer time if you play the whole thing.
synchronous means that the sound will play and the script will wait for it to play before continueing.
In this scenario we wanted to play footsteps and wait before more text was spoken.
If you wanted the footsteps to play at the same time as more text was spoken you would set synchonous to false or just leave it off all together as false is the default for that option.

sound("wind2.mp3", { repeat : true, restart : false });
repeat makes it so the sound will play in a loop and never stop.
restart makes it so if the sound is already playing and you come across script that would play it again it will not restart the sound and just leave it playing the way it was.

The following is used to stop the wind sound.
stopSound("wind2.mp3");
Or you can stop all sounds currently playing.
stopAllSounds();

I have also updated the online user guide with these javascript functions now.  The in game one will not be udpated until the next release though.

@stefan_ilioaica, I think you got about as far as the story was written.  Sorry it was so short.  That's why I've released it mainly as a game engine for people to build their own since the included sample games are not near completion.

@gamefighter, I have not used BGT or DragonFlame.
This engine does have an interpreter, it is a javascript interpreter.  I chose not to name files with a .js extension.
If you look inside of "Outside the pyramid.txt" or may of the other files you will see that the location and object files have a basic text format for specifying very common things like what actions do on this object or what locations you can visit from this one.
But then many of them also have javascript embedded within them.
There are 2 ways to embed javascript.
1 at the end of the file put an @ sign on it's own line, anything after this line will be interpreted as javascript.  I use this mainly for defining long javascript functions that I can call from option 2.
2 On some lines such as actions you can put an @ sign after the | to indicate you want javascript to run there instead of having the text spoken.
For instance below I clarify how to change text to speech text for inspecting the well to be a voice acted sound file using javascript.
The functions available to javascript are the ones built into javascript by default plus the ones I specified above to stewie.
Hope that helps.

@Everyone,  Sorry if the engine seems difficult to use at first.  Not having much time recently I just wanted to get it released and so was not able to spend as much time on explanations in the user guide as I would have liked.

I'm glad to see the interest people are already taking.

Someone in an email asked about adding in voice acting and other sounds.  Here is a quick explanation of how to do that:
To play sounds you have to script in javascript.
Let's say you wanted to do voice acting for what is said when someone inspects the well in the ChillingHam sample.
First save your voice acting as well_inspect.mp3 in the Sounds folder.
Then open Well.txt and find the line that looks like:
inspect | It's a really deep old well.
Change it to:
inspect |@ sound("well_inspect.mp3");
Now load the game and when you inspect the well your voice acting should play instead of the text to speech.

When you want to save variables I recommend saving them to the global object like this:
global.introDone = true;

Also for anyone getting errors while scripting you can see the errors in Data\ScriptError.txt.

Hopefully this post clears up a lot of questions.  The first release is always the hardest one to work with so I'm sure things will get better as you give feedback and I release future versions.

Cheers!

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-12 20:06:46

I got it and confirmed my email.
So why is it asking me to confirm it again?

“Can we be casual in the work of God — casual when the house is on fire, and people are in danger of being burned?” — Duncan Campbell
“There are four things that we ought to do with the Word of God – admit it as the Word of God, commit it to our hearts and minds, submit to it, and transmit it to the world.” — William Wilberforce

Thumbs up

2012-08-12 20:11:15

You know, if you expand this a bit, it could be a very useful tool for creating audio games in java, not just adventures.

Thumbs up

2012-08-12 20:33:45

@arqmeister,  I've definitely thought about that idea.  It's actually javascript that it uses which is very different from Java.

Though I have never used BGT or DragonFlame it seems the general audio game engine arena is already well covered.

Have you used those 2 development platforms?  Is there something they are lacking?

Another thought I had is that making engines for specific types of audio games could be helpful as they may require less in depth coding knowledge from game creators.

For example creating levels for Tactical Battle is a lot less complex than writing Tactical Battle from scratch, even with an engine like BGT or DragonFlame.
And creating levels for Swamp must be 100 times easier than coding that game.

@blindncool, strange, you should not have to validate your eamil again on the same machine.
Email me at [email protected] and tell me exactly what you are experiencing and I'll see if I can figure it out.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-12 22:17:44

That is exactly where i'm comeing from. I think the tools available right now pretty much demand that you stop thinking like a gamer and think like a programmer. Not to say this is a bad thing however, i think i'm more of a gamer, even though i have basic programming skills in both BGT, and dragon flame. I think with a tool that required much less programming knoledge, you could design a game by map size, sound effects you want to use, number of enemys, amound of hp they and the main character have, that kind of thing. Making such a tool would be work for sure, but to those people who don't have the "mind of a programmer" it could be very useful in my view. Programming logic is something i have been struggling with for quite a while. If a seasoned programmer was willing to take the time and design an ingen that would do the logic work for the gamer, actually designing a game would be accessible for all of us, including the less program savvy.

Thumbs up

2012-08-12 22:52:45

@arqmeister, I definitely hear where you're coming from.

There are pros and cons to both sides of course.  The general game engines give you complete flexibility with what type of game you want to make and what you can do in that game.
Whereas the specific game engines or games with level editors specifically restrict what you can do to that specific game type.

As an example in Tactical Battle, Austen created 22 maps for the game.  I created 5.  He definitely had a lot of creative ideas and things he wanted to make happen.  With the level editing in Tactical Battle he was able to get those levels working much quicker than if he started from scratch but sometimes there were things he wanted to do that the game engine didn't support and so he had to wait on me for those or find funny ways of getting them to work in the Tactical Battle game.

I think there is definitely space for more specific game engines and I hope to keep creating engines like that.

This adventure game engine is another example of where it quickly gets you up and running with (what I consider) easy to edit objects and locations and at least a smaller amount of scripting though it still definitely requires some scripting.
But the downside is that it only makes sense if you are making an adventure game that works like the ChillingHam or Grizzly Gulch games.

I'm considering working on a Aerik the Cleric or Zelda type engine when I get some time.

If you haven't tried editing levels in Tactical Battle you should give it a shot and let me know what you think about it.
Some people still think it's too hard and wish I had an in game map editor, which would definitely be nice, but is a lot more work than text files and doesn't lend itself well when people actually do need to do a little scripting.

Cheers.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-13 00:13:31

I've tried to start on an RPG maker and a mugen-type fighter maker, but both are seriously taxing on the patience.
I like what you've done here, and certainly something more expansive would be quite nice!

Some of my games
Keep up to date by following @Jeqofire on twitter!
Ear Ninja?

Thumbs up

2012-08-13 02:10:13

Hi.
i try to run the game, i get to the main menu and it crashes.the music plays for a bit about hmm free seconds then crashes the program.
could someone help?

If you like harry potter fan fiction, click on this link to download a zipped folder containing 9 point something gigs of harry potter fan fiction when unzipped. It's around 3 gigs zipped. https://tinyurl.com/y9dl9zev

Thumbs up

2012-08-13 03:39:36

hi ian, i have ran into a problem/. I am trying to make it so that when the watch on ground is picked up, it becomes a new item. However, the game, crafty as it is, has other ideas; it would rather show errors. Here is the code and the offending error. This doesn't get the chance to hit the script error.txt file either.
object
1
takeable
inspect | @inspect_watch();
take | @take_watch();
inv use | @use_watch();
@
function inspect_watch() {
say("It's a custom made watch with a single button and a number on it. You press the button to reset the watch and the number shifts to 0.")
say("The number is the amount of time that passed since you pressed the button.")
say ("take it now.")
}
function take_watch() {
say("You take the watch.")
createInventoryItem("watch")
destroyItem("watch on ground")
reloadActionHandler()
destroyInventoryItem("watch on ground")
reloadActionHandler()
}
function use_watch() {
say("The number says 1.")
}

---------------------------

---------------------------
An error has occurred.  Please notify the game creator of this error.  You can copy the entire error to your clipboard by pressing control + C.  Then you can paste it into an email by pressing control + V and send the email to [email protected]
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.

Parameter name: index

   at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)

   at System.ThrowHelper.ThrowArgumentOutOfRangeException()

   at System.Collections.Generic.List`1.RemoveAt(Int32 index)

   at TacticalRPG.AGActionHandler.HandleObjectAction(String s)

   at TacticalRPG.AGActionHandler.Process(World ent)

   at TacticalRPG.StateMachine`1.Process()

   at TacticalRPG.Form1.RunGameLoop(Boolean keyPressed)

   at TacticalRPG.Form1.Form1_KeyDown(Object sender, KeyEventArgs e)

   at System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)

   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)

   at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)

   at System.Windows.Forms.Control.WmKeyChar(Message& m)

   at System.Windows.Forms.Control.WndProc(Message& m)

   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)

   at System.Windows.Forms.ContainerControl.WndProc(Message& m)

   at System.Windows.Forms.Form.WndProc(Message& m)

   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
---------------------------
OK   
---------------------------

I like to sleep, Sleep is good,
This is how I do it: Lie on a nice warm cozy bed, and dream dreams about how to rule the world!
Follow @TheGreatAthlon5 on twitter for humorous facts and game updates!
If you like my posts, thumb me up!

2012-08-13 04:17:30

@CAE_Jones, thanks for the kind words.  I'm not familiar with mugen-type fighter games.  Ah, but wikipedia enlightens me.
Was your RPG maker intended for blind audiences?
I'm interested to hear what kind of map or dungeon crawling you planned on.

@Brad, strange, has it ever worked?  You could try deleting the environment.dat file and running it again.  You did unzip the game, not running it from inside a zip folder or a shared folder right?

@keyisfull, I just spent some time duplicating the issue you found.
I will see what I can do to make it not cause problems in the engine in the future.
The quick fix is to comment out the takeable flag near the top of the file.
The takeable flag is used to have the engine automatically remove the item from the ground and place it in your inventory when you use the take action on it.
This is to make it so people don't have to do destroyItem("watch"); and createInventoryItem("watch"); every time they just want an item that can be picked up.
In your case though as the item on the ground has a different name than the one you are putting in your inventory doing it manually may make more sense.
But having the takeable flag on it at the same time makes the engine try to take it after your function runs and this is what causes the crash.

So to recap, the quick fix is to remove the takeable flag.
My recommendation though would be to have one item called watch rather than 2 items, and then just set the takeable flag on it and the engine will handle putting it in your inventory.

Hope this all makes sense.  Thanks for reporting the issue.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-13 06:23:34

Hi.
were is the inviroment.dat file?
i can't find it.

If you like harry potter fan fiction, click on this link to download a zipped folder containing 9 point something gigs of harry potter fan fiction when unzipped. It's around 3 gigs zipped. https://tinyurl.com/y9dl9zev

Thumbs up

2012-08-13 18:02:43

It is in the same folder as AGE.exe and is called environment.dat.  Do you get the same problem with Tactical Battle?  Or just the adventure game engine?

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-13 18:20:33

The idea behind my RPG maker was to be like an accessible version of the Ascii/RTP RPG makers, that is, mostly Final Fantasy-style. But it effectively requires making an entire scripting language, and then an editor for it...

Some of my games
Keep up to date by following @Jeqofire on twitter!
Ear Ninja?

Thumbs up

2012-08-14 06:25:38

I have just founde this engine today and ma looking forward to checking it out.  I like the idea of an engine designed to help people create their own adventure games.  I have been looking for a way to create a game based on the videogame "rpg maker", but am having trouble getting started on it.

the light of jesus lights the world, even we who are blind will be able to see him when he returns.

Thumbs up

2012-08-14 18:28:22

Hi.
Its not in the same folder as the engin.
Its no where. Hmm Tactical Battle has no problems.
but I rejistered my email with Tactical Battle. do I nead to do the same thing with the other program?

If you like harry potter fan fiction, click on this link to download a zipped folder containing 9 point something gigs of harry potter fan fiction when unzipped. It's around 3 gigs zipped. https://tinyurl.com/y9dl9zev

Thumbs up

2012-08-14 19:24:02

@Brad

You do not have to confirm your email with both games.  Confirming for one confirms for both.

Are you running on a 32 bit version of windows or 64 bit?

In the AGE folder there are 2 folders, one called x86 and one called x64.

If you are running 32 bit copy the contents of the x86 folder into your main AGE folder (the one with AGE.exe in it).
If 64 bit, copy the contents of x64 there.

The game is supposed to do this automatically but may be having some problems on your machine.

Also, when the game crashes does it just stop running?  If so, this was related to these folders in the past.

Or does it pop up an alert box?  If an alert appears it will have a helpful error but the game will not read it.

You will have to use a screen reader or vision to read the alert.

Hope this helps.  Sorry it's crashing for you.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-15 04:18:04

Ianr I have a question.  I see from the functions you posted here, and in the online users guide it is possible to add a new location exit to the current location. My question is: is it possible to remove a location in the same way.  After all if one can open a door, one can also close it.  I must admit I have not looked at the pyramid example yet, so if it is shown there I'm going to feel rather down.

the light of jesus lights the world, even we who are blind will be able to see him when he returns.

Thumbs up

2012-08-15 04:48:45

@nina0116, That's a very good observation.  As it would happen I just implemented methods as I needed them and in my tinkerings I never needed to remove a location.  But as you say it does make sense.

I'll put it in the next release.  Thanks for pointing it out.

~ Ian Reed
Visit BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.

2012-08-15 05:32:27

No problem, The only reason I thought of it my self is that I am designing a game that will require this ability.  Thanks, and keep up the good work.

the light of jesus lights the world, even we who are blind will be able to see him when he returns.

Thumbs up

2012-08-15 11:42:49

In the current adventure I am making I have a time variable that gets updated when you do certain things. It would be cool if when time gets updated, the game could do a certain event like speak a status mesage or play a sound regardless of your location. If you don't understand i can attach what I have to an email or something, ian.

I like to sleep, Sleep is good,
This is how I do it: Lie on a nice warm cozy bed, and dream dreams about how to rule the world!
Follow @TheGreatAthlon5 on twitter for humorous facts and game updates!
If you like my posts, thumb me up!