Szansa na zdobycie itemka 4059 12

O temacie

Autor Wicon

Zaczęty 22.07.2012 roku

Wyświetleń 4059

Odpowiedzi 12

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
1.Czy można zrobić, aby np było 5% szansy na to, że z danego potwora lub przeciwnika dostaniemy jakiś przedmiot?

2. Czy można zmienić ilość dostawanego doświadczenia za potwory? Dokładniej: normalnie jest, że za potwora z poziomem 5 dostaniemy 50expa, z poziomem 6 dostaniemy 60 expa itd. Można to zmienić? Najlepiej tak aby exp nie był zależny od poziomu, tylko zrobić tak, że mogę wpisać poziom 20 a expa dostane 93??

jeśli się da to oczywiście proszę o wytłumaczenie tego, wskazanie plików i pomniejsze ogarnięcie tego.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
1. Tak. W funkcji w
\_Work\data\Scripts\Content\Story\B_Story\B_GiveDeathInv.dw warunku dla odpowiedniego potwora dodaj zagnieżdżony warunek typu
if (Hlp_Random(100)>=95)
2. Tak. Zmień po prostu formułę w
\_Work\data\Scripts\Content\AI\Human\ZS_Human\ZS_Dead.dOryginalna ma postać
B_GivePlayerXP (self.level * XP_PER_VICTORY);
Zakładam że znasz podstawy skryptów i te (i tak dość szczegółowe) porady wystarczą ci do osiągnięcia celu. Jeśli nie potrafisz w ogóle pisać skryptów, i oczekujesz że dostaniesz gotowy kawałek kodu, nie pomogę.

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy

Wicon

Szansa na zdobycie itemka
#2 2012-07-22, 15:48(Ostatnia zmiana: 2012-07-22, 15:53)
Znam podstawy, nawet trochę więcej, gildie umiem stworzyć nawet:P

A to wygląda na proste, ale prosze jeszcze tematu nie zamykać, w razie komplikacji będę się  pytał, ale raczej ich nie będzie.

Dzięki za szybką odpowiedź.

Punkt drugi z doświadczeniem mam z głowy, zrobione. A co do pierwszego mam kilka pytań.

1.Czy Random mogę wpisać w skrypcie potwora zamiast w tym pliku podanym przez ciebie. Np. w skrypcie szkieleta dam coś takiego:

var int losszkiel;
losszkiel = Hlp_Random (100);
if (slf.aivar[AIV_DeathInvGiven] == TRUE)
{
        if (losszkiel =< 60)
        {
        CreateInvItems (self, itmi_gold, 20);
        };
};

2. Czy mogę dać u jednego potwora 2 randomy. Bo jeśli dam 1, a chcę aby z potwora wypadały 2 przedmioty to nie będzie szansy, że wypadną mi 2 na raz. A gdybym dał 2x random, to taka szansa by była, tylko czy jest to możliwe. Przykład:

var int losszkiel;
losszkiel = Hlp_Random (100);
var int losszkielxx;
losszkielxx = Hlp_Random (100);
if (slf.aivar[AIV_DeathInvGiven] == TRUE)
{
       if (losszkiel =< 15)
       {
       CreateInvItems (self, Itmw_sword_01, 1);
       };
       if (losszkielxx =< 25)
       && (losszkielxx => 10)
       {
       CreateInvItems (self, Itmw_sword_02, 1);
       };
};

dzięki temu obydwa przedmioty mają 15% szansy na wypadnięcie, ale jest też 5% szansy na to, że wypadną dwa naraz. Można tak?

Edit: coś z procentami pomieszałem, ale to nieważne, chcę wiedzieć tylko czy tak można.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
1. W skrypcie (instance) można jedynie ustawiać zmienne oraz od biedy wywołać funkcje. Nie można tam umieszczać żadnego kodu. Musiałbyś napisać to jako osobną funkcję i ją wywołać z niego. Jednak wtedy sprawdzanie warunku (slf.aivar[AIV_DeathInvGiven] == TRUE) wydaje się bez sensu.
Ogólnie efekt będzie praktycznie ten sam, po prostu gdybyś zrobił to prawidłowo, item pojawiałby się dopiero po zabiciu potwora, a nie kiedy jest on spawnowany. Nie jestem też całkowicie pewien czy dla każdego potwora losowanie odbędzie się osobno. Ogólnie nie widzę potrzeby żeby tak kombinować skoro istnieje "właściwa" metoda.

2. Można tak robić. Jednak chociaż ten kod jest poprawny, to jego logiczny sens mocno kuleje (ale zgaduję że to tylko ogólny przykład). W ogóle nie musisz robić zmiennych - możesz tak jak w moim przykładzie, zagnieżdżać Hlp_Random bezpośrednio w warunku.

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy

Wicon

Szansa na zdobycie itemka
#4 2012-07-22, 16:16(Ostatnia zmiana: 2012-07-22, 16:17)
Gdybym dał losowanie itemka właśnie gdy zginie, to wtedy losowanie odbyło by się raczej dla każdego potwora osobno. A gdy dam w momencie przywołania (jeśli wszystkie potwory przywołają się w tym samym czasie) to wtedy losowanie może być rzeczywiście tylko jedno.
A chciałem umieścić to w skrypcie potworka, bo w pliku B_GiveDeathInv mogę ustawić losowanie dla potworka o danym ID. A gdybym chciał zrobić 2 zupełnie inne potwory o tym samym ID i ustawić każdemu z nich inny procent szansy, to za pomocą tego pliku się nia da.

Jeśli mam zrobić nową funkcję i ją wywołać (nie jestem pewien) mam zrobić:

func void B_Skeleton_lot()
{
TUTAJ WPISAĆ TEN KOD, KTÓRY NAPISAŁEM W POPRZEDNIM POŚCIE
};

Mam rację?

A w instance potwora dodać linijkę:
B_Skeleton_lot();

Mam rację?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Szansa na zdobycie itemka
#5 2012-07-22, 16:29(Ostatnia zmiana: 2012-07-22, 16:38)
Tak.

Możesz dać w pliku B_GiveDeathInv i po prostu ustawić warunek nie sprawdzający ID, tylko konkretnie instancję. Gdyby Daedalus był normalnym językiem programowania, wystarczyłoby pewnie sprawdzić:
if (self == Hlp_GetNPC(instancepotwora))Ale pamiętam że ktoś wspominał że to nie działa (nie pamiętam czy rzeczywiście tak jest). Gdyby rzeczywiście nie zadziałało, musiałbyś porównać npc ręcznie (gdzieś już podobną funkcję na forum widziałem):
func int Hlp_CmpNPC (var c_npc npc_1, var c_npc npc_2)
{
var int npc_1_id; npc_1_id = npc_1.id;
var int npc_2_id; npc_2_id = npc_2.id;

npc_2.id = false;
npc_1.id = true;

var int result; result = npc_2.id;

npc_1.id = npc_1_id;
npc_2.id = npc_2_id;

return result;
};
A potem sprawdzasz tak:
if (Hlp_CmpNPC(self, Hlp_GetNPC(instancepotwora)))
//edit: Oryginalna funkcja autorstwa Zyska:
Spoiler
func int CmpNpc(var c_npc p1,var c_npc p2)
{
var int old1;
var int old2;
var int result;
old1=p1.aivar[0];
old2=p2.aivar[0];
p1.aivar[0]=0;
p2.aivar[0]=1;
result=p1.aivar[0];
p1.aivar[0]=old1;
p2.aivar[0]=old2;
return result;
};

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Jeśli dodam taki warunek w funkcji dla potworka:
if (slf.aivar[AIV_DeathInvGiven] == TRUE)To wywala błąd że nie rozpoznaje "AIVAR". Usunąłęm więc ten if i zrobiłem bez tego. Nie jest tak, że losowanie odbywa się dla wszystkich. Sprawdziłem i każdy potwór ma swoje losowanie osobno, czyli osiągnąłem to co chciałem. Jeśli chodzi o ilość zdobywanego expa, także osiągnąłem to co chciałem. mam jeszcze jedno pytanie, teraz mi przyszło do głowy.


Chcę zrobić, aby nasza postać nie musiał się uczyć walki brońmi u żadnych nauczycieli. Chcę, aby uczyła się w trakcie walki. Chciał bym zrobić coś takiego: Jeżeli wykonaliśmy 30 uderzeń bronią jednoręczną to umiejętność walki jednoręcznymi brońmi zwiększa się o 1 procent. Albo jeśli uderzyliśmy 30 razy bronią wręcz to zwiększa się siła, a jeśli bronią dystansową to zwiększa się zręczność. Oczywiście im większe mamy umiejętności, tym więcej razy musimy uderzyć aby zdobyć kolejny punkt. Czy jet to możliwe, no i jeśli tak to oczywiście proszę o wskazówki, tak jak wcześniej, pliki, jak brzmi warunek jeśli takowy istnieje i ogólne ogarnięcie.:P
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Szansa na zdobycie itemka
#7 2012-07-22, 20:08(Ostatnia zmiana: 2012-07-22, 20:10)
Sprawa jest trudniejsza. Sam warunek co prawda istnieje:
if (C_BodyStateContains(hero, BS_HIT))Jest jednak problem - w jakiej funkcji zamierzasz to umieścić? :D
Nie ma wywołań które następują przy zadawaniu ciosu w powietrze. Musiałbyś sprawdzać ten warunek... ciągle, bez przerwy, w odstępach powiedzmy sekundowych. Można do tego wykorzystać działające w pętli triggery z opóźnieniem czasowym, popularnie nazywane na tym forum "Tick Tockami". Niestety trzeba je albo ręcznie dodać do każdego zena, albo skorzystać z pewnej sztuczki.

Nadal jednak z programistycznego, optymalizacyjnego punktu widzenia to kiepskie rozwiązanie. Zamiast tego, mógłbyś użyć czegoś prostszego - po prostu uruchamiać twoją funkcję przy każdym trafieniu w przeciwnika, bo takie wywołanie już istnieje. Zapobiegłoby to zbyt łatwemu windowaniu skilla w nieskończoność stojąc w miejscu z wciśniętym przyciskiem. Ogólnie poprawiłoby balans i pewnie zachęciło do walki (chociaż nadal można by to exploitować, ale trudniej).
Po prostu dodaj wywołanie swojej funkcji z licznikiem w funkcjach B_MM_AssessDamage (dla potworów) i B_AssessDamage (dla ludzi). Możesz to zrobić też ręcznie przekierowując Perc_AssessDamage za pomocą funkcji Npc_PercEnable, ale to namieszałoby w AI.

Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
Dobra jutro z tym pokombinuje, ale rzeczywiście sprawa jest trudniejsza. A ten warunek który napisałeś, on oznacza:
Jeśli uderzę przeciwnika. Czy może
jeśli uderzę przeciwnika konkretną bronią, wręcz lub na dystans.
??
 


Wicon

Wicon

Użytkownicy
posty147
Propsy5
  • Użytkownicy
To jeszcze mi tylko napisz jaki jest warunek na cios dystansowy i resztę sam sobie zrobię. :P
 

Sawik

Sawik

Moderator działu
Rebel
posty4772
Propsy3197
ProfesjaNierób
  • Moderator działu
  • Rebel

Sawik
Moderator działu

Szansa na zdobycie itemka
#11 2012-07-22, 21:07(Ostatnia zmiana: 2012-07-22, 21:18)
Avallach, a czy BS_ATTACK nie jest ogólnie przy machaniu mieczem? Nie tylko przy uderzaniu celu, ale też przy "waleniu w powietrze".

EDIT:
Down, sprawdziłem faktycznie nie ma. Nie wiem skąd mi się wziął, byłem przekonany że czegoś takiego używałem.
 
Życzę wam seksu analnego po stronie biernej.
Dropbox +500 mb na start
LowPoly
Wykonanie modelu niskopoligonowego to sztuka kompromisu. Nie jest to jedynie uproszczenie modelu wysokopoligonowego, ale głęboka modyfikacja oraz podejmowanie decyzji często zmieniających wygląd pierwotny obiektu, tak by przy najmniejszej ilości trójkątów uzyskać jak najwierniej odwzorowany kształt oryginału. Nie można też zapomnieć o tym iż musi nadal wyglądać przekonywająco i tak balansować by uzyskać efekt optymalny.

Podstawowym założeniem jest, że model nie powinien mieć zbędnych, niewidocznych dla gracza detali włączonych w geometrie. Większość obiektów jakie znajdują się w grze powinna prezentować się najlepiej z odległości około 3-5 metrów. Wszelkie detale, które zanikają, wydają się płaskie lub zlewają się z bryłą modelu należy uznać za zbędne i pozostawić je na normal mapie.

Fakt, iż gracz będzie w stanie podejść bliżej do obiektu i zobaczyć go z mniejszej niż 3m odległości nie powinno stanowić większego problemu, gdyż większą rolę odgrywają wtedy tekstury oraz dodatkowy detal zależny od materiału obiektu. To właśnie kompromis między wydajnością, a szczegółowością otoczenia.

Detal, którego nie widać z 3-5 metrów nie powinnien istnieć w geometrii modelu.
Krawędzie znajdujące się blisko siebie, które zlewają się z większej odległości należy uprościć do wspólnej płaszczyzny

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Szansa na zdobycie itemka
#12 2012-07-22, 21:11(Ostatnia zmiana: 2012-07-22, 21:12)
Sawik, nie ma takiego bs'a. A nawet gdyby był, to nie przydałby się - problem nie leży w warunku (jak napisałem, to akurat prosta część), ale w wywołaniu funkcji z nim. Nie da się "podpiąć" funkcji pod bs'y tak jak to jest z perceptionami. BodyState to po prostu ciąg zmiennych.


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