Hinzufügen eines Actors zu einer Are.
Da Ascalon schon so schön vorgelegt hat, will ich Euch mal das Area Patching ein bischen näher bringen und fange mit den Actors an...
Okay, jetzt werdet Ihr Euch fragen, wieso sollte man eine Creature einer Area hinzufügen, wenn man das ganze über ein Script machen kann…
Die Antwort dazu ist eigentlich, dass es über die Area viel einfacher ist, die Creature zu bestimmten Zeiten auftauchen zu lassen…
Aussderdem kann man Ihr für die Area selbst Scripte zuweisen.
Der Nachteil ist aber, dass man die Area im Savegame noch nicht besucht haben darf, da sonst der Actor nicht auftaucht…
Der Code, den ich hier schildere ist für das tp2 Coding gedacht!
Ok, dann fang ich mal mit ein paar Erklärungen an, die für die Anleitung wichtig sein könnten:
Was ist ein Offset?
Ein Offset ist eine Adresse, die zu bestimmten Werten in einer Datei zeigen, die mit Weidu ausgelesen und geschrieben werden können.
Was ist eine Variable?
Eine Variable ist ein Zeichensatz, der eine Zahl oder einen String (also einen anderen Zeichensatz) enthalten kann.
Was ist eine Schleife?
Eine Schleife wiederholt einen Code Block solange bis die Bedingung erfüllt ist…
Im folgenden Code werden FOR und IF Schleifen benutzt….
Fangen wir mit der FOR Schleife in Weidu an:
Code:
FOR (var=0; var< var2; var=var+1) BEGIN
… (hier steht, was ausgeführt warden soll…)
END
var=0 ist der Startpunkt, also 0
var< var2 ist die Bedingung, die Schleife läuft durch, solange var kleiner als var2 ist
var=var+1 solange die vorherige Bedingung nicht erfüllt ist, wird var bei jedem Schritt um 1 erhöht
So jetzt noch die IF Schleife:
In der tp2 kann ACTION_IF und PATCH_IF benutzt werden, da in diesem Beispiel nur PATCH_IF genutzt wird, werde ich dieses erklären:
Code:
PATCH_IF (Variable = Bedingung) THEN BEGIN
… (hier steht, was ausgeführt werden soll, wenn die Bedingung wahr ist…)
END
ELSE BEGIN
… (hier steht, was ausgeführt werden soll, wenn die Bedingung nicht wahr ist…)
END
Was ist ein Bit, was ist ein Nibble, was ist ein Byte?
Ein Bit ist eine 0 oder eine 1.
Ein Nibble sind 4 Bit. (Mit einem Nibble können 16 Zahlen dargestellt werden)
Ein Byte sind 8 Bit. (Mit einem Byte können 256 Zahlen dargestellt werden)
Was bedeuten die ganze READ_* und WRITE_* im Code?
Mit READ_* kann man den Wert eines Offsets einlesen.
Mit WRITE_* können Werte in ein Offset geschrieben werden.
Folgende Argumente gibt es für *:
BYTE: Hiermit wird ein Byte eingelesen/geschrieben, also acht bit
SHORT: Hiermit werden zwei Byte eingelesen/geschrieben, also 16 Bit
LONG: Hiermit werden vier Byte eingelesen/geschrieben, also 32 Bit
ASCII: Hiermit wird ein Zeichensatz eingelesen/geschrieben
STRREF: Hiermit wird ein Stringref. Aus der Dialog(f).tlk gelesen/geschrieben
Was ist Hexadezimal?
Hexadezimal ist ein Zahlensystem, genau wie unser Dezimalsystem, nur dass es 16 Zeichen darstellen kann, im Gegensatz zu 10:
0=0
1=1
2=2
3=3
4=4
5=5
6=6
7=7
8=8
9=9
10=a
11=b
12=c
13=d
14=e
15=f
Code:
COPY_EXISTING ~ARXXXX.are~ ~override~
Mit dieser Zeile wird die bereits existierende Area in den Override Ordner kopiert, sodass diese gepatcht werden kann.
Code:
READ_LONG 0x54 "actors_offset"
READ_SHORT 0x58 "actors_num"
READ_SHORT 0x5a "infotrig_num"
READ_LONG 0x5c "infotrig_offset"
READ_LONG 0x60 "spawns_offset"
READ_LONG 0x64 "spawns_num"
READ_LONG 0x68 "entrances_offset"
READ_LONG 0x6c "entrances_num"
READ_LONG 0x70 "cont_offset"
READ_SHORT 0x74 "cont_num"
READ_SHORT 0x76 "items_num"
READ_LONG 0x78 "items_offset"
READ_LONG 0x7c "vert_offset"
READ_SHORT 0x80 "vert_num"
READ_SHORT 0x82 "amb_num"
READ_LONG 0x84 "amb_offset"
READ_LONG 0x88 "vars_offset"
READ_LONG 0x8c "vars_num"
READ_LONG 0xa0 "expbmp_offset"
READ_LONG 0xa4 "doors_num"
READ_LONG 0xa8 "doors_offset"
READ_LONG 0xac "anim_num"
READ_LONG 0xb0 "anim_offset"
READ_LONG 0xb4 "tiled_num"
READ_LONG 0xb8 "tiled_offset"
READ_LONG 0xbc "songs_offset"
READ_LONG 0xc0 "rest_spawns_offset"
READ_LONG 0xc4 "automap_offset"
READ_LONG 0xc8 "automap_num"
READ_LONG 0xcc "projectile_traps_offset"
READ_LONG 0xd0 "projectile_traps_num"
Hiermit werden die ganzen Offsets der Area eingelesen. [Hier braucht nichts geändert zu werden.]
Code:
SET actor_1=1
FOR( cnt=0; cnt<"%actors_num%"; cnt=cnt+1 ) BEGIN
READ_ASCII ("%actors_offset %"+0x110*cnt) ~ actor_name ~ (32) NULL
PATCH_IF (("%actor_name%" STRING_COMPARE_CASE "Actorname")=0) THEN BEGIN
actor_1=0
END ELSE BEGIN
actor_1=1
END
END
Hiermit wird überprüft, ob der Actorname bereits vorhanden ist. (Wenn er existiert, dann wird das Patchen übersprungen) Dieser Schritt wird nicht unbedingt benötigt…
In diesem Block muss eigentlich nur der Actorname eingegeben werden!
Wenn der Name nicht vorhanden ist, hat die Variable actor_1 auf den Wert 1 gesetzt, wenn er bereits vorhanden ist, wird actor_1 auf 0 gesetzt…
Code:
PATCH_IF (actor_1=1) BEGIN
…
END
Dieser Patchprozess wird nur ausgeführt, wenn actor_1 = 1 ist, also wenn der vorherige Block zurückgibt, dass der Actorname nicht vorhanden ist…
Code:
SET offset = ("%actors_offset%"+0x110*"%actors_num%")
Die Variable offset wird hiermit auf das letzte Offset des letzten Actor der Area gesetzt.
Code:
INSERT_BYTES offset 0x110
Hiermit werden 110 Bytes der Area am offset hinzugefügt, damit man einen neuen Actor hinzufügen kann…
Code:
WRITE_ASCII offset ~Name~
Hier wird der Actorname angegeben. (Dieser hat nichts mit dem Namen der Creature zu tun…)
Code:
WRITE_SHORT (offset+0x20) XXX
Das ist die X-Koordinate, wo der Actor spawnen soll…
Code:
WRITE_SHORT (offset+0x22) XXX
Das ist die Y.Koordinate, wo der Actor spawnen soll…
Code:
WRITE_SHORT (offset+0x24) XXX
Das ist die X-Koordinate, worauf der Actor zugeht
Code:
WRITE_SHORT (offset+0x26) XXX
Das ist die Y-Koordinate, worauf der Actor zugeht
Code:
WRITE_LONG (offset+0x34) X
Das ist die Ausrichtung, in welche der Actor blickt…
Hier gibt’s folgende Einstellungen:
0 = Süden
1 = Süden/Süden/Westen
2 = Süden/Westen
3 = Süden/Westen/Westen
4 = Westen
5 = Westen/Westen/Norden
6 = Westen/Norden
7 = Westen/Norden/Norden
8 = Norden
9 = Norden/Norden/Osten
10 = Norden/Osten
11 = Norden/Osten/Osten
12 = Osten
13 = Osten/Osten/Süden
14 = Osten/Süden
15 = Osten/Süden/Süden
Code:
WRITE_LONG (offset+0x38) 0xffffffff
Hier wird der Removal Timer angegeben, ich kann leider nicht genauer erklären, wie er funktioniert, aber der Actor erscheint nicht, wenn der Timer nicht gesetzt wird…
Code:
WRITE_LONG (offset+0x40) 0xffffffff
Hier wird angegeben zu welchen Zeiten der Actor auftauchen soll… (mit jedem Nibble (4 Bit) können vier Zeiten abgebildet werden)
So fangen wir mal mit dem ersten Nibble an:
0x00000001 : 00:30-01:29
0x00000002 : 01:30-02:29
0x00000004 : 02:30-03:29
0x00000008 : 03:30-04:29
Jetzt werdet Ihr Euch fragen, wie kann ich mit einem Bit mehrere Zeiten einstellen, dass funktioniert nach folgendem Prinzip:
0x00000003 : [=1+2] 00:30-01:29 und 01:30-02:29
0x00000005 : [=1+4] 00:30-01:29 und 02:30-03:29
0x00000006 : [=2+4] 01:30-02:29 und 02:30-03:29
0x00000007 : [=1+2+4] 00:30-01:29 und 01:30-02:29 und 02:30-03:29
0x00000009 : [=1+8] 00:30-01:29 und 03:30-04:29
0x0000000a : [=2+8] 01:30-02:29 und 03:30-04:29
0x0000000b : [=1+2+8] 00:30-01:29 und 01:30-02:29 und 03:30-04:29
0x0000000c : [=4+8] 02:30-03:29 und 03:30-04:29
0x0000000d : [=1+4+8] 00:30-01:29 und 02:30-03:29 und 03:30-04:29
0x0000000e : [=2+4+8] 01:30-02:29 und 02:30-03:29 und 03:30-04:29
0x0000000f : [=1+2+4+8] 00:30-01:29 und 01:30-02:29 und 02:30-03:29 und 03:30-04:29
Ok, dann liste ich noch die Zeiten der Nibbles auf:
0x87654321
1: 00:30-04:29
2: 04:30-08:29
3: 08:30-12:29
4: 12:30-16:29
5: 16:30-20:29
6: 20:30-00:29
7: wird nicht genutzt
8: wird nicht genutzt
Code:
WRITE_ASCII (offset+0x48) ~Dialog~
Hiermit kann dem Actor ein Dialog zugewiesen werden. Dieser Dialog wird nur für diesen Actor ausgeführt. (d.h. der normale Dialog der Creature dieses Actor wird durch den überschrieben)
Code:
WRITE_ASCII (offset+0x50) ~OverrideScript~
WRITE_ASCII (offset+0x58) ~GeneralScript~
WRITE_ASCII (offset+0x60) ~ClassScript~
WRITE_ASCII (offset+0x68) ~RaceScript~
WRITE_ASCII (offset+0x70) ~DefaultScript~
WRITE_ASCII (offset+0x78) ~SpecificScript~
Hiermit können dem Actor Scripte zugewiesen werden. Diese Scripte werden nur für diesen Actor ausgeführt. (d.h. die normalen Scripte werden für die Creature dieses Actor überschrieben)
Code:
WRITE_ASCII (offset+0x80) ~Crefilename~
Hiermit wird angegeben, welche Creature dem Actor zugewiesen wird.
Code:
SET "actors_num"="%actors_num%"+1
WRITE_SHORT 0x58 "%actors_num%"
Hiermit wird die Nummer der Actoren der Area um eins erhöht und dann der neue Wert geschrieben…
So jetzt kommen wir zum letzten Teil, dem Patchen der anderen Offsets:
Code:
SET "actor_ext"=0x110*actor_1
Hiermit wird angegeben, dass die Variable actor_ext um 0x110*actor_1 erhöht wird.
Code:
PATCH_IF ("%infotrig_offset%">"%actors_offset%")
OR (("%infotrig_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"infotrig_offset"="%infotrig_offset%"+"%actor_ext%"
WRITE_LONG 0x5c "%infotrig_offset%"
END
PATCH_IF ("%spawns_offset%">"%actors_offset%")
OR (("%spawns_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"spawns_offset"="%spawns_offset%"+"%actor_ext%"
WRITE_LONG 0x60 "%spawns_offset%"
END
PATCH_IF ("%entrances_offset%">"%actors_offset%")
OR (("%entrances_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"entrances_offset"="%entrances_offset%"+"%actor_ext%"
WRITE_LONG 0x68 "%entrances_offset%"
END
PATCH_IF ("%cont_offset%">"%actors_offset%")
OR (("%cont_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"cont_offset"="%cont_offset%"+"%actor_ext%"
WRITE_LONG 0x70 "%cont_offset%"
END
PATCH_IF ("%items_offset%">"%actors_offset%")
OR (("%items_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"items_offset"="%items_offset%"+"%actor_ext%"
WRITE_LONG 0x78 "%items_offset%"
END
PATCH_IF ("%vert_offset%">"%actors_offset%")
OR (("%vert_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"vert_offset"="%vert_offset%"+"%actor_ext%"
WRITE_LONG 0x7c "%vert_offset%"
END
PATCH_IF ("%amb_offset%">"%actors_offset%")
OR (("%amb_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"amb_offset"="%amb_offset%"+"%actor_ext%"
WRITE_LONG 0x84 "%amb_offset%"
END
PATCH_IF ("%vars_offset%">"%actors_offset%")
OR (("%vars_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"vars_offset"="%vars_offset%"+"%actor_ext%"
WRITE_LONG 0x88 "%vars_offset%"
END
PATCH_IF ("%expbmp_offset%">"%actors_offset%")
OR (("%expbmp_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"expbmp_offset"="%expbmp_offset%"+"%actor_ext%"
WRITE_LONG 0xa0 "%expbmp_offset%"
END
PATCH_IF ("%doors_offset%">"%actors_offset%")
OR (("%doors_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"doors_offset"="%doors_offset%"+"%actor_ext%"
WRITE_LONG 0xa8 "%doors_offset%"
END
PATCH_IF ("%anim_offset%">"%actors_offset%")
OR (("%anim_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"anim_offset"="%anim_offset%"+"%actor_ext%"
WRITE_LONG 0xb0 "%anim_offset%"
END
PATCH_IF ("%tiled_offset%">"%actors_offset%")
OR (("%tiled_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"tiled_offset"="%tiled_offset%"+"%actor_ext%"
WRITE_LONG 0xb8 "%tiled_offset%"
END
PATCH_IF ("%songs_offset%">"%actors_offset%")
OR (("%songs_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"songs_offset"="%songs_offset%"+"%actor_ext%"
WRITE_LONG 0xbc "%songs_offset%"
END
PATCH_IF ("%rest_spawns_offset%">"%actors_offset%")
OR (("%rest_spawns_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"rest_spawns_offset"="%rest_spawns_offset%"+"%actor_ext%"
WRITE_LONG 0xc0 "%rest_spawns_offset%"
END
PATCH_IF ("%automap_offset%">"%actors_offset%")
OR (("%automap_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"automap_offset"="%automap_offset%"+"%actor_ext%"
WRITE_LONG 0xc4 "%automap_offset%"
END
PATCH_IF ("%projectile_traps_offset%">"%actors_offset%")
OR (("%projectile_traps_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"projectile_traps_offset"="%projectile_traps_offset%"+"%actor_ext%"
WRITE_LONG 0xcc "%projectile_traps_offset%"
END
Falls irgendein Offset größer als das actors_offset , oder gleichgroß wie das actors_offset ist, dann wird das offset um die Variable actor_ext erhöht, damit die are File nicht kaputt gemacht wird…
[Hier muss wieder nichts geändert werden]
Das gibt an, dass falls keine Änderungen an der Area vorgenommen warden, diese nicht in den Override Ordner kopiert wird!
So zum Schluss noch der Code am Stück:
Code:
COPY_EXISTING ~AR0300.are~ ~override~
READ_LONG 0x54 "actors_offset"
READ_SHORT 0x58 "actors_num"
READ_SHORT 0x5a "infotrig_num"
READ_LONG 0x5c "infotrig_offset"
READ_LONG 0x60 "spawns_offset"
READ_LONG 0x64 "spawns_num"
READ_LONG 0x68 "entrances_offset"
READ_LONG 0x6c "entrances_num"
READ_LONG 0x70 "cont_offset"
READ_SHORT 0x74 "cont_num"
READ_SHORT 0x76 "items_num"
READ_LONG 0x78 "items_offset"
READ_LONG 0x7c "vert_offset"
READ_SHORT 0x80 "vert_num"
READ_SHORT 0x82 "amb_num"
READ_LONG 0x84 "amb_offset"
READ_LONG 0x88 "vars_offset"
READ_LONG 0x8c "vars_num"
READ_LONG 0xa0 "expbmp_offset"
READ_LONG 0xa4 "doors_num"
READ_LONG 0xa8 "doors_offset"
READ_LONG 0xac "anim_num"
READ_LONG 0xb0 "anim_offset"
READ_LONG 0xb4 "tiled_num"
READ_LONG 0xb8 "tiled_offset"
READ_LONG 0xbc "songs_offset"
READ_LONG 0xc0 "rest_spawns_offset"
READ_LONG 0xc4 "automap_offset"
READ_LONG 0xc8 "automap_num"
READ_LONG 0xcc "projectile_traps_offset"
READ_LONG 0xd0 "projectile_traps_num"
SET actor_1=1
FOR( cnt=0; cnt<"%actors_num%"; cnt=cnt+1 ) BEGIN
READ_ASCII ("%actors_offset %"+0x110*cnt) ~ actor_name ~ (32) NULL
PATCH_IF (("%actor_name%" STRING_COMPARE_CASE "White Agnus")=0) BEGIN
actor_1=0
END ELSE BEGIN
actor_1=1
END
END
PATCH_IF (actor_1=1) BEGIN
SET offset = ("%actors_offset%"+0x110*"%actors_num%")
INSERT_BYTES offset 0x110
WRITE_ASCII offset ~White Agnus~ //Actorname
WRITE_SHORT (offset+0x20) 1517 //Position X
WRITE_SHORT (offset+0x22) 1274 //Position Y
WRITE_SHORT (offset+0x24) 1517 //Destination X
WRITE_SHORT (offset+0x26) 1274 //Destination Y
WRITE_LONG (offset+0x34) 4 //Actor Orientation
WRITE_LONG (offset+0x38) 0xffffffff //Actor Removal Timer
WRITE_LONG (offset+0x40) 0xff0ffff0 //Actor Appearance Schedule
WRITE_ASCII (offset+0x48) ~~ //Dialog
WRITE_ASCII (offset+0x50) ~~ //OverrideScript
WRITE_ASCII (offset+0x58) ~~ // GeneralScript
WRITE_ASCII (offset+0x60) ~~ // ClassScript
WRITE_ASCII (offset+0x68) ~~ // RaceScript
WRITE_ASCII (offset+0x70) ~~ // DefaultScript
WRITE_ASCII (offset+0x78) ~~ // SpecificScript
WRITE_ASCII (offset+0x80) ~Wagnus~ // Crefilename
SET "actors_num"="%actors_num%"+1
WRITE_SHORT 0x58 "%actors_num%"
END
SET "actor_ext"=0x110*actor_1
PATCH_IF ("%infotrig_offset%">"%actors_offset%")
OR (("%infotrig_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"infotrig_offset"="%infotrig_offset%"+"%actor_ext%"
WRITE_LONG 0x5c "%infotrig_offset%"
END
PATCH_IF ("%spawns_offset%">"%actors_offset%")
OR (("%spawns_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"spawns_offset"="%spawns_offset%"+"%actor_ext%"
WRITE_LONG 0x60 "%spawns_offset%"
END
PATCH_IF ("%entrances_offset%">"%actors_offset%")
OR (("%entrances_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"entrances_offset"="%entrances_offset%"+"%actor_ext%"
WRITE_LONG 0x68 "%entrances_offset%"
END
PATCH_IF ("%cont_offset%">"%actors_offset%")
OR (("%cont_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"cont_offset"="%cont_offset%"+"%actor_ext%"
WRITE_LONG 0x70 "%cont_offset%"
END
PATCH_IF ("%items_offset%">"%actors_offset%")
OR (("%items_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"items_offset"="%items_offset%"+"%actor_ext%"
WRITE_LONG 0x78 "%items_offset%"
END
PATCH_IF ("%vert_offset%">"%actors_offset%")
OR (("%vert_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"vert_offset"="%vert_offset%"+"%actor_ext%"
WRITE_LONG 0x7c "%vert_offset%"
END
PATCH_IF ("%amb_offset%">"%actors_offset%")
OR (("%amb_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"amb_offset"="%amb_offset%"+"%actor_ext%"
WRITE_LONG 0x84 "%amb_offset%"
END
PATCH_IF ("%vars_offset%">"%actors_offset%")
OR (("%vars_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"vars_offset"="%vars_offset%"+"%actor_ext%"
WRITE_LONG 0x88 "%vars_offset%"
END
PATCH_IF ("%expbmp_offset%">"%actors_offset%")
OR (("%expbmp_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"expbmp_offset"="%expbmp_offset%"+"%actor_ext%"
WRITE_LONG 0xa0 "%expbmp_offset%"
END
PATCH_IF ("%doors_offset%">"%actors_offset%")
OR (("%doors_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"doors_offset"="%doors_offset%"+"%actor_ext%"
WRITE_LONG 0xa8 "%doors_offset%"
END
PATCH_IF ("%anim_offset%">"%actors_offset%")
OR (("%anim_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"anim_offset"="%anim_offset%"+"%actor_ext%"
WRITE_LONG 0xb0 "%anim_offset%"
END
PATCH_IF ("%tiled_offset%">"%actors_offset%")
OR (("%tiled_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"tiled_offset"="%tiled_offset%"+"%actor_ext%"
WRITE_LONG 0xb8 "%tiled_offset%"
END
PATCH_IF ("%songs_offset%">"%actors_offset%")
OR (("%songs_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"songs_offset"="%songs_offset%"+"%actor_ext%"
WRITE_LONG 0xbc "%songs_offset%"
END
PATCH_IF ("%rest_spawns_offset%">"%actors_offset%")
OR (("%rest_spawns_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"rest_spawns_offset"="%rest_spawns_offset%"+"%actor_ext%"
WRITE_LONG 0xc0 "%rest_spawns_offset%"
END
PATCH_IF ("%automap_offset%">"%actors_offset%")
OR (("%automap_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"automap_offset"="%automap_offset%"+"%actor_ext%"
WRITE_LONG 0xc4 "%automap_offset%"
END
PATCH_IF ("%projectile_traps_offset%">"%actors_offset%")
OR (("%projectile_traps_offset%" == "%actors_offset%") AND ("%actors_num%" == 0))
BEGIN
"projectile_traps_offset"="%projectile_traps_offset%"+"%actor_ext%"
WRITE_LONG 0xcc "%projectile_traps_offset%"
END
BUT_ONLY_IF_IT_CHANGES
Hiermit wird die Creature Wagnus.cre von 04:30-20:29 auf Position x= 1517 Y=1274 mit der Ausrichtung nach Westen hinzugefügt.
Die Offsets sind auch alle im
IESDP unter
File Formats und dann unter
Are Version 1 nachzulesen. Ausserdem ist die
Weidu Documentation nicht zu verachten, wenn es um tp2 Code geht.
Soo, ich hoffe ich hab mich gut ausgedrückt und es ist alles so verständlich, wie es sein soll…
Falls eine Erklärung fehlt, sagt mir Bescheid und ich ergänze es.