CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 18 Oct 2017 10:27

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 12 mensajes ] 
Autor Mensaje
NotaPublicado: 22 Mar 2017 19:56 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 16 Nov 2016 12:05
Mensajes: 49
Nota del moderador escribió:
Me he tomado la libertad de editar este post para indicar que he puesto este hilo como fijo en el foro de ngPAWS ya que soluciona algunas dudas que han venido ocurriendo con DOALL y que eran fruto de incorrectas explicaciones por mi parte en la documentación. En este hilo se explica correctamente. Es posible que se pueda aplicar a Superglús también, pero no puedo asegurarlo en este momento.


Buenas otra vez.
Sigo con la adaptación del código AD y veo que hay algo que no estoy haciendo bien. Supongo que hay algún acercamiento un poco mejor.

Alerta de spoilers: si no habéis jugado a la Aventura original o queréis hacerlo... dejad de leer.

Código:
SOLTAR TODO
 AT    lAquíYaSabesDonde
 GOTO  lAlliDondePasa
 DOALL CARRIED
 GOTO  lAquiYaSabesDonde
 WRITELN "Blabla"
 DONE


Soltar es sinónimo de DEJAR.
¿Qué sucede? Después del primer GOTO, se hace el DOALL, se dejan las cosas y se para el condacto. Pensaba que solo hacía DONE si había un objeto que no estuviera en la localidad. Así, al mirar, se muestra la descripción de lAlliDondePasa.

Código:
SOLTAR TODO
 AT    lAquíYaSabesDonde
 GOTO  lAlliDondePasa
 PROCESS 13
 GOTO  lAquiYaSabesDonde
 WRITELN "Blabla"
 DONE

/PRO 13
_ _
 DOALL CARRIED


Si pongo el DOALL CARRIED en un proceso, se acaba volviendo a lAquíYaSabesDonde pero no se hace el DOALL CARRIED (ahora en el proceso).

¿Qué me pasa doctor?


Arriba
 Perfil  
 
NotaPublicado: 22 Mar 2017 21:38 
Desconectado
Archivero
Archivero

Registrado: 05 Abr 2014 17:40
Mensajes: 264
Saludos.

Justamente necesito una rutina así que me libere de todo el inventario al momento de responder una pregunta y ser movido (GOTO) de localidad.
El amigo Uto dio una solución que probé hasta la saciedad y dejé de intentarlo por no haber poder humano que la haga servir.

Uto escribió:
Esto es algo que normalmente se hace con DOALL:

Código:
CONTESTAR PREGUNTA
  WRITELN "Eres transportado a..."
  DOALL 254
  DESTROY @54
  DONE

La hize de cien maneras distintas modificadas y nada. Al parecer Superglus no soporta eso.
Hago el cambio de localidad y nada, los objetos siguen en el inventario. Esperemos que una solución ngPaws la pueda adaptar a Superglus.


Arriba
 Perfil  
 
NotaPublicado: 22 Mar 2017 22:10 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 16 Nov 2016 12:05
Mensajes: 49
Buenas. No sé si estoy en lo cierto pero ¿has probado a poner el WRITELN al final?
En algún condacto me parece recordar que hacía diferencia (podría ser creencia en la magia ^_^)

El testigo escribió:
Código:
CONTESTAR PREGUNTA
  DOALL 254
  DESTROY @54
WRITELN "Eres transportado a..."
  DONE

La hize de cien maneras distintas modificadas y nada. Al parecer Superglus no soporta eso.
Hago el cambio de localidad y nada, los objetos siguen en el inventario. Esperemos que una solución ngPaws la pueda adaptar a Superglus.


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 09:56 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Tras analizar internamente como está implementado DOALL y revisar la documentación, veo que no concuerdan. Es más, la documentación en español estaba bastante mal, al estar el punto 4 de la misma mal traducido. Ahora está bien traducido (lo acabo de cambiar) pero eso solo hace que esté tan mal como la inglesa. Lo cierto es que ni yo mismo recordaba que estaba implementado así, de ahí mis erráticas respuestas en casos anteriores.

Por un lado ngPAWS no tiene un DOALL como el de PAW. Es parecido, pero no es igual, y además no puede serlo sin cambios enormes en sus tripas, así que voy a intentar explicar como funciona:

1. Cuando ngPAWS se encuentra un DOALL busca el primer objeto que esté en la localidad indicada por el DOALL, si no encuentra ninguno finaliza el DOALL y hace un DONE (y por tanto acaba la ejecución del proceso/respuestas actual).

2. Si encontró un lo pone en los flags que guardan el nombre+adjetivo de la frase actual, y en los del objeto referenciado (incluyendo los de los atributos del objeto actual, peso y ubicación). A los efectos es como si cambiara la frase actual de VERBO + TODO a VERBO + <EL OBJETO>.

3. Llama de nuevo al proceso actual, con una particularidad, le dice que en lugar de ejecutarlo completo, empiece por la entrada siguiente a la que está el DOALL.

4. Cuando esa ejecución del proceso termina, se vuelve al punto 1 y se trata de buscar otro objeto. Si lo encuentra pasamos al punto 2 y si no se hace un DONE.

En esas condiciones es imposible que nada de lo que hay en la misma entrada que el DOALL pero detrás del mismo se ejecute jamás, porque el DOALL siempre va a empezar a ejecutar desde la siguiente entrada a cada iteración, o si ya no hay más objetos, ejecutar un DONE. Por ejemplo en este código, cada vez que pongamos TEST TODO saldrá un "Hola" por cada objeto que llevemos, pero ningún ADIOS. A ese WRITE "ADIOS" no se llega nunca.

Código:
TEST TODO
   DOALL CARRIED
   WRITE "ADIOS"

TEST _
  WRITE "HOLA"
  DONE


¿Y entonces como funciona por ejemplo el DEJAR TODO?

Muy sencillo: en la base de datos de inicio hay una entrada así:

Código:
DEJAR TODO
  DOALL CARRIED


y bastante más abajo otra así:

Código:
DEJAR  _
 AUTOD


Como a cada ejecución del DOALL el resto de la tabla de respuestas debajo de ese DOALL se ejecuta cada vez con un objeto, al DEJAR _ nos llega cada vez un DEJAR <ALGO>.

Hay acciones que cancelan un bucle doall por cierto, como BREAK o DESC.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 10:00 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
¡Ah! un detalle importante a tener en cuenta es que la librería de inicio tras los DEJAR TODO, METER TODO, COGER TODO, etc. tiene un "_ TODO" que responde "Por favor sé más específico". Si vais a hacer alguna acción nueva con la palabra TODO - por ejemplo, "COCINAR TODO" - es necesario que la pongáis antes de ese _ TODO.

No he terminado de explicarlo en el anterior POST, pero para dejarlo más claro esto está mal:


Código:
COCINAR TODO
 DOALL CARRIED
 <HACER LO QUE SEA>
 DONE

y esto está bien

Código:
COCINAR TODO
  DOALL CARRIED

COCINAR _
  <HACER LO QUE SEA>
  DONE


El ejemplo de dejar todo no necesita DONE porque el AUTOD ya hace un DONE.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 10:03 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
El problema de El Testigo es sin embargo más complejo, pero creo que se puede solucionar con un proceso:


Código:
CONTESTAR PREGUNTA
  PROCESS 10
  GOTO lRemota
  WRITELN "Eres transportado a...."
  DONE


Y en el proceso 10:
Código:
_ _
   DOALL CARRIED

_ _
   DESTROY @54


En teoría el proceso10 al ejecutarse el DOALL forzará una ejecución de la segunda entrada (la del DESTROY) con cada objeto.

No puedo asegurar que esto funcione en Superglús no obstante, lo digo pensando en ngPAWS.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 10:11 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Por otro lado, os recuerdo que ngPAWS (Superglús no) tiene ciertas estructuras como los dot y los sharp condacts, que pueden servir para hacer estas cosas de una manera más clara (el DOALL siempre resulta confuso):

Código:
CLEAR fAux
NOTEQ. fAux <numero del ultimo objeto + 1>
{
  CARRIED# @fAux DESTROY @fAux
  PLUS fAux 1
}


Lo cual viene a ser un bucle que empieza por el objeto 0 y si lo llevamos lo destruye, suma uno al número de objeto y sigue hasta que el número de objeto a mirar esté por encima del número del último objeto.

Esto puede acabar siendo asi:

Código:
DESTRUIR TODO
 CLEAR fAux
 NOTEQ. fAux <numero del ultimo objeto + 1>
 {
   CARRIED# @fAux DESTROY @fAux
   PLUS fAux 1
 }
 WRITELN "Con tu terrible poder envías al vacío todo lo que llevas."
 DONE


o así:
Código:
CONTESTAR RESPUESTA
 CLEAR fAux
 NOTEQ. fAux <numero del ultimo objeto + 1>
 {
   CARRIED# @fAux DESTROY @fAux
   PLUS fAux 1
 }
 WRITELN "Eres llevado a...."
 GOTO lRemota
 DESC

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 10:14 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Documentación corregida.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 11:02 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 16 Nov 2016 12:05
Mensajes: 49
Gracias Uto. Ahora está clarísimo.
Voy a probar también los sharp condacts. Genial, genial


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 15:11 
Desconectado
Archivero
Archivero

Registrado: 05 Abr 2014 17:40
Mensajes: 264
Saludos. Espero que todo vaya bien.
Muchas gracias por la amplia explicación amigo Uto.

Lamentablemente ni así me funcionó. Probé de la manera Superglus y nada de nada.
También adapté tal como dices lo de ngPaws utilizando constante de último objeto, CLEAR x, PLUS x (obviamente eliminando los signos de bloques que Superglus no reconoce) y nada.

Por otra parte, revisando la rutina que falla en la conversación de Luis para tratar de ver qué falla, se me ocurrió hacer un proceso de bucle semi-infinito.
Al referirme a semi-infinito, es simplemente eso. El proceso se repetirá cuantas veces sea necesario comprobando ciertas condiciones. Al no ser compatible una condición, el ducle se detendrá saliendo del proceso.

Tabla respuestas:
IR CUARTO
AT locSala
PROCESS 3
GOTO locCuarto
DESC

IR SALA
AT locCuarto
GOTO locSala
DESC; Como se puede ver, solo se manda al proceso 3 de la sala al cuarto. Si se cogen objetos en el cuarto y se va a la sala, no removerá los objetos

Proceso 3:
_ _
CARRIED @51

_ _
DOALL 254

_ _
DESTROY @51

_ _
NOTDONE


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 16:57 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
El proceso 3 debería ser

Código:
_ _
 DOALL 254

_ _
 DESTROY @51


Ni CARRIED, ni NOTDONE. El CARRIED de antes del DOALL no hace nada, porque no tiene más acciones detrás en la misma entrada. EL NOTDONE... pues no sé porque no veo razón lógica para poner un NOTDONE ahí, así que el resultado podría ser cualquiera.

El código para ngPAWS es para ngPAWS, no puede aplicarse a Superglús.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 23 Mar 2017 18:02 
Desconectado
Enano Maluva
Enano Maluva
Avatar de Usuario

Registrado: 16 Nov 2016 12:05
Mensajes: 49
Uto escribió:
EL NOTDONE... pues no sé porque no veo razón lógica para poner un NOTDONE ahí, así que el resultado podría ser cualquiera.

Creo que la idea es que siga después del proceso 3 siguiendo a partir del condacto que o ha llamado (¿el testigo?). Creo que estarías poniendo un NOTDONE cuando se ha hecho un DONE en realidad (al acabar el DOALL) o ni siquiera llega a ese punto.

Yo he conseguido el resultado esperado siguiendo tus instrucciones Uto (Kudos!)

Código:
DEJAR TODO
 AT    lAlli
 PROCESS 13
 WRITELN "Bla bla bla"
 DONE

PRO 13
_ _
 DOALL CARRIED
 
SOLTAR _
 AUTOD   
 PUTO    lAllaDondeSePone
 DONE   


He visto que con AUTOD primero deja los objetos del inventario (y muestra el mensaje) y luego las pone en la localidad a la que deben ir (que es como se supone que se debe mostar).

Bien, bien.

PD: Si quieres editar el asunto del hilo por algo más claro: ¿Cómo funciona DOALL? o similar, adelante


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 12 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM