void Square::tick(double time) { dirty = true; if (!inventory.isEmpty()) for (Item* item : inventory.getItems()) { item->tick(time, level, position); if (item->isDiscarded()) inventory.removeItem(item); } poisonGas.tick(level, position); if (creature && poisonGas.getAmount() > 0.2) { creature->poisonWithGas(min(1.0, poisonGas.getAmount())); } if (fire.isBurning()) { modViewObject().setAttribute(ViewObject::Attribute::BURNING, fire.getSize()); Debug() << getName() << " burning " << fire.getSize(); for (Vec2 v : position.neighbors8(true)) if (fire.getSize() > Random.getDouble() * 40) level->getSquare(v)->setOnFire(fire.getSize() / 20); fire.tick(level, position); if (fire.isBurntOut()) { level->globalMessage(position, "The " + getName() + " burns out"); burnOut(); return; } if (creature) creature->setOnFire(fire.getSize()); for (Item* it : getItems()) it->setOnFire(fire.getSize(), level, position); for (Trigger* t : extractRefs(triggers)) t->setOnFire(fire.getSize()); } for (Trigger* t : extractRefs(triggers)) t->tick(time); tickSpecial(time); }
void Level::throwItem(vector<PItem> item, const Attack& attack, int maxDist, Vec2 position, Vec2 direction, VisionInfo visionInfo) { CHECK(!item.empty()); int cnt = 1; vector<Vec2> trajectory; for (Vec2 v = position + direction;; v += direction) { trajectory.push_back(v); if (getSquare(v)->itemBounces(item[0].get(), visionInfo)) { item[0]->onHitSquareMessage(v, getSquare(v), item.size() > 1); trajectory.pop_back(); EventListener::addThrowEvent(this, attack.getAttacker(), item[0].get(), trajectory); if (!item[0]->isDiscarded()) getSquare(v - direction)->dropItems(std::move(item)); return; } if (++cnt > maxDist || getSquare(v)->itemLands(extractRefs(item), attack)) { EventListener::addThrowEvent(this, attack.getAttacker(), item[0].get(), trajectory); getSquare(v)->onItemLands(std::move(item), attack, maxDist - cnt - 1, direction, visionInfo); return; } } }
const vector<VillageControl*> Model::getVillageControls() const { return extractRefs(villageControls); }
vector<PTrigger> Square::removeTriggers() { vector<PTrigger> ret; for (Trigger* t : extractRefs(triggers)) ret.push_back(removeTrigger(t)); return ret; }
const vector<Trigger*> Square::getTriggers() const { return extractRefs(triggers); }
void Square::onEnter(Creature* c) { dirty = true; for (Trigger* t : extractRefs(triggers)) t->onCreatureEnter(c); onEnterSpecial(c); }