SAIL - Atak jednostek na mapie

Gotowe kody SAIL'a, informacje na temat moddingu, itd.

Moderator: zoNE

Post Reply
User avatar
zoNE
The Great Uniter & Site Administrator
The Great Uniter & Site Administrator
Posts: 2061
Joined: Fri Feb 17, 2006 3:44 pm
Location: Poland
Contact:

SAIL - Atak jednostek na mapie

Post by zoNE »

NNPlaya wrote:

Code: Select all

export czolg1, czolg2;

Starting
Begin
czolg1 = ComConstruct();
czolg2 = AddComConstruct();
enable(01);
end;
Przeanalizuj sobie powyższy kod i ten tekst. Chcesz, żeby wróg wyprodukował pojazd w fabryce. Od tego jest funkcja ComConstruct. (Nie wpisałem jej tutaj z wymaganymi, parametrami, tylko dałem przykład.) W argumentach przyjmuje ona identyfikator warsztatu/fabryki oraz nazwy pożądanych części. Zajrzyj do spisu funkcji SAILa po więcej informacji. Wracając do funkcji ComConstruct - wszystko fajnie, pojazd zostanie zmontowany przez mechaników (lub nie, jeśli nie będzie ich w warsztacie lub braknie prądu :P ), lecz jak teraz wydasz komendę ataku pojazdowi? Ano nie da rady tego zrobić. Na pewno? Jest na to rozwiązanie przedstawione w kodzie - przypisujemy ComConstruct do zmiennej. Od teraz odwołując się do tej zmiennej będziemy mogli wydawać rozkazy pojazdowi, który został do niej przypisany (identycznie, gdybyśmy na mapie postawili wehikuł i dali mu identyfikator poprzez edytor). Dalej widać, że do drugiej zmiennej przypisano nie ComConstruct, lecz AddComConstruct. Różni się ona od tej pierwszej tym, iż Add oznacza dodanie rozkazu do kolejki, co pozwala na rozkazanie produkcji określonych pojazdów w fabryce w ustalonej przez nas serii. Dobrze, więc mamy kod jak powyżej, lecz jak teraz sprawdzić, czy zostały wyprodukowane wszystkie pożądane pojazdy? Teraz posłużymy się zdarzeniami SAILa. Konkretnie chodzi mi o VehicleConstructed:

Code: Select all

on VehicleConstructed(ident_pojazdu, ident_fabryki) MARKED 01 do
Begin
   if ident_pojazdu = czolg2 then
   Begin
      ComAgressiveMove(czolg1, 34, 53);
      ComAgressiveMove(czolg2, 34, 53);
      Disable(01);
   end;
end;
Zdarzenie VehicleConstructed jest wywoływane za każdym razem, gdy zostaje wybudowany pojazd. Jednocześnie zwraca dwa argumenty do operacji - odniesienia do pojazdu i fabryki. W powyższym kodzie sprawdzam, czy pierwszy argument ident_pojazdu, jest odniesieniem do tego samego wehikułu, co czolg2 - wcześniej przypisany do komendy ComConstruct.

Cały kod:

Code: Select all

export czolg1, czolg2;

Starting
Begin
czolg1 = ComConstruct();
czolg2 = AddComConstruct();
enable(01);
end;

on VehicleConstructed(ident_pojazdu, ident_fabryki) MARKED 01 do
Begin
   if ident_pojazdu = czolg2 then
   Begin
      ComAgressiveMove(czolg1, 34, 53);
      ComAgressiveMove(czolg2, 34, 53);
      Disable(01);
   end;
end;
A teraz najlepsze: nie sprawdzałem, czy na pewno działa. To Twoje zadanie na dziś :D

[ Dodano: Sob Sie 16, 2008 11:44 pm ]
Ajć i prawie zapomniałem: w kodzie są też instrukcje enable i disable. Zdarzenie SAILa trzeba bowiem podtrzymywać do życia tak samo jak bloki every, z tego co sobie przypominam, wcześniej już o nich pisałem. (I Radzio jak zwykle wcisnął swoje słuszne trzy grosze :) )
Radzio wrote:To znów je wcisnę :P Poza tym, że nie podałeś parametrów dla funkcji ComConstruct, to wszystko powinno działać. Nie rozumiem jednak, po co dałeś enable(01);, skoro zdarzenie i tak będzie domyślnie enabled. Zdarzenia nie wymagają podtrzymywania przy życiu. Bez wydawania komend enable/disable pozostają żywe. Można nimi oczywiście manipulować tak, jak every, więc np. w bloku zdarzenia nie musiałeś podawać numeru do zablokowania (disable(01);), bo domyślnie (czyli bez podania parametru) zablokowany zostaje blok, w którym znajduje się disable, czyli właśnie ten, który chciałeś zablokować.

PS: Cieszę się, że ktoś korzysta z tutka o zdarzeniach w SAILu. To naprawdę potężne narzędzie :P
Author: NNPlaya & Radzio
Topic: http://forum.original-war.net/viewtopic.php?t=1241
Post Reply