PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RM 2k3: Block-System funktioniert nicht richtig



Norpoleon
25.08.2015, 17:29
Ich wollte das Gameplay meines Spiels mit einem Block-System abrunden.

Der Code sieht so aus:

@> Key Input Processing: [0003], Wait
@> Show Animation: Player, [eheb shield]
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.1 seconds
@> Change HP: Entire Party, + 9000
@> Wait: 0.5 seconds
@> Change HP: Entire Party, - 9000
@> Wait: 0.1 seconds

Da gibt es nur leider das Problem, dass nach dem Blocken der Held bei der nächsten Berührung mit einem Gegner stirbt.
Könnt ihr mir da weiterhelfen? Was mache ich falsch?

Linkey
25.08.2015, 19:37
Ohne den Maker die letzten Jahre benutzt zu haben:
Dein Befehl heilt die Party um 9000 und verringert dann die HP um 9000. Wenn die Helden aber bspw. 500/2000 HP haben, heilst du sie auf 2000/2000 und setzt dann die HP auf 0 durch die -9000, wodurch diese sofort bei jeglicher Attacke sterben?

Corti
25.08.2015, 20:01
Man könnte auch blocken als das einbauen was es ist, das Abwenden von Schaden in dem blockenden Helden einfach kein Schaden zugefügt wird. Diese Methode hier ist schon ziemlich seltsam.

Norpoleon
26.08.2015, 06:08
Das ist ganz seltsam. Ich habe festgestellt, dass bei einer ungeraden Anzahl von Blockvorgängen die HP des Helden normal bleiben & bei einer geraden Anzahl auf 1 gesetzt werden.

Ich habe mich entschlossen bei dem Blockvorgang die HP des Helden zu verändern, weil ich ansonsten nach dem Blocken jede mögliche Höhe von Schaden einzeln wieder möglich machen müsste. Ich verwende das ABS von Kazesui.

Corti
26.08.2015, 08:39
Dein Schaden zufügen sollte ein CE sein. Und dort packst du eine Abfrage rein "wenn switch 'blockt_grad"=off, dann Schaden zufügen".

Drakee
27.08.2015, 19:52
Irgendwie steige ich ebenfalls nicht hinter die Logik deines Skripts. Wo ist denn das Problem, einfach vor dem Schaden eine Abfrage zu machen?

Die Berechnung von und das Abziehen durch Schaden sollte prinzipiell immer in einem Common Event stehen, lediglich die Parameter wie Stärke des Gegners z.B. sollte man vor dem Call-Befehl im Event einzeln in der dafür vorgesehenen Variable speichern. Und dann muss man so eine Anpassung wie das (nachträgliche) Implementieren einer Blocken-Möglichkeit auch diese Anpassung nur ein einziges Mal vornehmen und nicht in jedem einzelnen Event.

Wichtig ist es, um Aufwand möglichst weit einzudämmen, Funktionen, die global benutzt werden sollen, in die Common Events zu packen. Denn sonst hat man diese Funktion in jedem Event (in diesem Fall in jedem Gegner-Event) einzeln stehen und muss dann für 100 Gegner auch 100 mal die Funktion abändern. ;)

Norpoleon
28.08.2015, 11:21
Ich habe nun eine Möglichkeit gefunden, wie die HP des Helden nach dem Blocken nicht auf 1 gesetzt werden:

@> Key Input Processing: [0003], Wait
@> Show Animation: Player, [eheb shield]
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Change Parameters: Entire Party, MHP + 9000
@> Change HP: Entire Party, + 9000
@> Wait: 0.2 seconds
@> Change HP: Entire Party, - 9000
@> Change Parameters: Entire Party, MHP - 9000
@> Wait: 0.1 seconds

Norpoleon
28.08.2015, 15:21
Ich habe eine Möglichkeit gefunden, wie die HP des Helden nach dem Blocken nicht auf 1 gesetzt werden:

@> Key Input Processing: [0003], Wait
@> Show Animation: Player, [eheb shield]
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Change Parameters: Entire Party, MHP + 9000
@> Change HP: Entire Party, + 9000
@> Wait: 0.2 seconds
@> Change HP: Entire Party, - 9000
@> Change Parameters: Entire Party, MHP - 9000
@> Wait: 0.1 seconds

Norpoleon
29.08.2015, 16:15
Ich habe eine Möglichkeit gefunden, wie die HP des Helden nach dem Blocken nicht auf 1 gesetzt werden:

@> Key Input Processing: [0003], Wait
@> Show Animation: Player, [eheb shield]
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Change Parameters: Entire Party, MHP + 9000
@> Change HP: Entire Party, + 9000
@> Wait: 0.2 seconds
@> Change HP: Entire Party, - 9000
@> Change Parameters: Entire Party, MHP - 9000
@> Wait: 0.1 seconds

