Table of Contents

Proiect - Etapa 2 - League of OOP

Obiective

Scenariu

Introducere

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.

Îngeri

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.

Strategii

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%.

Marele Magician

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.

Mențiuni

Aceleași ca la prima etapă:

Cerințe

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ă.

Design Patterns

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

Exemplu input/output

Î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

Indicații

Git

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.

Atentie!

Repository-urile, indiferent de platforma pe care o alegeti, trebuie sa fie private !!!

Punctaj

Checkstyle

Mai jos aveți câteva exemple de concepte de avut în vedere pentru a trece testul de coding-style/checkstyle

Dacă numărul de erori depistate de testele de Checkstyle [4] depășește o treime din punctajul maxim, atunci punctele pentru coding-style nu vor fi acordate iar dacă punctajul este negativ, acesta se trunchiază la 0.

Exemple:

  • punctaj_total = 100 și nr_erori = 200nota_finala = 80
  • punctaj_total = 100 și nr_erori = 29nota_finala = 100
  • punctaj_total = 80 și nr_erori = 30nota_finala = 80
  • punctaj_total = 80 și nr_erori = 31nota_finala = 60
Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.

You shall indeed not pass !!

Structura arhivei

Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:

Nu încărcați fișierele de test, checker-ul sau documente generate cu JavaDoc.