/// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            PlayerRelationValue existingRelation = playerContext.Player.RelationsValues.FirstOrDefault(r => r.Level == PlayerRelationsLevel.Hostile);

            if (existingRelation != null)
            {
                Player relationPlayer = existingRelation.Player;
                if (relationPlayer == null)
                {
                    relationPlayer          = playerContext.Player.GameSession.Players.FirstOrDefault(p => p.Index == existingRelation.PlayerIndex);
                    existingRelation.Player = relationPlayer;
                }

                if (relationPlayer != null && !relationPlayer.IsEliminated)
                {
                    returnCode = BehaviorReturnCode.Success;
                    return(returnCode);
                }
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            PlayerRelationValue relation = playerContext.RelationValues.Current;

            if (player == null || relation.DeclarationCooldown != 0 || relation.PropositionState != DiplomaticActions.None || !relation.AvailableActions.HasFlag(DiplomaticAction))
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player otherPlayer = relation.Player;

            if (otherPlayer == null || otherPlayer.IsEliminated)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            bool currentState = relation.GetActionState(DiplomaticAction);

            if (currentState)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            bool canActivate = relation.GetDiplomaticActionEnableState(DiplomaticAction, player.GameSession.EnvironmentConfig.DiplomacyConfig);

            if (canActivate)
            {
                DispatcherHelper.InvokeOnMainThread(otherPlayer, new Action(() =>
                {
                    player.ProposeDiplomaticAction(relation, DiplomaticAction);
                }));

                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }
示例#3
0
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            PlayerRelationValue relation = playerContext.RelationValues.Current;
            Player otherPlayer           = relation.Player;

            if (otherPlayer == null || relation.DeclarationCooldown != 0)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            if (otherPlayer.IsEliminated)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            if (relation.IsAtWar)
            {
                float cost = player.GameSession.EnvironmentConfig.DiplomacyConfig.GetActionCost(DiplomaticActions.MakePeace);
                if (cost > player.Intelligence)
                {
                    returnCode = BehaviorReturnCode.Failure;
                    return(returnCode);
                }

                DispatcherHelper.InvokeOnMainThread(relation.Player, new Action(() =>
                {
                    player.MakePeace(relation);
                }));

                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            PlayerRelationValue relation = playerContext.RelationValues.Current;
            Player otherPlayer           = relation.Player;

            if (otherPlayer == null) // || relation.DeclarationCooldown != 0)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            if (otherPlayer.IsEliminated)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            var otherPlayerRelation = otherPlayer.RelationsValues.FirstOrDefault(r => playerContext.Player.Index == r.PlayerIndex);

            if (otherPlayerRelation.PropositionState != DiplomaticActions.None)
            {
                DispatcherHelper.InvokeOnMainThread(otherPlayer, new Action(() =>
                {
                    otherPlayer.ActivateProposedDiplomaticAction(otherPlayerRelation);
                }));

                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext?.Player == null || playerContext.RelationValues == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            PlayerRelationValue relation = playerContext.RelationValues.Current;

            if (relation == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            DiplomacyItem item = relation.DiplomaticItems.FirstOrDefault(i => i.Data.Id == DiplomacyItemId && i.IsEnabled && !i.IsAcquired);

            if (item == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            item.Acquire(relation);

            if (item.IsAcquired)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }
示例#6
0
        private bool CheckRelation(UnitBehaviorContext unitContext, Player anotherPlayer)
        {
            Debug.Assert(anotherPlayer != null, "Player null");

            BaseUnit            unit     = unitContext.Unit;
            PlayerRelationValue relation = unit.Owner.RelationsValues.FirstOrDefault(r => r.PlayerIndex == anotherPlayer.Index);

            if (relation != null)
            {
                return(false);
            }

            unit.Owner.AddRelation(anotherPlayer, unit);

            relation = anotherPlayer.RelationsValues.FirstOrDefault(r => r.PlayerIndex == unit.Owner.Index);
            if (relation != null)
            {
                return(true);
            }

            anotherPlayer.AddRelation(unit.Owner, unit);

            return(true);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            DiplomacyConfiguration diplomacyConfig = player.GameSession.EnvironmentConfig.DiplomacyConfig;
            PlayerRelationValue    relation        = playerContext.RelationValues.Current;
            Player otherPlayer = relation.Player;

            if (otherPlayer == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            if (otherPlayer.IsEliminated)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            float otherPlayerInfluence = player.GameSession.Galaxy.PlayersInfluence[otherPlayer];
            float myInfluence          = player.GameSession.Galaxy.PlayersInfluence[player];

            if (otherPlayerInfluence > myInfluence)
            {
                relation.UpdateLevel(relation.RelationValue - InfluenceRelationChange, diplomacyConfig);
            }
            else
            {
                relation.UpdateLevel(relation.RelationValue + InfluenceRelationChange, diplomacyConfig);
            }

            if (otherPlayer.TotalTechnologiesAquired > player.TotalTechnologiesAquired)
            {
                relation.UpdateLevel(relation.RelationValue + TechnologyRelationChange, diplomacyConfig);
            }

            int tradeRoutesWithPlayer = player.TradeRoutes.Count(tr => tr is GlobalTradeRoute && (tr.From.Owner == otherPlayer || tr.To.Owner == otherPlayer));

            if (tradeRoutesWithPlayer > 0)
            {
                int relationChange = GlobalTradeRelationChange * tradeRoutesWithPlayer;
                relation.UpdateLevel(relation.RelationValue + relationChange, diplomacyConfig);
            }

            if (relation.Player.HasOpenBorders(player))
            {
                relation.UpdateLevel(relation.RelationValue + OpenBordersRelationChange, diplomacyConfig);
            }
            else
            {
                relation.UpdateLevel(relation.RelationValue + CloseBordersRelationChange, diplomacyConfig);
            }

            if (relation.Player.IsAtWar(player))
            {
                relation.UpdateLevel(diplomacyConfig.HostileRelationValueMin, diplomacyConfig);
            }

            returnCode = BehaviorReturnCode.Success;
            return(returnCode);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            PlayerBehaviorContext playerContext = context as PlayerBehaviorContext;

            if (playerContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Player player = playerContext.Player;
            PlayerRelationValue relation = playerContext.RelationValues.Current;

            /*
             * if (!relation.AvailableActions.HasFlag(Action))
             * {
             *  returnCode = BehaviorReturnCode.Failure;
             *  return returnCode;
             * }
             */

            Player otherPlayer = relation.Player;

            if (otherPlayer == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            if (otherPlayer.IsEliminated)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            bool currentState = relation.GetActionState(Action);

            if (currentState == State || !relation.AvailableActions.HasFlag(Action))
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            if (Action == DiplomaticActions.BordersControl && relation.IsEntryAllowed == State)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            bool canActivate = relation.GetDiplomaticActionEnableState(Action, player.GameSession.EnvironmentConfig.DiplomacyConfig);

            if (canActivate || IsProposition)
            {
                if (!IsProposition)
                {
                    float cost = player.GameSession.EnvironmentConfig.DiplomacyConfig.GetActionCost(Action);
                    if (cost > player.Intelligence)
                    {
                        returnCode = BehaviorReturnCode.Failure;
                        return(returnCode);
                    }
                }

                if (State)
                {
                    DispatcherHelper.InvokeOnMainThread(relation.Player, new Action(() =>
                    {
                        player.ActivateDiplomaticAction(relation, Action, !IsProposition);
                    }));
                }
                else
                {
                    DispatcherHelper.InvokeOnMainThread(relation.Player, new Action(() =>
                    {
                        player.DeactivateDiplomaticAction(relation, Action, !IsProposition);
                    }));
                }

                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }