Przejdź do głównej zawartości

Rutyny dzienne (TA_)

Rutyny dzienne to funkcje Daedalusa zaczynające się od prefiksu TA_ (niem. Tagesablauf — plan dnia). Definiują one co NPC robi w danym przedziale czasowym — gdzie idzie, jaką czynność wykonuje i jak długo.

Wszystkie funkcje TA_ są zdefiniowane w pliku Content/AI/Human/TA.d, a odpowiadające im stany ZS_ w katalogu Content/AI/Human/TA_Human/.

Jak działa system rutyn

Każda funkcja TA_ jest wrapperem wokół funkcji silnika TA_Min, która rejestruje aktywność NPC w danym przedziale czasu:

func void TA_Sleep(var int start_h, var int start_m, var int stop_h, var int stop_m, var string waypoint)
{
TA_Min(self, start_h, start_m, stop_h, stop_m, "ZS_GotoBed", waypoint);
};

Parametry

Wszystkie funkcje TA_ mają identyczną sygnaturę:

ParametrTypOpis
start_hintGodzina rozpoczęcia (format 24h)
start_mintMinuta rozpoczęcia
stop_hintGodzina zakończenia
stop_mintMinuta zakończenia
waypointstringNazwa waypointu (WP_) lub freepointu (FP_) docelowego

Funkcje Rtn_ (harmonogram dnia)

Rutyny przypisuje się do NPC za pomocą zmiennej daily_routine wskazującej na funkcję Rtn_:

instance Kowal(Npc_Default)
{
name = "Kowal";
// ...
daily_routine = Rtn_Start_Kowal;
};

func void Rtn_Start_Kowal()
{
TA_Smith_Anvil (08,00, 12,00, "FORGE_KOWAL");
TA_Stand_Eating (12,00, 13,00, "FP_KOWAL_EAT");
TA_Smith_Anvil (13,00, 18,00, "FORGE_KOWAL");
TA_Smalltalk (18,00, 20,00, "FP_KOWAL_TALK");
TA_Sleep (20,00, 08,00, "BED_KOWAL");
};
wskazówka

Harmonogram dnia powinien pokrywać pełne 24 godziny bez przerw. Jeżeli godzina zakończenia jednej rutyny nie pokrywa się z godziną rozpoczęcia następnej, NPC będzie stał bezczynnie.

ostrzeżenie

Godzina zakończenia jednego bloku musi być równa godzinie rozpoczęcia kolejnego. Bloki nie mogą się nakładać.

Stany ZS_ (Zustand)

Każda rutyna TA_ odwołuje się do stanu ZS_ (Zustand — stan), który składa się z trzech funkcji:

  1. ZS_<Nazwa>()Inicjalizacja: NPC idzie do waypointu, przygotowuje przedmioty, ustawia percepcję.
  2. ZS_<Nazwa>_Loop()Pętla: Powtarzane zachowanie (animacje, interakcje z mobami). Zwraca LOOP_CONTINUE.
  3. ZS_<Nazwa>_End()Zakończenie: Sprzątanie po zakończeniu bloku czasowego.

Waypointy i freepointy

  • WP_ (Waypoint) — stały, nazwany punkt w świecie gry. NPC podchodzi dokładnie do tego punktu.
  • FP_ (Freepoint) — elastyczny punkt w pobliżu waypointu. Wiele stanów ZS_ samo wyszukuje wolne freepointy w okolicy (np. Wld_IsFPAvailable(self, "STAND")).
  • Moby — interaktywne obiekty świata (np. kowadło, łóżko, ławka), z którymi NPC wchodzi w interakcję za pomocą AI_UseMob().

Lista rutyn ludzi

Stanie / bezczynność

