Quest [Release]LanguageSystem - Differenziare le quest in base alla lingua

Stato
Discussione chiusa ad ulteriori risposte.

martysama0134

Utente Platinum
9 Gennaio 2009
3,446
80
1,703
1,107
Ultima modifica da un moderatore:
Intro
Non c'è un motivo preciso per cui l'ho postata (creata adesso in 5min), forse perché ho visto tanti aborti di quest che utilizzavano millemilaif e, nell'ultimo caso, addirittura un game.set_event_flag("language"..pc.get_name()). Roba dell'altro mondo.
Le differenze maggiori fra un game.g/set_event_flag e un pc.g/setq/f sono le seguenti:
-la prima invia una query al db ogni volta e, se usata per questa cosa, ti "sporca" il server (basta fare /get in game) (too bad)
-la seconda si limita a guardare i valori presenti in memoria (tutte le quest flag del pg vengono salvate in memoria al login sul CHARACTER* intorno agli space 8000/9000) e printarli (too soft), esse si aggiornano sul db ogni 5min(non ho guardato esattamente) circa e/o durante il logout

Come inserirla
Createvi languagesystem.quest con questo contenuto:
Codice:
quest languagesystem begin
    state start begin
        function GetMyLan()
            --check lingua
            local mylan=pc.getf("game_option", "language")
            if(mylan==0)then
                mylan=1--already local, not global!
            end
            return mylan
        end
        function GetMyString(lanid, strid)
            --lan-array
            local mystrings={
                {"Language panel", "No language selected","Which language do you prefer?","Back","Language successfully changed.","","","","","","",""},
                {"Pannello lingua", "Nessuna lingua selezionata","Quale lingua preferisci?","Indietro","Lingua correttamente cambiata.","","","","","","",""},
                {"stringaincruccolese1","stringaincruccolese2","","","","","","","","","",""},
                {"stringainfrancese1","stringainfrancese2","","","","","","","","","",""},
                {"stringainspagnolo1","stringainspagnolo2","","","","","","","","","",""},
                {"stringaincinese1","stringaincinese2","","","","","","","","","",""},
                {"stringaingiapponese1","stringaingiapponese2","","","","","","","","","",""},
            }
            return mystrings[lanid][strid]
        end
        when letter begin
            send_letter(languagesystem.GetMyString(languagesystem.GetMyLan(), 1))
        end
        
        when info or button begin
            local mylan=languagesystem.GetMyLan()
            local resend_letter=function(title) makequestbutton(title) q.set_title(title) q.start() end
            --select language
            say_title(languagesystem.GetMyString(mylan, 1))
            say(languagesystem.GetMyString(mylan, 3))
            local myarsel={"English", "Italiano", "Cruccolese", "Francais", "Cinese", "Giapponese"}
            table.insert(myarsel,languagesystem.GetMyString(mylan, 4))
            local mysel=select_table(myarsel)
            --process language
            if(mysel~=table.getn(myarsel))then --no back
                mylan=mysel--already local, not global!
                pc.setf("game_option", "language", mysel)
            end
            say_reward(languagesystem.GetMyString(mylan, 5))
            --letter remake
            resend_letter(languagesystem.GetMyString(mylan, 1))
        end
        
        
    end
end
Aggiungete ora le func della quest sul quest_functions: (anche se ./qc vi va in core dump per via delle func mancanti, la quest viene ugualmente compilata eh! dork della ymir)
Codice:
cd /path/to/quest
echo "resend_letter" >> quest_functions
echo "languagesystem.GetMyLan" >> quest_functions
echo "languagesystem.GetMyString" >> quest_functions
Ora compilate:
Codice:
./qc languagesystem.quest

Come utilizzarla su una quest normale
È semplice, potete servirvi di essa sfruttandovi questlib.lua & locale.lua
Altrimenti, eccovi un esempio:
Codice:
quest examplelan begin
    state start begin
        when login begin
            local mylan=languagesystem.GetMyLan()
            local myarr={
                {["mex1"]="Welcome!",["mex2"]="blablabla1"},
                {["mex1"]="Benvenuto!",["mex2"]="blablabla2"},
                {["mex1"]="Willkommen!",["mex2"]="blablabla3"},
                {["mex1"]="Bienvenue!",["mex2"]="blablabla4"},
                {["mex1"]="Huan Ying!",["mex2"]="blablabla5"},
                {["mex1"]="Youkoso!",["mex2"]="blablabla5"},
            }
            syschat(myarr[mylan].mex1)
            --mex2 qua e' inusata i know, potete anche rimuoverla dall'array
        end
    end
