Skip to content

Commit

Permalink
PlacedWeapons can be activated when player is nearby
Browse files Browse the repository at this point in the history
  • Loading branch information
jul3x committed Mar 2, 2022
1 parent 8083d33 commit 25b3042
Show file tree
Hide file tree
Showing 16 changed files with 199 additions and 41 deletions.
51 changes: 51 additions & 0 deletions common/include/common/misc/ActivationArea.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//
// Created by jul3x on 02.03.2022.
//

#ifndef RAG3_COMMON_INCLUDE_COMMON_ACTIVATIONAREA_H
#define RAG3_COMMON_INCLUDE_COMMON_ACTIVATIONAREA_H

#include <R3E/objects/AbstractPhysicalObject.h>


using namespace r3e;

class PlacedWeapon;

class ActivationArea : public HoveringObject {
public:
ActivationArea(PlacedWeapon* father, float r) :
father_(father),
HoveringObject({}, {}, {r, r}, collision::Circle(r), nullptr, 0, 0, 0.0f, 0.0f),
is_active_(false)
{

}

PlacedWeapon* getFather() const
{
return father_;
}

bool isActive() const
{
return is_active_;
}

void setActive(bool active)
{
is_active_ = active;
}

private:
void draw(sf::RenderTarget& target, sf::RenderStates states) const override
{

}

PlacedWeapon* father_;
bool is_active_;

};

#endif //RAG3_COMMON_INCLUDE_COMMON_ACTIVATIONAREA_H
15 changes: 15 additions & 0 deletions common/include/common/objects/PlacedWeapon.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,16 @@

#include <R3E/objects/Unique.h>

#include <common/misc/ActivationArea.h>
#include <common/weapons/ShootingWeapon.h>


class PlacedWeapon : public ShootingWeapon, public Unique {
public:
static constexpr std::array<std::string_view, 6> ACTIVATIONS = {
"Const", "Interrupted", "Single", "NearConst", "NearInterrupted", "NearSingle"
};

PlacedWeapon(const sf::Vector2f& position, float direction, const std::string& id, int u_id = -1);

PlacedWeapon(const sf::Vector2f& position, float direction, const std::string& id, const std::string& usage,
Expand All @@ -24,6 +29,7 @@ class PlacedWeapon : public ShootingWeapon, public Unique {
[[nodiscard]] float getData() const;
[[nodiscard]] const std::string& getUsageStr() const;
[[nodiscard]] bool getActive() const;
[[nodiscard]] ActivationArea* getActivationArea() const;

void setUsageStr(const std::string& str);
void setData(float data);
Expand All @@ -35,13 +41,22 @@ class PlacedWeapon : public ShootingWeapon, public Unique {
void constUse(float time_elapsed);
void singleUse(float time_elapsed);
void interruptedUse(float time_elapsed);
void nearConstUse(float time_elapsed);
void nearSingleUse(float time_elapsed);
void nearInterruptedUse(float time_elapsed);

static constexpr std::array<void (PlacedWeapon::*)(float), ACTIVATIONS.size()> FUNCTIONS =
{&PlacedWeapon::constUse, &PlacedWeapon::singleUse, &PlacedWeapon::interruptedUse,
&PlacedWeapon::nearConstUse, &PlacedWeapon::nearSingleUse, &PlacedWeapon::nearInterruptedUse};

std::function<void(float)> usage_func_;
float time_elapsed_;
float data_;
bool active_;
std::string usage_str_;

std::unique_ptr<ActivationArea> activation_area_;

};


Expand Down
18 changes: 18 additions & 0 deletions common/src/common/Framework.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,18 @@ void Framework::alertCollision(HoveringObject* h_obj, DynamicObject* d_obj)
}
return;
}

auto activation_area = dynamic_cast<ActivationArea*>(h_obj);
if (activation_area != nullptr && character != nullptr)
{
auto player = dynamic_cast<Player*>(d_obj);
if (player != nullptr)
{
activation_area->setActive(true);
activation_area->getFather()->setActive(true);
}
return;
}
}

void Framework::alertCollision(DynamicObject* d_obj, StaticObject* s_obj)
Expand Down Expand Up @@ -1215,6 +1227,12 @@ void Framework::initWeapons()
{
auto func = this->getSpawningFunction(RMGET<std::string>("weapons", weapon->getId(), "spawn_func"));
weapon->registerSpawningFunction(std::get<0>(func), std::get<1>(func));

auto activation_area = weapon->getActivationArea();
if (activation_area != nullptr)
{
engine_->registerObj<HoveringObject>(activation_area);
}
}
}

