Gotowe kody mojego autorstwa.

Wszelkie pytania na temat SAIL'a i modowania OW.
Post Reply
User avatar
Nitek
Community Veteran
Community Veteran
Posts: 997
Joined: Mon Apr 13, 2009 4:13 pm
Location: Białystok
Contact:

Gotowe kody mojego autorstwa.

Post by Nitek »

Będę tutaj umieszczał większość z kodów, które użyłem w moim modzie i są zarazem godne umieszczenia w modding archive. Później pewnie (mam taką nadzieję) zoNE umieści je w modding archive ;>

Zaczynamy:

Jeżeli zaatakujemy lub zajmiemy budynek czy pojazd danej strony, przegramy. Przydatne, gdy nie chcemy np. by w naszym modzie można było rozwalić dla zabawy całą bazę sojusznika. :P
W tym przykładzie strona, która powinna zostać nienaruszona to 2, czyli żółty kolor (arabowie). Dodatkowo mamy zmienną (w moim przypadku) "atak_ruskow" - jeżeli zmienimy ją na 1, to do woli możemy atakować i zajmować jednostki gracza żółtego. Całość opatrzona komentarzem po //

Code: Select all

Export wczesny_atak, atak_ruskow; // tworzymy zmienne

Every 0$1 trigger GetLives(FilterAllUnits([f_side,2]))<1000 and atak_ruskow=0 do // Skrypt sprawdza "zdrowie" jednostek (w tym przypadku wszystkie jednostki strony 2) i jeżeli jakaś z nich ma mniej niż 1000 (czyli inaczej 100%) i drugi warunek spełnia wymagania (czyli atak_ruskow wynosi 0) to wykonywany jest poniższy skrypt. 
 Begin
  wczesny_atak=1; // zamiast dawać kilka razy komendę "YouLost" lepiej jest zrobić to w ten sposób, ponieważ jeżeli się zdecydujemy dodać np. krótki dialog przed przegraną to nie musimy dodawać tego w każdym miejscu oddzielnie, a tylko raz i mieć to z głowy
 End;

On VehicleCaptured(new_identifier, old_identifier, old_side, capturing_unit) do // tutaj mamy wydarzenie, a niżej sprawdzamy niektóre czynniki
 Begin
  if old_side=2 and Getside(capturing_unit)=3 then // jeżeli strona pojazdu przed przejęciem to 2, a jednostka przejmująca to 3 (czyli w tym przypadku to my) to skrypt się uruchomi
   if atak_ruskow=0 then wczesny_atak=1; // jeżeli zmienna wynosi 0 to właściwe działanie skryptu zostanie wykonane
  Enable; // jeżeli wszystkie warunki nie zostaną spełnione to "Enable" przy następnym przejęciu pozwoli nam ponownie sprawdzić wszystkie warunki i ewentualnie wykonać skrypt
 End;

On BuildingCaptured(captured_building, old_side, capturing_unit) do // tym razem skrypt dotyczy budynków, a nie pojazdów
 Begin
   if old_side=2 and Getside(capturing_unit)=3 then
    if atak_ruskow=0 then wczesny_atak=1;
  Enable;
 End;

Every 0$1 trigger wczesny_atak=1 do // gdy zmienna "wczesny_atak" zostanie ustawiona na 1 (standardowo wynosi 0) to wyskoczy nam komunikat o przegranej grze; możemy oczywiście dodać np. dialog czy inne akcje, aby urozmaicić grę.
 Begin
  YouLost('WczesnyAtak');
 End;
Radzio
Site Administrator
Site Administrator
Poland
Posts: 2898
Joined: Fri Jul 28, 2006 10:58 am
Location: Bialystok, Poland

Re: Gotowe kody mojego autorstwa.

Post by Radzio »

Enable; nie ma wpływu na eventy, możesz wywalić.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Gotowe kody mojego autorstwa.

Post by Serpent »

Bardzo fajne tylko już istnieją eventy na coś takiego.
Zamiast tego every można dać:

Code: Select all

Wczytać funkcję:

export you_attack_al, you_cap_veh, you_cap_b, al_betray;
Export function IfYouAttack;
begin
you_attack_al := {jakaś wartość, powyżej 0  np.3} 3;
you_cap_veh  := {jakaś wartość, powyżej 0}
you_cap_b  := {jakaś wartość, powyżej 0}
al_betray := false;
end;

Następnie:

On Contact(side1,side2) do
begin

If side1 = twoja strona and side2 = pozycja soja then
begin
you_attack_al = you_attack_al - 1;

If you_attack_al < 1 and al_betray = false then
YouLost('');
end;

end;


// Przejęcie
On VehicleCaptured(new_identifier, old_identifier, old_side, cap_unit) do
begin

If old_side = strona soja and GetSide(cap_unit) = twoja strona then
begin
you_cap_veh = you_cap_veh - 1;

If you_cap_veh < 1 and al_betray = false then
YouLost('');
end;

end;


// Budynki
On BuildingCaptured(captured_building, old_side, cap_unit) do
begin

If old_side = soja strona and GetSide(cap_unit) = twoja strona then
begin
you_cap_b = you_cap_b - 1;

If you_cap_b < 1 and al_betray = false then
YouLost('');
end;

end;

Wystarczy jeszcze dać jeszcze zmianę al_betray na true gdy sojusznik będzie wrogiem.
Wartości są po to by za pierwszym razem gdy zaatakujemy soja nie było losta lecz za "x" razem.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Nitek
Community Veteran
Community Veteran
Posts: 997
Joined: Mon Apr 13, 2009 4:13 pm
Location: Białystok
Contact:

Re: Gotowe kody mojego autorstwa.

Post by Nitek »

Praktyczne zastosowanie pętli.

Często warto użyć pętli jeżeli daliśmy komuś zadanie pójścia w dane miejsce i nic się nie wydarzy dopóki ta postać tam nie dojdzie. W tym przykładzie postać o identyfikatorze "Ludek" dostała zadanie pójścia do miejsca x=22 y=11. Gra będzie czekać sekundę i powtarzać tą czynność dopóki nasz Ludek nie dojdzie do wyznaczonego miejsca.

Code: Select all

ComMoveXY(Ludek,22,11);
 Repeat
  Wait(0$1)
 Until
  IsAt(Ludek,22,11);
Say(Ludek,'Jakis-Dialog');
Inne przykładowe zastosowanie to zwiększanie zmiennej o 1 co sekundę dopóki jednostka z identyfikatorem "Czlowieczek" nie dojdzie w pobliże jednostki "Skladzik". Można zrobić to samo używając every, ale zajmie to więcej czasu, miejsca i będzie mniej czytelne; a jak wiadomo jeżeli 10 linijek robi to samo co 20 linijek, to te 10 linijek będzie lepszym rozwiązaniem.

Code: Select all

 Repeat
  Begin
   ZmiennaA=ZmiennaA+1;
   Wait(0$1);
  End;
 Until
  GetDistUnits(Czlowieczek,Skladzik)<12;
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Gotowe kody mojego autorstwa.

Post by Serpent »

Nitek wrote:

Code: Select all

 Repeat
  Begin
   ZmiennaA=ZmiennaA+1;
   Wait(0$1);
  End;
 Until
  GetDistUnits(Czlowieczek,Skladzik)<12;
Zauważyłem błąd w tym bloku, dotyczy on End.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
User avatar
Nitek
Community Veteran
Community Veteran
Posts: 997
Joined: Mon Apr 13, 2009 4:13 pm
Location: Białystok
Contact:

Re: Gotowe kody mojego autorstwa.

Post by Nitek »

W tym przypadku zarówno "End" jak i "End;" będzie prawidłowe.
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posts: 4169
Joined: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Contact:

Re: Gotowe kody mojego autorstwa.

Post by Serpent »

Nitek wrote:W tym przypadku zarówno "End" jak i "End;" będzie prawidłowe.
Mój błąd :amrazz:
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
JRF
Soldier level 1
Soldier level 1
Posts: 25
Joined: Sat Jan 07, 2012 1:40 pm

Re: Gotowe kody mojego autorstwa.

Post by JRF »

@nitek jeśli chodzi o ludzi, to wolę krótszą i bardziej uniwersalną pętlę:

Code: Select all

while not IsIdle(sol) do wait(0$1);
---
ty,
JRF
Post Reply