Drakee
29.08.2015, 17:28
Oh man, ich seh die Bugs schon vorprogrammiert ^-^

Norpoleon
29.08.2015, 18:10
Das Blocken funktioniert so eigentlich sehr gut.
Womit ich nur immer Maleste habe, sind die Item-Abfragen, die den Key-Inputs vorgelagert sind.
Diese stören, je höher die Anzahl der Abfragen ist, den Fluss des Gameplays dermaßen, sodass das Gameplay sehr unexakt & willkürlich wird. :/

Die Abfragen für die Schilde in meinem Game sehen so aus:

'Init Shield' (PP)
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Conditional Branch: Buckler in Inventory
@> Control Variables: [0001] = [Buckler] equipped
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Conditional Branch: Wood Shield in Inventory
@> Control Variables: [0001] = [Wood Shield] equipped
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Conditional Branch: Iron Shield in Inventory
@> Control Variables: [0001] = [Iron Shield] equipped
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Conditional Branch: Templar Shield in Inventory
@> Control Variables: [0001] = [Templar Shield] equipped
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Wait: 0.0 seconds
@> Conditional Branch: Hell-Templar Shield in Inventory
@> Control Variables: [0001] = [Hell-Templar Shield] equipped
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.1 seconds

Die Berechnungen dieser Item-Abfragen stören das Gameplay so stark, dass nur einer von ca. 7 Befehlen (Key-Inputs) umgesetzt werden.
Wie kann ich solche Berechnungen beschleunigen oder es dem Programm einfacher machen, diese zu lesen?

Drakee
29.08.2015, 18:40
Ich bin auch von diesem Code verwirrt. Kannst Du einfach mal dein ganzes Projekt iwo hochladen? xD

Corti
29.08.2015, 18:46
Beschleunigen? Keinen Mist programmieren;-)

Bei den Variable gibts die Möglichkeit zu lesen, welches Item ein Held auf bestimmtem Slot ausgerüstet hat.
0 = nix
>= 1 = irgendein Schild.

Problem gelöst in zwei Zeilen.

Kelven
29.08.2015, 19:04
Im Grunde brauchst du das ganze Event nicht. Du kannst die Abfrage auch dort hinpacken, wo du die Taste fürs Blocken abfragst.

Spieler drückt Blocktaste
Ist Schild-ID > 0 (s. Corti)
--- Blocken
ansonsten
--- Nichts tun

G-Brothers
29.08.2015, 23:09
@> Change Parameters: Entire Party, MHP + 9000
@> Change HP: Entire Party, + 9000
@> Wait: 0.2 seconds
@> Change HP: Entire Party, - 9000
@> Change Parameters: Entire Party, MHP - 9000
@> Wait: 0.1 seconds
Ich versteh den Sinn hinter diesen Zeilen nicht. o; Wozu die +-9000?

AgentBlack
29.08.2015, 23:58
Für mich sieht das so aus als wolle er ein [zumindest für den Zeitraum des Abblockprozesses] "unbeschadetes" Überstehen des Helden erreichen ... eben indem dessen Leben um 9000 hochgesetzt wird ... nur um nach dem Blocken wieder um 9000 verringert zu werden. Das ergibt aber insofern für mich wenig Sinn, da der Gegner womöglich trotzdem Schaden macht ... und wenn danach ohne Abzug dieses Schadens das Leben wieder um genau 9000 verringert wird ... dann tritt der Schaden eben einfach nach dem Blockvorgang in Kraft. Mitunter mit tödlichen Folgen :P Aber das ist nur eine grobe Vermutung ... da ich den Rest des Codes nicht kenne und auch sonst keinerlei Ahnung davon habe wie genau dieses Kampfsystem nun aussieht ... ein wenig im Nebel gestochert ...

Drakee
30.08.2015, 15:33
@AgentBlack für mich sieht es eher so aus, als wäre die gesamte Berechnung von Schaden, Kollision etc, was halt alles zum Kampfsystem gehört, in die einzelnen Mapevents (Gegnerevents) reingeskriptet, was eine Implementieren eines simplen Blocken-Systems, wie von Corti vorgeschlagen, umständlich macht, da er wohlmöglich bei jeder Map das bei jedem einzelnen Gegner korrigieren muss. Tja, das hat man davon, wenn man keine Common Events per Call-Befehl benutzt, statt die einzeln in jedem Mapevent per Copy and Paste auszuführen ^^
Warum sonst sollte er sich so ein lächerliches Skript überlegen?

@Norpoleon, sag mirbitte, dass du den Schaden in einer Variable speicherst, BEVOR er abgezogen wird, d.h. erst wird der Schaden in einer Variable berechnet und dann wird der Wert dieser Variable abgezogen, denn dann könntest Du einfach in einem Parallel Process den Schaden bei aktiviertem Blocken auf 0 setzen. Sonst musst Du in den sauren Apfel beissen und auf das Feature verzichten ODER dir die Mühe machen.

Sähe dann so aus, dass Du in ein COMMON Event einen einzelnen Befehl setzt: Set Variable "Schaden" == 0. Nur diese eine Zeile und dann stellst du von dem Common Event den Trigger auf Parallel Process und machst es per Switch aktivierbar. Dann wird der Schaden automatisch auf 0 gehalten, solange der Switch auf ON steht, denn jedes Event führt seine Befehle in einer Endlosschleife aus, es sei denn du hälst es mit "Erase Event" an oder nutzt einen Switch zur Aktivierung, wenn dieser wieder auf OFF steht. Ich denke, es funktioniert wahrscheinlich nicht immer, selten kann es vielleicht doch noch zu Schaden kommen, je nachdem wie der Zeitpunkt des Gegnerrischen Angriffs getimed ist, das hängt stark von sehr wenigen Millisekunden ab, aber es sollte um Längen besser funktionieren, als deine Held bekommt 9000 HP und verliert danach wieder 9000 HP. Was ist eigentlich, wenn der Held auf einem Hohen Level ist und 6000 HP hat? Dann kommt er bei 3000 Maximalen HP wieder raus, wenn er geblockt hat. Das ist doch schwachsinnig, mit deinem Skript DARF der Held nur maximal 999 HP haben!

Norpoleon
31.08.2015, 12:20
@Drakee Nein, der Schaden wird sofort abgezogen.

& jetzt mal ganz langsam für Programmieranfänger (^: Wie speichere ich einen Wert für ein Item oder sonst was in einer Variablen?
Ich möchte jetzt erstmal das Beschleunigen der Schildabfrage klären.

Kelven
31.08.2015, 12:31
Variable Operations -> Variable auswählen -> Hero (Name des Helden auswählen) -> Shield Number

Das speichert die ID des ausgerüsteten Schildes in der Variablen. Diese ID ist die Nummer in der Datenbank.

Norpoleon
31.08.2015, 12:39
Also ich hab hier bei RM 2k3 nur die Möglichkeit 'Control Variables'. Ist das das Gleiche?

Nagasaki
31.08.2015, 13:03
Ja, ist das gleiche.
Eine andere Frage: Weshalb hast du soviele Waits in deinem Code? In der Regel reicht ein einziger 0.0 Wait am Ende des Events, wenn es sich um einen PP handelt. Du hast ans Ende einen 0.1 Wait gesetzt. Ich denke mal, weil du eine Verzögerung für's blocken willst. Sofern nicht, lass diesen auf 0.0. Die übrigen Dreieransammlungen weiter oben im Code, sollten überflüssig sein. Wobei ich keinen Überblick über dein KS habe, womit ich nicht sicher sagen kann, ob die ganzen Waits doch nötig sein könnten.

Norpoleon
31.08.2015, 13:17
@Nagasaki Das mit den drei Waits zwischendrin habe ich mir vom Code von Kazesui abgeguckt. Ich habe keine Ahnung, ob das notwendig ist oder nicht. (:

@Kelven Also das Ganze sieht nun so bei mir aus:

CE 'control shield'
@> Control Variables: [0201:buckler] = [Nelu]'s Shield ID
& wie gehe ich weiter vor?

Nagasaki
31.08.2015, 13:25
Versuch das mal in deinem aktuellen Code zu integrieren. Wie Corti bereits anmerkte, frag ab, ob die Variable [0201:buckler] größer als 0 ist.
Hast du wieder folgendes an erster Stelle deines Codes stehen?

@> Key Input Processing: [0003], Wait

Wenn ja, lass sämtliche Waits in deinem Code weg und schau, wie gut es läuft. Wenn es Probleme gibt, zeig am besten bitte nochmal den gesamten Code für dein Block-System. Das wäre leichter nachzuvollziehen.

Nachtrag:
Natürlich alle Waits, bis auf den, der die Dauer des Blockens bestimmt.

Norpoleon
31.08.2015, 13:47
So?
CE (PP)
@> Control Variables: Variable [0201] = [Nelu ALCHEMI]'s Shield ID
@> Conditional Branch: Variable [0201:buckler] == 201
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End

Norpoleon
31.08.2015, 17:09
Fuck! Ich hab's tatsächlich verstanden. (:
Der Code sieht nun so aus:

@> Control Variables: [0201:buckler] = 1
@> Conditional Branch: Variable [0201:buckler] == 1
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End

Cepanks
31.08.2015, 18:08
Das macht jetzt aber gar keinen Sinn mehr. Du setzt die Variable auf den Wert 1 und fragst in der nächsten Zeile ab, ob sie den Wert 1 hat, was natürlich immer zutrifft.

Kelven
31.08.2015, 18:34
Du möchtest doch testen, ob irgendein Schild ausgerüstet ist. Dann müsste das so aussehen:

@> Control Variables: Variable [0201] = [Nelu ALCHEMI]'s Shield ID
@> Conditional Branch: Variable [0201:buckler] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End

Norpoleon
31.08.2015, 23:23
& wie füge ich der Datenbank weitere Schilde hinzu?
Indem ich weitere Variablen als Shield ID benenne?

Oder sind alle in meinem Spiel möglichen Schilde bereits in der Datenbank?

Nagasaki
31.08.2015, 23:48
Schilde stehen in der Datenbank bei den Items. Du wirst sicher wissen, wo diese zu finden sind.
Du benötigst zudem nur diese eine Variable. Es soll nur abgefragt werden, ob ein Schild ausgerüstet ist. Ist kein Schild ausgerüstet, so wird die Variable durch den Befehl

@> Control Variables: Variable [0201] = [Nelu ALCHEMI]'s Shield ID

stattdessen auf 0 gesetzt.
Wenn ein Schild ausgerüstet wird, dann nimmt die Variable den Wert der Item ID des Schildes an. Die Item ID ist immer größer als 0, da diese bei 1 anfangen. Für dein System sollte egal sein WELCHER Schild ausgerüstet ist. Es ist nur wichtig OB ein Schild ausgerüstet ist.
Daher sollst du mit dem Conditional Branch lediglich abfragen, ob die Variable größer als 0 ist.

Norpoleon
01.09.2015, 00:07
Was ist jetzt, wenn bei unterschiedlichen Schilden etwas unterschiedliches passieren soll?
Beispielsweise soll bei Wood Shield Animation X abgespielt werden;
beim Bronze Shield soll Animation Y ablaufen.

Nagasaki
01.09.2015, 00:16
Dann fragst du nach der speziellen ID. Also welchen Wert die Variable hat um zu erkennen, welcher Schild ausgerüstet ist. Der Wood Shield hat z.B. die ID 44, der Bronze Shield die ID 48.

Das hat aber wenig mit dem System des Blockens an sich zu tun. Das ist Grafikspielerei. Daher solltest du die Abfrage hierfür in ein anderes Event auslagern und per Call aufrufen.

Cherry
01.09.2015, 10:12
Mal eine Anmerkung am Rande: Macht doch bitte um Code den ihr aus dem Maker kopiert einmal
damit die Einrückungen erhalten bleiben...

Norpoleon
01.09.2015, 13:36
Naja, jedenfalls funktioniert das Blocken jetzt erstmal einwandfrei.
Ich danke allen, die mir hier geholfen haben. (:

Weitere Probleme, die ich mit Variablen habe, werde ich dann in einem anderen Thread unterbringen.

Norpoleon
02.09.2015, 13:00
Hier nochmal der Code für diejenigen, die vielleicht ein ähnliches Block-System in ihr Game integrieren wollen.

Der Code für den Block-Vorgang an sich:

Key Input Shield (PP) kein Switch:


@> Key Input Processing: [0003], Wait
@> Show Animation: Player, [eheb shield]
@> Wait: 0.0 seconds
@> Change Parameters: Entire Party, MHP + 900
@> Change HP: Entire Party, + 900
@> Wait: 0.2 seconds
@> Change HP: Entire Party, - 900
@> Change Parameters: Entire Party, MHP - 900
@> Wait: 0.0 seconds

Ich habe mich entschlossen, nur noch 900 HP dem Helden hinzu zu fügen, weil ich mir dann nur noch merken muss, dass der durch Gegner angerichtete Schaden nicht über 900 liegen darf. Das ist eher verkraftbar, als dass die HP des Helden 999 nicht übertreffen dürfen.

Hier die Abfrage, ob der Held überhaupt einen Schild angelegt hat:

Init Shield (PP) kein Switch:


@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu ALCHEMI]'s Shield ID
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu MERC]'s Shield ID
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu BRUTE]'s Shield ID
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu WITCH]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds


Denkt daran, dass bei diesem Code die anderen Helden & Klassen in eurem Game zu Beginn keine Schilde angelegt haben dürfen! Ansonsten wird bei Druck auf den Block-Button trotz nicht angelegtem Schild trotzdem geblockt.

