Lekcja 2
Witam wszystkich w Lekcji 2!
Jeśli nie zaliczyłeś Lekcji 1, to lepiej ją zalicz, bo teraz zajmiemy się ulepszaniem naszego skryptu. Tyle względem wstępu, przejdźmy do konkretów.
Co będzie nam potrzebne:
- Mapa (najlepiej mała lub średnia) z ustawionymi dwoma graczami ( UCS (1) i ED (2) ).
- Ustaw podstawowe budynki, pojazdy itp.
- Każdemu z graczy daj trochę surowców.
- Zaopatrz się w trochę cierpliwości oraz dobrej chęci :)
- ustaw znacznik 0 w środku mapy.
Teraz napiszemy nasz skrypt, od poprzedniego będzie się różnił tym, że drugi cel misji pojawi się dopiero po wykonaniu pierwszego.
mission "MicroStorm v1.3"
{
player playerUCS;
player playerED;
int zmienna1; {1}
state Initialize;
state ShowBriefing;
state Working;
state CelAWykonany; {0}
state Nothing;
state Initialize
{
zmienna1=1; {2}
RegisterGoal(a," Zniszcz wszystkie jednostki i budynki wroga");
EnableGoal(a,true);
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
playerED.SetMoney(10000); {3}
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);
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() && zmienna1==1 )
{
return CelAWykonany; {4}
}
If(!playerUCS.GetMoney()>50000);
{
SetGoalState(b,goalAchieved);
playerUCS.SetMoney(playerUCS.GetMoney()-5000);
}
if(GetGoalState(a)==goalAchieved && GetGoalState(b)==goalAchieved)
{
AddBriefing("Wygrałeś i wykonałeś wszystkie cele misji,Dzięki za 5000 CR");
EndMission(true); {6}
return Nothing;
}
return Working, 100;
}
state CelAWykonany
{
zmienna1=0; {5}
SetGoalState(a,goalAchieved);
RegisterGoal(b,” Wydobądź 50000 CR ”);
EnableGoal(b,true);
PlayerUCS.SetMoney(10000);
AddBriefing(”==== J A K I Ś K O M U N I K A T=======”);
return Working;
}
state Nothing
{
return Nothing,1200;
}
}
{0} tworzymy nowy „state”.
{1} „int” służy do stworzenia zmiennej, której wartość określamy kiedy się nam podoba, możemy ją nazwać jak tylko chcemy. Do czego ona służy opiszę zaraz.
{2} określamy wartość naszej zmiennej.
{3} dajemy kasę tylko ED, tak żeby było trudniej :)
{4} polecenie “return Nazwa_State” , jak by to powiedzieć, każe grze prejść do state o nazwie “Nazwa_State”
{5} teraz wyjaśnię całą tajemnicę z tą zmienną:
Gdybyśmy nie dodali do warunku zaliczenia celu misji “a” tego, że “zmienna1” musi mieć wartość “1”, i nie pżypisali jej (w
state “CelAWykonany” )wartośći “0” to gra wykonała by to wszystko co ma wykonać ( zaliczyć cel “a”, dać 10000CR,
pokazać komunikat ) tylko, że robiła by to w nieskończoność, co pare sekund. Dlaczego ? Ano dlatego, że ED przecież cały
czas nie miałby budynków i jednostek, a teraz potrzebna jest jeszcze wartość “zmiennej1” wynosząca “1”. W state
“CelAWykonany” przypisujemy jej wartość “0” , więc teraz gdy gra wruci spowrotem do state “Working” warunek celu
“a” nie będzie teraz spełniany bo “zmienna1” wynosi “0”, więc gra nie wruci spowrotem do state “CelAWykonany”.
Może wydaje się to trudne i skąplikowane, ale w żeczywistaści jest równie proste jak “kżywa myślenia” mojego młodsego
Brata ( czyli baaaaaaaaaaardzo prose ).
{6} misja zakończa się automatycznie
Teraz trochę upiększymy naszą misję, przez dodanie paru efektów
Oto co należy dodać do mapy:
- znacznik 1, nad bazą UCS, zdala ( ale nie za bardzo ) od Grizzly’ego
- jakąś jednostkę specjalną ( dla graczaUCS, np. Grizzly’ego ) gdzieś za bazą
- ustaw na grizllym znacznik 3
mission "MicroStorm v1.4"
{
player playerUCS;
player playerED;
int zmienna1;
unitex u_grizzly; {0}
state Initialize;
state ShowBriefing;
state Working;
state CelAWykonany;
state Nothing;
state Initialize
{
u_grizzly = GetUnit(GetPointX(3), GetPointY(3), 0); {1}
u_grizzly.SetUnitName(” T U W P I S Z np. S W O J E I M I Ę”); {2}
zmienna1=1;
RegisterGoal(a," Zniszcz wszystkie jednostki i budynki wroga");
EnableGoal(a,true);
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
playerED.SetMoney(10000);
Rain(GetPointX(0), GetPointY(0),200,1200,1800,2400,10);
playerUCS.LookAt(GetPointX(1), GetPointY(1), 6, 0, 20, 0);
playerUCS.DelayedLookAt(GetPointX(1),GetPointY(1),6,1,20,0,100,0); {3}
u_grizzly.CommandMove(GetPointX(2), GetPointY(2), 0); {4}
return ShowBriefing, 100;
}
state ShowBriefing
{
AddBriefing("Powitanie !");
return Working,100;
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() )
{
SetGoalState(a,goalFailed);
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() && zmienna1==1 )
{
return CelAWykonany;
}
If(!playerUCS.GetMoney()>50000);
{
SetGoalState(b,goalAchieved);
playerUCS.SetMoney(playerUCS.GetMoney()-5000);
}
if(GetGoalState(a)==goalAchieved && GetGoalState(b)==goalAchieved)
{
AddBriefing("Wygrałeś i wykonałeś wszystkie cele misji,Dzięki za 5000 CR");
EndMission(true);
return Nothing;
}
return Working, 100;
}
state CelAWykonany
{
zmienna1=0;
SetGoalState(a,goalAchieved);
RegisterGoal(b,” Wydobądź 50000 CR ”);
EnableGoal(b,true);
PlayerUCS.SetMoney(10000);
AddBriefing(”==== J A K I Ś K O M U N I K A T=======”);
return Working;
}
state Nothing
{
return Nothing,1200;
}
}
{0} tak określona jednostka jest traktownan przez grę “oddzielni” a nie jako jedna z wielu
{1} określamy którą jednostkę gra ma uznać za “u_grizzly”, określamy jej położenie
{2} zmieniamy naszemy “u_grizzly” imię
{3} ustawia kamerę w punkcie 3, a nie jak do tej pory na środku mapy, dodatkowo robi pare obrotów
{4} każe naszemu „u_grizzly” kopnąć się do punktu 3
Teraz dodamy wynalazki ( pełną ich listę znajdziesz w dokumentacji EatrhC, Object identifiers ), ja wypiszę tylko te które będą nas interesować.
Najpierw trochę teorii:
Jeśli chcemy zablokować wynalazek to robimy tak
Nazwa_Gracza.EnableResearch(”Kod_Wynalazku”, false);
Jeśli chcemy odblokować wcześniej zablokowany wynalazek:
Nazwa_Gracz.EnableResearch(”Kod_Wynalazku”, true);
Jeśli chcemy dać wynalazek „za darmoche” wygląda to tak:
Nazwa_Gracza.AddResearh(”Kod_Wynalazku”);
Jeśli chcemy zablokować możliwość budowy budynku, postępujemy podobnie jak z wynalazkami :
Nazwa_Gracza.EnableBuilding(”Kod_Budynku”, false);
Odblokowujemy podobnie:
Nazwa_Gracza.EnableBuilding(”Kod_Budynku”, true);
Teraz ulepszymy nasz skrypt o wynalazki i budynki.
mission "MicroStorm v1.5"
{
player playerUCS;
player playerED;
int zmienna1;
unitex u_grizzly;
state Initialize;
state ShowBriefing;
state Working;
state CelAWykonany;
state Nothing;
state Initialize
{
u_grizzly = GetUnit(GetPointX(3), GetPointY(3), 0);
u_grizzly.SetUnitName(” T U W P I S Z np. S W O J E I M I Ę”);
zmienna1=1;
RegisterGoal(a," Zniszcz wszystkie jednostki i budynki wroga");
EnableGoal(a,true);
playerUCS = GetPlayer(1);
playerED = GetPlayer(2);
//======================== W Y N L A Z K I ======================================================
playerUCS.EnableResearch(”RES_UCS_UHL1”,false); // Panther 1 {0}
playerUCS.EnableResearch(”RES_UCS_UBL1”,false); // Jaguar 1
playerUCS.EnableResearch(”RES_UCS_UBS1”,false); // Hydra 1
playerUCS.EnableResearch(”RES_UCS_UOH2”,false); // Termit ( nie wiem za bardzo czemu nazwany w dokumentacji
//„Harvester”)
playerUCS.EnableResearch(”RES_UCS_GARG1”,false); // Gargoygle 1
playerUCS.EnableResearch(”RES_UCS_WHG1”,false); // ciężki granatnik
playerUCS.EnableResearch(”RES_UCS_WMR1”,false); // ciężkie rakiety ( wyrzutnia )
playerUCS.EnableResearch(”RES_UCS_WHP1”,false); // ciężka plazma {1}
//======================================B U D Y K I ===========================================
playerUCS.EnableBuilding(”UCSBFA”, false); // fabryka pojazdów bojowych
//============================================================================================
playerED.SetMoney(10000);
Rain(GetPointX(0), GetPointY(0),200,1200,1800,2400,10);
playerUCS.LookAt(GetPointX(1), GetPointY(1), 6, 0, 20, 0);
playerUCS.DelayedLookAt(GetPointX(1),GetPointY(1),6,1,20,0,100,0);
u_grizzly.CommandMove(GetPointX(2), GetPointY(2), 0);
return ShowBriefing, 100;
}
state ShowBriefing
{
AddBriefing("Powitanie !");
return Working,100;
}
state Working
{
if( !playerUCS.GetNumberOfUnits() && !playerUCS.GetNumberOfBuildings() )
{
SetGoalState(a,goalFailed);
AddBriefing("Przegrałeś");
EndMission(false);
}
if( !playerED.GetNumberOfUnits() && !playerED.GetNumberOfBuildings() && zmienna1==1 )
{
return CelAWykonany;
}
If(!playerUCS.GetMoney()>50000);
{
SetGoalState(b,goalAchieved);
playerUCS.SetMoney(playerUCS.GetMoney()-5000);
}
if(GetGoalState(a)==goalAchieved && GetGoalState(b)==goalAchieved)
{
AddBriefing("Wygrałeś i wykonałeś wszystkie cele misji,Dzięki za 5000 CR");
EndMission(true);
return Nothing;
}
return Working, 100;
}
state CelAWykonany
{
zmienna1=0;
playerUCS.AddResearch(”RES_UCS_UBL1”,);
playerUCS.AddResearch(”RES_UCS_WHP1”); // niech ma za darmo Jaguara i c. Plazmę i się cieszy
playerUCS.EnableBuilding(”UCSBFA”, true); // teraz mu oddamy tą fabrykę ( jak miło być hojnym, co? )
SetGoalState(a,goalAchieved);
RegisterGoal(b,” Wydobądź 50000 CR ”);
EnableGoal(b,true);
PlayerUCS.SetMoney(10000);
AddBriefing(”==== J A K I Ś K O M U N I K A T=======”);
return Working;
}
state Nothing
{
return Nothing,1200;
}
}
{0} jeśli linijka zaczyna się od „//” to gra ją ignoruje, czyli możesz tam pisać co ci się tylko podoba, np. co to za wynalazek (żeby się nie pogubić :).).
{1} wynalazki oczywiście należało by określić także dla ED, ale mi się już tego robić nie chciało, chyba sam sobie poradzisz...
Jeszcze mała rzecz odnośnie wynalazków w kampanii.
Są one ok. 2 razy droższe i dłużej się wynajdują niż w potyczce i Mplayu; wystarczy, że jakiś wynalazek zablokujesz w 1misji lub w bazie to będzie on zablokowany do końca kampanii ( chyba, że go
wcześniej odblokujesz ), to samo się tyczy budynków.
Mały problem jest też z dawaniem „za darmo” wynalazków, niektórych ( np. Działa 105mm i 120mm UCS ) nie ma na drzewie wynalazków, ale w konstruktorze są i wszystko jest w porządku. No prawie bo
brak ich na drzewie wynalazków potrafi być naprawdę zwodniczy, najlepiej to widać w kampanii ED w Lost Souls’ie. Więc lepiej ostrożnie dawaj „darmowe wynalazki”.
Zadanie Domowe:
Ulepsz jeszcze trochę tę misję i spróbuj ją skompilować, ( i odpalić, ofkoz ), miłej zabawy i wielkiej cierpliwości ( będzie potrzebna ).
Na następnej lekcji zajmiemy się ciekawszymi rzeczami, czyli spróbujemy zrobić prosty fil... ja nic nie powiedziałem :).