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

#921
On a topic of adding "user data" to saves, that's not too hard technically, but there's a serious question of usability.

How may such "user data" be used, and what it may be useful for?

First of all, we have to keep in mind that engine, as it is now, cannot allow to run scripts while save is being saved or loaded. Because when writing nothing in the script or game may be accessed when saving (strictly speaking, it may be read but not written, but it's difficult to restrict that if a user script is run so long as a callback can access things), and when restoring a save - the script "executor" is stopped, and things like global script data and game objects may not be reinitialized properly yet.

As a consequence, we cannot let to have script callbacks run during the reading/writing of a save game. We may, optionally, have them run right before the saving and right after the loading of a save.

Technically that's not hard: we just use "memory files". User script can use File API, but it writes/reads a dedicated array in memory. On saving a game this array, if prepared, gets saved along, and when restoring a game, this array is read from a file, and then given to user script to be read.

But there's a question of use case. Since the "read user data" callback may only be run after whole game gets reinitialized, this means that it happens only after save has been restored first, this way or another.

Which in turn means that user script may still stop or restart the game when detecting "wrong" data, or force it to reload a different save, etc, but it cannot prevent the game state to be overwritten by a "wrong" save.

Which brings us to the "test save" idea from my previous post (see above).
If we have that, then, in theory, user could command to test the save first, which would extract only limited amount of data, including user data if one is present, and let user script to scan it and remember if this save is okay to load at all.

I am not sure how convenient that would be to script and use though.

I suppose we might have script callbacks for reading and writing user data, something like this:
Code: ags
function read_save_user_data(File* f)
{
}

function write_save_user_data(File* f)
{
}

And furthermore, the previously mentioned "validate" function can also have access to the "memory file" which contains read user data, by having "File* UserData;" inside "RestoredSaveInfo" struct. So when validation is run, either while testing a save, or right after it's been restored, user can check the custom data as well.

To elaborate, what is the advantage of separate "user data" in comparison with just script variables?
The advantage is that it may be stored separately from scripts, and then tested even if script data from the save was not applied to the current game.
#922
Quote from: Giacomo on Wed 30/10/2024 14:27:40
Code: ags
    if(myDialog.GetOptionState(i) == true) return true;

I'm sorry, but this is not accurate, although might work by coincidence. GetOptionState does not return a boolean, it returns enum:
https://adventuregamestudio.github.io/ags-manual/Dialog.html#dialoggetoptionstate

The correct way of checking would be
Code: ags
if(myDialog.GetOptionState(i) == eOptionOn) return true;
#923
Quote from: Giacomo on Wed 30/10/2024 12:23:31Still I wonder if it's ok in this case to use dAnotherDialog.Start().

This is your game, so it's your decision. Personally, I would not use a function that is known to work incorrectly inside a dialog script, even if it happens to achieve result in this case. And I do not see any real reason to use this function, since there's another variant that works correctly.
#924
Quote from: Giacomo on Wed 30/10/2024 11:19:18Then, inside dAnotherDialog:
Spoiler
Code: ags
@S  // Dialog startup entry point
  haveTalkedTo = true;
return

@1
  dAnotherDialog.SetOptionState(1, eOptionOffForever); //both lines are present in every option
  if(dAnotherDialog.OptionCount == 0) return dMainDialog.ID;
return
[close]
The control goes back to the player and I can't see dMainDialog again.

Your condition here is probably wrong. OptionCount returns the number of total options in a dialog, not number of active options. Since you have 1 (or more?) option in dAnotherDialog, then this condition will always return false.

You need to fix your condition, probably make a custom function that calculates number of active options.
#925
Quote from: Ghostlady on Wed 30/10/2024 02:21:01That is exactly the problem. When I move it over to my large screen in window mode, all is ok. I change to fullscreen, all is ok. When I go back to windowed mode on my large screen, that's where I experience the mouse freeze.  I changed the setting to OpenGL but the problem still existed.

This does not seem like exactly the same problem, as in the previous user case which I knew about it was Direct3D problem, and switching to OpenGL handled the issue. Also, I don't think they had a mouse freeze, they only mentioned window not resizing. The mouse freeze in game could be a result of mouse cursor being not inside the window though (as an example).

To clarify, have you changed to OpenGL in winsetup or in editor's "default setup" pane? What is displayed if you press "Ctrl + Alt + V" in game?

Is it only mouse that is freezed, or whole game; does the game continue to run, animate, etc?



Quote from: Ghostlady on Wed 30/10/2024 02:21:01I also noticed that when I run the game through the AGS Editor I have sound/music but if I select the game exe I have no sound or music. Is there something I need to do.  I remember a "compile" function in the older versions which I don't see anymore.

The command is "Build -> Build EXE", and there's also "Build -> rebuild all files".
Is your audio configured to be packaged inside "In Main Game Data" or "In Audio VOX"? This may be found when you select audio folders.
Do you have audio.vox present in the Compiled/Windows ?
#926
I have merged the separate feature described on post above, which lets to skip certain save component. It seems to work on its own.

At the same time, here's an updated version of the main feature described previously, which lets to load saves with less numbers of things in it. Now based on the latest 3.6.2 Beta release.
PR: https://github.com/adventuregamestudio/ags/pull/2489
Download: https://cirrus-ci.com/task/5944362763288576

To reiterate what it does:
* lets to load saves with less count of game objects, or less size of script data.
* lets to load saves made less script modules, or script modules in different order, identifying scripts by their names. Which allows to restore script variables into a correct module in an updated game.
* in case a save with any of these issues was loaded, it checks if the game script has a function of predefined name called "validate_restored_save". If it does, then the engine will:
   * * reload the game, in order to reset game data to the "clean slate": this is necessary to reset all data to defaults, in case it's not going to be restored from the save;
   * * restore the save once again;
   * * call the "validate_restored_save" callback, which should supply an instruction to whether accept of cancel this save restoration.



This function "validate_restored_save" must have following prototype:

Code: ags
function validate_restored_save(RestoredSaveInfo* saveInfo)
{
    // check saveInfo and decide what to do
}

The declaration of RestoredSaveInfo looks like this:

Code: ags
enum RestoredSaveResult
{
  eRestoredSave_ClearData   = 0x01,
  eRestoredSave_MissingData = 0x08,
  eRestoredSave_ExtraData   = 0x10
};

managed struct RestoredSaveInfo
{
  import attribute bool Cancel;
  import attribute SaveComponentSelection RetryWithoutComponents;
  import readonly attribute RestoredSaveResult Result;
  import readonly attribute String EngineVersion;
  import readonly attribute int AudioClipTypeCount;
  import readonly attribute int CharacterCount;
  import readonly attribute int DialogCount;
  import readonly attribute int GUICount;
  import readonly attribute int GUIControlCount[];
  import readonly attribute int InventoryItemCount;
  import readonly attribute int CursorCount;
  import readonly attribute int ViewCount;
  import readonly attribute int ViewLoopCount[];
  import readonly attribute int ViewFrameCount[];
  import readonly attribute int GlobalScriptDataSize;
  import readonly attribute int ScriptModuleCount;
  import readonly attribute int ScriptModuleDataSize[];
  import readonly attribute int RoomScriptDataSize;
};

These are mostly readonly counts of data found in saves, for user's reference.
But 2 fields are writeable, and may be set in this callback:
* boolean Cancel - if set, then the restoration will be cancelled;
* integer RetryWithoutComponents - if set to a combination of save component flags (see one post above), this will make engine reload this save once again, except skipping certain types of data this time.





Besides the above, something that was requested before was a way to "predict" the incompatible save, by scanning it, but not restoring just yet.
This may be useful if a game developer wants to only test if a save slot, or a range of save slots can be loaded at all or not.
Which in turn may be used to remove "incompatible" slots from a saves list, for example, or reporting a bad save without loading it.

The way I see, there are following potential options that may help with "scanning" a save:
1. Read a save file, but read only minimal amount of data from each component, only data containing object counts and data sizes, used for validity tests. And skip the rest. This must keep the game in a unmodified runnable state, and supposedly should be fast enough.
2. Have these counts grouped and written in either a header, or a extra component together. Engine can skip past everything, search for this component, and read only this "validation" data.
3. Have an optional "user data" component in a save, this may be read during this test, and presented in a script callback.
4. There's a project property called "Version" in general settings; the problem is that it's not written into compiled game. But if it were, and added to saves too, that could serve as an extra way to check if save is compatible.

Another question is how to perform validation if we test a save or a number of saves by command from the script.
Supposedly we may use same callback, perhaps adding a way to know if we have already loaded a save, or just testing.

The problem is that, because of how AGS script works currently, the callback cannot be run from within another script function. In other words it cannot do this:

  - some script function
  --- engine function (e.g. TestSaveSlot(x))
  ------ callback in script

Maybe there's a way to adjust the script runner to let this happen; i cannot tell without investigating this first. Although, I would not want to hack the script vm just for this purpose, I'd rather leave this for the later (and maybe for ags4).

So, the backup option is to schedule this callback to be run after the previous script function ends (similar to ChangeRoom, Dialog.Start etc).

 1. A script command called in script (e.g. TestSaveSlot(x), or TestSaveSlots(from,to), or ListBox.FillSaveGameListButTestFirst(from,to)). This command schedules the test.
 2. After current script function ends, engine performs this scheduled test over a range of save slots.
 3. For each save slot, a "validate_" callback is run in script.
 4. After gathering test results, engine triggers a new special event, running "on_event" function. This lets user to react to the collected test results.


#927
Quote from: RootBound on Tue 29/10/2024 15:06:25EDIT: you should also set the game variable game.following_room_timer to 0

I believe that characters following with FOLLOW_EXACTLY must ignore following_room_timer and teleport instantly, otherwise that would defeat the purpose of this option.

On another hand, my understanding is that FollowCharacter only updates position, but not things like loop and frame. Therefore, one will have to still update these things in rep-exec. It's better to use "late_repeatedly_execute_always", as it's run just after characters update.
#928
Quote from: Giacomo on Mon 28/10/2024 11:06:29Anyway, this thing of dDialog.ID isn't explained, I guess.

Yes, it's not explained, the manual has a lot of missing things.
#929
Ah, dammit, there are those stupid mistakes in the dialog compiler, where it cannot handle multiple dialog "return" or "goto-dialog" statements in a option even if they are under different "ifs", and also it does not support a variable dialog number in "goto-dialog" apparently.

The solution is explained in this section of the manual:
https://adventuregamestudio.github.io/ags-manual/DialogScript.html#using-regular-scripting-commands-in-dialogs

It is to instead use "real" script "return" command, the one with indentation. It must be followed by either a dialog's number if you want to go to that dialog, or one of the special constants:

Code: ags
  return dSomeDialog.ID;
  return RUN_DIALOG_GOTO_PREVIOUS;
  return RUN_DIALOG_RETURN;
  return RUN_DIALOG_STOP_DIALOG;

So in your case it would be, for example:

Code: ags
@S  // Dialog startup entry point
  player.Walk(cLei.x - 26, cLei.y, 1);
  player.FaceDirection(eDirectionDownRight);
  if(!diagLei) return dLeiInizio1.ID;
return
#930
Quote from: Ghostlady on Mon 28/10/2024 04:41:05The Alt + Enter definitely works, but when I moved my game over to a very large screen, about 27 inches in length, it hosed up the game.  I couldn't move the cursor.  I had to kill it with task manager.  Is there something in the settings that needs adjusted?

AGS had certain issues on very wide monitors. One of the known bugs is that switching from fullscreen to windowed on a ultra-wide monitor can lead to wrong window size. From your description I cannot tell what was the case though.

Which graphics driver do you have set in setup? I may suggest trying OpenGL, if Direct3D does not work. Also the general recommendation is to have "Fullscreen as borderless window" checked by default.
#931
Quote from: eri0o on Sun 27/10/2024 22:23:03I think it would give the expected behavior as an adventure game even though it may not be as consistent when think purely as a programmer (that would expect the nested dialogs).

To clarify, when I speak of "nested dialog loops", I meant literally - update loops.

Dialog topics themselves can be made nested logically, but run inside a single update loop, using a dialog topic stack. For instance, right now the dialog "executor" saves a history of dialog topics, letting you to return back to the previous ones if necessary ("goto-previous" command).
It may be not fully clear from the syntax's perspective, but it is an available option.
#932
Quote from: eri0o on Sun 27/10/2024 18:12:21While warning about the nesting somehow is best, I wonder if, since there should be a way to test that it is inside a dialog, if there would be a way that in such case it could be delayed to happen after. At least I don't feel that the nesting is expected - even though it happens. The issue there is it would trigger a dialog end and start event by doing this way - at least I think?

I'm currently working on this in 3.6.2 branch. Not sure if I like to apply this to a 3.6.1 patch... the change I found working is not that big, but it alters the game state flow, and i don't feel 100% confident about it just yet.

It won't trigger the dialog end/start events, it will work more like as if a option script returned with a proper "goto-dialog" command.

When Dialog.Start is called within a script, it's actually scheduled to run after script completes, similar to ChangeRoom, and few other things.
So, this "post-script" execution seems a convenient place to do this.
I found a possible trick: while processing this scheduled command, check if we are inside a dialog, and then not start a new dialog loop, but override the script's return value that is going to be passed back into the current running dialog loop. This return value contains a instruction of what to do (stop dialog, switch to another topic, etc).
In a way, Dialog.Start called within a dialog script will work more like a postponed "goto-dialog".
#933
@Giacomo Sorry for delay, I finally found time to check this out.

Quote from: Giacomo on Thu 24/10/2024 12:52:06Let me ask you one more thing: If I run a dialogue and every of its options take me to another unique dialogue, and so on until the last dialogue of the series closes everything, should I put "return" or "stop" at the end of the options of the previous dialogues?

So, this question made me look more closely to how do you change the dialogs, and it turned out you were making a mistake.

The problem is not only whether you do "return" or "stop", the main problem is that you were calling Dialog.StartDialog() from within a dialog script. Like this:

Code: ags
  dOminoPapaFinale.Start();
  <...>
return

or this:

Code: ags
  dOminoPapa31.Start(); //open part one of third dialogue
stop


When you call Dialog.Start() from inside another dialog, AGS actually starts a new Dialog "state" before exiting previous one. When you have multiple calls like that done in sequence, there appear multiple "nested" Dialogs running inside each other, like:

   - Dialog1
        -- Dialog2
             -- Dialog3
                   -- Dialog4

Furthermore, if you call one of the previous dialogs again in a same way, the dialog states duplicate! Like:

   - Dialog1
        -- Dialog2
             -- Dialog1
                   -- Dialog2

In theory, this may go forever. But computer does not have infinite nesting power, so at some point it cannot create more of these "dialog states", and crashes. Windows version also crashes eventually, you just need to hit more options to cause this.

This probably may be considered a mistake in AGS design, because it does not handle this correctly, nor reports any warnings about potential issue.

The simplest way to reproduce this bug is to have 2 dialogs that start each other recursively:
Spoiler
Code: ags
//// DIALOG 1
// Dialog script file
@S  // Dialog startup entry point
return
1
narrator: start dialog 2
  dDialog2.Start();
stop
2
narrator: stop here
stop

//// DIALOG 2
// Dialog script file
@S  // Dialog startup entry point
return
1
narrator: start dialog 1
  dDialog1.Start();
stop
2
narrator: stop here
stop

Then run the Dialog1 and keep hitting option 1 at every next step. Eventually, the game will crash.
[close]






So how should this be solved?

First of all DO NOT CALL Dialog.Start function from inside the dialog script!

Instead, use one of the dialog script commands to change between dialogs, as mentioned by @heltenjon above.
I will quote a bigger section of the manual:
https://adventuregamestudio.github.io/ags-manual/DialogScript.html#dialog-commands

Quotegoto-dialog X
Switches the current topic to Topic X, and displays the current list of choices for that topic.
  goto-previous
Returns to the previous topic that this one was called from. If the dialog started on this topic, then the dialog will be stopped.
  return
Stops the script and returns to the list of choices.
  stop
Stops the conversation and returns the player to the game.

So, instead of using dOminoPapa31.Start() you should be doing "goto-dialog dOminoPapa31".
"goto-dialog" also practically works like "stop" for the current dialog, except it opens a new dialog after current one exits.
That should solve your problem.




EDIT:
I suppose that this behavior of Dialog.Start has to be fixed in AGS engine though.
It seems that Dialog.Start is allowed to be called from "dialog_request", that's a callback function that is run when you have a text parser in dialog options.
And apparently it works, although technically still being called from inside the current Dialog state.
So we need to do the same to work even if Dialog.Start was called directly inside dialog script.

Probably this was meant to work back when normal script was not supported inside dialog scripts.
But after normal script was allowed there, commands like Dialog.Start were not adjusted properly.
#934
@Ghostlady you can do that, but you should know that player may toggle between windowed<->fullscreen on their own by pressing Alt + Enter.
#935
Here's a temporary fixed build download, if you'd like to try:
https://cirrus-ci.com/task/5818327266754560

With this fix you only need to setup 1 InventoryWindow control, and make sure it's "CharacterToUse" property is set to "-1" in the editor.
It should switch automatically when you change player character.
#936
I'm sorry, but checking your game project I can see that it's more complicated than it should be.

First of all, if InvWindow.CharacterToUse is set to null (or -1 in the editor), then it is supposed to switch to a new playable character automatically. This is the default behavior, as mentioned in the manual:
https://adventuregamestudio.github.io/ags-manual/InvWindow.html#invwindowcharactertouse
QuoteThis is either set to a specific character, or it can be set to null, in which case the inventory window will track the current player character (this is the default).

So in theory you don't even have to change this property, unless you want to display a non-player's inventory.

Then, for some reason you are not using 1 inventory window, but 2 inventory controls on same GUI, one for each character, although you only display 1 of them at the same time. Why use 2 inventory windows then? And if you  are using 2 anyway, then why keep setting their CharacterToUse in script? This is simply not necessary, you could just set them once in the editor and never touch again.

To make this inventory change work you only need 1 InventoryWindow control, and either assign CharacterToUse to -1 in the editor (this means "use active player character"), or do "InventoryWindow.CharacterToUse = player;" in script right after calling "somechar.SetAsPlayer();".



Another thing, you are using boolean variables to track which character is currently a player. There's no need to do this, as you can simply use standard "player" variable to find that out like:

Code: ags
if (player == cBob)
{
   // do something
}

if (player == cKelly)
{
   // do other thing
}


EDIT:
There's an unfortunate problem though. While testing this scenario I found a bug in the current version of AGS engine, which was not reported earlier. It appears that if you use InventoryWindow which switches to a new player character automatically, then it does not redraw right away. This may make it look like it's not working, although it should.

I must fix this engine bug in the next 3.6.1 patch.

For now the workaround may be to actually switch CharacterToUse in script...

EDIT2:
Actually, this problem is much older than I thought. Looks like almost any version of AGS had some issue of not redrawing inventory window immediately after player changes. In earlier versions you had to move mouse around to make it redraw... Could be that's why people used to set CharacterToUse manually in script?
#937
Ugh! @Giacomo PMed me because he can't post on forums again for some reason. I will ask AGA to maybe look into this.

Here's Giacomo's message he asked me to post here:




@eri0o I'm sorry, I don't undertsand many things because I am no programmer but I'll do my best to let you help me!

cUomoAppeso is already in the room before he becomes the player.

View 26 belongs to the woman in the first scenario, it's for her idle view and for a couple of animations she does once.

Yes, I installed LipSync, I thought it could be used also for tranlsation but I realized don't need it...does anything change if I remove it?

@Crimson Wizard I posted the code of the dialogue options when I made the post, removing only the repetitive script. The dialogue doens't affect anything else in the room.

It's supposed to be a quest where you can't go on until you give the right answer and, to avoid problems due to recursive calls, I chose to force the player to close the dialogue when he miss the answer too many times.

Now the expection is thrown also in the first dialogues series of the game, that the player does once only and where any answer takes to the next dialogue.

I took a video of the first dialogues series, the exception is thrown at 1'14''.
I'm sure I didn't modify anything, but the script that Crimson suggested me and that concerns with the hanging man(cUomoAppeso) dialogues series only.

Download video

Errors log:
Spoiler
Code: ags
Aborted(RuntimeError: unreachable executed) ags_362_cm_744406cd444c:615:96
    printErr https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/:615
    abort https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:439
    runAndAbortIfError https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12029
    maybeStopUnwind https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12128
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12079
    doRewind https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12177
    handleSleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12203
    callUserCallback https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:4919
    safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7257
    (Asinc.: setTimeout handler)
    safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7255
    _emscripten_sleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:11826
    handleSleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12188
    _emscripten_sleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:11826
    Emscripten_GLES_SwapWindow https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:5861331
    emu$Emscripten_GLES_SwapWindow https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7235175
    SDL_GL_SwapWindowWithResult https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:5928835
    ags.wasm.AGS::Engine::OGL::OGLGraphicsDriver::Render(int, int, AGS::Common::GraphicFlip) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:223704
    ags.wasm.byn$fpcast-emu$AGS::Engine::OGL::OGLGraphicsDriver::Render(int, int, AGS::Common::GraphicFlip) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6426698
    ags.wasm.AGS::Engine::OGL::OGLGraphicsDriver::Render() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:223501
    ags.wasm.byn$fpcast-emu$AGS::Engine::OGL::OGLGraphicsDriver::Render() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6426478
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.render_to_screen() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1492729
    ags.wasm.render_graphics(AGS::Engine::IDriverDependantBitmap*, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1560194
    ags.wasm.UpdateGameOnce(bool, AGS::Engine::IDriverDependantBitmap*, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:987178
    ags.wasm.GameTick() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:995053
    ags.wasm.GameLoopUntilState::Run() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:996930
    ags.wasm.byn$fpcast-emu$GameLoopUntilState::Run() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6700032
    dynCall_ii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383696
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_ii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13202
    ags.wasm.GameLoopUntilEvent(int, void const*, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:993771
    ags.wasm.display_main(int, int, int, char const*, TopBarSettings const*, int, int, int, int, int, bool, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1584219
    ags.wasm._displayspeech(char const*, int, int, int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1927743
    ags.wasm.Sc_Character_Say(void*, RuntimeScriptValue const*, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1966472
    ags.wasm.byn$fpcast-emu$Sc_Character_Say(void*, RuntimeScriptValue const*, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6838665
    ags.wasm.ccInstance::Run(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2617988
    ags.wasm.ccInstance::CallScriptFunction(AGS::Common::String const&, int, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2596704
    ags.wasm.byn$fpcast-emu$ccInstance::CallScriptFunction(AGS::Common::String const&, int, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014715
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2806936
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.run_dialog_option(int, int, int, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2000199
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021467
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.run_dialog_option(int, int, int, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2000199
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021467
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.run_dialog_option(int, int, int, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2000199
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021467
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.run_dialog_option(int, int, int, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2000199
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021467
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.run_dialog_option(int, int, int, bool) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2000199
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021467
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.byn$fpcast-emu$RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6859176
    dynCall_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384927
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_iiiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13290
    ags.wasm.run_dialog_script(int, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2004270
    ags.wasm.do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2021015
    ags.wasm.byn$fpcast-emu$do_conversation(int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015564
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2811246
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.RunScriptFunctionAuto(ScriptType, ScriptFunctionRef const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2842881
    ags.wasm.byn$fpcast-emu$RunScriptFunctionAuto(ScriptType, ScriptFunctionRef const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015784
    dynCall_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384414
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13235
    ags.wasm.post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2812179
    ags.wasm.byn$fpcast-emu$post_script_cleanup() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7014866
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.RunScriptFunction(ccInstance*, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2807532
    ags.wasm.RunScriptFunctionAuto(ScriptType, ScriptFunctionRef const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2842600
    ags.wasm.byn$fpcast-emu$RunScriptFunctionAuto(ScriptType, ScriptFunctionRef const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7015784
    dynCall_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384414
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13235
    ags.wasm.QueueScriptFunction(ScriptType, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:2839892
    ags.wasm.byn$fpcast-emu$QueueScriptFunction(ScriptType, AGS::Common::String const&, unsigned long, RuntimeScriptValue const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6763297
    dynCall_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384414
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_viiii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13235
    ags.wasm.process_event(AGSEvent const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1994266
    ags.wasm.byn$fpcast-emu$process_event(AGSEvent const*) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6858574
    dynCall_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383934
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vi https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13268
    ags.wasm.UpdateGameOnce(bool, AGS::Engine::IDriverDependantBitmap*, int, int) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:987780
    ags.wasm.GameTick() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:995053
    ags.wasm.RunGameUntilAborted() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:994482
    ags.wasm.byn$fpcast-emu$RunGameUntilAborted() https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6713579
    call https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6040621
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_v https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13312
    ags.wasm.initialize_start_and_play_game(int, AGS::Common::String const&) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1104779
    ags.wasm.byn$fpcast-emu$initialize_start_and_play_game(int, AGS::Common::String const&) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6738663
    dynCall_vii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6384162
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_vii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13224
    ags.wasm.initialize_engine(std::__2::map<AGS::Common::String, std::__2::map<AGS::Common::String, AGS::Common::String, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, AGS::Common::String>>>, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, std::__2::map<AGS::Common::String, AGS::Common::String, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, AGS::Common::String>>>>>> const&) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:1247582
    ags.wasm.byn$fpcast-emu$initialize_engine(std::__2::map<AGS::Common::String, std::__2::map<AGS::Common::String, AGS::Common::String, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, AGS::Common::String>>>, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, std::__2::map<AGS::Common::String, AGS::Common::String, std::__2::less<AGS::Common::String>, std::__2::allocator<std::__2::pair<AGS::Common::String const, AGS::Common::String>>>>>> const&) https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6945564
    dynCall_ii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:6383696
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    invoke_ii https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:13202
    main https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:114389
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12075
    doRewind https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12177
    handleSleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12203
    callUserCallback https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:4919
    safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7257
    (Asinc.: setTimeout handler)
    safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7255
    _emscripten_sleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:11826
    handleSleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12188
    _emscripten_sleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:11826
    Emscripten_GLES_SwapWindow https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:5861331
    emu$Emscripten_GLES_SwapWindow https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:7235175
    SDL_GL_SwapWindowWithResult https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.wasm:5928835
[close]
Spoiler
Code: ags
Uncaught RuntimeError: Aborted(RuntimeError: unreachable executed). Build with -sASSERTIONS for more info.
    abort https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:459
    runAndAbortIfError https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12029
    maybeStopUnwind https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12128
    x https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12079
    doRewind https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12177
    handleSleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:12203
    callUserCallback https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:4919
    safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7257
    setTimeout handler*safeSetTimeout https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:7255
    _emscripten_sleep https://ericoporto.github.io/public_html/ags_362_cm_744406cd444c/ags.js:11826
ags.js:459:11
[close]




EDIT: ah, right, there are these dialog scripts in the first post, I completely forgot about them, sorry.
#938
Quote from: Khris on Thu 24/10/2024 09:10:51@Salamdandersad please edit your first post and change the title to something descriptive like "Creating a table with clickable cells"

I wanted to post the same, please do not create topics called like "I need help", give them names which tell what you need help with instead. This will let other people identify questions and to search for similar topics.


Khris have already posted one possible solution above.
But I would like to post a general advise on how to approach such problems (I posted similar thing in many topics around the forum, but it's worth to repeat):


When you have a complex problem, you may easily get lost in all the details.
It's essential to divide it in smaller subtasks, and decide how do you want to design each of them. Then go over them step by step, see which parts you already know how to do, and which not.

1. Explain the puzzle logic "on paper" in human language (real paper, or text file), step by step. The point here is to make it clear to yourself, and to others (if you ask others for help), how the puzzle works.

2. Try to distinguish puzzle elements: what does it consist of, how the player is supposed to interact with it, how do you tell when the puzzle is solved?

3. Now, going into the game engine (AGS) find out how you may describe the puzzle's current state in script. Which variables to use, do you need simple variables or arrays, or structs, and so forth. The more you learn about the scripting language, the easier it will be for you to find better solution.

4. Find out how to present the puzzle's state on screen. Which game objects do you use for that? Do they have to be interactable, or only there for display? that matters.

5. Handle player's input: how the puzzle is controlled, what happens when player clicks here or there.

6. Handle success detection: how do you test that the puzzle have reached the correct state.


I advise practicing this general approach, starting with simpler puzzles, and then taking on more complex ones as you learnt.
#939
@Giacomo , since it crashes at some dialog option, I think you could post at least the code of what happens in that dialog option, to give us any idea of what this crash may be related to.

Also, since it crashes not anytime, but if player selects few other wrong options first, maybe post the code of these options too.
Do you, perhaps, know if there's anything that happens in these wrong options that may affect the script of the correct one?
Or is there anything in these wrong options that may affect the game state? (setting variables, changing object properties, etc)
#940
Updated to Alpha 14
(Please use download links in the first post)

Contains all the new features from 3.6.2 Betas 1 and 2.

Other changes:

Common:
- Fonts are split into Font Files and Fonts, where multiple Fonts may use same Font File, or not have any Font File assigned at all (for instance, if they are meant to act as placeholders and get replaced by fonts from plugin).

Editor:
- "Fonts" node in the Project Explorer now contains separate "Font Files" and "Fonts" sublists.
- Actual font files on disk are now stored in "Fonts" subfolder in the project when imported, and keep their original names (no longer renamed to "agsfntN.*").
- In General Settings replaced "Use Extended Compiler" option with "Script Compiler" option that acts as a dropdown list, with compiler names to choose from.
- Added "Source FontFile" property to Fonts, this property lets assign a Font File to the Font.
- Fixed GUI controls failing to copy/paste via Clipboard (regression in previous Alpha versions).

Engine:
- Allow to run the game even if it has no fonts (log a warning).
- Allow to continue running the game if any font failed to load on startup. Such font will simply not get drawn, unless replaced by a plugin, for example.



Fonts...

Inside the project Fonts are now split into Fonts and Font Files. They may be added and deleted separately from each other.
Font Files retain their actual names when imported, they are no longer renamed into "agsfntN" (unless you rename these files yourself, or upgrade older project where they've been called like that).




When you open a Font's properties, you may select one of the imported Font Files as this font's "Source FontFile". Multiple Fonts may select same FontFile as their source, and at the same time use different properties (size, outline, linespacing and so forth).



For extra convenience, Fonts that use same FontFile are referenced under the FontFile as well:





EDIT: I just realized that these screenshots were made before we added new icons for FontFiles... so things look a bit better in the Editor now.
SMF spam blocked by CleanTalk