Expand Down
91 changes: 66 additions & 25 deletions common/src/common/objects/PlacedWeapon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,19 @@ PlacedWeapon::PlacedWeapon(const sf::Vector2f& position, float direction, const
this->setPosition(position, {});
this->setRotation(direction);

if (usage == "Const")
{
usage_func_ = std::bind(&PlacedWeapon::constUse, this, std::placeholders::_1);
}
else if (usage == "Single")
{
usage_func_ = std::bind(&PlacedWeapon::singleUse, this, std::placeholders::_1);
}
else if (usage == "Interrupted")
auto function_index = std::find(ACTIVATIONS.begin(), ACTIVATIONS.end(), usage);

if (function_index != ACTIVATIONS.end())
{
usage_func_ = std::bind(&PlacedWeapon::interruptedUse, this, std::placeholders::_1);
usage_func_ = std::bind(FUNCTIONS.at(std::distance(ACTIVATIONS.begin(), function_index)), this,
std::placeholders::_1);

if (utils::startsWith(usage, "Near"))
{
activation_area_ =
std::make_unique<ActivationArea>(this, RMGET<float>("weapons", id, "activation_area_radius"));
activation_area_->setPosition(this->getPosition());
}
}
else
{
Expand All @@ -52,8 +54,13 @@ void PlacedWeapon::update(float time_elapsed)
this->setState(1.0f); // never ending ammo
AbstractWeapon::update(time_elapsed);

if (active_)
usage_func_(time_elapsed);
usage_func_(time_elapsed);

if (activation_area_ != nullptr)
{
activation_area_->setActive(false);
active_ = false;
}
}

float PlacedWeapon::getData() const
Expand Down Expand Up @@ -88,30 +95,64 @@ bool PlacedWeapon::getActive() const

void PlacedWeapon::constUse(float time_elapsed)
{
use();
if (active_)
use();
}

void PlacedWeapon::singleUse(float time_elapsed)
{
time_elapsed_ += time_elapsed;
if (active_)
{
time_elapsed_ += time_elapsed;

if (time_elapsed_ >= data_)
time_elapsed_ = data_;
else
use();
if (time_elapsed_ >= data_)
time_elapsed_ = data_;
else
use();
}
}

void PlacedWeapon::interruptedUse(float time_elapsed)
{
time_elapsed_ += time_elapsed;

if (time_elapsed_ >= 2 * data_)
time_elapsed_ = 0.0f;
else if (time_elapsed_ >= data_)
if (active_)
{
// nothing
time_elapsed_ += time_elapsed;

if (time_elapsed_ >= 2 * data_)
time_elapsed_ = 0.0f;
else if (time_elapsed_ >= data_)
{
// nothing
}
else
use();
}
}

void PlacedWeapon::nearConstUse(float time_elapsed)
{
if (activation_area_->isActive())
constUse(time_elapsed);
}

void PlacedWeapon::nearSingleUse(float time_elapsed)
{
if (activation_area_->isActive())
singleUse(time_elapsed);
else
use();
time_elapsed_ = 0.0f;
}

void PlacedWeapon::nearInterruptedUse(float time_elapsed)
{
if (activation_area_->isActive())
interruptedUse(time_elapsed);
else
time_elapsed_ = 0.0f;
}

ActivationArea* PlacedWeapon::getActivationArea() const
{
return activation_area_.get();
}

4 changes: 3 additions & 1 deletion data/weapons/chaingun.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/desert_eagle.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/enemy_chaingun.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/enemy_pistol.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/enemy_shotgun.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/flamethrower.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
2 changes: 1 addition & 1 deletion data/weapons/melee_axe.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ vector area_offset=(-10.0, -20.0)
float range=30.0
float activate_time_elapsed=0.32

int z_index=1
int z_index=1
4 changes: 3 additions & 1 deletion data/weapons/rocket_launcher.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.1
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
4 changes: 3 additions & 1 deletion data/weapons/shotgun.j3x
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ float frame_duration=0.0
int z_index=1

string default_usage="Const"
float default_data=0.0
float default_data=0.0

float activation_area_radius=100.0
3 changes: 2 additions & 1 deletion editor/include/editor/WeaponWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ namespace editor {
tgui::Button::Ptr button_;

tgui::EditBox::Ptr id_box_;
tgui::TextBox::Ptr fun_box_, data_box_;
tgui::ComboBox::Ptr fun_box_;
tgui::TextBox::Ptr data_box_;

};

Expand Down
Loading

0 comments on commit 25b3042

Please sign in to comment.