Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› Allgemein —› Kartenscripte

Autor Mitteilung
verfasst am: 10.10.2012, 20:52
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Frage: Kann man aus einem Kartenscript (xma) auf Variable des Spielscriptes (xms) zugreifen?

Grund: Ich möchte "ufokonforme", aber variable Bodeneinsatzkarten haben - so wie unter der v915-Version oder wie im "Tagebuch des William Walker".
Unter "ufokonform" verstehe ich, dass z.B. ein kleines Ufo (Aufklärer) auch im Bodeneinsatz klein ist oder ein großes Kampfraumschiff auch als großes Raumschiff im Bodeneinsatz auftaucht. (Die Kartenräume für die Raumschiffe sind fertig).
verfasst am: 11.10.2012, 07:52
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Es gibt verschiedene Möglichkeiten, dies zu erreichen.
Die eine Variante wären die Xeltaan-Karten aus meinem GalWar, eine andere die Bodeneinsatz-IDs.
Ich weiß nicht mehr auswendig, wie ich das damals bei den Xeltaan gemacht hatte und hab jetzt auch nicht die Zeit, dort nachzuschauen - Such die entsprechende Karte im GalWar-Spielsatz und schau dort in das Skript. Ich meine ich hätte da mit irgendeiner Datenübertragungstechnik gearbeitet.

Bei den Bodeneinsatz-IDs musst Du im Endeffekt jedem Raumschiff einen oder mehrere Bodeneinsätze zuordnen. Dann kannst Du entweder für jedes UFO ein eigenes spezifisches Kartenskript (und Karte) machen, oder aber dort denselben Trick wie bei der Xeltaan-Karte einbauen, um dieselbe Karte verwenden zu können.
verfasst am: 12.10.2012, 09:50
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Vielen Dank für den Hinweis. Ich habe mir das Kartenscript einmal angesehen. Für meine Zwecke müsste ich wahrscheinlich sehr viel hinzufügen, da ich mich sehr an "XCom1" orientiere. Daher brauche ich für ein Ufo zwei Karten: Ufo gelandet und Ufo abgeschossen. Desweiteren sollen Alienbasen erobert werden. Zusammen sind das mindestens 17 Karten mit variablen Inhalten. Hier scheint die Lösung wie im "Tagebuch des William Walker" einfacher, da ich praktisch nur einen Raum in jedem Script vorgeben muss, der Rest wird im Script zugewürfelt. Ich brauche daher in dem 16x kopierten Script jeweils nur einen Raum (= Ufo) zu tauschen und erhalte so - hoffentlich - die entsprechende Karte.Für die Alienbasis liefert das Tagebuch ebenfalls sehr brauchbare Hinweise. Ich möchte mich daher an dieser Stelle herzlichst bei Kreks bedanken, dem Autor des Tagebuchs.
verfasst am: 12.10.2012, 10:01 · Edited by: DirkF
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Klar, der Hauptgrund für meine relativ komplexe Xeltaan-Lösung bestand darin, dass ich damals noch den alten Karteneditor benutzen musste.
Damit wäre eine Aufteilung auf mehrere Karten aufwendiger geworden, weil man die Raumdaten on keiner Form kopieren konnte. Und auch die Bodeneinsatz-Objekte gab es damals noch nicht.

