Pokemon-Games

Alles rund um Pokemon
Aktuelle Zeit: 16. Mai 2024, 21:15

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: XSE-Tutorial
BeitragVerfasst: 2. Jul 2008, 14:16 
Offline
Benutzeravatar

Registriert: 30. Jun 2008, 18:06
Beiträge: 2
Bonuspunkte: 0
XSE-Scripting tutorial


1.Einführung
2.Simple handlungen
3.give item/pokemon
4.applymovement
5.Grafikscripts
6.Zusammenfassung der befehle



1.Einführung

Hallo alle miteinander.
Kurz vorweg:
Ich schreibe zum ersten mal ein Tutorial und werde warscheinlich dementsprechend viele
Fehler machen, sollte dies der Fall sein, weißt mich bitte darauf hin.
(Nur Rechtschreibfehler, die dürft ihr behalten.)
Ich versuche ein Tutorial für HackMew's eXtreme Script Editor zu schreiben.
Füe alle die sich schon ein wenig auskennen:
Ich werde hier mit dynamischen Offsets arbeiten, da dies wesentlich einfacher
und auf der ROM platzsparender ist.
So, erst einmal:

Was brauchen wir?
1. eXtreme Script Editor
2. AdvanceMap
4. Visual Boy Advance
3. Listen der Item- und POKéMON-Daten (s.U.)
4. Zu modifizierende ROM

Zudem möchte ich anmerken, das der Compiler oft Zahlen in Hex benötigt.
Wenn ihr Hexadecimale Zahlen eingebt, schreibt ein [0x] oder ein [&H] davor.
(Ich werde hier nicht das Hexadecimale Zahlensystem erläutern, ich denke, wenn
man dieses Tutorial liest, sollte man so etwas wissen.)
Gut, wenn jeder alles hat, würde ich sagen, fangen wir an.



2.Simple Handlungen

Ganz oft im Spiel redet man einfach nur mit den Leuten,
das ist zwar sehr simpel, aber irgendwo auch ein Script.
Ein simpler Sprech-Script in XSE sieht so aus:

Zitat:
#dynamic 0x800000
#org @main
lock
faceplayer
msgbox @text
callstd 0x6
release
end

#org @text
= Hallo.\nWie geht es dir?\pGut?


Erklärungen:
Zeile 01 : Dynamisches Start-Offset, mit den dynamischen Offsets
________ schreibt der Editor den Script einfach irgendwo in die
________ ROM rein, wo gerade Platz ist. Dieses Offset markiert
________ den Startpunkt der Suche nach freien Platz des Editors.
Zeile 02 : #org ist der "Schreibe-zu" Befehl, er schreibt den folgenden
________ Textabschnitt in die ROM.
Zeile 03 : Lässt den Spieler und die Person, die man anspricht, stillstehen.
Zeile 04 : Dreht die Person zum Player um.
Zeile 05 : Lässt eine Textbox erscheinen, mit dem Text der bei @text steht.
________ ([msgbox @irgendwas] und [message @irgendwas] werden synonym verwendet.)
Zeile 06 : Bestimmt die Kategorie der Textbox. (6 = normale Box)
________ ([callstd 0x{zahl}] und [boxset 0x{zahl}] werden auch synonym verwendet.)
________ da 0x6 und 6 das gleiche bedeuten, kann man auch 6 anstatt 0x6 schreiben, spart Zeit.
Zeile 07 : Figuren können sich wieder bewegen, Textbox schließt sich.
Zeile 08 : Ende des eigendlichen Scripts
Zeile 10 : Hierhin kommt der richtige Text.
Teile 11 : Ein Gleichheitszeichen und eine Leertaste, dann beginnt der Text.
________ Das [\n] lässt den Text (im Spiel) in die nächste Zeile springen,
________ das [\p] löscht nach Knopfdruck den Inhalt der Textbox und springt wieder in die erste Zeile.

Wer den Script ausprobieren will, kopiert ihn in den Editor von XSE,
öffnet die ROM und compiliert ihn.
Das angegebene offset gebt ihr in AM einer Person.
(Drückt auf [kopieren], geht dann in AM und fügt bei der Person das ein, aber
hinter dem $ (also 800000 -> $800000))


Bild

Bild

Bild


3. give item/pokemon

So, jetzt fängt es an interessant zu werden.
(z.I: Ich werde in diesem Abschnitt auch flags behandeln.)
Viele von euch werden irgendwann giveitem und givepokemon
scripts benötigen.
an sich ist es simpel, es genügt

Zitat:
giveitem 0x[nr. des Items] 0x[Anzahl] 0x0


bzw.

Zitat:
givepokemon 0x[nr. des Pok.] 0x[Level] 0x[nr. des Items] 0x0 0x0 0x0


Das fügt man dann in einen Script ein,
hier ein Beispiel:

Zitat:
#dynamic 0x800000

#org @main
giveitem 0xD 0x1 0x0
release
end


(0xD ist die Nummer von TRANK.)
Dieser Script gibt dem Player beim Ansprechen einen TRANK.
Viele haben jetzt sicher was zu meckern.
Ihr habt Recht, es ist in der Tat fade.
Man spricht die Person an, man bekommt ein TRANK und Ende.
Es wäre viel schöner wenn sie noch etwas sagen würde.
Also, lassen wir sie sprechen:

Zitat:
#dynamic 0x800000

#org @main
lock
faceplayer
msgbox @hi
callstd 0x6
giveitem 0xD 0x1 0x0
release
end

#org @hi
= Hier,\nein TRANK!


So, sieht doch gleich viel besser aus.
Aber, manchmal möchte man das Item noch
gar nicht haben, besser wäre es, wenn man selbst
entscheiden dürfte, wann man es bekommt.
Das lässt sich mit dem boxset regeln.
Denn, [callstd 0x6] ist eine normale Textbox,
aber wir brauchen eine Ja/Nein Textbox.
Diese hat die Nummer 0x5.

Textboxnummern:

    1. 0x4 - Lässt die Textbox nach Ende offen (ben. #raw 0x68 zum schließen).
    2. 0x5 - Ja/Nein Textbox.
    3. 0x6 - Normale Textbox.

Also, bauen wir eine Ja/Nein Textbox ein.

Zitat:
#dynamic 0x800000

#org @main
lock
faceplayer
msgbox @frage
callstd 0x5
compare LASTRESULT 1
if B_TRUE call @give
msgbox @ciao
callstd 0x6
release
end

#org @frage
= Möchtest du einen TRANK haben?

#org @ciao
= Auf Wiedersehen!

#org @give
msgbox @hi
callstd 0x6
giveitem 0xD 0x1 0x0
return

#org @hi
= Hier,\nein TRANK!


OK, es sind ein paar neue Sachen dabei.
Zum einen der Befehl [compare].
Es macht eigendlich das, was der Name schon sagt,
es vergleicht Variablen.
[compare] kann man mit [if] kombinieren,
hier zum Beispiel vergleicht es die Variablen LASTRESULT
(wo die Antwort auf die Ja/Nein Textbox gespeichert ist)
mit 1 (= Ja, 0 = Nein).
Danach überprüft [if] das Ergebnis, und wenn es
wahr (= B_TRUE, falsch = B_FALSE ; man kann auch 0x1 für "wahr"
und 0x0 für "falsch" benutzen, aber B_TRUE und B_FALSE sind eindeutiger.)
ist, ruft (= call) es @give auf.
(Wenn es falsch ist, (also der Player "Nein" angeklickt hat) passiert nichts.)
Am Ende von @give ist kein [release] und kein [end],
da der Script dort auch noch nicht zu Ende ist.
Statt dessen steht dort ein [return], das lässt den Script wieder
nach @main hinter das [if] zurückspringen.
Allerdings ist es im Spiel meistens nicht so, das
eine Person ständig noch ein Item rausrückt.
(Auch wenn es schön wäre.)
Um nur einmal das Item zu bekommen, kann man Flags benutzen.
Hier der fertige Script:

Zitat:
#dynamic 0x800000

#org @main
lock
faceplayer
msgbox @frage
callstd 0x5
compare LASTRESULT 1
if B_TRUE call @give
msgbox @ciao
callstd 0x6
release
end

#org @frage
= Möchtest du einen TRANK haben?

#org @ciao
= Auf Wiedersehen.

#org @give
checkflag 0x200
if B_TRUE goto @hatSchon
msgbox @hi
callstd 0x6
giveitem 0xD 0x1 0x0
setflag 0x200
return

#org @hi
= Hier,\nein TRANK.

#org @hatSchon
msgbox @nichtSoGierig
callstd 0x6
release
end

#org @nichtSoGierig
= Du hast schon einen\nTRANK bekommen.\pSei nicht so gierig!


So, neu sind [setflag] und [checkflag], aber dazu gehört auch noch
der Befehl [clearflag].
Flags sind "Flaggen" im Spiel, man kann sie hissen und einhohlen.
Mit [setflag] hisst man eine flag und mit [clearflag] holt man sie
wieder ein.
Wichtig sind sie aber nur mit [checkflag].
Diese Befehl überprüft, ob eine Flagge gehisst ist.
(Man muss dies ntürlich auch mit [if] kombinieren.)
Freie flags gibt es von 0x200 bis 0x2A0 und ab 0x1000.
(Soweit ich weiß.)
Nach [if] kann man ein [call] oder ein [goto] setzen,
beide sind ähnlich, doch der [call]-Befehl hat einen
Vorteil, man kann wieder zurückspringen.
(Man kann beide Befehle auch ohne [if] verwenden.)

Was ich jetzt mit giveitem gemacht habe,
kann man natürlich auch mit givepokemon machen.

Die Item- und Pokémonlisten findet ihr am Ende des Tutorials.


4. applymovement

So, wir wissen jetzt schon relativ viel über das
scripten, können Personen reden und fragen lassen,
können sie sogar dazu bringen, uns etwas zu geben.
Aber ein wichtiger Punkt fehlt uns noch.
In vielen Fällen (gerade bei Events) muss man Leute
bewegen, bzw. bewegen lassen.
(Bestes Beispiel: Prof. Eich am Anfang von fr.)
Gut, bewegen wir jetzt mal eine Person.
Der script an sich sieht so aus:

Zitat:
applymovement 0x[personen-nr.] @[gehdaten]


1. Die Personen-Nummer.
Die Pers.-Nr. ist eine feste Nummer, die jede Person
(und auch gegenstände) auf der Map haben.
Man kann sie in AM ablesen.

Bild

2. Die Gehdaten.
Da zu ein kleines Beispiel.

Zitat:
#dynamic 0x800000

#org @main
applymovement 0x1 @go
pause 0x40
release
end

#org @go
#binary 0x11 0x13 0x10 0x12 0xFE


Verwirrt?
Gut, jetzt zu Erklärung:
das [#binary] heißt, das der Compiler die nachfolgenden
Ziffern so wie sie sind in die ROM schreiben soll.
Das heißt, irgendwo in der ROM steht:

Zitat:
11131012FE


So, jetzt die Bedeutung der einzelnen Bytes.
Also, jedes Byte beinhaltet eine Bewegung.
In diesem Fall würde die angesprochene Person
einen Schritt nach oben [0x11] machen, dann
einen Schritt nach rechts [0x13] machen, dann
einen Schritt nach unten [0x10] mahen, dann
einen Schritt noch links [0x12] machen.
Das 0xFE muss am Ende JEDER Gehdaten stehen,
da diese dem Spiel sagen das die Gehdaten zu ende sind.
Aber jetzt kommts:
Was wenn wir die Person nur drehen wollen?
Was wenn sie springen soll?
Da gibt es auch Befehle für. (dürften so an die hundert sein.)
Hier eine Liste:

Code:
Bewegungs-Commandos für fr/bg
(Kurzform)



Kopf nach unten 0x00
Kopf nach oben 0x01
Kopf nach links 0x02
Kopf nach rechts 0x03


Schritt nach unten  (sehr langsam) 0x08
Schritt nach oben   (sehr langsam) 0x09
Schritt nach links  (sehr langsam) 0x0A
Schritt nach rechts (sehr langsam) 0x0B

Schritt nach unten  (langsam) 0x0C
Schritt nach oben   (langsam) 0x0D
Schritt nach links  (langsam) 0x0E
Schritt nach rechts (langsam) 0x0F

Schritt nach unten  (Normal) 0x10
Schritt nach oben   (Normal) 0x11
Schritt nach links  (Normal) 0x12
Schritt nach rechts (Normal) 0x13

Schritt nach unten  (schnell) 0x1D
Schritt nach oben   (schnell) 0x1E
Schritt nach links  (schnell) 0x1F
Schritt nach rechts (schnell) 0x20

Schritt auf der Stelle unten  0x21
Schritt auf der Stelle oben   0x22
Schritt auf der Stelle links  0x23
Schritt auf der Stelle rechts 0x24

Schritt auf der Stelle unten  (schnell) 0x25
Schritt auf der Stelle oben   (schnell) 0x26
Schritt auf der Stelle links  (schnell) 0x27
Schritt auf der Stelle rechts (schnell) 0x28

Schritt auf der Stelle unten  (sehr schnell) 0x29
Schritt auf der Stelle oben   (sehr schnell) 0x2A
Schritt auf der Stelle links  (sehr schnell) 0x2B
Schritt auf der Stelle rechts (sehr schnell) 0x2C


Überspringe ein Feld nach unten  0x14
Überspringe ein Feld nach oben   0x15
Überspringe ein Feld nach links  0x16
Überspringe ein Feld nach rechts 0x17

Springe ein Feld nach unten  0x4E
Springe ein Feld nach oben   0x4F
Springe ein Feld nach links  0x50
Springe ein Feld nach rechts 0x51

Spring auf der Stelle (Gesicht unten)  0x52
Spring auf der Stelle (Gesicht oben)   0x53
Spring auf der Stelle (Gesicht links)  0x54
Spring auf der Stelle (Gesicht rechts) 0x55

Spring auf der Stelle (Gesicht unten -> oben)   0x56
Spring auf der Stelle (Gesicht oben -> unten)   0x57
Spring auf der Stelle (Gesicht links -> rechts) 0x58
Spring auf der Stelle (Gesicht rechts -> links) 0x59


Gesicht zu Player      0x4A
Gesicht weg von Player 0x4B


Verschwinden 0x60
Erscheinen   0x61


"!"   Box öffnen 0x62
"?"   Box öffnen 0x63
"X"   Box öffnen 0x64
"!!"  Box öffnen 0x65
"^_^" Box öffnen 0x66


Dann gibt es noch einen neuen Befehl,
[pause].
Diese Befehl macht was er schon sagt, er hält das Spiel
an.
In dieser Zeit kann die Person sich ungehindert
bewegen, wärend der Player nichts machen kann.
Hinter Pause steht eine Zahl, die besagt, wie lange
das Spiel angehalten wird.
Dazu gibt es eine Regel:

Zitat:
Für jeden Geh-Befehl
erhöht man die Pause um 1.
(0xFE nicht mitgezählt.)
Am Ende ver16-facht man das ganze,
und wandelt es in hex um.
(also in dem Beispiel:
5 Befehle - 0xFE = 4
4 * 16 = 64
dec(64) = hex(40))


Diese Regel ist leider nicht sehr genau,
ab 10 Befehle wirds ungenau.
Es gibt allerdings noch einen anderen
Befehl, [waitmovement 0x0].
Er hält das Spiel solange an, bis
alle [applymovement]s zu ende sind.
Man kann natürlich auch mehrere Personen gleichzeitig
laufe lassen.

Zitat:
#dynamic 0x800000

#org @main
applymovement 0xFF @go
applymovement 0x1 @go
applymovement 0x2 @go
applymovement 0x3 @goAnders
waitmovement 0x0
release
end


Hier gibt es etwas neues,
denn ich versuche gerade die 256te
Person zu bewegen.
Die Tatsache, das eine Map nur max. 255
Personen beinhalten kann, könnte
meine Aktion erschwehren.
Die Lösung?
Die 256te Person ist der Player.
(Ich hätte auch [applymovement MOVE_PLAYER @go]
schreiben können, aber das ist mir zu lang.)

So, das dürfte erstmal alles dazu gewesen sein,
am Ende des Tutorials findet ihr die kompletten Geh-Daten (leider in englisch).


5. Grafikscripts

Grafikscripts sind im Grunde genommen sehr einfach,
sie werden mit dem Befehl [setmaptile] deklariert,
und müssen vier Werte übergeben bekommen.
Die X- und Y-Koordinaten (damit die ROM weiß, wo sie
das maptile hinpacken soll), welches tile überhaupt, und
natürlich auch ein Attribut für das Tile.
Das sieht dann folgendermaßen aus:

Zitat:
setmaptile 0x[X-Koordinate] 0x[Y-Koordinate] 0x[tile] 0x[Attribut]


In einem konkreten Beispiel würde es lauten:

Zitat:
setmaptile 0x5 0xE 0x8F 0x0


Welches tile würde jetzt wohin geschrieben werden?
Das tile Nummer 143 [8F] würde zu Punkt (5|14) geschrieben werden.
Und das Attribut?
0x0 steh für "passierbar" und 0x1 für "unpassierbar".
(Genaueres weiß ich leider auch nicht, wenn jemand sich mit diesem
Thema etwas außführlicher beschäftigen würde und noch ein paar Attribute
herausfinden würde, wäre ich sehr dankbar.)
Fest steht, das -wie mache sicher vermuten- die Attribute nicht mit den
in AM vorhandenen "Geh Daten" übereinstimmt, da man keine Felder mit dem
Attribut 0xC betreten kann.
Den [setmaptile]-Script kann man beliebig in einem Script einbauen,
doch am meisten wird er, denke ich, bei Map-Scripten zum Einstatz kommen.
Map-Scripte sind etwas besonderes, da sie automatisch aktiv werden, wenn
man eine Map betritt.
(Bei Routen ist das sicherlich nicht der Knüller,
aber wenn man in eine Haus geht, ist es früher immer ein Problem gewesen,
das man 3 Scripts um die Tür positionieren muss, wenn jemand das Haus
betritt und direkt beim Eintreten etwas passieren soll.
(z.B. in der Goldenen Edition, die Mutter die einen sofort anspricht,
wenn man die Treppe runterkommt, oder in fr/lg, im Vertania-Markt, wo
man direkt nach dem Eintreten vom Verkäufer angesprochen wird.))
Aber in diesem Kapietel wollen wir nicht die "normalen" Map-Scripts besprechen,
sondern die Maptile-Script Variante.
Man braucht dazu min. AM 1.92.
Schreibt erstmal einen Script in XSE.
Darin sollten allerdings nur [setmaptile] und [check-, set-, und clearflag] drin
vorkommen, bei anderen Aktionen bin ich mir nicht sicher, ihr könnt es ja
mal ausprobieren.
Am besten lässt dich das an einem Beispiel erklären.
Kucken wir uns doch einmal den Map-Script der Prismania-Spielhalle an.

Zitat:
#org 0x16C5B8
checkflag 0x26D
if B_FALSE call 0x816C5C2
end

'-----------------------
#org 0x16C5C2
setmaptile 0xF 0x2 0x292 0x0
setmaptile 0x10 0x2 0x292 0x0
setmaptile 0x11 0x2 0x292 0x0
setmaptile 0x10 0x3 0x2CF 0x1
setmaptile 0x11 0x3 0x2CF 0x1
return


Also, in Worten wäre das:

  • Überprüfe, ob Fahne 0x26D gehisst ist.
  • Wenn nein, dann:
  • Setze die tiles so, das sie die Treppe in der Ecke überlagern.

Natürlich braucht man auch was, das die Fahne 0x26D hisst, da gibt es noch
das Poster hinter dem Rocket, welches die Fahne hisst und die Treppe wieder sichtbar
macht.

So, jetzt fehlt noch ein letzter Punkt, woher zu Geier soll ich
wissen, welches tile welche Nummer hat?
Man kann in AM rechts an der Seite ablesen und nachzählen, aber nach
7A Stücken sich zu verzählen wäre dumm.
Besser geht es mit dem Block-Editor.
Einfach aufrufen und links die Maus auf das gewünschte tile schieben, mittig im Editor
wird dann die Nummer des tiles angezeigt, mit [Block: XXX]. (XXX steht hier für die Blockzahl.)

Bild



Die Listen:

Item Daten

Pokémon Daten

Gehdaten


Zuletzt geändert von dav795 am 22. Jul 2008, 11:04, insgesamt 6-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
Verfasst: 2. Jul 2008, 14:16 


Nach oben
  
 
 Betreff des Beitrags: Re: XSE-Tutorial
BeitragVerfasst: 2. Jul 2008, 16:41 
Nicht schlecht für den Anfang,weiter so


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags: Re: XSE-Tutorial
BeitragVerfasst: 19. Jul 2008, 11:45 
Offline
Benutzeravatar

Registriert: 16. Jul 2008, 16:48
Beiträge: 113
gut mach weiter so :good:

_________________
Wegen Beleidigungen dauerhaft gesperrt.
Ihr Moderatoren Team.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: XSE-Tutorial
BeitragVerfasst: 20. Jul 2008, 07:49 
Offline
Benutzeravatar

Registriert: 1. Jul 2008, 13:55
Beiträge: 197
Bonuspunkte: 0
Karma: -1
Gut gemacht!

_________________
http://forum.pokefans.net/viewtopic.php?f=51&t=18240

Wer lust zum kämpfen oder tauschen hat bitte melden.

FC BAYERN MÜNCHEN!!!!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group



Bei iphpbb3.com bekommen Sie ein kostenloses Forum mit vielen tollen Extras
Forum kostenlos einrichten - Hot Topics - Tags
Beliebteste Themen: Pokemon, NES, Spiele, Erde, Rock

Impressum | Datenschutz