예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 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;
 }