Deswegen gab es auch keine Folgekarte für andere Rassen, nachdem Natter die neuen Optionen umgesetzt hatte war es anders einfacher (nur hatte ich dann keine Zeit mehr :-()


(P.S. kannst Du den Post an Dich sehen und antworten?)
verfasst am: 20.10.2012, 10:10
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Kurze Mitteilung:
Ich habe dein Xeltaan- und Kreks Silo-Kartenscript zusammengeworfen und kann jetzt alle 18 Karten aus einer m3d-Datei generieren - also gelandete Ufos und abgeschossene Ufos bekommen ihre angepasste karte. Danke für den Hinweis.
verfasst am: 20.10.2012, 22:03
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Könntest Du mir das Skript mal mailen oder es im Forum posten?
Nur das reine Kartenskript, nicht die komplette m3d-Datei...

Danke
verfasst am: 21.10.2012, 21:45 · Edited by: AlterKnacker
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Hier kurz etwas zu der Bodeneinsatzkarte. Darin sind 16 Häuser-, 3 XF-Start-, und 13 Straßenkarten (alle aus Kreks Silo.m3d). Ich habe 10 Special-, 16 Ufo- und 8 Wiesenkarten hinzugefügt. Da ich mit einem 2 GHz-Pentium arbeite, dauert das Generieren einer Einsatzkarte 50 Sekunden und hier das Skript:
// Scriptanleihen aus Kartenskript Xeltaan, Silo von DirkF und Kreks
//
// Dieses Skript soll die Missionskarten den UFOs passend erzeugen
program XF_UFO_3;

const
// Setze Mission-ID-Konstanten für UFOs
//------------------ UFOs
  ID_UFO_Ak = 1747212253; // kleiner Aufklärer
  ID_UFO_Am = 2364291507; // mittlerer Aufklärer
  ID_UFO_Ag = 4227723396; // großer Aufklärer
  ID_UFO_EF = 2283947673; // Entfuehrer
  ID_UFO_EM = 1508034818; // Erntemaschine
  ID_UFO_VR = 2206324373; // Versorgungsraumschiff
  ID_UFO_TR = 288061711;  // Terrorraumschiff
  ID_UFO_KR = 147168592;  // Kampfraumschiff
  ID_UFO_BB = 1091434003; // Basisbauer

// Setze Mission-ID-Konstanten für manuelle Zuordnung
  klein1  = 1; // äquivalent kleiner Aufklärer
  klein2  = 2; // äquivalent mittlerer Aufklärer
  klein3  = 3; // äquivalent großer Aufklärer
  mittel1 = 5; // äquivalent Entfuehrer
  mittel2 = 6; // äquivalent Erntemaschine
  mittel3 = 7; // äquivalent Terrorraumschiff
  mittel4 = 7; // äquivalent Versorgungsraumschiff
  gross1  = 8; // äquivalent Kampfraumschiff
  gross2  = 8; // äquivalent Basisbauer

  HOUSE_COUNT = 16;
  STREET_COUNT = 2;
  XF_COUNT = 3;
  SPECIAL_COUNT = 9;
  BASE_COUNT = 3;
  WIESE_COUNT = 8;
  R_SIZE = 15;
  MAPROOMS = 4;

var
  used : array[0..3] of array[0..3] of boolean;
  MissionID: longword;

// bestimmt die Größe der Einsatzkarte
procedure CalculateMapSize(Units : Integer);
begin
  MapWidth  := Units * R_SIZE;
  MapHeight := Units * R_SIZE;
end;

// allgemeine Raumsetzprozedur
procedure CopyRoomXY(x,y,Ext : longint; MapName : string);
var
  Extension : string;
begin
  if (Ext = 0) then
    Extension := ''
   else
    Extension :=  inttostr(random(Ext) + 1);
  CopyRoomToPos(x * R_SIZE, y * R_SIZE, MapName + Extension);
  used[x][y] := true;
end;

// Straßenbau
// Straße ist 4 bis 5 Räume groß und beginnt/endet in der Mitte einer Seite
procedure SetStreet;
begin
  case random(8) of //Straße beginnt an einer Seite
    0 : begin
          CopyRoomXY(0,1,STREET_COUNT,'StreetWE');
          CopyRoomXY(1,1,STREET_COUNT,'StreetWE');
          CopyRoomXY(2,1,STREET_COUNT,'StreetWE');
          CopyRoomXY(3,1,STREET_COUNT,'StreetWE');
        end;
    1 : begin
          CopyRoomXY(0,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(1,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(2,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(3,2,STREET_COUNT,'StreetWE');
        end;
    2 : begin
          CopyRoomXY(1,0,STREET_COUNT,'StreetNS');
          CopyRoomXY(1,1,STREET_COUNT,'StreetNS');
          CopyRoomXY(1,2,STREET_COUNT,'StreetNS');
          CopyRoomXY(1,3,STREET_COUNT,'StreetNS');
        end;
    3 : begin
          CopyRoomXY(2,0,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,1,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,2,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,3,STREET_COUNT,'StreetNS');
        end;
    4 : begin
          CopyRoomXY(2,0,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,1,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,2,STREET_COUNT,'CurveNE');
          CopyRoomXY(1,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(0,2,STREET_COUNT,'StreetWE');
        end;
    5 : begin
          CopyRoomXY(1,0,STREET_COUNT,'StreetNS');
          CopyRoomXY(1,1,STREET_COUNT,'StreetNS');
          CopyRoomXY(1,2,STREET_COUNT,'CurveSE');
          CopyRoomXY(2,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(3,2,STREET_COUNT,'StreetWE');
        end;
    6 : begin //Edge 3
          CopyRoomXY(0,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(1,2,STREET_COUNT,'StreetWE');
          CopyRoomXY(2,2,STREET_COUNT,'CurveNW');
          CopyRoomXY(2,1,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,0,STREET_COUNT,'StreetNS');
        end;
    7 : begin //Edge 4
          CopyRoomXY(0,1,STREET_COUNT,'StreetWE');
          CopyRoomXY(1,1,STREET_COUNT,'StreetWE');
          CopyRoomXY(2,1,STREET_COUNT,'CurveSW');
          CopyRoomXY(2,2,STREET_COUNT,'StreetNS');
          CopyRoomXY(2,3,STREET_COUNT,'StreetNS');
        end;
  end;
end;

// Art des Ufos bestimmen, Frage: Landung/Abschuss ('_dmg')
function CalculateMapName : string;
var
  Ground: TGround;
  UfoName: string;
begin
  Ground:=map_api_GetGround;
  MissionID:=Ground.UFOModelID;
  case MissionID of
    ID_Ufo_Ak, klein1:  UfoName:='Ufo_Ak';
    ID_Ufo_Am, klein2:  UfoName:='Ufo_Am';
    ID_Ufo_Ag, klein3:  UfoName:='Ufo_Ag';
    ID_Ufo_EF, mittel1: UfoName:='Ufo_EF';
    ID_Ufo_EM, mittel2: UfoName:='Ufo_EM';
    ID_Ufo_VR, mittel3: UfoName:='Ufo_VR';
    ID_Ufo_TR, mittel4: UfoName:='Ufo_TR';
    ID_Ufo_KR, gross1:  UfoName:='Ufo_KR';
    ID_Ufo_BB, gross2:  UfoName:='Ufo_BB';
  end;
  if (Ground.UserTag = '0') then
    UfoName := UfoName +'_dmg'; // Abschuss
  result := UfoName;
end;

// Alienbasis
procedure CopyBaseRoom(x,y : Longint; Name1,Name2: string);
begin
  if (random(2)=1) then
    CopyRoomToPos(x * R_SIZE, y * R_SIZE, Name1)
   else
    CopyRoomToPos(x * R_SIZE, y * R_SIZE, Name2);
  used[x][y] := true;
end;

//Freie Position besetzen (Ufo, Landeplatz, XForce)
procedure PlaceMap(x,y,Ext: longint; Map : string);
var
  runs: LongInt;
  Mapset: boolean;
begin
  Mapset := false;
  runs := 0;
  repeat
    begin
      x := MAPROOMS - 1;
      y := random(MAPROOMS);
      if (used[x][y] = false) then
        begin
          Mapset := true;
          CopyRoomXY(x,y,Ext, Map);
        end;
      inc(runs);
    end
  until ((Mapset) or (runs > 10));
end;

// Ufo-Landeplatz (Landung und Abschuss)
procedure PlaceAirport;
begin
  PlaceMap(random(MAPROOMS),random(MAPROOMS),0, 'Special9');
end;

// Ufo auf freien Platz setzen
procedure PlaceUfo(Ufomap : string);
begin
  PlaceMap(MAPROOMS - 1,random(MAPROOMS),0, Ufomap);
end;

// XForce-Startposition setzen
procedure PlaceXForce;
begin
  PlaceMap(MAPROOMS - 1,random(MAPROOMS), XF_COUNT, 'XF-Start');
end;

// Alienbasis und Ufo-Landeplatz
procedure SetBase;
begin
  case random(BASE_COUNT) of
    0 : begin
          CopyBaseRoom(2,1,'Special1','Special5');
          CopyBaseRoom(2,0,'Special2','Special6');
          CopyBaseRoom(3,0,'Special3','Special7');
          CopyBaseRoom(3,1,'Special4','Special8');
                  end;
    1 : begin
          CopyBaseRoom(2,2,'Special1','Special5');
          CopyBaseRoom(2,1,'Special2','Special6');
          CopyBaseRoom(3,1,'Special3','Special7');
          CopyBaseRoom(3,2,'Special4','Special8');
                  end;
    2 : begin
          CopyBaseRoom(2,3,'Special1','Special5');
          CopyBaseRoom(2,2,'Special2','Special6');
          CopyBaseRoom(3,2,'Special3','Special7');
          CopyBaseRoom(3,3,'Special4','Special8');
        end;
  end;
  PlaceAirport;
end;

//Restfläche mit Häuser/Wiesen auffüllen
procedure SetHausWiese(Anz: integer; Maps : string);
var
  x,y : LongInt;
begin
  for x := 0 to MAPROOMS - 1 do
    for y := 0 to MAPROOMS - 1 do
      if (used[x][y] = false) then
        CopyRoomXY(x,y,Anz,Maps);
end;

procedure GenerateMap;
var
  Ground: TGround;
  x, y : LongInt;
begin
  CalculateMapSize(MAPROOMS);
  //löscht das Array 'used'
  for x := 0 to MAPROOMS - 1 do
    for y := 0 to MAPROOMS - 1 do
      used[x][y] := false;
  PlaceXForce;
  Ground := map_api_GetGround;
  if (Ground.UFOModelID = ID_Ufo_BB) then
    begin                     // Alienbasis
      SetBase;
      SetHausWiese(WIESE_COUNT,'Wiese');
    end
   else
    begin                     // Ufos
      SetStreet;
      PlaceUfo(CalculateMapName);
      SetHausWiese(HOUSE_COUNT,'House');
    end;
end;

begin
  // hier kein Code
end.
Den Hinweis, wie man auf Spieldaten zugreifen kann, lieferte die Befehlszeile
Ground := map_api_GetGround
Damit kann ich auf UFO-Modelle zugreifen und über Usertag kann ich in beschränketem Maße Daten für die Karte bereitstellen.
verfasst am: 27.10.2012, 15:47 · Edited by: AlterKnacker
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Korrektur der Kartenskriptprozedur "Placemap":

//Freie Position besetzen (Ufo, Landeplatz, XForce)
procedure PlaceMap(x,y,Ext: longint; Map : string);
var
  runs: LongInt;
  Mapset: boolean;
begin
  Mapset := false;
  runs := 0;
  repeat
    begin
//      x := MAPROOMS - 1;
//      y := random(MAPROOMS);
      if (used[x][y] = false) then
        begin
          Mapset := true;
          CopyRoomXY(x,y,Ext, Map);
        end;
      inc(runs);
    end
  until ((Mapset) or (runs > 10));
end;


x- und y-Koordinaten werden Übergeben an die Prozedur, brauchen daher nicht berechnet zu werden. Sorry, war noch aus dem Entwurf stehengeblieben.
verfasst am: 10.11.2012, 21:50
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Noch ein Hinweis zur Datenübergabe zum Kartenscript: In meinem Kartenskript funktioniert bei mir NUR die Datenübergabe durch 'Boden.UserTag'. Dort kann man mittels TStringArray mehrere Daten übergeben. Nicht funktioniert bei mir die Übergabe der Ufo-ID (Ground.UFOModelID)). Daher übergebe ich jetzt den Ufonamen. Wurde z.B. der Bodeneinsatz durch ein Kampfraumschiff ('UFO-KR') verursacht wurde, wird dieser Name mit dem UserTag übergeben. Da die Karte mit diesem Raumschiff die gleiche Bezeichnung hat, wird diese dann mit
CopyRoomToPos(x * R_SIZE, y * R_SIZE, Boden.UserTag);

in die Bodenkarte kopiert.

Entschuldigung für das nur teilweise funktionierende Kartenscript, mittels UserTag funktioniert jetzt alles in meiner Einsatzkarte.
Probleme habe ich noch mit der Alienübergabe bei Start nach Abbruch eines Bodeneinsatzes, da nur die Anzahl der sichtbaren Aliens zur Verfügung stehen, nicht die Gesamtzahl (so wie in der v915b4) - da experimentiere ich noch, wie ich aus dieser Zwickmühle herauskomme (Wenn Aliens sichtbar, dann Soldaten weg), aber ich sehe ein kleines Licht im Tunnel.
verfasst am: 11.11.2012, 09:50
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Zitat: AlterKnacker
Nicht funktioniert bei mir die Übergabe der Ufo-ID (Ground.UFOModelID)).

Die ModelID im Bodeneinsatz wird normalerweise bei Abschuss eines UFOs automatisch gesetzt. Ein manuelles setzen dieses Wertes war ursprünglich (bevor man Bodeneinsätze manuell erzeugen konnte) nicht vorgesehen.

Dieser Wert wurde dann verfügbar gemacht für X-Skript (sowas geht schnell), aber eben nicht um Routinen zur manuellen Eingabe erweitert.

Das ist der Grund weshalb eine manuelle Datenübergabe nur über das Usertag funktioniert. Aber im Falle eines abgeschossenen UFOs sollte die ID danach im Bodeneinsatz korrekt sein, allerdings eben nicht für manuell erstellte Bodeneinsätze ohne Abschuss.
verfasst am: 11.11.2012, 14:39
Registrierdatum: 31.01.2010, 20:05

 Beiträge: 122
Danke für die Erläuterungen. Das Kartenscript war mit abgeschossenen Ufos getestet worden - also lief es scheinbar.



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.019 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003