Exemple #1
0
        public bool MobDrainEnergyTank(EnergyTank energyTank, int desiredDrainAmount)
        {
            bool success = true;

            float min_distance_squared = WorldConstants.ROOM_TILE_SIZE * WorldConstants.ROOM_TILE_SIZE;

            // Move to the energy tank first if it's too far away
            if (Point3d.DistanceSquared(mob.Position, energyTank.Position) > min_distance_squared)
            {
                success = MoveMob(energyTank.Position);
            }

            if (success)
            {
                int energyDrained = Math.Min(energyTank.Energy, desiredDrainAmount);

                // Drain the energy from the tank
                energyTank.Energy -= energyDrained;

                // Give energy to the mob
                mob.Energy = Math.Min(mob.Energy + energyDrained, mob.MobType.MaxEnergy);

                // Post an event that we moved
                output_game_events.Add(
                    new GameEvent_EnergyTankDrained()
                {
                    energy_tank_id  = energyTank.ID,
                    drainer_id      = mob.ID,
                    drainer_faction = GameConstants.eFaction.ai,
                    energy_drained  = energyDrained
                });
            }

            return(success);
        }
        private bool UpdateEnergyTankState(
            RequestCache requestCache,
            out string result_code)
        {
            bool success = false;

            EnergyTank energyTank = requestCache.GetEnergyTank(m_current_room_key, m_energy_tank_id);

            if (energyTank != null)
            {
                switch (energyTank.Faction)
                {
                case GameConstants.eFaction.ai:
                    energyTank.Faction = GameConstants.eFaction.neutral;
                    break;

                case GameConstants.eFaction.neutral:
                case GameConstants.eFaction.player:
                    energyTank.Faction = GameConstants.eFaction.player;
                    break;
                }

                result_code = SuccessMessages.GENERAL_SUCCESS;
                success     = true;
            }
            else
            {
                result_code = ErrorMessages.CACHE_ERROR + "(Unable to update energy tank ownership)";
                success     = false;
            }

            return(success);
        }
 public EnergyTankState(EnergyTank tank)
 {
     _tank          = tank;
     Sprite         = ItemSpriteFactory.Instance.CreateEnergyTankSprite();
     Sprite.X       = (int)tank.Position.X;
     Sprite.Y       = (int)tank.Position.Y;
     Sprite.Visible = true;
 }
Exemple #4
0
        private bool VerifyEnergyTank(
            RequestCache requestCache,
            out bool out_is_touching,
            out string result_code)
        {
            bool success = false;

            out_is_touching = false;

            // Make sure the portal actually exists in the room the player is in
            m_energy_tank = requestCache.GetEnergyTank(m_current_room_key, m_energy_tank_id);

            if (m_energy_tank != null)
            {
                // Remember how much energy the tank had before we drained it
                m_energy_tank_old_energy = m_energy_tank.Energy;

                switch (m_energy_tank.Faction)
                {
                case GameConstants.eFaction.player:
                    result_code = SuccessMessages.GENERAL_SUCCESS;
                    success     = true;
                    break;

                case GameConstants.eFaction.ai:
                case GameConstants.eFaction.neutral:
                    result_code = ErrorMessages.ENERGY_TANK_NOT_PLAYER_OWNED;
                    success     = false;
                    break;

                default:
                    result_code = ErrorMessages.DB_ERROR + "(Invalid energy tank faction)";
                    success     = false;
                    break;
                }

                if (success && m_energy_tank.Energy <= 0)
                {
                    result_code = ErrorMessages.ENERGY_TANK_EMPTY;
                    success     = false;
                }

                if (success)
                {
                    float min_distance_squared = WorldConstants.ROOM_TILE_SIZE * WorldConstants.ROOM_TILE_SIZE;
                    float distance             = Point3d.DistanceSquared(m_current_character_position, m_energy_tank.Position);

                    out_is_touching = distance <= min_distance_squared;
                }
            }
            else
            {
                result_code = ErrorMessages.INVALID_REQUEST;
            }

            return(success);
        }
Exemple #5
0
 public static EnergyTank GetEnergyTank(
     AsyncRPGDataContext db_context,
     int energyTankID)
 {
     return
         (EnergyTank.CreateEnergyTank(
              (from e in db_context.EnergyTanks
               where e.EnergyTankID == energyTankID
               select e).Single()));
 }
 public void Execute(IGameObject gameObject, IGameObject collidedWith)
 {
     EnergyTank energyTank = (EnergyTank)gameObject;
     foreach (var player in _currentLevel.Players)
     {
         var samus = (Samus) player;
         samus.MaxHealth += 100;
     }
     energyTank.Obtain();
     //((Samus)collidedWith).MaxHealth += 100;
 }
        public EnergyTank GetEnergyTank(AsyncRPGDataContext db_context, int energyTankID)
        {
            EnergyTank energyTank = null;

            if (!m_energyTanks.TryGetValue(energyTankID, out energyTank))
            {
                energyTank = EnergyTankQueries.GetEnergyTank(db_context, energyTankID);

                m_energyTanks.Add(energyTankID, energyTank);
            }

            return(energyTank);
        }
        private void UpdateEnergyTankPropVisibility(
            MobUpdateContext context)
        {
            Mob     ownerMob = context.mob;
            NavMesh navMesh  = context.moveRequest.Room.runtime_nav_mesh;

            foreach (EntityProp prop in energy_tank_props)
            {
                Point3d oldPropPosition = prop.GetPosition();

                // Find the energy tank associated with the player id
                EnergyTank energyTank = context.moveRequest.EnergyTanks.Find(e => e.ID == prop.target_object_id);

                // Can the mob see the player at their current location
                bool canSee = CanMobSeePoint(navMesh, ownerMob, energyTank.Position);

                TypedFlags <EntityProp.ePropVisibilityFlags> oldVisibilityFlags =
                    new TypedFlags <EntityProp.ePropVisibilityFlags>(prop.visibilityFlags);

                prop.visibilityFlags.Set(EntityProp.ePropVisibilityFlags.canSee, canSee);
                prop.visibilityFlags.Set(EntityProp.ePropVisibilityFlags.caughtGlimpse, canSee);
                prop.visibilityFlags.Set(EntityProp.ePropVisibilityFlags.stationary, true);

                if (canSee)
                {
                    // If so, we get to pull the entity properties
                    prop.RefeshEntityProperties(ownerMob, energyTank);
                    prop.visibilityFlags.Set(EntityProp.ePropVisibilityFlags.seenAtLeastOnce, true);
                }

                // Update the status of the prop based on the current visibility
                UpdatePropStatus(ownerMob, prop);

                // Post an event if we just spotted an energy that we've never seen before
                if (!oldVisibilityFlags.Test(EntityProp.ePropVisibilityFlags.canSee) &&
                    !oldVisibilityFlags.Test(EntityProp.ePropVisibilityFlags.seenAtLeastOnce) &&
                    (prop.visibilityFlags.Test(EntityProp.ePropVisibilityFlags.canSee) ||
                     prop.visibilityFlags.Test(EntityProp.ePropVisibilityFlags.caughtGlimpse)))
                {
                    context.output_game_events.Add(
                        new GameEvent_MobEnergyTankPropSpotted()
                    {
                        mob_id         = ownerMob.ID,
                        energy_tank_id = prop.target_object_id
                    });
                }
            }
        }
Exemple #9
0
        public static void UpdateEnergyTankOwnership(
            AsyncRPGDataContext db_context,
            EnergyTank energyTank,
            GameConstants.eFaction newOwnership)
        {
            var energyTankQuery =
                (from e in db_context.EnergyTanks
                 where e.EnergyTankID == energyTank.ID
                 select e).SingleOrDefault();

            energyTankQuery.Ownership = (int)newOwnership;

            db_context.SubmitChanges();

            energyTank.Faction = newOwnership;
        }
        public HackEnergyTankRequestProcessor(
            int character_id,
            int energy_tank_id)
        {
            m_character_id   = character_id;
            m_energy_tank_id = energy_tank_id;

            m_world                      = null;
            m_room                       = null;
            m_energy_tank                = null;
            m_current_room_key           = null;
            m_current_character_position = new Point3d();
            m_current_character_angle    = 0.0f;
            m_game_id                    = -1;
            m_move_to_target             = false;
            m_ai_relevant_events         = new List <GameEventParameters>();

            m_result_event_list = null;
        }
Exemple #11
0
        public static List <EnergyTank> GetEnergyTanks(
            AsyncRPGDataContext db_context,
            RoomKey roomKey)
        {
            List <EnergyTank> energyTanks = new List <EnergyTank>();

            var roomEnergyTankQuery =
                from e in db_context.EnergyTanks
                where e.GameID == roomKey.game_id && e.RoomX == roomKey.x && e.RoomY == roomKey.y && e.RoomZ == roomKey.z
                select e;

            foreach (EnergyTanks dbEnergyTank in roomEnergyTankQuery)
            {
                EnergyTank energyTank = EnergyTank.CreateEnergyTank(dbEnergyTank);

                energyTanks.Add(energyTank);
            }

            return(energyTanks);
        }
Exemple #12
0
        public static void UpdateEnergyTank(
            AsyncRPGDataContext db_context,
            EnergyTank energyTank)
        {
            var dbEnergyTank =
                (from e in db_context.EnergyTanks
                 where e.EnergyTankID == energyTank.ID
                 select e).SingleOrDefault();

            dbEnergyTank.GameID    = energyTank.RoomKey.game_id;
            dbEnergyTank.RoomX     = energyTank.RoomKey.x;
            dbEnergyTank.RoomY     = energyTank.RoomKey.y;
            dbEnergyTank.RoomZ     = energyTank.RoomKey.z;
            dbEnergyTank.X         = energyTank.Position.x;
            dbEnergyTank.Y         = energyTank.Position.y;
            dbEnergyTank.Z         = energyTank.Position.z;
            dbEnergyTank.Ownership = (int)energyTank.Faction;
            dbEnergyTank.Energy    = energyTank.Energy;

            db_context.SubmitChanges();
        }
Exemple #13
0
        private bool UpdateEnergyTankState(
            RequestCache requestCache,
            out string result_code)
        {
            bool success = false;

            EnergyTank energyTank = requestCache.GetEnergyTank(m_current_room_key, m_energy_tank_id);

            if (energyTank != null)
            {
                energyTank.Energy = 0;

                result_code = SuccessMessages.GENERAL_SUCCESS;
                success     = true;
            }
            else
            {
                result_code = ErrorMessages.CACHE_ERROR + "(Unable to update energy tank state)";
                success     = false;
            }

            return(success);
        }
        public override void Perform(MobUpdateContext context)
        {
            EntityProp energyTankProp = context.mob.AIState.perception_data.GetEnergyTankTargetProp();
            EnergyTank energyTank     = context.moveRequest.EnergyTanks.Find(e => e.ID == energyTankProp.target_object_id);

            if (energyTank.Faction == GameConstants.eFaction.ai)
            {
                // We can only drain up to what we can take and whats left in the energy tank
                int drainAmount =
                    Math.Min(energyTank.Energy, context.mob.MobType.Abilities.energy_tank_drain_per_turn);

                context.MobDrainEnergyTank(energyTank, drainAmount);
                context.MobPostDialog("Sweet Sweet Energy...");
            }
            else
            {
                context.MoveMob(energyTank.Position);
                context.MobPostDialog("What?! Someone hacked this! Grrr...");
            }

            // Update the energy on the prop
            energyTankProp.energy = energyTank.Energy;
        }
Exemple #15
0
        public bool MobHackEnergyTank(EnergyTank energyTank)
        {
            bool success = true;

            float min_distance_squared = WorldConstants.ROOM_TILE_SIZE * WorldConstants.ROOM_TILE_SIZE;

            // Move to the energy tank first if it's too far away
            if (Point3d.DistanceSquared(mob.Position, energyTank.Position) > min_distance_squared)
            {
                success = MoveMob(energyTank.Position);
            }

            if (success)
            {
                // If the energy tank's faction was player it's now neutral
                // If the energy tank's faction was neutral it's now ai
                GameConstants.eFaction newFaction =
                    (energyTank.Faction == GameConstants.eFaction.player)
                    ? GameConstants.eFaction.neutral : GameConstants.eFaction.ai;

                // Update the faction on the energy tank
                energyTank.Faction = newFaction;

                // Post an event that we moved
                output_game_events.Add(
                    new GameEvent_EnergyTankHacked()
                {
                    energy_tank_id      = energyTank.ID,
                    energy_tank_faction = newFaction,
                    hacker_id           = mob.ID,
                    hacker_faction      = GameConstants.eFaction.ai
                });
            }

            return(success);
        }
        public override void Perform(MobUpdateContext context)
        {
            EntityProp energyTankProp = context.mob.AIState.perception_data.GetEnergyTankTargetProp();
            EnergyTank energyTank     = context.moveRequest.EnergyTanks.Find(e => e.ID == energyTankProp.target_object_id);

            if (energyTank.Faction == GameConstants.eFaction.player)
            {
                context.MobHackEnergyTank(energyTank);
                context.MobPostDialog("Which team owns one less energy tank? Team Player!");
            }
            else if (energyTank.Faction == GameConstants.eFaction.neutral)
            {
                context.MobHackEnergyTank(energyTank);
                context.MobPostDialog("Energy Tank claimed for the AI Team!");
            }
            else if (energyTank.Faction == GameConstants.eFaction.ai)
            {
                context.MobHackEnergyTank(energyTank);
                context.MobPostDialog("Oh! I guess we already owned this energy tank");
            }

            // Update the faction on the prop
            energyTankProp.faction = energyTank.Faction;
        }