public virtual bool MoveTo(int relX, int relY) { // TODO fire-eggs: isn't this all land unit logic? refactor MoveTo into BaseUnitLand? if (Movement != null) { return(false); } ITile moveTarget = Map[X, Y][relX, relY]; if (moveTarget == null) { return(false); } if (moveTarget.Units.Any(u => u.Owner != Owner)) { Goto = Point.Empty; // Cancel any goto mode if (Class == UnitClass.Land && Tile.IsOcean) // can't attack enemy unit on land when on a ship { if (Human == Owner) { GameTask.Enqueue(Message.Error("-- Civilization Note --", TextFile.Instance.GetGameText($"ERROR/AMPHIB"))); } return(false); } // Issue #84 : failure to prompt on low-strength attack if (Human == Owner && MovesLeft == 0 && PartMoves > 0) { GameTask.Enqueue(Show.WeakAttack(this, relX, relY)); return(true); } return(Confront(relX, relY)); } if (Class == UnitClass.Land && !(this is Diplomat || this is Caravan)) { if (!CanMoveTo(relX, relY)) { if (Human == Owner) { Goto = Point.Empty; // Cancel any goto mode ( maybe for AI too ?? ) GameTask.Enqueue(Message.Error("-- Civilization Note --", TextFile.Instance.GetGameText($"ERROR/ZOC"))); } return(false); } } // fire-eggs Caravan needs to be able to move into owner city if (moveTarget.City != null && (moveTarget.City.Owner != Owner || this is Caravan)) { return(Confront(relX, relY)); } if (!MoveTargets.Any(t => t.X == moveTarget.X && t.Y == moveTarget.Y)) { // Target tile is invalid // TODO: For some tiles, display a message detailing why the move is illegal return(false); } // TODO: This implementation was done by observation, may need a revision if ((moveTarget.Road || moveTarget.RailRoad) && (Tile.Road || Tile.RailRoad)) { // Handle movement in MovementDone } else if (MovesLeft == 0 && !moveTarget.Road && moveTarget.Movement > 1) { bool success; if (PartMoves >= 2) { // 2/3 moves left? 50% chance of success success = (Common.Random.Next(0, 2) == 0); } else { // 1/3 moves left? 33% chance of success success = (Common.Random.Next(0, 3) == 0); } if (!success) { PartMoves = 0; return(false); } } MovementTo(relX, relY); return(true); }
public virtual bool MoveTo(int relX, int relY) { if (Movement != null) { return(false); } ITile moveTarget = Map[X, Y][relX, relY]; if (moveTarget == null) { return(false); } if (moveTarget.Units.Any(u => u.Owner != Owner)) { if (Class == UnitClass.Land && Tile.IsOcean) { GameTask.Enqueue(Message.Error("-- Civilization Note --", TextFile.Instance.GetGameText($"ERROR/AMPHIB"))); return(false); } return(Confront(relX, relY)); } if (Class == UnitClass.Land && !(this is Diplomat || this is Caravan) && !new ITile[] { Map[X, Y], moveTarget }.Any(t => t.IsOcean || t.City != null) && moveTarget.GetBorderTiles().SelectMany(t => t.Units).Any(u => u.Owner != Owner)) { if (!moveTarget.Units.Any(x => x.Owner == Owner)) { IUnit[] targetUnits = moveTarget.GetBorderTiles().SelectMany(t => t.Units).Where(u => u.Owner != Owner).ToArray(); IUnit[] borderUnits = Map[X, Y].GetBorderTiles().SelectMany(t => t.Units).Where(u => u.Owner != Owner).ToArray(); if (borderUnits.Any(u => targetUnits.Any(t => t.X == u.X && t.Y == u.Y))) { if (Human == Owner) { GameTask.Enqueue(Message.Error("-- Civilization Note --", TextFile.Instance.GetGameText($"ERROR/ZOC"))); } return(false); } } } if (moveTarget.City != null && Map[X, Y][relX, relY].City.Owner != Owner) { return(Confront(relX, relY)); } if (!MoveTargets.Any(t => t.X == moveTarget.X && t.Y == moveTarget.Y)) { // Target tile is invalid // TODO: For some tiles, display a message detailing why the move is illegal return(false); } // TODO: This implementation was done by observation, may need a revision if (MovesLeft == 0 && !moveTarget.Road && moveTarget.Movement > 1) { bool success; if (PartMoves >= 2) { // 2/3 moves left? 50% chance of success success = (Common.Random.Next(0, 2) == 0); } else { // 2/3 moves left? 33% chance of success success = (Common.Random.Next(0, 3) == 0); } if (!success) { PartMoves = 0; return(false); } } Movement = new MoveUnit(relX, relY); Movement.Done += MoveEnd; GameTask.Insert(Movement); return(true); }
public static void Initialize(string CacheFolder = "") { if (Connector.isInitialized) { throw new Exception("PokeAPI is initialized and can only be initialized once"); //May seems a bit over kill but this is nessecery for corrent usage. } #region "Structure" Connector.Berries = new Berries(); Connector.BerryFirmnesses = new BerryFirmnesses(); Connector.BerryFlavors = new BerryFlavors(); Connector.ContestNames = new ContestNames(); Connector.ContestEffects = new ContestEffects(); Connector.SuperContestEffects = new SuperContestEffects(); Connector.EncounterMethods = new EncounterMethods(); Connector.EncounterConditions = new EncounterConditions(); Connector.EncounterConditionValues = new EncounterConditionValues(); Connector.EvolutionChains = new EvolutionChains(); Connector.EvolutionTrigger = new EvolutionTrigger(); Connector.Generations = new Generations(); Connector.Pokedexes = new Pokedexes(); Connector.Versions = new Versions(); Connector.VersionGroups = new VersionGroups(); Connector.Items = new Items(); Connector.ItemAttributes = new ItemAttributes(); Connector.ItemCategories = new ItemCategories(); Connector.ItemFlingEffects = new ItemFlingEffects(); Connector.ItemPockets = new ItemPockets(); Connector.Locations = new Locations(); Connector.LocationAreas = new LocationAreas(); Connector.PalParkAreas = new PalParkAreas(); Connector.Regions = new Regions(); Connector.Machines = new Machines(); Connector.Moves = new Moves(); Connector.MoveAilments = new MoveAilments(); Connector.MoveBattleStyles = new MoveBattleStyles(); Connector.MoveCategories = new MoveCategories(); Connector.MoveDamageClasses = new MoveDamageClasses(); Connector.MoveLearnMethods = new MoveLearnMethods(); Connector.MoveTargets = new MoveTargets(); Connector.Abilities = new Abilities(); Connector.Characteristics = new Characteristics(); Connector.EggGroups = new EggGroups(); Connector.Genders = new Genders(); Connector.GrowthRates = new GrowthRates(); Connector.Natures = new Natures(); Connector.PokeathlonStats = new PokeathlonStats(); Connector.Pokemons = new Pokemons(); Connector.PokemonColors = new PokemonColors(); Connector.PokemonForms = new PokemonForms(); Connector.PokemonHabitats = new PokemonHabitats(); Connector.PokemonShapes = new PokemonShapes(); Connector.PokemonSpecies = new PokemonSpecies(); Connector.Stats = new Stats(); Connector.Types = new Types(); Connector.Languages = new Languages(); #endregion if (CacheFolder == "") { Connector.CacheFolder = AppDomain.CurrentDomain.BaseDirectory + "pokeAPI//"; } else { if (!System.IO.Directory.Exists(CacheFolder)) { throw new Exception("Directory : " + CacheFolder + " was not found"); } Connector.CacheFolder = CacheFolder; } Cacher.Initialize(); Connector.isInitialized = true; }