Autor Thema: Edisons sollen Charakter jagen/ins Verließ schicken.  (Gelesen 63 mal)

TheGuyWhoIsHere

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 86
  • Geschlecht: Männlich
  • Wer das liest, kann lesen
    • Profil anzeigen
    • E-Mail
Edisons sollen Charakter jagen/ins Verließ schicken.
« am: 15. April 2025, 00:17:08 »
Hallo zusammen.

Ich arbeite zurzeit an meinem Adventurer und wundere mich wie ich die Edisons dazu bringe die spielbaren  Charakteren zu jagen und ins Verließ zu schicken. Selbes gilt auch für wenn ein Charakter der gerade nicht gespielt wird von den Edisons im Flur erwischt wird.

Schonmal danke im voraus.  ;D

Cmdr

  • volljähriger Tentakel
  • *****
  • Beiträge: 763
    • Profil anzeigen
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #1 am: 15. April 2025, 09:23:12 »
Du könntest im GlobalScript in der Funktion repeatly_execute eine Abfrage einbauen, ob sich ein Edison und ein Spielcharakter im selben Raum befinden. Falls ja, wird dann eine entsprechende Sequenz abgespielt.

Bòógieman

  • International anerkannter Superheld
  • Globaler Moderator
  • alter Tentakel
  • *****
  • Beiträge: 2682
  • Geschlecht: Männlich
  • Grün Tentakel = Running Sushi!
    • Profil anzeigen
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #2 am: 15. April 2025, 09:26:27 »
Es ist zwar 100 Jahre her und AGS hat sich auch komplett verändert, aber es gab da einen Befehl, mit dem man einen NPC einem anderen Charakter folgen lassen konnte. Da gibt man nur den anderen Char an (in deinem Fall player) und die Distanz die der Verfolgende Abstand halten soll (da bleibt der Charakter dann einfach stehen).
Anhand der Koordinaten der Charaktäre kannst du zyklisch checken, ob die Koordinaten vom NPC und player nah genug beieinander sind, bevor du die Gefangen-Sequenz triggerst.

hier ein Thread vom AGS-Forum, der dich in die richtige Richtung bringen könnte
« Letzte Änderung: 15. April 2025, 09:29:02 von Bòógieman »
Schlachtaman Vibrations, UHYEAH!!!
_________________________________

>>>> Ende der Kommunikation <<<<

TheGuyWhoIsHere

  • kleiner Tentakelsaugknopf
  • **
  • Beiträge: 86
  • Geschlecht: Männlich
  • Wer das liest, kann lesen
    • Profil anzeigen
    • E-Mail
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #3 am: 15. April 2025, 12:54:08 »
Der Thread konnte mir leider noch nicht helfen. Aber trotzdem Danke.

Das mit dem GlobalScript hatte mir geholfen, aber dann fiel mir ein das ich den Edison zuerst Script fürs Spiel geben sollte, als mir dies geschehen ist.
« Letzte Änderung: 15. April 2025, 13:01:42 von TheGuyWhoIsHere »

Cone Arex

  • Mod
  • alter Tentakel
  • **
  • Beiträge: 2339
  • Geschlecht: Männlich
  • Skandal-Entwickler und Idiot
    • Profil anzeigen
    • Conequest
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #4 am: 15. April 2025, 16:09:58 »
In den alten Starterpacks mit AGS 2.62-Codebasis gab es. soweit ich weiß unvollständige, Reste des entsprechenden Codes für das Jagen aus Maniac Mansion Deluxe:

GlobalScript:
// ============================= hunter ===========================================
// this section after cutscene functions
int hunter_char = NO_CHAR;
// two-dimeanional hunting
#define STEPS_UNTIL_DIR 10
int steps = STEPS_UNTIL_DIR;
int lastx = -1;
int lasty = -1;
// give player time to act
#define COUNTDOWN_OFF -1
#define COUNTDOWN_START 400
#define COUNTDOWN_STOPPED -2
int countdown = COUNTDOWN_OFF;
int hunter_area = -1;

function StartHunting (int hunter){
  hunter_char = hunter;
  lastx = -1;
  lasty = -1;
  countdown = COUNTDOWN_OFF;
  // switch player disabled
  // avo- SetGlobalInt (291, 1); // avo veraltet
}

function StartCountdown (){
  // give player some time to think and react
  // but player can't move
  SetGlobalInt (2, 0);
  hunter_area = GetWalkableAreaAt (character [GetPlayerCharacter ()].x - GetViewportX (), character [GetPlayerCharacter ()].y - GetViewportY ());
  RemoveWalkableArea (hunter_area);
  countdown = COUNTDOWN_START;
}

function StopHunting (){
  hunter_char = NO_CHAR;
  // player may move
  if (hunter_area >= 0)
  {
    RestoreWalkableArea (hunter_area);
    hunter_area = -1;
  }
  SetGlobalInt (2, 1);
  // switch player enabled
  // avo- SetGlobalInt (291, 0); // avo veraltet
}

function IsHunting (){
  int result = hunter_char != NO_CHAR;
  if (result)
  {
    // stop hunting when chars are in different rooms
    if (character [hunter_char].room != character [GetPlayerCharacter ()].room)
    {
      StopHunting ();
      result = hunter_char != NO_CHAR;
    }
  }
  return result;
}

function HunterSucceeded (){
  int hunter = hunter_char;
}

function TimeToActIsOver (){
  int hunter = hunter_char;
}

function DoHunting (){
  int caught = 0;
  int charid = GetPlayerCharacter ();
  int px = character [charid].x;
  int py = character [charid].y;
  // check distance
  int dx = px - character [hunter_char].x;
  int dy = py - character [hunter_char].y;
  if ((dx * dx + dy * dy) <= 500)
  {
    caught = 1;
    HunterSucceeded ();
  }
  else if (steps <= 0)
  {
    if ((px != lastx) || (py != lasty))
    {
      // correct HUNTER's direction
      MoveCharacter (hunter_char, px, py);
      lastx = px;
      lasty = py;
    }
    steps = STEPS_UNTIL_DIR;
  }
  else steps--;
  return caught;
}

function RepExec_Hunting (){
  int caught = 0;
  if (IsHunting ())
  {
    if (countdown == COUNTDOWN_OFF) caught = DoHunting ();
    else if (countdown == 0)
    {
      countdown = COUNTDOWN_OFF;
      TimeToActIsOver ();
    }
    else if (countdown > 0) countdown--;
  }
  return caught;
}

GlobalHeader:
#define NO_CHAR -1

// --- hunting ---
import function StartHunting (int hunter);
import function StopHunting ();

Du musst mal schauen, ob du das brauchen und eventuell auf die aktuelle Scriptsprache umbauen kannst.


Folge mir auf X und itch.io

alphawolf300

  • Teenie Tentakel
  • ****
  • Beiträge: 352
    • Profil anzeigen
    • E-Mail
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #5 am: 15. April 2025, 16:39:48 »
Das, was Cone Arex sagt, ist mir auch in neueren Starterpacks über den Weg gelaufen, aber wenn es unvollständig ist, weiß man natürlich nicht, wo man ansetzen soll.

Die Funktion "FollowCharacter" ist noch aktuell, allerdings sie nicht unbedingt geeignet, weil das folgen verzögert ist. Müsste man ausprobieren.

Mit
cEdna.FollowCharacter(player, 0, 20);wird ein Charakter verfolgt.

Mit
cEdna.FollowCharacter(null);wird die Verfolgung aufgehoben.

Was man auch noch versuchen kann wäre
cEdna.Walk(player.x, player.y, eNoBlock, eWalkableAreas);, dann läuft der Charakter auch hinterher. Der Aufruf wäre dann über repeatly_execute , wie cmdr sagte. Eine weitere Funktion wäre dann das "fangen", die man bräuchte, sprich abfragen, ob Edna den Charakter eingeholt hat.

Zitat
wenn ein Charakter der gerade nicht gespielt wird von den Edisons im Flur erwischt wird.
Das ist nochmal eine andere Sache. Bedeutet das, dass, wenn der Spieler von einem Edison verfolgt wird, und bei der Verfolgung an einem anderen Charakter vorbeilaufen würde, von der Verfolgung ablässt und sich stattdessen diesen Charakter schnappt? Das klingt auf jeden Fall kompliziert :)
Wenn es z. B. an der Tür klingelt und Ed läuft zur Tür, kann man mit Timern den Weg von Ed scripten (d.h., er läuft aus seinem Zimmer und 10 Sekunden lang hält er sich im Flur auf) und wenn sich in einem der Räume ein Charakter aufhält, wird er "eingesammelt". Die Frage ist, was passieren soll, wenn sich mehrere in einem Raum aufhalten, bzw. mehrere Charaktere in Eds Laufweg befinden. Das ist ein ziemlicher Rattenschwanz ... nicht umsonst hat Maniac Mansion darauf verzichtet. ;)

Cone Arex

  • Mod
  • alter Tentakel
  • **
  • Beiträge: 2339
  • Geschlecht: Männlich
  • Skandal-Entwickler und Idiot
    • Profil anzeigen
    • Conequest
Re: Edisons sollen Charakter jagen/ins Verließ schicken.
« Antwort #6 am: Heute um 02:55:39 »
Zitat
Das, was Cone Arex sagt, ist mir auch in neueren Starterpacks über den Weg gelaufen
Eigentlich sollte das in neueren SPs nicht vorhanden sein. Wenn du aber Starterpacks für 2.7.2 meinst: Die liefen auch noch mit der alten 2.6.2-Codebasis. Ist ein bisschen komplizierter. (Der Wechsel zur objektorientierten Scriptsprache erfolgte mit 2.7, nicht mit 3.0.)

Zitat
aber wenn es unvollständig ist, weiß man natürlich nicht, wo man ansetzen soll.
Da habe ich mich geirrt bzw. falsch ausgedrückt. Der Code fürs Jagen selbst ist vollständig. Nur fehlen die Reaktionen, das Stecken ins Verließ etc.

Und weil ich dummer Vollidiot bin, der nicht weiß was gut für ihn ist, habe ich das alte Hunting-Script mal für AGS 3.6.0 angepasst, mit weiteren Informationen versehen und außerdem Beispielreaktionen implementiert. Statt einfach mal früher pennen zu gehen.
Hunting-Script
Implementation mit Beispielen im Maniacweed-Starterpack (*Werbetrommel rühr*)

In dem Beispiel kann man von Edna (Flur unten), Ed (Kellerraum 1) und Britney (Schlafzimmer) verfolgt werden. Verfolgung über mehrere Räume hinweg wird nicht unterstützt (war in MMD soweit ich weiß auch der Fall). Allgemein finde ich die Umsetzung suboptimal.


Folge mir auf X und itch.io