コード例 #1
0
ファイル: SkillStunPlayer.cs プロジェクト: cribin/GameLab2017
        public void Execute(long currentTimeMs, DefaultCharacter target)
        {
            if ((currentTimeMs - timeLastExecuted) < cooldown)
            {
                return;
            }

            scene.MatchSoundManager.PlaySoundEffect(SoundEffectEnumeration.Machete);

            bool isFacingRight = physics.IsFacingRight();

            /*foreach (Actor actor in touchedActors)
             * {
             *  (actor as DefaultCharacter)?.StunAndSteal(character);
             * }*/
            target.StunAndSteal(character);

            if (isFacingRight)
            {
                charSheet?.PlayAnimation("machete");
            }
            else
            {
                charSheet?.PlayAnimation("machete", 1F, true);
            }


            timeLastExecuted = currentTimeMs;
        }
コード例 #2
0
        private DefaultCharacter FindTarget()
        {
            DefaultCharacter tgtNew = null;
            double           dis    = Behavior.RadiusAgression;

            foreach (Player player in scene.GetPlayers())
            {
                foreach (Character character in player.PossesedCharacters)
                {
                    DefaultCharacter defChar = (DefaultCharacter)character;
                    if (defChar == null || defChar.CharacterPhysics.IsStunned)
                    {
                        continue;
                    }


                    double disTmp = (defChar.GetPosition() - Character().GetPosition()).Length();
                    // Prefer characters with treasures
                    if ((tgtNew?.InvTreasure == null && disTmp <= dis) || (tgtNew != null && tgtNew.InvTreasure == null && defChar.InvTreasure != null))
                    {
                        tgtNew = defChar;
                        dis    = disTmp;
                    }
                }
            }
            if (tgtNew != null)
            {
                timeTargetAcquired = Environment.TickCount;
            }
            return(tgtNew);
        }
コード例 #3
0
        private Vector3 CharacterPos()
        {
            DefaultCharacter c = Character();
            float            x = c.GetPosition().X + 0.5f * c.GetSize().X;
            float            y = c.GetPosition().Y + 0.75f * c.GetSize().Y;
            float            z = c.GetPosition().Z + 0.5f * c.GetSize().Z;

            return(new Vector3(x, y, z));
        }
コード例 #4
0
 void Start()
 {
     m_MinionType      = MinionType.E_CREEP1;
     direction         = BomberGuide.getRandomDir();
     canProceed        = true;
     originalCellsFree = cellsFree;
     movement          = new MovementData(3);
     physBody          = transform.GetComponent <Rigidbody2D>();
     bodyDestination   = transform.position;
     GetComponent <DefaultCharacter>().InitChar();
     character   = GetComponent <DefaultCharacter>();
     animator    = transform.GetChild(4).GetChild(0).GetComponent <Animator>();
     minionState = MinionState.E_NEUTRAL;
 }
コード例 #5
0
    public void Start()
    {
        if (!IsLocalPlayer())
        {
            return;
        }

        level_numKeysRequired = 2;

        Transform gameCharacters = GameObject.Find("GameCharacters").transform;

        transform.SetParent(gameCharacters);

        gameGrid       = GameObject.Find("Grid").GetComponent <GameGrid>();
        tileRefManager = gameGrid.GetComponent <TileRefManager>();
        dpad           = GameObject.Find("JoystickBackground").GetComponent <VirtualJoystick>();
        if (exitRequirements == null)
        {
            exitRequirements = GameObject.Find("LevelExitRequirements");
        }
        exitRequirements.SetActive(false);
        if (levelCleared == null)
        {
            levelCleared = GameObject.Find("LevelCleared");
        }
        levelCleared.SetActive(false);

        pawn_sprite = this.gameObject;
        pawn        = pawn_sprite.AddComponent <DefaultCharacter>();

        // Set the player at the starting cell
        //Vector2 startingPos = gameGrid.GetCellToWorld(new Vector3Int(-3, 0, 0));

        originalTile = new Tile();

        moveStat          = new MovementStats(5f);
        body              = pawn_sprite.GetComponent <Rigidbody2D>();
        body.gravityScale = 0.0f;
        e_playstate       = PlayState.E_NONCOMBAT;
        isOver            = false;
        p_animator        = pawn_sprite.transform.GetChild(1).GetChild(0).GetComponent <Animator>();
        prevCellPos       = gameGrid.GetWorldFlToCellPos(pawn_sprite.transform.position);
        inventory         = GetComponent <Inventory>();
        bombText2d        = GameObject.FindGameObjectWithTag("2DCanvas").transform.GetChild(4).GetChild(0).GetChild(0).gameObject;
        rangeText2d       = GameObject.FindGameObjectWithTag("2DCanvas").transform.GetChild(5).GetChild(0).GetChild(0).gameObject;
        //tileRefManager.SetTile(TileRefManager.TILEMAP_TYPE.TILEMAP_PLAYER, prevCellPos, TileRefManager.instance.GetTileRef(TileRefManager.TILE_TYPE.TILE_WARNING));
        MyNetwork.instance.b_foundLocalPlayer = false;
        MyNetwork.instance.localPlayer        = null;
    }
コード例 #6
0
 public override void execute(List <object> actuator, List <object> target)
 {
     if (actuator.Count == 1)
     {
         if (actuator[0] is DefaultCharacter)
         {
             DefaultCharacter character = (DefaultCharacter)actuator[0];
             if (character.TrapCount == 0)
             {
                 character.AddTrap();
                 scene.RemoveActor(trap);
                 trap.Active          = false;
                 ActiveAfterExecution = false;
             }
         }
     }
 }
コード例 #7
0
        public MatchScreen(Director director, Scene scene, Vector2 baseScreenSize, bool[] selectedPlayers)
        {
            this.director = director;
            this.scene    = scene;
            this.hud      = new MatchHud(director.Content, director, scene, selectedPlayers);
            //this.camera = new BaseCamera(new Vector2(0.0f, 0.0f), 0, 1);
            this.camera = new ScalableCamera(director.Graphics, baseScreenSize, new Vector2(0.0f, 0.0f), 0, 1);
            //debug code
            // create 1x1 texture for line drawing
            point = new Texture2D(director.Graphics.GraphicsDevice, 1, 1);
            point.SetData(
                new[] { Color.White }); // fill the texture with white

            platformAlphaMask =
                director.Content.Load <Texture2D>(MainConfig.PIPELINE_GRAPHICS_DIRECTORY + "FinalPlatforms");

            character = scene.GetPlayers()[0].PossesedCharacters[0] as DefaultCharacter;
        }
コード例 #8
0
        public override void execute(List <object> actuator, List <object> target)
        {
            if (actuator.Count == 1)
            {
                if (actuator[0] is DefaultCharacter)
                {
                    DefaultCharacter character = (DefaultCharacter)actuator[0];

                    snake.Active = true;


                    snake.Appear(character.CharacterPhysics.GetPosition().X > snake.getCenterPointX());

                    character.CharacterPhysics.CurrentStunTime = CharacterConfig.SNAKE_STUN_TIME;
                    character.CharacterPhysics.IsStunned       = true;
                }
            }
        }
コード例 #9
0
        public void Execute(long currentTimeMs, List <Actor> touchedActors)
        {
            DefaultCharacter currentCharacter = (DefaultCharacter)character;

            if (currentCharacter == null)
            {
                return;
            }

            if ((currentTimeMs - timeLastExecuted) < cooldown)
            {
                return;
            }

            bool isFacingRight = physics.IsFacingRight();

            if (currentCharacter.InvTreasure == null)
            {
                foreach (Actor actor in touchedActors)
                {
                    Treasure treasure = actor as Treasure;
                    if (treasure != null)
                    {
                        treasure.CharacterCollect(character);
                    }

                    AmmoCrate ammoCrate = actor as AmmoCrate;
                    if (ammoCrate != null)
                    {
                        ammoCrate.CharacterCollect(character);
                    }

                    Trap trap = actor as Trap;
                    if (trap != null)
                    {
                        trap.CharacterCollect(character);
                    }
                }
            }


            timeLastExecuted = currentTimeMs;
        }
コード例 #10
0
        public override void execute(List <object> actuator, List <object> target)
        {
            if (actuator.Count == 1)
            {
                if (actuator[0] is Vector2)
                {
                    Vector2 location = (Vector2)actuator[0];
                    trap.SetPosition(new Vector2(location.X, location.Y - 20));

                    if (owner is DefaultCharacter)
                    {
                        DefaultCharacter defaultCharacter = (DefaultCharacter)owner;
                        if (defaultCharacter.TrapCount > 0)
                        {
                            defaultCharacter.TrapCount--;
                        }
                    }

                    trap.Active = true;
                    trap.Loaded = true;
                }
            }
        }
コード例 #11
0
        public DefaultCharacter Build()
        {
            if (_raceId == 0)
            {
                _raceId = Randomizer.TakeRandomFrom(RaceRepository.Data).Id;
            }
            if (_classId == 0)
            {
                _classId = Randomizer.TakeRandomFrom(ClassRepository.Data).Id;
            }
            if (_genderId == 0)
            {
                _genderId = Randomizer.Random(1, 2);
            }
            if (_classLevels == 0)
            {
                _classLevels = Randomizer.Random(1, 5);
            }

            if (string.IsNullOrEmpty(_name))
            {
                _name = NameGenerator.Generate(_genderId == 1 ? Gender.Male : Gender.Female);
            }

            var character = new DefaultCharacter
            {
                Id           = ++currentId,
                NameLocaleId = _name,
                Race         = RaceRepository.Retrieve(_raceId),
                Class        = new DefaultClass(_classLevels, ClassRepository.Retrieve(_classId)),
                GenderType   = (byte)_genderId,
                Equipment    = new DummyEquipment()
            };

            character.Stats = StatsComputer.ComputeStats(character.GetActiveEffects().ToArray());
            return(character);
        }
コード例 #12
0
        public void OnCreatePlayer(IClusterClient client, CreatePlayerPacket packet)
        {
            DbUser dbUser = _database.Users.FirstOrDefault(x => x.Username == packet.Username && x.Password == packet.Password);

            if (dbUser == null)
            {
                _logger.LogWarning($"[SECURITY] Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: bad presented credentials compared to the database.");
                client.Disconnect();
                return;
            }

            if (_database.Characters.Any(x => x.Name == packet.CharacterName))
            {
                _logger.LogWarning(
                    $"Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                    $"Reason: character name '{packet.CharacterName}' already exists.");

                _clusterPacketFactory.SendClusterError(client, ErrorType.USER_EXISTS);
                return;
            }

            DefaultCharacter  defaultCharacter = _clusterServer.ClusterConfiguration.DefaultCharacter;
            DefaultStartItems defaultEquipment = packet.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman;

            if (!_gameResources.Jobs.TryGetValue(packet.Job, out JobData jobData))
            {
                _logger.LogError($"Cannot find job data for job '{packet.Job}' for user '{dbUser.Username}'.");
                client.Disconnect();
                return;
            }

            var newCharacter = new DbCharacter()
            {
                UserId    = dbUser.Id,
                Name      = packet.CharacterName,
                Slot      = (byte)packet.Slot,
                SkinSetId = packet.SkinSet,
                HairColor = (int)packet.HairColor,
                FaceId    = packet.HeadMesh,
                HairId    = packet.HairMeshId,
                BankCode  = packet.BankPassword,
                Gender    = packet.Gender,
                JobId     = (int)packet.Job,
                Hp        = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                          jobData.MaxHpFactor),
                Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence,
                                                   jobData.MaxMpFactor, true),
                Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                   defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true),
                Strength     = defaultCharacter.Strength,
                Stamina      = defaultCharacter.Stamina,
                Dexterity    = defaultCharacter.Dexterity,
                Intelligence = defaultCharacter.Intelligence,
                MapId        = defaultCharacter.MapId,
                PosX         = defaultCharacter.PosX,
                PosY         = defaultCharacter.PosY,
                PosZ         = defaultCharacter.PosZ,
                Level        = defaultCharacter.Level,
                Gold         = defaultCharacter.Gold,
                StatPoints   = 0, //TODO: create default stat point constant.
                SkillPoints  = 0, //TODO: create default skill point constant.
                Experience   = 0,
            };

            //TODO: create game constants for slot.
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52));

            _database.Characters.Add(newCharacter);
            _database.SaveChanges();

            _logger.LogInformation($"Character '{newCharacter.Name}' has been created successfully for user '{dbUser.Username}' from {client.Socket.RemoteEndPoint}.");

            IEnumerable <DbCharacter> dbCharacters = GetCharacters(dbUser.Id);

            _clusterPacketFactory.SendPlayerList(client, packet.AuthenticationKey, dbCharacters);
        }
コード例 #13
0
        public static void OnCreatePlayer(ClusterClient client, INetPacketStream packet)
        {
            var         pak = new CreatePlayerPacket(packet);
            var         clusterConfiguration = DependencyContainer.Instance.Resolve <ClusterConfiguration>();
            var         jobs        = DependencyContainer.Instance.Resolve <JobLoader>();
            DbUser      dbUser      = null;
            DbCharacter dbCharacter = null;

            using (var database = DependencyContainer.Instance.Resolve <IDatabase>())
            {
                dbUser = database.Users.Get(x =>
                                            x.Username.Equals(pak.Username, StringComparison.OrdinalIgnoreCase) &&
                                            x.Password.Equals(pak.Password, StringComparison.OrdinalIgnoreCase));

                // Check if user exist and with good password in database.
                if (dbUser == null)
                {
                    Logger.LogWarning(
                        $"[SECURITY] Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                        "Reason: bad presented credentials compared to the database.");
                    client.Disconnect();
                    return;
                }

                dbCharacter = database.Characters.Get(x => x.Name == pak.Name);

                // Check if character name is not already used.
                if (dbCharacter != null)
                {
                    Logger.LogWarning(
                        $"Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                        $"Reason: character name '{pak.Name}' already exists.");
                    ClusterPacketFactory.SendError(client, ErrorType.USER_EXISTS);
                    return;
                }

                DefaultCharacter  defaultCharacter = clusterConfiguration.DefaultCharacter;
                DefaultStartItems defaultEquipment = pak.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman;
                JobData           jobData          = jobs[pak.Job];

                dbCharacter = new DbCharacter()
                {
                    UserId    = dbUser.Id,
                    Name      = pak.Name,
                    Slot      = pak.Slot,
                    SkinSetId = pak.SkinSet,
                    HairColor = (int)pak.HairColor,
                    FaceId    = pak.HeadMesh,
                    HairId    = pak.HairMeshId,
                    BankCode  = pak.BankPassword,
                    Gender    = pak.Gender,
                    ClassId   = pak.Job,
                    Hp        = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                              jobData.MaxHpFactor),
                    Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence,
                                                       jobData.MaxMpFactor, true),
                    Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                       defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true),
                    Strength     = defaultCharacter.Strength,
                    Stamina      = defaultCharacter.Stamina,
                    Dexterity    = defaultCharacter.Dexterity,
                    Intelligence = defaultCharacter.Intelligence,
                    MapId        = defaultCharacter.MapId,
                    PosX         = defaultCharacter.PosX,
                    PosY         = defaultCharacter.PosY,
                    PosZ         = defaultCharacter.PosZ,
                    Level        = defaultCharacter.Level,
                    Gold         = defaultCharacter.Gold,
                    StatPoints   = 0, //TODO: create game constants.
                    SkillPoints  = 0, //TODO: create game constants.
                    Experience   = 0,
                };

                //TODO: create game constants for slot.
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52));

                database.Characters.Create(dbCharacter);
                database.Complete();
            }

            Logger.LogInformation("Character '{0}' has been created successfully for user '{1}' from {2}.",
                                  dbCharacter.Name, pak.Username, client.RemoteEndPoint);

            ClusterPacketFactory.SendPlayerList(client, pak.AuthenticationKey, dbUser.Characters);
        }
コード例 #14
0
ファイル: SavesList.cs プロジェクト: RogaDanar/Dnd
 public SavesList(DefaultCharacter character)
 {
     _character = character;
     Bonusses = new Dictionary<SaveType, int> { { SaveType.Fortitude, 0 }, { SaveType.Reflex, 0 }, { SaveType.Will, 0 } };
 }
コード例 #15
0
 public SkillTrap(Scene scene, Character character, CharacterPhysics physics, int cooldown) : base(scene, character, cooldown)
 {
     this.physics   = physics;
     this.character = (DefaultCharacter)character;
 }
コード例 #16
0
ファイル: MatchHud.cs プロジェクト: cribin/GameLab2017
        public MatchHud(ContentManager content, Director director, Scene scene, bool[] selectedPlayers) : base(content, director, scene)
        {
            playerCount = 4;            //scene.GetPlayers().Count;
            playerScoreTextHudElements = new List <TextHudElement>(playerCount);
            playerAmmoCount            = new List <AmmoSpriteHudElement>();
            playerAmmoSprites          = new List <Sprite> [playerCount];
            //Init SpriteHudElements
            matchUI = new List <SimpleSpriteHudElement>();

            //Add Match UI for the selected players
            Actor actor;

            for (int i = 0; i < selectedPlayers.Length; i++)
            {
                if (selectedPlayers[i])
                {
                    actor = scene.MatchUiPos[i];
                    matchUI.Add(new SimpleSpriteHudElement(this, (Sprite)actor.getRepresentation()));
                }
            }

            //Add Match trasure count UI( assumes that Treasure UI is saved last in the tiled map)
            actor = scene.MatchUiPos[scene.MatchUiPos.Count - 1];
            matchUI.Add(new SimpleSpriteHudElement(this, (Sprite)actor.getRepresentation()));

            //Init TextHudElements
            InitHudUIPositions();

            InitAmmoCountSprites();

            // Add player score to the Hud
            foreach (Player p in scene.GetPlayers())
            {
                Func <object, string> textFunc  = (object arg) => scene.Scores[p].getScore().ToString();
                Func <object, Color>  colorFunc = (object arg) => Color.Black;
                TextHudElement        currentPlayerScoreTextHudElement = new TextHudElement(this, fonts.Last(), textFunc, colorFunc, null, null);
                currentPlayerScoreTextHudElement.SetPosition(new Vector3(playerScorePos[(int)p.playerIndex], 0));
                playerScoreTextHudElements.Add(currentPlayerScoreTextHudElement);

                DefaultCharacter character = p.PossesedCharacters[0] as DefaultCharacter;
                if (character != null)
                {
                    Func <Sprite> spriteFunc = () =>
                    {
                        var ammoCount = ((DefaultCharacter)p.PossesedCharacters[0]).AmmoCount;
                        if (ammoCount > 0)
                        {
                            Sprite playerAmmoSprite =
                                playerAmmoSprites[(int)p.playerIndex][(int)ammoCount - 1];
                            Rectangle boundingBox = character.CharacterPhysics.BoundingBox;
                            playerAmmoSprite.SetPosition(new Vector3(boundingBox.Center.X - 10, boundingBox.Top - 10, 0));
                            return(playerAmmoSprite);
                        }
                        return(null);
                    };
                    AmmoSpriteHudElement currentPlayerAmmoHudElement = new AmmoSpriteHudElement(this, spriteFunc, null);
                    playerAmmoCount.Add(currentPlayerAmmoHudElement);
                    //......
                }
            }

            //Add treasureCount to the Hud
            Func <object, string> treasureTextFunc  = (object arg) => scene.TreasuresLeft.ToString();
            Func <object, Color>  treasureColorFunc = (object arg) => Color.IndianRed;
            TextHudElement        treasureCount     = new TextHudElement(this, fonts.Last(), treasureTextFunc, treasureColorFunc, null, null);

            treasureCount.SetPosition(new Vector3(treasureScorePos, 0f));
            playerScoreTextHudElements.Add(treasureCount);

            hudElements.AddRange(matchUI);
            hudElements.AddRange(playerScoreTextHudElements);
            hudElements.AddRange(playerAmmoCount);
        }
コード例 #17
0
        public override void Draw(SpriteBatch batch)
        {
            batch.Begin(transformMatrix: camera.GetViewMatrix());

            foreach (Actor a in scene.GetActors())
            {
                a.Draw(batch);
            }


            batch.End();

            DrawFoliageWithAlphaMask(batch);

            foreach (ParticleEffectManager particleEffect in scene.ParticleEffects)
            {
                particleEffect.Draw(batch, camera);
            }

            scene.ParticleEffects.RemoveAll(pEffect => (pEffect.EffectDuration <= 0 && !pEffect.Continuous));

            scene.LightningManager.Draw(batch);

            batch.Begin(transformMatrix: camera.GetViewMatrix());

            //Debug code, TODO: REMOVE LATER
            SpriteFont debugFont = hud.fonts[1];

            /*Draw outlines for each of the collidables
             * foreach (Collidable polygon in scene.GetCollidables())
             * {
             * DrawPolygon(batch, polygon, Color.Red, false);
             * }
             *
             * //character Boundingbox
             * Collidable boundingBox = Polygon.RectangleToPolygon(character.CharacterPhysics.BoundingBox);
             * DrawPolygon(batch, boundingBox, Color.Green, false);*/
            //Draw  MinX and MaxX for each walkable polygon

            /*foreach (Collidable polygon in scene.WalkableCollidables)
             * {
             *  DrawLine(batch, new Vector2(polygon.WalkableMinMax.X, polygon.MaxHeight), new Vector2(polygon.WalkableMinMax.Y, polygon.MinHeight), Color.Red);
             * }
             *
             * //Draw the same numbers for climbable collidables that are connected to each other (= ClimbGroup)
             * int counter = 0;
             *
             * foreach (ClimbGroup climbGroup in scene.NavigationGraph.CurrClimbGroup)
             * {
             *  foreach (Collidable c in climbGroup.ClimbCollidables)
             *      batch.DrawString(hud.defaultFont, counter.ToString(), new Vector2(c.Center.X, c.CenterYClimbGroup), Color.White);
             *
             *  counter++;
             * }
             *
             * counter = 0;
             * //Draw the same numbers for platforms that are connected to each other via climbable polygon
             * foreach (NavGraphNode nav1 in scene.NavigationGraph.NavGraphNodes)
             * {
             *  if (nav1.ReachableNodes.Count == 0) continue;
             *
             *
             *
             *  foreach (var nav2 in nav1.ReachableNodes)
             *  {
             *      batch.DrawString(hud.defaultFont, counter.ToString(), nav2.Item2, Color.White);
             *      batch.DrawString(hud.defaultFont, counter.ToString(), nav2.Item3, Color.White);
             *  }
             *
             *  counter++;
             * }
             *
             * foreach (NavGraphNode node in scene.NavigationGraph.NavGraphNodes)
             * {
             *  DrawPolygon(batch, node.Platform, Color.White, true);
             * }*/
#if DEBUG
            // Draw the character's query point for the platforms
            for (int i = 0; i < scene.Characters.Count; i++)
            {
                DefaultCharacter c = (DefaultCharacter)scene.Characters[i];

                if (c?.CharacterPhysics == null)
                {
                    continue;
                }

                /*float tempX, tempY, tempWidth, tempHeight;
                 * tempX = (float)Math.Round(c.CharacterPhysics.GetPosition().X + c.CharacterPhysics.hitboxOffset.X - 1, MidpointRounding.AwayFromZero);
                 * tempY = (float)Math.Round(c.CharacterPhysics.GetPosition().Y + c.CharacterPhysics.hitboxOffset.Y - 1, MidpointRounding.AwayFromZero);
                 * tempWidth = c.CharacterPhysics.BoundingBox.Width;
                 * tempHeight = c.CharacterPhysics.BoundingBox.Height;
                 *
                 * // Point below character
                 * Vector2 pos = new Vector2(tempX + 0.5f * tempWidth, tempY);
                 * Vector2 p = new Vector2(pos.X, tempY + 1.5f * tempHeight);
                 *
                 * //batch.DrawString(hud.defaultFont, "o", p, Color.White);
                 * DrawLine(batch, pos, p, Color.AntiqueWhite);*/

                Collidable col = c.CharacterPhysics.QueryCurrentPlatform();
                DrawPolygon(batch, col, Color.Blue, false, "p" + i);
            }

            // Debug Rendering of Navigational-Graph
            for (int i = 0; i < scene.NavigationGraph.NavGraphNodes.Length; i++)
            {
                NavGraphNode n = scene.NavigationGraph.NavGraphNodes[i];

                DrawLine(batch, new Vector2(n.Platform.WalkableMinMax.X, n.Platform.MinHeight), new Vector2(n.Platform.WalkableMinMax.Y, n.Platform.MinHeight), Color.Yellow);

                batch.DrawString(debugFont, "n_" + i, n.Platform.Center + new Vector2(0, 10), Color.Orange);
                foreach (Tuple <NavGraphNode, Vector2, Vector2> t in n.ReachableNodes)
                {
                    DrawLine(batch, t.Item2, t.Item3, Color.Orange);
                    batch.DrawString(debugFont, "rn_" + i, t.Item2 + new Vector2(0, 0), Color.OrangeRed);
                }
            }

            // Debug Rendering of the Path of the Ai-Characters
            List <AiController> lc = scene.GetAiControllers();
            for (int i = 0; i < lc.Count; i++)
            {
                AiIndigenController c = (AiIndigenController)lc[i];
                if (c == null || c.Path.Count == 0)
                {
                    continue;
                }

                Vector3 pos = c.PossesedCharacters[0].GetCenterPosition();
                DrawLine(batch, pos, c.Path[0].Position, Color.White);
                batch.DrawString(debugFont, "w" + i, new Vector2(pos.X, pos.Y), Color.White);
                for (int j = 0; j < c.Path.Count - 1; j++)
                {
                    DrawLine(batch, c.Path[j].Position, c.Path[j + 1].Position, Color.White);
                    batch.DrawString(debugFont, (j + 1).ToString(), new Vector2(c.Path[j].Position.X, c.Path[j].Position.Y), Color.White);
                }
            }
#endif
            hud.DrawHud(batch);

            if (scene.MatchPaused)
            {
                scene.MatchPauseScreen.Draw(batch);
            }

            batch.End();
        }
コード例 #18
0
        public static Character ImportCharacter(string characterPath, ContentManager content, Scene.Scene scene)
        {
            XDocument characterDoc  = XDocument.Load(characterPath);
            XElement  characterXml  = characterDoc.Element("character");
            string    characterName = (string)characterXml.Attribute("name");

            ////LOAD IN GRAPHICS VARIABLES////

            XElement graphics       = characterXml.Element("graphics");
            XElement spriteSheet    = graphics.Element("spritesheet");
            string   spriteSheetSrc = (string)spriteSheet.Attribute("src");
            int      numOfRows      = (int)spriteSheet.Attribute("num_rows");
            int      numOfCols      = (int)spriteSheet.Attribute("num_cols");
            int      spriteWidth    = (int)spriteSheet.Attribute("width");
            int      spriteHeight   = (int)spriteSheet.Attribute("height");

            Texture2D   texture = content.Load <Texture2D>(MainConfig.PIPELINE_GRAPHICS_DIRECTORY + spriteSheetSrc);
            Spritesheet characterSpritesheet = new Spritesheet(texture, numOfRows, numOfCols, spriteWidth, spriteHeight, 20);

            //Load in animations
            foreach (XElement animation in spriteSheet.Elements("animation"))
            {
                string    animName    = (string)animation.Attribute("name");
                int       msperframe  = (int)animation.Attribute("msperframe");
                int[]     msperframes = { msperframe };
                bool      loopable    = (bool)animation.Attribute("loopable");
                int[]     frameSeq;
                Animation newAnim;

                //check if animation has a frame_seq element tag, if not, the frame sequence is continious
                if (animation.HasElements)
                {
                    XElement frameSeqXml = animation.Element("frame_seq");
                    List <Tuple <int, int[], int[]> > layers = new List <Tuple <int, int[], int[]> >();
                    int layerNum = 0;

                    foreach (XElement sprites in frameSeqXml.Elements("sprites"))
                    {
                        string[] frameSeqString = ((string)sprites.Attribute("ids")).Split(',');
                        layerNum = (int)sprites.Attribute("layer");
                        //LINQ expressions(turns string array into int array)
                        frameSeq = frameSeqString.Select(int.Parse).ToArray();
                        layers.Add(new Tuple <int, int[], int[]>(layerNum, frameSeq, msperframes));
                    }

                    //Initilaize Animation depending on the number of layers
                    newAnim = layers.Count > 1 ? new Animation(animName, layers, loopable) : new Animation(animName, layers[0].Item1, layers[0].Item2, layers[0].Item3[0], loopable);
                }
                else
                {
                    string[] frameSeqString = ((string)animation.Attribute("frame_seq")).Split(',');
                    frameSeq = frameSeqString.Select(int.Parse).ToArray();
                    frameSeq = Enumerable.Range(frameSeq[0], (frameSeq[1] - frameSeq[0]) + 1).ToArray();

                    newAnim = new Animation(animName, 1, frameSeq, msperframe, loopable);
                }

                characterSpritesheet.AddAnimation(newAnim);
            }

            //Load in hitbox(hitbox is defined from the upper left corner vs. tiled image defined from the lower left corner)
            XElement  hitboxOffset = graphics.Element("hitbox");
            Rectangle hitbox       = new Rectangle((int)hitboxOffset.Element("x"), (int)hitboxOffset.Element("y"), (int)hitboxOffset.Element("width"), (int)hitboxOffset.Element("height"));
            //TODO: Load in single sprites if necessary

            Character character;

            //TODO:Handle more character types
            switch (characterName)
            {
            case "Shopkeeper":
                character = new ShopKeeper(characterSpritesheet, scene, hitbox);
                break;

            default:
                //RenderObject testSprite = new Sprite(content.Load<Texture2D>("assets/graphics/playerSquare"), true);
                character = new DefaultCharacter(characterSpritesheet, scene, hitbox);
                break;
            }

            //// LOAD IN CHARACTER DESCRIPTION VARIABLES////

            XElement charDescription = characterXml.Element("char_description");

            //Set each of the properties of the character
            foreach (var property in character.GetType().GetProperties())
            {
                if (charDescription.Element(property.Name) == null)
                {
                    continue;
                }

                object propValue = Convert.ChangeType(charDescription.Element(property.Name).Value,
                                                      property.PropertyType);
                property.SetValue(character, propValue);
            }

            return(character);
        }