-
fiecare tip de erou are cate o clasa specifica ce mosteneste clasa abstracta Hero;
-
fiecare abilitate are o clasa proprie ce mosteneste clasa abstracta Ability;
-
logica jocului este implementata in clasa GameEngine;
-
am aplicat conceptul de double-dispatch pentru lupta dintre eroi;
-
fiecare tip de inger are cate o clasa specifica ce mosteneste clasa abstracta Angel;
- am folosit urmatoarele design pattern-uri : Visitor Pattern, Strategy Pattern si Observer Pattern;
-
returneaza o singura instanta, utilizand din nou Singleton Pattern, a unui tip de inger;
-
este utilizat, de asemenea, Factory Pattern.
-
fiecare clasa contine 4 metode de visit particularizate;
-
se retin urmatoarele: coordonatele ingerului si tipul acetuia.
-
am implementat in fiecare clasa ce apartine unui tip de inger metodele de visit cu implementarea specifica din enunt, avand ca parametru, tipul de erou pe care urmeaza sa il viziteze;
-
in fiecare clasa de erou, apare o metoda de accept, care modifica pentru eroul respectiv, modificatorii de damage/XP/HP.
-
in pachetul heroes, am adaugat clasa abstracta HeroStrategy, ce contine cele doua startegii ale fiecarui erou : attack si respectiv,defense si o metoda choose care activeaza o anumita strategie in functie de HP-ul curent al jucatorului.
-
observand faptul ca startegiile eroilor au un comportament asemantor, am decis sa trasmit ca parametrii in constructor, datele care variaza precum :
-
limita inferioara(minLimit) pentru intervalul strategiei attack;
-
limita superioara(maxLimit) pentru intervalul strategiei attack;
-
modificarea coeficientilor de damage pentru strategia de attack(attackBoost);
-
modificarea coeficientilor de damage pentru strategia de defense(defenseBoost);
-
pierderea de HP(lossHP) specifica strategiei de attack;
-
castigarea de HP(winHP) specifica strategiei de defense;
- am creat pentru fiecare tip de erou, 4 clase(KnightStrategy, PyromancerStrategy, RogueStrategy si WizardStrategy) pentru a particulariza strategiile in functie de parametrii descrisi mai sus;
-
pentru realizarea acestui pattern, am creat pachetul observer, ce dispune de doua interfete: Observer si Subject;
-
Observer reprezinta observatorul ce trebuie notificat, care este implementat de catre TheGreatestMagician;
-
in clasa specifica Marelui Magician am utilizat Singleton Pattern pentru a crea o singura instanta a acestuia;
-
interfata Subject reprezinta obiectul observabil si este implementata de catre clasa Angel, implicit de clasele care o mostenesc si de catre Hero, implicit de tipurile de eroi;
-
in plus fata de observer, exista pachetul events, care are la baza interfata Event si clasele ce o implementeaza;
-
am tratat situatiile precum : comportamentul ingerilor in joc si lupta jucatorilor ca pe niste evenimente:
-
Spawn notifica aparitia unui inger pe harta;
-
Helped/Hit verifica daca un erou a fost ajutat, respectiv incurcat de catre un inger;
-
LevelUp verifica cand un jucator a avansat la urmatorul sau urmatoarele nivel/e;
-
Kill anunta faptul ca un erou si-a omorat victima;
-
KilledByAngel ii permite Marelui Magician sa afle ce erou a fost omorat de catre un inger;
-
BackToLife notifica invierea unui jucator de catre un inger.
-
Observer are metoda de update avand ca parametru evenimentul de tip Event, ce este implementata in TheGreatestMagician si scrie in fisier evenimentele ce au avut loc in timpul jocului;
-
Subject contine doua metode:
-
registerObserver(), ce stabileste cine poarta rolul de observer;
-
updateObserver(), ce instiinteaza adminul cu privire la ce se intampla in joc.
- se face in clasa GameInputLoader.
-
m-am folosit de Singleton Pattern pentru a crea o singura instanta a clasei Map;
-
returnez terenul hartii prin metoda getField().
- returneaza o singura instanta, utilizand din nou Singleton Pattern, a unui tip de jucator.
-
in clasa abstracta Hero se regasesc 8 metode receive(abilitate) corespunzatoare pentru fiecare abilitate in parte;
-
fiecare metoda de receive executa urmatoarele actiuni:
-
calculeaza damage-ul fara modificatori de rasa, obtinut prin metoda getDamage(), ce exista in fiecare abilitate (util pentru Deflect);
-
calculeaza damage-ul modificat de amplificatorul de rasa specific fiecarei victime care primeste atacul;
-
seteaza efectul de overtime al unei abilitati, unde este necesar.
-
aceste metode sunt suprascrise in subclasele lui Hero, specificand in fiecare dintre acestea, modificatorul de rasa (multiplier);
-
in fiecare abilitate, exista metoda cast(atacator, atacat) in care elementul curent este vizitat, prin apelul target.receive(this), unde target este inamicul asupra caruia i se aplica abilitatea.
-
in fiecare subclasa, se calculeaza damage-ul de baza dat de abilitatea respectiva impreuna cu modificatorul de teren prin intermediul metodei getDamage(), care este transmis in Hero, in receive();
-
metoda cast() reprezinta atacul, identificand abilitatea corespunzatoare fiecarui tip de jucator.
-
in clasa Hero, se regaseste mecanismul de level-up descris in metodele needToLevel, levelUp si gainXP;
-
in plus fata de cele 8 metode de receive(), explicate mai sus in Double-Dispatch, fiecare clasa de erou dispune de metoda getLandModifier() care atribuie bonusul de teren cand este cazul;
-
am adaugat campurile angelMultiplier si strategyMultiplier ce actualizeaza modificatorii primiti de la ingeri, respectiv strategie;
-
metoda print() care afiseaza stats-urile jucatorilor.
- clasa Constants este publica si statica, continand "numerele magice".
- in clasa GameEngine, se realizeaza logica acestui joc conform cerintei, jucatorii miscandu-se pe harta conform input-ului primit si luptandu-se cand se intalnesc in acelasi loc, prin intermediul unei metode, numita battle care pune in aplicare lupta dintre doi jucatori, ce isi folosesc reciproc abilitatile specifice;
-
in clasa FileLogger, returneaza o singura instanta ce poate fi accesata prin metoda getLogger, utilizand din nou Singleton Pattern cu scopul de a fi vizibila ;
-
cu ajutorul metodei write, se scrie output-ul in fisier;
-
prin intermediul metodei close, se incheie activitatea Writer-ului out.