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

#941
Quote from: Khris on Wed 23/10/2024 10:46:45It's this one: https://drive.google.com/file/d/19uyh4VBjeMkhg-oNX2RC-STsw7IGG9Bl/view?usp=drive_link

This is likely a culprit:

Code: ags
void noloopcheck dialog_options_mouse_click(DialogOptionsRenderingInfo *info, MouseButton button) {
  if (button == eMouseLeft) {
    if (_mouseOverUpArrow && _showUpArrow) {
      while (mouse.IsButtonDown(eMouseLeft)) {} // <--------------------------------------
      _scrolledDown--;
    }
    if (_mouseOverDownArrow && _showDownArrow) {
      while (mouse.IsButtonDown(eMouseLeft)) {} // <--------------------------------------
      _scrolledDown++;
    }
  }

  <...>
}

void noloopcheck dialog_options_key_press(DialogOptionsRenderingInfo *info, eKeyCode keycode, int mod) {
  if (_keyboardScrolling && keycode == eKeyUpArrow && _showUpArrow) {
    while (IsKeyPressed(eKeyUpArrow)) {} // <--------------------------------------
    _scrolledDown--;
    return;
  }
  if (_keyboardScrolling && keycode == eKeyDownArrow && _showDownArrow) {
    while (IsKeyPressed(eKeyDownArrow)) {} // <--------------------------------------
    _scrolledDown++;
    return;
  }

  <...>
}


The problem is that engine does not guarantee updates of mouse or key states unless control is passed back to it. So empty loops like that are not reliable.
I would even say that this should not work.
Frankly, I'm not sure how it works on desktop systems, maybe by accident... Like, maybe the buttons are no longer pressed anymore when the script enters these lines. Probably it works bit differently on Web version.


EDIT:
roflmao... just like I knew it, this is a comment from the engine code inside IsKeyPressed:
Code: cpp

    // old input handling: update key state in realtime
    // left only in case if necessary for some ancient game, but
    // this really may only be required if there's a key waiting loop in
    // script without Wait(1) to let engine poll events in a natural way.
    if (game.options[OPT_KEYHANDLEAPI] == 0)
        SDL_PumpEvents();

Mouse.IsButtonDown does not have this.
#942
Quote from: eri0o on Wed 23/10/2024 03:05:01Unfortunately, I am having an error much earlier, in Step 6, I started the conversation with the hanging man, but as I understand to do step 7 I need to click to scroll the dialogs to get to the sixth option, but unfortunately clicking on the scroll hangs the game.

That's what Giacomo also mentioned in his last post. You need to use mouse wheel to scroll and get to the crash.
#943
Quote from: Giacomo on Mon 21/10/2024 08:47:07Anyway, I contacted Khris for another problem with the web version of the game. It seems to concern with his Scrolling Dialogs module:
when I press on arrow buttons, the game crashes and he said that it seems to be stacking in a loop. Scrolling with the mouse trough the dialogue options works fine instead.

Hmm, yes, it happens immediately when you click on a scroll button. Although there's no crash it seems, only game update hangs forever for some reason.
Usually this is an indication of script running in an endless loop, or engine doing the same.

Can you tell where I can get this module, or is it exclusively made for your game?
I see this one:
https://www.adventuregamestudio.co.uk/forums/modules-plugins-tools/module-scrollingdialog-v3-0-updated-27-january-2016/
but it's made by monkey0506, not Khris.
#944
Quote from: Salamdandersad on Mon 21/10/2024 20:57:49How can I integrate Game.GetSaveSlotDescription into the code then?

Simply replacing one function with another:

Code: ags
    // Verifica si existe un archivo de guardado en el slot 1
    if (Game.GetSaveSlotDescription(1) != null) // Cambiado para verificar la existencia del archivo
    {
        RestoreGameSlot(1); // Cambiado a RestoreGameSlot
        // Oculta el menú de inicio después de cargar el juego
        gGui1.Visible = false; // Opcional: si quieres ocultar el menú de inicio al cargar
    }
    else
    {
        Display("No hay juego guardado en slot 1.");
    }
#945
Quote from: Salamdandersad on Mon 21/10/2024 17:37:35if (File.Exists("savegame1.sav")) // Cambiado para verificar la existencia del archivo

That is NOT how AGS save files are called, and not how save directory is accessed, and in general that's not how you test for the save's existance.


First of all, about correct code, the existing method for testing is trying to get save's description. If it returns "null", then the save does not exist:
https://adventuregamestudio.github.io/ags-manual/Game.html#gamegetsaveslotdescription
Code: ags
    if (Game.GetSaveSlotDescription(1) != null)


Now, why your code did not work:
1. AGS saves are called "agssave.NNN", not "savegameN.sav". Save slot 1 would be: "agssave.001"
2. In order to access save files directly you would need to tell AGS to check save directory like "$SAVEGAMEDIR$/agssave.001".
More info on file locations may be found here: https://adventuregamestudio.github.io/ags-manual/File.html#fileopen

But I don't recommend doing that, because that will rely on engine using disk files. If it happens that some engine port on another system will use different kind of save system, then this method will likely fail. So using Game.GetSaveSlotDescription method would be best.
#946
The built-in idle settings are meant to be set once, and then let engine to handle them automatically, and independently for each character.

If you need something more complicated, and especially if you need multiple characters to depend on each other, then it may be easier to write your own system in script.

I don't know if the characters in question are playable or NPCs. If these are standing NPCs, meaning they don't move, then scripting idling for them is mostly a matter of adding a "time" parameter and reducing it down in rep-exec-always, or similar.

A good way to "attach" values to characters is Custom Properties: these may be both read and set in script.
https://adventuregamestudio.github.io/ags-manual/CustomProperties.html

Another possible approach is to use timers. AGS own timers are limited, but there's this timer module, for example: https://www.adventuregamestudio.co.uk/forums/modules-plugins-tools/module-timer-0-9-0-alternate-variant/

If these characters may walk or do something that would reset "idle counter", then situation becomes bit more complicated, as you also will have to detect these actions and reset the counter. But I won't expand on this before I know specifics (I don't know if that's necessary).


QuoteIs there an easy way to tell what chars in a room? Like an 'occupant' array in the room struct?

Unless you script your own array, the only way is to iterate all characters using "character[]" array in a loop (the number of characters may be learnt using Game.CharacterCount), and check their Room property.
https://adventuregamestudio.github.io/ags-manual/Character.html#characterroom
#947
I can confirm that error reproduces 100% following the steps under the "spoiler".
(i've been running on local server, so it's not related to where the game is, alright.)

Something that bugs me, why is ags.js written as a single line? Lol. This makes it extra difficult to understand the callstack, because there are several calls to "ags.js:1".
Is there a way to regenerate ags.js with proper line indentation, at least for debugging purposes?

I also wish that viewing ags.wasm in browser displayed comments around functions to let know which original engine function this relates too... No idea if that's possible at all.

EDIT: @Giacomo, somehow nobody asked before, but which version of AGS did you make this game with?
judging by some lines in ags.wasm, it is 3.6.0.52, is that correct?
#948
Quote from: eri0o on Mon 21/10/2024 04:06:41OK, came up with a really ugly solution that works. I discovered I can get the address of the current struct using String.Format("%p", this) in the Init method, so I do it and note down in the emitter address property. This works even if the struct is not managed!

This will also likely break on save reload, because there's no guarantee that memory address of a object will be the same next time. So this has to be fully reinitialized upon a save restore too (in on_event).


EDIT: hmm, this may accidentally work so long as Emitter instance is a global script variable, because currently script's data arrays are normally not getting reallocated on save restore, so anything in global script data may happen to retain its address between reloads. The memory layout may be different next time a game is launched.

Then, if we take AGS 4, it already allows to have nested structs of any combination, and dynamic arrays of regular structs.
This means that Emitter, not being a managed struct, still may be a part of managed object, and gets removed and recreated in mem on restoring a save.

Anyway, this is just a analysis of possible situations, TLDR is that this value must be treated as invalid after restoring a save.

EDIT2: hmm, speaking of dynamic objects, note that if Emitter instance is a part of a managed struct or dynamic array, then it may be deleted (also, accidentally a new emitter may get same address as a previously deleted one). So there has to be a "Dispose" method which removes Emitter from this set too.
#949
As Snarky have mentioned above: you need to manually set object's Baseline property.
Either do this in the Object's properties in the room editor (set BaselineOverridden first), or in script using a script command:
https://adventuregamestudio.github.io/ags-manual/Object.html#objectbaseline

