Nazwa funkcji zawierająca inf. dot. pasków 2804 3

O temacie

Autor diegomez

Zaczęty 27.06.2013 roku

Wyświetleń 2804

Odpowiedzi 3

diegomez

diegomez

Labirynt
posty452
Propsy63
  • Labirynt
Witam.
Wie ktoś z Was - jak nazywa się funkcja (chodzi mi o funkcje, które są w gothic2.exe (przy jego deasemblerowaniu)), która zawiera informacje dotyczące gothicowych pasków. Głównie zależy mi na numerach dot. paska tlenu.

Dla przykładu: To fragment z numerami dla paska many (nie pamiętam czy ze skryptu Lehony, czy Sawika).

     MemoryProtectionOverride(7091180, 4);
      MEM_WriteInt( 7091180, 227218667);
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nazwa funkcji zawierająca inf. dot. pasków
#1 2013-06-27, 15:00(Ostatnia zmiana: 2013-06-27, 15:35)
Cytuj
funkcja, która zawiera informacje
Nie ma czegoś takiego. Funkcja to coś co wykonuje czynność i/lub zwraca jakiś obiekt.
Nie jestem pewien o co ci chodzi. Jeśli chcesz znać adres obiektów oCViewStatusBar wyświetlanych jako paski życia, many, tlenu i życia wroga, to ich adresy są zapisane w obiekcie oGame, który jest singletonem i którego adres jest trzymany w znanym miejscu (i w Ikarusie przypisywany do skryptowej instancji MEM_Game za pomocą funkcji MEM_InitGlobalInst). Znając adresy, możesz przypisać je także przypisać do skryptowych instancji.

instance hpBar (oCViewStatusBar);
instance swimBar (oCViewStatusBar);
instance manaBar (oCViewStatusBar);
instance focusBar (oCViewStatusBar);

func void initBars ()
{
    MEM_InitGlobalInst();
    hpBar    = _^(MEM_Game.hpBar);
    swimBar  = _^(MEM_Game.swimBar);
    manaBar  = _^(MEM_Game.manaBar);
    focusBar = _^(MEM_Game.focusBar);
}

BTW, sporo się zmieniło w Ikarusie od czasów jego powstania :D  Ta składnia jest dość zaskakująca, ale powinna działać, bo taka sama jest użyta w samym Ikarusie. Kiedyś zamiast tego używało się bodajże MEM_AssignPtrToInst. Ewentualnie jeśli robię to źle może Lehona mnie poprawi :D

Byłbym zdziwiony gdyby to co pokazałeś jako przykład robiło cokolwiek pożytecznego. Rozumiesz to w ogóle? MEM_WriteInt używa się przy operacjach bardzo niskiego poziomu i trzeba bardzo dobrze wiedzieć co się robi. I używanie tam hardcodowanego adresu na dodatek stanowiącego "magic number" to fatalny pomysł.

diegomez

diegomez

Labirynt
posty452
Propsy63
  • Labirynt
Dobra jeszcze raz :D

func void manabar_always_visible()
{
       MemoryProtectionOverride(7091180, 4);
       MEM_WriteInt( 7091180, 227218667);
};

func void STARTUP_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor STARTUP_<LevelName>)
Game_InitGerman();
manabar_always_visible();
};


Dodany widoczny pasek pasek do startup.d.

źródło

Chodzi mi o to, jak można znaleźć adresy (tak?) do pasków tlenu?
I teraz po twoim poście pomyślałem sobie czy można jakoś zastąpić te adresy (numerki) czymś typu "MEM_Game.swimBar"/"swimBar" ? Zadziałało by coś takiego? (Tylko tam są 3 różne numerki i nie wiem od czego)


Cytuj
ich adresy są zapisane w obiekcie oGame

oGame gdzie to znaleźć? Czy chodzi Ci o OCGame (bo tego to pełno)


Edit:
Adres paska powietrza masz pod MEM_GAME.swimBar po uprzednim wywołaniu MEM_InitGlobalInst().

Mógłbyś to dokładniej wytłumaczyć... jak to działa?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nazwa funkcji zawierająca inf. dot. pasków
#3 2013-06-27, 16:21(Ostatnia zmiana: 2013-06-27, 16:29)
Po kolei.

To co zacytowałeś od Sawika, to nie jest "funkcja która zwiera informacje o pasku". Jest tam po prostu modyfikowana zmienna w silniku odpowiedzialna za to, czy pasek many ma być ukrywany. Ten kod nie jest najlepiej napisany, powinno się podpisywać co dokładnie jest pod adresem którego się używa (https://en.wikipedia.org/wiki/Magic_number_(programming)).

Adres paska tlenu jest zapisany w oGame.swimBar. Z punktu widzenia skryptów to liczba (int). Numer komórki w pamięci gdzie zaczyna się ten obiekt. Nie da się go wpisać z góry w skryptach jako numerka, bo tak jak większość adresów, za każdym włączeniem gry będzie inny. Tylko niektóre można ręcznie wpisać. Inne, tak jak ten, trzeba pobierać z już znanych obiektów.

oGame to unikatowy obiekt w silniku zawierający odniesienia do pozostałych ważnych, także unikatowych. Przez "unikatowy" mam na myśli że jest tylko jeden na raz takiej klasy. Jego klasa nazywa się oCGame. W Ikarusie ten obiekt jest przypisywany do instancji nazywanej MEM_Game. Nazwy obiektów nie mają znaczenia. Ja nazywam go oGame, bo wydawało mi się że gdzieś widziałem to w kodzie silnika. Być może nie jest to najlepsza nazwa. Możesz go nazywać np MEM_Game, tak jak jest to w Ikarusie.

Co do wyjaśnienia jak to działa. Mamy obiekty w silniku i obiekty w skryptach. Ikarus pozwala przypisać do obiektu w skryptach obiekt z silnika, którego adres znamy. Jednak z góry znamy tylko niektóre adresy. Nie znamy adresu oGame, ale znamy adres miejsca w pamięci gdzie ten adres jest - w Ikarusie ten adres jest w zmiennej "MEMINT_oGame_Pointer_Address" i w g2nk jest równy 11208836. Więc za pomocą funkcji MEM_ReadInt czytamy co jest w tym miejscu. Liczba którą przeczytaliśmy to z kolei adres oGame którego potrzebowaliśmy. Więc teraz używamy go z funkcją przypisującą obiekt z silnika do identyfikatora w skryptach - ta funkcja w nowym Ikarusie nazywa się "_^". Wygląda to po rozpisaniu tak:
const int adres_gdzie_jest_zapisany_adres_ogame = 11208836; //stała w Ikarus_Const_GX.d
var int adres_ogame; adres_ogame = MEM_ReadInt (adres_gdzie_jest_zapisany_adres_ogame);
MEM_Game = _^(adres_ogame); //przypisujemy obiekt z silnika do pustego obiektu w skryptach
Nie musimy tego jednak robić sami, bo zajmuje się tym funkcja MEM_InitGlobalInst(). Wystarczy ją wywołać.
Mamy już ten obiekt, do którego ze skryptów mamy dostęp przez "MEM_Game". Ten obiekt ma różne pola, głównie adresy innych charakterystycznych obiektów w silniku. Wśród nich są te paski. Adres paska tlenu jest w MEM_GAME.swimBar. Jak każdy adres, to jakaś liczba. Nie jest ważne dla nas jaka w tym akurat momencie. Ważne jest to że za pomocą tej Ikarusowej funkcji "_^" możemy przypisać to co jest pod tym adresem do skryptowego obiektu. Więc tworzymy w skryptach pusty obiekt klasy oCViewStatusBar:
instance swimBar (oCViewStatusBar);I dokonujemy przypisania tego co jest pod naszym adresem do tego obiektu:
var int adresSwimBara;
adresSwimBara= MEM_Game.swimBar;
swimBar  = _^(adresSwimBara);
Teraz to rozpisałem żebyś zobaczył że ten adres to po prostu liczba którą skądś bierzemy, ale można to zrobić w jednej linijce jak pokazałem powyżej.


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