CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Jul 2019 14:52

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 13 mensajes ] 
Autor Mensaje
NotaPublicado: 30 Nov 2009 22:53 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 734
Hola. Estoy estudiando la forma de manejar peleas en una aventura conversacional. Creo que no es la primera vez que se plantea este tema en los foros, así que tal vez alguien que ya haya estado dándole vueltas al asunto pueda aconsejarme un modo de afrontarlo. En fin, se me ha ocurrido que podría ser interesante que, cuando un PJ ataca, pudiese dirigirse el punto del adversario sobre el que se realiza el ataque. (Un policía podría poner fin a un robo disparando al ladrón en la cabeza o el torso [> ataca (dispara) al ladrón en la cabeza], matándolo; o disparándolo en una pierna o un brazo para poder llevárselo detenido sin matarlo [> ataca (dispara) al ladrón en una pierna].)

¿Sabéis si ya se ha probado a implementar algo así en una aventura antes? ¿Cómo se podría programar eso en INFSP6?


Arriba
 Perfil  
 
NotaPublicado: 01 Dic 2009 00:02 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
En el AGE existe eso. Cada criatura tiene unos miembros, esos miembros pueden tener otros miembros (por ejemplo un brazo que tenga mano que tenga dedos). Se puede atacar a la criatura (entonces se impacta en un miembro aleatorio en función del volumen, por ejemplo es más fácil dar en el torso que dar en una mano) o se puede atacar a un miembro específico.

Pero en Inform no puedo ayudarte, sorry.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 01 Dic 2009 01:01 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Makinaimo escribió:
Hola. Estoy estudiando la forma de manejar peleas en una aventura conversacional. Creo que no es la primera vez que se plantea este tema en los foros, así que tal vez alguien que ya haya estado dándole vueltas al asunto pueda aconsejarme un modo de afrontarlo. En fin, se me ha ocurrido que podría ser interesante que, cuando un PJ ataca, pudiese dirigirse el punto del adversario sobre el que se realiza el ataque. (Un policía podría poner fin a un robo disparando al ladrón en la cabeza o el torso [> ataca (dispara) al ladrón en la cabeza], matándolo; o disparándolo en una pierna o un brazo para poder llevárselo detenido sin matarlo [> ataca (dispara) al ladrón en una pierna].)

¿Sabéis si ya se ha probado a implementar algo así en una aventura antes? ¿Cómo se podría programar eso en INFSP6?


En "La venganza de Yan" implementé precisamente eso de elegir partes del cuerpo donde atacar.

La aplicación a combates sobre partes del cuerpo está explicada aquí:
http://informatetu.blogspot.com/2009/04 ... e-yan.html

Este sistema es un tanto complicado ya que requiere superponer un parseado alternativo que busque cadenas al margen del parseado estandar de inform. Si te interesa te paso el código que lo hace.

Al margen de esto, la forma más directa y sencilla sería creando objetos para las diversas partes del cuerpo:

Código:
object ENEMIGO "enemigo"
with name 'enemigo' 'esbirro',
before[;
attack: "Golpeas al enemigo... ¡pero no has dicho dónde!";
],
has animate transparent;

object BRAZO_ENEMIGO "brazo" ENEMIGO
with
name 'brazo' 'brazos' 'mano' 'manos',
adjectives 'enemigo' 'esbirro' 'por',
before[;
attack: "golpeas el brazo del enemigo";
take: "Agarras al enemigo por un brazo y le haces una llave de judo.";
],
has scenery;

object CABEZA_ENEMIGO "cabeza" ENEMIGO
with
name 'cabeza' 'craneo' 'cara' 'rostro',
adjectives 'enemigo' 'esbirro',
before[;
attack: "golpeas la cabeza del enemigo";
],
has scenery female;


En fín, el resultado es el mismo. La única diferencia es que con el primer sistema tienes un único objeto ENEMIGO y lo programas todo dentro de él; las partes del cuerpo no existen como objetos sino que son coincidencias que el parseado alternativo ha encontrado en tu orden y activan ciertas variables o flags.

Con el segundo sistema tienes varios objetos-partes-del-cuerpo que se mueven con el objeto-enemigo, y cada en cada objeto-parte-del-cuerpo programas la acción de golpear al enemigo en esa parte de su cuerpo.
Si no quieres complicarte la vida te aconsejo el segundo.

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 07 Dic 2009 15:55 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 734
Hola. Estuve echando un ojo a las explicaciones de tu blog, Jarel, pero se me hacía todo demasiado complicado así que había dejado un poco aparte el tema de las peleas y he seguido programando otras cosas de la aventura. Pero ahora ya no puedo seguir sin el sistema de combates.
Tengo tres enemigos delante y he estado pensando en programar sus tres cabezas, tres objetos brazos (si ya se que tienen seis!), tres objetos piernas, y tres torsos; para no complicarme demasiado. Pero parece mucho más elegante tu sistema de combates.

¿Puedes echarme un mano con eso del parseado alternativo? Ahora ya uso un parseado que no trata de igual forma a los nombres que a los adjetivos.

De todas formas. Usando el sistema de programar una cabeza, brazos, piernas... para cada enemigo, ¿el parser podría comprender la orden: "> ataca al ladrón bajito en la cabeza"?

Y por supuesto, muchas gracias por la ayuda.


Arriba
 Perfil  
 
NotaPublicado: 07 Dic 2009 17:04 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2918
Ubicación: España (Galicia)
Hola !

A ver, para la forma clásica para solucionar el problema:

Código:
class ParteDelCuerpo
with
    puntosDeVida 100,
    puntuacion 0,          ! Guarda la puntuacion que vale golpear en esta parte del cuerpo
    before [;
        Attack:
            if ( other == Nothing ) {
                other = child( self ) )   ! El primero que se encuentre
            }

            self.puntosDeVida = self.puntosDeVida - other.puntuacion;
           
            if ( self.puntosDeVida <= 0 ) {
                   destroy( self );        ! Desaparece del mapa
            }
    ],
;

class Cabeza(10)          ! Para diez enemigos
with
    name 'cabeza',
    puntuacion 10
;

class Pierna(20)
with
    name 'pierna',
    puntuacion 5
;

class Brazo(20)
with
    name 'brazo',
    puntuacion 7
;

class enemigo(10)
with
    init [ miembro;
        miembro = Cabeza.create();
        move miembro to self;

        miembro = Brazo.create();
        move miembro to self;
        miembro = Brazo.create();
        move miembro to self;

        miembro = Pierna.create();
        move miembro to self;
        miembro = Pierna.create();
        move miembro to self;
    ],
has transparent;

[ initialise maloso;
    location = ...;

    maloso = Enemigo.create();
    maloso.name = 'tobias';
    move maloso to location;

    ! más malosos...

    ! inicializar malosos
    foreach( maloso ofclass Enemigo ) {
        maloso.init();
    }
];

extend 'ataca' first
   * 'a//'/'al' noun 'en' noun -> ataca
   * noun 'en' noun -> ataca
   * noun noun -> ataca
;


Así es compatible con el atacar tradicional, mientras soporta las nuevas partes del cuerpo. No sé si funcionará del todo tal cuál está, pero la idea es esta desde luego.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 07 Dic 2009 18:02 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Makinaimo escribió:
De todas formas. Usando el sistema de programar una cabeza, brazos, piernas... para cada enemigo, ¿el parser podría comprender la orden: "> ataca al ladrón bajito en la cabeza"?

Incluso podría entender ">ataca al ladrón bajito en la cabeza pero suavecito" ;D
Dame tiempo y te preparo un código.

Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 07 Dic 2009 18:02 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
baltasarq escribió:
Código:
! inicializar malosos
    foreach( maloso ofclass Enemigo ) {
        maloso.init();
    }
];


"foreach"? :shock: :? No querrás decir "objectloop"? :o

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 08 Dic 2009 12:56 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2918
Ubicación: España (Galicia)
Hola !

Eliuk Blau escribió:
"foreach"? :shock: :? No querrás decir "objectloop"? :o


Sí; no tenía un compilador a mano.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 09 Dic 2009 21:31 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Ahí va el código:

Código:
!primero declaramos las variables que necesitemos para detectar palabras
global variable1;
global variable2; !para detectar palabras clave en conversaciones
global variable3; !para detectar palabras clave en conversaciones
global variable4; !para detectar palabras clave en conversaciones
global variable5; !para detectar palabras clave en conversaciones
global variable6; !para detectar palabras clave en conversaciones


!#######################################################
! BEFOREPARSING - CONVERSACIONES
!#######################################################
[BeforeParsing i j thisword thislength x exceso;
!ponemos a 0 todas las variables de detección
      variable1=0; !para conversaciones
      variable2=0; !para conversaciones
      variable3=0; !para conversaciones
      variable4=0; !para conversaciones
      variable5=0; !para conversaciones
      variable6=0; !para conversaciones
   for (i=parse-->0,j=1:j<=i:j++) !ATENCIÓN; en Zcode es "parse->1", en Glulx es "parse-->0"
           !!!parse-->0 devuelve el número de palabras escritas,num_words = parse-->0;
   {!mnfo
      thisword = WordAddress(j);
      thislength = WordLength(j);
       if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' )
         { !###AAA

              if(thisword->0=='c' && thisword->1=='a'
                && thisword->2=='b' && thisword->3=='e'
               && thisword->4=='z' && thislength==6
                )variable1=33;

              if(thisword->0=='p' && thisword->1=='i'
                && thisword->2=='e' && thisword->3=='r'
               && thisword->4=='n'
                )variable1=34;

         }!###AAA
   }!mnfo
];
! en este caso 'cabeza' hace variable1=33, y 'piernas' hace variable 1=34.
! Así hecho, no podríamos detectar a la vez piernas y cabeza. Deberíamos usar variables distintas.
! En este caso sencillo con una sola variable es suficiente, para casos más complejos es mejor usar
! flags (librería Newflags.h, por ejemplo), un flag para cada concepto, y así nunca hay conflicto.
!
!Tal como hemos definido cabeza, sin el último caracter pero con la longitud, la variable se activaría con "cabeza",
!"cabezo", "cabezz"... etc
! en el caso de 'piern' no hemos delimitado longitud, luego colaría "piern", "pierna", "piernas", "piernosillo"...etc

personaje esbirro "esbbirro" limbo
with name 'esbirro',
adjectives 'fuerte' 'flojo' 'cabeza' pierna' 'piernas',
before[;
attack: print "Golpeas al esbirro ";
      if(variable1==33)"en la cabeza"; !si ha detectado la cadena cabez*+longitud=6...
      if(variable1==34)"en las piernas"; !si ha detectado la cadena pierna*** de cualquier longitud...
      "en un lugar cualquiera.";
],
has animate;



Saludos

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 10 Dic 2009 14:20 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 734
Hola.

Baltasarq, muchas gracias por tu ayuda. No tiene nada que ver con el sistema de Jarel, pero no se me había ocurrido que se pudiese hacer algo así. Ya tengo tu código guardado en el disco duro para fijarme en él en algún otro momento.

Ahora mismo estoy probando el código que me ha pasado Jarel y parece que funciona. ¡Gracias! Aunque tengo una pequeña duda. Ya puedo atacar a mis esbirros en la cabeza, el pecho o las piernas introduciendo un comando del estilo "> ataca a la cabeza del esbirro". Pero el parser no entiende las órdenes "> ataca al esbirro en la cabeza" o "> ataca en la cabeza al esbirro". ¿Alguien sabe cómo puedo arreglar eso?

En las líneas de gramática he extendido el comando ataca como me ha enseñado Baltasarq, pero (supongo que) como 'cabeza' está en la lista de adjetivos y el parseado que tengo no los trata igual que a los nombre, el código no funciona y el parser no reconoce la órden.

Código:
Extend   'ataca' first
    * 'a//'/'al' noun 'en' noun     -> Attack
    * noun 'en' noun                -> Attack
    * noun noun                     -> Attack
;


Un saludo.


Arriba
 Perfil  
 
NotaPublicado: 10 Dic 2009 15:41 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2918
Ubicación: España (Galicia)
Hola !

Citar:
En las líneas de gramática he extendido el comando ataca como me ha enseñado Baltasarq, pero (supongo que) como 'cabeza' está en la lista de adjetivos y el parseado que tengo no los trata igual que a los nombre, el código no funciona y el parser no reconoce la órden.


Exacto. Desgraciadamente, no puedes "mezclar" ambos sistemas.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 10 Dic 2009 18:49 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Makinaimo escribió:
Hola.

Ahora mismo estoy probando el código que me ha pasado Jarel y parece que funciona. ¡Gracias! Aunque tengo una pequeña duda. Ya puedo atacar a mis esbirros en la cabeza, el pecho o las piernas introduciendo un comando del estilo "> ataca a la cabeza del esbirro". Pero el parser no entiende las órdenes "> ataca al esbirro en la cabeza" o "> ataca en la cabeza al esbirro". ¿Alguien sabe cómo puedo arreglar eso?


Pues de la misma forma chuza... :lol:

Código:
name 'esbirro',
adjectives 'en' 'la' 'cabeza' 'las' 'pierna' 'piernas' 'contra' 'hacia', !...etc


Vamos, que la idea de este sistema es pasar olímpicamente de las fórmulas de la gramática y movernos en modo "pawslike".

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
NotaPublicado: 11 Dic 2009 13:28 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 734
Después de pasar al modo "pawslike" parece que más o menos funciona. :D
A ver si ahora soy capaz de programar algo pequeñito pero presentable para la OrcosComp...

¡Gracias a todos por la ayuda, y un saludo!


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 3 invitados


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