Erstellen eines Save/Load Systems (alt)

[contentad]

Erstellen eines Save/Load Systems (alt)


zum Anfang


Einleitung

Hinweis: Wir haben mittlerweile ein neueres und besseres Tutorial zu diesem Thema: Save/Load-SystemTutorial von Alien@System

In den folgenden Zeilen beschreibe ich ein mögliches Grundgerüst, auf dem ein Save-/Load-System mit code in einer Multiplayer-Map aufgebaut werden kann.
Außerdem beschränke ich mich auf das speichern von Heros.
Mein Grundgrüst kommt vollständig ohne JASS aus.
Es werden gewisse Mathematik- und Trigger-Kenntnisse vorausgesetzt


zum Anfang


Kapitel I


Zuerst müssen 3
trigger geschrieben werden, in denen je einer Variable (Numbers[73],
Numbers_sp[73] und Heros [1-73]) in allen Array-Werten von 0 bis 72 ein Zeichen
bzw. ein HeroTyp zugeordnet wird. Diese Trigger sind für mein Basisgerüst
unbedingt benötigt und wichtig. Nur der Hero-Trigger kann weggelassen werden,
sofern kein hero gespeichert werden soll.
Die beiden ‚Set Numbers‘-trigger weisen einem bestimmten Zeichen einen Wert zu.
So kann ein Zeichen in dem späteren code für eine Zahl von 0 bis 72 stehen. Was
in der Variablen SetNumbers[x] gespeichert wird, muss auch in der Variablen
SetNumers_sp[x] genauso sein, nur ohne die Farbe (|cff…)

XSet Numbers
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Numbers[0] = |cff32cd32Z|r
XXXSet Numbers[1] = |cff87ceeb8|r
XXXSet Numbers[2] = |cff87ceeb2|r
XXX<…>
XXXSet Numbers[72] = |cff32cd32g|r

Dieser trigger ist für die Ausgabe des Codes (deswegen
auch die Farbe).
Es können auch weniger verschiedene Zeichen für den code verwendet werden
(z.B.:36 (Großbuchstaben und 0-9)), allerdings können dann auch nur ‚kleinere‘
Werte gespeichert werden.
In diesem Fall werden alle Groß- und Kleinbuchstaben, die Zahlen von 0-9 sowie
einige Sonderzeichen verwendet (%,$,�,…)

XSet Numbers sp
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Numbers_sp[0] = 8
XXXSet Numbers_sp[1] = Z
XXXSet Numbers_sp[2] = 2
XXX<…>
XXXSet Numbers_sp[72] = g

Dieser Zusatz-trigger ist für die Eingabe des Codes
erforderlich (Der trigger „Set Numbers“ kann dafür nicht verwendet werden, da
natürlich nicht ‚|cffffcc00_|r‘ sondern einfach nur die Ziffer eingegeben wird)

XSet Heros
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Hero_typ[0] = Feuerlord
XXXSet Hero_typ[1] = Alchimist
XXXSet Hero_typ[2] = Paladin
XXX<…>

Hier werden alle verschiedenen Hero-Typen in einer
Variablen gespeichert (von der Anzahl der Helden hängt auch die Größe des Arrays
der Variable ‚Hero_typ‘ ab)

XSet Items
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Item_typ[0] = Heiltrank
XXXSet Item_typ[1] = Manatrank
XXXSet Item_typ[2] = Großer Heiltrank
XXX<…>

Dieser Trigger ist nur benötigt, falls die Items, die der
Held trägt, gespeichert werden sollen.

———————————————————————————-

═══>Jedes Zeichen im Code hat einen Wert zwischen 0 und 72.
═══>Die Indizes im Array stehen dabei für den Zahlenwert und

═══>Das Zeichen das der Variablen zugewiesen wird repräsentiert
═══>diesen Wert. So ist es möglich das Buchstaben im code ver-
═══>wendet werden.

———————————————————————————-


zum Anfang


Kapitel II


Danach überlegt man
sich, was überhaupt in dem code gespeichert werden soll.

Mögliche Punkte:

  • Hero-Typ
  • Gold
  • Holz
  • Exp (des Heros)
  • Items (des Heros)
  • beliebige weitere Punkte […]


zum Anfang

