added font, updated ui, fixed some code
This commit is contained in:
381
Assets/Scripts/Player/PlayerObject.cs
Normal file
381
Assets/Scripts/Player/PlayerObject.cs
Normal file
@@ -0,0 +1,381 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Assets.Scripts.Classes;
|
||||
using Assets.Scripts.Races;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace Assets.Scripts.Player
|
||||
{
|
||||
public class PlayerObject
|
||||
{
|
||||
Random rand = new Random();
|
||||
Dictionary<string, PlayerStat> stats;
|
||||
string playername;
|
||||
BasicRace race;
|
||||
BasicClass role;
|
||||
BasicSkill[] skills = new BasicSkill[3];
|
||||
bool isDodging = false;
|
||||
int difficulty;
|
||||
|
||||
public PlayerObject(string playername, BasicRace race, BasicClass role, int difficulty)
|
||||
{
|
||||
this.playername = playername;
|
||||
this.race = race;
|
||||
this.role = role;
|
||||
this.difficulty = difficulty;
|
||||
generateStats(false);
|
||||
generateSkills();
|
||||
EasterEggHandler.applyEasterEgg(this);
|
||||
}
|
||||
|
||||
public PlayerObject()
|
||||
{
|
||||
generateStats(true);
|
||||
}
|
||||
|
||||
private void generateStats(bool isLoad)
|
||||
{
|
||||
stats = new Dictionary<string, PlayerStat>();
|
||||
stats.Add("Health", new PlayerStat("Health", 100, "The current health of the player"));
|
||||
stats.Add("MaxHealth", new PlayerStat("MaxHealth", 100, "The current max health of the player"));
|
||||
stats.Add("Secondary", new PlayerStat("Secondary", 20, "The current secondary of the player"));
|
||||
stats.Add("MaxSecondary", new PlayerStat("MaxSecondary", 20, "The current max secondary of the player"));
|
||||
stats.Add("Strength", new PlayerStat("Strength", 5, "The current strength of the player"));
|
||||
stats.Add("Dexterity", new PlayerStat("Dexterity", 5, "The current dexterity of the player"));
|
||||
stats.Add("Intelligence", new PlayerStat("Intelligence", 5, "The current intelligence of the player"));
|
||||
stats.Add("Experience", new PlayerStat("Experience", 0, "The current experience of the player"));
|
||||
stats.Add("MaxExperience", new PlayerStat("MaxExperience", 10, "The current max experience of the player"));
|
||||
stats.Add("HealthRegen", new PlayerStat("HealthRegen", 30 / (difficulty + 1), "The current health regen of the player"));
|
||||
stats.Add("SecondaryRegen", new PlayerStat("SecondaryRegen", 5, "The current secondary regen of the player"));
|
||||
stats.Add("Level", new PlayerStat("Level", 0, "The current level of the player"));
|
||||
stats.Add("Luck", new PlayerStat("Luck", 20 - (difficulty * 5), "The current luck of the player"));
|
||||
stats.Add("Killcount", new PlayerStat("Killcount", -1, "The current killcount of the player"));
|
||||
stats.Add("Points", new PlayerStat("Points", 0, "The current skillpoints of the player"));
|
||||
|
||||
if (!isLoad)
|
||||
{
|
||||
race.applyBonus(this);
|
||||
role.applyBonus(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void generateSkills()
|
||||
{
|
||||
switch (role.classname)
|
||||
{
|
||||
case "Warrior":
|
||||
skills[0] = new BasicSkill(20, 10, 2, "Slash", "Skills/Warrior/Slash", null);
|
||||
skills[0].setDescription(TextHandler.getText("slashDesc"));
|
||||
skills[1] = new BasicSkill(0, 5, 1, "Block", "Skills/Warrior/Block", null);
|
||||
skills[1].setDescription(TextHandler.getText("blockDesc"));
|
||||
skills[2] = new BasicSkill(35, 30, 4, "Execution", "Skills/Warrior/Execution", null);
|
||||
skills[2].setDescription(TextHandler.getText("executionDesc"));
|
||||
break;
|
||||
case "Thief":
|
||||
skills[0] = new BasicSkill(20, 10, 2, "Stab", "Skills/Thief/Stab", null);
|
||||
skills[0].setDescription(TextHandler.getText("stabDesc"));
|
||||
skills[1] = new BasicSkill(0, 5, 1, "SmokeScreen", "Skills/Thief/SmokeScreen", null);
|
||||
skills[1].setDescription(TextHandler.getText("smokeScreenDesc"));
|
||||
skills[2] = new BasicSkill(35, 30, 4, "Heartstop", "Skills/Thief/Heartstop", null);
|
||||
skills[2].setDescription(TextHandler.getText("heartStopDesc"));
|
||||
break;
|
||||
case "Mage":
|
||||
skills[0] = new BasicSkill(20, 10, 2, "Icicle", "Skills/Mage/Icicle", null);
|
||||
skills[0].setDescription(TextHandler.getText("icicleDesc"));
|
||||
skills[1] = new BasicSkill(0, 5, 1, "Teleport", "Skills/Mage/Teleport", null);
|
||||
skills[1].setDescription(TextHandler.getText("teleportDesc"));
|
||||
skills[2] = new BasicSkill(35, 30, 4, "Fireball", "Skills/Mage/Fireball", null);
|
||||
skills[2].setDescription(TextHandler.getText("fireballDesc"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void loadPlayer(JToken json)
|
||||
{
|
||||
playername = json["playername"].ToString();
|
||||
|
||||
stats["MaxHealth"].setAmount((int)json["maxHealth"]);
|
||||
stats["MaxSecondary"].setAmount((int)json["maxSecondary"]);
|
||||
stats["Secondary"].setAmount((int)json["secondary"]);
|
||||
stats["Health"].setAmount((int)json["health"]);
|
||||
stats["Strength"].setAmount((int)json["strength"]);
|
||||
stats["Dexterity"].setAmount((int)json["dexterity"]);
|
||||
stats["Intelligence"].setAmount((int)json["intelligence"]);
|
||||
stats["Level"].setAmount((int)json["level"]);
|
||||
stats["Experience"].setAmount((int)json["experience"]);
|
||||
stats["MaxExperience"].setAmount((int)json["maxExperience"]);
|
||||
stats["Points"].setAmount((int)json["points"]);
|
||||
stats["Luck"].setAmount((int)json["luck"]);
|
||||
stats["HealthRegen"].setAmount((int)json["healthRegen"]);
|
||||
stats["SecondaryRegen"].setAmount((int)json["secondaryRegen"]);
|
||||
stats["Killcount"].setAmount((int)json["killcount"]);
|
||||
|
||||
loadRole(json["role"].ToString());
|
||||
loadRace(json["race"].ToString());
|
||||
isDodging = bool.Parse(json["isDodging"].ToString());
|
||||
difficulty = (int)json["difficulty"];
|
||||
generateSkills();
|
||||
}
|
||||
|
||||
private void loadRole(string name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case "Warrior":
|
||||
role = new WarriorClass();
|
||||
break;
|
||||
case "Mage":
|
||||
role = new MageClass();
|
||||
break;
|
||||
case "Thief":
|
||||
role = new ThiefClass();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void loadRace(string name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case "Human":
|
||||
race = new HumanRace();
|
||||
break;
|
||||
case "Dwarf":
|
||||
race = new DwarvenRace();
|
||||
break;
|
||||
case "Elf":
|
||||
race = new ElvenRace();
|
||||
break;
|
||||
case "Giant":
|
||||
race = new GiantRace();
|
||||
break;
|
||||
case "Goblin":
|
||||
race = new GoblinRace();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void changeStats(int strength, int health, int dexterity, int intelligence, int secondary)
|
||||
{
|
||||
stats["MaxHealth"].changeAmount(health);
|
||||
stats["Health"].changeAmount(stats["MaxHealth"].getAmount());
|
||||
stats["MaxSecondary"].changeAmount(secondary);
|
||||
stats["Secondary"].changeAmount(stats["MaxSecondary"].getAmount());
|
||||
stats["Strength"].changeAmount(strength);
|
||||
stats["Dexterity"].changeAmount(dexterity);
|
||||
stats["Intelligence"].changeAmount(intelligence);
|
||||
}
|
||||
|
||||
public void regainSecondary(int equipRegen, int equipStat)
|
||||
{
|
||||
stats["Secondary"].changeAmount(stats["SecondaryRegen"].getAmount() + equipRegen);
|
||||
if (stats["Secondary"].getAmount() >= stats["MaxSecondary"].getAmount() + equipStat)
|
||||
{
|
||||
stats["Secondary"].setAmount(stats["MaxSecondary"].getAmount() + equipStat);
|
||||
}
|
||||
}
|
||||
|
||||
public void healPlayer(int equipRegen, int equipStat)
|
||||
{
|
||||
stats["Health"].changeAmount(stats["HealthRegen"].getAmount() + equipRegen);
|
||||
if (stats["Health"].getAmount() >= stats["MaxHealth"].getAmount() + equipStat)
|
||||
{
|
||||
stats["Health"].setAmount(stats["MaxHealth"].getAmount() + equipStat);
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string, PlayerStat> getStats()
|
||||
{
|
||||
return stats;
|
||||
}
|
||||
|
||||
public void setStats(Dictionary<string, PlayerStat> stats)
|
||||
{
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
public PlayerStat getStat(string identifier)
|
||||
{
|
||||
return stats[identifier];
|
||||
}
|
||||
|
||||
public BasicSkill getSkill(int index)
|
||||
{
|
||||
return skills[index];
|
||||
}
|
||||
|
||||
public int calculateDamage(int equipStatStr, int equipStatDex)
|
||||
{
|
||||
int result;
|
||||
int bonus = 0;
|
||||
if (isCrit(equipStatDex))
|
||||
{
|
||||
bonus = (stats["Strength"].getAmount() + equipStatStr) * 2;
|
||||
}
|
||||
result = stats["Strength"].getAmount() + bonus + 5 + equipStatStr;
|
||||
switch (difficulty)
|
||||
{
|
||||
case 0:
|
||||
result = result * 2;
|
||||
break;
|
||||
case 1:
|
||||
//Default difficulty
|
||||
break;
|
||||
case 2:
|
||||
result = result / 2;
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public int castSkill(int index, int equipStatInt, int equipStatStr, int equipStatDex)
|
||||
{
|
||||
int damage = 0;
|
||||
if (skills[index].canPlayerCast(stats["Secondary"].getAmount()))
|
||||
{
|
||||
if (index == 1)
|
||||
{
|
||||
isDodging = true;
|
||||
}
|
||||
stats["Secondary"].changeAmount(-skills[index].getSecondaryConsumption());
|
||||
if (role.classname == "Wizard")
|
||||
{
|
||||
damage = skills[index].calculateDamage(stats["Intelligence"].getAmount() + equipStatInt, isCrit(equipStatDex));
|
||||
}
|
||||
else
|
||||
{
|
||||
damage = skills[index].calculateDamage(stats["Strength"].getAmount() + equipStatStr, isCrit(equipStatDex));
|
||||
}
|
||||
|
||||
switch (difficulty)
|
||||
{
|
||||
case 0:
|
||||
damage = damage * 2;
|
||||
break;
|
||||
case 1:
|
||||
//Default difficulty
|
||||
break;
|
||||
case 2:
|
||||
damage = damage / 2;
|
||||
break;
|
||||
}
|
||||
//TODO: Let caller of this method handle audio if damage is higher than 0 // skills[index].playSound(audioHandler);
|
||||
}
|
||||
return damage;
|
||||
}
|
||||
|
||||
public void reduceCooldown(int index)
|
||||
{
|
||||
for (int i = 0; i < skills.Length; i++)
|
||||
{
|
||||
if (i != index)
|
||||
{
|
||||
skills[i].reduceCooldown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool isCrit(int equipStat)
|
||||
{
|
||||
return rand.Next(1, 101) <= stats["Dexterity"].getAmount() + equipStat;
|
||||
}
|
||||
|
||||
public bool takeDamage(int amount, int equipStatDex, int equipStatInt)
|
||||
{
|
||||
|
||||
if (amount <= 0 || EasterEggHandler.isGodMode(this))
|
||||
{
|
||||
return stats["Health"].getAmount() <= 0;
|
||||
}
|
||||
|
||||
if (isDodging)
|
||||
{
|
||||
isDodging = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
int dodgeChance = stats["Dexterity"].getAmount() + equipStatDex + ((stats["Intelligence"].getAmount() + equipStatInt) / 2);
|
||||
if (rand.Next(1, 101) > dodgeChance)
|
||||
{
|
||||
stats["Health"].changeAmount(-amount);
|
||||
//TODO: Let caller of this method handle audio // audioHandler.playDamage();
|
||||
}
|
||||
}
|
||||
return stats["Health"].getAmount() <= 0;
|
||||
}
|
||||
|
||||
public bool gainExperience(int amount)
|
||||
{
|
||||
bool result = false;
|
||||
stats["Experience"].changeAmount(amount);
|
||||
if (stats["Experience"].getAmount() >= stats["MaxExperience"].getAmount())
|
||||
{
|
||||
stats["Experience"].changeAmount(-stats["MaxExperience"].getAmount());
|
||||
stats["MaxExperience"].changeAmount(stats["MaxExperience"].getAmount());
|
||||
stats["Level"].changeAmount(1);
|
||||
stats["Points"].changeAmount(3);
|
||||
stats["Luck"].changeAmount(2);
|
||||
result = true;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool upgradeStat(string identifier, int amount)
|
||||
{
|
||||
bool result = false;
|
||||
if (stats["Points"].getAmount() > 0)
|
||||
{
|
||||
result = true;
|
||||
stats[identifier].changeAmount(amount);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public string getPlayerName()
|
||||
{
|
||||
return playername;
|
||||
}
|
||||
|
||||
public int getDifficulty()
|
||||
{
|
||||
return difficulty;
|
||||
}
|
||||
|
||||
public BasicRace getRace()
|
||||
{
|
||||
return race;
|
||||
}
|
||||
|
||||
public BasicClass getClass()
|
||||
{
|
||||
return role;
|
||||
}
|
||||
|
||||
public string saveGame()
|
||||
{
|
||||
string result = "";
|
||||
result = result + FileHandler.generateJSON("playername", "\"" + playername + "\"") + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("maxHealth", stats["MaxHealth"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("maxSecondary", stats["MaxSecondary"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("secondary", stats["Secondary"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("health", stats["Health"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("strength", stats["Strength"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("dexterity", stats["Dexterity"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("intelligence", stats["Intelligence"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("level", stats["Level"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("experience", stats["Experience"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("maxExperience", stats["MaxExperience"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("race", "\"" + race.racename + "\"") + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("role", "\"" + role.classname + "\"") + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("points", stats["Points"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("healthRegen", stats["HealthRegen"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("secondaryRegen", stats["SecondaryRegen"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("isDodging", "\"" + isDodging + "\"") + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("killcount", stats["Killcount"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("luck", stats["Luck"].getAmount()) + ",\r\n";
|
||||
result = result + FileHandler.generateJSON("difficulty", difficulty);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user