Uvod do scriptovani
Poznamky
Promenne
Nastaveni promennych
Prikaz If
Prikaz While
Funkce
Formatovani
Jak to dat vse dohromady!
Uvod do
scriptovani
Pouziti
scriptu v Morrowind's Construction Set umoznuje tvurcum pluginu vytvorit
celou radu novych veci ve hre, ale uspesne psani scriptu muze byt dosti
obtizne i pro zkuseneho programatora. Scriptovani v Morrowindu je omezene a ve
srovnani s jinymi hrami neprilis silne, ale i tak umoznuje vytvorit velkou
spoustu skvelych veci, kterymi muzete puvodni hru obohatit.
Zacinate-li psat script otevrete Gameplay-Edit Scripts v Editoru, vyberte
Script-New a zacnete se samotnym psanim. Asi takto:
begin TestScript01
end
TestScript01 bude jmeno vaseho noveho scriptu a musi byt unikatni ( ve hre
nemuzou existovat scripty stejnych jmen). K prideleni scriptu nejakemu objektu
otevrete u objektu editacni okno a vyberte vas novy script ze seznamu scriptu.
Script muzete pridelit vice objektum, ale musite ho spravne napsat.
<nahoru>
Zaklady
psani scriptu
Poznamky
Vsechno po (;) v radku bude ignorovano. Pouzivejte poznamky k popisu toho
co vas script prave dela napr:
; Odstrani mec z hracova inventare po 10 dnech
if ( NumDays > 10 )
player->RemoveItem,
"my_new_sword_01", 1
endif
<nahoru>
Promenne
Promenne jsou pouzivany pro interpretaci cele rady informaci. Scripty v
Morrowindu znaji 3 druhy promennych:
short : Cele cislo od -32768 do 32767
long : Cele cislo od -2,147,483,648 do 2,147,483,647
float : Desetinne cislo 3.4e +/- 38 (7 mist)
Je dobrym zvykem na pocatku scriptu vsechny pouzivane promenne deklarovat tzn:
begin TestScript02
short DaysPassed
long SecondsCalc
float PlayerXPos
; etc...
Takto pouzite promenne jsou chapany jako lokalni promenne a nalezi k pridelenemu
objektu. Muzete take podobnym zpusobem vytvorit globalni promenne v Gameplay--Globals
menu v Editoru. Kazda promenna je defaultne nastavena na 0.
<nahoru>
Nastaveni promennych
Pro nastaveni hodnot globalnich a lokalnich promennych pozijte prikaz Set.
short DaysPassed
long SecondsCalc
float PlayerXPos
set DaysPassed to 0
; Pouzije presnou hodnotu
set DaysPassed to ( DayPassed + Day )
; Jednoduche scitani dvou promennych
set SecondsCalc to ( DaysPassed * 86400 )
; Nasobene promenne a cisla
set PlayerXPos to ( player->GetPos, X )
; Pouzije funkci
set objectID.varName to 100
; Nastavi promennou nalezici objektu.
set "object ID".varName to 100
; Pouzivejte uvozovky pro ID objektu, ve kterem jsou mezery.
Muzete nastavovat promenne jako presne hodnoty, jako dalsi globalni/lokalni
promenne nebo aby vykonavaly jednoduche aritmeticke operace (+, - , *, /).
Muzete take pouzivat promenne nalezejici jinym objektum pouzitim jmena objektu,
tecky a jmena promenne
<nahoru>
Prikaz
If
If je prikaz, ktery vykona nejakou akci pouze tehdy, jsou-li splneny definovane
podminky napr:
if ( DaysPassed <= 3 )
MessageBox, "Jeste neubehlo dost casu"
elseif ( DaysPassed <= 10 )
MessageBox, "Urceny cas se blizi"
else
MessageBox, "Cas prave nastal!"
endif
Samozrejme If muze zahrnovat vice radku a muze obsahovat dalsi prikazy If. K
testovani podminek pouzivejte:
·
== : Rovna se
·
!= : Nerovna se
·
< : Mene nez
·
> : Vice nez
·
<= : Mene nebo rovno
·
>= : Vice nebo rovno
<nahoru>
Prikaz
While
WHILE se ve scriptovani pouziva mene nez If, ale i tak muze byt v nekterych
situacich potrebny napr:
short Value
set Value to 0
while ( Value < 10 )
MessageBox, "Odpocitavani %D...", Value
set
Value to ( Value + 1 )
endwhile
<nahoru>
Funkce
Morrowind pouziva pro zajisteni behu hry velke mnozstvi ruznych funkci
(seznam
Script Functions </~uesp/morrow/editor/mw_cscommands.shtml> ).
MessageBox, "Vitejte do scriptovani..."
; Zobrazi text hraci
if ( player->GetPos, X > 100 )
; Testuje hracovu pozici
if ( "achel"->GetSpell, "ash woe blight" == 1 ) ;
Testuje, zda-li NPC nema nemoc
Detailni popis jednotlivych funkci a jejich pouziti najdete v Helpu v Editoru ve
Functions. K pochopeni jejich funkce se podivejte take na jiz existujici scripty
ve hre.
Pamatujte ale, ze ne vsechno co je napsano v Helpu, je spravne. Take si musite
uvedomit, co ktere funkce pozaduji jako vstup.
float XPos
set XPos to -10
AiTravel, -10, 1000, 501, 0 ;
Presne hodnoty jsou bez problemu
AiTravel, XPos, 1000, 501, 0 ;
Promenne nejsou akceptovany
SetPos, X, XPos
; Funguje, jelikoz SetPos akceptuje promenne (Tribunal)
U popisu vetsiny funkci v Helpu najdete, zda akceptuji promenne (vetsinou ne).
<nahoru>
Formatovani
Puoziti spravneho formatovani ve scriptu je dulezite pro jeho fungovani. Engine
Morrowindu ma casto problemy s vecmi jako mezery a carky aj.
Pouzivejte tedy ve scritpu tento postup.
if ( SomeValue == 1 )
; 1, pouzivejte mezery pred/za zavorkami v prikazech
AiActivate, ObjectID, 0 ; 2,
pouzivejte carky pri volani funkci
endif
"urzul gra-agum"->Enable
; 3, pouzivejte uvozovky u ID, ktere obsahuje mezery
Davejte mezery pred/za zavorkami v prikazech. Pokud to neudelate, muzete dostat
chybove hlaseni. Pouzivejte take mezery u =,>,<,...
v If prikazu.
Vzdy pouzivejte carky pri volani funkci (po jmenu funkce a po kazdem parametru
krome posledniho). Morowind umoznuje volani funkci bez carek, ale s nima je to
jistejsi.
Pokud ID nejakeho objektu obsahuje mezery, pouzijte u neho uvozovky.
<nahoru>
Jak to
dat vse dohromady!
Predchozi
cast byla jen zakladem pro vysvetleni tvorby scriptu v Morrowindu, ale jedina
cesta jak se to spravne naucit je psani vlastnich scriptu. Nasledujici script je
relativne kratky a jednoduchy. Pokud jej date napr. na truhlu, tak ta se otevre
pouze tehdy, ma-li hrac v inventari urcity objekt. Pokud nema, tak objekt spusti
past v sile, ktera zavisi na hracove levelu.
begin TrickChestScript
short OpenAttempt
;
Testuje, zda hrac zkousi otevrit truhlu. Pouzijte funkci OpenAttempt,jelikoz
davat vse do OnActivate If
;
prikazu by bylo obtiznejsi u komplexnejsich scriptu.
if ( OnActivate == 1 )
set
OpenAttempt to 1
end if
; Pokud
se hrac nepokousi otevrit truhlu, script se zastavi.
if ( OpenAttempt == 0 )
return
endif
;
Testuje, zda ma hrac ve svem inventari onen tajny klic. V nasem pripade je to 10
polstaru.
if ( player->GetItemCount, "misc_uni_pillow_01" >= 10 )
Activate
; Otevre normalne truhlu
Set
OpenAttempt to 0
MessageBox, "The chest opens mysteriously..."
; Hrac
nema 10 polstaru a truhla aktivuje past.
else
PlaySound3D, "Heavy Armor Hit"
; Hraje nejaky zvuk
Set
OpenAttempt to 0
; Sesle na hrace kouzlo v sile zavisle na levelu hrace.
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>
|