Author Topic: Dialog  (Read 12796 times)

Dialog
« on: March 02, 2025, 11:49:57 pm »
Hi everyone!

I put back the original dialog window, and it works fine.

Only, I have two things I would like to do:

- First, and this is the most important thing, I would like center the screen on the player when the dialog window is called, do you have any ideas to do that?

- And optionally,, I would like to be able to display an image in addition to the dialog window, which would depend on the npc. In fact I was thinking of putting a still image of the "talking head", while waiting to be able to put the original animations. (big work later on that). I noticed that there was an "avatar" field in dialogEditor, but it doesn't work.

Thanks for help !

Re: Dialog
« Reply #1 on: March 03, 2025, 10:05:09 am »
Adding avatars is possible, but doesn't work just like that. You have to go into coding, this way https://github.com/TheGreatDoc/fode/blob/master/Server/scripts/client_screen_dialog.fos

Re: Dialog
« Reply #2 on: March 09, 2025, 05:16:25 pm »
Ok thank you very much. I will try this

Re: Dialog
« Reply #3 on: March 25, 2025, 03:06:08 am »
I found an alternative solution. With this:

void _DialogImage(int x, int y, int imageId, string@, array<int>@)

It gives a frozen image, but it's already very good

Thanks to all

Re: Dialog
« Reply #4 on: April 02, 2025, 12:20:12 am »
i do the same in client_io.fos
put png file in client folder






Re: Dialog
« Reply #5 on: April 02, 2025, 12:22:55 am »
client_io.fos -> mouse_down()
IGUIElementImageOpt@ avatar;
@avatar = GUI_AddImage(CLIENT_SCREEN_DIALOG, STR_NPC_AVATAR(dlgId)+".png", PT_ART_CRITTERS, 30, 60);


Re: Dialog
« Reply #6 on: April 02, 2025, 12:29:49 am »

Re: Dialog
« Reply #7 on: September 21, 2025, 11:01:03 am »

Re: Dialog
« Reply #8 on: Yesterday at 01:20:40 am »
Hi everyone! I managed to center the screen on the player when the dialog box appears:

In client_interface.fos, i added this :

void CenterPlayerOnScreenDialog() // Le téléport, marche
{
    CritterCl@ player = GetChosen();
    if (valid(player)) {
        RunServerScriptUnsafe("dev_menu@unsafe_TeleportPlayer", 0, player.HexX, player.HexY, null, null);
    }
}

And changed this :

void screen_change(bool show, int screen, int p0, int p1, int p2)
{
    if(show && screen == CLIENT_SCREEN_DIALOG) //Here
    {
        CenterPlayerOnScreenDialog();
    }

    if(DialogImage.Exists() && recheckDialogImage &&
       show && screen != CLIENT_SCREEN_DIALOG &&
       !(screen == CLIENT_SCREEN_BARTER || screen == CLIENT_SCREEN_SAY))
    {
        DialogImage.Unset();
        recheckDialogImage = false;
    }

    if(!show && DialogImage.Exists() && screen == CLIENT_SCREEN_DIALOG)
    {
        recheckDialogImage = true;
    }

    if(show)
        GUI_ShowScreen(screen, p0, p1, p2);
    else
        GUI_HideScreen(screen, p0, p1, p2);
}

And in dev_menu.fos :

void unsafe_TeleportPlayer(Critter& player, int dummy, int x, int y, string@ param3, array<int>@ param4)
{
    Map@ map = player.GetMap();
    if (valid(map)) {
        uint16 hexX = player.HexX;
        uint16 hexY = player.HexY;
        player.TransitToHex(hexX + 1, hexY, 0xff); // Téléporte le joueur sur une case voisine
        player.TransitToHex(hexX, hexY, 0xff); // Téléporte le joueur sur sa case d'origine
    }
}

It's really not clean, but it works!  ;D