INFO   Home   Notizie   Info   Tutorials   Interviste   Forum   Mailing List   Contatta leo
GIOCO   Downloads   Archivio   Iscrizione   Uploads   Campionato   Statistiche
|   Gun Tactics II (4 luglio 2018)   ||   MekaWars! (23 settembre 2008)   ||   Disponibili i sorgenti: Scarica i sorgenti completi del gioco (3 maggio 2006)   ||   GUN-TACTYX 1.1.5: modalità calcio migliorata! (11 dicembre 2005)   ||   Uno contro uno: ewm-Krobot 80-20 (20 novembre 2005)   ||   Di nuovo Master: la risposta di ewm_2_43! (13 novembre 2005)   ||   Altre Notizie  |

English English

FAI una DONAZIONE

INFO

Home
Notizie

Info
Tutorials
Interviste

Forum
Mailing List
Contatta leo
 
GIOCO

Downloads
Archivio

Uploads
Iscrizione

Campionato
 
VISITE
Totale 1262
Pagina 54

POWERED BY
APOCALYX 3D Engine

Visita il BLOG di APOCALYX - Ultimo aggiornamento: OGGI!

INFO


Indice

  1. Breve descrizione del gioco
  2. Esempio di script per guerrieri
  3. Excursus storico
  4. Perchè script nel linguaggio SMALL?
  5. A proposito dell'APOCALYX 3D Engine

Breve descrizione del gioco

Arena Plaza Maze

Il gioco consiste nel combattimento tra squadre (da 2 a 4) di guerrieri (da 1 a 64 bot). I guerrieri si muvono in un ambiente complesso che può essere piatto o su due o più piani con muri, rampe e ponti. Un guerriero può scivolare lungo i muri, mantenendo la sua modalità di movimento, ma si ferma immediatamente quando urta un altro guerriero.

La testa di WrokdamI guerrieri possiedono un cervello che consiste in una CPU con una frequenza di clock di 10KHz e una RAM con una memoria di 32Kb. Sono equipaggiati con un fucile che spara pallottole e granate. Il numero di pallottole caricate all'inizio è di 50 fino ad un massimo di 100, mentre le granate sono limitate ad un massimo di 3 ed inizialmente il fucile ne carica solo una, ma ricariche sono disponibili sul campo di battaglia, così come caricatori di pallottole.

PowerupsOgni guerriero ha una quantità iniziale di salute, energia e armatura. La salute (health) è inizializzata al valore massimo, 100, e decresce quando il guerriero è colpito da un proiettile, 50 punti per ogni colpo, o se una granata esplode nelle vicinanze. Nell'ultimo caso la salute persa dipende dalla distanza e gli effetti di uno scoppio influiscono fino a una distanza massima di 5 metri. Quando un guerriero raggiunge un valore nullo o negativo di salute, viene disabilitato. L'energia (energy) è inizializzata al valore 50, mentre il massimo corrisponde a 100. Decresce di 2 unità al secondo quando il guerriero corre, aumenta di 1 unità al secondo quando il guerriero è fermo e mantiene il suo valore corrente se cammina, sia avanti che indietro o accovacciato. Quando l'energia diventa nulla, il guerriero non può correre, ma solo camminare. L'armatura (armor) ha un valore iniziale nullo, mentre il massimo è 100. L'armatura fornisce una protezione dai danni causati dai proiettili e dalle granate proporzionale al suo valore, ma ogni colpo riduce allo stesso tempo la protezione dell'armatura. Ricariche per la salute (medikits), l'energia (food) e l'armatura (full-metal jackets) sono disponibili sul campo di battaglia. Quando un guerriero raccoglie una ricarica, questa scompare dal campo di battaglia, ma viene rigenerata dopo un certo tempo.

Il torso di WrokdamI guerrieri possono ruotare attorno al proprio asse, ruotare ed inclinare il torso fino a determinati angoli, ruotare ed inclinare la testa fino a determinati angoli. Il fucile ed il mirino sono fissati al torso e seguono i suoi movimenti, mentre i sensori per vedere, udire e parlare sono fissati alla testa.

Tra le altre descritte nella documentazione, queste sono alcune delle funzioni disponibili che permettono ai guerrieri di interagire con l'ambiente:

  • bool:say(int:word)
    utilizzata per comunicare con i compagni di squadra o i nemici. Un guerriero può dire (say) una parola, che corrisponde ad un valore intero, ogni mezzo secondo.
  • float:hear(&item,&sound,&float:yaw,&float:pitch,&float:id)
    utile per udire gli spari dei fucili, le esplosioni delle granate e le parole dei guerrieri vicini. Viene restituito il suono più vicino con il suo tipo, la sua distanza e la direzione (angoli yaw e pitch). Ogni hear necessita di 0.04 secondi per essere completato.
  • float:sight()
    è utilizzato per ottenere la distanza delle pareti nella direzione di fronte alla testa. Ogni sight richiede 0.01 secondi per essere completato.
  • float:aim(&item)
    ha la stessa funzione di sight(), ma restituisce la distanza delle pareti nella direzione del fucile o la distanza del guerriero più vicino per mezzo di un raggio laser (il dispositivo di mira). Ogni "aim" richiede 0.04 secondi.
  • int:watch(&item,&float:dist,&float:yaw,&float:pitch,&float:id)
    utile per vedere oggetti, non muri, intorno al guerriero. Viene restituito solo l'oggetto più vicino, al di là una certa distanza, con il suo tipo, la sua distanza e direzione. Per essere visto, un oggetto deve trovarsi di fronte alla testa all'interno di un caratteristico angolo di vista (60 gradi o PI/3 radianti). Ogni watch necessita di 0.04 secondi.
FucileUn incontro ha una certa durata (da un minuto fino a un'ora) e questo ed altri parametri possono essere modificati dall'utente. Ci sono diverse condizioni di vittoria, la prima delle quali può essere selezionata dal giocatore. Le condizioni si applicano nel seguente ordine:

Vince la squadra che...

  1. a) "elimina il comandante nemico", cioè il guerriero che porta l'insegna della squadra. Devono essere disabilitati tutti i comandanti delle squadre nemiche. I comandanti non possono liberarsi dell'insegna e sono perciò facilmente riconoscibili. La loro squadra li deve proteggere mentre cerca, allo stesso tempo, di eliminare i comandanti nemici.
    b) "elimina la squadra nemica". Tutti i guerrieri delle squadre nemiche devono essere eliminati. Quando questo obiettivo è attivo anche i comandanti imbracciano un fucile e non un'insegna.
    c) "cattura l'insegna nemica". Per vincere, i guerrieri di una singola squadra devono catturare le insegne di tutte le squadre nemiche o, in alternativa, eliminare tutti i nemici. Il comandante regge un'insegna all'inizio dell'incontro, ma può lasciarla per imbracciare un fucile.

    ... o, se il tempo a disposizione scade, ...

  2. ha più compagni alla fine dell'incontro
  3. ha eliminato più nemici al termine dell'incontro
  4. ha più salute alla fine dell'incontro
  5. ha più energia al termine dell'incontro
Se nessuna delle condizioni sopra citate è soddisfatta, l'incontro termina in parità.

Le condizioni di vittoria descritte sopra si applicano a tre differenti modalità di gioco: Fight (combattimento), Soccer (calcio) e Race (corsa).

  1. La modalità Fight e le sue caratteristiche sono già state descritte all'inzio di questa sezione. I guerrieri imbracciano un fucile che gli permette di sparare pallottole o granate. La salute, l'energia e le altre proprietà dei guerrieri cambiano secondo le regole già citate. Questa è stata la modalità di gioco implementata per prima in GUN-TACTYX e sono inclusi tre livelli (arena, plaza e maze) che ben si addicono ai combattimenti.
  2. SoccerLa modalità Soccer è un particolare tipo di gioco in cui i guerrieri non imbracciano armi (ma alcuni fucili potrebbero comunque apparire sul livello e i guerrieri potrebbero utilizzarli). Quando è attiva questa modalità, un pallone appare al centro nel punto di coordinate (0,0,0). I guerrieri colpiscono la palla semplicemente muovendosi verso di essa. Quando un guerriero urta il pallone con la sua bounding-box, il simulatore calcola il risultato della collisione seguendo queste regole:
    a) Se la palla colpisce il torso del guerriero, rimbalza semplicemente secondo le leggi degli urti elastici, considerando il vettore normale che va dal centro del guerriero verso la palla. La velocità del guerriero è presa in considerazione per calcolare la velocità finale della palla.
    b) se la palla colpisce le gambe del guerriero, rimbalza come già descritto sopra, ma viene aggiunta anche una velocità addizionale dovuta al "calcio". La direzione di questa velocità sul piano orizzontale è data dal vettore normale che va dal centro del guerriero verso la palla, mentre la componente verticale viene fornita dall'inclinazione del torso. Se il torso è diretto verso l'alto secondo un certo anglolo, la velocità del "calcio" acquisisce un angolo inziale diretto verso l'alto. Il modulo della velocità viene selezionata dal guerriero grazie alla funzione setKickSpeed() e il suo valore massimo di default vale 5 m/s. Quando viene eseguito un "calcio", la palla rimbalza sulla geometria del livello perdendo una certa percentuale della propria velocità ad ogni urto, la perdita ha un valore di default pari all'80%.
    L'obiettivo di ogni squadra di guerrieri è quello di mandare la palla nell'area di meta delle squadre avversarie. Le aree di meta sono determinate dalla posizione in cui si trova inizialmente ogni squadra ed hanno una forma sferica. Un guerriero può ottenere informazioni sulle aree di meta per mezzo delle funzioni getGoalLocation(), con indici 1,2 o 3 come argomento per la prima, soconda e terza squadra nemica, e getGoalSize(), che restituisce il valore di default di 7.5 m per il diametro della sfera. Quando la palla entra nell'area di meta di una squadra, il guerriero di quella squadra che è più vicino all'area è immediatamente disabilitato e la palla si trasforma in una granata che esplode dopo 3 secondi, mentre un'altra palla compare al centro del campo. I "kills" che ne conseguono sono attribuiti al guerriero che per ultimo ha toccato la palla. Le altre caratteristiche di questa modalità sono simili a quelle della modalità Fight, incluse le regole per determinare il vincitore. Questa è la seconda modalità implementata in GUN-TACTYX e il gioco include solo un livello (field) che è costruito su misura per gli incontri di Soccer.
  3. La modalità Race è un altro tipo di gioco dove i guerrieri non imbracciano alcuna arma (ma alcuni fucili potrebbero comunque apparire sul livello e i guerrieri potrebbero utilizzarli). Quando questa modalità è attiva, l'obiettivo dei guerrieri è quello di spostarsi attorno all'origine (il punto con coordinate uguali a zero) nella direzione antioraria (guardando il livello dall'alto) evitando gli ostacoli. Quando un guerriero si muove nella direzione sbagliata, perde punti di salute, mentre spostandosi in quella corretta, li guadagna. Un giro completo attorno all'origine fornisce un totale di 100 punti di salute. Quando un guerriero raggiunge i 100 punti, non aumenta ulteriormente la propria salute ma piuttosto sono tutti gli altri guerrieri che decrescono la loro salute dell'ammontare mancante. Un'altra regola che è differente da quelle delle altre modalità è la seguente: quando due guerrieri entrano in collisione, quello con la salute inferiore viene disabilitato. Le altre caratteristiche sono simili a quelle della modalità Fight, comprese le regole che determinano il vincitore dell'incontro. Questa è la terza modalità implementata in GUN-TACTYX e il gioco non contiene per il momento nessun livello costruito appositamente per gli incontri di Race o esempi di possibili tattiche negli script d'esempio. Un livello per questa modalità dovrebbe fornire un ostacolo al centro attorno al quale devono correre i guerrieri: una possibile scelta già disponibile nel gioco potrebbe essere il livello maze, ma un percorso più complesso, con ostacoli e ricariche d'energia, può rendere gli incontri più interessanti.

Per modificare la modalità o gli obiettivi finali di un incontro, occorre visualizzare il pannello delle opzioni, premendo il tasto '0' (zero) quando il gioco mostra il pannello principale, e cambiare le opzioni corrispondenti secondo le proprie esigenze.

Questa è solo una breve descrizione del gioco. Leggi la documentazione inclusa nel gioco per maggiori dettagli.
Per qualsiasi domanda, contattami all'indirizzo tetractys@users.sf.net.

Indice


Esempio di script per guerrieri

I guerrieri nell'arena sono controllati per mezzo di script nel linguaggio SMALL. L'interfaccia per accedere e modificare l'ambiente è fornita da un insieme di funzioni schematiche ma relistiche. I valori assegnati ad alcuni argomenti ed i valori restituiti sono specifici dell'implementazione corrente e possono cambiare in versioni future, ma le API e le loro specifiche sono fissate una volta per tutte. I valori restituiti possono cambiare anche quando un giocatore riconfigura i parametri dell'arena utilizzando gli script.
Un giocatore compila i sorgenti del suo guerriero (per esempio "rookie.sma") usando il comando 's' della console interna al gioco - si può richiamare premendo il tasto [F3] - o utilizzando il programma a linea di comando "sc.exe" contenuto nella cartella "/bots". E' sufficiente scrivere in una finestra DOS:

    sc rookie.sma

e si ottiene il file compilato "rookie.amx". Un esempio di un semplice script è il seguente:

/* "rookie.sma" - simple control code for a team of warriors */
#include "core" // include core functions
#include "math" // include math functions
#include "bots" // include bot specific functions
main() { // the main entry point of the script
  // defines a value to recognize enemy warriors
  new const ENEMY_WARRIOR = ITEM_WARRIOR | ITEM_ENEMY;
  // specifies a time limit to force a change in direction of the warrior
  new const float:MAX_TIME = 10.0 // note the "point" in the constant
  new float:lastTime = getTime()
  // loops forever (or better, until the bot dies)
  while(true) {
    new float:thisTime = getTime()
    if(thisTime-lastTime > MAX_TIME) {
      // changes direction at random every MAX_TIME seconds
      lastTime = thisTime
      new float:randAngle = float(random(21)-10)*1.5708
      rotate(getDirection()+randAngle)
    } else if(sight() < 5.0) {
      // if the warrior is within 5 meters from a wall,
      // change slightly its direction
      rotate(getDirection()+0.31415);
    } else {
      // give a look for the nearest enemy
      new item = ENEMY_WARRIOR;
      new float:dist = 0.0
      new float:yaw
      watch(item,dist,yaw)
      if(item == ENEMY_WARRIOR) {
        // Found one enemy!
        // Do you walk? Stop!
        if(isWalking()) stand();
        // Do you run? Walk!
        else if(isRunning()) walk();
        // Rotate towards enemy direction adding
        // the current direction (absolute) to the
        // enemy direction (relative to the head)
        rotate(getDirection()+yaw);
        // aim and see what is in front of the gun.
        new item
        aim(item)
        // It's an enemy, shoot!
        if(item & ENEMY_WARRIOR == ENEMY_WARRIOR)
          shootBullet()
      } else {
        // Can't find any enemy!
        // Do you walk? Run!
        if(isWalking())
          run();
        // Are you standing?
        else if(isStanding()) {
          // Maybe you collided into someone...
          if(getTouched() & ITEM_WARRIOR != 0)
            // if that is true, make a quarter turn...
            rotate(getDirection()+1.5708);
          else
            // ... otherwise walk.
            walk();
        }
      }
    }
  }
}
Lo script riportato sopra fa uso di un piccolo numero delle funzioni disponibili. Altri script d'esempio sono disponibili nella cartella "\bots". La lista completa delle funzioni è presente nella documentazione inclusa nel gioco con spiegazioni che specificano anche i parametri dei guerrieri e dell'ambiente nell'implementazione corrente.

Indice


Excursus storico

GUN-TACTYX (si legge come gun tactics) è un "CROBOTS-like game with QUAKE3-style graphics". Appartiene al genere dei Programming Games come il CROBOTS di Tom Poindexter, un vecchio gioco DOS del 1985, dove alcuni robots combattono in un'arena, lanciando missili ed evitando i proiettili dei nemici. Questo tipo di giochi è coinvolgente ma non è interattivo, infatti il giocatore deve sviluppare gli algoritmi dell'intelligenza artificiale del suo robot utilizzando un linguaggio di programmazione e successivamente può seguire i combattimenti contro altri robot, possibilmente scritti da altri giocatori.

JROBOTSUn gran numero di questo genere di giochi è disponibile su internet, molti dei quali gratuitamente. Un esempio on-line è il mio JROBOTS ed è possibile visitare il sito, gemello di GUN-TACTYX, ospitato da SourceForge. JROBOTS è un clone di CROBOTS con caratteristiche interessanti. Mentre un giocatore di CROBOTS deve usare un sottoinsieme del C per programmare il suo robot (utilizzando solo matematica intera a causa delle limitazioni dei PC del 1985), un giocatore di JROBOTS impiega il linguaggio Java ed il robot consiste in una singola classe Java (visita http//:www.javasoft.com per maggiori dettagli sul linguaggio Java). Un giocatore può inviare il file corrispondente nell'arena on-line per competere in tornei mensili contro robot sviluppati da altri giocatori. Una delle caratteristiche più interessanti di JROBOTS sono le modalità cooperative, infatti, mentre il CROBOTS originale prevede solo incontri uno contro tutti, JROBOTS supporta anche incontri tra squadre di robots, da due coppie fino a quattro squadre di otto robots ognuna.
Nei tornei svolti finora, sin dall'aprile del 2000, centinaia di jrobots interessanti sono stati inviati nell'arena on-line e le strategie impiegate sono cambiate e si sono affinate nel corso del tempo. Diversi mesi fa (settembre 2003) l'arena è stata suddivisa in due categorie, cadetti e veterani, e la lega maggiore è dominata da IonStorm, il più forte e perfezionato jrobot mai visto nell'arena, scritto da Alan Lund di Eau Claire, WI, USA.

Anche se JROBOTS è un gioco interessante nel suo genere, ha comunque alcune limitazioni. Prima di tutto, per ragioni di sicurezza, i giocatori non possono usare nessuna delle API Java, perché i tornei vengono eseguiti on-line mediate applet Java ospitate dal browser dei visitatori. Quest'ultima potrebbe essere una caratteristica interessante del gioco, così come le dimensioni ridotte (20Kb) del file che contiene il codice del robot ed altre regole di questo tipo che rendono il gioco più difficile, ma un'altro problema ha minacciato la reale efficacia del gioco sin dall'inizio.

Ogni robot caricato nell'arena viene eseguito in un thread Java. L'ambiente della Java Virtual Machine non fornisce nessuno strumento efficace per controllare l'esecuzione dei thread Java e così computer con differenti CPU, sistemi operativi e JVM eseguono le simulazioni in modo più o meno differente favorendo, di volta in volta, uno o l'altro jrobot e invalidando l'efficacia di qualsiasi fase di test condotta su una singola macchina. Il problema è causato dal progetto del gioco basato su thread, piuttosto che basato su turni come altri giochi di questo tipo, ma una soluzione è stata individuata grazie ad alcuni dei migliori giocatori di JROBOTS (Walter Nisticò, autore di un forte jrobot chiamato KillerBees, in collaborazione con il già citato Alan Lund). E' stato sviluppato, infatti, un "Virtual Clock Generator" che batte il tempo delle simulazioni e rende meno evidenti le differenze di comportamento su macchine differenti.

Ad ogni modo, sin dall'inizio, desideravo sviluppare un altro gioco con le caratteristiche migliori di JROBOTS, ma allo stesso tempo piacevole dal punto di vista grafico, con un ambiente d'esecuzione facilmente controllabile e un simulatore più realistico. Dopo una lunga lista di tentativi falliti, la risposta ai miei desideri sembra essere GUN-TACTYX.

Per leggere la storia completa di JROBOTS e notizie più recenti o per partecipare ai tornei mensili on-line, visita il suo sito presso SourceForge (http://jrobots.sourceforge.net/).

Indice


Perchè script nel linguaggio SMALL?

In GUN-TACTYX il giocatore deve sviluppare gli algoritmi dell'intelligenza artificiale della propria squadra di guerrieri usando il linguaggio SMALL. Nella documentazione inclusa nel gioco è possibile trovare un manuale completo sull'uso di questo linguaggio per creare script. SMALL è un potente linguaggio di scripting che si può estendere facilmente e includere in altre applicazioni. Nel nostro caso ci limitiamo alle caratteristiche del gioco che sono utili per creare script per GUN-TACTYX, ma ci sono tante altre possibilità. Per avere maggiori notizie a proposito del liguaggio SMALL, è possibile visitare il sito di ITB CompuPhase (http://www.compuphase.com).

Un interprete SMALL può eseguire istruzione per istruzione il codice generato dal compilatore e fornisce un controllo molto fine dell'esecuzione. E' molto semplice eseguire il codice per un certo numero di cicli di clock (virtuali), sospendere l'esecuzione per iniziarne un'altra, simulare la durata di funzioni particolari. Di conseguenza tutti i guerrieri del gioco utilizzano lo stesso tempo per portare a termine le stesse azioni e quindi la simulazione risulta perfettamente riproducibile. Meccanismi basati sui turni, come chiamate volontarie a funzioni che rilascino l'esecuzione per permettere agli altri guerrieri di "pensare", non sono necessarie.

Un altro vantaggio dell'interprete SMALL è la gestione della memoria. Ogni guerriero ha una quantità di memoria prefissata per immagazzinare le informazioni di cui necessita (stack e memoria heap). Non è possibile per un guerriero utilizzare quanta memoria vuole, minando la sicurezza dello stesso programma.

Il compilatore SMALL ("sc.exe") traduce i sorgenti scritti in un linguaggio simile al C (estensione ".sma") in un codice particolare (estensione ".amx"). Questo tipo di linguaggio è molto semplice da imparare per chi conosce Java, C, C++, C# o altri linguaggi di programmazione, e può introdurre chi non ha esperienza alla programmazione procedurale.

GUN-TACTYX include una console a linea di comando da cui si possono compilare ed eseguire script SMALL (anche non specifici per GUN-TACTYX). Per attivare la console basta premere il tasto 'F3' durante l'esecuzione dell'applicazione. Quando uno script è in esecuzione, si può leggere il suo output sulla console.

Indice


A proposito dell'APOCALYX 3D Engine

GUN-TACTYX è un gioco basato sull'APOCALYX Engine. L'uso di un motore 3D basato su OpenGL aumenta le richieste hardware per l'esecuzione del gioco, infatti una scheda 3D accelerata è assolutamente necessaria per suguire i combattimenti, ma allo stesso tempo rende il gioco più piacevole dal punto di vista grafico. Il motore è compatibile con una versione semplificata delle risorse utilizzate da Quake III (modelli MD3 e livelli BSP), ecco perché dico che GUN-TACTYX è un "CROBOTS-like game with QUAKE3-style graphics".

APOCALYX è un motore 3D basato su OpenGL e altre librerie gratuite. I suoi sorgenti sono disponibili sotto licenza GPL all'indirizzo http://apocalyx.sf.net. Il motore include alcune caratteristiche di base come lens flares, sky boxes, height field terrains, wavy surfaces, scene graph, sprites, billboards, particle system, 3D sound, compressed data management, images loaders, MD3 models animator, BSP levels loader, physics simulator, LUA scripting language, SMALL scripting language e altre caratteristiche più avanzate sono pianificate. L'implementazione attuale supporta solo Win98 (o le versioni più recenti) con una scheda grafica accelerate e driver OpenGL installati.

Desidero ringraziare tutti coloro che hanno contribuito allo sviluppo di questo engine. Prima di tutto, devo ringraziare Matteo "Fuzz" Perenzoni e la sua Apocalypse demo scritta per il NeHe's Apocalypse Contest 2001: i sorgenti della sua demo sono stati il punto di partenza che ha reso possibile lo sviluppo del renderer di APOCALYX e di molti suoi effetti.

Poi devo ringraziare molti siti sulla programmazione dei giochi: portali di notizie, come GameDev, FlipCode, CFXweb, Game Programming Italia e OpenGL.org, e siti di tutorials, come NeHe, Game Tutorials, SULACO e molti altri.

Infine, desidero ringraziare Grant Struthers e Janus per aver fornito i modelli del guerriero e del fucile mitragliatore utilizzati in GUN-TACTYX. I loro modelli sono ospitati su PolyCount.

Per maggiori informazioni su APOCALYX, visita http://apocalyx.sourceforge.net.

APOCALYX 3D Engine

Index

Per maggiori informazioni
invia un'email a
APOCALYX 3D Engine
Copyright © 1999-2008 Leonardo Boselli
Tutti i diritti riservati. Clausole legali.