Okay, in dem Fall gehen wir mal das Skript durch.
Code:
OUTER_SPRINT find_X_position ~968~
OUTER_SPRINT find_Y_position ~302~
OUTER_SPRINT all_values_found ~0~
Diesen Variablen werden numerische Werte zugewiesen. Daher wäre es besser, OUTER_SET zu verwenden. SPRINT funktioniert theoretisch auch, aber erzwingt intern eine String-to-Int Konvertierung, die nur unnötig Rechenleistung und Zeit benötigt.
Das eigentliche Problem sehe ich aber im weiteren Skriptcode. So, wie er definiert wurde, geht er jedes einzelne Byte aller Actor-Strukturen der Area durch und prüft auf bestimmte Werte. Das funktioniert so nicht, da dadurch irgendwelche Zufallswerte eingelesen werden, die auch mal zufälligerweise mit den Vergleichswerten identisch sein können. Und erst nachdem innere und äußere Schleifen vollständig durchlaufen wurden, schreibt WRITE_ASCII einen String an die Position, die durch "ofs" und "j" definiert wurden. Zu dem Zeitpunkt beinhaltet zumindest "j" einen ungültigen Wert und schreibt den Wert daher an eine zufällige Position.
Actor-Strukturen haben eine
definierte Struktur. Wenn nur auf CRE resref und X/Y-Koordinaten geprüft werden soll, dann reicht dieser Code aus:
Code:
OUTER_SPRINT find_resref ~MAEVAR~
OUTER_SPRINT new_resref ~orc01~
OUTER_SET find_X_position = 968
OUTER_SET find_Y_position = 302
OUTER_SET all_values_found = 0
COPY_EXISTING ~AR0301.ARE~ ~override~
READ_LONG 0x54 ofs_actors
READ_SHORT 0x58 num_actors
PATCH_PRINT ~Num Actors: %num_actors%~
FOR (i = 0; i < num_actors && all_values_found = 0; ++i) BEGIN
SET ofs = ofs_actors + i * 272
// Read actor name
READ_ASCII (ofs + 0x0000) actor_name (32) NULL
// Output actor name and index
PATCH_PRINT ~Actor Name: %actor_name%, Index: %i%~
// Read actor cre resref and x/y coordinates
READ_ASCII (ofs + 0x80) cre_resref (8)
READ_SHORT (ofs + 0x20) pos_x
READ_SHORT (ofs + 0x22) pos_y
PATCH_IF (~%cre_resref%~ STR_EQ ~%find_resref%~ &&
pos_x = find_X_position &&
pos_y = find_Y_position) BEGIN
PATCH_PRINT ~Treffer!~
// Update cre resref
WRITE_ASCIIE (ofs + 0x80) ~%new_resref%~ (8)
SET all_values_found = 1
END
END
BUT_ONLY
Edit: "all_values_found"-Vergleich korrigiert ("!=" -> "=").