Mehrere Variablen bzw. Zahlen vergleichen und den höchsten Wert ausgeben
Aloha alle miteinander (once again),
Kaum ist es Montag, purzeln neue Kniffligkeiten ins Haus. =)
Der Hintergrund des Ganzen ist eine Reparaturpatchung von Charakterdateien für ein privat-MMORPG.
Die folgende Bearbeitung basiert in veränderter Form auf den Code Mehrere Dateien im Batch per Drag und Drop bearbeiten lassen
Ablauf
Mastery1 bis Mastery7 sowie Level werden eigentlich per Schleife aus den .ini-Dateien ausgelesen:
(wobei ich für jeden einzelnen Wert eine einzelne for-Schleife habe, da die Zeilen sich natürlich ändern [Level = Zeile 6; Mastery1 = Zeile 42 ... Mastery 7 = Zeile 48]
Habe ich hierfür aber fest definiert, um ein besseres Beispiel darstellen zu können.
Ziel
Aus den Werten der Mastery1-7 soll der höchste Wert ermittelt und mit dem Level verglichen werden.
In diesem Fall z.B. haben Mastery1 und Mastery4 ein höheres Level als der CharakterLevel.
Bisheriger Workaround
Momentan habe ich die ganze Problematik mit einer Rangliste, einer Sortierung und einem Auslesen der Zeile 1 der temporär erstellen Datei gelöst, finde dieses aber unschön und bin auf der Suche nach einem direkteren Weg.
Nachbehandlung
Darüber muss man sich nicht allzuviele Gedanken machen, denn wie man im code bereits erkennen kann, habe ich vor, einen Ausgleichs-Wert zu definieren,
der später auf das Level addiert wird und per VBS in die per drag&drop gewählte Datei überschrieben wird.
Sprich: Der Level wird dem Wert der höchsten Mastery angepasst (gut, es werden auch noch Attributpunkte zusätzlich gesetzt, spielt aber keine größere Rolle, da dies alles schon funktioniert)
Anmerkung:
Es ist in dem Spiel durchaus möglich, ein niedrigeres Charakterlevel zu haben als die Masterys sind (durch sterben z.B.), allerdings passiert dies bei uns eher durch bugs beim Rollback und die Spieler erhalten keine Erfahrungspunkte mehr beim Monsterkillen.
Ich hoffe, es ist nicht zu verwirrend und ich hoffe ebenso, dass ihr mich bei der Lösungsfindung für einen direkteren Weg als ich ihn momentan gewählt habe, unterstützen werdet.
Grüße, André
Kaum ist es Montag, purzeln neue Kniffligkeiten ins Haus. =)
Der Hintergrund des Ganzen ist eine Reparaturpatchung von Charakterdateien für ein privat-MMORPG.
Die folgende Bearbeitung basiert in veränderter Form auf den Code Mehrere Dateien im Batch per Drag und Drop bearbeiten lassen
Ablauf
Mastery1 bis Mastery7 sowie Level werden eigentlich per Schleife aus den .ini-Dateien ausgelesen:
for /f "tokens=2 delims=^=" %%i in ('findstr /n "^" %1^|findstr "^42:"') do set Mastery1=%%i
Habe ich hierfür aber fest definiert, um ein besseres Beispiel darstellen zu können.
Ziel
Aus den Werten der Mastery1-7 soll der höchste Wert ermittelt und mit dem Level verglichen werden.
In diesem Fall z.B. haben Mastery1 und Mastery4 ein höheres Level als der CharakterLevel.
Bisheriger Workaround
Momentan habe ich die ganze Problematik mit einer Rangliste, einer Sortierung und einem Auslesen der Zeile 1 der temporär erstellen Datei gelöst, finde dieses aber unschön und bin auf der Suche nach einem direkteren Weg.
@echo off & setlocal enabledelayedexpansion
set /a Mastery1=50
set /a Mastery2=0
set /a Mastery3=0
set /a Mastery4=50
set /a Mastery5=30
set /a Mastery6=0
set /a Mastery7=0
set /a Level=47
set R=%temp%\Liste.log
set T=%temp%\result.tmp
if exist %R% del %R%
if exist %T% del %T%
set /a Anzahl=7
for /L %%i in (1,1,%Anzahl%) do for /L %%j in (1,1,%Anzahl%) do if !Mastery%%i! leq !Mastery%%j! set /a Rang%%i+=1
for /L %%i in (1,1,%Anzahl%) do set Wert=!Rang%%i!=!Mastery%%i! && echo !Wert! >>%T%
sort %T% /O %T%
for /f %%m in (%T%) do >>"%R%" echo\%%m
for /f "tokens=2 delims=^=" %%k in ('findstr /n "^" %R%^|findstr "^1:"') do set LV=%%k
echo Hoechste Mastery ist Level %LV%
if %LV% GTR %Level% (
set /a Ausgleich=%LV%-%Level%
) else (
echo kein Masterylevel ist zu hoch
pause
goto :eof
)
echo Der Charakterlevel wird um %Ausgleich% Level erhoeht.
pause
Nachbehandlung
Darüber muss man sich nicht allzuviele Gedanken machen, denn wie man im code bereits erkennen kann, habe ich vor, einen Ausgleichs-Wert zu definieren,
set /a Ausgleich=%LV%-%Level%
Sprich: Der Level wird dem Wert der höchsten Mastery angepasst (gut, es werden auch noch Attributpunkte zusätzlich gesetzt, spielt aber keine größere Rolle, da dies alles schon funktioniert)
Anmerkung:
Es ist in dem Spiel durchaus möglich, ein niedrigeres Charakterlevel zu haben als die Masterys sind (durch sterben z.B.), allerdings passiert dies bei uns eher durch bugs beim Rollback und die Spieler erhalten keine Erfahrungspunkte mehr beim Monsterkillen.
Ich hoffe, es ist nicht zu verwirrend und ich hoffe ebenso, dass ihr mich bei der Lösungsfindung für einen direkteren Weg als ich ihn momentan gewählt habe, unterstützen werdet.
Grüße, André
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160713
Url: https://administrator.de/contentid/160713
Ausgedruckt am: 23.11.2024 um 13:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Skyemugen!
Wenn es also grundsätzlich nur darum geht, aus allen Werte der Variablen %Mastery#% sowie von %Level% den höchsten zu finden, würde ich das (ungetestet wie fast immer ) so anlegen:
Grüße
bastla
Wenn es also grundsätzlich nur darum geht, aus allen Werte der Variablen %Mastery#% sowie von %Level% den höchsten zu finden, würde ich das (ungetestet wie fast immer ) so anlegen:
set /a Max=%Level%
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i
bastla
Hallo Skyemugen!
Wenn %Level% nur mit dem Max-Wert der einzelnen Variablen verglichen werden soll, dann natürlich eher so:
Wenn Du übrigens einmal in der Konsole die Variablen setzt und ein "
Grüße
bastla
Wenn %Level% nur mit dem Max-Wert der einzelnen Variablen verglichen werden soll, dann natürlich eher so:
set /a Max=0
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i
set /a Diff=Max-Level
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
set Mastery
" eingibst, sollte Deine Frage hinsichtlich "geht doch gar nicht alle sieben Variablen durch" eigentlich beantwortet sein ...Grüße
bastla
Hallo Skyemugen!
Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht passieren sollen - jetzt aber:
Grüße
bastla
Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht passieren sollen - jetzt aber:
set /a Max=0
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr !Max! set /a Max=%%i
set /a Diff=Max-Level
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)
... ist aber bei sinnvoller Benennung der Variablen (gleiches Präfix) die einfachste Möglichkeit ...Grüße
bastla