Allgemein
News
News-Archiv
Partner
Netzwerk
Banner
Header
Media
Downloads
Impressum

The Elder Scrolls
Arena
Daggerfall
Spin-offs
Romane
Jubiläum
Reviews
Welt von TES
Lore-Bibliothek
Namens-
generator

FRPGs

Elder Scrolls Online
Allgemein
Fraktionen
Charakter
Kargstein
Technik
Tamriel-
Manuskript

Media

Skyrim
Allgemein
Lösungen
Tipps & Tricks
Steam-Kniffe
Review
Media
Plugins & Mods

Oblivion
Allgemein
Lösungen
Tipps & Tricks
Technik
Charakter
Media
Plugins & Mods
Kompendium

Morrowind
Allgemein
Lösungen
Tipps & Tricks
Media
Plugins & Mods

Foren
The Elder Scrolls Online
Hilfe & Diskussion

Skyrim
Hilfe & Diskussion
Plugins & Mods

Ältere TES-Spiele
TES-Diskussion
Oblivion-Plugins
Morrowind-Plugins

Community
Taverne zum Shalk
Adventures of Vvardenfell
Tales of Tamriel
Ergebnis 1 bis 10 von 10

Thema: Scripting: Whaaaa! Wie rechnet der denn?! 16 mal 1.3 plus 1 = Millionenbetrag

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Scripting: Whaaaa! Wie rechnet der denn?! 16 mal 1.3 plus 1 = Millionenbetrag

    Folgende Situation:
    PHP-Code:
    if Con1 || Con2 || Con3 || Con4 || Con5
    set 
    Var to Var * 1.3
    set 
    Var to Var + 
    elseif Con6 || Con7 ||  Con8 ||  Con9  ||  Con10
    set 
    Var to Var * 0.5
    endif 
    Der 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 .

    Warum? Wieso? Muß ich das verstehen?

  2. #2
    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'.
    Geändert von Lazarus (13.08.2007 um 07:39 Uhr)

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

  4. #4
    Zitat Zitat von bg2408 Beitrag anzeigen
    Bloß wie kriege ich Oblivion dazu, alles nach dem Kommata zu ignorieren¿
    Die einfachste Lösung wäre folgende:

    PHP-Code:
    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.

  5. #5
    Zitat Zitat von Lazarus Beitrag anzeigen
    ...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...

  6. #6
    Hier noch eine andere Idee, wie man das ganze lösen könnte:

    PHP-Code:
    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 

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

    Zitat Zitat von Lazarus Beitrag anzeigen
    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:
    Code:
    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


    Zitat Zitat von Lazarus Beitrag anzeigen
    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.

  8. #8
    Zitat Zitat von Brausebart Beitrag anzeigen
    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!
    Geändert von bg2408 (13.08.2007 um 12:12 Uhr)

  9. #9
    Zitat Zitat von bg2408 Beitrag anzeigen
    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...

  10. #10
    Zitat Zitat von Lazarus Beitrag anzeigen
    Dann frage ich mich allerdings, warum im zweiten Teil 8 herauskam, das hätte dann ja eigentlich ein Wert gegen null sein müssen...
    Ging er am Ende auch, hatte mich vertan... wie ich nach einem weiteren Test herausfand.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •