To confuso agora…
mais vou explicar exatamente o que “deveria” acontecer…
O main será o laço principal do jogo, onde será instanciado o objeto Player (o que controlaria todos os status do personagem).
Os dados do jogador (objeto) vem do banco de dados, entretanto a unica coisa que vem definida são o nível dos aprimoramentos, nome do jogador e classe.
Os atributos do Player, serão definidos pelo aprimoramentos do jogador multiplicado pelos valores da classe Upgrades, + os atributos base da respectiva Raça.
Portanto, todos os atributos do jogador, serão definidos quando o objeto for instanciado, ele deve pegar os valores base da raça, os valores dos aprimoramentos, fazer os calculos e determinar os atributos do personagem.
Aqui está o problema, quando vou instanciar o Player, eu preciso passar como parametro a Raça dele (que vem do banco de dados como String), de uma forma que essa raça instancie apenas o objeto da Raça necessária para fornecer os dados para o cálculo, sem precisar declarar todas as raças existentes.
Aqui vai alguns trechos do código…
Classe Player
public class Player
{
String name;
Race_Controller race;
float health_points;
float energy_points;
float experience;
int level;
float damage;
float armor;
float speed;
float critical_chance;
float critical_damage;
float bullet_speed;
int bullet_penetration;
int bullet_size;
int dmg_lvl_upgr;
int arm_lvl_upgr;
int spd_lvl_upgr;
int hp_lvl_upgr;
int ep_lvl_upgr;
int crit_chance;
int crit_dmg;
int blt_spd_upgr;
int blt_pen_upgr;
int blt_siz_upgr;
int mov_lvl_upgr;
int atk_lvl_upgr;
Player(String name, Race_Controller race, Float exp, int dmg_upgr, int arm_upgr, int spd_upgr, int hp_upgr, int ep_upgr, int crit_chance, int crit_dmg, int blt_spd, int blt_pen, int blt_siz)
{
Upgrades lvlcalc = new Upgrades();
this.name = name;
this.race = race;
experience = exp;
level = 0;
health_points = race.getBase_hp() + hp_upgr * lvlcalc.hp_upgr;
energy_points = race.getBase_ep() + ep_upgr * lvlcalc.ep_upgr;
damage = race.getBase_dmg() + dmg_upgr * lvlcalc.dmg_upgr;
armor = race.getBase_arm() + arm_upgr * lvlcalc.arm_upgr;
speed = race.getBase_spd() + spd_upgr * lvlcalc.spd_upgr;
critical_chance = race.getBase_crit_chance() + crit_chance * lvlcalc.crit_chance_upgr;
critical_damage = race.getBase_crit_dmg() + crit_dmg * lvlcalc.crit_dmg_upgr;
bullet_speed = race.getBase_blt_spd() + blt_spd * lvlcalc.blt_spd_upgr;
bullet_penetration = race.getBase_blt_pen() + blt_pen * lvlcalc.blt_pen_upgr;
bullet_size = race.getBase_blt_siz() + blt_siz * lvlcalc.blt_siz_upgr;
}
public String getName()
{
return name;
}
public float getHealth_points()
{
return health_points;
}
public float getEnergy_points()
{
return energy_points;
}
public void addExp(float x)
{
experience += x;
}
public int getLevel()
{
return 0;
}
public float getDamage()
{
return damage;
}
public float getAmor()
{
return armor;
}
public float getSpeed()
{
return speed;
}
public float getCritical_chance()
{
return critical_chance;
}
public float getCritical_damage()
{
return critical_damage;
}
public float getBullet_speed()
{
return bullet_speed;
}
public int getBullet_penetration()
{
return bullet_penetration;
}
public int getBullet_size()
{
return bullet_size;
}
}
Classe Race_Controller
public class Race_Controller
{
private float base_hp;
private float base_ep;
private float base_dmg;
private float base_arm; //dmg reduction
private float base_spd; //sqm's per second
private float base_crit_chance; //critical chance
private float base_crit_dmg; //critical multiplier
private float base_blt_spd; //sqm's per second
private int base_blt_pen; //percent chance to bullets penetrates
private int base_blt_siz; //bullet size in pixels
Race_Controller(float base_hp, float base_ep, float base_dmg, float base_arm, float base_spd, float base_crit_chance, float base_crit_dmg, float base_blt_spd, int base_blt_pen, int base_blt_siz)
{
this.base_hp = base_hp;
this.base_ep = base_ep;
this.base_dmg = base_dmg;
this.base_arm = base_arm;
this.base_spd = base_spd;
this.base_crit_chance = base_crit_chance;
this.base_crit_dmg = base_crit_dmg;
this.base_blt_spd = base_blt_spd;
this.base_blt_pen = base_blt_pen;
this.base_blt_siz = base_blt_siz;
}
public float getBase_hp()
{
return base_hp;
}
public float getBase_ep()
{
return base_ep;
}
public float getBase_dmg()
{
return base_dmg;
}
public float getBase_arm()
{
return base_arm;
}
public float getBase_spd()
{
return base_spd;
}
public float getBase_crit_chance()
{
return base_crit_chance;
}
public float getBase_crit_dmg()
{
return base_crit_dmg;
}
public float getBase_blt_spd()
{
return base_blt_spd;
}
public int getBase_blt_pen()
{
return base_blt_pen;
}
public int getBase_blt_siz()
{
return base_blt_siz;
}
}
Classe Races
public class Races
{
//Races(base_hp, base_ep, base_dmg, base_amr, base_spd, base_crit_chance, base_crit_dmg, base_blt_spd, base_blt_pen, base_blt_siz)
public Race_Controller Human()
{
Race_Controller x = new Race_Controller(100,50,5,3,1,5,20,3,10,5);
return x;
}
public Race_Controller Cyborg()
{
Race_Controller x = new Race_Controller(110,44,4,4,7,15,0.8f,2.5f,8,5);
return x;
}
public Race_Controller Ninja()
{
Race_Controller x = new Race_Controller(84,40,5,2,1.2f,3,35,4,15,3);
return x;
}
public Race_Controller Ogre()
{
Race_Controller x = new Race_Controller(120,30,8,5,0.6f,5,50,2,12,8);
return x;
}
}
Classe Upgrades
public class Upgrades
{
float hp_upgr = 4; //hp per level
float ep_upgr = 4; //ep per level
float dmg_upgr = 1; //dmg per level
float arm_upgr = 1; //dmg reduction per level
float spd_upgr = 0.2f; //sqm's per second
float crit_chance_upgr = 1.2f; //critical chance per level
float crit_dmg_upgr = 4; //critical damage multiplier
float blt_spd_upgr = 0.4f; //sqm's per second
int blt_pen_upgr = 4; //percent chance to bullets penetrates
int blt_siz_upgr = 1; //bullet size in pixels
}
Main
public class Main {
public static void main(String[] args)
{
Races x = new Races();
Player character = new Player("Teste", x.Human(), 1000f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
System.out.println("Name = " + character.getName());
System.out.println("HP = " + character.getHealth_points());
System.out.println("EP = " + character.getEnergy_points());
//System.out.println("Level = " + character.getLevel());
System.out.println("Damage = " + character.getDamage());
System.out.println("Armor = " + character.getAmor());
System.out.println("Speed = " + character.getSpeed());
System.out.println("Critical Chance = " + character.getCritical_chance());
System.out.println("Critical Damage = " + character.getCritical_damage());
System.out.println("Bullet Speed = " + character.getBullet_speed());
System.out.println("Bullet Penetration = " + character.getBullet_penetration());
System.out.println("Bullet Size = " + character.getBullet_size());
}
}
Como vcs podem ver, nesta linha
Player character = new Player("Teste", x.Human(), 1000f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
ele funciona certinho, o problema é que eu preciso chamar x.Raça().
atualmente foi assim que eu consegui resolver, mais acho que preciso usar reflection pra buscar por texto o que eu preciso passar como parametro ali.
além disso, não sei se estou fazendo da melhor maneira, pois sou iniciante em java