I'm having a really weird issue in boost python. I'm focusing on a particular
property/method to simplify the example. Here's the situation:
In my program, I have a class called Attack. With the following layout
(simplified for example)
class Attack : public Action
{
public:
virtual int CalculateDamage(const std::vector<BattleCharacter*>& users,
BattleCharacter* target, const std::vector<Actions::ActionTarget>& targets,
BattleField *field);
protected:
bool Hit;
}
I exposed Attack to python, making it overridable, as follows:
struct AttackWrapper : Game::Battles::Actions::Attack
{
int AttackWrapper::CalculateDamage(const
std::vector<Game::Battles::BattleCharacter*>& users,
Game::Battles::BattleCharacter* target, const
std::vector<Actions::ActionTarget>& targets, Game::Battles::BattleField *field)
{
return call_method<int>(self, "CalculateDamage", users,
ptr(target), targets, ptr(field));
}
int AttackWrapper::CalculateDamageDefault(const
std::vector<Game::Battles::BattleCharacter*>& users,
Game::Battles::BattleCharacter* target, const
std::vector<Actions::ActionTarget>& targets, Game::Battles::BattleField *field)
{
return this->Attack::CalculateDamage(users, target, Targets, field);
}
}
And the python exposing is done as follows:
class_<Attack, AttackWrapper, boost::shared_ptr<Attack>, bases<Action>
>("Attack")
.def("CalculateDamage", &AttackWrapper::CalculateDamageDefault);
I initially thought everything was working fine, as I can override the
`CalculateDamage` method within python and have it work correctly. However,
When I want to use the normal `Attack->CalculateDamage`, the following happens:
I only call `CalculateDamage` when Hit is true, and I can confirm via break
point when I hit this line, Hit is true:
return call_method<int>(self, "CalculateDamage", users, ptr(target),
targets, ptr(field));
Now, because I haven't overriden `CalculateDamage` in Python for this attack
instance, it ends up resolving to `AttackWrapper::CalculateDamageDefault`. But
by the time I enter AttackWrapper::CalculateDamageDefault, Hit is no longer
true. That is, when I break on this line:
return this->Attack::CalculateDamage(users, target, Targets, field);
Hit is false. So somewhere between
return call_method<int>(self, "CalculateDamage", users, ptr(target),
targets, ptr(field));
resolving to
return this->Attack::CalculateDamage(users, target, Targets, field);
my property's value is lost. I have no idea what could be causing this. Has
anyone encountered something like this before?
The attacks I'm using for testing are defined as follows:
class ScriptedAttack(Attack):
def __init__(self, Type, ID, Name, Flags, Targs = ActionTargets.Any,
AllowTargettingOverride = False, Power = 0, MPCost = 0, SPCost = 0, Accuracy =
0.9, CritChance = 0.1, DefineOwnUse = False, EleWeights = None,
StatusEffectChances = None):
if (EleWeights == None and StatusEffectChances == None):
Attack.__init__(self, Type, ID, Name, Flags, Targs,
AllowTargettingOVerride, Power, MPCost, SPCost, Accuracy, CritChance,
DefineOwnUse)
else:
Elemap = ElementMap()
if (EleWeights != None):
for Element, Weight in EleWeights.iteritems():
Elemap[Element] = Weight
SEChances = SEChanceMap()
if (StatusEffectChances != None):
for StatusEffect, Chance in StatusEffectChances.iteritems():
SEChances[StatusEffect] = Chance
Attack.__init__(self, Type, ID, Name, Flags, Elemap, Targs,
AllowTargettingOverride, Power, MPCost, SPCost, Accuracy, CritChance,
DefineOwnUse, SEChances)
def Clone(self):
return copy.deepcopy(self)
Fire = ScriptedAttack(ActionType.MagicAction, PrimaryEngine.GetUID(), "Fire",
AttackFlags.Projectile | AttackFlags.Elemental, ActionTargets.Any, True, 32,
14, 0, 1.0, 0.1, False, {Elements.Fire: 1.0})
Fira = ScriptedAttack(ActionType.MagicAction, PrimaryEngine.GetUID(), "Fira",
AttackFlags.Projectile | AttackFlags.Elemental, ActionTargets.Any, True, 63,
35, 0, 1.0, 0.1, False, {Elements.Fire: 1.0})
ActLibrary.AddAttack(Fire)
ActLibrary.AddAttack(Fira)
ActLibrary.AddAttack takes in a boost::shared_ptr<Attack> and stores it into a
hash table. I lookup the attack and use the instance stored there to do
CalculateDamage.
It almost seems like the object is being copied, but I have no idea why that'd
be so.
Any help would be appreciated.
Thanks
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig