Mühle im Weltraum

Fragen zu "Adventure Game Studio"? Hier rein!
Antworten
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Mühle im Weltraum

Beitrag von falko-diekmann »

Ich weiß wieder einmal nicht weiter:

Ich versuche gerade ein Mini-Game in mein Adventure einzubauen.
Es geht darum das man auf einem fremden Planeten landen muss. Der ist aber von feindlichen Raumschiffen bewacht.
Das Spielprinzip ist Mühle-mäßig :

Der Spieler kann sein Schiff auf ein jeweils angrenzendes Feld bewegen, dann ist die feindliche Flotte dran und kann ebenfalls ein Schiff (von dreien) bewegen.
Zieht der Spieler auf ein von Feinden besetztes Feld, wird das feindliche Schiff zerstört. Gelingt es dem Feind auf das vom Spieler besetzte Feld zu ziehen ist halt der Spieler tot.

Das Spielfeld sieht so aus (ohne Schiffe und Objekte):

Bild


Der Ausgangspunkt für den Spieler ist ganz links...
Mein Problem ist nun das ich es nicht hinkriege die feindlichen Schiffe wirklich sinnvoll zu bewegen. Ich habe das bisher mit Global Ints versucht. Das ist aber so schnell SO unübersichtlich geworden das ich langsam die Nerven verliere.

Jedes Schiff hat einen eigenen Int der angibt an welchem Punkt es sich gerade befindet. Theoretisch, hatte ich mir gedacht, ergibt sich daraus ein Mühle-ähnliches Spiel. Die Gegner agieren halbwegs intelligent und machen es dem Spieler schwer sein Ziel zu erreichen.
Aber schon nach dem 3. oder 4. Spielzug hab ich dermaßen die Übersicht verloren das ich einfach nicht mehr weiter weiß.
Ich hab mich so sehr in den verschiedenen "if´s" verheddert das ich im Moment gar nicht mehr durchblicke.

Gibt es nicht eine elegante Möglichkeit das zu lösen?

Wenn sich jemand mit den nötigen Script-Kenntnissen bereit findet mir da raus zu helfen, kann ich gerne auch den entsprechenden Raum mal zur besseren Ansicht rüberschicken.
Im Moment kann man allerdings nur die jeweils angrenzenden Punkte ansteuern, sonst tut sich da nicht viel...
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Du musst erst mal Struktur reinbringen.

Code: Alles auswählen

// header
struct data {
  int wp[6];
  int s;  // -1: spieler, 0: leer: 1-3: feindliches Schiff
}

// raumskript
data wp[30];

function wegPunkte(w, w1, w2, w3, w4, w5) {
  wp[w].wp[1]=w1;
  wp[w].wp[2]=w2;
  wp[w].wp[3]=w3;
  wp[w].wp[4]=w4;
  wp[w].wp[5]=w5;
}

function initWegPunkte() {  // angrenzende Punkte setzen
  wegPunkte(1, 2, 3, 0, 0, 0);
  wegPunkte(2, 1, 7, 8, 9, 0);
  // usw...
}
Dann musst Du Dir Funktionen schreiben, die die für die KI notwendigen Werte zurückliefern.

Nur eine kleine Warnung: es wird schwer =)
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 »

uii eine neue Herausforderung für khrismuc ;)
Danke, Adventuretreff! <3
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

khrismuc hat geschrieben: Nur eine kleine Warnung: es wird schwer =)
Hm, den Eindruck hab ich jetzt allerdings auch.
Naja, ich wurstel mich jetzt mal son bißchen da rein und versuche es einfach.
Wenn ich wieder vor einer Wand stehe, melde ich mich einfach nochmal ;)
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

Ich habe mich jetzt vorerst doch gegen die KI entschieden und habe das ganze etwas umgestrickt.
Hat mit Mühle eigentlich nüscht mehr zu tun...
Dadurch verhalten sich die Gegner jetzt zwar manchmal doof wie Brot, sind aber nicht minder gefährlich ;)

Ich hab jetzt nur folgendes Problem:

Ich möchte eine Art Kollisionsabfrage einbauen.
Wenn Global Int X und Global INT Y gleich sind, soll was schlimmes passieren. Im Tutorial hab ich nichts gefunden, habe da nach "equal" und ähnlichem gesucht.
Meine Funktion im Room Repeatedly Execute sieht so aus :

if (GetGlobalInt(15) == (GetGlobalInt(16)) {
character[STOL].LockView(35);
character[STOL].Animate(0, 3, 0, eBlock, eForwards);
character[STOL].UnlockView();
character[STOL].ChangeRoom(8);
}

Fehlermeldung dazu ist:

end of input reached in middle of expression

Ich hatte schon fast damit gerechnet das es so nicht geht.
Weiß jemand wie ich zwei Ints mit einander vergleichen kann?

P.S.
Die IsCharCollidingwith...Geschichte hab ich auch angetestet, aber die scheint mir zu ungenau für diesen Zweck zu sein. Man kann ja zwar einstellen wie sensibel das reagiert, aber irgendwie gibbet sehr merkwürdige Effekte wenn ich das auf diesem Weg versuche...z.B. passiert eigentlich gar nichts wenn zwei Charaktere sich treffen, obwohl sie die selben Koordinaten einnehmen ?! ...
Manchmal klappt es dann aber auch...ziemlich unberechenbar...
Benutzeravatar
Rocco
Adventure-Treff
Adventure-Treff
Beiträge: 1019
Registriert: 25.11.2003, 16:20
Wohnort: Ronville
Kontaktdaten:

Beitrag von Rocco »

falko-diekmann hat geschrieben:
if (GetGlobalInt(15) == (GetGlobalInt(16))

Fehlermeldung dazu ist:

end of input reached in middle of expression
also diese meldung rührt eindeutig von einem klammerfehler.
ich denke schon das es prinzipiell so funktioniert, aber mit einer klammer weniger:
if (GetGlobalInt(15) == GetGlobalInt(16))
versuchs mal so
Benutzeravatar
Floyd
Logik-Lord
Logik-Lord
Beiträge: 1088
Registriert: 14.03.2004, 19:59

Beitrag von Floyd »

Noch zu deinem Minispiel:
Mit AGS habe ich zwar noch keine KI geschrieben, die generelle Realisierung des Spiels inklusive KI stelle ich mir in diesem Fall aber nicht soo schwer vor, da die Möglichkeiten zum einen doch relativ begrenzt sind und das Programm ja auch nicht perfekt agieren muss.
Eine andere Frage ist, ob dein Spiel überhaupt funktionieren würde, für mich sieht es nämlich eher so aus, als würde bereits nach relativ kurzer Zeit eine Pattsituation entstehen bzw. als könnte der Spieler gar nicht gewinnen.
Benutzeravatar
KhrisMUC
Adventure-Gott
Adventure-Gott
Beiträge: 4674
Registriert: 14.03.2005, 00:55
Wohnort: München

Beitrag von KhrisMUC »

Man kann übrigens statt character[STOL].Befehl(); auch kurz cStol.Befehl(); schreiben.
Use gopher repellent on funny little man
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

Rocco hat geschrieben:
falko-diekmann hat geschrieben:
if (GetGlobalInt(15) == (GetGlobalInt(16))
ich denke schon das es prinzipiell so funktioniert, aber mit einer klammer weniger:
if (GetGlobalInt(15) == GetGlobalInt(16))
versuchs mal so
Hm?
Da sind doch genau so viele Klammern drin wie bei mir?
Oder bekomme ich Augenkrebs?! ;)

Ne, ich habe schon versucht...moment...jetzt seh ich grad...das ist ja doch eine Klammer weniger...Naja...ist halt schon spät geworden (oder ich hab wirklich Augenkrebs) ;)

Das werde ich gleich mal ausprobieren, danke für den Hinweis.

@Floyd
Sowas ähnliches habe ich zuerst auch befürchtet, weil die Spielfeleder recht willkürlich angeordnet sind.
Ich hab´s aber inzwischen "am laufen" bekommen (bis auf die Kollisionsabfrage halt), ich hab das jetzt ein paar Mal getestet und es gibt aber eine Möglichkeit da durch zu kommen. Allerdings wohl wirklich nur EINE ;)
Ich hab sogar noch einen 4. Gegner reingebastelt weil es sonst zu leicht gewesen wäre, zu viele Lücken zum durchschlüpfen ;)

Die Gegner bewegen sich jetzt anhand einer festgelegten Route, können also nicht drauf reagieren wenn der Spieler auf dem angrenzenden Feld ist. Es ist also auch ein bißchen Glück dabei, ob der entsprechende Punkt nun in der Route als nächstes dran ist oder nicht.
Was die Sache etwas leichter macht ist aber, das die Gegner nicht auf das Feld zurück können, was sie einen Zug vorher besetzt hatten. Das lässt den Spieler besser planen.

So wie es jetzt läuft finde ich es wirklich schwer genug, da brauche ich wahrscheinlich keine KI. Davon abgesehen das ich die wahrscheinlich eh nicht hinbekommen hätte ;)
Dafür reicht´s Wissen noch nicht aus.

Bevor dieses Mini-Spiel kommt, hat der Spieler aber die Wahl ob er sich damit befassen will; es gibt auch noch 2 etwas einfachere Wege den Planeten zu erreichen. (Ein einziger Lösungsweg ist ja doch schon etwas hart ;) ).

Danke für die Hinweise aber nochmal allgemein...
Ohne das Forum wär man ja doch schon ziemlich aufgeschmissen :)


EDIT:

Das mit der Klammer stimmt! Jetzt läuft es! Hurra Hirro! :)
Ich hab zwar selber schon versucht nen paar Klammern weg zu lassen, aber natürlich immer nur die falschen...
Wunderbar :) :) :)
Jetzt kann ich mich endlich wieder anderen Dingen widmen ;)
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Maximale Anzahl von Ints?

Beitrag von falko-diekmann »

Mal was anderes:

Weiß jemand ob es eine maximale Anzahl von Global Ints gibt die man verwenden kann?
Macht das Programm ab einer bestimmten Anzahl Mucken, oder ist das nach oben unbegrenzt?
Benutzeravatar
Sinitrena
Tastatursteuerer
Tastatursteuerer
Beiträge: 678
Registriert: 08.05.2004, 01:01
Wohnort: Frankfurt
Kontaktdaten:

Beitrag von Sinitrena »

Code: Alles auswählen

  500  script GlobalInts
  50  script GlobalStrings
  100  interaction editor global variables
Für solche Fragen lohnt es sich in der AGS-Hilfe unter "System Limits" zu schauen.
http://www.sinitrena.de.vu Meine Spiele: "A very special dog", "A magic stone", "James Bond - Who wants to live again?", "Lonely Night", "Death of an Angel", "The Witch, the Wizard and the Blue Cup", "Emerald Eyes"
Benutzeravatar
falko-diekmann
Verpackungs-Wegwerfer
Verpackungs-Wegwerfer
Beiträge: 91
Registriert: 01.11.2005, 15:31
Wohnort: Dortmund
Kontaktdaten:

Beitrag von falko-diekmann »

Hm, hab ich wohl übersehen.
Oder den falschen Suchbegriff eingegeben ;)
Antworten