PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scripting: Whaaaa! Wie rechnet der denn?! 16 mal 1.3 plus 1 = Millionenbetrag



bg2408
13.08.2007, 00:38
Folgende Situation:

if Con1 || Con2 || Con3 || Con4 || Con5
set Var to Var * 1.3
set Var to Var + 1
elseif Con6 || Con7 || Con8 || Con9 || Con10
set Var to Var * 0.5
endifDer zweite Teil des Scriptes arbeitet so, wie er arbeiten soll. Zum Beispiel bei Ursprungswert (woanders festgelegt) 16, kommt da heraus 8. Gut. Beim ersten Teil hingegen kommt aus mir unerfindlichen Gründen ein Wert in Millionenhöhe heraus. Ich habe alles mögliche durchgerechnet, das ist eigentlich völlig unmöglich. Außer es wird hoch dreizehn genommen http://www.multimediaxis.de/images/smilies/old/1/ugly.gif.

Warum? Wieso? Muß ich das verstehen?

Lazarus
13.08.2007, 07:23
Ich vermute jetzt einfach mal, dass deine Variable 'Var' eine short ist, also integer. Für Kommazahlen müssen es aber float sein, weil integer eben ganze Zahlen sind bzw. sein müssen.
Der zweite Teil halbiert deine Variable lediglich, schätze es würde also nur dann Probleme geben, wenn deren Ursprungswert ungerade ist, weil du dann x,5 herausbekommst. Aber beim ersten Teil einen geraden Wert herauszubekommen, dürfte eine Seltenheit sein. Was das Spiel ausspuckt, wenn ein Integer-Wert eine Zahl mit Komma wiedergeben soll(die Chance liegt im Schnitt bei etwa 7,7%), will ich gar nicht wissen. ;) Hätte aber eher gedacht dass einfach gar nichts passiert.

So, das Dumme wird jetzt aber wohl sein, dass es wahrscheinlich nicht einfach damit getan ist, die short in float umzuwandeln. Kommt ganz darauf an, was du mit der variable vorhast. Beispielsweise lassen sich schlecht 7,8 auf den Stärkewert des Chars aufrechnen. Und dass das Spiel soweit mitdenkt und einfach nur +7 aufrechnet, wage ich zu bezweifeln. Wirst du ausprobieren und ggf. einen Weg finden müssen, den Wert hinter dem Komma abzuzwacken damit du eine gerade Zahl erhälst.

Was sind das eigentlich für abstruse Bedingungen im Script? Normalerweise müsste es heißen 'Wenn Variable1 == X', bei dir steht aber quasi einfach nur 'Wenn Variable1'.

bg2408
13.08.2007, 08:18
Hm. Dann müßte Oblivion vom Ergebnis ja einfach den Punkt ignorieren. Sehr seltsam, aber möglich.

Ursprünglich war es eine FLoat, aber nach dem ersten... erstaunlichen Ergebnis habe ichs auch mal mit nem Short ausprobiert, mit demselben Ergebnis.

Bloß wie kriege ich Oblivion dazu, alles nach dem Kommata zu ignorieren¿

Die Bedingungen am Ende stimmen - im Script selbst steht da nicht Var1 oder so, sondern schon richtige Sachen. Bloß die sind dann jeweils <---------------------------soooolaaaaang---------------------> ;)

Lazarus
13.08.2007, 08:44
Bloß wie kriege ich Oblivion dazu, alles nach dem Kommata zu ignorieren¿
Die einfachste Lösung wäre folgende:


if Var1 > 10
set Var1 to 10
elseif Var1 > 9
set Var1 to 9
elseif Var1 > 8
set Var1 to 8
elseif var1 > 7
set Var1 to 7
[...]

...und so müsstest du jedem möglichen Ergebnis eine Scriptzeile widmen. Ginge natürlich nur, wenn es in einem gewissen Rahmen bleibt.

