După nenumăratele lupte petrecute în ținutul fantastic, luptătorii au început să evolueze, să învețe din greșeli și să îsi perfecționeze Strategiile.
Din senin apar Îngeri la final de runde, iar aceștia îi pot ajuta sau încurca pe luptătorii noștri bravi. Există îngeri buni care le vor reface viața sau le vor crește rata de damage, dar și îngeri răi care le vor scădea viața sau damage-ul, chiar omorând anumiți jucatori.
Un alt element important este faptul că, auzind de luptele din acest ținut, un Mare Magician, a hotărât să nu mai lase luptătorii de capul lor. El dorește să Observe când un jucator moare/reînvie, când un înger apare sau când acesta ajută/încurcă pe cineva.
Misiunea voastră este să remodelați jocul pentru a suporta și aceste noi caracteristici.
Pentru a face jocul mai interesant și pentru a ne apropia mai mult de un joc MMO, este nevoie să adăugăm noi funcționalități, iar una dintre acestea ar fi un helper care să apara random pe hartă și să ofere sprijin jucătorilor aflați în acea poziție.
Vom introduce un nou tip de personaj, și anume, un înger. El apare la finalul fiecărei runde într-o anumita poziție pe harta, iar dacă in acea căsuță se afla unul sau doi jucători, acesta/aceștia vor primi de la el fie HP, fie damage. Acești îngeri au diferite tipuri. Unii sunt buni si vor să ajute jucătorii, alții sunt răi și vor să îi încurce. Totodată, există și îngeri care vor omorî un jucător, dar și îngeri care vor readuce la viață un jucător.
În cele ce urmează vom detalia tipurile de îngeri întalniți și acțiunile pe care le vor executa.
Aceștia vor executa acțiuni diferite în funcție de clasa pe care le aplică, la finalul rundei curente.
Îngerii vor aplica bonusurile doar dacă personajul este în viață. Doar Spawner va aplica bonusul unui jucător decedat.
DamageAngel
DarkAngel
Dracula
GoodBoy
LevelUpAngel
LifeGiver
SmallAngel
Spawner
TheDoomer
XPAngel
Aceste creșteri se aplică doar modificatorilor de rasă și vor fi aplicați incremental. Spre exemplu, dacă un jucător are un modificator de rasa +20% și primeste un bonus de +5% de la un înger, bonusul final va fi de +25%.
Modificatorii pot sa se si scada, dar nu vor trece de 0%. Spre exemplu, dacă un jucător are bonus +10% și primește -12%, bonusul sau va deveni 0%.
Dacă un jucător avea INIȚIAL bonus de 0%, el nu va primi bonusuri de la îngeri. Dar dacă ajunge pe parcurs la 0%, el va primi în continuare.
După cum spuneam, fiecare tip de jucător și-a dezvoltat o strategie.
Ei au considerat că în anumite cazuri ar fi mai bine să scadă din HP, dar să dea mai mult damage, sau invers. Fiecare după cum s-a gândit că e mai bine.
Astfel, fiecare clasă a venit cu următoarea logica de atac, aplicată înainte de a face următoarea mișcare. (Strategia nu se aplică dacă eroul este incapacitat)
Knight
Pyromancer
Rogue
Wizard
Asemănător îngerilor, se vor aplica bonusurile de rasă și aici, incremental. Spre exemplu, dacă are bonus +10% și primește +5%, va avea, în final, +15%.
El este un personaj aparte în acest joc. Îl putem asemana unui admin. Marele Magician a auzit de aceste lupte mirifice și a vrut să le urmărească îndeaproape. Totuși, el este un magician ocupat cu vrăji și poțiuni, așa că nu își permite să ocupe tot timpul uitându-se cine se mai lupta cu cine.
El vrea sa studieze comportamentul Îngerilor, deoarece au ceva aparte ce ar putea fi folosit la următoarele vrăji. Acel praf magic lăsat în urma lor după ce dispar.
Pentru asta, el vrea să fie notificat, printr-un mecanism implementat de voi, cu poziția unui înger când acesta apare pe harta pentru a colecta praful magic.
Ar vrea să știe și cărui jucător i s-au oferit noi puteri în joc.
Iar cel mai important, pentru Magician, este să cunoască atât personajele care au fost ucise în lupta sau de către îngerii cei răi, cât și personajele care au fost readuse la viață de îngeri.
Aceleași ca la prima etapă:
Cerința principală a acestei părti este să porniți de la un cod care deja executa un task și să adăugați noi funcționalități.
Ne putem imagina că am creat un joc care a avut succes, dar oamenii s-au plictisit să facă același lucru în fiecare moment, așa că vrem sa îi readucem pe platforma noastră.
Aceste funcționalități noi ne vor ajuta să îi recâștigăm de partea noastră.
Dacă în prima etapă aceste lucruri erau optinale, în această etapă utilizarea unui Factory pentru crearea eroilor și a unei instanțe Singleton pentru hartă sunt obligatorii și vor exista depunctări în cazul în care acestea nu există.
Factory și Singleton se vor folosi și la crearea îngerilor, sau a Marelui Magician.
La acestea se vor adăuga următoarele pattern-uri:
Despre aceste patternuri puteți să vă documentați de pe paginile laboratoarelor: Singleton, Visitor, și Factory, Strategy și Observer
În input avem ultimele linii adăugate. După mișcările făcute de jucători am adăugat îngerii pentru fiecare runda, cu poziția unde vor apărea.
În exemplul de mai jos, avem 2 runde, deci încă 2 linii cu îngeri la finalul fișierului. La finalul primei runde va apărea un LifeGiver la poziția (0,0), iar la finalul celei de-a doua rundă va apărea un LevelUpAngel la poziția (0,0).
Liniile sunt de forma (<numărul de îngeri din runda curentă> <tip înger 1, coordonata X, coordonata Y> <tip înger 2, coordonata X, coordonata Y> …):
Exemplu Input:
1 1 V 2 K 0 0 P 0 0 2 __ __ 1 LifeGiver,0,0 1 LevelUpAngel,0,0
Îngerii vor ajuta sau vor lovi jucătorii. O linie din output va fi de forma:
<angel_type> helped/hit <player_type> <player_ID>
Output asteptat:
~~ Round 1 ~~ Angel LifeGiver was spawned at 0 0 LifeGiver helped Knight 0 LifeGiver helped Pyromancer 1 ~~ Round 2 ~~ Player Knight 0 was killed by Pyromancer 1 Angel LevelUpAngel was spawned at 0 0 Pyromancer 1 reached level 1 LevelUpAngel helped Pyromancer 1 ~~ Results ~~ K dead P 1 250 550 0 0
Explicatie:
Ne aflăm pe teren de tip vulcanic, iar personajele sunt Knight și Pyromancer Damage dat de Knight: Execute: 200 Amplificator de teren: 1.0 Amplificator de rasa : 1.1 Total: 220 Slam: 100 Amplificator de teren: 1.0 Amplificator de rasa : 0.9 Total: 90 => HP_PYROMANCER = 500 - 310 = 190 Damage dat de Pyromancer: Fireblast: 350 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 526 Ignite: 150 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 226 Damage pentru runda următoare (de la Ignite): 50 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 76 => HP_KNIGHT = 900 - 752 = 148 LifeGiver angel adaugă HP: => HP_KNIGHT = 148 + 100 = 248 => HP_PYROMANCER = 190 + 80 = 270
Knight va lua 76 damage de la Ignite: => HP_KNIGHT = 248 - 76 = 172 Knight alege strategia de defense: => HP_KNIGHT = 172 + (172 / 4) = 172 + 43 = 215 Damage dat de Knight: Execute: 200 Amplificator de teren: 1.0 Amplificator de rasa : 0.9 (a scazut cu 0.2 de la strategie) Total: 180 Slam: 100 Amplificator de teren: 1.0 Amplificator de rasa : 0.7 Total: 70 => HP_PYROMANCER = 270 - 180 - 70 = 20 Damage dat de Pyromancer: Fireblast: 350 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 526 Ignite: 150 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 226 Damage pentru runda următoare (de la Ignite): 50 Amplificator de teren: 1.25 Amplificator de rasa : 1.2 Total: 76 => HP_KNIGHT = 215 - 752 = -537 (dead) => XP_PYROMANCER = 200 (mai are nevoie de 50 pentru level-up) LevelUpAngel adaugă experiența necesară pentru level-up: => Knight nu primește nimic deoarece este mort => Pyromancer primește 50 XP și face level 1 => HP_PYROMANCER = 550 și XP_PYROMANCER = 250
Va sfatuim sa folositi git pentru versionarea codului. Puteti utiliza platforma pusa la dispozitie de facultate (Gitlab, utilizand conturile de cs.curs) sau alte solutii externe (Bitbucket, Github). Pentru a primi bonusul pentru utilizarea git, fiecare commit ar trebui sa reprezinte un feature al temei (asta inseamna ca un singur commit nu este de ajuns, dar nici nu ar trebui sa existe commit-uri pentru fiecare clasa pe care o adaugati). De asemenea, la incarcarea temei, trebuie sa adaugati folder .git in arhiva.
Repository-urile, indiferent de platforma pe care o alegeti, trebuie sa fie private !!!
Mai jos aveți câteva exemple de concepte de avut în vedere pentru a trece testul de coding-style/checkstyle
Exemple:
punctaj_total = 100
și nr_erori = 200
⇒ nota_finala = 80
punctaj_total = 100
și nr_erori = 29
⇒ nota_finala = 100
punctaj_total = 80
și nr_erori = 30
⇒ nota_finala = 80
punctaj_total = 80
și nr_erori = 31
⇒ nota_finala = 60
Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:
README
main/Main.java
(entry-point-ul aplicatiei voastre care se află în pachetul main
)