XSE Tutorial

  • Vorwort


    Hallo RHR Community.
    Da sich viele Anfänger noch schwer tun mit dem
    Scripten, habe ich beschlossen
    ein etwas größeres Tutorial darüber zu schreiben.
    Da werde ich mich auch mit mehreren unüblichen
    aber dennoch nützlichen Befehlen befassen.

    Die Grundlagen

    • 1.0 Textscript


    • 1.1 Flags
    • 1.2 giveitem und givepokemon
    • 1.3 fanfare + playsong
    • 1.4 Applymovement


    • 1.5 Setmaptile
    • 1.6 Levelscripts [01] [02] [03]
    • 1.7 pokemart
    • 1.8 random

    Fortgeschrittenes Scripten

    • 2.0 Hidesprite und Showsprite
    • 2.1 addvar und subvar
    • 2.2 movesprite
    • 2.3Special
    • 2.4 Callasm
    • 2.5 Trainerbattle
    • 2.6 warp


    • 2.7 multichoice, money und coins

    Anwendungsbeispiele

    • Minispiele
    • getplayerposition
    • Heilung der Pokemon
    • etw. bezahlen
    • Attacken außerhalb des Kampfes




    Einmal editiert, zuletzt von Laz0r () aus folgendem Grund: text umgeändert

  • Die Grundlagen
    Vorwissen


    In XSE beginnt man zuallererst mit dem befehl

    Code
    1. #dynamic 0xoffset


    Das sagt XSE, von wo er freien Platz für das Script suchen muss.
    Wenn ich also

    Code
    1. dynamic 0x800000


    eingebe, dann sucht mir XSE von dort weg freien


    Platz.
    Direkt nach dem #dynamic kommt..

    Code
    1. #org @pointer


    ..die #org Anweisung , dass das Script starten lässt.
    Nach den zwei zeilen..

    Code
    1. #dynamic 0x800000
    2. #org @start


    ..gehts mit dem eigentlichen Script los.


    Wenn immer ihr ein Script kompiliert habt geht ihr auf den kopieren button.


    1.0 Textscripts


    Ja die Textscripts.. das was jeder in seinem/ihrem Hack braucht.
    Wie mache ich das?
    Durch einen msgbox Befehl.
    Hier gibt es in den unterschiedlichen Versionen von
    XSE eine Unterscheidung, dazu aber später mehr.



    Und genau hier ist die Unterscheidung zwischen XSE 1.0 und XSE 1.1
    XSE 1.0 hat das callstd eine Zeile nach der msgbox ,
    XSE 1.1 aber genau neben der msgbox.
    Ich bins mit callstd 6 in der nächsten Zeile gewöhnt,
    ihr solltet das nehmen was euch leichter vorkommt.


    Sagen wir mal wir nehmen das hier.



    Dann müssen wir den pointer "text1" auf irgendwas verweisen.
    Das machen wir mit einer weiteren #org Anweisung..



    Bei dem #org @text1 geht ihr eine Zeile drunter und


    macht Strg+T.
    Das macht den XSE text editor auf, dort schreibt ihr einfach euren Text rein.
    Dann auf "konvertieren" und "einfügen". Verschaut euch in der Zeile nicht (; !
    Hmm toll, würden wir das testen würde uns die Person nicht anschauen.. Mag er uns nicht?
    Nein, wir haben etwas vergessen.

    Code
    1. lock
    2. faceplayer


    Diese zwei Befehle machen folgendes:
    Wenn man english kann, wird man es erraten können. lock macht den Spieler bewegungsunfähig während des Scripts.
    Es gibt auch lockall das alle Bewegungen im Spiel unterbricht.
    Faceplayer macht, dass die Person, die wir ansprechen, auch zu uns schaut.


    Code
    1. release und releaseall


    Diese zwei Befehle lassen alle Bewegungen wieder laufen ~
    Damit habt ihr jetzt gelernt, wie man einfache Textscripts macht!
    Hier noch das ganze Script:


    Es gibt btw einige "callstd" Befehle, hier eine Liste dazu.



    1.01 Ja/Nein Box

    Eine Ja oder Nein Box.
    Diese ist so auszulösen:


    Aber.. was kommt dann?
    Wie überprüfen wir die Ergebnisse, was du gedrückt hast?
    Ganz einfach (oder auch nicht^^)


    1.1 Flags


    Flags sind eins der wichtigsten Dinge in einem Spiel.Sie werden für verschiedene Dinge verwendet.
    Personen verschwinden(siehe hidesprite/showsprite) und andere Dinge, die nicht doppelt ausgeführt werden sollen.
    Das zu erklären ist nicht leicht, daher ein kleines Anwendungsbeispiel.. Und da kommen wir zu den:


    1.2 giveitem und givepokemon

    Genau hier brauchen wir flags.
    Aber zuvor besprechen wir noch den Befehl selber.


    Die drei Nullen sind einfach Fillerbytes. Einfach nicht beachten oder rumpfuschen^^
    Itemnummer, dazu gebe ich später eine Liste.
    Anzahl dürfte klar sein, 0x1 für 1 Stück usw.
    Beim giveitem ist ein sound enthalten, damit ervollständig abgespielt wird machen wir das..


    Waitfanfare lässt das Script warten bis der sound zuende ist (;
    Und jetzt kommen wir aber zu den Flags.
    Wenn man die Person ansprechen würde, bekäme man dasselbe Item immer und immer wieder.
    Wie verhindern wir das?
    Zuallererst möchte ich anmerken, dass flags nur einmal pro stück gesetzt werden können.
    Also Flag 0x500 darf ich nur einmal setzen.
    Im Spiel Feuerrot sind von 0x500 bis 0x700 und ab 0x900 alles frei.
    Die flags 0x800 bis 0x900 sind spezielle Flags, wie für
    Pokemon Menü oÄ, dazu später eine Liste.
    Nachdem ihr giveitem und das waitfanfare geschrieben habt, macht folgendes:


    Toll, wir haben eine flag 0x500 gesetzt. Wie überprüfen wir die?
    Am besten gleich nach dem #org @start macht ihr..


    Gratulation, jetzt habt ihr ein unendlichmaliges Geben eines Items verhindert^^
    Jetzt runden wir das Script ab und raus kommt:


    Und wie versprochen, jetzt die Itemliste (:



    Givepokemon


    Givepokemon funktioniert ähnlich:

    Code
    1. givepokemon 0xPokemonnummer 0xLevel 0xItem tragen 0x0 0x0 0x0


    Die 0x0s sind wieder nur Filler.
    Die Pokemonnummer ist GENAU die gleiche wie bei jedem Pokedex.
    Da XSE so brav ist und beim kompilieren alle Dezimalen Werte in Hexadezimale Werte umwandelt
    Wir brauchen einfachin den zb. Bisaboard Pokedex reingucken, uns die
    Pokenummer kopieren und einfach als zb. 151 (Mew) in den XSE eingeben
    ohne hexadezimales Umrechen!


    Bei givepokemon wird aber leider kein sound
    abgespielt und auch kein Text! :\
    Was machen wir bloß?


    Wir machen einfach eine msgbox dazwischen, den
    fanfare befehl als erstes, den waitfanfare als letztes!
    Damit die msgbox aber nicht zu geht bevor der sound weg ist, macht ihr ein callstd 0x4 statt 0x6 und
    ein closeonkeypressdanach. So einfach geht das (:
    Übrigens.. [player] lässt den Spielernamen anzeigen, [rival] den Rivalennamen.
    Jetzt aber noch genaueres zu:


    1.3 fanfare + playsong + sound + pause

    fanfare hatten wir gerade vorher in dem giveitem script besprochen
    fanfare 0x13E ist zb der sound für ein spezielles Item oder Pokemon erhalten.
    fanfare 0x100 ist wiederrum der sound fürs Pokemon heilen.
    Nach jedem fanfare ein waitfanfare machen bzw wann ihr wollt, dass der sound bis dahin abgespielt wird.
    playsong ist ein Befehl, der Musik abspielt.
    Nicht einfach ein fanfare, sondern Musikstücke wie Alabastia z.b.
    Dazu hat A.M eine Liste parat die wir im Header sehen.
    Wenn ihr aber nicht immer wechseln wollt, empfehle Ich diese Liste von dem werten User Kairyon.
    Musikliste+Sound
    Es gibt da noch fadesong, das macht einen flüssigen Übergang von der einen Musik zu der anderen.
    fadedefault macht einen flüssigen Übergang zu der normalen Musik auf der Map.
    Bei Kairyon Liste stehen auch Sounds.. hä?
    Sounds aktiviert man (was für eine Überraschung) mit dem sound Befehl.
    checksound wartet bis der sound abgespielt wird afaik.
    Es gibt noch sogennante pauseBefehle. Diese stoppen das Script für ein paar Momente, abhängig von dem geschriebenen Wert.

    Code
    1. pause 0xA..


    ..würde das Script zum Beispiel eine ~1/4 Sekunde stoppen.
    Und nun noch ein Beispielscript extra für euch^^



    1.4 Applymovement

    Erfahrungen nach, haben zig User Probleme mit Applymovements, daher werde ich dieses
    Thema besonders gut erklären,also bitte ich um volle Konzentration (;
    Zuallererst einmal, hier braucht man auch Advance map dazu.
    Applymovement ist so aufgebaut:

    Code
    1. applymovement 0xPersonennummer @pointer
    2. waitmovement 0x0


    Was neu ist, ist waitmovement.
    Es wartet, bis die Person die Bewegung vollendet hat.
    Personennummer? Wo zum Teufel soll ich das herbekommen.
    Wir zücken einfach Advance Map.Hier ein Bildchen wo die Nummer steht..


    Achtung! Nicht die nummer nehmen, die mit dem Kreuz durchgestrichen ist!
    Sondern die eingekreiste (:
    Unsere Personennummer ist demnach "1"daher:

    Code
    1. applymovement 0x1 @pointer
    2. waitmovement 0x0


    Jetzt kommt aber das wichtigste:
    Was sollen wir bei dem Pointer schreiben?

    Code
    1. #raw 0xMovementnummer 0xMovementnummer 0x.... 0xFE


    Ganz langsam..
    #raw schreibt eigentlich nur ein byte rein, was wir ihm sagen.
    Daher schreiben wir hinter #raw einfach die Movementnummern.
    Ihr könnt so viele Movements wie möglich dahinter schreiben, aber Achtung!
    Immer ein 0xFE dahinter! Das beendet das Movement..
    Hier ein Beispiel für Pokemon Feuerrot:


    Code
    1. applymovement 0x1 @pointaaa
    2. waitmovement 0x0
    3. #org @pointaaa
    4. #raw 0x11 0x11 0x11 0xFE



    Hier läuft unsere Person 3 Schritte hinauf.
    Da gebe ich euch noch die Liste für die Bewegungen:



    Wenn die person sich also nach unten drehen soll,
    schreibt ihr einfach #raw 0x00 0xFE
    In der Anwendung sieht das ganze so aus:


    Wenn ihr euch noch unsicher seid, lest es nochmal durch, seht euch meine Beispiel Scripts an!
    Ihr könnt mir auch eine PN schreiben, zögert nicht wenn ihr Fragen habt!


    1.5 Setmaptile

    Ja liebe Leute, jetzt kommen wir zu einer der mühsamsten Befehle, zu dem ihr Advance Map braucht.
    Was macht Setmaptile eigentlich?
    Setmaptile setzt Blöcke an einer bestimmten Stelle, ist sehr nützlich für viele Quests und auch storybedingte Sachen.
    Es wird von einem special 0x8E gefolgt, dass die Änderungen aktualisiert und sofort sichtbar macht.

    Code
    1. setmaptile 0xX Koordinate 0xY Koordinate
    2. 0xBlocknummer 0xBegehbarkeit


    Ui, ui. Wie kompliziert, denken sich manche auf den ersten Blick..
    Nee, ist es ganz und gar nicht , nur ein bisschen mühsam zu erklären.
    Zuerst einmal, die X und Y koordinate. Die könnt ihr hier in AM ablesen, indem ihr ein Mouseover auf die Stelle macht, wo ihr
    setmaptilen wollt. siehe screen.


    Fürs erste interessiert euch nur für die Koordinaten.
    Aus unserem Screen folgt:

    Code
    1. setmaptile 0x00 0x1D 0xBlocknummer 0xBegehbarkeit


    Jetzt wollen wir das Schild durch zb die Blumen ersetzen.
    Da macht ihr ein Mouseover über euer Tileset und liest die blocknummer ab. Man darf nur 0 oder 1 als gehdate hinschreiben, 0 ist begehbar , 1 ist nicht begehbar.
    Unsere Blume darf man einfach mal so betreten und jetzt haben wir daher:

    Code
    1. setmaptile 0x00 0x1D 0x56 0x0


    Damit wir unsere Änderungen jetzt sofort sichtbar machen, schreiben wir:

    Code
    1. setmaptile 0x00 0x1D 0x56 0x0
    2. special 0x8E


    Glückwunsch! Euer Tile ist geändert!
    Aber..
    Wenn ihr jetzt die Map neu betretet, ist das Tile wieder das alte. Mist!
    Um das zu "fixen" brauchen wir einen Levelscript.
    Und das ist unser nächstes Thema (;


    1.6 Levelscripts

    Es gibt verschiedenste Arten von Levelscripts, ich werde heute aber nur die wichtigsten drei erklären, wobei das zweite
    sauschwer für mich zu erklären wird, aber Bilder werden schon helfen (;
    Levelscripts findest du im Header einer Map.



    Typ [01]: Setmaptile


    Setmaptile hatten wir vorher gelernt.
    Doch warum als Levelscript?
    Wir hatten uns letztens beschwehrt, dass bei einem Mapwechsel die
    Änderungen rückgängig gemacht wurden!Und genau dafür ist septmaptile da.
    Beim betreten der map macht es die Änderungen wieder aktiv.
    Aber so einfach ist es nicht. Wir müssen eine Flag benutzen!
    Damit nicht gleich beim ersten betreten die Änderungen gültig werden, das hat keinen Sinn!

    Code
    1. setmaptile 0x00 0x1D 0x56 0x0
    2. special 0x8E


    Das hatten wir bei unserem Blumen-Script gesetzt..
    Jetzt korrigieren wir noch einbisschen wegen den Flags und raus kommt:

    Code
    1. setmaptile 0x00 0x1D 0x56 0x0
    2. special 0x8E
    3. setflag 0x501


    Jetzt haben wir eine Flag gesetzt (;
    Und jetzt IM LEVELSCRIPT:


    Den kompilieren wir und tragen das Starteroffset bei "Script Offset" ein



    Typ [02] (ouf..)

    Kühlen Kopf bewahren! Nach dem kommt nichts Kompliziertes mehr versprochen (;
    Allerdings ist es immer noch eine Grundlage, die man wissen sollte^^
    Zuerst einmal:
    Hier arbeiten wir jetzt schon mit Vars, Variablen.
    Das LASTRESULT , was wir öfters besprochen hatten, ist in echt eine Variable , 0x800D (:
    Es gibt den Befehl setvar den werden wir auch öfters brauchen.
    Zuerst einmal, du kannst in diesen Script alles reinschreiben was dir lieb ist.
    Diese Art von Scripts werden ausgelöst, wenn du die map betrittst.
    Wenn du allerdings ein applymovement eingebaut hast, wird das etwas blöd wenn du an einer anderen Stelle eintrittst^^
    Dafür gibt es "getplayerpos".Wenn du daran interessiert bist, schau doch ins Experten Tutorial (:
    Wir beschäftigen uns aber jetzt nur mit den Grundlagen des Typs [02].
    Bei dem Typ 02 werden unten 2 weitere Felder frei.. Flag undWert.


    Wie fange ich an hmm..
    Sagen wir mal so, du setzt in dem Script einfach eine variable, das machst du so:

    Code
    1. setvar 0x5000 0x1


    Hier ist das
    0x1 wichtig, setzt hier nichts anderes außer 0x1 (für den anfang mal)
    Also ihr habt eine VAR 0x5000 mit dem WERT 0x1 gesetzt.
    Kommt euch das nicht bekannt vor?
    Genau! Einfach dort einsetzen, wo der Levelscript im Header ist!
    Allerdings muss der Wert im Header 0 sein!
    Warum? Dazu kommen wir im Experten Tutorial!


    Problembehebung bei Levelscript Typ [02]

    Levelscript Typ 2 buggt ein bisschen.
    Manchmal stehen nach dem Script (wenn ihr im VBA testet) komische Zeichen in einer Endlosschlaufe..
    Um das zu beheben drückt ihr im Header die Strg Taste + H


    Da stehen viele interessante Sachen wie Randblock uvm.
    Aber wir interessieren uns zuerst mal für das Map-Script-Offset.
    Das kopieren wir uns zuerst einmal.
    Dann öffnen wir XSE und tragen das offset in der Offsetleiste ein:
    Dann klicken wir auf das Zangensymbol und dann kompiliersymbol ;)


    1.7 Pokemart

    Da nun eventuell euer Kopf raucht, möchte ich zu etwas leichterem kommen.
    Jeder kennt doch die Pokemon Märkte in den Spielen!
    Reizt es euch nicht einen zb. Beerenmarkt oder Ähnliches zu machen?
    Zuallererst machen wir folgenden Befehl:

    Code
    1. pokemarkt @pointer


    Scheint ja ganz leicht zu sein^^
    Aber wie definieren wir jetzt die Items von dem Markt?

    Code
    1. #org @pointer
    2. #raw word 0x1
    3. #raw word 0x2
    4. #raw word 0x...
    5. #raw word 0x0


    #raw word? Wasn das wieder komisches?
    Das meine lieben, definiert das Item das hinter dem steht.
    Wenn du #raw word 0x1 hast, wird laut der Itemliste ein Meisterball angeboten.
    Wie immer, muss auch ein Wert das Ende der Liste definieren.
    Und das tut #raw word 0x0.
    Also schreibt einfach eure Items hin und am ende einfach ein #raw word 0x0 (;
    Ein Beispiel Script mal wieder:



    1.8 random

    Kommen wir nun zum letzten Teil des Anfänger Tutorials.
    Der random Befehl.
    Mal wieder ein kleines Beispiel:

    Code
    1. random 0x3
    2. compare LASTRESULT 0x0
    3. if 0x1 goto @p1
    4. compare LASTRESULT 0x1
    5. if 0x1 goto @p2
    6. compare LASTRESULT 0x2
    7. if 0x1 goto @p3


    Es ist leichter als es aussieht.
    Ein random befehl ladet einen zufälligen Wert rein, der bei 0x3 Null, Eins oder Zwei betragen kann.
    Und den fragen wir ab!
    Mit compare LASTRESULT fragen wir das letzte Ergebnis ab.
    Falls dieser Wert 0x0 war geh zu @pointer
    Fall dieser Wert 0x1 war geh zu @pointer2 usw.
    Abhängig von eurem wert bei random müsst ihr auch so viele Auswahlmöglichkeiten machen.
    Bei 0x3 müsst ihr drei mal compare LASTRESULT und if 0x1 goto machen.
    Bei 0xA müsst ihr zehn solche machen. (A in hex ist 10 in dezimal^^)


    Nachwort_GrundlagenScriptingTutorial


    Bei Fragen und Anregungen könnt ihr mir eine PN schicken oder im Thread fragen (;
    Ich hoffe euch hat die Einleitung in die Grundlagen des Scriptings geholfen, arbeitet hart daran ein guter Scripter zu werden!
    Es ist nicht leicht zu verstehen, aber wenn ihr euch alle paar Male damit auseinandersetzt,
    wird das schon klappen, da bin ich mir sicher (;
    Sorry dass es so lange gedauert hat, aber irgendetwas hat meinen quellcode zerstört, text verschoben oder gelöscht
    und sogar einige bilder wurden entfernt :/

  • [IMG:https://dl.dropbox.com/u/10932…TutExp./Banner/Banner.png

    [IMG:https://dl.dropbox.com/u/10932…xp./Banner/Hidesprite.png]


    Hidesprite lässt eine Person verschwinden, Showsprite wieder erscheinen.
    Hidesprite wird oft in Verbindung mit einer setflag 0xXXX gebracht, weil man so Personen
    dauerhaft verschwinden lassen kann.


    Nun, ich mache wie immer ein Beispielchen.


    Code
    1. #dynamic 0xSuchoffset
    2. #org @starteroffset
    3. msgbox @text
    4. callstd 6
    5. hidesprite 0xPERSONENNUMMER
    6. ....


    Personennummer? Kennen wir das nicht aus Applymovement? Genau! In AM klickt ihr auf eure Person
    und lest das Folgende ab..



    Die umringelte Nummer lest ihr ab.
    Demnach hat unsere Person die Nummer 1.
    Wenn wir diese Person verschwinden lassen wollen, schreiben wir also..


    Code
    1. hidesprite 0x1


    Und wenn ihr sie wieder wollt..


    Code
    1. showsprite 0x1


    Nun geht ihr aber einen Schritt und die Person ist wieder da?!
    Um sie dauerhaft verschwinden zu lassen, ist eine Flag vonnöten.


    Code
    1. setflag 0xEureFlag


    Und diese Flag tragen wir bei Personen-ID ein.



    Und das Endscript schaut dann so aus.
    ...



    Ich hoffe ihr verstehts, wenn nicht, dann PN an mich :)



    [IMG:https://dl.dropbox.com/u/10932…TutExp./Banner/addvar.png]


    Nun, Addvar und Subvar braucht man jetzt nicht unbedingt für irgendwelche Standardsachen im Spiel.
    Aber für Minispiele, Quiz und andere spezielle Anwendungen unverzichtbar.
    Addvar bzw. Subvar bedeutet, dass man etwas zu einer var dazuzählt oder im Fall von Subvar abzieht.


    Ist der Wert von Variable "0x4005" 0, so wird im Falle von "addvar 0x4005 0x1" diese Var den Wert 1 haben.
    (mathematik erste klasse grundschule 0 + 1 = 1)


    Code
    1. setvar 0x5000 0x0 -> Setzt eine Var mit wert 0
    2. addvar 0x5000 0x1 -> ich zähle eins zu var 0x5000 hinzu.
    3. ...
    4. compare 0x5000 0x1 -> überprüft, ob der wert der var 5000 eins ist
    5. if 0x1 goto @pointer -> wenn er wirklich eins ist, gehe zu dem entsprechenden Pointer


    Wenn ihr also jetzt ein Quiz macht und überprüfen wollt, wie viele Fragen richtig sind..


    Wenn eine Frage falsch beantwortet wurde kann man auch subvar verwenden als Strafe xD



    [IMG:https://dl.dropbox.com/u/10932…xp./Banner/movesprite.png

    Ach, wieder ein einfaches Thema für euch (oder auch nicht)
    Hierbei braucht man wieder Personennummern aber auch Koordinaten..
    Fangen wir mal grundsätzlich an.


    Code
    1. movesprite 0xPerson 0xX-Koordinate 0xY-Koordinate


    Also die Person, haben wir schon im Hidesprite-Showsprite Kapitel kennengelernt.
    Kommen wir gleich zu den Koordinaten.
    Öffnet AdvanceMap und macht ein Mouseover zu der Stelle, wo ihr die Person haben wollt. ->



    Ich wähle zb diesen Grasblock aus.
    Nun senkt ihr euren Blick gaaanz hinunter wo RomSprache, Romversion etc steht..



    Dort seht ihr in meinem Fall 0x0E als X-Koordinate und 0x02 als Y-Koordinate.
    Wenn ihr nun die Person 1 dorthin verschieben wollt..


    Code
    1. movesprite 0x1 0xE 0x2


    Das wars im Prinzip :)



    [IMG:https://dl.dropbox.com/u/10932…utExp./Banner/special.png]


    Das ist wieder ein bisschen Erklärungsarbeit.
    Es gibt zwei arten von Specials:


    • special 0xNummer
    • special2 0xVar 0xNummer

    Special2 ist nichts anderes, als dass sie den Wert im RAM speichert, der bei diesem Special geschrieben wird.
    Nehmen wir als Beispiel: Trainerbattle

    Code
    1. special2 0x3456 0x39
    2. compare 0x3456 0x1
    3. if 0x1 goto @pointer


    Hier wird der Wert von dem Special 0x39 in die Variable 0x3456 gespeichert.
    Man kann sie natürlich mit compare 0xVar 0xWert_von_Special überprüfen, etc etc (;
    Fürs heilen verwendet man zb. Special 0x0
    Fürs speichern Special 0x5B.
    Es gibt auch Pokemonspecials die die Nummer der Pokemon im Pokedex oder im Team abfragen!
    Dazu aber mehr in den Anwendungsbeispielen ganz unten.

    Nene, ASM selber erklär ich euch heute nicht in einem Scripting Tutorial.

    Sehr wohl aber wie man costum ASM codes "abspielt".

    Code
    1. callasm 0xPointer_zum_ASM_Code

    Habt ihr also einen ASM Code am Offset 0x800000 gespeichert, schreibt ihr das auch hin.

    Aber die Sache hat einen kleinen Haken.

    Coded ihr in der ARM-Sprache, könnt ihr getrost 0x800000 hinklatschen.

    Habt ihr aber in .thumb gecoded, müsst ihr eins dazuzählen. ->

    Code
    1. callasm 0x800001 -> 800000 + 1 = 800001 - erste klasse grundschule (:


    Zum schluss noch ein "waitstate" falls der ASM-Code länger dauert oder was spezielles durchführt.



    [IMG:https://dl.dropbox.com/u/10932…gTutExp./Banner/warps.png]


    Warps sind auch eher ein leichtes Thema.
    Warp Befehle können abhängig ihrer Funktion aufgebaut werden.
    Die zwei Grundtypen sind:


    • Warp auf ein Warpfeld***
    • Warp auf eine bestimmte Position

    (***Ihr müsst in AM die warpnummer ablesen, dazu später mehr)


    Nun, wenn ihr einen Warp auf ein Warpfeld machen wollt müsst ihr in AM gehen, auf das gewollte Warpfeld
    klicken und die Nummer ablesen.
    Wollte ihr aber auf eine bestimmte Position, müsst ihr HIER die Koordinaten ablesen.
    Wie vermutet, sind die Befehle anders aufgebaut.
    Die erste Variante verbraucht weniger Bytes, lässt aber weniger Spielraum.



    Es gibt auch warp2, warp3, warpteleport, warphole uvm.
    warpwalk zb macht einen Geheffekt.
    warpteleport lässt einen teleportieren
    warphole lässt einen durch das spielfeld fallen
    ...

    Endlich wieder ein gutes Thema! :D

    Multichoices sind so aufgebaut:

    Code
    1. multichoice 0xX-Koo 0xY-Koo 0xmultichoicenummer 0xB-drücken für abbrechen

    Also da hätten wir die X und Y Koordinate der Box, dann der Index, spich die nummer des multichoice und zum

    Schluss, ob man B drücken darf um abzubrechen. (0x0 = Man darf 0x1 = Man darf nicht)

    Nehmen wir zb. die koordinaten (0|0), so erscheint unsere Box oben rechts.

    Aber wie prüfen wir, was wir ausgewählt haben?

    Code
    1. multichoice 0x0 0x0 0x3C 0x1compare LASTRESULT 0x0if 0x1 goto @pointer1compare LASTRESULT 0x1if 0x1 goto @pointer2... usw

    Wie viele compare LASTRESULTs ihr macht, hängt von den Auswahlmöglichkeiten ab.

    Macht ihr zb ein multichoice mit 3 Möglichkeiten, so schreibt ihr..

    Code
    1. compare LASTRESULT 0x0 -> überprüft, ob du die erste Auswahl gewählt hast
    2. if 0x1 goto @pointer1compare LASTRESULT 0x1 -> überprüft, ob du die zweite Auswahl gewählt hastif 0x1 goto @pointer2compare LASTRESULT 0x2 -> überprüft, ob du die dritte Auswahl gewählt hast
    3. if 0x1 goto @pointer3...

    Dafür gibt es auch genug Anwendungen, dazu aber im nächsten Kapitel.

    Achtung! Ab hier müsst ihr alles, was ihr verwendet, vercrediten.

    Das heißt ihr gebt "Laz0r - Scripts" als Credit in eure Creditliste :)

    Minispiele

    So, fangen wir mit einem einfachen Münzspiel an.



    Ich werde evtl später noch welche hinzufügen, allerdings sind andere Anwendungen wichtiger und haben daher Vorrang :)



    Getplayerposition


    Getplayerposition ermittelt deine Koordinaten auf der Map und speichert sie in die gegebenen Variablen.


    Code
    1. getplayerpos 0x8004 0x8005


    Wobei die X Koordinate immer in die erste Variable gespeichert wird, und die Y in die zweite.
    Eine wichtige Anwendung ist die Platzsparerei.
    Wenn ihr z.b 2 Scriptfelder nebeneinander habt, wobei sich der Zweck nur ein bisschen abweicht, ist das sehr nützlich.
    Mal angenommen ihr befindet euch auf (E|9).. X = E
    Daneben ist ein Scriptfeld (D|9) , welches man auch betreten kann.
    Dann wendet ihr getplayerpos an.



    Wie ihr seht, wird auf dem Scriptfeld neben euch ein anderer Text ausgeführt.
    Allerdings ist das Applymovement danach wieder zusammen bei allen beiden :)
    Wenn ihr nun kompiliert, fügt bei BEIDEN Feldern das GLEICHE Offset ein! ;)
    (Platzsparen auf 1337-Art héhé)


    Heilung der Pokémon


    Keine Erklärungen, ich gebe euch einfach ein Script D:



    Etwas bezahlen


    Wenn ihr mal nen Schwarzmarkt wollt, wo man nur eine Sache kaufen kann, ist das sehr nützlich.



    Soviel zum schönen Geld.


    Attacken außerhalb des Kampfes


    Naja.. das wird wohl die meisten interessieren.
    Das kommt aber später, da ich jetzt gehen muss. :)

  • Gfe du beklagst dich , dass ich ihn meinen Tuts angeblich zu "arrogant" rüberkomme, wobei ich von dir
    schon Sachen gelesen habe, die weitaus schlimmer waren (siehe Pokemon Revolution Thread)
    und dann willst du nen 2 Teil plötzlich
    Also bitte spam hier nicht rum und schick mir wenn ne PN.


    An alle anderen: Wahrscheinlich am WE

  • Zitat

    Kleine Anmerkung zum pokemart: Wenn man Items mit einer ID > 0xFF
    anbietet, dann muss die Tabelle mit den Items word aligned sein, sprich
    der offset muss eben durch 2 teilbar sein, ansonsten schmiert das Spiel
    ab, wenn man den Markt öffnet.


    Wegen Desinteresse seitens der User wird das Tutorial nicht mehr weitergeführt, daher ist es wayne.

  • [IMG:https://dl.dropbox.com/u/10932…TutExp./Banner/Banner.png

    [IMG:https://dl.dropbox.com/u/10932…xp./Banner/Hidesprite.png]


    Hidesprite lässt eine Person verschwinden, Showsprite wieder erscheinen.
    Hidesprite wird oft in Verbindung mit einer setflag 0xXXX gebracht, weil man so Personen
    dauerhaft verschwinden lassen kann.


    Nun, ich mache wie immer ein Beispielchen.


    Code
    1. #dynamic 0xSuchoffset
    2. #org @starteroffset
    3. msgbox @text
    4. callstd 6
    5. hidesprite 0xPERSONENNUMMER
    6. ....


    Personennummer? Kennen wir das nicht aus Applymovement? Genau! In AM klickt ihr auf eure Person
    und lest das Folgende ab..



    Die umringelte Nummer lest ihr ab.
    Demnach hat unsere Person die Nummer 1.
    Wenn wir diese Person verschwinden lassen wollen, schreiben wir also..


    Code
    1. hidesprite 0x1


    Und wenn ihr sie wieder wollt..


    Code
    1. showsprite 0x1


    Nun geht ihr aber einen Schritt und die Person ist wieder da?!
    Um sie dauerhaft verschwinden zu lassen, ist eine Flag vonnöten.


    Code
    1. setflag 0xEureFlag


    Und diese Flag tragen wir bei Personen-ID ein.



    Und das Endscript schaut dann so aus.
    ...



    Ich hoffe ihr verstehts, wenn nicht, dann PN an mich :)



    [IMG:https://dl.dropbox.com/u/10932…TutExp./Banner/addvar.png]


    Nun, Addvar und Subvar braucht man jetzt nicht unbedingt für irgendwelche Standardsachen im Spiel.
    Aber für Minispiele, Quiz und andere spezielle Anwendungen unverzichtbar.
    Addvar bzw. Subvar bedeutet, dass man etwas zu einer var dazuzählt oder im Fall von Subvar abzieht.


    Ist der Wert von Variable "0x4005" 0, so wird im Falle von "addvar 0x4005 0x1" diese Var den Wert 1 haben.
    (mathematik erste klasse grundschule 0 + 1 = 1)


    Code
    1. setvar 0x5000 0x0 -> Setzt eine Var mit wert 0
    2. addvar 0x5000 0x1 -> ich zähle eins zu var 0x5000 hinzu.
    3. ...
    4. compare 0x5000 0x1 -> überprüft, ob der wert der var 5000 eins ist
    5. if 0x1 goto @pointer -> wenn er wirklich eins ist, gehe zu dem entsprechenden Pointer


    Wenn ihr also jetzt ein Quiz macht und überprüfen wollt, wie viele Fragen richtig sind..


    Wenn eine Frage falsch beantwortet wurde kann man auch subvar verwenden als Strafe xD



    [IMG:https://dl.dropbox.com/u/10932…xp./Banner/movesprite.png

    Ach, wieder ein einfaches Thema für euch (oder auch nicht)
    Hierbei braucht man wieder Personennummern aber auch Koordinaten..
    Fangen wir mal grundsätzlich an.


    Code
    1. movesprite 0xPerson 0xX-Koordinate 0xY-Koordinate


    Also die Person, haben wir schon im Hidesprite-Showsprite Kapitel kennengelernt.
    Kommen wir gleich zu den Koordinaten.
    Öffnet AdvanceMap und macht ein Mouseover zu der Stelle, wo ihr die Person haben wollt. ->



    Ich wähle zb diesen Grasblock aus.
    Nun senkt ihr euren Blick gaaanz hinunter wo RomSprache, Romversion etc steht..



    Dort seht ihr in meinem Fall 0x0E als X-Koordinate und 0x02 als Y-Koordinate.
    Wenn ihr nun die Person 1 dorthin verschieben wollt..


    Code
    1. movesprite 0x1 0xE 0x2


    Das wars im Prinzip :)



    [IMG:https://dl.dropbox.com/u/10932…utExp./Banner/special.png]


    Das ist wieder ein bisschen Erklärungsarbeit.
    Es gibt zwei arten von Specials:


    • special 0xNummer
    • special2 0xVar 0xNummer

    Special2 ist nichts anderes, als dass sie den Wert im RAM speichert, der bei diesem Special geschrieben wird.
    Nehmen wir als Beispiel: Trainerbattle

    Code
    1. special2 0x3456 0x39
    2. compare 0x3456 0x1
    3. if 0x1 goto @pointer


    Hier wird der Wert von dem Special 0x39 in die Variable 0x3456 gespeichert.
    Man kann sie natürlich mit compare 0xVar 0xWert_von_Special überprüfen, etc etc (;
    Fürs heilen verwendet man zb. Special 0x0
    Fürs speichern Special 0x5B.
    Es gibt auch Pokemonspecials die die Nummer der Pokemon im Pokedex oder im Team abfragen!
    Dazu aber mehr in den Anwendungsbeispielen ganz unten.

    Nene, ASM selber erklär ich euch heute nicht in einem Scripting Tutorial.

    Sehr wohl aber wie man costum ASM codes "abspielt".

    Code
    1. callasm 0xPointer_zum_ASM_Code

    Habt ihr also einen ASM Code am Offset 0x800000 gespeichert, schreibt ihr das auch hin.

    Aber die Sache hat einen kleinen Haken.

    Coded ihr in der ARM-Sprache, könnt ihr getrost 0x800000 hinklatschen.

    Habt ihr aber in .thumb gecoded, müsst ihr eins dazuzählen. ->

    Code
    1. callasm 0x800001 -> 800000 + 1 = 800001 - erste klasse grundschule (:


    Zum schluss noch ein "waitstate" falls der ASM-Code länger dauert oder was spezielles durchführt.



    [IMG:https://dl.dropbox.com/u/10932…gTutExp./Banner/warps.png]


    Warps sind auch eher ein leichtes Thema.
    Warp Befehle können abhängig ihrer Funktion aufgebaut werden.
    Die zwei Grundtypen sind:


    • Warp auf ein Warpfeld***
    • Warp auf eine bestimmte Position

    (***Ihr müsst in AM die warpnummer ablesen, dazu später mehr)


    Nun, wenn ihr einen Warp auf ein Warpfeld machen wollt müsst ihr in AM gehen, auf das gewollte Warpfeld
    klicken und die Nummer ablesen.
    Wollte ihr aber auf eine bestimmte Position, müsst ihr HIER die Koordinaten ablesen.
    Wie vermutet, sind die Befehle anders aufgebaut.
    Die erste Variante verbraucht weniger Bytes, lässt aber weniger Spielraum.



    Es gibt auch warp2, warp3, warpteleport, warphole uvm.
    warpwalk zb macht einen Geheffekt.
    warpteleport lässt einen teleportieren
    warphole lässt einen durch das spielfeld fallen
    ...

    Endlich wieder ein gutes Thema! :D

    Multichoices sind so aufgebaut:

    Code
    1. multichoice 0xX-Koo 0xY-Koo 0xmultichoicenummer 0xB-drücken für abbrechen

    Also da hätten wir die X und Y Koordinate der Box, dann der Index, spich die nummer des multichoice und zum

    Schluss, ob man B drücken darf um abzubrechen. (0x0 = Man darf 0x1 = Man darf nicht)

    Nehmen wir zb. die koordinaten (0|0), so erscheint unsere Box oben rechts.

    Aber wie prüfen wir, was wir ausgewählt haben?

    Code
    1. multichoice 0x0 0x0 0x3C 0x1compare LASTRESULT 0x0if 0x1 goto @pointer1compare LASTRESULT 0x1if 0x1 goto @pointer2... usw

    Wie viele compare LASTRESULTs ihr macht, hängt von den Auswahlmöglichkeiten ab.

    Macht ihr zb ein multichoice mit 3 Möglichkeiten, so schreibt ihr..

    Code
    1. compare LASTRESULT 0x0 -> überprüft, ob du die erste Auswahl gewählt hast
    2. if 0x1 goto @pointer1compare LASTRESULT 0x1 -> überprüft, ob du die zweite Auswahl gewählt hastif 0x1 goto @pointer2compare LASTRESULT 0x2 -> überprüft, ob du die dritte Auswahl gewählt hast
    3. if 0x1 goto @pointer3...

    Dafür gibt es auch genug Anwendungen, dazu aber im nächsten Kapitel.

    Achtung! Ab hier müsst ihr alles, was ihr verwendet, vercrediten.

    Das heißt ihr gebt "Laz0r - Scripts" als Credit in eure Creditliste :)

    Minispiele

    So, fangen wir mit einem einfachen Münzspiel an.



    Ich werde evtl später noch welche hinzufügen, allerdings sind andere Anwendungen wichtiger und haben daher Vorrang :)



    Getplayerposition


    Getplayerposition ermittelt deine Koordinaten auf der Map und speichert sie in die gegebenen Variablen.


    Code
    1. getplayerpos 0x8004 0x8005


    Wobei die X Koordinate immer in die erste Variable gespeichert wird, und die Y in die zweite.
    Eine wichtige Anwendung ist die Platzsparerei.
    Wenn ihr z.b 2 Scriptfelder nebeneinander habt, wobei sich der Zweck nur ein bisschen abweicht, ist das sehr nützlich.
    Mal angenommen ihr befindet euch auf (E|9).. X = E
    Daneben ist ein Scriptfeld (D|9) , welches man auch betreten kann.
    Dann wendet ihr getplayerpos an.



    Wie ihr seht, wird auf dem Scriptfeld neben euch ein anderer Text ausgeführt.
    Allerdings ist das Applymovement danach wieder zusammen bei allen beiden :)
    Wenn ihr nun kompiliert, fügt bei BEIDEN Feldern das GLEICHE Offset ein! ;)
    (Platzsparen auf 1337-Art héhé)


    Heilung der Pokémon


    Keine Erklärungen, ich gebe euch einfach ein Script D:



    Etwas bezahlen


    Wenn ihr mal nen Schwarzmarkt wollt, wo man nur eine Sache kaufen kann, ist das sehr nützlich.



    Soviel zum schönen Geld.


    Attacken außerhalb des Kampfes


    Naja.. das wird wohl die meisten interessieren.
    Das kommt aber später, da ich jetzt gehen muss. :)

  • Das könntest du entweder über den OW lösen in dem du 2 Frames machst und dann per Applymovement die Bewegung änderst oder übers Tileset mit 2 Kleinen Frames die du dann über setmaptile wechselst. Ich empfehle aber Variante eins.


    Achja, schön gemacht, aber den Heilscript der kannst du nicht als deinen nehmen. Mein Script ist vom Aufbau her der selbe, da das heilen oftmals in verbindung mit einem Ja/Nein Befehl steht. Das ist wie wenn du ein Kochbuch kaufst und darin steht ein Rezept für Marmelade. Du machst die Marmelade und sagst, das jeder der die Marmelade auch macht, "von Lazor" draufschreiben muss. Weisst du was ich meine?

  • es wäre gut wenn du mal das verwendete Script hier postest, dann können wir dir auch besser helfen, sonst müssen wir Vermutungen aufstellen und bis wir dann die Lösung finden kann es etwas dauern daher poste einfach mal das Script.;)


    Mfg Ra369

  • Ich habe eine geschrieben. Zu finden im Inhaltsverzeichnis unter Listen.


    Übrigens, für die, die das hier noch lesen: Ihr baucht kein special, wenn ihr einen setmaptile (02) Levelscript schreibt. Das Neuladen passiert ja praktisch beim Betreten.