Grupa śmierci

Wszystko o modach, patchach i błędach w OW oraz ogólnym programowaniu.
Awatar użytkownika
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: pn lip 28, 2008 3:09 pm
Lokalizacja: Polska
Contactar:

Grupa śmierci

Post por Pablo Abruzzi »

Mam problem, zrobiłem taki posterunek i 6 wrogów. Kiedy gracz by ich zabił, wtedy puszczam dialogi i nowy cel misji, więc spróbowałem tak:

Kod: Zaznacz cały

export grupa;

every 0$1 trigger IsDead(grupa) do
begin
grupa=([am1,am2,am3,am4,am5,am6]);
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$2);
ChangeMissionObjectives('M2');
end;
Nie działa. Znaczy kompiluje się, ale mija 1 sekunda i bez względu na to co zrobię zostają odtworzone dialogi itd. W czym tu jest problem??
Próbowałem też bez tych () nawiasów same kwadratowe = to samo.
Próbowałem zdefiniować grupę w poprzednim zdarzeniu = to samo.

Ps. am1,am2....to identy tych sześciu.
Proszę o pomoc.
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Radzio
Site Administrator
Site Administrator
Poland
Mensajes: 2898
Registrado: pt lip 28, 2006 10:58 am
Lokalizacja: Bialystok, Poland

Re: Grupa śmierci

Post por Radzio »

1) IsDead działa tylko z pojedynczymi jednostkami.
2) Zmienna ma wartość 0 zanim ją określisz, tak więc 0 zawsze jest martwe.
Awatar użytkownika
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: pn lip 28, 2008 3:09 pm
Lokalizacja: Polska
Contactar:

Re: Grupa śmierci

Post por Pablo Abruzzi »

To co, da się coś zrobić??

Skoro to działa tylko na pojedyncze jednostki to można zastosować "and" w warunku, tylko aż 6 razy trzeba będzie :(
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Awatar użytkownika
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: wt wrz 04, 2007 6:10 pm
Lokalizacja: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Post por Gothuk »

Pablo Abruzzi pisze:To co, da się coś zrobić??

Skoro to działa tylko na pojedyncze jednostki to można zastosować "and" w warunku, tylko aż 6 razy trzeba będzie :(
a nie mozna sobie napisac funkcji ;o?

Kod: Zaznacz cały

function AreDead(units);
var un;
begin
   result := true;
   for un in units do
      if not IsDead(un) then begin 
         result := false;
         exit;
      end;
end;
chyba powinno dzialac.
Radzio
Site Administrator
Site Administrator
Poland
Mensajes: 2898
Registrado: pt lip 28, 2006 10:58 am
Lokalizacja: Bialystok, Poland

Re: Grupa śmierci

Post por Radzio »

Kod: Zaznacz cały

function NieZyja(l_grupa);
var un;
begin
  result := true;
  for un in l_grupa do
    if not IsDead(un) then
    begin
      result := false;
      exit;
    end;
end;
I IsDead zamieniamy na NieZyja (tylko nie dawaj pustej listy :P).

EDIT: Goth mnie wyprzedził :P
EDIT2: Ale on ma błąd :P
EDIT3: Noż lol, ja mam :P ale już poprawione
Awatar użytkownika
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: wt wrz 04, 2007 6:10 pm
Lokalizacja: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Post por Gothuk »

Radzio, funkcja powinna zwrocic false, jezeli jednostki zyja, czyli if not dead.
Czyli nie widze bledu u siebie xD.
Awatar użytkownika
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: pn lip 28, 2008 3:09 pm
Lokalizacja: Polska
Contactar:

Re: Grupa śmierci

Post por Pablo Abruzzi »

Dalej nie działa, ale to najprawdopodobniej mój błąd. Spójrzcie, zapewne źle zapisałem kod, bo powiem szczerze, że nie zbyt rozumiem budowę tej funkcji. Możecie ją opisać bardzo proszę.

A oto ten mój "zły" kod:

Kod: Zaznacz cały

..........
l_grupa=[am1,am2,am3,am4,am5,am6];
end;

export l_grupa;

function NieZyja(l_grupa);
var un;
begin
  result := true;
  for un in l_grupa do
    if IsDead(un) then
    begin
      result := false;
      exit;
    end;
end;

export grupa;

every 0$1 trigger NieZyja(l_grupa) do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
Tylko proszę się ze mnie nie śmiać :P
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Awatar użytkownika
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: wt wrz 04, 2007 6:10 pm
Lokalizacja: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Post por Gothuk »

Pablo Abruzzi pisze:Dalej nie działa, ale to najprawdopodobniej mój błąd. Spójrzcie, zapewne źle zapisałem kod, bo powiem szczerze, że nie zbyt rozumiem budowę tej funkcji. Możecie ją opisać bardzo proszę.

A oto ten mój "zły" kod:

// kod

Tylko proszę się ze mnie nie śmiać :P
nie definiujesz l_grupa, to tylko zmienna lokalna funkcji.

Kod: Zaznacz cały

export grupa;

function NieZyja(l_grupa); // tworzymy funkcje
var un;                          // definiujemy zmienna lokalna: un
begin
  result := true;              // ustawiamy wynik funkcji jako prawda
  for un in l_grupa do       // petla - dla kazdej jednostki (un) w l_grupa rob:
    if IsDead(un) then      // jesli jednostka nie zyje 
    begin
      result := false;         // ustaw wynik funkcji na falsz
      exit;                      // przerwij petle
    end;
end;

// jednak sadze ze powinno byc if no isdead(un), zeby zwrocic falsz.

starting
begin
   disable(001);
   // troche kodu
   // tworzenie postaci 
   grupa := [am1,am2,am3,am4,am5,am6];
   enable(001);
end;

every 0$1 trigger NieZyja(grupa) marked 001 do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
Awatar użytkownika
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: pn lip 28, 2008 3:09 pm
Lokalizacja: Polska
Contactar:

Re: Grupa śmierci

Post por Pablo Abruzzi »

Dzięki za ten opis, bardzo mi pomógł.

Tylko takie pytanie:
Gothuk pisze:starting
begin
disable(001);
// troche kodu
// tworzenie postaci
grupa := [am1,am2,am3,am4,am5,am6];
enable(001);
end;
A po co tutaj użyłeś disable(001); i enable(001);??
To konieczne, jakbym na przykład użył tej funkcji do kilku warunków?
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Awatar użytkownika
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: wt wrz 04, 2007 6:10 pm
Lokalizacja: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Post por Gothuk »

every ma sie wykonac 1 min po spelnieniu warunku, tak jak Radzio napisal zaexportowana zamienna ma automatycznie wartosc 0.
Jesli nie zmienisz wartosci zmiennej odpowiadajacej za grupe, to po minucie every sie wykona gdyz warunek jest spelniony, dlatego uzylem markeda.
Awatar użytkownika
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: pn lip 28, 2008 3:09 pm
Lokalizacja: Polska
Contactar:

Re: Grupa śmierci

Post por Pablo Abruzzi »

OK. Na razie wszytko jasne. Dzięki :D

Your welcome. - Gothuk

EDIT: Mały problem. Nie da się tego ustawić inaczej, bo to samo jest, dopiero teraz to przetestowałem. Kod:

Kod: Zaznacz cały

export l_grupa;

function NieZyja(l_grupa);
var un;
begin
  result := true;
  for un in l_grupa do
    if IsDead(un) then
    begin
      result := false;
      exit;
    end;
end;

export hg1,hg2,hg3,hg4,hg5;

every 10$20 trigger IsInArea(ser,area_3) do
begin
disable(001);
uc_side=1;
uc_nation=1;
vc_chassis=us_heavy_tracked;
vc_engine=engine_combustion;
vc_control=control_computer;
vc_weapon=us_heavy_gun;
hg1=CreateVehicle;
hg2=CreateVehicle;
hg3=CreateVehicle;
vc_chassis=us_heavy_tracked;
vc_engine=engine_combustion;
vc_control=control_computer;
vc_weapon=us_double_gun;
hg4=CreateVehicle;
hg5=CreateVehicle;
PlaceUnitArea(hg1,area_4,false);
PlaceUnitArea(hg2,area_4,false);
PlaceUnitArea(hg3,area_4,false);
PlaceUnitArea(hg4,area_4,false);
PlaceUnitArea(hg5,area_4,false);
ComMoveXY([hg1,hg2,hg3,hg4,hg5], 78, 91);
Wait(0$10);
ComAgressiveMove([hg1,hg2,hg3,hg4,hg5], 92, 93);
enable;
l_grupa=[am1,am2,am3,am4,am5,am6];
enable(001);
end;


every 0$1 trigger NieZyja(l_grupa) marked 001 do
begin
Say(p1,'MojDialog5');
Say(ser,'MojDialog6');
SayRadio(ser,'MojDialog7');
SayRadio(orzel,'MojDialog8');
SayRadio(ser,'MojDialog9');
SayRadio(orzel,'MojDialog10');
SayRadio(ser,'MojDialog11');
SayRadio(orzel,'MojDialog12');
Wait(0$1);
ChangeMissionObjectives('M2');
ChangeMissionObjectives('M3');
end;
To cały kod, dalej to samo. Nie da się dać podobnego warunku, bez takich problemów??
Si vis pacem, para bellum jeśli chcesz pokoju, gotuj się do wojny.

THE HEROES COMPANY MOD
[progress]100%[/progress]
DONE
http://forum.original-war.net/viewtopic ... 6&start=90
Awatar użytkownika
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: wt wrz 04, 2007 6:10 pm
Lokalizacja: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Post por Gothuk »

Pablo Abruzzi pisze: EDIT: Mały problem. Nie da się tego ustawić inaczej, bo to samo jest, dopiero teraz to przetestowałem.
ale co jest to samo?
dialogi wystapuja po 1 min, czy wcale?

poza tym gdzie masz blok starting?
i czy dales na pewno caly kod?
Radzio
Site Administrator
Site Administrator
Poland
Mensajes: 2898
Registrado: pt lip 28, 2006 10:58 am
Lokalizacja: Bialystok, Poland

Re: Grupa śmierci

Post por Radzio »

Tam ma być te "not". Czasem możesz zaufać sobie. Człowiek po 10PM bredzi :P
Responder