Zmiana stylu chodzenia 290 18

O temacie

Autor Ebhodini

Zaczęty 2.12.2019 roku

Wyświetleń 290

Odpowiedzi 18

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Chciałbym zmienić sposób w jaki chodzi gracz ze względu na gildię jaką posiada. W jakim pliku i miejscu należy umieścić stosowny kod?
 

Namiot

Namiot

Użytkownicy
posty342
Propsy37
ProfesjaGracz
  • Użytkownicy
Chyba w danym dialogu trzeba to wpisać podobnie jak np. postać za wykonanie zadania daje ci 500 tysięcy bryłek rudy.
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Czyli odpowiednio do Gomeza, Laresa, Corristo, Thorusa itd.? Nie da się jakoś zbiorczo zrobić jednej funkcji if(gildia=coś) { Mdl_ApplyOverlayMds   (self, "odpowedni do "cosia" rodzaj chodu"); i tak pomnożyć dla każdej frakcji?
 

Siemekk

Siemekk

Złote Wrota
Cesarz
posty2106
Propsy1103
ProfesjaProgramista
  • Złote Wrota
  • Cesarz
Dopisuje się to do instancji NPC.
 


Dodatkowo - odpłatnie pomagam przy zaawansowanych skryptach (AST, UNION, IKARUS).
Po więcej informacji zapraszam na PW na DISCORD.

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
No ok, ale czy jest jakaś funkcja zmieniająca tą linijkę jak np. zmianę gildii poprzez B_ChangeGuild ();
Jeśli nie ma to czy można na szybko jakąś napisać? Ponieważ wolałbym mieć jeden plik, w którym miałbym opisaną całą funkcję niż grzebać bezpośrednio w osobnych dialogach, tak jak sugerował Namiot, co oczywiście nie jest jakieś niemożliwe tylko po prostu dłuższe.
 

outlander

outlander

Użytkownicy
Osobnik
posty156
Propsy92
Profesjabrak
  • Użytkownicy
  • Osobnik
A nie idzie dokleić takiego kodu do B_ChangeGuild? Nie pamiętam jak to tam wygląda, ale myślę że to najoptymalniejsze rozwiązanie.
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
OK tylko gdzie w takim razie jest plik z B_ChangeGuild? :D Wiem, że funkcja działa bo jej używałem nieraz i szukałem jej w _work\DATA\scripts\concent\story\B i nie widzę, przeszukałem cały folder z grą i nigdzie niema takowego, więc pewnie jest pod inną nazwą...
 

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy
Z tego, co widzę, funkcja B_ChangeGuild jest w pliku Scripts\Content\AI\AI_Intern\B_Functions.d, ale równie dobrze możesz napisać jakąś własną.
A tak na przyszłość, do szukania nazw funkcji/zmiennych itp. polecam Notepad++ lub inny edytor z opcją szukania w plikach.
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Używam Notepad++ i szczerze nie wiedziałem, że ma taką opcję. :D
Próbowałem zrobić własną funkcję i wyszło mi coś takiego:
func void B_Change_Walk ()
{
if(Npc_IsPlayer(self))
{
if(hero.guild == GIL_STT) //CIEŃ { Mdl_ApplyOverlayMds      (self,"Humans_Relaxed.mds"); }

else if(hero.guild == GIL_ORG) // SZKÓDNIK { Mdl_ApplyOverlayMds (self,"Humans_Relaxed.mds"); }

else if(hero.guild == GIL_NOV) // NOWICJUSZ{ Mdl_ApplyOverlayMds (self,"Humans_Relaxed.mds"); }

else if(hero.guild == GIL_GRD) //STRAŻNIK{ Mdl_ApplyOverlayMds (self,"Humans_Militia.mds"); }

else if(hero.guild == GIL_SLD) //NAJEMNIK{ Mdl_ApplyOverlayMds (self,"Humans_Militia.mds"); }

else if(hero.guild == GIL_TPL) //ŚWIĄTYNNY { Mdl_ApplyOverlayMds (self,"Humans_Militia.mds"); }

else if(hero.guild == GIL_KDF) //MAG OGNIA { Mdl_ApplyOverlayMds (self,"Humans_Mage.mds"); }

else if(hero.guild == GIL_KDW) //MAG WODY { Mdl_ApplyOverlayMds (self,"Humans_Mage.mds"); }

else if(hero.guild == GIL_GUR) //GURU { Mdl_ApplyOverlayMds (self,"Humans_Mage.mds"); };
};
};
Jest szansa, że chociaż idę w dobrym kierunku?
 

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy
"//" zakomentuje wszystko do końca linii, więc zmiana animacji się nie wykona. Przerzuć kod w klamrach do osobnych linijek.

Myślę, że lepiej wrzucić "selfa" jako parametr, bo np. w dialogach globalnym "selfem" jest NPC (nie "hero"), więc jak dodasz zmianę gildii do dialogu, to się nie wykona.

func void B_Change_Walk(var C_NPC who)
{
if(Npc_IsPlayer(who))
{
if(who.guild == bla bla bla...)

(...)
};
}


Teraz możesz dodać wywołanie swojej funkcji na końcu B_ChangeGuild, lub napisać swoją funkcję, np:


func void B_MyNewChangeGuild(var int npcInstance, var int newGuild)
{
var C_NPC npc;
npc = Hlp_GetNpc(npcInstance);

Npc_SetTrueGuild(npc,newGuild);
npc.guild = newGuild;

B_Change_Walk(npc);
};


Możesz też podejść do sprawy inaczej i stworzyć osobną funkcję, wywoływaną tylko dla "hero":



func void B_ChangeHeroGuild(var int newGuild)
{
Npc_SetTrueGuild(hero,newGuild);
hero.guild = newGuild;

if(newGuild == GIL_STT)
{
Mdl_ApplyOverlayMds(hero,"Humans_Relaxed.mds");
}
else if
(...)

};


albo jeszcze inaczej, rozbić sobie wszystko na kilka osobne funkcje:

func void B_ChangeNPCGuild(var C_NPC who, var int newGuild)
{
Npc_SetTrueGuild(who,newGuild);
who.guild = newGuild;
}

func void B_ChangeWalkIfHero(var C_NPC who, var String ani)
{
if(Npc_IsPlayer(who))
{
Mdl_ApplyOverlayMds(who, ani);
};

}

/////////////////////

func void B_ChangeNPCGUildToSTT(var int npcInstance)
{
var C_NPC npc;
npc = Hlp_GetNpc(npcInstance);

B_ChangeNPCGuild(npc, GIL_STT);
B_ChangeWalkIfHero(npc, "Humans_Relaxed.mds");
}


func void B_ChangeNPCGUildToKDF(var int npcInstance)
{
var C_NPC npc;
npc = Hlp_GetNpc(npcInstance);

B_ChangeNPCGuild(npc, GIL_KDF);
B_ChangeWalkIfHero(npc, "Humans_Mage.mds");
}

func void B_ChangeNPCGUildToBlaBlaBla...
(...)


Sposobów jest wiele. Jak Ci wygodniej.
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Tak tak wiem jak działają "//" napisane miałem poprawnie, czyli każda klamerka w osobnej linii, tylko przy wrzucaniu tego tutaj nie chciałem rozwlekać kodu. Mój błąd :D Dzięki za rady.  Czyli jak rozumiem taka funkcja będzie działała dla każdego NPC o ile w trakcie gry zmieni gildię włącznie z graczem?
func void B_ChangeGuild(var int npcInstance, var int newGuild)
{
PrintDebugNpc (PD_ZS_DETAIL, "B_ChangeGuild");

var C_NPC npc;
npc = Hlp_GetNpc(npcInstance);

Npc_SetTrueGuild(npc,newGuild);
npc.guild = newGuild;

B_Change_Walk(npc);
};

func void B_Change_Walk (var C_NPC npc)
{
if(npc.guild == GIL_STT) //CIEŃ
{
Mdl_ApplyOverlayMds (self,"Humans_Relaxed.mds");
}
else if(npc.guild == GIL_ORG) // SZKÓDNIK
{
Mdl_ApplyOverlayMds (self,"Humans_Relaxed.mds");
}
                     (...)
};
 

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy
Tutaj:

Mdl_ApplyOverlayMds(self,"Humans_Relaxed.mds");
znów korzystasz z globalnego "selfa". Użyj zmiennej, przekazanej jako parametr:

Mdl_ApplyOverlayMds(npc, "Humans_Relaxed.mds");
Reszta tak na oko powinna działać. Ale najlepiej uruchomić i sprawdzić :)
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
O! Dzięki za korektę. I sama funkcja B_Change_Walk() powinna być w pliku B_Functions.d nad funkcją wywołującą B_ChangeGuild() bo inaczej program nie wykona tej funkcji bo jej nie będzie widział? 
 

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy
Może być też w innym pliku. Ważne, żeby parser odczytał ją wcześniej niż jej wywołanie. Pliki ustalasz sobie w Gothic.src.


W sumie tak myślę, że jak masz dla kilku gildii ten sam styl, to mógłbyś krócej:

if(npc.guild == GIL_STT || npc.guild == GIL_ORG)
{
Mdl_ApplyOverlayMds(npc, "Humans_Relaxed.mds");
}
else if...
 (...)

Albo tak sobie porozbijać:

func int C_HasRelaxedWalkingStyle(var int guild)
{
if(guild == GIL_ORG || guild == GIL_STT)
{
return TRUE;
};
return FALSE;

};

func int C_HasMageWalkingStyle(var int guild)
{
if(guild == GIL_KDF || (...))
{
return TRUE;
};
return FALSE;

};

(...)


func void B_Change_Walk(var C_NPC npc)
{
var int npcGuild = npc.guild;

if(C_HasRelaxedWalkingStyle(npcGuild))
{
Mdl_ApplyOverlayMds(npc, "Humans_Relaxed.mds");
}
else if(C_HasMageWalkingStyle(npcGuild))
{

(...)
};

 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Bardzo dziękuję za pomoc mam jeszcze pytanie na inny temat ale nie wiem czy jest sens rozpoczynać kolejny wątek. Mianowicie czy da się tworzyć więcej niż jednodniowe rutyny? Tzn. na przykładzie Orryego, który przez cały czas trwania rozgrywki świątek piątek stoi jak słup soli na bramie. A jakby tak dodać paru strażników, którzy regularnie, powiedzmy co 2 dni, zmienialiby się na posterunku, nie tylko tej ale wszystkich bramach, czy przejściach. Wprawić w ruch ten świat i dać odetchnąć tym strażnikom. Albo zrobić cotygodniowe spotkania przyjaciół w jakimś miejscu jak to wynikało z ich opowieści, czy lekko poruszyć targowisko, karczmę, czy plac świątynny rutnowo, ale nie codziennie zmieniając osoby tam przesiadujące. Czy konieczne jest tu używanie tej funkcji: func void B_ExchangeRoutine()? I czy jest to w ogóle wykonalne? :D
 

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy

A.K.

Zmiana stylu chodzenia
#15 2019-12-04, 18:42(Ostatnia zmiana: 2019-12-04, 19:30)
To osobny problem, więc powinieneś założyć nowy temat.

Co do wielodniowej rutyny... proste dodanie godzin raczej nie wypali, ale pewności nie mam, bo nie wiem, jak wygląda funkcja silnika TA_Min*. Zrobiłem tylko krótki test, który wydaje się to potwierdzać. Ale lepiej, żeby wypowiedział się ktoś, kto wie na sto procent.

Można natomiast napisać rutynę, która zawiera wywołanie zmiany rutyny. Gdyby dodać do tego sprawdzanie czasu, coś pewnie dałoby się podziałać.

PS: Tylko tym razem załóż temat we właściwym dziale, a nie w samouczkach  :D

----------------------------------------

*W sumie nie wiem, czy znajomość tej funkcji coś by podpowiedziała. Raczej ważniejsze jest pytanie, czy wywołania się kolejkują, czy nadpisują w obrębie rutyny.
 

Ebhodini

Ebhodini

Użytkownicy
posty27
Profesjabrak
  • Użytkownicy
Się robi! ;)
 

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1244
Propsy1226
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
Nie wiem czy w G1 jest tak samo jak w G2 (pewnie tak), ale przyda się jeszcze napisanie jakiejś wywoływanej przy wczytaniu gry funkcji, która będzie odświeżać te warunki. Jako że styl chodzenia nie jest zapisywany w skrypcie postaci, tylko mds jest nakładany w trakcie gry funkcją, przy każdym wczytaniu gry styl chodzenia będzie się resetował do domyślnego stanu ze skryptu postaci. Tak jak mówiłem, przynajmniej w G2 było to konieczne. Możliwe, że G1 jest bardziej "przystępny" pod tym względem, w co wątpię, biorąc pod uwagę że korzysta ze starszej wersji ZenGina i struktura skryptów jest imo dużo bardziej upośledzona.
 
Lieb Vaterland magst ruhig sein

A.K.

A.K.

Użytkownicy
posty144
Propsy142
Profesjabrak
  • Użytkownicy

A.K.

Zmiana stylu chodzenia
#18 2019-12-04, 23:47(Ostatnia zmiana: Wczoraj o 00:11)
No to pewnie starczy łopatologiczne wywołanie tej B_Change_Walk dla każdego NPC, który ma mieć kiedykolwiek zmienianą gildię :F Ewentualnie dla masowej zmiany gildii po jakimś zdarzeniu fabularnym otoczyć to warunkiem.

No, chyba że tych NPC będą dziesiątki, to wtedy pewnie pasowałoby napisać coś, co nie robi tych sprawdzeń gildii, tylko od razu nakłada właściwe animacje.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry