예제 #1
0
        public bool ResolveCollision(GameObject go, BotObject bot)
        {
            // If the bot's ID has already been removed from the world, the bot is dead, return the alive state as false
            if (!worldStateService.GameObjectIsInWorldState(bot.Id))
            {
                return(false);
            }

            // If the colliding GO has already been removed from the world, but we reached here, the bot is alive but need not process the GO collision
            if (!worldStateService.GameObjectIsInWorldState(go.Id))
            {
                return(true);
            }

            if (bot.Size > engineConfig.WorldFood.MaxConsumptionSize)
            {
                return(true);
            }

            bot.Size  += go.Size;
            bot.Score += engineConfig.ScoreRates[GameObjectType.Food];
            go.Size    = 0;
            worldStateService.RemoveGameObjectById(go.Id);
            worldStateService.UpdateBotSpeed(bot);
            return(true);
        }
예제 #2
0
        public bool ResolveCollision(GameObject gameObject, BotObject bot)
        {
            if (gameObject.Size < bot.Size)
            {
                return(true);
            }

            Tuple <GameObject, GameObject> wormholePair = worldStateService.GetWormholePair(gameObject.Id);

            if (wormholePair.Equals(null))
            {
                // Lol how? We found a wormhole in state that did not exist in the known wormhole pairs
                throw new InvalidOperationException("Invalid Wormhole");
            }

            var counterpartWormhole = wormholePair.Item1.Id == gameObject.Id ? wormholePair.Item2 : wormholePair.Item1;

            var resultingPosition = vectorCalculatorService.GetPositionFrom(
                counterpartWormhole.Position,
                counterpartWormhole.Size + bot.Size,
                bot.CurrentHeading);

            bot.Position = resultingPosition;
            bot.Score    = engineConfig.ScoreRates[GameObjectType.Wormhole];

            var newSize = (int)Math.Ceiling(wormholePair.Item1.Size * engineConfig.ConsumptionRatio[GameObjectType.Wormhole]);

            wormholePair.Item1.Size = newSize < engineConfig.Wormholes.MinSize ? engineConfig.Wormholes.MinSize : newSize;
            wormholePair.Item2.Size = wormholePair.Item1.Size;

            worldStateService.UpdateGameObject(wormholePair.Item1);
            worldStateService.UpdateGameObject(wormholePair.Item2);

            return(true);
        }
        public bool ResolveCollision(GameObject gameObject, BotObject bot)
        {
            var currentEffect = new ActiveEffect
            {
                Bot    = bot,
                Effect = Effects.GasCloud
            };

            /* If the effect is not registered, add it to the list. */
            if (worldStateService.GetActiveEffectByType(bot.Id, Effects.GasCloud) != default)
            {
                if (bot.Size < engineConfig.MinimumPlayerSize)
                {
                    worldStateService.RemoveGameObjectById(bot.Id);
                }
                return(bot.Size >= engineConfig.MinimumPlayerSize);
            }

            worldStateService.AddActiveEffect(currentEffect);
            bot.Size -= engineConfig.GasClouds.AffectPerTick;
            if (bot.Size < engineConfig.MinimumPlayerSize)
            {
                worldStateService.RemoveGameObjectById(bot.Id);
            }
            return(bot.Size >= engineConfig.MinimumPlayerSize);
        }
예제 #4
0
        public BotObject GetBotWithActions()
        {
            var id  = Guid.NewGuid();
            var bot = new BotObject
            {
                Id             = id,
                Size           = 10,
                Position       = new Position(),
                Speed          = 20,
                GameObjectType = GameObjectType.Player,
                PendingActions = new List <PlayerAction>
                {
                    GetForwardPlayerAction(id),
                    GetForwardPlayerAction(id)
                },
                CurrentAction = new PlayerAction
                {
                    Action   = PlayerActions.Stop,
                    Heading  = 0,
                    PlayerId = id
                }
            };

            worldStateService.AddBotObject(bot);
            return(bot);
        }
예제 #5
0
        public static void setupBots(string[] instructions)
        {
            bots = new List <BotObject>();

            foreach (string instruction in instructions)
            {
                if (instruction.StartsWith("bot"))
                {
                    string[] botData = instruction.Split(' ');

                    BotObject bot = new BotObject();

                    bot.id              = int.Parse(botData[1]);
                    bot.lowValueToId    = int.Parse(botData[6]);
                    bot.highValueToId   = int.Parse(botData[11]);
                    bot.valueCollection = new List <int>();

                    if (botData[5] == "output")
                    {
                        bot.outputLow = true;
                    }

                    if (botData[10] == "output")
                    {
                        bot.outputHigh = true;
                    }

                    bots.Add(bot);
                }
            }
        }
        public bool ResolveCollision(GameObject gameObject, BotObject bot)
        {
            if (!(gameObject is BotObject go))
            {
                throw new ArgumentException("Non player in player collision");
            }

            // If the bot's ID has already been removed from the world, the bot is dead, return the alive state as false
            if (!worldStateService.GameObjectIsInWorldState(bot.Id))
            {
                return(false);
            }

            // If the colliding GO has already been removed from the world, but we reached here, the bot is alive but need not process the GO collision
            if (!worldStateService.GameObjectIsInWorldState(go.Id))
            {
                return(true);
            }

            var botsAreEqualSize = bot.Size == go.Size;

            if (botsAreEqualSize)
            {
                BounceBots(go, bot, 1);
                return(true);
            }

            var botIsBigger = bot.Size > go.Size;
            var consumer    = botIsBigger ? bot : go;
            var consumee    = !botIsBigger ? bot : go;

            var consumedSize = collisionService.GetConsumedSizeFromPlayer(consumer, consumee);

            consumee.Size  -= consumedSize;
            consumer.Size  += consumedSize;
            consumer.Score += engineConfig.ScoreRates[GameObjectType.Player];

            worldStateService.UpdateBotSpeed(consumer);

            BounceBots(consumee, consumer, (int)Math.Ceiling((consumedSize + 1d) / 2));

            if (consumee.Size < engineConfig.MinimumPlayerSize)
            {
                consumer.Size += consumee.Size; // After the previous consumptionSize has already been removed
                consumee.Size  = 0;
                worldStateService.RemoveGameObjectById(consumee.Id);
            }

            worldStateService.UpdateBotSpeed(consumee);

            if (bot.Size > engineConfig.MinimumPlayerSize)
            {
                return(true);
            }

            Logger.LogInfo("BotDeath", "Bot Consumed");
            worldStateService.RemoveGameObjectById(bot.Id);
            return(false);
        }
예제 #7
0
 public BotChatPage(BotObject bot)
 {
     this.InitializeComponent();
     this.Title          = bot.BotName;
     this.BindingContext = new BotChatViewModel(bot, this.MessagesListView, this.QuickReplyStack)
     {
         Navigation = this.Navigation
     };
 }
        public void ProcessAction(BotObject bot)
        {
            var activeEffect = worldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner);

            /* If the effect is not registered, remove speed boost and remove it from the list. */
            if (activeEffect != default)
            {
                worldStateService.RemoveActiveEffect(activeEffect);
                worldStateService.UpdateBotSpeed(bot);
            }
        }
예제 #9
0
        public GameObject GetSmallBotAt(Position position)
        {
            var bot = new BotObject
            {
                Id             = Guid.NewGuid(),
                Size           = 5,
                Position       = position,
                Speed          = 40,
                GameObjectType = GameObjectType.Player
            };

            worldStateService.AddBotObject(bot);
            return(bot);
        }
예제 #10
0
        public BotObject GetBotAtDefault()
        {
            var bot = new BotObject
            {
                Id             = Guid.NewGuid(),
                Size           = 10,
                Position       = new Position(),
                Speed          = 20,
                GameObjectType = GameObjectType.Player
            };

            worldStateService.AddBotObject(bot);
            return(bot);
        }
예제 #11
0
    public BotChatViewModel(BotObject bot, ListView messagesListView, StackLayout quickReplyStack)
        {
      this.connection = new BotConnection(bot);
      this.botId = bot.BotId;
      this.messagesListView = messagesListView;
      this.quickReplyStack = quickReplyStack;
      this.profileImageUrl = bot.ImageUrl;

      this.OutGoingText = null;

      this.Messages = new ObservableCollection<MessageViewModel>();
      this.GetMessagesAsync(this.Messages);
      this.outgoingText = null;
    }
예제 #12
0
        public override void Start()
        {
            base.Start();
            mWeapon    = RequireComponent <BaseWeapon>();
            mMessage   = RequireComponent <MmoMessageComponent>();
            mCharacter = RequireComponent <CharacterObject>();
            mTarget    = RequireComponent <PlayerTarget>();
            mMovable   = GetComponent <MovableObject>();
            m_Skills   = GetComponent <PlayerSkills>();
            m_Bonuses  = GetComponent <PlayerBonuses>();

            mChestLiveDuration = nebulaObject.world.Resource().ServerInputs.GetValue <float>("chest_life");
            //log.InfoFormat("chest life = {0}", mChestLiveDuration);
            mShotTimer = m_ShotCooldown;

            mDead = false;

            combatAIType = aiType as CombatAIType;
            if (combatAIType == null)
            {
                log.Error("CombatBasseAI must have CombatAIType, but not simple AIType");
            }
            mShipWeapon = GetComponent <ShipWeapon>();
            if (Rand.Int() % 2 == 0)
            {
                mMovNearTargetType = MovingNearTarget.Circle;
            }
            else
            {
                mMovNearTargetType = MovingNearTarget.LIne;
            }
            mStartPosition = nebulaObject.transform.position;

#if USE_SKILLS
            //--------------------------TESTING------------------------------------
            var ship = GetComponent <BaseShip>();
            if (ship)
            {
                string sSkill = skills[Rand.Int(skills.Count - 1)];
                ship.shipModel.Slot(ShipModelSlotType.CB).Module.SetSkill(SkillExecutor.SkilIDFromHexString(sSkill));
                mSkills = GetComponent <PlayerSkills>();
                mSkills.UpdateSkills(ship.shipModel);
            }
            //--------------------------------------------------------------------
#endif

            mBotObject = GetComponent <BotObject>();
            SetupSkills();
        }
예제 #13
0
        private void BounceBots(BotObject go, BotObject bot, int spacing)
        {
            var bots = new List <BotObject>
            {
                go,
                bot
            };

            foreach (var botObject in bots.Where(botObject => botObject.CurrentAction != null))
            {
                botObject.CurrentHeading        = vectorCalculatorService.ReverseHeading(botObject.CurrentHeading);
                botObject.CurrentAction.Heading = botObject.CurrentHeading;
                botObject.Position = vectorCalculatorService.GetPointFrom(botObject.Position, spacing, botObject.CurrentHeading);
            }
        }
        public bool ResolveCollision(GameObject gameObject, BotObject bot)
        {
            var currentEffect = new ActiveEffect
            {
                Bot    = bot,
                Effect = Effects.AsteroidField
            };

            /* If the effect is not registered, add it to the list. */
            if (worldStateService.GetActiveEffectByType(bot.Id, Effects.AsteroidField) == default)
            {
                worldStateService.AddActiveEffect(currentEffect);
                worldStateService.UpdateBotSpeed(bot);
            }

            return(true);
        }
예제 #15
0
        public static void addValuesToBots(string[] instructions)
        {
            foreach (string instruction in instructions)
            {
                if (instruction.StartsWith("value"))
                {
                    string[] botData = instruction.Split(' ');

                    int value = int.Parse(botData[1]);
                    int botId = int.Parse(botData[5]);

                    BotObject tmpBot = bots.First(bot => bot.id == botId);

                    tmpBot.valueCollection.Add(value);
                }
            }
        }
예제 #16
0
        public void GivenBot_WithMovement_AndAfterburnerStarted_ThenStopAfterburnerAndNormalSpeedCorrect()
        {
            SetupFakeWorld(true, false);
            var bot = new BotObject
            {
                Id             = Guid.NewGuid(),
                Size           = 60,
                Position       = new Position(0, 0),
                Speed          = 4,
                GameObjectType = GameObjectType.Player
            };

            WorldStateService.AddBotObject(bot);

            var firstAction  = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id);
            var secondAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id);
            var thirdAction  = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                firstAction,
                secondAction,
                thirdAction
            };

            Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));;
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());
            Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));;
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner);

            Assert.AreEqual(59, bot.Size);
            Assert.AreEqual(8, bot.Speed);
            Assert.AreEqual(0, bot.Position.Y);
            Assert.AreEqual(12, bot.Position.X);

            Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            Assert.AreEqual(58, bot.Size);
            Assert.AreEqual(8, bot.Speed);
            Assert.AreEqual(0, bot.Position.Y);
            Assert.AreEqual(20, bot.Position.X);
        }
        public string GetStartAttackMessage(PlayerCharacterObject player, NebulaObject enemy)
        {
            MmoWorld        world          = player.nebulaObject.mmoWorld();
            RaceableObject  playerRaceable = player.GetComponent <RaceableObject>();
            CharacterObject enemyCharacter = enemy.GetComponent <CharacterObject>();
            BotObject       botObject      = enemy.GetComponent <BotObject>();

            string systemName = world.Resource().Zones.GetZoneName(world.Name);
            string playerName = player.characterName;
            //string playerRaceName = world.Resource().Zones.GetRaceName(playerRaceable.getRace());
            string npcName  = GenerateStandardNpcName(systemName, enemy.Id);
            int    npcLevel = enemyCharacter.level;

            string coalitionName = player.guildName;

            if (coalitionName == null)
            {
                coalitionName = string.Empty;
            }


            switch (botObject.getSubType())
            {
            case BotItemSubType.Drill:
                return(string.Format("scm4:zone={0};chname={1};chrace={2};chcoal={3};enname={4};enlvl={5}",
                                     world.Name, playerName,
                                     playerRaceable.race, coalitionName,
                                     npcName, npcLevel));

            case BotItemSubType.Outpost:
                return(string.Format("scm5:zone={0};chname={1};chrace={2};chcoal={3};enname={4};enlvl={5}",
                                     world.Name, playerName,
                                     playerRaceable.race, coalitionName,
                                     npcName, npcLevel));

            case BotItemSubType.MainOutpost:
                return(string.Format("scm6:zone={0};chname={1};chrace={2};chcoal={3};enname={4};enlvl={5}",
                                     world.Name, playerName,
                                     playerRaceable.race, coalitionName,
                                     npcName, npcLevel));

            default:
                return(string.Empty);
            }
        }
        public void ProcessAction(BotObject bot)
        {
            var torpedoSalvo = new TorpedoGameObject()
            {
                Id       = Guid.NewGuid(),
                Position = vectorCalculatorService.GetPositionFrom(bot.Position, bot.Size + engineConfig.Torpedo.Size + 1, bot.CurrentAction
                                                                   .Heading),
                Size           = engineConfig.Torpedo.Size,
                Speed          = engineConfig.Torpedo.Speed,
                CurrentHeading = bot.CurrentAction.Heading,
                FiringPlayerId = bot.Id
            };

            bot.Size -= engineConfig.Torpedo.Cost;
            worldStateService.UpdateBotSpeed(bot);

            worldStateService.AddGameObject(torpedoSalvo);
        }
예제 #19
0
        public void ApplyActionToBot(BotObject bot)
        {
            if (bot.PendingActions != null &&
                bot.PendingActions.Count > 0)
            {
                bot.CurrentAction = bot.PendingActions[0];
                bot.PendingActions.RemoveAt(0);
            }

            if (bot.CurrentAction == default)
            {
                return;
            }

            IActionHandler handler = actionHandlerResolver.ResolveHandler(bot.CurrentAction);

            handler.ProcessAction(bot);
            bot.LastAction = bot.CurrentAction;
        }
예제 #20
0
        public void GivenBot_WithAfterburnerStarted_ThenStopAfterburnerAndNormalSpeedCorrect()
        {
            SetupFakeWorld(true, false);
            var food = FakeGameObjectProvider.GetFoodAt(new Position(60, 0));
            var id   = Guid.NewGuid();
            var bot  = new BotObject
            {
                Id             = id,
                Size           = 60,
                Position       = new Position(0, 0),
                Speed          = 4,
                GameObjectType = GameObjectType.Player,
                PendingActions = new List <PlayerAction>(),
                CurrentAction  = new PlayerAction
                {
                    Action   = PlayerActions.Stop,
                    Heading  = 0,
                    PlayerId = id
                },
                Score = 0
            };

            WorldStateService.AddBotObject(bot);

            var firstAction  = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id);
            var secondAction = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                firstAction,
                secondAction
            };

            Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));;
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());
            Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));;
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            Assert.AreEqual(59, bot.Size);
            Assert.AreEqual(8, bot.Speed);
            Assert.AreEqual(0, bot.Position.Y);
            Assert.AreEqual(8, bot.Position.X);
        }
예제 #21
0
        public BotObject GetBigBotAt(Position position)
        {
            var id  = Guid.NewGuid();
            var bot = new BotObject
            {
                Id             = id,
                Size           = 20,
                Position       = position,
                Speed          = 10,
                GameObjectType = GameObjectType.Player,
                CurrentAction  = new PlayerAction
                {
                    Action   = PlayerActions.Stop,
                    Heading  = 0,
                    PlayerId = id
                }
            };

            worldStateService.AddBotObject(bot);
            return(bot);
        }
예제 #22
0
        public static void runBotTransactions()
        {
            bool allTransactionsDone = false;

            while (!allTransactionsDone)
            {
                if (bots.Count(b => b.valueCollection.Count == 2) == bots.Count)
                {
                    allTransactionsDone = true;
                }

                botsWithTwoValues = bots.Where(b => b.valueCollection.Count == 2).ToList();

                foreach (BotObject bot in botsWithTwoValues)
                {
                    if (bot.valueCollection.Count == 2)
                    {
                        if (!bot.outputLow)
                        {
                            BotObject receiverBot = bots.First(b => b.id == bot.lowValueToId);

                            if (receiverBot.valueCollection.Count < 2)
                            {
                                receiverBot.valueCollection.Add(bot.valueCollection.Min());
                            }
                        }

                        if (!bot.outputHigh)
                        {
                            BotObject receiverBot = bots.First(b => b.id == bot.highValueToId);

                            if (receiverBot.valueCollection.Count < 2)
                            {
                                receiverBot.valueCollection.Add(bot.valueCollection.Max());
                            }
                        }
                    }
                }
            }
        }
예제 #23
0
        public void ProcessAction(BotObject bot)
        {
            /* Bot does not have enough resources to consume for the afterburner. */
            if (bot.Size <= engineConfig.Afterburners.SizeConsumptionPerTick ||
                bot.Size <= engineConfig.MinimumPlayerSize)
            {
                return;
            }

            var currentEffect = new ActiveEffect
            {
                Bot    = bot,
                Effect = Effects.Afterburner
            };

            /* If the effect is not registered, add speed boost and add it to the list. */
            if (worldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner) == default)
            {
                worldStateService.AddActiveEffect(currentEffect);
                worldStateService.UpdateBotSpeed(bot);
            }
        }
 public bool IsApplicable(GameObject gameObject, BotObject bot) => gameObject.GameObjectType == GameObjectType.GasCloud;
예제 #25
0
 public void ProcessAction(BotObject bot)
 {
     // no-op
 }
 public bool IsApplicable(GameObject gameObject, BotObject bot) => gameObject.GameObjectType == GameObjectType.AsteroidField;
예제 #27
0
 public bool IsApplicable(GameObject gameObject, BotObject bot) => gameObject.GameObjectType == GameObjectType.Wormhole;
예제 #28
0
 public void ProcessAction(BotObject bot)
 {
     bot.CurrentHeading = bot.CurrentAction.Heading;
     bot.IsMoving       = true;
 }
예제 #29
0
 public void AddBotObject(BotObject bot)
 {
     state.PlayerGameObjects.Add(bot);
 }
예제 #30
0
 public void ProcessAction(BotObject bot)
 {
     bot.IsMoving = false;
 }