Wielodniowa rutyna 10776 26

O temacie

Autor Ebhodini

Zaczęty 4.12.2019 roku

Wyświetleń 10776

Odpowiedzi 26

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Tak jak pisałem pod innym wątkiem...
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?
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1153
ProfesjaProgramista
  • Złote Wrota
Jest to wykonalne jednak wymaga to trzech rzeczy:
- Umiejętności operacji na aivars
- Znajomość Ikarusa (szczątkowa [HookEngine i _^)
- Stworzony system dni tygodnia

Gdy mamy stworzony system tygodnia, to robimy hook na oCNpc::ProcessNpc (); I tam za pomocą aivara i systemu tygodnia ustalamy NPC nową rutynę.

Przykładowy kod który jest bez adresów:
func void hoCNpc__ProcessNpc()
{
          var C_Npc slf; slf = _^(ECX);
          var int day; day = Wld_GetWeekDay();
          if(slf.aivar[AIV_WeekDay] != day && slf.guild < GIL_SEPERATOR_HUM)
          {
                      //        I tutaj ustalanie rutyny!
                    //          Rzecz jasna, lepiej to jakoś znormalizować niż sprawdzać jaki jakim npc jest slf...
                    slf.aivar[AIV_WeekDay] = day;
          };
};

To jest solidna baza pod rutyny! Wystarczy teraz trochę do tego dodać.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Noo... to już chyba coś co mnie przerasta :D
Ale jak masz czas i cierpliwość to możesz mi to w jakimś stopniu wytłumaczyć? ;)
 

outlander

outlander

Użytkownicy
posty462
Propsy234
ProfesjaReżyser
  • Użytkownicy
Tworzysz Orremu rutyny na każdy z 3 dni. Potem doklejasz do jakiegoś pliku który się odświeża codziennie warunek dotyczący dnia i miniupulujesz zmienną. Na koniec w tym samym pliku sprawdzasz który z tych 3 dni masz i zmieniasz rutynę. To jest metoda podstawowa.
Zaczynasz od startup:
rutyna_orry = 1;
Do refesh armor (on się chyba odświeża codziennie) coś w stulu
if rutyna_orry == 1
{
rutyna_orry = 2;
Npc_exchangeroutine (orry;rutyna2)
};
if rutyna_orry == 2
{
rutyna_orry = 3;
Npc_exchangeroutine (orry;rutyna3)
};
if rutyna_orry == 3
{
rutyna_orry = 1;
Npc_exchangeroutine (orry;rutyna1)
};
Oczywiście ten kod nie nadaje się do kopiuj-wklej. Wymaga drobnych poprawek ale to sobie dasz radę.
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy

Patrix9999

Wielodniowa rutyna
#4 2019-12-05, 18:00(Ostatnia zmiana: 2019-12-05, 22:51)
Pomysł Outlandera jest bardzo dobry, bo nie wymaga on dużego nakładu pracy i zabawy w RE, która dla nowicjusza na pewno nie będzie prosta do ogarnięcia.

Funkcja B_RefreshArmor jest wywoływana przez silnik w następujących momentach:
1.Po minięciu pełnej doby (24h w grze)
2.Po zmianie ZEN'a
3.Prawdopodobnie również po wczytaniu gry

Dodatkowo, gra wywołuje ten "callback" dla każdego npc'a utworzonego na danym zenie, więc dobrze by było przemyśleć funkcje tak, by nie wykonywała się zbyt dużą ilość razy (np: dodając dodatkowe zmienne, lastCheckedDay oraz wasCalled).

self wskazuje na npc'a, może komuś się to do czegoś przyda.
Wystarczy wszystko sensownie obmyśleć i wykorzystać funkcje Wld_GetDay do pobierania dnia, tygodnie można ogarnąć za pomocą prostych kalkulacji:

dayOfWeek = currentDay - (currentDay / 7)

@Edit
Zamiast tworzyć dwie zmienne które by kontrolowały to, ile razy wywoła się funkcja, można wykorzystać fakt, że self to obiekt npc'a i użyć tego jako warunku.
 

Splash

Splash

Moderator
posty4208
Propsy3411
ProfesjaNierób
  • Moderator
Cytuj
dayOfWeek = currentDay - (currentDay / 7)
Ta kalkulacja wymagałaby użycia Ikarusa, a dokładniej floats, ponieważ są to liczby całkowite. A żeby otrzymać poprawny wynik trzeba je przekształcić na liczby zmiennoprzecinkowe. Inaczej gra je zaokrągli, gubiąc liczby po przecinku.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy

Patrix9999

Wielodniowa rutyna
#6 2019-12-08, 18:50(Ostatnia zmiana: 2019-12-08, 22:10)
Akurat tutaj ucięcię części floatowej z wyniku nie spowoduje jakiś problemów, nawet jest wskazane (dzień tygodnia to liczba całkowita, więc to żaden problem).

Nie mniej jednak wzór jest źle zapisany, jak wrócę do domu wstawię poprawioną formułę.

@Edit

Poniżej zamieszczam przykład liczenia dni tygodnia i wykonywania B_RefreshNpc tylko dla danego npc,
nie jest to kompletny przykład, brakuje zmiany rutyny dla danego npc, ale można go już sobie lajtowo zmodyfikować i coś dopisać, nie testowałem tego przykładu, ale wydaje mi się że wszystko powinno działać.

func void CheckOrryRoutine()
{
    if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(orry))
{
return;
};

var int currentDay; currentDay = Wld_GetDay();
var int dayOfWeek; dayOfWeek = currentDay - ((currentDay / 7) * 7);

if (dayOfWeek == 0)
{
//poniedziałek
}
else if (dayOfWeek == 1)
{
//wtorek
}
else if (dayOfWeek == 2)
{
//środa
}
else if (dayOfWeek == 3)
{
//czwartek
}
else if (dayOfWeek == 4)
{
//piątek
}
else if (dayOfWeek == 5)
{
//sobota
}
else if (dayOfWeek == 6)
{
//niedziela
};
};

func void B_RefreshArmor()
{
CheckOrryRoutine();
};
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Czy wypełnienie warunków będzie wyglądało tak:
if (dayOfWeek == 0)
{
//poniedziałek
B_ExchangeRoutine(GRD_254_Orry, "START");
//Czy tutaj można dodać zmianę rutyny innego dowolnego NPC, który może zastąpić Orry'ego na posterunku?
}
else if (dayOfWeek == 1)
{
//wtorek
B_ExchangeRoutine(GRD_254_Orry, "REST");
//Czy tutaj można dodać zmianę rutyny innego dowolnego NPC, który może zastąpić Orry'ego na posterunku?
}

I nie do końca rozumiem początek funkcji:
if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(orry))
{
return;
};
Czy operator "!=" nie oznacza "jeśli nie jest" tzn. jeśli instancja NPC nie jest instancją "Orry" to zwróć 1, a o  tego NPC w tej funkcji nam chodzi?
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Ten warunek sprawdza, czy self (obiekt dynamicznie zmieniany przez silnik) to npc, który ciebie interesuje.
Bo widzisz, funkcja B_RefreshArmor wywołuje się na każdym npc'u, więc dobrze jest ograniczyć wywoływanie się tego samego kodu tak, by funkcja wykonała się tylko wtedy, gdy np: chcesz pracować z danym npc.

Warunek to odwrotność "branchowania" kodu, czyli tworzenia scope'u z if'em.
Zamiast napisać if'a:

if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(orry))
{
    // cały kod, który jest powyżej
};

