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

#981
Quote from: eri0o on Fri 11/10/2024 01:54:37Oh, it would really be helpful if Datetime wasn't a static struct and instead all these properties were writable, so decoding the rawtime would be just a set value after parsing it out of the name, I think for now getting the time back from RawTime for presentation purposes would require re-implementing the date conversion in script. :/

Yes it would help to at least have a factory method that creates DateTime from raw time; and then perhaps one that creates it from year, month etc combination.
#982
Quote from: eri0o on Fri 11/10/2024 00:24:42Does YYMMDDhhmmss fits in an int32? If it does than this date can be sorted with a simple int sort.

One can write DateTime.RawTime there if such sort is wanted.
https://adventuregamestudio.github.io/ags-manual/DateTime.html#datetimerawtime

EDIT: Strangely, there's no way to recreate DateTime from raw time...
#983
Yes, indeed, you can write extra information into the save's description, and parse it back. If you go that way, then you don't need an extra file.

The save's description should store: date and incrementing save index.
In this case you can scan these 4 slots and find the one with either the earliest date or the lowest index in description, and write over it.
#984
I was adding a number of new things into 3.6.2 which could help to avoid having to do all this, but this of course is too late if you're not using 3.6.2.

These new things include:
- ListBox can fill any range of save slots.
- Can read date/time from a save slot.
- Can move save slots.
etc
#985
You need to iterate autosaves in "circular" manner, going back to the first one after last was already used.
You do not need to change files themselves for this, but simply keep and index of the last (or next) auto save to use. When it reaches last slot, you reset this index to the first slot, and continue from there.

Then, you need to write this last used autosave index in a custom file, and read it back for the next game launch.

That may be enough really.

But, if you like to go further, and also have exact dates, then store these in arrays:
Code: ags
#define MAX_AUTOSAVES 4
#define FIRST_AUTOSAVE_SLOT 96

int NextAutoSaveSlot; // goes from 0 to MAX_AUTOSAVES, and over again
DateTime *AutoSaveTime[MAX_AUTOSAVES];

When you make autosave, the real save slot will be "FIRST_AUTOSAVE_SLOT + NextAutoSaveSlot".
Get DateTime.Now and store in AutoSaveTime[NextAutoSaveSlot].
And advance NextAutoSaveSlot++. If NextAutoSaveSlot is >= MAX_AUTOSAVES, then reset it to 0.

Code: ags
int saveSlot = FIRST_AUTOSAVE_SLOT + NextAutoSaveSlot;
AutoSaveTime[NextAutoSaveSlot] = DateTime.Now;
SaveGameSlot(saveSlot, "description");
NextAutoSaveSlot++;
if (NextAutoSaveSlot >= MAX_AUTOSAVES)
    NextAutoSaveSlot = 0;

Then you have to write this NextAutoSaveSlot index and AutoSaveTime array into the custom file, do that each time after you make autosave, and read it back whenever the game is started: this will restore autosave counter next time the game is launched.




EDIT:

Hmm okay, so if you also want to put description with ever increasing number, then you will need a second counter that just goes up. So the code becomes:

Code: ags
#define MAX_AUTOSAVES 4
#define FIRST_AUTOSAVE_SLOT 96

int NextAutoSaveSlot; // goes from 0 to MAX_AUTOSAVES, and over again
DateTime *AutoSaveTime[MAX_AUTOSAVES];
int AutoSaveIndex = 1;

Code: ags
int saveSlot = FIRST_AUTOSAVE_SLOT + NextAutoSaveSlot;
AutoSaveTime[NextAutoSaveSlot] = DateTime.Now;
SaveGameSlot(saveSlot, String.Format("Autosave %d", AutoSaveIndex));
AutoSaveIndex++;
NextAutoSaveSlot++;
if (NextAutoSaveSlot >= MAX_AUTOSAVES)
    NextAutoSaveSlot = 0;

And you will need to write AutoSaveIndex into the custom file too.
#986
There's a way in 3.6.2 now. But not in previous versions. And unfortunately there's also no way to rename or copy a file directly (I am also adding this to 3.6.2).

This leaves 2 possible solutions:

1. Don't do anything with saves themselves, but instead find out which saves exist and use empty slots.
Create a custom file and write down the list in the order in which these saves has to be presented in your game, using pairs of My Index : Slot Index.
Basically, enumerate these saves not by their actual save slot number, but by their index order in your custom list.
You may even store their dates like that, and read these back if you need.

2. Move file by reading and writing their contents:
- File.Open existing slot for reading,
- File.Open destination slot for writing,
- Do File.ReadRawChar / File.WriteRawChar in a loop until reaching EOF.
WARNING: this is going to be much slower than the usual file rename, and then even more slower because you are doing this from AGS Script. So I strongly recommend the first solution.
#987
Which kind of naming seems better:

- TextHorizontalPadding, TextVerticalPadding

or

- TextPaddingHorizontal, TextPaddingVertical

?
#988
Here's a test build (based on 3.6.2 Beta release):
https://cirrus-ci.com/task/6557944643321856

Added following:
- Labels have full TextAlignment selection (includes vertical alignment)
- Buttons have WrapText property
- Buttons have TextHorizontalPadding and TextVerticalPadding properties.
#989
Quote from: Khris on Wed 09/10/2024 18:06:21Edit: found the other topic; the error was just as frustrating; maybe the template should default to this being turned off

Note you may add your suggestion in the template's issue tracker here:
https://github.com/dkrey/ags_tumbleweed/issues
#990
Well, I sort of made it:
https://github.com/adventuregamestudio/ags/pull/2547

but this needs more testing.
#991
You really should post a code that you are using, because it may matter whether you are reacting to keys in on_key_press or in repeatedly_* function using IsKeyPressed.

But in general, if all you want is to treat two keys as same action, then it is solved simply by a combined condition, for example:
Code: ags
if (key == eKeyW || key == eKeyUpArrow)
{
}
or
Code: ags
if (IsKeyPressed(eKeyW) || IsKeyPressed(eKeyUpArrow))
{
}

However, it is worth noting, that WASD is not present as a convenient combo on all keyboards, e.g. French AZERTY keyboards have a different layout.
https://en.wikipedia.org/wiki/AZERTY#/media/File:KB_France.svg

For that reason, it's advised to make reconfigurable key controls in your game.

This may be done e.g. by storing selected key codes in variables like LeftArrowKey, RightArrowKey, and so on, and then use these variables when testing a key in script.
#992
I suppose this could be done.
I'd probably add a gui control flag which tells whether wrap text or not for backwards compatibility, and in case someone wants strictly non-wrapped text (e.g. if they worry that it gets unexpectedly wrapped after translation).
#993
You need to disable following code:

Code: ags
  // Inventory GUI:
  if (interface_inv == null)
  {
    // pass
  }
  else if (interface_inv.Visible && check_hide_distance(mouse.y))
  {
    interface_inv.Visible = false;
  }
  else if (!IsGamePaused() && !interface_inv.Visible && check_show_distance(mouse.y))
  {
    // make visible when the game is not paused and the cursor is within the popup position
    interface_inv.Visible = true;
  }
#994
Since documentation for this version is not ready yet, following are declarations of new enums, to make it easier to learn them:

Code: ags
enum RenderLayer
{
  eRenderLayerNone      = 0x00000000,
  eRenderLayerEngine    = 0x00000001,
  eRenderLayerCursor    = 0x00000002,
  eRenderLayerUI        = 0x00000004,
  eRenderLayerRoom      = 0x00000008,
  eRenderLayerAll       = 0xFFFFFFFF
};

enum FileSortStyle
{
  eFileSort_None = 0,
  eFileSort_Name = 1,
  eFileSort_Time = 2
};

enum SortDirection
{
  eSortNoDirection = 0,
  eSortAscending   = 1,
  eSortDescending  = 2
};

Examples:
Code: ags
DynamicSprite* screenshot = DynamicSprite.CreateFromScreenShot(Screen.Width, Screen.Height, eRenderLayerRoom);
Will make a screenshot that only has room viewport(s) on it, but no GUI or else.



EngineValueID are identifiers of value returned by two functions:
Code: ags
int System.GetEngineInteger(EngineValueID value, optional int index = 0);
String System.GetEngineString(EngineValueID value, optional int index = 0);
These are meant primarily for testing and diagnostic purposes, for example, if you like to display current engine state on screen during game tests.

The enum itself is declared as:
Code: ags
// Engine value constant name pattern:
// ENGINE_VALUE_<I,II,S,SI>_NAME, where
//   I - integer, II - indexed integer, S - string, SI - indexed string.
enum EngineValueID
{
  ENGINE_VALUE_UNDEFINED = 0,            // formality...
  ENGINE_VALUE_SI_VALUENAME,             // get engine value's own name, by its index
  ENGINE_VALUE_S_ENGINE_NAME,
  ENGINE_VALUE_S_ENGINE_VERSION,         // N.N.N.N (with an optional custom tag)
  ENGINE_VALUE_S_ENGINE_VERSION_FULL,    // full, with bitness, endianess and any tag list
  ENGINE_VALUE_S_DISPLAY_MODE_STR,
  ENGINE_VALUE_S_GFXRENDERER,
  ENGINE_VALUE_S_GFXFILTER,
  ENGINE_VALUE_I_SPRCACHE_MAXNORMAL,   // sprite cache capacity limit (in KB)
  ENGINE_VALUE_I_SPRCACHE_NORMAL,  // sprite cache capacity filled (in KB)
  ENGINE_VALUE_I_SPRCACHE_LOCKED,  // amount of locked sprites (in KB)
  ENGINE_VALUE_I_SPRCACHE_EXTERNAL, // amount of external sprites, that means dynamic sprites (in KB)
  ENGINE_VALUE_I_TEXCACHE_MAXNORMAL,   // texture cache capacity limit (in KB)
  ENGINE_VALUE_I_TEXCACHE_NORMAL,  // texture cache capacity filled (in KB)
  ENGINE_VALUE_I_FPS_MAX,    // max fps, this is set by SetGameSpeed
  ENGINE_VALUE_I_FPS,      // real average fps (updates along with the game run)
  ENGINE_VALUE_LAST                      // in case user wants to iterate them
};

Example of use:
Code: ags
int spritecachemax = System.GetEngineInteger(ENGINE_VALUE_I_SPRCACHE_MAXNORMAL);
int spritecachecurrent = System.GetEngineInteger(ENGINE_VALUE_I_SPRCACHE_NORMAL);
int spritecachepercent = spritecachecurrent * 100 / spritecachemax;
lblInfo.Text = String.Format("Sprite cache: %d / %d (%d%%)", spritecachecurrent, spritecachemax, spritecachepercent);
#995
Quote from: Khris on Tue 08/10/2024 06:52:33Plus, if the ogv file plays fine in VLC, the issue is with AGS and needs to be fixed there.

AGS uses particular library to decode, if that library does not support certain codec or settings, then it won't be able to play the video properly, or at all. So settings may matter. I do not know the acceptable range of settings though.
#996
AGS 3.6.2 - Beta 6
Full release number: 3.6.2.6

ACHTUNG!
This is a BETA version of AGS 3.6.2.
It's considered relatively stable but is not thoroughly tested yet and also may have planned additions.
Use at your own risk. Please back up any games before opening them in this version of AGS.
New settings in this version may make your project files unusable in previous versions after saving with this version.


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: 20th January 2025

Previous stable version: AGS 3.6.1 P9 forum thread


This release is brought to you by:

- Alan v.Drake (palette fix)
- Crimson Wizard
- edmundito (some fixes)
- eri0o
- rofl0r (couple of compatibility reports & fixes)


What is new in 3.6.2

3.6.2 is planned to be a second minor update to 3.6, focusing mostly on convenience of existing Editor and Engine features, and expanding existing script commands. There's however one bigger change: a support for loading saves from older versions of the game.

Common features:
 - Event handler function are now allowed to be located in any script module.
 - New naming rule for the voice clips: full char name, followed by a number, separated by a dot, e.g. "RogerTheGreat.1234.ogg". The old rule may be enabled again by a switch in "Backwards Compatibility" settings.

Editor:
 - In "Start New Game Wizard" game template selection now displays template's description right in the dialog.
 - "Game statistics" now have Ctrl + F2 shortcut instead of F2.
 - F2 can be used for starting editing names of items in the Project Tree (ones that support that) and folders in the Sprite Manager.
 - Added "Game Speed" property in General Settings.
 - Added "Use old-style voice clip naming rule" property in General Settings, it lets to select whether the game should expect old-style voice clip filenames (4-letter char name followed by number) or the new one (full char name, followed by a number, separated by a dot).
 - Property Grid now displays Custom Properties right in the main properties list for each item that supports them.
 - Added "WrapText", "TextPaddingHorizontal", "TextPaddingVertical" properties to GUI Button.
 - GUI Labels can select full range of Alignment values in their TextAlignment property.
 - Added "TurnWhenFacing" property to Characters.
 - Textual GUI controls can now select "Null Font" as their font: this will prevent any text to be drawn even if one is assigned, and make it have zero size (when it matters).
 - "Events" tab on the Properties Grid now has "ScriptModule" selection, which lets define in which module should the related script functions be generated and looked for. The GUI Controls use a ScriptModule set in their parent GUI, and Room events always has a fixed room script selected.
 - Added "Open Recent" submenu in the File menu.
 - Sync script editor's commands in Edit menu with the context menu.
 - Added "Toggle Line Comment" command to Edit menu for scripts.
 - More panes in the Editor are DPI-aware (rescale well with the system font scaling).
 - Editor tabs now display icons indicating their contents (may be disabled in Editor Preferences).
 - Room panel tabs now display room names.
 - Editor will now remember certain window states: "Sprite selector" window and splitter position, splitter position in "Sprite manager".
 - Support reordering folders in Project Explorer with drag & drop.
 - Support importing plain script files: ash, asc or both, - besides script modules (*.scm).
 - On "Color Finder" pane also display actual RGB values that the engine will use. They may be different from requested RGB, because historically engine limits drawing color's RGB precision to 16-bit.
 - Font's "SourceFilename" and "Font Size" properties now have buttons that let import another font file, or reimport same font with different size respectively, instead of clicking on a button on the preview window.
 - Global Variables panel now allows to declare arrays.
 - Added "Controls transparency" slider to GUI edit pane.
 - Copy, paste and delete commands now apply to all the selected GUI controls in GUI editor.
 - When pasting a copied GUI control, Locked property of a new control will be turned off.
 - Support editing group properties for selected GUI controls.
 - Added a multiline Text edit window for Button and Label controls, that may be called by Ctrl+E, from context menu, or by pressing "..." button of the Text property in the Properties grid.
 - Support reordering folders in Sprite Manager with drag & drop.
 - Support importing 32-bit BMP files of extended formats (this support is formal at the moment, and does not guarantee that any of the extended data will be interpreted).
 - Support importing indexed images which palettes contain translucent alpha as sprites with alpha.
 - Support importing 1-bit (monochrome) and 4-bit images as sprites, room backgrounds and masks (converted to 8-bit).
 - Support importing indexed PNGs as room backgrounds and masks.
 - Do not alter or clamp palette for 8-bit sprites imported in a 16/32-bit game.
 - Removed obsolete "Copy walkable area mask to regions" command from the Room editor.
 - Improved scrolling of drop-down lists in the Room's navigation bar: made scroll buttons larger, and support mouse wheel.
 - In Room Editor, during any area drawing mode Ctrl + LMB now works as area picker regardless of the currently selected tool.
 - Do not delete previously built game exe from Compiled/Windows folder when testing a game from the editor.
 - Editor will now report any missing script functions that are assigned to events, but not present in script, as warnings when compiling the game.
 - Editor will now report any script functions that *look like* event functions, but not assigned to corresponding events, as warnings when compiling the game.
 - Added "/maketemplate" command-line option that tells Editor to run, make template out of the said game, and quit.
 - Fixed Editor refusing to open a project if one or more of the sections are missing in the file.
 - Fixed dragging an item into the folder in Project Explorer could move it into a wrong folder if the folders have similar names only different in letter case.
 - Fixed importing indexed PNG as a sprite, previously Editor would mistakenly treat the source image as 32-bit.
 - Fixed importing 8-bit BMP sprites with no "Remap palette" and "Leave As Is" as a transparency option would still remap palette index 0 to the first found palette entry with Alpha 0, even if that's a filler entry not used by the image.
 - Fixed exporting room backgrounds was always writing a 32-bit image rather than using actual background's color depth.
 - Fixed Button getting resized to the image's size when user cancels different sprite assignment.
 - Fixed "Color Finder" and color properties were mapping a color number to RGB values with accuracy mistakes, resulting in slightly different values than the engine would use.
 - Fixed an unhandled exception occuring when rebuilding rooms if any script's header is missing.
 - Fixed a "unterminated string" error in Dialogs was not pointing to the actual error location.
 - Fixed double warning message when trying to close the Editor while a game test is running.
 - Fixed Editor may display a "save project" confirmation when run with "/compile" command-line parameter.

