RPG Zone, Italian Forum & Community for role playing video games - ex Gothic Zone

[Tutorial] Introduzione allo scripting, Lezione 3

« Older   Newer »
  Share  
view post Posted on 16/2/2015, 20:54     +2   +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Nella lezione precedente ho coperto più o meno tutta la parte grafica dal punto di vista puramente di modding, tranne per la modifica dei mondi che meriterà lezioni a parte.

Adesso iniziamo invece ad addentrarci nel lato di scripting ovvero della manipolazione dei file dat e quindi del comportamento del gioco stesso.

Anche qui è necessaria una prefazione: se avete già precedenti esperienze di programmazione tutto quello che scriverò vi risulterà piuttosto banale; ma se così non fosse o non avete tali esperienze, nonostante mi soffermerò su alcuni concetti, è consigliabile almeno avere un po' di conoscenza di logica vero-falso (chiamata anche booleana), quindi di connettivi logici, utilizzati sia in informatica, sia in matematica, sia, sorpresa, nella nostra vita di tutti i giorni; essi sono infatti la struttura portante della logica intesa in senso stretto. Vero e falso sono alla base di tutto ragazzi, e una volta che avete capito come funzionano ve ne accorgerete :D. In particolare questo è FONDAMENTALE.

Bene iniziamo.
In gothic 2 alcune funzioni e comportamenti importanti sono chiamati hardcoded, cioè scritti nel motore di gioco, cioè che non possono essere cambiati. Noi andremo invece a lavorare sugli script compilati e facilmente modificabili che possono influenzare radicalmente il gioco nonostante molte cose non possono essere modificate (almeno senza ricorrere all'hacking).

Il linguaggio di scripting su cui si basa gothic 2 è chiamato daedalus. Per chi ha già qualche esperienza in ambito di programmazione, lo troverà un linguaggio simile al c++, tuttavia ESTREMAMENTE più limitato, banale e ambiguo. I Piranha Bytes hanno voluto creare un linguaggio proprio, e come risultato possiamo fare solo le operazione più elementari. Grazie invece all'intervento di alcuni utenti tedeschi del forum WoG, sono stati creati due pacchetti di scripting che ampliano enormemente le potenzialità, sempre limitate, del linguaggio. Questi due pacchetti si chiamano Ikarus e LeGo, ma ne parleremo moooolto più avanti.

Di cosa avete bisogno? Beh fondamentalmente vi stupirete ma l'unica cosa di cui avrete BISOGNO è gothic 2 e un editor di testo (anche il blocco note volendo). Infatti i file .d sono semplici file di testo, e possiamo lasciare la compilazione a gothic 2. Tuttavia perché complicarsi la vita così? Abbiamo un ambiente di sviluppo come gothicsourcer perché non sfruttarlo? Grazie a questo potrete decompilare i file .dat che vi servono.
Adesso sto per mostrarvi come decompilarne uno, in seguito metterò il link di tutti i file ITALIANI già decompilati e corretti che ha raccolto un utente di gothicitalia.

Se avete seguito correttamente i miei passaggi nella prefazione, avrete i corretti file dat italiani e i rispettivi ou.bin e ou.csl.
Bene, aprite gothicsourcer e andate su file -> new solution. Scrivete il nome del vostro progetto sapendo che vi metterà in automatico un "Sol" davanti (che sta per solution), selezionate una cartella di destinazione, esterna da quella di gothic 2, e selezione gothic 2 da piataforma. Cliccate su first decompile action e selezionate il file.dat che vi serve. Nel caso selezionaste il file gothic.dat vi chiederà di selezionare il file ou.bin corrispondente. Questo decompilerà il file e creerà un progetto. Se avete invece già i file decompilati ma non avete il progetto selezionate first compile action prima e il file gothic.src poi.

Bene. Una volta che il progetto è aperto, nella barra degli strumenti accanto alle frecce di undo e redo, avrete tre voci, decompile, compile e stop process. Una volta che aprite la soluzione con uno dei metodi descritti sopra cliccate poi sulla relativa voce. Una volta che avrete finito di modificare gli script potrete poi compilarli e inserirli poi in gothic. Per questo dissi che non è necessario selezionare sckripte durante l'installazione del modkit.

Incredibile ma vero, se mai vi trovaste a lavorare con il gothic.dat originale scoprirete che è possibile decompilarlo, ma non ricompilarlo!!! Perchè? Perché ci sono degli errori, errori formali!! Cioè i PB hanno lasciato degli errori rendendo impossibile la compilazione (a meno che non lo corregiate a mano) e nonostante ciò non capisco come abbiano fatto loro a compilarlo invece... bah.
Fortunatamente questo utente di GI di cui vi ho parlato prima ha organizzato un supporto CHE NON È IN ALCUN MODO A ME ATTRIBUIBILE, veramente ben fatto: download.
Cos'è? È una raccolta di script italiani completamente corretti. E il bello è che è tutto impacchettato come un progetto di gothicsourcer quindi potrete gestire TUTTI i file da lì. Per selezionare quale file dat compilare col comando compile, dovrete cliccare col destro in quello che vi serve nel menu a sinistra e cliccate poi su "set as active project".

Bene ora avrete tutti gli script pronti per la compilazione la la modifica :D

Ora vi spiego brevemente a cosa serve ciascuno dei file dat:

  • Camera.dat: dal nome, gestisce la visuale della videocamera durante varie azioni (camminata, mira con l'arco, oggetti interattivi)

  • Fight.dat: gestisce le azioni durante i combattimenti. Potete modificarle ma siete limitate ad una decina di azioni standard

  • Gothic.dat: l'apice del modding degli script. Tramite questo potete modificare il 90% del gioco. Quasi tutto quello che vi passa in mente passa da questo file

  • Menu.dat: il menu principale e la schermata delle statistiche dell'eroe, niente da aggiungere

  • Music.dat: contiene le instanze collegate ai file musicali. Queste instanze verrano poi chiamate nello spacer per decidere in quale zona verrà riprodotta quale musica

  • ParticleFX.dat: gestisce gli effetti particellari

  • SFX: contiene le instanze degli effetti sonori da chiamare nello spacer o in gothic.dat

  • VisualFX: anima gli effetti particellari


In questa guida tratterò più dettagliatamente lo scripting del file gothic.dat ma come sempre se avete richieste particolari non esitate a chiedere nel topic principale.

Per questa lezione è tutto, nella prossima parlerò delle caratteristiche di daedalus e della struttura del file gothic.dat.

Ciao :camberman.gif: :camberman.gif:

Torna all'indice delle lezioni



Edited by Frank-95 - 15/10/2015, 13:27
 
Top
view post Posted on 16/10/2016, 18:36     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Frank, io ho creato un'armatura sfruttando la mesh del corpo base (human_body_naked0 o qualcosa del genere) e ho creato proprio un modello a parte per avere un'armatura con le sembianze della veste iniziale di gothic 1. Fino qua tutto ok, ho creato il modello .asc, creato l'istanza dell'armatura e inserita nell'inventario dell'eroe. Il problema sorge quando faccio nuova partita e cioè che l'armatura, se pur equipaggiata, non compare! Se però la riequipaggio compare :wacko: :blink:. Ecco gli script...

Istanza dell'eroe
CITAZIONE
instance PC_Hero(Npc_Default)
{
name[0] = "Io";
npcType = npctype_main;
guild = GIL_None;
level = 0;
voice = 15;
id = 0;
exp = 0;
exp_next = 500;
lp = 0;
attribute[ATR_STRENGTH] = 10;
attribute[ATR_DEXTERITY] = 10;
attribute[ATR_MANA_MAX] = 5;
attribute[ATR_MANA] = 5;
attribute[ATR_HITPOINTS_MAX] = 40;
attribute[ATR_HITPOINTS] = 40;
Mdl_SetVisual(self,"HUMANS.MDS");
Mdl_SetVisualBody(self,"hum_body_Naked0",0,1,"Hum_Head_Pony",9,0,hero_vest_start);
CreateInvItem(self,ItWr_Fire_Letter_01);
};

Istanza dell'armatura
CITAZIONE
instance HERO_VEST_START(C_Item)
{
name = "Vestito";
mainflag = ITEM_KAT_ARMOR;
flags = 0;
protection[PROT_EDGE] = 5;
protection[PROT_BLUNT] = 1;
protection[PROT_POINT] = 1;
protection[PROT_FIRE] = 1;
protection[PROT_MAGIC] = 1;
value = value_hero_vest_start;
wear = WEAR_TORSO;
visual = "vlkl.3ds";
visual_change = "hero_vest.asc";
visual_skin = 0;
material = MAT_LEATHER;
description = name;
text[0] = "Vestiti provenienti dall'esterno della Colonia";
text[1] = NAME_Prot_Edge;
count[1] = protection[PROT_EDGE];
text[2] = NAME_Prot_Point;
count[2] = protection[PROT_POINT];
text[3] = NAME_Prot_Fire;
count[3] = protection[PROT_FIRE];
text[4] = NAME_Prot_Magic;
count[4] = protection[PROT_MAGIC];
text[5] = NAME_Value;
count[5] = value;
};

Non so proprio dove sto sbagliano...forse è un problema di gothic?
 
Top
view post Posted on 17/10/2016, 08:52     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Quando cambi le animazioni devi prima "far crashare il gioco". Apri il gioco e se non ti si vede l'armatura fallo crashare; io per farlo vado in marvin e inserisco gorn_di, così mi crasha e al riavvio funziona tutto.

Si è strano ma gothic ha bisogno di "ricaricare" i file, e per farlo deve crashare.
 
Top
view post Posted on 18/5/2017, 12:07     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Frank, ho un problema con gli NPC...non riescono ad usare correttamente il letto! Praticamente lo usano per 1 secondo e poi si alzano a fare altro. Tutti gli npc fanno così...nessuno riesce a dormire. Ho visto su zspy che non trovano il schemename...non so che cosa sia.

CITAZIONE
[....2000...]
02:03 Warn: 0 U: NPC: EV_USEMOB : No Mobsi with specified schemeName (BEDLOW) found. .... <onpc.cpp,#12430>
02:03 Warn: 0 U: NPC: EV_USEMOB : No Mobsi with specified schemeName (BED) found. .... <onpc.cpp,#12430>
02:03 Warn: 0 U: NPC: EV_USEMOB : No Mobsi with specified schemeName (BEDHIGH) found. .... <onpc.cpp,#12430>

Sono questi i messaggi. Praticamente compaiono quando l'npc si alza subito dopo 1 secondo. Come potrei risolvere?
 
Top
view post Posted on 31/5/2017, 13:48     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Stai usando mob personalizzati? Nel senso li hai creati te? I waypoint/nomi delle mesh hanno la stessa "struttura" di quelli già esistenti?

Generalmente per i mob, è meglio sempre basarsi su formati già nel gioco
 
Top
view post Posted on 31/5/2017, 14:31     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Uso sempre i mob presenti nel gioco solo che ho aggiunto la possibilita di dialogarci come per esempio il bancone di alchimia, il pentolone, la pentola, ecc. Ho solo modificato\aggiunto le funzioni _S1. Tutti i nuovi mob funzionano alla perfezione, è solo il letto a dare questo problema
 
Top
view post Posted on 1/6/2017, 09:26     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Se è il letto a darti quel problema sinceramente non ti so dire. FOrse in g1 sono più limitati.

Queste sono le funzioni di g2 se ti possono servire:
CODICE
func void PC_Sleep(var int t)
{
       AI_StopProcessInfos(self);
       PLAYER_MOBSI_PRODUCTION = MOBSI_NONE;
       self.aivar[AIV_INVINCIBLE] = FALSE;
       if(Wld_IsTime(0,0,t,0))
       {
               Wld_SetTime(t,0);
       }
       else
       {
               t = t + 24;
               Wld_SetTime(t,0);
       };
       Wld_StopEffect("DEMENTOR_FX");
       if(SC_IsObsessed == TRUE)
       {
               PrintScreen(PRINT_SleepOverObsessed,-1,-1,FONT_Screen,2);
       }
       else
       {
               PrintScreen(PRINT_SleepOver,-1,-1,FONT_Screen,2);
               hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
               hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
       };
       PrintGlobals(PD_ITEM_MOBSI);
       Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
};

func void sleepabit_s1()
{
       var C_Npc her;
       var C_Npc rock;
       her = Hlp_GetNpc(PC_Hero);
       rock = Hlp_GetNpc(PC_Rockefeller);
       if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(rock)))
       {
               self.aivar[AIV_INVINCIBLE] = TRUE;
               PLAYER_MOBSI_PRODUCTION = MOBSI_SleepAbit;
               AI_ProcessInfos(her);
               if(SC_IsObsessed == TRUE)
               {
                       Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALSE);
               };
       };
};


