Software Sprite Scaling
https://github.com/gurok/ags/compare/software_sprite_scaling (https://github.com/gurok/ags/compare/software_sprite_scaling)
This was a common complaint when I was reading through a thread by Dave Gilbert about releasing commercial games with AGS (http://www.adventuregamestudio.co.uk/forums/index.php?topic=48795.0;nowap). In Direct3D mode, the sprite scaling uses the screen's resolution and not the game's. Nothing breaks immersion like pixels of different sizes. I thought about fixing the Direct3D implementation. The thing is, by the time sprites end up at the Direct3D, we have next to no information about what their "real" size should be. It turns out the code path for software rendering of sprites is still available to Direct3D, it's just not being used. This patch provides a new option in General Settings called:
Force software scaling and flipping
When set to true, it will tell AGS to use software scaling, regardless of whether Direct3D's "superior" hardware accelerated scaling is available.
Well, my D3D driver handled scaling just like that. Are you doing this via software so you can apply non-shader filters afterwards ? I always wondered if it's faster to get a bitmap from the d3d surface and then feed it to the filter and back. Shaders would still be better tho.
- Alan
I actually thought there were complications involved with rendering to 320x200 and then upscaling it. I'm pretty sure I've seen some AGS games that are 320x200 but have high resolution fonts. Don't know how they work, but that was part of my concern. Also, I did it this way because the patch was minimal and it was relatively easy to do so (not so good reasons, I know).
(If we're talking feature requests, by the way, it would be cool to have the option to place sprites and text at non-integer coordinates.I must remind (again) that in AGS everything is interwined and one problem is usually blocked by another. It is of utmost importance to find the blocking issues, plan and resolve them first.
I also urge you (practically beg) not to get every idea in one pile (again), regardless of how cool and wanted it is.That's a good point. How about, instead of placing six ideas in one thread, we open six separate tickets in the Bugs And Suggestions Tracker?
My belief is that the milestones for the next major version should be defined first (considering blocking issues too), and the work continued in a more advanced "develop" branch. As for 3.3.1 version, it should receive only minor updates that do not require changing the code much.I agree that's a good approach.
Is there a convenient link to 2.72 so I can do testing against it in the future?
But pretty pretty please consider fixing the Undo-History :~(
To be honest this is driving me nuts, because at some points I can't remember what I did to break the game. Only that now I can't undo my way out of this mess ;)
You could test your code by doing this:
Have anyone tried to use source control with AGS? There's even a plugin api for that.I can't wait for that to fully mature. I'm very excited.
I can't wait for that to fully mature. I'm very excited.But you can use any version control system right now. For scripts, at least.
Doing what you say with Undo sounds like a wrong thing to me anyway.
OK guys, you win, I'll stop being stubborn and switch to 3.3.0. I'm very attracted to source control and re-importing sprites from original source.I was not forcing you to use 3.3.0 :), in fact the non-working undo is something I would be concerned about as well.
I may take a look at it later and see if I could come up with anything.
Please do it. AGS needs collaborative development.
OK guys, you win, I'll stop being stubborn and switch to 3.3.0. I'm very attracted to source control and re-importing sprites from original source.I was not forcing you to use 3.3.0 :), in fact the non-working undo is something I would be concerned about as well.
Regarding source control, I mean it can be used normally without connection to AGS. You may just make a repository out of the game project folder.
I don't know how source control API works myself.
static function DoIt(this Character *, int a)
{
Display("I did it! %d", a);
}
import static function DoIt(this Character *, int a);
Character.DoIt(3);
static function DoIt(extends Character, int a)
or this (which is the nicest I've thought of so far):function AbsInt(static Maths, int value)
switch(x)
{
case 5:
Display("Five");
case 6:
Display("Six");
default:
Display("Default");
case 7:
Display("Seven");
}
# Switch statement
jmp condition1:
exit:
jmp 0
condition1:
evaluate_expression("x == 5");
jz condition2:
code1:
Display("Five");
jmp code2:
condition2:
evaluate_expression("x == 6");
jz condition3:
code2:
Display("Six");
jmp code3:
condition3:
# No jumps or evals
code3:
Display("Default");
jmp code4:
condition4:
evaluate_expression("x == 7");
jz 0
code4:
Display("Seven");
end_of_statement:
# Break statement
jmp exit:
function AbsInt(static Maths, int value)
{
if(value < 0)
value = 0 - value;
return(value);
}
import function AbsInt(static Maths, int value);
int x = Maths.AbsInt(-3);
Side note: Passing structs as parameters is more complex than I first thought and might take some time.
You might need to make a new type of dynamic object manager in the engine that handles user structs.
Is it possible for me to close issue 503? http://www.adventuregamestudio.co.uk/forums/index.php?issue=503.0I don't think it is correct to close issues in AGS tracker before at least some public release is made. But that's my opinion.
Is it possible for me to close issue 503? http://www.adventuregamestudio.co.uk/forums/index.php?issue=503.0I don't think it is correct to close issues in AGS tracker before at least some public release is made. But that's my opinion.
Only these two functions are missing to make dialogs completely controllable via keyboard which is what I'd like to do:Code: Adventure Game Studio
Dialog.SetActiveTopic(int option) Dialog.StartTopic(int option)
I think "Active" is the one selected (highlighted).
I am not sure about "Topic" word. Other functions use "Option" (compare with Dialog.GetOptionText, Dialog.GetOptionState etc).
Raise a bug tracker suggestion for these.Will do.
struct Point
{
import static Point *Create(int x, int y);
import float DistanceTo(Point *target);
int X;
int Y;
};
static Point *Point::Create(int x, int y)
{
Point instance;
instance.X = x;
instance.Y = y;
return(&instance);
}
float Point::DistanceTo(Point *target)
{
int dx;
int dy;
dx = this.X - target.X;
dy = this.Y - target.Y;
return(Maths.Sqrt(IntToFloat(dx * dx + dy * dy)));
}
float myFunction()
{
Point a;
Point b;
a = *Point.Create(3, 3);
b = *Point.Create(6, 7);
return(a.DistanceTo(&b)); // 5.0
}
This looks like a very bad idea. You are going to return an address to object, allocated on stack. Besides, there's no '&' as "take address" and '*' as "dereference" operators in AGS... and for a reason: AGS was made as a Java/C#-like language, and you are suggesting to "downgrade" it to C-like language.Code: [Select]static Point *Point::Create(int x, int y)
{
Point instance;
<...>
return(&instance);
}
}
This looks like a very bad idea. You are going to return an address to object, allocated on stack. Besides, there's no '&' as "take address" and '*' as "dereference" operators in AGS... and for a reason: AGS was made as a Java/C#-like language, and you are suggesting to "downgrade" it to C-like language.Code: [Select]static Point *Point::Create(int x, int y)
{
Point instance;
<...>
return(&instance);
}
}
managed struct MyStruct
{
import function MyStruct(int a, int b);
}
Properties fail to work for some reason (unresolved import with weird error message).
I suspect that compiler needs to handle special case there.
While testing, I made a pointer to a test struct with two ints and the size of its type was 8. I believe this should be 4. 8 is correct for the size when calling SCMD_NEWUSEROBJECT, but in all the cases I saw, it looked like pointers were always 4.I think you are confusing the size of struct and size of "pointer" (managed handle)?
May you please make separate commits for changes in Engine and Compiler? Because they are, in fact, separate programs.
That patch I made could work as a commit on its own. It will even bear my name on it :=.
(if something will go wrong everyone will know who is responsible :tongue:)While testing, I made a pointer to a test struct with two ints and the size of its type was 8. I believe this should be 4. 8 is correct for the size when calling SCMD_NEWUSEROBJECT, but in all the cases I saw, it looked like pointers were always 4.I think you are confusing the size of struct and size of "pointer" (managed handle)?
I would actually be happy if you made a branch and I sent you patches to fix things.You can make pull requests to separate feature branches too. Or, it is what you actually mean?
monkey_05_06, your example should now compile.
It relates to forward declarations. They don't know the size of themselves. That's fine, but all pointer declarations should have a size of 4.
You should now be able to create an array of your managed struct too.
I haven't implemented constructors, but I'll be adding them after I fully investigate this pointer issue. And possibly clean up some other areas.
I wasn't able to get constructors working in a satisfactory manner without making the code look like Frankenstein's monster.I +1 this. When I was testing monkey_05_06 addition that allows managed arrays in structs, I noticed that there's another piece of code that creates global/local arrays, it looked 98% the same, but was located in separate function.
<...>
Regarding the implementation of constructors, I welcome anyone else to try. To be done properly, I think it will need serious refactoring.
E: The dumb way is to have a list of offsets for all managed handles inside struct. In any case this means that script interpreter must support some kind of "type description".
If AGScript is replaced by a Java-based language, I will stop contributing to AGS development.
Speaking of dumb ways... if you can't solve it, the half solution you proposed on GitHub seems reasonable to me. Disallow non-built-in managed struct pointers inside managed structs. We could then enable them at a later date when we've figured out how to manage them. I know it cripples managed structs, but there's already so much functionality provided by passing in and returning struct pointers. I'd hate to see it shelved. Crippled managed structs also don't do anything bad. They don't box us in for future development.Well, if you think that's proper; you then need to fix the compiler appropriately, and reopen/remake the pull request.
Well, if you think that's proper; you then need to fix the compiler appropriately, and reopen/remake the pull request.
I just read your GitHub note again. I believe I need to restrict them so that they can't include any pointers.BTW, we need to recheck if any of the existing managed structs contains pointers... if some do, then some alternate solution should be invented.
I really don't mean this as discouragement or criticism, but I wonder if all the energy put into hacking the scripting language might not be more usefully spent on other parts of the engine. The fact is that AGS Script isn't that unique, and we might be better off simply adopting a standard one with an existing compiler than having you spend so much effort trying to improve what we have.That strikes me as a very bad idea, as it would throw out backwards compatibility with all existing games and ongoing projects, as well as invalidate most of the skill that our community members have developed with using the scripting language.
There's absolutely no good reason to replace it by some arbitrarily chosen "more popular" scripting language.
Speed and upstream support seem like the most obvious ones to me.I've seen zero evidence that AGS has speed issues. In fact, I've done all kinds of crazy scripting within AGS (including writing first-person maze games and platformers) and based on this experience I'd suggest that AGS's speed is fine.
What Calin said. There's also (depending on the choice of language):The thing you're overlooking is that AGS's scripting language isn't some weird arbitrary custom design. Rather, AGS's language is, for the intent of learning it, pretty much identical to C++, one of the most commonly used languages in the world (granted, there are some C++ constructs that AGS doesn't support, but nothing that would be used by somebody learning how to program). This also means it's very close to C, C#, PHP, and JAVA; meaning that any novice programmer familiar with any of those can pick up AGS almost instantly, and can use tutorials and coding samples for any of these languages. By constrast, LUA is known to substantially less people.
I've seen zero evidence that AGS has speed issues.
The core engine dev team even admit there are speed issues. The compiler has absolutely no optimization at all which is especially noticeable in tight loops.Ah yes, that same core engine team that states above that they'll quit if AGS changes to a different scripting language. Sorry, I don't see how you have much of an argument here; hundreds of game developers and 100000s of game players have no issue with AGS's speed.
Now, wait a minute... monkey_05_06 is not a "core engine team", he is a single person with his own opinion :). Also, I do not recall he ever mentioned slowness of AGS script.The core engine dev team even admit there are speed issues. The compiler has absolutely no optimization at all which is especially noticeable in tight loops.Ah yes, that same core engine team that states above that they'll quit if AGS changes to a different scripting language.
The AGS compiler, AFAIK, has no optimisation and uses no advanced CPU instructions.Unfortunately, that's true. It produces very formal sequence of instructions, mimicing how real x86 processor (IIRC) works: putting values to registers, getting them back, calculating, putting result to register, getting it back once again for other use, etc, etc., and every action is processed separately. I think it does at least about 3-5 things more than needed (http://www.adventuregamestudio.co.uk/forums/index.php?topic=47320.0) per each primitive operation.
Speed and upstream support seem like the most obvious ones to me.I've seen zero evidence that AGS has speed issues. In fact, I've done all kinds of crazy scripting within AGS (including writing first-person maze games and platformers) and based on this experience I'd suggest that AGS's speed is fine.
The thing you're overlooking is that AGS's scripting language isn't some weird arbitrary custom design. Rather, AGS's language is, for the intent of learning it, pretty much identical to C++, one of the most commonly used languages in the world (granted, there are some C++ constructs that AGS doesn't support, but nothing that would be used by somebody learning how to program).
As far as I've seen, AGS ports just fine to Mac, Linux, and Android already, so I'm not sure what else you'd want to port it to.
And I'm not sure why anyone would want to use AGS as a prototyping tool; it's an engine for creating games, not a prototyping tool.
Now I grant that it would be nice to use better debugging tools and be able to import standard libraries, but converting AGS to some other language won't actually accomplish that.
Rather, I'd be curious to see what specific examples of debugging and libraries people would need. I'm willing to bet that simply creating these would be way easier than swapping out AGS's scripting language to something else.
I have benchmarked this and I reckon the Lua plugin, which has an extra layer of abstraction to deal with, is about 5-10 times faster depending on what you're doing (loops mainly).That's really not the point. Just because certain things can theoretically be faster doesn't mean that AGS has speed issues. If you want pure speed, go program in assembly code. The question is whether AGS is fast enough for what it's meant to do (i.e. run adventure games, and possibly other games) and the answer is a resounding "yes".
I'm trying to understand why. The engine already has reference counting and garbage collection for the built-in managed types, including DynamicSprites and dynamic arrays. These pointers can be included as members of user structs, which only exist as one instance, but are still cleaned up by the garbage collector. There are no known issues with pointer members of user structs. So where is the discrepancy when it comes to managed (dynamically allocated) user structs? Shouldn't the reference counts for pointer members still be updated, and the relevant objects freed if their reference counts reach zero? :-The problem is in changing reference counter.
The point is that they don't know at runtime.Yes,... this... basically is what I tried to explain with 20 lines of text :).
The point is that they don't know at runtime.
Essentially what CW is talking about is the beginnings of a form of type reflection which would be great, especially if exposed to scripts somehow :">^_^
Would it not be better to leave winsetup in for legacy purposes and instead, implement an in-engine solution?Because
The advantage of this is that it easily allows users to override the functionality and you don't have to maintain any GUI lib.I am not going to maintain any lib. I want to write a small program that uses existing lib.
I will probably be merging custom display resolutions code into 3.3.1 in a short while, and as an alternative approach I am considering removing "winsetup" from engine code completely and replacing it with stand-alone cross-platform program that will run on all desktop systems (Windows and Linux at least).
linsetup obviously.Mostly known as
https://github.com/gurok/ags/compare/adventuregamestudio:develop-3.3.1...331_runtime_type_information?expand=1This is very nice, I am going to check this out today.
The file format version for scripts was bumped earlier in the 3.3.1 commits, so compatibility-wise the new chunk of info in script files should be fine.Just being curious, why was it bumped? I probably missed this.
I think this is a small amount of double handling. Is there an argument for dumping the symbol table (and ALL flags about objects) into each script and reading it back? I think not because with the structure of the symbol table, this would mean a long scan of all symbols to get info about the pointers inside a struct.
The issues I found:
1. RTTI should not be stored in Script objects, but in a global struct, or inside a global object. By "global" I mean not necessarily literally 'global' in C language, but the one persistent and accessible all the program time.
Why: the managed object must keep the reference to Type, - either a pointer, or numeric Id, - all the time until its deallocation. If it is a pointer - we can't tell if the script we took this reference from will be available when the managed object is destroyed. If it is a numeric id - the managed object class does not have any reference to current (or any) Script (and should not have, because its illogical), therefore it won't know where to take type info from.
Furthermore, the RTTI should probably be written to separate file in game package. It should include all types from all scripts (I guess this is what it does now?).
I suggest to introduce a new file to the game package, for example "script_rtti.dat", which would contain RTTI info from sym table in a simple format, e.g.:
- RTTI file signature ("AGS_SCRIPT_RTTI")
- RTTI format version (1?)
- the data
You would not need to increase game data version, because this is a separate file. Engine should just check whether it exists. If it doesn't, then scripts will work in "backwards-compatibility" mode, not allowing managed user objects, etc.
1b. You must not change how existing script commands and their arguments work, i.e. SCMD_NEWARRAY, because thus you will break compatibility with older scripts.
You may only do the compiler / serialization part. I can take care of the engine part after the compiler will be saving proper data.
2. Maybe we should start using std::vectors for expanding arrays, otherwise we will have to write "expand" function for every new type/array we put into program.
We are moving towards converting all the code to C++ anyway.
3. I have a thought that maybe we should allow to call "new" on any struct, even ones without "managed" keyword, because there's really no difference. What makes it managed is whether it is created on stack/global data or with "new" keyword. I would like to hear what others think about this.
Copying the type information to the managed object when it's constructed would also solve the problem.That would, but that's a clumsy solution. It's like copying virtual table to every instance of a class instead of referencing one via pointer.
No, no, you seem to misunderstand what I mean. The script_rtti.dat will be inside game package, as well as all the other files.Furthermore, the RTTI should probably be written to separate file in game package. It should include all types from all scripts (I guess this is what it does now?).
I suggest to introduce a new file to the game package, for example "script_rtti.dat", which would contain RTTI info from sym table in a simple format, e.g.:
- RTTI file signature ("AGS_SCRIPT_RTTI")
- RTTI format version (1?)
- the data
You would not need to increase game data version, because this is a separate file. Engine should just check whether it exists. If it doesn't, then scripts will work in "backwards-compatibility" mode, not allowing managed user objects, etc.
This feels a bit wrong to me, only because a game author would need to take this into account. e.g. He/she might need an alternate object management system just in case script_rtti.dat is deleted. I would prefer that we incorporate it into the main output file or add a flag when managed user objects are used so that the resultant game won't start without the script_rtti.dat file present.
EDIT: My feeling was that we could pass the ID instead of the size to SCMD_NEWARRAY and SCMD_NEWUSEROBJECT, but use the file format to determine how it behaves (if < 90, treat it as size otherwise treat it as an ID)That's possible, but I was thinking that in the future we won't need to use SCMD_NEWARRAY at all, SCMD_NEWUSEROBJECT could take care of arrays too (with some more info maybe). In such case SCMD_NEWARRAY will be used only for older scripts.
No, no, you seem to misunderstand what I mean. The script_rtti.dat will be inside game package, as well as all the other files.Furthermore, the RTTI should probably be written to separate file in game package. It should include all types from all scripts (I guess this is what it does now?).
I suggest to introduce a new file to the game package, for example "script_rtti.dat", which would contain RTTI info from sym table in a simple format, e.g.:
- RTTI file signature ("AGS_SCRIPT_RTTI")
- RTTI format version (1?)
- the data
You would not need to increase game data version, because this is a separate file. Engine should just check whether it exists. If it doesn't, then scripts will work in "backwards-compatibility" mode, not allowing managed user objects, etc.
This feels a bit wrong to me, only because a game author would need to take this into account. e.g. He/she might need an alternate object management system just in case script_rtti.dat is deleted. I would prefer that we incorporate it into the main output file or add a flag when managed user objects are used so that the resultant game won't start without the script_rtti.dat file present.
Every script is a separate file too, and deleting them would screw the game anyway.
Game author would not need to worry at all, because this file will be added to final package automatically.
"Game data version" only refers to main game data inside the game package (ac2game.dta) - the one that describes the game generally.
The file format version for scripts was bumped earlier in the 3.3.1 commits, so compatibility-wise the new chunk of info in script files should be fine.Just being curious, why was it bumped? I probably missed this.
We can't really do a global table because each room is a separate compilation unit. We could perhaps serialise the script-specific table as we are now, but read it back when producing final output (regardless of whether the room was compiled) in order to create a global table. Seems cumbersome and difficult to do.There's an alternative to keep RTTI in a project folder all the time (same as room CRMs are kept in project), and read it in memory before any compilation.
One thing I'm not clear on. To make my proof of concept work, I substituted a type ID for the "size" parameter in SCMD_NEWUSEROBJECT. This allowed SCMD_NEWUSEROBJECT to correctly identify the type of the object it was creating. How do you propose we pass this information to SCMD_NEWUSEROBJECT when the primary type identifier is a string?What I suggest is to use solution consistent with function binding. Function binding works this way: every script has a list of functions it uses, and to call them it puts their local index in the byte code. Engine uses this local index to look up in the local table and find function name, under which it is registered in global table.
EDIT: Regarding my last question, would you be happy if we:You mean - does not use it for arrays?
- Use the script-specific type ID only when an object is created
@Gurok and others, unfortunately I was pretty busy lately, and will be even more busy in next 5-10 days on my job (we are having deadlines here too :)), so if you post new variant of RTTI feature I may not be responding for some time.
Telling this just in case.
I have a proposal to rename our development branch to 3.4.0 now, because it has bigger features now (improvements to scripts mostly), and probably will have more, while X.X.N+ versions are meant for very minor improvements and fixes. I was supposed to release a new update to 3.3.0 containing restored letterboxed mode and few other hot-fixes, now I am thinking about actually calling it 3.3.1, and using 3.3.2 number if more hotfixes are required.
(I should have probably done this much earlier).
Are there any objections to this? If not I'll just create a new "develop-3.4.0" branch right where "develop-3.3.1" now is, and the latter may be safely deleted a bit later when everyone gets updated.
I have a proposal to rename our development branch to 3.4.0 now, because it has bigger features now (improvements to scripts mostly), and probably will have more, while X.X.N+ versions are meant for very minor improvements and fixes. I was supposed to release a new update to 3.3.0 containing restored letterboxed mode and few other hot-fixes, now I am thinking about actually calling it 3.3.1, and using 3.3.2 number if more hotfixes are required.
(I should have probably done this much earlier).
I don't like these +hotfix version numbers. Why don't you increase the third number for every minor release? It's not like there are not enought numbers, after 3.3.9 there's still 3.3.10 and people don't really care if the changes are minor or very minor. Having a release hotfix-2, then update-1 and then hotfix-3 means the versions cannot be sorted. That makes every Linux package maintainer crazy and also other people won't know if update-1 or hotfix-3 is higher.
And while we're at it... Since you are releasing preview binary releases (alpha,beta,rc..), I think it would be a good idea to give them also proper version numbers. The approach that is most compatible with sortability of versions is to give odd numbers to development versions and even numbers to stable releases, e.g. call the development branch now 3.5 and let that turn into the stable release 3.6. This approach is for example used by Allegro and the Linux kernel.Hmm, we are doing this, just changing the last (fourth) build number before every update (using odd numbers for development branch). Is not that enough?
Look for example at the Allegro homepage: http://alleg.sourceforge.net/
It's all pretty clear isn't it?
I think most users get AGS from the homepage where only stable releases are found or not?I mean, we will have to explain why the previous version was 3.4 and new one suddenly 3.6. Your examples are both low-level developer tools, and AGS is a common user product.
I mean, we will have to explain why the previous version was 3.4 and new one suddenly 3.6. Your examples are both low-level developer tools, and AGS is a common user product.
The way it's worked thus far, the first version number has actually corresponded exactly to major editor revisions (e.g., complete IDE rewrite). The secondary version number is generally increased when there are major changes to the editor or engine (script API changes, major bugfixes, etc.). The tertiary version number is then reserved for more minor changes, minor bugfixes, minor feature fixes, and the like. This all applies directly to the public release version numbers, and I think it works very well.
The fourth version number being used to differentiate between development revisions (using even numbers for stable releases) also serves its purpose.It appears to me that it's not used that properly; in fact I started to use it so after incorrectly understanding BigMC's suggestion when he made it first time (about a year ago).
That being said, it may not be immediately obvious how the versioning works. Is this actually documented explicitly anywhere?This might have been mentioned in few topics, I found an indirect reference here:
After reading your older post about branches http://www.adventuregamestudio.co.uk/forums/index.php?topic=50001.0, I think 'develop' itself should not have a version number at all, you could use 0.0.0.<git-hash> if you need to build it.This is the question of public version, not naming the branch. The branch can be named in any way which is convinient for developers; and if developers make some build for themselves, they can again call it as they please. However here we discuss the version as seen by users; and release version should have clear meaning for them. End-users don't know what "git-hash" is, how will they know this version is the next beta or whatnot?
I am still puzzled by the 'master' branch. Suppose 2.6.4 has been released. It's on the master branch. Next I bring out 3.7, and then find a bug in 2.6.4. Where would 2.6.5 go? It seems to me the 'master' branch is making things complicated if you have several release branches in parallel. Is there anything wrong with just making a branch off develop for every major new version (say 3.4), and update that branch to 3.4.1 etc ?If a bug is found in older version, and the users using it can't rightly update to bigger version (for example, it has some compatibility problems), then there's another branch created, e.g. "2.6.5", branching from last 2.6.4 commit in "master"; the bugs are fixed there, and the 2.6.5 update is released. The changes from 2.6.5 can then be merged to latest master.
(Just puzzling why the 'master' exists, from a release theoretic point of view, if you don't need the extra complexity, by all means keep what works for you.)
I am aware of that.After reading your older post about branches http://www.adventuregamestudio.co.uk/forums/index.php?topic=50001.0, I think 'develop' itself should not have a version number at all, you could use 0.0.0.<git-hash> if you need to build it.This is the question of public version, not naming the branch. The branch can be named in any way which is convinient for developers; and if developers make some build for themselves, they can again call it as they please. However here we discuss the version as seen by users; and release version should have clear meaning for them. End-users don't know what "git-hash" is, how will they know this version is the next beta or whatnot?
Sort of this:Ah yes, you'd forward-port the fix to the newest releases too. That would make sense.Code: Text
2.6.5 3.0.1 3.7.1 *---------*---------------------*-------- / / / ------*---------*---------------------*------------* -> go on with development 2.6.4 3.0 3.7
This is possible, although AFAIK was never used in AGS before, usually all bugs are fixed in the next version (if they still apply).
Since this is now open source project things may change.
Number would be assigned in a release branch.Thing is that we start making "intermediate" WIP releases for public early in development, and we must number them somehow. IMHO choosing next "big" number (i.e. 3.5 after 3.4.* was released) is a logical thing.
Does it matter if it's uncommon for users?Do you honestly believe that given a choice between 3.5.5 and 3.4.2, all users will pick 3.4.2?
All users care about is if the numbers go upwards. We don't make formal releases for dev releases anyway so most users will just use the stable version.
Also, unlike a user application like AGS, people don't generally install kernels themselves, they pick whatever their distribution provides.Well, to be honest, for AGS most people do install the version referenced from main website page. And when we post WIP versions on forum we warn that these are WIP.
These hotfixes need to be advertised better. I didn't know there was a third hotfix until I just happened to need to redownload AGS.Yes, this was my mistake, we will have a version change every time these are made from now on.
I also remember talking to Adeel around the time of the second hotfix, he didn't know there was one.
We both spend a stupid amount of time on these forums.
Ok, let's make current WIP version 3.4.0.0, keep incrementing 4th number as we make intermediate updates. When we will approach release branch, we may consider to change (increase) version, if it would appear that there's a problem with keeping it 3.4.Surely the fourth number could just represent hotfixes? So 3.3.0.3 is 3.3 hotfix 3?
Surely the fourth number could just represent hotfixes? So 3.3.0.3 is 3.3 hotfix 3?Right.
* Building game for multiple platforms;
I think I'm late to the party with the version number thing but I'll give my opinion anyway. I don't think we need a fourth number. <...> When 3.4.0 is released, we can use the third digit for hotfixes. e.g. 3.4.1, 3.4.2, 3.4.3.Alright, we are getting confused again, and I realized I could cause it with my recent post, where I ... well, did something wrong.
You could release 3.3.0 hotfix 4 as "3.3.2". We could mark 3.3.1 as abandoned. That way there's no confusion between it and the old develop-3.3.1 branch. It will just be like we skipped 3.3.1.If we care of confusion, this could cause more confusion by making people wonder why 3.3.2 does not have 3.3.1 features too. :)
* Custom speech rendering (like custom dialog rendering) -- would love it, but it's soooo complicated[/hide]Some design ideas here: http://www.adventuregamestudio.co.uk/forums/index.php?topic=48518.0
I would like to be able to optionally name the default language in the general settings of a project so that it could be listed in the dropdown like:I agree, and I think this won't be complicated if you put the default language name in config file. For winsetup is not taught to read game data.
English (Default)
Regarding limits, CW, can we merge stuff from the "no limits" branch of AGS where it won't break the save file and game file formats?That is what I was planning to do right after I finish with custom resolutions.
The class you need is UITypeEditor
then you need to decorate the property with the Editor attribute
I believe the sprite picker in the property grid is implemented this way.
I'll take a look at this. Shouldn't be hard.The AGS serialization works in such a way that it saves every public property with "setter" into xml, without any other discretion.
I believe that's the way the editor currently acts with regard to LastBuildConfiguration. I'd have to check.
I think it's just a case of moving it from one config file to another.
Hey CW, Game.agf.user is supposed to be used for "Interface to persist user-specific data to/from disk. This data will not be checked into source control". Does LastBuildConfiguration count as user-specific data or do you want a new file (e.g. Game.agf.state)? I am thinking that one non-source controlled file per project is really enough.I honestly don't know, just confused by the "user" suffix. IMO the project state and user settings are different thing, but I am not sure what this file was for. IIRC it was monkey_05_06's idea to create *.user file, maybe consult with him about this.
Quote from: monkey_05_06Edit: BTW Chris, what is this Game.agf.user file that seems to have cropped up?
It's for storing any settings that are specific to you (the user of the AGS Editor) and not game settings.
At the moment it's only used to store source control information, but in future it might also contain which windows you had open when you closed the editor, etc.
The .user file was not, in fact, my idea. 8-) It was implemented by CJ around AGS 3.0.2:Quote from: Pumaman (http://www.adventuregamestudio.co.uk/forums/index.php?topic=34401.msg449765#msg449765)Quote from: monkey_05_06Edit: BTW Chris, what is this Game.agf.user file that seems to have cropped up?
It's for storing any settings that are specific to you (the user of the AGS Editor) and not game settings.
At the moment it's only used to store source control information, but in future it might also contain which windows you had open when you closed the editor, etc.
Based on this, I would say it makes sense to keep this type of info in that file (since it's not really project data).
Mhh so now there are tags called v.3.4.0.0 and v.3.4.0.1 in the development branch. That's super confusing. What will be the version of the next stable release?It will be 3.4.0.something.
Also the tags don't have an "alpha" so they look like stable releases.Okay, I'll add alpha to them.
What's Release_MD in the build configuration list for the editor?It uses /MD compilation flag for Common and Compiler static libraries, which tells them to link runtime C++ library dynamically, as opposed to /MT which links them statically.
Now the tags are:
3.4.0.0-alpha1
3.4.0.1-alpha2
You can get rid of either of the last two numbers. Either
3.4.0.0-alpha
3.4.0.1-alpha
or
3.4.0-alpha1
3.4.0-alpha2
would be fine. Or am I missing something? I like the last variant better.
Ok but I thought we wanted to get rid of the final and hotfix suffices. So no suffix would correspond to a stable release.IIRC the problem I was addressing was that I was naming releases with suffixes only (e.g. 3.3.0-hotfix1, 3.3.0-hotfix2), instead of increasing visible version number.
Is there any specific timeframe as to when the next alpha/beta version is expected? I know there's been some pretty significant changes since 3.4.0.1, so it would be good to have an "official" build for people to test out these new features. ;-DNo, no specific timeframe, I am rather using "weight" of accumulated changes as a reference. And yes, I was going to make a new build, maybe in several hours.
Yes, it's just the folders/files that the make_ags+libraries.sh script produces (copy the data folder, sans any game files). I can do a fresh build this afternoon if needed.Yes, please.
Which errors? Did you follow the instructions?I followed them up to the
# Create the (chroot) environments that will be used for building ags:I do not really understand what this means. Are they the exact commands I should type, or I must also add some custom parameters here?
# cowbuilder-dist wheezy i386 create
# cowbuilder-dist wheezy amd64 create
ikm@ubuntu:~/git/ags$ cowbuilder-dist wheezy i386 create
-> Invoking pbuilder
forking: pbuilder create --logfile /home/ikm/pbuilder/wheezy-i386_result/last_operation.log --othermirror deb http://security.debian.org wheezy/updates main contrib non-free|deb http://ftp.debian.org/debian wheezy-updates main contrib non-free|deb http://ftp.debian.org/debian wheezy-proposed-updates main contrib non-free --debootstrapopts --keyring=/usr/share/keyrings/debian-archive-keyring.gpg --components main contrib non-free --debootstrapopts --arch=i386 --buildplace /home/ikm/pbuilder/wheezy-i386-base.cow --mirror http://ftp.debian.org/debian --architecture i386 --distribution wheezy --no-targz --extrapackages cowdancer
W: /home/ikm/.pbuilderrc does not exist
I: Logging to /home/ikm/pbuilder/wheezy-i386_result/last_operation.log
I: Running in no-targz mode
I: Distribution is wheezy.
I: Building the build environment
I: running debootstrap
/usr/sbin/debootstrap
I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
E: Release signed by unknown key (key id 6FB2A1C265FFB764)
E: debootstrap failed
W: Aborting with an error
pbuilder create failed
forking: rm -rf /home/ikm/pbuilder/wheezy-i386-base.cow
I would love to help with the magic pink transparency bug (which I assume is the cause of this tension), but I have no idea where to start.No, it is not a big problem on its own, I already know how to fix this.
Word "tired" can not describe this, I think "fed up" suits this best.Stop now is the only advice I can give you.
and I have no free time now; while everyone around do that. So I grow even more jealous over time.You're a slave to yourself only.
I know this may look like childish emotionsI think it's brave that you express it here in public. No need to feel embarrassed.
I can hardly help myselfHere you are wrong, you can make a different decision. I bet you hesitated before opening the new post window, typing the message, and pressing Post. Yet you decided to do it.
I remember back in 2009 maybe, I wanted to make some games, but I wasn't able, and I have no free time now; while everyone around do that. So I grow even more jealous over time.Game creators and their games might bring a little happiness to a broader audience. But you engine coders make us game creators extremely happy :) It was like two birthdays stacked on each other, when 3.4.0.3 came out and included these dialog rendering improvements, a feature I've been hoping for since 2011.
And please, don't make polls just because I was depressed other day. It is not how these decisions should be taken.Don't worry, it's not about you, it's about the engine.
...Things like these seem 'trivial' but can have a huge effect on workflow. I often do not have a mouse, but have to use a trackpad or touch screen and so this is a pretty big deal for me, too!
4. Two separate windows to click between for properties and events. Is this really necessary or just a gimmick. (I found I kept wondering where things had gone until I remembered I had to click one pane
or the other.)
$ sdl2-config -h
Usage: /usr/bin/sdl2-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]
$ sdl2-config --libs
-lSDL2 -lpthread
$ sdl2-config --cflags
-I/usr/include/SDL2 -D_REENTRANT
In this case 'sdl2-config' is a script generated while building the sdl2 library. You can ask it for compiler and install settings, so a program needing libsdl2 can be configured with the correct parameters and paths for the system.As for cross-platform, plugin is also a good form of running the engine, I think. DLL won't fly cross-platform, Linux has .so files instead, no idea what android or mac uses. Depending on the meaning of "cross-platform" things may get a bit ugly.By DLL I meant any dynamically linked object, not only Windows DLL. We have plugins made for Linux too, using same code, but ofcourse you need to supply open source code for those who would like to build themselves.