Możemy napisać odwrotne logicznie wyrażenie i gdy się ono wykona (blok if) po prostu zakończymy wykonywanie funkcji (dzięki czemu nie mamy masy zagęszczających się w sobie klamerek (scope'ów)).

Exchange routine dałeś w dobrym miejscu, nie mniej jednak, jak już pisałem wcześniej, nie testowałem kodu, powinien działać, ale dobrze by było dodać jakieś debug printy, by to potwierdzić.

@Edit

Zapomniałem o tym wspomnieć.
Słowo kluczowe return działa dwojako.
Jeśli funkcja coś przekazuje (zwraca), to możemy za jego pomocą zwrócić daną wartość.
Natomiast, jeśli funkcja jest typu pustego (void, czyli nic nie zwraca), możemy również używać słowa return.
Słowo kluczowe return może zostać użyte do zatrzymywania wykonywania funkcji na danym etapie.
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
A więc "zrobiłem" takie coś i wkleiłem to bezpośrednio do funkcji B_RefreshArmor.d Chciałem początkowo jakoś wpleść do pliku B_Functions.d ale wywalało błędy. Jednak Orry i tak nie rusza swojego dupska przez cały "tydzień".
func void CheckNPCRoutine()
{
if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(GRD_254_Orry))
{
return;
};

var int currentDay; currentDay = Wld_GetDay();
var int dayOfWeek; dayOfWeek = currentDay - ((currentDay / 7) * 7);

if (dayOfWeek == 0)
{
//poniedziałek
B_ExchangeRoutine(GRD_254_Orry, "START");
//Czy tutaj można dodać zmianę rutyny innego NPC, który może zastąpić Orry'ego na posterunku?
}
else if (dayOfWeek == 1)
{
//wtorek
B_ExchangeRoutine(GRD_254_Orry, "REST");
//Czy tutaj można dodać zmianę rutyny innego NPC, który może zastąpić Orry'ego na posterunku?
}
             (...)

func void B_RefreshArmor()
{
PrintDebugNpc( PD_ZS_FRAME, "B_RefreshArmor" );
CheckNPCRoutine();
};
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
var int dayOfWeek; dayOfWeek = currentDay - ((currentDay / 7) * 7);Wiesz o tym, że dayOfWeek będzie zawsze równe 0?
Jeśli chcesz mieć dzień tygodnia, to użyj operacji modulo (dzielenie z resztą):
var int dayOfWeek; dayOfWeek = currentDay % 7;
Cytuj
//Czy tutaj można dodać zmianę rutyny innego NPC, który może zastąpić Orry'ego na posterunku?
Możesz dodać każdego NPC tam, by zmienił rutynę.

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Słuszna uwaga co do liczenia dnia tygodnia.
Chciałem użyć ogólnie operatora modulo, ale z jakiegoś powodu wydawało mi się że będzie to źle działać.
Ale też nie masz racji, mój zapis również będzie działać, niby dlaczego wynik ma być zawsze zerem?

Nie zmienia to jednak faktu że reszta z dzielenia jest czytelniejsza.
 

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1220
Propsy1241
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
niby dlaczego wynik ma być zawsze zerem?
Podstaw jakąkolwiek liczbę rzeczywistą. Dzielisz currentDay przez 7, potem mnożysz to razy 7 - to skraca się. Następnie odejmujesz currentDay od currentDay - to jest równe 0.
 
Lieb Vaterland magst ruhig sein

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy

Patrix9999

Wielodniowa rutyna
#13 2019-12-21, 12:56(Ostatnia zmiana: 2019-12-21, 16:06)
Super, ale chyba ktoś tu zapomniał o czymś takim jak:
var int;

https://www.programmingsimplified.com/c/program/addition-subtraction-multiplication-and-division

A teraz Proof of Concept że wynik będzie inny niż 0:
var int currentDay = 15; // wtorek, 14 dzień to poniedziałek i byłby on równy 0, więc następny dzień powinien być równy 1
var int dayOfWeek; dayOfWeek = currentDay - ((currentDay / 7) * 7);

// dayOfWeek = 15 - (15 / 7 * 7), czyli:
// dayOfWeek = 15 - (2 * 7), czyli:
// dayOfWeek = 15 - 14:
// dayOfWeek = 1

Operacje arytmetyczne na integerach (np: division) zwrócą nam wynik w postaci integera bez części floatowej.
Zatem dalej nie rozumiem w jaki sposób mamy otrzymać tu zero.
Co innego, gdyby zmienna była typu float, ale takowego typu nie jest (i tak wymagałoby to wykorzystania Ikarusa).
Oczywiście, dalej twierdzę że operacja modulo jest lepszym rozwiązaniem, ale ten wzór również mógłby zadziałać.

@Edit:

Poniżej dołączam link do tego samego wzoru na uzyskanie reszty z dzielenia bez użycia operatora modulo:
https://www.geeksforgeeks.org/program-to-find-remainder-without-using-modulo-or-operator/

Gdyby kogoś ciekawiła różnica pomiędzy remainderem a operatorem modulo, to jest ona prosta.
Operacje działają tak samo w przypadku liczb dodatnich, wynik będzie się różnić w przypadku liczb ujemnych:
https://stackoverflow.com/questions/13683563/whats-the-difference-between-mod-and-remainder
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Ok, ani jedna ani druga wersja funkcji nie działa. Zgaduję, że to ja coś źle robię... Jakiś poradnik dla debila gdzie i jak to umieścić w skryptach?
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Cytat: Ebhodini
Ok, ani jedna ani druga wersja funkcji nie działa. Zgaduję, że to ja coś źle robię... Jakiś poradnik dla debila gdzie i jak to umieścić w skryptach?

Prawdopodobnie B_RefreshArmor się nie wywołuje.
Z tego co sprawdziłem, jestem pewien na 100% że ta funkcja wywołuje się:

1.Po minięciu jednego pełnego dnia
(czyli gdy wybije północ, przejście z 23:59 na 00:00).

2.Po zmianie ZEN'a

Może dodaj sobie w funkcji CheckNpcRoutine debug printa:
func void CheckNPCRoutine()
{
if (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(GRD_254_Orry))
{
return;
};

Print("Orry routine switch");

// reszta kodu
};

Zreparsuj skrypty i będąc w WORLD.ZEN wpisz te komendy w konsoli marvin:
[code]
toggle time
set time 23 59

O godzinie 0:00 powinieneś zobaczyć printa, jeśli go nie zobaczysz, to znaczy, że warunek najpewniej przerwał wywoływanie funkcji.
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy

Ebhodini

Wielodniowa rutyna
#16 2019-12-22, 07:54(Ostatnia zmiana: 2019-12-22, 10:08)
Cytuj
O godzinie 0:00 powinieneś zobaczyć printa, jeśli go nie zobaczysz, to znaczy, że warunek najpewniej przerwał wywoływanie funkcji.
Użyłem printa i faktycznie funkcja była przerywana i nic się nie wyświetlało. Więc za Twoją radą zmieniłem warunek. A dokładnie to go całkowicie usunąłem. Nie miałem zbyt dużych nadziei, że to zadziała, ale... O dziwo i printy wyskakują o 00:00 i Orry schodzi z posterunku. Co drugi dzień tak jak mu zapiałem wcześniej przez cały tydzień. Więc teoretycznie działa poprawnie.

Jeszcze jedno pytanie. Wiem, że można dodać tam więcej niż jednego NPC, ale co jeśli chciałbym dodać tam 10, albo 20, albo 40, albo wszystkich NPC;) Czy można na sztywno wklepać tam te funkcje, czy można (trzeba) to rozpisać jakoś inaczej? Czy nie będzie jakichś problemów gdy ta całą funkcja rozrośnie się bardzo bardzo dużo?
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy

Patrix9999

Wielodniowa rutyna
#17 2019-12-22, 11:00(Ostatnia zmiana: 2019-12-22, 11:57)
Jeśli chodzi o tego if'a, to trzeba by było go zapisać inaczej, bo teraz npc'owi aplikujesz rutynę tyle razy, ile Npc'ów jest na mapie (niezbyt wydajnie xD).

Możesz dodać tyle npc, ile chcesz, ale najlepiej byłoby za pomocą if/else if wypisać npc'ów i porobić osobne funkcje, w których byś dodał zmiany rutyny dla konkretnych npc'ów.

Zaraz na szybkości klepnę przykład i ci go zarzucę.

@Edit

Poprawka, funkcja B_RefreshNpc wykonywana jest na konkretnych npc'tach, dlatego warunek nigdy się nie wykonuje.

Post połączony: 2019-12-22, 11:54
var int npcsRoutineLastCheckedDay;

func void CheckRoutine_Thorus(var int dayOfWeek)
{
print("thorus routine");

if (dayOfWeek == 0)
{
// w tym miejscu możemy wypisać zmianę rutyny dla Thorusa
}
else if (dayOfWeek == 1)
{
// w tym miejscu możemy wypisać zmianę rutyny dla Thorusa
};
};

func void CheckRoutine_Orry(var int dayOfWeek)
{
print("orry routine");

if (dayOfWeek == 0)
{
//poniedziałek
B_ExchangeRoutine(GRD_254_Orry, "START");
// w tym miejscu można wypisać inne wymiany rutyn niekoniecznie dla tego samego npc
}
else if (dayOfWeek == 1)
{
//wtorek
B_ExchangeRoutine(GRD_254_Orry, "REST");
// w tym miejscu można wypisać inne wymiany rutyn niekoniecznie dla tego samego npc
};
};

func void CheckNPCsRoutine()
{
var int currentDay; currentDay = Wld_GetDay();

if (npcsRoutineLastCheckedDay == currentDay)
{ // jeśli ostatnio sprawdzany dzień jest taki sam jak bieżący, przerwij wykonywanie funkcji
return;
};

var int dayOfWeek; dayOfWeek = currentDay % 7;

// tak mogą wyglądać funkcje dla 1 npc, co do zmiany rutyny, taki podział pozwoli zachować ład, ale można również w jednej funkcji pracować na wielu npc
// oczywiście, nigdzie nie ma takiego wymogu by zastosować do tego podziału, można na upartego wszystko
// zapisać w jednej funkcji (zmiany rutyn dla każdego npc, ale wtedy ciężko będzie się w tym połapać)
CheckRoutine_Orry(dayOfWeek);
CheckRoutine_Thorus(dayOfWeek);

// aktualizacja zmiennej, która zapobiegnie wykonywaniu się tej funkcji więcej niż raz
npcsRoutineLastCheckedDay = currentDay;
};

func void B_RefreshArmor()
{
CheckNPCsRoutine();
PrintDebugNpc(PD_ZS_FRAME,"B_RefreshArmor");
};

Printy można usunąć, zostawiłem je sobie na potrzeby testowania.
 

Ebhodini

Ebhodini

Użytkownicy
posty77
Profesjabrak
  • Użytkownicy
Czy coś takiego ma prawo bytu? Na przykładzie areny w SO
func void CheckRoutine_ARENA(var int dayOfWeek)
{
if (dayOfWeek == 0)
{
//poniedziałek
B_ExchangeRoutine(VLK_530_Guy, "START");
B_ExchangeRoutine(VLK_513_Buddler, "START");
B_ExchangeRoutine(VLK_514_Buddler, "START");
B_ExchangeRoutine(VLK_515_Buddler, "START");
B_ExchangeRoutine(STT_306_Schatten, "START");
B_ExchangeRoutine(STT_316_Schatten, "START");
B_ExchangeRoutine(STT_328_Schatten, "START");
// DODAĆ GLADIATOROW
}
else if (dayOfWeek == 6)
{
//niedziela
B_ExchangeRoutine(VLK_530_Guy, "ARENA");
B_ExchangeRoutine(VLK_513_Buddler, "ARENA");
B_ExchangeRoutine(VLK_514_Buddler, "ARENA");
B_ExchangeRoutine(VLK_515_Buddler, "ARENA");
B_ExchangeRoutine(STT_306_Schatten, "ARENA");
B_ExchangeRoutine(STT_316_Schatten, "ARENA");
B_ExchangeRoutine(STT_328_Schatten, "ARENA");
// DODAĆ GLADIATOROW
};
};
I spotkania najważniejszych  osób w SO. Można by to wykorzystać do jakichś dodatkowych zadań w kolejnych rozdziałach...
func void CheckRoutine_SOR(var int dayOfWeek)
{
if (dayOfWeek == 3)
{
//poniedziałek
B_ExchangeRoutine(EBR_100_Gomez, "START"); //GOMEZ
B_ExchangeRoutine(EBR_105_Raven, "START"); //KRUK
B_ExchangeRoutine(EBR_106_Bartholo, "START"); //BARTHOLO
B_ExchangeRoutine(Grd_200_Thorus, "START"); //THORUS
B_ExchangeRoutine(PC_Thief, "START"); //DIEGO
//BLIZNA
}
else if (dayOfWeek == 2)
{
//środa
B_ExchangeRoutine(EBR_100_Gomez, "RADA"); //GOMEZ
B_ExchangeRoutine(EBR_105_Raven, "RADA"); //KRUK
B_ExchangeRoutine(EBR_106_Bartholo, "RADA"); //BARTHOLO
B_ExchangeRoutine(Grd_200_Thorus, "RADA"); //THORUS
B_ExchangeRoutine(PC_Thief, "RADA"); //DIEGO
};
};
No i końcówka kodu z podziałem na grupy lub wydarzenia
CheckRoutine_GRD(dayOfWeek);
CheckRoutine_EBR(dayOfWeek);
CheckRoutine_ARENA(dayOfWeek);
CheckRoutine_SOR(dayOfWeek);

Zakładam, że wpisanie tego samego NPC do dwóch grup spowoduje wysypanie i masę błędów,  ale co jeśli dni się nie będą pokrywać? To chyba nie ma różnicy gdzie wpisze się B_ExchangeRoutine(); jeśli w jednej funkcji będzie powiedzmy zmiana w 1 do 4 dnia, a w innej od 5 do 7 dnia. No i co się stanie jeśli dany NPC ma rutyny zmieniane w kolejnych rozdziałach czy po interakcji z graczem, jak Diego i zadanie z kamieniem ogniskującym, czy Kruk. Czy jak pójdę w 3 rozdziale do kanionu trolli o "złej" godzinie to przez te zmiany rutyny Diego będzie siedział w zupełnie innym miejscu?
 

Patrix9999

Patrix9999

Użytkownicy
posty127
Propsy38
Profesjabrak
  • Użytkownicy
Cytat: Ebhodini
Czy coś takiego ma prawo bytu? Na przykładzie areny w SO

Tak, możesz sobie to również w taki sposób pogrupować.

Cytat: Ebhodini
Zakładam, że wpisanie tego samego NPC do dwóch grup spowoduje wysypanie i masę błędów,  ale co jeśli dni się nie będą pokrywać? To chyba nie ma różnicy gdzie wpisze się B_ExchangeRoutine(); jeśli w jednej funkcji będzie powiedzmy zmiana w 1 do 4 dnia, a w innej od 5 do 7 dnia.

Owszem, nie ma to różnicy, nic się nie posypie, co najwyżej rutyny nie te co powinny będą się nakładać.

Cytat: Ebhodini
No i co się stanie jeśli dany NPC ma rutyny zmieniane w kolejnych rozdziałach czy po interakcji z graczem, jak Diego i zadanie z kamieniem ogniskującym, czy Kruk. Czy jak pójdę w 3 rozdziale do kanionu trolli o "złej" godzinie to przez te zmiany rutyny Diego będzie siedział w zupełnie innym miejscu?

Tak, dlatego trzeba by było jeszcze sprawdzać, czy rozdział jest odpowiedni, więc no, może to być trochę problematyczne, ale da się to ogarnąć (zwykły if załatwi sprawę).
 


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