Changed the method by which to se;ect field to attack.
Fix an issue with computing the attacker's cluster from which to draw resources from for attacking.
This commit is contained in:
parent
7ada34cc1b
commit
d16d998034
3 changed files with 35 additions and 42 deletions
|
@ -156,9 +156,15 @@ void FieldMeta::regenerate_resources()
|
|||
if (this->upgrades[Regeneration_1])
|
||||
this->resources *= 2;
|
||||
if (this->upgrades[Regeneration_2])
|
||||
this->resources *= 2;
|
||||
this->resources *= 4;
|
||||
if (this->upgrades[Regeneration_3])
|
||||
this->resources *= 2;
|
||||
this->resources *= 8;
|
||||
if (this->upgrades[Reproduction_1])
|
||||
this->reproduction *= 1.25;
|
||||
if (this->upgrades[Reproduction_2])
|
||||
this->reproduction *= 1.50;
|
||||
if (this->upgrades[Reproduction_2])
|
||||
this->reproduction *= 2.0;
|
||||
trigger_event(BOB_FIELDUPDATEEVENT, 0, (void *) this, nullptr);
|
||||
this->changed = true;
|
||||
}
|
||||
|
@ -275,21 +281,21 @@ bool Player::fight(FieldMeta *field)
|
|||
{
|
||||
continue;
|
||||
}
|
||||
if (*(neighbor->get_owner()) == *this) // comparison by UUID
|
||||
{
|
||||
power_level -= neighbor->get_offense();
|
||||
is_neighbor = true;
|
||||
}
|
||||
else if (*(neighbor->get_owner()) == *(field->get_owner()))
|
||||
if (*(neighbor->get_owner()) == *this) // comparison by UUID, attacking player
|
||||
{
|
||||
Cluster temp_attackers_cluster = neighbor->get_grid()->get_cluster(neighbor);
|
||||
attackers_cluster.insert(temp_attackers_cluster.begin(), temp_attackers_cluster.end());
|
||||
power_level -= neighbor->get_offense();
|
||||
is_neighbor = true;
|
||||
}
|
||||
else if (*(neighbor->get_owner()) == *(field->get_owner())) // attacked player
|
||||
{
|
||||
power_level += neighbor->get_defense();
|
||||
}
|
||||
// else: ignore, field / player not part of the fight (e.g. default player)
|
||||
}
|
||||
Resource costs = {(Uint32) std::abs(power_level), (Uint32) std::abs(power_level), (Uint32) std::abs(power_level)};
|
||||
if (power_level < 0 && is_neighbor) // attacking player has won
|
||||
if (power_level < 1 && is_neighbor) // attacking player has won
|
||||
{
|
||||
field->get_grid()->consume_resources_of_cluster(&attackers_cluster, costs);
|
||||
field->get_grid()->consume_resources_of_cluster(&defenders_cluster, costs);
|
||||
|
@ -329,7 +335,7 @@ void FieldMeta::load(SDL_Renderer *renderer, Layout *layout)
|
|||
}
|
||||
if (this->owner->get_id().is_nil())
|
||||
color = {0x77, 0x77, 0x77, 0xff};
|
||||
if (this->fighting)
|
||||
if (this->get_grid()->get_attack_marker() == this)
|
||||
color = {0x0, 0x77, 0x77, 0xff};
|
||||
filledPolygonRGBA(renderer, vx, vy, 6, color.r, color.g, color.b, 0x77);
|
||||
SDL_Color inverse;
|
||||
|
@ -435,8 +441,6 @@ void HexagonGrid::render(Renderer *renderer)
|
|||
|
||||
void HexagonGrid::handle_event(SDL_Event *event)
|
||||
{
|
||||
Player *attacking;
|
||||
Player *owner;
|
||||
SDL_Point mouse = {0, 0};
|
||||
SDL_GetMouseState(&mouse.x, &mouse.y);
|
||||
int scroll = this->layout->size / 10 * event->wheel.y;
|
||||
|
@ -490,30 +494,19 @@ void HexagonGrid::handle_event(SDL_Event *event)
|
|||
this->changed = true;
|
||||
break;
|
||||
case SDL_BUTTON_LEFT:
|
||||
if (this->selecting)
|
||||
if (this->placing)
|
||||
{
|
||||
trigger_event(BOB_FIELDSELECTEDEVENT, 0, (void *) this->marker, nullptr);
|
||||
this->selecting = false;
|
||||
this->placing = false;
|
||||
}
|
||||
else
|
||||
else if (this->attack_marker != nullptr && this->attack_marker == this->marker)
|
||||
{
|
||||
owner = this->marker->get_owner();
|
||||
if (*owner == *(Player::current_player))
|
||||
{
|
||||
if (this->first_attack != nullptr)
|
||||
{
|
||||
this->first_attack->set_fighting(false);
|
||||
}
|
||||
this->first_attack = this->marker;
|
||||
this->first_attack->set_fighting(true);
|
||||
}
|
||||
else if (this->first_attack != nullptr)
|
||||
{
|
||||
attacking = this->first_attack->get_owner();
|
||||
attacking->fight(this->marker);
|
||||
this->first_attack->set_fighting(false);
|
||||
this->first_attack = nullptr;
|
||||
}
|
||||
Player::current_player->fight(this->attack_marker);
|
||||
this->attack_marker = nullptr;
|
||||
}
|
||||
else if (this->attack_marker == nullptr)
|
||||
{
|
||||
this->attack_marker = this->marker;
|
||||
}
|
||||
changed = true;
|
||||
break;
|
||||
|
@ -554,6 +547,8 @@ void HexagonGrid::handle_event(SDL_Event *event)
|
|||
for (auto foo : aquired)
|
||||
{
|
||||
foo->set_owner(Player::current_player);
|
||||
foo->set_defense(1);
|
||||
foo->set_offense(1);
|
||||
}
|
||||
this->changed = true;
|
||||
}
|
||||
|
@ -679,6 +674,7 @@ bool HexagonGrid::place(Player *player, FieldMeta *center)
|
|||
{
|
||||
i->set_owner(player);
|
||||
i->set_offense(1);
|
||||
i->set_defense(1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -566,7 +566,6 @@ public:
|
|||
std::default_random_engine generator;
|
||||
std::normal_distribution<double> distribution(0.0, 1.0);
|
||||
this->reproduction = distribution(generator);
|
||||
this->fighting = false;
|
||||
this->upgrades = 0;
|
||||
static std::random_device rd;
|
||||
std::mt19937 rng(rd());
|
||||
|
@ -611,15 +610,10 @@ public:
|
|||
|
||||
FieldMeta *get_neighbor(Uint8 direction);
|
||||
|
||||
bool get_fighting() { return this->fighting; }
|
||||
|
||||
void set_fighting(bool state) { this->fighting = state; }
|
||||
|
||||
double get_reproduction() { return this->reproduction; }
|
||||
|
||||
private:
|
||||
double reproduction;
|
||||
bool fighting;
|
||||
bool changed;
|
||||
const Field field;
|
||||
HexagonGrid *grid;
|
||||
|
@ -639,7 +633,7 @@ public:
|
|||
HexagonGrid(Sint16 grid_radius, Layout *layout_, Renderer *renderer_)
|
||||
: layout(layout_), radius(grid_radius), renderer(renderer_)
|
||||
{
|
||||
this->first_attack = nullptr;
|
||||
this->attack_marker = nullptr;
|
||||
this->texture = nullptr;
|
||||
this->panning = false;
|
||||
std::unordered_map<Field, FieldMeta *> fields = std::unordered_map<Field, FieldMeta *>();
|
||||
|
@ -702,12 +696,14 @@ public:
|
|||
|
||||
bool place(Player *player, FieldMeta *center);
|
||||
|
||||
void set_selecting(bool state) { this->selecting = state; }
|
||||
void set_selecting(bool state) { this->placing = state; }
|
||||
|
||||
FieldMeta *get_attack_marker() { return this->attack_marker; }
|
||||
|
||||
private:
|
||||
bool changed;
|
||||
bool selecting;
|
||||
FieldMeta *first_attack;
|
||||
bool placing;
|
||||
FieldMeta *attack_marker;
|
||||
Renderer *renderer;
|
||||
SDL_Texture *texture;
|
||||
std::unordered_map<Field, FieldMeta *> fields;
|
||||
|
|
|
@ -100,6 +100,7 @@ void FieldBox::update()
|
|||
Resource field_resources = this->field->get_resources();
|
||||
std::ostringstream output;
|
||||
output << this->field->get_owner()->get_name() << "\n"
|
||||
<< "off " << this->field->get_offense() << "\ndef " << this->field->get_defense() << "\n"
|
||||
<< "● " << (int) cluster_resources.circle << " (" << (int) field_resources.circle << ")" << "\n"
|
||||
<< "▲ " << (int) cluster_resources.triangle << " (" << (int) field_resources.triangle << ")" << "\n"
|
||||
<< "■ " << (int) cluster_resources.square << " (" << (int) field_resources.square << ")" << "\n";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue