From de702b6a8ed76d385bf9898438e158ddb184513f Mon Sep 17 00:00:00 2001 From: polten0 Date: Fri, 18 Aug 2023 02:00:58 +0300 Subject: [PATCH 01/23] FirstNotGoodWorkUI --- DangerousD/GameCore/GUI/AbstractGui.cs | 133 +++++++++++++++++++++++++ MonogameLibrary/UI/Elements/Button.cs | 6 +- 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 7f7b212..6615820 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -1,8 +1,13 @@ using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Xml; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; using MonogameLibrary.UI.Base; +using MonogameLibrary.UI.Elements; namespace DangerousD.GameCore.GUI; @@ -10,6 +15,9 @@ public abstract class AbstractGui : IDrawableObject { protected UIManager Manager = new(); protected List Elements = new(); + private List ActiveElements; + protected DrawableUIElement SelectedElement; + private bool isPressed = false; public AbstractGui() { @@ -22,6 +30,16 @@ public abstract class AbstractGui : IDrawableObject Manager.Initialize(AppManager.Instance.GraphicsDevice); this.graphicsDevice = graphicsDevice; CreateUI(); + ActiveElements = new List(); + foreach (var element in Elements) + { + if (CheckOnBadElements(element)) + { + ActiveElements.Add(element); + } + } + if (ActiveElements.Count > 0) { SelectedElement = ActiveElements.First(); } + } public virtual void LoadContent() @@ -31,6 +49,25 @@ public abstract class AbstractGui : IDrawableObject public virtual void Update(GameTime gameTime) { + string state = AppManager.Instance.InputManager.currentControlsState; + + if (ActiveElements.Count != 0) + { + switch (state) + { + case "Gamepad": + GamePadState gamePadState = GamePad.GetState(0); + GamepadInput(gamePadState); + break; + case "Keyboard": + KeyboardState keyBoardState = Keyboard.GetState(0); + KeyBoardInput(keyBoardState); + break; + default: + break; + } + } + Manager.Update(); } @@ -38,4 +75,100 @@ public abstract class AbstractGui : IDrawableObject { Manager.Draw(spriteBatch); } + protected virtual void GamepadInput(GamePadState gamePadState) + { + if (gamePadState.DPad.Up == ButtonState.Pressed && !isPressed) + { + isPressed = true; + ChangeSelectedElement(-1); + } + else if (gamePadState.DPad.Down == ButtonState.Pressed && !isPressed) + { + isPressed = true; + ChangeSelectedElement(1); + } + else if (gamePadState.Buttons.A == ButtonState.Pressed && !isPressed) + { + Debug.WriteLine("ssss"); + isPressed = true; + if (SelectedElement is ButtonText) + { + Button button = SelectedElement as ButtonText; + button.CallLeftBtnEvent(); + } + } + else if (isPressed) + { + isPressed = false; + } + } + protected virtual void KeyBoardInput(KeyboardState keyboardState) + { + if (keyboardState.IsKeyDown(Keys.Up) && !isPressed) + { + isPressed = true; + ChangeSelectedElement(-1); + } + else if (keyboardState.IsKeyDown(Keys.Down) && !isPressed) + { + isPressed = true; + ChangeSelectedElement(1); + } + else if (keyboardState.IsKeyDown(Keys.Enter) && !isPressed) + { + isPressed = true; + if (SelectedElement is Button) + { + Button button = SelectedElement as Button; + button.CallLeftBtnEvent(); + } + } + else if (isPressed) + { + isPressed = false; + } + } + private void ChangeSelectedElement(int x) // Меняет выбранный элемент + { + for (int i = 0; i < ActiveElements.Count; i++) + { + if (ActiveElements[i] == SelectedElement) + { + if (i == 0) + { + SelectedElement = ActiveElements.Last(); + } + else + { + if (i == ActiveElements.Count - 1 && x >= 1) + { + SelectedElement = ActiveElements.First(); + } + else + { + SelectedElement = ActiveElements[i + x]; + } + + } + + } + + } + } + private bool CheckOnBadElements(DrawableUIElement element) + { + if (element is Button) + { + return true; + } + else if (element is ButtonText) + { + return true; + } + else if (element is CheckBox) + { + return true; + } + else return false; + } } \ No newline at end of file diff --git a/MonogameLibrary/UI/Elements/Button.cs b/MonogameLibrary/UI/Elements/Button.cs index cf7d5ce..051f31f 100644 --- a/MonogameLibrary/UI/Elements/Button.cs +++ b/MonogameLibrary/UI/Elements/Button.cs @@ -40,7 +40,7 @@ namespace MonogameLibrary.UI.Elements if (mouseState.LeftButton != prevmouseState.LeftButton) { hoverState = HoverState.Pressing; - LeftButtonPressed?.Invoke(); + CallLeftBtnEvent(); return true; } } @@ -77,5 +77,9 @@ namespace MonogameLibrary.UI.Elements DrawText(_spriteBatch); } + public void CallLeftBtnEvent() + { + LeftButtonPressed?.Invoke(); + } } } From 1f3108adcdd37ef6bbcf3653bf7ab4067dcde61c Mon Sep 17 00:00:00 2001 From: polten0 Date: Fri, 18 Aug 2023 02:46:59 +0300 Subject: [PATCH 02/23] finish1IterOfSwitchingUI --- DangerousD/GameCore/GUI/AbstractGui.cs | 51 ++++++++++--------- .../LivingEntities/Player/Player.cs | 1 + DangerousD/GameCore/InputManager.cs | 1 + MonogameLibrary/UI/Elements/Button.cs | 2 +- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 6615820..34bea14 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -51,24 +51,25 @@ public abstract class AbstractGui : IDrawableObject { string state = AppManager.Instance.InputManager.currentControlsState; + + if (ActiveElements.Count != 0) { - switch (state) + if (state == "Gamepad") { - case "Gamepad": - GamePadState gamePadState = GamePad.GetState(0); - GamepadInput(gamePadState); - break; - case "Keyboard": - KeyboardState keyBoardState = Keyboard.GetState(0); - KeyBoardInput(keyBoardState); - break; - default: - break; + GamePadState gamePadState = GamePad.GetState(0); + GamepadInput(gamePadState); + } + else if (state == "Keyboard" || state == "Mouse") + { + KeyboardState keyBoardState = Keyboard.GetState(); + KeyBoardInput(keyBoardState); } } Manager.Update(); + + (SelectedElement as Button).hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; } public virtual void Draw(SpriteBatch spriteBatch) @@ -81,6 +82,7 @@ public abstract class AbstractGui : IDrawableObject { isPressed = true; ChangeSelectedElement(-1); + Debug.WriteLine("switch"); } else if (gamePadState.DPad.Down == ButtonState.Pressed && !isPressed) { @@ -89,7 +91,6 @@ public abstract class AbstractGui : IDrawableObject } else if (gamePadState.Buttons.A == ButtonState.Pressed && !isPressed) { - Debug.WriteLine("ssss"); isPressed = true; if (SelectedElement is ButtonText) { @@ -97,7 +98,9 @@ public abstract class AbstractGui : IDrawableObject button.CallLeftBtnEvent(); } } - else if (isPressed) + else if (isPressed && (gamePadState.Buttons.A == ButtonState.Released && + gamePadState.DPad.Down == ButtonState.Released && + gamePadState.DPad.Up == ButtonState.Released)) { isPressed = false; } @@ -123,7 +126,9 @@ public abstract class AbstractGui : IDrawableObject button.CallLeftBtnEvent(); } } - else if (isPressed) + else if (isPressed && (keyboardState.IsKeyUp(Keys.Enter) && + keyboardState.IsKeyUp(Keys.Down) && + keyboardState.IsKeyUp(Keys.Up))) { isPressed = false; } @@ -134,25 +139,25 @@ public abstract class AbstractGui : IDrawableObject { if (ActiveElements[i] == SelectedElement) { - if (i == 0) + if (i + x >= ActiveElements.Count) { - SelectedElement = ActiveElements.Last(); + SelectedElement = ActiveElements.First(); + return; } else { - if (i == ActiveElements.Count - 1 && x >= 1) + if (i + x < 0) { - SelectedElement = ActiveElements.First(); + SelectedElement = ActiveElements.Last(); + return; } else { SelectedElement = ActiveElements[i + x]; + return; } - } - } - } } private bool CheckOnBadElements(DrawableUIElement element) @@ -165,10 +170,6 @@ public abstract class AbstractGui : IDrawableObject { return true; } - else if (element is CheckBox) - { - return true; - } else return false; } } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 066b1d4..eef557f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -9,6 +9,7 @@ using DangerousD.GameCore.GameObjects.PlayerDeath; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Graphics; using DangerousD.GameCore.GameObjects.LivingEntities.Monsters; +using DangerousD.GameCore.Network; namespace DangerousD.GameCore.GameObjects.LivingEntities { diff --git a/DangerousD/GameCore/InputManager.cs b/DangerousD/GameCore/InputManager.cs index c171d6b..3846bc2 100644 --- a/DangerousD/GameCore/InputManager.cs +++ b/DangerousD/GameCore/InputManager.cs @@ -158,6 +158,7 @@ namespace DangerousD.GameCore { isShoot = false; } + SetState(ControlsState.Keyboard); } } } diff --git a/MonogameLibrary/UI/Elements/Button.cs b/MonogameLibrary/UI/Elements/Button.cs index 051f31f..769335f 100644 --- a/MonogameLibrary/UI/Elements/Button.cs +++ b/MonogameLibrary/UI/Elements/Button.cs @@ -16,7 +16,7 @@ namespace MonogameLibrary.UI.Elements public delegate void OnButtonPressed(); public event OnButtonPressed? RightButtonPressed; public event OnButtonPressed? LeftButtonPressed; - protected HoverState hoverState = HoverState.None; + public HoverState hoverState = HoverState.None; public Button(UIManager manager, int layerIndex = 0) : base(manager, layerIndex) { From 731e69d92e8e9a84cfc5c59df363d5e0cff30b64 Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 03:03:11 +0300 Subject: [PATCH 03/23] tiltedSlime --- .../LivingEntities/Monsters/Slime.cs | 111 ++++++++++++++---- DangerousD/GameCore/Managers/AppManager.cs | 2 +- .../GameCore/Managers/PhysicsManager.cs | 15 +++ 3 files changed, 107 insertions(+), 21 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 0e5e954..e9cba93 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -13,7 +13,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public class Slime : CoreEnemy { private bool isGoRight = true; - private bool isDown = false; + private bool isDown = true; int leftBorder; int rightBorder; bool isAttaking = false; @@ -38,13 +38,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public override void Attack() { - + } public void Jump() { var getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle(0, 0, 100, 100)); velocity.X = 0; Height = 32; + if (isGoRight && isDown) { if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpLeftBottom") @@ -54,8 +55,9 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters delay--; if (delay <= 0) { - isJumping = true; + velocity = new Vector2(5, -3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftBottom") { GraphicsComponent.StartAnimation("SlimeJumpLeftBottom"); @@ -71,17 +73,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } else if (!isGoRight && isDown) { - if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpRightTop") + if (GraphicsComponent.GetCurrentAnimation != "SlimeReadyJumpRightBottom") { - GraphicsComponent.StartAnimation("SlimeReadyJumpRightTop"); + GraphicsComponent.StartAnimation("SlimeReadyJumpRightBottom"); } delay--; if (delay <= 0) { + velocity = new Vector2(-5, -3); - if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightTop") + acceleration.Y = 0; + if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightBottom") { - GraphicsComponent.StartAnimation("SlimeJumpRightTop"); + GraphicsComponent.StartAnimation("SlimeJumpRightBottom"); } getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y - 5, 48, 5)); if (getCols.Count > 0) @@ -101,17 +105,20 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters delay--; if (delay <= 0) { - isJumping = true; + velocity = new Vector2(5, 3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftTop") { GraphicsComponent.StartAnimation("SlimeJumpLeftTop"); } - getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); + if (getCols.Count > 0) { isJumping = false; isDown = true; + acceleration.Y = 10; } } @@ -126,15 +133,18 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (delay <= 0) { velocity = new Vector2(-5, 3); + acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightTop") { GraphicsComponent.StartAnimation("SlimeJumpRightTop"); } - getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); if (getCols.Count > 0) { isJumping = false; isDown = true; + acceleration.Y = 10; + } } @@ -144,8 +154,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters } public override void Draw(SpriteBatch spriteBatch) { - spriteBatch.Draw(debugTexture, new Rectangle((int)Pos.X, (int)Pos.Y - 5, 48, 5), Color.White); - spriteBatch.Draw(debugTexture, new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5), Color.White); + + base.Draw(spriteBatch); } public override void Death() @@ -197,15 +207,24 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters velocity.X = -monster_speed; } - - if (Pos.X >= rightBorder) + var getCols= AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height / 2 - 2, 50, 2)); ; + if (isGoRight) { - isGoRight = false; + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height / 2 - 2, 51, 2)); } - - else if (Pos.X <= leftBorder) + else { - isGoRight = true; + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X-3, (int)Pos.Y + Height / 2 - 2, 51, 2)); + } + + + foreach(var item in getCols) + { + if(item is MapObject) + { + isGoRight = !isGoRight; + break; + } } } public override void Update(GameTime gameTime) @@ -227,8 +246,25 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters acceleration.Y = -acceleration.Y; } } - //if (!isAttaking){ Move(gameTime); } - + Attack(); + + if (!isJumping) + { + if (isDown) + { + Jump(); + } + else if(IsInAim()) + { + Jump(); + } + else + { + Move(gameTime); + } + + } + base.Update(gameTime); } @@ -237,10 +273,45 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { } + public bool IsInAim() + { + var getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y + Height, 48, 5)); + + if (isGoRight && !isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X + Width, (int)Pos.Y + Height, 200, 500), false); + if (getCols.Count > 0) + { + return true; + } + } + else if (!isGoRight && !isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 200, (int)Pos.Y + Height, 200, 500), false); + if (getCols.Count > 0) + { + return true; + } + } + + return false; + + } public override void Attack(GameTime gameTime) { } + public override void OnCollision(GameObject gameObject) + { + if (gameObject is Player) + { + if (AppManager.Instance.GameManager.players[0].IsAlive) + { + AppManager.Instance.GameManager.players[0].Death(name); + } + } + base.OnCollision(gameObject); + } } } diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 5e53677..e173abb 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -202,7 +202,7 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: - GameManager.mapManager.LoadLevel("lvl"); + GameManager.mapManager.LoadLevel("map"); break; case GameState.Death: break; diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index 7899c98..a2fd4f2 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -234,6 +234,21 @@ namespace DangerousD.GameCore.Managers } return intersected; } + public List CheckRectangle(Rectangle rectangle, bool player) + { + var gameObjects = AppManager.Instance.GameManager.GetPlayer1; + List intersected = new List(); + + + + if (gameObjects.Rectangle.Intersects(rectangle)) + { + intersected.Add(gameObjects); + } + + + return intersected; + } public List CheckRectangle(Rectangle rectangle) { var gameObjects = AppManager.Instance.GameManager.mapObjects; From b37fbaf4ea1f526c643ac7b83b20209b32136ffd Mon Sep 17 00:00:00 2001 From: gravity Date: Fri, 18 Aug 2023 03:05:57 +0300 Subject: [PATCH 04/23] UI_fullscreen --- DangerousD/GameCore/GUI/DeathGUI.cs | 12 +++++++ DangerousD/GameCore/GUI/LobbyGUI.cs | 21 ++++++++++++ DangerousD/GameCore/GUI/LoginGUI.cs | 17 ++++++++++ DangerousD/GameCore/GUI/MenuGUI.cs | 19 +++++++++-- DangerousD/GameCore/GUI/OptionsGUI.cs | 29 +++++++++++++---- DangerousD/GameCore/Managers/AppManager.cs | 32 +++++++++++++++---- .../GameCore/Managers/SettingsManager.cs | 6 +++- 7 files changed, 119 insertions(+), 17 deletions(-) diff --git a/DangerousD/GameCore/GUI/DeathGUI.cs b/DangerousD/GameCore/GUI/DeathGUI.cs index 5754efa..c19f9b5 100644 --- a/DangerousD/GameCore/GUI/DeathGUI.cs +++ b/DangerousD/GameCore/GUI/DeathGUI.cs @@ -13,6 +13,7 @@ internal class DeathGUI : AbstractGui { int wigth = AppManager.Instance.inGameResolution.X; int height = AppManager.Instance.inGameResolution.Y; + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; var menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), textureName = "deathBackground" }; Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); @@ -24,6 +25,17 @@ internal class DeathGUI : AbstractGui { AppManager.Instance.ChangeGameState(GameState.Menu); }; + foreach (var item in Elements) + { + item.rectangle.X = (int)(scaler * item.rectangle.X); + item.rectangle.Y = (int)(scaler * item.rectangle.Y); + item.rectangle.Width = (int)(scaler * item.rectangle.Width); + item.rectangle.Height = (int)(scaler * item.rectangle.Height); + if (item is DrawableTextedUiElement) + { + (item as DrawableTextedUiElement).scale *= scaler; + } + } } public override void Update(GameTime gameTime) diff --git a/DangerousD/GameCore/GUI/LobbyGUI.cs b/DangerousD/GameCore/GUI/LobbyGUI.cs index 9136760..3b8b9ab 100644 --- a/DangerousD/GameCore/GUI/LobbyGUI.cs +++ b/DangerousD/GameCore/GUI/LobbyGUI.cs @@ -25,6 +25,7 @@ namespace DangerousD.GameCore.GUI { int screenWidth = AppManager.Instance.inGameResolution.X; int screenHeight = AppManager.Instance.inGameResolution.Y; + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; var lobbyBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, screenWidth, screenHeight), textureName = "menuFon3" }; Elements.Add(lobbyBackground); @@ -51,6 +52,7 @@ namespace DangerousD.GameCore.GUI textureName = "textboxbackground6-1" }; + Elements.Add(searchBarTextBox); searchBarTextBox.TextChanged += input => { if (searchBarTextBox.fontColor == Color.Gray) { @@ -73,6 +75,7 @@ namespace DangerousD.GameCore.GUI fontName = "font2", textureName = "textboxbackground1-1" }; + Elements.Add(backButton); backButton.LeftButtonPressed += () => { AppManager.Instance.ChangeGameState(GameState.Menu); }; @@ -86,6 +89,7 @@ namespace DangerousD.GameCore.GUI fontName = "buttonFont", textureName = "textboxbackground2-1" }; + Elements.Add(hostButton); hostButton.LeftButtonPressed += () => { AppManager.Instance.ChangeGameState(GameState.Game); AppManager.Instance.NetworkManager.HostInit(AppManager.Instance.IpAddress); @@ -101,6 +105,7 @@ namespace DangerousD.GameCore.GUI fontName = "buttonFont", textureName = "textboxbackground2-1" }; + Elements.Add(refreshButton); refreshButton.LeftButtonPressed += () => { }; @@ -114,6 +119,7 @@ namespace DangerousD.GameCore.GUI fontName = "buttonFont", textureName = "textboxbackground2-1" }; + Elements.Add(joinSelectedButton); joinSelectedButton.LeftButtonPressed += () => { AppManager.Instance.ChangeGameState(GameState.Game); AppManager.Instance.NetworkManager.ClientInit(AppManager.Instance.IpAddress); @@ -127,10 +133,25 @@ namespace DangerousD.GameCore.GUI fontName = "buttonFont", textureName = "textboxbackground2-1" }; + Elements.Add(joinByIpButton); joinByIpButton.LeftButtonPressed += () => { AppManager.Instance.NetworkManager.ClientInit(searchBarTextBox.text); }; } + + + + foreach (var item in Elements) + { + item.rectangle.X = (int)(scaler * item.rectangle.X); + item.rectangle.Y = (int)(scaler * item.rectangle.Y); + item.rectangle.Width = (int)(scaler * item.rectangle.Width); + item.rectangle.Height = (int)(scaler * item.rectangle.Height); + if (item is DrawableTextedUiElement) + { + (item as DrawableTextedUiElement).scale *= scaler; + } + } } } } diff --git a/DangerousD/GameCore/GUI/LoginGUI.cs b/DangerousD/GameCore/GUI/LoginGUI.cs index 37a62eb..de0a68c 100644 --- a/DangerousD/GameCore/GUI/LoginGUI.cs +++ b/DangerousD/GameCore/GUI/LoginGUI.cs @@ -26,6 +26,7 @@ namespace DangerousD.GameCore.GUI { int screenWidth = AppManager.Instance.inGameResolution.X; int screenHeight = AppManager.Instance.inGameResolution.Y; + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; var loginBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, screenWidth, screenHeight), textureName = "menuFon2" }; Elements.Add(loginBackground); @@ -53,6 +54,7 @@ namespace DangerousD.GameCore.GUI textureName = "textboxbackground6-1" }; + Elements.Add(loginTextBox); loginTextBox.LoadTexture(AppManager.Instance.Content); loginTextBox.TextChanged += input => { if (loginTextBox.fontColor == Color.Gray) @@ -78,6 +80,7 @@ namespace DangerousD.GameCore.GUI textAligment = TextAligment.Left, textureName = "textboxbackground6-1" }; + Elements.Add(passwordTextBox); passwordTextBox.LoadTexture(AppManager.Instance.Content); passwordTextBox.TextChanged += input => { if (passwordTextBox.fontColor == Color.Gray) @@ -104,6 +107,7 @@ namespace DangerousD.GameCore.GUI fontName = "ButtonFont", textureName = "textboxbackground2-1" }; + Elements.Add(logButton); logButton.LeftButtonPressed += () => { if (CheckUser()) { @@ -120,6 +124,7 @@ namespace DangerousD.GameCore.GUI fontName = "ButtonFont", textureName = "textboxbackground2-1" }; + Elements.Add(regButton); regButton.LeftButtonPressed += GoToRegWebServer; Button backButton = new Button(Manager) @@ -131,10 +136,22 @@ namespace DangerousD.GameCore.GUI fontName = "font2", textureName = "textboxbackground1-1" }; + Elements.Add(backButton); backButton.LeftButtonPressed += () => { AppManager.Instance.ChangeGameState(GameState.Menu); }; } + foreach (var item in Elements) + { + item.rectangle.X = (int)(scaler * item.rectangle.X); + item.rectangle.Y = (int)(scaler * item.rectangle.Y); + item.rectangle.Width = (int)(scaler * item.rectangle.Width); + item.rectangle.Height = (int)(scaler * item.rectangle.Height); + if (item is DrawableTextedUiElement) + { + (item as DrawableTextedUiElement).scale *= scaler; + } + } } private void GoToRegWebServer() diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index 82170b1..d6e376e 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -13,9 +13,10 @@ internal class MenuGUI : AbstractGui int selected = 0; protected override void CreateUI() { - int wigth = AppManager.Instance.inGameResolution.X; - int height = AppManager.Instance.inGameResolution.Y; - + int wigth = AppManager.Instance.inGameHUDHelperResolution.X; + int height = AppManager.Instance.inGameHUDHelperResolution.Y; + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; + var menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), textureName = "menuFon" }; Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); @@ -59,6 +60,18 @@ internal class MenuGUI : AbstractGui { AppManager.Instance.Exit(); }; + + foreach ( var item in Elements) + { + item.rectangle.X = (int)(scaler * item.rectangle.X); + item.rectangle.Y = (int)(scaler * item.rectangle.Y); + item.rectangle.Width = (int)(scaler * item.rectangle.Width); + item.rectangle.Height = (int)(scaler * item.rectangle.Height); + if (item is DrawableTextedUiElement) + { + (item as DrawableTextedUiElement).scale *= scaler; + } + } } public override void Update(GameTime gameTime) diff --git a/DangerousD/GameCore/GUI/OptionsGUI.cs b/DangerousD/GameCore/GUI/OptionsGUI.cs index 6fc95c7..c879731 100644 --- a/DangerousD/GameCore/GUI/OptionsGUI.cs +++ b/DangerousD/GameCore/GUI/OptionsGUI.cs @@ -13,8 +13,9 @@ namespace DangerousD.GameCore.GUI int selectedGUI = 0; protected override void CreateUI() { - int wigth = AppManager.Instance.inGameResolution.X; - int height = AppManager.Instance.inGameResolution.Y; + int wigth = AppManager.Instance.inGameHUDHelperResolution.X; + int height = AppManager.Instance.inGameHUDHelperResolution.Y; + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; var menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), textureName = "optionsBackground" }; Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); @@ -27,6 +28,8 @@ namespace DangerousD.GameCore.GUI indentation = 5, textureName = "sliderBackground" }; + Elements.Add(slider); + //AppManager.Instance.SettingsManager.SetMainVolume(slider.GetSliderValue); var cB = new CheckBox(Manager); cB.rectangle = new Rectangle(wigth / 2 + 440, 405, (int)(40 * 2.4), (int)(40 * 2.4)); @@ -35,26 +38,28 @@ namespace DangerousD.GameCore.GUI SettingsManager sM = new SettingsManager(); }; cB.LoadTexture(AppManager.Instance.Content); + Elements.Add(cB); var checkBox = new CheckBox(Manager); checkBox.rectangle = new Rectangle(wigth / 2 + 360, 540, (int)(40 * 2.4), (int)(40 * 2.4)); checkBox.Checked += (newCheckState) => { - SettingsManager sM = new SettingsManager(); + AppManager.Instance.SettingsManager.SetIsFullScreen(newCheckState); }; checkBox.LoadTexture(AppManager.Instance.Content); + Elements.Add(checkBox); Label lblOptions = new Label(Manager) { fontName = "buttonFont", scale = 1.2f, text = "Options", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 40, 50, 50), mainColor = Color.Transparent }; Elements.Add(lblOptions); Label lblValue = new Label(Manager) - { fontName = "buttonFont", scale = 1f, text = "Volume", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 250, 50, 50), mainColor = Color.Transparent }; + { fontName = "buttonFont", scale = 1f , text = "Volume", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 250, 50, 50), mainColor = Color.Transparent }; Elements.Add(lblValue); Label lblIsFullScreen = new Label(Manager) - { fontName = "buttonFont", scale = 1f, text = "Full Screen", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 580, 50, 50), mainColor = Color.Transparent }; - Elements.Add(lblOptions); + { fontName = "buttonFont", scale = 1f , text = "Full Screen", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 580, 50, 50), mainColor = Color.Transparent }; + Elements.Add(lblIsFullScreen); Label lblSwitchMode = new Label(Manager) { fontName = "buttonFont", scale = 1f, text = "Left/Right Mode", fontColor = Color.White, rectangle = new Rectangle((wigth - 50) / 2, 415, 50, 50), mainColor = Color.Transparent }; @@ -67,6 +72,18 @@ namespace DangerousD.GameCore.GUI { AppManager.Instance.ChangeGameState(GameState.Menu); }; + + foreach (var item in Elements) + { + item.rectangle.X = (int)(scaler * item.rectangle.X); + item.rectangle.Y = (int)(scaler * item.rectangle.Y); + item.rectangle.Width = (int)(scaler * item.rectangle.Width); + item.rectangle.Height = (int)(scaler * item.rectangle.Height); + if (item is DrawableTextedUiElement) + { + (item as DrawableTextedUiElement).scale *= scaler; + } + } } public override void Update(GameTime gameTime) { diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 84d6b07..b4b3872 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -27,8 +27,9 @@ namespace DangerousD.GameCore private SpriteBatch _spriteBatch; public GameState gameState { get; private set; } public MultiPlayerStatus multiPlayerStatus { get; private set; } = MultiPlayerStatus.SinglePlayer; - public Point resolution = new Point(1920, 1080); + public Point resolution; public Point inGameResolution = new Point(1920, 1080); + public Point inGameHUDHelperResolution = new Point(1920, 1080); IDrawableObject MenuGUI; IDrawableObject OptionsGUI; IDrawableObject LoginGUI; @@ -60,9 +61,7 @@ namespace DangerousD.GameCore NetworkManager.GetReceivingMessages += NetworkSync; resolution = SettingsManager.Resolution; - _graphics.PreferredBackBufferWidth = resolution.X; - _graphics.PreferredBackBufferHeight = resolution.Y; - _graphics.IsFullScreen = false; + gameState = GameState.Menu; MenuGUI = new MenuGUI(); LoginGUI = new LoginGUI(); @@ -71,8 +70,8 @@ namespace DangerousD.GameCore DeathGUI = new DeathGUI(); HUD = new HUD(); DebugHUD = new DebugHUD(); - UIManager.resolution = resolution; - UIManager.resolutionInGame = inGameResolution; + UIManager.resolution = new Point(_graphics.PreferredBackBufferWidth, _graphics.PreferredBackBufferHeight); + UIManager.resolutionInGame = resolution; } protected override void Initialize() @@ -103,7 +102,7 @@ namespace DangerousD.GameCore GameObject.debugTexture.SetData(new Color[] { new Color(1, 0,0,0.25f) }); SoundManager.LoadSounds(); SoundManager.StartAmbientSound("DoomTestSong"); - renderTarget = new RenderTarget2D(GraphicsDevice, inGameResolution.X, inGameResolution.Y); + renderTarget = new RenderTarget2D(GraphicsDevice, resolution.X, resolution.Y); } protected override void Update(GameTime gameTime) @@ -253,5 +252,24 @@ namespace DangerousD.GameCore { this.multiPlayerStatus = multiPlayerStatus; } + public void SetIsFullScreen(bool fullscrin) + { + DebugHUD?.Set("resX:", SettingsManager.Resolution.X.ToString()); + DebugHUD?.Set("resY:", SettingsManager.Resolution.Y.ToString()); + DebugHUD?.Set("FullScreen:", _graphics.IsFullScreen.ToString()); + if (fullscrin) + { + _graphics.PreferredBackBufferWidth = 1920; + _graphics.PreferredBackBufferHeight = 1080; + } + else + { + _graphics.PreferredBackBufferWidth = SettingsManager.Resolution.X; + _graphics.PreferredBackBufferHeight = SettingsManager.Resolution.Y; + } + UIManager.resolution = new Point(_graphics.PreferredBackBufferWidth, _graphics.PreferredBackBufferHeight); + _graphics.IsFullScreen = fullscrin; + _graphics.ApplyChanges(); + } } } diff --git a/DangerousD/GameCore/Managers/SettingsManager.cs b/DangerousD/GameCore/Managers/SettingsManager.cs index 7a55447..b781ef1 100644 --- a/DangerousD/GameCore/Managers/SettingsManager.cs +++ b/DangerousD/GameCore/Managers/SettingsManager.cs @@ -27,22 +27,26 @@ namespace DangerousD.GameCore.Managers public void SetMainVolume(float volume) { settingsContainer.MainVolume = MainVolume; - ///AppManager.Instance.SoundManager. + //AppManager.Instance.SoundManager. } public void SetMusicVolume(float volume) { settingsContainer.MusicVolume = MainVolume; + SaveSettings(); } public void SetSoundEffectsVolume(float volume) { settingsContainer.SoundEffectsVolume = MainVolume; + SaveSettings(); } public void SetIsFullScreen(bool isFullScreen) { settingsContainer.IsFullScreen = isFullScreen; + AppManager.Instance.SetIsFullScreen(isFullScreen); + SaveSettings(); } public void LoadSettings() { From 6d1f7f750a779b586326b641cb59180a0142f963 Mon Sep 17 00:00:00 2001 From: polten0 Date: Fri, 18 Aug 2023 04:18:52 +0300 Subject: [PATCH 05/23] AnotherTryFix --- DangerousD/GameCore/GUI/AbstractGui.cs | 44 ++++++++++++++++++++++++-- DangerousD/GameCore/GUI/LoginGUI.cs | 31 +++++++++++------- MonogameLibrary/UI/Elements/TextBox.cs | 6 +++- 3 files changed, 65 insertions(+), 16 deletions(-) diff --git a/DangerousD/GameCore/GUI/AbstractGui.cs b/DangerousD/GameCore/GUI/AbstractGui.cs index 34bea14..9b08d60 100644 --- a/DangerousD/GameCore/GUI/AbstractGui.cs +++ b/DangerousD/GameCore/GUI/AbstractGui.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -17,6 +18,7 @@ public abstract class AbstractGui : IDrawableObject protected List Elements = new(); private List ActiveElements; protected DrawableUIElement SelectedElement; + private bool isStartedPrint = false; private bool isPressed = false; public AbstractGui() @@ -65,11 +67,31 @@ public abstract class AbstractGui : IDrawableObject KeyboardState keyBoardState = Keyboard.GetState(); KeyBoardInput(keyBoardState); } + } Manager.Update(); - (SelectedElement as Button).hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; + if (SelectedElement is not null) + { + if (SelectedElement is Button) + { + (SelectedElement as Button).hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; + } + if (SelectedElement is ButtonText) + { + (SelectedElement as ButtonText).hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; + } + if (SelectedElement is TextBox) + { + TextBox box = (TextBox)SelectedElement; + box.hoverState = MonogameLibrary.UI.Enums.HoverState.Hovering; + if (isStartedPrint) + { + box.SelectIt(); + } + } + } } public virtual void Draw(SpriteBatch spriteBatch) @@ -92,11 +114,16 @@ public abstract class AbstractGui : IDrawableObject else if (gamePadState.Buttons.A == ButtonState.Pressed && !isPressed) { isPressed = true; - if (SelectedElement is ButtonText) + if (SelectedElement is Button) { - Button button = SelectedElement as ButtonText; + Button button = SelectedElement as Button; button.CallLeftBtnEvent(); } + else if (SelectedElement is TextBox) + { + TextBox textBox = SelectedElement as TextBox; + isStartedPrint = true; + } } else if (isPressed && (gamePadState.Buttons.A == ButtonState.Released && gamePadState.DPad.Down == ButtonState.Released && @@ -110,11 +137,13 @@ public abstract class AbstractGui : IDrawableObject if (keyboardState.IsKeyDown(Keys.Up) && !isPressed) { isPressed = true; + isStartedPrint = false; ChangeSelectedElement(-1); } else if (keyboardState.IsKeyDown(Keys.Down) && !isPressed) { isPressed = true; + isStartedPrint = false; ChangeSelectedElement(1); } else if (keyboardState.IsKeyDown(Keys.Enter) && !isPressed) @@ -125,6 +154,11 @@ public abstract class AbstractGui : IDrawableObject Button button = SelectedElement as Button; button.CallLeftBtnEvent(); } + else if (SelectedElement is TextBox) + { + TextBox textBox = SelectedElement as TextBox; + isStartedPrint = true; + } } else if (isPressed && (keyboardState.IsKeyUp(Keys.Enter) && keyboardState.IsKeyUp(Keys.Down) && @@ -170,6 +204,10 @@ public abstract class AbstractGui : IDrawableObject { return true; } + else if (element is TextBox) + { + return true; + } else return false; } } \ No newline at end of file diff --git a/DangerousD/GameCore/GUI/LoginGUI.cs b/DangerousD/GameCore/GUI/LoginGUI.cs index 37a62eb..45a6de8 100644 --- a/DangerousD/GameCore/GUI/LoginGUI.cs +++ b/DangerousD/GameCore/GUI/LoginGUI.cs @@ -40,6 +40,20 @@ namespace DangerousD.GameCore.GUI fontName = "ButtonFont" }); + Button backButton = new Button(Manager) + { + rectangle = new Rectangle(screenWidth / 20, screenHeight / 15, (int)(40 * 2.4), (int)(40 * 2.4)), + text = "<-", + scale = 0.72f, + fontColor = Color.Black, + fontName = "font2", + textureName = "textboxbackground1-1" + }; + backButton.LeftButtonPressed += () => { + AppManager.Instance.ChangeGameState(GameState.Menu); + }; + Elements.Add(backButton); + // TextBox-ы { TextBox loginTextBox = new TextBox(Manager) @@ -67,6 +81,7 @@ namespace DangerousD.GameCore.GUI loginTextBox.fontColor = Color.Gray; } }; + Elements.Add(loginTextBox); TextBox passwordTextBox = new TextBox(Manager) { @@ -92,6 +107,7 @@ namespace DangerousD.GameCore.GUI passwordTextBox.fontColor = Color.Gray; } }; + Elements.Add(passwordTextBox); } // Кнопки @@ -110,6 +126,7 @@ namespace DangerousD.GameCore.GUI AppManager.Instance.ChangeGameState(GameState.Lobby); } }; + Elements.Add(logButton); Button regButton = new Button(Manager) { @@ -121,19 +138,9 @@ namespace DangerousD.GameCore.GUI textureName = "textboxbackground2-1" }; regButton.LeftButtonPressed += GoToRegWebServer; + Elements.Add(regButton); + - Button backButton = new Button(Manager) - { - rectangle = new Rectangle(screenWidth / 20, screenHeight / 15, (int)(40 * 2.4), (int)(40 * 2.4)), - text = "<-", - scale = 0.72f, - fontColor = Color.Black, - fontName = "font2", - textureName = "textboxbackground1-1" - }; - backButton.LeftButtonPressed += () => { - AppManager.Instance.ChangeGameState(GameState.Menu); - }; } } diff --git a/MonogameLibrary/UI/Elements/TextBox.cs b/MonogameLibrary/UI/Elements/TextBox.cs index 3649692..87534eb 100644 --- a/MonogameLibrary/UI/Elements/TextBox.cs +++ b/MonogameLibrary/UI/Elements/TextBox.cs @@ -26,9 +26,13 @@ namespace MonogameLibrary.UI.Elements public event OnTextChange? StopChanging; public event OnTextChange? OnEnter; - protected HoverState hoverState = HoverState.None; + public HoverState hoverState = HoverState.None; protected IsSelected isSelected = IsSelected.NotSelected; public bool shouldEndOnEnter; + public void SelectIt() + { + isSelected = IsSelected.Selected; + } public virtual bool InteractUpdate(MouseState mouseState, MouseState prevmouseState) { From bcab0407a7b4ee4da9986fc72b771feb99adc40d Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 09:04:40 +0300 Subject: [PATCH 06/23] error with zombie and attack anmation --- .../GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 188dfb9..865d29d 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -118,6 +118,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (AppManager.Instance.GameManager.players[0].IsAlive) { Attack(); + isAttack = false; } } base.OnCollision(gameObject); From b8dab6da8adaeefc862ce3b3f998eddb2fd50950 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 10:34:41 +0300 Subject: [PATCH 07/23] added smoke after shoot --- DangerousD/Content/Content.mgcb | 12 +++++ DangerousD/Content/SmokeAnimation2.png | Bin 0 -> 20259 bytes DangerousD/Content/animations/smokeAfterShoot | 1 + DangerousD/Content/smokeAnimation.png | Bin 0 -> 3369 bytes .../LivingEntities/Monsters/Zombie.cs | 13 ++++-- ...eathRectangle.cs => AnimationRectangle.cs} | 4 +- .../LivingEntities/Player/Player.cs | 37 ++++++++------- .../LivingEntities/Player/SmokeAfterShoot.cs | 42 ++++++++++++++++++ DangerousD/GameCore/Managers/GameManager.cs | 6 ++- 9 files changed, 92 insertions(+), 23 deletions(-) create mode 100644 DangerousD/Content/SmokeAnimation2.png create mode 100644 DangerousD/Content/animations/smokeAfterShoot create mode 100644 DangerousD/Content/smokeAnimation.png rename DangerousD/GameCore/GameObjects/LivingEntities/Player/{DeathRectangle.cs => AnimationRectangle.cs} (87%) create mode 100644 DangerousD/GameCore/GameObjects/LivingEntities/Player/SmokeAfterShoot.cs diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..5988f41 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -223,6 +223,18 @@ /processorParam:TextureFormat=Color /build:sliderBackground.png +#begin SmokeAnimation2.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:SmokeAnimation2.png + #begin textboxbackground1-1.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/SmokeAnimation2.png b/DangerousD/Content/SmokeAnimation2.png new file mode 100644 index 0000000000000000000000000000000000000000..b414b01e854a71c1da7d7a29d05eb7b75e1d109d GIT binary patch literal 20259 zcmV)3K+C_0P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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

-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 + { + if (a == "ZombieRightAttack" || a == "ZombieLeftAttack") + { + isAttaking = false; + } + }; } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "ZombieMoveRight", "ZombieMoveLeft", "ZombieRightAttack", "ZombieLeftAttack" }, "ZombieMoveLeft"); @@ -123,7 +131,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (AppManager.Instance.GameManager.players[0].IsAlive) { Attack(); - isAttack = false; } } base.OnCollision(gameObject); @@ -136,14 +143,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if(isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X) { isTarget = true; - leftBorder = Pos.X - 10; + leftBorder = Pos.X - 100; rightBorder = Pos.X + AppManager.Instance.GameManager.players[0].Pos.X; } else if(!isGoRight && this._pos.X >= AppManager.Instance.GameManager.players[0].Pos.X) { isTarget = true; - rightBorder = Pos.X + 10; + rightBorder = Pos.X + 100; leftBorder = AppManager.Instance.GameManager.players[0].Pos.X; } } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/AnimationRectangle.cs similarity index 87% rename from DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs rename to DangerousD/GameCore/GameObjects/LivingEntities/Player/AnimationRectangle.cs index 7dda1b1..25e01f0 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/DeathRectangle.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/AnimationRectangle.cs @@ -9,9 +9,9 @@ using Microsoft.Xna.Framework; namespace DangerousD.GameCore.GameObjects.PlayerDeath { - public class DeathRectangle : GameObject + public class AnimationRectangle : GameObject { - public DeathRectangle(Vector2 pos, string DeathType) : base(pos) + public AnimationRectangle(Vector2 pos, string DeathType) : base(pos) { Height = 48; Width = 48; diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index d0c144a..380d3bb 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -16,11 +16,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public class Player : LivingEntity { bool isAlive = true; - bool isRight; + bool isRight = true; string stayAnimation; bool isJump = false; public int health; - public bool isGoRight = false; public Vector2 playerVelocity; public int rightBorder; public int leftBorder; @@ -32,6 +31,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private int bullets; public bool FallingThroughPlatform = false; public bool isUping = false; + private int shootLength = 160; @@ -71,7 +71,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", - "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload"}, "playerReload"); + "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload", "smokeAfterShoot"}, "playerReload"); public void Attack() { @@ -94,11 +94,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } public void Death(string monsterName) { - return; //godmode isAttacked = true; if(monsterName == "Zombie") { - DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName); + AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); deathRectangle.Gr.actionOfAnimationEnd += (a) => { if (a == "DeathFrom" + monsterName) @@ -109,7 +108,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } else if(monsterName == "Spider") { - DeathRectangle deathRectangle = new DeathRectangle(Pos, "DeathFrom" + monsterName); + AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); deathRectangle.Gr.actionOfAnimationEnd += (a) => { if (a == "DeathFrom" + monsterName) @@ -142,7 +141,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { GraphicsComponent.StartAnimation("playerShootRight"); } - var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), 100, 10), typeof(Zombie)); + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)); if (targets != null) { foreach (var target in targets) @@ -151,14 +150,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities targetZombie.TakeDamage(); } } + SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 30, Pos.Y + 7)); } else { - if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + if (GraphicsComponent.GetCurrentAnimation != "playerShootLeft") { - GraphicsComponent.StartAnimation("playerShootRight"); + GraphicsComponent.StartAnimation("playerShootLeft"); } - var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), -100, 10), typeof(Zombie)); + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - shootLength, (int)(Pos.Y - 10f), shootLength, 10), typeof(Zombie)); if (targets != null) { foreach (var target in targets) @@ -167,13 +167,14 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities targetZombie.TakeDamage(); } } + SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 12, Pos.Y + 7)); } } } } public override void Update(GameTime gameTime) { - if (AppManager.Instance.InputManager.ScopeState==ScopeState.Up) + if (AppManager.Instance.InputManager.ScopeState == ScopeState.Up) { isUping = true; } @@ -189,12 +190,16 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities GraphicsComponent.SetCameraPosition(Pos); if (!isAttacked || isInvincible) { - Move(gameTime); - } - else - { - velocity.X = 0; + if (!isShooting) + { + Move(gameTime); + } + else + { + velocity.X = 0; + } } + base.Update(gameTime); } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/SmokeAfterShoot.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/SmokeAfterShoot.cs new file mode 100644 index 0000000..b401ffc --- /dev/null +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/SmokeAfterShoot.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DangerousD.GameCore.GameObjects; +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; + +namespace DangerousD.GameCore.GameObjects.PlayerDeath +{ + public class SmokeAfterShoot : GameObject + { + public SmokeAfterShoot(Vector2 pos) : base(pos) + { + Height = 6; + Width = 6; + PlaySmoke(); + this.GraphicsComponent.actionOfAnimationEnd += (a) => + { + if (a == "smokeAfterShoot") + { + AppManager.Instance.GameManager.Remove(this); + } + }; + } + + protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "smokeAfterShoot" }, + "smokeAfterShoot"); + + public GraphicsComponent Gr => GraphicsComponent; + + private void PlaySmoke() + { + if (GraphicsComponent.GetCurrentAnimation != "smokeAfterShoot") + { + GraphicsComponent.StartAnimation("smokeAfterShoot"); + } + } + + } +} \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 53ffa61..615bd3b 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -158,8 +158,10 @@ namespace DangerousD.GameCore } } GetPlayer1.Update(gameTime); - foreach (var item in otherObjects) - item.Update(gameTime); + for(int i = 0; i < otherObjects.Count; i++) + { + otherObjects[i].Update(gameTime); + } physicsManager.UpdateCollisions(entities, livingEntities, mapObjects, players, gameTime); } From 34d0a9b64b084d9a1774f3be964c7698d4160779 Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 11:01:47 +0300 Subject: [PATCH 08/23] particlesAlreadyReady --- .../LivingEntities/Monsters/Zombie.cs | 1 + .../GameObjects/LivingEntities/Particle.cs | 43 ++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 5a5711e..ab0a681 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -123,6 +123,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (AppManager.Instance.GameManager.players[0].IsAlive) { Attack(); + } } base.OnCollision(gameObject); diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs index cf08319..d716fe3 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Particle.cs @@ -12,29 +12,58 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public class Particle : LivingEntity { int delay; + bool isFall; public Particle(Vector2 position) : base(position) { Width = 14; Height = 14; Random random = new Random(); - velocity = new Vector2(random.Next(3, 15), random.Next(3,30)); + velocity = new Vector2(random.Next(-6, 6), random.Next(-8,4)); acceleration.Y = 10; delay = 100; - + isFall = false; + isOnGround = false; } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "GibsMoveLeftBottom", "GibsMoveLeftTop", "GibsMoveRightBottom", "GibsMoveRightTop" }, "GibsMoveRightTop"); + protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "GibsMoveLeftBottom", "GibsMoveLeftTop", "GibsMoveRightBottom", "GibsMoveRightTop", "GibsNotMove" }, "GibsMoveRightTop"); public override void Update(GameTime gameTime) { + delay--; - if (velocity.X > 0) + if (delay<=80) { - velocity.X--; + velocity.X=0; } - if(velocity.Y<=0) + if(isOnGround) { - GraphicsComponent.StartAnimation("GipsNoMove"); + GraphicsComponent.StartAnimation("GibsNotMove"); + Width = 16; + Height = 5; + isFall=true; + ; } + + else if(!isFall) + { + Width = 14; + Height= 14; + if (velocity.Y<0 && velocity.X>0) + { + GraphicsComponent.StartAnimation("GibsMoveRightTop"); + } + else if (velocity.Y < 0 && velocity.X < 0) + { + GraphicsComponent.StartAnimation("GibsMoveLeftTop"); + } + else if (velocity.Y > 0 && velocity.X > 0) + { + GraphicsComponent.StartAnimation("GibsMoveRightBottom"); + } + else if (velocity.Y > 0 && velocity.X < 0) + { + GraphicsComponent.StartAnimation("GibsMoveLeftBottom"); + } + } if(delay<=0) { AppManager.Instance.GameManager.Remove(this); From 99585effd24754f24316d69e6abac631f8e4e5ba Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 11:12:25 +0300 Subject: [PATCH 09/23] Door render --- DangerousD/Content/Content.mgcb | 60 +++-- DangerousD/Content/Door.tsx | 4 + DangerousD/Content/doors.png | Bin 0 -> 472 bytes DangerousD/Content/lvl.tmx | 215 ++++-------------- .../GameCore/GameObjects/Entities/Door.cs | 17 +- .../GameObjects/Entities/Items/Coin.cs | 13 ++ .../GameObjects/Entities/Items/Diamond.cs | 13 ++ DangerousD/GameCore/Managers/MapManager.cs | 13 +- 8 files changed, 141 insertions(+), 194 deletions(-) create mode 100644 DangerousD/Content/Door.tsx create mode 100644 DangerousD/Content/doors.png create mode 100644 DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs create mode 100644 DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..9924833 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -21,18 +21,6 @@ /processorParam:TextureFormat=Compressed /build:ButtonFont.spritefont -#begin checkboxs_off-on.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:checkboxs_off-on.png - #begin checkboxs_off.png /importer:TextureImporter /processor:TextureProcessor @@ -45,6 +33,18 @@ /processorParam:TextureFormat=Color /build:checkboxs_off.png +#begin checkboxs_off-on.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:checkboxs_off-on.png + #begin checkboxs_on.png /importer:TextureImporter /processor:TextureProcessor @@ -87,6 +87,18 @@ /processorParam:Quality=Best /build:DoomTestSong.mp3 +#begin doors.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:doors.png + #begin Font_12.spritefont /importer:FontDescriptionImporter /processor:FontDescriptionProcessor @@ -235,18 +247,6 @@ /processorParam:TextureFormat=Color /build:textboxbackground1-1.png -#begin textboxbackground2-1.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:textboxbackground2-1.png - #begin textboxbackground2,5-1.png /importer:TextureImporter /processor:TextureProcessor @@ -259,6 +259,18 @@ /processorParam:TextureFormat=Color /build:textboxbackground2,5-1.png +#begin textboxbackground2-1.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:textboxbackground2-1.png + #begin textboxbackground6-1.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/Door.tsx b/DangerousD/Content/Door.tsx new file mode 100644 index 0000000..a250dd5 --- /dev/null +++ b/DangerousD/Content/Door.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/DangerousD/Content/doors.png b/DangerousD/Content/doors.png new file mode 100644 index 0000000000000000000000000000000000000000..60742ae1fa145b78510306d091579331a2f8e571 GIT binary patch literal 472 zcmV;}0Vn>6P)Px#1ZP1_K>z@;j|==^1poj55>QN3Mg08ysHms_002}}RH#${{QOj~pRX+d000Sa zNLh0L01m?d01m?e$8V@)0003`NkllD_|0 zriv;E*miI^r6ExsU-ls%1HAwNTkh&HAoAaVAS?0; zv>9v#0JK;fFjj%4A%LT$=?d=wK+rir0p9u0{v#`Z;xCv2P!Hm&jeLTLG6z%z9*o#l z0T&u>;a5;913DHR@FTvjU7zANEG^64VFF+JQeqw*W_$s{$Sj z%Pd%db*1stR3I53zX45BVBhzgscArR<%gty39J*q`z!D}0yP&6*neigF#)b~h&TgY z6Cg~1+c~^vK)wQi$y)+wDaG}f2=p}8n*nqxt5IIoe!Uf*c50_>w{wuKY%y_@d+@V)p0nhWBdcy;MKKc8ron0 O0000 - + - + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -311,137 +312,7 @@ - - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,149,152,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,150,153,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,151,154,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,149,152,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,79,80,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,92,93,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,105,106,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,149,152,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,150,153,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,151,154,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,149,152,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,150,153,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,151,154,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,150,153,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,151,154,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,149,152,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,150,153,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,151,154,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - - - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -466,7 +337,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,147,199,199,148,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -517,7 +388,7 @@ - + 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -559,15 +430,15 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,178,179,157,157,157,157,157,157,157,157,157,157,157, -157,157,157,191,192,157,157,252,253,157,157,157,157,157,157,258, -157,157,157,157,157,157,157,265,266,157,157,157,696,697,157,271, -204,204,204,204,204,204,204,278,279,204,204,204,709,710,204,284, +157,157,157,191,192,157,157,149,152,157,157,157,157,157,157,258, +157,157,157,157,157,157,157,150,153,157,157,157,696,697,157,271, +204,204,204,204,204,204,204,151,154,204,204,204,709,710,204,284, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, -157,157,157,157,157,157,258,157,157,157,252,253,157,157,157,157, -157,157,157,157,157,157,271,157,157,157,265,266,157,696,697,157, -157,157,272,204,204,204,284,204,204,204,278,279,204,709,710,204, +157,157,157,157,157,157,258,157,157,157,149,152,157,157,157,157, +157,157,157,157,157,157,271,157,157,157,150,153,157,696,697,157, +157,157,272,204,204,204,284,204,204,204,151,154,204,709,710,204, 157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,157,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,167,157,157,209,210, @@ -589,25 +460,25 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 211,212,157,157,157,157,157,157,157,157,157,157,157,157,157,157, -224,225,157,157,252,253,157,248,249,157,157,258,157,157,157,157 +224,225,157,157,149,152,157,248,249,157,157,258,157,157,157,157 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -144,144,144,144,144,144,144,144,621,622,144,144,144,0,0,0, -157,157,157,157,157,157,157,157,634,635,157,157,157,0,0,0, -157,248,249,157,157,157,272,157,647,648,157,272,157,0,0,0, +144,144,144,144,144,144,144,144,79,80,144,144,144,0,0,0, +157,157,157,157,157,157,157,157,92,93,157,157,157,0,0,0, +157,248,249,157,157,157,272,157,105,106,157,272,157,0,0,0, 157,250,251,157,157,157,145,147,199,200,148,145,157,0,0,0, 204,239,240,204,204,204,204,160,199,200,161,204,204,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,0,0,0, 178,179,157,157,157,157,157,243,157,157,157,157,157,0,0,0, -191,192,157,157,157,157,157,256,257,157,252,253,157,0,0,0, -157,157,157,157,157,157,157,269,270,157,265,266,157,0,0,0, -204,204,204,204,204,204,204,282,283,204,278,279,204,0,0,0, +191,192,157,157,157,157,157,256,257,157,149,152,157,0,0,0, +157,157,157,157,157,157,157,269,270,157,150,153,157,0,0,0, +204,204,204,204,204,204,204,282,283,204,151,154,204,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,157,147,199,148,157,243,157,157,157,157,157,0,0,0, -254,255,157,147,199,148,157,256,257,157,252,253,157,0,0,0 +254,255,157,147,199,148,157,256,257,157,149,152,157,0,0,0 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, @@ -633,9 +504,9 @@ 29,29,29,29,0,0,0,0,0,0,0,0,157,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,157,157,260,157, 29,29,29,29,0,0,157,167,157,157,157,157,157,157,260,157, -29,29,29,29,0,0,157,180,157,252,253,157,157,157,260,157, -29,29,29,29,0,0,157,193,157,265,266,157,157,157,260,157, -6,29,29,29,0,0,204,204,204,278,279,204,272,157,260,157, +29,29,29,29,0,0,157,180,157,149,152,157,157,157,260,157, +29,29,29,29,0,0,157,193,157,150,153,157,157,157,260,157, +6,29,29,29,0,0,204,204,204,151,154,204,272,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,0,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,144,157,260,157, 29,29,29,29,0,0,157,157,157,157,157,157,157,219,220,221, @@ -657,15 +528,15 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,243,157,157,209,210,211,212,157, -157,252,253,157,157,258,157,157,256,257,157,222,223,224,225,157, -218,265,266,157,157,271,157,157,269,270,157,235,236,237,238,157, -231,278,279,204,204,284,204,204,282,283,204,204,204,204,204,204, +157,149,152,157,157,258,157,157,256,257,157,222,223,224,225,157, +218,150,153,157,157,271,157,157,269,270,157,235,236,237,238,157, +231,151,154,204,204,284,204,204,282,283,204,204,204,204,204,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -237,238,157,157,265,266,157,250,251,157,157,271,157,157,157,157, -204,204,204,204,278,279,204,239,240,204,204,284,204,204,204,204, +237,238,157,157,150,153,157,250,251,157,157,271,157,157,157,157, +204,204,204,204,151,154,204,239,240,204,204,284,204,204,204,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,243,157,157,209,210,211,212, @@ -682,26 +553,26 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -267,268,157,147,199,148,157,269,270,157,265,266,218,0,0,0, -280,281,204,160,200,161,204,282,283,204,278,279,231,0,0,0, +267,268,157,147,199,148,157,269,270,157,150,153,218,0,0,0, +280,281,204,160,200,161,204,282,283,204,151,154,231,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,157,147,199,148,157,157,157,157,157,157,157,0,0,0, -157,157,157,147,199,148,157,157,157,157,252,253,157,0,0,0, -157,157,157,147,199,148,157,217,157,157,265,266,157,0,0,0, -204,204,204,160,200,161,204,230,204,204,278,279,204,0,0,0, +157,157,157,147,199,148,157,157,157,157,149,152,157,0,0,0, +157,157,157,147,199,148,157,217,157,157,150,153,157,0,0,0, +204,204,204,160,200,161,204,230,204,204,151,154,204,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 144,144,144,147,199,148,144,144,144,144,144,144,144,0,0,0, 157,157,159,160,200,161,162,157,157,157,157,157,157,0,0,0, -157,171,172,173,199,174,175,176,157,157,252,253,157,0,0,0, -183,184,185,186,199,187,188,189,190,157,265,266,157,0,0,0, -196,197,198,199,199,200,201,202,203,204,278,279,204,0,0,0, +157,171,172,173,199,174,175,176,157,157,149,152,157,0,0,0, +183,184,185,186,199,187,188,189,190,157,150,153,157,0,0,0, +196,197,198,199,199,200,201,202,203,204,151,154,204,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - + @@ -756,4 +627,16 @@ + + + + + + + + + + + + diff --git a/DangerousD/GameCore/GameObjects/Entities/Door.cs b/DangerousD/GameCore/GameObjects/Entities/Door.cs index 0e21692..9c8afe6 100644 --- a/DangerousD/GameCore/GameObjects/Entities/Door.cs +++ b/DangerousD/GameCore/GameObjects/Entities/Door.cs @@ -6,21 +6,34 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Xna.Framework.Graphics; namespace DangerousD.GameCore.GameObjects.Entities { public class Door : Entity { - public Door(Vector2 position) : base(position) + private Rectangle _sourceRectangle; + + public Door(Vector2 position, Vector2 size, Rectangle sourceRectangle) : base(position) { + _sourceRectangle = sourceRectangle; + Width = (int)size.X; + Height = (int)size.Y; } - protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SilasBallMove" }, "SilasBallMove"); + protected override GraphicsComponent GraphicsComponent { get; } = new("doors"); + public override void Update(GameTime gameTime) { base.Update(gameTime); } + + public override void Draw(SpriteBatch spriteBatch) + { + GraphicsComponent.DrawAnimation(Rectangle, spriteBatch, _sourceRectangle); + //spriteBatch.Draw(debugTexture, new Rectangle(Rectangle.X - GraphicsComponent.CameraPosition.X, Rectangle.Y - GraphicsComponent.CameraPosition.Y, Rectangle.Width, Rectangle.Height), Color.White); + } public override void OnCollision(GameObject gameObject) { base.OnCollision(gameObject); diff --git a/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs b/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs new file mode 100644 index 0000000..a42900e --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Items/Coin.cs @@ -0,0 +1,13 @@ +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; + +namespace DangerousD.GameCore.GameObjects.Entities.Items; + +public class Coin : Entity +{ + public Coin(Vector2 position) : base(position) + { + } + + protected override GraphicsComponent GraphicsComponent { get; } +} \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs b/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs new file mode 100644 index 0000000..7f81c6b --- /dev/null +++ b/DangerousD/GameCore/GameObjects/Entities/Items/Diamond.cs @@ -0,0 +1,13 @@ +using DangerousD.GameCore.Graphics; +using Microsoft.Xna.Framework; + +namespace DangerousD.GameCore.GameObjects.Entities.Items; + +public class Diamond : Entity +{ + public Diamond(Vector2 position) : base(position) + { + } + + protected override GraphicsComponent GraphicsComponent { get; } +} \ No newline at end of file diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index 6ab49b0..d45d53d 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -9,15 +9,18 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Serialization; using DangerousD.GameCore.GameObjects; using System.Globalization; +using System.IO; +using DangerousD.GameCore.GameObjects.Entities; using DangerousD.GameCore.GameObjects.LivingEntities; namespace DangerousD.GameCore.Managers { public class MapManager { - private int _columns; + private int _scale; - + private int _columns; + public MapManager(int scale) { _scale = scale; @@ -78,6 +81,7 @@ namespace DangerousD.GameCore.Managers private void LoadTilesData() { + XmlDocument xml = new(); xml.Load($"../../../Content/map.tsx"); XmlNode root = xml.DocumentElement; @@ -102,6 +106,11 @@ namespace DangerousD.GameCore.Managers { inst = (Entity)Activator.CreateInstance(type, pos, false); } + else if (type.Equals(typeof(Door))) + { + int gid = entity.Attributes["type"] is not null ? int.Parse(entity.Attributes["type"].Value) : 0; + inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle(0, 0, 32, 48)); + } else { inst = (Entity)Activator.CreateInstance(type, pos); From a0de50ba70c4f3fe49613b802e1ec76f18f86eef Mon Sep 17 00:00:00 2001 From: Timofey06 Date: Fri, 18 Aug 2023 11:39:01 +0300 Subject: [PATCH 10/23] Fix --- DangerousD/GameCore/Managers/PhysicsManager.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/DangerousD/GameCore/Managers/PhysicsManager.cs b/DangerousD/GameCore/Managers/PhysicsManager.cs index dee4c27..4e8216e 100644 --- a/DangerousD/GameCore/Managers/PhysicsManager.cs +++ b/DangerousD/GameCore/Managers/PhysicsManager.cs @@ -142,14 +142,18 @@ namespace DangerousD.GameCore.Managers } private void CheckCollisionsE_LE(List entities, List livingEntities) { - foreach (var entity in entities) + for (int i = 0; i < entities.Count; i++) { - foreach (var livingEntity in livingEntities) + + + for (int j = 0; j < livingEntities.Count; j++) { - if (livingEntity.Rectangle.Intersects(entity.Rectangle)) + + + if (livingEntities[j].Rectangle.Intersects(entities[i].Rectangle)) { - livingEntity.OnCollision(entity); - entity.OnCollision(livingEntity); + livingEntities[j].OnCollision(entities[i]); + entities[i].OnCollision(livingEntities[j]); } } } From 5db6cee0fa89a1de3b7ff3bad578c0133a6e5936 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 11:39:54 +0300 Subject: [PATCH 11/23] fixed some bags --- DangerousD/Content/animations/playerShootLeft | 25 ++++++++- .../Content/animations/playerShootRight | 25 ++++++++- .../LivingEntities/Monsters/Zombie.cs | 19 ++++--- .../LivingEntities/Player/Player.cs | 52 +++++++++---------- 4 files changed, 84 insertions(+), 37 deletions(-) diff --git a/DangerousD/Content/animations/playerShootLeft b/DangerousD/Content/animations/playerShootLeft index f2b9f3b..e710737 100644 --- a/DangerousD/Content/animations/playerShootLeft +++ b/DangerousD/Content/animations/playerShootLeft @@ -1 +1,24 @@ -{"id":"playerShootLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":34,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} +{ + "id": "playerShootLeft", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 34, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/Content/animations/playerShootRight b/DangerousD/Content/animations/playerShootRight index 922862b..fd11db2 100644 --- a/DangerousD/Content/animations/playerShootRight +++ b/DangerousD/Content/animations/playerShootRight @@ -1 +1,24 @@ -{"id":"playerShootRight","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":1,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} +{ + "id": "playerShootRight", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 1, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index 373795a..c1737f2 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -98,19 +98,13 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { if (isGoRight) { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveRight") - { - GraphicsComponent.StartAnimation("ZombieMoveRight"); - } + StartCicycleAnimation("ZombieMoveRight"); velocity.X = monster_speed; } else if (!isGoRight) { - if (GraphicsComponent.GetCurrentAnimation != "ZombieMoveLeft") - { - GraphicsComponent.StartAnimation("ZombieMoveLeft"); - } + StartCicycleAnimation("ZombieMoveLeft"); velocity.X = -monster_speed; } @@ -167,6 +161,15 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters rightBorder = 760; } } + public void SwitchToRight() + { + isGoRight = true; + } + + public void SwitchToLeft() + { + isGoRight = false; + } public override void Attack(GameTime gameTime) {} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index f0a3d92..b8e68ba 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -134,43 +134,37 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { if (bullets > 0) { - if (!isShooting) + if (!isAttacked) { - isShooting = true; - bullets--; - if (isRight) + if (!isShooting) { - if (GraphicsComponent.GetCurrentAnimation != "playerShootRight") + isShooting = true; + bullets--; + if (isRight) { - GraphicsComponent.StartAnimation("playerShootRight"); - } - var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)); - if (targets != null) - { - foreach (var target in targets) + StartCicycleAnimation("playerShootRight"); + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)).OrderBy(x => (x.Pos - Pos).LengthSquared()); + if (targets != null) { - Zombie targetZombie = (Zombie)target; + Zombie targetZombie = (Zombie)targets.First(); targetZombie.TakeDamage(); } + SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 30, Pos.Y + 7)); } - SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X + 30, Pos.Y + 7)); - } - else - { - if (GraphicsComponent.GetCurrentAnimation != "playerShootLeft") + else { - GraphicsComponent.StartAnimation("playerShootLeft"); - } - var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - shootLength, (int)(Pos.Y - 10f), shootLength, 10), typeof(Zombie)); - if (targets != null) - { - foreach (var target in targets) + StartCicycleAnimation("playerShootLeft"); + var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - shootLength, (int)(Pos.Y - 10f), shootLength, 10), typeof(Zombie)); + if (targets != null) { - Zombie targetZombie = (Zombie)target; - targetZombie.TakeDamage(); + foreach (var target in targets) + { + Zombie targetZombie = (Zombie)target; + targetZombie.TakeDamage(); + } } + SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 12, Pos.Y + 7)); } - SmokeAfterShoot smokeAfterShoot = new SmokeAfterShoot(new Vector2(Pos.X - 12, Pos.Y + 7)); } } } @@ -190,7 +184,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities FallingThroughPlatform = false; } GraphicsComponent.SetCameraPosition(Pos); - if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) + if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) { if (!isShooting) { @@ -201,6 +195,10 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities velocity.X = 0; } } + else + { + velocity.X = 0; + } base.Update(gameTime); } From bf04d373b9279ac28f9a3b00e66b938129240c17 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 11:47:24 +0300 Subject: [PATCH 12/23] Door fix --- DangerousD/Content/lvl.tmx | 33 +++++++++++++--------- DangerousD/GameCore/Managers/MapManager.cs | 4 +-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index b26fa01..df88666 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -1,8 +1,13 @@ - - - - + + + + + + + + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -32,13 +37,13 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,272,0,272,0,0,0,0,0,0,0,0,0,0, 52,52,52,52,0,52,52,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +272,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -136,13 +141,13 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,272,0,0,0,0,0,272,0,0,0,0,0,0,0,0, 52,52,0,0,0,0,0,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,272,0,0,0,0,0,0,0,0,0,0,0,0,0, 52,52,52,0,0,0,52,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -414,13 +419,13 @@ 29,29,29,29,0,0,157,157,167,157,157,157,157,157,260,157, 29,29,29,29,0,0,157,157,180,157,254,255,157,157,260,157, 29,29,29,29,0,0,157,157,193,157,267,268,157,157,260,157, -29,29,29,29,0,0,204,204,204,204,280,281,204,272,260,272, +29,29,29,29,0,0,204,204,204,204,280,281,204,0,260,0, 29,29,29,29,0,0,147,199,148,0,0,0,0,0,260,0, 29,29,29,29,0,0,147,199,148,144,144,144,144,144,260,144, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, -29,29,29,29,0,0,147,199,148,204,272,157,157,157,260,157, +29,29,29,29,0,0,147,199,148,204,0,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,0,0,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,144,144,157,157,157,260,157, 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, @@ -438,7 +443,7 @@ 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,157,157,157,157,258,157,157,157,149,152,157,157,157,157, 157,157,157,157,157,157,271,157,157,157,150,153,157,696,697,157, -157,157,272,204,204,204,284,204,204,204,151,154,204,709,710,204, +157,157,0,204,204,204,284,204,204,204,151,154,204,709,710,204, 157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,157,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,167,157,157,209,210, @@ -500,13 +505,13 @@ 29,29,29,29,0,0,147,199,148,157,157,157,157,157,260,157, -29,29,29,29,0,0,160,200,161,204,204,272,157,157,260,157, +29,29,29,29,0,0,160,200,161,204,204,0,157,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,157,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,157,157,260,157, 29,29,29,29,0,0,157,167,157,157,157,157,157,157,260,157, 29,29,29,29,0,0,157,180,157,149,152,157,157,157,260,157, 29,29,29,29,0,0,157,193,157,150,153,157,157,157,260,157, -6,29,29,29,0,0,204,204,204,151,154,204,272,157,260,157, +6,29,29,29,0,0,204,204,204,151,154,204,0,157,260,157, 29,29,29,29,0,0,0,0,0,0,0,0,0,157,260,157, 29,29,29,29,0,0,144,144,144,144,144,144,144,157,260,157, 29,29,29,29,0,0,157,157,157,157,157,157,157,219,220,221, @@ -518,7 +523,7 @@ 157,157,157,157,267,268,157,696,697,157,157,193,157,157,235,236, -157,272,204,204,280,281,204,709,710,204,204,204,204,204,204,204, +157,0,204,204,280,281,204,709,710,204,204,204,204,204,204,204, 157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,178,179,157,157,157,157,157,157,157,157,157,157,157, diff --git a/DangerousD/GameCore/Managers/MapManager.cs b/DangerousD/GameCore/Managers/MapManager.cs index d45d53d..9087d97 100644 --- a/DangerousD/GameCore/Managers/MapManager.cs +++ b/DangerousD/GameCore/Managers/MapManager.cs @@ -108,8 +108,8 @@ namespace DangerousD.GameCore.Managers } else if (type.Equals(typeof(Door))) { - int gid = entity.Attributes["type"] is not null ? int.Parse(entity.Attributes["type"].Value) : 0; - inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle(0, 0, 32, 48)); + int gid = entity.Attributes["gid"] is not null ? int.Parse(entity.Attributes["gid"].Value) : 0; + inst = (Entity)Activator.CreateInstance(type, pos, new Vector2(32, 48), new Rectangle((gid - 872)*32, 0, 32, 48)); } else { From dcc845a517dd32e146eab83fa9fa82fdea6b964d Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 11:50:24 +0300 Subject: [PATCH 13/23] merge commit. Added fix player and monsters --- DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index 05c78a5..eaae151 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -147,7 +147,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { StartCicycleAnimation("playerShootRight"); var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)).OrderBy(x => (x.Pos - Pos).LengthSquared()); - if (targets != null) + if (targets.Count() > 0) { Zombie targetZombie = (Zombie)targets.First(); targetZombie.TakeDamage(); From 2d76a9bc14e8b325458a8cc652ceaa3c2d2f5429 Mon Sep 17 00:00:00 2001 From: SergoDobro Date: Fri, 18 Aug 2023 11:53:23 +0300 Subject: [PATCH 14/23] gunshot fixes --- DangerousD/Content/Content.mgcb | 66 ++++++++++-------- DangerousD/Content/animations/playerShootLeft | 25 ++++++- .../Content/animations/playerShootRight | 25 ++++++- .../Content/{ => sounds}/DoomTestSong.mp3 | Bin DangerousD/Content/sounds/shotgun_shot.mp3 | Bin 0 -> 35691 bytes .../LivingEntities/Player/Player.cs | 1 + DangerousD/GameCore/Managers/SoundManager.cs | 8 +-- 7 files changed, 89 insertions(+), 36 deletions(-) rename DangerousD/Content/{ => sounds}/DoomTestSong.mp3 (100%) create mode 100644 DangerousD/Content/sounds/shotgun_shot.mp3 diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..d6828ea 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -21,18 +21,6 @@ /processorParam:TextureFormat=Compressed /build:ButtonFont.spritefont -#begin checkboxs_off-on.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:checkboxs_off-on.png - #begin checkboxs_off.png /importer:TextureImporter /processor:TextureProcessor @@ -45,6 +33,18 @@ /processorParam:TextureFormat=Color /build:checkboxs_off.png +#begin checkboxs_off-on.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:checkboxs_off-on.png + #begin checkboxs_on.png /importer:TextureImporter /processor:TextureProcessor @@ -81,12 +81,6 @@ /processorParam:TextureFormat=Color /build:deathBackground.jpg -#begin DoomTestSong.mp3 -/importer:Mp3Importer -/processor:SoundEffectProcessor -/processorParam:Quality=Best -/build:DoomTestSong.mp3 - #begin Font_12.spritefont /importer:FontDescriptionImporter /processor:FontDescriptionProcessor @@ -223,6 +217,18 @@ /processorParam:TextureFormat=Color /build:sliderBackground.png +#begin sounds/DoomTestSong.mp3 +/importer:Mp3Importer +/processor:SoundEffectProcessor +/processorParam:Quality=Best +/build:sounds/DoomTestSong.mp3 + +#begin sounds/shotgun_shot.mp3 +/importer:Mp3Importer +/processor:SoundEffectProcessor +/processorParam:Quality=Best +/build:sounds/shotgun_shot.mp3 + #begin textboxbackground1-1.png /importer:TextureImporter /processor:TextureProcessor @@ -235,18 +241,6 @@ /processorParam:TextureFormat=Color /build:textboxbackground1-1.png -#begin textboxbackground2-1.png -/importer:TextureImporter -/processor:TextureProcessor -/processorParam:ColorKeyColor=255,0,255,255 -/processorParam:ColorKeyEnabled=True -/processorParam:GenerateMipmaps=False -/processorParam:PremultiplyAlpha=True -/processorParam:ResizeToPowerOfTwo=False -/processorParam:MakeSquare=False -/processorParam:TextureFormat=Color -/build:textboxbackground2-1.png - #begin textboxbackground2,5-1.png /importer:TextureImporter /processor:TextureProcessor @@ -259,6 +253,18 @@ /processorParam:TextureFormat=Color /build:textboxbackground2,5-1.png +#begin textboxbackground2-1.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:textboxbackground2-1.png + #begin textboxbackground6-1.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/animations/playerShootLeft b/DangerousD/Content/animations/playerShootLeft index f2b9f3b..e710737 100644 --- a/DangerousD/Content/animations/playerShootLeft +++ b/DangerousD/Content/animations/playerShootLeft @@ -1 +1,24 @@ -{"id":"playerShootLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":34,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} +{ + "id": "playerShootLeft", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 34, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/Content/animations/playerShootRight b/DangerousD/Content/animations/playerShootRight index 922862b..3b7ef81 100644 --- a/DangerousD/Content/animations/playerShootRight +++ b/DangerousD/Content/animations/playerShootRight @@ -1 +1,24 @@ -{"id":"playerShootRight","textureName":"playerAnimation","startSpriteRectangle":{"X":201,"Y":1,"Width":32,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":2,"isCycle":false,"offset":"4, 0"} +{ + "id": "playerShootRight", + "textureName": "playerAnimation", + "startSpriteRectangle": { + "X": 201, + "Y": 1, + "Width": 32, + "Height": 32 + }, + "frameSecond": [ + { + "Item1": 0, + "Item2": 3 + }, + { + "Item1": 1, + "Item2": 20 + } + ], + "textureFrameInterval": 1, + "framesCount": 2, + "isCycle": false, + "offset": "4, 0" +} diff --git a/DangerousD/Content/DoomTestSong.mp3 b/DangerousD/Content/sounds/DoomTestSong.mp3 similarity index 100% rename from DangerousD/Content/DoomTestSong.mp3 rename to DangerousD/Content/sounds/DoomTestSong.mp3 diff --git a/DangerousD/Content/sounds/shotgun_shot.mp3 b/DangerousD/Content/sounds/shotgun_shot.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..56a4a56bfb7c6bde5d7adb3634efbb21492a241f GIT binary patch literal 35691 zcmd?RcT^MK`^Py65JG67haP(G0RbtYg9fA%5Tqj@C;}oPN<#0wBUL&`M?p|RuOdw; zqJoNo!bdR+{t8SUh}^9xzBS4BV7e@fHX1aTN+u) zlQISXKsJ>#)iND1^%O};5~lIf;nTRO_NlI^CgfDd)Dz@X8)^OdR5NLAA#Hd{+K!~6 zqWX97pXFH=u+%lzAsrAxI-tC)yewd8VWCG_rzfproP#_RRix$5Nz2K~0$Qd?JgWc_>2?`x;txbZYJofh-8Rrh%JFH#>Wp_ zxJ+K*vMi?c$Y~R$Z=S?Ad$=mMmJof}p49%vNLok>Ui5ZEg)d7JpY(qn{8Bj%Ic zB`2l>HFhTZIwo-VOTLd)9bN`7t^%t2(TO>HvV+t}nR->PZ-@Cqt!4Cv2g0Ur(=SKI zu2t#@KXo%w+04EmuOnPPuB!GkVx@XmG-jjBl!qyvPT>*dZO7DT38#HO;NbN2pzH(9_E`vB74GmWPd4+Ped{)StC=C8GGWT zH%!EXq9+XpnD?AFMKv*$|JWU-4HzxM+703;gUJ&vzWTzi&b})kzjwdw%fUbozUvN@6-h$g8F&XS&GO+4ygq|q{WNh zSd!y$=>atddjIe=N`CmLoSXR1`X%!tH^UI}N{5qa1Nt~-sCbNB)z3P)jQa)L>^9}i|3dvZIt#2LN(=}&fs61;I>BMV>{r6!rb-?@g$v36gBl1vc(ol zDRRt<&Ds#-)=KOy?KXU~l#p57bn17+7w;*Fm- zTLj$1xu_buWJ+HA)R5AsR7g&_*G!$D^R@Ws0ne+tgEZ&N^NY1HsjrDM_FJdVH0j{q zSm==m=v%&<1lBw4hd;$Rm|LU<7iTWMElyoXOSZI*)7kjQbkz(R_lv)#t-c&gKJ}uX zn=&l>)b8BHgHNT&y(X!PZ;far3wb6{I{6ME!N1FE)2Z+0bz7A2W3_62BZACB4Y2h- z=3)jlG*v=MG-3R0K@CnGeQEuQuozZ8PRfUh&%51|)t)^{dCt1ndn7f-c<(I;?eM0< zBQ}qFKl9-pT}8gA*i7-cbHgzrR=8Cd^i=0{ER};-`pdV!9utu6S^QtF#K>pb7wa%{ z*hSW@>BW6xFjjXVAAV#&IgkeU@YLXXSK|Q$9XY`hc%0HwSfm2yjzCc~NqT!^JP^F4 zs<5|P{zE@klBF^uT_$acdMNqx?|0QLbDb5BAI_aVE=sEAg1z^(bm6M<9=^>OF=bm! z(K-;+r`wb^|0yt3MaPi*E22Kfb4qX6>6t?gi(qina4v_|_qODh8c1bjarS3M0~A-x zMyB|)OP=nH*+-dfkO>Aq;oe9=PaZ9j=V#NL8YwfmZH6Wx8Me7SDaI!#4)8GzynWr$Q z@ynV>Ds6>aOXyO@>xfZuZh4+N`jP+Rnq_pWAOxCR))eqPv@_%yJv(z5_j;JmeZ!*1 zME=g}ses_|_g!{h-4{1*`BmSRHrfua^1lj%x0d%xnlTil&k@cowdk|Ay?d6yzHuu_ zQKR{tm~O2|Z~oW#^=l;^jH{cGa$|TY8kcuIkOUhZGXIp+R zwrwBiCOyh_0z6ZH?=sn!!9mfieEBpGo4C2Y_5Gzh4ui~?Uh;gs8rLu1&Lzv=Z}RC~ zgY55-`Cj3l|B$+MQ8Vj$M}3Bwn_Zmx9Su2CT=tJIEk0GvqJV{$wJ+NqSHC3M>8*H?BUP{Gb={Q1)yW|vI|^qKM1k@p}oxd zfG;tBtKNF#k;g|-uUT5m*|HK z)#K$+QZ}4V!uC4b!d$t3j!o^7!|1*DauV0c8XKp^keOg5Iut-ayCD|E&ABq*v{qS)&`VckFN9Ep_=eQK=2_rmK z|83jkwMfy zk|6?I0)X%W076AWPtU~4&c($mAS@;(DWjmIq@t#&siSX%!CbPiwzai)boKD?^0{#% zAm~nLXjnvaTwG#GMs{}IgOZYml{NMCjjfM6JG*=OhlWNcrlw|JFD@^yeEhtzvAO-@ z;Na+lcy=-*tH+gO^(dS>TlqT)LM;E24KE1Vx_jmC=Ks&8BtUKe{Wbu2kuDKRvgeQh z03v7%gKxg)`I8>i>Tez-m;~Gjnw(W4CPfKsE22OXKXb=u5B7oPvZv z;X2RzW)=q=?*>p`+K9;@%b6dG5$bj;8l;DP8BU*GwLi?gC@;*LDBikb7uBSfTyB!G zgA07%yIy*DU%vK5e`Z+5AdEGvE;aJRGZk4ox2dnCsS<@lx-7%BgI9Kbzb}rTlO+C1 zcSEQA-vE*D{GWh`m$)c@q4f9zn;W|}g;b9Kd@PFJN>oQhCLsWc$i@wn_tzeoHZRHfAKG_O6!8Bn-(Z7Z8 zp&OZScQtZPE>?yRiQ2`kzw@Z&dYY6c98JeYK|Oy)h#0wVXjjRQa<$}-gpkiXztgN1 zk`(o?gqEIKXLEJ%T)kDOQkxc@ClZn3?!<)Iu`Cq3%k-&jOXUIU3Kv;yQygo`+Ma%F zlPq{06=Vsbk$vo!v{A&0Si+TBs&bUoV9`5qEUa{7HDZR32f^2io^|AscGYNn^Z2Mc zVMCZc`+=jTvSkUfLrC{=yA`TXms|`vdZsIF4&#Eud-vDG@xvYk9MY;3b9_% z%IRYmP2vPP0xt4VgNR5IF}pqe%R>%q9Grdy%a6Oo28v~nGOY28C)dT#*+cm5cs`M& zE@ne=>>#hrN03L5v$}_my3#A#a?u#3Dt_yez!$BhPhVaAM2)1Ey#oqI4@i^Mn9};C zs*8D*L&Uu-bS(&J_Wcr#|da>LyKfRXYEY_Yugo3P`6kh8sd85__9& z5Ie>1F2|l*ndhe=`rF5d(?^u7YtTom9IB5-5WmmpNr%lkpdpedVQDDYRS1nZ9u8Gy z5D%)Zf+@v+^{avvTC}@CJN-h)i+`xh$?CdaJmpfVjUV%W=zb0Q^Z`{9{c;PF%Tx>K z&^SSU$~eKqF0RwfuGoNZ;bl`szma?oMB=ooN@gci9%A|!Op>Cx&J!e0%s5gm2L8IONy?;@gQ z_?{cFF9_aKm~Rn>0-yv>Y`6zg!^|z{u629!5E&`r>?uHa>VhH!;1$!#%Zl=Tdhc~ASM6fhM|c?PX5h3Xvp`2Nj%GP z*L;9G(dS!dko3X$)`RDDJ#WOf4ko(74>jnch`lSJynTlnfU*V~0Dn#&g46<|`TfynEqg4~bstIa_ z}IoTvDP{cSfis z=Ag+2D}i-z`cuoXCpliBb#DAih}Lu(?7>0$f_%T>HCjY60|E9yXCTzTMVs0*m7?BI zH(9oyMs`=t=96=D+MpNnIS3*NVXoYlrUF+od?n9FrlCp3il3l1q>%F-LIT#(c)cp) zOc*#JJGE`FinzBZCCeTObD?0BQt_ISY<4;y|Bs#HkM{8k1r!xh=kQAf8U?(kcBWGC zTkFhrfs15M0d4|WswBt>(8Rk@lkOfXp$Xsx=(eTs-V`0I0NFBd9!D7rgiuuLI&+Z) z@`IIiBhk9J8@TI{XvlZyGE?;@wxC3t;r2%9PW$i^fstLcl-25!y9`5w zy@Jp;Jk1+QK>Lg0V_zjP;bIh%gWRlG%29bPiivk`-uR4A3FU#J?dynOpQb;ASlgXl zX`NSbe>4>Kg029wH{)8_S>jb0a$~R0wUWsw*-My-_lHg;lShJW_xihQ){0Nh-Mw7p zJ^4u4>g|=rEd%;n^HcAaSV-PIhOFV0t|CeFwX&s`i+8mv=rIcNDMJSO+Rd`tB}zOP zP`O!NiX293iAx{=@D^o?8Ntjaz+`nKkmLq@GqRqVhNa$&duib#dRNh)J;JUa_eQa{ z(Ugi{Y;XBJ)VrJV{yHaxoKFoV(;jHOyZCO$&PzCMl&Lc9lgU3KM$|Ky4{UqW4{wL* z6Q|4Zzloh9KLcf)#Q<2irq-m=JH9ol<=d>_kV{kVwxDTWcbn~r&q6Emz8)9Ze67hc z2(O^a`}yF|v&bYP-4GKe==m;*^1}z@u8HyQ$q+#=eytf}K~EmMMikj{#&K9I@07@_ z)^eO+`bJlI%Cn=?^KGy8-{hUnHfCAmP3qLo9y^jl>xvA6E!aIn5Dg(G=aPfNo&4DN zD>A5sM$$y_KufkEPRzb+^wus#V|5Gb2shW|)I(7~4j<|ScO{?+S}7|ZL9Tu}fw!Ak z?3tttjBNuQ(&MrUX=S>s9>CABH?t7HNG&>xSLPyb4rc7UHyvJn{U`MIZsL%uS?pVG z>YoM%9CY|)b8x_lDKi-?3Rfh(dFBIFpc1i*{Wnb<)zcmqixLxU+8$4 zfvPBjL6H<#7|TsZ4KYokk>GJy=X%DahyEg^A=1hpcZSHJ2&B%+p{4@-t3;8a-}Qu# zcBvPV|6kqB|J-l@2Y|TPQ*>&%5aF1t`(}@Ip`*N`0>`84+;(i*;fmqloc#XO7?yvB*XaCW#Yv}j z%R|SUq@lI`u^dsR-QBf>HTm~3tdgeH??vrJ0ev^KN>(xrUppWdz>q^CGIw2bR$FV9 ziY!`ANEzwZlXy*s@t*mREuTkuE!kSPAG9e!1yna;h%t$&j}JVXF72{W8f zrCCTCaQ&#HK-ZB((_cNQO7~pBz^s^kz*`|XTru%uso8aF^$Q7M;!esazE@x0`{bSQ6!&jL{s)SU1W;XEZoJQq~WuB*A z98?iT@}9y2N3waCuouiTUa|$K z-EzM2LjCdIcIZTnmz7*+CAEp4hb7RR3lezE2;rc}${8uH~WOc}UCFAGnY9X3DJ;UV-O2)08OD7>onKL&knYu_?eg4ic`?JyQ&Zkp@ zp66ko{}+V*vb3WC02>g_c%87r!XFEc@0v{uGM8Yi?fv;i;4Wr-<+kXsP+73ZXZFPX zuVRRc@5-h<#`o^-`BVz@Ybi*c+WZ(xxF>M*FCogkAS0{<{l&i;VvBP&p>^K+OGqT$ z0`sQGs7UjUVEQvm*_U0SWIF%!?h9g3VCZw(BP>80jeD6bY3gn1HI)9*f6YB1XSd>` zKT&2)1GUye%u(Qfp$4al=v0Hy2C*#+!carxc{y`nF)&2ZjvNhv4dN&oK8)rp>r1sF z4Z)Hi#O)X#y^}0(G+t%%zsplW`ri8oD;5X;pWopT(kzH(IIg2eNS}oFRZ@;y- z9)EWj+;>kSUcRLsWZ31X&YKo>N5Jm3_n36zE zjY9yW8g11HpmsV0QFH@1GJu&OTm#z86pqxT0%HZpu_8p`A^-oD5E1}N;P%YAiU?*d zS-Av#M%f;reRTXLI^(L(;7^(9d%s&tE{!7>=Uv?$zIF6mZ0nIKyq&XlJ6!exAPdrx z1p#E?PKgZRvS)-oknPFZU`ZPC`=cSYQVUC3sVk($2ZbX!ee_oMU`SJXW#<0FFmNvO z;XQh!*|4rXdonb2)1F^0>}Oes;IUv@*H01RKl)Kj5u@rTv1ioNVZWv-evztrcaFrR z^PRu9UiC#MHn_72b{?oa(ypx;#es0E9UD*SkDRAu$WwQzb6V1OT= zh=?>zfFNBMv_(ldxd?b18K6i8xX>UySRT;y#1p==bX$WSD7r2v3f|`FtrHk-=Hhs6 z@WU-63IFx;)Lx2K^WlDh$8?i=Sc*}bFa4#@Q~N)BLX2Clo~ql2yod;V_uDR1mDpt+ z5JM#1T6$Gv(|Wu0A~E~=(U&4GNA(|f+)r=(?=%FDR-T@lj=}ONK=}spU={F4Wo)F_ zc_gMy-i&$DZ8X>VGLoCNZgi2+x3pwkn{lkq@_CJc_TCFO=RTuX{Om1Pk4`h#&K3tT(@xl|1*<)ab+Xcu2o(NB#l|3b(!6(I0=}wcn&Wvw?&TAi#DK(_G zNgdczGI+SNp)_3g!}W)e;!$NjDnmcsT`6xP^5y4nk~vD1oc~*qh{^XTMmeKtL{Xx^ zsuL88^~5?7q&e8405rm;Ux(#?qoFb+xQ^v*o$yR-t##030YCZW^H+V63WKCS{C=#r z>=p*70A zcgEIaG8!b&{M!z(r0H1KcXtAR2=V@KTcB)WNou{is~v-qX)BG)qTP~$`g1Os?w?L| zcTZ0ZsF&W|365uQo^YVT#zXWLx>b_LQ(``DKGqnn5DMG3bFe^gXtqKkbxgIVkl+$J zvj1^tKhsly5OqJe8U_RX%tkV z*Yfz%!B|(Q;fVowj@pLdgDwQb%aE3Pm3@cvquMQQfs#oDn*Q?YwpwfT@vxMeV%aSB zL%Y;-F3!%zm|XgD>C%q)e+m5$4CDXnE;s|YHT8(Y@9H~-bpG|3x5)i^7h?vBdC(6)^V5gSWmy%Dp-Z(m9Pxs*k~qmeqV-Qz^{#uzmX2vbu~~z&G=8PysWp=z zm}pbGVavJR^YCFpKoQxmA|A8)ttJxxRh@w9TzU??3vqOHrH88AmR(uca1Hb$Z(ctQ=~*e7JI? zK{c;&DLn9AM)C16_mWLg*8b;Am8t?mZ=w$T<{F0f1 zMOSdVwiQ~!vyRvbkKmOi7v}@qByn-Rc|kdE!R|*sv2dU9XRSGZYPmv#*LC!)e>KFa z8+%)BOYW1wRXlZshf8R~O$Uc1q$wmJL)P{% zY};rHRfeBBH z(`QP|mPjjwN};5$7l^gs^~#OY+eMd>!m5`fLLLyy+NhDB5g?cvumvwuhf*Wz#bM#q zb>tseb}lEJ*i$>Q4X!_xq3-)qtf7~4sZhFDIka0hr*rqy(=h3x^BMs!dA?A;Cu;nc z(En8+wWNo4w;n$#30a&H1lzWX{U~*5P9V$erz0sL?n#Ig!yp5i($k;S}(SpHnZrxH4RhOxv|2 z0O8*sy-qn>357r*AB*mFT;Id`HBp6wIyO3}o^EtaKc#xQiY1j%S3)VAc+m(X0_?OA z5zUhec3O3U@F29U$$(3xl70kUiH%4Kr(FUKQi2M55gb5iu@I9-;c_@Ti_BWJj0rcu(+ zkP>HBQW9gVT*pGwx!vaGC;FdbbrEkFU2k?eUB`0fE?oCaYj!##v=_5~$9zsgge~(A zAvUUuhBP0TNe{}umcn&cH!WvIEGJ?Se)k{jLSvZvPxZ&7`9Na1(SK+#DaH4t?>J}H z)>_gyC##ag^1=I)#(?)O9SIDq0?Hqh%Onz;*@#EOY)38%@tXKjgdB)@8&wI(j9?(l zq>x87rb!#P7zb7CFiWtjiEu(B56%%O>XgUjUeIEg#cj@ zpTVIJF@aKtl;K==nDSkJ_I37tAuEAk=wjJb6Uj|dK{7g7=e)7 zok-5#Ks7m9vxI5xDuJ!HF#@fqRl=cF54ycmBw)rd^_KZMx5jI?Rp+y81P z@U5*Rpn$`ykf{QbfGm<`E8@Hx0g$DnUF-)3HU$z26-qDwxV4h98LxU3oz*2PJpqvR zZMr=UTp(m^_mKe@fVkUq z#jG=_UR`m=nUAoY;@zvH#C?$F6s%d`aZG_w`Q8FJo47kuIg&t9Fi;R%#Sk1%(HGUP zi`8=?_pB91Lve-iJC;nPrc5cPti4a+M;QVp8q8@oQR7?dI*pU|L{tX)pgZ3K>3+B zS&$n@i2U%RkPi&-5>d(yAF$03;82yz$Uq>)Y*n1#)1%3v@LmwC7uLt&SINxhB!;!1 z;_8c(fLT9ig7*o_mXZnr2Sd(^qv2waFzbS`K7?rnF4YZU>Q2_e(3A*4yOBO*ne2XU zeJBAiiXD{B24kb)?~`PM@rR4DLHV~kOgn<@MeSv1?Z`0JIyN6##LKF!U?bkswkKhH zl&j*Y;cI;I%u#H}--9o94(%iDAL|*G$ERt}HC-NQz*4AF&_X4d6InETUS_o@_a!U0 zdWe2(g%zDQ3s0Olap{*$`{HBPn(ULumXTT=D=tZM#JJ+Top&*~~37V`&XWfC=G5BST(`Flvk{ACg$68vX``ci%Zrc-1g zNyxv1@aJ@CojVABYPl-np#d~C7I+sKtQ#3@0A0`}QXBRp;Jw-UW@MtuSWE9FOa~-< zSm|VwZPVMdcOs2)pk(*bCkLfzWBIMoFNY<0b*DPJO3N?eNSq}x5h54UBaO~s4}m(O|78E95vEI%(Bt^T}AQ^ zanNl8P+EC}oPHv^UuOUv*PNIl#YAh#mQ)|5 zZOWvWeG}&yyeTXt!86lRy??kPox?(M`!Wl>d_#eswba`c!7)l%Ugo%vks*^tr~qzm z$`fjAVM%!XB>0;UR*w8eO9K-00=nZEdb^!duGE&;VN+uFhSO<(+BJ1&2~T7EF&x zmu#f5=H#2hNe+KLX2wpbUCSgYKIhaPdB``}e-sZ~oI)dm1;~*L6qFS@@K3jRFS?0p z*%-#rg4;pOBM(%vQzw_KF3kC>Mj7SZG-`^r^J|!1IsPFuaEa}~l|aAfuX_gm&%as= z`Sg10iFhTycQ$$!ca62~sVjcvj8GnApWDW&j$VrN^#9vqWjk_qNNoOz`=cR>WJ7x8 z?(#PFSiG{bl0Z+WCyo5_J!*Es>(?WW3;AA23%T!C`&5<#h-BA;-;wCz+K8*uMq3f!nJDc(p_n%%LeR^fM z<9?zD^=MR6xrVL>l1iL4XMCHDO1oJYla3J3tC1a4kzBtZiEkeiWb6*w)h^pftL4qX zXo*kj|JczyY9)^B`M;#UalYt84@_x59S|dULn_bf0nb7%Gd0(Th{dCK!G{e7Fc|gy z5Ia(xPUBrva+TSntg!JIl~Q`EQ0Vw;sPk@_#goD5Qpd?CLJsD z+21B0d#J4MaZZ+=hJi1a4}r+bMa1y+;_-3$C;>8N5C0^Z7j!y=Qw$9Q;(|)1Aaa#a zjIRI4K;9`bNfl(@!q z^6BU>%SFB_NtJ12r0ceeap8)gYWC)iy=&xYM8+i-Mm?$nSDtSqnBKFi|41lIFx^8-h)$J@yE$^Dx}N5pm!7;@e+}u=GTrcjVz?U;Kv&VwruO)1TuW9{c!m z7~vm_;MOq0cS`b6$6iVzpYbIHm`V!C=@Z||46o#ZjiNkEWs=}9CsjipYSw}D>naat zxu!N6lwOdJ-N^T9HAVqQN(wZT9kK$zz)b*vkVOD$8~`r`OCSIMGO!H% zga+vk9Bi1gpr7EAU^o;x9IlB?LSTReL8o;5QnR_yg ziQB0-D)-`0o5BQ+k*)@n5jukj95xOdE%6kd6)RcU=8i%8(S1PRH2CP?l(=Qc02o*W zVnBUdlu)u0G+88Y9u919=JE0IvGeEYx(W-6qIG?uqoYLi4Ffm^XC6aW;{4aXQC5uS zNZEIWUi7Ln1uu--kgGKnIF(Vr)%(q5W16V@xlynW%G1X5PGJ0|XFepCfSNVJZ+ZzQ zF+`K14ll^34iE!=62|1cm3g!mZjkO`$}G2RKB~jpn3;5@`5tK{xf_waWqBK!?@`gH zTZ#SE6RNHn3h3O#-ufhd8WlvMKEg$XLyter?YcpHl-kjcDhjoYRnuwghv^V6{YXE4VejItmo(Nx{IT=$s2u^_WpMI> z?Irmsu$UnGX-3>+0h|hf%CFUe8NOXCE2E2qgyRu8SaID!X*px2Rcf42qz5KgSD0_k z6JAs1;cCvdsBmjcs5JqOC*>!+wI<#Yzqe_to8o29$)o%IAg<2-&XUNT8bxp6wr>H>v%lJ2Vj`k%xr}Z!OV$*6QIQYK3DeIB zcnT>BrU7Hg`BK0jKjiyU-ul)ejL%vlai9J!Cz6Z96bh9M?iezzN7U4$Yp}a%#Zn{E zjgry|KHjXZ%cpYAq{}rFOHu^u7z>kP=Co1|=8S1~KL(J$;Fep6)jnSfz;v1IJP7HM zj4(DHx3>)ba(#(4@^O{uV0kLMb+Nt>LRBjzC^=r<%>b~{y~7ThLSA@xf%od!J6ox*$uF6KnM}CbXqesC;;YXm63CPI$skTx zY;8DlNY2oGR@rHaNs(4pC-G}bdz7xBDQ2#Oy^R@VIS>KPl9t~EU=oNDfig$dfh_m0 zIU+5bsC^!Xu}V>pKC6Y_StYlXynjQ>oJmHBG!Xb-39(~;Xc%wokmU2Pg#6|UJ~^UN zFUNBXEx>|guzYXqzEu$IYSRwGkzSAWVAmLbS(=)zY|xgHM{uMlKxyFempV#szmXJO zw(63+JG_|NFXId&&ZCWPE6xbIsy8nr(mbk8f>dD>`CjUUKqzV1%tD`U%xAB5O_D}9 z6<(ahbY1`2-`6sC28sFXd zc&j%}icPDb6)P;o7(4sohH#9F`MmXjf8qybN;AX*UPOJ=?Pt8UPo6Ou8d{L;K3kXk zedNx&{4DH#T7dAD_K$^6!Z%XfyRzun8J9k`e|6A=d~lAq8tZnzD%%SO4Hy^%(a?xL z<7<|$!0YO7qc;cwObwwgd)T?0(NHiL9%D}3iF$~E{on!B3oDz-Wg_228AJj6cz?!$ z9dB826IiOKg~Lx{uI*8!toi~U1r!H#}F_lC<0NrgS(?B)TX zNAUww+Lzh%ZtT_Aiyf*-DT$7CDR3g*!YuDf2;LJG!)t>4uqUJURSL0k`3X;j;bgxqG3Jg@4w9{~YJD{pLX5+_I@|6cn;Wv-A@A>;Nwgj1UDvMC|?%u0ZDapg+YgLm@RB*HK)P!pI z)8>(esxwNCmU)DLqU;z(c;r>hdPR^1k5OfgR(g>}lVvV>Ddnz*AforwX}y%D-bLT~ zBpU)Bkb8IvK2O4#SsXrPLN7dH)SBchF!LOxONt@Twvg@zB;`Cpc#%oPpP9r(~M)sW| zh_4b>zDL++T3IVAj<9oaR7qQ8LBzYVtE4Z~Y1Jxjhvj>uyUXXHRDHO@Q}a=?UKx5Q zuY8Yuw<%0g+tQ7Ev9^(7vO>8Rd}^o=x9QKtoL+5&H=ol<<}hZj&&?MS?72+nWzs(G zs*B@4ModM^p!iOVM>!DPvrBBpKXu}$wb@6(T+f#7co^o4o6Jm2b(414MbD6)YSOMr z)LT-b-dt1Nh8Kmiv-bDYE6USQjWR*mnVP3FQ!(v9PmJ%)R#y18wx7TCYI5n-*ih@% zmHD?4Z+U6&VH>Vl*E#S?FHO=PciO*tm7G5*z4hj@#pSAdv+cJ7=NhaJ8eZ3Ld4GLP zjs_sw$K6NDlRSQP`ALHBJvTCpQJy4=UDhjbw5-6G;~uT2j_E<9qI@of!>IhF@l8dY zCHS6VNt=%9F-Htvl3>!kJNNFD(vx&s8dkbR{cTJAjL;_K!H&&*9U^r5kA|3ioxQ=$ zpU{5@Rn^^XzgBVknss{}%d?rzN3)kL%-d&eY}yYh0v=Zxd%wDEt(w+@aFI;<~C5bd5 zoaBMxuN6NQuU;g@>KLq)&DuH5%B>{K#YN|5gj!9jAA5zC$skCToiNPaM}mu0m{Vtu4R=}AOl^^C-sGpaVJdgj4#5``rxY-kb1 zX^}#W?Uw1Afd<=!C6s!xeOQ0S);G%*{%Y_zl4L3{WJ&B^QHS7nO@{M(>hei^Kdvut zh5pjGl;!+1w2mXIA**V%``!a%lcl83k6Qyj1kG)}+p_;))2e^2T`C7>kOP*G@ zHrBz4LE76Tn?mlYB*rBk@(erB&(@zz5jI1|;Bv@B#Q2=0WB`c(aO&E3-Bs z3J=PpTNVJNN`)^-b&w+&C_2c|aGcH|xn>lCoXw;w3u>OME6r+M&>YLGy^?@;n3kc%|#ibmRx@r&X8haO8KfB)Bla+{fV(k z*p6ChmEtJ!+@m>I*N5z1m++-V_kDvPsxr5oPq7Xrvn+CC^fa=vQ~j2Q&Lq#FqVj^sLu1OJdiL)U>tAE4k@wk`$XDZ6CQCA#l}a?XJ~eE zf5g`FvEDdE9!r`RTbg;V%Q+)+%K#&@iS)=CDX#U;=_di9M;~J@nLNm;So~Nqd$ciI za8cZfIesLo&U-9}<&C_cpdb*ACWFGYpj5FC<~oG-ia7N0YjdHynRcIZy`o1GtMPKu z+toS)qZ3+L#wL?x3m4*gqD8-ehWrP>c!;i4zxZ2}0~xA`!DX=ivG7;P7_0j-wTK01 z-<;UPi#MnChh!rR-SxBv7uSE_~cI!cX1+J*J}+-R76Z>YD3 zG>oyBdm*>H_gUJ@+kW5IVUgdD`ND-uzjA7b8yZm#FZrL+*WAT*A;P~GaYrFv&E3;a zl+C{w&d&^kqvypmKd|+X-ZVLt?O#@v-!#-D<$p7!Q5ajbD>^uY10d-e`rIOX`t$y0 zZ$&U~yHX3SGdYZR-llHqj%0zG%D|fm-MXxZGzy650354j7LTlyHeJ^nk@jcQOpO#h z)r6OQ;e*;zv6xkvZr|oh!v@M?X$Solo)Dn$6r|a^H zCO(4JbObM@((K|B#*#xOBfmDb#>tL$uc#uEk&?@nw6l=5r|D>`W`?wp-YZa?C&ONo zCcQ5pDQSlmAB-BCN4G6V@l%kZQ`9B}qHJqt8Y1GL3@%n4SCJ$nv`7K~u;3ldpT&{Z zNUsl(2$B5o#^E!d1}T{%uT%*lah$rckD^GKrQXhR(YSbT5naA$9Jz=tn-%VR5Ryb{ zSVAO1#7Qj$KdF9ySv|k)!`V;AW`}U<*P&y(Ox@T|lD>oA)2aRyXZKVGKc`_54dV7w z0*wq{+9c}&l)AKjhvN`Xd;&G%scixV(H!SBfgPx~pD<4qt#<%V3}y~SO%Uwc*2d?k~%+~&=t;JE&+11J`|VCfPnlYo>FvEUqSdt zH!0DOjoBmYX_}oNj{lx?oKrte#Z<){#~y+ty=IE*9SdTU#$IvJ<$PG>w0imBEhhp< zRyu(d17!klHj!^~opZua&2&*NZ(M$;>bJ?QPy!?520O3*jE3_9PE?VUQ;1+vj30K0 zrO!S8ne^`)uvB|zguc)pklUD&+1CHHwppVb)My{)lUV&*%LxOyWS{A>BAdWXtbjEW zRCA1grNU9*SR$Lqpfr54+sC8?Bte-KaneM;+eC~OkHcoU*f5q#M2ju{RawFoexgmHRw4M zI&F3F5PSVX`57qhc5j}FAA4UXzV^7z#6GP91OUfKB+yE3dViNJV^ak{)<5l`8dsp-2ICKylPDay{>1W`e8Yv&iWO$O*Ft<-cmxGL zuUR;^IYU@dGEQ3+pyWg2Qti=AhTK&s8w5q>k1R~Mgib{V-|mzPdXj}Qbk-@2F2BLa+1v` z<)_q)_%u|aTgl4EntzB?i`L!dwtE%)A?0Y#46p^yVFAX>cw#8nJ#tfop$z;5zmB#a zQKmxaT@;xiUG!3`zu&rDs^W;&H8eQVJkqjPh1HS(bf&iZDI-h+_y9EDoP5itmbTAc zP?&hMG2qM>4>e+ULvY+rg8m=vy?0boYqvMLQV4+r2oORjLI}lB#L$Z^M0(Lsq=}Hw z1OxPp#Y-W$eQLXRDiBp^wee9l<$oxqT1AjzxaDelusoiDj`mGmLmfk(k1Y}h zvPpUOb^MAnl_I8)h`Q_io5|n8nhDj{jA&s!*lA$O-76rV6B$8t%+W74cZ^dmrkXs> zF5YX?49y+J6HVeIWy$IlP+4Q8xSm{Sfrd$TT!E%dT!oC5hX>yseMl`+>ArpNAb7P^z)&@kn=JmPHk%=}~^3p=5xeGXn~CFlKQfAt*D6q{0J9)d>%eehgF*bhYwqLC?7Y~8TbmyoGTtF#5`Zb6=DMT`AOu* z`&Q`VaIWYoT`*8Vk?Jl)M*syBx)3`NV4h(>+|dv+vmT+4#{|0qzVriori1X8RcSqr z`VtL2L{~z?p-6#VE#I_8fk=Tit*yGWT*+W{d0s!&8KjfT1?0B_Mzk2bJVFp;i3fHG zTg=!E$pWzY{9L40u)3O7wr?H6J2Mzf4_3Ben0U~XPFGeI#?+b<$HSUpb6DF zW^@uqo+G6etop9u$Uvb}RSh&3rcG&j3~?*T;~wb=u(J-Z%`Y@`8WM>>S3#No(&aL~ zg}T|n&eVfKvuT&Z1s^1fOgA%sA;cV@JVT)dt@#;oCc%I1bEIi(vjn~FV`2ODjLljm z&|S$-z*)qihm?E0@EuohV#DWP6`GqUPiz%Avw&O{VYh=@Hl)3vf3`xUNZhv91t(!#3Ejy$D0^y`r%KiKg3KPAJ>`;?5P90RTk5Ko z&{vE~w~!9h4vJFqfcEje!)YokeIbHXXJ6L?vF%A076mFWzCB~U>%J&Hp)hz{1lhP* zBn}BvPlLog05|ct9Rg&AHBm_YGC(< zqRisL8-cItZcd*7O05V67FoOH?FfKzc!*Rna6m&&FEEn`orcZ;5fDQbw6E|!LDC`{ zVyICBCWj6ZJhp44!olEYERtZ}L_# zFoNWmjU`5yq;t!tmlQXC8_$-MEBL8owaA;E<8y!-+D-x%0RsxG8xP}en2LrJMQkB$ zY*8PCA|wa}L80lEX2v*CwFflWGwuh3isG4}(=wT&2nwOVW@qs7TD*(e2;rjEtE0V< z>cHa;J!3dpO@hp{?o^V97cZfjKYqluu8q_cg0FIo;kJ_{NI@vXL!v`j&Ax$B&+1^h z+D}S;6_tOIMD9qvocd%f3C&=y(M>#>kvI_^$Gj;>QmY8Qr*jF>hkAhOmeWK%Saj7? zx&m_(zTV^SD&Pas%!WqWT*Sbcoi+;$K|T`;dMN;m-Qf?JGhRsV_Lt}YxVDlIBs!j_ zCyss7r$-=&z^8OD;4WoKvc2V`9t7wEtM|nB&5J;olX!Ge%&5C4faH#fFyRaC=i=iz z^7Fuu5WJ5Ie$^uz%>C&WK>YYtfZ`uy8AtUeshOMm`-2k@IwcTp>1r{{+zcf7Cu1eS z&6a(pBI1_};jbPdiiR|UfNl12TyYizha3dF=@bk9KsekL;SSY=X+p_lB3F^OYJ`vI zBFWGO7@a)nNP&dWo^)^Rc91(HvxB))r2|F-;+T|Q4C_e1?Yg8=%5K8dlz@VI6@Nk& z-9L!>uH`+Pb3^u=gSWm8M}L&9EYmV{Yl9qu9n5$mBVv#BBD;@0?|DoWu|>~~IvyxX z4G9yFv#ch0v;_HCNNE>TCmr`-l%-;Q6ABtFwH(uMz6qrdE!FGXE3jHUX*v$JJ^8Xy zsY{I(zUl7mnpk0buS*Us;@XZ;>uu`IUKyeoBTN9KH9DeUVD)xdnE-F~Hc0;z##>@< zf@T?pMwSLwd8=eNT1W%DZRKZG&|`hv?)V5Mz3a4;E)=%I3a*Uj*kqO#j_SnkOw%qQ z6=s&o1lhzZ%P~%eC0v*3cZ}&6>9*jM!AbfNYyuKT(jp;glgxe<6x0gUge1`7vjkj) z?fVJ+Do<3Gwq=J_p0QLZ^w63u;mgpE4A8}D%`U$38zE^O50(EUL%WZ%-+r7b)vJzL z-Mu|$dZx`5H0WvD%Ltmizb|O^`pqILerpk$9GEMUlQJhGg9j1XYgW|HH7jhfOvIxL=(>oYqK_p< zF>RiV&g!Dbtn~fNPKtVO$f&FTu}@p!C5}78lnH9icp04nYIB#&J|MlYC;~nN9}>XB zf(tYIgSqx|B_ST=H$9O545A)LX1G60&n4VuF+lw=svG)J|XH;P3ZoecJeeDb)g z;d<>!9ZlXSH9{@Vves?RiVrLkSUL6PZx*aN6&p!EntX`H*~NM1yJp z#>uQgUb3+HIi2cJ>=3xsy`aR&zk*T04Qw=&X+Zkl2sShC51Mvnq{>!rl`O#6(G*7y zefj-WK{FmNE!Qiaw7#d$Mo4jnv`*!%{^ao#xu2D=O0j&llvD^iDDsvy48{ow-5{8_ z8iFE6OKHi0T^uqmkT)0Eg%BjjPr7vUS2_81nA9ap<&Zkc-aXK%FyXK~1>)_$cGSX3 z95em7V`jDN5sEIvW&b)p3Ia*a$2jJ~IO3KxvG?Q(4IPciSc=L&94p04waP%Osz z+5>vSe`4tmSKX|A z&pBS_9QQqMs&u*NuI%#davdue2!SKedqm|JuSjhGF^#5W>3By z8NnANBnM-Bl`f{%peAVZX3F14?^BR!heZoJltigQi5MjD$oY6m1KZXK-;nuIAk*Ed zcGN@oq}ynUz@vgG2`%NHQdu6vhb{m-d43zw7{`)VUR1EaQ&rNf_y~Q?Sn)g14?7dG z@CzYn9XEo=)L+bBGDOU(^wq&LDxU8`*#&sjH{8TXbe4B^%)9KGje1#ob5Pas%fKBR z>*K+JG~MeDvTh``eND=U9oeET9x~af4+YLq4ptl3`(5n~#`-B+z67;YieywD(_!B> z>)xA3;r{^2bZ9u>z#J|X4ikC=*iyoV*#VH^Z~(!5VT2k28~{mL3MZ5U9Y^a+7Z_T5 zQ{bc9flwyIP$U;XOr7p%+LPMwWOApLL3GHJyNJ6cESknR8rf>p0|iIFbE~g=0HXxJ zC~=Y_02sBeY1z))$yaT1R^6}@rO)|S+ewsNv0=FJ*7}#;b$)(5?+#XwA?TBk64K1nyDg>n&0Eh89*u0PAOZME0R@amW^dK7 zEGn$SY(m0VOW7V%V8}LG<+3eU0!%(a-!oRC4_LF^!wA27xdbNA@lj2+7SF zRe4oiEVy)urT!!D{INZq^L;MYZP#{H(T`kXe=&lvVKP!q{hvLqYCmW_8Ll!YZGJ-x z>`Yc6)(sWZ%GXHO^jL89gIR`7ZfNjeP0vdJKxx#}hYdQmh#v+O=Tx{I;fd!>jy0?t z-f@HCN8#e>AtKq}U#2wEn?9iwoiHt304^|2GooSs0+Z6Y+mYU8r(prq1;hXkH6oHN zo#_pU7MPZ10_Px29Zl4!xG88~yq871b8>CkqQ`XOxBKlymwZLdC z4T@(1{&H&486dUZXQh+9l};y20(%MM{#sFmTd+G!Nc;j6pD-hm4Ynshlt0&=a$%O~ z%N_8$Kxhl-*EWlCJ~{{uZuYt%p$^Z3b&Xk=yHMIJ`W@OG#T>EES1?PnXW+%kfuWyD zZ=CtG8PEt?PW64APadIwKe%Z*#f33U?-nt^)lJJO_PMrAlwEeYLUD-FyOwu1H@qre zEX`a{!O#K(RQt4@!lY7a$_jTD`e!Viic z_bRd6Z_u^Ikq;-N=2TPC)=v}^;}AV8dX854HH6s~T^rt4m8PaU4L*4}vjI5ar4CCE zZ+FswR;@?A+Zw%nsUsk6V1TDdYVgRlDh!ZODKrNE@CwF-=CNxYv2z~Y0eQ1=?e%Cp z40M$s08TOroCnc`I|&35-i)as4vA$0*7kT;aR`O+?mgsh;y#4_3$m;b6hi40his|| zLO?@-2W;C_rlaD%F05Q;Y6zo$-gl|bW(bd1I^twV;A^uY^`?VzD~n@(`d z;01@c1ZHSJ4dps$cP4m-<`)mz^XpmpypO1R-c%hjPqpTnt#cV z%&gB=k-&!_MEc+dUhOjM==9^jiuDuO%T=KM3N|grjc@8exBW|vHKc7b++~Q_KDvD! zFVOiR7KBBlOJw2JBpStP2x71rBJeoqB%{<4(sCmZp*n;YAdnFP9Z7tU67h0^5Ei`% zfk-!*cSh(^3Q5|a&0KWxie7xWD4K$l*E3PwnRmc@>K>~6aej50^C9BewY;39m=8ycbs@HTk8sMv(2r@hNr$_S8}Z30?>d= zpj6Y;17><04u^k)Pp%njK_C!H785ovP6q7MT!AJe#@?6f#HDly12tvQ0<-ay&;}i` zJt%%BH<`4;b+_B=`nKWsFl6JShJN(&H$a4`8FoM{D7E=$=vNrUSNZ~KaMjx#Zvta- zjl}^17Xs?fM1X>nkL4l(CiuocU@)+Pi>4aQlq13H4fzWuGc`&CsDw>p1F8=#pFk&X zAu+oEF!6873!uy!ItiRo@1w=l0mWtqic*X6r7nlmdc}1nG{9V3>ln0yfmJmDDI3C^ z=F3=c2lIfypd(yZ+cWHf)?Wc3q?F(^+tg%!=EOimg*QK>LL(wI`Eu&L3fo8!7LwFE zzVE@IQg~TdoYESJ6^{nfd(x&gL9fU`fO5X0E8!W)gZ?N&Ky6)9;9d|uosz>=!*9*Y8R!xadV|gx(%r9- zDBJ~Z!qYFhW$c{1lJWHjN@S`fA(W5MoZw2STOXU&@^6IxJVdB}Q3^`vrU-pKVu#jA zuhnhDcl(JaTj~@f`bqQh-tY#N-22@GOY(GG`e^#`lpr#K!lk2E$%uty*cbxf%7MOX zG9;b?PROS)WCXa^9DQ>op2@XGld2ICF7xEy(Z>!b0&{qiAzBD5SA^U#Wb9moFVA9_B}|8~@qC0niG7=N z>t+|UkbldNqYqZ(#h%L*u&;GetKlIG|Q*3P-81RD|-) zpd`$)&{^X6X=q==*M!XERzqt;`|V=9PC5q<=_Dv_`hd85)=4lbK~5N0AY%)-6O9m< z&@4t$Km=qDv~tUONt^gzcexOT^J<*8X|nQux2zIN{{gsOa=f6Hv_$Zj#H#sl3)2qD> zp>pUbPp*KT)xJ{LI*N<3g%Le_1bRk z#wkBUZ{F8gsB&x%@i^&5@CTJd@h3#oBc|>`>!amY_V3Q5spcsAq)t7HohtNyseecP z8ug9S?NP-ewyNSknv7TE!+3wb`9_GD)7f-_PbRL+yP31k+@SwP=m0}b#7%+wONN}{ z;`Z!O&v|6En-{`J+7W*7WjH=bU0tp1de_bm18*X4{iw-ze|7o;+Qg|xrCf*9IHdPr zPg`9WVs4903TH`RO$~UaG&q)T!dsb*Y>fiFNeMRQO}(-8>g17&ujK#s`ZV~+Ye-vR z-^$&`Q$=_r0iXaX3?Zk6+O{ewipGLJ`oLA&f~!wIUM0UUbW1~KIov)77IyN35#M%Lw-54@4Mnb#sDEkg5DCBbB6-6=RCy^fVKEZgM^D$ufY~x>$O!G$jTPgDx01Ol6{jqW7y8q z|4DH$Xx#bwsQYN^heXK}<87Lyht&__K00UA7rr`q>D}AB$;_7-+(xz1@gYxv5BVQW zPENkR@=CPRp!<{`|Mug3{<^(pzxyAt;Nr#uCDHD%3z79nK`sOUf&nD~d?W*BxJA^& zQbj6mP)}CqBwITUl^CaHb6=A$LvNS@H{1pU{3uX9LL30H#UaVKFr9ziW)02MTnuwg zKExmk8-To4Q31`>xN@cu7bAPyE+noa`P}YfjT%paYh{Rg8W10U449m;BG&DfW-^we zEqvYLo*ptBnsw5~s@-dvaH?^Nsyjjb)V#9l)v_gxBrmCOLAR)>;G_q758ih2)`^4@ zoY^(8vCex^TDM#tX+YkB&uEHw^L!d!sC9Pvq!%?Y(M$O z>$W>>)tAEEe++@l^LT&XD1LuWMUlVw;7QAaZKrC?seDd`_GL>O0Pl2NMYPHSAsc6m z?$~P?BE-WTjdmZOf|}+fw5&Vai^{RLo%46T`PlBsjXM`(Y!v>m`*iEZPV+?MUmEq? z&eS@i zujIdUZ7KAsbpe37ZH@b7%GmUAoq^-?MHMc*!@DOa56w^YFPR@bOgq&^`y+p~%pm#R zo-bfIQ6I&a_RajRM}Q!n@%W@4pOH;vTl|oZ-OGQN;OeHbeP2UlRgcGey>+-$@A~2W z#j{^>OsTnQMYLqFFsWGa+=ve%V)fqkII!-Py|7d0sD2J2Nk3j~Es z?yQ&0Iw(cGA;lyU#_$4CEKS&6fEhFjGcP;9C$q=jAP7Gi1fygsoPtRJ2?ylCwprEt z+d}SuRgW@Qymc2y$F;gF$9*oL^8Wbv*>npFV?BH4gicHcy+_tLGtu#oRO--*?6Mn} zX?=-8Byh8p{_Vd{X)JO_*Aq*yx@`Jr zr~*P7%_{7oi<%=k_*kuzrwFZhaB2>86v?Vg&IoB>0QmJ%R?v74a+eO-ijny-psdCZ9Km%zgIsMogSW^64Z2%*iB0n2iuU1H$q9M%Mc%iACytb7OzFI z(XzM&RjNKQj*XS^Ps8<9riv_XnzomdzG=GM@A9ap|3V1w;e!`(yU6{85U#KFewLFK zNmu*e8g91fWy8Uxe(a!X8D%zmtl2{Z-t39R1gUr#(_at>V^VQy372>?v=-jd1ieK@ zT$YtfLdi=4I@1UP9c30EP5=a93#-p~WpVy-ww!WuoT#|;{eu$N&-%vY$CyUBmKw(; zNx;5{q}CCM8{$bO8?o5agGg~@6t%IGo!oIhO|<>4D98KHkS2Zq`o2e25LN2Z)e z>(ImbL}#x73EjAo$7l=}fs@6O=?X<1Av>X34Ypbz_B`6z9dF2^+(r26C{^C- zhG~^$(UDox`D+(k158|8USl);a-Xi{H@!d~%Iq~c0;2dcxxPA(NyFO5@-e+QZVo%w z;PG7!!vxNra9lhF+PvnE!|%92sbzN{oyQ%z2w1xHZ_{PMe~m+mg-Lr(^Ofy?jYF$1&-HPpNl9@1)Mg*O- zf1ewjN`)UiH#%TB$?w7B7F&%F>-lRMcIQv2_J|O@25?HB8k&xM&HH=SF7}1q+z43fd2DKb-J?>0zjvevogij`LBLDCl}6veWNA4t z)YrKmT@#jdVk)9s3(6&EM_W**8l`x=?kg!i>$YqxiN?$0-)>7DUI{ev-#VM z57D~>o}%i}Fr^brtW3fzs6>gd_e@S08;T$XU@&VhbQy}S)4mPh8ec>Vv*`~&GS{~Q z1z4CRB)Mm1Ov!{GVECVEm+^S*XNsR4IUL2AeKqkyH;j~#YZ*%v`)N2Zx+3G4u_Cb| zzBKb4OpUFZ-NAG2Pc687>b;7$l#I4bv>8cS-EhoqjA8C#W;nK&H)h_Zp(2_9^z=It zKj(`Jnr*m)hPizdl!MsUh?7~bdG8}q`|808 z|nN`dSV0TIxLzFP1kruz<#%W#MgmSdgekkhrl4%Jpp;0^dV%CCw=}-Zgo; zpd2#5;i#k|;$T(P@;FGxuNOG-5PZPp4gSE@KyS_V)ffn;nbMUFCGdDJX-M4b|9tf3 zNecumu%e>>b5?Q=04l1cU=!@iZ7l zSjghk@PY(D7bIRTDX)_B4-W=#@&ReP#nOyp?v~zDxGUU+cbxS5IQuo`&!w35i7pdp zhNdtAFMtd}+4xNC_^FZ;+nycpPE7&h>6~=uYa>d>$dC70aF92{Q{^M{J!z#7oUt1I z+v=giZ4=|rtR37FK@#&~AWnccZ3v!?)E&)xaL+Rno-_m?sC`vMf||DSg}k5 zt*xLv^CRk8rpkkZJM(DB&`l&ty>TvL3$k7z_9T$=y z027!ZljALm>=rG=B1;6OrwRZPmQEpx2QL|Bc!_G#H z*Q$jj2&e#&g*zy`h?y%-xAA3YkSVCf82$Di^C9`Nq}_#E{*4eH=&1{BsfWOYA9Zz7 z{5TliXL$>5PAq@vhp|iARuPUO5pJM1%Yf)U^{n1n=;SB zgzxDyTTM_*T9P1EEVLyI9n=z!%p_JdX<1aP2~#6+()zKAi>nsa)~RWkUNhS>rsous zrlK+%*S#tUZOJ}q1zufiLSWE}&bn7))FLlqdPZ6+o~PJ-P?1UF;Ps)~_(b#!Y164- zRL+9f8AvSzE4~^&6ao1;9rE%|MPm)A(zp8}9UtH4?Yup<0r!`tkfruk$woHl?}tQd z>jcTi7NbPVWt)hv?GXuEE0=?^c^3}v3wXr4xMRDt=*9J^X(dxtibnySJ`K4b$|re5 zIt@r|pphgL&|cnvKWyD?PxPtLo{div@>Y?bWiy|A%QdMg6A235TNJA>bw#;vBQ$nZ z%KqU;**IeZuRjv&GkCnQ@1=F4e!1U$)tB$1N(?nlyg$8fj92$UVY9SeYQeM%o})wY zW$8=07cCk{G-@W2QfNipmsP1Qs=gt3jssX&j*|zbMO>eDQENq|QbrgY@^d@_YL*&Z z#9IaTtmg5iT~#S`y0Pp+FCt2T<(e!g^K0I6m&L5W3b+`iC$JAdhZO-cK*?i!Sf+eR*&b}8oxUVNlIg1M z8w~(Xl7ty7oAOX{;aI9C-2ie$dG(tJCB!(S%az|M4NtP(j2p=Rf#C2F8ijq0a2w{l zs{$d}oU!6We3S&IZ&7|BbVh_<>GjRiUGy7{ z{oU6PTSl)4NkdrWA*<|c)Z^(jz5Iv~MZq303srvPl3^71Oq4nPb5Z^QO%qizF*1)$ zzeSDsY>$x{eDm=gKh$f)M|yboWB0=~RKi0D32N@3@?6JU-`r8$%r0BY&iF8T25a4@ z-WOK3}l6zXSOEEs%za1aBTdG$x{51xoE9P#=jSGVlk4MBf4XC_sPg zOUtcy&G#LuheZn{-`E%p;}R1-CzYMsB@$#`ZAyQ*zTaXSc`N9&siK+%9q%Ub5#nX6 zWVj78zf?v1LP+);!w~S>&isW?DyA_iqf?8T%-JAzYHtx2)(+w+At~?5-zp{yP*Ejb zm83SS#UIjOl1{gKf;bfmCR%lsD<*xJ*4QIxsU6D~Bqgf_sR2y-@DYV91SF{r*J?4D4Nn%HA{`Z zEs5#z4N~K5>mJplHtSG|QqHSVkI;M@dZ?b_WZy;|N$b26_ag9k@ZBY4UT@3w8d3Fi zRf{_!>8J_HRiZkY23~D1cG?$TX$wk^I{JW+KSEZ*7(K`*w7Z^!hEWTcLA4UbOzzdZ z{{b-YIso9U|1ta6^PjyJzRNy(*xP5~Y*`crR-}I{bgu|ZT)kKL2}~td*@pTACd38b zD{?sgKtIQ8RR0|InLbp%BHUa~u#Fa@P_Mne(Mw3^ro9`fdWVOkj)p+k_%)4a{teQ&*UwSM(;@rvKC@==~Ia`iF;{>R_2HlAQoX?E(;B^!2EvpJVOgZ%-x$zukI61CVowWrtns{1Xu{ zR(XX4)PBUx*s()xyHQ|fKNkRuWXA$Y>@~6;wf|lHEEpE{XKAVZx046AAF%nWIsexF zgUTmQg3srOSe!V1=g{_;saFw;$LEf}i@0~p_+<22*W0tv_oCmL?2cah$_y8-mEHfg z=JeyWwXa|e=Le@>Uot5*6~Jz(FwXpq(EsQOfUpopc6olJO>{;QdseDZL>1gENuCXXa7)J6-E3x3ONxfJ`laj3Kb}`1O)%4`i_j>8$!7N=7a+iowfl#jbS#xuP){~0} z$Pq?8^l9Ih`>i1`7uk!loG0QlHd|Ih*e=k%BT4j>NC6Rs#59V>O+jX&4z8QW3dO^^ z*Po*#h0AnsfT!^XL4H}F8XHN?HFZG_a z0l^}3gpAc!)qvWjtjZ){!&=hR>xm$n7{_BKay&SfRp@_J52NWWG@B)0wbT1iD;m+En^lN!_Pv3HruZ=^vuv@24Xnd4|{bzlN7i`3TWvEnVd^VV&dbgU+^ zR)8B9h(JJCMGq)8XoRjhP@#`tLGs(PJ7*O895?K;y9&WF6qE$i>f7wwYoEMr`&2SM zxaRbG*0lIPaQX6H#_Cc}z>K2c)=Gto4R(2gTSqxBZ4sINQC3qB&NeGN0Br|1lrd4Ka3AKx=O=e7U5WYxd?=cTRB)_<&j-z}+@eYiR&FiBRO zZI$WwB8V{fW#%x0tV^&b4WMsGr5}i{O}vVoa@A;;y0q@x=pf>b zWKITp2jR#ZBC{jnoX;&8mV`DArQ)?e?ro301@$eoT(x?_f7@(X(Y8Ad=kAGm8w$3` z@A4bn<@yF*2=Try`0np10%G%k^4)Aj<}mKPA2yxZ=-dl z)of_5n=#I+LjI6G`VYp1+!=?h#p}BZUX_O>OfmtDpzYxOxO!Wfwa8)%P)?bUWxCC! zXQ+|!uX%P+KdP)grCrVX8LM*d_N{`lNb4Xk^9r3g{eq$3^yz}zei|p9>W{hqb8W8s zw%d`?jq#GVCJooVgqFTIe4iF0Kid}JFDLAEh@FV(#8c~7 zLmIs$B0>g+n4A=>C+Lj|Q96^Y0gfy#J-GuW_T!+Nopn=t#rT=-u@16BcnGsR5EuB= z!P!u&LO?lRCgT833}R5A2>fkYT?a=r+-LkIp=3U&a+YI8F~B2 zMk7YDQvBl|sIrp-kXl;jr$nsx&6S>o+abNeEAY&yZN!y)*_O+uFbd{L#}$i7ygeCC zq#uuC;;kP+a|mG=Sx78M?YwX_1*~Ps?W6)mukl749Zx(8-L(z%{67%l@rGru?30?= z8K3Eo)Y{h(1#Qqy=!+E0nJmemoo`mn*_y(M%WW+pO)u~AfjwFKaAU{et5%g>zL$J1 zzR){A9T8Yq{TKSp_;A^dT|v9_&17E_pKGgCpxuW{pO9$+$x2JAyIzgRf4cU};9bnK z@ck!wx7WR2h4DpbfwfZNz8ki^+4pxR$D%LSbpG23KKvoXyVMZ({`IccEziG_^+nFe z9^9cz)c>4uj3n-WfRaf;#=8YzN!O1G>!=dqH<>gC6-mZYfkbFxfE zJ<2^)^ZH*N{Kt8mEv;t;KT}#sTAD+;mR8P`aM?{)ti7u5P2U-)Tq{z9?)aVTN4eK2n*ipTbY*iUIP2@l_%TZ zG$0&&zTR}{zA_m8o%qz)yWr<1n!?uQd$U_4;;&1S?(52Lt#+C}TLll0;)!%lz1zEpd{tF@LbM%*jpYQ$71TX!2(13W7 zp*QM++JC)mk5YXz$6cW4VMoUIwocoph0caNo~LH@z8PG!r+)y>-Bdg8dT(I0j7SXEktur|cu65e2RfW{1vGsib5WgF1SFelvlFA0l^^H4GCg%Z zr*-XvjgJc3C23fZ+R|XYt3WKZiUM_?;C|f6dMHKDllX8e$*8RMp~61ZLg#D3pE@r} z&Mrm0yJ^2|d~5Y2L;WeH;+tC{s>R~Ful@p^@!(-wI|-wM!XM^p;r$HAt5>Tn$+6Tg8I&m{}-y<{~FQ%@m9VJ zePOO}J@nL9Yknhyt@Hh>L+4Z9uTJiN{G x.EndsWith("mp3")); + var k = Directory.GetFiles("../../..//Content//sounds").Where(x => x.EndsWith("mp3")); if (k.Count() > 0) { @@ -27,7 +27,7 @@ namespace DangerousD.GameCore string[] soundFiles = k.Select(x => x.Split("\\").Last().Split("/").Last().Replace(".mp3", "")).ToArray();// папка со звуками там где exe foreach (var soundFile in soundFiles) { - Sounds.Add(soundFile, AppManager.Instance.Content.Load(soundFile).CreateInstance()); + Sounds.Add(soundFile, AppManager.Instance.Content.Load("sounds//" + soundFile).CreateInstance()); } } @@ -53,7 +53,7 @@ namespace DangerousD.GameCore { var sound = new Sound(Sounds[soundName], soundPos); sound.SoundEffect.IsLooped = false; - sound.SoundEffect.Volume = (float)sound.GetDistance(playerPos) / MaxSoundDistance; + sound.SoundEffect.Volume = (float)(MaxSoundDistance-sound.GetDistance(playerPos)) / MaxSoundDistance; sound.SoundEffect.Play(); PlayingSounds.Add(sound); if (AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) @@ -79,7 +79,7 @@ namespace DangerousD.GameCore for (int i = 0; i < PlayingSounds.Count; i++) { if (!PlayingSounds[i].isAmbient) - PlayingSounds[i].SoundEffect.Volume = (float)PlayingSounds[i].GetDistance(player.Pos) / MaxSoundDistance; + PlayingSounds[i].SoundEffect.Volume = (float)(MaxSoundDistance - PlayingSounds[i].GetDistance(player.Pos)) / MaxSoundDistance; if (PlayingSounds[i].SoundEffect.State == SoundState.Stopped) PlayingSounds.Remove(PlayingSounds[i]); } From bed41c5bf02452482a29fc6f5a29501d8c1d22dc Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Fri, 18 Aug 2023 12:30:44 +0300 Subject: [PATCH 15/23] NetworkAnimationSupport(ChangeState) --- DangerousD/GameCore/GameObjects/GameObject.cs | 5 +++ .../LivingEntities/Player/Player.cs | 38 ++++++++++--------- .../GameCore/Graphics/GraphicsComponent.cs | 10 +++++ DangerousD/GameCore/Managers/AppManager.cs | 28 +++++++++++--- DangerousD/GameCore/Managers/GameManager.cs | 9 ++++- 5 files changed, 65 insertions(+), 25 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/GameObject.cs b/DangerousD/GameCore/GameObjects/GameObject.cs index 65bf8c9..a2f0881 100644 --- a/DangerousD/GameCore/GameObjects/GameObject.cs +++ b/DangerousD/GameCore/GameObjects/GameObject.cs @@ -30,6 +30,7 @@ namespace DangerousD.GameCore LoadContent(); AppManager.Instance.GameManager.Register(this); + GraphicsComponent.parentId = id; } public virtual void OnCollision(GameObject gameObject) @@ -62,5 +63,9 @@ namespace DangerousD.GameCore //wdaspriteBatch.Draw(debugTexture,new Rectangle(Rectangle.X-GraphicsComponent.CameraPosition.X,Rectangle.Y-GraphicsComponent.CameraPosition.Y,Rectangle.Width,Rectangle.Height), Color.White); } + public GraphicsComponent GetGraphicsComponent() + { + return this.GraphicsComponent; + } } } \ No newline at end of file diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index d0c144a..c55155f 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -32,14 +32,17 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities private int bullets; public bool FallingThroughPlatform = false; public bool isUping = false; + public bool isNetworkPlayer; + + - public int Bullets { get { return bullets; } } public Player(Vector2 position, bool isNetworkPlayer = false) : base(position) { + this.isNetworkPlayer = isNetworkPlayer; Width = 16; Height = 32; @@ -48,24 +51,24 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities AppManager.Instance.InputManager.ShootEvent += Shoot; AppManager.Instance.InputManager.MovEventJump += Jump; AppManager.Instance.InputManager.MovEventDown += MoveDown; + velocity = new Vector2(0, 0); + rightBorder = (int)position.X + 100; + leftBorder = (int)position.X - 100; + bullets = 5; + + this.GraphicsComponent.actionOfAnimationEnd += (a) => + { + if (a == "playerShootLeft" || a == "playerShootRight") + { + isShooting = false; + } + if (a == "playerReload") + { + bullets++; + } + }; } - velocity = new Vector2(0, 0); - rightBorder = (int)position.X + 100; - leftBorder = (int)position.X - 100; - bullets = 5; - - this.GraphicsComponent.actionOfAnimationEnd += (a) => - { - if (a == "playerShootLeft" || a == "playerShootRight") - { - isShooting = false; - } - if (a == "playerReload") - { - bullets++; - } - }; } public bool IsAlive { get { return isAlive; } } @@ -251,6 +254,5 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities isOnGround = false; AppManager.Instance.DebugHUD.Log("FallingThroughPlatform"); } - } } diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index 00d6298..fb72991 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -1,4 +1,5 @@ using DangerousD.GameCore.Managers; +using DangerousD.GameCore.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; @@ -18,6 +19,7 @@ namespace DangerousD.GameCore.Graphics private List texturesNames; private AnimationContainer currentAnimation; static private int scaling = 4; + public int parentId; public AnimationContainer CurrentAnimation { get @@ -105,6 +107,14 @@ namespace DangerousD.GameCore.Graphics public void StartAnimation(string startedanimationId) { + if (startedanimationId == "playerShootRight" && parentId == 17) + { + string a = "2"; + } + if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer && startedanimationId != GetCurrentAnimation) + { + AppManager.Instance.NetworkTasks.Add(new NetworkTask(parentId, startedanimationId, Vector2.Zero)); + } currentFrame = 0; currentAnimation = animations.Find(x => x.Id == startedanimationId); diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 33327c7..acd833f 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -111,9 +111,8 @@ namespace DangerousD.GameCore { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) Exit(); - - if (GameManager.GetPlayer1 != null) - DebugHUD.Set("Objid: ", GameManager.GetPlayer1.id.ToString()); + if (GameManager.GetPlayer1 != null) + DebugHUD.Set("id: ", GameManager.GetPlayer1.id.ToString()); InputManager.Update(); SoundManager.Update(); @@ -229,10 +228,11 @@ namespace DangerousD.GameCore case NetworkTaskOperationEnum.CreateEntity: break; case NetworkTaskOperationEnum.SendPosition: - if (networkTask.objId != GameManager.GetPlayer1.id) + if (networkTask.objId != GameManager.GetPlayer1.id ) { LivingEntity entity = GameManager.livingEntities.Find(x => x.id == networkTask.objId); - entity.SetPosition(networkTask.position); + if (entity != null) + entity.SetPosition(networkTask.position); if (multiPlayerStatus == MultiPlayerStatus.Host) { NetworkTasks.Add(networkTask); @@ -240,6 +240,20 @@ namespace DangerousD.GameCore } break; case NetworkTaskOperationEnum.ChangeState: + if (networkTask.objId != GameManager.GetPlayer1.id) + { + List gcs = new List(); + foreach (var player in GameManager.players) + { + gcs.Add(player.GetGraphicsComponent()); + } + LivingEntity entity = GameManager.livingEntities.Find(x => x.id == networkTask.objId); + if (entity != null) + { + GraphicsComponent gc = entity.GetGraphicsComponent(); + gc.StartAnimation(networkTask.name); + } + } break; case NetworkTaskOperationEnum.ConnectToHost: Player connectedPlayer = new Player(Vector2.Zero, true); @@ -257,13 +271,15 @@ namespace DangerousD.GameCore if (!GameManager.GetPlayer1.isIdFromHost) { GameManager.GetPlayer1.id = networkTask.objId; + GraphicsComponent gcsd = GameManager.GetPlayer1.GetGraphicsComponent(); + gcsd.parentId = networkTask.objId; GameManager.GetPlayer1.isIdFromHost = true; } break; case NetworkTaskOperationEnum.AddConnectedPlayer: Player remoteConnectedPlayer = new Player(networkTask.position, true); remoteConnectedPlayer.id = networkTask.objId; - + remoteConnectedPlayer.GetGraphicsComponent().parentId = networkTask.objId; break; default: break; diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index 53ffa61..f4a213a 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -150,14 +150,21 @@ namespace DangerousD.GameCore } else - { for (int i = 0; i < livingEntitiesWithoutPlayers.Count; i++) { livingEntitiesWithoutPlayers[i].PlayAnimation(); } } + foreach (Player player in players) + { + if (player.id != GetPlayer1.id) + { + player.PlayAnimation(); + } + } GetPlayer1.Update(gameTime); + foreach (var item in otherObjects) item.Update(gameTime); From 488a0074f4d7c9c260dd0496efe18fbd17cfeb4c Mon Sep 17 00:00:00 2001 From: gravity Date: Fri, 18 Aug 2023 12:39:06 +0300 Subject: [PATCH 16/23] HUD --- DangerousD/Content/Content.mgcb | 7 ++ DangerousD/Content/PixelFont.spritefont | 64 ++++++++++++++++++ DangerousD/Content/PublicPixel-z84yD.ttf | Bin 0 -> 97456 bytes DangerousD/GameCore/GUI/DeathGUI.cs | 4 +- DangerousD/GameCore/GUI/HUD.cs | 73 ++++++++++++++++----- DangerousD/GameCore/GUI/MenuGUI.cs | 3 +- DangerousD/GameCore/GUI/OptionsGUI.cs | 12 +++- DangerousD/GameCore/Managers/AppManager.cs | 13 ++-- 8 files changed, 145 insertions(+), 31 deletions(-) create mode 100644 DangerousD/Content/PixelFont.spritefont create mode 100644 DangerousD/Content/PublicPixel-z84yD.ttf diff --git a/DangerousD/Content/Content.mgcb b/DangerousD/Content/Content.mgcb index 37d9842..0b61b7a 100644 --- a/DangerousD/Content/Content.mgcb +++ b/DangerousD/Content/Content.mgcb @@ -187,6 +187,13 @@ /processorParam:TextureFormat=Color /build:PC_Computer_Dangerous_Dave_In_The_Haunted_Mansion_Death_Sequences.png +#begin PixelFont.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:PixelFont.spritefont + #begin playerAnimation.png /importer:TextureImporter /processor:TextureProcessor diff --git a/DangerousD/Content/PixelFont.spritefont b/DangerousD/Content/PixelFont.spritefont new file mode 100644 index 0000000..2ee98cd --- /dev/null +++ b/DangerousD/Content/PixelFont.spritefont @@ -0,0 +1,64 @@ + + + + + + + PublicPixel-z84yD.ttf + + + 12 + + + 0 + + + true + + + + + + + + + + + + ~ + + + а + я + + + + diff --git a/DangerousD/Content/PublicPixel-z84yD.ttf b/DangerousD/Content/PublicPixel-z84yD.ttf new file mode 100644 index 0000000000000000000000000000000000000000..618e5bb88efc72572877cd6a99cb2cdf06741de5 GIT binary patch literal 97456 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 P*T49z0v0{r8p3}AhSeWV literal 0 HcmV?d00001 diff --git a/DangerousD/GameCore/GUI/DeathGUI.cs b/DangerousD/GameCore/GUI/DeathGUI.cs index c19f9b5..bb91470 100644 --- a/DangerousD/GameCore/GUI/DeathGUI.cs +++ b/DangerousD/GameCore/GUI/DeathGUI.cs @@ -17,8 +17,8 @@ internal class DeathGUI : AbstractGui var menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), textureName = "deathBackground" }; Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); - Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2, (height - 50) / 2 - 80, 50, 50), text = "You death", mainColor = Color.Transparent, scale = 0.7f, fontName = "ButtonFont", fontColor = Color.White }); - Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2, (height - 50) / 2, 50, 50), text = $"Score = {0}", mainColor = Color.Transparent, scale = 0.7f, fontName = "ButtonFont", fontColor = Color.White }); + Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2, (height - 50) / 2 - 80, 50, 50), text = "You died", mainColor = Color.Transparent, scale = 0.7f, fontName = "ButtonFont", fontColor = Color.White }); + Elements.Add(new Label(Manager) { rectangle = new Rectangle((wigth - 50) / 2, (height - 50) / 2, 50, 50), text = $"Score: {0}", mainColor = Color.Transparent, scale = 0.7f, fontName = "ButtonFont", fontColor = Color.White }); var butMenu = new ButtonText(Manager) { rectangle = new Rectangle((wigth - 300) / 2, (height - 50) / 2 + 80, 300, 50), text = "Back to menu", scale = 0.7f, fontName = "ButtonFont" }; Elements.Add(butMenu); butMenu.LeftButtonPressed += () => diff --git a/DangerousD/GameCore/GUI/HUD.cs b/DangerousD/GameCore/GUI/HUD.cs index 07e446a..a9507de 100644 --- a/DangerousD/GameCore/GUI/HUD.cs +++ b/DangerousD/GameCore/GUI/HUD.cs @@ -6,36 +6,73 @@ using System.Xml.Linq; using DangerousD.GameCore.Managers; using DangerousD.GameCore; using System.Collections.Generic; +using Microsoft.Xna.Framework.Graphics; +using static System.Formats.Asn1.AsnWriter; +using static System.Net.Mime.MediaTypeNames; namespace DangerousD.GameCore.GUI { - public class HUD : AbstractGui + public class HUD : IDrawableObject { - int ammout = 0; - List rects = new List { }; + public int ammout = 8; int wigth = AppManager.Instance.inGameResolution.X; int height = AppManager.Instance.inGameResolution.Y; - protected override void CreateUI() - { - DrawableUIElement background = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), mainColor = Color.Transparent }; - Elements.Add(background); - Rect rect = new Rect(Manager) { rectangle = new Rectangle(wigth / 35, height / 35, 120, 70), mainColor = Color.DarkRed }; - Elements.Add(rect); - Label label = new Label(Manager) { rectangle = new Rectangle(wigth / 34, height / 30, 120, 20), text = "ammout", fontName = "font2", scale = 0.2f, mainColor = Color.Transparent, fontColor = Color.Black }; - Elements.Add(label); + float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; + Texture2D texture; + SpriteFont spriteFont; - } - public override void Update(GameTime gameTime) + public void Draw(SpriteBatch spriteBatch) { - - rects.Clear(); + spriteBatch.Begin(); + spriteBatch.Draw(texture, new Rectangle(wigth / 35 - 2, height / 35 - 2, 120 + 2, 70 + 2), Color.DarkRed); + spriteBatch.DrawString(spriteFont, "AMMO", new Vector2(wigth / 34 + 4, height / 30 - 6), Color.Gray, 0, Vector2.Zero, 1.8f, SpriteEffects.None, 0); + spriteBatch.DrawString(spriteFont, "AMMO", new Vector2(wigth / 34 + 1, height / 30 - 6), Color.White, 0, Vector2.Zero, 1.8f, SpriteEffects.None, 0); for (int i = 0; i < ammout; i++) { - rects.Add(new Rect(Manager) { rectangle = new Rectangle(wigth / 29 + i * 13, height / 17, 5, 20), mainColor = Color.Yellow }); - rects[i].LoadTexture(AppManager.Instance.Content); + spriteBatch.Draw(texture, new Rectangle(wigth / 30 + i * 13, height / 17 + 4, 5, 20), Color.Yellow); } - base.Update(gameTime); + spriteBatch.End(); + } + + public void Initialize() + { + } + + public void LoadContent() + { + texture = new Texture2D(AppManager.Instance.GraphicsDevice, 1, 1); + texture.SetData(new Color[] { Color.White }); + spriteFont = AppManager.Instance.Content.Load("PixelFont"); + } + + public void Update(GameTime gameTime) + { } } + //public class HUD1 : AbstractGui + //{ + // + // protected override void CreateUI() + // { + // DrawableUIElement background = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), mainColor = Color.Transparent }; + // Elements.Add(background); + // Rect rect = new Rect(Manager) { rectangle = new Rectangle(wigth / 35, height / 35, 120, 70), mainColor = Color.DarkRed }; + // Elements.Add(rect); + // Label label = new Label(Manager) { rectangle = new Rectangle(wigth / 34, height / 30, 120, 20), text = "ammout", fontName = "font2", scale = 0.2f, mainColor = Color.Transparent, fontColor = Color.Black }; + // Elements.Add(label); + + // } + // public override void Update(GameTime gameTime) + // { + // + // rects.Clear(); + // for (int i = 0; i < ammout; i++) + // { + // rects.Add(new Rect(Manager) { rectangle = new Rectangle(wigth / 29 + i * 13, height / 17, 5, 20), mainColor = Color.Yellow }); + // rects[i].LoadTexture(AppManager.Instance.Content); + // } + // base.Update(gameTime); + // } + //} } diff --git a/DangerousD/GameCore/GUI/MenuGUI.cs b/DangerousD/GameCore/GUI/MenuGUI.cs index d6e376e..5f23b10 100644 --- a/DangerousD/GameCore/GUI/MenuGUI.cs +++ b/DangerousD/GameCore/GUI/MenuGUI.cs @@ -38,6 +38,7 @@ internal class MenuGUI : AbstractGui { AppManager.Instance.ChangeGameState(GameState.Game); AppManager.Instance.SetMultiplayerState(MultiPlayerStatus.SinglePlayer); + }; var butMulti = new ButtonText(Manager) { rectangle = new Rectangle((wigth - (int)(300 * 2.4)) / 2, 470, (int)(300 * 2.4), (int)(50 * 2.4)), text = "Multiplayer", scale = 1.2f, fontName = "ButtonFont" }; @@ -45,7 +46,7 @@ internal class MenuGUI : AbstractGui Elements.Add(butMulti); butMulti.LeftButtonPressed += () => { - AppManager.Instance.ChangeGameState(GameState.Login); + AppManager.Instance.ChangeGameState(GameState.Login); }; var butOption = new ButtonText(Manager) { rectangle = new Rectangle((wigth - (int)(160 * 2.4)) / 2, 590, (int)(160 * 2.4), (int)(50 * 2.4)), text = "Option", scale = 1.2f, fontName = "ButtonFont" }; Elements.Add(butOption); diff --git a/DangerousD/GameCore/GUI/OptionsGUI.cs b/DangerousD/GameCore/GUI/OptionsGUI.cs index c879731..18ccd77 100644 --- a/DangerousD/GameCore/GUI/OptionsGUI.cs +++ b/DangerousD/GameCore/GUI/OptionsGUI.cs @@ -17,7 +17,7 @@ namespace DangerousD.GameCore.GUI int height = AppManager.Instance.inGameHUDHelperResolution.Y; float scaler = AppManager.Instance.resolution.Y / (float)AppManager.Instance.inGameHUDHelperResolution.Y; var menuBackground = new DrawableUIElement(Manager) { rectangle = new Rectangle(0, 0, wigth, height), textureName = "optionsBackground" }; - Elements.Add(menuBackground); + //Elements.Add(menuBackground); menuBackground.LoadTexture(AppManager.Instance.Content); var slider = new Slider(Manager) @@ -28,7 +28,7 @@ namespace DangerousD.GameCore.GUI indentation = 5, textureName = "sliderBackground" }; - Elements.Add(slider); + //Elements.Add(slider); //AppManager.Instance.SettingsManager.SetMainVolume(slider.GetSliderValue); var cB = new CheckBox(Manager); @@ -84,6 +84,14 @@ namespace DangerousD.GameCore.GUI (item as DrawableTextedUiElement).scale *= scaler; } } + slider.rectangle.X = (int)(scaler * slider.rectangle.X); + slider.rectangle.Y = (int)(scaler * slider.rectangle.Y); + //slider.rectangle.Width = (int)(scaler * slider.rectangle.Width); + //slider.rectangle.Height = (int)(scaler * slider.rectangle.Height); + if (slider is DrawableTextedUiElement) + { + (slider as DrawableTextedUiElement).scale *= scaler; + } } public override void Update(GameTime gameTime) { diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index b4b3872..6a6d9a5 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -16,7 +16,7 @@ using DangerousD.GameCore.GameObjects; namespace DangerousD.GameCore { public enum MultiPlayerStatus { SinglePlayer, Host, Client } - public enum GameState { Menu, Options, Lobby, Game, Login, Death, HUD, + public enum GameState { Menu, Options, Lobby, Game, Login, Death, GameOver } public class AppManager : Game @@ -35,8 +35,9 @@ namespace DangerousD.GameCore IDrawableObject LoginGUI; IDrawableObject LobbyGUI; IDrawableObject DeathGUI; - IDrawableObject HUD; + //IDrawableObject HUD; public DebugHUD DebugHUD; + public HUD HUD; public List NetworkTasks = new List(); public GameManager GameManager { get; private set; } = new(); @@ -130,9 +131,6 @@ namespace DangerousD.GameCore case GameState.Death: DeathGUI.Update(gameTime); break; - case GameState.HUD: - HUD.Update(gameTime); - break; case GameState.Game: GameManager.Update(gameTime); break; @@ -140,6 +138,7 @@ namespace DangerousD.GameCore break; } DebugHUD.Update(gameTime); + HUD.Update(gameTime); base.Update(gameTime); } @@ -166,9 +165,6 @@ namespace DangerousD.GameCore case GameState.Death: DeathGUI.Draw(_spriteBatch); break; - case GameState.HUD: - HUD.Draw(_spriteBatch); - break; case GameState.Game: _spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); GameManager.Draw(_spriteBatch); @@ -184,6 +180,7 @@ namespace DangerousD.GameCore DebugHUD.Draw(_spriteBatch); + HUD.Draw(_spriteBatch); base.Draw(gameTime); } From 338fd044a12373269dbd9d60ceccef635e024979 Mon Sep 17 00:00:00 2001 From: Mootfrost777 Date: Fri, 18 Aug 2023 12:47:53 +0300 Subject: [PATCH 17/23] Level 1 fixes --- DangerousD/Content/lvl.tmx | 90 +++++++++++++++++-- .../LivingEntities/Monsters/Slime.cs | 4 - DangerousD/GameCore/Managers/AppManager.cs | 4 - 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/DangerousD/Content/lvl.tmx b/DangerousD/Content/lvl.tmx index df88666..5fcea6a 100644 --- a/DangerousD/Content/lvl.tmx +++ b/DangerousD/Content/lvl.tmx @@ -7,7 +7,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -147,7 +147,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,272,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,272,0,0,0,272,0,0,0,0,0,0,0,0,0, 52,52,52,0,0,0,52,52,52,52,52,52,52,52,52,52, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -208,7 +208,7 @@ 0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0 -0,0,0,0,0,0,0,0,0,0,46,0,0,66,67,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,66,67,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,66,67,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,66,67,0, 0,0,0,0,0,0,76,76,76,76,76,76,76,76,76,76, @@ -317,7 +317,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -336,6 +336,24 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,147,199,148,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,696,697,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,696,697,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -354,6 +372,24 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,147,199,148,0,0,0,0,0,0,0, @@ -372,6 +408,42 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,696,697,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,696,697,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,147,199,148,0,0,0,0,0,0,0,0,0,0, @@ -442,7 +514,7 @@ 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,157,157,157,157,258,157,157,157,149,152,157,157,157,157, -157,157,157,157,157,157,271,157,157,157,150,153,157,696,697,157, +157,157,157,157,157,157,271,157,157,157,150,153,157,0,0,157, 157,157,0,204,204,204,284,204,204,204,151,154,204,709,710,204, 157,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,157,144,144,144,144,144,144,144,144,144,144,144,144,144,144, @@ -498,7 +570,7 @@ 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29, 29,29,29,19,20,21,22,0,0,29,29,29,29,29,29,29, 29,30,31,32,33,34,35,0,0,29,29,29,29,29,29,29, -29,43,44,45,46,47,48,0,0,29,29,29,29,29,29,29, +29,43,44,45,0,47,48,0,0,29,29,29,29,29,29,29, 64,65,18,58,59,60,18,0,0,29,29,29,29,29,29,29, 77,78,18,71,72,73,18,0,0,68,56,56,55,56,56,69, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -522,14 +594,14 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -157,157,157,157,267,268,157,696,697,157,157,193,157,157,235,236, +157,157,157,157,267,268,157,0,0,157,157,193,157,157,235,236, 157,0,204,204,280,281,204,709,710,204,204,204,204,204,204,204, 157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 157,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,178,179,157,157,157,157,157,157,157,157,157,157,157, 157,157,157,191,192,157,248,249,157,157,157,157,157,157,157,157, 157,157,157,157,157,157,250,251,157,217,261,262,263,264,217,157, -272,204,204,204,204,204,239,240,204,230,274,275,276,277,230,204, +0,204,204,204,204,204,239,240,204,230,274,275,276,277,230,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,157,157,157,157,157,157,243,157,157,209,210,211,212,157, @@ -552,7 +624,7 @@ 144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144, 157,157,178,179,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,191,192,157,157,157,157,258,157,157,157,248,249,157,157, -157,157,157,157,157,696,697,157,271,157,157,157,250,251,157,157, +157,157,157,157,157,0,0,157,271,157,157,157,250,251,157,157, 204,204,204,204,204,709,710,204,284,204,204,204,239,240,204,204, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index fa84566..5b89e48 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -12,12 +12,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Slime : CoreEnemy { -<<<<<<< HEAD private bool isGoRight = true; private bool isDown = true; -======= - private bool isDown = false; ->>>>>>> main int leftBorder; int rightBorder; bool isAttaking = false; diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 7b79e45..33327c7 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,12 +205,8 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: -<<<<<<< HEAD - GameManager.mapManager.LoadLevel("map"); -======= GameManager.mapManager.LoadLevel("lvl"); GameManager.FindBorders(); ->>>>>>> main break; case GameState.Death: break; From 8e71a3c73213c148be4fd6213f69dacadd94952e Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 13:09:34 +0300 Subject: [PATCH 18/23] SlimeJumper --- .../GameCore/GameObjects/LivingEntities/Monsters/Slime.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index fa84566..5b89e48 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -12,12 +12,8 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Slime : CoreEnemy { -<<<<<<< HEAD private bool isGoRight = true; private bool isDown = true; -======= - private bool isDown = false; ->>>>>>> main int leftBorder; int rightBorder; bool isAttaking = false; From ab0947ed699e27529436c710905d1c20558a7163 Mon Sep 17 00:00:00 2001 From: Kaktus200020 Date: Fri, 18 Aug 2023 13:11:49 +0300 Subject: [PATCH 19/23] SlimeJumper --- .../LivingEntities/Monsters/Slime.cs | 69 ++++++++++++++----- .../LivingEntities/Monsters/Spider.cs | 2 +- DangerousD/GameCore/Managers/AppManager.cs | 8 +-- 3 files changed, 58 insertions(+), 21 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs index 5b89e48..ac2240a 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Slime.cs @@ -12,8 +12,12 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { public class Slime : CoreEnemy { + private bool isGoRight = true; private bool isDown = true; + + + int leftBorder; int rightBorder; bool isAttaking = false; @@ -30,6 +34,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters rightBorder = 400; //acceleration = Vector2.Zero; delay = 30; + } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "SlimeMoveLeftTop", "SlimeMoveLeftBottom", "SlimeMoveRightTop", @@ -40,7 +45,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { } - public void Jump() + public void Jump(GameTime gameTime) { var getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle(0, 0, 100, 100)); velocity.X = 0; @@ -56,17 +61,19 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (delay <= 0) { - velocity = new Vector2(5, -3); + velocity = new Vector2(5, -4); acceleration.Y = 0; + if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftBottom") { GraphicsComponent.StartAnimation("SlimeJumpLeftBottom"); } getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)Pos.Y - 5, 48, 5)); - if (getCols.Count > 0) + if (getCols.Count > 0 ) { isJumping = false; isDown = false; + isAttaking = false; } } @@ -81,7 +88,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (delay <= 0) { - velocity = new Vector2(-5, -3); + velocity = new Vector2(-5, -4); acceleration.Y = 0; if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightBottom") { @@ -92,6 +99,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { isJumping = false; isDown = false; + isAttaking = false; } } } @@ -106,19 +114,22 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters if (delay <= 0) { - velocity = new Vector2(5, 3); + velocity = new Vector2(5, 4); acceleration.Y = 0; + if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpLeftTop") { GraphicsComponent.StartAnimation("SlimeJumpLeftTop"); } getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); - if (getCols.Count > 0) + if (getCols.Count > 0 ) { isJumping = false; isDown = true; + isAttaking = false; acceleration.Y = 10; + Move(gameTime); } } @@ -132,24 +143,28 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters delay--; if (delay <= 0) { - velocity = new Vector2(-5, 3); + velocity = new Vector2(-5, 4); acceleration.Y = 0; + if (GraphicsComponent.GetCurrentAnimation != "SlimeJumpRightTop") { GraphicsComponent.StartAnimation("SlimeJumpRightTop"); } getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X+1, (int)Pos.Y + Height, 46, 5)); - if (getCols.Count > 0) + if (getCols.Count > 0 ) { isJumping = false; isDown = true; + isAttaking = false; acceleration.Y = 10; + Move(gameTime); } } } + } public override void Draw(SpriteBatch spriteBatch) @@ -246,25 +261,27 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters acceleration.Y = -acceleration.Y; } } - Attack(); - - if (!isJumping) + AppManager.Instance.DebugHUD.Set(name, isAttaking.ToString()); + if(!isJumping) { if (isDown) { - Jump(); + Jump(gameTime); } else if(IsInAim()) { - Jump(); + Jump(gameTime); + isAttaking = true; } - else + else if(!isAttaking) { Move(gameTime); + } - + else { Jump(gameTime); } } + base.Update(gameTime); } @@ -283,6 +300,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X + Width, (int)Pos.Y + Height, 200, 500), false); if (getCols.Count > 0) { + return true; } } @@ -291,10 +309,29 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 200, (int)Pos.Y + Height, 200, 500), false); if (getCols.Count > 0) { + return true; } } - + /*/else if (isGoRight && isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X +Width, (int)Pos.Y -500, 200, 500), false); + if (getCols.Count > 0) + { + isAttaking = true; + return true; + } + } + else if (!isGoRight && isDown) + { + getCols = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 200, (int)Pos.Y - 500, 200, 500), false); + if (getCols.Count > 0) + { + isAttaking = true; + return true; + } + }/*/ + return false; } diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs index a4963bf..f2c9d50 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Spider.cs @@ -30,11 +30,11 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters isDownUp = true; isDown = true; physicsManager = AppManager.Instance.GameManager.physicsManager; - web = new SpiderWeb(Pos); name = "Spider"; Width = 112; Height = 24; delay = 0; + web = new SpiderWeb(new Vector2(Pos.X-Width/2,Pos.Y)); webLength = 0; monster_speed = 3; acceleration = new Vector2(0, -50); diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 7b79e45..e79cebc 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,12 +205,12 @@ namespace DangerousD.GameCore case GameState.Lobby: break; case GameState.Game: -<<<<<<< HEAD + GameManager.mapManager.LoadLevel("map"); -======= - GameManager.mapManager.LoadLevel("lvl"); + + GameManager.FindBorders(); ->>>>>>> main + break; case GameState.Death: break; From c0997c903cb25c88cde0b6d3816338181faf762a Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Fri, 18 Aug 2023 13:35:16 +0300 Subject: [PATCH 20/23] =?UTF-8?q?LivingEntitySendPositionSupport(=D0=97?= =?UTF-8?q?=D0=9E=D0=9C=D0=91=D0=98=20=D0=A5=D0=9E=D0=94=D0=AF=D0=A2!!!)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GameObjects/LivingEntities/Player/Player.cs | 5 ----- DangerousD/GameCore/GameObjects/LivingEntity.cs | 12 +++++++++++- DangerousD/GameCore/Graphics/GraphicsComponent.cs | 14 ++++++++------ DangerousD/GameCore/Managers/AppManager.cs | 5 ----- DangerousD/GameCore/Managers/GameManager.cs | 1 - 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index eaae151..4343570 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -247,11 +247,6 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } } } - if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer) - { - NetworkTask task = new NetworkTask(id, Pos); - AppManager.Instance.NetworkTasks.Add(task); - } } public void MoveDown() { diff --git a/DangerousD/GameCore/GameObjects/LivingEntity.cs b/DangerousD/GameCore/GameObjects/LivingEntity.cs index d311095..78ea17c 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntity.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntity.cs @@ -1,4 +1,6 @@ -using Microsoft.Xna.Framework; +using DangerousD.GameCore.GameObjects.LivingEntities; +using DangerousD.GameCore.Network; +using Microsoft.Xna.Framework; namespace DangerousD.GameCore.GameObjects; @@ -15,6 +17,14 @@ public abstract class LivingEntity : Entity public override void SetPosition(Vector2 position) { _pos = position; + if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer) + { + NetworkTask task = new NetworkTask(id, _pos); + if (this is Player || AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) + { + AppManager.Instance.NetworkTasks.Add(task); + } + } } //TODO befrend targetpos and physics engine diff --git a/DangerousD/GameCore/Graphics/GraphicsComponent.cs b/DangerousD/GameCore/Graphics/GraphicsComponent.cs index 27eeea8..1ac6aa8 100644 --- a/DangerousD/GameCore/Graphics/GraphicsComponent.cs +++ b/DangerousD/GameCore/Graphics/GraphicsComponent.cs @@ -1,4 +1,6 @@ -using DangerousD.GameCore.Managers; +using DangerousD.GameCore.GameObjects; +using DangerousD.GameCore.GameObjects.LivingEntities; +using DangerousD.GameCore.Managers; using DangerousD.GameCore.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; @@ -107,13 +109,13 @@ namespace DangerousD.GameCore.Graphics public void StartAnimation(string startedanimationId) { - if (startedanimationId == "playerShootRight" && parentId == 17) - { - string a = "2"; - } - if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer && startedanimationId != GetCurrentAnimation) + if (AppManager.Instance.multiPlayerStatus != MultiPlayerStatus.SinglePlayer) { + LivingEntity entity = AppManager.Instance.GameManager.livingEntities.Find(x => x.id == parentId); + if (((entity is Player) || AppManager.Instance.multiPlayerStatus == MultiPlayerStatus.Host) && startedanimationId != GetCurrentAnimation) + { AppManager.Instance.NetworkTasks.Add(new NetworkTask(parentId, startedanimationId, Vector2.Zero)); + } } currentFrame = 0; currentAnimation = animations.Find(x => x.Id == startedanimationId); diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 3ad6cc3..5a2cf29 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -242,11 +242,6 @@ namespace DangerousD.GameCore case NetworkTaskOperationEnum.ChangeState: if (networkTask.objId != GameManager.GetPlayer1.id) { - List gcs = new List(); - foreach (var player in GameManager.players) - { - gcs.Add(player.GetGraphicsComponent()); - } LivingEntity entity = GameManager.livingEntities.Find(x => x.id == networkTask.objId); if (entity != null) { diff --git a/DangerousD/GameCore/Managers/GameManager.cs b/DangerousD/GameCore/Managers/GameManager.cs index ae7bf59..8d1c7c4 100644 --- a/DangerousD/GameCore/Managers/GameManager.cs +++ b/DangerousD/GameCore/Managers/GameManager.cs @@ -149,7 +149,6 @@ namespace DangerousD.GameCore } } else - { for (int i = 0; i < livingEntitiesWithoutPlayers.Count; i++) { From 5bd2b7d93ba018cbf3e840af115c05fbf7090c57 Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 13:53:18 +0300 Subject: [PATCH 21/23] started vertical shoot --- .../Content/animations/playerShootUpLeft | 1 + .../Content/animations/playerShootUpRight | 1 + .../LivingEntities/Monsters/Zombie.cs | 7 +-- .../LivingEntities/Player/Player.cs | 48 +++++++++++++++---- 4 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 DangerousD/Content/animations/playerShootUpLeft create mode 100644 DangerousD/Content/animations/playerShootUpRight diff --git a/DangerousD/Content/animations/playerShootUpLeft b/DangerousD/Content/animations/playerShootUpLeft new file mode 100644 index 0000000..ac72a72 --- /dev/null +++ b/DangerousD/Content/animations/playerShootUpLeft @@ -0,0 +1 @@ +{"id":"playerShootUpLeft","textureName":"playerAnimation","startSpriteRectangle":{"X":267,"Y":34,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/Content/animations/playerShootUpRight b/DangerousD/Content/animations/playerShootUpRight new file mode 100644 index 0000000..5bdb07a --- /dev/null +++ b/DangerousD/Content/animations/playerShootUpRight @@ -0,0 +1 @@ +{"id":"playerShootUpRight","textureName":"playerAnimation","startSpriteRectangle":{"X":267,"Y":1,"Width":24,"Height":32},"frameSecond":[{"Item1":0,"Item2":12}],"textureFrameInterval":1,"framesCount":1,"isCycle":true,"offset":"0, 0"} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs index c1737f2..90fdfc2 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Monsters/Zombie.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using DangerousD.GameCore.Managers; +using DangerousD.GameCore.GameObjects; namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { @@ -24,7 +25,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters { Width = 24; Height = 40; - monster_speed = 3; + monster_speed = 2; name = "Zombie"; monster_health = 2; leftBorder = (int)position.X - 100; @@ -133,7 +134,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters public void Target() { - if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 100, Height), typeof(Player)).Count > 0) + if (AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X - 50, (int)Pos.Y, Width + 200, Height), typeof(Player)).Count > 0) { if(isGoRight && this._pos.X <= AppManager.Instance.GameManager.players[0].Pos.X) { @@ -183,5 +184,5 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities.Monsters Death(); } } + } } -} diff --git a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs index b8e68ba..8b14436 100644 --- a/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs +++ b/DangerousD/GameCore/GameObjects/LivingEntities/Player/Player.cs @@ -32,7 +32,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public bool isUping = false; private int shootLength = 160; - + public int Bullets { get { return bullets; } } @@ -49,7 +49,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities AppManager.Instance.InputManager.MovEventDown += MoveDown; } - velocity = new Vector2(0, 0); + velocity = new Vector2(0, 0); rightBorder = (int)position.X + 100; leftBorder = (int)position.X - 100; bullets = 5; @@ -70,7 +70,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities public bool IsAlive { get { return isAlive; } } protected override GraphicsComponent GraphicsComponent { get; } = new(new List { "playerMoveLeft", "playerMoveRight", "DeathFromZombie", "playerRightStay", "playerStayLeft", - "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload", "smokeAfterShoot"}, "playerReload"); + "playerJumpRight" , "playerJumpLeft", "playerShootLeft", "playerShootRight", "playerReload", "smokeAfterShoot", "playerShootUpRight", "playerShootUpLeft"}, "playerReload"); public void Attack() { @@ -98,7 +98,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities return; } isAttacked = true; - if(monsterName == "Zombie") + if (monsterName == "Zombie") { AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); deathRectangle.Gr.actionOfAnimationEnd += (a) => @@ -109,7 +109,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } }; } - else if(monsterName == "Spider") + else if (monsterName == "Spider") { AnimationRectangle deathRectangle = new AnimationRectangle(Pos, "DeathFrom" + monsterName); deathRectangle.Gr.actionOfAnimationEnd += (a) => @@ -144,7 +144,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities { StartCicycleAnimation("playerShootRight"); var targets = AppManager.Instance.GameManager.physicsManager.CheckRectangle(new Rectangle((int)Pos.X, (int)(Pos.Y - 10f), shootLength + 24, 10), typeof(Zombie)).OrderBy(x => (x.Pos - Pos).LengthSquared()); - if (targets != null) + if (targets.Count() > 0) { Zombie targetZombie = (Zombie)targets.First(); targetZombie.TakeDamage(); @@ -184,7 +184,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities FallingThroughPlatform = false; } GraphicsComponent.SetCameraPosition(Pos); - if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) + if (!isAttacked || AppManager.Instance.InputManager.InvincibilityCheat) { if (!isShooting) { @@ -227,7 +227,7 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } else if (AppManager.Instance.InputManager.VectorMovementDirection.X == 0)//стоит { - if(bullets < 5) + if (bullets < 5) { if (GraphicsComponent.GetCurrentAnimation != "playerReload") { @@ -236,11 +236,31 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities } else if (isRight) { - GraphicsComponent.StartAnimation("playerRightStay"); + if (isUping) + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootUpRight") + { + GraphicsComponent.StartAnimation("playerShootUpRight"); + } + } + else + { + GraphicsComponent.StartAnimation("playerRightStay"); + } } else if (!isRight) { - GraphicsComponent.StartAnimation("playerStayLeft"); + if (isUping) + { + if (GraphicsComponent.GetCurrentAnimation != "playerShootUpLeft") + { + GraphicsComponent.StartAnimation("playerShootUpLeft"); + } + } + else + { + GraphicsComponent.StartAnimation("playerStayLeft"); + } } } } @@ -256,5 +276,13 @@ namespace DangerousD.GameCore.GameObjects.LivingEntities isOnGround = false; } + public class Bullet : GameObjects.LivingEntity + { + public Bullet(Vector2 position) : base(position) + { + } + protected override GraphicsComponent GraphicsComponent { get; } = new("ZombieMoveLeft"); + + } } } From 41d616d7f5c71e0d15c076b337afb6b2a1b81316 Mon Sep 17 00:00:00 2001 From: AnloGames <7383an@gmail.com> Date: Fri, 18 Aug 2023 14:36:57 +0300 Subject: [PATCH 22/23] map to lvl --- DangerousD/GameCore/Managers/AppManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DangerousD/GameCore/Managers/AppManager.cs b/DangerousD/GameCore/Managers/AppManager.cs index 0941181..ab1b173 100644 --- a/DangerousD/GameCore/Managers/AppManager.cs +++ b/DangerousD/GameCore/Managers/AppManager.cs @@ -205,7 +205,7 @@ namespace DangerousD.GameCore break; case GameState.Game: - GameManager.mapManager.LoadLevel("map"); + GameManager.mapManager.LoadLevel("lvl"); GameManager.FindBorders(); From 93e948ac426ee425d0622f0bce6cf298c9ab109d Mon Sep 17 00:00:00 2001 From: bmvolf Date: Fri, 18 Aug 2023 14:00:22 +0300 Subject: [PATCH 23/23] fixed hud --- DangerousD/GameCore/GUI/HUD.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DangerousD/GameCore/GUI/HUD.cs b/DangerousD/GameCore/GUI/HUD.cs index 10a7fc0..0e24ff6 100644 --- a/DangerousD/GameCore/GUI/HUD.cs +++ b/DangerousD/GameCore/GUI/HUD.cs @@ -26,7 +26,7 @@ namespace DangerousD.GameCore.GUI spriteBatch.Draw(texture, new Rectangle(wigth / 35 - 2, height / 35 - 2, 120 + 2, 70 + 2), Color.DarkRed); spriteBatch.DrawString(spriteFont, "AMMO", new Vector2(wigth / 34 + 4, height / 30 - 6), Color.Gray, 0, Vector2.Zero, 1.8f, SpriteEffects.None, 0); spriteBatch.DrawString(spriteFont, "AMMO", new Vector2(wigth / 34 + 1, height / 30 - 6), Color.White, 0, Vector2.Zero, 1.8f, SpriteEffects.None, 0); - for (int i = 0; i < 5; i++) + for (int i = 1; i < 6; i++) { if (i <= AppManager.Instance.GameManager.players[0].Bullets) {