Stavební systém ve Valheim disponuje mechanikou, která zajišťuje realističtější chování stavebních konstrukcí z pohledu jejich statiky. Tato mechanika se nazývá stabilita. Stabilita stavebního dílu je primárně dána jeho materiálem, pozicí, orientací a ostatními díly na které je připojen. V případě, že hráč umístí stavební díl který nebude mít dostatečnou stabilitu, zhroutí se.
Technicky popisuje stabilitu každého stavebního dílu proměnná nazvaná "support" (podpora). Tato proměnná se vždy vypočítá pro ověření jestli je stavební díl dostatečně stabilní. Vyšší hodnota podpory znamená lepší stabilitu a nižší pravděpodobnost zhroucení.
Materiály[]
Každá budova může být postavena z několika materiálů.
| Name (Jméno) |
Prefixes (Prefix) |
MaxSupport (Max. podpora) |
MinSupport (Min. podpora) |
VerticalLoss (Vertik. ztráta) |
HorizontalLoss (Horizont. ztráta) |
|---|---|---|---|---|---|
| Wood (Dřevo) |
Wood, Thatch (Dřevo, Došky) |
100 | 10 | 0.125 | 0.2 |
| Stone (Kámen) |
Stone (Kámen) |
1000 | 100 | 0.125 | 1 |
| Iron (Železo) |
Wood Iron (Železné dřevo) |
1500 | 20 | 0.07692308 | 0.07692308 |
| Hardwood (Tvrdé dřevo) |
Log (Klády) |
140 | 10 | 0.1 | 0.16666667 |
Vlastnosti materiálu ovlivňují jeho stabilitu.
MaxSupport (Max. podpora) - Maximální hodnota podpory, kterou stavební díl může mít. Jedná se o hodnotu, kterou díl bude mít pakliže bude ukotven přímo k zemi (nebo na přírodních prvcích jako jsou kameny nebo stromy). Stavební díl je touto hodnotou omezen i v případě, že je umístěn na díl s mnohem vyšší max. podporou (např. dřevo umístěné na kámen).
MinSupport (Min. podpora) - Minimální hodnota podpory, kterou stavební díl může mít. Pokud je hodnota aktuální podpory stavebního dílu nižší nebo rovna této hodnotě díl se zhroutí.
HorizontalLoss/VerticalLoss (Horizontální/Vertikální ztráta) - jedná se o faktor, který určuje o kolik je snížena podpora stavebního dílu, který je umístěn na jiném stavebním dílu a nikoliv přímo na zemi.
Podpora[]
Stavební díl je "v kontaktu" s jiným stavebním dílem, objektem či povrchem dotýkaly se ho jakoukoli částí svého povrchu a to včetně hran a rohů. Stavební díl v přímém kontaktu se zemí(skálou či stromem) bude mít hodnotu podpory rovnou hodnotě max. podpory daného materiálu. Stavební díl bez kontaktu s jiným objektem bude mít hodnotu podpory nulovou a zhroutí se. Pakliže je stavební díl v kontaktu pouze s jiným stavebním dílem (nazývá se "rodič") bude jeho hodnota podpory vypočítána komplexní sérii rovnic závisejících na těchto faktorech:
- Jeho materiálu
- Hodnotě podpory každého rodičovského dílu
- Jeho vzdáleností od jednotlivých rodičovských dílů (vzdálenost se běžně počítá od středu nebo těžiště)
- Jeho pozici vůči rodičovským dílům
Pozn. - Označení rodič a potomek se běžné používá v programování pro vztah mezi dvěma objekty. Jedná se o takzvanou Dědičnost.
Jeden rodič[]
Předtím než je možné vypočítat hodnotu podpory stavebního dílu podporovaného jedním rodičem, musejí být vypočítány jiné dvě hodnoty a to vzdálenost a úhlová ztráta. Obě hodnoty závisí na relativním umístění středu obou stavebních dílů.
Vzdálenost se vypočítá použitím Pythagorovy věty. Nicméně do většiny výpočtů je navíc vložen "korekční činitel" 0,1m. Vzdálenost lze tedy obecně vypočítat následujícím vzorcem:
Například Tyč z klády 4m má výšku 4m a šířku 0 a Trám z klády 2m má výšku 0 a šířku 2m. Takže vzdálenost mezi Trámem z klády 2m umístěným na Tyč z klády 4m bude 2,336m.
Pozn. - Pakliže je rovnice správná nezáleží na tom kde je díl k rodičovskému dílu připojen.
Úhlová ztráta se vypočítá interpolací mezi HorizontalLoss (Horizont. ztráta) a VerticalLoss (Vertik. ztráta) založenou na úhlu mezi středem připojovaného dílu a "podpůrným bodem" rodičovského dílu. Podpůrný bod rodičovského prvku je obvykle (ale ne vždy) bod, kde se oba díly dotýkají. Úhlová ztráta používá následující vzorec:
Pozn. - Vzdálenost v tomto případě neobsahuje korekční činitel 0,1m.
Jakmile je známá vzdálenost a úhlová ztráta lze vypočítat podporu pomocí následujícího vzorce:
Pro příklad jednoduchý případ Dřevěná tyč 2m stojící na druhé Dřevěné tyči 2m ukotvené k zemi. Vložením hodnot do vzorce dostaneme následující:
Hodnota podpory horního stavebního dílu je tedy 73,75.
Vícero rodičů[]
V případě, že je stavební díl připojen k vícero rodičům, vypočítá se podpora každého rodiče stejně jako v případě jednoho rodiče.
Pokud mezi sebou podpůrné body dvou rodičů svírají větší úhel jak 100° a oba jsou pod středem podporovaného dílu pak rodičovské díly vytvářejí společnou podporu pro podporovaný díl. Jakákoli dvojce rodičů může vzájemně podporovat jiný stavební díl, a to i přes to že jeden z rodičů podporuje již jiný stavební díl. V případě společné podpory, se vypočítá podpora pro každého rodiče použitím pouze VerticalLoss (Vertik. ztráty), bez ohledu na úhel. Výsledná podpora pak bude rovna aritmetickému průměru podpor jednotlivých rodičů. Vzorec pro rodiče A a B pak tedy je:
Jakmile jsou všechny podpory podporovaného stavebního dílu (samostatné i společné) vypočítány je mu přidělena hodnota nejvyšší vypočítané podpory ze všech podpor.
Dynamická stabilita[]
Stavební díly se nezhroutí ihned i přesto, že nemají dostatečnou podporu. Základním důvodem je, že výpočty jednotlivých podpor jsou iterativní a postupně se šíří celou konstrukcí stavby.
Při umístění stavebního dílu je hodnota jeho podpory nastavena na hodnotu Max. podpory jejího materiálu. Poté se každé 0,5 sekundy* vypočítá jeho podpora na základě hodnoty podpory jeho rodičů. To v praxi znamená, že připojení nového stavebního dílu k jinému dílu, aniž by se nový díl čehokoliv dotýkal dočasně zvýší podporu jeho rodičovského dílu, protože podpora nového dílu bude v okamžiku připojení nastavena na Max. podporu podle materiálu. Nicméně jakmile se podpory znovu přepočítají hodnoty všech podpor opět klesnou.
* Nejvýše 50 stavebních dílu se přepočítá každých 0,5 sekund. Takže výpočty v prostoru s mnoha díly, budou chvíli trvat.
Zdroje
Všechny vzorce a hodnoty byly odvozeny přímo ze zdrojového kódu Valheim, zvláště pak z funkcí "WearNTear.GetMaterialProperties" a "WearNTear.UpdateSupport".
Reference[]
Na této stránce byl použit překlad textu z anglické verze Wikipedie. [1]