CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 11 Dic 2017 18:28

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 13 mensajes ] 
Autor Mensaje
NotaPublicado: 26 May 2016 22:04 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Bueno, llevo bastante rato intentándolo. Rebuscando por el foro he conseguido hacer algo, pero aún no me funciona.
El caso es que el protagonista al abandonar una estancia, dependiendo de X condición deberá perder todo el inventario y cambiar de estancia.
He usado DOALL CARRIED y el flag fAux2 para controlar el número de objetos del inventario.

Código:
bajar _
 at 20
 notzero fAux2  ;Quedan aún objetos en el inventario
 writeln "ANTES Número de objetos del jugador: "
 print fAux2
 newline
 process 6
 done

; Si nos vamos y nos queremos llevar el huevo... el pájaro nos quita todo
bajar _
 at 20
 carried oHuevo  ;queremos bajar con el huevo encima
 writeln "Das un saltito..."
 writeln "Al en tu viaje hacia el suelo, aparece un enorme ave y te quita todo lo que tienes. No le ha gustado que le roben en el nido."
 let fAux2 @1 ;Guardamos en número de objetos
 writeln "Número de objetos del jugador: "
 print fAux2
 newline
 doall carried
 done


bajar _
 at 20
 notzero fAux2     ;aún nos quedan objetos en el inventario
 writeln "DESPUES Número de objetos del jugador: "
 print fAux2
 newline
 process 6
 done

bajar _
 at 20
 zero fAux2   ;ya no hay nada en el inventario, o bien no se ha ejecutado doall
 goto 19
 writeln "Das un saltito y ...."
 writeln "Aterrizas al pie del árbol."
 desc     


En el proceso 6

Código:
_ _
 place @51 20  ; el objeto se queda en el nido
 minus fAux2 1
 writeln "En el proceso 6 con el objeto "
 print 51
 newline
 writeln "Valor de fAux: "
 print fAux2
 newline   


No funciona, ya que al querer saltar del nido con el huevo, si perdemos el inventario y se queda en el nido, pero no cambio de estancias. Y eso no sé como hacerlo.

Spoiler: Mostrar
> saltar nido
De un saltito saltas a la rama de al lado, justo al nido.
En el nido.
Puedes ver: un arco con flechas.
> coger arco
Coges el arco con flechas.
> i
Llevas:
un arco con flechas
un huevo

> saltar
Das un saltito...
Al en tu viaje hacia el suelo, aparece un enorme ave y te quita todo lo que tienes. No le ha gustado que le roben en el nido.
Número de objetos del jugador:
2
DESPUES Número de objetos del jugador:
2
En el proceso 6 con el objeto
17
Valor de fAux:
1
DESPUES Número de objetos del jugador:
1
En el proceso 6 con el objeto
18
Valor de fAux:
0

> i
Llevas:
ningún objeto.

> m
En el nido.
Puedes ver: un arco con flechas y un huevo.


He probado cambiando el proceso 6 de tal forma que queda;

Código:
; El pájaro de la localidad 20 nos lo quita todo

_ _
 place @51 20  ; el objeto se queda en el nido
 minus fAux2 1
 writeln "En el proceso 6 con el objeto "
 print 51
 newline
 writeln "Valor de fAux: "
 print fAux2
 newline
 zero fAux2
 goto 19
 writeln "Das un saltito y ...."
 writeln "Aterrizas al pie del árbol."
 desc       


En ese caso funciona pero al cambiar de estancias me imprime "No puedes ir en esa dirección", y eso no sé como evitarlo.

Spoiler: Mostrar
Das un saltito...
Al en tu viaje hacia el suelo, aparece un enorme ave y te quita todo lo que tienes. No le ha gustado que le roben en el nido.
Número de objetos del jugador:
2
DESPUES Número de objetos del jugador:
2
En el proceso 6 con el objeto
17
Valor de fAux:
1
DESPUES Número de objetos del jugador:
1
En el proceso 6 con el objeto
18
Valor de fAux:
0
Das un saltito y ....
Wally : ¡UN SALTITOOOOOOOOOO!
Aterrizas al pie del árbol.
Un enorme agujero en el suelo marcado como “old faithful”, y dos enormes árboles llenan esta zona de la jungla. El sonido de un gran ave retumba en el cielo. Uno de los árboles tiene una gran liana colgando.
No puedes ir en esa dirección. ----> NO SE COMO EVITAR ESTO

> i
Llevas:
ningún objeto.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 27 May 2016 07:17 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Buenos pues al final me decidí con un propio condacto, que funcionar funciona y queda más límpia la tabla de respuestas y sin necesidad de procesos.
Puede que no funciona con prendas y contenedores ( no lo he probado), pero hasta ahí ya no es necesario llegar, más que nada porque en la aventura no hay ninguna prenda ni ningún contenedor "portable"

Quedaría en la tabla de respuestas
Código:
; Si nos vamos y nos queremos llevar el huevo... el pájaro nos quita todo
bajar _
 at 20
 carried oHuevo  ;queremos bajar con el huevo encima
 writeln "Das un saltito..."
 writeln "Al en tu viaje hacia el suelo, aparece un enorme ave y te quita todo lo que tienes. No le ha gustado que le roben en el nido."
 dejatodo
 goto 19
 writeln "Aterrizas al pie del árbol."
 desc

bajar _
 at 20
 goto 19
 writeln "Das un saltito y ...."
 writeln "Aterrizas al pie del árbol."
 desc   


Y el condacto

Código:
//CND DEJATODO C 0 0

function CNDdejatodo() {
   objhero();
   return true;
}

function objhero ( ) {

    for (i=0;i<num_objects;i++) {
       if (getObjectLocation(i) == 254) {
        ACCplace(i, getFlag(38) )
      }
    }

}

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 27 May 2016 08:50 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Hmmm... DOALL lo que hace es recorrer todos los objetos de la localidad y ejecutar la tabla respuestas desde la entra siguiente a la del doall. Por eso tu entrada "ANTES" no se ejecuta. Además, una vez ha terminado con el último, o cual ocurre la última vez que entras en la entrada de "notzero fAux2", vuelve justo tras el DOALL, donde has puesto un DONE, con lo cual termina y nunca llega a la entrada de "zero fAux2".

En realidad casi te está funcionando, solo te fallaba la condición final de de salida, que creo que se solucionaría haciendo el goto, los write y el desc detrás del DOALL. La entrada del "antes" sobra.

Otra solución más moderna sería hacer un bucle:
Código:
BAJAR _
 AT 20
 CARRIED oHuevo
 WRITELN "Al en tu viaje hacia el suelo, aparece un enorme ave y te quita todo lo que tienes. No le ha gustado que le roben en el nido."
 CLEAR fAux2
 LT: fAux2 X      ; DOnde X es el número del último objeto + 1
 {
    CARRIED# @fAux2 PLACE @fAux2 20
    PLUS fAux2 1
 }
 GOTO 19
 WRITELN "Das un saltito y ...."
 WRITELN "Aterrizas al pie del árbol."
 DESC

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


Arriba
 Perfil  
 
NotaPublicado: 27 May 2016 10:28 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Me quedo con esta última opción. Super elegante y queda super profesional ngPawasero!

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 27 May 2016 14:04 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Por claridad del código puedes usar LE en lugar de LT, y así puedes usar directamente el último objeto o una etiqueta:

Código:
 LE: fAux2 oUltimoObjeto

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


Arriba
 Perfil  
 
NotaPublicado: 27 May 2016 19:52 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Me he creado un flag:

Código:
LT: fAux2 @fNUMERO_OBJETOS


Con un warning en la tabla de objetos;

Código:
; Importante: Mantener actualiado el flag que indica el número total de objetos existentes
; fNUMERO_OBJETOS
; EN EL PROCESO 1 LE ASIGNO UN VALOR
; Importante: Recuerda que si creas un objeto contenedor  o soporte debes dejar sin usar la localidad de igual número 


Y en proceso 1

Código:
_         _
 AT 0
 BSET 12 5  ; Spanish

 ;No borramos pantalla por defecto
 ;... al cambiar de localidad
 mode 1

 ; NÚMERO DE OBJETOS CREADOS
 let fNUMERO_OBJETOS 19   


Que es donde tendré que ir modificando cada vez que creo un objeto nuevo.

Si tuviera ya todos los objetos creados, usaría la etiqueta del último objeto, pero voy añadiendo objetos y probando, añadir y probar... que sí que como ya tengo en papel todos los objetos escritos podría añadirlos todos... pero soy así de rarito.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 09:55 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
A nivel javascript, por debajo de ngPAWs, hay una variable llamada "last_object_number", con lo que en teoría se podría tener ese valor en ngPAWS de varias maneras con plugins, se me ocurren tres:

- Un condacto "GETLASTOBJECT flagno" que meta ese valor en un flag
- Un condacto "ISLASTOBJECT objno" que sirva para sustituir ese LT/LE.
- Una librería plugin con solo una linea "setFlag(xx, last_object_number)", de modo que al arrancar meta el valor en el flag xx, uno que elijamos, y luego comparar con él.

En fin, seguro que hay más maneras, pero esas son las que se me ocurren.

Pensando en modo ngPAWS, y con la idea de tener que usar DOALL lo menos posible, quizá estuvier bien hacer un condacto nuevo, algo en plan FOREACH, que sea de tipo condición, con sintaxis

FOREACH locno flagno

y que tome el valor de flagno y busque el siguiente objeto existente en locno y lo meta en flagno, si no hay, no tiene exito y la condición falla, si hay otro, tiene exito.

Así puesto suelto quizá no tenga mucho sentido, pero hace posible algo así:

Código:
CLEAR fAux
FOREACH: carried fAux
   PLACE #fAux


No se si FOREACH es la mejor opcion como nombre del condacto.

Tambien se podria hacer así un FOR

FOR flagno value value

Código:
FOR: fAux 0 100
 PRINT fAux


Siempre puedo hacer una librería plugin para los dos condactos :-)

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


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 12:07 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
En un principio, después de ver tu solución anterior, pensé en crearme un condacto para obtener el número total de objetos que existe, tipo:

TOTOBJG flg,

y que en el flg guardara el total de los objetos creado, así no tendría que ir preocupándome de la crear un objeto nuevo ir modificando la variable con el número total de objetos. Pero me contuve 8) , ya se habrá notado mucho que soy el tonto de crear condactos.

Citar:
Una librería plugin con solo una linea "setFlag(xx, last_object_number)", de modo que al arrancar meta el valor en el flag xx, uno que elijamos, y luego comparar con él.


Esta opción no estaría mal, un flag con el último objeto de la aventura que coincidirá ( sumándo 1) con el total de objetos de la aventura.

Y con respecto a los bucles, creo que ambos FOR, yo desde mi opinión creo que haría aumentar aún más las capacidades de ngPaws. Pero bueno, es mi opinió, puede que haya otros usuarios de ngpaws-superglus-paw más puristas que piensen "Nunca he tenido un FOR y nunca me hizo falta."

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 13:06 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
edlobez escribió:
En un principio, después de ver tu solución anterior, pensé en crearme un condacto para obtener el número total de objetos que existe, tipo:

TOTOBJG flg,

y que en el flg guardara el total de los objetos creado, así no tendría que ir preocupándome de la crear un objeto nuevo ir modificando la variable con el número total de objetos. Pero me contuve 8) , ya se habrá notado mucho que soy el tonto de crear condactos.

Citar:
Una librería plugin con solo una linea "setFlag(xx, last_object_number)", de modo que al arrancar meta el valor en el flag xx, uno que elijamos, y luego comparar con él.


Esta opción no estaría mal, un flag con el último objeto de la aventura que coincidirá ( sumándo 1) con el total de objetos de la aventura.

Y con respecto a los bucles, creo que ambos FOR, yo desde mi opinión creo que haría aumentar aún más las capacidades de ngPaws. Pero bueno, es mi opinió, puede que haya otros usuarios de ngpaws-superglus-paw más puristas que piensen "Nunca he tenido un FOR y nunca me hizo falta."


Mi duda fundamental a la hora de crear condactos es si añadir más no hará que sea más difícil aprender ngPAWS. En su momento con NMP creo que llegué a meter mas de 400 condactos, cada uno con su labor específica, y para cosas muy específicas. Con el sistema de plugins de ngPAWS ocurre un poco igual, le vas metiendo cosas y al final tienes un montón de condactos, algunos quizá demasiado específicos. Así, al haber muchos, a veces hay quien no encuentra el que busca, como te pasó a ti recientemente con SYNONYM.

No es un problema solo de ngPAWS. Ya el propio PAW, DAAD y los primeros PAWslike como SINTAC o NMP tuvieron esa "condactitis", porque que sentido tiene el condacto CARRIED cuando existe ISAT (CARRIED x es lo mismo que ISAT x 254). ¿Que sentido tiene COPYFF una vez que existe la indirección y COPYFF f1 f2 es lo mismo que LET f2 @f1? En DAAD y PAW quizá fuera justificable por ahorra un byte en máquinas menores, pero en NMP y SINTAC seguramente no,salvo por lretrocompatibilidad.

Así al añadir el condacto TOTOBJG, hacer una libreria que meta el total en un flag, hacer un FOR o un FOREACH, solo estoy dando otros métodos de hacer algo que ya se puede hacer, por lo que quizá haga algo de eso, pero como libreria plugin externa, no en el core de ngPAWS.

Mira, acabo de pensar una manera de hacer el bucle sin saber el número de objetos, y usando lo que ya tiene ngPAWS no hacen falta más condactos:

Código:
OBJAT carried fCuentaObjetos  ; Mete en el flag fCuentaObjetos el número de objetos en la localidad 'carried'
CLEAR fIteraObjetos
NOTZERO: fCuentaObjetos      ; Iteramos por los objetos, desde el 0 hasta el final, hasta que fCuentaObjetos es 0
{
  CARRIED# @fIteraObjetos
 {
   PLACE @fIteraObjetos 20
   MINUS fCuentaObjetos 1      ; Cada vez que encontramos un objeto, le movemos a la localidad elegida, y decrementamos un fCuentaObjetos
 }
 PLUS fIteraObjetos 1              ; Vamos a siguiente objeto
}

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


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 14:48 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Pues sí, toda la razón. Algunas veces cuando quiero buscar algo en concreto me pierdo con la lista de condactos que hay. Alguno de los cuales creo que no usaré.
Llevo más de la mitad avanzado en la aventura que estoy programando, y con acciones algunas más complejas que otras. Si hecho un vistado a la lista de condactos que estoy usando, no son muchos, al final acabas usando los más útiles.

Si con lo que ya existe se puede hacer, hasta incluso un bucle que itera, como en el ejemplo que has puesto, mejor no añadir más que sólo serviran para que asustar al personal que venga nuevo y quiera aprender.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 15:29 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
Pues sí, voy a pasar de hacerlos :-)

Por otro lado no te cortes haciendo condactos plugins, lo bueno de ngPAWS es que se puede programar a dos niveles, al propio de ngPAWS , o al de javascript que hay debajo. No estaría mal que un día alguien se currara una libreria plugin chula y no fuera yo :D

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


Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 16:03 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Pues ala, un bucle para contar el número de objetos que hay:

Código:
_ _
 ;##define flg fIterador 106
 ;##define flg fNumObjetos 107
 let fIterador 255
 clear fNumObjetos ;numero total de objetos
 clear fAux   ; auxiliar para almacenar objetos de cada room
 notzero: fIterador
 {
     clear fAux
     objat @fIterador fAux
     notzero# fAux
     {
      ;newline
      ;write "Encontrado " print fAux
      ;write " objetos en room " print fIterador
      ;newline
     }
     plus fNumObjetos @fAux
     minus fIterador 1
 }
 ;writeln "Numero de objetos: "
 ;print fNumObjetos
 ;newline 


Lo he probado y funciona. No cuenta los marcado como aNPC. Y no puede haber ningún objeto en ninguna localización superior a 255.
Lo he puesto en un processo, y en el proceso 1 lo llamo, quedándose en el flag fNumObjetos, los objetos que existe.

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Última edición por edlobez el 28 May 2016 16:06, editado 1 vez en total

Arriba
 Perfil  
 
NotaPublicado: 28 May 2016 16:06 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4614
edlobez escribió:
Pues ala, un bucle para contar el número de objetos que hay:

Código:
_ _
 ;##define flg fIterador 106
 ;##define flg fNumObjetos 107
 let fIterador 255
 clear fNumObjetos ;numero total de objetos
 clear fAux   ; auxiliar para almacenar objetos de cada room
 notzero: fIterador
 {
     clear fAux
     objat @fIterador fAux
     notzero# fAux
     {
      ;newline
      ;write "Encontrado " print fAux
      ;write " objetos en room " print fIterador
      ;newline
     }
     plus fNumObjetos @fAux
     minus fIterador 1
 }
 ;writeln "Numero de objetos: "
 ;print fNumObjetos
 ;newline 


Lo he probado un funciona. No cuenta los marcado como aNPC. Y no puede haber ningún objeto en ninguna localización superior a 255.
Lo he puesto en un processo, y en el proceso 1 lo llamo, quedándose en el flag fNumObjetos, los objetos que existe.


Jeje, veo que ya lo has pillado :lol:

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


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 13 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