Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Crimson Wizard

#21
Quote from: Radiant on Tue 07/11/2023 21:28:40I note that when running the game with F5 from the editor, games by default run in multitasking mode = true (when running from the Windows desktop gives multitasking = false). Is that intentional?

Yes, this has been always like that, at least in 3.*.
#22
Quote from: SinGala on Tue 07/11/2023 14:55:38
Quote from: Crimson Wizard on Tue 07/11/2023 14:43:22what if you set this sound to another audio type (not ambient)?

I actually didn't thought of trying this out, but playing Sounds or Musics does seem to work better.

Hmm, could you tell, what is the "Bundling type" setting for all these audio types? It may be "in main data" or "in audio vox", and i wonder if that makes any difference.

Also, please clarify what is "player sound", are your speech lines played with voice, or do you mean something else?
#23
Quote from: SinGala on Tue 07/11/2023 14:19:40Sound wise I am afraid I cannot share the exact file doing the issue, but if it can help, the issue is happening for every .ogg file set as an ambiant sound, so it is not related to just one.

This may be a silly thing to ask, but what if you set this sound to another audio type (not ambient)?
Just to make certain that this depends only on a file, and not on some audio settings or logic in AGS.
#24
No, that's not an expected behavior at all.

Quote from: eri0o on Tue 07/11/2023 12:45:46But technically it shouldn't be possible as it's always run in a separate thread and not synchronously.

It is played on a separate thread, but there are synchronization points between game thread and audio, and if audio thread is hanging, the game may theoretically also freeze at these points. This immediate issue possibly could be resolved by introducing a wait timeout (but then some game logic may not follow the audio accurately, like reporting clip position, etc).

First of all we'd need to clarify if this is happening strictly on Android, and not other platforms like Windows.

The RAM question may be resolved by testing a dummy game which has nothing else but the simple scene where you play this sound.

@SinGala, could you upload this OGG file that is causing the issue and post here for us to try?
#25
In regards to the ceremony itself, is there anything that could make things more streamlined?

I never looked into what you do there, but assuming you need to use extra resources each time, do you have to import everything inside the game project, or your client/server thing loads them from the disk?

Which assets do you get from the game authors? Can you get them by extracting them from the game, for example (assuming you received author's permission to use them)?
#26
Is there any way to get statistics of games made in AGS per year, at least ones registered in database?
It may be curious to see the graph and compare how this number changed over the decade(s).
#27
Quote from: Exkodius on Mon 06/11/2023 01:52:24Hi! I'm a long time lurker to these here forums and thought that i had to finally register to give a little heads up about a bug i found in trying out the early aplha 6 version.

In my project i work with 8-bit 256 colors. Sadly it seems that this version of the editor really does not like that, as it refuses to import my room backgrounds as anything other that 32-bit.

Hello.
I guess nobody tested the new version with 8-bit games yet. I'll try this and open a bug ticket.
#28
@vga256,

Quote from: vga256 on Tue 15/08/2023 23:39:26For the time being, GetAtScreenXY for Overlays alone would be hugely useful for projects like mine.

I've been thinking about potential issues for a while, and came to a realization that this would not be useful at all, at least not in the current circumstances.

Suppose the engine will find an Overlay under cursor and give it to you, how do you tell which overlay that is?
You see, other objects have IDs, they have ScriptName property, some have custom properties, or interactions which you may run.
But Overlays do not have IDs, or anything at all to report their meaning (at least not in a direct sense), or connection with anything. What would you do with this random Overlay?

The way I see this, searching for an overlay under cursor is almost pointless, as it's nothing but a sprite on a screen. That would have more sense to search in custom script data instead, which in turn "owns" Overlay as its visual representation. Then we'd probably need an opposite kind of test: not Overlay.GetAtScreenXY() that finds some overlay under the coordinates, but Overlay.HitTest() that tells whether a particular overlay is under coordinates. But then, it may be easier and faster to test for a bounding rectangle right in script, unless your overlay is shape-transformed (rotated etc) or you need a pixel perfect test.

I suppose this requires a good forethought to investigate the use case and potential usability issues.

Besides this, ther's a number of problems regarding performance and object validation when doing GetAtScreenXY(). I'll put them under the spoiler:

Spoiler
1. Performance
The engine does not have any "magic" to spot overlays under the cursor, so it has to do some kind of a search. The most primitive method is to iterate all existing overlays and test each one's bounding box. That could work as a simple formal solution.
But given Overlays are not limited anymore, the game may have many thousands of them, and then this search will become slow. So this will not work as a general solution.

This problem may be countered by introducing object groups, where each group is limited by certain portion of the screen, and maybe even by z-order range (so x,y,z position). This would mean that the engine should be ready to move overlay between these groups whenever overlay changes its position or size.
Note: if this system is created, then this has to be done regardless of whether game script has a call to Overlay.GetAtScreenXY() ever or not at all.
Then, @eri0o has a concern that any changes to overlays update will make overlays "less fast", and he's being using them in many thousands in his games, and put an effort to make this work as fast as possible. I don't know and cannot tell beforehand how impactful such "grouping" system could be to the existing performance. But it's definite that such system has to be well designed and performance tested first.
On another hand, popular engines seem to separate objects that support hit detection and those which do not. This lets reduce number of objects that may be searched for. This may be done through type hierarchy, or components. For instance, iirc, Unity 3D requires an object to have a "collider" component in order to be detected by a hit test. Possibly only those "colliders" are involved in a object search mechanics. Is this also a way to go with Overlays in AGS, by making a distinct interactable type derived from them? i cannot tell, and this problem is also complicated by AGS being generally "clunky" when it comes to type hierarchy in script (lack of proper pointer casting, and so forth).

2. Validation
Then there's something else: engine does not know how do you use Overlays, and what for. But you do.
This means that you may have better idea on how to separate wanted and unwanted overlays for your search.
Look at this example: you are using Overlays to generate dynamic GUI controls, so you store them in arrays and describe their relations using pointers. If you are doing a click test - then first you may find out which parent GUI is under cursor, and then search in its children. This may be faster than searching all existing overlays.
If you are using overlays to create a tilemap, then you may narrow search down to a certain visible portion, or group of tiles close to coordinates, if these tiles would store pointers to overlays on top of them, for instance.
Not only your own search may be more optimal than engine's but also it may be more valid. As engine will search for any overlays at all, including standard ones like character speech, while you may want to limit the search to overlays that serve particular purpose in your game.

[close]
#29
On another hand, I am probably talking nonsense. I would delete my older posts, but they are already in the conversation. In retrospect, I should not have posted here.
#30
Updated to Alpha 6
(Please use download links in the first post)

This is a small update, mostly to catch up with 3.6.1. Not many changes specific to AGS 4.

Contains updates and fixes from 3.6.1 Beta 9 to 12 (except ones related to backwards compatibility).

Other changes:

Common:
- Completely removed Global Messages and Room Messages.
- Removed built-in support for Game Score, including related game settings and GiveScore script command. Users are advised to script their own score counter if they need one.

Editor:
- Fixed "section" dropdown list in the script editor was getting broken by custom Color Themes.

Compiler:
- Accept constructor-like syntax (`T *o = new T();`), but skip the parentheses and do nothing, as AGS script does not really support constructors at this point. The purpose of this is to make it easier for users who have C++ or C# habits.
- Fixed "autoptr" struct's modifier required "builtin", should require only "managed".

Engine:
- Implemented more accurate Character movement. The movement direction is now more precise and diagonal movement speed no longer may exceed MovementSpeed setting.
#31
Updated to Beta 12
(Please use download links in the first post)

Contains all fixes from 3.6.0 Patch 6.

Other changes:

Editor:
- In General Settings moved few properties to different groups for better consistency.
- Apply color themes to Log Panel.
- Fixed View preview does not display very large sprites.

Engine:
- Improved performance of String objects in script. For instance, appending a character to a String is now roughly x2 times faster, *sequential* iteration of String.Chars[] in Unicode mode is about x12 (!) times faster (Strings in ASCII mode have relatively less improvement, because they have been faster than Unicode mode already).
- Fixed Overlays may display incorrectly after loading a legacy (pre-3.5.0) save file.



EDIT: I had to re-upload this again... after finding and fixing a mistake in String.Substring function :/
#33
AGS 3.6.0 - Patch 6
Full release number: 3.6.0.53


For Editor
Spoiler

For Android
Spoiler
NOTE: the Editor now includes Android build component letting you prepare your own games for Android
[close]

For Engine/Editor developers
Spoiler

Released: 3rd November 2023

Previous stable version: AGS 3.5.1 P20 forum thread


This release is brought to you by:

- Alan v. Drake (improvements, fixes)
- Cameron Cawley [ccawley2011] (fixes, improvements to SpriteFont plugin)
- Crimson Wizard (stuff :))
- Dominik Mierzejewski (fix)
- Donovan Watteau (fix)
- eri0o (updated Android port, Web port, Editor improvements, etc)
- fernewelten (new fonts outlining, improvements to script compiler, fixes)
- Francesco Ariis (fixes)
- Morgan Willcock (improving templates, help with CI)
- Pablo Navarro [panreyes] (fixes)
- ChamberOfFear (improvements)
- rofl0r (fixes, suggestions)
- sonneveld (porting engine to SDL2)
- Thierry Crozat (fixes, plugin update)
- vga256 (fixes)
- Walter Agazzi (fixes)


Summary

AGS 3.6.0 is another big change to AGS.
First of all, this release presents a SDL2-based engine. For about 2 decades AGS engine was based on Allegro 4 graphic library, which was discontinued somewhere in the early 2010-ies (only received few patches since). There was an intent to move to to Allegro 5 or SDL since, but for various reasons this task was continuously postponed. Now it's done.
Secondly the Editor and Engine now have full Unicode support. This means that you may use any language whatsoever in scripts, object descriptions and custom properties, as well as translations; so long as you also provide proper unicode fonts.
Third, we have finally expanded a list of platforms that the Editor can build for: now this includes Android and Web (Emscripten) port.

There are much more changes and improvements in this release, check out the full list of changes below.
Also, please be sure to read "Upgrading to AGS 3.6" topic in the manual: https://adventuregamestudio.github.io/ags-manual/UpgradeTo36.html



Changes in the Patch 6:

Editor:
- Fixed GUI editor could display selection rectangle from a different GUI editor pane, if two or more are displayed on screen at the same time.
- Fixed Script editor not marking "autoptr" and "builtin" as keywords.
- Fixed Script editor not applying color theme to character literals.
 
Engine:
- Made String.Chars and Length properties work faster in ASCII mode.
- Issue a warning when blocking Display or Say commands are called during fade-out.
- Fixed engine failing to startup sometimes if controller device subsystem failed to init (it should not init at all in this version, as we do not support joysticks yet).
- Fixed "Before fade-in" event could be called recursively under some peculiar conditions (regression since 3.6.0).
- Fixed buttons on a non-clickable GUI were still changing to "mouse over" graphic under cursor.
- Fixed button click not registered if it has been made not visible and visible again during a single game frame (regression since 3.6.0).
- Fixed TextWindow borders drawn behind the rightmost corner pieces, which may be seen if the edge sprites are half-transparent.
- Fixed a brief black screen flash occuring right after the video playback ends (regression since 3.6.0).
- Fixed engine refusing to load legacy saves if the audio clip count does not match (number of audio clips should not affect saves).
 
WinSetup:
- Added an option to disable "smooth scaled sprites" setting.
- Added an option to disable language selection.
- Made filter names in "disabled" section treated in case insensitive way.


Changes in the Patch 5:

Editor:
- Reimplemented multiple sprites properties editing in the Sprite Manager. This ability was dropped in 3.5.0 unintentionally.
- Fixed Autocomplete not treating certain struct members as "static" or "protected" if their declaration is too long.

Engine:
- Fixed Character.WalkStraight() was resetting walking animation if called during walking.
- Fixed Character's idle animation getting reset to frame 0 when the speech is played without a valid speech view (idle animation should continue playing in such case).
- Fixed idle animation sometimes not starting immediately after Character finishes walking.
- Fixed a crash occuring if script tries to get or set a custom property for a non-existing Room Object (this seem possible to do by iterating over `object[]` array).

Compatibility:
- Implemented "legacysave_assume_dataver" override option in config, which lets to instruct the engine which game data version to assume when restoring legacy (pre-3.5.0) saves. This "hack" appeared to be necessary because of a mistake done during development of the older engine versions, where the save format was changed, but engine was made to rely on the game data version instead of incrementing save format index.
- Implemented "legacysave_let_gui_diff" override option in config, which lets the engine to read less gui elements from restored save than the number registered by the game. This is to emulate a (possibly unintended) effect in pre-3.5.0 saves.
- Fixed engine could try to load game data from game.exe without checking whether data is actually appended to it when restoring a legacy save in a game with a different file structure.
- Fixed number of GUI elements were not tested when loading a legacy save, which could lead to GUI data getting overwritten incorrectly without a warning if number of controls changed since. If the test failed, engine will act according to "legacysave_let_gui_diff" config option: either quit with error or log a warning and continue.

Plugins:
- Fixed potential "index out of bounds" exceptions in the built-in PalRender plugin.

Templates:
- In "Verb Coin" template fixed action label could be updated incorrectly if the cursor was moved over buttons on any other GUI.


Changes in the Patch 4:

Editor:
- Export Game's Title into translations.
- Fixed Game.agf was not created after importing a 2.* game project (regression in 3.6.0).

Engine:
- Character.AnimationVolume property is now applied to the portrait animation as well.
- Removed few of the less important game messages from logging, because they may quickly clutter the log under some circumstances.
- Fixed when animating a character portrait, the first frame's linked sound is not played.
- Fixed IsSpeechVoxAvailable() returning positive result if run from IDE and Speech folder is empty.
- Fixed speech and messages were skipped by modifiers and other special keys (Ctrl, Alt, etc).
- Fixed crash occuring when you resize DynamicSprite while it is displayed on screen.
- Fixed audio clip started right before a ChangeRoom would not play until after the room changes.
- Fixed in Software display mode the room Overlays may not be properly covered by a walk-behind under very specific conditions.
- Fixed System.Log() would cause engine crash if there are more format placeholders than args.
- Fixed some game options that are not allowed to be changed at runtime could still be overwritten when restoring an old save, leading to a weird game behavior.


Changes in the Patch 3:

Editor:
- Don't error when loading a room file which has unsupported number of events, instead these will be cut out. This may let e.g. use room templates from newer versions of AGS.
- Sprite's default property is changed from deprecated Resolution setting to SourceFile.
- Fixed full spritefile recreation would write duplicate sprites into the spritefile, if game project (Game.agf file) contained multiple sprites with same ID for any reason (for example, if they were added by manually editing Game.agf).
- Fixed importing SCI fonts with >128 chars.
- Fixed font preview did not properly display characters with indexes 128-255.

Engine:
- Fixed "noloopcheck" script function modifier was not handled correctly sometimes.
- Fixed a button with inventory placeholder did not update immediately when the active inventory is set.
- Fixed textual GUIs were not redrawn immediately after a call to SetGameOption(OPT_RIGHTTOLEFT).


Changes in the Patch 2:

Common:
- Fixed a TTF font could cause a crash in the Editor or the Engine if the font renderer tries to draw a letter with higher number than the highest glyph number in the font.

Editor:
- Added "Restore all sprites..." command to the Sprite Manager's context menu (this duplicates the "File -> Recreate sprite file" menu command added previously).
- Refresh Sprite Manager after fully recreating a sprite file.
- Sprites will now hide their "Resolution" property if the game settings have "Allow relative asset resolutions" disabled. This is to avoid user's misuse of this property.
- Fixed a minor memory leak occuring when editing a tree item's label in Project Explorer.

Engine:
- Engine will now find and load plugins in the game dir when run from a different location.
- Fixed crash occuring if Character was told to FaceLocation while "Turn to face" game setting is enabled, and character's View does not have enough loops.
- Fixed Character resetting current non-blocking animation if it was ordered to Move, as soon as it arrives at destination.
- Fixed crash occuring if a GUI button was somehow set a negative NormalImage number.
- Fixed "bad script stack" error could be sometimes displayed if the game was aborted in the middle of running a script.


Changes in the Patch 1:

Editor:
- Fixed room's deprecated setting LegacyMusicVolumeAdjustment not applied correctly.

Engine:
- Fixed Room Objects whose dynamic sprite was deleted in "leave room" event becoming invisible during fade-out transition. Logically this has to happen, but historically they kept displaying until the transition end, so we restored this behavior for compatibility, and simply because there's no "after fade-out" event in the engine yet to delete these sprites.
- Fixed Game.StopAudio() fails to remove queued clips if no particular audio type id is requested.
- Fixed performance regression in the script related to long loops (regression in 3.6.0).
- Fixed memory leak occuring when printing text in Right-to-left mode (regression in 3.6.0).
- Fixed rare mistake during text wrapping which may occur if a Unicode text is cut in the middle of the word.
- Fixed playing certain WAVs caused game to freeze forever on exit.

Compatibility:
- Fixed frame-linked sounds not playing in the games made before 3.6.0.
- Allow game to call DynamicSprite.Create() with negative size, clamping it to 1x1.

Templates:
- In Sierra-style template fixed "mouse over" graphic for the "Load" icon.



What is new in 3.6.0

Common features:
- Full Unicode support for all game texts: game properties, scripts, translations, input.
  ASCII/ANSI mode is still working, for backwards compatibility. This may be configured in the game project.
- Extended sprite compression options: lossless storage optimization for 16- and 32-bit sprites; LZW compression option for sprites in addition to existing RLE compression.
- GUI controls may now be told to clip their contents, which means that nothing gets drawn outside of their borders (as defined by X, Y, Width, Height properties). The only exception is Sliders, which are more complicated.
- The historical TTF fonts' "fixup" that altered their height and vertical offset is now optional and works only if backwards compatible option is set.
- Max number of AudioChannels is now 16 (was 8).
- Removed game Cursors hard limit (was 20).
- Increased Room Objects limit to 256 (was 40).
- Discontinued "Windows Game Explorer" support in both Editor and Engine.

Editor:
- Editor requires .NET Framework 4.6 to run.
- Added Android build target support (requires "Android component" installed).
- Added Web/Emscripten build target support (requires "Web build component" installed).
- Expanded UI color theme format, support global color options and allow missing entries.
- Script editor works in unicode mode.
- Added "Text format" option in General Settings which lets switching between ASCII/ANSI and Unicode (UTF-8) modes. This defines which format the game texts will be written in, when saving the game project and compiling the game.
- Added "Use old-style keyboard handling" option to the General Settings, which lets select between classic key press handling and new one meant for unicode chars support in scripts.
- Supports compiling UTF-8 translations. TRS file now has "Encoding" setting that tells how to interpret this TRS text.
- Added support for building multiple speech voxes, by taking files from the Speech subfolders.
- Added support for adding custom files into the game package. This is done by assigning a list of directories to "Package custom data folder" option in General Settings.
- Editor now copies a acsetup.cfg file from the project's root folder (if one is provided by) as a base for generating default config file. Settings from Default Setup will be written over, but other found options won't be removed.
- Added "Sprite file compression" option in General Settings, replacing "Compress the sprite file" option. The new option allows a selection of compression algorithm used for sprites.
  Currently supported: None, RLE (old default compression) and LZW.
- Added "Enable sprite storage optimization" option to the General Settings, that permits the editor to repack sprites in a different storage format, reducing their disk size whenever possible. This option may be used alongside with the sprite compression. Note that this does not change how the sprites work in game.
- Added "GUI controls clip their contents" option to the General Settings.
- Added "TTF fonts height used in the game logic" option to the General Settings, that makes your game use real font's pixel height when arranging text and text-based UI elements, as opposed to the nominal font's size.
- Added "Touch to Mouse Emulation", "Touch to Mouse motion mode" and "Display FPS on Screen" to Default Setup. Removed few deprecated options.
- Added "TTF font adjustment" property to Fonts, as well as to General Settings where it serves as a project default for the new fonts. This property lets you choose between "no changes" and backward compatible TTF fixup meant to keep fonts made for AGS displayed as they were meant to.
- In the "Import TTF" dialog added a choice to import the size closest to the given pixel height.
- Fonts now have Auto Outline Style and Auto Outline Thickness properties.
- Fonts now have a readonly Family Name field, that lets user see the original name of a font they've imported (if available).
- Added IdleDelay property to Characters that lets you set time needed to pass before IdleView is activated. This is equivalent to the Character.SetIdleView script function.
- Added Character.IdleAnimationDelay property to let setup idle view's animation speed.
- Added Cursor.AnimationDelay property to let setup cursor's animation speed.
- The TextWindow edges now have distinct names in the dropdown list of the property grid.
- Rooms created from a Blank template will now have default background of a game's resolution.
- When creating new room objects they will now have their script names set to some default value.
- Added Room.BackgroundAnimationEnabled property to let have disabled animation on room load.
- Editor will now create an empty sprite file if one is missing in the game project. Any existing sprite descriptions in the project will be kept, letting user to reimport these from sources.
- Added "File -> Restore all sprites from sources" menu command.
- Added "Apply" button on editor's Preferences dialog.
- In Preferences replaced "Import Color Theme" with a "Open Theme Folder", as a temporary solution for managing theme files.
- Select script editor's font in the editor's Preferences.
- Added "Help" option to the editor pane's tab context menu.
- Upgraded script editor to Scintilla 3.21.1 and ScintillaNET 3.6.3.
- Cursor's position in script is now displayed on the status bar.
- Dialog scripts now too can open help topics for keywords or script functions under cursor on F1.
- Added zoom controls for the Sprite Manager, Character, Cursor, Inventory and View panes.
- Sprites may now be imported by drag'n'drop into the Sprite manager.
- In sprite manager's context menu added command "Create source files for all sprites with missing / external sources..."
- In sprite manager's context menu added (restored) command "Replace sprite using previous files".
  Also made "previous file" remembered consistently whenever a sprite is imported or replaced.
- In sprite manager's "export all" dialog added "skip if inside project's folder" option.
- In sprite manager's "export all" dialog added "reset tile settings" option.
- On the View pane the frames having set delay and linked sound will be now indicated with icons.
- Editor no longer errors and fails when opening a game project with some script files missing.
- Editor no longer errors on empty translations when compiling the game.
- Editor now exports values of the string type Custom Properties to translations.
- Editor no longer prevents exporting string arguments from Get/SetTextProperty calls to TRS file.
- Editor now cleanups spritefile on game load, identifying any data not referenced by the project and marking it for deletion.
- Fixed editor silently enabling all available Build Targets when upgrading a pre-3.4.0 project. This could be very inconvenient as there are several of them supported now.
- Fixed open folders in the Project Tree were collapsing whenever you create a new subfolder or change an object's name in properties.
- Fixed editor was not preventing from entering Character's and AudioClip's ScriptName too long for the engine to handle.
- Fixed Image and View properties in various objects were allowing negative values.
- Fixed some of the object previews (at least GUI) could crash if user entered a non-existing sprite's number as an Image property.
- Fixed editor displaying unhandled exception if the script which user is trying to open was missing. Instead it will now open a blank script.
- Fixed room editor was suggesting to save the modified room even if no changes were made.
- Fixed a recently imported sprite could be displayed incorrectly scaled up in the room editor for high-resolution games, if the "Allow relative asset resolutions" was enabled in General Settings, and the sprite 0 had "Resolution" property set to "Low".
- Fixed program crash occuring on sprite's import if failed to open a source file for any reason.
- Fixed View animation preview stopping at frame 100 (if loop contains over 100 frames).
- Fixed going to a "find all" result in dialog script did not highlight the found text, and sometimes did not scroll down to it.
- Fixed "Goto Definition" not working for Enums and Defines (macros).
- Fixed script autocomplete sometimes was not updated right after opening a script.
- Fixed script autocomplete for function calls was mistreating commas in strings and inline comments as if they were separating actual parameters.
- Fixed script autocomplete was not displaying members of extended structs if the parent struct was declared in another header.
- Fixed script autocomplete was not working for enum names.
- Fixed structs and enums were not highlighted if declared inside a script's body.
- Fixed in dialogs numbers inside names were incorrectly highlighted as numeric values.
- Fixed matching or mismatching braces were not highlighted consistently at all times in regular and dialog scripts.
- Fixed crash occuring when user was trying to set breakpoint on the very last line in script.
- Fixed few editor panes were not opening correct help topics in F1.
- (Possibly) fixed error message text in the runtime error popup could be drawn partially beyond the popup borders if the user's system has text scaling option enabled.

Compiler:
- Support unicode character literals.
- Support using float literals when defining default values for function arguments.
- Support hexadecimal number literals (e.g. "0xABCDEF").
- Removed 500-characters line limit.

Script API:
- Expanded `on_key_press` callback, now supports two parameters: key code and key modifier flags.
- In the new key handling mode `on_key_press` is called for each actual key press;
  e.g. combinations like Ctrl+Z will result in two `on_key_press` calls, one with eKeyCtrlLeft and second with eKeyZ; added support for "NEW_KEYINPUT_API" macro in scripts.
- Implemented new `on_text_input(int ch)` callback which is called when the engine receives a printable character. This callback is essential for handling unicode chars in script.
- Similarily, expanded `dialog_options_key_press` with the third `mod` argument, and implemented `dialog_options_text_input` callback for receiving unicode chars during the custom dialog options state.
- Implemented `dialog_options_close` callback which is called when custom dialog options are removed from the screen. This allows to perform any required cleanup.
- Added eEventEnterRoomAfterFadein event for `on_event` callback, which corresponds to "enter after fade-in" room event.
- Added eKey constants for Shift, Control and Alt keys.
- Added eKeyMod enum for key modifiers constants.
- String.AppendChar(), ReplaceChar() functions and String.Chars[] property are now working with the unicode characters.
- String.Format("%c") specifier will now be able to print unicode characters.
- Extended Button.Animate() to have blocking style, direction and starting frame parameters, thus matching other Animate commands (of Character and Object).
- Extended all Animate() commands by adding "volume" parameter, that defines volume of the frame-linked sounds for the duration of this animation.
- Added Character.AnimationVolume, defining volume of the frame-linked sounds.
- Added Character.IdleAnimationDelay to let control idle view's animation speed.
- Character.Scaling is no longer limited by a range of 5-200 (now supports 1-32767).
- Hotspot.Name and Object.Name may now be set in script.
- Added Object.ManualScaling and Object.Scaling.
- Deprecated Object.IgnoreScaling (use Object.ManualScaling instead).
- Object.SetView default loop & frame values are now 0 (was -1 which retained loop and frame indexes from the previous view, often unexpected to the user).
- DrawingSurface.DrawImage() and DrawSurface() now support optional source rect coordinates.
- Added functions for getting DrawingSurface of room masks: GetDrawingSurfaceForWalkableArea(), GetDrawingSurfaceForWalkbehind(), Hotspot.GetDrawingSurface(), Region.GetDrawingSurface().
- Added new delay parameter to Mouse.ChangeModeView() to let control cursor's animation speed.
- Added Game.ChangeSpeechVox() and Game.SpeechVoxFilename, support switching the voice-over pack.
- Added Mouse.AutoLock property that toggles automatic mouse lock inside the game window.
- Added Room.Exists().
- Added System.Log().
- Added SkipWait() that skips any active Wait() function.
- Added WaitMouse() to complement existing Wait functions.
- Added InputType enum which defines input devices and lets create their sets as flags.
- Added WaitInput(), a more generic and extendable function that accepts a combination of flags telling which input types to wait for.
- All Wait* functions now may have infinite timeout if you pass a negative timeout parameter.
- All Wait* functions now return the reason they were skipped: a combination of InputType flag and a respective key or button code.
- Added GUIControl.Transparency property.
- Added Overlay.CreateRoomGraphical and CreateRoomTextual. Use these two functions to create "room overlays": that is - overlays that display a sprite inside the room, sorted among other room objects, characters and walk-behinds.
- Added readonly Overlay.InRoom property that tells if this is a room or screen overlay.
- Extended Overlay.CreateGraphical() with a new "clone" parameter that tells whether to assign a sprite index, or make a sprite's copy owned exclusively by this overlay. The former will save program memory but make overlay update if the sprite is edited later. The latter is meant primarily for backwards compatibility.
  Overlay.CreateRoomGraphical has the same param.
- Added Overlay.Graphic property that lets you change overlay's sprite after it's created.
- Added Overlay.Width and Height properties, that let you freely scale existing Overlay.
- Added readonly Overlay.GraphicWidth and GraphicHeight properties that let read original overlay's graphic size, as not all overlays hold a sprite reference (e.g. textual overlays).
- Added Overlay.Transparency property.
- Added Overlay.ZOrder property that lets you sort Overlays among themselves and other objects in the same "game layer": screen overlays are sorted among GUI, while room overlays are sorted among room objects, characters and walk-behinds.
- Added Speech.TextOverlay and Speech.PortraitOverlay for accessing blocking speech overlay and portrait overlay respectively.
- Added Game.BlockingWaitSkipped which tells the result of the last blocking wait skipping, also including result of the blocking speech skipping.
- SkipSpeechStyle now supports eSkipNone mode; when used it will disable any kind of skipping, such speech can be only skipped by a direct command from script.
- Extended Screen.ScreenToRoomPoint() with an optional "restrictToViewport" argument, which lets to choose whether tests over empty place result in conversion through the default viewport or a null pointer.
- Added AudioClip.PlayOnChannel().
- Added AudioChannel.Pause() and Resume() functions, and IsPaused property.
- Added AudioChannel.SeekMs(), complementing PositionMs (as the Seek() function interprets position differently depending on the audio format).
- PlayVideo() now supports an option to play both game's and video's audio track simultaneously.
- Added File.WriteRawInt() to complement ReadRawInt().
- File paths in script now support $DATA$ token, which tells to read files from the game package. This only works for read operations. Functions that support this token currently are:
  File.Open(), DynamicSprite.CreateFromFile(), ListBox.FillDirList().
- Debug(2, 0) command that displayed walkable areas is superceded by Debug(2, n), where "n" is a mask type: 0 - none, 1 - hotspots, 2 - walkbehinds, 3 - walkable areas, 4 - regions. This command also works as a toggle switch, calling it with the same mask index will turn it off.
- Debug(5, n) command that displayed character's walk paths now also works as a toggle switch.

Engine:
- New SDL2-based backend for graphics, audio and input.
- Hqx graphic filters discontinued (could be temporary).
- Windows-only DirectMedia video playback discontinued (could be temporary).
  Only OGG/OGV videos are kept supported at this point.
