CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 24 Jun 2017 02:49

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 4 mensajes ] 
Autor Mensaje
NotaPublicado: 29 Dic 2015 10:28 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Me está pasando algo extraño al usar doall al intentar sacar todo de un contenedor:

Tengo cinco objetos, pero sólo saca 4

Código:
Puedes ver: un barril.
> mira dentro de barril
Dentro de el barril hay:
un catalejo, un terrón amarillo, un terrón blanco, un trozo de carbón y un almirez.

> sacar todo de barril
Sacas el terrón amarillo de el barril.
Sacas el terrón blanco de el barril.
Sacas el trozo de carbón de el barril.
Sacas el almirez de el barril.
¿Perdón?


Parece que se salta el primero.

Mi código:
Código:
sacar todo
 synonym coger todo
 PREP DE
 zero fbloqueado ; Si tenemos las manos libres...
 whatox2 ftemp
 onotzero @ftemp aContainer ; ¿Contenedor ... ?
 present @ftemp ; El contenedor está aqui ... ?
 objat @ftemp fa ; Objetos en la localidad del contenedor ...
 notzero# fa   ; Tiene que haber al menos 1
 {
  doall @ftemp
  done
 }
 message 162 ; Nada que sacar...
 done         


sacar _
 synonym coger _
 zero fbloqueado
 whatox fa ; objeto que sacamos ...
 whatox2 fb ; de donde lo sacamos
 present @fb ; ¿Está el contenedor por aqui ?
 onotzero @fb aContainer ; Contenedor ... ?
 isat @fa @fb ; est  el objeto en el contenedor ?
 place @fa @floc_actual ; Ponemos el objeto en la localidad actual
 mes 117              ; Sacas objeto1 de...
 writeln " {OBJECT|254}."; Fb es el flag 254.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
NotaPublicado: 29 Dic 2015 12:39 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4605
saimazoom escribió:
Me está pasando algo extraño al usar doall al intentar sacar todo de un contenedor:

Tengo cinco objetos, pero sólo saca 4



Ufff... mezclas un doall (bucle de la vieja escuela) con un sharp condact (estructura de la nueva escuela). Es una forma tan enrevesada de hacerlo, que sinceramente, me cuesta hasta pensar si funcionaría X-D. En cualquier caso se puede hacer de las dos maneras, pero de las dos a la vez no.

Sin embargo, antes de nada ¿por qué lo haces exactamente? Lo digo porque la librería de ngPAWS ya trae un sistema de "SACAR TODO" de contenedores ¿por qué reinventas la rueda?. No veo nada en tu código que me indique que no te vale la solución estándar, y sí veo algunas pegas:

- Al mover el objeto con PLACE no compruebas el numero de objetos que lleva el jugador, ni el peso, lo cual hace que para coger objetos de más solo haya que meterlos en el barril y luego sacarlos de él.
- La librería comprueba que el contenedor esté abierto si es abrible, y "descerrojado" (unlocked) si es "lockable", y además funciona para objetos supporterademás de container.
- Además, la librería comprueba muchos casos enrevesados para dar mensajes acordes (por ejemplo si pones "meter barril en barril" me temo que tu solución lo haría).

En fin, reinventar la rueda tiene un coste alto, y acabo de hacer un ejemplo rápido y mira como lo hace la librería estándar sin hacer nada:

Código:
Puedes ver: una caja.
> EX CAJA
Examinas la caja pero no ves nada especial (dentro hay una antorcha, una cuerda, una llave y unos alicates).
> SACAR TODO DE CAJA
Coges la antorcha.
Coges la cuerda.
Coges la llave.
Coges unos alicates.


Si el problema es que prefieres el (en mi opinión arcaico) mensaje de "Sacas la antorcha de la caja" creo que sería más sencillo modificar el mensaje del sistema de AUTOT, metiendole una secuencia de escape custom, o incluso usando la secuencia de escape {PROCESS|n} en lugar de dicho mensaje. Es decir, te coges el mensaje 36, que usa tanto AUTOT como AUTOG, y lo sustituyes por {PROCESS|n}, y en el proceso N ya haces que escriba lo que te de la gana, comprobando si hay objeto 2 y preposicion "DE" para no poner "DE <nada>" cuando se llegue al mensaje desde un simple "COGER".

Si hay alguna otra razón de peso para reinventar la rueda cuentame y vemos como se podría hacer.

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


Arriba
 Perfil  
 
NotaPublicado: 29 Dic 2015 16:41 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 22 May 2004 10:50
Mensajes: 884
Gracias por mirarte estas cosas :). Te cuento un poco lo que voy haciendo:

1) He usado el # simplemente para no duplicar, pues quiero que si no hay ningún objeto dentro me de un mensaje distinto (No hay nada dentro). Lo voy a dividir en dos entradas y así evito el # y te cuento. Como sabes en NMP usábamos una instrucción de salto para este tipo de casos.

2) He tenido que comentar casi todo lo de contenedores y "poner xx en yyy" de la librería original. Simplemente no funciona como lo teníamos hecho en el juego. En ISLA tenemos contenedores normales, por tamaño (grande y pequeño) y volcados además de poder usarlos los lleve o no el jugador (como el barril que pesa demasiado). Asi que no me queda más remedio que reinventar la rueda (pero no toda). Obviamente no he pegado aquí *todos* los casos de meter/sacar que tengo en el código.

3) Lo de reemplazar el verbo y el nombre que hace la librería base en algunos casos me ha traído bastantes problemas. Pues en casos
como 'poner lente en rayo', la librería le daba el cambiazo a 'meter en'. Es algo que intento también evitar en mi código, pues es muy
difícil de trazar si en alguna de las 3000 líneas anteriores alguien te ha cambiado un 'sacar' por un 'coger' o algo peor. En ese aspecto
prefiero con mucho la forma de sinónimos de múltiple entradas que teníamos en nmp :). Yo creo que deberías evitar tocar el input del jugador en la librería base, porque despista bastante escribir una cosa y que al proceso te llegue otra.

_________________
---
# S a i m a z o o m # http://www.aliensuavito.com manoparlante.blogspot.com @lecambre ALIENsoft (KNO&KMBR&DLA)


Arriba
 Perfil  
 
NotaPublicado: 29 Dic 2015 17:39 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4605
Volviendo a tu problema, se me ocurre una cosa: el DOALL en teoría recorre todos los objetos que estén en la localidad indicada por el DOALL excepto que

1) Tenga alguno de estos atributos: aScenery, aConcealed, aNPC
2) Sea el objeto referenciado por el segundo nombre de la frase actual ¿no le habrás puesto al catalejo el mismo número de vocabulario que al barril?

Te contesto ahora a lo comentado :-)


saimazoom escribió:
Gracias por mirarte estas cosas :). Te cuento un poco lo que voy haciendo:

1) He usado el # simplemente para no duplicar, pues quiero que si no hay ningún objeto dentro me de un mensaje distinto (No hay nada dentro). Lo voy a dividir en dos entradas y así evito el # y te cuento. Como sabes en NMP usábamos una instrucción de salto para este tipo de casos.

Sí, pero no se si un DOALL dentro de un "if" funcionará, se me hace raro, pero puede que sí.

saimazoom escribió:
2) He tenido que comentar casi todo lo de contenedores y "poner xx en yyy" de la librería original. Simplemente no funciona como lo teníamos hecho en el juego. En ISLA tenemos contenedores normales, por tamaño (grande y pequeño) y volcados además de poder usarlos los lleve o no el jugador (como el barril que pesa demasiado). Asi que no me queda más remedio que reinventar la rueda (pero no toda). Obviamente no he pegado aquí *todos* los casos de meter/sacar que tengo en el código.

Vale, si la estás reinventando basandote en la rueda anterior puede que no pase nada, pero ese PLACE es muy mala idea, o AUTOT o AUTOG o reconstruir la lógica del peso/máximo número de objetos/atributos que hacen que no se pueda coge (aSecenery)m etc. y luego hacer el PLACE si todo iba bien.

Citar:
3) Lo de reemplazar el verbo y el nombre que hace la librería base en algunos casos me ha traído bastantes problemas. Pues en casos
como 'poner lente en rayo', la librería le daba el cambiazo a 'meter en'. Es algo que intento también evitar en mi código, pues es muy
difícil de trazar si en alguna de las 3000 líneas anteriores alguien te ha cambiado un 'sacar' por un 'coger' o algo peor. En ese aspecto
prefiero con mucho la forma de sinónimos de múltiple entradas que teníamos en nmp :). Yo creo que deberías evitar tocar el input del jugador en la librería base, porque despista bastante escribir una cosa y que al proceso te llegue otra.

El modelo de la librería de Superglús es más "a la Inform", es decir, el parser saca verbo+nombre+prep+adver+noun2 y tal, pero luego eso se convierte en "acciones". Como no existen las acciones como tal lo que se hace es convertir determinadas entradas en otras, por ejemplo lo que dices de "PONER EN" se convierte en "METER EN" porque es la acción "meter en contenedor o superficie". Lamentablemente eso a veces te la lía, supongo que en Inform pasa igual, pero si te la lía no hay más que ponerlo en la tabla de respuestas al principio del todo(antes de los arreglos) ,y solucionado.

Las múltiples entradas obligan a cambiar mucho el compilador, un compilador que si no me equivoco está hecho con lex/yacc, pero del que no se conservan los ficheros originales, por lo que cambiar la gramática no es fácil. No es imposible, pero le di una vuelta y no veía por donde cogerlo, lo cual unido a mi aversión por el manejo de strings de C y que el lexer es todo strings.... como que paso XD

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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 4 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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM