Hallo,
GlobalInts sind schon deswegen schlecht, weil nicht selbsterklärend - sprechende Variablennamen sind einfach besser. Ich habe beispielsweise jedem Raum ein struct spendiert, anhand dessen ich entsprechende Zustände ablesen und steuern kann. Muss man dann halt im Header deklarieren und per export/import global verfügbar machen. Hier ein Beispiel für Britneys Kleiderschrank:
// ================================================== HOTSPOT: Kleiderschrank
function hWardrobe_AnyClick()
{
walkTo.x = 245;
walkTo.y = 133;
walkTo.dir = eDirUp;
if (!walkTo.go()) return false;
if (UsedAction(eActWalkTo)) {
// ...
}
else if (UsedAction(eActLookAt)) {
if (rBritney.wardrobe == eOpened) {
cBritney.SayIfPlayer("Sieht so aus als ob meine ganze Kleidung in der Wäsche ist.");
cBritney.SayIfNotPlayer("Ich schlußfolgere: Der Schrank ist leer.");
} else {
cBritney.SayIfPlayer("Mein Kleiderschrank.");
cBritney.SayIfNotPlayer("Britneys lila Kleiderschrank.");
}
}
else if (UsedAction(eActPickUp)) {
player.Say("Dafür gibt es Möbelpacker.");
player.Say("Und ich bin definitiv keiner.");
}
else if (UsedAction(eActUse)) {
player.Say("Mich darin jetzt zu verstecken ist keine Problemlösung.");
}
else if (UsedAction(eActOpen)) {
if (rBritney.wardrobe == eOpened) {
player.Say("Der Schrank ist schon offen.");
} else if (rBritney.wardrobe == eLocked) {
player.Say("Der Schrank geht nicht auf.");
cBritney.SayIfPlayer("Ich habe ihn wohl abgeschlossen.");
cBritney.SayIfNotPlayer("Britney hat ihn vermutlich abgeschlossen.");
} else {
PlaySound(85);
rBritney.wardrobe = eOpened;
oWardrobe.Visible = true;
}
}
else if (UsedAction(eActClose)) {
if (rBritney.wardrobe == eOpened) {
PlaySound(85);
rBritney.wardrobe = eClosed;
oWardrobe.Visible = false;
} else {
player.Say("Der Schrank ist schon zu.");
}
}
else if (UsedAction(eActPush) || UsedAction(eActPull)) {
player.Say("Nein, der Schrank ist mir schwer.");
}
else Unhandled();
}
Den Startwert ob der Schrank offen, geschlossen oder abgesperrt ist, kann man dann für den Spielstart zentral festlegen ohne die ganzen Raumskripte nochmal anzufassen. Auch die Türen werden entsprechend vorkonfiguriert. Das sieht (vorläufig) bei mir so aus:
doors.config(eHauseingang, 8, eClosed, eLocked, eClosed, eLocked, 4096);
Neu ist dabei, dass definiert ist, in welchen Raum die Türe aufgeht. Türen können somit z.B. von einer Seite eines Raumes geschlossen sein, von der anderen Seite aber abgesperrt (ohne Schlüssel nicht zu öffnen) - also eine typische Haustüre. (Auch so "Spezialfälle" wie z.B. Türe steht offen ist aber in dieser Stellung blockiert sind damit machbar.) Die letzte Zahl (4096) ist die Schlossnummer. Jedes Inventar bekommt bei den Properties eine "keynumber" und wenn die zur "locknumber" passt, dann lässt sich damit die Tür öffnen/absperren. (Die beiden Werte werden binär verglichen, wodurch man auch Generalschlüssel definieren kann.) Im Raumskript sieht der Tür-Code dann so aus:
// ================================================== HOTSPOT: Zimmertür
function hDoor_AnyClick()
{
if (player == cBritney) doors.sayLookAt = "Meine Zimmertüre.";
else doors.sayLookAt = "Britneys Zimmertüre";
if (doors.anyClick(eBritney, oDoor, 271, 133, eDirRight, 2, 45, 134, eDirRight) == 0) Unhandled();
doors.resetDoorStrings();
}