#950
Giacomo could not make a post for some reason (forum problem), so he sent me these callstacks via PM:

Looking at the length of the first callstack, can this be a stack overflow because of a recursion?

ERROR 1
Spoiler
Aborted(RuntimeError: unreachable executed) localhost:8080:1:12484
    printErr http://localhost:8080/:1
    abort http://localhost:8080/ags.js:1
    runAndAbortIfError http://localhost:8080/ags.js:1
    maybeStopUnwind http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    doRewind http://localhost:8080/ags.js:1
    handleSleep http://localhost:8080/ags.js:1
    callUserCallback http://localhost:8080/ags.js:1
    safeSetTimeout http://localhost:8080/ags.js:1
    (Asinc.: setTimeout handler)
    safeSetTimeout http://localhost:8080/ags.js:1
    _emscripten_sleep http://localhost:8080/ags.js:1
    handleSleep http://localhost:8080/ags.js:1
    _emscripten_sleep http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:3127678
    <anonima> http://localhost:8080/ags.wasm:6290554
    <anonima> http://localhost:8080/ags.wasm:1474006
    <anonima> http://localhost:8080/ags.wasm:673255
    <anonima> http://localhost:8080/ags.wasm:5888127
    <anonima> http://localhost:8080/ags.wasm:6718508
    <anonima> http://localhost:8080/ags.wasm:5888349
    <anonima> http://localhost:8080/ags.wasm:2433407
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:228403
    <anonima> http://localhost:8080/ags.wasm:396044
    <anonima> http://localhost:8080/ags.wasm:412727
    <anonima> http://localhost:8080/ags.wasm:401156
    <anonima> http://localhost:8080/ags.wasm:692903
    <anonima> http://localhost:8080/ags.wasm:1247968
    <anonima> http://localhost:8080/ags.wasm:555818
    <anonima> http://localhost:8080/ags.wasm:5992611
    <anonima> http://localhost:8080/ags.wasm:2486394
    <anonima> http://localhost:8080/ags.wasm:2079011
    <anonima> http://localhost:8080/ags.wasm:2073672
    <anonima> http://localhost:8080/ags.wasm:2083564
    <anonima> http://localhost:8080/ags.wasm:6541308
    <anonima> http://localhost:8080/ags.wasm:2852711
    x http://localhost:8080/ags.js:1
    invoke_iiiii http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:204605
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174127
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:2381559
    <anonima> http://localhost:8080/ags.wasm:6174598
    <anonima> http://localhost:8080/ags.wasm:2557198
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:2378943
    <anonima> http://localhost:8080/ags.wasm:6540280
    <anonima> http://localhost:8080/ags.wasm:2853185
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4876650
    <anonima> http://localhost:8080/ags.wasm:6541119
    <anonima> http://localhost:8080/ags.wasm:1416519
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:205172
    <anonima> http://localhost:8080/ags.wasm:839132
    <anonima> http://localhost:8080/ags.wasm:6540085
    <anonima> http://localhost:8080/ags.wasm:2852711
    x http://localhost:8080/ags.js:1
    invoke_iiiii http://localhost:8080/ags.js:1
    <anonima> http://localhost:8080/ags.wasm:4877443
    <anonima> http://localhost:8080/ags.wasm:6541119
[close]

ERROR 2
Spoiler
Uncaught RuntimeError: Aborted(RuntimeError: unreachable executed). Build with -sASSERTIONS for more info.
    abort http://localhost:8080/ags.js:1
    runAndAbortIfError http://localhost:8080/ags.js:1
    maybeStopUnwind http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    doRewind http://localhost:8080/ags.js:1
    handleSleep http://localhost:8080/ags.js:1
    callUserCallback http://localhost:8080/ags.js:1
    safeSetTimeout http://localhost:8080/ags.js:1
    setTimeout handler*safeSetTimeout http://localhost:8080/ags.js:1
    _emscripten_sleep http://localhost:8080/ags.js:1
    handleSleep http://localhost:8080/ags.js:1
    _emscripten_sleep http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_iiiii http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_vi http://localhost:8080/ags.js:1
    x http://localhost:8080/ags.js:1
    invoke_v http://localhost:8080/ags.js:1
    ags.js:1:8009
[close]



#951
@Giacomo could you copy-paste the contents of errors panel here (or save to a text file and upload)?
I mean the errors panel that you show in that video.

Quote from: Giacomo on Fri 18/10/2024 21:04:44P.S. I have a question regarding android and the conversion of right/left click into taps, can I post it on beginner's tech questions?

Sure, I think.
#952
Sorry, following is not directly related to your problem, but I wanted to mention this, seeing as you use dialog numbers in many places: usually you can use Dialog variables (pointers) instead:

Code: ags
    //if(dialogNumber == 0) dialog[33].SetOptionState(w ,eOptionOn); >>>>
    if(dialogNumber == 0) dWhatIsDialogName.SetOptionState(w ,eOptionOn);

And then, if you need to pass dialog number into another function, you may do either this:
Code: ags
//_ominoDialoghiCanc(33); >>>>
_ominoDialoghiCanc(dWhatIsDialogName.ID);

Or you may rewrite the function to use Dialog pointer instead of its number:
Code: ags
function _ominoDialoghiCanc(Dialog* dlg) //reset options of the choosen dialogue
{
  for(int o = 1; o <= dlg.OptionCount; o++)
  {
    if(dlg.GetOptionState(o) == eOptionOn) dlg.SetOptionState(o, eOptionOff);
  }
}
then you may call it like
Code: ags
_ominoDialoghiCanc(dWhatIsDialogName);


This overall makes the script more readable, and less prone to accidental mistakes.
#953
Quote from: Dave Gilbert on Thu 17/10/2024 13:15:59Will the 3.6.2 features be rolled into 3.4?

Naturally, AGS 4 will contain everything from previous versions, except old deprecated features.
#954
I was only able to confirm the problem, and found an old mail-list entry about a very similar error in Theora decoding:
https://ffmpeg.org/pipermail/libav-user/2011-June/000212.html

From my understanding, it goes down into libogg (OGG reading library). It's not likely that anything in the engine code itself is causing this, but libogg skips certain data packets for some reason.
... OR our code that uses libogg does not react and handle specific result.

But I never used libogg library myself, so cannot tell yet.

I still have a backup variant of comparing with VLC code, but I will need more time to figure out how to read it and what to compare...
#955
I would also very much like to hear what would be the preferred engine's behavior. In your question you said

QuoteIs there a way to check if a savefile is compatible BEFORE it loads and inevitably crashes? That way I can just display a "Demo savefile not compatible with the retail version Old Skies." message and the game won't crash.

Do you suggest a behavior that preloads some data from a save, displays that it is not compatible, and then proceeds from the point where it has been before player clicked on "Load"?

Because that's not possible currently, and it is not immediately clear how this may be achieved. If that's a desired behavior, then it has to be discussed and preplanned.
#956
Quote from: Dave Gilbert on Wed 16/10/2024 18:54:42A new save directory is probably the right move, in the meantime.

I added this a bit later to my reply, but you also may change save file extension, this may prevent a case when user copies old save to the new folder too.
#957
I've opened a forum thread for the solution that I'm currently trying out:
https://www.adventuregamestudio.co.uk/forums/engine-development/load-older-game-saves-into-updated-game-attempt-2/
As been said, this is meant to be added to 3.6.2.

Unfortunately, there have been near zero feedback, and, it looks like nobody tried whether it does what is wanted from such feature.

Other than that
- Change save folder name, and/or
- Change save file extension (this adds a postfix to the save file names)
may cut off older saves from being used in your game. This may be done in General Settings -> Saved Games category.
#959
Quote from: Dave Gilbert on Wed 16/10/2024 00:08:45These are all amazing new features! Since I'm nearing the end of my current project I probably won't upgrade to this, but next time for sure.

I actually recommend trying out AGS 4 for the new projects instead:
https://www.adventuregamestudio.co.uk/forums/ags-engine-editor-releases/ags-4-0-early-alpha-for-public-test/

It has much more new things, improvements to scripting language, few big features that you've been asking for in the past, such as rooms saved as multiple files (images and data separate) and inspecting script variables during game test.

And frankly we need more people checking it out, to speed up polishing process.
#960
It's wonderful, glad to hear that it worked.

Right, I mentioned that you can only set priority once, but somehow I forgot that character's own baseline is dynamic, so that would not work here. If AGS supported relative zorder in parent->child relation, then things would be simpler, but oh well...
SMF spam blocked by CleanTalk