Cherry
02.09.2015, 13:45
1) Was soll das ganze Wait 0.0 da. Das verzögert alles unnötig. Du brauchst nur ein Wait 0.0 am Ende des Events (bei PPs theoretisch auch nicht, weil die ein "automatisches" Wait 0.0 am Ende haben, aber da kann es manchmal tatsächlich nötig sein es mit einem zusätzlichen Wait 0.0 quasi zu "verdoppeln"), oder innerhalb einer Schleife mit Loop/Labels.
2) Du überprüfst hier nur ob "Nelu WITCH" einen Schild angelegt hast. Die anderen 3 Werte "verpuffen" weil du sie immer wieder überschreibst, bevor du mit ihnen irgendwas machst.

Und ich nehme an, mit "andere Helden" meinst du solche die nicht in der Party sind. Dafür müsstest du nur abfragen, ob ein Held in der Party ist, bevor du sein Schild checkst.

Drakee
02.09.2015, 14:43
Sorry, dass ich jetzt etwas polemisch werde, aber:

Warum zur Hölle sollte man so ein Skript für diese Funktion verwenden? :'D

Ich würde von Vornherein alles, was viele Mapevents gemeinsam verwenden per Common Events skripten. Da muss man dann sowas wie ein Blocksystem sowieso nur einmalig einfügen :D Das würde ich dann definitiv per Switches machen und eine Abfrage, wenn der Switch an ist, dann soll der Schaden 0 betragen und wenn nicht, dann soll er ganz normal berechnet werden.

Einzig und allein müssen sogenannte Parameter übergeben werden beim Aufruf einer Funktion. Beim RPG Maker gibt es sowas leider nicht, also muss man sich da mit den Variablen behelfen, die man auf bestimmte Werte setzt, bevor da CE aufgerufen wird.

Aber wie gesagt, bei dir ist das ja wohl irgendwie nicht möglich, da du offensichtlich wirklich keine CEs verwendest :D

Norpoleon
02.09.2015, 14:55
@Cherry Die Waits sind da, weil ohne sie nichts passiert. & ich verfolge eine strikte Politik beim Makern: "Alles, was funktioniert, ist gut!" (^:
Außerdem: Der Code muss natürlich so aussehen:


@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu ALCHEMI]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu MERC]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu BRUTE]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu WITCH]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds

Anmerkung: Gibt es da noch irgendeine Möglichkeit das Ganze zu beschleunigen?

@Drakee Ist mit CE "Common Events" oder "Call Events" gemeint? Common Events verwende ich schon, aber nicht für Schadenabfrage. Ich verwende sie eher für das Aufrufen von Animationen oder Klassenabfragen.

Aber mal was anderes: Wo kann man sich in eurem Forum der Community vorstellen?
EDIT: Hab den "Hallo, ich bin neu hier"-Thread schon gefunden. (:

Drakee
02.09.2015, 16:38
[QUOTE=Norpoleon;3263229]


@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu ALCHEMI]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu MERC]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu BRUTE]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds
@> Control Variables: [0201:shield] = [Nelu WITCH]'s Shield ID
@> Conditional Branch: Variable [0201:shield] > 0
@> Control Switches: [0147:shield control] = ON
@>
: Else
@> Control Switches: [0147:shield control] = OFF
@>
: Branch End
@> Wait: 0.0 seconds

Anmerkung: Gibt es da noch irgendeine Möglichkeit das Ganze zu beschleunigen?

Die Abfrage (@> Conditional Branch: Variable [0201:shield] > 0) könnte man in ein extra Common Event packen und dann nach jedem " @> Control Variables: [0201:shield] = [Nelu KLASSE]'s Shield ID" per Call-Event aufrufen. Aber prinzipiell würde das wieder nur Code pro Copy Paste einsparen, aber nicht die Anzahl der Copy Pastes. Jedoch geschieht das auch wieder zugunsten der Übersicht.

Da man nicht per Pointer auf die CharaterID zugreifen kann, geht das nicht anders ^^