Scripting:
 - Dynamic arrays now have Length readonly property that returns their number of elements.
 - Support zero-length dynamic arrays. This may be useful if you need to have a dynamic array with no elements, but don't want to bother about checking a null pointer.

Script API:
 - Added eNullFont constant that lets assign or pass a "null font" to any property or function parameter which expects a font's ID. This "null font" will simply make any text not drawn and have no actual measurements (size, spacing, etc).
 - Added global events: eEventDialogStart, eEventDialogStop, eEventDialogRun, eEventDialogOptionsOpen, eEventDialogOptionsClose (these are handled in "on_event").
 - Events eEventGUIMouseDown and eEventGUIMouseUp now get additional parameters: mouse button, mouse x and y positions (relative to the exact GUI).
 - Expanded "on_mouse_click" callback, now supports two more parameters: click x,y coordinates.
 - Added RestoredSaveInfo struct which contains information about game save's contents,
 - Support "validate_restored_save" callback, which lets user to validate restored saves with mismatching data and request cancellation or continuation of restoring this save.
 - Added Button.WrapText, TextPaddingHorizontal, TextPaddingVertical.
 - Added Character.Following property that returns another Character that this one follows after.
 - Added Character.TurnWhenFacing property.
 - Added Character.MoveStraight() complementing WalkStraight().
 - Added DateTime.CreateFromDate() and CreateFromRawTime().
 - Added static Dialog.CurrentDialog property and non-static ExecutedOption and AreOptionsDisplayed properties.
 - Added RenderLayer enum, and optional "layers" parameter to DynamicSprite.CreateFromScreenShot(), that tells which of the game's render layers to capture when making a screenshot.
 - Added File.Copy() and File.Rename().
 - Added FileSortStyle and SortDirection enum, and File.GetFiles() function that returns a dynamic array of filenames found using certain pattern, and optionally sorted by name or time, in ascending or descending order.
 - Added File.GetFileTime() that returns file's modification time.
 - Added Added File.ReadFloat(), WriteFloat(), ReadRawFloat(), WriteRawFloat(), ReadRawBytes() and WriteRawBytes().
 - Added SaveGameSortStyle enum and Game.GetSaveSlots() function that returns a dynamic array of save slot indexes, optionally sorted in certain way.
 - Added Game.GetSaveSlotTime() that returns a time this save slot was last written.
 - Added Game.ScanSaveSlots() that scans a range of game saves and tests them for compatibility, using "validate_restored_save" too if it's present in user script. This action is not run immediately, but is scheduled to be executed after current script ends. It reports of scanning completion by sending eEventSavesScanComplete event.
 - Label.TextAlignment has now type Alignment, rather than HorizontalAlignment, and has full alignment range (both horizontal and vertical).
 - Added optional "fileSortStyle" and "sortDirection" parameters to ListBox.FillDirList().
 - Added optional save slot range (min/max), saveSortStyle and sortDirection parameters to ListBox.FillSaveGameList(). This lets to define the exact range of saves it should fill, and order them in desired way.
 - Added ListBox.FillSaveGameSlots(), which initializes a list of saves from a dynamic array of save slot indexes.
 - Added Object.DestinationX and DestinationY properties, complementing ones in Character.
 - Added Overlay.SetPosition() and SetSize() functions for convenience.
 - Added Speech.SpeakingCharacter that returns currently speaking character (for blocking speech).
 - Added GetTimerPos() that returns timer's position (remaining time), in ticks.
 - Added CopySaveSlot() and MoveSaveSlot(), which moves existing save to another slot.
 - Added optional save slot range (min/max) parameters to RestoreGameDialog() and SaveGameDialog().
 - Added optional "sprite" parameter to SaveGameSlot(), that lets to pass a number of an arbitrary sprite to write into this save instead of a standard "screenshot".
 - Added SendEvent() function that allows to trigger "on_event" function calls in script. Special event value eEventUserEvent may be used as a base index for user-defined events.
 - Added System.DisplayFPS property that toggles FPS counter (a replacement to Debug(4, 1)).
 - Added System.GetEngineInteger() and System.GetEngineString() for returning diagnostic information about engine's runtime state. Possible arguments are defined by EngineValueID enum.
 - Added new game-wide option OPT_SAVEGAMESCREENSHOTLAYER that lets to define which of the game's render layers will be captured when making a standard screenshot for the save game.
 - Add SaveComponentSelection enum and game option OPT_SAVECOMPONENTSIGNORE, which lets to skip certain components when saving or restoring a game. This has dual purpose: reduce number of things in game that may break older saves by simply not having them in a save, and also reducing the size of game saves on disk (e.g. in case of dynamic sprites). Note that all things that were not restored from the save will retain their *current state*.
 - Fixed some script functions in AGS API were declared with "int" return value, while they are supposed to be "void".

