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 —› X-Skript / Developer-Pack —› Hilfe im Script - Textmeldung erscheint nicht

Autor Mitteilung
verfasst am: 17.07.2011, 23:13 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Ich habe nun wieder ein Problem und suche die Lösung dafür.
Eines meiner Scripte soll einen Asteroiden (TUFO) erstellen, der von X nach Y fliegt. Wenn der Asteroid bei Y ankommt, schlägt er dort ein und erzeugt einen Bodeneinsatz (falls Land). Falls er aber vorher abgeschossen wird, bedankt sich das Land von Position Y und lässt auch ein kleines Dankeschön (25.000 Cr.) zukommen (im Fall einer vorraussichtlichen Wasserlandung zahlen "die umliegenden Staaten".

Nun habe ich das Problem, dass ich beim Abschuss keine Nachricht erhalte, das Geld jedoch schon. Auch wenn der Asteroid ins Meer einschlägt, bekomme ich keine Nachricht.

Hier einmal das komplette, betroffene Script:
// Dieses Script soll ein UFO (Asteroid) generieren, welches von A nach B fliegt
// und dort mit einem Escape einschlägt und einen Bodeneinsatz hinterlässt.
// Es wird regelmäßig vom Main-Script aufgerufen.
program CollapseAsteroids;
const
  AsteroidModelID=4062633786; // Die Spielsatzabhängige ID des Asteroiden-UFOs.
var
  UFO: TUFO;                  // Der Asteroid, um den es hier geht
  Target:TFloatpoint;         // Die Zielkoordinaten
  TargetCountry:Integer;      // Das Ziel-Land (Index)
  TargetCountryName: String;  // Das Ziel-Land (Name)

// Wird ausgelöst, wenn der Bodeneinsatz verschwindet
procedure EventCraterTimeUp(UFO:TObject);
begin
// Hier kommt noch mehr
  mission_lose;
end;

// Wird ausgelöst, wenn der Bodeneinsatz gewonnen wird
procedure EventCraterBeaten(UFO:TObject);
begin
// Hier kommt noch mehr
  mission_win;
end;

// Wird ausgelöst, wenn der Asteroid einschlägt
procedure EventAsteroidImpact(UFOObject:TObject);
var
  GroundMission: TGround;
begin
  if (UFO.OverLand) then
  begin
// Eine Nachricht wird gesendet und das Vertrauen der Bevölkerung des Einschlaggebietes sinkt.
    game_api_MessageBox('Der Asteroid ist in '+TargetCountryName+' eingeschlagen. Die Regierung von '+TargetCountryName+
' betrauert viele Tote und ist enttäuscht von Ihnen.');
    country_api_changeconfident(TargetCountry,-250);
// Der Bodeneinsatz wird erstellt und die Events registriert.
    GroundMission := ground_api_GenerateGround();
    GroundMission.PopulateFromUFO(UFO);
    GroundMission.MapName     := 'data\maps\aropretim\aro_city_crater.m3d';
    GroundMission.Name        := 'Asteroidenkrater';
    GroundMission.SensorText  := '';
    GroundMission.Description := 'Hier ist ein Asteroid eingeschlagen.'+
' Wir sollten den Bereich sichern und einige Proben für unsere Wissenschaftler mitnehmen.'+
' Satellitenbilder haben jedoch gezeigt, dass sich dort etwas bewegt. Seien Sie also vorsichtig.';
    GroundMission.Objectives  := 'Sichern Sie das Gebiet und nehmen Sie Proben für unsere Wissenschaftler mit.';
    GroundMission.Position    := UFO.Position;
    GroundMission.RemainTime  := 1440;
    GroundMission.Show;
    register_event(@EventCraterTimeUp,GroundMission,EVENT_ONGROUNDTIMEUP); 
    register_event(@EventCraterBeaten,GroundMission,EVENT_ONGROUNDFINISHED );
  end
  else
    game_api_MessageBox('Der Asteroid ist im Meer eingeschlagen.');  // Hier tritt ein Fehler auf
// Globale Variable 'AsteroidsImpacted' zählt die Asteroiden-Einschläge.
// Registriert wird sie im Haupt-Script.
  game_api_SetInteger('AsteroidsImpacted',game_api_GetInteger('Asteroids    Impacted')+1);
end;

// Falls der Asteroid vor dem Einschlag zerstört wird.
procedure EventAsteroidDestroy(UFOObject:TObject);
begin
// Falls der vorraussichtliche Einschlagsort auf Land war...
  if (TargetCountry>=0) then
  begin
// ... Zahlt die Regierung 25.000 Cr. für die Zerstörung des
// Asteroiden und das Vertrauen steigt.
    game_api_MessageBox('Die Regierung von '+TargetCountryName+' bedankt sich für die Zerstörung des Asteroiden'+
' und zahlt Ihnen eine Belohnung von 25.000 Cr.');  // Hier tritt ein Fehler auf
    savegame_api_FreeCredits(25000,kbEG);
    country_api_changeconfident(TargetCountry,250);
  end
  else
  begin
// Falls der vorraussichtliche Einschlagsort im Wasser war...
    game_api_MessageBox('Der Asteroid wurde zerstört.'+
' Die umliegenden Staaten zahlen Ihnen eine Belohnung von insgesamt 10.000 Cr.'); // Hier tritt ein Fehler auf
    savegame_api_FreeCredits(10000,kbEG);
  end;
  mission_win;
end;


procedure StartMission;
var
  AsteroidModel : TUFOModel;
begin
// Die folgenden Befehle erzeugen einen Asteroiden, ...
  ufo_api_GetUFOModelByID(AsteroidModelID,AsteroidModel);
  UFO:=ufo_api_CreateUFOFromModel(AsteroidModel);
// ... setzt das Ziel (mind. 4000 Einheiten entfernt), ...
  Repeat
    Target := earth_api_randomPoint(false);
  Until (earth_api_Distance(UFO.Position, Target)>4000);
  UFO.FlyToPoint(Target);
  TargetCountry:=country_api_CountryIndexOverPos(Target);
// ... verschickt eine Nachricht ...
  if (TargetCountry>=0) then
  begin
    TargetCountryName := country_api_getCountryByIndex(TargetCountry).Name;
    game_api_MessageBox('Es wurde ein Asteroid entdeckt, der vorraussichtlich in '+TargetCountryName+
' einschlägt. Zerstört diesen Asteroiden, um die Zivilisten im Zielgebiet zu retten.');
  end
  else
    game_api_MessageBox('Es wurde ein Asteroid entdeckt, der vorraussichtlich im Meer einschlägt.'+
'Dennoch solltet ihr den Asteroiden vorsichtshalber zerstören.');
// ... und registriert passende Events.
  register_event(@EventAsteroidImpact,UFO,EVENT_ONUFOESCAPE);
  register_event(@EventAsteroidDestroy,UFO,EVENT_ONUFOSHOOTDOWN);
end;

begin
  MissionName := 'Collapse_Asteroids';
  MissionType := mzUSER;
end.


Die Meldungen fehlen auch ausschließlich in Ingame-Tests. Im Debugger läuft alles bestens.


Nachträglicher Edit: Längere Zeilen umgebrochen, damit Foren-Format erhalten bleibt.
verfasst am: 18.07.2011, 02:02
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
die TFloat-Koordinaten arbeiten mit Grad-Koordinaten, d.h. 360 ist einmal um die Erde.
Eine Distanz von 4000 ist also ca. elfmal um die Erde gepflogen - die Maximale Entfernung zwischen zwei Punkten kann nur 180 sein.

Bitte korrigiere diese repeat-Abfrage - solche Überlauf-Abfragen haben schon oft Probleme bereitet, und dies dürfte ein Punkt sein wo das Skript nach einigen tausend durchläufen einen Überlauf erzeugt, ohne dass die Bedingung jemals erfüllt gewesen ist - das Programm korrigiert üblicherweise Koordinaten > 360 automatisch, d.h. diese Repeat-Schleife kann niemals regulär beendet werden.

Danach schau mal, wie das Skript ohne den Überlauf läuft...
verfasst am: 18.07.2011, 05:16 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Also erstmal earth_api_Distance liefert als Ergebnis eine Km-Angabe (der größte mögliche Abstand liegt also bei gut 20000). Wäre das nicht so, würde das ja auch schon in medit zum Fehler führen. Hab das mal im Wiki ergänzt.

Zu der fehlenden Nachricht im Spiel. Also das ist ein hinterlistiges Problem. Kennst du den Unterschied zwischen game_api_MessageBox und savegame_api_Message? Mal davon abgesehen, dass man bei letzterem auch noch einen Typ angeben kann, werden die savegame_api-Nachrichten erstmal zwischengespeichert, und dann zu geeigneter Zeit angezeigt (d.h. erst auf dem Geoscape und z.B. auch erst, wenn alle automatischen Handlungen einer Runde beendet wurden). Über die game_api kann man hingegen sofort eine Nachricht anzeigen (also auch in geöffneten Seiten, z.B. im Lager; siehe auch Tutorial-Spielsatz). Näheres dazu findet ihr aauch im X-Skript-tutorial Kapitel 4.7. Dies kann allerdings in einigen Fällen zu Problemen führen. Christian hatte daher an manchen Stellen das Anzeigen von Nachrichten unterdrückt. Zum einen war das der Bodeneinsatz. Dort hab ich das schon geändert, weil man sonst auch keine Fehlermeldungen von den AI-Skripten erhalten würde. Ich vermute mal, die Sperre stammte da noch aus Echtzeit-Tagen, wo solche Nachrichten natürlich ein Problem gewesen wären.
Ich hab gerade mal nachgeschaut - auch im Simulator wird die Nachrichtensperre verwendet. Auch hier weiß ich nicht auf Anhieb, warum Christian das mal gemacht hat, ich würde aber darauf tippen, dass dies wegen des (nicht mehr vorhandenen) Arcade-Modus nötig war. Hier mal ein kurzes Demo-Skript:
program YourName;

procedure Abschuss(Sender: TObject);
begin
  // Wird erst auf dem Globus angezeigt:
  savegame_api_Message('test savegame_api',lmMissionMessage,nil);

  // würde schon im Simulator angezeigt, wo Nachrichten aber bis zur 917a02 unterdrückt werden:
  game_api_MessageBox('Test game_api');
  mission_win;
end;

procedure StartMission;
var
  UFO:TUFO;
begin
  UFO:=ufo_api_CreateUFO;
  UFO.Name:='TestUFO';
  UFO.Visible:=true;
  register_event(@Abschuss,UFO,EVENT_ONUFOSHOOTDOWN);
end;

begin
  MissionName := 'YourName';
  MissionType := mzUser;
end.


Ich hab das probeweise mal für die 917a03 geändert, siehe 2476. Es bleibt aber abzuwarten, ob das wirklich keine Probleme macht. Nur um das nochmal klarzustellen. Bis zur 917a02 wird die Nachricht 'Test game_api' im Spiel nicht angezeigt, in der 917a03 würde sie hingegen noch vor 'test savegame_api' erscheinen, obwohl sie ja eigentlich im Code erst weiter unten erzeugt wird.

PS: Es empfiehlt sich, bei längeren Texten auf mehrere Zeilen auszuweichen. Zum einen wird der Code dadurch lesbarer (ok, darüber kann man streiten - noch besser wäre wohl der Einsatz von Konstanten ;)), zum anderen zerschießt er nicht die Formatierung im Forum ;)
verfasst am: 18.07.2011, 08:03 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Also einen Überlauf gab es eigentlich nie. Das Skript lief soweit schon reibungslos.

game_api_MessageBox lief bei mir bisher wunderbar. In der Prozedur StartMission und auch in der EventAsteroidImpact (nur bei UFO.OverLand) erhalte ich die Nachricht per game_api_MessageBox.
Nur in dem anderen Fall (not UFO.Overland) und in der ganzen EventAsteroidDestroy erhalte ich keine Nachrichten.

Möglicherweise gibt es auch einen Zusammenhang mit der UFO-AI des Asteroiden. Das Verhalten war nämlich ursprünglich als AI-Script umgesetzt. Habe aber den Hauptteil des AI-Scriptes in das Missionsscript verschoben.

Hier einmal die Reste im AI-Script:
// ************************************************
// UFOAI-Script: Asteroid
//
// Skriptname: UFOAI_asteroid
// X-Force-Version: 0.917
// Skripter: Aropretim
// ************************************************
// Funktion: Skript für UFOModel 'Asteroid'
// Fliegt zu einem zufälligen Punkt auf der Erde und schlägt dort ein
// ************************************************

program UFOAI_asteroid;

uses GEN90path, GEN20geo;

var
  UFO:TUFO;


// Funktion für das Ereignis "CommandComplete"
procedure UFOCommandComplete(sender:TObject);
begin
  UFO.Escape;
end;

procedure StartMission;
var
  dummy:Integer;
begin
  if (IsObject(MissionObject)) then
  begin
    dummy:=integer(MissionObject);
    UFO:=TUFO(dummy);
    UFO.Visible := true;
    register_mission_object(UFO);
    UFO.UserAI:=true;
    register_event(@UFOCommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
  end;
end;

begin
  MissionName:='UFOAI_asteroid';
  MissionType:=mzObjects;
end.



Die längeren Zeilen im ersten Beitrag habe ich gekürzt. Bin mir aber nicht sicher, ob das nun mit einem Copy+Paste einen Syntax-Error auslöst.


Edit: Habe es eben mit savegame_api_Message ausprobiert. Funktioniert einwandfrei. Danke :)

Edit2: Ich habe eben versucht, per NoSaveGameMessage die automatischen Nachrichten 'Es wurde ein Asteroid entdeckt.' und 'Asteroid ist entkommen.' abzuschalten. Jedoch scheinen die savegame_api-Messages auch davon betroffen zu sein.
Zudem bekomme ich weiterhin die Meldung 'Asteroid ist entkommen'.
verfasst am: 18.07.2011, 08:45
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Aropretim

Edit: Habe es eben mit savegame_api_Message ausprobiert. Funktioniert einwandfrei. Danke :)

Hast du denn auch nachvollziehen können, warum es vorher nicht ging? Was du davor geschrieben hast (Zitat: 'game_api_MessageBox lief bei mir bisher wunderbar'), klang mir nicht danach ^^

Und ab der 917a03 sollte es dann wie gesagt auch über die game_api klappen.
verfasst am: 18.07.2011, 09:13
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Zitat: Natter
Hast du denn auch nachvollziehen können, warum es vorher nicht ging? Was du davor geschrieben hast (Zitat: 'game_api_MessageBox lief bei mir bisher wunderbar'), klang mir nicht danach ^^

Bisher hatte ich die game_api auch nicht bei ONUFOSHOOTDOWN oder ONUFOESCAPE verwendet, sondern nur um eine Spielset-/Missions-Einleitung zu schreiben.
Warum das im ONUFOSHOOTDOWN nicht funktionert hast du ja schön ausführlich erklärt (ja, ich habe es gelesen ;-)).
Warum es aber bei einem Escape über Wasser nicht funktionierte, ist mir ein Rätsel.
verfasst am: 18.07.2011, 09:24
Registrierdatum: 22.08.2008, 15:51

 Beiträge: 403
Zitat: Aropretim
GroundMission := ground_api_GenerateGround(); GroundMission.PopulateFromUFO(UFO); GroundMission.MapName := 'data\maps\aropretim\aro_city_crater.m3d'; GroundMission.Name := 'Asteroidenkrater'; GroundMission.SensorText := ''; GroundMission.Description := 'Hier ist ein Asteroid eingeschlagen.'+ ' Wir sollten den Bereich sichern und einige Proben für unsere Wissenschaftler mitnehmen.'+ ' Satellitenbilder haben jedoch gezeigt, dass sich dort etwas bewegt. Seien Sie also vorsichtig.'; GroundMission.Objectives := 'Sichern Sie das Gebiet und nehmen Sie Proben für unsere Wissenschaftler mit.'; GroundMission.Position := UFO.Position; GroundMission.RemainTime := 1440;


Ist dir bewusst, dass du damit dir und den Spielern das Leben unnötig schwer machst? Im Editor gibt es den "blauen Erden" Button (GroundModelList steht im Tooltip), gleich neben der Alienausrüstung, da kannst du RemainTime, Objectives, etc eingeben und bei MapName den Karten Namen (du musst auch das Aktiviert-Kästchen "ent-hacken", sonst wird der Einsatz mal zufällig generiert). Außerdem muss bei deiner Lösung mit
Zitat: Aropretim
GroundMission.MapName := 'data\maps\aropretim\aro_city_crater.m3d';

die Map in den Maps Ordner verschieben. Du kannst bei Ressourcen unter Einsatzkarte deine Map direkt in den Spielsatz geben, dann mit einem Rechtsklick auf "Identifizierung kopieren" gehen und in der GroundModelList bei MapName einfügen. In XScript würde das dann so aussehen:
GroundMission := ground_api_GenerateGroundbyGroundModelID(GroundModel_ID);
//GroundMission.Position := UFO.Position;
//Mir ist aufgefallen, dass du den Ort nicht setzt, ist der Einsatz automatisch an der richtigen Stelle?
GroundMission.PopulateFromUFO(UFO);
GroundMission.Show;

verfasst am: 18.07.2011, 09:36
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Aropretim
Ich habe eben versucht, per NoSaveGameMessage die automatischen Nachrichten 'Es wurde ein Asteroid entdeckt.' und 'Asteroid ist entkommen.' abzuschalten. Jedoch scheinen die savegame_api-Messages auch davon betroffen zu sein.

Wenn ich dich richtig verstehe, dann benutzt du NoSaveGameMessage genau falschherum. Dieser Compilerschalter hat nur Auswirkungen auf savegame_api_Message nicht aber auf die game_api_MessageBox. Er dient auch weniger dazu Skriptmeldungen zu unterdrücken (in dem Fall sollte man besser im Skript verhindern, dass die Nachricht erzeugt wird), sondern die vom Spiel erzeugten Meldungen (z.B. wenn man dafür eigene geskriptete Nachrichten ausgeben will).

Zitat: Aropretim
Warum es aber bei einem Escape über Wasser nicht funktionierte, ist mir ein Rätsel.

Hmm, gute Frage. Tritt das in deiner aktuellen Variante auch noch auf (wenn du von savegame_api wieder zu game_api wechselst)?
verfasst am: 18.07.2011, 19:56 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Zitat: Kreks
Ist dir bewusst, dass du damit dir und den Spielern das Leben unnötig schwer machst? Im Editor gibt es den "blauen Erden" Button (GroundModelList steht im Tooltip), gleich neben der Alienausrüstung, da kannst du RemainTime, Objectives, etc eingeben und bei MapName den Karten Namen (du musst auch das Aktiviert-Kästchen "ent-hacken", sonst wird der Einsatz mal zufällig generiert).
Nee, den Button hatte ich schon gefunden. Habe mich nur noch nicht wirklich damit beschäftigt.
Zitat: Kreks
Außerdem muss bei deiner Lösung mit
Zitat: Aropretim
GroundMission.MapName := 'data\maps\aropretim\aro_city_crater.m3d';