- Support resizing game window on desktop systems.
- Support "borderless full-screen window" mode in addition to the real (exclusive) fullscreen.
- Support for switching vertical sync at runtime with Direct3D/OpenGL renderers. Also enable vsync in windowed mode too.
- Unicode (UTF-8) text support: engine can now switch between ASCII and UTF-8 text mode. This is controlled by both game's OPT_GAMETEXTENCODING setting and translation's "Encoding" setting: they tells whether to interpret game texts as UTF-8 or ASCII/ANSI.
- Support optional translation's "GameEncoding" setting: it hints the original game's codepage to help with their conversion. This is mostly meant for translating existing older (ANSI) games.
- Engine now supports using real pixel height of the TTF fonts when arranging text and UI elements on screen; using nominal import size of the font is used as a compatible mode for the old games.
- Also supports separate "normal" and backward compatible "fixup" modes when initializing TTF fonts, letting to display both common TTFs and ones made specifically for AGS in the past to display as they were meant to be.
- Supports scripts using functions and variables from any other scripts, regardless of the script module order in the project.
- Removed limit of simultaneous Button animations.
- Removed limit of Character followers.
- Removed Overlay limit.
- Character.SetWalkSpeed() is no longer restricted by an arbitrary limit of 50.
- Process character's idle view based on real game speed, not hardcoded 40 fps.
- Improved file writing times (e.g. when doing a game save) by using buffered file stream. Initial tests showed 50% faster file writing.
- Engine now renders GUI controls as separate textures when using hardware accelerated renderers. This may significantly improve performance in the high-resolution games and games with large number of GUI elements on screen.
- Engine now shares the video texture data for all game objects on screen sharing same sprite. This improves performance in case there are multiple objects which use same image.
- Various performance optimizations for both raw drawing and texture updates (Direct3D/OpenGL).
- Engine now ensures that in threaded audio mode the AudioChannel's state only changes once the game is updated, and not while the game script is running. This prevents situations when the clip could begin playing before all properties are set in script, or when AudioChannel's properties' values (such as Position) could change while running a game script.
- 24-bit wav PCM support, comes with the new sound library.
- File.ReadRawLineBack() now always reads full line, and not limited to 200 characters anymore.
- Debug displays, such as showing room mask and character walk paths, are now implemented as non-blocking translucent overlays, allowing you to keep playing the game while they are on.
- Implemented debug key controls for calling a built-in save and restore game dialogs. These controls have to be set in user config as "save_game_key" and "restore_game_key" in "[override]" category. These may be used by testers if the game is missing a save function or one is bugged.
- Engine now supports loading compiled scripts as separate files packed along with the game, along with those embedded into the main game data or inside room files.
- Engine no longer bails out with error if the chosen translation cannot be loaded on startup.
- When reporting script errors, engine will print callstack for all the active script "threads": for example, if there's Wait() function called and error happened in repeatedly_execute_always, then it will print both actual error's location, and Wait() call's location.
- Engine config now has graphic modes defined as a simplier string options: "[graphics] fullscreen" for the fullscreen mode setup, and "[graphics] window" for the windowed.
  Fullscreen option can explicitly define a "borderless full-screen window" mode.
- Added "emul_mouse_mode" and "emul_mouse_relative" options to config in "[touch]" category.
- Added "cache_size" and "stream_threshold" options to config in "[sound]" category, they setup the rules for sound caching and choosing whether to load a clip fully into mem or stream one.
- Added "load_latest_save" and "show_fps" options to config in "[misc]" category.
- Added "background" option to config in "[misc]" category, that defines the starting run-in-background (aka multitasking) mode (may later be changed by SetMultitaskingMode()).
  Added "--background" command line option for the same purpose.
- Added "--sdl-log" command line option for setting up SDL2 library output verbosity. The engine log config now has a new "sdl" group meant for SDL2 messages.
- Support "--user-conf-dir" command-line arg (and "user_conf_dir" config option) superceding "--localuserconf"; the new option directly tells the location of user config file.
- Path related command-line and config options, - such as "shared_data_dir", "user_data_dir" and "user_conf_dir", now support $GAMENAME$ token in path which is resolved to the game's title.
- Added "--clear-cache-on-room-change" command-line arg (and similar config option).
- Don't error when DrawingSurface.DrawImage has bad transparency parameter (warning instead).
- Don't error when detecting bad format in File.Read* functions (warning instead).
- Added stubs for agsshell plugin (a contemporary cross-platform variant of ags_shell).
- Added stubs for agsappopenurl plugin.
- Fixed potential crashes if a room-related API function has been called in "game_start"; this is achieved by having a dummy room placeholder object. Still results of such calls are undefined and should not be relied upon.
- Fixed potential crash on room load if the walkable area mask contained color values above the supported range.
- Fixed dialog script's "goto-previous" command not working if used from the first sub-topic run using "goto-dialog" (a very-very old bug).
- Fixed AGS_EngineInitGfx plugin callback was not called during OpenGL renderer initialization.
- Fixed Direct3D/OpenGL renderers were displaying plugin's raw drawings in a wrong position in the scrolling rooms, if the drawing was done on AGSE_PRESCREENDRAW or AGSE_POSTROOMDRAW events.
- Fixed overlay may fail to be created sometimes, if previously another overlay had been forcefully removed when changing rooms (this is an ancient bug which existed for many years).
- Fixed ListBox.RowCount reporting 0 if called before the control was displayed once.
- Fixed GetTextWidth would still return a size of an outline for an empty text string.
- Fixed text may be misaligned in gui controls, as its outline thickness is not counted.
- Fixed some TTF fonts could be cut at the bottom when the speech is displayed.
- Fixed scheduled sound fadeout effect was not cancelled by skipping a cutscene.
- Fixed OGV Theora videos positioned incorrectly if they have certain sizes or aspect ratios.
- Fixed game fps sped up if SetGameSpeed() is called repeatedly in game script.
- Fixed game not reacting to system close commands when stuck in script, which made it impossible
  to close the "hanging" game by usual means (other than terminating the process).

Engine Plugin API:
- Added IAGSEngine::GetGameInfo() function which returns information about the game, such as its title and GUID.
- Added new render callback AGSE_POSTROOMDRAW, for handling drawing inside the room above all room objects.
- Added IAGSFontRenderer2 interface, expanding the original font renderer interface, improving font plugins support.
- Added ReplaceFontRenderer2() and NotifyFontUpdated() functions.

