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; }
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); }
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)); }
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; }
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; }
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; } } } }
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; }
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; } } }
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; }
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; } } }
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); }
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); }
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); }
public SavesList(DefaultCharacter character) { _character = character; Bonusses = new Dictionary<SaveType, int> { { SaveType.Fortitude, 0 }, { SaveType.Reflex, 0 }, { SaveType.Will, 0 } }; }
public SkillTrap(Scene scene, Character character, CharacterPhysics physics, int cooldown) : base(scene, character, cooldown) { this.physics = physics; this.character = (DefaultCharacter)character; }
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); }
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(); }
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); }