1

(0 replies, posted in Latest News)

Hi all,

I just wanted to post a quick announcement to let you all know that Q9 is moving. From today, the Q9 action game will no longer be sold from Blastbay Studios but will instead be available as part of the Leasey package (www.leaseycentral.com). Of course, all existing users can continue to play the game normally; all issued keys remain valid and can be reused if you format your PC or buy a new one.

Kind regards,

Philip Bennefall

2

(1 replies, posted in BGT Bugs)

Good evening,

This looks like an AngelScript bug related to bytecode serialization. I recommend that you send this to the AngelScript developer so that he can have a look at it. Or if you would like me to forward the information to him, I can do that too. Thanks for reporting!

Kind regards,

Philip Bennefall

Hi Oriol,

Yes, this is indeed a problem. The current serialization support in BGT is limited to primitives; it cannot handle objects except for strings. The serialization code needs some serious work before I would consider it feature complete. In the case of dictionaries it is primarily a matter of recursion, and handling of circular references. As a cheap hack, for the time being you could serialize each dictionary on its own into a string and then store these strings, along with any other primitives, in a final dictionary that you actually save.

This stuff has needed fixing for a long time. Unfortunately, I am not able to personally maintain BGT to any great extent because I have a full time job that takes up the absolute majority of my time. However, I will see to it that BGT is maintained by a new developer in order to save the project from code rot. I will be posting a separate topic about this as soon as all the details are finalized.

I am sorry I couldn't be of any more help.

Kind regards,

Philip Bennefall

4

(4 replies, posted in BGT Crappy Code Catastrophy)

@Genroa: You cannot explicitly destroy a class instance, but you can destroy handles. I suggest creating the library object in a local scope, assigning a handle and then keeping that handle alive. Then all you have to do in order to destroy that handle is to say @my_handle=null;

After destroying handles in this fashion, for the purposes of writing your tests, call garbage_collect in order to ensure that all the objects are indeed destroyed when you expect them to be. This should enable you to dig a little further. I have only ever used the FMOD library from C, so have no experience with the higher level parts unfortunately.

Kind regards,

Philip Bennefall

5

(1 replies, posted in BGT Bugs)

Hi there,

I have resolved this issue, and the fix will be available in the next release. Thanks for the report!

Kind regards,

Philip Bennefall

Good afternoon,

I figured I'd step in here with a few general tips. First, regarding code separation - this is actually a good thing most of the time. Making your code modular, which is to say splitting the separate components up so that they can act as independently as possible, makes it much easier for you to extend your game further down the road than if you had everything in one gigantic main function. The player class does not necessarily have to know about what keys perform what actions, the player class just has to have member functions to perform the actions and you can then invoke them as needed from your input handling code. This makes it much easier to, say, add joystick support because all you're doing is calling the same player class methods. The player class doesn't have to be modified at all. This is merely an example; modularization has other benefits as well. This is not to say that you should have hundreds of one-liner functions, though. There's always a balance.

Now, on another note, if I might give you some advice I would suggest that you start with something a little simpler than what you are describing. An RPG with spells, areas, monsters etc is certainly not impossible to make, but since you are just starting out you might find it more satisfying to be able to complete a project from start to finish in a relatively short time (an RPG can easily take several months or more). Something as trivial as bop it or blackjack may not sound all that exciting, but is a great learning experience none the less.

Also, you mentioned music in another thread. If you like the film score themes package that you can preview on the website, feel free to drop me a line and we can work something out. Also, a version of BGT with support for the Elias music engine is now in testing, meaning that people will soon be able to have adaptive music in their titles that changes depending on what happens in the game.

Lastly, if you are looking at getting voice actors down the road I can probably offer some help there as well. Let me know.

Good luck!

Kind regards,

Philip Bennefall

Hi Nick,

Making a submenu is basically the exact same task as making the main one. When someone chooses an option in the main menu you can just send them to a function which pops up another menu, and keep going like that. Regarding music, you would usually have a global sound object called music and you can then let your various menu functions manipulate that.

Kind regards,

Philip Bennefall

8

(4 replies, posted in General Discussion)

Ah, good to know! I was about to rewrite the whole thing since I no longer have the original source code. tongue

Kind regards,

Philip Bennefall

9

(4 replies, posted in General Discussion)

Good evening,

Without yet knowing the specifics, my initial guess would be that it might have to do with dependencies and/or how the symbols are exported. This dll was built years ago with a very old version of MinGw, so we may be seeing some compatibility issue. Are you using GetProcAddress to retrieve the function pointers, or did you generate an import library?

If you could drop me an email with a small test project of yours, that'd be most helpful.

Kind regards,

Philip Bennefall
P.S. From what language are you calling the dll?

10

(2 replies, posted in BGT Bugs)

Good morning,

I tried to reproduce the problem but didn't succeed. I have the following script:

void main()
{
dictionary store;
double value=2.2;
alert("Value", value);
store.set("value", value);
string data=serialize(store);
dictionary@ store_2 = deserialize(data);
double retrieved;
store_2.get("value", retrieved);
alert("Retrieved", retrieved);
}

I get the correct result back from the deserialized dictionary. Could you please provide a test case that reproduces the issue?

Kind regards,

Philip Bennefall

11

(4 replies, posted in BGT Bugs)

Hi there,

Can you create a small test case for this that reproduces the problem in just a few lines? If so, please send it my way and I will forward it to the AngelScript developer. Alternatively you can drop him an email yourself describing what you are trying to do and how it's failing. The address is www.angelcode.com.

Kind regards,

Philip Bennefall

12

(3 replies, posted in BGT General Discussion)

Hello,

One approach which is commonly used in these types of frameworks is to have an error importance level. You specify how pedantic you want the output to be, and the engine filters out errors based on your setting. The only issue is that I have to determine what error belongs on each level, which can actually vary depending on when the error is raised. I'll consider it though.

Kind regards,

Philip Bennefall

Hi André,

Thank you! I have not had a lot of time to devote to game development recently, but the plan is to make two releases before the end of this year. No details yet, as usual. Sorry. Smiles.

Kind regards,

Philip Bennefall

14

(1 replies, posted in BGT General Discussion)

Hi Corey,

I haven't had time to go fix it up yet, but the idea is that you can use the music freely. There are no longer any restrictions related to BGT licensing. I will revisit this at some point and update the license as appropriate.

Kind regards,

Philip Bennefall

15

(4 replies, posted in BGT General Discussion)

Hi guys,

The idea is not to pass a string with all the data around. Instead, when you deserialize you get the dictionary back with all the contents. At this point you can discard the string. Then you pass a handle to that dictionary around to all your objects so that they can initialize appropriately. Since you are passing a handle, no copy operation is performed. Similarly when you serialize, you pass a dictionary handle around. The dictionary is optimized to store hundreds of thousands of entries easily, without lookups being slow. It is a concept known as a hash map.

In short, no need to pass huge strings around - just a dictionary handle.

As for the user data class, that was written by Jordan. I haven't used it myself, though. You'll have to ask him regarding the status of the version on the forum.

Kind regards,

Philip Bennefall
P.S. The reason I currently don't support serializing classes directly is because of handles. If you have a handle in class A pointing to class B, and then a handle in class B pointing back to class A, this is known as a circular reference. Not too hard to resolve in theory, but it becomes a bit annoying to implement and test the system in all possible scenarios. So for now, decoupling the serialization/deserialization into different steps for each object is the best approach.

16

(3 replies, posted in BGT General Discussion)

Hi again,

I would say that the best approach would be to do it in the script for now, and send off an email to the AngelScript developer if you are really interested in having that feature. The place to go is www.angelcode.com.

Kind regards,

Philip Bennefall

17

(2 replies, posted in BGT Bugs)

Hi Corey,

Could you report this to the AngelScript developer along with some code to reproduce it, if at all possible? I'm sure he'll look into it.

Kind regards,

Philip Bennefall

18

(3 replies, posted in BGT General Discussion)

Hi there,

Introducing a function for this is trivial in principle, but there are a few things to consider:

1. What happens if the arrays differ in size?

2. What happens if the datatypes are different, but implicitly assignable to one another?

3. What if there is an explicit cast operator but no implicit one, should the explicit one be used anyway or should this throe an error?

4. What happens if it is an array of handles? Do the handles themselves get swapped or the objects that they refer to?

These considerations make it a little more tricky than one might initially imagine to implement a method like this with consistent behavior. If you think it would be a useful addition, however, I would first suggest that you email the AngelScript developer and ask him about it. The second, and probably easiest solution, is to just do a few overloaded versions for arrays of different types in the BGT script itself.

Kind regards,

Philip Bennefall

19

(0 replies, posted in Latest News)

Hi all,

