|
-
Hast halt dann asm(JUMP, 1) oder so, habe aus'm Kopf wenig Ahnung von Opcode. Aber genau für sowas gibt es doch Konstanten? Du kannst dir die Funktionen sonst ja auch eben selber zusammenbasteln.
-
Holywater hat recht. Die ASM Funktionen in Ikarus klingen zwar nach Assembler, können aber fast nichts.
Zitat von Ikarus Doku
Bemerkung: Die Funktionen tragen das Präfix "ASM_" für Assembler(sprache). Assemblersprache ist eine menschenlesbare Sprache mit eins-zu-eins Entsprechungen zur Maschinensprache. Strenggenommen ist das "ASM_" Präfix daher fehlleitend, da es hier um Maschinencode und nicht um Assemblersprache geht.
Kein Mensch kann mit dem, was Ikarus bietet sinnvoll Maschinencode produzieren. Und niemand kann mal schnell die ganzen Opcodes und Adressierungsarten von Hand nachimplementieren.
Für die Call Skripte musste ich aber nur eine Hand voll raussuchen, das ging ganz gut. Und für andere kleine Sachen sollte das ebenso unproblematisch sein.
Was die ASM Funktionen einem abnehmen, ist die Speicherverwaltung für das Codestück und der eigentliche Aufruf (da muss man sich ein Externalsymbol zurechtbiegen).
Zitat von Holywater
so eine art runtime assembler wäre echt cool
Was hast du vor?
Was mir noch an Lowlevel-Zeug einfällt, was in Ikarus rein sollte sind Hooks. Es sollte möglich sein, Aufrufe an bestimmte Enginefunktionen abzufangen, und vor der Engine zu reagieren. Damit könnte man zum Beispiel noch schnell Dinge tun, bevor der Archiver anfängt sich ein Savegame zusammenzusammeln (so kann man zusätzliche Daten ins Savegame schmuggeln die man später wieder entpacken will).
Die Hoffnung, dass mich oder jemand anderen in diese Richtung nochmal die Muße packt, war auch einer der Gründe, weshalb ich die ASM Funktionalität aus den CALL Skripten herausfaktorisiert habe.
-
Da wir uns auf dem Moddertreffen damit auseinandergesetzt haben (Großes Danke an Nico hier, dank *ein wenig Hilfe* von ihm war das erst möglich), war es ja abzusehen: Ich habe schnell ein Script zusammengeschmiert, was die Manabar dauerhaft anzuzeigen vermag.
Nach jedem Neustart von Gothic muss die Funktion erneut aufgerufen werden, daher sollte man sie wohl in die Init_Global() eintragen.
Die Konstanten sind übrigens nicht als Parameter für euch gedacht
Code:
const int MANABAR_SHOW = /*0x0D8B14EB*/ 227218667;
const int MANABAR_HIDE = /*0x0000BCE9*/ 48361;
const int MANABAR_DEFAULT = /*0x0D8B1475*/ 227218549;
// 1 = Show
// 0 = Default
// -1 = Hide
func void ShowManabar(var int cond) {
var int tmp;
MemoryProtectionOverride(/*0x006C33EC*/7091180, 4);
if (cond == 1) {
tmp = MANABAR_SHOW;
} else if (cond == 0) {
tmp = MANABAR_DEFAULT;
} else if (cond == -1) {
tmp = /*000000BC*/ 188;
MEM_WriteInt(/*0x006C33EC*/ 7091181, tmp);
tmp = MANABAR_HIDE;
};
MEM_WriteInt(/*0x006C33EC*/ 7091180, tmp);
};
Credits gehen zusätzlich zu mir an Nico, Sektenspinner und Gottfried, gerade letzter hat sich vorhin dreisterweise meinen Code geschnappt und getestet.
Edit: Da Gottfried mich auf eine weitere Idee gebracht hat, gleich noch ein Script hinterher:
Code:
// 1 = ShowInFight
// 0 = Normal
// -1 = ShowOutFight
func void ShowManabarInFight(var int cond) {
var int tmp;
MemoryProtectionOverride( /*0x006C33F9*/ 7091193, 8);
if (cond == 1) {
tmp = /*0x0F00F883*/ 251721859;
MEM_WriteInt(7091193, tmp);
tmp = /*0x00AB840F*/ 11240463;
MEM_WriteInt(7091196, tmp);
} else if (cond == 0) {
tmp = /*0F07F883*/ 252180611;
MEM_WriteInt(7091193, tmp);
tmp = /*0x00AB850F*/ 11240719;
MEM_WriteInt(7091196, tmp);
} else if (cond == -1) {
tmp = /*0x0F00F883*/ 251721859;
MEM_WriteInt(7091193, tmp);
tmp = /*0x00AB850F*/ 11240719;
MEM_WriteInt(7091196, tmp);
};
};
Mit diesem Script kann man a) die Manabar nur in Kämpfen oder b) die Manabar nur ausserhalb von Kämpfen anzeigen lassen (Und das ganze Rückgängig machen). Es beeinflusst das erste Script nicht (Das erste hat aber vorrang).
Edit2: Habe jetzt im ersten Script mal die Konstanten geändert, der zweite Name war nicht unbedingt eindeutig.
Geändert von Lehona (08.03.2011 um 16:57 Uhr)
-
Benutzer, die ihr Benutzerkonto per E-Mail bestätigen müssen
Und wie kann man das Verhalten der Manabar wieder aufs standard-Verhalten setzen?
Optimal wäre eine Funktion SetManabarState, die als parameter die Kontanten für show, hide u. default erwartet um jeden möglichen state gerecht zu werden.
-
Zitat von Player140
Und wie kann man das Verhalten der Manabar wieder aufs standard-Verhalten setzen?
Die zweite Funktion tut doch genau das was du willst, oder? Die erste schaltet übrigens auch zwischen Show & Default hin und her. Die Manabar wird also nie vollständig deaktiviert..
MfG Gottfried
-
Stimmt natürlich, Fehler in meiner Beschreibung. Bein ShowManabar(False) verhält sie sich wieder normal. Falls jemand sie unbedingt ganz ausschalten möchte soll er das sagen, dann bastel ich das auch noch, ist nicht (mehr) so kompliziert.
-
Zitat von Lehona
Falls jemand sie [die Manabar] unbedingt ganz ausschalten möchte soll er das sagen [...]
Ich würde die Manabar gerne ganz ausschalten. Wäre also sehr nett von dir, wenn du das dann auch noch zusammenbasteln würdest.
-
-
Zitat von Lehona
Ich habe meinen Post oben geupdatet
Vielen Dank. Ich habe die Ikarusscripts in meine Mod integriert und die von dir oben genannte Funktion eingetragen. Allerdings erhalte ich beim Parsen die Fehlermeldung Unkown identifier MemoryProtectionOverride. Das Script mit der Funktion wird nach den Ikarusscripts geparst. Muss ich dabei irgendwas besonderes beachten?
-
Hast du die neuste Version von Ikarus? *kratz*
(Oder hat Sekti den Funktionsnamen geändert? Bezweifle ich, wäre ein harter Verstoß gegen Rückwärtskompatibilität.)
-
Zitat von Lehona
Hast du die neuste Version von Ikarus?
Ich hatte die neuste Version zwar auf meinem PC, doch blöderweise eine ältere Version, die irgendwo auf meinem PC noch umhergeisterte, eingebaut. Der Fehler ist nun jedoch behoben.
Dafür stürzt das Spiel sauber nach dem Laden der ersten Welt ab. In der Funktion init_global habe ich folgenden Code eingefügt:
-
Zitat von LordEdhor
Ich hatte die neuste Version zwar auf meinem PC, doch blöderweise eine ältere Version, die irgendwo auf meinem PC noch umhergeisterte, eingebaut. Der Fehler ist nun jedoch behoben.
Dafür stürzt das Spiel sauber nach dem Laden der ersten Welt ab. In der Funktion init_global habe ich folgenden Code eingefügt:
Mein Fehler, der Befehl in IDA ist 5 Byte groß, das habe ich irgendwie übersehen *hust*
Ich stell gleich 'ne neue Version hoch.
Edit: Schon da. Wenn's nun nicht geht bin ich mit meinem Latein erstmal am Ende und werde da wohl ein wenig mehr rumprobieren müssen.
-
Zitat von Lehona
Edit: Schon da. Wenn's nun nicht geht bin ich mit meinem Latein erstmal am Ende und werde da wohl ein wenig mehr rumprobieren müssen.
Funktioniert jetzt wunderbar!
-
jemand ne idee wie ich shader rein basteln kann?
ich selbst hab es bis jetzt noch nich hinbekommen die kacke auf dx9 zu bringen (meine kack alte X1600 unterstützt ja leider kein dx10 oder 11)
eine recht talentierte person hier im forum hats (soweit ich das beurteilen kann) auf dx10 geschafft -> läuft leider bei mir nicht!
im schlimmsten fall dachte ich dran (wenigsten für postprocessing) im hintergrund noch nen device zu erstellen, würde aber extrem kacke sein.
ideen wären cool
♥ HolyWater ♥ YAY xD
-
Ich beziehe mich mal auf den Tipp zu eigenen Einstellungen in der .ini:
http://forum.worldofplayers.de/forum...&#post13765649
Bei mir werden zwar Werte in die .ini geschrieben, das Auslesen funktioniert aber nicht.
Section und Option habe ich als String-Konstante auch in den Content-Skripten:
Code:
const string szOption_Section = "STEINZEIT";
const string szOption_Difficulty = "zsDifficulty";
identisch zu den Angaben in den Menü-Skripten:
Code:
onChgSetOption = "szDifficulty";
onChgSetOptionSection = "STEINZEIT";
Jetzt versuche ich die auch auszulesen:
Code:
IF (Hlp_StrCmp (MEM_GetGothOpt (szOption_Section, szOption_Difficulty), "0"))
{
Print ("Klappt!");
} else {
Print ("Klappt nicht!");
};
Allerdings kommt da immer "Klappt nicht!" raus (auch wenn in der .ini als Wert 0 steht. Also mal schnell das "Klappt nicht!" ersetzt durch
Code:
MEM_GetGothOpt (szOption_Section, szOption_Difficulty)
um mir anzusehen, was der String denn nun ist. Ergebnis: nichts wird angezeigt.
Was mache ich falsch?
-
Du hast einmal zsDifficulty und einmal szDifficulty
-
-
Zitat von Milky-Way
Stimmt, jetzt klappt es, danke. Eine halbe Stunde unnötig herumprobiert, weil ich nicht aufmerksam genug verglichen (und einen Fehler dort schon ausgeschlossen ) hatte.
In dem Fall halt auch fies, weil es keinen Parser-Fehler gibt, da kann man sich schon dumm und dämlich suchen
-
Hab grad überlegt, wie ich das mit dem Speichern in Elemental War verbessert hab. Jetzt ist mir folgende Idee gekommen:
1. Bei Pausetaste Spiel anhalten wie Sekti mit seinem Zauber bei der eXodus-Präsi auf dem Moddertreff
2. Ggf. Positionen der Monster speichern im Aivar
3. KI-Glocke hochsetzen
4. Teleportieren
Wenn man zurückgeht eben Spiel weiterlaufen lassen, Positionen wiederherstellen und KI-Glocke wieder verkleinern.
Könnte das klappen, dass die Monster dann alle an ihrer Position bleiben, auch nach dem Laden? Problem könnte sein, dass ich dann doch wieder alles voller WPs für die Monster machen muss, weil die sonst vllt. den Weg nicht mehr finden wie es anfangs war, als nur an den Ecken welche waren und bei Treffern sind die vom Weg abgekommen.
-
Zitat von Bonne6
Hab grad überlegt, wie ich das mit dem Speichern in Elemental War verbessert hab. Jetzt ist mir folgende Idee gekommen:
1. Bei Pausetaste Spiel anhalten wie Sekti mit seinem Zauber bei der eXodus-Präsi auf dem Moddertreff
Das war etwas komplizierter, weil ich ja wollte, dass der Spieler noch ganz normal laufen kann. Etwas einfacher ist folgendes:
Code:
func void pause(var int showPauseText) {
const int oCGame__pause = 7113424; //0x06C8AD0
CALL_IntParam(!showPauseText);
CALL__thiscall(MEM_InstToPtr(MEM_Game), oCGame__pause);
};
func void unpause() {
const int oCGame__unpause = 7114064; //0x6C8D50
CALL__thiscall(MEM_InstToPtr(MEM_Game), oCGame__unpause);
};
Das macht letztendlich das, was beim drücken von F9 passiert. Reicht dir das?
Zitat von Bonne6
Könnte das klappen
Ich verstehe nicht ganz, was Pausieren des Spiels mit Speichern und Teleportieren zu tun hat. Und wenn sich alles in der Standard-KI Glocke abspielt ist normales Speichern ja ohnehin kein Problem.
Welches Problem gilt es genau zu lösen?
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|