Help piccola mod

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Ciao a tutti!! :salve:

    Volevo creare una piccolissima mod ma ho qualche difficoltà, per questo ho bisogno di porvi qualche domanda. Premetto che ho iniziato da qualche giorno a spulciare nei codici di Imperivm quindi siate clementi D:

    Allora vi chiedo se:
    - esiste un modo per verificare quanti attacchi ha sferrato una certa unità, per cui dopo un certo valore fa partire uno script?

    - come si crea uno script che si avvia solo per una certa unità? Per esempio ogni minuto, ogni highlander guadagna 1 di difesa...

    Vi ringrazio per il vostro aiuto e mi scuso se le domande sono per voi banali! =)
     
    .
  2.     +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    Ciao!

    Visto che mi sembra di aver capito che tu abbia abbastanza competenze in programmazione, non scriverò risposte estremamente dettagliate ma rapide (salvo richiesta esplicita per date cose), così da favorire un migliore velocità nella discussione su questo topic.


    Partiamo dal presupposto che su imperivm non è possibile programmare qualunque cosa (soprattutto a livello di modding) perché non si ha a disposizione un vero linguaggio di programmazione.


    1) non esiste alcun metodo a riguardo, per farlo bisognerebbe provare a ragionare a vedere cosa si riesce a tirare fuori degli script già esistenti. Ammetto però di non aver ben capito cosa intendi per attacchi sferrati
    2) In una classe puoi definire i method e i behavior script. Questi ultimi sono appunto eseguiti finché l'unità è viva (ma possono essere anche per le strutture). Infatti in genere si ha un while(1) e poi istruzioni fondamentali come IsValid() e IsAlive() per interrompere. Nel tuo caso dovresti quindi usare i behavior script. Ti dico subito che non esiste un metodo per settare la difesa.
    Potresti provare a usare
    CODE
    Unit::AddBonus(int, int, int, int, int)

    I parametri rappresentano appunto l'attacco, la difesa e non ricordo cos'altro. Ma basta fare delle prove sull'editor e vedere ogni singolo parametro cosa aumenta

    Per ogni dubbio, chiedi pure! :)
     
    .
  3.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Grazie della tua risposta =)

    Con la prima domanda intendevo se esistesse una qualche funzione che "verifichi" quando un'unità sta combattendo con un'altra, e da questa creare un contatore che tenga conto di quanti attacchi ha recato all'altra unità.
    Per esempio questo povero highlander trova un elefante, si avvicina, gli dà una spadata e il contatore va a 1, poi un'altra spadata e va a 2 etc...
    Anche a me sembrava qualcosa di complicato e ne ero scettico. Si potrebbe lavorare sulla salute (o anche l'energia per alcune unità) ma credo diventi più complicato ancora.

    Quindi mi focalizzo sulla seconda domanda.
    In particolare, questi behavior sembrano definiti per tutte le unità del gioco di classi melee e (short)ranged. Quindi non riesco a capire come definire un behavior per un solo class id.
    Per esempio, restando sull'esempio dell'aumento della difesa di un highlander (sempre se possibile), come faccio a scrivere qualcosa come:

    se l'unità è un highlander allora "aumenta difesa"

    E' proprio la verifica di un certo tipo di unità che non riesco a definire!
     
    .
  4.     +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    modifica così la classe
    CODE
    <class id="BHighlander" cpp_class="CVXUnit" parent="Melee" entity="units/BHighlander/BHighlander.ent.xml">

           <properties race="Britain"/>
           <properties maxhealth="500"/>
           <properties damage="50" armor_slash="6" armor_pierce="6"/>
           <properties speed="80"/>
           <properties unit_specials="Deflection"/>

           <properties icon="gameres/icons/BHighlander.bmp"/>
           <properties display_name="Highlander" display_name_plural="Highlanders"/>
           <properties help="contents/units/BHighlander"/>
           <properties edittree_pos="Units/Britain/Highlander"/>

           <behavior script="data/subai/highlander_increase_defence.vs"/>
           
           <sounds command="data/sound entities/VoiceBHighlander.xml"/>
    </class>

    Ho aggiunto solo la riga <behavior script="data/subai/highlander_increase_defence.vs"/>

    Nel file highlander_increase_defence.vs prova a scrivere qualcosa del tipo:
    CODE
    // void, Obj This

    Unit this;
    this = This.AsUnit();
    int ONE_MINUTE = 1000 * 60;

    if(.IsValid() == false)
    {
      return;
    }
    if(.class() != "BHighlander")
    {
      //e' una verifica opzionale che puoi anche non mettere.
      return;
    }

    while(true)
    {
      Sleep(ONE_MINUTE);
      if(.IsAlive() == false)
      {
         break;
      }
      u.AddBonus(0, 1, 0, 0, 0); //Non ricordo l'ordine dei parametri (e forse la funzione funziona male).
    }
     
    .
  5.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Grazie della risposta velocissima!

    Ora ci provo subito, avevo visto dalla Greek Mod l'aggiunta del comando ad un'unità ma non sapevo si potesse fare anche così.

    Sei stato molto d'aiuto, grazie mille! :salve:
     
    .
  6.     +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    Fammi sapere!
    Riguardo al primo problema prova a guardare UNIT_ENGAGE (mi pare si chiami così) :)
     
    .
  7.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Purtroppo non succede nulla :|

    Ho provato anche con un'altra unità o a sostituire la AddBonus con la SetLevel e SetMaxHealth ma nulla!
     
    .
  8.     +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    Lo script non compila. Scrivi

    CODE
    // void, Obj This

    Unit this;
    int ONE_MINUTE;
    this = This.AsUnit();
    ONE_MINUTE = 1000 * 60;

    if(.IsValid() == false)
    {
     return;
    }
    if(.class() != "BHighlander")
    {
     //e' una verifica opzionale che puoi anche non mettere.
     return;
    }

    while(true)
    {
     Sleep(ONE_MINUTE);
     if(.IsAlive() == false)
     {
        break;
     }
     .AddBonus(0, 1, 0, 0, 0); //Non ricordo l'ordine dei parametri (e forse la funzione funziona male).
    }

    Per verificare la compilazione, basta copiarla in una sequenza dell'editor e al posto di
    CODE
    // void, Obj This

    scrivere
    CODE
    Obj This;
     
    .
  9.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Ok ci ho riprovato e ho notato che funziona!

    Non so se nella classe il behavior deve avere la precedenza sui sounds ma prima non ci avevo fatto caso, ma il secondo codice funziona perfettamente!
     
    .
  10.     +1   -1
     
    .
    Avatar

    Guerriero

    Group
    Eroi
    Posts
    1,673
    Reputation
    +193
    Location
    Giza

    Status
    Anonymous
    Se il problema specifico è stato risolto, chiuderei, a meno che tu abbia altri dubbi a riguardo.
    Se hai quesiti su altre cose, non esitare ad aprire altri topic.
    Fammi sapere.
     
    .
  11.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    18
    Reputation
    +1

    Status
    Offline
    Ora è tutto chiaro, problema risoltissimo! Devo giocare solo un po' sulle funzioni ora.

    Chiudi pure!
     
    .
  12.     +1   +1   -1
     
    .
    Avatar

    Ricky

    Group
    Eroi
    Posts
    4,930
    Reputation
    +197
    Location
    Tourin (Italy)

    Status
    Anonymous
    Ti lascio con un piccolo consiglio: per scrivere e compilare il codice, dopo aver creato il file in subai, apri il gioco, avvia l'editor (o una qualsiasi partita), apri la console e digita
    CODE
    _ScriptEditor()

    Per dubbi, chiarimenti o supporto puoi pubblicare senza problemi e senza limiti altri post come questo!
    Chiudo! :closed:
    SPOILER (click to view)
    :troll:
     
    .
11 replies since 21/4/2020, 18:35   109 views
  Share  
.