Skip to content

Instantly share code, notes, and snippets.

@Langerz82
Created November 20, 2019 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Langerz82/901e0b977caec1e4080819f4f7be08ad to your computer and use it in GitHub Desktop.
Save Langerz82/901e0b977caec1e4080819f4f7be08ad to your computer and use it in GitHub Desktop.
diff --git a/gamefilesd/level/afterLevelLoad.json b/gamefilesd/level/afterLevelLoad.json
index 1b694b6..4ea1661 100755
--- a/gamefilesd/level/afterLevelLoad.json
+++ b/gamefilesd/level/afterLevelLoad.json
@@ -30,5 +30,12 @@
"then": { "name": "audio.stop", "id": "main" },
"else": { "name": "audio.play", "id": "main" }
}
- ]
+ ],
+ "event": {
+ "id": "updateAllPlayerStatsTime",
+ "action": [
+ "updateAllPlayerStats"
+ ],
+ "time": 0.05
+ }
}
\ No newline at end of file
diff --git a/gamefilesd/level/map/town/level.json b/gamefilesd/level/map/town/level.json
index 13cc623..b97db10 100755
--- a/gamefilesd/level/map/town/level.json
+++ b/gamefilesd/level/map/town/level.json
@@ -6,6 +6,7 @@
"load": "level/default/town.json",
"load": "res/towners/actions.json",
"load": "level/map/town/levelObjects.json",
+ "load": "level/map/town/monsters.json",
"load": "level/map/town/players.json",
"load": "level/map/town/level2.json",
"load": "level/map/town/levelPassages.json",
diff --git a/gamefilesd/level/map/town/level2.json b/gamefilesd/level/map/town/level2.json
index 9ac3508..d3a9782 100755
--- a/gamefilesd/level/map/town/level2.json
+++ b/gamefilesd/level/map/town/level2.json
@@ -3,6 +3,7 @@
"load": ["level/player/%charClass%/defaults.json", "%charName%"],
"load": "level/map/town/levelObjects2.json",
"load": "level/map/town/items.json",
+ "load": "level/map/town/monsters2.json",
"load": "level/map/town/players2.json",
"load": "level/map/town/quests.json",
"action": {
diff --git a/src/Game/GameProperties.h b/src/Game/GameProperties.h
index 604049b..c53f3eb 100755
--- a/src/Game/GameProperties.h
+++ b/src/Game/GameProperties.h
@@ -10,9 +10,10 @@ struct AnimationSpeed
{
sf::Time animation;
sf::Time walk;
+ sf::Time attack;
- AnimationSpeed() noexcept : animation(sf::microseconds(200000)), walk(sf::microseconds(40000)) {}
- AnimationSpeed(sf::Time animation_, sf::Time walk_) noexcept : animation(animation_), walk(walk_) {}
+ AnimationSpeed() noexcept : animation(sf::microseconds(200000)), walk(sf::microseconds(40000)), attack(sf::microseconds(1000000)) {}
+ AnimationSpeed(sf::Time animation_, sf::Time walk_, sf::Time attack_) noexcept : animation(animation_), walk(walk_), attack(attack_) {}
};
enum class InventoryPosition : uint32_t
diff --git a/src/Game/Player.cpp b/src/Game/Player.cpp
index 8309cdc..742efc1 100755
--- a/src/Game/Player.cpp
+++ b/src/Game/Player.cpp
@@ -13,6 +13,7 @@ Player::Player(const PlayerClass* class__, const Level& level) : LevelObject(cla
sprite.setOutline(class__->Outline(), class__->OutlineIgnore());
calculateRange();
applyDefaults(level);
+ lastAttackTime = sf::Time::Zero;
}
void Player::calculateRange()
@@ -315,10 +316,17 @@ void Player::updateAI(Level& level)
default:
break;
}
+
auto plr = level.getCurrentPlayer();
if (plr != nullptr)
{
+ setTarget(plr);
setWalkPath(level.Map().getPath(mapPosition, plr->MapPosition()), false);
+ float dist = abs(mapPosition.x - plr->MapPosition().x) + abs(mapPosition.y - plr->MapPosition().y);
+ if (dist <= 1.0f) {
+ setStatus(PlayerStatus::Attack);
+ }
+
}
}
@@ -331,6 +339,47 @@ void Player::updateWalk(Game& game, Level& level)
void Player::updateAttack(Game& game, Level& level)
{
updateAnimation(game);
+
+ sf::Time elapsedTime = game.getTotalElapsedTime();
+
+ if ((elapsedTime - lastAttackTime) < speed.attack)
+ return;
+
+ lastAttackTime = elapsedTime;
+
+ if (isAI())
+ {
+ auto plr = getTarget();
+ if (plr != nullptr)
+ {
+ auto toHit = Class()->getActualToHit(*this, 0);
+ bool hasHit = (rand() % 100) <= toHit;
+ if (hasHit)
+ {
+ auto damage = Class()->getActualDamage(*this, 0);
+ plr->LifeDamage(plr->lifeDamage + damage);
+
+ setAnimation(PlayerAnimation::Attack1);
+ }
+ }
+ }
+ else
+ {
+ auto plr = level.getPlayerOrCurrent(level.getClickedObject()->getId());
+ if (plr != nullptr)
+ {
+ auto toHit = Class()->getActualToHit(*this, 0);
+ bool hasHit = (rand() % 100) <= toHit;
+ if (hasHit)
+ {
+ auto damage = Class()->getActualDamage(*this, 0);
+ plr->LifeDamage(plr->lifeDamage + damage);
+
+ setAnimation(PlayerAnimation::Attack1);
+ }
+ }
+ }
+
}
void Player::updateDead(Game& game, Level& level)
diff --git a/src/Game/Player.h b/src/Game/Player.h
index 5c0b82c..6a51b7c 100755
--- a/src/Game/Player.h
+++ b/src/Game/Player.h
@@ -34,13 +34,16 @@ private:
size_t textureIdx{ 0 };
AnimationSpeed speed;
- AnimationSpeed defaultSpeed{ sf::Time::Zero, sf::Time::Zero };
+ AnimationSpeed defaultSpeed{ sf::Time::Zero, sf::Time::Zero, sf::Time::Zero };
sf::Time currentWalkTime;
+ sf::Time lastAttackTime;
+
bool useAI{ false };
std::shared_ptr<Item> selectedItem;
const SpellInstance* selectedSpell{ nullptr };
+ Player* targetPlayer;
Inventories<(size_t)PlayerInventory::Size> inventories;
size_t bodyInventoryIdx{ (size_t)PlayerInventory::Size };
@@ -225,6 +228,9 @@ public:
void SelectedSpell(const std::string& id) noexcept;
+ Player* getTarget() { return targetPlayer; }
+ void setTarget(Player* player) { targetPlayer = player; }
+
Inventory& getInventory(PlayerInventory inv) noexcept { return inventories[(size_t)inv]; }
const Inventory& getInventory(PlayerInventory inv) const noexcept { return inventories[(size_t)inv]; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment