Lekcja 1
Skoro to czytasz, to oznacza że jeszcze nie zasnąłeś :-)))))
W tym dziale poprzez praktykę nauczysz się jak stosować polecenia w skrypcie.
Będzie to miało taką postać :
- na samej górze będzie komentarz
- następnie napiszę skrypt
- później zaznaczę w ten sposób '{1}' gdzie jest coś nowego (bo wiele rzeczy będzie się powtarzać) i opiszę to pod spodem. Jednak najpierw przeczytaj opis tego polecenia w dokumentacji, a potem
przeczytaj moją wersję. Jest ona nie dokładna, ale pozwala lepiej zrozumieć.
W dziale 'Struktura Skryptu' dowiedziałeś się, jak skrypt jest podzielony, więc teraz zaczynamy !!!
Na początek opiszę najprostszy skrypt z dokumentacji:
mission "Misja 1" {1}
{
player playerUCS; {2}
player playerED;
state Initialize; {3}
state Working;
state Nothing;
state Initialize {4}
{
playerUCS = GetPlayer(1); {5}
playerED = GetPlayer(2);
playerUCS.SetMoney(10000); {6}
playerED.SetMoney(10000);
return Working, 100; {7}
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() ) {8}
{
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() )
{
EnableEndMissionButton(true);
return Nothing;
}
return Working, 100;
}
state Nothing
{
return Nothing,1200;
}
}
Opis:
{1} Zawiera nazwę skryptu
{2} Tworzysz nowego gracza o nazwie 'playerUCS' - używa się tej nazwy w skrypcie do sprawdzania celów misji i przypisywaniu czegoś graczowi.
{3} 'State' jest jakby procedurą, w której zawarte są polecenia. Możesz tworzyć ich nieskończenie wiele, ale podstawowymi są:
-Initialize - zawiera polecenia służące do zdefiniowania jaki będzie początek gry
-Working - poprzez zapętlenie sprawdza cele i wykonuje określone funkcje
-Nothing - jest zapętlona w nieskończoność (aby skrypt miał co robić gdy wypełnisz wszystkie cele misji :)
{4} Tutaj wpisujemy warunki początkowe do Initialize
{5} Przyporządkowuje numer gracza
{6} Myślę, że niedługo polubicie to polecenie. Daje ono gotówkę początkową
{7} Wskazuje, żeby gra wykonała polecenia zawarte w state 'Working' po podanym czasie (1 sekunda to 20 jednostek)
{8} Warunku IF nie tłumaczę (jest w dokumentacji), sprawdź też co znaczą poszczególne polecenia w nim zawarte. Jeśli napiszesz GetNumberOfUnits() to nie ma to odniesienia do żadnego gracza tylko
musisz przyporządkować to tak:
'playerUCS.GetNumberOfUnits'.
Cały warunek oznacza to, że jeśli 'playerUCS' straci wszystkie jednostki i budynki to wtedy gra wykona polecenia zawarte między tymi '{' , '}' znakami.
Jeśli rozumiesz przejdź dalej, w przeciwnym wypadku to nie będzie miało sensu.
Nasz pierwszy projekt musi mieć jakąś nazwę, więc niech będzie 'MicroStorm' (to brzmi dumnie). MicroStorm będzie skryptem do kampanii (dla uproszczenia) dla dwóch graczy działającym w potyczce.
Tradycyjnie będzie to dla UCS i ED, Panie z Księżyca na razie zostawię w spokoju. Będzie prezentował różne funkcje niekoniecznie używane w potyczce. Teraz dowiecie się jak stworzyć pierwszy
komunikat w grze, w końcu miło zobaczyć jakieś powitanie.
mission "MicroStorm v1.0"
{
player playerUCS;
player playerED;
state Initialize;
state Working;
state Nothing;
state ShowBriefing;
state Initialize
{
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
playerUCS.SetMoney(10000);
playerED.SetMoney(10000);
return ShowBriefing, 100;
}
state
ShowBriefing {1}
{
AddBriefing("Powitanie !");
return Working,100;
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() )
{
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() )
{
AddBriefing("Wygrałeś");
EnableEndMissionButton(true);
return Nothing;
}
return Working, 100;
}
state Nothing
{
return Nothing,1200;
}
}
Opis:
{1} Stworzyłem nowe State - ShowBriefing. Polecenie AddBriefing dodaje komunikat, jednak maksymalna długość to kilka linijek. Jeżeli chcesz zrobić dłuższy komunikat to musisz posłużyć się LangC,
ale o tym kiedy indziej.
Zajmiemy się teraz upiększeniem naszej misji poprzez dodanie efektów pogodowych.
Najpierw zrób mapę do tej misji w edytorze, która ma postać:
- mają być 2 gracze: ED i UCS, którym przypiszesz 1 i 2 punkt startowy (resztę usuń)
- najlepiej o małej wielkości
- na samym środku mapy umieść znacznik 0
- daj każdej ze stron podstawowe budynki i jednostki cywilne, po kilka jednostek bojowych i surowce
mission "MicroStorm v1.1"
{
player playerUCS;
player playerED;
state Initialize;
state Working;
state Nothing;
state ShowBriefing;
state Initialize
{
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
playerUCS.SetMoney(10000);
playerED.SetMoney(10000);
Rain(GetPointX(0), GetPointY(0),200,1200,1800,2400,10); {1}
return ShowBriefing, 100;
}
state ShowBriefing
{
AddBriefing("Powitanie !");
return Working,100;
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() )
{
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() )
{
AddBriefing("Wygrałeś");
EnableEndMissionButton(true);
return Nothing;
}
return Working, 100;
}
state Nothing
{
return Nothing,1200;
}
}
Opis:
{1} To polecenie służy do wywołania deszczu. Możesz też dać śnieg, wiatr, deszcz meteorów. Jednak chciałem was nauczyć używania znaczników. Jest to bardzo wygodne, bo nie trzeba wpisywać
współrzędnych. GetPointX(0) służy do wybrania współrzędnej x'owej ze znacznika 0 umieszczonego na mapie.
Teraz pokażę wam kilka fajnych rzeczy. Mianowicie jak stworzyć kilka celów misji i stworzyć napis w zakładce 'Cele misji' podczas pokazywania komunikatu. W potyczce nie możesz w dowolnej chwili
zobaczyć komunikatu, bo w menu nie ma takiego polecenia.
mission "MicroStorm v1.2"
{
consts {1}
{
a=1;
b=2;
}
player playerUCS;
player playerED;
state Initialize;
state Working;
state Nothing;
state ShowBriefing;
state Initialize
{
RegisterGoal(a,"Zniszcz wszystkie jednostki i budynki
wroga"); {2}
RegisterGoal(b,"Wydobądź 5000 CR");
EnableGoal(a,true);
{3}
EnableGoal(b,true);
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
playerUCS.SetMoney(10000);
playerED.SetMoney(10000);
Rain(GetPointX(0), GetPointY(0),200,1200,1800,2400,10);
return ShowBriefing, 100;
}
state ShowBriefing
{
AddBriefing("Powitanie !");
return Working,100;
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() )
{
SetGoalState(a,goalFailed);
{4}
SetGoalState(b,goalFailed);
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() )
{
SetGoalState(a,goalAchieved);
{5}
}
if(playerUCS.GetMoney()>15000)
{6}
{
SetGoalState(b,goalAchieved);
playerUCS.SetMoney(playerUCS.GetMoney()-5000);
{7}
}
if(GetGoalState(a)==goalAchieved
&&
{8}
GetGoalState(b)==goalAchieved)
{
AddBriefing("Wygrałeś i wykonałeś wszystkie cele misji\n
Dzięki za 5000 CR");
EnableEndMissionButton(true);
return Nothing;
}
return Working, 100;
}
state Nothing
{
return Nothing,1200;
}
}
Opis:
{1} Nie wiem jak to opisać, ale każdy cel aby być pokazywany w 'cele misji' i można było się do niego odnosić musi mieć przypisaną literę i numer (taki identyfikator)
{2} Wypisuje w oknie komunikatu cel misji
{3} Dokładnie pisze w dokumentacji i nie chcę mieszać
{4} W oknie komunikatu zaznacza czy cel został wykonany, czy oblany
{5} W tym przypadku wykonany
{6} Jeśli zbierzesz więcej niż 15000 CR
{7} Odbiera kasę, bo jeśli miałeś ją zebrać to wtedy UCS ci ją zabiera
{8} Jeśli pierwszy i drugi cel będzie wykonany to gra wykona to co jest zawarte w warunku IF
Już teraz posiadając tą wiedzę możesz pisać swoje skrypty, jednak pokażę ci
jeszcze kilka innych funkcji EarthC, ale to już w kolejnej lekcji.
{/literal}