Construction Set Morrowind-Scriptkurs - Lektion 1

Mir ist allerdings bei seiner Lösung auch ein kleiner Fehler aufgefallen:
Bei seiner jetzigen Reihenfolge wird immer das Tagebuch aktualisiert, sobald der notwendige Eintrag vorhanden ist. Darum müssen die ersten beiden Bedingungen in seinem Script vertauscht werden, dann wird nur beim ersten Betreten mit notwendigem Journal-Eintrag selbiges aktualisiert, danach nicht mehr.

Ist das denn nicht wurscht, wie rum das Script aufgebaut ist? Bei mir aktualisiert sich das Tagebuch nur einmal, ich versteh nicht ganz das Problem. Aber Mercarryns Version ist insofern besser gelöst, da man komplett auf die unlock-Geschichte verzichten kann, was das ganze ja nur unnötig umständlich macht.
 
Also ich hatte deine Version bei meiner Teleport-Tür probiert, es aktualisierte sich jedes Mal das Tagebuch bei mir, mit der geänderten Version geschah das nicht. Ich werd es nochmal mit einer normalen Tür probieren, vielleicht liegt es ja daran.
 
Antwort b) Das ist doch grade der Witz an der Aufgabe das rauszufinden
Dann verstehe ich den Witz nicht. :huh:
Ich formuliere es noch mal anders. elseif wird immer abgefragt, wenn das vorangegangene if falsch war. Aber es muss selber richtig sein, damit es ausgeführt wird. Else wird immer ausgeführt, wenn die vorangegangenen ifs falsch sind.
Jetzt hat es endlich Klick gesagt. Bei mir muss man ganz unten ansetzen, da ich einige elementare Eigenschaften beim Scripten nicht verstanden habe. Diese Art des logischen Denkens liegt mir einfach nicht. Deswegen kann ich auch ein Großteil der Diskussion hier nicht mehr so ganz nachvollziehen.
 
Klappt es bei Aufgabe vier in etwa so?
Code:
begin digitaluhr_script

short minutes

short state
short button

if ( state == 0 )
 if ( OnActivate == 1 )
  set minutes to GameHour              ; bei Oblivion wird zumindest immer abgerundet
  set minutes to ( ( GameHour - minutes ) * 60 )

  set state to 1
  MessageBox, "Hallo ^PCName! Es ist %.0f:%.0f Uhr und wir haben den %.0f. %.0f. 3Ä %.0f.", GameHour, minutes, Day, Month, Year, "Ok!"
 endif
else
 set button to GetButtonPressed
 if ( button == 0 )
  set state to 0
 endif
endif

end

Ich habe das Gefühl, dass es bei Morrowind mehr Funktionen gibt, als bei Oblivion... Ist ja erschreckend.
 
Zuletzt bearbeitet:
@MadDin: Ich hoffe, dass die Aufgaben immer nur eine Wiederholung oder Variation dessen sind, was zuvor in der Lektion erklärt wurde. Von mir aus auch sehr komplex oder eine Kombination aus den bereits erklärten Punkten. Aber um neues zu erlernen gibt es schließlich diese Lektionen. Und bei den anderen Aufgaben hat das auch sehr gut funktioniert, sie waren meiner Meinung nach fordernd, aber fair.
 
@MadDin: Ich hoffe, dass die Aufgaben immer nur eine Wiederholung oder Variation dessen sind, was zuvor in der Lektion erklärt wurde. Von mir aus auch sehr komplex oder eine Kombination aus den bereits erklärten Punkten. Aber um neues zu erlernen gibt es schließlich diese Lektionen. Und bei den anderen Aufgaben hat das auch sehr gut funktioniert, sie waren meiner Meinung nach fordernd, aber fair.

MadDin hat in so fern Recht, dass ihr dort etwas machen müsst, was nicht vorgeführt wurde. Aber es ist trotzdem in der Lektion angesprochen worden. Nur in den Beispielscripten wurde das nicht verwendet.

Diarrhoe hat die Lösung (wahrscheinlich, ich habs nicht laufen lassen, aber es sieht richtig aus), wenn einer nachschauen möchte.
 
Diarrhoe hat die Lösung (wahrscheinlich, ich habs nicht laufen lassen, aber es sieht richtig aus), wenn einer nachschauen möchte.
nicht ganz ... die Stunden muss man, wenn man die Rundungsgeschichte loswerden will, auch auf eine Shortvariable casten - aktuell wird GameHour direkt in der MessageBox verwendet, weshalb hier noch normal gerundet wird (das Skript würde bei 8:30 schon 9:30 zeigen, weil GameHour 8,5 auf 9 aufgerundet wird) ... habs aber auch nicht getestet.
 
Ich habe gerade gemerkt, dass ich ja die Literaturhinweise vergessen habe. Das hole ich natürlich noch nach:

Literatur

Wie in der Uni üblich gebe ich zum Beginn eines Kurses einige Hinweise zur tiefergehenden Lektüre. Das ist natürlich DAS Standardwerk zu Morrowind Script:


Wem dieses 200seitige, engliche Werk zu viel oder zu unverständlich ist, kann ich noch die deutschen "Alternativen" empfehlen:

  • Morrowind Scripting for Dummies 5 (deutsch): Dies ist eine Übersetzung der 5. Version von MSfD, aber wie die Versionsnummer erkennen lässt, ist sie 4 Versionen veraltet und ich finde keinen funktionierenden Download dieser Übersetzung mehr.
  • Liste der Scriptfunktionen im TES 3 Construction Set: Dies ist eine ziemlich erschöpfende Liste aller Funktionen in Morrowind Script. Allerdings gibt es kaum Erklärungen, da dies als Nachschlagewerk ausgelegt ist und nicht als Tutorial.
 
Ich gebe hier mal eine saubere Lösung für die vierte Aufgabe an - sie erfüllt alle Bedingungen und spart Rechenzeit:

Code:
begin lex_timecaster_sc
short hours
short minutes

IF ( OnActivate == 0 )
 return
EndIF

set hours to GameHour
set minutes to ( 60 * ( GameHour - hours ) )
IF ( minutes < 10 )
 MessageBox, "Hallo ^PCName! Wir schreiben den %.0f. %.0f. 3Ä %.0f. Es ist jetzt %.0f:0%.0f Uhr.", Day, Month, Year, hours, minutes, "Ok!"
Else
 MessageBox, "Hallo ^PCName! Wir schreiben den %.0f. %.0f. 3Ä %.0f. Es ist jetzt %.0f:%.0f Uhr.", Day, Month, Year, hours, minutes, "Ok!"
EndIF

end
Das Script nutzt eine Besonderheit und ist darum erstaunlich kurz.

Das sollte man nämlich auch immer bedenken.

Je weniger Code nötig ist, desto besser.
 
Zuletzt bearbeitet:
Könntet ihr mir mal Diarroehs oder £exas Lösungsvorschlag erklären? Klar, damit wird die Gamehour durch sechzig Einheiten dividiert, die dann wohl als Minutes angezeigt werden können. Aber wieso deklariert £exa z.B. die Gamehour als Hours? Und was soll das mit dem '( GameHour - hours )' , ich dachte, die Gamehours wären schon als Hours deklariert?
 
Ich glaube ich hab´s geschnallt...

@ Teridan

Diarroehs Lösung ist genau das was £exa´s vorgeschlagen hat,seh es dir nochmal an!
Wenn du noch Probleme damit hast versuch ich es mal zu erklären...
 
GameHour liefert eine Float. Damit können wir in der MessageBox nix anfangen.

Format: Stundenzahl, Bruchteil von Stunde.

Nehmen wir an, es wäre halb 10 morgens. Nun, dann würde GameHour uns als Wert 9,5 liefern. Bei der direkten Verwendung von GameHour für die Stunden in der Message wird Morrowind den Wert runden. 9,50 Stunden würde dann zu einer 10 werden.... also 10 Uhr ergeben und das ist falsch. Zwischenspeichern (puffern) des Wertes in einer Short (= hours) führt dagegen zum Abschneiden (also zum Abrunden) des Dezimalabschnitts und damit zur echten Stunde, wie wir sie benötigen.

Um nun ohne Stress gleich noch die Minuten zu berechnen, nimmt man wieder GameHour, zieht die gerade berechneten vollen Stunden (GameHour - hours) davon ab und multipliziert den Rest (also die Dezimalen) mit 60... und speichert das auch in eine short (= minutes)... so wird auch hier der überflüssige Ballast abgeschnitten und man hat saubere Stunden und Minuten.
 
Eine Frage zu Aufgabe 3:
Könnt man das abfragen des Geschlechtes nicht auch ohne MessageBox machen? Also so wie ^PcName, bloß als ^PcSex (oder ähnliches)? Oder gibt es so eine Funktion nicht?

Eine Lösung für vier:
Code:
begin kl_uebung2_script
 
[SIZE=2]short minutes[/SIZE]
[SIZE=2]short state[/SIZE]
[SIZE=2]short button[/SIZE]
 
[SIZE=2]if ( state == 0 )[/SIZE]
   if ( OnActivate == 1 )
      set state to 1
      MessageBox, "Hallo ^PcName.", " Hallo, wie spät ist es? Und welchen Tag haben wir eigentlich?", "Ich werde jetzt gehen."
   endif
else
   set button to GetButtonPressed
   if ( button == 0 )
      set minutes to GameHour
      set minutes to ( ( GameHour ) *60 )
      set state to 0 [COLOR=red]; Könnte man das im Falle einer Erweiterung weglassen?[/COLOR]
      MessageBox, "Es ist ^Gamehour. Der Tag? Es ist der ^Day. ^Month des Jahres ^Year.", [COLOR=black]"Danke. Dann habe ich ja noch etwas Zeit.", "Danke. Ich sollte gehen."[/COLOR]
[COLOR=#ff0000] else[/COLOR]
[COLOR=#ff0000]    set button to GetButtonPressed[/COLOR]
[COLOR=#ff0000]    if ( button == 0 )[/COLOR]
[COLOR=#ff0000]       set state to 0[/COLOR]
[COLOR=#ff0000]       MessageBox, "Schön. Wollt ihr noch etwas zu trinken?"[/COLOR]
[COLOR=#ff0000]    elseif ( button == 1 )[/COLOR]
[COLOR=#ff0000]       set state to 0[/COLOR]
[COLOR=#ff0000]       MessageBox, "Das ist schade. Auf wiedersehen."[/COLOR]
[COLOR=#ff0000] endif[/COLOR]
[COLOR=black]elseif ( button == 1 )[/COLOR]
      set state to 0
      MessageBox, "Schönen Tag noch."
   endif
endif
 
end
Das in rot geschriebene ist etwas, das ich ausprobiert habe. Nur leider wird es nicht beachtet. Kann man soetwas einbauen? Wenn ja wie?

Zur Abfrage der Zeit, des Datums etc.: Muss man das mit %.Of machen wie die anderen es gemacht haben? Denn ehrlich gesagt verstehe ich nicht was man da macht, oder wie man das macht.
Geht das auch mit ^Gamehour, ^Day, ^Month, ^Year?

Ach und gibt es eine Möglichkeit die Antwort-Felder zu vergrößern? Denn so kann man gar keine tolle Diskussion führen... Das sprengt immer alles den Rahmen.;)
 
Zuletzt bearbeitet von einem Moderator:
Das in rot geschriebene dürfte klappen,bin mir da aber nicht 100% sicher.
Bloß das was nach dem rot geschriebene müsstest du ändern...
Das mit dem %.Of muss so gemacht werden meines Wissens nach,da es sich dabei um die
Platzhalter für GameHour,Day,Month,... handelt.
Das mit dem ^ klappt nur bei bestimmten Variablen wie z.B ^PCName
Ach ja das in rot geschriebene funktioniert nicht weil was mit der ersten Messagebox nicht stimmt.(^GameHour,^Day,...)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person
Das in rot geschriebene funktioniert so aber nicht. Ich habe es ausprobiert, es wird ignoriert.
Mit ^Gamehour usw. habe ich immer etwas angezeigt bekommen... Die Frage ist bloß ob es richtig war...
 
Wenn ich mir dein Script genauer ansehen....glaub ich hast du dich mit dem
else und elseif verzettelt...(obwohl nö,eigentlich nicht...)
Was genau zeigt er dir an?Was für Messageboxen werden angezeigt?
(achja nach der ersten Messagebox vor dem nächsten if fehlt
set button to GetButtonPressed
Probier´s mal aus,vieleicht ist das der Fehler
 
Zuletzt bearbeitet:
Nö, fehlt nicht. Ich habe es bloß hier vergessen.

Aber ansonsten funktioniert alles, wie es sein sollte, bloß das nachdem ich entweder "Danke, dann habe ich ja noch etwas Zeit." oder "Danke, ich sollte gehen." gedrückt habe, Schluß ist. Obwohl ja eigentlich Der Pfosten :)-D) noch etwas sagen sollte. (Ach ich weiß, ich habe Probleme. Anstatt mich erstmal damit zu begnügen, dass ich es überhaupt hinkriege.:roll:)

@IvanDaVile: Achso.