FunkcjaStan ZS_FP / MobOpis
TA_Stand_ArmsCrossedZS_Stand_ArmsCrossedFP "STAND"Stoi ze skrzyżowanymi rękami. Losowe animacje: drapanie, przeciąganie, zmiana nogi.
TA_Stand_WPZS_Stand_WP— (waypoint)Stoi bezczynnie dokładnie przy waypoincie (bez szukania FP). Poza ze skrzyżowanymi rękami + idle.
TA_Stand_GuardingZS_Stand_GuardingFP "STAND"Stoi na warcie — ręce na biodrach, losowo rozgląda się.
TA_Stand_SweepingZS_Stand_SweepingFP "SWEEP"Stoi i zamiata miotłą. Tworzy ItMi_Broom jeśli nie posiada.
TA_Stand_DementorZS_Stand_DementorFP "STAND"Poza dementora (szukacza). Niestandardowa percepcja — wyczuwa jak potwór.
TA_Stand_RangerMeetingZS_Stand_RangerMeetingFP "STAND"Spotkanie rangersów. Minimalna percepcja. Lares stoi w pozie strażnika, pozostali ze skrzyżowanymi rękami.

Picie

FunkcjaStan ZS_FP / MobOpis
TA_Stand_DrinkingZS_Stand_DrinkingFP "STAND"Stoi i pije alkohol (ItFo_Booze). Tworzy przedmiot jeśli nie posiada. Losowe animacje picia.

Jedzenie

FunkcjaStan ZS_FP / MobOpis
TA_Stand_EatingZS_Stand_EatingFP "STAND"Stoi i je losowy posiłek (jabłko, ser, boczek lub baranina). Animacja dopasowana do rodzaju jedzenia.

Siedzenie

FunkcjaStan ZS_FP / MobOpis
TA_Sit_BenchZS_Sit_BenchMob "BENCH"Siada na ławce. Losowe animacje ciała na siedząco.
TA_Sit_CampfireZS_Sit_CampfireFP "CAMPFIRE"Siada na ziemi przy ognisku (brak moba — korzysta z FP).
TA_Sit_ChairZS_Sit_ChairMob "CHAIR"Siada na krześle. Losowe animacje na siedząco.
TA_Sit_ThroneZS_Sit_ThroneMob "THRONE"Siada na tronie.

Spanie

FunkcjaStan ZS_FP / MobOpis
TA_SleepZS_GotoBedMob "BEDHIGH"Idzie do łóżka i śpi. Ograniczona percepcja — reaguje na ciche dźwięki, obrażenia i rozmowę (budzi się).
TA_Sleep_DeepZS_Sleep_DeepMob "BEDHIGH"Głęboki sen — nie reaguje na ciche dźwięki. Tylko obrażenia i rozmowa mogą obudzić.

Gotowanie

FunkcjaStan ZS_FP / MobOpis
TA_Cook_CauldronZS_Cook_CauldronMob "CAULDRON"Gotuje w kotle. Tworzy ItMi_Scoop (chochlę) jeśli nie posiada.
TA_Cook_PanZS_Cook_PanMob "PAN"Gotuje na patelni. Tworzy surową baraninę; po zakończeniu zjada ugotowaną.
TA_Cook_StoveZS_Cook_StoveMob "STOVE"Gotuje na piecu. Tworzy surową baraninę jeśli nie posiada.
TA_Roast_ScavengerZS_Roast_ScavengerMob "BARBQ"Piecze ścierwojada na rożnie.

Kowalstwo / rzemiosło

FunkcjaStan ZS_FP / MobOpis
TA_Smith_AnvilZS_Smith_AnvilMob "BSANVIL"Kuje na kowadle.
TA_Smith_CoolZS_Smith_CoolMob "BSCOOL"Chłodzi metal w korytku z wodą.
TA_Smith_FireZS_Smith_FireMob "BSFIRE"Rozgrzewa metal przy ogniu kowalskim.
TA_Smith_SharpZS_Smith_SharpMob "BSSHARP"Ostrzy broń na kamieniu szlifierskim.
TA_Make_RuneZS_Make_RuneTworzy runy przy stole runowym.
TA_Potion_AlchemyZS_Potion_AlchemyMob "LAB"Warzy mikstury przy stole alchemicznym. Tworzy ItMi_Flask jeśli nie posiada.

