WIF - La Community Italiana di The Battle for Wesnoth

Wesnoth Italian Forum
La Community Italiana di The Battle for Wesnoth uno dei migliori giochi multiplayer online gratis open source, a turni di ambientazione fantasy. Iscriviti a wifper partecipare ai tornei online, allo sviluppo di nuove estensioni (campagne, mappe, ere, scenari, fazioni) e a tutte le iniziative di w.i.f. per questo meraviglioso gioco strategia . Giocare gratis on line non è mai stato più facile.

Se stai cercando giochi multiplayer online, giochi di strategia, giochi a turni, giochi open source, giochi gratuiti o giochi fantasy, vieni a giocare online in multiplayer con noi! Questo è il forum che cercavi.
25 Maggio 2018, 11:30:08 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
 Notizia
VENITE A TROVARCI NELLA CHAT DI W.I.F.
- per organizzare partite ed incontri Ghigno  -
Ti aspettiamo!
Ricerca avanzata  
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Attacchi con ricarica  (Letto 68 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Yomar
Eroe del Reame
*****
Scollegato Scollegato

Messaggi: 437



WWW
« inserita:: 17 Maggio 2018, 21:02:37 »

Come faccio a fare in modo che un'unità possa usare un certo attacco solo tipo ogni 2 o 3 turni.
Oppure limitare l'attacco in modo che possa essere usato solo tipo 3 volte.
Ho creato un mago con un attacco magico veramente potente, perciò volevo fare in modo che possa usarlo solo ogni 2 turni o che abbia a disposizione un numero limitato di quella specifica magia.
Come posso implementare queste due soluzioni ?
Registrato
Nicodema
Maestro di Battaglia
****
Scollegato Scollegato

Messaggi: 365


GRRRRRRRRRRRRR


« Risposta #1 inserita:: 18 Maggio 2018, 15:16:31 »

Se non sbaglio in una campagna ufficiale (non ricordo quale) in uno scenario si co,batte contro un dragone che soffia solo una volta ogni quattro (anche qui non ricordo il numero preciso) turni. Puoi provare a vedere il codice, sempre che tu trovi la campagna e lo scenario in questione...
 Linguaccia
Registrato
Argesilao
Maestro di Battaglia
****
Scollegato Scollegato

Messaggi: 197



« Risposta #2 inserita:: 18 Maggio 2018, 16:49:26 »

SI PUO FARE! (cit. Frederick von Frankenstein)
FORSE! (cit. Argesilao)

Vediamo il primo caso, e supponiamo:

a) l'attacco da te creato sia identificato con name=yomar_special_attack
b) che, una volta usato, non lo si possa utilizzare nei 3 turni successivi

Il vero problema consiste nell'immagazzinare l'informazione che una certa unità ha usato l'attacco un certo numero di turni prima del turno attuale; si può fare in vari modi; personalmente ho pensato a quello che segue perché evita di avere variabili strane che gironzolano per lo scenario o per la campagna in cui l'unità dotata dell'attacco in questione viene utilizzata.

Poiché è un'operazione ripetitiva è meglio creare prima queste macros .

Codice:
#define DUMMY_ATTACK
number=0
damage=0
defense_weight=0
attack_weight=0
# niente vieta di inserire altre caratteristiche come l'icona o la descrizione
#enddef

#define YOMAR_SPECIAL_ATTACK

# all'interno di questa macro vanno inserite tutte le caratteristiche dell'attacco speciale; number, damage, icon, name, etc etc

#enddef

Quindi, dopo l'uso dell'attacco speciale sostituiamo, per l'unità interessata, l'attacco speciale con un attacco 'farlocco'

Codice:
[event]
name=attack_end
first_time_only=no
[filter_attack]
name=”yomar_special_attack”
[/filter_attack]
[object]
[filter]
id=$unit.id
[/filter]
[effect]
apply_to=remove_attacks
name=yomar_special_attack
[/effect]
[effect]
apply_to=new_attack
name=dummy_attack_0
{DUMMY_ATTACK}
[/effect]
[/object]
[/event]

adesso, all'inizio di ogni turno di ogni fazione dobbiamo controllare quali unità di questa fazione ha l'attacco dummy_attack_0 per sostituirlo con dummy_attack_1, farlocco quanto il precedente; quali  hanno dummy_attack_1 per sostituirlo con dummy_attack_2 e quali hanno dummy_attack_2 per sostituirlo con dummy_attack_3; infine dummy_attack_3 viene sostituito con lo yomar_special_attack.

Codice:
#define CHANGE_ATTACK  ATTACK_1 ATTACK_2 ATTACK_VALUES
[store_unit]
[filter]
side=$side_number
[has_attack]
name={ATTACK_1}
[/has_attack]
[/filter]
variable=stored_units
[/store_unit]
{FOREACH stored_units i}
[object]
[filter]
id=$stored_units[$i].id
[filter]
[effect]
apply_to=remove_attacks
name={ATTACK_1}
[/effect]
[effect]
apply_to=new_attack
name={ATTACK_2}
{ATTACK_VALUES}
[/effect]
[/object]
{NEXT i}
{CLEAR_VARIABLE stored_units,i}
#enddef

[event]
name=side turn
first_time_only=no
{CHANGE_ATTACK “dummy_attack_3” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_2” “dummy_attack_3” ({DUMMY_ATTACK})}
{CHANGE_ATTACK “dummy_attack_1” “dummy_attack_2” ({DUMMY_ATTACK})}
{CHANGE_ATTACK “dummy_attack_0” “dummy_attack_1” ({DUMMY_ATTACK})}
[event]

Manca ancora un controllo da fare; se le unità in questione vengono usate in più scenari successivi bisogna ripristinare l'attacco speciale alla fine di ogni scenario; quindi aggiungiamo i seguenti tag: questi tag non sono necessari negli scenari singoli.

Codice:
[event]
name=victory
first_time_only=no
{CHANGE_ATTACK “dummy_attack_0” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_1” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_2” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_3” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
[event]

[event]

        # questo tag, invece, non so se ha senso usarlo, probabilmente no; comunque male non fa.

name=defeat
first_time_only=no
{CHANGE_ATTACK “dummy_attack_0” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_1” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_2” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
{CHANGE_ATTACK “dummy_attack_3” “yomar_special_attack” ({YOMAR_SPECIAL_ATTACK}) }
[/event]


inconveniente: tutti questi blocchi di codice non possono essere inseriti nel file in cui è definita l'unità che usa l'attacco speciale; infatti se ci fosse più di una unità con l'attacco speciale alcuni tag verrebbero ripetuti per tante volte quante sono le unità presenti, o almeno credo. La cosa migliore da fare sarebbe di inserirli in un mod, meglio se è lo stesso che permette l'arruolamento del super mago. Questo nel caso che l'unità debba essere usata in multiplayer; per una campagna o uno scenario singolo basta inserirli nel codice dello scenario/i opportuni o nel file delle macro con l'opportuno richiamo.

Veniamo ora al secondo caso, quello per cui l'attacco speciale non possa essere utilizzato più di un certo numero di volte per scenario.

La mia idea è di fare qualcosa di simile a quanto fatto per il caso precedente; supponiamo che l'attacco speciale non sia utilizzabile per più di tre volte: per prima cosa si crea una macro contenete le caratteristiche dell'attacco speciale, uguale a quello già visto prima:

Codice:

#define YOMAR_SPECIAL_ATTACK

# come quello visto per il caso precedente

#enddef

# **** questo tag deve essere comunque inserito nel tag [unit_type] in cui si definiscono le caratteristiche del super mago con l'attacco speciale *****
[attack]
name=yomar_special_attack_3
{YOMAR_SPECIAL_ATTACK}
[/attack]

Adesso, in pratica è come se avessimo 3 attacchi speciali uguali nella forma ma diversi nel nome, dopo ogni uso dell'attacco speciale questo viene sostituito da un'altro attacco uguale ma con un nome differente, tranne il yomar_special_attack_1, che viene eliminato ma non sostituito; il codice per fare ciò dovrebbe essere sifatto:

Codice:
#define CHANGE_ATTACK ATTACK_1 ATTACK_2
[event]
name=attack_end
first_time_only=no
[filter_attack]
name={ATTACK_1}
[/filter_attack]
[object]
[filter]
id=$unit.id
[/filter]
silent=yes
duration=scenario
[effect]
apply_to=remove_attacks
name={ATTACK_1}
[/effect]
[effect]
apply_to=new_attack
name={ATTACK_2}
{YOMAR_SPECIAL_ATTACK}
[/effect]
[/object]
[/event]
#enddef

{CHANGE_ATTACK “yomar_special_attack_3” “yomar_special_attack_2”}
{CHANGE_ATTACK “yomar_special_attack_2” “yomar_special_attack_1”}

[event]
name=attack_end
first_time_only=no
[filter_attack]
name=yomar_special_attack_1
[/filter_attack]
[object]
[filter]
id=$unit.id
[/filter]
[effect]
apply_to=remove_attacks
name=yomar_special_attack_1
[/effect]
[/object]
[/event]

rimane il ripristino dell'attacco per eventuali scenari successivi; i tag successivi non vanno inseriti se si ritiene, invece, che il numero massimo di attacchi debba essere tale per tutta una campagna piuttosto che per il singolo scenario:

Codice:
#define RESTORE_SPECIAL_ATTACK ATTACK
[store_unit]
[filter]
[has_attack]
name={ATTACK}
[/has_attack]
[/filter]
variable=stored_units
[/store_unit]
{FOREACH stored_units i}
[object]
[filter]
id=$stored_unit[$i].id
[/filter]
[effect]
apply_to=remove_attacks
name={ATTACK}
[/effect]
[effect]
apply_to=new_attack
name=yomar_special_attack_3
{YOMAR_SPECIAL_ATTACK}
[/effect]
[/object]
{NEXT i}
{CLEAR_VARIABLE stored_unit i}
#enddef

[event]
name=victory
first_time_only=no
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_2”}
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_1”}
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_0”}
[event]

[event]
name=defeat
first_time_only=no
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_2”}
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_1”}
{RESTORE_SPECIAL_ATTACK “yomar_special_attack_0”}
[/event]

Non ho mai avuto occasione di utilizzare il filtro [has_attack] prima d'ora, quindi la mia conoscenza di tale strumento è puramente teorica; spero di averlo usato nel modo corretto.

Rimane un problema: cosa dovrebbe succedere se l'attacco speciale viene usato dall'unità che lo possiede mentre si difende?
 Personalmente propenderei per rendere tale attacco non utilizzabile in fase di difesa, cosa che si ottiene facilmente usando defense_weight=0 nella definizione dell'attacco, come ho fatto per l'attacco dummy.

Se, invece, preferisci che l'attaco speciale sia usato anche in difesa, con le stesse conseguenze che si hanno per l'uso in attacco, allora devi aggiungere un altro event attack_end in cui definisci solo il [filter_second_attack]; costruito come gli altri event analoghi.

Stesso discorso fatto in precedenza per quanto attiene a dove mettere tutta la pappardella.

In linea teorica il marchingegno dovrebbe funzionare, al netto di errori di sintassi sparsi qua e la; tuttavia ammetto una certa inesperienza pratica nell'uso dei filtri per attacchi ed armi, inoltre potrei essermi dimenticato di qualcosa; fammi sapere come funziona, o come non funziona.







« Ultima modifica: 18 Maggio 2018, 16:53:12 da Argesilao » Registrato

Quello che non ti uccide ti rende più menomato

Il caso non esiste, esiste solo l'inevitabile
(Yuko Ichihara)

Sai tu qual sia in questa nera valle la risultanza ed il premio di ogni sacrifizio umano? Calci nel deretano!
(Brancaleone da Norcia)
Yomar
Eroe del Reame
*****
Scollegato Scollegato

Messaggi: 437



WWW
« Risposta #3 inserita:: 21 Maggio 2018, 11:30:49 »

Si grazie Argesilao. infatti non mi interessa che l'unità usi l'attacco in difesa.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a: