uint16 Map::RunOver(uint8 x, uint8 y, bool memonly, Creature *c, int32 dangerFactor, bool Incor, bool Meld) { if (!Incor && SolidAt(x,y)) { if (Meld) { int i = TTER(PTerrainAt(x,y,c))->Material; if (i == MAT_GRANITE || i == MAT_MAGMA || i == MAT_QUARTZ || i == MAT_GEMSTONE || i == MAT_MINERAL) ; // we can walk here else return 0; } else return 0; } if (memonly && !At(x,y).Memory) return 0; if (At(x,y).Contents) { Creature *ca; Trap *tr; Door *dr; for (ca=FCreatureAt(x,y);ca;ca=NCreatureAt(x,y)) if (ca && c->Percieves(ca) && ca->isHostileTo(c)) return 0; for (tr=FTrapAt(x,y);tr;tr=NTrapAt(x,y)) { if (tr->TrapFlags & TS_FOUND) if (!(tr->TrapFlags & TS_DISARMED)) { if (dangerFactor & DF_IGNORE_TRAPS) return (sizeX * 3) + (tr->TrapLevel() * 10); else return 0; } } for (dr=FDoorAt(x,y);dr;dr=NDoorAt(x,y)) if (!(dr->DoorFlags & DF_OPEN)) return 0; } rID stickyID = StickyAt(x,y); if (stickyID && !c->HasStati(STUCK) && !c->HasMFlag(M_AMORPH) && !c->isAerial() && c->onPlane() == PHASE_MATERIAL && c->ResistLevel(AD_STUK) != -1 && !c->HasAbility(CA_WOODLAND_STRIDE)) { if (dangerFactor & DF_IGNORE_TERRAIN) return (sizeX * 3); else return 0; } Feature * f; for (f=FFeatureAt(x,y);f;f=NFeatureAt(x,y)) if (TFEAT(f->fID)->PEvent(EV_MON_CONSIDER,c,f,f->fID) == ABORT) { if (dangerFactor & DF_IGNORE_TERRAIN) return (sizeX * 3); else return 0; } if (At(x,y).Terrain) { rID t = PTerrainAt(x,y,c); if (TTER(t)->HasFlag(TF_WARN)) { if (TTER(t)->PEvent(EV_MON_CONSIDER,c,t) == ABORT) { if (dangerFactor & DF_IGNORE_TERRAIN) return (sizeX * 3); else return 0; } } if (TTER(t)->MoveMod) return 4; else return 2; } return 2; }