Praca fizyczna

FunkcjaStan ZS_FP / MobOpis
TA_Pick_FPZS_Pick_FPFP "PICK"Zbiera / kopie — porusza się między freepointami PICK, co 7s zmienia pozycję.
TA_Pick_OreZS_Pick_OreMob "ORE"Wydobywa rudę. Tworzy i ekwipuje topór dwuręczny (ItMw_2h_Axe_L_01) jeśli nie posiada.
TA_Repair_HutZS_Repair_HutMob "REPAIR"Naprawia chatę — wbija gwoździe. Losowa animacja naprawy.
TA_Sweep_FPZS_Sweep_FPFP "SWEEP"Szoruje szczotką (ItMi_Brush) przy freepoincie.
TA_Wash_FPZS_Wash_FPFP "WASH"Pierze / myje przy freepoincie. Animacja klęczenia przy myciu.
TA_Rake_FPZS_Rake_FPFP "PICK"Grabi grabiami (ItMi_Rake) przy freepoincie.
TA_SawZS_SawMob "BAUMSAEGE"Piłuje drewno na pile.
TA_Stomp_HerbZS_Stomp_HerbMob "HERB"Ugniatia zioła — przygotowanie alchemiczne.

Nauka / pisanie

FunkcjaStan ZS_FP / MobOpis
TA_Read_BookstandZS_Read_BookstandMob "BOOK"Czyta przy pulpicie.
TA_Study_WPZS_Study_WP— (waypoint)Studiuje przy waypoincie — stoi ze skrzyżowanymi rękami i czyta fałszywy zwój (FakeScroll_Addon).

Rozmowy / interakcje społeczne

FunkcjaStan ZS_FP / MobOpis
TA_SmalltalkZS_SmalltalkFP "SMALLTALK"Stoi przy freepoincie i co ~8s rozmawia z pobliskim NPC w tym samym stanie.

Modlitwa

FunkcjaStan ZS_FP / MobOpis
TA_Pray_InnosZS_Pray_InnosMob "INNOS"Modli się do Innosa przy ołtarzu (interakcja z mobem).
TA_Pray_Innos_FPZS_Pray_Innos_FPFP "PRAY"Klęka i modli się do Innosa przy freepoincie.
TA_Pray_SleeperZS_Pray_SleeperMob "IDOL"Modli się do Śniącego przy bożku (interakcja z mobem).
TA_Pray_Sleeper_FPZS_Pray_Sleeper_FPFP "PRAY"Klęka i modli się do Śniącego przy freepoincie.

Przemówienia

FunkcjaStan ZS_FP / MobOpis
TA_Preach_VatrasZS_Preach_VatrasWygłasza kazanie w stylu Vatrasa. Cykl 21 kazań, zmiana co ~13s.
TA_Announce_HeroldZS_Announce_HeroldHerold ogłasza wiadomości. Co ~70s przerywa pozę strażnika i wygłasza komunikat.

Poruszanie się

FunkcjaStan ZS_FP / MobOpis
TA_RunToWPZS_RunToWPBiegnie do waypointu, potem stoi w pozie strażnika i rozgląda się.
TA_FleeToWpZS_FleeToWpUcieka do waypointu (bieg + nakładka animacyjna HUMANS_FLEE.MDS).
TA_Follow_PlayerZS_Follow_PlayerPodąża za graczem.
TA_Guide_PlayerZS_Guide_PlayerProwadzi gracza do celu.
TA_Guard_PassageZS_Guard_PassagePilnuje przejścia — blokuje drogę graczowi. Percepcja co 0.1s.
TA_Guard_HammerZS_Guard_HammerFP "STAND"Stoi na warcie. Obsługuje questowy Święty Młot — odkłada go na miejsce jeśli jest blisko klasztornej komnaty.
TA_CircleZS_CircleRytualne zaklęcie kręgu. Efekty zależne od gildi (dementor / KDW / mag).

Muzyka / występy

FunkcjaStan ZS_FP / MobOpis
TA_Play_LuteZS_Play_LuteFP "STAND"Gra na lutni. Tworzy ItMi_Lute jeśli nie posiada.
TA_ConcertZS_ConcertKoncert zespołu In Extremo. Każdy członek zespołu ekwipuje swój instrument.
TA_DanceZS_DanceTańczy losowy styl (9 wariantów: T_DANCE_01 do T_DANCE_09).
TA_Spit_FireZS_Spit_FireFP "STAND"Zieje ogniem (połykacz ognia). Tworzy ItLsTorchFireSpit jeśli nie posiada.

Trening

FunkcjaStan ZS_FP / MobOpis
TA_Practice_MagicZS_Practice_MagicFP "STAND"Ćwiczy magię. Losowe animacje: T_PRACTICEMAGIC do T_PRACTICEMAGIC4, R_SCRATCHHEAD.
TA_Practice_SwordZS_Practice_SwordĆwiczy walkę mieczem. Ekwipuje najlepszą broń białą; jeśli nie ma — tworzy ItMw_1h_Bau_Mace.

Palenie

FunkcjaStan ZS_FP / MobOpis
TA_Smoke_JointZS_Smoke_JointFP "STAND"Pali skręta (bagienne ziele). Tworzy ItMi_Joint jeśli nie posiada.
TA_Smoke_WaterpipeZS_Smoke_WaterpipeMob "SMOKE"Pali fajkę wodną.

Inne

FunkcjaStan ZS_FP / MobOpis
TA_PeeZS_PeeFP "PEE"Załatwia potrzebę.
TA_GhostZS_GhostZachowanie ducha — niestandardowa percepcja (tylko rozmowa i obrażenia).
TA_GhostWuselZS_GhostWuselFP "FP_ROAM"Duch wędrujący między freepointami.

Rutyny potworów

Potwory korzystają z prostszych rutyn zarządzanych przez centralny scheduler ZS_MM_AllScheduler, który na podstawie pory dnia kieruje potwora do odpowiedniego stanu.

FunkcjaStan ZS_FPOpis
TA_RoamZS_MM_Rtn_Roam"FP_ROAM"Potwór wędruje między freepointami FP_ROAM. Losowy czas oczekiwania (0–5s) w każdym punkcie.
TA_RestZS_MM_Rtn_Rest"FP_ROAM"Potwór odpoczywa — stoi w miejscu z losowymi animacjami idle.
TA_SleepMonsterZS_MM_Rtn_Sleep"FP_ROAM"Potwór śpi (kładzie się). Ograniczona percepcja — ciche dźwięki wrogich gildii budzą go do walki.
TA_WuselZS_MM_Rtn_Wusel"FP_ROAM"Potwór biegiem kręci się niespokojnie między freepointami (co 1s zmienia punkt).

Specjalne rutyny potworów

FunkcjaStan ZS_Opis
TA_MM_Rtn_EatGroundZS_MM_Rtn_EatGroundPotwór je z ziemi — losowe animacje podnoszenia głowy podczas jedzenia.
TA_MM_Rtn_DragonRestZS_MM_Rtn_DragonRestSmok odpoczywa — regeneruje HP (1 HP co 2 ticki) jeśli jest smokiem.
TA_MM_Rtn_FollowSheepZS_MM_Rtn_FollowSheepOwca (lub zwierzę) podąża za bohaterem, jeśli jest członkiem drużyny.
TA_MM_Rtn_OrcSitZS_MM_Rtn_OrcSitOrk siedzi przy ognisku (FP "FP_CAMPFIRE") w pozie snu strażnika.
TA_MM_Rtn_SummonedZS_MM_Rtn_SummonedIstota przyzwana — podąża za bohaterem, ma ograniczony czas życia (MONSTER_SUMMON_TIME).

