Siema, sory za orty i interpunkcję ale to mój znak rozpoznawczy ;p
Timer? Tak timer wywoływanie czegoś co jakiś czas lub na jakiś czas, nie mam pojęcia czy coś takiego istnieje jako gotowe w LeGo czy też w Ikarusie, ale wpadłem na pomysł jak to zrobić za pomocą Frame Functions.
Czyli co? Czyli Lego i ikarus zainicjuj bo inaczej lipa, linka nie podam, tym razem jesteście zdani na poszukiwania

w samouczkach w dziale skrypty znajdziecie wszystko co trezba.
No wiec tak przykład pierwszy item który zwiększa nam skille walki na minutę(Standardowo w moich poradnikach wszystko z grubsza wyjaśnine w komentarzu)
const int time = 0;//stała czasu do wywołania lub do zaprzestania.
const int stop = 0;//stała potrzebna po to aby pewn funkcja nie wywoływała się co sekundę a tylko raz, niżej wyjaśnię.
func void SkillUpp()//wiadomo, ale jak coś to jest to funkcja zwiększająca skille.
{
B_AddFightSkill (hero, NPC_TALENT_1H, Npc_GetTalentSkill (hero, NPC_TALENT_1H)+40);//GetTalent mogłem zrobić na zmiennych ale nie chciałem śmiecić.
B_AddFightSkill (hero, NPC_TALENT_2H, Npc_GetTalentSkill(hero, NPC_TALENT_2H)+40);//Ogólnie te cztery linijki dodają do 1h/2h/kuszy/łuku 40.
B_AddFightSkill (hero, NPC_TALENT_BOW, Npc_GetTalentSkill (hero, NPC_TALENT_BOW)+40);//Czyli jak masz 20 1h to dzięki temu masz 60 :D
B_AddFightSkill (hero, NPC_TALENT_CROSSBOW, Npc_GetTalentSkill (hero, NPC_TALENT_CROSSBOW)+40);
};
func void SkillBack()
{
B_AddFightSkill (hero, NPC_TALENT_1H, Npc_GetTalentSkill (hero, NPC_TALENT_1H)-41);//Tutaj odejmujemy dodaną wcześniej wartość.
B_AddFightSkill (hero, NPC_TALENT_2H, Npc_GetTalentSkill(hero, NPC_TALENT_2H)-41);// Nie potrafię pojąć dlaczego ale musiałem dać 41
B_AddFightSkill (hero, NPC_TALENT_BOW, Npc_GetTalentSkill (hero, NPC_TALENT_BOW)-41);//Bo inaczej odejmowało 39 a nie 40 <>
B_AddFightSkill (hero, NPC_TALENT_CROSSBOW, Npc_GetTalentSkill (hero, NPC_TALENT_CROSSBOW)-41);
};
func void MyTimer()//Funkcja timera
{
time = time + 1;//stała czasu równa się stała czasu dodać 1 i tak co sekundę
print(IntToString(time));// to tylko taki print, do niczego nie potrzebny, do testów ale zostawiam go tak w razie "W"
if(stop == 0)//Pamiętasz na górze pisałem o tym stopie, widzisz jesli tego nie dasz to co sekundę doda ci 40 do każdego skilla
{
SkillUpp();//wywołujemy funkcję w której dodajemy po 40 do talentów walki
}
if(time == 1)//tutaj też zweiązane z tym stopem musimy zmienić jego wartość w pierwszej sekundzie aby się właśnie więcej nie wywołało
{
stop = 1;//chyba wiesz o co chodzi?
};
if(time == 60)// tu zaś znaczy że jeśli upłynie 60 sekund
{
print("wywołaj");//kolejny print też tylko testowy
SkillBack();//wywołujemy funkcję odejmowania tego co dodaliśmy naszym umiejętnością walki
time = 0;// zerujemy zmienną czasu aby wszystko można było zrobić jeszcze raz od nowa
stop = 0;//tak jak wyżej.
};
};
func void MyTimerApply()//funkcja dzięki której wywołamy cały ten timer.
{
FF_ApplyOnceExt (MyTimer, 1000, 60);//FF_AppluOnceExt(funkcja którą chcesz wywołać, co ile ma się wywołać w tym przypadku co jedną sekundę, no i ile razy ma się wywołać zawsze daj tyle ile dajesz w if time
};
INSTANCE mieszek (C_Item)//To jest item po użyciu którego wywołujemy naszą funkcję. To tylko przykład robisz jak chcesz!!!
{
name = "Zwiększ swoje atrybuty na minutę";
mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
visual = "ItMi_Pocket.3ds";
material = MAT_LEATHER;
scemeName = "MAPSEALED";
on_state[0] = ATT_UP_TIMER;
description = "1h/2h/łuk/kusza+40";
};
func void ATT_UP_TIMER()
{
MyTimerApply();// że po użyciu itemu wywołamy timer który zwiększy nam skille na 60 sekund
};
Oczywiście to tylko przykład a możecie robić co chcecie i jak chcecie tym sposobem.
PRZYKŁAD 2!!!
Czyli wywoływanie czegoś cały czas, np co godzinę -1 hp
const int time = 0;//stała czasu do wywołania lub do zaprzestania.
func void MyTimer()//Funkcja timera
{
time = time + 1;//stała czasu równa się stała czasu dodać 1 i tak co sekundę
print(IntToString(time));// to tylko taki print, do niczego nie potrzebny, do testów ale zostawiam go tak w razie "W"
if(time == 3600)// co godzinę czyli co 3600 sekund :D
{
print("wywołaj");//kolejny print też tylko testowy
hero.attribute[ATR_HITPOINTS] = hero.attribute[ATR_HITPOINTS]-1;// hp gracza równa się hp gracza minus 1
time = 0;// zerujemy zmienną czasu aby się zapętliło.
};
};
func void MyTimerApply()//funkcja którą musimy wywołać w startup.d w metodzie initGlobal w ten sposób: MyTimerApply();.
{
FF_ApplyOnceExt (MyTimer, 1000, -1);//ZAUWAŻ!!!! że teraz dałem -1 zamisat 60. A no bo -1 znaczy że funkcja jest wywoływana cały czas. dokładne info napisał Bogdan Zwei w poradniku Frame functions miast tick tocka
};
co do przykładu numer 2 nie mam pojęcia na ile to byłoby stabilne jeżeli chodzi o płynność gry. a i tak samo nie wiem jak zachowałoby się w stosunku do zapisu i wczytywania gry, jednak mimo to podaje patent, można sie bawić

Btw jeżeli któryś z bardziej zaawansowanych w świecie ikarusa/Lego zna prostszy i bardziej stabilny sposób na timer to fajnie by było gdyby się nim podzielił

Btw Gdzie to wkleić co nie? no normalnie najlepiej jak stworzycie nowy plik np timer.d
i parsujecie w gothic.src nie będę tłumaczył jak to zrobić jak nie umiesz tego to daj se wgl spokój xd
UWAGA!!!!! sposób nr1 najlepiej parsować tuż przed startup.d a sposób nr2 możecie parsować na samej górze zaraz po lego i ikarusie