Mod "De Bello Mundi" Forum

guida allo scripting

  • Messaggi
  • OFFLINE
    The Housekeeper
    Post: 25.173
    Post: 69
    Registrato il: 09/01/2008
    Sesso: Maschile
    Gladiatore
    00 22/01/2008 18:15
    Ciao a tutti,

    con questo tutorial a puntate cercherò di riassumere gli elementi essenziali per comprendere la funzionalità degli script e dei trigger utilizzati in M2TW.


    CAPITOLI 1-4


    1. REQUISITI
    ------------

    Per prima cosa, per modificare i files di M2TW dovrete scompattare il gioco con l'apposito unpacker, disponibile dalla versione 1.1 di M2TW. Consiglio di scompattare una versione 1.2 o 1.3 di M2TW, e soprattutto di non intaccare la copia di M2TW che usate correntemente per giocare, ma di farlo su una copia a parte.
    Il comando per scompattare è tools\unpack_all. Il processo richiederà molti minuti, e si libereranno svariati GB di files, quindi assicuratevi di avere tempo e spazio disponibili.
    E' inoltre consigliato il seguente file (Docudemons 4.0):

    www.twcenter.net/forums/downloads.php?do=file&id=1579

    Questo file in formato Excel rappresenta il testo sacro per gli scripter di M2TW! Si presenta come una serie di schede (troverete in basso i collegamenti) in cui sono tabulati tutti i comandi implementati nel gioco, utili per modificare moltissimi files.
    Infine, per modificare i file di testo nella cartella data\text dovrete convertire i file in formato bin, usando il converter di Alpaca:

    www.twcenter.net/forums/downloads.php?do=file&id=1006


    2. COS'E' UNO SCRIPT?
    ---------------------

    Uno script è uno speciale comando che consente di intervenire dall'esterno sulle dinamiche di gioco di M2TW. In alcuni files (export_descr_ancillaries, export_descr_character_traits, export_descr_guild) i comandi di script sono generalmente indicati come "trigger".
    Creare uno script non è un affare semplice, soprattutto per i modder con poca esperienza, quindi è consigliabile anzitutto prendere confidenza con i comandi preesistenti nei files in formato testo, specialmente nel: campaign_script, export_descr_ancillaries, export_descr_character_traits.
    In generale, uno script si compone di tre parti:
    - controllo eventi;
    - condizioni;
    - comandi.
    Quindi, al verificarsi di un determinato evento, se sono rispettate le condizioni imposte, allora lo script impone certi comandi.


    3. IL CAMPAIGN_SCRIPT
    ---------------------

    Questo file (data/world/maps/campaign/imperial_campaign/campaign_script.txt) contiene gli script di una campagna. Viene eseguito dal gioco al caricamento della campagna e continua ad essere eseguito fino alla fine della campagna stessa. A differenza di RTW, lo stato del campaign_script viene allocato nei salvataggi, per cui i cambiamenti del campaign_script possono generare incompatibilità con salvataggi precedenti.
    Il campaign_script originale si compone di varie parti, tra cui le invasioni dei Mongoli e dei Timuridi, la scoperta dell'America, la presentazione delle fazioni.


    3.1 I monitor

    I monitor rappresentano il comando base di uno script. Esistono due diversi tipi di monitor: il monitor_event e il monitor_conditions. Un monitor_event specifica il momento in cui il gioco eseguirà lo script; un monitor_conditions invece non richiede alcun evento, ma specifica la condizione per la quale il gioco eseguirà lo script (alla quale potranno aggiungersene altre).
    I monitor, di qualunque tipo siano, sono seguiti dalle condizioni e dai comandi. Nota che in uno script può esservi soltanto un solo monitor, che deve essere debitamente concluso con un "end_monitor":

    monitor_event [evento] [condizione]
    and [eventuali altre condizioni]
    [comandi]
    end_monitor

    oppure

    monitor_conditions [condizione]
    and [eventuali altre condizioni]
    [comandi]
    end_monitor

    E' possibile concludere il monitor con un "terminate_monitor": in questo caso, lo script verrà eseguito solamente una volta, anche se l'evento o la condizione dettate dal monitor si ripeteranno.

    monitor_event [evento] [condizione]
    and [eventuali altre condizioni]
    [comandi]
    terminate_monitor
    end_monitor

    oppure

    monitor_conditions [condizione]
    and [eventuali altre condizioni]
    [comandi]
    terminate_monitor
    end_monitor


    3.2 Le condizioni

    A valle di un monitor, si devono imporre le condizioni da verificarsi affinchè il comando dello script venga eseguito. Le condizioni possono essere più di una, in questo caso il comando finale sarà eseguito solo se tutte le condizioni saranno verificate; le condizioni successive alla prima dovranno sempre essere precedute da un "and".


    3.3 I comandi

    A valle delle condizioni, si deve impostare il comando (o i comandi) da eseguire nel caso in cui le condizioni siano verificate. In questo caso, i comandi successivi al primo NON devono essere preceduti da un "and".


    3.4 I contatori

    Il sistema di costruzione di uno script in sè è abbastanza rigido, anche a causa del limitato (sebbene numeroso) numero di eventi, condizioni e comandi reperibili nel Docudemons 4.0.
    Per questo può essere estremamente utile, per rendere il processo più flessibile e realizzare script elaborati e complessi, ricorrere a dei contatori ("counter"), che sono variabili in grado di memorizzare valori interi positivi e negativi.
    Per usare un contatore, è necessario anzitutto dichiararlo e settare il suo valore iniziale:

    declare_counter [nome del contatore]
    set_counter [nome del contatore] [valore]

    In seguito, entro uno script, si potrà introdurre un comando per decidere se mutare il valore del contatore ("inc_counter") oppure settarlo a un nuovo valore ("set_counter"):

    monitor_event [evento] [condizione]
    and [eventuali altre condizioni]
    inc_counter [nome del contatore] [valore da aggiungere]
    end_monitor

    oppure

    monitor_event [evento] [condizione]
    and [eventuali altre condizioni]
    set_counter [nome del contatore] [valore]
    end_monitor

    Nel primo esempio, si vede che il comando inc_counter deve essere seguito dal nome del contatore e dal valore da aggiungere: quest'ultimo deve essere un numero intero, positivo o negativo (se è negativo, ovviamente si avrà una diminuzione del valore del contatore).
    L'utilità dei contatori è legata all'uso di una particolare condizione ("I_compareCounter") che richiama il loro valore:

    monitor_event [evento] I_CompareCounter [name] {<, <=, =, >=, >} [valore]
    and [eventuali altre condizioni]
    inc_counter [nome del contatore] [valore da aggiungere]
    end_monitor

    Con ovvio significato degli operatori matematici (nota: <= significa "minore o uguale a")


    3.5 Comporre uno script

    Per comporre uno script si dovrà montare, nella giusta logica e nel giusto ordine, tutte le parti che abbiamo fin qui esaminato: eventuale dichiarazione e settaggio dei contatori usati, monitor, condizioni, comandi.
    Il reperimento delle stringhe, necessarie al raggiungimento del fine che si vuole raggiungere con lo script, si potrà effettuare nel Docudemons 4.0; sebbene alcune delle stringhe elencate non siano state implementate (e quindi non funzionino), la stragrande maggioranza di esse funzionano perfettamente.
    Bisogna però specificare che l'accoppiamento evento-condizione non può essere casuale, ma deve sottostare a precise regole: tutti gli eventi e tutte le condizioni sono suddivisi in categorie; a un evento appartenente a una certa categoria, potrete associare una o più condizioni che dovranno necessariamente essere della stessa categoria.
    Per reperire le stringhe, aprite il Docudemons 4.0; le schede denominate "commands", "conditions", "events" contengono rispettivamente le stringhe per i comandi, le condizioni e gli eventi. Il nome della stringa si trova in corrispondenza di "Identifier:", mentre la categoria a cui quella stringa appartiene si trova in corrispondenza di "Exports:" (per gli eventi) o "Trigger requirements" (per le condizioni).
    Per i comandi, ci sono alcune stringhe speciali, reperibili nella sezione "console_commands", che rappresentano comandi utilizzabili durante il gioco (con l'opzione console, attivabile col tasto "ò") e, alcuni, anche nel campaign_script. Se utilizzate, queste stringhe devono essere sempre precedute da "console_command".


    4. ESEMPIO
    ----------

    Aprite il campaign_script.txt. Cancellatene tutto il contenuto, lasciando soltanto:

    script
    ;qui inserirete i vostri script
    wait_monitors
    end_script

    Nota: tutte le righe che iniziano per ; non vengono lette dal gioco, quindi sono utili per segnarsi appunti e annotazioni.
    Ora si introdurrà, nell'apposito spazio (tra "script" e "wait_monitors"), uno script per introdurre un "malus" economico all'inizio di ogni turno, solo per le fazioni non "locali" (ovvero non utilizzate dal giocatore umano, ma dalla IA), dipendente dal livello di difficoltà della campagna scelto.

    ---

    monitor_event SettlementTurnStart FactionType england
    and not FactionIsLocal
    and CampaignDifficulty = easy
    console_command add_money england, -1000
    end_monitor

    monitor_event SettlementTurnStart FactionType england
    and not FactionIsLocal
    and CampaignDifficulty = medium
    console_command add_money england, -500
    end_monitor

    monitor_event SettlementTurnStart FactionType england
    and not FactionIsLocal
    and CampaignDifficulty = hard
    console_command add_money england, -200
    end_monitor

    monitor_event SettlementTurnStart FactionType england
    and not FactionIsLocal
    and CampaignDifficulty = very_hard
    console_command add_money england, -100
    end_monitor

    ---

    Esaminiamo lo script: abbiamo usato un monitor di tipo monitor_event, quindi di seguito a questa stringa dovremo mettere una stringa-evento, reperibile nel Docudemons 4.0 entro la sezione "events". Abbiamo scelto "SettlementTurnStart", che (come spiega il Docudemons stesso) serve a innescare lo script ogni volta che una fazione inizia il suo turno.
    In seguito dovremo mettere una o più condizioni. La prima che troviamo, di seguito a "SettlementTurnStart", è "FactionType". Anche questa stringa-condizione è stata reperita nel Docudemons entro la sezione "conditions". E' del tipo:

    FactionType [codice della fazione]

    e serve a innescare lo script solo se la fazione che inizia il turno è quella da noi impostata, nell'esempio in esame quella inglese.
    Seguono poi altre condizioni (sempre reperibili nel Docudemons), ciascuna preceduta dalla congiunzione "and" e, eventualmente, da "not" (se vogliamo che la condizione non sia verificata).
    "FactionIsLocal" serve a specificare che lo script viene eseguito solo se la fazione inglese che inizia il turno è comandata da un giocatore umano; se preceduta da "not", serve a specificare che lo script viene eseguito solo se la fazione inglese che inizia il turno è comandata dalla IA. "CampaignDifficulty" è del tipo:

    CampaignDifficulty {<, <=, =, >=, >} [livello di difficoltà della campagna: very_hard, hard, normal o easy]

    serve a specificare che lo script viene eseguito solo se la difficoltà scelta per la campagna è quella indicata, nell'esempio in esame "molto difficile" (very_hard).
    Infine abbiamo il comando: "add_money", che permette di aggiungere fiorini alla fazione. "add_money" è reperibile nella sezione "console_commands" del Docudemons, quindi se usato nel campaign_script deve essere preceduto da "console". E' del tipo:

    console_command add_money [codice della fazione], [valore da aggiungere]

    Nota: la virgola dopo il codice della fazione è necessaria.
    Il valore espresso deve essere un intero, positivo o negativo, ed esprime la quantità di fiorini aggiunta o sottratta alla fazione.

    Lo script è completo. Ora dovrete estenderlo a tutte le fazioni, copiando il blocco e incollandolo per ciascuna di esse, e sostituendo tutte le stringhe "england" con "france", "hre", "spain" eccetera (per l'elenco completo dei codici delle fazioni, basta guardare il descr_strat.txt, in alto).



    Alla prossima puntata!
  • Lucio Settimio Severo
    00 22/01/2008 18:17
    Guida fantastica (come sempre [SM=g7348] ), complimenti [SM=g7372] .
  • OFFLINE
    MuzioScevola99
    Post: 1.877
    Post: 1
    Registrato il: 05/05/2012
    Città: CHIERI
    Età: 34
    Sesso: Maschile
    00 05/05/2012 09:20
    Ciao scusa se posto qui volevo sapere una cosa :
    l'evento FactionType funziona anche con una negazione ?
    ad es : FactionType not france ? inoltre le condizioni si possono inserire con il prefisso "or" (una o l'altra) o solo "and" ( tutte e due ) ? cerco la scorciatoia di un tuo consiglio perche sono imbranato e a provare ci impiego due giorni.

    Ps hai mai usato il comando I_CharacterTypeNearCharacterType ? funziona ?



    Dura la volontà, ferma la fede.

    "Nel mondo effimero e leggero coerenza è spesso cambiar pensiero"