Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/combat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -609,9 +609,9 @@ void Combat::doCombat(const std::shared_ptr<Creature>& caster, const std::shared
if (params.origin != ORIGIN_MELEE) {
for (const auto& condition : params.conditionList) {
if (caster == target || !target->isImmune(condition->getType())) {
Condition* conditionCopy = condition->clone();
auto conditionCopy = condition->clone();
conditionCopy->setParam(CONDITION_PARAM_OWNER, caster->getID());
target->addCombatCondition(conditionCopy);
target->addCombatCondition(std::move(conditionCopy));
}
}
}
Expand Down Expand Up @@ -693,13 +693,13 @@ void Combat::doCombat(const std::shared_ptr<Creature>& caster, const Position& p
(caster != creature && Combat::canDoCombat(caster, creature) == RETURNVALUE_NOERROR)) {
for (const auto& condition : params.conditionList) {
if (caster == creature || !creature->isImmune(condition->getType())) {
Condition* conditionCopy = condition->clone();
auto conditionCopy = condition->clone();
if (caster) {
conditionCopy->setParam(CONDITION_PARAM_OWNER, caster->getID());
}

// TODO: infight condition until all aggressive conditions has ended
creature->addCombatCondition(conditionCopy);
creature->addCombatCondition(std::move(conditionCopy));
}
}
}
Expand Down Expand Up @@ -767,13 +767,13 @@ void Combat::doTargetCombat(const std::shared_ptr<Creature>& caster, const std::
if (damage.blockType == BLOCK_NONE || damage.blockType == BLOCK_ARMOR) {
for (const auto& condition : params.conditionList) {
if (caster == target || !target->isImmune(condition->getType())) {
Condition* conditionCopy = condition->clone();
auto conditionCopy = condition->clone();
if (caster) {
conditionCopy->setParam(CONDITION_PARAM_OWNER, caster->getID());
}

// TODO: infight condition until all aggressive conditions has ended
target->addCombatCondition(conditionCopy);
target->addCombatCondition(std::move(conditionCopy));
}
}
}
Expand Down Expand Up @@ -935,13 +935,13 @@ void Combat::doAreaCombat(const std::shared_ptr<Creature>& caster, const Positio
if (damage.blockType == BLOCK_NONE || damage.blockType == BLOCK_ARMOR) {
for (const auto& condition : params.conditionList) {
if (caster == creature || !creature->isImmune(condition->getType())) {
Condition* conditionCopy = condition->clone();
auto conditionCopy = condition->clone();
if (caster) {
conditionCopy->setParam(CONDITION_PARAM_OWNER, caster->getID());
}

// TODO: infight condition until all aggressive conditions has ended
creature->addCombatCondition(conditionCopy);
creature->addCombatCondition(std::move(conditionCopy));
}
}
}
Expand Down Expand Up @@ -1334,7 +1334,7 @@ void MagicField::onStepInField(const std::shared_ptr<Creature>& creature)
}

if (const ItemType& it = items[getID()]; it.conditionDamage) {
Condition* conditionCopy = it.conditionDamage->clone();
auto conditionCopy = it.conditionDamage->clone();

if (uint32_t ownerId = getOwner()) {
bool harmfulField = true;
Expand All @@ -1360,6 +1360,6 @@ void MagicField::onStepInField(const std::shared_ptr<Creature>& creature)
}
}

creature->addCondition(conditionCopy);
creature->addCondition(std::move(conditionCopy));
}
}
2 changes: 1 addition & 1 deletion src/combat.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class Combat

void setArea(AreaCombat* area);
bool hasArea() const { return area != nullptr; }
void addCondition(const Condition* condition) { params.conditionList.emplace_back(condition); }
void addCondition(std::unique_ptr<Condition> condition) { params.conditionList.emplace_back(std::move(condition)); }
void clearConditions() { params.conditionList.clear(); }
void setPlayerCombatValues(formulaType_t formulaType, double mina, double minb, double maxa, double maxb);
void postCombatEffects(const std::shared_ptr<Creature>& caster, const Position& pos) const
Expand Down
36 changes: 19 additions & 17 deletions src/condition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,9 @@ bool Condition::executeCondition(const std::shared_ptr<Creature>&, int32_t inter
return getEndTime() >= OTSYS_TIME();
}

