27.10.2002

!Da Karpeg
 (3D RPG engine)

	Naším cílem je vytvoření enginu 3D RPG her spolu s nástrojem pro tvorbu her využívajících tento engine. V RPG hrách uživatel obecně ovládá jednu postavu či skupinku postav, pomocí níž interaguje s okolím (bojuje, sbírá předměty, komunikuje s počítačem řízenými postavami). Hlavním znakem těchto her je to, že postavy mají různé vlastnosti (např. síla, inteligence apod.) a dovednosti, které se mohou postupem hry zlepšovat.

Jak budou vypadat hry vytvořené na tomto engine?
•	herní svět bude plně trojrozměrný s tím, že základními buňkami prostoru budou pravidelné šestiboké hranoly, čehož budou využívat  veškerá pravidla RPG hry
•	interakce mezi postavami i předměty ve hře  bude probíhat v reálném čase (tzn. např. realtimeové boje, dialogy)
•	počítačem řízené postavy budou mít možnost reagovat na vnější prostředí ve hře a to pomocí různých vrstev (viz dodatek Layers, vrstva Senses)
•	veškeré hry se budou řídit pravidly popsanými v dodatku Rules
•	engine bude umožňovat jednoduché simulace fyzikálních dějů
•	hra bude ovládána pomocí klávesnice a myši (viz dodatek Controls)

Jaký bude nástroj pro tvorbu jednotlivých RPG her?
	Použijeme kombinaci editoru a skriptovacího jazyka.
	Pro tvorbu herního světa bude potřeba editor. V něm bude mít uživatel možnost modelovat exteriéry a interiéry (s využitím trojúhelníkové topologie), zasazovat předměty, postavy a externí objekty do vymodelované krajiny. Tento editor bude vizuální nástroj pro základní kompozici levelu. Jeho výstupem budou data popisující krajinu a skript popisující základní vztahy mezi objekty a krajinou (např. kde se nachází jaký předmět).
	Součástí enginu bude skriptovací jazyk, pomocí něhož bude možno definovat vztahy mezi objekty a krajinou (výstup editoru), základní vlastnosti objektů (zbraně, postavy), vztahy mezi objekty (např. tlačítko otevírá dveře), komunikaci a umělou inteligenci postav (viz dodatek AI). Tento jazyk bude umět aritmetiku, podmínky a cykly, definici tříd objektů (spolu s metodami) a vytváření a rušení instancí, zavádění a rušení skriptů v paměti. Představu skriptů lze najít v dodatku Script. Skripty se budou překládat do mezikódu, který se poté bude interpretovat.
	Konkrétní grafika bude udržována v x-file souborech. Vyjma exteriérů a interiérů.

Jaký bude hmatatelný výsledek naší práce ?
	Výsledkem naší práce bude Editor herního světa,  Interpret Skriptovacího jazyka, samotný Engine hry a krátká ukázková hra.

	Cílovou platformou budou Win32 + DirectX8.1. Projekt bude implementován ve Visual C++ .

Předpokládaný počet účastníků na projektu: 4-6

Kontakt

Projektový mail 	rpg_projekt@seznam.cz

Jan Bergl                	jan.bergl@seznam.cz
Stanislav Dvořák    	standadvo@seznam.cz
Vít Houska 	houska.vit@seznam.cz
Martin Zákostelský  martin.zakostelsky@seznam.cz

Dodatek Controls

Dialogy na ovládání akcí jsou předprogramovány a objekty s nimiž komunikují budou asociovány ve skriptu (např. podoba a chování invertoráře bude pevný, ale s danou postavou se spojí až ve skriptu).
	Klávesy a tlačítka na myši a akce ne ně reagující lze definovat ve skriptu.

Dodatek Layers

Layers (vrstvy) jsou části engine, které zprostředkovávají interakci objektů s prostředím a ostatními objekty. Tedy každá interakce jakéhokoliv objektu s programem bude implementována pomocí Layers.

Types of Layers:

Graphics	Tato vrstva se stará o zobrazování grafiky na monitor
Sound		Stará se o to, aby byly slyšet zvuky
Simulation	Řízení objektů, volání jejich obslužných rutin
		Správa času
		Simulační kalendář 
HexSpace	Uniformní dělení prostoru do buněk tvaru šestibokého hranolu.
		Využívané pouze pro pravidla herního světa.
Rules		RPG pravidla celého světa
Script		Vrstva, která umí provádět skripty
Physical	Fyzikální děje, značně zjednodušená vrstva
Collision	Vrstva řešící kolize v 3D
Action		Zde jsou uloženy objekty, s kterými lze provádět nějaké akce.
např.: opendoor, use switch, talk, atd.
Input		Stará se o vstupní zařízení
Senses		Podpůrná vrstva pro umělou inteligenci, objekty se do ní připojují pokud
•	provedli nějakou akci, např. poloha potvory se zapisuje do vrstvy presence/creature 
•	pokud potřebují zjistit, zda se nestala nějaká akce, na kterou mají reagovat, tzn. použily nějaký smysl:
o	presence - reprezentuje zrak -- pozice viditelného objektu, dělí se na živé a neživé (items, creature)
o	noise - reprezentuje sluch
o	actions - zde se ukládají akce se složitější sémantikou, např.: A ukradl B věc C apod. 

Dodatek Rules

	Tento dodatek popisuje základní pravidla použitých v engine, na kterých bude dále stavěno. 
Každá postava bude mít základní vlastnosti (Attributes), základní výhody a nevýhody (Advantages & Disadvantages) a dovednosti (Skills). Množina vlastností, dovedností, výhod a nevýhod je v engine pevná a skripty dále nerozšiřitelná.

Attributes
•	Strength(ST)  - síla, určuje, jakou míru zranění hráč dává s různými typy útoků, jakou má nosnost 
•	Dexterity(DX) - obratnost, od ní je odvozena většina Physical Skills (viz. dále)
•	Intelligence(IQ) - inteligence, od ní je odvozena většina Mental Skills (viz. dále) odolnost proti nějakým kouzlům
•	Stamina(HT)  -  od ní jsou odvozeny životy postavy, výdrž postavy, odolnost proti nějakým kouzlům, odolnost proti nemocem, šance, zda omdlí po velkém zásahu , atd...

Advantages & Disadvantages
Každý hráč může mít různé výhody a nevýhody, s nimiž se narodil. Mezi ně patří například schopnost bojovat oběma rukama (ambidexterity), charisma, bohatství (wealth), hluchota (deafness), “jednookost“ (one-eyed), atd. Tyto výhody a nevýhody ovlivňují schopnosti postav v boji, při interakci s okolím, atd.

Skills
	Představují dovednosti jednotlivých postav, které se dají během hry učit a zlepšovat.
Dovednosti se dělí na dvě kategorie:
•	Physical skills – např. broadsword, shield, boxing  
•	Mental skills	 - např. lockpick, merchant, first aid
Physical Skills jsou odvozené od Dexterity a Mental Skills od Inteligence to znamená, že když má hráč např. sníženou inteligenci (třeba kouzlem), tak se mu sníží umění u všech Mental Skills.

Dále má každá postava obranu (Defense) a útok (Attack).

Defense se skládá z aktivní části (parry, block a dodge) a pasivní části (armor, shield) 
a spočítá se jako jejich součet. Můžou být různé hodnoty obrany proti různým typům útoků.

Pod pojmem Attack rozumíme schopnosti útočení se zbraněmi. Existují dvě základní skupiny zbraní – s krátkým dosahem (hand weapons) a střelné zbraně (ranged weapons). Každá zbraň má svůj typ (cutting, impaling, crushing), dosah, míru zranění, cenu, hmotnost, min. požadovanou sílu apod.

Od těchto dvou vlastností se odvíjí průběh boje.

Dodatek AI

	V této sekci je popsáno řešení umělé inteligence na úrovni enginu a skriptu.

Umělá inteligence v enginu:
Tato část je pevně naprogramovaná v kódu, a tudíž ji nelze měnit.
Je zde obsažena pouze základní inteligence jako reakce na povely (pohyb, útok, použití předmětu a dovednosti) a interakce s okolím (zjištění pozice nepřítele, apod.).

Umělá inteligence ve scriptu:
Tato část je programována případným uživatelem.
Definuje se zde chování za určitých situací, jako je způsob reakce na nepřátelský útok, reakce na zpozorování postavy, upřednostňované nepřátelské cíle (nejbližší, nejslabší apod.). Množina situací, na něž může postava reagovat, je předem definovaná a neměnná.

Sdružování umělé inteligence
	Popisuje umělou inteligenci skupin objektů.
Objekty mohou být sdružovány do skupin. Každá tato skupina má svého direktora, pomocí něhož mezi sebou objekty komunikují. Sám direktor může být samozřejmě členem další skupiny a mít tak svého direktora.
Příklad: V armádě jsou jednotliví vojáci zařazeni do pluků podle typu zbraně a 
jednotlivé pluky tvoří dohromady celou armádu.

Dodatek Script
	
	V této části jsou uvedeny dva příklady skriptu. První definuje nové kouzlo, druhý rozšiřuje herní svět o nové město.
	Toto je pouze ukázka jazyka skriptu, ne jeho konkrétní podoba.	
	
Příklad scriptu definující nové kouzlo Fireball:

	// při vytváření instance objektu se vytvoří proměnné a začne se vykonávat metoda Create
	
define object Fireball<UID_FIREBALL> // definice třídy Fireball 
// identifikovatelnou pomocí UID_FIREBALL
	{
		properties		// použité proměnné objektu, můžou být dekl. i 
					// lokálně uvnitř metod
		{
			HANDLE hwnd;
			INTERFACE<IID_RULES_SHOT> ifc;
		}
		
		method Create(Object Caster, Vector Target)
		{
			hwnd = CreateObject(UID_CASTING_EFECT_1,....data......);
						// vytvoření efektu k fireballu

Wait(10);		// metoda vyvolá čekání 10 sec. během kterých    // proběhne život objektu CastingEfect
// po uplynutí  program pokračuje další částí       // kódu hwnd.Release
			hwnd.Release;

			hwnd = CreateObject(UID_SHOT,...data...., MyFireballBlast);
			// vytvoření střely
			// MyFireballBlast  se připojí na OnDestroy třídy Shot	
			// vzniklý objekt se sám stará o svou existenci

hwnd.QuerryIfc(ifc); 		// získání interface IID_RULES_SHOT //objektu s GUID UID_SHOT
			ifc.Fire;			//volání metody interface

			ifc.Release;

hwnd.Release;		//nyní objekt Shot se sám provádí
//činnost nezávisle na tomto objektu
		}
	}

	define object Shot<UID_SHOT>
	{
		......
		......
		properties
{
		event OnDestroy(Shot Sender);	// definice eventu pro objekt Shot
			//tento event si volá objekt Shot pri dopadu
	}
	}

	eventhandler MyFireballBlast(Shot Sender)
	{
		// něco provede
		DoDamage(100,Shot.Pos)	
	}

	Příklad scriptu na zavedení levelu:

//Hlavni script enginu main.scr
.
.
.
procedure OnUploadScript()
{
	UploadScript("Begin.scr");	
}
.
.
.
//soubor begin.scr
properties
{
		external HANDLE	town;
		external const GUID UID_TOWN = 01215125156;	
}

procedure OnUploadScript()
{
	town = CreateObject(UID_TOWN);
}

procedure OnDismissSCript()
{
	town.Realease;				 
}	

define object OTown<UID_TOWN>
{
	method Create
	{
		CreateChildObject(UID_TERRAIN,"terrain.obj");	
		CreateChildObject(UID_STRUCTURE,,...data....);	
		CreateChildObject(UID_NPC,...data...);
		CreateChildObject(UID_STRUCTURE,,...data....);	
		...
		}
}