Kapitel III


Als drittes müssen
bestimmte Formeln gefunden werden, mit denen die ganzen Sachen verschlüsselt
werden.
Hier 4 Beispiele:
Speichert Werte bis max. 72
→a

Speichert Werte bis max. 5184

→a*b±c
|| . .d . . . . . . . . . . . . . . . . . .(dieser Buchstabe zeigt ob ‚+‘ oder
‚-‚ gerechnet wird)
Speichert Werte bis max. 26’873’856
→ (a*b±c)*(e*f±g)±(i*j±k)
|| . . . d . . . . .h . m . . l. . . . . (diese Buchstaben zeigen ob ‚+‘ oder
‚-‚ gerechnet wird)
Speichert Werte bis max. ???‘???‘???
→0 1 2 1 2 1 2 1 0 2 =

||8 Z

2 Z
2 Z
2 Z

8 2 <-Verschlüsselung
Hierbei wird jede Ziffer einzeln verschlüsselt.

Bei den oberen Formeln gehe ich von einem Array der Größe 73 der Variablen
Numbers bzw. Numbers_sp aus

-Der Sinn dieser Formeln ist einzig die Verschlüsselung einer Zahl.
-Dabei soll beim entschlüsseln der Zahl genau das Ergebnis des Terms diese Zahl
sein.
-Die Anzahl der Variablen in dem Term ergibt die Anzahl der Ziffern in dem Code
(nur die Variablen, die Zeigen ob ‚+‘ oder ‚-‚ gerechnet werden muss, können
zusammengefasst werden, aber dazu komme ich später noch)
-Jede Ziffer in der Formel darf maximal der Größe des Arrays von der Variablen
Numbers bzw. Numbers_sp haben.




zum Anfang


Kapitel IV


So richtig
kompliziert wirds erst jetzt, denn jetzt müssen die Zahlen (exp, gold, holz,
etc.) in die Terme und damit einzelnen Variablen zerteilt werden.
1.Beispiel
Dieses Beispiel braucht nur eine Stelle im code, der nacher ausgegeben wird, ist
aber auch nicht zum speichern von größeren Werten geeignet (wie z.B.: Exp, Gold,
Hopz).

Mit dieser ‚Formel‘ (ist eigentlich gar keine) kann aber z.B. ein Item, das der
Hero trägt, gespeichert werden oder vor allem der Typ des Helden. Es können

<Größe des Arrays von Numbers[ ]> verschiedene Heros auf der Map vorkommen,
sofern diese ‚Formel‘ für das Speichern des Heros verwendet wird (also in meinem
Beispiel 72 versch. Heros).
2.Beispiel
Diese Formel ist auch noch nicht zum Speichern von größeren Werten geeignet,
aber wohl um Items im code zu verschlüsseln.
Großer Nachteil: Zwar können mit dieser Formel mehrere verschiedene Items
gespeichert werden als in der 1.Formel, allerdingsbraucht diese 3 Stellen mehr
(pro Item!). Das macht dann insgesamt 24 (!!!) Stellen allein für die 6 Items.
Dafür können aber auch 5184 Verschiedene auf der Map vorkommen…
*
3.Beispiel
Diese Formel habe ich in meinem Save-/Load-System (siehe Signatur) für Gold, Exp
und bald auch Holz verwendet. Allerdings ist es „nicht ganz einfach“ eine Zahl
in die einzelnen Variablen dieser Formel zu zerlegen. **

4.Beispiel

Das 4.Verfahren ist eine Zerlegung der Zahl in ihre einzelnen Ziffern, die dann
einzeln verschlüsselt und hintereinander in dem code ausgegeben werden (Diese
Methode ist mir gerade erst eingefallen, habe ich daher auch nicht in meinem
System verwendet ->Braucht weniger Stellen, ist leichter zu programmieren, halte
ich aber für viel leichter zu Entschlüsseln als die 3.Methode)
***


zum Anfang


Kapitel V


Die drei markierten
Punkte (* ** ***) werde ich jetzt noch anhand von
Beispielen im Triggereditor erklären.

