Úvod do scriptování
Poznámky
Promenné
Nastavení promenných
Príkaz If
Príkaz While
Funkce
Formátování
Jak to dát vse dohromady!
Úvod do
scriptování
Pouzití
scriptu v Morrowind's Construction Set umoznuje tvurcum pluginu vytvorit
celou radu nových vecí ve hre, ale úspesné psaní scriptu muze být dosti
obtízné i pro zkuseného programátora. Scriptování v Morrowindu je omezené a ve
srovnání s jinými hrami neprílis silné, ale i tak umoznuje vytvorit velkou
spoustu skvelých vecí, kterými muzete puvodní hru obohatit.
Zacínáte-li psát script otevrete Gameplay-Edit Scripts v Editoru, vyberte
Script-New a zacnete se samotným psaním. Asi takto:
begin TestScript01
end
TestScript01 bude jméno vaseho nového scriptu a musí být unikátní ( ve hre
nemuzou existovat scripty stejných jmen). K pridelení scriptu nejakému objektu
otevrete u objektu editacní okno a vyberte vás nový script ze seznamu scriptu.
Script muzete pridelit více objektum, ale musíte ho správne napsat.
<nahoru>
Základy
psaní scriptu
Poznámky
Vsechno po (;) v rádku bude ignorováno. Pouzívejte poznámky k popisu toho
co vás script práve delá napr:
; Odstraní mec z hrácova inventáre po 10 dnech
if ( NumDays > 10 )
player->RemoveItem,
"my_new_sword_01", 1
endif
<nahoru>
Promenné
Promenné jsou pouzívány pro interpretaci celé rady informací. Scripty v
Morrowindu znají 3 druhy promenných:
short : Celé císlo od -32768 do 32767
long : Celé císlo od -2,147,483,648 do 2,147,483,647
float : Desetinné císlo 3.4e +/- 38 (7 míst)
Je dobrým zvykem na pocátku scriptu vsechny pouzívané promenné deklarovat tzn:
begin TestScript02
short DaysPassed
long SecondsCalc
float PlayerXPos
; etc...
Takto pouzité promenné jsou chápány jako lokální promenné a nálezí k pridelenému
objektu. Muzete také podobným zpusobem vytvorit globální promenné v Gameplay--Globals
menu v Editoru. Kazdá promenná je defaultne nastavena na 0.
<nahoru>
Nastavení promenných
Pro nastavení hodnot globálních a lokálních promenných pozijte príkaz Set.
short DaysPassed
long SecondsCalc
float PlayerXPos
set DaysPassed to 0
; Pouzije presnou hodnotu
set DaysPassed to ( DayPassed + Day )
; Jednoduché scítání dvou promenných
set SecondsCalc to ( DaysPassed * 86400 )
; Násobené promenné a císla
set PlayerXPos to ( player->GetPos, X )
; Pouzije funkci
set objectID.varName to 100
; Nastaví promennou nálezící objektu.
set "object ID".varName to 100
; Pouzívejte uvozovky pro ID objektu, ve kterém jsou mezery.
Muzete nastavovat promenné jako presné hodnoty, jako dalsí globální/lokální
promenné nebo aby vykonávaly jednoduché aritmetické operace (+, - , *, /).
Muzete také pouzívat promenné nálezející jiným objektum pouzitím jména objektu,
tecky a jména promenné
<nahoru>
Príkaz
If
If je príkaz, který vykoná nejakou akci pouze tehdy, jsou-li splneny definované
podmínky napr:
if ( DaysPassed <= 3 )
MessageBox, "Jeste neubehlo dost casu"
elseif ( DaysPassed <= 10 )
MessageBox, "Urcený cas se blízí"
else
MessageBox, "Cas práve nastal!"
endif
Samozrejme If muze zahrnovat více rádku a muze obsahovat dalsí príkazy If. K
testování podmínek pouzívejte:
·
== : Rovná se
·
!= : Nerovná se
·
< : Méne nez
·
> : Více nez
·
<= : Méne nebo rovno
·
>= : Více nebo rovno
<nahoru>
Príkaz
While
WHILE se ve scriptování pouzívá méne nez If, ale i tak muze být v nekterých
situacích potrebný napr:
short Value
set Value to 0
while ( Value < 10 )
MessageBox, "Odpocítávání %D...", Value
set
Value to ( Value + 1 )
endwhile
<nahoru>
Funkce
Morrowind pouzívá pro zajistení behu hry velké mnozství ruzných funkcí
(seznam
Script Functions </~uesp/morrow/editor/mw_cscommands.shtml> ).
MessageBox, "Vítejte do scriptování..."
; Zobrazí text hráci
if ( player->GetPos, X > 100 )
; Testuje hrácovu pozici
if ( "achel"->GetSpell, "ash woe blight" == 1 ) ;
Testuje, zda-li NPC nemá nemoc
Detailní popis jednotlivých funkcí a jejich pouzití najdete v Helpu v Editoru ve
Functions. K pochopení jejich funkce se podívejte také na jiz existující scripty
ve hre.
Pamatujte ale, ze ne vsechno co je napsáno v Helpu, je správne. Také si musíte
uvedomit, co které funkce pozadují jako vstup.
float XPos
set XPos to -10
AiTravel, -10, 1000, 501, 0 ;
Presné hodnoty jsou bez problému
AiTravel, XPos, 1000, 501, 0 ;
Promenné nejsou akceptovány
SetPos, X, XPos
; Funguje, jelikoz SetPos akceptuje promenné (Tribunal)
U popisu vetsiny funkcí v Helpu najdete, zda akceptují promenné (vetsinou ne).
<nahoru>
Formátování
Puozití správného formátování ve scriptu je dulezité pro jeho fungování. Engine
Morrowindu má casto problémy s vecmi jako mezery a cárky aj.
Pouzívejte tedy ve scritpu tento postup.
if ( SomeValue == 1 )
; 1, pouzívejte mezery pred/za závorkami v príkazech
AiActivate, ObjectID, 0 ; 2,
pouzívejte cárky pri volání funkcí
endif
"urzul gra-agum"->Enable
; 3, pouzívejte uvozovky u ID, které obsahuje mezery
Dávejte mezery pred/za závorkami v príkazech. Pokud to neudeláte, muzete dostat
chybové hlásení. Pouzívejte také mezery u =,>,<,...
v If príkazu.
Vzdy pouzívejte cárky pri volání funkcí (po jménu funkce a po kazdém parametru
krome posledního). Morowind umoznuje volání funkcí bez cárek, ale s nima je to
jistejsí.
Pokud ID nejakého objektu obsahuje mezery, pouzijte u neho uvozovky.
<nahoru>
Jak to
dát vse dohromady!
Predchozí
cást byla jen základem pro vysvetlení tvorby scriptu v Morrowindu, ale jediná
cesta jak se to správne naucit je psaní vlastních scriptu. Následující script je
relativne krátký a jednoduchý. Pokud jej dáte napr. na truhlu, tak ta se otevre
pouze tehdy, má-li hrác v inventári urcitý objekt. Pokud nemá, tak objekt spustí
past v síle, která závisí na hrácove levelu.
begin TrickChestScript
short OpenAttempt
;
Testuje, zda hrác zkousí otevrít truhlu. Pouzijte funkci OpenAttempt,jelikoz
dávat vse do OnActivate If
;
príkazu by bylo obtíznejsí u komplexnejsích scriptu.
if ( OnActivate == 1 )
set
OpenAttempt to 1
end if
; Pokud
se hrác nepokousí otevrít truhlu, script se zastaví.
if ( OpenAttempt == 0 )
return
endif
;
Testuje, zda má hrác ve svém inventári onen tajný klíc. V nasem prípade je to 10
polstáru.
if ( player->GetItemCount, "misc_uni_pillow_01" >= 10 )
Activate
; Otevre normálne truhlu
Set
OpenAttempt to 0
MessageBox, "The chest opens mysteriously..."
; Hrác
nemá 10 polstáru a truhla aktivuje past.
else
PlaySound3D, "Heavy Armor Hit"
; Hraje nejaký zvuk
Set
OpenAttempt to 0
; Sesle na hráce kouzlo v síle závislé na levelu hráce.
if (
player->GetLevel < 10 )
Cast, "poisontrap_10", Player
elseif
( player->GetLevel < 25 )
Cast, "poisontrap_50", Player
elseif
( player->GetLevel < 50 )
Cast, "poisontrap_150", Player
else
Cast, "poisontrap_250", Player
endif
endif
end
<nahoru>
|