Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [12] [13] >> |
Autor |
Mitteilung |
|
verfasst am: 26.10.2004, 15:13 · Edited by: nightelf_IX
|
Registrierdatum: 18.10.2004, 16:31
Beitrge: 481
|
Hier ist eine neue Mission von mir:
program Lager;
const
{$ifdef deutsch}
{$define constok}
missiontext ='Sir, hier spricht %s. Aliens sind in ein altes Lager eingedrungen und haben'+
' dieses Besetzt.'#10#13'Sie knnen die Waren, die sich in diesem Bergwerk befinden bergen,'+
' wenn Sie die Aliens vertreiben knnten. Wir vermuten, dass die Aliens die Ausrstung in drei Tagen zerstrt haben.'#10#13#10#13'Viel Glck!';
wintext ='Herzlichen Glckwunsch! Sie haben das Lager zurckerobert. Sie erhalten die Waren in den nchsten Minuten.';
loosetext ='Sie haben es nicht geschafft. Die Aliens haben den gesamten Inhalt zerstrt und es lohnt sich nicht mehr, das Lager anzugreifen und %s ist enttuscht.';
roomname ='Lagerhaus';
desc ='Um die Waren aus dem Lagerhaus zurck zu erobern mssen Sie die Aliens vertreiben';
obj ='Vernichten Sie alle Aliens, um das Lager zurckzuerobern';
{$endif}
var
country:tcountry;
function gri1(var Item1: TLagerItem): Boolean;
var
Versuche : Integer;
Index1 : Integer;
begin
result:=false;
Versuche:=50;
while not result do
begin
Versuche:=Versuche-1;
if Versuche=-1 then
exit;
Index1:=random(10)+5;
Item1:=lager_api_GetItem(Index1);
if not ((Item1.TypeID=ptGranate) or (Item1.TypeID=ptMine) or (Item1.TypeID=ptMunition) or
(Item1.TypeID=ptSensor) or (Item1.TypeID=ptWaffe) or (Item1.TypeID=ptpanzerung) or
(Item1.TypeID=ptrwaffe) or (Item1.TypeID=ptmotor) or (Item1.TypeID=ptguertel) or
(Item1.TypeID=ptshield) or (Item1.TypeID=ptrmunition) or (Item1.TypeID=ptextension)) then
continue;
result:=true;
end
end;
function gri2(var Item2: TLagerItem): Boolean;
var
Versuche : Integer;
Index2 : Integer;
begin
result:=false;
Versuche:=50;
while not result do
begin
Versuche:=Versuche-1;
if Versuche=-1 then
exit;
Index2:=random(10)+5;
Item2:=lager_api_GetItem(Index2);
if not ((Item2.TypeID=ptGranate) or (Item2.TypeID=ptMine) or (Item2.TypeID=ptMunition) or
(Item2.TypeID=ptSensor) or (Item2.TypeID=ptWaffe) or (Item2.TypeID=ptpanzerung) or
(Item2.TypeID=ptrwaffe) or (Item2.TypeID=ptmotor) or (Item2.TypeID=ptguertel) or
(Item2.TypeID=ptshield) or (Item2.TypeID=ptrmunition) or (Item2.TypeID=ptextension)) then
continue;
result:=true;
end
end;
procedure missionwin(Einsatz:Teinsatz);
var
base:Tbasis;
item1:tlageritem;
item2:tlageritem;
index1:integer;
index2:integer;
begin
index1:=random(10)+5
index2:=random(10)+5
base:=basis_api_getmainbase;
game_api_messagebox(format(wintext,[base]));
if gri1(item1) then
raumschiff_api_dotransporttobase(country,base,item1,index1);
if gri2(item2) then
raumschiff_api_dotransporttobase(country,base,item2,index2);
mission_win();
end;
procedure timeup(einsatz:teinsatz);
begin
game_api_messagebox(format(loosetext,[country.name]));
mission_loose();
country_api_changeconfident(country.index,-125);
end;
procedure StartMission;
var
i:integer;
einsatz:Teinsatz;
base:tbasis;
begin
base:=basis_api_getmainbase;
einsatz:=einsatz_api_generateeinsatz();
if einsatz.country=-1 then
begin
einsatz.start;
mission_abort();
end;
for i:=1 to random(15)+5 do
einsatz.addalien(alien_api_getrandomalien);
if not einsatz.start then
mission_abort()
einsatz.description:=desc;
einsatz.objectives:=obj;
einsatz.name:=roomname;
register_einsatz_win(@missionwin,einsatz);
register_einsatz_timeup(@timeup,einsatz);
einsatz.remaintime:=4320;
country:=country_api_getcountry(einsatz.country);
game_api_messagebox(format(missiontext,[country.name]))
end;
begin
MissionName := 'Lager';
MissionType := mzUser;
end.
Wer die mal ausprobieren will, braucht nur den Skript-Code in seinen X-Skript-Editor kopieren. Sie ist getestet und funktioniert (zumindest) bei mir.
Wenn man sie nur wenig verndert bekommt die Mission einen ganz anderen Sinn:
program ufoparts;
const
{$ifdef deutsch}
{$define constok}
missiontext ='Sir, hier spricht %s. Aliens sind in ein altes Lager eingedrungen und haben'+
' dieses Besetzt.'#10#13'Sie knnen die Waren, die sich in diesem Bergwerk befinden bergen,'+
' wenn Sie die Aliens vertreiben knnten. Wir vermuten, dass die Aliens die Ausrstung in drei Tagen zerstrt haben.'#10#13#10#13'Viel Glck!';
wintext ='Herzlichen Glckwunsch! Sie haben das Lager zurckerobert. Sie erhalten die Waren in den nchsten Minuten.';
loosetext ='Sie haben es nicht geschafft. Die Aliens haben den gesamten Inhalt zerstrt und es lohnt sich nicht mehr, das Lager anzugreifen und %s ist enttuscht.';
roomname ='Lagerhaus';
desc ='Um die Waren aus dem Lagerhaus zurck zu erobern mssen Sie die Aliens vertreiben';
obj ='Vernichten Sie alle Aliens, um das Lager zurckzuerobern';
{$endif}
var
country:tcountry;
function gri1(var Item1: TLagerItem): Boolean;
var
Versuche : Integer;
Index1 : Integer;
begin
result:=false;
Versuche:=125;
while not result do
begin
Versuche:=Versuche-1;
if Versuche=-1 then
exit;
Index1:=random(1)+1;
Item1:=lager_api_GetItem(Index1);
if not ((Item1.TypeID=ptrwaffe) or (Item1.TypeID=ptmotor) or
(Item1.TypeID=ptshield) or (Item1.TypeID=ptextension)) then
continue;
result:=true;
end
end;
procedure missionwin(Einsatz:Teinsatz);
var
base:Tbasis;
item1:tlageritem;
index1:integer;
begin
index1:=random(1)+1
base:=basis_api_getmainbase;
game_api_messagebox(format(wintext,[base]));
if gri1(item1) then
raumschiff_api_dotransporttobase(country,base,item1,index1);
mission_win();
end;
procedure timeup(einsatz:teinsatz);
begin
game_api_messagebox(format(loosetext,[country.name]));
mission_loose();
country_api_changeconfident(country.index,-150);
end;
procedure StartMission;
var
i:integer;
einsatz:Teinsatz;
base:tbasis;
begin
base:=basis_api_getmainbase;
einsatz:=einsatz_api_generateeinsatz();
if einsatz.country=-1 then
begin
einsatz.start;
mission_abort();
end;
for i:=1 to random(2)+8 do
einsatz.addalien(alien_api_getrandomalien);
if not einsatz.start then
mission_abort()
einsatz.description:=desc;
einsatz.objectives:=obj;
einsatz.name:=roomname;
register_einsatz_win(@missionwin,einsatz);
register_einsatz_timeup(@timeup,einsatz);
einsatz.remaintime:=2880;
country:=country_api_getcountry(einsatz.country);
game_api_messagebox(format(missiontext,[country.name]))
end;
begin
MissionName := 'UFO-Teile';
MissionType := mzUser;
end. |
|
verfasst am: 27.10.2004, 09:11
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beitrge: 2261
|
Erstmal zum ersten Skript:
Index1:=random(10)+5;
Item1:=lager_api_GetItem(Index1);
Ist wieder falsch. Es ist doch nicht garantiert, dass fnfzehn unterschiedliche Ausrstungen verfgbar sind. Bzw. wenn es mehr sind, werden diese nie genutzt. In dem anderen Thread habe ich doch gepostet wie es richtig sein muss. Zu dem verstehe ich nicht, wieso du ein neues Thema aufgemacht hast, obwohl das Skript noch einige Fehler enthlt.
Zweitens. Du brauchst nicht zwei verschiedene Funktionen gri1 und gri2 fr ein und die selbe aufgabe zu machen. (mal abgesehen davon, dass der Name nichtssagend ist, nicht immer ist es sinnvoll alles abzukrzen ;)). Dazu sind doch Funktionen/Prozeduren da, um doppelte Arbeit zu vermeiden.
Ein Funktion reicht dafr:
function getRandomItem(var Item1: TLagerItem): Boolean;
var
Versuche : Integer;
Index1 : Integer;
begin
result:=false;
Versuche:=50;
while not result do
begin
Versuche:=Versuche-1;
if Versuche=-1 then
exit;
Index1:=random(lager_api_count());
Item1:=lager_api_GetItem(Index1);
if not ((Item1.TypeID=ptGranate) or (Item1.TypeID=ptMine) or (Item1.TypeID=ptMunition) or
(Item1.TypeID=ptSensor) or (Item1.TypeID=ptWaffe) or (Item1.TypeID=ptpanzerung) or
(Item1.TypeID=ptrwaffe) or (Item1.TypeID=ptmotor) or (Item1.TypeID=ptguertel) or
(Item1.TypeID=ptshield) or (Item1.TypeID=ptrmunition) or (Item1.TypeID=ptextension)) then
continue;
result:=true;
end
end;
Diese kannst du dann fr beide Items aufrufen:
getRandomItem(item1);
getRandomItem(Item2);
game_api_messagebox(format(wintext,[base]));
Hier liegt auch noch ein Fehler (den ich auch im anderen Thread schon erwhnt hatte. Wenn dann muss es richtig sein:
game_api_messagebox(format(wintext,[base.Name])); Allerdings ist der Format Befehl hier berflssig. Format ersetzt %s im String (hier wintext) durch die Werte die in [] angeben sind. Allerdings ist bei dir in wintext kein %s definiert.
P.S: Hoffe du bist nicht zu bse mit mir, ich mchte dich ja nur auf die Fehler hinweisen. Wenn du was nicht verstehst dann frag ;) Ich bin froh, dass sich wenigstens mal jemand mit dem Thema auseinandersetzt. |
|
verfasst am: 27.10.2004, 13:49
|
Registrierdatum: 18.10.2004, 16:31
Beitrge: 481
|
alle diese fehler sind mir bewusst.
-random, weil es hier ja nicht aus dem lager entfern wird, somit is es egal wieviel stck
-das mit
getrandomitem(item1);
getrandomitem(item2)
wei ich nicht so genau, wie man das dann einbauen kann, deshalb geh ich auf nummer sicher
-base oder base.name is doch wurscht, hauptsach geht! wenn ichs dann anders knnte man wrfeln, was er dann macht
entweder die message kommt nicht, oder type mismatch oder aber es kommt invalid number of paras
-nee bin nicht bse, aber sei MIR nich bse, wenn ich behaupte, dass deine skriptsprache (noch) etwas komisch is |
|
verfasst am: 27.10.2004, 14:22 · Edited by: Jim_Raynor
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beitrge: 2261
|
Zitat: nightelf_IX -random, weil es hier ja nicht aus dem lager entfern wird, somit is es egal wieviel stck Das Problem ist nicht random. lager_api_GetItem hat nichts mit der Anzahl zu tuen. Bitte schaue dir mal im samples-Ordner das Skript ShowLagerItems oder so hnlich an, da siehst du vielleicht wie ich das meine. lager_api_GetItem gibt Informationen zu einem Ausrstungsgegenstand zurck, der ber einen Index angegeben wird. Zitat: nightelf_IX wei ich nicht so genau, wie man das dann einbauen kann, deshalb geh ich auf nummer sicher Genauso wie ich das geschrieben habe. Statt gri1(Item1) schreibst du GetRandomItem(Item1) und statt gri2(Item2) schreibst du GetRandomItem(Item2).
Zitat: nightelf_IX base oder base.name is doch wurscht, hauptsach geht! wenn ichs dann anders knnte man wrfeln, was er dann macht
entweder die message kommt nicht, oder type mismatch oder aber es kommt invalid number of paras Das passiert eben nicht, weil in wintext kein %s drin ist. Wenn du das mal da rein schreibst, dann wird auch irgendwas schlimmes passieren, womit du nicht rechnest. Zur Zeit reicht in deinem Skript game_api_messagebox(wintext);. Das ganze Zeug mit Format kannst du dir sparen, weil du kein %s in wintext drin hast.
Zitat: nightelf_IX -nee bin nicht bse, aber sei MIR nich bse, wenn ich behaupte, dass deine skriptsprache (noch) etwas komisch is Ich behaupte einfach, wer halbwegs etwas von Programmierung versteht, kommt damit ohne Probleme zurecht. Ausserdem habe ich nie behauptet, dass X-Skript fr den normalen User geeignet ist.
Dann sage doch mal was komisch daran ist?
Zur Zeit kann ich niemanden empfehlen deine Skripte zu nutzen oder zu lernzwecken zu verwenden. Sie sind einfach falsch und die Fehler habe ich dir genannt.
Vielleicht hilft es dir ja, wenn du dir mal ein Tutorial zu Pascal anschaust. Darauf basiert X-Skript und es hilft dir vielleicht zu einem allgemeinem Verstndnis fr die Programmierung.
Sorry schon mal im vorraus, aber was gesagt werden muss, das muss gesagt werden |
|
verfasst am: 27.10.2004, 14:29 · Edited by: nightelf_IX
|
Registrierdatum: 18.10.2004, 16:31
Beitrge: 481
|
Mit C++ hab ich schon die besten WarCraft III-Maps in Battle.Net programmiert. Soviel zu meiner erfahrung.
Wre nett, wenn mir einer sagen knnte, wie man Create:TOBJECT anwendet, dann knnte man Alienausrstung selber machen.
Auerdem hab ich nie gesagt, dass jemand aus diesen lernen soll. es soll lediglich fr die gelangweilten not-team-members (wie mich) da sein |
|
verfasst am: 27.10.2004, 16:17
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beitrge: 2261
|
Zitat: nightelf_IX Mit C++ hab ich schon die beseten WarCraft III-Maps in Battle.Net programmiert. Soviel zu meiner erfahrung. Gut, was soll ich jetzt dazu sagen. Hab mich ja schon im vorraus entschuldigt ;) Wie gesagt, kannst gerne hier Fragen stellen und es war auch nicht wirklich bse gemeint. Mir ist ja jetzt klar geworden woran es liegt. Einfach an der fehlenden Dokumentation zu X-Skript. Aber bald wird jeder daran mitarbeiten knnen (aber dazu spter mehr).
Zitat: nightelf_IX Wre nett, wenn mir einer sagen knnte, wie man Create:TOBJECT anwendet, dann knnte man Alienausrstung selber machen. TObject stellt kein Ausrstungsgegenstand dar. TObject bildet in Object Pascal, und demnach auch in X-Skript, die Basisklasse fr alle anderen Objekte wie TUFO, TEinsatz, TRaumschif und TBasis. Theoretisch kannst du ein TObject mit Create so erstellen wie jedes andere Objekt in Object Pascal auch:
var
Obj: TObject;
begin
Obj:=TObject.Create;
.
.
.
Obj.Free;
end;
Free muss sein um den Speicherplatz wieder freizugeben.
Aber wie gesagt, TObject anzulegen bringt nichts, da es keinerlei Eigenschaften hat. Auch andere Objekte anzulegen wie TRaumschiff oder TBasis bringt nichts, da sie nur in Pascal Script angelegt werden. Ins Spiel werden sie nicht automatisch bernommen. Dafr stehen dann solche Hilfsfunktionen wie ufo_api_CreateUFO zur Verfgung. Wie gesagt, zur Zeit gibt es keine Mglichkeit eigene Ausrstungen ins Spiel zu bringen. Zitat: nightelf_IX Auerdem hab ich nie gesagt, dass jemand aus diesen lernen soll Ich wollte es auch nur noch mal erwhnen, dass niemand auf diese Idee kommt ;) |
|
verfasst am: 27.10.2004, 16:20 · Edited by: nightelf_IX
|
Registrierdatum: 18.10.2004, 16:31
Beitrge: 481
|
Hast mich nicht beleidigt ;)
Aber im Bugtracker war die Rede davon, dass man schon eigene Objekte machen knne. Im Bug 0000693 (von mir)
Was is jetzt noch alles falsch ?
program Lager;
const
{$ifdef deutsch}
{$define constok}
missiontext ='Sir, hier spricht %s. Aliens sind in ein altes Lager eingedrungen und haben'+
' dieses Besetzt.'#10#13'Sie knnen die Waren, die sich in diesem Bergwerk befinden bergen,'+
' wenn Sie die Aliens vertreiben knnten. Wir vermuten, dass die Aliens die Ausrstung in drei Tagen zerstrt haben.'#10#13#10#13'Viel Glck!';
wintext ='Herzlichen Glckwunsch! Sie haben das Lager zurckerobert. Sie erhalten die Waren in den nchsten Minuten.';
loosetext ='Sie haben es nicht geschafft. Die Aliens haben den gesamten Inhalt zerstrt und es lohnt sich nicht mehr, das Lager anzugreifen und %s ist enttuscht.';
roomname ='Lagerhaus';
desc ='Um die Waren aus dem Lagerhaus zurck zu erobern mssen Sie die Aliens vertreiben';
obj ='Vernichten Sie alle Aliens, um das Lager zurckzuerobern';
{$endif}
var
country : tcountry;
function getrandomitem1(var item1 : tlageritem): boolean;
var
tries : Integer;
num1 : Integer;
begin
result := false;
tries := 50;
while not result do
begin
tries := tries - 1;
if tries = -1 then
exit;
num1:=lager_api_count;
item1:=lager_api_getitem(num1);
if not ((item1.TypeID=ptGranate) or (item1.typeid=ptmine) or (item1.typeid=ptmunition) or
(item1.typeid=ptsensor) or (item1.typeid=ptwaffe) or (item1.typeid=ptpanzerung) or
(item1.typeid=ptrwaffe) or (item1.typeid=ptmotor) or (item1.typeid=ptguertel) or
(item1.typeid=ptshield) or (item1.typeid=ptrmunition) or (item1.typeid=ptextension)) then
continue;
result:=true;
end
end;
function getrandomitem2(var tiem2 : tlageritem): boolean;
var
tries : integer;
num2 : integer;
begin
result :=false;
tries :=50;
while not result do
begin
tries := tries -1;
if tries = -1 then
exit;
num2:=lager_api_count;
item2:=lager_api_getitem(num2);
if not ((item2.typeid=ptgranate) or (item2.TypeID=ptmine) or (item2.Typeid=ptmunition) or
(item2.typeID=ptsensor) or (item2.typeid=ptwaffe) or (item2.typeid=ptpanzerung) or
(item2.typeID=ptrwaffe) or (item2.typeid=ptmotor) or (item2.typeid=ptguertel) or
(item2.typeID=ptshield) or (item2.typeid=ptrmunition) or (item2.typeid=ptextension)) then
continue;
result:=true;
end
end;
procedure missionwin(einsatz:teinsatz);
var
base :tbasis;
item1 :tlageritem;
item2 :tlageritem;
inum1 :integer;
inum2 :integer;
begin
// Wie man sieht, hab ich einfach inum als anzahl gemacht,
// was nix mit num1 oder num2 (=lager_api_count) zu tun hat.
// Denn man soll ja nicht auf die Anzahl im Lager sondern
// auf einen Zufallswert angewiesen sein.
inum1:=random(10)+5;
inum2:=random(10)+5;
base:=basis_api_getmainbase;
game_api_messagebox(wintext);
if GetRandomItem1(item1) then
raumschiff_api_dotransporttobase(country,base,item1,inum1);
if GetRandomItem2(item2) then
raumschiff_api_dotransporttobase(country,base,item2,inum2);
mission_win();
end;
procedure timeup(einsatz:teinsatz);
begin
game_api_messagebox(format(loosetext,[country.name]));
mission_loose();
country_api_changeconfident(country.index,-125);
end;
procedure StartMission;
var
i:integer;
einsatz:Teinsatz;
base:tbasis;
begin
base:=basis_api_getmainbase;
einsatz:=einsatz_api_generateeinsatz();
if einsatz.country=-1 then
begin
einsatz.start;
mission_abort();
end;
for i:=1 to random(15)+5 do
einsatz.addalien(alien_api_getrandomalien);
if not einsatz.start then
mission_abort()
einsatz.description:=desc;
einsatz.objectives:=obj;
einsatz.name:=roomname;
register_einsatz_win(@missionwin,einsatz);
register_einsatz_timeup(@timeup,einsatz);
einsatz.remaintime:=4320;
country:=country_api_getcountry(einsatz.country);
game_api_messagebox(format(missiontext,[country.name]))
end;
begin
MissionName := 'Lager';
MissionType := mzUser;
end. |
|
verfasst am: 27.10.2004, 16:33
|
Programmierer
Registrierdatum: 23.08.2003, 19:16
Beitrge: 2261
|
Zitat: nightelf_IX Aber im Bugtracker war die Rede davon, dass man schon eigene Objekte machen knne. Im Bug 0000693 (von mir)
MMhhhh. Ich weiss nicht was passiert. Probiere einfach mal aus ein TLagerItem selber zu bestcken (im Objektbrowser siehst du ja welche Felder es gibt) und anschliessend mit raumschiff_api_DoTransportToBase in die Basis zu schicken. Einfach mal probieren. Ich weiss wirklich nicht was da jetzt passiert.
P.S: TLagerItem ist ein Record und muss nicht mit Create oder so angelegt werden. |
|
verfasst am: 27.01.2022, 13:47
|
Registrierdatum: 27.01.2022, 13:07
Beitrge: 318
|
|
|
verfasst am: 13.06.2022, 17:42
|
Registrierdatum: 29.10.2021, 14:57
Beitrge: 763
|
|
|
verfasst am: 13.06.2022, 17:42
|
Registrierdatum: 29.10.2021, 14:57
Beitrge: 763
|
|
|
verfasst am: 22.11.2023, 11:21
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 01.12.2023, 12:58
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 01.06.2024, 12:14
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 01.08.2024, 10:16
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 18.10.2024, 06:19
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 18.10.2024, 06:20
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
|
verfasst am: 18.10.2024, 06:21
|
Registrierdatum: 22.11.2023, 07:10
Beitrge: 170245
|
|
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [12] [13] >> |