die Map in den Maps Ordner verschieben. Du kannst bei Ressourcen unter Einsatzkarte deine Map direkt in den Spielsatz geben, dann mit einem Rechtsklick auf "Identifizierung kopieren" gehen und in der GroundModelList bei MapName einfügen.
Die Map ist noch nicht fertig, daher ist sie noch nicht in den Ressourcen.
Zitat: Kreks
In XScript würde das dann so aussehen:

GroundMission := ground_api_GenerateGroundbyGroundModelID(GroundModel_ID);
//GroundMission.Position := UFO.Position;
//Mir ist aufgefallen, dass du den Ort nicht setzt, ist der Einsatz automatisch an der richtigen Stelle?
GroundMission.PopulateFromUFO(UFO);
GroundMission.Show;
GroundMission.Position := UFO.Position; setzt doch den Ort (ist in meinem Quelltext nicht auskommentiert). Der Einsatz ist logischerweise dort, wo der Asteroid zuletzt war, bevor er einschlug. Bisher hat sich das Script auch immer so verhalten.


Zitat: Natter
Wenn ich dich richtig verstehe, dann benutzt du NoSaveGameMessage genau falschherum. Dieser Compilerschalter hat nur Auswirkungen auf savegame_api_Message nicht aber auf die game_api_MessageBox. Er dient auch weniger dazu Skriptmeldungen zu unterdrücken (in dem Fall sollte man besser im Skript verhindern, dass die Nachricht erzeugt wird), sondern die vom Spiel erzeugten Meldungen (z.B. wenn man dafür eigene geskriptete Nachrichten ausgeben will).
Nee, die gescripteten Meldungen sollen ja erscheinen. Dafür sollten aber einige wenige automatische Meldungen ("Ein Asteroid wurde über XXX entdeckt", "Asteroid ist entkommen") abgeschaltet werden. Schließlich kommt es nicht so gut, wenn ein Asteroid mit der Meldung, dass er geflohen ist, einschlägt. ;)
Daher war meine Idee während der Prozeduren StartMission und EventAsteroidImpact (ONUFOSHOOTDOWN) die Meldungen abzuschalten.

Zitat: Natter
Zitat: Aropretim
Warum es aber bei einem Escape über Wasser nicht funktionierte, ist mir ein Rätsel.

Hmm, gute Frage. Tritt das in deiner aktuellen Variante auch noch auf (wenn du von savegame_api wieder zu game_api wechselst)?

Habe es eben getestet. Funktioniert jetzt auch mit game_api reibungslos.
verfasst am: 19.07.2011, 09:49
Registrierdatum: 22.08.2008, 15:51

 Beiträge: 403
Zitat: Kreks
Mir ist aufgefallen, dass du den Ort nicht setzt, ist der Einsatz automatisch an der richtigen Stelle?

Sorry, hab mal wieder was überlesen... hast du ja eh gesetzt...
verfasst am: 19.07.2011, 10:59
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Aropretim
Nee, die gescripteten Meldungen sollen ja erscheinen. Dafür sollten aber einige wenige automatische Meldungen ("Ein Asteroid wurde über XXX entdeckt", "Asteroid ist entkommen") abgeschaltet werden. Schließlich kommt es nicht so gut, wenn ein Asteroid mit der Meldung, dass er geflohen ist, einschlägt. ;)
Daher war meine Idee während der Prozeduren StartMission und EventAsteroidImpact (ONUFOSHOOTDOWN) die Meldungen abzuschalten.

Ach so. Also dann musst du NoSaveGameMessage nur etwas gezielter einsetzen (z.B. nicht für die ganze Prozedur StartMission die Nachrichten unterdrücken, sondern nur bei der UFO-Erzeugung). Die Escape-Meldung ist etwas kniffliger. Das Event EVENT_ONUFOESCAPE wird erst unmittelbar nach der Benachrichtigung des Spielers aufgerufen. Du müsstest also die Nachrichten vor dem Aufruf von UFO.Escape unterdrücken, und dann in EVENT_ONUFOESCAPE wieder aktivieren. Außerdem würde ich in dem Fall nur NoSaveGameMessage_lmUFOs benutzen - damit werden nur die UFO-Nachrichten unterdückt.
verfasst am: 19.07.2011, 15:24 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Hmm... da kommt mir eine Idee. Lohnt es sich in diesem Fall ein registed_timed_event zum UFO zu erstellen? Das würde dann minütlich den Abstand zum Einschlagsort checken und wenn das UFO nah genug dran ist, NoSaveGameMessage_lmUFOs ausschalten.

Oder würde ein minütliches Event den Prozessor zu sehr auslasten?
Wie sieht es mit mehreren Asteroiden aus - Wenn das Script also mehrmals gestartet wird, bevor es beendet wurde?
Würden sich die Events dann gegenseitig behindern?
verfasst am: 19.07.2011, 15:44
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Ich glaube nicht, dass dadurch die Performance spürbar leiden würde. Ich finde das aber übertrieben kompliziert. Du hast ja in deinem AI-Script schon den halben Ansatz drin gehabt. Registriere einfach EVENT_ONUFOCOMMANDCOMPLETE. Dort kannst du dann z.B. folgendes machen:
game_api_SetBoolean('NoSaveGameMessage_lmUFOs',true);
UFO.escape;
game_api_SetBoolean('NoSaveGameMessage_lmUFOs',false);
game_api_MessageBox('hier kommt die angepasste Nachricht');
...

verfasst am: 19.07.2011, 16:03
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Stimmt, daran habe ich gar nicht gedacht.

Wird der Prozess zu EVENT_ONUFOCOMMANDCOMPLETE eigentlich durch das Event zu ONUFOESCAPE unterbrochen?
Ich meine das so:
procedure OnCommandComplete(Sender: TObject)
game_api_SetBoolean('NoSaveGameMessage_lmUFOs',true);
UFO.escape;
// wird jetzt schon das Event ONUFOESCAPE ausgelöst
// oder wird erst die Prozedur OnCommandComplete beendet?
game_api_SetBoolean('NoSaveGameMessage_lmUFOs',false);
game_api_MessageBox('hier kommt die angepasste Nachricht');
verfasst am: 19.07.2011, 16:10 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
ONUFOESCAPE wird innerhalb der Prozedur TUFO.escape ausgelöst. Wenn du auf ONUFOESCAPE reagierst wären dort also die Nachrichten noch deaktiviert. Aber selbst das ist kein Problem. Du kannst ja auch andersherum vorgehen - also game_api_SetBoolean('NoSaveGameMessage_lmUFOs',false) dirket vor der Nachricht aufrufen, die du anzeigen willst, und danach wieder den Zustand herstellen, der vorher geherscht hat (imho sollte man sowieso den Wert vorher abfragen und zwischenspeichern, auch wenn ich das oben in meinem Beispiel nicht gemacht hab - hinterher einfach auf true setzen könnte Probleme machen, wenn etwas nicht so läuft wie geplant oder man einfach die Übersicht verloren hat). Andererseits - wenn man game_api_MessageBox benutzt, wird die Meldung ja sowieso angezeigt - ab Version 0.917a03 auch im Simulator. Ob sich da so ein Kunstgriff lohnt musst du selbst entscheiden.
verfasst am: 20.07.2011, 11:04
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Escapes haben ja nichts mit dem Simulator zu tun. Von daher müssen ja eh die NoSaveGameMessages_ImUFOs für kurze Momente eingeschaltet werden, egal ob ich game_api oder savegame_api benutze.

Wann kann ich mich denn über die Features der 0.917a03 freuen?
verfasst am: 20.07.2011, 11:29
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Aropretim

Wann kann ich mich denn über die Features der 0.917a03 freuen?

Naja, bisher hat sich ja nicht viel geändert, daher lohnt eine neue Alpha imho noch nicht.
verfasst am: 20.07.2011, 13:46 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
country_api_changeconfident(TargetCountry,-250);

Bin mir nicht sicher, wie die Größenordnung für das Vertrauen ist. Geht der Wert in Ordnung oder übertreibe ich damit maßlos? Bin da aus dem Script in der Referenz (Referenz:country_api_changeconfident) nicht schlau geworden.
verfasst am: 20.07.2011, 14:06
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Dort wird am Anfang extra gewarnt, dass die Berechnung recht kompliziert ist. Dafür wird am Ende auf http://doc.xforce-online.de/ger_pages/XSkriptReferenz/CountryapiChange ConfidenceAbs.html verwiesen, wo man den absoluten Wert, von 0 bis 100, direkt ändern kann.
verfasst am: 20.07.2011, 16:43 · Edited by: Aropretim
Registrierdatum: 06.06.2011, 12:20

 Beiträge: 50
Das Problem ist nur, dass ChangeConfidenceAbs einen Integerwert benötigt, ich aber für jeden Asteroiden die Zufriedenheit um weniger als 1 erhöhen möchte.

Ich habe folgende Daten ausgerechnet. Dabei bin ich davon ausgegangen, dass Friendly der Wert ist, der mit ChangeConfidenceAbs direkt verändert werden kann - also einen Wert von 1-100 haben kann. (Folgend Vertrauen genannt)

- Aufgrund von Zeile 21 (if (Dummy<>friendly) and (Dummy-Friendly>=2) then) kann ChangeConfidence das Vertrauen nicht um weniger als 2 verändern.
- Um das Vertrauen von 0 auf 100 zu bringen, benötigt man insgesamt 10.000 Zufriedenheit.
- Um das Vertrauen von 0 auf 50 zu bringen, benötigt man insgesamt 2.500 Zufriedenheit.
- Um das Vertrauen von 50 auf 100 zu bringen, benötigt man insgesamt 7.500 Zufriedenheit.

Folgend eine Tabelle, die die benötigte Zufriedenheit (Conf.) für einen Anstieg von 5 Vertrauenspunkte benötigt wird.

Friendly | 0->5 | 5->10 | 10->15 | 15->20 | 20->25 | 25->30 | 30->35 | 35->40 | 40->45 | 45->50 | ----------|--------|--------|--------|--------|--------|--------|----- --|--------|--------|--------| Conf. | 25 | 75 | 125 | 175 | 225 | 275 | 325 | 375 | 425 | 475 | Friendly | 50->55 | 55->60 | 60->65 | 65->70 | 70->75 | 75->80 | 80->85 | 85->90 | 90->95 | 95->100| ----------|--------|--------|--------|--------|--------|--------|----- --|--------|--------|--------| Conf. | 525 | 575 | 625 | 675 | 725 | 775 | 825 | 875 | 925 | 975 |

Folgende Formel kann man zur Berechnung dieser Zahlen benutzen:
[Benötigte Zufriedenheit] = [Neues Vertrauen]^2 - [Altes Vertrauen]^2
(Zeilen 19 und 25)

Ich gehe mal davon aus, dass sich das ausgeschriebene Vertrauen (sehr niedrig, niedrig, mittel, hoch, sehr hoch) alle 20 Vertrauenspunke verändert.

Hätte aber noch gerne eine Bestätigung von nem Progger, falls ich eine Variable falsch interpretiert habe.

Edit 22:58,
Habe eben einen anderen, 3 Jahre verstaubten Thread zu diesem Thema gefunden: ChangeConfident



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

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