In dem folgenden Beispiel gehe ich davon aus, dass sich jemand viel Mühe gegeben
hat und 5184 Items erstellt hat
(da so alle Möglichkeiten bearbeitet werden).
a*b±c = Item_typ[Item carried by hero[PlayerNumber of (TriggeringPlayer)] in
Slot 1]
Wi teilt man nun den Wert der Variablen Item_typ in die Variablen a,b,c und d
auf?
In dem im nächsten Trigger stehendem Verfahren wird die
Aufspaltung einer Schleife in mehrere kleinere Schleifen vorgenommen.

Lösung:
 

XXIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
XX+XIf – Conditions

XXXXXItem_typ_nr Less than or equal to 1728

XX+XThen – Actions

XXX+XFor each (Integer A) from 0 to 24, do (Actions)

XXXX+XLoop – Actions

XXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXX+XIf – Conditions

XXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_type_nr))) Less than or equal to 72

XXXXXXXX+XThen – Actions

XXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXElse – Actions

XX+XElse – Actions

XXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXX+XIf – Conditions

XXXXXXXItem_typ_nr Less than or equal to 3456

XXXX+XThen – Actions

XXXXX+XFor each (Integer A) from 24 to 48, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXXXX+XLoop – Actions

XXXXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXXXX+XIf – Conditions

XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to 72

XXXXXXXXXX+XThen – Actions

XXXXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXXXElse – Actions

XXXX+XElse – Actions

XXXXX+XFor each (Integer A) from 48 to 72, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXXXX+XLoop – Actions

XXXXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXXXX+XIf – Conditions

XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to 72

XXXXXXXXXX+XThen – Actions

XXXXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXXXElse – Actions


Der nächste trigger speichert die so ermittelten Werte
für a,b,c und d mit den entsprechenden repräsentierenden Zeichen in der
Variablen Save_string

 

XSave_string setting (1)
XXEvents
XXConditions
+XActions

XXXSet Save_string = <empty string>
XXXSet Save_string = (Save_string + Numbers[A])
XXXSet Save_string = (Save_string + Numbers[B])
XXXSet Save_string = (Save_string + Numbers[C])
XXXSet Save_string = (Save_string + Numbers[D])

**
Diese Verschlüsselung basiert auf der 1. von mir beschriebenen Methode. Genauere
Erklärungen wie der Trigger dazu aufgebaut ist spare ich mir hier an dieser
Stelle, da ich sonst hier nie fertig werden würde… – Wer trotz
fehlgeschlagenen Versuchen (waren bei mir etliche) eine Lösung dafür haben will, der soll sich mein 1. Save-/Load-System
runterladen (siehe Signatur).

***

Dieses letzte System werde ich wieder etwas ausführlicher erklären. Zuersteinmal
muss eine Zahl (z.B.:135724) in ihre Bestandteile zerlegt werden (also
1,3,5,6,2,4), was per trigger ein mehr oder weniger aufwendiges Verfahren wird.
 

XXSet <Var>[9] = (<zahl> – (<zahl> modulo 100’000’000)) / 100’000’000 //ermittelt die neunte Stelle einer Zahl
XXSet <zahl> = <zahl> – (<Var>[9] * 100’000’000) //Zahl ist jetzt nur noch 8-stellig (damit man beim nächsten Schritt keine 2-stellige Zahl als Ergebnis erhalten kann)
XXSet <Var>[8] = (<zahl – (<zahl> modulo 10’000’000)) / 10’000’000 // usw.
XX[…]


Natürlich kann man auch die <zahl> erst in einen String
umwandeln, dann mit der Aktion Substring die einzelnen Werte voneinander
isolieren und schließlich alles wieder in eine Integer-Zahl umwandel

 

XSave_string setting (2)
XXEvents
XXConditions
+XActions

XXXSet Save_string = (Save_string + Numbers[<Var>[9]])
XXXSet Save_string = (Save_string + -)
XXXSet Save_string = (Save_string + Numbers[<Var>[8]])
XXXSet Save_string = (Save_string + Numbers[<Var>[7]])
XXXSet Save_string = (Save_string + Numbers[<Var>[6]])
XXXSet Save_string = (Save_string + Numbers[<Var>[5]])
XXXSet Save_string = (Save_string + Numbers[<Var>[4]])
XXXSet Save_string = (Save_string + -)
XXXSet Save_string = (Save_string + Numbers[<Var>[3]])
XXXSet Save_string = (Save_string + Numbers[<Var>[2]])
XXXSet Save_string = (Save_string + Numbers[<Var>[1]])




zum Anfang


Schlusswort


Wie das ganze dann
wieder aus dem eingegebenen -load xxxxx-xxxxx-xxxxx-xxxxx-xxxxx String gelesen
wird, kommt hier später rein.

Wer jetzt schon genug von diesem Thema hat, aber trotzdem ein Save-/Load-System
haben will, kann sich hier ein Beispiel System herunterladen.
Auch zum vergleichen mit dem (evtl.) selbst erstellten System geeignet.

 



 Save-/Load-System

(Setzt keine JASS-Kenntnisse voraus)
Speichert:

Gold (bis 1’000’000), Exp (bis 26’873’856 ->lvl 733), Typ
(Bis max. 12 versch.), Holz (bis 1’000’000)

Items kommen noch
(mit code, Multiplayerfähig)

Bis jetzt 36-stelliger code
 

Nachtrag:
Die oben verlinkte map lässt sich nur mit dem WE Unlimited öffnen. Hier ist eine Version für den normalen Editor.

  • 28.07.2008 um 23:27
Jass Einführung (Mueslirocker) Eigene FadeFilter

Erstellen eines Save/Load Systems (alt)

Erstellen eines Save/Load Systems (alt)


zum Anfang


Einleitung

Hinweis: Wir haben mittlerweile ein neueres und besseres Tutorial zu diesem Thema: Save/Load-SystemTutorial von Alien@System

In den folgenden Zeilen beschreibe ich ein mögliches Grundgerüst, auf dem ein Save-/Load-System mit code in einer Multiplayer-Map aufgebaut werden kann.
Außerdem beschränke ich mich auf das speichern von Heros.
Mein Grundgrüst kommt vollständig ohne JASS aus.
Es werden gewisse Mathematik- und Trigger-Kenntnisse vorausgesetzt


zum Anfang


Kapitel I


Zuerst müssen 3
trigger geschrieben werden, in denen je einer Variable (Numbers[73],
Numbers_sp[73] und Heros [1-73]) in allen Array-Werten von 0 bis 72 ein Zeichen
bzw. ein HeroTyp zugeordnet wird. Diese Trigger sind für mein Basisgerüst
unbedingt benötigt und wichtig. Nur der Hero-Trigger kann weggelassen werden,
sofern kein hero gespeichert werden soll.
Die beiden ‚Set Numbers‘-trigger weisen einem bestimmten Zeichen einen Wert zu.
So kann ein Zeichen in dem späteren code für eine Zahl von 0 bis 72 stehen. Was
in der Variablen SetNumbers[x] gespeichert wird, muss auch in der Variablen
SetNumers_sp[x] genauso sein, nur ohne die Farbe (|cff…)

XSet Numbers
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Numbers[0] = |cff32cd32Z|r
XXXSet Numbers[1] = |cff87ceeb8|r
XXXSet Numbers[2] = |cff87ceeb2|r
XXX<…>
XXXSet Numbers[72] = |cff32cd32g|r

Dieser trigger ist für die Ausgabe des Codes (deswegen
auch die Farbe).
Es können auch weniger verschiedene Zeichen für den code verwendet werden
(z.B.:36 (Großbuchstaben und 0-9)), allerdings können dann auch nur ‚kleinere‘
Werte gespeichert werden.
In diesem Fall werden alle Groß- und Kleinbuchstaben, die Zahlen von 0-9 sowie
einige Sonderzeichen verwendet (%,$,�,…)

XSet Numbers sp
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Numbers_sp[0] = 8
XXXSet Numbers_sp[1] = Z
XXXSet Numbers_sp[2] = 2
XXX<…>
XXXSet Numbers_sp[72] = g

Dieser Zusatz-trigger ist für die Eingabe des Codes
erforderlich (Der trigger „Set Numbers“ kann dafür nicht verwendet werden, da
natürlich nicht ‚|cffffcc00_|r‘ sondern einfach nur die Ziffer eingegeben wird)

XSet Heros
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Hero_typ[0] = Feuerlord
XXXSet Hero_typ[1] = Alchimist
XXXSet Hero_typ[2] = Paladin
XXX<…>

Hier werden alle verschiedenen Hero-Typen in einer
Variablen gespeichert (von der Anzahl der Helden hängt auch die Größe des Arrays
der Variable ‚Hero_typ‘ ab)

XSet Items
+XEvents

XXXMap initialization

XXConditions
+XActions

XXXSet Item_typ[0] = Heiltrank
XXXSet Item_typ[1] = Manatrank
XXXSet Item_typ[2] = Großer Heiltrank
XXX<…>

Dieser Trigger ist nur benötigt, falls die Items, die der
Held trägt, gespeichert werden sollen.

———————————————————————————-

═══>Jedes Zeichen im Code hat einen Wert zwischen 0 und 72.
═══>Die Indizes im Array stehen dabei für den Zahlenwert und

═══>Das Zeichen das der Variablen zugewiesen wird repräsentiert
═══>diesen Wert. So ist es möglich das Buchstaben im code ver-
═══>wendet werden.

———————————————————————————-


zum Anfang


Kapitel II


Danach überlegt man
sich, was überhaupt in dem code gespeichert werden soll.

Mögliche Punkte:

  • Hero-Typ
  • Gold
  • Holz
  • Exp (des Heros)
  • Items (des Heros)
  • beliebige weitere Punkte […]


zum Anfang

Kapitel III


Als drittes müssen
bestimmte Formeln gefunden werden, mit denen die ganzen Sachen verschlüsselt
werden.
Hier 4 Beispiele:
Speichert Werte bis max. 72
→a

Speichert Werte bis max. 5184

→a*b±c
|| . .d . . . . . . . . . . . . . . . . . .(dieser Buchstabe zeigt ob ‚+‘ oder
‚-‚ gerechnet wird)
Speichert Werte bis max. 26’873’856
→ (a*b±c)*(e*f±g)±(i*j±k)
|| . . . d . . . . .h . m . . l. . . . . (diese Buchstaben zeigen ob ‚+‘ oder
‚-‚ gerechnet wird)
Speichert Werte bis max. ???‘???‘???
→0 1 2 1 2 1 2 1 0 2 =

||8 Z

2 Z
2 Z
2 Z

8 2 <-Verschlüsselung
Hierbei wird jede Ziffer einzeln verschlüsselt.

Bei den oberen Formeln gehe ich von einem Array der Größe 73 der Variablen
Numbers bzw. Numbers_sp aus

-Der Sinn dieser Formeln ist einzig die Verschlüsselung einer Zahl.
-Dabei soll beim entschlüsseln der Zahl genau das Ergebnis des Terms diese Zahl
sein.
-Die Anzahl der Variablen in dem Term ergibt die Anzahl der Ziffern in dem Code
(nur die Variablen, die Zeigen ob ‚+‘ oder ‚-‚ gerechnet werden muss, können
zusammengefasst werden, aber dazu komme ich später noch)
-Jede Ziffer in der Formel darf maximal der Größe des Arrays von der Variablen
Numbers bzw. Numbers_sp haben.




zum Anfang


Kapitel IV


So richtig
kompliziert wirds erst jetzt, denn jetzt müssen die Zahlen (exp, gold, holz,
etc.) in die Terme und damit einzelnen Variablen zerteilt werden.
1.Beispiel
Dieses Beispiel braucht nur eine Stelle im code, der nacher ausgegeben wird, ist
aber auch nicht zum speichern von größeren Werten geeignet (wie z.B.: Exp, Gold,
Hopz).

Mit dieser ‚Formel‘ (ist eigentlich gar keine) kann aber z.B. ein Item, das der
Hero trägt, gespeichert werden oder vor allem der Typ des Helden. Es können

<Größe des Arrays von Numbers[ ]> verschiedene Heros auf der Map vorkommen,
sofern diese ‚Formel‘ für das Speichern des Heros verwendet wird (also in meinem
Beispiel 72 versch. Heros).
2.Beispiel
Diese Formel ist auch noch nicht zum Speichern von größeren Werten geeignet,
aber wohl um Items im code zu verschlüsseln.
Großer Nachteil: Zwar können mit dieser Formel mehrere verschiedene Items
gespeichert werden als in der 1.Formel, allerdingsbraucht diese 3 Stellen mehr
(pro Item!). Das macht dann insgesamt 24 (!!!) Stellen allein für die 6 Items.
Dafür können aber auch 5184 Verschiedene auf der Map vorkommen…
*
3.Beispiel
Diese Formel habe ich in meinem Save-/Load-System (siehe Signatur) für Gold, Exp
und bald auch Holz verwendet. Allerdings ist es „nicht ganz einfach“ eine Zahl
in die einzelnen Variablen dieser Formel zu zerlegen. **

4.Beispiel

Das 4.Verfahren ist eine Zerlegung der Zahl in ihre einzelnen Ziffern, die dann
einzeln verschlüsselt und hintereinander in dem code ausgegeben werden (Diese
Methode ist mir gerade erst eingefallen, habe ich daher auch nicht in meinem
System verwendet ->Braucht weniger Stellen, ist leichter zu programmieren, halte
ich aber für viel leichter zu Entschlüsseln als die 3.Methode)
***


zum Anfang


Kapitel V


Die drei markierten
Punkte (* ** ***) werde ich jetzt noch anhand von
Beispielen im Triggereditor erklären.

In dem folgenden Beispiel gehe ich davon aus, dass sich jemand viel Mühe gegeben
hat und 5184 Items erstellt hat
(da so alle Möglichkeiten bearbeitet werden).
a*b±c = Item_typ[Item carried by hero[PlayerNumber of (TriggeringPlayer)] in
Slot 1]
Wi teilt man nun den Wert der Variablen Item_typ in die Variablen a,b,c und d
auf?
In dem im nächsten Trigger stehendem Verfahren wird die
Aufspaltung einer Schleife in mehrere kleinere Schleifen vorgenommen.

Lösung:
 

XXIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
XX+XIf – Conditions

XXXXXItem_typ_nr Less than or equal to 1728

XX+XThen – Actions

XXX+XFor each (Integer A) from 0 to 24, do (Actions)

XXXX+XLoop – Actions

XXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXX+XIf – Conditions

XXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_type_nr))) Less than or equal to 72

XXXXXXXX+XThen – Actions

XXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXElse – Actions

XX+XElse – Actions

XXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXX+XIf – Conditions

XXXXXXXItem_typ_nr Less than or equal to 3456

XXXX+XThen – Actions

XXXXX+XFor each (Integer A) from 24 to 48, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXXXX+XLoop – Actions

XXXXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXXXX+XIf – Conditions

XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to 72

XXXXXXXXXX+XThen – Actions

XXXXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXXXElse – Actions

XXXX+XElse – Actions

XXXXX+XFor each (Integer A) from 48 to 72, do (Actions)

XXXXXX+XLoop – Actions

XXXXXXX+XFor each (Integer B) from 0 to 72, do (Actions)

XXXXXXXX+XLoop – Actions

XXXXXXXXX+XIf (All Conditions are True) then do (Then Actions) else do (Else Actions)

XXXXXXXXXX+XIf – Conditions

XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to (Abs((((Integer A) x ((Integer B) + 1)) – Item_typ_nr)))
XXXXXXXXXXXXX(Abs((((Integer A) x (Integer B)) – Item_typ_nr))) Less than or equal to 72

XXXXXXXXXX+XThen – Actions

XXXXXXXXXXXXXSet A = (Integer A)
XXXXXXXXXXXXXSet B = (Integer B)
XXXXXXXXXXXXXSet C = ((A x B) – Item_typ_nr)
XXXXXXXXXXXXXIf (C Greater than or equal to 0) then do (Set D = 0) else do (Set D = 1)
XXXXXXXXXXXXXSet C = (Abs(C))

XXXXXXXXXXXXElse – Actions


Der nächste trigger speichert die so ermittelten Werte
für a,b,c und d mit den entsprechenden repräsentierenden Zeichen in der
Variablen Save_string

 

XSave_string setting (1)
XXEvents
XXConditions
+XActions

XXXSet Save_string = <empty string>
XXXSet Save_string = (Save_string + Numbers[A])
XXXSet Save_string = (Save_string + Numbers[B])
XXXSet Save_string = (Save_string + Numbers[C])
XXXSet Save_string = (Save_string + Numbers[D])

**
Diese Verschlüsselung basiert auf der 1. von mir beschriebenen Methode. Genauere
Erklärungen wie der Trigger dazu aufgebaut ist spare ich mir hier an dieser
Stelle, da ich sonst hier nie fertig werden würde… – Wer trotz
fehlgeschlagenen Versuchen (waren bei mir etliche) eine Lösung dafür haben will, der soll sich mein 1. Save-/Load-System
runterladen (siehe Signatur).

***

Dieses letzte System werde ich wieder etwas ausführlicher erklären. Zuersteinmal
muss eine Zahl (z.B.:135724) in ihre Bestandteile zerlegt werden (also
1,3,5,6,2,4), was per trigger ein mehr oder weniger aufwendiges Verfahren wird.
 

XXSet <Var>[9] = (<zahl> – (<zahl> modulo 100’000’000)) / 100’000’000 //ermittelt die neunte Stelle einer Zahl
XXSet <zahl> = <zahl> – (<Var>[9] * 100’000’000) //Zahl ist jetzt nur noch 8-stellig (damit man beim nächsten Schritt keine 2-stellige Zahl als Ergebnis erhalten kann)
XXSet <Var>[8] = (<zahl – (<zahl> modulo 10’000’000)) / 10’000’000 // usw.
XX[…]


Natürlich kann man auch die <zahl> erst in einen String
umwandeln, dann mit der Aktion Substring die einzelnen Werte voneinander
isolieren und schließlich alles wieder in eine Integer-Zahl umwandel

 

XSave_string setting (2)
XXEvents
XXConditions
+XActions

XXXSet Save_string = (Save_string + Numbers[<Var>[9]])
XXXSet Save_string = (Save_string + -)
XXXSet Save_string = (Save_string + Numbers[<Var>[8]])
XXXSet Save_string = (Save_string + Numbers[<Var>[7]])
XXXSet Save_string = (Save_string + Numbers[<Var>[6]])
XXXSet Save_string = (Save_string + Numbers[<Var>[5]])
XXXSet Save_string = (Save_string + Numbers[<Var>[4]])
XXXSet Save_string = (Save_string + -)
XXXSet Save_string = (Save_string + Numbers[<Var>[3]])
XXXSet Save_string = (Save_string + Numbers[<Var>[2]])
XXXSet Save_string = (Save_string + Numbers[<Var>[1]])




zum Anfang


Schlusswort


Wie das ganze dann
wieder aus dem eingegebenen -load xxxxx-xxxxx-xxxxx-xxxxx-xxxxx String gelesen
wird, kommt hier später rein.

Wer jetzt schon genug von diesem Thema hat, aber trotzdem ein Save-/Load-System
haben will, kann sich hier ein Beispiel System herunterladen.
Auch zum vergleichen mit dem (evtl.) selbst erstellten System geeignet.

 



 Save-/Load-System

(Setzt keine JASS-Kenntnisse voraus)
Speichert:

Gold (bis 1’000’000), Exp (bis 26’873’856 ->lvl 733), Typ
(Bis max. 12 versch.), Holz (bis 1’000’000)

Items kommen noch
(mit code, Multiplayerfähig)

Bis jetzt 36-stelliger code
 

Nachtrag:
Die oben verlinkte map lässt sich nur mit dem WE Unlimited öffnen. Hier ist eine Version für den normalen Editor.

  • 28.07.2008 um 21:27
Timer selber bauen Hero Selection
ingame Netzwerk
Call of Duty | Counter-Strike: Global Offensive | Diablo 3 | Dota 2 | League of Legends | Quake 3 | Heroes of the Storm | Unreal Tournament | Overwatch | Starcraft 2 | Torchlight 2 | Warcraft 3 | World of Warcraft | Hearthstone | Kino, TV, Film und Promis | Spiele Datenbank

Support | | AGB |
Online Werbung | Mediadaten | Unternehmen | Karriere | Impressum

© inwave media GmbH, ingame™ ist ein eingetragenes Markenzeichen der inwave media GmbH. Verwendung von Inhalten nur mit schriftlicher Genehmigung.

Design und Umsetzung: Jan Wagner Design