Engine:
 - Updated to SDL 2.30.11 and SDL_Sound 2.0.4.
 - Engine now potentially supports reading saves made in older game versions with different content, so long as these saves have *less* data in any given type (i.e. less Characters, or less controls on a certain GUI, or less variables in script, and so forth).
   This feature is enabled by having a special "validate_restored_save" function anywhere in the game script, that accepts an argument of type RestoredSaveInfo. RestoredSaveInfo contains various information about the restored save, and "Cancel" property, that must be explicitly set to "false" in script in order to allow to restore such save.
 - Engine supports returning to previously saved rooms which have less script data.
   It's important to remember though that it does no validation of restored room state on its own.
 - Dropped support for pre-3.5.0 game saves.
 - Increased the cap of simultaneously loaded scripts to 1024 (this includes all regular script modules, a single active dialog script, and a single active room script).
 - Engine no longer quits with error in case a script function assigned to a Room event is missing. Logs warnings about missing script functions assigned to any events.
 - Character.FollowCharacter() can now have a distance parameter up to 32766 (was limited to 255).
 - Ensure that Character.Speaking returns true when a speech is playing even if the character has no speech view.
 - DynamicSprite.CreateFromFile() may now load 1-bit and 4-bit bitmaps, converting to 8-bit.
 - Do not alter or clamp palette for 8-bit sprites loaded into a 16/32-bit game at runtime.
 - Assigning InventoryItem.Graphic will no longer reassign CursorGraphic too even if they were identical previously.
 - Calling DeleteSaveSlot() on a slot within 0-50 range will no longer secretly move a save with the topmost number (within the same range) to fill the emptied slot. If you still like to recreate this behavior, then use MoveSaveSlot() command.
 - Support calling StopDialog() inside any regular script and dialog script, and also while dialog options are displayed. That will schedule dialog's stop to be performed after current script finishes.
 - Removed arbitrary limit of 2k bytes for the result of String.Format().
 - Ensure that the objects with identical z-order (baseline) always keep same relative sort order when being drawn (note: engine does not guarantee predefined order, only determenistic one).
 - Implemented video buffering on a separate thread. Allow to drop late video frames.
 - Added new accessibility config settings in "access" section: "speechskip", "textskip", "textreadspeed". These let player to override game's skipping style for character speech and text messages, and text reading speed parameter that controls speech timing.
 - Added "max_save" config option in "override" section: this lets to enforce an arbitrary number of saves displayed in a standard save/restore dialogs in game.
 - Added "--no-plugins" command-line argument that denies loading any plugins; also added respective config option "noplugins" in "override" section.
 - Fixed character may get stuck inside a non-walkable area after Character.WalkStraight().
 - Fixed calling Dialog.Start() inside a dialog script would create a nested "dialog state", which could eventually lead to internal mistakes and program stack overflow. Dialog.Start() will now schedule a proper dialog topic switch, equivalent to "goto-dialog" command.
 - Fixed calling Character.Animate() during idling state could cause incorrect error, reporting invalid animation loop.
 - Fixed inventory cursor's crosshair hotspot was drawn incorrectly if active item's sprite has a alpha channel.
 - Fixed displaying room masks with Debug command in legacy "upscale" mode.
 - Fixed a potential lockup that may occur when the engine is run from the editor, and is told to stop at a breakpoint.
 - Fixed 48khz OGG clips may have extra silence added to them in the end, causing "hickups" when the sound playback is looped.

Engine Plugin API:
 - Added IAGSEngine.CreateDynamicArray(), which lets plugins to create dynamic arrays.
 - Added IAGSEngine.GetDynamicArrayLength() and IAGSEngine.GetDynamicArraySize(), which tell the passed array object's number of elements, and total size in bytes respectively.
 - Added IAGSEngine.Log(), which lets plugins to print using engine's log system.

Compatibility:
 - Fixed loading of games made in AGS 2.55-56 which include plugins.
 - Fixed loading of rare games made with AGS 2.5 or higher, which contained deprecated "room animations" (animations themselves are currently not functional).
 - Fixed old pathfinder imprecision affecting few pre-3.0 games.
 - Allow pre-2.7 games to have RestartGame() command be followed and overridden by a NewRoom(). This is necessary for some older games to be able to proceed.

Windows:
 - Windows version of AGS is now built with MSVS 2019 and higher.

WinSetup:
 - Redesigned winsetup into a tabbed dialog.
 - Added "Reset To Defaults" button that resets all options to values from the game's default config file.
 - Added "Accessibility" settings for skipping speech and text messages, for text reading speed.
 - In "disabled" section of config "access_skipstyle" setting lets disable all options in setup related to the speech and text skipping.
#997
Quote from: lafouine88 on Mon 07/10/2024 15:48:57I remember one advice from Khris I think who said that most of the time there is a better way than to use 'repeatedly execute' to save RAM.

Using "repeatedly execute" on its own has nothing to do with RAM. RAM is memory, it's used by creating new sprites and objects. Maybe you mean CPU load?

Quote from: lafouine88 on Mon 07/10/2024 15:48:57The advantage of the previous method was that once it was calculated it's done (and you don't need to take into account limbs ordre of appearance according to current frame for instance).

Setting new graphics to the view frames needs to be done only once the player wears the item.

Setting the current loop, current frame to sync with the main body has to be done in rep-exec.

Right, I forgot about sorting order.
There has to be some way to make it work, like have arrays that tell relative z-order of each body part per frame in animation. You likely will need only 1 array per limb per loop (direction). Then in rep-exec you will have to adjust N body parts similar to this:

Code: ags
function late_repeatedly_execute_always()
{
    cLeftArm.Loop = player.Loop;
    cLeftArm.Frame = player.Frame;
    cLeftArm.Baseline = player.Baseline + RelativeOrder[ ... ];
    cRightArm.Loop = player.Loop;
    cRightArm.Frame = player.Frame;
    cRightArm.Baseline = player.Baseline + RelativeOrder[ ... ];
    ..... and so on
}

This should not affect game speed much.

Then, if sorting order remains same throughout animation, then it may be set only once a loop (direction) changes.
#998
Quote from: lafouine88 on Mon 07/10/2024 15:11:52One thing though, "late_repeatedly execute" doesn't work for me. I had to put in in "repeatedly execute" to see the dummy characters actually follow the animation. ???

It's "late_repeatedly_execute_always":
https://adventuregamestudio.github.io/ags-manual/RepExec.html
#999
My suggestion is to combine a character of several objects, like characters, that follow the main body part, have each their own View, and switch their current Loop and Frame to match the main body in late-rep-exec-always. Then you won't have to create DynamicSprites for this, or redraw anything at all, but simply change Frame Graphic properties in the respective part's View. That solution will be faster, and require less memory too.
#1000
There's an idea to replace timer functions completely with something similar to this module:
https://www.adventuregamestudio.co.uk/forums/modules-plugins-tools/module-timer-0-9-0-alternate-variant/

Following is the ticket opened for this task:
https://github.com/adventuregamestudio/ags/issues/1958


But, while this is not worked on yet, I suppose adding one small function, that does not require any extra data, to the existing API won't hurt... and old api will get deprecated altogether eventually.

EDIT: except, I would not use exactly "GetTimer" name, as that sounds like getting a Timer object.

EDIT2: oh, I see, it is suggested as "GetTimer" because there's "SetTimer"....
SMF spam blocked by CleanTalk