Compatibility:
- Fallback to the first loop with frames if current character's loop does not have any.
- Use the dummy frame if current character's speech view loop does not have any.
- Ignore character having view/loop with no frames while it's not in the current room.
- Legacy behavior of MoveCharacterBlocking's return value.
- Fixed walkable area's continuous scaling was broken for high-res rooms in old games.
- In pre-3.* games force player to walkable area after changing rooms, this is to emulate an unintentional effect created by the old engines.
- Fixed pre-3.4.1 anti-aliased TTF fonts display (their vertical position was broken).
- For pre-3.5.0 games support old behavior of coincidental dynamic sprite replacement on GUI backgrounds (and few other places) without explicit assignment; that is - when the new DynamicSprite is created right after deleting an old one.
- Support Label.TextAlignment with legacy alignment constants for pre-3.5.0 games made with the custom engine from "Clifftop Games".
- Support native resolution hack for games made with "Clifftop Games" custom engine, where 640x400 games are run as 640x360.

Android:
- Rewrote universal AGS game launcher/player using up-to-date Google guidelines. The former "launcher" is now called "AGS Player".
- Implemented single game project template meant for building your own signed APK.
- Implemented two touch-to-mouse control scheme (selectable in config), for one finger emulating LMB only, and for two fingers emulating LMB and RMB.
- Support relative motion speed setting for touch-to-mouse emulation.
- In AGS Player added "Browse" button to the game folder selection, which opens default system file picker.
- AGS Player now searches for games recursively, in all the subfolders.
- AGS Player now has preference button per each game, which opens individual game's settings.

OSX:
- OpenGL renderer is now supported on MacOS.

Web / Emscripten:
- Initial port release.

Windows:
- Installer will create program links with three-digit version in the name.

Plugins:
- Added SpriteFont plugin to the list of builtins, for ports that use ones.
  SpriteFont plugin is updated to support custom "Clifftop Games" font variants.

WinSetup:
- Added "Fullscreen as borderless window" checkbox.
- Remade sound options to reflect the move to the new audio system in the engine.




Known issues

* Although Unicode text is supported overall, some languages may still not be printed correctly automatically. Firstly, those that require "letter linking", such as Arabic or Persian, do not have the proper linking on its own. This may be worked around using special text converters and fonts. Another issue is that texts printed right-to-left in the source (where print direction is done using Unicode's control characters) are not wrapped correctly and may require manual placement of line breaks, or scripting their split in game.
* MIDI no longer plays on its own on Windows. For MIDI you (and your players) must install "sound banks" (also known as "sound font"). Please refer to this article: https://adventuregamestudio.github.io/ags-manual/MIDI-playback.html
* AudioChannel.Position and AudioChannel.Seek do not work for MIDI and MOD sounds. Try sticking to PositionMs and SeekMs for now.
* There are reports about Direct3D not being able to restore the fullscreen mode after alt+tabbing occasionaly.





Thanks to everyone who contributed to and tested this version!



#34
Well, I never suggested that an adventure game should repeat exactly same puzzle, that's a weird way to interpret my posts.

I've been speaking of learning what you can do in game and being able to use sum of learnt experience later, and having consistency in rules. Is not that a "system", or am I using wrong terms?

I know that you cannot make this "using past experience" take place every time - in each single scene or puzzle, and probably should not, but my thought was that if you do with certain regularity, that might make game more interesting, rather than if it had a set of puzzles each of which is a thing in itself.

There are other related concerns here too, such as non-logical use of items, or non-logical game's refusal to let use an item. Or game not featuring choices that might seem natural in the given environment (random example from my memory of playing some games: suspecting an imminent danger, and not being able to pick up anything that would serve as a weapon), and so forth. IMHO these problems also stem from a lack of "rule set" in a game. These may not be serious problems in terms of gameplay, but are often immersion breaking.



What defines as a "adventure puzzle", and how "repetition" is affecting this definition, are curious questions. I was not developing adventure games (besides few failed tries), and haven't played much in the recent years, thus it's hard for me to have a good insight.
What I gather from the past memories though is: every game has base mechanics anyway. In case of adventure games it may be: walking around, gathering items and using them on something, learning information or forwarding a story on through dialog options.
Then, on the next level, there are "puzzle types". I recall there was a thread around these forums where you gathered those. If there are "puzzle types", that means repetition in a sense.
Where is the line at which a puzzle stops being "adventure puzzle", or a game stops being "adventure game"?

There was a very short game called "Awakener", and IIRC the whole gameplay may be described as "find out what each character needs and give them that". Is this an adventure game or not at all?

Then there's a "Blackwell" game series, where the repetition is on the "mission level" (if i might say so): as you are requested to put the ghosts to rest by making them remember that they are dead. This is IIRC done by searching for clues about them, so that you could mention something in a dialog. Is this making this game worse, or is irrelevant?
#35
Quote from: Snarky on Sun 01/10/2023 07:36:26To quote myself from an old discussion thread:

Quote from: Snarky on Wed 13/05/2009 00:33:41The point about "heavily scripted" is an important one that is often overlooked: It is characteristic of adventures that instead of offering a general "mechanic" of actions (run, jump, shoot, punch,...) which more or less work the same way every time, adventure games respond in a different, context-specific way every time you perform an important action, and this is usually accomplished by manually scripting each individual event. (I think this ties into the concept of "puzzles", which you might define as "intellectual challenges with pre-defined solutions".)


I meant to reply earlier, but I struggle to find proper words sometimes.

I think that "puzzle" is a "puzzle" when it has defined rules. These rules may be defined within a certain context of course. For instance, if you have a game of chess within an adventure game, then it won't be necessary to expect that you may use types of interaction from other puzzles during the chess match (although, why not...), as well as it is not fair to expect to have "chess" interaction elsewhere (although, again, why not...).

When I speak of the "system", I do not wish this to be understood in a too narrow sense. Platformer may have 3 actions (go left, go right, and jump), but it may have 20. First person shooters may have scripted sequences. Real-time strategies may have integrated mini-games. I don't think that either kind of a game is restricted to a single context, single set of interactions or behaviors. This is all a matter of engine capability and game design.

What I mean by "system" is that, if there's a context, then it's fair to expect defined rules for that context. The question is then, where is the boundary between one context and another? How is it decided in game, how is it indicated? or is it?

Suppose in point-n-click game there's scene A in which you have to get an item stuck high above you. You should use something throwable to knock it over. Then later in the game there's scene B in which you have to get another item stuck high above. Given the similar conditions I'd expect same trick to work, because it worked another time, but game does not let me, and gives some random "won't work" reply. In standard "adventure games" this seems to be considered a valid thing. In my opinion, that's not a fair thing.

The above is a hypothetical example, but similar problem may occur in various ways. It also relates to an often lack of definition for the "context". How do I know when the items work and when they don't? How do I know what they are meant for? Is it even possible to tell prior using them and receiving "won't work" reply, or am I bound to find out by trying in the each scene?
#36
Quote from: jmhimara on Thu 02/11/2023 01:21:21From what I'm understanding, the API is not exposed by the C++ code, so you cannot call that directly. The easiest way would be to create a transpiler between AGS script and whatever X language. Which is not easy at all.

It is possible to call engine's API directly, if you write a plugin and use the engine's plugin interface. I mentioned that in my reply. Maybe we have a misunderstanding here?
#37
Adding another script language should definitely be doable through a plugin, with certain effort.

Previously we had Lua plugin and C# plugin afaik, they may still be found around.
I do not know if they will still work though, they did not have proper maintenance, and possibly few changes in the engine could break them.
But if there's a demand, then these could be restored (so long as somebody would like to work on that).

But theoretically that's pretty possible to add another language support. As eri0o explained in the above comment, the idea is to hook up game API from the engine within a plugin's code. This is done more or less in similar way to how function pointers are loaded from DLL ("get me an address of function "NAME").

The remaining problem will be the fact that the engine currently is hardcoded to run callbacks in AGS script. I think that's the primary reason why you cannot skip AGS script completely.
If that is "fixed" in the engine, then one could avoid using AGS script and only use alternate language.
Without such "fix", there has to be a two-way connection between two, where AGS script must pass callbacks into the alternate script through plugin interface.

1. Engine ---> Game event ---> callback in AGS script ---> plugin API call ---> run callback in an alternate script.
2. Alternate script ---> call game function through engine API ---> Engine

#38
I don't know if this matches the topic, but I've been writing a "dungeon crawler" prototype in AGS.
I did not have exact plans for it, but put some effort in making it customizable, instead of hardcoding things like perspective, types of walls and objects, etc. It is still in preliminary stage, and all the wall gfx are generated using colored triangles:
(EDIT: to clarify, this is not real 3D, it's all made out of Overlays arranged as wall tiles)



Quick list of what it supports at this point:
- Configurable first person view (tells where the walls should be located on screen, etc);
- Each cell part (floors, ceiling, walls) may have a switchable or animated "texture";
- Triggers and simple list of actions (currently used only to make "teleports");
- For active objects and characters it uses state machine scripts inspired by classic Doom engine's actor scripts.

Spoiler
Code: ags
// SYNTAX:
//
//     STATE STATENAME
//         LOOP L F,F,F... [DELAY [ACTION [CHANCE [ARGS]]]]
//         ACTION [CHANCE [ARGS]]
//         GOTO CHANCE STATENAME
//         STOP

Example:
Code: ags
		"STATE Walk					\n"
		"    LOOP 0 0,1,2, 4		\n"
		"    LOOP 0 3 4 A_Step 1	\n"
		"    LOOP 0 4,5,6 4			\n"
		"    GOTO 1 Walk			\n"
[close]

Few older videos were posted on Discord a while ago, but keep in mind these had bad perspective settings:
https://cdn.discordapp.com/attachments/221048119637311489/1138681750109835355/2023-08-09_06-52-48.mp4
https://cdn.discordapp.com/attachments/221048119637311489/1139451793915527168/2023-08-11_09-53-10.mp4
https://cdn.discordapp.com/attachments/221048119637311489/1140479946364571748/2023-08-14_05-59-13.mp4

Game download link:
https://www.dropbox.com/s/kra2jx9ocspk086/crawler_test.zip?dl=0
Controls:
- arrows to move and turn,
- Z,X to strafe

Game project:
https://github.com/ivan-mogilko/ags-crawlproto
It's opensource under MIT license, although I would not exactly recommend using this code blindly for any purpose, as it's may be overcomplicated in parts. As mentioned, i had an idea to make everything configurable.
I'm writing this in AGS 4, primarily because of a newer script compiler, so you'll have to download AGS 4 Alpha for opening the project.

I'm posting this also because I know myself as a person who rarely finishes any side projects, so if not me, then maybe someone else could find this useful, or at least curious.
#39
Quote from: Danvzare on Mon 30/10/2023 16:24:54It'd be nice if you could just save and load the text parser words to and from a text file.
But unfortunately you can't.

It should be possible write a tool which loads a text file and modifies game xml based on this, for instance. That's the most primitive way of achieving this.
There are numerous xml parsing libraries, probably available for all popular programming languages.

On the other hand, writing a plugin for the editor may be a viable solution. Afaik plugins may add menu commands, and access game data. Hence they may be a good choice to implement import/export formats.

Quote from: Danvzare on Mon 30/10/2023 16:24:54Is it possible that text parsers aren't popular in AGS, because it's difficult to use?

How many discussions are there about improving a text parser, around AGS forums? From my memory in all this time (~10 years) there have been only 1 request concerning the parser in our issue tracker on github, something regarding getting the result of last parsing iirc.
A group of "unofficial" translators have contacted me once (several years ago), asking to make a custom engine that would support replacing parser's dictionary with translated words. That's how I learnt that parser's dictionary is not translated. But I do not remember any game authors asking for the same thing.

If one would make statistics of number of users who would like to use a text parser but cannot because of its complexity, that will show this feature's demand.

Then somebody could make a list of things that needs to be improved, and even better make a plan on how they could be improved, that would be something to start a work with. This may be a complete feature overhaul, as well as improvements for existing one.

Quote from: Danvzare on Mon 30/10/2023 16:24:54A text parser template doesn't even come with the engine, and the template you can find, could use some major refinement in my opinion

If one will make a good template with a text parser, and there will be a demand for it, we may include it into AGS distribution.
#40
..or if someone will write a tool or a editor plugin that would work with the same data, but in a more convenient and fast way in terms of UI.

I guess it would be possible to improve the workflow in the editor itself, but frankly, text parsers are not very much popular nowadays, so this feature has not been updated in AGS for many years.
SMF spam blocked by CleanTalk