


Zur Zeit online: keiner ausser dir |


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.
|
|



|