Grupa śmierci

Wszystko o modach, patchach i błędach w OW oraz ogólnym programowaniu.
Responder
Avatar de Usuario
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: Lun Jul 28, 2008 3:09 pm
Ubicación: Polska
Contactar:

Grupa śmierci

Mensaje 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:

Código: Seleccionar todo

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: Vie Jul 28, 2006 10:58 am
Ubicación: Bialystok, Poland

Re: Grupa śmierci

Mensaje 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.
Avatar de Usuario
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: Lun Jul 28, 2008 3:09 pm
Ubicación: Polska
Contactar:

Re: Grupa śmierci

Mensaje 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
Avatar de Usuario
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: Mar Sep 04, 2007 6:10 pm
Ubicación: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Mensaje por Gothuk »

Pablo Abruzzi escribió: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?

Código: Seleccionar todo

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: Vie Jul 28, 2006 10:58 am
Ubicación: Bialystok, Poland

Re: Grupa śmierci

Mensaje por Radzio »

Código: Seleccionar todo

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
Avatar de Usuario
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: Mar Sep 04, 2007 6:10 pm
Ubicación: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Mensaje por Gothuk »

Radzio, funkcja powinna zwrocic false, jezeli jednostki zyja, czyli if not dead.
Czyli nie widze bledu u siebie xD.
Avatar de Usuario
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: Lun Jul 28, 2008 3:09 pm
Ubicación: Polska
Contactar:

Re: Grupa śmierci

Mensaje 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:

Código: Seleccionar todo

..........
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
Avatar de Usuario
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: Mar Sep 04, 2007 6:10 pm
Ubicación: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Mensaje por Gothuk »

Pablo Abruzzi escribió: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.

Código: Seleccionar todo

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;
Avatar de Usuario
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: Lun Jul 28, 2008 3:09 pm
Ubicación: Polska
Contactar:

Re: Grupa śmierci

Mensaje por Pablo Abruzzi »

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

Tylko takie pytanie:
Gothuk escribió: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
Avatar de Usuario
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: Mar Sep 04, 2007 6:10 pm
Ubicación: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Mensaje 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.
Avatar de Usuario
Pablo Abruzzi
Soldier level 5
Soldier level 5
Mensajes: 269
Registrado: Lun Jul 28, 2008 3:09 pm
Ubicación: Polska
Contactar:

Re: Grupa śmierci

Mensaje 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:

Código: Seleccionar todo

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
Avatar de Usuario
Gothuk
Site Administrator
Site Administrator
Poland
Mensajes: 983
Registrado: Mar Sep 04, 2007 6:10 pm
Ubicación: Poland, Warsaw
Contactar:

Re: Grupa śmierci

Mensaje por Gothuk »

Pablo Abruzzi escribió: 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: Vie Jul 28, 2006 10:58 am
Ubicación: Bialystok, Poland

Re: Grupa śmierci

Mensaje por Radzio »

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