private bool MimanPathfindToTargetRoom() { #if PROFILE Stopwatch sw = new Stopwatch(); sw.Start(); #endif Ting start = _character; Ting goal = null; if (_character.finalTargetTing != null) { goal = _character.finalTargetTing; } else { // HACK!!! // Since there is no specific ting to pathfind to we just grab one in the final room where we want to go // The final target position will not be affected since we have no final target ting string finalRoomName = _character.finalTargetPosition.roomName; if (finalRoomName == WorldCoordinate.UNDEFINED_ROOM) { #if LOG s_logger.Log("No finalTargetTing and no final target position"); #endif return(false); } Ting targetTing = null; var tingsInFinalRoom = _tingRunner.GetTingsInRoom(finalRoomName); if (tingsInFinalRoom.Length == 0) { D.Log(_character + ": No tings in final room " + finalRoomName + ", can't do room pathfinding to there!"); return(false); } else { targetTing = tingsInFinalRoom[0]; } goal = targetTing; //throw new Exception("No ting to pathfind to for " + _character.name); } if (start == null) { #if LOG s_logger.Log("start is null"); #endif return(false); } if (goal == null) { #if LOG s_logger.Log("goal is null"); #endif return(false); } _mimanPath = _mimanPathFinder.Search(start, goal); #if LOG s_logger.Log(_mimanPath.ToString()); #endif //D.Log(_character + " did pathfinding between rooms: " + _mimanPath.ToString()); #if PROFILE sw.Stop(); if (sw.Elapsed.TotalSeconds > 0.015f) { D.Log("MimanRoomPathFinding for " + _character + " from " + start + "(" + start.position + ")" + " to " + goal + "(" + goal.position + ")" + " took " + sw.Elapsed.TotalSeconds + " s. Status = " + _mimanPath.ToString()); } #endif if (_mimanPath.status == MimanPathStatus.FOUND_GOAL) { if (_mimanPath.tings == null) { throw new Exception("tings == null in _mimanPath!"); } else if (_mimanPath.tings.Length == 0) { throw new Exception("No tings in _mimanPath!"); } else { #if LOG s_logger.Log("Setting " + _character.name + "'s targetPositionInRoom to " + _mimanPath.tings[0].name + "'s interaction point"); #endif var firstTingToInteractWith = _mimanPath.tings[0]; D.isNull(firstTingToInteractWith, "firstTingToInteractWith is null"); _character.targetPositionInRoom = new WorldCoordinate(firstTingToInteractWith.room.name, firstTingToInteractWith.interactionPoints[0]); return(true); } } else if (_mimanPath.status == MimanPathStatus.IN_THE_SAME_ROOM_ALREADY) { return(true); } else if (_mimanPath.status == MimanPathStatus.NO_PATH_FOUND) { #if LOG s_logger.Log("Can't find path through rooms, cancels walking."); #endif _character.CancelWalking(); return(false); } else { throw new Exception("Failed to find matching case"); } }
private bool MimanPathfindToTargetRoom() { #if PROFILE Stopwatch sw = new Stopwatch(); sw.Start(); #endif Ting start = _character; Ting goal = null; if (_character.finalTargetTing != null) { goal = _character.finalTargetTing; } else { // HACK!!! // Since there is no specific ting to pathfind to we just grab one in the final room where we want to go // The final target position will not be affected since we have no final target ting string finalRoomName = _character.finalTargetPosition.roomName; if(finalRoomName == WorldCoordinate.UNDEFINED_ROOM) { #if LOG s_logger.Log("No finalTargetTing and no final target position"); #endif return false; } Ting targetTing = null; var tingsInFinalRoom = _tingRunner.GetTingsInRoom(finalRoomName); if (tingsInFinalRoom.Length == 0) { D.Log(_character + ": No tings in final room " + finalRoomName + ", can't do room pathfinding to there!"); return false; } else { targetTing = tingsInFinalRoom[0]; } goal = targetTing; //throw new Exception("No ting to pathfind to for " + _character.name); } if(start == null) { #if LOG s_logger.Log("start is null"); #endif return false; } if(goal == null) { #if LOG s_logger.Log("goal is null"); #endif return false; } _mimanPath = _mimanPathFinder.Search(start, goal); #if LOG s_logger.Log(_mimanPath.ToString()); #endif //D.Log(_character + " did pathfinding between rooms: " + _mimanPath.ToString()); #if PROFILE sw.Stop(); if(sw.Elapsed.TotalSeconds > 0.015f) { D.Log("MimanRoomPathFinding for " + _character + " from " + start + "(" + start.position + ")" + " to " + goal + "(" + goal.position + ")" + " took " + sw.Elapsed.TotalSeconds + " s. Status = " + _mimanPath.ToString()); } #endif if (_mimanPath.status == MimanPathStatus.FOUND_GOAL) { if(_mimanPath.tings == null) { throw new Exception("tings == null in _mimanPath!"); } else if(_mimanPath.tings.Length == 0) { throw new Exception("No tings in _mimanPath!"); } else { #if LOG s_logger.Log("Setting " + _character.name + "'s targetPositionInRoom to " + _mimanPath.tings[0].name + "'s interaction point"); #endif var firstTingToInteractWith = _mimanPath.tings[0]; D.isNull(firstTingToInteractWith, "firstTingToInteractWith is null"); _character.targetPositionInRoom = new WorldCoordinate(firstTingToInteractWith.room.name, firstTingToInteractWith.interactionPoints[0]); return true; } } else if (_mimanPath.status == MimanPathStatus.IN_THE_SAME_ROOM_ALREADY) { return true; } else if (_mimanPath.status == MimanPathStatus.NO_PATH_FOUND) { #if LOG s_logger.Log("Can't find path through rooms, cancels walking."); #endif _character.CancelWalking(); return false; } else { throw new Exception("Failed to find matching case"); } }