int TasksProperty::updateTask(LocatedEntity * owner, OpVector & res) { setFlags(flag_unsent); Update update; update->setTo(owner->getId()); res.push_back(update); return 0; }
HandlerResult BurnSpeedProperty::burn_handler(LocatedEntity * e, const Operation & op, OpVector & res) { if (op->getArgs().empty()) { e->error(op, "Fire op has no argument", res, e->getId()); return OPERATION_IGNORED; } const double & burn_speed = data(); const Root & fire_ent = op->getArgs().front(); double consumed = burn_speed * fire_ent->getAttr("status").asNum(); const std::string & to = fire_ent->getId(); Anonymous nour_ent; nour_ent->setId(to); nour_ent->setAttr("mass", consumed); StatusProperty * status_prop = e->requirePropertyClass<StatusProperty>("status", 1.f); assert(status_prop != 0); status_prop->setFlags(flag_unsent); double & status = status_prop->data(); Element mass_attr; if (e->getAttrType("mass", mass_attr, Element::TYPE_FLOAT) != 0) { mass_attr = 1.f; } status -= (consumed / mass_attr.Float()); status_prop->apply(e); Update update; update->setTo(e->getId()); res.push_back(update); Nourish n; n->setTo(to); n->setArgs1(nour_ent); res.push_back(n); return OPERATION_IGNORED; }