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






      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Laz0r () aus folgendem Grund: text umgeändert

    • Die Grundlagen
      Vorwissen

      In XSE beginnt man zuallererst mit dem befehl

      Quellcode

      1. #dynamic 0xoffset

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

      Quellcode

      1. dynamic 0x800000

      eingebe, dann sucht mir XSE von dort weg freien

      Platz.
      Direkt nach dem #dynamic kommt..

      Quellcode

      1. #org @pointer

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

      Quellcode

      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.

      Spoiler anzeigen

      Quellcode

      1. msgbox @pointer
      2. callstd 0x6


      oder

      Quellcode

      1. msgbox @pointer 0x6


      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.

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. msgbox @text1
      4. callstd 6


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

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. msgbox @text1
      4. callstd 6
      5. end
      6. #org @text1
      7. = Hallo, ich heiße Laz0r.


      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.

      Quellcode

      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.

      Quellcode

      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:
      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 6
      7. release
      8. end
      9. #org @text1
      10. = Hi.
      Alles anzeigen

      Es gibt btw einige "callstd" Befehle, hier eine Liste dazu.
      Spoiler anzeigen
      1. callstd 0x6 Normale Textbox

      2. callstd 0x5 Eine Ja/Nein Box / dazu später mehr

      3. callstd 0x4 Dieser Befehl sorgt dafür, dass erst

      nachdem eine Taste gedrückt wird, das Script weitergeführt wird.

      4. callstd 0x3 Signpost

      5. callstd 0x2 ersetzt lock und faceplayer


      1.01 Ja/Nein Box
      Eine Ja oder Nein Box.
      Diese ist so auszulösen:
      Spoiler anzeigen

      Quellcode

      1. msgbox @text
      2. callstd 0x5

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

      Quellcode

      1. msgbox @text
      2. callstd 0x5
      3. compare LASTRESULT 0x1 (prüft ob der player "JA" geklickt hat)
      4. if 0x1 (Wenn er echt JA gedrückt hat) goto @pointer (gehe zu pointer)
      5. würde da if 0x0 stehen, heißt dass, das er NICHT ja gedrückt hat.

      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.
      Spoiler anzeigen
      giveitem 0xItemnummer 0xAnzahl 0x0 0x0 0x0

      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..
      Spoiler anzeigen
      giveitem 0xD 0x5 0x0 0x0 0x0
      waitfanfare

      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:
      Spoiler anzeigen
      giveitem 0xD 0x5 0x0 0x0 0x0
      waitfanfare
      setflag 0x500

      Toll, wir haben eine flag 0x500 gesetzt. Wie überprüfen wir die?
      Am besten gleich nach dem #org @start macht ihr..
      Spoiler anzeigen
      #dynamic 0x800000
      #org @start
      checkflag 0xEure Flag (in dem Fall 0x500)
      if 0x1 goto @pointer (wenn sie gesetzt wurde (0x1)
      gehe zu pointer. 0x0 wäre wenn sie NICHT gesetzt ist.)

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

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. checkflag 0x500
      6. if b_true goto @habschon
      7. msgbox @text1
      8. callstd 6
      9. giveitem 0xD 0x5 0x0 0x0 0x0
      10. waitfanfare
      11. setflag 0x500
      12. release
      13. end
      14. #org @text1
      15. = Ich gebe dir einen Trank.
      16. #org @habschon
      17. msgbox @text2
      18. callstd 6
      19. release
      20. end
      21. #org @text2
      22. = Du hast schon einen Trank!
      Alles anzeigen

      Und wie versprochen, jetzt die Itemliste (:
      Spoiler anzeigen
      MEISTERBALL 0x1

      HYPERBALL 0x2

      SUPERBALL 0x3

      POKEBALL 0x4

      SAFARIBALL 0x5

      NETZBALL 0x6

      TAUCHBALL 0x7

      NESTBALL 0x8

      WIEDERBALL 0x9

      TIMERBALL 0xA

      LUXUSBALL 0xB

      PREMIERBALL 0xC

      TRANK 0xD

      GEGENGIFT 0xE

      FEUERHEILER 0xF

      EISHEILER 0x10

      AUFWECKER 0x11

      PARA-HEILER 0x12

      TOP-GENESUNG 0x13

      TOP-TRANK 0x14

      HYPERTRANK 0x15

      SUPERTRANK 0x16

      HYPERHEILER 0x17

      BELEBER 0x18

      TOP-BELEBER 0x19

      TAFELWASSER 0x1A

      SPRUDEL 0x1B

      LIMONADE 0x1C

      KUHMUH-MILCH 0x1D

      ENERGIESTAUB 0x1E

      KRAFTWURZEL 0x1F

      HEILPUDER 0x20

      VITALKRAUT 0x21

      ÄTHER 0x22

      TOP-ÄTHER 0x23

      ELIXIeR 0x24

      TOP-ELIXIER 0x25

      LAVAKEKS 0x26

      BLAUE FLÖTE 0x27

      GELBE FLÖTE 0x28

      ROTE FLÖTE 0x29

      SCHWARZE FLÖTE 0x2A

      WEISSE FLÖTE 0x2B

      BEERENSAFT 0x2C

      ZAUBERASCHE 0x2D

      KÜSTENSALZ 0x2E

      KÜSTENSCHALE 0x2F

      PURPURSTÜCK 0x30

      INDIGOSTÜCK 0x31

      GELBSTÜCK 0x32

      GRÜNSTÜCK 0x33

      ? en:HENTAIMAG 0x34

      ? en:NAMETAG 0x35

      KP-PLUS 0x3F

      PROTEIN 0x40

      EISEN 0x41

      CARBON 0x42

      KALZIUM 0x43

      SONDERBONBON 0x44

      AP-PLUS 0x45

      ZINK 0x46

      AP-TOP 0x47

      MEGABLOCK 0x49

      ANGRIFFPLUS 0x4A

      X-ANGRIFF 0x4B

      X-ABWEHR 0x4C

      X-TEMPO 0x4D

      X-TREFFER 0x4E

      X-SPEZIAL 0x4F

      POKEPUPPE 0x50

      ENECO-RUTE 0x51

      SUPERSCHUTZ 0x53

      TOP-SCHUTZ 0x54

      FLUCHTSEIL 0x55

      SCHUTZ 0x56

      SONNENSTEIN 0x5D

      MONDSTEIN 0x5E

      FEUERSTEIN 0x5F

      DONNERSTEIN 0x60

      WASSERSTEIN 0x61

      BLATTSTEIN 0x62

      MINIPILZ 0x67

      RIESENPILZ 0x68

      PERLE 0x6A

      RIESENPERLE 0x6B

      STERNENSTAUB 0x6C

      STERNENSTÜCK 0x6D

      NUGGET 0x6E

      HERZSCHUPPE 0x6F

      ZIGZAGBRIEF 0x79

      HAFENBRIEF 0x7A

      GLITZERBRIEF 0x7B

      EILBRIEF 0x7C

      WALDBRIEF 0x7D

      WELLENBRIEF 0x7E

      PERLENBRIEF 0x7F

      DUNKELBRIEF 0x80

      TROPENBRIEF 0x81

      TRAUMBRIEF 0x82

      EDELBRIEF 0x83

      RETROBRIEF 0x84
      CHERRY 0x85

      CHESTNUT 0x86

      PEACH 0x87

      FRAGIABEERE 0x88

      WILBIRBEERE 0x89

      JONAGOBEERE 0x8A

      ORANGE 0x8B

      PERSIMBEERE 0x8C

      PRUNUSBEERE 0x8D

      CITRUS 0x8E

      GIEFEBEERE 0x8F

      KIWIBEERE 0x90

      MANGOBEERE 0x91

      GAUVEBEERE 0x92

      YAPABEERE 0x93

      HIMMIHBEERE 0x94

      MORBBEERE 0x95

      BANANA 0x96

      NIRBEBEERE 0x97

      INEAPPLE 0x98

      POMEGRANIT 0x99

      SETANGBEERE 0x9A

      QUALOTBEERE 0x9B

      HONEYDEW 0x9C

      GRAPE 0x9D
      TOMATO 0x9E

      SAIMBEERE 0x9F

      MAGOSTBEERE 0xA0

      RABUTABEERE 0xA1

      LEMON 0xA2

      KIWANBEERE 0xA3

      PALLMBEERE 0xA4

      WATERMELON 0xA5

      DURINBEERE 0xA6

      MYRTILBEERE 0xA7

      LICHEE 0xA8

      LIGANBEERE 0xA9

      SALKABEERE 0xAA

      TAHAYBEERE 0xAB

      APRICOT 0xAC

      LANSATBEERE 0xAD

      KRAMBOBEERE 0xAE

      ENIGMABEERE 0xAF

      BLENDPUDER 0xB3

      SCHLOHKRAUT 0xB4

      MACHOBAND 0xB5

      EP-TEILER 0xB6

      FLINKKLAUE 0xB7

      SOOTHEBELL 0xB8

      MENTALKRAUT 0xB9

      WAHLBAND 0xBA

      KING-STEIN 0xBB

      SILBERSTAUB 0xBC

      MÜNZAMULETT 0xBD

      SCHUTZBAND 0xBE

      SEELENTAU 0xBF

      ABYSSZAHN 0xC0

      ABYSSPLATTE 0xC1

      RAUCHBALL 0xC2

      EWIGSTEIN 0xC3

      FOKUS-BAND 0xC4

      GLÜCKS-EI 0xC5

      SCOPE-LINSE 0xC6

      METALLMANTEL 0xC7

      ÜBERRESTE 0xC8

      DRACHENHAUT 0xC9

      KUGELBLITZ 0xCA

      PUDERSAND 0xCB

      GRANITSTEIN 0xCC

      WUNDERSAAT 0xCD

      SCHATTENGLAS 0xCE

      SCHWARZGUT 0xCF

      MAGNET 0xD0

      ZAUBERWASSER 0xD1

      HACKATTAKE 0xD2

      GIFTSTICH 0xD3

      EWIGES EIS 0xD4

      BANNSTICKER 0xD5

      KRÜMMLÖFFEL 0xD6

      HOLZKOHLE 0xD7

      DRACHENZAHN 0xD8

      SEIDENSCHAL 0xD9

      UPGRADE 0xDA

      SEEGESANG 0xDB

      SEERAUCH 0xDC

      LAXRAUCH 0xDD

      LUCKYPUNCH 0xDE

      METALLSTAUB 0xDF

      KAMPFKNOCHEN 0xE0

      LAUCHSTANGE 0xE1

      ROTER SCHAL 0xFE

      BLAUER SCHAL 0xFF

      ROSA SCHAL 0x100

      GRÜNER SCHAL 0x101

      GELBER SCHAL 0x102

      EILRAD 0x103

      MÜNZKORP 0x104

      DETEKTOR 0x105

      ANGEL 0x106

      PROFIANGEL 0x107

      SUPERANGEL 0x108

      BOOTSTICKET 0x109

      WETTBEWERB-KARTE 0x10A

      SHIGGYKANNE 0x10C

      AMULETT 0x10D

      ASCHETASCHE 0x10E

      KELLERÖFFNER 0x10F

      KUNSTRAD 0x110

      POKERIEGEL BOX 0x111

      BRIEF 0x112

      ÄON-TICKET 0x113

      ROTE KUGEL 0x114

      BLAUE KUGEL 0x115

      SCANNER 0x116

      WÜSTENGLAS 0x117

      METEORIT 0x118

      K1-SCHLÜSSEL 0x119

      K2-SCHLÜSSEL 0x11A

      K4-SCHLÜSSEL 0x11B

      K6-SCHLÜSSEL 0x11C

      L-SCHLÜSSEL 0x11D

      WURZELFOSSIL 0x11E

      KLAUENFOSSIL 0x11F

      DEVON-SCOPE 0x120

      TM01 0x121

      TM02 0x122

      TM03 0x123

      TM04 0x124

      TM05 0x125

      TM06 0x126

      TM07 0x127

      TM08 0x128

      TM09 0x129

      TM10 0x12A

      TM11 0x12B

      TM12 0x12C

      TM13 0x12D

      TM14 0x12E

      TM15 0x12F

      TM16 0x130

      TM17 0x131

      TM18 0x132

      TM19 0x133

      TM20 0x134

      TM21 0x135

      TM22 0x136

      TM23 0x137

      TM24 0x138

      TM25 0x139

      TM26 0x13A

      TM27 0x13B

      TM28 0x13C

      TM29 0x13D

      TM30 0x13E

      TM31 0x13F

      TM32 0x140

      TM33 0x141

      TM34 0x142

      TM35 0x143

      TM36 0x144

      TM37 0x145

      TM38 0x146

      TM39 0x147

      TM40 0x148

      TM41 0x149

      TM42 0x14A

      TM43 0x14B

      TM44 0x14C

      TM45 0x14D

      TM46 0x14E

      TM47 0x14F

      TM48 0x150

      TM49 0x151

      TM50 0x152

      VM01 0x153

      VM02 0x154

      VM03 0x155

      VM04 0x156

      VM05 0x157

      VM06 0x158

      VM07 0x159

      VM08 0x15A


      Givepokemon

      Givepokemon funktioniert ähnlich:

      Quellcode

      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ß?
      Spoiler anzeigen

      Quellcode

      1. fanfare 0x13E
      2. msgbox @geben
      3. callstd 0x4
      4. givepokemon 0x1 0x5 0xD 0x0 0x0 0x0
      5. waitfanfare
      6. closeonkeypress
      7. end
      8. #org @geben
      9. = [player] hat ein blabla erhalten.

      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.

      Quellcode

      1. pause 0xA..

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

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. playsong 0x12C 'spielt eine Musik ab.
      6. msgbox @text
      7. callstd 6
      8. pause 0x60 'lässt die Musik für ein paar Sekunden.
      9. fadedefault 'kehrt zur normalen Musik zurück.
      10. release
      11. end
      12. #org @text
      13. = Das ist die Alabastia Musik.
      Alles anzeigen



      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:

      Quellcode

      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:

      Quellcode

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

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

      Quellcode

      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:

      Quellcode

      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:

      Spoiler anzeigen

      Quellcode

      1. Face Down 0x00
      2. Face Up 0x01
      3. Face Left 0x02
      4. Face Right 0x03
      5. Step Down (Very Slow) 0x08
      6. Step Up (Very Slow) 0x09
      7. Step Left (Very Slow) 0x0A
      8. Step Right (Very Slow) 0x0B
      9. Step Down (Slow) 0x0C
      10. Step Up (Slow) 0x0D
      11. Step Left (Slow) 0x0E
      12. Step Right (Slow) 0x0F
      13. Step Down (Normal) 0x10
      14. Step Up (Normal) 0x11
      15. Step Left (Normal) 0x12
      16. Step Right (Normal) 0x13
      17. Jump Down 2 Squares 0x14
      18. Jump Up 2 Squares 0x15
      19. Jump Left 2 Squares 0x16
      20. Jump Right 2 Squares 0x17
      21. Step Down (Fast) 0x1D
      22. Step Up (Fast) 0x1E
      23. Step Left (Fast) 0x1F
      24. Step Right (Fast) 0x20
      25. Step on the Spot Down 0x21
      26. Step on the Spot Up 0x22
      27. Step on the Spot Left 0x23
      28. Step on the Spot Right 0x24
      29. Step on the Spot Down (Fast) 0x25
      30. Step on the Spot Up (Fast) 0x26
      31. Step on the Spot Left (Fast) 0x27
      32. Step on the Spot Right (Fast) 0x28
      33. Step on the Spot Down (Very Fast) 0x29
      34. Step on the Spot Up (Very Fast) 0x2A
      35. Step on the Spot Left (Very Fast) 0x2B
      36. Step on the Spot Right (Very Fast) 0x2C
      37. Face Down (Non-Instant) 0x2D
      38. Face Up (Non-Instant) 0x2E
      39. Face Left (Non-Instant) 0x2F
      40. Face Right (Non-Instant) 0x30
      41. Slide Down 0x31
      42. Slide Up 0x32
      43. Slide Left 0x33
      44. Slide Right 0x34
      45. Slide Down On Right Foot 0x3D
      46. Slide Up On Right Foot 0x3E
      47. Slide Left On Right Foot 0x3F
      48. Slide Right On Right Foot 0x40
      49. Slide Down On Left Foot 0x41
      50. Slide Up On Left Foot 0x42
      51. Slide Left On Left Foot 0x43
      52. Slide Right On Left Foot 0x44
      53. Face Player 0x4A
      54. Face Away from Player 0x4B
      55. Jump Down 1 Square 0x4E
      56. Jump Up 1 Square 0x4F
      57. Jump Left 1 Square 0x50
      58. Jump Right 1 Square 0x51
      59. Jump in Place (Facing Down) 0x52
      60. Jump in Place (Facing Up) 0x53
      61. Jump in Place (Facing Left) 0x54
      62. Jump in Place (Facing Right) 0x55
      63. Jump in Place (Facing Down->Up) 0x56
      64. Jump in Place (Facing Up->Down) 0x57
      65. Jump in Place (Facing Left->Right) 0x58
      66. Jump in Place (Facing Right->Left) 0x59
      67. Disappear 0x60
      68. Reappear 0x61
      69. "!" box popup 0x62
      70. "?" box popup 0x63
      71. "X" box popup 0x64
      72. "!!" box popup 0x65
      73. "^_^" box popup 0x66
      Alles anzeigen


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

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. applymovement 0x1 @move1 'lässt Person nummer 1 gehen
      6. waitmovement 0x0 'wartet bis Person 1 die Bewegung abgeschlossen hat
      7. msgbox @text1
      8. callstd 6
      9. release
      10. end
      11. #org @text1
      12. = Boah, hast du mich erschreckt!
      13. #org @move1
      14. #raw 0x62 0xFE 'lässt ein Rufzeichen über der Person erscheinen
      Alles anzeigen

      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.

      Quellcode

      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:

      Quellcode

      1. setmaptile 0x00 0x1D 0xBlocknummer
      2. 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:

      Quellcode

      1. setmaptile 0x00 0x1D 0x56 0x0

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

      Quellcode

      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!

      Quellcode

      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:

      Quellcode

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


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

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. checkflag 0x501
      4. if 0x1 goto @setzen
      5. end
      6. #org @setzen
      7. setmaptile 0x00 0x1D 0x56 0x0
      8. special 0x8E
      9. end

      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:

      Quellcode

      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:

      Quellcode

      1. pokemarkt @pointer

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

      Quellcode

      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:
      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 6
      7. pokemart @markt
      8. release
      9. end
      10. #org @markt
      11. #raw word 0x1
      12. #raw word 0x2
      13. #raw word 0xD
      14. #raw word 0x0
      15. #org @text1
      16. = Hallo!
      Alles anzeigen


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

      Quellcode

      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 :/

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Laz0r ()

    • Expertentutorial + Anwendungsbeispiele




      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.

      Quellcode

      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..

      Quellcode

      1. hidesprite 0x1


      Und wenn ihr sie wieder wollt..

      Quellcode

      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.

      Quellcode

      1. setflag 0xEureFlag


      Und diese Flag tragen wir bei Personen-ID ein.



      Und das Endscript schaut dann so aus.
      ...

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. msgbox @text
      6. callstd 6
      7. hidesprite 0x1
      8. setflag 0x500
      9. release
      10. end
      11. #org @text
      12. = Ich schleich mich jetzt!
      Alles anzeigen


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




      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)

      Quellcode

      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..
      Spoiler anzeigen

      Quellcode

      1. ....
      2. setvar 0x5000 0x0 -> setzt var 0x5000 auf 0
      3. msgbox @frage1 -> öffnet eine msgbox
      4. callstd 5 -> callstd 5 gibt an, dass es eine JA/NEIN box ist.
      5. compare LASTRESULT 0x1 -> überprüft ob "JA" gedrückt wurde.
      6. if 0x1 call @addvar -> Wenn JA (die antwort auf die frage) stimmt, dann gehe zu addvar
      7. ....
      8. #org @addvar
      9. addvar 0x5000 0x1 -> macht den wert der var um eins höher also von null auf eins.
      10. return -> Wenn ihr ein CALL gesetzt habt, könnt ihr mit diesem command zum call zurückkehren -> platzsparen
      11. ...
      12. compare 0x5000 0x1 -> überprüft, ob var 5000 den wert 1 bekommen hat.
      13. if 0x1 goto @win -> hat sie den wert 1, so gehe zum pointer der dir ein item oder sonst einen preis gibt ;)
      14. ...
      Alles anzeigen


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



      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.

      Quellcode

      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..

      Quellcode

      1. movesprite 0x1 0xE 0x2


      Das wars im Prinzip :)




      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

      Quellcode

      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".

      Quellcode

      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. ->

      Quellcode

      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.




      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.
      erste variante

      Quellcode

      1. warp 0xBank 0xMap 0xWarpnummer

      zweite variante

      Quellcode

      1. warp 0xBank 0xMap 0xFF (für den Player) 0xX-Koo 0xY-Koo

      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:

      Quellcode

      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?

      Quellcode

      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..

      Quellcode

      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.

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 6
      7. showmoney 0x0 0x0 0x0
      8. lock
      9. faceplayer
      10. msgbox @text2
      11. callstd 5
      12. compare LASTRESULT 0x1
      13. if 0x1 goto @zocken
      14. call @ne
      15. #org @ne
      16. lock
      17. faceplayer
      18. msgbox @text3
      19. callstd 6
      20. release
      21. end
      22. #org @zocken
      23. lock
      24. faceplayer
      25. checkmoney 100 0x0
      26. if 0x0 goto @armersack
      27. paymoney 100 0x0
      28. updatemoney 0x0 0x0 0x0
      29. sound 0x23
      30. checksound
      31. hidemoney 0x0 0x0
      32. call @münz
      33. goto @lol
      34. #org @lol
      35. lock
      36. faceplayer
      37. showmoney 0x0 0x0 0x0
      38. msgbox @text5
      39. callstd 5
      40. compare LASTRESULT 0x1
      41. if 0x0 goto @ne
      42. checkmoney 100 0x0
      43. if 0x0 goto @armersack
      44. paymoney 100 0x0
      45. updatemoney 0x0 0x0 0x0
      46. sound 0x23
      47. checksound
      48. pause 0x10
      49. hidemoney 0x0 0x0
      50. goto @münz
      51. #org @münz
      52. lock
      53. faceplayer
      54. msgbox @text8
      55. callstd 5
      56. compare LASTRESULT 0x1
      57. if 0x1 goto @kopf
      58. random 0x2
      59. compare LASTRESULT 0x0
      60. if 0x1 goto @win
      61. compare LASTRESULT 0x1
      62. if 0x1 goto @loo
      63. end
      64. #org @loo
      65. lock
      66. faceplayer
      67. msgbox @te
      68. callstd 6
      69. goto @lol
      70. #org @te
      71. = Du hast leider verloren..
      72. #org @win
      73. lock
      74. faceplayer
      75. msgbox @t
      76. callstd 6
      77. givemoney 200 0x0
      78. sound 0x23
      79. checksound
      80. pause 0x10
      81. goto @lol
      82. #org @t
      83. = Du hast gewonnen!\n200 [$] Gewinn!
      84. #org @kopf
      85. lock
      86. faceplayer
      87. random 0x2
      88. compare LASTRESULT 0x0
      89. if 0x1 goto @win
      90. compare LASTRESULT 0x1
      91. if 0x1 goto @loo
      92. end
      93. #org @text8
      94. = Was nimmst du?\nKlicke JA für Kopf und NEIN für\lZahl!
      95. #org @text5
      96. = Willst du weiterspielen?
      97. #org @armersack
      98. hidemoney 0x0 0x0
      99. msgbox @text4
      100. callstd 6
      101. release
      102. end
      103. #org @text4
      104. = Du hast nicht genug Geld!
      105. #org @text3
      106. = Dann halt nicht..
      107. #org @text2
      108. = Eine Runde kostet 100 [$]!\nWillst du spielen?
      109. #org @text1
      110. = Hallo. Willst zu zocken?\nIch werfe eine Münze und du sagst\lobs Kopf oder Zahl ist.\lEs ist also ein reines Glückspiel!
      Alles anzeigen


      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.

      Quellcode

      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.

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. getplayerpos 0x8004 0x8005
      4. compare 0x8004 0xE
      5. if b_true call @scriptfeld1
      6. compare 0x8004 0xD
      7. if b_true call @scriptfeld2
      8. call @zusammen
      9. #org @scriptfeld1
      10. msgbox @text1
      11. callstd 6
      12. return
      13. #org @scriptfeld2
      14. msgbox @text2
      15. callstd 6
      16. return
      17. #org @zusammen
      18. applymovement 0x1 @m1
      19. waitmovement 0x0
      20. end
      Alles anzeigen


      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:

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @lol
      6. callstd 5
      7. compare LASTRESULT 0x1
      8. if 0x1 call @heilen
      9. end
      10. #org @heilen
      11. special 0x0
      12. fadescreen 1
      13. fanfare 0x100
      14. waitfanfare
      15. fadescreen 0
      16. msgbox @lol2
      17. callstd 6
      18. return
      19. #org @lol
      20. = Hallo [player]!\nSoll ich deine Pokémon heilen?
      21. #org @lol2
      22. = Deine Pokémon sind wieder topfit.\nKomm bald wieder!
      Alles anzeigen


      Etwas bezahlen

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

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 5
      7. compare LASTRESULT 0x1
      8. if 0x1 call @buy
      9. end
      10. #org @end
      11. msgbox @text2
      12. callstd 6
      13. end
      14. #org @text2
      15. = Du hast nicht genug Geld!!
      16. #org @buy
      17. checkmoney 300 0x0
      18. if 0x0 goto @end
      19. paymoney 300 0x0
      20. giveitem 0xItem 0xAmount 0x0 0x0 0x0
      21. waitfanfare
      22. return
      23. #org @text1
      24. = Willst du eine Kuh-Muh Milch?\nEine frische Flasche kostet 300[$]!
      Alles anzeigen


      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. :)

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Laz0r ()

    • Hm, steht ja schon mal ein wenig drinne ;). Bisher würde ich immer noch auf das alte XSE-Tut verweisen, mal sehen, wie der Expertenteil wird :D. Ich weiß ja nicht, wie du das auftrennen magst ;).



    • 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.

      Quellcode

      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..

      Quellcode

      1. hidesprite 0x1


      Und wenn ihr sie wieder wollt..

      Quellcode

      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.

      Quellcode

      1. setflag 0xEureFlag


      Und diese Flag tragen wir bei Personen-ID ein.



      Und das Endscript schaut dann so aus.
      ...

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. msgbox @text
      6. callstd 6
      7. hidesprite 0x1
      8. setflag 0x500
      9. release
      10. end
      11. #org @text
      12. = Ich schleich mich jetzt!
      Alles anzeigen


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




      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)

      Quellcode

      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..
      Spoiler anzeigen

      Quellcode

      1. ....
      2. setvar 0x5000 0x0 -> setzt var 0x5000 auf 0
      3. msgbox @frage1 -> öffnet eine msgbox
      4. callstd 5 -> callstd 5 gibt an, dass es eine JA/NEIN box ist.
      5. compare LASTRESULT 0x1 -> überprüft ob "JA" gedrückt wurde.
      6. if 0x1 call @addvar -> Wenn JA (die antwort auf die frage) stimmt, dann gehe zu addvar
      7. ....
      8. #org @addvar
      9. addvar 0x5000 0x1 -> macht den wert der var um eins höher also von null auf eins.
      10. return -> Wenn ihr ein CALL gesetzt habt, könnt ihr mit diesem command zum call zurückkehren -> platzsparen
      11. ...
      12. compare 0x5000 0x1 -> überprüft, ob var 5000 den wert 1 bekommen hat.
      13. if 0x1 goto @win -> hat sie den wert 1, so gehe zum pointer der dir ein item oder sonst einen preis gibt ;)
      14. ...
      Alles anzeigen


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



      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.

      Quellcode

      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..

      Quellcode

      1. movesprite 0x1 0xE 0x2


      Das wars im Prinzip :)




      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

      Quellcode

      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".

      Quellcode

      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. ->

      Quellcode

      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.




      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.
      erste variante

      Quellcode

      1. warp 0xBank 0xMap 0xWarpnummer

      zweite variante

      Quellcode

      1. warp 0xBank 0xMap 0xFF (für den Player) 0xX-Koo 0xY-Koo

      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:

      Quellcode

      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?

      Quellcode

      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..

      Quellcode

      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.

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @start
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 6
      7. showmoney 0x0 0x0 0x0
      8. lock
      9. faceplayer
      10. msgbox @text2
      11. callstd 5
      12. compare LASTRESULT 0x1
      13. if 0x1 goto @zocken
      14. call @ne
      15. #org @ne
      16. lock
      17. faceplayer
      18. msgbox @text3
      19. callstd 6
      20. release
      21. end
      22. #org @zocken
      23. lock
      24. faceplayer
      25. checkmoney 100 0x0
      26. if 0x0 goto @armersack
      27. paymoney 100 0x0
      28. updatemoney 0x0 0x0 0x0
      29. sound 0x23
      30. checksound
      31. hidemoney 0x0 0x0
      32. call @münz
      33. goto @lol
      34. #org @lol
      35. lock
      36. faceplayer
      37. showmoney 0x0 0x0 0x0
      38. msgbox @text5
      39. callstd 5
      40. compare LASTRESULT 0x1
      41. if 0x0 goto @ne
      42. checkmoney 100 0x0
      43. if 0x0 goto @armersack
      44. paymoney 100 0x0
      45. updatemoney 0x0 0x0 0x0
      46. sound 0x23
      47. checksound
      48. pause 0x10
      49. hidemoney 0x0 0x0
      50. goto @münz
      51. #org @münz
      52. lock
      53. faceplayer
      54. msgbox @text8
      55. callstd 5
      56. compare LASTRESULT 0x1
      57. if 0x1 goto @kopf
      58. random 0x2
      59. compare LASTRESULT 0x0
      60. if 0x1 goto @win
      61. compare LASTRESULT 0x1
      62. if 0x1 goto @loo
      63. end
      64. #org @loo
      65. lock
      66. faceplayer
      67. msgbox @te
      68. callstd 6
      69. goto @lol
      70. #org @te
      71. = Du hast leider verloren..
      72. #org @win
      73. lock
      74. faceplayer
      75. msgbox @t
      76. callstd 6
      77. givemoney 200 0x0
      78. sound 0x23
      79. checksound
      80. pause 0x10
      81. goto @lol
      82. #org @t
      83. = Du hast gewonnen!\n200 [$] Gewinn!
      84. #org @kopf
      85. lock
      86. faceplayer
      87. random 0x2
      88. compare LASTRESULT 0x0
      89. if 0x1 goto @win
      90. compare LASTRESULT 0x1
      91. if 0x1 goto @loo
      92. end
      93. #org @text8
      94. = Was nimmst du?\nKlicke JA für Kopf und NEIN für\lZahl!
      95. #org @text5
      96. = Willst du weiterspielen?
      97. #org @armersack
      98. hidemoney 0x0 0x0
      99. msgbox @text4
      100. callstd 6
      101. release
      102. end
      103. #org @text4
      104. = Du hast nicht genug Geld!
      105. #org @text3
      106. = Dann halt nicht..
      107. #org @text2
      108. = Eine Runde kostet 100 [$]!\nWillst du spielen?
      109. #org @text1
      110. = Hallo. Willst zu zocken?\nIch werfe eine Münze und du sagst\lobs Kopf oder Zahl ist.\lEs ist also ein reines Glückspiel!
      Alles anzeigen


      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.

      Quellcode

      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.

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. getplayerpos 0x8004 0x8005
      4. compare 0x8004 0xE
      5. if b_true call @scriptfeld1
      6. compare 0x8004 0xD
      7. if b_true call @scriptfeld2
      8. call @zusammen
      9. #org @scriptfeld1
      10. msgbox @text1
      11. callstd 6
      12. return
      13. #org @scriptfeld2
      14. msgbox @text2
      15. callstd 6
      16. return
      17. #org @zusammen
      18. applymovement 0x1 @m1
      19. waitmovement 0x0
      20. end
      Alles anzeigen


      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:

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @lol
      6. callstd 5
      7. compare LASTRESULT 0x1
      8. if 0x1 call @heilen
      9. end
      10. #org @heilen
      11. special 0x0
      12. fadescreen 1
      13. fanfare 0x100
      14. waitfanfare
      15. fadescreen 0
      16. msgbox @lol2
      17. callstd 6
      18. return
      19. #org @lol
      20. = Hallo [player]!\nSoll ich deine Pokémon heilen?
      21. #org @lol2
      22. = Deine Pokémon sind wieder topfit.\nKomm bald wieder!
      Alles anzeigen


      Etwas bezahlen

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

      Spoiler anzeigen

      Quellcode

      1. #dynamic 0x800000
      2. #org @main
      3. lock
      4. faceplayer
      5. msgbox @text1
      6. callstd 5
      7. compare LASTRESULT 0x1
      8. if 0x1 call @buy
      9. end
      10. #org @end
      11. msgbox @text2
      12. callstd 6
      13. end
      14. #org @text2
      15. = Du hast nicht genug Geld!!
      16. #org @buy
      17. checkmoney 300 0x0
      18. if 0x0 goto @end
      19. paymoney 300 0x0
      20. giveitem 0xItem 0xAmount 0x0 0x0 0x0
      21. waitfanfare
      22. return
      23. #org @text1
      24. = Willst du eine Kuh-Muh Milch?\nEine frische Flasche kostet 300[$]!
      Alles anzeigen


      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?
      Das waren noch Zeiten...

      ...

      Wodka schrieb:

      Wodka - 3. Oktober 2012

      Ich spüre seinen Atem in meinem Nacken o.O!

      PEDODAD!