Over the last few years, BGT has acquired a pretty large user base. In fact, it has become more popular than I could ever have imagined when I first started developing it back in 2009. So in terms of adoption and community, it has been a definite success. However, financially the picture is a little different. I knew when I first envisioned it that it would not sell very much, seeing as how it is targeting a small subset of the blind community which in itself is not that large to begin with. However, over the years it has become apparent just how small the potential market is. I have concluded that I can no longer justify working on it to the extent that I did in the beginning, and on top of that I am involved in a lot of other projects which take up the absolute majority of my time.

For the last few months I have been debating back and forth with myself what the right course of action would be. One option is to simply make it abandonware and forget about it, but I do not like that alternative. Another option would be to continue selling it and releasing updates in the little free time that I am able to dedicate to it, but that seems unfair to the users who have paid for a product that they expect updates and prompt support for. I dismissed that. The final option that I have actually chosen to go for, is to make the product free but not abandon it. I will continue to maintain it, adding new features as time permits and fixing any bugs that spring up as soon as I can. I will keep the forum online, and I will continue to accept sponsorships from those who want to see a new feature in the engine and are willing to pay a little something for it to happen.

Simply put, a fully functional version of the engine can now be downloaded free of charge from www.blastbay.com. Be sure to uninstall any prior version that you may have on your system before installing this new one, as it contains some minor incompatibilities.

I will continue to maintain the product as I mentioned previously, but please understand that any emails you send to me with questions about how to write this or that piece of code will probably go unanswered. The right place to ask such questions is the Blastbay forum. I do visit the forum fairly frequently and will continue to respond to queries whenever I am able, but please do not get upset if you don't hear back from me quickly.

With all this said, I would like to thank everyone who has used and/or supported BGT over the years. It has been a labor of love for me and I hope that you will all find the unlocked features in the new freeware version useful. Continue to make fun games with it and send me a copy of your next blockbuster if you feel thus inclined.

Thank you!

Kind regards,

Philip Bennefall

20

(3 replies, posted in BGT Bugs)

Hi again,

I have now fixed this bug. The fix will be available in the upcoming patch release.

Thanks!

Kind regards,

Philip Bennefall

21

(3 replies, posted in BGT Bugs)

Hi Corey,

I just saw this, and will look into it as soon as I can. Thanks for the detailed bug report!

Kind regards,

Philip Bennefall

22

(2 replies, posted in General Discussion)

Hi Ryan,

The simple and unfortunate answer is that Blastbay Studios is not generating enough of an income to warrent my spending too much time with it. BGT is not selling much at all, nor is Q9. I am involved in other projects that have the potential to make significant amounts of money and so all my time is currently going to those. This is not to say that I am shutting Blastbay down. I still enjoy making games from time to time, but I have to treat it as a hobby rather than a full time business as I did a couple of years ago. I hope this is answer enough, and that my reasons make sense.

Kind regards,

Philip Bennefall

23

(3 replies, posted in BGT Bugs)

Hi there,

Thanks for the report, though without some way of reproducing the problem it is pretty hard for me to actually go ahead with the investigation. Can you dig a bit further, perhaps, and see if you can start from your game's source code and at least trim it down a bit?

Kind regards,

Philip Bennefall

24

(4 replies, posted in BGT Code Up For Grabs)

Hi there,

Actually, you can play back a tone synth composition directly. Use the write_wave_sound method in the tone synth class. This will give you a sound object handle, and you can call play on it. Good to hear you're having fun with the tone synth!

Kind regards,

Philip Bennefall

25

(1 replies, posted in BGT General Discussion)

Hi Omar,

Basically, if you think of a function as a tree with branches on all sides, the return statement makes you jump down from that tree immediately regardless of what branch you're on. You don't leave the tree by climbing down branch by branch as you would if the function executed normally, instead you jump straight to the ground from the point where you choose to return.

In truth, the entire codebase is like a tree. It may be easier to think of each function as a seperate little tree, though, until you have fully grasped the concept of control flow. When I talk about branches I am refering to if statements, loops, etc. A return statement takes you out of the function in question, regardless of how many branches you have followed inside that function. This is the same whether you return an actual value or just void. If your function returns an integer, for instance, you could say:

return 10;

Or:

return some_variable;

If your function returns void you would simply say:

return;

When the function exits due to a return statement, or indeed if it is allowed to run all the way to the end, the control flow will always go back to the exact point at which the function was called. The program will then continue executing from that point onwards. I hope this all makes sense.

Kind regards,

Philip Bennefall