Hola,

estoy elaborando un sistema de diálogos que en principio funciona correctamente: el objeto "dialogable" se activa al pasar el jugador delante de él y oprimir [SPACE], y luego el jugador puede paginar hasta llegar al final. El código es simple:

CREATE EVENT

/// Sistema de dialogo
texto[0] = "";
mostrar = false;
pagina = -1;


STEP EVENT

/// activa/desactiva según distancia
if (keyboard_check_pressed(vk_space) and distance_to_object(obj_player)<10) {
    mostrar = true;
    }

if (distance_to_object(obj_player)>10) {
    mostrar = false;
    pagina = -1;
    }

/// Sistema de dialogo, cambio de pagina

if (keyboard_check_pressed(vk_space) and mostrar) {

    if (pagina = -1) {
    global.stop = true; //desactiva modo jugador
    }
       
    if (pagina+1 < array_length_1d(texto)) pagina++;
   
// Termina el diálogo - reinicia variables

    else {
    mostrar = false;
    pagina = -1;
    global.stop = false; //reactiva modo jugador
    }
}


DRAW EVENT

/// Parámetros del texto
if (mostrar) {
...
draw_text(x,y,texto[pagina]);
}


CREATION CODE EVENT

texto[0] = "Linea 1";
texto[1] = "Linea 2";
texto[2] = "Linea 3";
texto[3] = "Linea 4";


Ahora bien, quiero tener la opción de apretar una tecla u otra en un momento determinado y que el dialogo cambie. Es decir, por ejemplo en la línea 2 que ponga por ejemplo "Oprime [SPACE] para L3A o [ENTER] para L3B" y que según se oprima una u otra tecla, cambie el valor de la siguiente línea de texto.

Intenté algo como lo que sigue:

En el STEP del sistema de dialogos:

if (keyboard_check_pressed(vk_space) and mostrar) {

    if (pagina = 2) {
        if (keyboard_check_pressed(vk_enter)) {
        condicion = true;
        keyboard_key_press (vk_space)
        }
        }
       
    if (pagina+1 < array_length_1d(texto)) pagina++;
   
...
}


y en el bloque de diálogos:

texto[0] = "Linea 1";
texto[1] = "Linea 2";
texto[2] = "Oprime [A] para L3A o [B] para L3B";

if (condicion) {
texto[3] = "L3A";
} else {
texto[3] = "L3B";
}


pero no funciona. No me da ningún error, simplemente nada sucede al oprimir [ENTER] en el momento indicado.

Hay alguna forma de hacer esto?

Gracias!
--
@jupixweb

Hola jpsaenz

Yo hace algunos años atrás cree un sistema de scripts RPG para Game Maker (simulando el juego Pokemon).

Como es un sistema complejo, no te puedo mandar el código por acá ya que todo funciona en conjunto, así que reduje su funcionamiento en un pequeño proyecto importable para GMS 1.4 que está adjunto y un ejecutable para que pruebes como funciona.

En RESUMEN:
El NPC no hace nada, sólo tiene guardado el ID del script a ejecutar en el creation code.
Al pulsar "espacio", el player buscará al NPC más cercano y si hay uno a rango, interactuará con él, TODO el código y variables se ejecutan en el objeto "obj_player", solamente lee el ID del script desde cada instancia NPC.
El proyecto tiene 3 scripts principales:
scr_load: se encarga de cargar una lista de comandos y los mete en una cola.
scr_run: luego que tomas un comando de la cola, este script ejecuta su efecto.
scr_question: es el script asociado a las preguntas, aquí colocas las preguntas, las respuestas y lo que quieres que pase al pulsar cada respuesta.

Es dificil de configurar... cualquier duda me la puedes comentar.

PD: es sólo una pequeña parte de lo que el código es capaz de hacer, ya que sólo reacciona a los comandos "TEXT" y "QUESTION", pero puedes poner miles y miles, como "INICIAR BATALLA", "MOVER AL PLAYER o NPC", "APARECER OBJETO", etc y puedes encolar las acciones, generar delay, cortar la ejecución de un script y saltarte a otro, o lo que tu imaginación de.

Saludos

Muchas gracias, BssString, lo voy a estudiar!
--
@jupixweb