L'argomento di PC_Sleep indica l'ora del risveglio
 
Top
view post Posted on 1/6/2017, 11:09     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


È pressoché identico tranne per i controlli della possessione in g2...ecco quello mio:

CITAZIONE
func void PC_Sleep(var int t)
{
USE_MOBSI_TIPE = 0;
AI_StopProcessInfos(self);
self.aivar[AIV_INVINCIBLE] = FALSE;
if(Wld_IsTime(0,0,t,0))
{
Wld_SetTime(t,0);
}
else
{
t = t + 24;
Wld_SetTime(t,0);
};
PrintScreen("Hai dormito bene e ti senti anche meglio.",-1,-1,"font_old_20_white.tga",3);
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS_MAX];
hero.attribute[ATR_MANA] = hero.attribute[ATR_MANA_MAX];
PrintGlobals(PD_ITEM_MOBSI);
Npc_SendPassivePerc(hero,PERC_ASSESSENTERROOM,NULL,hero);
};

func void SLEEPABIT_S1()
{
var C_Npc her;
var C_Npc rock;
her = Hlp_GetNpc(PC_Hero);
rock = Hlp_GetNpc(PC_Rockefeller);

if((Hlp_GetInstanceID(self) == Hlp_GetInstanceID(her)) || (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(rock)))
{
USE_MOBSI_TIPE = 1;
self.aivar[AIV_INVINCIBLE] = TRUE;
AI_ProcessInfos(her);
};
};
 
Top
view post Posted on 1/6/2017, 18:54     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Comparso un'altro problema. Ora gli npc non usano il girarrosto e compare in zspy l'errore: zModel.coo(zCModel::StartAni): Ani not found: RROAM2...<zmodel.cpp,#2407>
Dio mio, cosa cavolo puo essere...piano piano non riescono piu a usare nessun mob...
 
Top
view post Posted on 2/6/2017, 15:42     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Sembrano tutti errori di nomi slash. L'ultima pare che hai un'animazione cui all'inizio nel nome è presente RROAM2 e lui se la va a cercare ma non la trova. Oppure può essere che sta cercando quell'animazione perché è chiamata negli script da qualche parte. Cerca quella stringa in tutti i file con notepad++ e vedi se la trova.

Lo schemename dovrebbe essere la prima parte del nome prima di "_". Tipo in g2: BEDHIGH_NW_MASTER_01.MDL o BED_1_OC.MDL. Così gothic sa quale animazione deve usare:
CITAZIONE
ani ("t_BedHigh_Front_Stand_2_S0" 1 "s_BedHigh_Front_S0" 0.2 0.0 M. "Hum_BedHighFront_M02.asc" F 0 4)
ani ("s_BedHigh_Front_S0" 1 "s_BedHigh_Front_S0" 0.0 0.0 M. "Hum_BedHighFront_M02.asc" F 5 5)
aniAlias ("t_BedHigh_Front_S0_2_Stand" 1 "" 0.0 0.2 M. "t_BedHigh_Front_Stand_2_S0" R)

ani ("t_BedHigh_Front_S0_2_S1" 1 "s_BedHigh_Front_S1" 0.0 0.0 M. "Hum_BedHighFront_M02.asc" F 6 57 FPS:10)
{
*eventTag (7 "DEF_INV_TORCH")
}

ani ("s_BedHigh_Front_S1" 1 "s_BedHigh_Front_S1" 0.0 0.0 MI "Hum_BedHighAmbient_A01.asc" F 1 39)
aniAlias ("t_BedHigh_Front_S1_2_S0" 1 "s_BedHigh_Front_S0" 0.0 0.0 M. "t_BedHigh_Front_S0_2_S1" R)

ani ("t_BedHigh_Back_Stand_2_S0" 1 "s_BedHigh_Back_S0" 0.2 0.0 M. "Hum_BedHighBack_M02.asc" F 0 4)
ani ("s_BedHigh_Back_S0" 1 "s_BedHigh_Back_S0" 0.0 0.0 M. "Hum_BedHighBack_M02.asc" F 5 5)
aniAlias ("t_BedHigh_Back_S0_2_Stand" 1 "" 0.0 0.2 M. "t_BedHigh_Back_Stand_2_S0" R)

ani ("t_BedHigh_Back_S0_2_S1" 1 "s_BedHigh_Back_S1" 0.0 0.0 M. "Hum_BedHighBack_M02.asc" F 6 57 FPS:10)
{
*eventTag (7 "DEF_INV_TORCH")
}

ani ("s_BedHigh_Back_S1" 1 "s_BedHigh_Back_S1" 0.0 0.0 MI "Hum_BedHighAmbientBack_A01.asc" F 1 39)
aniAlias ("t_BedHigh_Back_S1_2_S0" 1 "s_BedHigh_Back_S0" 0.0 0.0 M. "t_BedHigh_Back_S0_2_S1" R)

Come vedi inizano tutte per s_ o t_ e lo schemename (front e back indicano le due posizioni possibili)
 
Top
view post Posted on 2/6/2017, 15:54     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Non é che casomai ho ordinato male i file delle animazioni in _work/data ? Perche io ho creato anche la cartella "tutto" che contiene tutte le animazioni del vdf anims
 
Top
view post Posted on 2/6/2017, 15:59     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Oddio che? XD

Tu devi avere tutti i file nella stessa gerarchia che vedi dentro i file vdf. In gothic 1 non so ma mi apre sia uguale.

I file compilati dentro Anims\_compiled (non tutto, che è tutto?? XD), e i gestori della animazioni non compilati in anims e basta
 
Top
view post Posted on 2/6/2017, 20:36     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Niente da fare per la bacheca...le ho provate tutte. Cmq quando hai tempo, potresti aiutarmi nel problema del letto e del girarrosto?
 
Top
view post Posted on 3/6/2017, 12:28     +1   -1
Avatar

Advanced Member

Group:
Rpg Veteran
Posts:
1,300
Rpg Point:
+58
Location:
Khorinis, Quartieri alti

Status:


Ho trovato l'errore di R_ROAM e in realta non è collegato al girarrosto, ma ai mostri aggiunti perche non ho messo i FP per farli mangiare, dormire, ecc. Per quanto riguarda il girarrosto, l'errore è come quello del letto e cioè che non trova lo schemename BARBQ. Ma cosè questo schemeName? Dove lo trovo?
 
Top
view post Posted on 3/6/2017, 19:40     +1   -1

Gothic Modder

Group:
Moderatore
Posts:
1,391
Rpg Point:
+83
Location:
L'Urbe!

Status:


Forse manca un FP che inizia con "FP_BARBQ"? Tipo in genere ci sta un WP, e un FP. Chiedi su wog nel dubbio, io non sono espertissimo di animazioni, ma per quelle poche nel dubbio ho sempre usato lo stesso nome (tipo BOARD) per qualsiasi cosa. Quello dovrebbe essere lo schemename
 
Top
25 replies since 16/2/2015, 20:54   331 views
  Share