Moby — spis obiektów interaktywnych

Rutyny korzystające z mobów wymagają, aby odpowiedni obiekt interaktywny znajdował się w pobliżu waypointu.

Nazwa mobaUżywany przez
BSANVILTA_Smith_Anvil
BSCOOLTA_Smith_Cool
BSFIRETA_Smith_Fire
BSSHARPTA_Smith_Sharp
BARBQTA_Roast_Scavenger
BAUMSAEGETA_Saw
BEDHIGHTA_Sleep, TA_Sleep_Deep
BENCHTA_Sit_Bench
BOOKTA_Read_Bookstand
CAULDRONTA_Cook_Cauldron
CHAIRTA_Sit_Chair
HERBTA_Stomp_Herb
IDOLTA_Pray_Sleeper
INNOSTA_Pray_Innos
LABTA_Potion_Alchemy
ORETA_Pick_Ore
PANTA_Cook_Pan
REPAIRTA_Repair_Hut
SMOKETA_Smoke_Waterpipe
STOVETA_Cook_Stove
THRONETA_Sit_Throne

Freepointy — spis typów

Typ FPUżywany przez
CAMPFIRETA_Sit_Campfire
FP_CAMPFIRETA_MM_Rtn_OrcSit
FP_ROAMTA_GhostWusel, TA_Roam, TA_Rest, TA_SleepMonster, TA_Wusel i inne rutyny potworów
PEETA_Pee
PICKTA_Pick_FP, TA_Rake_FP
PRAYTA_Pray_Innos_FP, TA_Pray_Sleeper_FP
SMALLTALKTA_Smalltalk
STANDTA_Stand_ArmsCrossed, TA_Stand_Guarding, TA_Stand_Drinking, TA_Stand_Eating, TA_Stand_Dementor, TA_Play_Lute, TA_Practice_Magic, TA_Smoke_Joint, TA_Spit_Fire
SWEEPTA_Stand_Sweeping, TA_Sweep_FP
WASHTA_Wash_FP

Przykład kompletnego planu dnia

// Kowal miejski — pełny dzień
func void Rtn_Start_CitySmith()
{
TA_Sleep (22,00, 06,00, "BED_SMITH_01");
TA_Stand_Eating (06,00, 07,00, "FP_SMITH_EAT");
TA_Smith_Fire (07,00, 08,00, "FORGE_SMITH_01");
TA_Smith_Anvil (08,00, 12,00, "FORGE_SMITH_01");
TA_Smith_Cool (12,00, 12,30, "FORGE_SMITH_01");
TA_Stand_Eating (12,30, 13,00, "FP_SMITH_EAT");
TA_Smith_Anvil (13,00, 17,00, "FORGE_SMITH_01");
TA_Smith_Sharp (17,00, 18,00, "FORGE_SMITH_01");
TA_Smalltalk (18,00, 20,00, "FP_SMITH_TALK");
TA_Stand_Drinking (20,00, 22,00, "FP_TAVERN_SMITH");
};
informacja

Funkcje TA_ wywoływane w funkcji Rtn_ nie muszą być w kolejności chronologicznej — silnik sam sortuje bloki czasowe. Jednak dla czytelności kodu zalecane jest zachowanie porządku.

Zmiana rutyny w trakcie gry

Możesz dynamicznie zmienić plan dnia NPC za pomocą Npc_ExchangeRoutine:

// Zmienia rutynę NPC na nowy harmonogram
Npc_ExchangeRoutine(self, "NIGHT_GUARD");

Wymaga to zdefiniowania odpowiedniej funkcji Rtn_NightGuard_<NPC_ID>().

Aby cofnąć zmianę rutyny:

// Przywraca domyślny plan dnia
Npc_ExchangeRoutine(self, "START");