end
Per quanto riguarda l'uso dell'array a mo' di dict (vedesi examplelan) o a mo' di list (vedesi languagesystem) spetta a voi. Ovviamente, a seconda della scelta fatta, l'indicizzazione della quest (e l'iterazione dell'array coi loops come foreach) cambia leggermente.
(anche se sul lua un array lo si definisce con l'appellativo di "table")
 
Scusate ho una domanda :O ma con questo metodo bisogna ogni volta che si attiva una quest/script scegliere la lingua? o basta impostarlo una volta e tutte le altre quest verranno scelte da tale decisione? (ovviamente dopo averle adattate alla "dabol lenguegggg")
 
Avevo pensato allo stesso sistema per i giochi in unity. Non capisco perchè non lo ho mai adattato a metin! Bravo +1 e Like :D
 
Ultima modifica:
Scusate ho una domanda :O ma con questo metodo bisogna ogni volta che si attiva una quest/script scegliere la lingua? o basta impostarlo una volta e tutte le altre quest verranno scelte da tale decisione? (ovviamente dopo averle adattate alla "dabol lenguegggg")
Con questo metodo si avrà sempre una pergamena col nome "Pannello lingua" (il nome del papiro cambia in base alla lingua scelta) dove si potrà cambiare sempre la lingua in qualsiasi momento
Per quanto riguarda le quest da "tradurre": non c'è da selezionare la lingua ogni volta (se non è mai stata selezionata una lingua verrà impostato 1 che corrisponde ad inglese, lo si può cambiare da languagesystem.GetMyLan())

Un altro esempio:
Codice:
quest give_basic_weapon begin
	state start begin
		when login begin
			if(pc.getqf("basic_weapon")~=0)then return end
			-- ... vari pc.give_item2&co
			local myarr={
				{["wlcm"]="Welcome %s!",	["gdbye"]="Farewell"},
				{["wlcm"]="Benvenuto %s!",	["gdbye"]="Addio!"},
				{["wlcm"]="Willkommen %s!",	["gdbye"]="Lebe wohl!"},
				{["wlcm"]="Bienvenue %s!",	["gdbye"]="Adieu!"},
				{["wlcm"]="Huan Ying %s!",	["gdbye"]="Zai jian!"},
				{["wlcm"]="Youkoso %s!",	["gdbye"]="Sayounara!"},
			}
			local mylan=languagesystem.GetMyLan()
			say(string.format(myarr[mylan].wlcm, pc.get_name()))
			
			say(myarr[mylan].gdbye)
		end
		
		
	end
end
 
  • Mi piace
Reazioni: Aioriax
Salve! :D Ok lo so che è necro (forse :V da quel che ricordo per le guide non c'è necro)

Ma ho sto rimettendo le mani su quest ed altro, ed essendo io nabbissimo vorrei imparare qualcosa.

Quindi ho una domanda, per fare una cosa più pulita vorrei utilizzare il questlib o il locale.lua come ha detto lollo, ma volevo sapere se fosse possibile (e come) aggiungere altri locali.lua, del tipo "locale_ita.lua", "locale_en.lua"
 
Ultima modifica:
Salve! :D Ok lo so che è necro (forse :V da quel che ricordo per le guide non c'è necro)

Ma ho sto rimettendo le mani su quest ed altro, ed essendo io nabbissimo vorrei imparare qualcosa.

Quindi ho una domanda, per fare una cosa più pulita vorrei utilizzare il questlib o il locale.lua come ha detto lollo, ma volevo sapere se fosse possibile (e come) aggiungere altri locali.lua, del tipo "locale_ita.lua", "locale_en.lua"

Aggiungere altri locale comporta necessariamente la modifica nel codice sorgente del game binary in quanto il locale.lua viene letto allo start dei channel... ho dato un occhiata e a mio dire sembra una vera cassata... non l ho testato , ma penso non avrai problemi.

Qui trovi il codice :
Codice:
#ifndef MULTI_LANGUAGE_LOCALE
        {
            char questLocaleFileName[256];
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale.lua", g_stQuestDir.c_str());

            int questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
        }
        #else
        {
            char questLocaleFileName[256];
         
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_it.lua", g_stQuestDir.c_str());
            int questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
         
            //new block of istruction
            memset(&questLocaleFileName , 0 , sizeof(questLocaleFileName));
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_en.lua", g_stQuestDir.c_str());
            questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
            // end english part
         
            //new block of istruction for germany
            memset(&questLocaleFileName , 0 , sizeof(questLocaleFileName));
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_de.lua", g_stQuestDir.c_str());
            questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
            //end germany language
         
        }
        #endif


ovviamente in define penso tu sappia come usarlo per attivare / disattivare la modifica..

in sostanza ho solo copiato il blocco di codice che legge il locale.lua , una volta per ogni lingua.
puoi anche tu copiare altri blocchi e anche rimuoverli a tuo piacimento , penso che i commenti rendano semplice la comprensione di cosa intendo per "blocco di codice" asd.

Ti faccio notare che nel caso tu attivi con un define la compilazione del nuovo codice , il locale.lua non verrà più letto , in quanto nella parte nuova di codice ogni file in lettura ha un suffisso "it" , "en" , "de" .

Il file da modificare è questlua.cpp intorno a line 590 (dipende dalla tua rev ovviamente)
Se non ti è chiaro come applicare la modifica ti spiegherò meglio
 
  • Mi piace
Reazioni: Aioriax
Aggiungere altri locale comporta necessariamente la modifica nel codice sorgente del game binary in quanto il locale.lua viene letto allo start dei channel... ho dato un occhiata e a mio dire sembra una vera cassata... non l ho testato , ma penso non avrai problemi.

Qui trovi il codice :
Codice:
#ifndef MULTI_LANGUAGE_LOCALE
        {
            char questLocaleFileName[256];
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale.lua", g_stQuestDir.c_str());

            int questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
        }
        #else
        {
            char questLocaleFileName[256];
           
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_it.lua", g_stQuestDir.c_str());
            int questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
           
            //new block of istruction
            memset(&questLocaleFileName , 0 , sizeof(questLocaleFileName));
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_en.lua", g_stQuestDir.c_str());
            questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
            // end english part
           
            //new block of condition for germany
            memset(&questLocaleFileName , 0 , sizeof(questLocaleFileName));
            snprintf (questLocaleFileName, sizeof (questLocaleFileName), "%s/locale_de.lua", g_stQuestDir.c_str());
            questLocaleLoadingResult = lua_dofile (L, questLocaleFileName);
            sys_log (0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult);
            if (questLocaleLoadingResult != 0)
            {
                sys_err ("LoadQuestLocale(%s) FAILURE", questLocaleFileName);
                return false;
            }
            //end germany language
           
        }
        #endif


ovviamente in define penso tu sappia come usarlo per attivare / disattivare la modifica..

in sostanza ho solo copiato il blocco di codice che legge il locale.lua , una volta per ogni lingua.
puoi anche tu copiare altri blocchi e anche rimuoverli a tuo piacimento , penso che i commenti rendano semplice la comprensione di cosa intendo per "blocco di codice" asd.

Ti faccio notare che nel caso tu attivi il con un define la compilazione del nuovo codice , il locale.lua non verrà più letto , in quanto nella parte nuova di codice ogni file in lettura ha un suffisso "it" , "en" , "de" .

Il file da modificare è questlua.cpp intorno a line 590 (dipende dalla tua rev ovviamente)
Se non ti è chiaro come applicare la modifica ti spiegherò meglio
Perfetto, proverò a fare così allora, in caso di problemi lo scrivo qui [emoji16] grazie mille

Inviato dal mio ONEPLUS A3003 utilizzando Tapatalk
 
  • Mi piace
Reazioni: Ikarus_
Perfetto, proverò a fare così allora, in caso di problemi lo scrivo qui
emoji16.png
grazie mille

Ti avviso che pur essendo tutti file differenti devi trattarli come fossero un unico file , ovvero non puoi fare dichiarazioni delle stesse costanti in due file differenti (come non potresti farle due volte in un solo file) altrimenti solo una vince tra tutte.

piccolo esempio :

Se metti nel locale_en.lua
Codice:
locale = {}
locale.man_postfix = 'Mr.'


e metti nel file locale_it.lua :
Codice:
locale = {}
locale.man_postfix = 'Signor.'

solo quella letta per ultima sarà utilizzabile..

quindi come si fa?


va in locale_en.lua

Codice:
locale_en = {}
locale_en.man_postfix = 'Mr.'

mentre in locale_it.lua metti

Codice:
locale_ita = {}
locale_ita.man_postfix = 'Signor.'
 
Ah grazie del chiarimento, avrei sicuramente sbagliato

Inviato dal mio ONEPLUS A3003 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.