Norpoleon
02.09.2015, 19:04
Ich versteh schon wieder die Welt nicht mehr! (:

Wenn ich alle Schildabfragen in ein Common Event packe, funktioniert das Blocken prima, bis auf die Tatsache, dass es richtig schön langsam & unexakt ist.

Packe ich die Schildabfragen jeweils in ein eigenes Common Event, passiert gar nichts.

Ich weiß, dass ich alles schon mal so hinbekommen habe, dass das Blocken richtig schön schnell & exakt war. Aber ich weiß nicht mehr, was ich da anders gemacht habe.

Cherry
02.09.2015, 20:24
Es kann übrigens so immer noch nicht funktionieren. Du überschreibst diesmal zwar nicht die shield-Variable, aber dafür den shield control Switch jedes mal, weil selbst wenn eine der Bedingungen den Switch auf ON setzt, setzt die nächste ihn vllt wieder auf OFF; etc.

Corti
02.09.2015, 20:26
Wenn du andere fragen musst, warum etwas nicht funktioniert, hast du es gebaut ohne zu verstehen was du tust. Ich würde damit anfangen Dinge zu bauen, die du verstehst. Das geht am besten, in dem man den Zweck jeder Zeile versteht und wenn man eine Vorstellung hat, was passieren soll und nur Befehle anwendet, die auch Teil dieses Ablaufen sind, dann klappt das auch.

Dein Code da, was soll das? Du fragst viele Male pro Sekunde ab, ob deine drei Charaktere einen Schild haben. Wenn alle deine Helden einen Schild tragen, dann sollte das sogar funktionieren. Ansonsten wird der Switch doch im Millisekundentakt wechseln und dein Schildblockscript wird je nach dem wie viele deiner Charaktere gerade den Schild tragen entweder gar nicht, oder 33/66/100% der Zeit funktionieren, wechselnd im Takt von Millisekunden.

Das in verschiedenen CEs? Wie kommt man darauf?

"Ich habe ein CE, dass im Millisekundentakt ein Switch wild und planlos an und aus schaltet! Woah, ich hab ne Idee! Anstatt nacheinander an-aus, nehme ich viele CEs und schalte die Switches ZEITGLEICH wild und planlos an und aus!"

Ich finds sowieso mutig, ein Action-Kampfsystem zu benutzen, wenn man nur sehr wenig bis gar nicht scripten kann, aber dann solltest du zumindest versuchen es zu lernen. Man lernt auch nicht kochen, wenn man immer nur eine Augenbinde tragend zufällige 25 Sachen in den Topf wirft und dann andere fragt, warum es scheisse schmeckt. Fang kleiner an. Bau es für einen Helden, wenn das funktioniert, bau es für zwei. Wenn es bei einem funktioniert und bei zweien nicht, weisst du wo du suchen musst. Wenn du erst ganz viel machst, dann fühlst du dich leichter überfordert und fragst lieber das Forum statt mal selbst zu überlegen.

Norpoleon
02.09.2015, 20:33
Hilft da eine weitere Conditional Branch, die ich gleich 0 setze & dann den Schalter auf OFF stelle?

EDIT: @Corti Ich sehe das ein bisschen anders. Man muss Dinge wagen & viel rumexperimentieren, damit man überhaupt etwas lernt. Ich kann noch so oft die Standard-Maker-Battlesystems nachbauen & verstehen wie ich will, davon lern ich ja auch nicht, wie ich ein ABS baue. Stattdessen muss man sich halt das ABS von jemand anderem besorgen & damit rumexperimentieren & versuchen es Schritt für Schritt so zu verstehen. (:

Corti
02.09.2015, 20:35
Du kannst in einer Conditional Branch abfragen, ob ein Held gerade in der Party ist ;-) Wie wärs damit?

Norpoleon
02.09.2015, 20:56
Ich dachte das wird schon in der Abfrage der Shield-ID geklärt, welcher Held gerade das Schild trägt.

Kommt die Conditional Branch in ein eigenes Common Event oder wird das der Conditional Branch, in der auch [0147: shield control] ist, untergeordnet?

Corti
02.09.2015, 21:30
Denk nach, du kommst drauf. Nicht raten. Überleg dir was passieren soll und unter welchen Umständen es passieren soll und dann überleg, wie es wohl am einfachsten ginge.

Cherry
02.09.2015, 22:41
Norpoleon, ich finde, Corti hat schon recht. Indem du schrittweise kleine Dinge baust und genau verstehst lernst du sehr wohl wie man ein ABS baut. Im Sinne von: Wenn du dich mal mit der Materie auskennst, dann wird für dich total logisch erscheinen wie du ein ABS angehen müsstest, auch wenn du bis jetzt nur andere Dinge gebaut hast. Wenn du mal mit den Bausteinen und ihren Eigenheiten vertraut bist, kannst du fast alles bauen oder zumindest schon passende Lösungsansätze finden.

Andersherum wirst du aber wahrscheinlich Dinge eher falsch verstehen oder glauben zu verstehen und dann falsch einsetzen. (Und "Herumprobieren bis es zu funktionieren scheint", nach dem Motto "ich versteh nicht warum ich die Waits brauche, ober ohne sie funktionierts nicht", wird nur zu unerwarteten Bugs und späterem Haareraufen führen - und zu Spaghetticode den weder du noch jemand, der dir helfen will, durchschauen kann.) Das merkt man jetzt schon ganz deutlich wenn man sich deinen Code anschaut und die Fragen die du stellst. Und das ist überhaupt nicht böse gemeint.

Drakee
02.09.2015, 22:41
Cherry und Corti haben Recht, du solltest lieber vorher eine Nummer kleiner anfangen und genau verinnerlichen wie jeder Befehl funktioniert und selber versuchen einen Lösungsansatz zu finden.
Versuche nicht wild drauf los zu skripten, sondern überlege dir erst einen "Pseudo-Algorithmus".

Dennoch:
Pass auf, ganz einfach, nach diesem Fall, kann es vier verschiedene Alternativen geben. Die Alternativen hintereinander so auszuführen würde zu einer Überschreibung einer wohlmöglich erfüllten Bedingung führen. Das heißt, dass immer das ausgerüstete Schild von der "WITCH" alles vorher nichtig macht, weil das immer als Letztes ausgeführt wird. Das heißt, wenn man diese Klasse spielt, sollte das eigentlich funktionieren, aber mit den anderen Klassen dann wiederum nicht. Stattdessen musst du dem Maker sagen, dass es Alternativen sind, indem du Bedingungen mit Else-Verzweigungen benutzt.


@> Conditional Branch: [Albert] is in the party
@> Control Variables: [0001:Shield ID] = [Albert]'s Shield ID
@>
: Else
@> Conditional Branch: [Vance] is in the party
@> Control Variables: [0001:Shield ID] = [Vance]'s Shield ID
@>
: Else
@> Conditional Branch: [Craise] is in the party
@> Control Variables: [0001:Shield ID] = [Craise]'s Shield ID
@>
: Else
@> Conditional Branch: [Arthur] is in the party
@> Control Variables: [0001:Shield ID] = [Arthur]'s Shield ID
@>
: Else
@> Control Variables: [0001:Shield ID] = 0
@>
: Branch End
@>
: Branch End
@>
: Branch End
@>
: Branch End
@> Conditional Branch: Variable [0001:Shield ID] >= 1
@> Control Switches: [0001:Shield Control] = ON
@>
: Else
@> Control Switches: [0001:Shield Control] = OFF
@>
: Branch End

Hier wird die Shield ID je nachdem, wer gerade in der Party ist, nach dem aktuellen Helden zugewiesen. Allerdings geht das auch nur so, wenn du wirklich immernur einen einzigen Charakter in der Party hast! (Bei einem ABS üblich, es sei denn Du benutzt NPC-Mitstreiter, was allerdings für einen Amateur zu viel des Guten wäre)

EDIT: Trotzdem überlege dir bitte Mal, was es mit diesem Befehl @> Control Variables: [0001:Shield ID] = [CHARACTER]'s Shield ID GENAU auf sich hat.

Norpoleon
03.09.2015, 05:42
Ja, ich weiß ja, dass ihr mir nur helfen wollt & dafür bin ich sehr dankbar. (:
Allerdings sind für Nicht-Mathematiker Programmiersprachen gar nicht so logisch aufgebaut, wie ihr denkt.
Z.B. wäre ich nie darauf gekommen, dass ich die Conditional Branches ineinander verschachteln muss, damit das Programm weiß, dass es sich um gleichrangige Alternativen handelt. Ich habe immer alles schön untereinander geschrieben & dachte: "Passt schon." :)

@ Drakee Nach einigen Fehlern, die darauf beruhten, dass ich deinen Code einfach nicht richtig gelesen habe, funktioniert dein Code prima. Danke.
Also, bei "@> Control Variables: [0001:Shield ID] = [CHARACTER]'s Shield ID" würde ich sagen, dass eine Variable, die "[0001:Shield ID]" heißt, gleich der Shield-ID des CHARAKTERs gesetzt wird, wahrscheinlich um in einem zweiten Schritt abfragen zu lassen, ob die Shield-ID einen bestimmten Wert erreicht hat.

Nagasaki
03.09.2015, 11:07
Ich würde dir tatsächlich raten lieber alles untereinanderzuschreiben und weniger zu verschachteln. Ist natürlich immer persönliche Vorliebe. Ich mache dies eben am liebsten genauso, weil es für mich übersichtlicher ist und weniger Codezeilen benötigt. Zudem rutscht das ganze beim Verschachteln immer weiter nach rechts. Gerade bei sehr vielseitigen Abfragen wird das kritisch.
Das Problem mit dem Überschreiben von bereits erfüllten Bedingungen löst du ganz simpel mit Labeln.

1)
@> Conditional Branch: [Albert] is in the party
@> Control Variables: [0001:Shield ID] = [Albert]'s Shield ID
@> Jump to Label 1
@>
: Branch End
@> Conditional Branch: [Vance] is in the party
@> Control Variables: [0001:Shield ID] = [Vance]'s Shield ID
@> Jump to Label 1
@>
: Branch End
@> Conditional Branch: [Craise] is in the party
@> Control Variables: [0001:Shield ID] = [Craise]'s Shield ID
@> Jump to Label 1
@>
: Branch End
@> Conditional Branch: [Arthur] is in the party
@> Control Variables: [0001:Shield ID] = [Arthur]'s Shield ID
@>
: Branch End
@> Label 1
@> Conditional Branch: Variable [0001:Shield ID] > 0
@> Control Switches: [0001:Shield Control] = ON
@>
: Else
@> Control Switches: [0001:Shield Control] = OFF
@>
: Branch End
2)
@> Conditional Branch: [Albert] is in the party
@> Control Variables: [0001:Shield ID] = [Albert]'s Shield ID
@> Conditional Branch: Variable [0001:Shield ID] > 0
@> Jump to Label 1
@>
: Branch End
@>
: Branch End
@> Conditional Branch: [Vance] is in the party
@> Control Variables: [0001:Shield ID] = [Vance]'s Shield ID
@> Conditional Branch: Variable [0001:Shield ID] > 0
@> Jump to Label 1
@>
: Branch End
@>
: Branch End
@> Conditional Branch: [Craise] is in the party
@> Control Variables: [0001:Shield ID] = [Craise]'s Shield ID
@> Conditional Branch: Variable [0001:Shield ID] > 0
@> Jump to Label 1
@>
: Branch End
@>
: Branch End
@> Conditional Branch: [Arthur] is in the party
@> Control Variables: [0001:Shield ID] = [Arthur]'s Shield ID
@> Conditional Branch: Variable [0001:Shield ID] > 0
@>
: Branch End
@>
: Branch End
@> Label 1
@> Conditional Branch: Variable [0001:Shield ID] > 0
@> Control Switches: [0001:Shield Control] = ON
@>
: Else
@> Control Switches: [0001:Shield Control] = OFF
@>
: Branch End
Das sind nun zwei verschiedene Codes.
Wenn man nur einen Helden in der Party haben kann, dann nimm das erste, da es kürzer ist.
Wenn man mehrere Partymitglieder haben kann, dann nimm das zweite. Der Unterschied ist einfach, dass dort nicht nur gefragt wird, ob ein Held in der Party ist, sondern auch, ob dieser ein Schild trägt. Also die Variable größer als 0 ist, da 0 kein Schild bedeutet. Dadurch würde solange das Inventar deiner Party überprüft, bis du einen Schild gefunden hast oder eben bereits alle Partymitglieder dran waren.
Es geht dir ja darum, ob ein Held in der Party einen Schild ausgerüstet hat. Wenn du das mal mit "ja" beantworten kannst, dann interessiert dich der Rest der Party nicht und du überspringst die übrigen Abfragen.

Label sind sehr nützlich und leicht zu verstehen. Teste es einfach mal. Das wirst du sicher mal gut gebrauchen können.
So sieht alles gleich aus und habe damit einzelne Blöcke, die eben alles dasselbe machen. Jeder steht für sich und ich kann es so besser erkennen. Persönlich verschachtel ich in der Regel nur, wenn es nötig ist. Wenn z.B. mehrere Bedingungen gleichzeitig erfüllt sein müssen, wie, wenn bestimmte Helden in der Party sein müssen, andere aber nicht. Bei deinem Beispiel aber, ist es nicht nötig. Du möchtest es ja nur bei einem der Helden wissen und der Rest wird überflüssig.
Für mich funktioniert es so am besten. Ich habe ebenso eher wenig Erfahrung im Programmieren, daher kann ich dich in der Hinsicht schon verstehen. Aber du wirst für dich selbst rausfinden müssen, was dir am meisten liegt.

Norpoleon
04.09.2015, 17:22
@Nagasaki Die Idee mit den Labels gefällt mir sehr gut, da dadurch der Code schön übersichtlich bleibt. Danke.

Corti
04.09.2015, 17:30
Labels sind cool, aber beim Copy und Paste kommts schnell mal vor, dass man ein Label doppelt hat und dann baut man schnell mal schleifen und Sachen, die so nicht sein sollen. Ich benutze Labels sehr gerne, die sind super. Nur wenn mal was nicht klappt, oder sich komisch verhält, schau dir auf jeden Fall deine Labels an.

Drakee
04.09.2015, 18:19
Also, bei "@> Control Variables: [0001:Shield ID] = [CHARACTER]'s Shield ID" würde ich sagen, dass eine Variable, die "[0001:Shield ID]" heißt, gleich der Shield-ID des CHARAKTERs gesetzt wird, wahrscheinlich um in einem zweiten Schritt abfragen zu lassen, ob die Shield-ID einen bestimmten Wert erreicht hat.

Speziell auf deinen Code, der sich selbst überschrieben hat, heißt es, dass durch den Befehl die ID des ausgerüsteten Shields in der Variable gespeichert wird, AUCH WENN der Charakter sich nicht in der Party befindet.