static bool WouldCollide(const Game_Character& self, const Game_Character& other, bool self_conflict) { if (self.GetThrough() || other.GetThrough()) { return false; } if (self.IsFlying() || other.IsFlying()) { return false; } if (!self.IsActive() || !other.IsActive()) { return false; } if (self.GetType() == Game_Character::Event && other.GetType() == Game_Character::Event && (self.IsOverlapForbidden() || other.IsOverlapForbidden())) { return true; } if (other.GetLayer() == RPG::EventPage::Layers_same && self_conflict) { return true; } if (self.GetLayer() == other.GetLayer()) { return true; } return false; }
/** * Checks whether a collision occurs between self and other if self * moves from (x,y) to (new_x, new_y) in direction d. * * If other is a tile event, also indicates if the player can use it * as a "bridge" to step across without hitting the underlying tile * layer. */ static CollisionResult TestCollisionDuringMove( int x, int y, int new_x, int new_y, int d, const Game_Character& self, const Game_Event& other ) { if (!other.GetActive()) { return NoCollision; } if (&self == &other) { return NoCollision; } if (other.GetThrough()) { return NoCollision; } if (!other.IsInPosition(x, y) && !other.IsInPosition(new_x, new_y)) { return NoCollision; } if (&self != Main_Data::game_player.get()) { if (other.IsInPosition(new_x, new_y) && (self.IsOverlapForbidden() || other.IsOverlapForbidden())) { return Collision; } } if (other.IsInPosition(new_x, new_y) && self.GetLayer() == other.GetLayer()) { return Collision; } if (other.GetLayer() == RPG::EventPage::Layers_below) { int tile_id = other.GetTileId(); if ((passages_up[tile_id] & Passable::Above) != 0) { return NoCollision; } if (other.IsInPosition(x,y) && (passages_up[tile_id] & DirToMask(d)) != 0) { return CanStepOffCurrentTile; } else if (other.IsInPosition(new_x, new_y) && (passages_up[tile_id] & DirToMask(Game_Character::ReverseDir(d))) != 0) { return CanStepOntoNewTile; } else { return Collision; } } return NoCollision; }