Tato referenční příručka popisuje obsah unity OrgInterface,
zejména metod rozhraní IVLFOrganism. Není určena ke čtení od
začátku ke konci, ani k výuce, jak psát organismy, ale k rychlému zjištění
přesného významu jednotlivých objektů deklarovaných v unitě
OrgInterface. Z toho také plyne její strohost a technický
jazyk.
const MaxURCount = 256;
Maximální počet uživatelských registrů, který můžete naalokovat funkcí
AllocUR.
AllocedURCount,AllocUR,ForeignAllocedURCount,ForeignUR,SetForeignUR,SetUR,UR
type TMoveDirection = (N, W, S, E);
Datový typ udávající směr pohybu (
N= nahoru,W= vlevo,S= dolů,E= vpravo).
type
TOptions = record
FuzzyAttack: Boolean;
EnergyPerStep: Integer;
DistributeEnergy: Boolean;
ChemGoAway: Boolean;
end;
Datový typ používaný funkcí
GetOptionsk získání informací o nastavení simulace. Význam jednotlivých položek je následující:
FuzzyAttack- Pokud je
True, pak vítězem souboje dvou organismů (vyvolaném pomocíAttack) je ten z nich, jehož součet hmotnosti a energie je vyšší. Pokud jeFalse, o vítězi se rozhoduje pomocí složitějšího algoritmu, který je popsán u funkceAttack.EnergyPerStep- Množství energie, které organismus ztratí při každém kroku simulace ("daň za život").
DistributeEnergy- Energie vymrhaná na pohyb, útoky apod. se vrací ve formě potravy zpět do prostředí, tj. platí zákon zachování energie.
ChemGoAway- Pokud je
True, chemikálie vyloučené organismy (pomocíExclude) postupně "vyprchávají", tj. hodnoty na políčcích jsou postupně nastavovány na 0. Přesný popis algoritmu vyprchávání není definován. Pokud jeFalse, pak jakákoliv chemikálie vyloučená organismem zůstane na příslušném políčku neomezeně dlouho (pokud nebude přepsána jinou chemikálií).
function Age: Integer; stdcall;
Věk organismu, neboli počet kroků simulace od vzniku organismu.
function AllocedURCount: Integer; stdcall;
Počet právě alokovaných uživatelských registrů.
AllocUR,ForeignAllocedURCount,ForeignUR,MaxURCount,SetForeignUR,SetUR,UR
function AllocUR(Count: Integer): Integer; stdcall;
Alokuje
Countuživatelských registrů. Jejich indexy jsou v pak rozsahu0..Count - 1. Pokud jeCount< 0 neboCount>MaxURCount, pak funkce nic nealokuje a ukončí se.Při alokování platí tato pravidla:
- Pokud bylo před voláním funkce alokováno méně registrů než
Count, jejich obsah bude zachován a nově přidané registry budou mít hodnotu 0.- Pokud bylo před voláním funkce alokováno více registrů než
Count, bude zachován obsah prvníchCountregistrů.- Pokud bylo před voláním funkce alokováno stejně registrů jako
Count, nic se voláním funkce nezmění.Pokud byl organismus vytvořen manuálním přidáním do prostředí, nemá zpočátku alokované žádné uživatelské registry. Pokud byl vytvořen buněčným dělením (funkcí
DivCell), má zpočátku alokován stejný počet registrů jako rodič a jejich hodnoty jsou nastaveny na 0.Funkce vrátí počet alokovaných registrů.
AllocedURCount,DivCell,ForeignAllocedURCount,ForeignUR,MaxURCount,SetForeignUR,SetUR,UR
function Attack: Boolean; stdcall;
Pokud se na políčku, kde se nachází organismus, nachází i jiný organismus, pak na něj organismus zaútočí. O vítězi útoku se rozhoduje v závislosti na nastavení takto:
- Pokud je zvolena volba Při útoku silnější organismu vždy zvítězí, pak je vítězem ten organismu, jehož součet hmotnosti a energie je vyšší. Pokud je tento součet stejný, zvítězí libovolný organismus z nich ("libovolností" se myslí, že postup určení vítěze není zveřejněn v API a organismus na něj nesmí spoléhat).
- Pokud je zvolena volba Při útoku silnější organismus má větší pravděpodobnost vítězství, pak je postup následující:
- Sečte se hmotnost a energie prvního organismu (= S1).
- Sečte se hmotnost a energie druhého organismu (= S2).
- Sečtou se čísla S1 a S2 (= S).
- Vypočte se pravděpodobnost vítězství prvního organismu P1 = S1 / S.
- Vypočte se pravděpodobnost vítězství druhého organismu P2 = S2 / S.
- Vítězem se stane náhodně jeden z organismů s ohledem na příslušné pravděpodobnosti vítězství.
Od hmotnosti vítězného organismu se po souboji odečte hmotnost poraženého organismu a od energie vítězného organismu se odečte energie poraženého organismu. Pokud je v nastavení zvolena volba Spotřebovanou energii opět distribuovat do prostředí, pak se odečtené množství hmotnosti a energie vrátí do prostředí ve formě potravy (viz Algoritmus vracení potravy do prostředí). Ohlídá se, aby hodnoty nešly do záporných čísel. Poražený organismus umírá (stane se totéž jako po zavolání jeho metody
Die).Pokud se mezi voláními organismus nepohne nebo nerozmnoží, je zaručeno, že funkce
Attack,ForeignAllocedURCount,ForeignUR,OrgAtaSetForeignURse budou týkat téhož organismu..
Pokud se útok povedl (organismus vyhrál), funkce vrátí
True. Pokud se útok nepovedl (organismus zahynul), funkce nevrátí kontrolu zpět do kontrolní procedury (příkazy následující poAttackse tedy neprovedou). Pokud se pod organismem žádný jiný organismus nenacházel, funkce vrátíFalse.
Attack,ForeignAllocedURCount,ForeignUR,OrgAt,SetForeignUR,GetOptions
function Build(Value: Byte): Byte; stdcall;
Stráví
Valuepotravy ze své trávicí vakuoly a přemění ji na hmotu, čímž oValuezvýší svoji hmotnost. Množství strávené potravy se sníží v případě, že jí není ve vakuole dostatek nebo když by hmotnost organismu přesáhla maximální mez (255 jednotek).Funkce vrátí skutečné množství strávené potravy.
function Color: TColor; stdcall;
Barva organismu kódovaná v RGB schématu.
procedure Die; stdcall;
Organismus zemře. Pokud je v nastavení zvolena volba Spotřebovanou energii opět distribuovat do prostředí, pak se do prostředí vrátí množství potravy odpovídající součtu hmotnosti, energie a obsahu trávicí vakuoly umírajícího organismu (viz Algoritmus vracení potravy do prostředí).
Po spuštění příkazu
Diese už proceduře nevrátí kontrola nad během programu. Příkazy, co následují za ním, se tedy neprovedou.Organismus též zemře, pokud po skončení běhu kontrolní procedury je splněna alespoň jedna z následujících podmínek:
- Věk organismu je větší nebo roven maximálnímu věku organismu (
Age>=MaxAge).- Organismus nemá energii (
Energy= 0).- Organismus má nulovou tělesnou hmotnost (
Mass= 0).
function Digest(Value: Byte): Byte; stdcall;
Stráví
Valuepotravy ze své trávicí vakuoly a přemění ji na energii. Množství strávené potravy se sníží v případě, že jí není ve vakuole dostatek nebo když by energie organismu přesáhla maximální mez (255 jednotek).Funkce vrátí skutečné množství strávené potravy.
procedure DivCell; stdcall;
Rozdělí buňku na dvě. Buněčné dělení je jediná možná forma rozmnožování organismů v The life!. Potomek se objeví na stejném políčku jako rodič a bude mít stejnou barvu. Oba organismy mají poloviční hmotnost původního organismu (
Mass), poloviční množství potravy v trávicí vakuole (FoodIn) a poloviční energii (Energy). Generace potomka (GenCount) bude o jednotku vyšší než generace rodiče. Potomek bude mít alokován stejný počet uživatelských registrů jako rodič a všechny tyto uživatelské registry budou mít hodnotu 0.Program po rozmnožení zaručuje toto:
OrgAt(0, 0)=SpeciesSetForeignURvolaná z kontrolní procedury rodiče bude nastavovat uživatelské registry právě zplozenému potomkoviTyto záruky končí ve chvíli zplození nového potomka (v tom případě se přesouvají na něj) nebo ukončením aktuálního kroku simulace. Záruky také nejsou symetrické, tj. neplatí pro volání funkcí z potomka. Není též zaručeno, zda bude kontrolní procedura potomka volána ještě v témže kroku simulace nebo až v kroku následujícím.
AllocedURCount,AllocUR,Energy,FoodIn,GenCount,Mass,OrgAt,SetForeignUR,UR
function Eat(Value: Byte): Byte; stdcall;
Sní
Valuepotravy z políčka, na kterém se organismus právě nachází. Množství snědené potravy sníží, je-li jí v políčku pod organismem nedostatek nebo pro ni naopak organismus nemá prostor ve své trávicí vakuole (která pobere maximálně 255 jednotek potravy).Funkce vrátí skutečné množství snědené potravy.
function Energy: Byte; stdcall;
Množství energie organismu. Energii je možno využít k pohybu nebo k vylučování chemikálií. Pokud organismus po ukončení běhu kontrolní procedury bude mít
Energy= 0, zahyne.
function Exclude(Radius: Integer; Value: Byte): Integer; stdcall;
Vyloučí v kruhu s poloměrem
RadiuschemikáliiValue. Na vyloučení se spotřebuje tolik energie, kolik políček je obsah kruhu. Pokud má organismus málo energie, poloměr se sníží na tak malou hodnotu, aby již energie organismu na vyloučení chemikálie stačila.Pokud je v nastavení zvolena volba Spotřebovanou energii opět distribuovat do prostředí, pak se energie spotřebovaná na vyloučení chemikálií vrátí do prostředí ve formě potravy (viz Algoritmus vracení potravy do prostředí).
Funkce vrátí skutečný poloměr kruhu, kde byla chemikálie vyloučena.
function FoodAt(AX, AY: Integer): Byte; stdcall;
Vrací množství potravy na políčku se souřadnicemi
AX,AY. Tyto souřadnice jsou chápány relativně vůči organismu. Pokud je např. organismus na souřadnicích [150, 80] a organismus zavolá funkciFoodAts parametryAX= -1 aAY= 1, je vrácena hodnota potravy na políčku se souřadnicemi [149,81]. Obě souřadnice musí mít hodnotu -1, 0 nebo 1. Pokud mají jinou hodnotu, funkce vrací 0. Pokud leží zjišťované políčko mimo okraje prostředí, funkce vrací 0. Organismus může díky této funkci získat přehled o potravě na políčku pod sebou a osmi políčcích kolem sebe.V dalších verzích se může dosah funkce
FoodAtzvětšit nebo může být volitelný uživatelem.
function FoodIn: Byte; stdcall;
Množství potravy v trávicí vakuole organismu. Tato potrava se dá dále vyžít k proměně na energii nebo tělesnou hmotnost.
function ForeignAllocedURCount: Integer; stdcall;
Vrátí počet právě alokovaných uživatelských registrů jiného organismu, který se nachází pod organismem (tzn. má stejné souřadnice). Pokud pod organismem žádný jiný organismus neleží, nedělá nic. Pokud se jich tam naopak nachází víc, vrátí počet registrů toho nejstaršího z nich (tzn. s největším
Age).Pokud se mezi voláními organismus nepohne nebo nerozmnoží, je zaručeno, že funkce
Attack,ForeignAllocedURCount,ForeignUR,OrgAtaSetForeignURse budou týkat téhož organismu.Po rozmnožení organismu je zaručeno, že se bude načítat počet registrů potomka.
Pokud byl počet uživatelských registrů v pořádku přečten, funkce ho vrátí. Pokud se pod organismem žádný jiný organismus nenacházel, funkce vrátí hodnotu -1.
AllocedURCount,AllocUR,ForeignUR,MaxURCount,SetForeignUR,SetUR,UR
function ForeignUR(Index: Byte): Integer; stdcall;
Umožňuje přístup k poli
UR("uživatelské registry") jiného organismu, který se nachází pod organismem (tzn. má stejné souřadnice). Simulační program samotný toto pole nechává nedotčené. Pokud pod organismem žádný jiný organismus neleží, nedělá nic. Pokud se jich tam naopak nachází víc, přistupuje kURtoho nejstaršího z nich (tzn. s největšímAge).Pokud se mezi voláními organismus nepohne nebo nerozmnoží, je zaručeno, že funkce
Attack,ForeignAllocedURCount,ForeignUR,OrgAtaSetForeignURse budou týkat téhož organismu.Po rozmnožení organismu je zaručeno, že se budou načítat registry potomka.
Pokud byl uživatelský registr v pořádku přečten, funkce vrátí jeho hodnotu. Pokud se pod organismem žádný jiný organismus nenacházel nebo
Indexneoznačoval alokovaný uživatelský registr, funkce vrátí hodnotuInvalidUR.
AllocedURCount,AllocUR,ForeignAllocedURCount,MaxURCount,SetForeignUR,SetUR,UR
function GenCount: Integer; stdcall;
Generace organismu. Organismus přidaný do prostředí bude mít
GenCount= 0, jeho potomciGenCount= 1, jejich potomciGenCount= 2 atd.
procedura GetOptions(var Options: TOptions); stdcall;
Procedura načte do struktury
Optionsnastavení simulace The Life!. Přesný význam jednotlivých položek struktury najdete u jejího popisu.
function ChemAt(AX, AY: Integer): Byte; stdcall;
Vrací druh chemikálie na políčku se souřadnicemi
AX,AY. Tyto souřadnice jsou chápány relativně vůči organismu. Pokud je např. organismus na souřadnicích [150, 80] a organismus zavolá funkciChemAts parametryAX= -1 aAY= 1, je vrácen druh chemikálie na políčku se souřadnicemi [149,81]. Obě souřadnice musí mít hodnotu -1, 0 nebo 1. Pokud mají jinou hodnotu, funkce vrací 0. Pokud leží zjišťované políčko mimo okraje prostředí, funkce vrací 0. Organismus může díky této funkci získat přehled o chemikáliích na políčku pod sebou a osmi políčcích kolem sebe.
function Mass: Byte; stdcall;
Hmotnost organismu. Pokud organismus po ukončení běhu kontrolní procedury bude mít
Mass= 0, zahyne.
function MaxAge: Integer; stdcall;
Maximální věk organismu, kterého může nabýt. Po jeho nabytí zahyne. V aktuální verzi je definován
MaxAge=MaxInt, takže smrt organismu kvůli věku je velmi nepravděpodobná. V příštích verzích může ale být hodnota změněna nebo nastavována volitelně uživatelem.
function MaxMoveDist: Integer; stdcall;
Maximální délka, o jakou se může organismus pohnout během jednoho kroku simulace.
function MaxX: Integer; stdcall;
Maximální X-ová souřadnice, na kterou se organismus může dostat, neboli šířka prostředí, ve kterém se pohybuje - 1.
function MaxY: Integer; stdcall;
Maximální Y-ová souřadnice, na kterou se organismus může dostat, neboli výška prostředí, ve kterém se pohybuje - 1.
function MinX: Integer; stdcall;
Minimální X-ová souřadnice, na kterou se organismus může dostat. V současné verzi The Life! bude vrácená hodnota vždy 0.
function MinY: Integer; stdcall;
Minimální Y-ová souřadnice, na kterou se organismus může dostat. V současné verzi The Life! bude vrácená hodnota vždy 0.
function Move(Direction: TMoveDirection; Distance: Integer): Integer; stdcall;
Pohne se ve směru
DirectionoDistancepolíček. Při pohybu se spotřebujeDistance * (Mass div 16 + 1)energie. Vzdálenost se zkrátí v případě, že
- je nedostatek energie,
- pohyb během jednoho kroku simulace by byl delší než stanovený limit (jeho hodnotu lze zjistit pomocí
MaxMoveDist),- organismus by se dostal za okraj prostředí.
Pokud je v nastavení zvolena volba Spotřebovanou energii opět distribuovat do prostředí, pak se energie spotřebovaná na pohyb vrátí do prostředí ve formě potravy (viz Alogritmus vracení potravy do prostředí).
Funkce vrátí skutečnou vzdálenost, o kterou se organismus pohnul.
GetOptions,MaxMoveDist,MaxX,MaxY,MinX,MinY,Move,TMoveDirection,X,Y
function OrgAt(AX, AY: Integer): PChar; stdcall;
Vrací druh organismu na políčku se souřadnicemi
AX,AY. Tyto souřadnice jsou chápány relativně vůči organismu. Pokud je např. organismus na souřadnicích [150, 80] a organismus zavolá funkciOrgAts parametryAX= -1 aAY= 1, je vrácen druh organismu na políčku se souřadnicemi [149,81]. Obě souřadnice musí mít hodnotu -1, 0 nebo 1. Pokud mají jinou hodnotu, funkce vrací prázdný řetězec. Pokud leží zjišťované políčko mimo okraje prostředí, funkce vrací prázdný řetězec. Pokud se na daných souřadnicích nenachází žádný organismus, funkce vrací prázdný řetězec. Pokud se naopak na daných souřadnicích nachází více organismů, je vrácen druh toho nejstaršího z nich (tzn. s největšímAge). Organismus může díky této funkci získat přehled o organismech na políčku pod sebou osmi políčcích kolem sebe.Vrácený řetězec není třeba odalokovávat a je garantováno, že bude platný až do konce běhu kontrolní procedury.
Pokud se mezi voláními organismus nepohne nebo nerozmnoží, je zaručeno, že funkce
Attack,ForeignAllocedURCount,ForeignUR,OrgAtaSetForeignURse budou týkat téhož organismu.Po rozmnožení organismu je zaručeno, že
OrgAt(0, 0)=Species.V dalších verzích se může dosah funkce
OrgAtzvětšit nebo může být volitelný uživatelem.
Attack,FoodAt,ForeignAllocedURCount,ForeignUR,SetForeignUR,Species
function Secrete(Value: Byte): Byte; stdcall;
Vyloučí
Valuepotravy ze své trávicí vakuoly ven z organismu. Množství přeměněné potravy se sníží v případě, že jí má organismus ve vakuole málo nebo by celkové množství potravy na políčku, kde se organismus nachází, přesáhlo maximální mez (255 jednotek).Funkce vrátí skutečné množství vyloučené potravy.
procedure SetColor(R, G, B: Byte); stdcall;
Nastaví barvu organismu. Výsledná barva vznikne smísením červené (
R), zelené (G) a modré (B).
function SetForeignUR(index: Byte; Value: Integer): Boolean; stdcall;
Nastaví uživatelský registr s indexem
Indexjiného organismu, který se nachází pod organismem (tzn. má stejné souřadnice), na hodnotuValue. Pokud pod organismem žádný jiný organismus neleží, nenastavuje nic. Pokud se jich tam naopak nachází víc, nastavíURtomu nejstaršímu z nich (tzn. s největšímAge).Pokus se mezi voláními organismus nepohne nebo nerozmnoží, je zaručeno, že funkce
OrgAt,SetForeignURaAttackse budou týkat téhož organismu.Po rozmnožení organismu je zaručeno, že se budou nastavovat registry potomka.
Pokud byl uživatelský registr v pořádku nastaven, funkce vrátí
True. Pokud se pod organismem žádný jiný organismus nenacházel neboIndexneoznačoval alokovaný uživatelský registr, funkce vrátíFalse.
AllocedURCount,AllocUR,Attack,ForeignAllocedURCount,ForeignUR,MaxURCount,OrgAt,SetUR,UR
procedure SetUR(Index: Byte; Value: Integer); stdcall;
Nastaví uživatelský registr s indexem
Indexna hodnotuValue.Pokud byl uživatelský registr v pořádku nastaven, funkce vrátí
True. PokudIndexneoznačoval alokovaný uživatelský registr, funkce vrátíFalse.
AllocedURCount,AllocUR,ForeignAllocedURCount,ForeignUR,MaxURCount,SetForeignUR,UR
function Species: PChar; stdcall;
Druh organismu, tedy i název jeho knihovny DLL (bez přípony). Nerozlišují se malá a velká písmena.
Vrácený řetězec není třeba odalokovávat a je garantováno, že bude platný až do konce běhu kontrolní procedury.
function Spread(Value: Byte): Byte; stdcall;
Přemění
Valuesvé tělesné hmoty na potravu v trávicí vakuole. Množství přeměněné hmotnosti se sníží v případě, že organismus má příliš malou hmotnost nebo by potrava ve vakuole přesáhla maximální mez (255 jednotek).Funkce vrátí skutečné množství přeměněné tělesné hmoty.
function UR(Index: Byte): Integer; stdcall;
Umožňuje přístup k poli
UR("uživatelské registry"), které může každý organismus využít podle své potřeby k uchovávání údajů mezi jednotlivými kroky simulace. Simulační program samotný toto pole nechává nedotčené.
Před použitím je nutno potřebné registry alokovat funci
AllocUR.Pokud byl organismus vytvořen manuálním přidáním do prostředí, nemá zpočátku alokované žádné uživatelské registry. Pokud byl vytvořen buněčným dělením (funkcí
DivCell), má zpočátku alokován stejný počet registrů jako rodič a jejich hodnoty jsou nastaveny na 0.Pokud
Indexneoznačoval alokovaný uživatelský registr, funkce vrátí hodnotuInvalidURIndex, jinak vrátí hodnotu uloženou v příslušném registru.
AllocedURCount,AllocUR,DivCell,ForeignAllocedURCount,ForeignUR,MaxURCount,SetForeignUR,SetUR
function X: Integer; stdcall;
X-ová souřadnice organismu. Nabývá hodnot
0..MaxX.
function Y: Integer; stdcall;
Y-ová souřadnice organismu. Nabývá hodnot
0..MaxY.
Tento algoritmus je uplatňován, pokud je v nastavení zvolena volba Spotřebovanou energii opět distribuovat do prostředí, a organismus provede činnost vedoucí ke ztrátě energie, hmotnosti či obsahu trávicí vakuoly (pohyb, útok, vyloučení chemikálií či smrt).
Pokud se distribuuje energie organismu, děje se tak pomocí tohoto algoritmu:
Pokud se distribuuje obsah trávicí vakuoly nebo hmotnost organismu, děje se tak pomocí tohoto algoritmu: