Ich brauche Hilfe beim Scripten, hab mich verrannt!

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Ich brauche Hilfe beim Scripten, hab mich verrannt!

Beitrag von DieFüchsin »

Ich versuche zwar, meine Scripts selbst zu entwickeln (wenn sicher auch sehr unprofessionell) aber jetzt habe ich mich in zu viele ifs und elses und variablen verheddert und komm auf keine Lösung. Könnte mir ein Programmiererfahrener ein bisschen unter die Arme greifen?

Ich habe: einen sechseckigen Raum mit sechs Bodenplatten, die jeweils eine von sechs Türen öffnen. Anhand der Symbole auf den Bodenplatten soll man herausfinden, durch welche Tür man als nächstes muss.

Geht man durch eine Tür, wird der Raum resettet und die Bilder auf den Bodenplatten neu verteilt. Ist man durch die richtige Tür gegangen, zählt eine Globale Variable (next) einen wert hoch, ansonsten wird sie 0.

Ich bin das ganze so angegangen: Ich habe eine Variable (wahl) dafür verwendet, die Bodenplatte auszuwählen, die das nächste richtige Bild bekommt (vorausgesetzt, next ist nicht 0)

danach wollte ich irgendwie die übrigen Bilder auf die Bodenplatten verteilen, wobei ich insgesamt 9 Bilder zur Auswahl hatte - eines schon verwendet wurde, also noch 8 bilder für 5 Bodenplatten zur Auswahl stehen.

Ist next 0 sollen die 9 Bilder auf die 6 Bodenplatten verteilt werden, ohne dass es eine neue "richtige" Platte gibt.

Mein momentanes Script poste ich, wenn ich wieder mein Laptop dabei hab, das schonmal vorweg, ich hoffe, ich hab mich verständlich ausgedrückt und dass mir jemand helfen kann.
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ich helf Dir gerne, allerdings ist mir der genaue Ablauf noch etwas unklar.
Wenn ich Dich richtig verstehe, muss der Spieler in einer bestimmten Reihenfolge nacheinander auf sechs Bodenplatten treten, wobei sich jeweils eine der Türen öffnet.
Wenn man durch eine Tür geht, landet man in einem anderen Raum, oder?
Und wenn man in den Sechseckigen zurückgeht, haben sich die übrigen Bodenplatten neu verteilt?
Warum wechseln noch nicht absolvierte Bodenplatten die Position, wenn es nur auf die Reihenfolge der Symbole ankommt?
Oder rede ich Stuss? ;)

Versuch, das Rätsel als Designer zu beschreiben, nicht als Programmierer.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

Also man startet in einem sechseckigen Raum (Nr1), in welchem die Bodenplatten festgelegt sind, also auch die "richtige".

Egal durch welche Tür man nun geht, kommt man in einen neuen sechseckigen Raum (Nr2).

Ging man durch die richtige bekommt eine zufällige Bodenplatte das neue richtige Bild, alle anderen Platten zufällig eins der anderen 8 Platten.

Ging man durch die falsche, bekommen alle Platten zufällig eines der neun Bilder zugeteilt.

Geht man nun durch eine Tür, gelangt man wieder in den selben Raum (Nr2). Und das Spiel mit der verteilung geht von vorn los.

Man ist zwar Programmtechnisch im selben Raum, aber für den Spieler ist es ein anderer.

Geht man 9x durch die richtige Tür (die dank zufälliger verteilung ja immer woanders ist), kommt man in einen anderen Raum (Nr3), der nur Ein- und Ausgang hat.

Es soll quasi wie bei MI1 sein, wo man in dem Affenkopflabyrinth rumirrt.
Es gibt kein festgesetztes Labyrinth sondern jeder Raum wird jedesmal neu erstellt: das ganze Labyrinth findet nur in Raum Nr2 statt.

Meine Bodenplatten sind natürlich Objects und die Türen werden durch Betreten von Regions ausgelöst. (also auch entschieden, ob die Tür die richtige oder falsche ist)
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ok, langsam versteh ich, aber sind es jetzt 6 Bodenplatten oder 9?
Und es sind 6 Türen, oder? In jeder Wand eine, denk ich mal.

Wenn man 9x durch die richtige Tür muss, woran merkt man nach der sechsten Tür, dass man noch auf dem richtigen Weg ist?

Sind auf den Türen auch Symbole?
Wenn der Spieler irgendwann durch die falsche Tür geht, muss er ja anscheinend wieder von vorne anfangen, muss er sich denn merken, wo die Türen des richtigen Wegs sind? Ne, die sind ja zufällig, also für mich hört sich das Rätsel sehr frustrierend und unfair an... ;)

Schick mir doch mal einen Screenshot per PM, das macht die Sache viel einfacher.
Use gopher repellent on funny little man
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Danke für die PM, sorry für den Doppelpost :)

Als erstes würde ich für jede der sechs Platten eine View einrichten, dann jeweils den ersten Loop mit den Ansichten der neun Symbole füllen.

Außerdem sollten die Plattenobjekte der Einfachheit halber die IDs 1-6 haben.

Code: Alles auswählen

// room script

function SetPlate(int plate, int symbol) { // plate 1-6, symbol 1-9
  abs=10;   // wenn views der platten z.B.: 11-16
  object[plate].SetView(plate+abs, 0, symbol-1); // Platten sind objects 1-6
}

bool symbolused[10];
int platesymbol[7];

function SetPlates(int symbol, bool exists) { 
  // symbol: das, das auf jeden fall dabei ist (wenn exists==true),
                    bzw. nicht dabei sein darf (wenn exists==false)
  int c; // while counter
  symbolused[0]=true;
  
  c=1;
  while(c<=9) { // arrays auf null setzen
    symbolused[c]=false;
    if (c<=6) platesymbol[c]=0;
    c++;
  }
  if (exists) { // symbol MUSS dabei sein
    int r=Random(5)+1; // MUSS-symbol auf irgendeine platte
    platesymbol[r]=symbol; 
    SetPlate(r, symbol);
    c=1;
    int s=0; // zu vergebendes symbol
    while(c<=6) {  // platten durchzählen
      if (platesymbol[c]==0) {  // platte hat noch kein symbol
        while(symbolused[s]) {  // ein unbenutztes raussuchen
          s=Random(5)+1;
        }
        SetPlate(c, s); // auf die platte damit
      }
      c++; // nächste platte
    }
  }
  else { // symbol DARF NICHT dabei sein
    symbolused[symbol]=true; // symbol aus der auswahl rausnehmen
    c=1;
    int s=0; // zu vergebendes symbol
    while(c<=6) {  // platten durchzählen
      while(symbolused[s]) {  // ein unbenutztes raussuchen
        s=Random(5)+1;
      }
      SetPlate(c, s); // auf die platte damit
      c++; // nächste platte
    }
  }
}

function GetPlayerSymbol() {
  Object*plate=Object.GetAtScreenXY(player.x, player.y);
  if (plate!=null) {
    int plid=plate.ID;
    if (plid>=1 && plid<=6) return platesymbol[plid];
  }
  return 0;
}
Jetzt kannst Du z.B. mit SetPlates(2, true); erzwingen, dass Nr.2 dabei ist, oder mit SetPlates(4, false) erzwingen, dass Nr.4 nicht dabei ist.

Und GetPlayerSymbol() liefert die Nr. des Symbols zurück, auf dessen Platte der Spieler steht, oder 0, wenn er auf keiner Platte steht.

Hoffentlich hilft Dir das erstmal weiter.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

danke erstmal, ich werd mich mal reinarbeiten
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

so, hab mich mal reingefuzzelt, hab aber noch ein paar fragen:

function SetPlate(int plate, int symbol) { // plate 1-6, symbol 1-9
--> abs=10; // wenn views der platten z.B.: 11-16 bei mir sind die views 229 - 234, muss ich also abs==228 schreiben?
object[plate].SetView(plate+abs, 0, symbol-1); // Platten sind objects 1-6




--> Jetzt kannst Du z.B. mit SetPlates(2, true); erzwingen, dass Nr.2 dabei ist, oder mit SetPlates(4, false) erzwingen, dass Nr.4 nicht dabei ist.

ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
falls ich mich bezüglich der "richtigen" Symbole falsch ausgedrückt haben sollte: geht man durch die "falsche" Tür, darf im nächsten Raum JEDES Symbol vorhanden sein, es führt dann nur nirgendwo mehr hin (nur in einen neuen sinnlosen Raum oder zurück in den Startraum)
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

DieFüchsin hat geschrieben:bei mir sind die views 229 - 234, muss ich also abs==228 schreiben?
Genau, bzw. abs = 228
DieFüchsin hat geschrieben:ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
Ich dachte, dass es auch Situationen gibt, in denen ein bestimmtes Symbol nicht dabei sein darf.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

DieFüchsin hat geschrieben:ich versteh noch nicht ganz, was du damit meinst: welches symbol sollte denn auf keinen fall dabei sein?
Ich dachte, dass es auch Situationen gibt, in denen ein bestimmtes Symbol nicht dabei sein darf.[/quote]

also wenn zb "merkur" als richtiges symbol schon verteilt wurde, darf es natürlich bei der zufälligen verteilung nicht nochmal verteilt werden

ansonsten dürfen aber alle symbole dabei sein

ändert sich denn jetzt was am script oder geht es noch genauso?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Eben, dacht' ich's mir doch.
Wenn Merkur (Nr. 1) nicht dabei sein darf, benutzt Du SetPlates(1, false);
Dann werden nur die anderen 8 Symbole zufällig auf die Platten verteilt.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

hmmm ich weiß nicht, ob du mich jetzt falsch verstehst, oder ich dich.

laut deiner anleitung kann ich EIN Symbol entweder sicher erscheinen oder sicher nicht erscheinen lassen.

richtig?
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Ja.

SetPlates(x, true); setzt Symbol x auf eine der Platten und verteilt dann 5 beliebige andere Symbole auf die restlichen Platten.

SetPlates(x, false); schließt x aus, nimmt die übrigen acht Symbole und verteilt sie auf die sechs Platten.
Use gopher repellent on funny little man
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

so nützt mir das leider nichts...

ich meinte, wenn ich ein Symbol als MUSS deklariere, darf dieses ja nicht nochmal verteilt werden. ich bin von meinem ansatz ausgegangen, erst zu definieren, was hinmuss und das dann gleich zu setzen und dann die restlichen hinzumachen.

wahrscheinlich hast du das einfacher gelöst (hab soweit aber noch nicht verstanden, wie), könntest du kurz zusammenfassen, wie dein script funktioniert?
Danke, Adventuretreff! <3
Benutzeravatar
DieFüchsin
Adventure-Gott
Adventure-Gott
Beiträge: 4406
Registriert: 12.03.2004, 16:55

Beitrag von DieFüchsin »

ich will ja nicht aufdringlich sein... hast du mich überlesen? :oops:
Danke, Adventuretreff! <3
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Anscheinend, ja, sorry.

Also in meinem letzten post hab ich ja erklärt, was die Funktion bewirkt. Um den restlichen Ablauf muss man sich selbst kümmern, die Funktion verteilt lediglich die Symbole.

Ich nehme mal an, dass die Türen sich automatisch öffnen, sobald man ein Symbol betritt, und dass immer nur eine Tür offen ist. Also ich trete auf Symbol 2 -> Tür 2 geht auf. Ich trete auf Symbol 5 -> Tür 2 geht wieder zu, Tür 5 geht auf.
Und wenn ich durch eine offene Tür gehe, komme ich automatisch in den nächsten Raum.

In die repeatedly_execute des Raumes müsste dann etwa folgendes:

Code: Alles auswählen

int a=GetPlayerSymbol();
if (a>0) letztes=a;
Wobei "letztes" eine globale Variable ist, die mir das zuletzt betretene Symbol angibt.

Eine andere gl. V. (next) zeigt an, welcher Planet als nächstes betreten werden muss, sie zählt mit. Ist anfangs 1, da Merkur als erstes drankommt.

Spieler betritt den Raum:

Code: Alles auswählen

if (next==letztes+1)  // Spieler hats richtig gemacht
  SetPlates(next, true);
else {  // Pech gehabt
  SetPlates(next, false); // richtiges nicht dabei
  if (Random(1)==1) letztes=next-1; // 50:50, ob der nächste Raum das richtige enthalten wird
}
Spieler tritt durch eine Tür:

Code: Alles auswählen

if (letztes==next) {  // richtige Tür
  next++;
  if (next<10) player.ChangeRoom(2, x, y);
  else player.ChangeRoom(r, x, y);  // geschafft
Stimmt noch nicht so ganz, muss jetzt weg, werds mir später nochmal anschauen.
Use gopher repellent on funny little man
Antworten