# GMLtanks

## Introduzione

GMLTanks è un gioco di combattimento tra carri armati pilotati da intelligenza artificiale, non vi è quindi interazione umana durante il combattimento. I giocatori quindi non hanno controllo diretto sul proprio carro armato, ma hanno a disposizione un'interfaccia per programmare la loro IA in GML (ristretto) prima del combattimento Possono giocare simultaneamente fino a 15 carri armati!

## Istruzioni

Per far partire il gioco servono almeno due carri armati, ovvero due files .tank. Trascinare da 2 a 15 files tank sull'eseguibile del gioco per cominciare imediatamente il combattimento!

## Programmare il proprio tank

Un carro armato non è altro che uno script GML (con particolari restrizioni) in formato testuale con estensione .tank . Il gioco comprende due esempi molto semplici da cui partire. Prima di cominciare a programmare, ci sono alcuni aspetti generici del gioco che bisogna tenere presente:

- Il carro armato è composto da 3 elementi, il corpo, la torretta, il radar. Il radar è utilizzato per identificare i nemici nellarena, ed è montato sopra alla torretta
- Girando il corpo, si gira automaticamente anche la torretta e il radar sopra ad essa
- Allo stesso modo, girando la torretta si gira anche il radar
- Importante: ci sono alcuni nomi riservati di variabili riservati: max_speed, max_turn, max_turret_turn, max_radar_turn, max_accel, max_power, step_turn, step_turret_turn, step_radar_turn, step_accel, turret_angle, turret_heat, radar_angle, energy, steps, hit, dead, event, name, chat, colors
- Lo script .tank rappresenta in sostanza l'evento step del carro armato
- Le direzioni sono da considerarsi come da standard GML, 0 = destra, 90 su, 180 sinistra, 270 giù.

## Funzioni disponibili per manovrare il carro armato

Azioni
accelera(valore): aumenta o diminuisce la velocità (massimo 1 per step)
frena(): diminiusce la velocita il piu possibile in modo da fermarsi
gira(valore): gira il tank (massimo 10 gradi per step)
gira_radar(valore): gira il radar (massimo 60 gradi per step)
gira_torretta(valore): gira la torretta (massimo 30 gradi per step)
parla(stringa): mostra una scritta sopra al proprio tank per 3 secondi
spara(potenza): spara un proiettile con la potenza indicata (max 3). Piu il colpo è potente, piu si surriscalda la torretta. Quando la torretta è surriscaldata, non può sparare. Ogni step la torretta si raffredda di 0.1, un colpo di potenza 0.1 può quindi essere sparato una volta ogni step, un colpo di potenza 3 una volta ogni 30.
Eventi
morto(): ritorna true se l'energia del proprio tank e' 0. Una volta distrutto puoi ancora parlare, ma non effettuare altre azioni
colpito(): ritorna true se il tank e' stato colpito da un nemico
nemico_identificato(): ritorna 0 se non sono stati identificati nemici, o il numero del nemico (maggiore di 0)
distanza_nemico(): ritorna -1 se non è stato identificato un nemico, altrimento la distanza tra il proprio carro e il nemico
Altre informazioni
altezza_arena(): altezza in dell'area di gioco
larghezza_arena(): larghezza dell'area di gioco
numero_nemici(): numero di nemici (vivi)
direzione(): direzione del carro
direzione_radar(): direzione del radar
direzione_torretta(): direzione della torretta
energia(): energia del proprio tank (100 = max)
grandezza(): la larghezza totale del carro / 2. L'origine è al centro, di conseguenza la funzione ritorna la lunghezza dal centro al bordo del carro
pos_x(): posizione x del tank (origine al centro)
pos_y(): posizione y del tank (origine al centro)
surriscaldamento_torretta(): ritorna il surriscaldamento della torretta. Se maggiore di 0, non puoi sparare. Ogni step diminuisce di 0.1
tempo(): numero di steps trascorsi dall'inizio del match (parte da 0)
velocita(): velocità attuale

## Funzioni GML disponibili

Sono disponibili per la programmazione dei file .tank le seguenti funzioni GML. Inoltre sono disponibili tutti i costrutti e le operazioni standard tipo for, while, if, +, *, mod ecc...
true
false
pi
is_real
is_string
random
random_range
irandom
irandom_range
random_set_seed
random_get_seed
randomize
choose
abs
round
floor
ceil
sign
frac
sqrt
sqr
exp
ln
log2
log10
sin
cos
tan
arcsin
arccos
arctan
arctan2
degtorad
radtodeg
power
logn
min
max
mean
median
point_distance
point_direction
lengthdir_x
lengthdir_y
real
string
string_format
chr
ord
string_length
string_pos
string_copy
string_char_at
string_delete
string_insert
string_lower
string_upper
string_repeat
string_letters
string_digits
string_lettersdigits
string_replace
string_replace_all
string_count
ds_set_precision
ds_stack_create
ds_stack_destroy
ds_stack_clear
ds_stack_copy
ds_stack_size
ds_stack_empty
ds_stack_push
ds_stack_pop
ds_stack_top
ds_stack_write
ds_stack_read
ds_queue_create
ds_queue_destroy
ds_queue_clear
ds_queue_copy
ds_queue_size
ds_queue_empty
ds_queue_enqueue
ds_queue_dequeue
ds_queue_head
ds_queue_tail
ds_queue_write
ds_queue_read
ds_list_create
ds_list_destroy
ds_list_clear
ds_list_copy
ds_list_size
ds_list_empty
ds_list_add
ds_list_insert
ds_list_replace
ds_list_delete
ds_list_find_index
ds_list_find_value
ds_list_sort
ds_list_shuffle
ds_list_write
ds_list_read
ds_map_create
ds_map_destroy
ds_map_clear
ds_map_copy
ds_map_size
ds_map_empty
ds_map_add
ds_map_replace
ds_map_delete
ds_map_exists
ds_map_find_value
ds_map_find_previous
ds_map_find_next
ds_map_find_first
ds_map_find_last
ds_map_write
ds_map_read
ds_priority_create
ds_priority_destroy
ds_priority_clear
ds_priority_copy
ds_priority_size
ds_priority_empty
ds_priority_add
ds_priority_change_priority
ds_priority_find_priority
ds_priority_delete_value
ds_priority_delete_min
ds_priority_find_min
ds_priority_delete_max
ds_priority_find_max
ds_priority_write
ds_priority_read
ds_grid_create
ds_grid_destroy
ds_grid_copy
ds_grid_resize
ds_grid_width
ds_grid_height
ds_grid_clear
ds_grid_set
ds_grid_add
ds_grid_multiply
ds_grid_set_region
ds_grid_add_region
ds_grid_multiply_region
ds_grid_set_disk
ds_grid_add_disk
ds_grid_multiply_disk
ds_grid_set_grid_region
ds_grid_add_grid_region
ds_grid_multiply_grid_region
ds_grid_get
ds_grid_get_sum
ds_grid_get_max
ds_grid_get_min
ds_grid_get_mean
ds_grid_get_disk_sum
ds_grid_get_disk_min
ds_grid_get_disk_max
ds_grid_get_disk_mean
ds_grid_value_exists
ds_grid_value_x
ds_grid_value_y
ds_grid_value_disk_exists
ds_grid_value_disk_x
ds_grid_value_disk_y
ds_grid_shuffle
ds_grid_write
ds_grid_read