Condition* Condition::createCondition(ConditionId_t id, ConditionType_t type, int32_t ticks, int32_t param /* = 0*/,
bool buff /* = false*/, uint32_t subId /* = 0*/, bool aggressive /* = false */)
std::unique_ptr<Condition> Condition::createCondition(ConditionId_t id, ConditionType_t type, int32_t ticks,
int32_t param /* = 0*/, bool buff /* = false*/,
uint32_t subId /* = 0*/, bool aggressive /* = false */)
{
switch (type) {
case CONDITION_POISON:
Expand All @@ -176,38 +177,39 @@ Condition* Condition::createCondition(ConditionId_t id, ConditionType_t type, in
case CONDITION_DAZZLED:
case CONDITION_CURSED:
case CONDITION_BLEEDING:
return new ConditionDamage(id, type, buff, subId, aggressive);
return std::make_unique<ConditionDamage>(id, type, buff, subId, aggressive);

case CONDITION_HASTE:
case CONDITION_PARALYZE:
return new ConditionSpeed(id, type, ticks, buff, subId, param, aggressive);
return std::make_unique<ConditionSpeed>(id, type, ticks, buff, subId, param, aggressive);

case CONDITION_INVISIBLE:
return new ConditionInvisible(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionInvisible>(id, type, ticks, buff, subId, aggressive);

case CONDITION_OUTFIT:
return new ConditionOutfit(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionOutfit>(id, type, ticks, buff, subId, aggressive);

case CONDITION_LIGHT:
return new ConditionLight(id, type, ticks, buff, subId, param & 0xFF, (param & 0xFF00) >> 8, aggressive);
return std::make_unique<ConditionLight>(id, type, ticks, buff, subId, param & 0xFF, (param & 0xFF00) >> 8,
aggressive);

case CONDITION_REGENERATION:
return new ConditionRegeneration(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionRegeneration>(id, type, ticks, buff, subId, aggressive);

case CONDITION_SOUL:
return new ConditionSoul(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionSoul>(id, type, ticks, buff, subId, aggressive);

case CONDITION_ATTRIBUTES:
return new ConditionAttributes(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionAttributes>(id, type, ticks, buff, subId, aggressive);

case CONDITION_SPELLCOOLDOWN:
return new ConditionSpellCooldown(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionSpellCooldown>(id, type, ticks, buff, subId, aggressive);

case CONDITION_SPELLGROUPCOOLDOWN:
return new ConditionSpellGroupCooldown(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionSpellGroupCooldown>(id, type, ticks, buff, subId, aggressive);

case CONDITION_DRUNK:
return new ConditionDrunk(id, type, ticks, buff, subId, param, aggressive);
return std::make_unique<ConditionDrunk>(id, type, ticks, buff, subId, param, aggressive);

case CONDITION_INFIGHT:
case CONDITION_EXHAUST_WEAPON:
Expand All @@ -218,18 +220,18 @@ Condition* Condition::createCondition(ConditionId_t id, ConditionType_t type, in
case CONDITION_YELLTICKS:
case CONDITION_PACIFIED:
case CONDITION_MANASHIELD:
return new ConditionGeneric(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionGeneric>(id, type, ticks, buff, subId, aggressive);
case CONDITION_ROOT:
return new ConditionGeneric(id, type, ticks, buff, subId, aggressive);
return std::make_unique<ConditionGeneric>(id, type, ticks, buff, subId, aggressive);
case CONDITION_MANASHIELD_BREAKABLE:
return new ConditionManaShield(id, type, ticks, buff, subId);
return std::make_unique<ConditionManaShield>(id, type, ticks, buff, subId);

default:
return nullptr;
}
}

Condition* Condition::createCondition(PropStream& propStream)
std::unique_ptr<Condition> Condition::createCondition(PropStream& propStream)
{
uint8_t attr;
if (!propStream.read<uint8_t>(attr) || attr != CONDITIONATTR_TYPE) {
Expand Down
35 changes: 18 additions & 17 deletions src/condition.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,17 +81,18 @@ class Condition
ConditionId_t getId() const { return id; }
uint32_t getSubId() const { return subId; }

virtual Condition* clone() const = 0;
virtual std::unique_ptr<Condition> clone() const = 0;

ConditionType_t getType() const { return conditionType; }
int64_t getEndTime() const { return endTime; }
int32_t getTicks() const { return ticks; }
void setTicks(int32_t newTicks);
bool isAggressive() const { return aggressive; }

static Condition* createCondition(ConditionId_t id, ConditionType_t type, int32_t ticks, int32_t param = 0,
bool buff = false, uint32_t subId = 0, bool aggressive = false);
static Condition* createCondition(PropStream& propStream);
static std::unique_ptr<Condition> createCondition(ConditionId_t id, ConditionType_t type, int32_t ticks,
int32_t param = 0, bool buff = false, uint32_t subId = 0,
bool aggressive = false);
static std::unique_ptr<Condition> createCondition(PropStream& propStream);

virtual bool setParam(ConditionParam_t param, int32_t value);
virtual int32_t getParam(ConditionParam_t param);
Expand Down Expand Up @@ -131,7 +132,7 @@ class ConditionGeneric : public Condition
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;
uint32_t getIcons() const override;

ConditionGeneric* clone() const override { return new ConditionGeneric(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionGeneric>(*this); }
};

class ConditionAttributes final : public ConditionGeneric
Expand All @@ -150,7 +151,7 @@ class ConditionAttributes final : public ConditionGeneric
bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;

ConditionAttributes* clone() const override { return new ConditionAttributes(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionAttributes>(*this); }

// serialization
void serialize(PropWriteStream& propWriteStream) override;
Expand Down Expand Up @@ -188,7 +189,7 @@ class ConditionRegeneration final : public ConditionGeneric
bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;

ConditionRegeneration* clone() const override { return new ConditionRegeneration(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionRegeneration>(*this); }

// serialization
void serialize(PropWriteStream& propWriteStream) override;
Expand Down Expand Up @@ -218,7 +219,7 @@ class ConditionSoul final : public ConditionGeneric
bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;

ConditionSoul* clone() const override { return new ConditionSoul(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionSoul>(*this); }

// serialization
void serialize(PropWriteStream& propWriteStream) override;
Expand All @@ -241,7 +242,7 @@ class ConditionInvisible final : public ConditionGeneric
bool startCondition(const std::shared_ptr<Creature>& creature) override;
void endCondition(const std::shared_ptr<Creature>& creature) override;

ConditionInvisible* clone() const override { return new ConditionInvisible(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionInvisible>(*this); }
};

class ConditionDamage final : public Condition
Expand All @@ -261,7 +262,7 @@ class ConditionDamage final : public Condition
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;
uint32_t getIcons() const override;

ConditionDamage* clone() const override { return new ConditionDamage(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionDamage>(*this); }

bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;
Expand Down Expand Up @@ -314,7 +315,7 @@ class ConditionSpeed final : public Condition
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;
uint32_t getIcons() const override;

ConditionSpeed* clone() const override { return new ConditionSpeed(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionSpeed>(*this); }

bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;
Expand Down Expand Up @@ -348,7 +349,7 @@ class ConditionOutfit final : public Condition
void endCondition(const std::shared_ptr<Creature>& creature) override;
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;

ConditionOutfit* clone() const override { return new ConditionOutfit(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionOutfit>(*this); }

void setOutfit(const Outfit_t& outfit);

Expand All @@ -373,7 +374,7 @@ class ConditionLight final : public Condition
void endCondition(const std::shared_ptr<Creature>& creature) override;
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;

ConditionLight* clone() const override { return new ConditionLight(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionLight>(*this); }

bool setParam(ConditionParam_t param, int32_t value) override;
int32_t getParam(ConditionParam_t param) override;
Expand All @@ -399,7 +400,7 @@ class ConditionSpellCooldown final : public ConditionGeneric
bool startCondition(const std::shared_ptr<Creature>& creature) override;
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;

ConditionSpellCooldown* clone() const override { return new ConditionSpellCooldown(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionSpellCooldown>(*this); }
};

class ConditionSpellGroupCooldown final : public ConditionGeneric
Expand All @@ -413,7 +414,7 @@ class ConditionSpellGroupCooldown final : public ConditionGeneric
bool startCondition(const std::shared_ptr<Creature>& creature) override;
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;

ConditionSpellGroupCooldown* clone() const override { return new ConditionSpellGroupCooldown(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionSpellGroupCooldown>(*this); }
};

class ConditionDrunk final : public Condition
Expand All @@ -434,7 +435,7 @@ class ConditionDrunk final : public Condition
bool setParam(ConditionParam_t param, int32_t value) override;
void addCondition(const std::shared_ptr<Creature>& creature, const Condition* condition) override;

ConditionDrunk* clone() const override { return new ConditionDrunk(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionDrunk>(*this); }

private:
uint8_t drunkenness = 25;
Expand All @@ -457,7 +458,7 @@ class ConditionManaShield final : public Condition

bool setParam(ConditionParam_t param, int32_t value) override;

ConditionManaShield* clone() const override { return new ConditionManaShield(*this); }
std::unique_ptr<Condition> clone() const override { return std::make_unique<ConditionManaShield>(*this); }

// serialization
void serialize(PropWriteStream& propWriteStream) override;
Expand Down
Loading
Loading