Hacer que un objeto de uno de varios objetos al azar usando Decorate y ACS

Iniciado por [LOH]lordofhell, Diciembre 15, 2016, 07:08:10 PM

Tema anterior - Siguiente tema

[LOH]lordofhell

No estoy seguro si debi ponerlo aqui o en Bicronomia Informatica, si hace falta moverlo adelante.

Estoy trabajando en un mod de carreras inspirado en Mario Kart y quiero hacer que un objeto de similar al Objeto Cubo que te da un objeto al azar, intente hacer esto atravez de un script que se ejecutara cuando el jugador tomara un objeto y entrara a un estado en el que al jugador se le daria el objeto al mismo tiempo que muestra la imagen de esta, pero esto causa un bucle infinito que termina crasheando el juego, si por favor alguien me puede ayudar a implementar esto. Les pongo una muestra del codigo que tengo para que se den una idea de lo que estoy intentando, solo dejo la parte que necesito arreglar en cuanto a Decorate.

Código (Decorate) [Seleccionar]

Actor DoomSlayer : PlayerPawn
{
Health 9999
Radius 16
Height 56
Mass 100
PainChance 255
DamageFactor "Kick", 0
Speed 0
Scale 0.5
Player.DisplayName "Doom Slayer"
Player.StartItem "BikeHUD"

States
{
Spawn:
DSLY A 1 SetPlayerProperty(1,1,4)
Goto Stay
Stay:
DSLY A 0 Healthing(100)
                TNT1 A 0 A_JumpifInventory("RandomItem",1,"GiveItem")
TNT1 A 0 A_TakeInventory("BikeSpeed", 1)
TNT1 A 0 A_JumpIfInventory("TurnLeft", 1, "TurnLeft")
TNT1 A 0 A_JumpIfInventory("TurnRight", 1, "TurnRight")
TNT1 A 0 A_JumpIfInventory("BackPedal", 1, "BackPedal")
TNT1 A 0 A_JumpIfInventory("Turbo", 1, "Accelerate")
TNT1 A 0 A_JumpIfInventory("Accelerate", 1, "Accelerate")
DSLY A 1 SetPlayerProperty(1,1,4)
TNT1 A 0 A_JumpIfInventory("TurnLeft", 1, "TurnLeft")
TNT1 A 0 A_JumpIfInventory("TurnRight", 1, "TurnRight")
TNT1 A 0 A_JumpIfInventory("BackPedal", 1, "BackPedal")
TNT1 A 0 A_TakeInventory("MaxLeft", 1)
TNT1 A 0 A_TakeInventory("MaxRight", 1)
TNT1 A 0 A_JumpIfInventory("Accelerate", 1, "Accelerate")
TNT1 A 0 A_PlaySound("KARTEFF1", 2, 1, 1)
TNT1 A 0 A_TakeInventory("MaxLeft", 1)
TNT1 A 0 A_TakeInventory("MaxRight", 1)
Loop
      GiveItem:
                TNT1 A 0 A_JumpifInventory("CheckItem",1,"Stay")
                TNT1 A 0 A_GiveInventory("CheckItem",1)
                TNT1 A 0 ACS_ExecuteAlways(602,0)
                Goto Stay


Actor RandomItem : Ammo 10000
{
   Radius 64
   Height 64
   Inventory.PickupMessage "You got a Random Item!"
   Inventory.PickupSound "ITEMBOX1"
   Inventory.Amount 1
   Inventory.MaxAmount 1
   +MOVEWITHSECTOR
   States
   {
   Spawn:
      ITEM ABCDEFGHIJKLMNOP 4 Bright
      Loop
   Pickup:
      TNT1 A 0
      Stop
   }
}


Código (ACS) [Seleccionar]
Script 602 (void)
{
   int Check = Random(1,2);
   if(Check == 1){
      GiveInventory("GreenSkullAmmo",1);
      SetFont("ITMGSKUL");
      HudMessage(s:"A"; HUDMSG_Plain, PlayerNumber(), 0 , 0.5, 0.1, 0);
   }
   if(Check == 2){
      GiveInventory("RedSkullAmmo",1);
      SetFont("ITMRSKUL");
      HudMessage(s:"A"; HUDMSG_Plain, PlayerNumber(), 0 , 0.5, 0.1, 0);
   }

}

BAZOOKA

#1
Hola.
Hace años que no toco DECORATE pero creo que eso se puede conseguir solo con DECORATE.

Necesitas un objecto de inventario personalizado CustomInventory que tenga el state Pickup (si es instantáneo) o Use (si se activa) y añades en la primera línea un frame instantáneo (TNT1 A 0 A_Jump (256, nº linea del ítem que quieres activar) ) y luego añades todos los items que quieres que se activen (cada uno en una linea con TNT1 A 0 A_GiveInventory("ITEM") seguido de stop después de cada línea para que termine excepto en la primera.

Para que se añada una imagen cuando cojas el item tienes que añadir en SBARINFO el comando
InInventory ITEM y dentro de este donde quieres que aparezca la imagen y los números (si tiene contador) con DrawNumber y DrawImage.

En la wiki de Zdoom encontrarás la info más detallada.

Insisto. No se como de avanzado es el estado actual de DECORATE desde que hice mi útimo mod.

[LOH]lordofhell

Cita de: BAZOOKA en Diciembre 18, 2016, 07:04:00 PM
Hola.
Hace años que no toco DECORATE pero creo que eso se puede conseguir solo con DECORATE.

Necesitas un objecto de inventario personalizado CustomInventory que tenga el state Pickup (si es instantáneo) o Use (si se activa) y añades en la primera línea un frame instantáneo (TNT1 A 0 A_Jump (256, nº linea del ítem que quieres activar) ) y luego añades todos los items que quieres que se activen (cada uno en una linea con TNT1 A 0 A_GiveInventory("ITEM") seguido de stop después de cada línea para que termine excepto en la primera.

Para que se añada una imagen cuando cojas el item tienes que añadir en SBARINFO el comando
InInventory ITEM y dentro de este donde quieres que aparezca la imagen y los números (si tiene contador) con DrawNumber y DrawImage.

En la wiki de Zdoom encontrarás la info más detallada.

Insisto. No se como de avanzado es el estado actual de DECORATE desde que hice mi útimo mod.

lo del jump en el objeto me lo habian dicho hace poco, no me acordaba de ello, pero no sabia eso del SBARINFO, nomas que eso no me va a servir porque la idea de mi mod es que se juegue en tercera persona, osea con "chasecam"(que por cierto, tengo que investigar como funciona la tercera persona dinamica en Brutal Doom), o acaso eso ignora el estado de la camara?

BAZOOKA

En A_Jump especifiqué mal. Si son por ejemplo 5 objetos que se pueden obtener pues entonces debería escribirse A_Jump(256, 1, 2, 3, 4, 5) siempre que cada linea tenga solo un frame. Las líneas con estados tipo "goto", "Pain", etc no cuentan,
El statusbar es independiente de si la vista está en primera o tercera persona.

Charon

Fácil:

En ACS declaras un array (esto va justo despues de los #import, #include y demás) y luego lo utilizas en el script correspondiente:

str randomitem[3] = { "item_pistola",
                "item_granada",
                "item_viagra"};

Script "GiveMeFreeStuff" (void)

{

GiveInventory (randomitem[Random(1,3)], 1);

}



Lógicamente el "3" del array lo reemplazas por la cantidad de items aleatorios disponibles que puede llegar a obtener el jugador. Siempre revisa que hayas ingresado cada uno de ellos entre comillas y separados por comas, excepto por el último, que no requiere separación.

Luego en decorate ingresas una linea como ésta en el PickUp state del "objeto cubo":


AXXX A 0
AXXX A 0 ACS_NamedExecute ("GiveMeFreeStuff")


Siempre que vayas a usar ACS_NamedExecute en Decorate hazlo en la segunda linea (si no hay nada mas en el state, haz como el ejemplo y mete alguna linea vacía con una duración de 0 tics).

Y listo. Acá el ejemplo (aplicado al Chainsaw - que al recojer te puede dar un Blue Armor, una Soulsphere o una BFG 9000) para que tengas una mejor idea, aunque creo que he sido bastante claro.

https://drive.google.com/open?id=0BzfoHuptiUC6a2FFcGZ2UzVGWFk

EDIT: Disculpas por las groserías impresas en el ejemplo. Suelo usarlas como marcadores para saber cuando un script / decorate se ejecuta correctamente, y he olvidado removerlas.

[LOH]lordofhell

pues intente(o mas bien me tome mi tiempo en hacerlo) con el A_Jump para el A_GiveInventory y a la vez el SBARINFO, pero me da este error:

Script error, "DoomKart.pk3:sbarinfo" line 1:
Bad syntax.

obviamente se encuentra en el SBARINFO, intente hacerlo como le entendi a la wikia, pero obviamente lo hice mal:

InInventory BIKEHUD, 1
{
drawimage "ITMEMPTY", 160, 180;
}

Charon

Si quieres imprimir una imagen especifica al recibir el item, puedes hacerlo mediante SETFONT y HudMessage en el mismo script que sugeri.

No sólo será más práctico, si no que además ese método es muchisimo más versátil.