Pipebomb con sorpresa

Iniciado por Karnizero, Diciembre 09, 2005, 05:45:27 PM

Tema anterior - Siguiente tema

Karnizero

Hace algún tiempo, había empezado una especie de TC.

La cuestión es que ahora necesito que cuando el jugador haga explotar la pipebomb, a parte de la esperada explosión, quiero que aparezca algo más.

He buscado por todo el Game.con, pero no encuentro el actor que corresponde a la pipebomb cuando está en el suelo.

¿Alguien sabe cuál es?

Otra cosa: He mirado lo de los sector efectors que hacen que los enemigos aparezcan al cabo de un tiempo, pero creo que hay una manera más fácil. ¿Es posible hacerle al actor, por ejemplo, al Octabrain, una vez muerto, un contador que al cabo de un tiempo, pase de estado "muerto" a estado normal?

Gracias de nuevo :)

malone3d

Si quieres que aparezca algo cuando explosiona la pipebomb tendras que ir al actor de la explosion de la pipebomb que es EXPLOSION2. En el añadiendo un ifspawnedby HEAVYHBOMB podrás añadir el codigo que quieras. Un ejemplo:


actor EXPLOSION2 1 EXPLOSION_FRAMES
 ifactioncount 10
    ifspawnedby HEAVYHBOMB
       quote 125 // como ejemplo queremos que aparezca un texto
                      // cuando se llega a la frane 10. Si en vez de poner el
                      // quote pusieramos un bloque de codigo se ejecutaria
                      // a partir de se reproduzca la frame 10 de este actor
                      // cuando aparece de una Pipebomb
 ifactioncount 20
   killit
enda


En cuanto a lo del octabrain... yo usaria un ifcount para resucitarle.

Karnizero

Ok, muchas gracias.

Y otra cosilla, ¿cómo haceis para saber qué "actor" corresponde con cada arma y con cada disparo? Osea, ¿cómo puedo saber qué actor corresponde con la escopeta, cuál con la pistola, y con cada una de las armas?

He intentado buscar los actores usando el Kate (Linux), pero si busco, por ejemplo, algo así como "shotgun", me aparecen un montón de coincidencias...

Pues eso por ahora. Si tengo más dudas ya os preguntaré. Gracias de nuevo.

Por cierto, la TC se llamará Terminator: Anihilator.

No va a haber gráficos distintos para las armas, pero sí su funcionamiento será distinto.
Por ahora ya tengo hecho un arma, y un par de mapas...

malone3d

Eso ya es un poco más complejo ya que algunas armas disparan los mismos proyectiles pero te pongo una lista acontinuacion para que te sirva de orientacion:

     

ARMA           PROYECTIL (ACTOR)
====           =================
PATADA         KNEE
PISTOLA        SHOTSPARK1
ESCOPETA       SHOTGUN
CHAINGUN       SHOTSPARK1
RPG            RPG
PIPEBOMB       HEAVYHBOMB
SHRINKER       SHRINKER
DEVASTADORAS   RPG
MINA LASER     HANDHOLDINGLASER
CONGELADOR     FREEZEBLAST
EXPANDER       GROWSPARK


Estas son las armas que tiene el jugador. Todas ellas (a excepcion del HANDHOLDINGLASER que esta internamente hecha por C) estan definidas en CON. Las podras encontrar como ACTOR ELACTORQUEQUIERAS. Algunas de ellas tienen codigo como el SHOTSPARK1, sin embargo otros solo tienen una linea definiendo la fuerza del proyectil. No lo recuerdo bien pero creo que podias introducir mas codigo.

Por ejemplo:


actor KNEE KNEE_WEAPON_STRENGTH enda
actor SPIT SPIT_WEAPON_STRENGTH enda
actor CHAINGUN CHAINGUN_WEAPON_STRENGTH enda
actor SHOTGUN SHOTGUN_WEAPON_STRENGTH enda
actor FIRELASER FIRELASER_WEAPON_STRENGTH enda
actor HEAVYHBOMB HANDBOMB_WEAPON_STRENGTH enda
actor BOUNCEMINE BOUNCEMINE_WEAPON_STRENGTH enda
actor MORTER MORTER_WEAPON_STRENGTH enda
actor SHRINKSPARK SHRINKER_WEAPON_STRENGTH enda


Fijate que ademas de los proyectiles diseñados especificamente para las armas del jugador tienes otros como el firelaser del liztroop, aunque esta ultima tiene tambien algo de C esta definida aqui, supongo que tambien se podria modificar.

No se si era eso exactamente lo que querias saber pero ahi lo dejo.

Karnizero

Sí, mas o menos eso era lo que quería, pero era algo así como, por ejemplo, cuando dispares la escopeta, en vez de aparecer en la pared los agujeros de los perdigones, que aparezca una explosión tipo "EXPLOSION2".

La pregunta es: ¿Cómo se modifica el disparo en sí de las armas?

Otro ejemplo: Cuando disparas la RPG, que salga el disparo de Shrinker, en vez de un misil.

malone3d

Cita de: "Karnizero"
Otro ejemplo: Cuando disparas la RPG, que salga el disparo de Shrinker, en vez de un misil.

Con Eduke32, ya que te permite tocar las definiciones de las armas y cambiar el proyectil. Con el Duke3D normal es mucho mas complejo ya que tendrias que cambiar tu la programacion del proyectil. Con Duke3D no se puede cambiar el proyectil que dispara, no esta definido por ninguna parte, lo unico que quizas logres simular el disparo del Shrinker pero sin ser el proyectil del Shirnker.

Citar
cuando dispares la escopeta, en vez de aparecer en la pared los agujeros de los perdigones, que aparezca una explosión tipo "EXPLOSION2".

Lo mismo que antes.

En definitiva, Eduke32 es mucho mas complejo pero te deja hacer muchisimas mas cosas que con el Duke normal, o cosas que se pueden hacer con los dos pero con Eduke32 resulta mas sencillo.

Karnizero

Lo que quiero hacer es lo siguiente:

Cuando lanzas un pipebomb, éste explota, como siempre, pero en vez de acabar la cosa así, aparece otro pipebomb (o algo similar), que comience a disparar balas (de la pistola u chaingun) hacia todas partes, durante 2 o tres segundos.

Yo había hecho algo así: (para la versión 1.5)


Esto es el actor que disparará:
useractor notenemy LANZABALAS
{
spawn PIPEBOMB
sound CHAINGUN_FIRE
spin
shot CHAINGUN
ifcount 200
killit
}
enda


Y en la parte correspondiente de "EXPLOSION2", escribí:


[...]
ifspawnedby PIPEBOMB
{
spawn LANZABALAS
}
[...]


Sin embargo cuando intento iniciar el juego, me dice que el GAME.CON tiene errores.

malone3d

Es que ese codigo es incorrecto. Los fallos son estos:

shot CHAINGUN

El comando es shoot

spin

Eso no es un comando, es un atributo. Se usa con los comandos "ai" y "move" y se refiere al movimiento. Lo que tu querras hacer es que gire alrededor de si mismo y empiece a disparar proyectiles, entonces yo haria esto:

Primero definiria el movimiento:

move M_LANZABALAS 0 geth spin


Y lo llamaria asi en tu codigo


useractor notenemy LANZABALAS
{
spawn PIPEBOMB
sound CHAINGUN_FIRE
move M_LANZABALAS geth
shoot CHAINGUN
ifcount 200
killit
}
enda


A este codigo a simple vista y por mi experiencia con el CON Script podria decirte que te va a dar un fallito muy gracioso, y es que disparará muchisimos proyectiles debido a que no tienes algo que controle eso hasta que llegue al count 200 (y si no me fallan los calculos sera aproximadamente 6.25 segundos). Todo esto te lo digo sin probarlo, puede que tenga razon o que no la tenga, tu primero pruebalo como lo tienes y observa lo que pasa. En cuanto a lo del move deberia funcionar asi, si no lo hace, juega un poco cambiando el spin en el move de abajo y dejado la definicion con solo "0".

Karnizero

Lo de los seis segundos lo hice a posta para verlo en acción.

He probado lo que me dices, pero me da un error y comprendo por qué:

El error me lo dá en las siguientes líneas:

actor EXPLOSION2 1 EXPLOSION_FRAMES
{
 ifactioncount 20

   killit
 ifspawnedby PIPEBOMB <---
 {                                           <---
   spawn LANZABALAS     <---
 }                                          <---
}
enda


Es ahí donde "llamo" al useractor LANZABALAS. En el código en donde lo creo, no me da ningún error:

move MLANZABALAS 0 geth spin

useractor notenemy LANZABALAS
{
 spawn PIPEBOMB
 sound CHAINGUN_FIRE
 move MLANZABALAS geth
 shoot CHAINGUN
 ifcount 200
 killit
}
enda


El actor lo he definido al principio de todo del CON, y lo llamo desde el código de EXPLOSION2, en la línea 1500 mas o menos.

En principio parece que está bién, pero no sé por qué me da error al llamarlo en el EXPLOSION2.

Si pongo las líneas marcadas en forma de comentario (osea, poniendo // antes), ya no me da error.

malone3d

¿El codigo de lanzabalas lo has puesto antes o despues de explosion2? Porque recuerda que la compilacion es lineal de arriba hacia abajo y tiene que estar creado antes.

De todas formas podrias poner lo que pone en el log (lo errores y warnings) para saber que es lo que falla. Si usas JFDuke el resultado de la compilacion lo ponia en duke3d.log.

Otra cosa mas: prueba a cambiar PIPEBOMB por HEAVYHBOMB.

Karnizero

Por fin lo he conseguido.

Sin embargo, queda un pequeño detalle.

Aunque la TC va a perder algo de emoción, necesito ayuda para esto:

El funcionamiento del pipebomb es sencillo: lo lanzas, aprietas el botón, explota, y salen balas hacia todos lados durante dos segundos contados.
Además, he añadido que cuando uses un pipebomb de estos, se te gastan balas de la chaingun. Y aquí está el error: cada pipebomb consume unas 10 balas, pero si en la caingun sólo quedan 3 balas, al activar el pipebomb, las balas quedan negativas, apareciendo, en vez de 0 balas, el dibujo de los esteroides.

y la pregunta es: ¿Cómo controlo el número de balas restantes?

malone3d

Cita de: "Karnizero"
¿Cómo controlo el número de balas restantes?

El numero de balas es algo que se controla con la estructura del jugador. Eso que yo recuerde en estos momentos solo se puede hacer en Eduke. Con Duke3D normal solo puedes sumar o restar municion pero no acceder al valor de la municion.

Entonces yo la solucion de primeras que le encuentro es que no le reste balas a la chaingun. Si se me ocurre alguna mejor idea ya te lo dire.

Dark System

talvez esto ya lo usaron pero es una idea de lo que tengo

actor EXPLOSION2 1 EXPLOSION2AC
ifactioncount 20
killit
// comienzo
ifrnd 2 // Esta pequeño comando puede hacer que aparezca algo en algun momento de la explosion
// comandos a usar
spawn LIZTROOP // crear bicho
quote 123 // mensaje
shoot MORTER // dispara Bola explosiva
debris SCRAPT1 // tira pedazos de metal
guts JIBS1 // Tira pezados de sangre ,etc
// fin
enda
DS Busca Y Encuentra.No Pueden Contra Nosotros...

Karnizero

Cita de: "malone3d"El numero de balas es algo que se controla con la estructura del jugador. Eso que yo recuerde en estos momentos solo se puede hacer en Eduke. Con Duke3D normal solo puedes sumar o restar municion pero no acceder al valor de la municion.

Entonces yo la solucion de primeras que le encuentro es que no le reste balas a la chaingun. Si se me ocurre alguna mejor idea ya te lo dire.

¿Y es posible hacer algo así como: (es un ejemplo)

if balas>5
{
explotar el pipebomb y disparar las balas hacia todos los lados
}
else
{
explotar el pipebomb, pero no lanzar las balas hacia todos lados
}


Y si no hay manera posible, pues tendré que hacer que no se gasten balas, aunque eso le quitará emoción y jugabilidad al mod.

Tampoco quiero usar EDuke ya que si hago el mod basado en un source-port, la gente que no tenga el source-port, no podrá jugar.

Gracias por la ayuda :D

malone3d

Es que eso no es posible en el CON del Duke Nukem 3D 1.5 ya que para hacer eso necesitas variables, y como ya has visto el CON basico el manejo de variables ni lo hueles. Cosas de esas es las que ha trabajado Eduke, por esos problemas que tu estas viendo al hacer una cosa tan basica como testear el numero de balas restantes.

Lo que si se puede hacer es tener un control sobre la "cantidad" que te quedan en los objetos del inventorio. En MODs de hace unos años se trabajaba con esto para simular una varible, con esto conseguian hacer efectos con varios sprites, para que fueran simultaneos en determinados momentos o cuando pasaran ciertas cosas. Quizas puedas hacer algo con eso, aunque tener un control de la municion no se puede ya que podrias tener un control parejo de la municion que entra pero no de la que sale...

De todas formas y perdona mi curiosidad... al disparar un pipebomb y que explosione te resta balas... ¿Que intentas simular con eso?, en principio creia que lo decias para la metralla de las granadas pero claro...