bg2408
13.08.2007, 08:55
...und so müsstest du jedem möglichen Ergebnis eine Scriptzeile widmen. Ginge natürlich nur, wenn es in einem gewissen Rahmen bleibt.
Das wären 40x2 Bedingungen... arg... http://www.multimediaxis.de/images/smilies/old/1/muede028.gif

Lazarus
13.08.2007, 09:03
Hier noch eine andere Idee, wie man das ganze lösen könnte:


begin GameMode
if Var1 != 1||Var1 != 2||Var1!=3||Var1!=4||Var1!=5||Var1!=6||Var1!=7||Var1!=8||Var1!=9||Var1!=10 [...] <-Das führst du weiter bis Var1!=40

set Var1 to Var1 -0.1
endif
end

Brausebart
13.08.2007, 11:36
Zum ursprünglichen Problem, weshalb da so eine Riesenzahl herauskommt, fällt mir leider auch nicht viel ein. Das kann eigentlich nicht sein und hat ziemlich sicher nichts mit den Variablentypen zu tun. Ist sichergestellt, dass der fragliche Skript-Block nur einmal ausgeführt wird? Also nicht, dass Du da versehentlich eine Art Endlosschleife gebaut hast und dieser Block evtl. in jedem Frame durchlaufen wird? Das gäbe dann ziemlich schnell sehr große Werte. Nur so eine vage Vermutung.


Was das Spiel ausspuckt, wenn ein Integer-Wert eine Zahl mit Komma wiedergeben soll(die Chance liegt im Schnitt bei etwa 7,7%), will ich gar nicht wissen. ;)

Dabei passiert nichts schlimmes. Der Nachkommaanteil der Float wird einfach abgeschnitten. Von daher ist es auch nicht erforderlich, zu diesem Zweck extra ein Abfrage-Konstrukt zu erstellen.

Sofern eine korrekte Rundung gewünscht ist, ginge noch folgendes:


float f
short s

begin Gamemode

set s to f
if s >= 0
set s to s + ( ( f - s ) >= 0.5)
else
set s to s - ( ( f - s ) <= -0.5)
endif
end


siehe auch die Beschreibung des SET-Befehls im Wiki:
http://cs.elderscrolls.com/constwiki/index.php/Set



Was sind das eigentlich für abstruse Bedingungen im Script? Normalerweise müsste es heißen 'Wenn Variable1 == X', bei dir steht aber quasi einfach nur 'Wenn Variable1'.

Das geht in bestimmten Fällen schon. Der Vergleichsoperator muss nicht zwingend angegeben werden. Fehlt er, wird einfach geprüft, ob die Bedingung "Wahr" ist. Wobei "Wahr" durch den Integerwert 1 dargestellt wird und "Falsch" durch 0.

Statt z.B.: if Player.IsSwimming == 1 kann man auch einfach nur: if Player.IsSwimming schreiben.

bg2408
13.08.2007, 12:09
Ist sichergestellt, dass der fragliche Skript-Block nur einmal ausgeführt wird? Also nicht, dass Du da versehentlich eine Art Endlosschleife gebaut hast und dieser Block evtl. in jedem Frame durchlaufen wird? Das gäbe dann ziemlich schnell sehr große Werte. Nur so eine vage Vermutung.Das ist es!
Irgendwie komme ich mir gerade ziemlich dumm vor. Das Script sollte überhaupt nur bei jedem LevelUp laufen, läuft aber *ständig*. Seufz. Ich und Scripts. Danke!

Lazarus
13.08.2007, 12:13
Das Script sollte überhaupt nur bei jedem LevelUp laufen, läuft aber *ständig*. Seufz.
Dann frage ich mich allerdings, warum im zweiten Teil 8 herauskam, das hätte dann ja eigentlich ein Wert gegen null sein müssen...:confused:

bg2408
13.08.2007, 12:17
Dann frage ich mich allerdings, warum im zweiten Teil 8 herauskam, das hätte dann ja eigentlich ein Wert gegen null sein müssen...:confused:Ging er am Ende auch, hatte mich vertan... wie ich nach einem weiteren Test herausfand.