Ikarus (Pakiet skryptów) 411729 1020

O temacie

Autor orcwarrior

Zaczęty 11.06.2010 roku

Wyświetleń 411729

Odpowiedzi 1020

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
var zCPar_Symbol symb; symb = _^ (MEM_GetParserSymbol ("itar_pal_h"));
var c_item itm; itm = _^ (symb.offset);
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
That's exactly what MEM_FindParserSymbol(string) does. I'm not 100% sure whether you need to use all uppercase, though, maybe the engine does that on its own. You should probably do it anyway, just to be sure.

Edit: What splash wrote does something different than MEM_FindParserSymbol, but is a valid interpretation of your post... You should probably clarify. Splash's script assigns itm to the item that is currently pointed to by the instance, MEM_FindParserSymbol just returns the instance ID.
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Jeżeli ktoś chce sprawdzać czas z gry to polecam tą funkcję:
func int Wld_GetHour()
{
var int h;
h = divf(MEM_WorldTimer.worldTime,mkf(4167));
h = divf(h,mkf(60));
return truncf(h);
};

func int Wld_GetMin()
{
var int m;
m = divf(MEM_WorldTimer.worldTime,mkf(4167));
m = truncf(m);
m = m%60;

return m;
};
Jest to moja autorska funkcja :D, czas sprawdza najdokładniej - co do minuty. Rzecz jasna wymagany Ikarus.
Czy ktoś wie czy jest możliwe stworzenie mgły tuż przed oczami bohatera? Próbuje stworzyć efekt mgły, ale żaden wskaźnik nie spełnia moich oczekiwań i przez to nie wiem jak zmniejszyć zasięg rysowania... Taki kod:
func void aCFog_SetSkyState()
{
var int i; i = 0;
var int ptr;  var zCSkyState sky;
repeat(i,8);

ptr = MEM_ReadInt (MEM_SkyController.stateList_array + i * 4);
if(ptr)
{
sky = _^(ptr);
PrintS(Float32ToString(sky.fogDist));
sky.fogDist = mkf(1);
};
end;
Print("Done");
};
Działa fajnie, ale tylko wtedy gdy wejdę do jakiejś mgły :/ A ja chciałbym zmieniać ten dystans dynamicznie w zależności od sytuacji. (Nie śni mi się tworzenie w każdym świecie ogromnej mgły, więc sądzę, że da się to wymanewrować z poziomu skryptów :D
 

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

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Jeżeli ktoś chce sprawdzać czas z gry to polecam tą funkcję:
func int Wld_GetHour()
{
var int h;
h = divf(MEM_WorldTimer.worldTime,mkf(4167));
h = divf(h,mkf(60));
return truncf(h);
};

func int Wld_GetMin()
{
var int m;
m = divf(MEM_WorldTimer.worldTime,mkf(4167));
m = truncf(m);
m = m%60;

return m;
};
Jest to moja autorska funkcja :D, czas sprawdza najdokładniej - co do minuty. Rzecz jasna wymagany Ikarus.

Twoja funkcja będzie pokazywała niepoprawne godziny lub minuty w niektórych przypadkach, ponieważ używasz przybliżenia.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Cytuj
Twoja funkcja będzie pokazywała niepoprawne godziny lub minuty w niektórych przypadkach, ponieważ używasz przybliżenia.
Testowałem solidnie i przez cały czas pokazywała właściwą godzinę.
 

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

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Ale minuty się nie będą zgadzały. Sprawdzałeś z Toggle Time?

Ja kiedyś się bawiłem z czasem w Gothicu i wiem, że jeśli użyje się przybliżenia to czasami dziwne rzeczy wychodzą. Toggle time czasami pokazywał godzinę 19:34, a przybliżony skrypt (podobny to twojego, praktycznie ten sam) pokazywał 19:29. Jakbyś używał jeszcze odczytywania sekund to też byś to zauważył.
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Miałem 5 minut różnicy gdy używałem skryptu orka. Poza tym wiem, że jest dobry bo "zajumałem go" ze skryptów Returninga -> AST.
 

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

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Czy da się jakoś sprawdzić czy funkcja została sparsowana? Potrzebowałbym wywołać funkcję albo bo parsowaniu funkcji Init_Global, lub po uruchomieniu się Menu startu. Hook czy coś w tym stylu.
 

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

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Nie bardzo rozumiem, co chcesz osiągnąć. Parsowanie następuje przed kompilacją i utworzeniem gothic.dat. Jeśli chcesz wiedzieć, czy funkcja została wywołana, to możesz użyć funkcji PrintDebug i zobaczyć co w zSpy będzie zapisane.

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Chcę uruchomić świat dopiero po sparsowaniu wszystkich plików z moda. Dopiero po uruchomieniu świata ma wyświetlić się Menu, jednak nie wiem jak sprawdzić czy była parsowana funkcja INIT_Global.
 

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

Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
You can search the symbol table. If INIT_Global was parsed, there will be a symbol with the name INIT_GLOBAL.

Although I don't quite understand what you want to do.
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Zakładam że nie miałeś tu na myśli parsowania funkcji, ale raczej jej wywołanie (Daedalus jest wstępnie kompilowany do kodu bajtowego - wszystkie funkcje są parsowane przy rozpoczynaniu gry, jeszcze zanim świat zacznie się ładować).

Zrób zmienną globalmą "const int INIT_GLOBAL_INVOKED = false", na końcu Init_Global wstaw "INIT_GLOBAL_INVOKED = true".
Warunek sprawdzający "if (INIT_GLOBAL_INVOKED == true) " da ci dokładnie o co prosisz.

Szmyk

Szmyk

Użytkownicy
posty64
Propsy58
Profesjabrak
  • Użytkownicy
Ogólnie ostatnimi skryptami, które się parsują są pliki kamery (CAMERA.DAT). Dopiero po tym pokazuje się świat i hero. Może Ci chodzi o zrobienie niezależnego menu, takiego że uruchamiasz grę z parametrem "nomenu" i sobie dopiero w grze wszystko ustawiasz?
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
Chciałbym odpalić zen jako menu. Problem w tym, że nie wiem jaka funkcja jest odpowiedzialna za wczytanie świata. oCGame::LoadWorld(zSTRING, enum zTWorldLoadMode);
enum zTWorldLoadMode
{
zWORLD_LOAD_STATIC, //0
zWORLD_LOAD_DYNAMIC, //1
zWLD_LOAD_GAME_SAVED_STAT, //2
zWORLD_LOAD_3, //3
zWORLD_LOAD_4, //4
zWORLD_LOAD_MERGE_SUBTREE //5
};
Bardziej by mi pomogło uzyskanie takiego samego efektu jak po Nowa Gra->Odpala się świat, lub po prostu odpalenie świata na zawołanie. Jednak, nie wiem który adres w grze odpowiada za wczytywanie świata.
 

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

Szmyk

Szmyk

Użytkownicy
posty64
Propsy58
Profesjabrak
  • Użytkownicy
W skryptach Czasu Zapłaty, chyba w AI_Dream.d, było wykorzystane tylko wywoływanie funkcji z silnika, żadnej zabawy z triggerami change world.
 

Siemekk

Siemekk

Złote Wrota
posty2143
Propsy1154
ProfesjaProgramista
  • Złote Wrota
ChangeWorld != LoadWorld Widać to przy parsowaniu gry (w 10% progress baru jest napisane "LoadWorld oCGame.cpp")
 

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

Revoke

Revoke

Użytkownicy
posty62
Propsy8
Profesjabrak
  • Użytkownicy
Siedzę od kilku godzin nad funkcją, która ma uniemożliwić otwieranie skrzyń (lub drzwi) bez posiadanej umiejętności (tak, modduje G1).
func void LockChestOrDoor()
{
var oCNpc her;
her = Hlp_GetNpc (hero);

var oCMobLockable lock; lock = MEM_PtrToInst(her.interactMob);

if (lock.bitfield & oCMobLockable_bitfield_locked)
{
if (Npc_GetTalentSkill (hero,NPC_TALENT_PICKLOCK) == FALSE)
{
G_PrintScreen(_STR_MESSAGE_PICKLOCK_NOSKILL);
AI_PlayAni (hero,"T_DONTKNOW");
B_Say  (hero, NULL , "$NOPICKLOCKTALENT");
lock._oCMobInter_conditionFunc = "TRUE";
};
};
};
Wygląda to tak, że hero podchodzi do skrzyni, próbuje ją otworzyć po czym wstaje, w kółko powtarza frazę "NOPICKLOCKTALENT" i wzrusza ramionami. Domyślam się, że problem tkwi w zmiennej interactMob, jednak w zbiorze oCNpc nie udało mi się znaleźć takiej, która by pasowała tutaj lepiej. Druga opcja to FrameFunctions przez które wywołuję ją w startupie, ale tu chyba wszystko jest tak jak powinno
FF_ApplyOnce(LockChestOrDoor);

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Wydaje mi się, że w G1 bez umiejętności otwierania zamków nic nie otworzysz...
Skoro wywołujesz funkcję co klatkę i NPC powtarza w kółko frazę, to warunki się nie zmieniły i się pętli twoja funkcja. Musiałbyś jakoś odznaczyć voba, że już "nie jesteś w interakcji z nim".

Revoke

Revoke

Użytkownicy
posty62
Propsy8
Profesjabrak
  • Użytkownicy
W G1 jak najbardziej da się otwierać wszystko bez umiejętności, wystarczy wytrych lub klucz.
Właśnie mój problem polega na tym, że przy próbie wejścia w interakcję funkcja zaczyna się zapętlać i nie mogę nawet odznaczyć skrzyni.
Czy FF_ApplyOnce nie powoduje, że funkcja aktywuje się tylko jeden raz? Jeśli tak, to dlaczego moją się zapętla?

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Czy FF_ApplyOnce nie powoduje, że funkcja aktywuje się tylko jeden raz? Jeśli tak, to dlaczego moją się zapętla?
Tak, powoduje, że aktywuje się raz, ale funkcja wywołuje się co klatkę.


0 użytkowników i 2 gości przegląda ten wątek.
0 użytkowników
Do góry