Pages

Showing posts with label game mechanics. Show all posts
Showing posts with label game mechanics. Show all posts

Wednesday, October 12, 2011

Hit pointi i razine damagea

Jedna ideja za game mechanic koja mi se mota po glavi već duže vrijeme je podjela razine damagea na tri razine, shock, minor i major. Pod "razine damagea" u ovom slučaju mislim na hit pointe koji nedostaju unesrećenom, ne na snagu napada. Ideja je ovakva:
  • Major damage: ono što je trajno uništeno, što se ne može zakrpati. Npr. kad na letjelici nedostaje cijelo krilo. Jedini način popravka ovakve štete je vraćanje u tvornicu.
  • Minor damage: onaj dio štete koji unesrećeni može samostalno popraviti. Npr. ogrebotine i manje rane na čovjeku. Unesrećeni "umire" kada je zbroj minor i major damagea veći ili jednak od maksimumu hit pointa.
  • Shock damage: opterećenje obrane. Nije prava šteta no utječe na sposobnost primanja štete. Kod većih razina šoka napadi imaju rade veću štetu, bilo da se napadi vode kao jednostavno jači napada ili da rade ozbiljniji oblik štete (major umjesto minor i minor umjesto shock). Šok s vremenom nestaje, hlapi.
Nešto slično sam vidio u Mortal Kombatu gdje se dio štete može regenerirati ako igrač neko vrijeme ne prima novu štetu.

Ovaj sustav bi mogao lijepo funkcionirati u akcijskim igrama. Igrač ne mora imati puno veći maksimum hit pointa od protivnika da bi preživio višestruke okršaje a s druge strane smanjuje se potreba za omraženom pasivnom regeneracijom. RPGi bi se mogli dizajnirati tako da su paketi prve pomoći koji liječe minor damage lagani za nabaviti a napitci koji liječe major damage znatno skuplji ili da za oporavak od major damagea treba otići u grad kod iscjelitelja.

Još jedan primjer u kojem bi se ovaj sustav mogao iskoristiti su situacije gdje hrpa napadača sa slabim napadom napada dobro oklopljenu metu (12 Protoss Scouta protiv Ultraliska). Obično u tim slučajevima treba cijela vječnost da se uništi oklopljena meta no s ovim sustavom meta bi s vremenom primala sve veću štetu po napadu. To bi tjeralo napadnutog igrača da se aktivno brani čak i u bunkeru.

Tuesday, August 23, 2011

Armor u strategijama i RPGovima

Nastavak na temu matematike u igrama, što mi znači +2 armora što mi daje paladinova aura?

Slično attack i defence ratingu igrice mogu imati mehanizam damagea i armora/resistencea. Tipičan primjer su strategije kao npr. Warcraft III i Starcraft. Ako se usredotočimo na strategije, dva su pristupa: oduzimanje i dijeljenje vatrene moći napada. RPGovi ili kombiniraju jedan od ova dva pristupa ili jednostavno svrstavaju armor pod defense rating.

Damage minus armor


Starcraft je primjer igre u kojoj se primjenjuje oduzimanje. Napad od 12 damagea protiv jedinice s 3 armora oduzima 12-3=9 hit pointa. Posljedice ovakvog pristupa su da ako damage i armor nisu sumjerljivi da se gubi značaj ili damagea ili armora. Ako je armor veći od damage tada meta ne bi trebala primiti nikakvu štetu. Dizajnerima Starcrafta se to nije svidjelo pa su i igru stavili pravilo da armor ne može smanjiti damage ispod 0.5. U obrnutom slučaju, kada je damage puno veći od armora, utjecaj armora postaje nezamjetan. Utjeće na račun ali čisto simbolički. Npr. ako napač vrši napad od 1100 damagea na meti s 2 armora, taj armor neće bitno utjecati na ishod, niti će nadogradnje koje povećavaju armor mete za 1 bitno joj promijeniti izglede za preživljavanje.

Damage podijeljen s armorom


Ovo izgleda malo neobično ali takvog oblika je formula za damage reduction u Warcraftu III (zapravo, količnik je 1+6*armor). Za razliku od pristupa s oduzimanjem, pristup s dijeljenjem nema problem nesrazmjera, slab armor će malo umanjivati damage, jak armor će jako umanjivati damage. Naime, štos je u tome da postotak reduciranog damage ne ovisi o iznosu damagea. To je po mom mišljenju ujedno i loša strana ovog pristupa jer na taj način armor nije ništa drugo nego +% hit pointa, odnosno isti efekt se postiže povećanjem hit pointa jedinice.

Jedan neobičan pristup


Pišući ovaj tekst, sjetih se jedne igre koja je imala zanimljiv pristup. U strateškoj igri Warlord Battlecry koristi se nešto slično geometrijskom redu. Ako je armor manji ili jednak damageu, za svaki poen armora damage se umanjuje za 0.5. Ak je veći od damaga tada se efekt dodatnog armora prepolavlja. Primjer, recimo da napadač vrši napad s 10 damagea i da meta ima 25 armora. Prvih 10 poena armora reducira damage za 5 (10*0.5), sljedećih 10 za 2.5 (10*0.25) i zadnjih 5 za 0,625 (5*0.125) i napadač vrši ukupno 10 -5 - 2.5 - 0.625 = 1.875 poena štete. Znači za svaki višekratnik armor oduzima dodatan damage ali s dvostruko manjim faktorom. To je približno jednako eksponencijalnom utjecaju, pogotovo za veće vrijednosti armora:


Usporedba


Očigledno je da sam protiv Warcraftovog damage reduction pristupa (jer utjecaj armora ne može ne ovisiti o napadaču). Pristup s oduzimanjem ima mane kada su damage i armor u nesrazmjeru. Kada je damage puno veći od armora, zapravo je i logično da bi armor trebao imati jako mal utjecaj. Činjenice da se moraju izmišljati dodatna pravila kada je armor veći od damagea i da se brojke ponašaju skokovito kad je damage jedva nešto veći od armora razlozi zašto ne odabrati takav pristup.

Pristup kojeg koristi igre Warlords Battlecry je zanimljiv i nakon malo analize, rekao bih da ispunjava očekivanja. Nedavno sam i sam smišljao formule za utjecaj armora. Formula do koje sam došao slična je onoj koja se obično koristi za vjerojatnost pogotka a izgleda ovako:


Usporedbe radi napravih sljedeća dva grafa. Prvi prikazuje funkcije za armor = 10 (pretežno slučajevi kada je damage veći od armora) a drugi za armor = 40 (slučajevi kada je armor veći od damagea).

Kao što se može iz ovog grafa vidjeti, pristup iz Warlords Battlecrya za veće vrijednosti damagea u odnosu na armor prelazi u obično oduzimanje (ali s duplo manjom vrijednosti za armor). Kontinuirana inačica WB pristupa tj. eksponencijalna funkcija se u području kada je armor veći od damagea gotovo poklapa s originalnom WB metodom. Zbog toga i zato što je ta inačica lakša za ukucavanje u Excel (lijenost FTW i zapravo sam koristio OpenOffice ekvivalent za MS Excel), na drugom grafu nije prikazana originalna WB metoda. U području gdje je armor manji od damagea, kontinuirana WB inačica konvergira u obično oduzimanje ali s neobičnom vrijednosti za armor (armor*ln(2)). No ta neobičnost ionako nije važna jer je tada damage ionako ogroman u usporedbi s armorom. Ono što je bitno je činjenica da se na početku ponaša slično kao i originalna WB metoda, da ima približno jednak utjecaj kao obično oduzimanje s armor/2. Moja funkcija također konvergira u obično oduzimanje ali za razliku od WB pristupa, konvergira u pravo oduzimanje kakvo je u Starcraftu i to relativno brzo.

Na koncu, kontinuirana inačica WB pristupa mi se čini kao najelegantniji pristup. Doslovce one liner i jasno razumljiva formula. Plus k tome, bazom potencije se može podešavati strmina funkcije.

Wednesday, June 22, 2011

Attack rating II

Ovaj post se nastavlja na prethodni.

Razmatranje nelinearnih modela htjeli ili ne, zahtjeva malo višu matematiku. Pokušati ću ne komplicirati.

Ima jedna igra u kojoj sam vidio na djelu ne linearnu inačicu modela temeljenog na razlici attacka i defensa. Master of Orion II. Inače, obožavam tu igru no neću koristiti ovu priliku da ju hvalisam. Master of Orion II: battle at Antares koristi tzv. logističku sigmoidalnu funkciju [1] za pretvaranje razlike attacka i defensa u vjerojatnost pogotka. Logistička sigmioda ima mnogo lijepih svojstava [2], linearna je oko nule, derivabilna je, ima lijepi integral itd. U Master of Orionu II dobro funkcionira dok je razlika između attacka i defensa manja od 100 no izvan intervala [-100, 100] praktički se događa imunost na kocku. Mislim, u svakom modelu  će se uz dovoljno veliku razliku u attacka i defensa pojaviti imunost na kocku. Ili tako da kocka uopće ne utječe na ishod ili tako da je vjerojatnost jednog ishoda 99.9999% a drugog 0.0001% (tzv. zasićenje). Naime, to je ok kada je razlika attacka i defensa, u kontekstu igre, ogromna. Npr. kada običan miš pokušava ozlijediti ninđu.

Da bi nastavili analizirati nelinearne modele, moramo prvo definirati relevantna svojstva. Naš idealan model trebao bi zadovoljavati slijedeće:
  • Linearnost oko nule. Ako su attack i defense jednaki, vjerojatnost pogotka je 50%. Manja odstupanja od jednakosti linearno povećavaju ili smanjuju vjerojatnost. Npr. 1 poen attacka ili defensa povećava ili smanjuje vjerojatnost za 1%.
  • Asimptote na 0% i 100%. Za veće razlike u korist attack ratinga, vjerojatnost se približava vrijedosti od 100% ali ju nikad ne sustiže (niti ne prelazi). I obratno, za velik defense u odnosu na attack vjerojtanost teži u 0%. Ovo svojstvo povlači zahtjev da nelinearna funkcija mora imati vrijednosti u intervalu [0, 1] (1 = 100%).
  • Opadajuća granična korisnost. Kod većih razlika attacka i defensa, 1 poen gore-dolje manje utječe na vjerojatnost pogotka nego kod manjih razlika.
  • Simetrija s obzorom na (0, 0.5). Drugim riječima ako je attack rating x poena veći od defense ratinga, da je vjerojatnost pogotka jednaka vjerojatnosti promašaja kada bi attack rating bio istih x poena manji od defense ratinga.
Ponašanje granične korisnosti je svojstvo po kojem se dobri modeli razlikuju od loših. Npr. u linearnom modelu događa se da kod malih vjerojatnosti pogotka svaki poen puno znači, recimo da svaki poen mjenja vjerojatnost za 5%. +5% na 5% znači duplo veća vjerojatnost dok +5% na 90% ne čini tako drastičnu razliku. I to smatram lošim. Dobar model bi trebao biti taka da svaki poen ima otprilike jednak utjecaj na vjerojatnost pogotka.

Eksponencijalna funkcija

Ako želimo da svaki poen razlike jednako utječe na vjerojtanost tako da svaki poen razlike povećava ili smanjuje očekivan broj pogodaka  za 1% (npr. ako je vjerojatnost pogotka 30% i napadač si poveća attack rating za 10 poena, da se vjerojatnost pogotka poveća na 33%), tada je traženi model u obliku eksponencijalne funkcije. Osobi pokušaj konstrukcije takve funkcije doveli su me do formule slijedeće formule:

Gdje je baza potencije (parametar a) utječe na strminu funkcije, odnosno na to koliko svaki poen utječe na vjerojatnost. Ako želimo da bude točno 1 poen -> 1% tada baza treba biti . Ako je nekome to preekzotičan broj, može slobodno uzeti a = 0.98 što je otprilike tu negdje. Funkcija je podijeljena na dva segmenta kako bi se postigla simetričnost.

Na slijedećoj slici prikazane su logistička sigmoidalna funkcija (zlatna linija), prilagođena eksponencijalna funkcija (plava linija), linearna funkcija (crvena) i još jedna sigmiodalna funkcija (ljubičasta linija). Funkcije su podešene tako da nagib u nuli iznosi 0.01 (za pomak na x osi za jednu jedinicu, funkcija raste ili pada za 0.01 jedinicu na y osi).


Iz grafa se može vidjeti kako linearna finkcija izvan intervala [-50, 50] više ne može poslužiti kao funkcija vjerojatnosti (jer joj vrijednost izlazi iz intervala [0, 1]). Logistička sigmoida nema takvo ograničenje ali njena praktična primjena prestaje izvan intervala [-100, 100]. Modificirana eksponencijala ni se nekako čini najbolji izbor, interval na kojem je primjenjiva je otprilike [-150, 150], možda čak i na [-200, 200] i trend promjene je upravo takav da svaki poen ima svoj značaj. No da li bi to bio dobar izbor, jednostavno treba isprobati.

Saturday, June 11, 2011

Attack rating

Mnoge igre, posebice RPG-ovi uključuju "bacenje kocke" u procesima odlučivanja. I većina igara radi to ofrlje, izabirući jednostavan model. Na primjer, u Diablu 2 vjerojatnost zadavanja štete računa se po formuli ovoj formuli:
gdje je a "attack rating" napadaća i d "defense rating" mete. To je zapravo jednostavan omjer, napadač ima a naprama d šansi za pogodak. Taj pristup smatram lošim jer dovodi do toga da kako igrač napreduje, attack i defense rating moraju rasti eksponencijalno. Recimo da na početku igrač ima attack rating 10 i da neprijatelji imaju defense rating isto 10. To daje vjerojatnost pogotka od 50%. Da bi igrač podigao vjerojatnost pogotka n 75%, mora si utrostručiti attack rating (znači na 30). Da bi neprijatelji bili izazov, moraju do neke mjere pratiti igračev razvoj tako da će se u jednom trenutku dogoditi da igrač ima attack rating 30 i neprijatelji defense rating 30. I opet igrač mora utrostručiti svoje brojeve da bi dobio prednost i tako u nedogled. Brojevi počnu divljati, sustav postane noćna mora za balansiranje i u najgorem slučaju dio igre ovisan o tom modelu odlučivanja kockom prestane funkcionirati. Osobno tu pojavu nazivam "eksponencijalnom zamkom".

Primjer drugi, D&D. U D&D-u (mislim da od 2nd editiona na dalje) odlučivanje o pogotku se vrši tako da se na napadačev attack rating doda iznos s kocke i ta suma usporedi s defense ratingom mete. Ako je defense rating manji od te sume, napadač je pogodio. Ovakav pristup nema problema s eksponencijalnim rastom brojeva i čini mi se dosta lakši za balansiranje. No pati od problema kojeg osobno nazivam "imunost na kocku". Ako je napadačev attack rating bez kocke veći od metinog defense ratinga, napadač će uvjek pogoditi. S druge strane, ako meta ima veći defense rating od sume napadačeva attack ratinga i maksimalnog iznosa kocke, tada napadać neće nikad pogoditi. Taj se problem može izbjeći pravilima da napadać ima barem x% šansi da pogodi (npr. ako dobije 20 na d20 "kocki") i barem y% šansi da promaši (ako dobije 1 na d20). No osobno, kada bi radio RPG pokušavao bi izbjeći takvim iznimkama.

Varijacija na temu je model koji se koristi u iPhone igri Uniwar [1]. Ako napadač ima attack rating jednak defense ratingu mete, šanse za pogodak su mu 50%, za svaki poen razlike, šansa se povećava ili smanjuje za 5%. Praktički isto kao i u D&D-u samo je uklonjena potreba da defense rating u startu bude 10. I u Uniwaru to savršeno funkcionira iz prostog razloga što je igra strategija a ne RPG. Attack i defense rating jedinica se ne mjenja u tolikoj mjeri kao u RPG-ovima i balansom je postigunto da ne dolazi do problema imunosti na kocku.

Dosta sam si razmišljao kakav model odabrati u igrama koje trenutno postoje samo u mojoj glavi. Trenutno mi se model temeljen na razlici, kao u D&D-u i Uniwaru, čini kao way to go. No ono što mi se ne sviđa je spomenuti problem imunosti na kocku. Ako se malo bolje pogleda, taj problem prizlazi iz toga što se vjerojatnost linearno mjenja s razlikom attacka i defensa, bez obzira da li je ta razlika 0, 10, 100 ili - 500. Znači, u model treba dodati nelinearnost. Malo sam se igrao s brojkam i formulama, no rezultate ću iznijeti u sljedećem postu.