Seite: << [1] ... [9] [10] [11] 12 [13] [14] [15] [16] [17] [18] [19] .. [49] [50] >> |
Autor |
Mitteilung |
|
verfasst am: 28.07.2007, 23:12
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: Natter Dann wäre die Sache recht simpel - du definierst Zwischenlandung als Funktion mit dem Rückgabewert TUFO, merkst dir in Zwischenlandung die wichtigsten UFO-Werte, erzeugst am Ende von Zwischenlandung das neue UFO mit diesen Werten, und gibst es über result:=UFO zurück.
Klappt nur leider nicht, da bist Du genauso in die Falle der Echtzeitprogrammierung getappt.
Die Zwischenlandung soll ja einige Zeit lang bei weiterlaufendem Geoscape fortbestehen, bevor das UFO startet. Damit kann man das aber nicht in derselben Event-Sequenz löschen und neu erzeugen - und deshalb klappt das in diesem Moment auch nicht mit den Rückgabewerten.
Und die Speicherung in anderen Variablen ist auch teilweise problematisch (z.B. das Problem Pointer oder kopierte ID), deshalb bleibt momentan (bis das Mantis-Ticket zum UFO aus dem Geoscape herausnehmen) kaum was anderes als die Wächter-Variante. Denn solch aufwendige Skripte lohnen nicht, solange es noch andere Arbeit gibt und man weiß das es später einfacher gehen wird... |
|
verfasst am: 28.07.2007, 23:19
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: DirkF Klappt nur leider nicht, da bist Du genauso in die Falle der Echtzeitprogrammierung getappt.
Hehe, und dabei ist mir der Fehler sofort nach Abschicken der Nachricht selbst aufgefallen - aber du wars echt schnell ;) |
|
verfasst am: 29.07.2007, 17:01 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Ich habe jetzt mal die unit Zwischenlandung in das KI-script gelegt, da es ohnehin nicht geht... jedenfalls bekomme ich jetzt eine Fehlermeldung nach der anderen :( unter anderem beim case of, an dem ich wirklich gar nichts geändert habe, gleich bei <9 (Syntax error)
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo;
var
Landezahl: integer; //Anzahl Landungen
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl2: integer; //Wie oft zwischen den Landungen
Flugzahl3: integer; //Wie oft nach der letzten Landung
UFO: TUFO;
procedure ZwischenlandungStart;
begin
UFO.FlyToPoint(PositionNear(UFO.position));
end;
procedure Zwischenlandung;
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message(#.',lmMissionMessage,Nil);
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= 'Eliminieren Sie alle Aliens vor Ort.';
Boden.Description:= #.';
Boden.start;
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
procedure UKICommandComplete(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
case UFO.KIstep of
<9:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
9:
begin
UFO.KIStep:= 11;
UFO.FlyToPoint(PositionNear(UFO.position)); //
end;
10:
begin
UFO.KIStep:= UFO.KIStep-Flugzahl1-1;
UFO.FlyToPoint(PositionNear(UFO.position)); //
end;
11: begin
if (Landezahl>0 and earth_api_PointOverLand(UFO.Position)=true) then
begin
Zwischenlandung(UFO:TUFO);
UFO.KIStep:= 20-Flugzahl2;
Landezahl:= Landezahl-1;
end;
else UFO.KIStep:= 8;
>11 and <20:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
20: if (Landezahl>0) then
begin
UFO.KIStep:= 11;
UFO.FlyToPoint(PositionNear(UFO.position));
end;
else
begin
UFO.KISTep:= 30;
UFO.FlyToPoint(PositionNear(UFO.position));
end;
>21 and <29:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
29: UFO.escape;
30:
begin
UFO.KIStep:= UFO.KIStep-Flugzahl3-1;
UFO.FlyToPoint(PositionNear(UFO.position));
end;
end;
procedure StartMission;
var
UFO: TUFO;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);
UFO.UserKI:=true;
Flugzahl1:= random(3)+1; //Flüge vor 1. Landung
Flugzahl2:= random(3)+1; //Flüge zwischen Landungen
Flugzahl3:= random(3)+1; //Flüge nach allen Landungen
Landezahl:= random(2)+1; //Landungen
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
UFO.FlyToPoint(PositionNear(UFO.position,20));
UFO.KIStep:= 10;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
Wieso gibt es bei ZwischenlandungStart jetzt invalid Parameters? Die Zeile ist doch genau die gleiche.
------------
@DirkF: Kann ich die die neuen UKI-Vorlagenscripte einfach so übernehmen, oder muss ich auf irgendwas achten? Verändert an den alten hatte ich nichts. |
|
verfasst am: 29.07.2007, 19:47
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Wieso gibt es bei ZwischenlandungStart jetzt invalid Parameters? Die Zeile ist doch genau die gleiche.
Falsch, die Zeile ist sogar massiv verändert worden, und deshalb kriegst Du auch den Fehler.
Das Original von Seite 9 lautete:
procedure ZwischenlandungStart(Sender:TObject);
Das Sender:TObject wird immer aus dem Event übergeben (in diesem Fall ist es der Bodeneinsatz, da Du das Boden Objekt in der Registerfunktion benutzt), und da Deine neue Version der Zwischenlandung keinen Parameter reserviert hat um dies entgegenzunehmen, gibt es den Fehler "invalid Parameter".
Selbst wenn Du den Bodeneinsatz in der ganzen Zwischenlandung nicht benutzt - den Platzhalter zum Empfang der Daten brauchst Du trotzdem.
Zum Syntax-Error:
WO GENAU hast Du das Skript vorher als Funktionstüchtig getestet (Hauptprogramm oder Editor) und wo kriegst Du jetzt den Fehler?
Es ist leider nicht dasselbe ob man im Editor per Step oder im Hauptprogramm testet...
Zitat: LennStar Kann ich die die neuen UKI-Vorlagenscripte einfach so übernehmen, oder muss ich auf irgendwas achten? Verändert an den alten hatte ich nichts
Ich habe nur eine einzige Änderung an einer Funktion in UKI_AA vorgenommen, damit man den Skriptnamen aus dem Usertag ausliest statt ihn umständlich per Skript bestimmen zu müssen.
Es sollte keine Probleme geben das zu übernehmen, ABER wenn Du das machst dann müssen alle UserTags aller UFOs mit dem KI-Skript-Namen beginnen.
Ich werde das ganze später auch nochmal verfeinern und Fehleingaben abfangen. |
|
verfasst am: 29.07.2007, 20:00
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Falsch, die Zeile ist sogar massiv verändert worden, und deshalb kriegst Du auch den Fehler.
Das Original von Seite 9 lautete:
procedure ZwischenlandungStart(Sender:TObject);
Das hab ich gleich nach dem posten gesehen und geändert (habs hier wohl vergessen) An der Fehlermeldung ändert sich aber nichts. Die ist übrigens wörtlich: "invalid number of parameters" zwischen den hinteren Klammern von (PositionNear(UFO.position));, das hab ich beim posten nicht mehr gewusst.
getestet ist immer im editor mit (strg)+F9, weiter sind wir ja nie gekommen :(
Der Syntax-error kommt, wenn ich die Zeile mit dem vorigen Fehler mit // deaktiviere hier:
case UFO.KIstep of
|ERROR<9: |
|
verfasst am: 29.07.2007, 20:29 · Edited by: DirkF
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Die ist übrigens wörtlich: "invalid number of parameters" zwischen den hinteren Klammern von (PositionNear(UFO.position));,
Natürlich ist das invalid, da fehlt ja der Radius in dem PositionNear arbeiten soll.
Es gibt zwei mögliche Lösungen:
UFO.FlyToPoint(UFO.Position);
(wenn Du dieses blöde Konstrukt wirklich beibehalten willst und das nicht genauso vereinfachst wie ich das weiter unten zeige)
oder
UFO.FlyToPoint(PositionNear(UFO.Position,20));
Wenn Du da einen echten Flugbefehl geben willst.
Ansonsten würde das folgende case-Construct absolut genau das gleiche machen wie Dein Konstrukt:
case UFO.KIstep of
<9: begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
9: begin
if (Landezahl>0) then
begin
if (earth_api_PointOverLand(UFO.Position)=true) then
begin
Zwischenlandung(UFO:TUFO);
UFO.KIStep:= 9-Flugzahl2;
Landezahl:= Landezahl-1;
end;
else UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
else
begin
UFO.KISTep:= 29-Flugzahl3;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
end;
>21 and <29:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
29: UFO.escape;
Du musst lediglich zusätzlich in der StartMission die Zeile
UFO.KIStep:= 10;
ändern in
UFO.KIStep:= 9-Flugzahl1;
(es gab auf jeden Fall einen Begin/end-Fehler im Case, den ich korrigiert habe - ob das auch den Syntaxfehler behebt habe ich nicht getestet) |
|
verfasst am: 29.07.2007, 21:00 · Edited by: Jim_Raynor
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
 |
Irgendwelche Operatoren wie < oder and werden im Case nicht unterstützt. Du musst dort leider
case UFO.KIstep of
0,1,2,3,4,5,6,7,8,9: ... etc. schreiben.
Oder mit If ... then
else if ... then
else if ... then arbeiten ... |
|
verfasst am: 29.07.2007, 21:06
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF (es gab auf jeden Fall einen Begin/end-Fehler im Case, den ich korrigiert habe - ob das auch den Syntaxfehler behebt habe ich nicht getestet)
Nein, der war nicht Schuld. Zitat: DirkF wenn Du dieses blöde Konstrukt wirklich beibehalten willst
Hab ich nie behauptet - im Gegenteil ;) Aber zumindest weiß ich jetzt 2 Dinge, auf die ich in Zukunft bei solchen Abläufen achten sollte. Ich bin noch zu sehr Schritt-für-Schritt.
Bei dem Syntax-error scheint er sich am "<" bei <9 zu stören, ohne geht er drüber und meckert bei
begin
Zwischenlandung(UFO:TUFO); ###
Das muss Zwischenlandung(UFO); und
procedure Zwischenlandung(UFO:TUFO); sein, richtig?
Ähm... brauch ich da eigentlich unter program noch var UFO:TUFO? Ich glaube, das ist jetzt wieder doppelt geworden durch die Übergabe von procedure zu procedure.
Jetzt gibt es bei
Landezahl:= Landezahl-1;
end;
else UFO.FlyToPoint(PositionNear(UFO.position,20));
identifier expected beim else |
|
verfasst am: 29.07.2007, 21:48
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beiträge: 2261
 |
Beim end vor dem else kommt kein Semikolon ;) |
|
verfasst am: 30.07.2007, 00:07
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Hab ich nie behauptet - im Gegenteil ;) Aber zumindest weiß ich jetzt 2 Dinge, auf die ich in Zukunft bei solchen Abläufen achten sollte. Ich bin noch zu sehr Schritt-für-Schritt.
Am besten kannst Du das vereinfachen, indem Du die KIstep nicht als Zeilennummern eines Programmes, sondern als Verhaltenszustände des UFOs definierst und auffasst.
Diese Verhaltenszustände wären bei Dir oben lediglich "Flug zum ersten Landepunkt", "Flüge zwischen Landepunkten (inkl. Suchmanöver)" und "Flüge nach letzter Landung" - das es oben in dem Konstrukt vier verschiedene Steps gibt liegt lediglich daran, das ich das Escape nicht noch in den Abschlusszustand nehmen wollte. Da danach ja sowieso kein Befehl mehr kommt, braucht man dafür keinen eigenen Zustand mehr... |
|
verfasst am: 30.07.2007, 00:38
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar brauch ich da eigentlich unter program noch var UFO:TUFO
Das ist nicht nur doppelt, sondern drei- bis vierfach. Dabei habe ich doch extra so eine andenkenswürdige Story über das Verhalten von Variablen im Tagebuch gepostet.
Das geht da oben nämlich schon wieder durcheinander... |
|
verfasst am: 30.07.2007, 13:00 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Das geht da oben nämlich schon wieder durcheinander...
^^ Wegen den vielen Fehlermeldungen. Da waren die dann wenigestens aus. Ich wollte ja zumindendest den Ablauf haben, bis ich versuche, das mit den Übergaben hinzukriegen.
Ich muss dann also in jeder function so wie hier
procedure UKICommandComplete(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
jeweils die Variable anlegen, und dann dann mit der letzten Zeile sagen, dass dort das übergebene TObject gespeichert werden soll?
Zitat: Jim_Raynor Beim end vor dem else kommt kein Semikolon ;)
edit: gefunden. Ach, das war wieder die Ausnahme, oder? Wie warn das? |
|
verfasst am: 30.07.2007, 13:08
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Wegen den vielen Fehlermeldungen. Da waren die dann wenigestens aus.
Was ist Dir lieber?
Fehlermeldungen die Dir sagen das ein Problem vorliegt, oder ein Programm ohne Fehlermeldungen, das aus unbekannten Gründen trotzdem nicht funktioniert?
Momentan machst Du letzteres, viel Spaß bei der Fehlersuche... |
|
verfasst am: 30.07.2007, 13:11
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Du hast das jetzt falsch verstanden ;) Da gings ja um die unit. Das mit den Weitergaben hast du mir ja dann erst gesagt. Ich wollte die unit fertig haben, bevor ich mich darum kümmere. Nur ging das ja dann nicht mit dem UFO. |
|
verfasst am: 30.07.2007, 13:40
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Nur ging das ja dann nicht mit dem UFO
Eben genau deshalb sage ich das ja - momentan hat die globale Variable UFO in Deinem Skript nur noch eine Funktion: sie blockiert Fehlermeldungen darüber, wo Du wirklich Mist baust.
Möchtest Du wirklich Dein Skript "fehlerfrei" weiterbearbeiten, nur um anschließend festzustellen das Du alles nochmal umschreiben musst und Deine gesamten Gedankengänge falsch waren - alles weil Du einige Fehlermeldungen die ganze Zeit ignoriert hast?
Das erste was Du jetzt machen solltest ist die globale Variable löschen und alle dann kommenden Fehlermeldungen durch korrekte Datenübergaben beseitigen.
Wenn Du das anders machst kriegst Du ungefähr den drei- bis vierfachen Arbeitsaufwand.
Und wenn Dein Festhalten an dem PositionNear selbst bei ortsfestem Bewegungsschritt ein Beispiel ist, dann wirst Du sogar die zehnfache Zeit brauchen bis Du die fälschlicherweise für richtig gehaltenen Konstruktionen wieder aus dem Kopf heraus hast... |
|
verfasst am: 30.07.2007, 13:42
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar jeweils die Variable anlegen, und dann dann mit der letzten Zeile sagen, dass dort das übergebene TObject gespeichert werden soll?
Ach ja, bevor sich das zu sehr eingräbt:
Diese Konstruktion ist ausdrücklich nur für Event-Funktionen notwendig, bei normalen selbstdefinierten Funktionsaufrufen braucht man keine zusätzlichen Variablendefinitionen und -zuweisungen... |
|
verfasst am: 30.07.2007, 13:52
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: DirkF Diese Konstruktion ist ausdrücklich nur für Event-Funktionen notwendig, bei normalen selbstdefinierten Funktionsaufrufen braucht man keine zusätzlichen Variablendefinitionen und -zuweisungen...
... darauf geht übrigens Kapitel 3.5 im Tutorial ein. |
|
verfasst am: 30.07.2007, 15:08 · Edited by: LennStar
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Zitat: DirkF Und wenn Dein Festhalten an dem PositionNear selbst bei ortsfestem Bewegungsschritt ein Beispiel ist
Hey, ich hab nur übersehen, dass sich da außer der 0 noch was geändert hatte ;)
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo;
var
Landezahl: integer; //Anzahl Landungen
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl2: integer; //Wie oft zwischen den Landungen
Flugzahl3: integer; //Wie oft nach der letzten Landung
procedure ZwischenlandungStart(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
UFO.FlyToPoint(UFO.position);
end;
procedure Zwischenlandung(UFO:TUFO);
var
Boden: TEinsatz;
Zeit: longint;
begin
savegame_api_Message(#.',lmMissionMessage,Nil);
Zeit:=random(360)+120; //Wie lange dauert die Landung: Zufall+2h
Boden:= einsatz_api_generateEinsatz;
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
Boden.RemainTime:=Zeit;
Boden.Name:= 'Überfall auf ein gelandetes UFO';
Boden.Objectives:= 'Eliminieren Sie alle Aliens vor Ort.';
Boden.Description:= #.';
Boden.start;
register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
procedure UKICommandComplete(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender);
case UFO.KIstep of
0,1,2,3,4,5,6,7,8:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
9:
begin
if (Landezahl>0) then
begin
if (earth_api_PointOverLand(UFO.Position)=true) then
begin
Zwischenlandung(UFO);
UFO.KIStep:= 9-Flugzahl2;
Landezahl:= Landezahl-1;
end
else UFO.FlyToPoint(PositionNear(UFO.position,20));
end
else
begin
UFO.KISTep:= 19-Flugzahl3;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
end;
10,11,12,13,14,15,16,17,18:
begin
UFO.KIStep:=UFO.KIStep+1;
UFO.FlyToPoint(PositionNear(UFO.position,20));
end;
19: UFO.escape;
end;
end;
procedure StartMission;
var
UFO: TUFO;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);
UFO.UserKI:=true;
Flugzahl1:= random(3)+1; //Flüge vor 1. Landung
Flugzahl2:= random(3)+1; //Flüge zwischen Landungen
Flugzahl3:= random(3)+1; //Flüge nach allen Landungen
Landezahl:= random(2)+1; //Landungen
// die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
UFO.FlyToPoint(PositionNear(UFO.position,20));
UFO.KIStep:= 9-Flugzahl1;
end;
begin
MissionName := 'UKI000Forschungsschiff';
MissionType := mzUFO;
end.
Stimmt das jetzt? Wenn ichs mit F9 durchlaufen lasse, kommt Global Var UKI.UFO not registered hier:
function UKI_AAgetUFO:TUFO;
var
dummy:Integer;
begin
dummy:=game_api_getInteger('UKI_UFO');
aber das müsste ja durch das RandomUFO gestartet werden. |
|
verfasst am: 30.07.2007, 15:17
|
Spielsatz Darkage
Registrierdatum: 01.03.2005, 13:47
Beiträge: 1846
 |
Im Spiel kommt eine Fehlermeldung bei
procedure ZwischenlandungStart(Sender:TObject);
var
UFO:TUFO;
begin
UFO:=TUFO(sender); *Fehler
UFO.FlyToPoint(UFO.position);
end;
*could not call proc |
|
verfasst am: 30.07.2007, 15:18
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: LennStar Wenn ichs mit F9 durchlaufen lasse, kommt Global Var UKI.UFO not registered hier:
function UKI_AAgetUFO:TUFO;
Die Befehle mit den game_api_get* -Variablen funktionieren nicht im Editor, nur im Hauptprogramm. Man könnte das zwar über Defines abfangen, aber das wäre eine Menge Aufwand für einen anschließend immer noch unsauberen Test. |
Seite: << [1] ... [9] [10] [11] 12 [13] [14] [15] [16] [17] [18] [19] .. [49] [50] >> |