From 4947ebb29dd87b04b58bfe56dcb27da08e81597b Mon Sep 17 00:00:00 2001 From: wangsj <3305688534@qq.com> Date: Thu, 25 Sep 2025 14:57:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Game/.gitignore | Bin 0 -> 20 bytes Game/README.md | 25 ++ Game/pom.xml | 114 +++++++++ .../java/uno/mloluyu/characters/Action.java | 11 + .../mloluyu/characters/AdvancedFighter.java | 30 +++ .../java/uno/mloluyu/characters/Alice.java | 82 ------ .../uno/mloluyu/characters/SimpleFighter.java | 203 +++++++++++++++ .../mloluyu/characters/character/Action.java | 9 + .../mloluyu/characters/character/Alice.java | 70 ++++++ .../characters/{ => character}/Fighter.java | 234 ++++++++++-------- .../character/FighterAnimationManager.java | 83 +++++++ .../{ => character}/FighterList.java | 2 +- .../characters/{ => character}/Reimu.java | 4 +- .../desktop/CharacterSelectScreen.java | 14 +- .../java/uno/mloluyu/desktop/GameScreen.java | 125 ++++------ .../java/uno/mloluyu/desktop/MainGame.java | 1 - .../uno/mloluyu/desktop/MainMenuScreen.java | 2 +- .../uno/mloluyu/desktop/TransitionScreen.java | 122 --------- .../uno/mloluyu/network/NetworkManager.java | 13 +- .../mloluyu/versatile/FighterController.java | 133 +++------- src/main/resources/logo.png | Bin 15223 -> 19793 bytes target/classes/logo.png | Bin 15223 -> 19793 bytes .../uno/mloluyu/characters/Action.class | Bin 0 -> 1275 bytes .../mloluyu/characters/AdvancedFighter.class | Bin 0 -> 1733 bytes .../uno/mloluyu/characters/Alice.class | Bin 2412 -> 0 bytes .../mloluyu/characters/Fighter$Action.class | Bin 1724 -> 0 bytes .../uno/mloluyu/characters/Fighter.class | Bin 11445 -> 0 bytes .../uno/mloluyu/characters/Reimu.class | Bin 1984 -> 0 bytes .../mloluyu/characters/SimpleFighter.class | Bin 0 -> 7112 bytes .../mloluyu/characters/character/Action.class | Bin 0 -> 1640 bytes .../mloluyu/characters/character/Alice.class | Bin 0 -> 2651 bytes .../Fighter$FrameEventListener.class | Bin 0 -> 335 bytes .../characters/character/Fighter.class | Bin 0 -> 6436 bytes .../character/FighterAnimationManager.class | Bin 0 -> 6259 bytes .../{ => character}/FighterList.class | Bin 789 -> 809 bytes .../mloluyu/characters/character/Reimu.class | Bin 0 -> 3835 bytes .../desktop/CharacterSelectScreen.class | Bin 7599 -> 7597 bytes .../uno/mloluyu/desktop/GameScreen.class | Bin 3951 -> 5317 bytes .../uno/mloluyu/desktop/MainGame.class | Bin 1130 -> 1130 bytes .../TransitionScreen$TransitionType.class | Bin 1226 -> 0 bytes .../mloluyu/desktop/TransitionScreen.class | Bin 3261 -> 0 bytes .../uno/mloluyu/network/NetworkManager.class | Bin 5466 -> 5466 bytes .../mloluyu/versatile/FighterController.class | Bin 2761 -> 2332 bytes 43 files changed, 781 insertions(+), 496 deletions(-) create mode 100644 Game/.gitignore create mode 100644 Game/README.md create mode 100644 Game/pom.xml create mode 100644 src/main/java/uno/mloluyu/characters/Action.java create mode 100644 src/main/java/uno/mloluyu/characters/AdvancedFighter.java delete mode 100644 src/main/java/uno/mloluyu/characters/Alice.java create mode 100644 src/main/java/uno/mloluyu/characters/SimpleFighter.java create mode 100644 src/main/java/uno/mloluyu/characters/character/Action.java create mode 100644 src/main/java/uno/mloluyu/characters/character/Alice.java rename src/main/java/uno/mloluyu/characters/{ => character}/Fighter.java (50%) create mode 100644 src/main/java/uno/mloluyu/characters/character/FighterAnimationManager.java rename src/main/java/uno/mloluyu/characters/{ => character}/FighterList.java (85%) rename src/main/java/uno/mloluyu/characters/{ => character}/Reimu.java (96%) delete mode 100644 src/main/java/uno/mloluyu/desktop/TransitionScreen.java create mode 100644 target/classes/uno/mloluyu/characters/Action.class create mode 100644 target/classes/uno/mloluyu/characters/AdvancedFighter.class delete mode 100644 target/classes/uno/mloluyu/characters/Alice.class delete mode 100644 target/classes/uno/mloluyu/characters/Fighter$Action.class delete mode 100644 target/classes/uno/mloluyu/characters/Fighter.class delete mode 100644 target/classes/uno/mloluyu/characters/Reimu.class create mode 100644 target/classes/uno/mloluyu/characters/SimpleFighter.class create mode 100644 target/classes/uno/mloluyu/characters/character/Action.class create mode 100644 target/classes/uno/mloluyu/characters/character/Alice.class create mode 100644 target/classes/uno/mloluyu/characters/character/Fighter$FrameEventListener.class create mode 100644 target/classes/uno/mloluyu/characters/character/Fighter.class create mode 100644 target/classes/uno/mloluyu/characters/character/FighterAnimationManager.class rename target/classes/uno/mloluyu/characters/{ => character}/FighterList.class (81%) create mode 100644 target/classes/uno/mloluyu/characters/character/Reimu.class delete mode 100644 target/classes/uno/mloluyu/desktop/TransitionScreen$TransitionType.class delete mode 100644 target/classes/uno/mloluyu/desktop/TransitionScreen.class diff --git a/Game/.gitignore b/Game/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..8d9590aab8c74ec8d8a1c7b148bf592afa1acc12 GIT binary patch literal 20 bcmezWuY@6yp@<=!A(f$oL7#z_fr|kENfrdl literal 0 HcmV?d00001 diff --git a/Game/README.md b/Game/README.md new file mode 100644 index 0000000..b9a2ea2 --- /dev/null +++ b/Game/README.md @@ -0,0 +1,25 @@ +# 有关本项目的说明 + +本项目为AVCEIT2025届软件技术专业软件241班Java实训小组项目 +This project is about Java Project Training 2025, Major.Software Technology + +### 本项目目前需要做的 + +- 实现游戏主界面,添加素材 +- 完成游戏的核心功能,即双人格斗 +- 实现基本的局域网内联机游戏功能 +- *~~打则死路一条~~* + +### 目前正在做的 + +- 编写单个角色并实现其状态 (@wsj) +- 将游戏素材整理为精灵图 (@wsj) +- 给游戏进行界面类添加BUG (@mloluyu) +- 给标题界面类添加BUG (@mloluyu) +- 寻找一个合适的数据处理类编写方法 +- *~~丰矿地打则~~* + +### 参与项目的人 + +- 武术家 [@wsj](varia.mloluyu.uno/wsj) +- 大货车 [@mloluyu](varia.mloluyu.uno/mloluyu) diff --git a/Game/pom.xml b/Game/pom.xml new file mode 100644 index 0000000..7266d29 --- /dev/null +++ b/Game/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + uno.mloluyu + + game + + 1.0-SNAPSHOT + + jar + + + 21 + 21 + UTF-8 + 1.12.1 + + + + + + com.badlogicgames.gdx + gdx + 1.12.1 + + + + + com.badlogicgames.gdx + gdx-freetype + 1.12.1 + + + + + com.badlogicgames.gdx + gdx-freetype-platform + 1.12.1 + natives-desktop + + + com.badlogicgames.gdx + gdx-backend-lwjgl + 1.12.1 + + + com.badlogicgames.gdx + gdx-platform + 1.12.1 + natives-desktop + + + com.badlogicgames.gdx + gdx + ${gdx.version} + + + com.badlogicgames.gdx + gdx-backend-lwjgl3 + ${gdx.version} + + + com.badlogicgames.gdx + gdx-platform + ${gdx.version} + natives-desktop + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + 17 + 17 + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + + uno.mloluyu.desktop.Launcher + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + true + uno.mloluyu.desktop.Launcher + + + + + + + + + diff --git a/src/main/java/uno/mloluyu/characters/Action.java b/src/main/java/uno/mloluyu/characters/Action.java new file mode 100644 index 0000000..2fd8367 --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/Action.java @@ -0,0 +1,11 @@ +package uno.mloluyu.characters; + +public enum Action { + IDLE, // 待机状态:角色未执行任何动作,静止或准备中 + JUMP, // 跳跃状态:角色正在空中跳跃或上升 + MOVE, // 移动状态:角色正在左右移动 + ATTACK, // 攻击状态:角色正在执行攻击动作 + DEFEND, // 防御状态:角色正在格挡或防御中 + HIT, // 受击状态:角色被攻击命中,进入硬直或受伤动画 + DEAD // 死亡状态:角色生命值为 0,进入死亡处理 +} \ No newline at end of file diff --git a/src/main/java/uno/mloluyu/characters/AdvancedFighter.java b/src/main/java/uno/mloluyu/characters/AdvancedFighter.java new file mode 100644 index 0000000..5d64a71 --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/AdvancedFighter.java @@ -0,0 +1,30 @@ +package uno.mloluyu.characters; + +public class AdvancedFighter extends SimpleFighter { + + public AdvancedFighter(String name) { + super(name); // 调用父类构造函数 + } + + @Override + public void attack(String attackType) { + // 根据攻击类型设置不同攻击力或状态 + switch (attackType.toLowerCase()) { + case "light": + changeAction(Action.ATTACK); + System.out.println(getName() + " 发起轻攻击!"); + break; + case "heavy": + changeAction(Action.ATTACK); + System.out.println(getName() + " 发起重攻击!"); + break; + case "special": + changeAction(Action.ATTACK); + System.out.println(getName() + " 发动特殊技能!"); + break; + default: + super.attack(attackType); // 默认调用父类攻击逻辑 + break; + } + } +} diff --git a/src/main/java/uno/mloluyu/characters/Alice.java b/src/main/java/uno/mloluyu/characters/Alice.java deleted file mode 100644 index c2109fa..0000000 --- a/src/main/java/uno/mloluyu/characters/Alice.java +++ /dev/null @@ -1,82 +0,0 @@ -package uno.mloluyu.characters; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; - -/** - * Alice角色类,继承自Fighter父类,定义其专属属性和动画 - */ -public class Alice extends Fighter { - - public Alice() { - super("Alice", new TextureAtlas(Gdx.files.internal("src/main/resources/character/alice/精灵1.2.atlas"))); - - // 设置角色属性 - speed = 350f; // 更快的移动速度 - maxHealth = 90; // 较低的生命值 - health = maxHealth; - attackPower = 12; // 中等攻击力 - } - - @Override - protected void loadAnimations() { - // 基础动作 - loadLoopingAnimation(Action.IDLE, "stand/stand", 15); - loadLoopingAnimation(Action.WALK, "walkFront/walkFront", 9); - loadOneShotAnimation(Action.JUMP, "jump/jump", 8); - loadOneShotAnimation(Action.FALL, "hitSpin/hitSpin", 5); - - // 攻击动作 - loadOneShotAnimation(Action.ATTACK1, "attackAa/attackAa", 6); - loadOneShotAnimation(Action.ATTACK2, "attackAb/attackAb", 6); - loadOneShotAnimation(Action.ATTACK3, "attackAc/attackAc", 6); - loadOneShotAnimation(Action.ATTACK4, "attackAd/attackAd", 6); - - // // 特殊动作(可扩展) - // loadOneShotAnimation(Action.SPECIAL1, "special/special1", 6); - // loadOneShotAnimation(Action.SPECIAL2, "special/special2", 6); - - // 受击与死亡 - loadOneShotAnimation(Action.HIT, "hitSpin/hitSpin", 5); - // loadOneShotAnimation(Action.DEATH, "death/death", 8); - - // 帧速率调整 - setFrameDuration(Action.IDLE, 0.04f); - setFrameDuration(Action.WALK, 0.08f); - setFrameDuration(Action.ATTACK1, 0.07f); - setFrameDuration(Action.SPECIAL2, 0.06f); - } - - /** - * 特定移动状态处理:允许跳跃状态下移动 - */ - @Override - protected void handleMoveState() { - if (currentAction != Action.ATTACK1 && - currentAction != Action.ATTACK2 && - currentAction != Action.ATTACK3 && - currentAction != Action.ATTACK4 && - currentAction != Action.SPECIAL1 && - currentAction != Action.SPECIAL2 && - currentAction != Action.DEFEND && - currentAction != Action.JUMP && - currentAction != Action.FALL) { - changeAction(Action.WALK); - } - } - - /** - * 空中也可以攻击 - */ - @Override - protected boolean canAttack() { - return super.canAttack() || currentAction == Action.JUMP || currentAction == Action.FALL; - } - - /** - * 获取当前生命值 - */ - public int getHp() { - return health; - } -} diff --git a/src/main/java/uno/mloluyu/characters/SimpleFighter.java b/src/main/java/uno/mloluyu/characters/SimpleFighter.java new file mode 100644 index 0000000..0bf8617 --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/SimpleFighter.java @@ -0,0 +1,203 @@ +package uno.mloluyu.characters; + +import java.util.HashMap; +import java.util.Map; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Rectangle; + +/** + * 简化版角色类,仅包含移动、攻击、受击等基础功能。 + */ +public class SimpleFighter { + + private String name; // 角色名称 + private final Map keyPressDuration = new HashMap<>(); + + private Action currentAction = Action.IDLE; // 当前动作状态(待机、攻击、受击等) + private float verticalSpeed = 0f; // 垂直速度(可用于跳跃或下落) + private boolean isGrounded = true; // 是否在地面上 + + private Rectangle hitbox = new Rectangle(0, 0, 64, 128); // 碰撞盒,用于位置和受击判定 + private Rectangle attackbox = new Rectangle(0, 0, 80, 80); // 攻击盒,用于攻击判定 + private boolean isFacingRight = true; // 是否面向右侧 + + private float speed = 300f; // 移动速度(像素/秒) + private int health = 100; // 当前生命值 + private int attackPower = 10; // 攻击力(暂未使用) + + private boolean isAttacking = false; // 是否正在攻击(攻击状态标志) + + private SimpleFighter fighter; // 添加 fighter 的声明 + + private Iterable pressedKeys = new HashMap().keySet(); // 初始化 pressedKeys + + public SimpleFighter(String name) { + this.name = name; // 构造函数,初始化角色名称 + this.fighter = this; // 初始化 fighter 为当前实例 + } + + public void update(float deltaTime) { + updateAttackbox(); + + // 攻击只持续一帧 + if (isAttacking) { + isAttacking = false; + changeAction(Action.IDLE); + } + for (int keycode : pressedKeys) { + keyPressDuration.put(keycode, keyPressDuration.getOrDefault(keycode, 0f) + deltaTime); // 更新持续时间 + fighter.handleInput(keycode, true); // 持续按下的键 + } + // 垂直移动(跳跃或重力) + if (!isGrounded) { + verticalSpeed -= 980 * deltaTime; // 简单重力模拟 + hitbox.y += verticalSpeed * deltaTime; + + if (hitbox.y <= 0) { + hitbox.y = 0; + verticalSpeed = 0; + isGrounded = true; + changeAction(Action.IDLE); + } + } + } + + public void render(SpriteBatch batch, ShapeRenderer shapeRenderer) { + batch.end(); // 暂停 SpriteBatch 渲染,切换到 ShapeRenderer + System.out.println("人物状态" + currentAction); + boolean isAttacking = currentAction == Action.ATTACK; + shapeRenderer.begin(ShapeRenderer.ShapeType.Line); // 开始绘制线框 + + shapeRenderer.setColor(Color.BLUE); // 设置颜色为蓝色 + shapeRenderer.rect(hitbox.x, hitbox.y, hitbox.width, hitbox.height); // 绘制碰撞盒 + + if (isAttacking) { + shapeRenderer.setColor(Color.RED); // 设置颜色为红色 + shapeRenderer.rect(attackbox.x, attackbox.y, attackbox.width, attackbox.height); // 绘制攻击盒 + } + + shapeRenderer.end(); // 结束 ShapeRenderer 渲染 + batch.begin(); // 恢复 SpriteBatch 渲染 + } + + public void handleInput(int keycode, boolean isPressed, float duration) { + // 根据按键和按下状态处理输入行为 + if (isPressed) { + if (keycode == Input.Keys.LEFT || keycode == Input.Keys.A) { + move(-1, Gdx.graphics.getDeltaTime()); // 向左移动 + } else if (keycode == Input.Keys.RIGHT || keycode == Input.Keys.D) { + move(1, Gdx.graphics.getDeltaTime()); // 向右移动 + } + if (keycode == Input.Keys.Z || keycode == Input.Keys.J) { + attack(""); // 普通攻击 + } else if (keycode == Input.Keys.X || keycode == Input.Keys.K) { + attack(""); // 重攻击(暂未区分) + } else if (keycode == Input.Keys.SPACE || keycode == Input.Keys.UP || keycode == Input.Keys.W) { + attack(""); // 跳跃(暂未实现跳跃逻辑) + } else if (keycode == Input.Keys.SHIFT_LEFT || keycode == Input.Keys.SHIFT_RIGHT) { + attack(""); // 防御(暂未实现防御逻辑) + } + if (keycode == Input.Keys.SPACE || keycode == Input.Keys.UP || keycode == Input.Keys.W) { + System.out.println("点击了跳跃"); + jump(); + } + + } else { + // 松开防御键时恢复待机状态 + if ((keycode == Input.Keys.SHIFT_LEFT || keycode == Input.Keys.SHIFT_RIGHT) && + getCurrentAction() == Action.DEFEND) { + changeAction(Action.IDLE); + } + } + } + + public void handleInput(int keycode, boolean isPressed) { + handleInput(keycode, isPressed, 0f); // 调用已有方法,补充默认持续时间 + } + + public void handleRelease(int keycode, float duration) { + // 处理按键释放逻辑 + System.out.println("按键释放: " + keycode + ", 持续时间: " + duration); + keyPressDuration.remove(keycode); + if (keycode == Input.Keys.LEFT || keycode == Input.Keys.RIGHT || keycode == Input.Keys.A + || keycode == Input.Keys.D) { + changeAction(Action.IDLE); + } + } + + public Action getCurrentAction() { + return currentAction; // 获取当前动作状态 + } + + public void changeAction(Action newAction) { + this.currentAction = newAction; // 切换角色动作状态 + } + + public void jump() { + if (isGrounded) { + verticalSpeed = 600f; + isGrounded = false; + changeAction(Action.JUMP); + } + } + + public void move(float x, float deltaTime) { + if (x != 0) { + isFacingRight = x > 0; + hitbox.x += x * speed * deltaTime; + changeAction(Action.MOVE); // 移动时切换为 MOVE 状态 + } else if (isGrounded && !isAttacking) { + changeAction(Action.IDLE); // 停止移动时恢复待机 + } + } + + public void attack(String attackType) { + isAttacking = true; // 设置攻击状态 + changeAction(Action.ATTACK); // 切换为攻击动作 + } + + public void takeHit(int damage) { + health = Math.max(0, health - damage); // 扣除生命值,最小为 0 + changeAction(health > 0 ? Action.HIT : Action.DEAD); // 根据生命值切换为受击或死亡状态 + } + + public boolean isAlive() { + return health > 0; // 判断角色是否存活 + } + + public boolean isAttacking() { + return isAttacking; // 判断是否处于攻击状态 + } + + private void updateAttackbox() { + // 根据朝向更新攻击盒位置,使其位于角色前方 + float offsetX = isFacingRight ? hitbox.width - 10 : -attackbox.width + 10; + attackbox.setPosition(hitbox.x + offsetX, hitbox.y + 20); + } + + // 常用访问器 + public Rectangle getHitbox() { + return hitbox; // 获取碰撞盒 + } + + public Rectangle getAttackbox() { + return attackbox; // 获取攻击盒 + } + + public int getHealth() { + return health; // 获取当前生命值 + } + + public String getName() { + return name; // 获取角色名称 + } + + public void setPosition(float x, float y) { + hitbox.setPosition(x, y); // 设置角色位置 + } +} diff --git a/src/main/java/uno/mloluyu/characters/character/Action.java b/src/main/java/uno/mloluyu/characters/character/Action.java new file mode 100644 index 0000000..1dabb46 --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/character/Action.java @@ -0,0 +1,9 @@ +package uno.mloluyu.characters.character; + +public enum Action { + IDLE, WALK, JUMP, FALL, + ATTACK1, ATTACK2, ATTACK3, ATTACK4, + HIT, DEFEND, + SPECIAL1, SPECIAL2, + DEATH +} diff --git a/src/main/java/uno/mloluyu/characters/character/Alice.java b/src/main/java/uno/mloluyu/characters/character/Alice.java new file mode 100644 index 0000000..554dfbb --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/character/Alice.java @@ -0,0 +1,70 @@ +package uno.mloluyu.characters.character; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; + +/** + * Alice角色类,继承自Fighter父类,定义其专属属性和动画 + */ +public class Alice extends Fighter { + + private static final String ATLAS_PATH = "src/main/resources/character/alice/精灵1.2.atlas"; + + public Alice() { + super("Alice", new TextureAtlas(Gdx.files.internal(ATLAS_PATH))); + + speed = 350f; + maxHealth = 90; + health = maxHealth; + attackPower = 12; + } + + @Override + protected void loadAnimations() { + animationManager.loadLooping(Action.IDLE, "stand/stand", 15); + animationManager.loadLooping(Action.WALK, "walkFront/walkFront", 9); + animationManager.loadOneShot(Action.JUMP, "jump/jump", 8); + animationManager.loadOneShot(Action.FALL, "hitSpin/hitSpin", 5); + + animationManager.loadOneShot(Action.ATTACK1, "attackAa/attackAa", 6); + animationManager.loadOneShot(Action.ATTACK2, "attackAb/attackAb", 6); + animationManager.loadOneShot(Action.ATTACK3, "attackAc/attackAc", 6); + animationManager.loadOneShot(Action.ATTACK4, "attackAd/attackAd", 6); + + animationManager.loadOneShot(Action.HIT, "hitSpin/hitSpin", 5); + // animationManager.loadOneShot(Action.DEATH, "death/death", 8); + + // 可选特殊动作(如资源存在可启用) + // animationManager.loadOneShot(Action.SPECIAL1, "special/special1", 6); + // animationManager.loadOneShot(Action.SPECIAL2, "special/special2", 6); + + animationManager.setFrameDuration(Action.IDLE, 0.04f); + animationManager.setFrameDuration(Action.WALK, 0.08f); + animationManager.setFrameDuration(Action.ATTACK1, 0.07f); + animationManager.setFrameDuration(Action.SPECIAL2, 0.06f); + } + + @Override + protected void handleMoveState() { + if (currentAction != Action.ATTACK1 && + currentAction != Action.ATTACK2 && + currentAction != Action.ATTACK3 && + currentAction != Action.ATTACK4 && + currentAction != Action.SPECIAL1 && + currentAction != Action.SPECIAL2 && + currentAction != Action.DEFEND && + currentAction != Action.JUMP && + currentAction != Action.FALL) { + changeAction(Action.WALK); + } + } + + @Override + protected boolean canAttack() { + return super.canAttack() || currentAction == Action.JUMP || currentAction == Action.FALL; + } + + public int getHp() { + return health; + } +} diff --git a/src/main/java/uno/mloluyu/characters/Fighter.java b/src/main/java/uno/mloluyu/characters/character/Fighter.java similarity index 50% rename from src/main/java/uno/mloluyu/characters/Fighter.java rename to src/main/java/uno/mloluyu/characters/character/Fighter.java index a8f0791..1c69a55 100644 --- a/src/main/java/uno/mloluyu/characters/Fighter.java +++ b/src/main/java/uno/mloluyu/characters/character/Fighter.java @@ -1,146 +1,113 @@ -package uno.mloluyu.characters; +package uno.mloluyu.characters.character; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.g2d.*; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; -import uno.mloluyu.util.SimpleFormatter; - -import java.util.EnumMap; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +/** + * 抽象类 Fighter,定义所有角色的基础属性与行为。 + * 包括动画控制、移动、攻击、受击、渲染等核心逻辑。 + */ public abstract class Fighter implements Disposable { - public enum Action { - IDLE, WALK, JUMP, FALL, - ATTACK1, ATTACK2, ATTACK3, ATTACK4, - HIT, DEFEND, - SPECIAL1, SPECIAL2, - DEATH - } - + // 默认帧持续时间(秒) protected static final float DEFAULT_FRAME_DURATION = 0.1f; + // 默认生命值 protected static final int DEFAULT_HEALTH = 100; + // 默认移动速度(像素/秒) protected static final float DEFAULT_SPEED = 300f; + // 角色名称 protected String name; + // 当前动作状态 protected Action currentAction = Action.IDLE; + // 当前动作已持续时间 protected float stateTime = 0f; + // 是否面向右侧 protected boolean isFacingRight = true; + // 当前动画是否播放完毕 protected boolean isAnimationFinished = false; - protected EnumMap> animations = new EnumMap<>(Action.class); - protected EnumMap frameDurations = new EnumMap<>(Action.class); - + // 碰撞盒(用于位置和受击判定) protected Rectangle hitbox = new Rectangle(0, 0, 64, 128); + // 攻击盒(用于攻击判定) protected Rectangle attackbox = new Rectangle(0, 0, 80, 80); + // 移动速度 protected float speed = DEFAULT_SPEED; + // 当前生命值 protected int health = DEFAULT_HEALTH; + // 最大生命值 protected int maxHealth = DEFAULT_HEALTH; + // 攻击力 protected int attackPower = 10; - protected TextureAtlas atlas; - protected float scaleX = 1.0f; - protected float scaleY = 1.0f; - - public Fighter() {} + // 动画管理器 + protected FighterAnimationManager animationManager; + /** + * 构造函数,初始化角色名称与动画资源。 + * + * @param name 角色名称 + * @param atlas 动画图集 + */ public Fighter(String name, TextureAtlas atlas) { this.name = name; - this.atlas = atlas; - for (Action action : Action.values()) { - frameDurations.put(action, DEFAULT_FRAME_DURATION); - } + this.animationManager = new FighterAnimationManager(atlas); loadAnimations(); } + /** + * 加载角色的所有动画资源,由子类实现。 + */ protected abstract void loadAnimations(); - protected void loadAnimationFromAtlas(Action action, String regionPrefix, int frameCount, boolean loop) { - if (atlas == null) - throw new IllegalStateException("TextureAtlas 未初始化!"); - if (frameCount <= 0) - throw new IllegalArgumentException("帧数必须大于0: " + frameCount); - - Array frames = new Array<>(); - for (int i = 0; i < frameCount; i++) { - String regionName = regionPrefix + SimpleFormatter.addLeadingZeros(i, 3); - TextureRegion region = atlas.findRegion(regionName); - if (region == null) { - throw new IllegalArgumentException("未找到区域: " + regionName); - } - frames.add(region); - } - - Animation animation = new Animation<>(frameDurations.get(action), frames); - animation.setPlayMode(loop ? Animation.PlayMode.LOOP : Animation.PlayMode.NORMAL); - animations.put(action, animation); - } - - protected void loadLoopingAnimation(Action action, String prefix, int count) { - loadAnimationFromAtlas(action, prefix, count, true); - } - - protected void loadOneShotAnimation(Action action, String prefix, int count) { - loadAnimationFromAtlas(action, prefix, count, false); - } - - protected void setFrameDuration(Action action, float duration) { - frameDurations.put(action, duration); - Animation anim = animations.get(action); - if (anim != null) - anim.setFrameDuration(duration); - } - + /** + * 每帧更新角色状态,包括动画播放与碰撞盒更新。 + * + * @param deltaTime 帧间隔时间 + */ public void update(float deltaTime) { stateTime += deltaTime; - Animation anim = animations.get(currentAction); - if (anim != null) { - isAnimationFinished = anim.isAnimationFinished(stateTime); - } + isAnimationFinished = animationManager.isFinished(currentAction, stateTime); handleAnimationTransitions(); updateHitboxes(); } + /** + * 渲染角色当前帧。 + * + * @param batch 渲染批处理器 + */ + public void render(SpriteBatch batch) { + animationManager.render(batch, currentAction, stateTime, hitbox, isFacingRight); + } + + /** + * 动画播放完毕后的动作切换逻辑。 + */ protected void handleAnimationTransitions() { - if (!isAnimationFinished) return; + if (!isAnimationFinished) + return; switch (currentAction) { case ATTACK1, ATTACK2, ATTACK3, SPECIAL1, SPECIAL2, HIT -> changeAction(Action.IDLE); case JUMP -> changeAction(Action.FALL); - default -> {} + default -> { + } } } - public void render(SpriteBatch batch) { - Animation anim = animations.get(currentAction); - if (anim == null) { - Gdx.app.error("Fighter", "动画未初始化: " + currentAction); - return; - } - - TextureRegion frame = anim.getKeyFrame(stateTime, anim.getPlayMode() == Animation.PlayMode.LOOP); - if (frame == null) { - Gdx.app.error("Fighter", "动画帧为空: " + currentAction); - return; - } - - float frameWidth = frame.getRegionWidth() * scaleX; - float frameHeight = frame.getRegionHeight() * scaleY; - float drawX = hitbox.x + (hitbox.width - frameWidth) / 2; - float drawY = hitbox.y; - - boolean wasFlippedX = frame.isFlipX(); - frame.flip(!isFacingRight && !wasFlippedX, false); - frame.flip(isFacingRight && wasFlippedX, false); - - batch.draw(frame, drawX, drawY, frameWidth / 2, frameHeight / 2, frameWidth, frameHeight, 1f, 1f, 0f); - frame.flip(wasFlippedX != frame.isFlipX(), false); - } - + /** + * 切换角色动作状态。 + * + * @param newAction 新动作 + * @return 是否成功切换 + */ public boolean changeAction(Action newAction) { - if (isActionUninterruptible(currentAction)) return false; + if (isActionUninterruptible(currentAction)) + return false; if (currentAction != newAction) { currentAction = newAction; stateTime = 0f; @@ -150,15 +117,30 @@ public abstract class Fighter implements Disposable { return false; } + /** + * 判断某个动作是否不可打断(如受击或死亡)。 + * + * @param action 动作枚举 + * @return 是否不可打断 + */ protected boolean isActionUninterruptible(Action action) { return action == Action.HIT || action == Action.DEATH; } + /** + * 更新攻击盒位置(根据角色朝向调整)。 + */ protected void updateHitboxes() { float offsetX = isFacingRight ? hitbox.width - 10 : -attackbox.width + 10; attackbox.setPosition(hitbox.x + offsetX, hitbox.y + 20); } + /** + * 移动角色。 + * + * @param x 水平移动方向(-1左,1右) + * @param deltaTime 帧间隔时间 + */ public void move(float x, float deltaTime) { if (x != 0) { isFacingRight = x > 0; @@ -169,19 +151,29 @@ public abstract class Fighter implements Disposable { } } + /** + * 移动状态下的动作切换逻辑。 + */ protected void handleMoveState() { if (!isActionUninterruptible(currentAction) && - currentAction != Action.JUMP && - currentAction != Action.FALL && - currentAction != Action.DEFEND && - !currentAction.name().startsWith("ATTACK") && - !currentAction.name().startsWith("SPECIAL")) { + currentAction != Action.JUMP && + currentAction != Action.FALL && + currentAction != Action.DEFEND && + !currentAction.name().startsWith("ATTACK") && + !currentAction.name().startsWith("SPECIAL")) { changeAction(Action.WALK); } } + /** + * 发起攻击动作。 + * + * @param attackType 攻击类型(1~5) + * @return 是否成功发起攻击 + */ public boolean attack(int attackType) { - if (!canAttack()) return false; + if (!canAttack()) + return false; Action attackAction = switch (attackType) { case 1 -> Action.ATTACK1; @@ -195,25 +187,49 @@ public abstract class Fighter implements Disposable { return attackAction != null && changeAction(attackAction); } + /** + * 判断当前是否可以攻击。 + * + * @return 是否可攻击 + */ protected boolean canAttack() { return currentAction == Action.IDLE || currentAction == Action.WALK; } + /** + * 接受伤害。 + * + * @param damage 伤害值 + */ public void takeHit(int damage) { - if (currentAction == Action.DEATH) return; + if (currentAction == Action.DEATH) + return; health = Math.max(0, health - damage); changeAction(health == 0 ? Action.DEATH : Action.HIT); } + /** + * 设置角色位置。 + * + * @param x 横坐标 + * @param y 纵坐标 + */ public void setPosition(float x, float y) { hitbox.setPosition(x, y); } + /** + * 设置角色朝向。 + * + * @param facingRight 是否面向右 + */ public void setFacingRight(boolean facingRight) { this.isFacingRight = facingRight; } + // 以下为常用属性访问器 + public String getName() { return name; } @@ -254,8 +270,18 @@ public abstract class Fighter implements Disposable { return hitbox.y + hitbox.height / 2; } + /** + * 帧事件监听器接口,用于在动画播放到某一帧时触发逻辑。 + */ + public interface FrameEventListener { + void onFrameEvent(Action action, int frameIndex); + } + + /** + * 释放资源(如动画图集)。 + */ @Override public void dispose() { - if (atlas != null) atlas.dispose(); + animationManager.dispose(); } } diff --git a/src/main/java/uno/mloluyu/characters/character/FighterAnimationManager.java b/src/main/java/uno/mloluyu/characters/character/FighterAnimationManager.java new file mode 100644 index 0000000..40acbe2 --- /dev/null +++ b/src/main/java/uno/mloluyu/characters/character/FighterAnimationManager.java @@ -0,0 +1,83 @@ +package uno.mloluyu.characters.character; + +import com.badlogic.gdx.graphics.g2d.*; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Array; + +import uno.mloluyu.util.SimpleFormatter; + +import java.util.EnumMap; + +public class FighterAnimationManager { + private EnumMap> animations = new EnumMap<>(Action.class); + private EnumMap frameDurations = new EnumMap<>(Action.class); + private TextureAtlas atlas; + private float scaleX = 1.0f; + private float scaleY = 1.0f; + + public FighterAnimationManager(TextureAtlas atlas) { + this.atlas = atlas; + for (Action action : Action.values()) { + frameDurations.put(action, 0.1f); + } + } + + public void loadAnimation(Action action, String prefix, int count, boolean loop) { + Array frames = new Array<>(); + for (int i = 0; i < count; i++) { + String regionName = prefix + SimpleFormatter.addLeadingZeros(i, 3); + TextureRegion region = atlas.findRegion(regionName); + if (region == null) { + throw new IllegalArgumentException("未找到区域: " + regionName); + } + frames.add(region); + } + + Animation animation = new Animation<>(frameDurations.get(action), frames); + animation.setPlayMode(loop ? Animation.PlayMode.LOOP : Animation.PlayMode.NORMAL); + animations.put(action, animation); + } + + public void loadLooping(Action action, String prefix, int count) { + loadAnimation(action, prefix, count, true); + } + + public void loadOneShot(Action action, String prefix, int count) { + loadAnimation(action, prefix, count, false); + } + + public void setFrameDuration(Action action, float duration) { + frameDurations.put(action, duration); + Animation anim = animations.get(action); + if (anim != null) anim.setFrameDuration(duration); + } + + public boolean isFinished(Action action, float stateTime) { + Animation anim = animations.get(action); + return anim != null && anim.isAnimationFinished(stateTime); + } + + public void render(SpriteBatch batch, Action action, float stateTime, Rectangle hitbox, boolean isFacingRight) { + Animation anim = animations.get(action); + if (anim == null) return; + + TextureRegion frame = anim.getKeyFrame(stateTime, anim.getPlayMode() == Animation.PlayMode.LOOP); + if (frame == null) return; + + float frameWidth = frame.getRegionWidth() * scaleX; + float frameHeight = frame.getRegionHeight() * scaleY; + float drawX = hitbox.x + (hitbox.width - frameWidth) / 2; + float drawY = hitbox.y; + + boolean wasFlippedX = frame.isFlipX(); + frame.flip(!isFacingRight && !wasFlippedX, false); + frame.flip(isFacingRight && wasFlippedX, false); + + batch.draw(frame, drawX, drawY, frameWidth / 2, frameHeight / 2, frameWidth, frameHeight, 1f, 1f, 0f); + frame.flip(wasFlippedX != frame.isFlipX(), false); + } + + public void dispose() { + if (atlas != null) atlas.dispose(); + } +} diff --git a/src/main/java/uno/mloluyu/characters/FighterList.java b/src/main/java/uno/mloluyu/characters/character/FighterList.java similarity index 85% rename from src/main/java/uno/mloluyu/characters/FighterList.java rename to src/main/java/uno/mloluyu/characters/character/FighterList.java index aae0f3c..98870f2 100644 --- a/src/main/java/uno/mloluyu/characters/FighterList.java +++ b/src/main/java/uno/mloluyu/characters/character/FighterList.java @@ -1,4 +1,4 @@ -package uno.mloluyu.characters; +package uno.mloluyu.characters.character; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.TextureAtlas; diff --git a/src/main/java/uno/mloluyu/characters/Reimu.java b/src/main/java/uno/mloluyu/characters/character/Reimu.java similarity index 96% rename from src/main/java/uno/mloluyu/characters/Reimu.java rename to src/main/java/uno/mloluyu/characters/character/Reimu.java index 3a47264..e8d4564 100644 --- a/src/main/java/uno/mloluyu/characters/Reimu.java +++ b/src/main/java/uno/mloluyu/characters/character/Reimu.java @@ -1,8 +1,10 @@ -package uno.mloluyu.characters; +package uno.mloluyu.characters.character; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import uno.mloluyu.characters.character.Fighter.Action; + public class Reimu extends Fighter { public Reimu() { super(new TextureAtlas(Gdx.files.internal("src\\main\\resources\\character\\reimu\\reimu.atlas"))); diff --git a/src/main/java/uno/mloluyu/desktop/CharacterSelectScreen.java b/src/main/java/uno/mloluyu/desktop/CharacterSelectScreen.java index ea414ed..6094f2c 100644 --- a/src/main/java/uno/mloluyu/desktop/CharacterSelectScreen.java +++ b/src/main/java/uno/mloluyu/desktop/CharacterSelectScreen.java @@ -11,9 +11,10 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import uno.mloluyu.characters.Alice; -import uno.mloluyu.characters.Fighter; -import uno.mloluyu.characters.Reimu; +import uno.mloluyu.characters.character.Alice; +import uno.mloluyu.characters.AdvancedFighter; +import uno.mloluyu.characters.SimpleFighter; +import uno.mloluyu.characters.character.Reimu; import uno.mloluyu.util.ClearScreen; import java.util.Arrays; import java.util.List; @@ -144,20 +145,19 @@ public class CharacterSelectScreen extends ScreenAdapter { } } - // 点击确认按钮 // 点击确认按钮 if (isHovered(mouseX, mouseY, BUTTON_X, CONFIRM_Y, BUTTON_WIDTH, BUTTON_HEIGHT)) { if (selectedIndex != -1) { String selectedCharacter = characters.get(selectedIndex); Gdx.app.log("Character", "确认角色: " + selectedCharacter); - Fighter fighter = null; + SimpleFighter fighter = null; switch (selectedCharacter) { case "Alice": - fighter = new Alice(); + fighter = new AdvancedFighter("Alice"); break; case "Reimu": - fighter = new Reimu(); + fighter = new AdvancedFighter("Reimu"); break; } diff --git a/src/main/java/uno/mloluyu/desktop/GameScreen.java b/src/main/java/uno/mloluyu/desktop/GameScreen.java index 45d26c3..733a7ea 100644 --- a/src/main/java/uno/mloluyu/desktop/GameScreen.java +++ b/src/main/java/uno/mloluyu/desktop/GameScreen.java @@ -1,32 +1,29 @@ package uno.mloluyu.desktop; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.math.Rectangle; + import java.util.HashMap; import java.util.Map; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.ScreenAdapter; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer; - -import uno.mloluyu.characters.Alice; -import uno.mloluyu.characters.Fighter; -import uno.mloluyu.characters.Reimu; +import uno.mloluyu.characters.SimpleFighter; import uno.mloluyu.network.NetworkManager; import uno.mloluyu.util.ClearScreen; import uno.mloluyu.versatile.FighterController; public class GameScreen extends ScreenAdapter { - private final MainGame game; - private final Fighter player; + private final SimpleFighter player; + private final FighterController controller; + private final Map otherPlayers = new HashMap<>(); + private SpriteBatch batch; private ShapeRenderer shapeRenderer; - private FighterController controller; - private final Map otherPlayers = new HashMap<>(); - public GameScreen(MainGame game, Fighter player) { - this.game = game; + public GameScreen(MainGame game, SimpleFighter player) { this.player = player; this.controller = new FighterController(player); } @@ -42,75 +39,61 @@ public class GameScreen extends ScreenAdapter { public void render(float delta) { new ClearScreen(); - // 更新角色状态 player.update(delta); controller.update(delta); - // 发送本机玩家位置 + if (NetworkManager.getInstance().isConnected()) { - NetworkManager.getInstance().sendPosition(player.getX(), player.getY()); + NetworkManager.getInstance().sendPosition(player.getHitbox().x, player.getHitbox().y); } - // 渲染角色 - batch.begin(); - player.render(batch); - batch.end(); - // 渲染其他玩家位置(联机模式) - if (NetworkManager.getInstance().isConnected()) { - renderOtherPlayers(); - } - } + shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); + + renderFighter(player, Color.BLUE); + if (player.isAttacking()) renderAttackBox(player, Color.RED); - private void renderOtherPlayers() { Map positions = NetworkManager.getInstance().getPlayerPositions(); - Map characters = NetworkManager.getInstance().getPlayerCharacters(); - - batch.begin(); - for (Map.Entry entry : positions.entrySet()) { - String playerId = entry.getKey(); - float[] pos = entry.getValue(); - - // 跳过本机玩家(可选) - // if (playerId.equals(NetworkManager.getInstance().getLocalPlayerId())) - // continue; - - // 获取角色名 - String characterName = characters.get(playerId); - if (characterName == null || pos == null) - continue; - - // 获取或创建 Fighter 实例 - Fighter fighter = otherPlayers.get(playerId); - if (fighter == null) { - switch (characterName) { - case "Alice": - fighter = new Alice(); - break; - case "Reimu": - fighter = new Reimu(); - default: - fighter = new Alice(); - break; - }; - if (fighter != null) { - otherPlayers.put(playerId, fighter); - } - } - - // 设置位置并渲染 - if (fighter != null) { - fighter.setPosition(pos[0], pos[1]); - fighter.render(batch); + if (positions != null) { + for (Map.Entry entry : positions.entrySet()) { + String id = entry.getKey(); + float[] pos = entry.getValue(); + if (pos == null) continue; + SimpleFighter remote = otherPlayers.computeIfAbsent(id, k -> new SimpleFighter("Remote-" + k)); + remote.setPosition(pos[0], pos[1]); + remote.update(delta); + renderFighter(remote, Color.GREEN); } } - batch.end(); + + shapeRenderer.end(); } + private void renderFighter(SimpleFighter fighter, Color color) { + shapeRenderer.setColor(color); + Rectangle r = fighter.getHitbox(); + shapeRenderer.rect(r.x, r.y, r.width, r.height); + } + + private void renderAttackBox(SimpleFighter fighter, Color color) { + shapeRenderer.setColor(color); + Rectangle a = fighter.getAttackbox(); + shapeRenderer.rect(a.x, a.y, a.width, a.height); + } + + // private void checkPlayerAttacks() { + // if (!player.isAttacking()) return; + + // for (SimpleFighter target : otherPlayers.values()) { + // if (target.isAlive() && player.getAttackbox().overlaps(target.getHitbox())) { + // target.takeHit(player.getAttackPower()); // 使用访问器方法 + // System.out.println("命中远程玩家:" + target.getName()); + // } + // } + // } + @Override public void dispose() { batch.dispose(); - player.dispose(); shapeRenderer.dispose(); - // 断开网络连接 NetworkManager.getInstance().disconnect(); } -} \ No newline at end of file +} diff --git a/src/main/java/uno/mloluyu/desktop/MainGame.java b/src/main/java/uno/mloluyu/desktop/MainGame.java index b215067..699842e 100644 --- a/src/main/java/uno/mloluyu/desktop/MainGame.java +++ b/src/main/java/uno/mloluyu/desktop/MainGame.java @@ -16,7 +16,6 @@ public class MainGame extends Game { mainMenuScreen = new MainMenuScreen(this); setScreen(new MainMenuScreen(this)); setScreen(startScreen); - } public void showGameScreen() { diff --git a/src/main/java/uno/mloluyu/desktop/MainMenuScreen.java b/src/main/java/uno/mloluyu/desktop/MainMenuScreen.java index fd73fbe..b0c80ff 100644 --- a/src/main/java/uno/mloluyu/desktop/MainMenuScreen.java +++ b/src/main/java/uno/mloluyu/desktop/MainMenuScreen.java @@ -8,7 +8,7 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import uno.mloluyu.characters.Alice; +import uno.mloluyu.characters.character.Alice; import uno.mloluyu.versatile.FighterController; import static uno.mloluyu.util.Font.loadChineseFont; diff --git a/src/main/java/uno/mloluyu/desktop/TransitionScreen.java b/src/main/java/uno/mloluyu/desktop/TransitionScreen.java deleted file mode 100644 index ff736af..0000000 --- a/src/main/java/uno/mloluyu/desktop/TransitionScreen.java +++ /dev/null @@ -1,122 +0,0 @@ -package uno.mloluyu.desktop; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Screen; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer; - -/** - * 屏幕过渡效果类 - * 用于在不同屏幕之间实现平滑的过渡动画 - */ -public class TransitionScreen implements Screen { - private ShapeRenderer shapeRenderer; - private SpriteBatch batch; - private float transitionTime = 0; - private float totalTransitionTime = 0.5f; // 过渡时间为0.5秒 - private Runnable targetScreenAction; - private TransitionType transitionType = TransitionType.FADE_OUT_FADE_IN; - - /** - * 过渡类型枚举 - */ - public enum TransitionType { - FADE_OUT_FADE_IN - } - - public TransitionScreen() { - this.shapeRenderer = new ShapeRenderer(); - this.batch = new SpriteBatch(); - } - - /** - * 设置目标屏幕的显示动作 - * - * @param targetScreenAction 目标屏幕的显示动作 - */ - public void setTargetScreen(Runnable targetScreenAction) { - this.targetScreenAction = targetScreenAction; - this.transitionTime = 0; - } - - @Override - public void show() { - // 屏幕显示时的初始化操作 - } - - @Override - public void render(float delta) { - // 清屏 - Gdx.gl.glClearColor(0, 0, 0, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - - transitionTime += delta; - float progress = Math.min(transitionTime / totalTransitionTime, 1); - - // 绘制过渡效果 - shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); - shapeRenderer.setColor(0, 0, 0, getAlpha(progress)); - shapeRenderer.rect(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); - shapeRenderer.end(); - - // 当过渡动画完成时,执行目标屏幕的显示动作 - if (progress >= 1 && targetScreenAction != null) { - targetScreenAction.run(); - } - } - - /** - * 根据过渡进度计算透明度 - * - * @param progress 过渡进度(0-1) - * @return 透明度值(0-1) - */ - private float getAlpha(float progress) { - switch (transitionType) { - case FADE_OUT_FADE_IN: - // 前半段淡出(透明度从0到1),后半段淡入(透明度从1到0) - if (progress < 0.5) { - return progress * 2; - } else { - return (1 - progress) * 2; - } - default: - return 1; - } - } - - @Override - public void resize(int width, int height) { - // 屏幕尺寸变化时的处理 - } - - @Override - public void pause() { - // 游戏暂停时的处理 - } - - @Override - public void resume() { - // 游戏恢复时的处理 - } - - @Override - public void hide() { - // 屏幕隐藏时的处理 - } - - @Override - public void dispose() { - // 释放资源 - if (shapeRenderer != null) { - shapeRenderer.dispose(); - shapeRenderer = null; - } - - if (batch != null) { - batch.dispose(); - batch = null; - } - } -} diff --git a/src/main/java/uno/mloluyu/network/NetworkManager.java b/src/main/java/uno/mloluyu/network/NetworkManager.java index 405dd53..1e00cbe 100644 --- a/src/main/java/uno/mloluyu/network/NetworkManager.java +++ b/src/main/java/uno/mloluyu/network/NetworkManager.java @@ -10,7 +10,6 @@ public class NetworkManager { private ConnectServer server; private ConnectClient client; private boolean isHost = false; - private String localPlayerId; private String localCharacter; private final Map playerPositions = new HashMap<>(); @@ -31,31 +30,31 @@ public class NetworkManager { return localPlayerId; } - public void createRoom() { + public void createRoom() {//创建房间 isHost = true; server = new ConnectServer(11455); new Thread(server).start(); Gdx.app.log("Network", "房主模式:服务器已启动"); } - public void joinRoom(String ip) { + public void joinRoom(String ip) {//加入房间 isHost = false; client = new ConnectClient(ip, 11455); Gdx.app.log("Network", "客户端模式:连接到房主 " + ip); } - public void sendPosition(float x, float y) { + public void sendPosition(float x, float y) {//发送位置消息 String msg = "POS:" + localPlayerId + "," + x + "," + y; Gdx.app.log("Network", "发送位置消息: " + msg); if (isHost && server != null) { server.broadcastToOthers(null, msg); - receiveMessage(msg); // 房主自己也处理 + receiveMessage(msg); } else if (client != null) { client.sendMessage(msg); } } - public void sendCharacterSelection(String character) { + public void sendCharacterSelection(String character) {//发送角色选择消息 this.localCharacter = character; String msg = "SELECT:" + localPlayerId + "," + character; Gdx.app.log("Network", "发送角色选择消息: " + msg); @@ -67,7 +66,7 @@ public class NetworkManager { } } - public void receiveMessage(String message) { + public void receiveMessage(String message) {//解析消息 Gdx.app.log("Network", "收到消息: " + message); if (message.startsWith("POS:")) { diff --git a/src/main/java/uno/mloluyu/versatile/FighterController.java b/src/main/java/uno/mloluyu/versatile/FighterController.java index 17078bd..e984509 100644 --- a/src/main/java/uno/mloluyu/versatile/FighterController.java +++ b/src/main/java/uno/mloluyu/versatile/FighterController.java @@ -1,131 +1,66 @@ package uno.mloluyu.versatile; +import java.util.HashMap; +import java.util.Map; + import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.utils.Array; -import uno.mloluyu.characters.Fighter; +import uno.mloluyu.characters.character.Action; +import uno.mloluyu.characters.character.Fighter; +import uno.mloluyu.characters.SimpleFighter; -/** - * 角色控制器,处理玩家输入并映射到角色动作 - */ public class FighterController extends InputAdapter { - private final Fighter fighter; + private final SimpleFighter fighter; private final Array pressedKeys = new Array<>(); - - // 输入缓冲时间(防止快速按键导致的重复触发) - private static final float INPUT_DELAY = 0.2f; - private float attackCooldown = 0; - private float jumpCooldown = 0; + private final Map keyPressDuration = new HashMap<>(); - public FighterController(Fighter fighter) { + public FighterController(SimpleFighter fighter) { this.fighter = fighter; } + public FighterController() { this.fighter = null; } - /** - * 更新控制器状态和冷却时间 - * @param deltaTime 帧间隔时间 - */ public void update(float deltaTime) { - // 更新冷却时间 - if (attackCooldown > 0) attackCooldown -= deltaTime; - if (jumpCooldown > 0) jumpCooldown -= deltaTime; - - // 处理移动输入 - handleMovement(); - + if (fighter == null) + return; + + for (int keycode : pressedKeys) { + fighter.handleInput(keycode, true); // 持续按下的键 + } } - /** - * 处理移动输入 - */ - private void handleMovement() { - float moveX = 0; - - // 左右移动控制(支持方向键和WSAD) - if (isKeyPressed(Input.Keys.RIGHT) || isKeyPressed(Input.Keys.D)) { - moveX += 1; - } - if (isKeyPressed(Input.Keys.LEFT) || isKeyPressed(Input.Keys.A)) { - moveX -= 1; - } - - // 调用角色移动方法 - fighter.move(moveX, Gdx.graphics.getDeltaTime()); - } - - /** - * 处理按键按下事件 - */ @Override public boolean keyDown(int keycode) { + if (fighter == null) + return false; + if (!pressedKeys.contains(keycode, false)) { pressedKeys.add(keycode); } - // 普通攻击(Z键或J键) - if ((keycode == Input.Keys.Z || keycode == Input.Keys.J) && attackCooldown <= 0) { - fighter.attack(1); - attackCooldown = INPUT_DELAY; - return true; - } - - // 第二攻击(X键或K键) - if ((keycode == Input.Keys.X || keycode == Input.Keys.K) && attackCooldown <= 0) { - fighter.attack(2); - attackCooldown = INPUT_DELAY; - return true; - } - - - // 跳跃(空格、上方向键或W键) - if ((keycode == Input.Keys.SPACE || keycode == Input.Keys.UP || keycode == Input.Keys.W) && jumpCooldown <= 0) { - // 这里假设你已经实现了跳跃方法 - // fighter.jump(); - jumpCooldown = INPUT_DELAY; - return true; - } - - // 防御(左Shift或右Shift) - if (keycode == Input.Keys.SHIFT_LEFT || keycode == Input.Keys.SHIFT_RIGHT) { - fighter.changeAction(Fighter.Action.DEFEND); - return true; - } - - return false; + fighter.handleInput(keycode, true); // 按下事件 + return true; } - /** - * 处理按键释放事件 - */ - @Override - public boolean keyUp(int keycode) { - pressedKeys.removeValue(keycode, false); - - // 释放防御键时恢复到 idle 状态 - if ((keycode == Input.Keys.SHIFT_LEFT || keycode == Input.Keys.SHIFT_RIGHT) && - fighter.getCurrentAction() == Fighter.Action.DEFEND) { - fighter.changeAction(Fighter.Action.IDLE); - } - - return false; - } + @Override + public boolean keyUp(int keycode) { + if (fighter == null) + return false; - /** - * 检查按键是否处于按下状态 - */ - private boolean isKeyPressed(int keycode) { - return pressedKeys.contains(keycode, false); - } + float duration = keyPressDuration.getOrDefault(keycode, 0f); + pressedKeys.removeValue(keycode, false); + keyPressDuration.remove(keycode); - /** - * 获取当前控制的角色 - */ - public Fighter getFighter() { + // 传给角色:按键松开 + 按下时长 + fighter.handleRelease(keycode, duration); + return true; + }//松开事件 + + public SimpleFighter getFighter() { return fighter; } } - \ No newline at end of file diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png index 0a5c386ab0f31e66cc0da7b6aea7aab373456dc1..02504c87719db5a527f7cb370bd23ed952b199e9 100644 GIT binary patch literal 19793 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 Bn9~3N diff --git a/target/classes/logo.png b/target/classes/logo.png index 0a5c386ab0f31e66cc0da7b6aea7aab373456dc1..02504c87719db5a527f7cb370bd23ed952b199e9 100644 GIT binary patch literal 19793 zcmeHv30RJ4+kcBRNi`ykqK0hM5Q;}TAxi5*8dC`~O0;MpEh=MsF)@@$yCh`^^G0b$ z6G;nGmb8&JTk*(HQr~%=_x&u4?|Z-F`2XMU`2UaNa~z(YuKT*q{XDPp{M|G5+Sx3Y z8>TW$OiWD9V#z|Tn3(wQ@HhRdp|GOw>cJ5c`&P_i;r!)W#a~<B*K=Xi@I!0l_RN- zgzjHeiYDxh=9<8!hLN-T=PTxp-0G5;KF`f2s46A=i<>^_>IR{J8 z$-u%)b(&i%%ds31pYy(duHj?nzw9n?o-gxnci^Gq>!O0ejp(cJfeQ z*TtF7OLT9%Sh+oP#~bh1(!Vr{gG>&8w483Enq^|-pD>_282EdeM)6jY-5;M-c;~ME zaLCn2{btytWW(-%I(zn(l_FI?4X|W+1)u24=*W$$cJKYYyVWUS&dPz}!IB4oyk`Zs z{C?ksI(Q&$FHZW9gP%rE}L^s zpBQrHf#MYvU?aH=DnZp%`QIr!nT#z7+Z7t)zvY&c)6kQ@r%T$R)HAI#w(Th}@M`H3 zt6uz1*PBy1Ui>DTJ>2R?+Z(Zsepi3n?(yR3yj6*Fd_P{B5!o}2SB2J(MPJOf*66Ma zifLPWYtN4l&j0EPd$v8|kfhuDt29;bk6oW6kGcycsjqCW%bLpDFSJwljgW>+uDBASo>E;a)J5*Acg@DHsJqsVn~V2^*n;ec*_+s`leXw;o=6>@;w>uw0jsaX4A zMAE^ZiVrs@WI0WLFl$Dn@wh4ckf`+d@t*V}iv3rDI4&@tz}z(agOZ=`!=rC+UD5k1 z;M;U-XZ5WrXl~STFe3bb@whU>lcGs7IpLqamD^3Xs({k+thE=1z1FkpzY(tUJvsJY zC<3R@CSh;%P|PwztOxuYJYh7PQvN8L@?Dhje?T~UVahMXtX_y&jdjHdOUD!_L7$b5 z&+5u&Mdy=>Q~|Nv)=tIiIutKuU>=_W@-&Ty_(-U|4F%Sls%OD6;F^rP8=-1xb|*k} zb*JiT%hXQEFBQ}7U06(;67aKJ4khJmxV&US+Xkj+uK}9xtgwO8Lmp10k|NU>Nu5=6BOLT!2PPCcHm*Ez$((+n;l zO`mHMqq#+ipbAfFgG#O)%9Q3DX)!geUmtHAQ?Q$k9o#pTnx;^HxJ9T~ulWX*-jSqA zboW|COU=RKaE(w4m#Fz4~O8&q!&vgDRa;+?4q*V<2R8&qPq zlS?GQB@L1&eKK4ax?I$$Z9X~y3Gw8iKukd=Tju(MLFfwR9l*t9v{N2^fiC9RfI{OK z2cZv}bdhGD4P<9DF^UA{1&cSVKU^jUmz7~UNkjpmjK<+CvDV-$q!8E*$HV4;n61}= z=1_D2bMb}^MVf|SWmSqeo(*uP+qhx;?8pWge9CPa0rBF5(&hdLPFesQAy}~$$V9^_ zm|1HCT49$Eos2fJM&=6U)*1?C$b6j}Xt@!6sCG2YTX-l+;lL zyY;&u@m^>QMlsQhw{{MB#TBkqo+0se1gH0^;A!Yo^teS!h`BoU6&l!L^iP8%4!0oH z4MFu)q;U6fAW%tUd(9`O7@<8*^v{6o>^_d|2T$3`EXW9jhg8yo+nOYGU9DLD1f?&J zw}bMaf`_83kM8tqMoQ)JTv#+9QC?Y@<=Ucrv5|4+@Bq)0%#vvf!$69zgQ8PmhJqT6 zin8-gMwP>~fO#E;Y}jG6wAG+9$*W@n~v6Q>pHrVH$Vzu#6WF|~UK3gP`5Y_moxK?}fa zm}WZ5YRXh8ZaL5owYi~$K9DnQdt!G&cB=$QqMEtdu$^NIDz)w-ds$2!jEXZqN8V__ z0-29?b>0s2p=)gm=hl=d5LN85+NPrp{bFc-H$`Y~JzAwnzZ8(J!5CxJ5WaZtjLy@7o;J2N?uo2BxgscOBwQH>&PnrC+ z05U}xl1&>V?urANWywgW-pZ_(j-o}>;(!RK>x!PRLyPH%?wLo?CJW3U#=~*X1te{P zF3LH&Qvxc^FBH&@zz1?88Ed;TT1>bj9u8Rc4&9*QQLE>NcY_KQ(4tt2tpQZnLZRig z#;07h-6{hM6*V1yR8)&qIrr_}=sj?^0q3-6&W}+0?x$kxa+{z$r#T-4eP7htg~d&T zUSyNphN-63in$uhkNIG_EO2av)ivl*PE6?>>iWaO&3|u+TQ9QHDk@pCKZZSOF z{l%xp;OUP4>M0XjD!F-rKAL9=f}wDg*vQ?Qfn!iJ{5llG`*evF%x`nLr?dZ79Crq4 z^|1%Vb`M*(t<*R6s1H`I-4>Bf^8zz(_`MFD_~A%s7tS(m8ps&hK`na+D@||k+jUu_a1F;a@&Yr>;6N!Ouu>dM zP6~R}W3$|){2u=Cb~_E#xwD|n_;z+=K`c&^^#@;t!tlVG#0*2pIDG)AEz4|+ui@O4 zw6!JtO*IUgK{VW5!$8|4@H0(mp9#_q!--@iP1%%89yl7Fvx2@%R|cnWjxQXSj$;BX z%)bi8Y-VZ+-voj9c<&mOr-rRj!YMasGl(u*qW5Q@yI}Gau3_+g;S5HM23(uV&=$vn zm??)N7>%WQ(llyPnwkjb#a|s^bSjdZVTSljdEGum*=%E8}w1Hc_5D{E*3 zD;6PYI@hbB@6{hPe&58@n?}Pf4eh%?-FzGgKU*_2`r;X9=rG*e6mfR<=|n>VRsmsR zq7STN5N_!G8GTMJ7Xcx91>>~N7C;g(G^1RhIzgDt-A&O2@COd~nBL4N4g*GH1N7n* zkN&M}P$BPMK`C_pb{1_Bl(f*ROu4Dck`Rf%enMB;N@l)LHspgSOwJKRLS7;ep#?;b zp@Mb}I&(Ju#$bUFBV>aC6wm@>HUb&gK<6FO2>}#n?F}q_u76>U2$2H;A|Xko2?8zl zj$k^^dvkyfspz2N*&t%_tM{K!SI7q@ymg2JJr*dKE8NVFs9%KGQDUF~0YaOwK4PZ- zvKV9alCa+qxnQKma`88ZiiD1?KB8=Ej+zGxqT%nNA}&(YN_846?O5i>7G^+BzMy{{ zq8FH@Ss(^g3G&@1aw1B>FEm6Q{lnmKSoJ>=-chE+T(Cd6bu`Wbgsf&sHQ1AC3{MJN z%Rm!MY-0!r>Ls~xpCI~0;1EZ+pxEl}446|GDBjnF@SaHBVZJ64?h-Z^QmUvEfvUes z0Py1}eJP}xBI3-u0AFn1^7s1Gy8~+{foHv~LOP460I45<8hf5e`xE$;x&@|L5Y{k$z%|w4rT;#LZu8y-0!kN8r-FuZ5soR}>W{vA z&%ccjAHL$l>>)(@^K#Fx!~Zto?5#z^4-`xqjNsN>5}PQv(f;?@|95s-(CcxSnQv42 z0Y5m9fj^iRPMW4RG`92F5tRIZhz5=1nr)Q;5S2G0`V~sRs%5T0l$~Yo78uyeI0)ic z;_Pjy8IEXbuMN)enh1n&%kLuuS(LQcK zq!^K;FbM*Ycrl2d+5pucY23#xcLb_xN8mh99!aM~4+5;iTaOP_kI|SP29gAgLebtXY^I{M-TxB+h;RXWdm<{w2a2Cqf ze}G7iLo{;&EocH(^@9148aia5)mxJ z>mor4Mgm`b{0h)J>fZkoE)b;DPCMweUJku!%qP%<-q$#h?2XIN(Xo30(~Kjcn;1Ec z!om*-!Xyz_Rgk=YDtWJ(m^jD6h7g9l46SS97D6#K!{KFs9mwAYW-Y%g zKuC=N9veoMl13-=;|tpOpA^eq0x+jejE&|ZV+82D4}+wOtu@$84Mai+#pUXQdDH+P zqg=E_^CQSc%cBXhE^o%P)I(uzfH22*cSl1WCj89b z_rBtM{(lQ#hOacD^VdMWrbRn}Y>?=oQIOP{x}fko!Vx(Hy8;I1rZ|k?Rdwct0H}al zi^?V%8GvRS!1j2rL{1dXlsO2~XPY(H)o3i?#tZPVT7t#au8Z)-SLPr@>(!$>7lUJGX~XaN zAPasm`X=htKR^~Y_}wpu{UQx$r9emom_b_JY7(+6f!?(0FjL`8=pG8_#q+o?h$$Ei z`s8uq>P;TJe%V#z6?LmTTIMt9Rtg8UN^D1{Tld?8=K4&M?*xDdjR(?U9Rv@=iN1|D z2}G>I)mU!vz`Ma5H>NXZ=Q{?Hsz78M%=VKFH90Zx3OP%nw-tJ>RrH1yWaJxeCDYN1 z!a3}_>W4q|4h|@M^8TH9qnU&>PUyqvCT2u0bp7zP_GidPBx{C>)&eItc+-!d1-8TC z1FBELCJ7OsC`0fb>l-%&$oR;I3H`?m%%pTz017bwiNGcRjQZQLg`}2|7C*-#3gB%K zMZ|w!K)iz{fzGCo# z2uZDTqaQ_7wLF>~xg{_pDBrBv_xmSq>F2-8vtQtpy6IU=l2_N;{QSZKmy{0qjWsWN zN{`n+cO7h8pK9~u_UYelrxLXg{)SX zr%hoDE7LaL@8jLln;Sg3GcTG~E=c!X?~oik&0TfdL#O&9x4Uh+VsyP~J;wfUH+|Ku zI`emZMfru7Tx1HzUlCVwl-)GX-Pf-;!NXst@nz;q%g&Hb=!QTjnaX)ZswD>NxT~I0 zoqch3Z~$^!1efl{QSuubUQC>35V_#Y4`%62K>V3GYz}x8XU?d{89Miv>JG2Q30K4m zQU-q4Jl<{+G_jvet zIhu8gZJJklS7Pk#y0HZ(@7S!lgSsgOch!dI*DqL zTN4?d80MdYi>0UD`DGuXnD{@4wY-@R?o9(*tQ=d=KKLv=)3lI>z;A~ABJdW+P}Fi2)ktD(36iWR5uH} zTv*iYjV|^1YSTQ<(E7YZ5t0V+XxOI;`zf<>OCIVO8vj5MLJ{_^ukyI++wMW#Wejn} zVd-H{>)KbjHoRQ?u|B+l@%qxvJ1Bk_<87J3nQW|gch>3{Ly*kP$lN6o=vyFS6-d>n z5*3buAiJ4(D;C;QB(Ds`#@>#+n(aN}QN+22H$VEFtW3v@mKB?OtYrfv>;LTl3i$Ct zrqhtQ$2M+xR+!+$NT$rsg#SVBcV1uZlmqT^Y`JiK@U;)7Me;bvLvJPx^Thb|uN~v9 zujDutjV?$sn}bX^Vcg#-49n^?|M+3BqLz~W(#~tAT!XW7?<)s>upj(Oovm1kOtood zYmCouL73!C!1(JcX~fKy5+7^ldr3?>;4T$Alb3BThq;Iek~w3pHtYZUFDOB4njW6p zIbG~gg!l05&HEua6O^mbh_n0=6>cRIpSg5Oo-RXn_`NxFc7R zy)Q=mtg4%;QmL%iy^-}9?=>Ud{xL@j=&6qcx%oo`gsDMn$GWA*}qpyf>lU^-VpD}fxE8Hk8 z6V|{+5H=ig?fBHNF+hI*4&WpCC?f1@W?wSyYXO37l4Eb%ik)4pso>oj}ZZaG$}wO6C**qhl5G8t^qZ$vbH2y zKo!2WoCPKNfoUl*^_2wm66CTS64W7;Af5KLlw*LZdY+l91KIaAhK{{67GL-6UP>L3 z5MNS6OdASW%XdI56o@@xh^@n5(ubo8u)kOm6m=c}-+WLsHK1)Oj$SN1A~x3U^+`DT z5?H-oN?wErg0q^QXSORpE7qP0pY z+o7LQLYg5cfzm?SC4GP$Skd;m?)FkLRe)!uj3$Ptz)~RC0X*N^k%X@gfQ0>e zo@aiAVBP`WL%&Bxj+jsHF&@HHvK^K{l8D3ia}tnNaLes$k-}4uKkwxpMGT0;${BI+ zCS;PN);@LgXgVaE50K=*M(0Ub7i_^>_5~mp?QaG{;d5ntZj8@m(GaWP8Vg6`JA#-B zz*Zi-!+`}I6lkmX74eT!u;L2VGlis51%BT05U8Ef{L{^7R9ohBFjTivYgGOtdbv~< zDkB~l7*ek_00iBE`6zL)Vb3@eTp1EU7rqq9)@v0(LXZuHK8h#;{)=9lL8k*np(P(^ zZ;X(v<5<&15TNYrdN%4`->OW#1YJnue`$%8^Iq@i?*ehA9XM3^d;1s8qK=W*g7SJPKmz~GhxbvSq)!WRXxLdhJ5)#sVx6J07Lj+jUR zlX0P?1fsx@D2?%a{t$vJk;?QLh=xESV=^4=AO$s8>1y^lDWoZZ4!?kesSjI(A?NZ9 zZd1CFZDN35b`c}>p}74TQQS{TZ9=9B!|VGp=s4PYx$}2)0;wo<-jtt z$!wcJlCGsiWMl8U1#$&SU(eOmPUxA ziUap6*n)$i2due}xs)`ur}HsL(R&n}&v?HElFbBeWvQ##)1^SpYKYT*J&+u)wf9c6 zUmHJVBfJVZL|BPFONgPP$Y(QVSD}XI^Fp$1FoL~A`|-3+~Y&0(L|0mE{(4-a|PpeKnf%r)cb(Z zQ{LT*o%4=AzJ0zW4dr(C`~FFLO3mDUosUx@)yOKQ`Z!tU-uJ<=@9t&uN*mXeG@8)_ zfUPhh4(tpSKB!(9m&iBIEQ~PKlI$k*PNx++><^|5p18Askbo(SNHE^PSgvwEqwc9T z<1iYupDF|ry28lxzI!lrWmXhBd{T>+Cyvha*FS5WRkQZ@+aC*SBX>Ofp>vXO%5#~4 zA{@c2NW9C39onIV@3IN;xperpGBaNiVgrNzhu6!Kb$a}jBWKuOodcPq4Iw)x`t77$JlKxb{fy3-}?&&OwvI|wxy z8=x)}55r*AQ5*e3r)%GNoVGdGljc!L)ipfpi-Yh$%s>=7!X_s)0JzccoP%@x2Io`( z@Y2zcTOMVzu_nR+9QBo&}n>u#eddR23l5FlgF&%PvKREUCQ1mh6E2$X}^iYbXX zqJ1@c6;4367*wFhJq6Wa&_o6^`kPIefbmDqU`9kJhTZK{bP4yvdW5mr zhX@!`$h!3fHL*t|8jz+M6%L^RSeiIe1-Riw5{2 zmZD2}Hp}z*Y|M_T7l2HC=nf|=v#*g~pUj2MF6t15EkVQ#CRr^2DgnB{dJUMSNKzQ& zphr?ewpE)6Q7;C;6oGmnGXRq9yO@)$&0x|2Iq>y!f(mrCGj|6?YLQ^aW-egJEPkCM zthw8^Ah!I*L&wLlGgc7$7_0R$n!Ul%3}03>5*GG(MPm-*J;lUE&u%n1hpNv>AzZfY3EwG%nA01MX(>KJ+`sRI zFr##_DgeZL=Ext+HG;1#R56~RlN2vJB=EFZGX+*&F=AxFbd?00pTYvnsi+2v?J~up z>uo6$rAZ=X0ziO7ne5H-Fo|gh__CEtaE~JFzRH$u2o_^$2);lh~F6Q z5Pq@H0LTu8-C%7&CApmg<~CyPEc9%E=q)`SZ}Tp)`hJw0X#j{9l_5KkI)tRDA!&)h zIH~%o-ar|uo&D>jWc=ai+H#SmfG)hw0oJ92k0yP`gfU%9J?q()0Mj(@zA{^p*$xfg zVw4kMoVAu0;0)9`ZnaYfVOOhYSn8)4gL!nFdRgk0gBL%z7eYfyxGbLS$En@^bq-Q1 z6=}7V#p;87FhyIaHE-ENB+j#KH;it&SHxYu_I%F8nFyf{TZA1DnNz1`g~kBc9bPUt z#odX-P*EyIGX$g(D_d%;ag4aL>st2o5vYMVQFo*hwDv>2VB@Qde)~;TfXTXyY0zVqu{v74i0I(p$Dc{h&*xm z$CKBc9&yVZjj)h^kkgYs_gLZIdI@cYPtv4!6B}?19K9P8dI%~7txCP?&;CD zIet|(nuq+iSjxB@O~_hi*_x2ZHFNhfQZu%WI(_=jP?N>gV-GI2tvSK&52Ov_@qC}` zjVE_%^iDBsh6)H3N_w6F1s1mfsR^{vysA!f5Lv(1+&*!pSU_Wc*IRM25%lb>G7vB{AQBuPp0OA;WO<>W=3Rt5vuOEZ| zle&rMFrp>!qd~w$qIDNWjeca@< z=-W|z8$)}}#zgR8|1BUXiqbO?w}PFymYu5l?%F39ZzZ)RxR74Bm32LFdU{9C+EO!R zioUy}Lz+iiG}o*ez0LR!WiU)zND_(Kh@yedMJVuXT_F{SO?Cr?sx5gF?9H{5F}|tq zG#;t)r4=d$v4`SN?7=qB-&mj(6Z&@WZUf%+EXUKM{Hj(g(Mxh^U|fEwjx8+u`{k)I$bR?(Iauu}>tN@;M<^<4@O-!ZORLpOhHz z?cy4}Pox1GJ2(WB_GC23Z+?g|7GskhER#(B~9@y`eU2 z+A~H4BMamrb#5|IO^y+GmeLJMHCxaqq(JsmObRM~!yc>vc>Q2GbC|*ci?$&6NFJ)m z!n|Ya57b=9Ft&0gF;$2N2&3dPdf-8Ujf6SNuA!!Vf^sgb)cho83NE>u%2Jg7z+nB3 z9jY?X4a0suc<%Pk|C}Ue?Nlz2XXYTOdu6rbo^Yr2cSp!Z=LJQS7uzXM-MpQvoDtGp zWff7b{;XZx(&ZR01D-Y}#>&_Q)xPYiu!?{UM$aVDyw#5JbZRRlqx0sq*~7s%VrkQ1 zixeKI?P`Axf0DVdo^PnGJMtK942t09WAD*eu{7^McQ>9a?(0Y> zSAW-(7#j+UYR7Sl3c? zKydIDGc!^B#8znNh8#$wlL6rGC1<)d8FP| zXsG+NE5ZL+Q@(CgF$NCB%1u{{#Ms!-fIt(s$>E#vQ{*WetvG=(i$}Gp8HxvEZ!U)L z`m<5LV|fxL3sS=fY;_FmNLUtxta>4&nP`N){Kcmb!C%^Y7gGTwa077<##)H%hZG3g z%tnFeI;)3kW1_zehVU0;(ZL|Ied%2Ue+HKET?md)X3`Q2aKD(zTud*1(weq`fdoF` zxptzx(15(R#gt`adjG0ZMwjw?`{0kQQ1jlt@NV2rVzn)1cmsExK6Qg-Z!ffN=bnLo QDoxB{k@lbeO)!uTeok4Kp;{Lb!9^k2wV&Nl@Z|qEsb*5 zC=iGOq@k>6901+oTgYV3J+YS5@oC_uch92$7Jj(PQEWC>hzvIoYANLtpFZzx+Q13=|MF61K;9 z)}i??7AyjXcH#2D&a3&vZE-hW<>mM~#w^_!U|2gt3eR7(VMrH-fiDc~j3zcQCIhCP zp^@0F_vgow#GRn z1YL*^jNvvmxCg8VY$9&ph!ca*Utj-b&RK{JqXZUHOW{hJfH9M-T!%jH>fEjMRn_f% z%_y=0Q1hCQs%Z^RV`s(eT=s+aUT&%`=w!=#V($@um_0Bv>*(QM7bE6r4h@zr-a=}O z+()AAE^-Z-OkkhdH!gqs3Cz6_-QJZ2q<8_|l;hr?Cx~k@tmsC7-b1`(J#qpO_#Lvf ztTNl}@G@J*ucg%a9E_iFSf24NiCH}x&p%%<;S7c`0}o-Dl$9ImyMuL?=>x#rZv*-L zBu^2A^e@CnL<<_3orPTIhNunCiU2OXKuel;^nsBqu>KxKKExoFjtW`$XkF48`rH}a z4s+x4;R3-4Q4gF8)M=?ekr-;8+e;jf@h%weh>@bkylka-Rsfg1`6G6#eq{PQoK941WfLn*ea@J| zvuP=#!ukpva(VcG@1$x@_%1+W^Ydqmi5LAs$2&eB>U#AQC|`8y6|nNQ_PKx~)7(ti z@60#@1eYCg??NDn%#VYEuQ0lMN4wS!y9Zap!ah8+9M;7)PYwtVU;NykytsIEpcne7 z)vYDyyhUsbYxEGdjssX4EpXi3$1A;*dpz95(E99Rr}5+Y_4&r3!?2|Whx_5l2;*{_ z{rdhR*N-`S@-i3Y624!vSxaA^7UpdgdsdKgiokUel%JT-F9f$%Rw-OxBycRX1seq` zD!Rx%|I{9Qd}({UU$H3eJGp=7$>vVAwd*`DbgqYJb@F1TI9T;xNW}Ks2ea)CS%z%t z5^--bS4->PXQu@w$7|&KIIQFJA>2Rr?>v z6fi1;1pU5Vnl%+x2<>?1p^$#vnu{gBvWx`=prt|Bvu zEEr_ivcZupGWkJ8D5-DT1=Zog0XpfS0^9e~`G)nzYoX(_g^v6#j4fc0-s(HbLWZR< zrw7Zh=M~deBemBJLuaI9nZy3^P0M5*b@JNpc%gVV!iIFA$@=8DT4$GD`ByUVJZH53 zSZ&Uz1J6U=T1Kd1S^T7hQDkb%^T+gl3$t#97W8FhEPJ|Kxt}x#7zNL|*HV^dI2Z$_&S3kl zhuC`DskTu4WVwOPE8Awtjgq3mp9&4_RBnQnqbBY(QdJMXjc#sh{EHTqVE;>>0H`3s zrBghS$zZ$NH;-{n6|v)oZ24BWE?m9u~HRJGjzjwe`_IiL&} z=8YRG=-d2(aH-|++I|BrStG~w;227^7!)_&MWqY!&tS4t;*s|~+$ITPpDj~6*97hh zU7nG{KrfZ~OvXEPNKFJ(J0>$=ta>g6Xm7`h3s`g0!qQdR<0}NHgkrZh>(l=fATcR* zevpOL{cfk&jU~tzxphxy`3O+To*%M%Neea}J~MKS-&t<6`!cl%3_<|SgwS{YY3^Te z)Yn!`r4G9fN=!YS^y3Gp*DktsZMz~5x!V{zUGgka{4Jz}_x7ERg_BgCP19QbBcIxq z@2G*-`*TV(nEHLg!l4RHtl1g=$_q%jXq2Wh|PXsyVa@yCZ=dFNZ=4 z9%v6>bC`S6-t&lJ0w$%8Msr2B@Bfjh;cr00MS;udi}VbVIUV`BKH6O9xpwl_6!v}) zu)2?~n?AI@WBuj0^~OEI;lX^)WHCcbKVSiQ=3mW|go$PEkpA$LtZ%fNkzRe@I7bJp zR-`5cuq;Y=4VR1%_3Y12_GcHm2!A78$#|uCVE~dAradinnEf>|56lx_JQvIWY5vwHpu3eqRgP$ zc)a=mDrcOBr7GMKP|sDw7569yDRd(KrP1OKhn#VX)eD=pxUm1K)ckf12b}c9KG#pt zhOR_H3#qCkKwdqzU|#2>r9?~vm&)Zmkjk$+@Qat2)|pJ-^C?N=x3 z#^vpdUW(d`yS=xxnWsJXm8r8{HDK$xeX-$@G(f}m=HtEDpR8G9E3>T&!}hoVo5`ZQ zUDaJf8(^L$w{G`m39*?)8T-&W)%p9QuG0RuWc-?E^^kmjVOyEF5y9sIxn%W5_zr>Y1m7wM|o zHv|o!@26-MQ=HQ0$+WP|N>}^xGslIG*zw$31RykvC|;XMv--fSFlO;uCf}-2Kd{rj z{5tl<>Pasq4?ijLbAfFjb`($>dH=PCbFob%NSTl#!6qC??F;IM9SMI~Zn3xs>git0 z#9Sa+sANRxnQ#P zfwrsTT$$_n94o{xPFnZHK4pz=&$zO}r}=jc543lC-+hV+D_@mn+)IdkIR+ezUc{|8 zeM)zq!@6JC6tgRea!lxSFq6s-_s`-P5vGY=$i) z%{_DHbY88$S=)=Md#@QA1N4FjJDgG`E_ zymQ-|7(MH%PhHd#8addl+T3PQFHPjooRhE!A|Fgv_Bm1bHCp2r4w)K7@kN9DPt5F+P?k0WUxB4#(nE48ro*0LY7$^OOvsBOc%?KdtWrI8d1cEd0vii zpdUi8+VV3A!*Gq@%`p0c^ZSeyvG*L*pOTs$FdOj+I^0rJd6D)7RA<993`K)B!Q6=E zM{Z+snT!0&)coxBz9p-a2(;JQ&ifG%ZIO7{7u2l?qq^J4ogi+6J{g7M#1lVYV50tx zV@=##;oLWd!u#pl(gM(&`>fOI&!KM#YJ#^xf2YRznYf)^XT)VP*>6?nsHWLqL=CF_ zq-8~CSPc~LAY)4;E??t`*elyrPO$1KEU|yoz6cpO3PGEFXyP+LR?+PgY2dR1l_3Vh z`8&^a_A0k#KYtsj84lp1b|KnwO9R{I!6CD*=;5*G@ zeCVbtI&!66B^AcUFOqWOF4HTDXMhknW*D#)l52B%0QO1;uurKKOLwLKB(A~=uuL0M zra3^cjmQIR_>+-(C18vXFecN|(w+zUf?>=`0az&HvA6&bjY|R@9(6xwi-*GhFBdRy z6KRJ4>s)44En@$ugrt3Wq8Wn>K%*(@D(v321KYS-4adb4HM_+w?c~H{0(0$dvP#bUuGUR00n+^#U>?6)?cu6}IwaB{yQM5w%BZ|5p`*}tHo!?=U3-SzVC zW@r3g$SK>frM6)8(!*B0m1R#4YZg0iRCy`kglESLblEcozqT^^*i#T7%B*y%(Wr#S z7^R}KUMy-DN!PG+w9gTG`KR>S>S{$^)4KiH4|$X2ht=e4&HkAeVOa&Ts3{U7kg}3b?#-?fq~aJM&zVA$#uJ<^0{<&@*qT@+^MX+i;^9iwV<= z+k@91v1V%K(*x6ITZTc z15V~cwicjY(sTH!oyQ{Gc=!8x@3g`{)(gcGhkupD!BXnG^1kHSv+XXyA`~6r?HtQk zHWQcT)pt%D2CVY!kFPI-)|;LsZtOR89#|jNb>hB_C<*5?>J!LO-yX^nkU;L=T=vN! z6Pn}s<)80<|F~B-TCF{Igc%p55|Rt#kGCJ2NMtru?}em4j(dzWCde4P2v0 zR4VgZL+Y5v2GoHh{|1}>-a%gYA0HogrdRUxLC`)Q2d|QnmX_x6&)^3&F-d98EJmo*F8Yoa&BavhQYGv5`<)m0#v2 z*M(#Tw8%SP>Mpv_7^*p_g*CHK$w&sYMGJsRcWv}sfy@`*4F+R1h>u4j^dPyE+e;pnij~f+YI+Il2X)nm|;0L!6!lZ06sa z4|BHAFD8NQJgjQ(C~e_Z4bKA`r6*a%R^n}hLl*v-Ro`!e1+bsb^lR(vks3rKh1tHI zVDwh3n)i-;&(t$9VZ;lf&%QrzhbraqNE5W*j{-mQ-%RggZ41bx7OBYv%#sh;hK(SE zC$#j1N21(ZI+L*)?0q+YDugzh8mcw&`>j1UCG8#BptqUPNZ;$5KxoY{|1Sd~N34JM zRj8zcL*x2vBx@H^5I9e5_R^9(k2{ZV+J`3Y#^>WojPd`ANBPL*V1-UR?sC3sFWl~h z;F@Va3}C~I!?Sow4P()($SWLh5Hp@I*@iL<2HCgLca+ZTo35=jzMwa zO5r0(bM{66>!nOQ3i>%TK!JGjS4qFSOEI7uI;bGUz^Rg6YpA*dQ38f5>?Gh)9t;Wx zANfxwsfgA*)e-#gRxwQ}IE9_!NtVV4F_eNKyI#Ksy^;;EPlWgOwj-z;{8sPZpSfau zXbi=BmiUuVpbOp89Zz>(0HV)K;XV<_M9B`fK#WG1x&ur{UlYRZpnN1qdt_g*>;;bn zavfLa+HwbQ6XE40e80HiLvwJk|1?0e?pS#fBF{HsS zkgD(%NuNizfG$IUZBBAyNFf{--EkxzZuycD-nt^=95Dnq6^F;j(C@|cZ=r`jMDOX@ zsbS$QeKh)_07KIFyMw|CDM4*!!jSHpgcZukUTND0SWJbCm|81BDv zNAsLN0-%ubX>Klo1!#-_5$MfN(#L{>@Nx5Q)TRU6Fof1wj$RQuf&1>BQGh!k7;1_y z9nUubc@n7(5{k=|A#eVNN-d_M?7zr|d|sNEXi!Ue-)jDWks+5%JzU`WPKcw; z-hHt9%K<>|{#QN9qsN>15h6Vw!obaVhtL2TNnp9!bsygn@O0}sSHuR?6NIN&qq9CE z1JPp9q|Oq}-VCY|S<#FT=N#e|Ai_@}_K7w3z6)q#b7ULMw9ixUG{YMP>wFPK9*kLv zBQ!2Z5a3{~c8O>2Qv$0;DIxXuREcUqFBOxH?re&{-W0~#uBH!DK&%XKPYE9QVSj%H zaY2X(c#JMMYs&3r1$0&gW@PbIivnc^$65>pv2Pz>8NPUG} zYf+d!CGsg!RFOZWAJ~uAsBsF<j-I1~IK1MUIAzcxBL(BWYy0^_J%qwWV z&RKAZR47cJUlV%Sl3u0`^m0Zw>Kb@BA_UkWmfTAvl zrS{zMhkAvM6R8=T*96=#HP4rys&!aT#9N>-&*w!v6HcF68CB|Wd-;7qiayeUuwR9#y7uz{kP&Q9+p z_lqGH!Hys2mXtR~ppCrpap~_n-#;lMd$y+$<=UIz{iBii&_vg0XIr z^h&eZoZkHU5a;wDTd1nLHL(5oCj z13{kYFeAQxvw}*$$Jml?{vG>RDTezFX6CASdiV9ZuntT~te4&^T``4p{fRBiD+LsN z>xp60(MTbyBf!X9ok#zak_1<>!$U|CAc?}$>{fg7q|o~S$gRI=dy5^P5~V^cT6<9t|9FaDLhjCtVbu&(5j zTQ)dN$zl!nbkAU)3b=5sncp3ztlh|0;I1nAHU-Q)$z%b5WxXYz0zpu?*jPm{47wc9 z$wX5T+oteH>-NH7k;x7k4u_ODzc!K!$;>3pa>h-Fj5e6YhUGHyDO2YmrCEkr_=?f~ zIUg6)gwhO@p;peC`^xL0OQzgT9E2mp%Ceg;XZttE$ougdwvl|1pEF9oC6#Dc8n)F< zEAM;`yYr5#&Nqy3CcDjw#1b~Nt<)Z-#IPCA?~+)e;Tk*PKpPTT6X?nzQOJ6g;7Lw8Y72i(?O#=;9lWmr>;`oI0DIBg5?_#>;7xXCWo* z3&bsQfxY=4K|(}YY7PlYK!J#nM5+uulIE@oGnljnKkN2taqoN4ziJ*qn=jRIe!mq` z@8#l#V*9^Em&Cq%sD1#iWj*~HSLu-m;PNdp6O*gj^PQ_;lf{mX)rf`*{6`(t>$59M26KOd z5_POD|7<5o6@Frt4`_PmM>prwVChi!G~n*txgW*(UcH`!u&BXD*qP0fo$jY5i|sB2 zimyV>&$qX~bEZuX|JYI3%UfTZmzvDFD%(q*ZmK4W&M3avnMx2jJFb4%P>2<_z(3jv zo@@>Z`WxbVu`^rSixOFfTSKK;=&Sz_jJOb_^EAHuQT*%ll?APEep{LAtNIIJg@dlt z&w~Zl)(=muLp_&>5HAe-5GKc?!U?Ew@oB30LWfqZ=!b+V%J3A zBGrpLa9&AyBwjW&QhK3p*ipR@tnvHOSF(Q6)z9}Y9-({>5^~LA z*=85pd965QPBwcZgFkf;C8P(WkaRvde_hS|hajnzsv?7@F=w;W>jEU%A<(iE z`g@vh@q2v!=2s2NtJ0&D?TwCemgDcI)5F3hWOZ2wA#L9~zkYvk&zgvZmCSEvV-$A@ zb9q!RZ0BK3dexIG)_QSE)p}*fv9-+*JL3@Hdp6j#NW8YOv%4G3dpfu_5TbY)7pwaD zamZ$|#E*<0@$o|PsM}U37fmC!g&9bpISt~*)CX5A=oBnre zizJtYP2};LSeDFtk9S?M7{HC`VT`Ne?cJ%PR1!<9xgs3Q`%kSguCxp*VqgJh~EqI}s zVl^AWUZpj>I=Npm-MW$TFkp|shL=1eYdRHO$Q{_Bh6=z)zL(H;ZVs#t9C^Ow{H>8K4S7HFqN6AfX82jM=asjt*>_#VGQ95a@ z^KYVz|0QOV&Q@2$t0$w~#qR(nhaW0BrR*Vp`p+1B8(0Sk8$!Wtb+|0kRQNfK84B@q z-yf7@P>UcU!rqVCEMe6fQb0)3El)-Ss1QBK)iuiUrAY3&eNKcK$e+A6uvJT&Aa=9k z6gt0+0=aSRz8R17yQ64mP{{yu!}Z631s6V2=tL3>pbEKqad1~=M?20;QTM6YC{p=P z{%3^7T$iRA2OtPY;APS;E3XZw*MsRVnIjDC6W0>ly6h`Qb^v7K-(yP7;{dwr$^a5+ zBCCBEhMm!(E{Ov*lGT&sNBv>+n)Da_`tuFjKd;DrtGVE;uVvR1{zS22ASSxiHp~B6*Be55TIv@%=B{RgGSB-o8PGWACxt}7gq8b7~ z6Im`%fPn`C{shY9KO^yhC`AR~_Rd_SCK4>;pe5_(;=YY#D9wJ$@M9?6^Z$*UV#2tA zlknC>2Na>xvPkdZ*m1uLGkCgj+R!H-d#HJJm`6>#v}BqMdsdWPAtGK_K+v2${yIL4)uic%Iy+++wJ*x9hO14IUk< z9_v4o%uaCg1l{K*&V%kZZqvx|8zJd^Tbf{O3K2|s*_;We{^b==i4vzoh5S4{4!xU)@0b4bBqlc3 z`rb0~L$)s|?K1&j#>Jhm_CnDs-*-t=2%89Fh_RKk2#S!WGMg$!6+2^uZx^*TE|z*p zVFOtu>?f=Mb>o-rt8~(m8mBP=b;Y<1P#vV1GgahDJzkL@njf;Vo%= zh##v`z{p^kc&!qRG-+VQ@WXm8G88WB0q~BeMGOdymB}cg7AmCgUZMdXVT~rR%B&T2k_}J*bak#%xFPAxzd5HG%EBQX|Sgs@*4?0gd4`4tM$0H9=|? zFDqPHv3(6?mzGsm?-q&(aHISYw7m@t3`D~?Rf$xR(FSrIkE!eLgqg@GbG|c1nAx_Y zprCEPszhzVYSc)0D>y}kB1rh09ukYF0rGw?d?%^-k$-J)v>0(9qGMFfeh_1N#LRKb zwzesr8n4rKMQ#33O&wD6FzEGw=Pt}mm%8ckq5b(QK~2W2+U#DJil?l#L5V(=*gpHx z@yEmqxne~42x7^s%O0vmrBm)lzs%UN(wiaZ2Z>sD9l91!R7n2prv1IB-;EOjB8Zn^ zO5#UujSI-1hvs68+Gvm_ctO{Kdo6)s1{F;5wTsmBZr(Hdbv+YR%M4w*I6GHZ?m!cT zj%-GLqVJ=Yu&IYk;ovQTLzvQ8)+jAw%>Ws`zS-BoY2{n02806T{MIm>7{+U5uKFZdjs8L4-e~X=-gT?jQ78`l;DSn;yvr5$Hl!WSex-4*vRaY{ zGDda|-z=TGBMSMJrKGkb{>P8o6`e{z5)7C9`=b$54wC(tQDMSRV_5a!>AH^AR9By| zOY383vlhr4A4mlarGsy2+KZ8f!1rE@r`|H)9n2(4p3-}}=)(66Pd}Xu+!n#YB**gw zry6IH&hxRjbFnz&XKhnNVv)aT1Uo|^->NKrZToYJr%t2yyI#2DOALN3MC!etX|KLZ` zEuceP=`-c0S<%}E^9t>O`xwu85JMIOGcC2s)YD62Rp|I9-ZbA^qr9i)F7*oRa{rk- z9Z5;7dAf#TTo?`GiZ3$GMkxNBIFKDuAJoj9aLEwPaxvh?JyW$v(VDSc6;z|_IbLmaSiL!b>%IuzzMEQq6mWjhP-K~nT+aea?! z@ZaCIDR`}si6vT0AyXBN<3>%YKg%HiQWE-P2p@VuaE0pJ;1E5;iwqw6;(=)`-H=)9 z&zD2ulyTrEqo_oa_XJ{7F0u4bIGcV9Q@v%2+OP@sYZXB#r}&@v-Agt#eJ`a@UfaAJq6%nG0aTzu!4ZmA1; zDp8ry%W~ z(WSkEC5q4|{!|yGhY4L-Y+=3)@gnKRvC1``;hzz*E_zJSisSK-4uGz~OazPeMZcd& zP_BYtcZa+J?g34tublmW?A@&uznw1{Cuf9i;?5Zf^DrDMMsG9xj#4IkjXx1M{B3Z0_&e7hvo|e)gHo-xdO&+&eOxu1D1VB;-Maab zl2{6SI7u$)Vl`L>&yO%f&a;;Zc!P(ZTIZmK`w9OwbtQXgE^-K! z0eU${bMyYuK1{_zCl`~g_(o`A=EZYxON2NFmV!V8aIVyu=ZM7e*f)ggv}Z)}<>Y8+ z7x`TP8 zyyqSLMtc>0Bpuz!8G^jq>0mzkk_A5ezRrnI@2(yGT*UXkBI2obpx7ua&JT`0?3@&V z%O;JSI>>>FJyx_4&``4wXvo?}l)|DeP_ywlg%U1PvoK#1U4vD}!`R`xm}iH946F>` zL^&Zm5=bm+{iW5=&G0_%%`j=e=~FTwn8c3Hwt20t{%m_Ec-#7(o~)wdg6o`2ANXMo zae{=!bW!8V;ZQD+DuK_Oy2|}wowtlGgl}1h8r1MY`pHuG)#17K*eUM8Nf3^~{=+vf z@fchG{kPHf-E^koo1UsG%b6vhQT zL<#Ij-MF$cF|o{ox0>6|Zt@5fySuwC;e3tLy}M}=81R8*(3G+gm;Q>7K5ai!#t)Wr zVe5>~$>M8K4@girR%*{!YKod=>4Ww~Q=mq8d9f(;7 zWkKOCqbdwYaM(;y&rAx-@J6?6%Q4gll?uzXe0jxVVHX+TQ(;amFfKU9BYexaU7&!? zS(TA+=50+cz9mVrblAZmcK+n=kHMV{;h5EnfAw$Pm%GS)3i`L^e^Pl=^7pDL=s)?0 zwWm=j@`$tE*1@=cE^W__fAj`Lel9zZYO20(Egcg4`@4!B6X{qd!lLZH6U3HRO$}EkR<&J9Y5HI6 z!{d?*mOgcKT%R4DZ+Pqu`X8JuF82N0IGTu_-`TuS{P{TKddXnsV&^!^;nm{H4dLhx zyU3ELpLEU~^AOs1O;A;mOU&blNkU?nS*}g^JK@=<9tScBw~7fuFp2MHs30{d;ZZgg zCxg0McbAXOTe#!MLyzQa9}W0kNLgoEbu_!oPkPE!DEyPZoZ9SV!%C&QGYJP56IJ2d zqQxXqg~C)2&klS^Oy2myhV#n&;9lqDn~%^{z!nz3AYhAeD%HbaCZUS6bggpI$BU+u z`_YTb>*5_&tkrhGnWv$0dudzhn<3Jv(>d6;9NdN-fi_)yY|9Fh1x3F?mPL}6C@T2O zi;d~obJyxJmE~{O4TF!>mQI$}>zB7{?LfhqB9UW!A7IcgO!?S%vC{Uo@tEr;xz8?v2R$+i0@r?++{mP-Asduw4F;z42Yn zrcLdNWgzu5=*zMKz$2Ve^>2yP#93A|aoM1#xb=(?dB<;Lk^I)2vG+O-5Ed(he^Q&~ z7>+i%ji?Q#KHn)@Ec0kr z3LNY`e0A`%No=I8AjtsCi;M47!8%b=+^Xqw>v{l42;4iJ#D!2ct2(u-*dMxoC-dh8 zSuvh2jt@GG;E+VVeJts@)XSoUHhI*xviSX{r_bY%s(*VuZAYO-SD!APYX5$=;qbgH zBGG>GvYUhQv3O`EwL0YyIXRAme6uTp2g~^dFVZQQWL_}t+bd2O4ziV}AeOak9d6~oU zKrgzs(cU#%dbf?t4>p8v4)M!tx&9;SiFLB1;0VKemb*CB^-jHR`&H}M!*id@)Se;& z1S0Fx(>+^0qt|EoW@5poLNwV5xGN{G0>5cFeXapcATIOaRS>pil4>EwYNQm2#iWl~Y@(6C2p{4A z)m)(Xh3c7ml1ZTe&&p=+9#bBS?oub8u`Lw>{6fF@^{h>rXl%qRYq(JEO7fsFeGGR%Uc#&Uf>pFuK~xywg0GhpV(<{4*heGD zVU7F=j|v#+K?08Kv-uhY)Ij1Z72E_lhf}4xv6y1&vfqflE8<}&C~R6cEGc;54mAsw zrK~r8QeBb&4e25_h4~QZ)VpagA;C4N_?9XOX2OT8$#8Sm-QT6;uM(ZFlQRf{*yA{KR_(;)!sG4#lY|`kQab zs_4|G!^v=ka!{8e@)^FAf5RW63_(qbj5q~Uabc@l?>+4=yodRs^5E+*{~y=PQ~BeQ zUH3nhUxykHW&9T;8WROPx%1E+z@#q~pN(m;6@dQX;vd`-fv!;FglbZwghD{_pOqeZ zXO>mP)_^iV7U1N;FgA={&B7~Lm>8%Z^yPESMxXg5=y`ammYrknVSh^&~8yuZ%y((zlZLy;2vu#%# ztI9_M*=p=9#~uy{O#OeQMf8h@{{iO}+*%A6-#$XlJQT5+#JIdf-H`a#tq2cw!jpi; zZmOD{_a!h61d^SPkfDV>6Jx@;Z@-xb)FzF=Flk3R6fty&s$js7`a8`{{2-f;R|nGa z8c4MdmUS-Q99*ahx-B9b}F-`8kk687V zoKd7RR=R+=k_J-7cy^A@4xMEmUaB`3D?qYOY0CPq+=y1H&Nbpa|BxgNxBIALN{djnz_G>`pYE$~4}S3BU6ja|d{o2mWL3 zQCBZJ2M3mgfo_&PP&Ml&LZ!&B)kB%;DJ@`bkyF5*8gh9SF-YV@?#G&g?m`wcV3HEY z#(R^))F2Vr;QNwFTFZ%JjzEVuvRBoqQqMKNB(^8QLc}W{{FB`C4yg3cqR?upJm-^a zf+qoX6l3306;Z*gEDKk5Q@B z8)JQw%vjh-4hdu4P=M}~hCk1|2QWvCZSygTpN?WqzDgbT-4(Pc zXK5V%NC%lN>lCnnkOYeJN{)M&_t8l1D^5GcHJk(tyz~}xYJz<@nW;<^Qz`quS4PsE zplK=?g9u3yDFc4*n#UVCSNaTBn0`SLqCx0cR_kZKGJo1@Qujf>f<+Oe1W~Ma?%4OQ zq@rH}n6w$^BC7Q6Zq`kgt_|-;iBy>FUOo|YXBLZ)``9?0ZQcXUlYA5FF8Pff;>fUK z5f0{b_*@H)z$H$onIoTd9k;yYA!P9CPlZTzE3L5VJ*}}3lD0>!F-X@GlYXS*tQ6+Z(6X@-X^*GH+wkYXs>`X zI+{W*E-Vc;)3EL^zAb^yHAj}Y<2WOL3$a|58@K7YE7nAF=#;rXHI)5&f>q(?t6_67 zM`Sd&y8?bE(b^MjYe4~3ge}Eb?~7hZhI+O8dFGjbhA^1@Fm{#6$I7w#lWjj~{3+1` zMJ?n5#jja?YZy!fm$7*bO4xd3I7aw~v8Yq9uoKvkEE$Hk`+MdEsi^BpCf@FZXgoDC z+9UzA`&*i+myFSSX$G%ZZK?We)7z~YnI4Sp{E#XFMFGfoGE@~5+_Me3FH45=>!Ly} zoJ^T_(?DTp;w`Z+w!+z8F#LjH$ARMN)QN-*XjBZiRb|R23KX0k-Z=5&D~<+wBYhv` z7T_$nbVzdHRSfkQV;6=J#qxWPwbIsT$`6*rA{w4(*(bm{?`8A^0eyn-tz@#HK#UNv zZXG%ml3Nv!CFAZhKu(=lN*8C;9H?>^3+F4R&ZScaQ@p{HzLhhL)L?nvxw#gOq2>6VkQT8 z4!o4JFMC2qzy#Nc#8-sj+ktcx&70q1+_%J(c)cm!M7jKZ8BlN3S-1C=2vupXNvKZE zu6R?|KpO2qeU3oEs(3$t^h+qdrmxSxEZKPRi4T7R0hkY^be`MfF5O5ZwAphjJ}d;6 zw;m)8q4^>Jn3u|nP!I_8?_X_}D<$v)dV`4}AeL_1htlQR^*{?qLq%7)N(mMI{{T)> Bn9~3N diff --git a/target/classes/uno/mloluyu/characters/Action.class b/target/classes/uno/mloluyu/characters/Action.class new file mode 100644 index 0000000000000000000000000000000000000000..92cd0635be9b22026efa161283badaeb15c14aa7 GIT binary patch literal 1275 zcmaizZBr6a6vzKp9(I9MiA?h;O-%t!A|HAHO%j|)z-AVi*{L_{w&^;sGz;qt-=dFF z_(G>9r`JuNsp;GcDQ^m1aPIHkbN=@{-2M6c>lJ`4yp%A&Fzwp)M6Ft{x-B6`Y$3-mQ}}OeiX2}b7T=I59#qKRpDC9! zyZf}r=Js->EQ9A&zD&p2T!tW&D;*XWDw)DzPGy*V+gDvq8&%7;n%g84ja5i!xBlLg z;R}LcM8O@5(p~AU%V@N4Q-|7gEc-Z>k5vNXdsl%Eei;&nNd*!InZrE=GKT<%`w9Xa zf*ckU1UZB_EGYK|K_UT+@` zj!sRZnacOH=I<8uhCvc(9DHC{>kaF+FV<&7yri^(XV_xc=#Ag4>WxOK=hADzn*#V# zqbC$p>#k#%dlqk7sPigUxffNXTF18DbR9ZL_K5Mwbf46=Q#(nTkcYkmd1suDA0SJU z7nX)DEX`Y38nv)AWnpQ+KzM?WmlVA8NQMz6y<0@Ti23i+H!v*{@m%2cImQHxdj(7g znDPmj7BJ%%Fe_kA5-=~|fh=HAKs4O(i-o1{r0!{BOx3(?OsJZ#jcHZ$w=t_~QXBKC zCbzMuYGK-nspnY!LOBiKA^p!$zC7zes(XSeS)#hvX)i-=yn!_-Gr;+P)`#rKNchMbG3V)>b~# pNhiII8oN#*KriTdS0he7{H|bx#V?Wi0ru~>0c;D+7uXRt^9R%-1W*6~ literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/AdvancedFighter.class b/target/classes/uno/mloluyu/characters/AdvancedFighter.class new file mode 100644 index 0000000000000000000000000000000000000000..8d7e798dcc6fdfc67180d3976e1680f3933eef3d GIT binary patch literal 1733 zcmaJ>&u<$=6#gboypFvkt>Y$cA#Ky7!A?vKg#xMDQr8d~>ZAdigr;03>#4oXde`iZ zgM8xGp)?YzKpZN#G^bQTLZT9`+EA`Y{2vM71ZRX0Z`ZDHoS4hZzIkuno9}zy+h6~A z^fQ2Scwa#m!&ud{l4Zj(s#p5A?3N|nVTffryrb>SDXL`hvX^bwJLs8QO0F#j5k^EoKg0g^AQcBO zzz~vF*7{J`8SYT7NG!e^m7650;t&oq1WMc~xd<72vG{ZV&oC%XMQA!V+_)nuj^Y^A z7avr)L3no1bY6+ajKEd z=hK080X1>3%$G&RGBqw2bV<~j zj^w5!=En9C*k0W^hu0L4BKy4-@2s!lf~!HL;y%eR!^Fg77+sij75ci0{jN9I5KF#R zp|6Rp7E?Sm!q|GZcLYAz86U1fAD9F-S{ii$K zT(Oo#b5rGOp)P+k<+C}_4)Bu0B;k1c5L(Zm)k!+*nYgR_4UT)&5b{P`Xqo{i|6;7U$l7M zr4D;{HdpWccI)BR_p4j0A8&v5n68l)r%jV4&)|+D90l(&oY=+IUicL(G93B;P#TX0 zSs13C`$%!1w$r4+Ppd-Kd9u4`_m59JK;Q?@AEY(dIHgDhA+iUWwu*gZQ9PbPALXF7 zKgq?S6yw%do2cW!)tNd5zw=_hqSg2L^o57CkMwN+`3vny|H$b9+Ea<}({&7egSmBF zPlSiP?}>FRCc-1$w|^b8CzQ zk01i4pwg;hj^Hd1pz8!jr$1N){rCtGd`iG?VGwr^#kV+&yBKPrV~uV$=vc!W9vxGZ z?EnIQBcUK13WcK4=wIljVsDb83zslWdxY#O#N3>>zT>TV%#+9cM=jtguHn$XKW@(N literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/Alice.class b/target/classes/uno/mloluyu/characters/Alice.class deleted file mode 100644 index 3e5e47603ec70205bd06aaec0590ebc82267a4d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2412 zcma)7TW=Fb6#gc0V#gVXS+3!dkaCL+WE*oQ7;uxA7#s*mNJ^lW$$GIjS?{{*HH4Oy z(iVCb?|rTOhEz3bg4#-`>SO-^f1naSqEgi}ySC#hM2alUo;mZK%Qth*@n8S`_5wfx z-v`meu)A#8YQeP4^8K=^<%J_OS9eNk(lj(ZhyX*^8iLrF9nN^^aJQ)aKGef-OXlg+img?vwyXUx%erKI*C$077Gv=zj{h%QVwPbX=465}{5Pg?VyTB?q6^hs5_a9yFz zkJ4wJu3y zisO=pynJJHEQB;Y*j%|#ROKR5y~2^Hr+UrOC-SyiPgOd&%5lwekVIQyh69PGx1%!B2ON%!6q*?UqOk~H!jYfJx(O<+JIM#Yu^k=QL;nf;u!&}p zf_`kqo8AedHBS3DeFHdFkN!99$ylSiEH7fb zf?K{cUBPuA^dEN`TX2SmoTcOk=sC{OFM$*d&@o)V3@&1pX59(}txDlDvZuoNhmHfX9;?+e zUS-oAdydCHptGJ%M?IaE=4XLt^-N^h0qKSa-3<|%!S)c~OMF%JuhLf diff --git a/target/classes/uno/mloluyu/characters/Fighter$Action.class b/target/classes/uno/mloluyu/characters/Fighter$Action.class deleted file mode 100644 index f122b8162432f44b21b8bb5d49b02b01da72d4eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1724 zcma)+ZF3q`6vzL!JS-14WQ!VY+G@3F3p5s!Cbg9`hVo!&Hl(_Qit%AKxF(w+;K0(E zd;vd*pP+7Ew4-Ck*M2C+a}G#&p$@#@e}9*I&OLkffB5sSUta@wi0=$sP`EMd_VTBl zUT1hV%(su7zSH*I{vcoVj*e-uRBZcRuWKNzkUDXmIr)y$J<3h5HCY>baAWUTY1*nZ#Z9u;cYW}MExs}Vso27}>!4TB-Zu%r=Vh%?;Mh%+P@avBMS zB*TXqNe0dEk%nfNW4Nm^$B<&Ur;%cqXLz77&tNiaXqXHa89vpx$dG1uq>)CHS7nVi z@TS7N<#pZq@bu8_H=M(ctB|&OZKu<8`W~}vCJ@3Rb;LjR2GoRSPG{)SBA3a|+TR2$ z)D7$^m{WZ_8~E<2#vaHNai`yR&f2{n&p7c^clQoY+_qn+{mT}0oQxvn?ERonm<}7i zl~o(@G*Kk+dJwy z{;*F!J($YIp&K*SxJh^DTDR-=r6_k`;A`^R{|_O(uhA&exYXT&zug=7TPx&%5d9gX zwl1+*0aEg*C|OjL+$l=N6eUlJk{w0KiK1jeQSzTCSx=N)CrX9`%tf{v-5913cnb@3 z|J#6iL`)x*`VFd;ekb%2mtNqiz%9GIEDhX|_lf(nuCrJb-kR$_alIQ?M`vpqBP)jbLLf?zr zJDTh@8t4<6c@I7){Cf6km$A@D)c=yuty#Aya-U`v-pm@&aPy diff --git a/target/classes/uno/mloluyu/characters/Fighter.class b/target/classes/uno/mloluyu/characters/Fighter.class deleted file mode 100644 index 5a0857fcbf2322406604f2555ba6c4ae516cafa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11445 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 P?cKRtb*g=;8_WL>3i5X) literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/character/Action.class b/target/classes/uno/mloluyu/characters/character/Action.class new file mode 100644 index 0000000000000000000000000000000000000000..7e31320650a0ed02a214dc7246b8393790886b99 GIT binary patch literal 1640 zcmb7^Z*vn>6vm(1{Mlr4n=S#X6i^g|CRAcei)hl?CE420ZHsIgSbepPv1}(zocv*? zU%(IIC&1+ejE;=2{ZJ0)oP;!QoT+({=lpKYIrr|l&*quXH zc6Ue~9qc|P*|J?%!LaLfyRx%9iB=}jy-BpH5ZkWR6_QnF%h{_cq`b#YrDnTS_dcY; zMAfnD+X@+H?_l?4!*&lGPoePR|2Sl-+-!%PaIisJF6J9_&Pw;ERtgCd3JV%naFvcx z9;eJNx@Uv&2EDLzRI240Y0CXrBY|WJ2E(Ts21APBrbdb(&2U>I&0sPVG)#sJ!xtJE z2F>uLhGv*$xTi78kY%{9k!6@;_*!F*!D1+DSPT~!zSX$EkYjkLkwcQBs>VfJQkZkY zPHS&?a@gwCgTr=9A?J3RLAw$3LS|Vs5yJvaWbi!f(-2++?O}_8rN#XDCv3vSo`GEj zYie?*{Xy$QV;^LUbkOSsr_Js!r!7CF%V&kF0)W#el( zzf<`!>l)wVKw)jVQ>7jB`=zPvC#}yOh2IYHy6JU?y=H4Goguby%p_0(Ll@Zzy+O)Kg zZO#5gCyqt9=K1jm*F8TG;fCiYBi!G}IGeU_Z z6JdiyN3gwDsQgYNnSn#!3p_iT(JI~2F~z^qE&WCld`Y*rC0U$Fe=MVUVwu+YUX8+? ztFQ6hS)(K+U|ggnHn1(t)2QLmxcokC!{zf4D*jHa@YXN$WA4VTyur@WOWBZ*HR`4& jM@W<7pNxAH=s>)enNx)~@cxGS@46W@q~}vS6ZPK##k@|s literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/character/Alice.class b/target/classes/uno/mloluyu/characters/character/Alice.class new file mode 100644 index 0000000000000000000000000000000000000000..e3073e00764c5345abe88584ee67c50ee3988493 GIT binary patch literal 2651 zcma)7TXWM!6#kSrvEwMjh&u(sr3KrBs4=uaoB(PP6N3{1Hl`%Bu#ttWM3!7xhS1Ur zz0xba@YJWybo>U>X{HI&c82Nnv44P{z>nxmr)MSG@l0Tn7wPPt?|kR7XZQT`-ye?w z4B@^XEduseOiL~rmQlG?k<|jTnd)eEd0CVdLsvCFd;-F&ViS74K;{C1N+zYGuTCnN zF#%F)mfc{o!OXmzc5L0u#|3l^TV~l|rjunxMGK%qK&))5a*^q#Y-?q!Vyjwn9E`^y zKV5kI^v+^`U#yQg1}h6_AJk3VIU%4m9LWms4O=;4TPL8c7I;WNRJDro49gi-URULO zZeGsYtW?m|vYe0QKsTvgCNl&a4X-RyWF^1rS>|5Gn3*%Qco5y#B_fC(I?eDJ z3?kVeTCs=mFq!|h6v=hiD8$@+$W0XiVyB@z2^fT~k2X)NKzDd==4;nb>q>b3?o;X1=&ImOhA%+aYGc?8Eq9LIow5UX#GGn3_c7z3*l z*DgSVvSu6az#vZeF(lx?>cOcz7!fCNiuyS@k{YEVuI^fK&Ef&PM&;u-D<`|(AV!ez zgGi38>iRk1i#QFs$DO=dDa$I+4Hj^6Ep_%{TG`miNS2r6jEJ*tmY0;&*#O1`Y`Dpc zxrA+*j@*zq@|=iC7kTF5_+$VVsGnvl#gfcFJj0BLi;Wo1nOeGFIo$4&h}T`agpx`H zFh$K&(491;AlLpJbw$J*9OYLs8D;ove*jkntoM3QVRBvIP$pug2^tH4I=v2^sY7Qt z^ty%95E$uKz;}_?B5g%}Dms+uH&2+qeI%^@?dc?1G_*PcLx&bNyqQs>55srD*#sLWK{*TkI>Q~dF}C*mu7O)phmbH+;U zev*b(+8sLlZRHb;&zn9zxv+(LC!0*`7f=Af-2)m=wzD2wk4NWZ~9F6{l@FIGnA#oA%uP$GVzT1fdScfeLVJFsO z9}T2~*g((XMjR%MNWRDej^Gvg`|xVryUYAiBtu(37w3?NQO)IOJBre%YDAzsTY{=8nd_%q^-6nZC z@c~L2G&a{^8+K3`qBJ3oQVB+}3u*L#VK*%7#cf1zm$dh(EI*+a4{)fdFb^ArdAD8| z{6$B_3!_p%?=4`uifK=}R>gTw(yBP^NwZZ9dD5LK4tvtADk7fraTPtDG*QJSPs&!& z8C^hf37=i!>9o@6fF@ffefz09V(!W9qQJs*W-&UkK}sxvWAvgO#}o$WK^bgHL9M0m zCD~Jd{Yz>eZ`WFrU8rT#6Mckle#Ev$INgnK+FBp@9yB81{R*6F^3c=dp%ubT0(^__ fYWy<&xj`Gz^>UULHy@8>q=}`i#vhmbxr~XbqzW`n_$k8IqYUkC#dRu?j%ItK|CUJ<(sLE=)6KGThec<_#U0PK!vEz{A zf$+T7N3E=OTlM+1XOjp$@0w%6WW2g7@@7)y-E8@?Arxz02g7A$S-5WU(~FF(ODDqb zR>#OO#}i?Em;1&*7&fl{BM>?t9Mi(blo1GRc@034>k*kuZRAp0=%6dTkPGpLUe-nb GiWg@I+Fv~Y literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/character/Fighter.class b/target/classes/uno/mloluyu/characters/character/Fighter.class new file mode 100644 index 0000000000000000000000000000000000000000..29f2886bb82f5ba945a8c6a4d4446c4b4c930569 GIT binary patch literal 6436 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 a*W1eB|Al{Zlos$meBO2D;XTq0q5lu-TWXg8 literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/character/FighterAnimationManager.class b/target/classes/uno/mloluyu/characters/character/FighterAnimationManager.class new file mode 100644 index 0000000000000000000000000000000000000000..627c2301f02d823b9a6793d6508a127aeb85c179 GIT binary patch literal 6259 zcmbtYdwf&X9siy-$xYH*z(Og(Rvs(KEf!k$=xuVFUPzNHxdE!% zbgpyi>>kdkI5+3!WOHs4g~DLN?gg9Ez31NVp?g36+~=cX-*a!8-k3jA_JzTjH6~E-l$A;OjM_ zam~!6bb)&dDK>P@s#9B7YSP*nPK*YJv`8!wHNwGYWM43v(vl-aI30|xiv)8jZEtm^Yl#M)j*QDa&Zu(*2q=opDqsme5Q~gj+LX8ac0?n|f`Mnwoji zVJ)Wb6cC~5K|en>7;(egBoM4W7j_MO0c~%Q7s<-`TB}+RkNw+ri`5Ip)c^Iu-NnuM1U_ zLG@z^>QywLktXlaVi{dJu)g7jIVX*4LRo&Q}4f%p8K787|N;JC`iP1j>6&Exen^wG>gn6l**??y_*Q z@>RiR($76Qlt+9-a?lmnTt8=J9UkvBQ${@6+A$zA`6_|x0+nS^N(b9gDQ(P;b}aJa z4d_s?m3in)Z>x6o8l%aW9!jKG0$B@HT#aiOIV}?D)U^l&4d|%^qqDfaqr(~GtQHk4 zxLqo?pCG(;>UsnaactJ#9V1q zCy4X(oo4EYL3T=3kEn_f7}DXgp7+U0WEIYkAA{H}jfv4+^`Sy{I}*<-fpH`iBm^#= zquO=X#Y)(QeI;0`A;ae7{K(2!Unk>uw9H(94IL2*H$ zRZjnrTE-w{o!r}aU~{WI5Li>VHP0dWr#{<~T<0PSjer?!o;`J09@NQ*R{O>v2YA0@KP!huBo5 zM|9SkbK*ZB`F~8sL-;tGU?ZK2%nUy%m5J_S^*8nHMmBTf5uI4PaW<&+CR2u~U#Xel zk=8k%jzvllkF$|r5Bqj@@G-rWhow~fQz{-}2$!AVh+z&TSfp1JZp-%^iOcB+Elh~_NT*YzRjlPvC?T1R zRhc!g<3bW?7#(N5d0Q#lt69EG>JiQ=5hI;Uqnh zJAwP1tw)yHX1G<0M`C)qj-_pPCh6?#vmK1%Xv^EUou@$&@*5oVMcRxki*_v*>m|-x z=X>xgFa9WaVHaM!z@zkq2OoRkjuWSEf8z9A$4)==P|I>5pmxOLddj+5$xD%U8oCPp z!t2S|Q_yIfA8!QR5se zYg7+og?!XDHXX*QqqwNQ#eHJEt8~)=1Oo1wbzO~zuxxcj(^0IR#JU~hrJ|wmYURKA)CZS*o;ah*COmd6<$xu<(8d0(TvMEqK1|| zyyeh}7PQj74V+z!k~1856bOZw5PV(%auV_|v~3iRP^OQx6JBDM$1;PjX$4?)j`K9HklXVUAV~d%dq9g@tj}AEpG^EA8y1=^o#s@ z8{TgDZyfKy&6fQ);TF7;Iiu2pw{q1(d6Mf*%%FP88ppet8#<-mhWBvwcJiTjsh`|= z2Y1?QcXCa7ejD5`W4?lR@iJB`c&~zq|G;+!O;D_0Ea99CN4vt4jqkxTWL9LUgi8wB zYk~LU19rr4J*BxQ!`Ilfy2dq$4@$R{SZ^(n10RSVw?d zf&l+*vJ#g$l&Hor|07F-5g-)ds_RO7}kpUy{U&2Z&8u$nv%qn?1 zcS?!Xuh6Sp>h;n6aJwEaeVprd(%Rl{W)fZQ(5gD8Rdr6QYCLRdCGU6nTG=ysS}nD; z`UE~{YgG~<*vlz(N@~T5GBkxj39VCb9SnF@Ni01=ggpwybpS4g@6%J5Xi)-+ML-lk zej9hL*wyTnkbXiAYIimJ0Q~X%BQMjlQ>CgvLUxy<=&aNwphh?BdyxRg0~rK zS)eW@$lGugp|ph<2_cHD1VRTvc{T1Q_z$8BPjgk~`MB+moTsPoES{sc=p)PL5*1UH z&*kwjh40|IR$Qm>Jr)2rcRyvt!9&S+&F?| z&Nufsw{xL{KkPv*5}b{Mk|sp&9O>viHc(j{g!q=;oX=EQbrOF0n#50K0PXY3PW|iX zkRB@_5@00H21Ej^6k;A9Kj&u&et}=|EphpK68^z@p2mxuTS}TZz4E8c0sNU~)?exM Lzu_PF7XtqSEzWJY literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/characters/FighterList.class b/target/classes/uno/mloluyu/characters/character/FighterList.class similarity index 81% rename from target/classes/uno/mloluyu/characters/FighterList.class rename to target/classes/uno/mloluyu/characters/character/FighterList.class index aa06a1611cdad22f54421ecf4bbbad5a90a4b483..48dfaa6907a04a2d53cfeb2c9f065468b4902f2c 100644 GIT binary patch delta 58 zcmbQrwvtWY)W2Q(7#J9A88p}#m>3y!CJKmiCTAoTB_@}o7Hw4HVPewrK@pqm#dI0~ D3z9CJKmeG~{MtQt<(@CdV_K0szZF3A+FQ diff --git a/target/classes/uno/mloluyu/characters/character/Reimu.class b/target/classes/uno/mloluyu/characters/character/Reimu.class new file mode 100644 index 0000000000000000000000000000000000000000..849947275965086558b8af8960ddb9c97b833b1b GIT binary patch literal 3835 zcmeHK-)|E~5dIe1v3(q*1X4;{$k9@;UDt*LC?x@UO>9VUP)f{?@OC+G>}&6Ct@U11 z{*}J_jh9AMk&4v5_g|`nI(v6Tb`Gj;pvF?2GmL+zX;SvJ9mI$2PrgkJK5amb}nYHyJXe@$j4?@WY!r$Q?%N0T2^Bv`h(CSOE0-7<>p9=E)p zFQl@_jauq*ZQtd6v6i|~v)!1+b;3|6Yl~ZZRuVc_gaaibR|#pQDy266Sw)iD%6A53 z%Nvlf4&U}d-br)X$jZyA3D<0{S?fqo;RRO-#ReW$0=)( z;pi)=a8ST3%f5KSd_GC0d&Ol^4ki`z-Cru+*8~_}4&PG2pj6p&!j8|^#17w3j^afy zd}QJjK4v)LMpE)nB^N!0^1+ER8M;`+r#O?xX@(02=GH{T#GE#nx7%%d`R*l6aMr|U zW7xdL&YAdP3|r9H1rsHW6*krz%d2)PR<4-%avY4czcNwN;M7W^*|@i&l`opOq@nEh z57yQ-uwdeH3^eUlO9NL;d>sRi?ABd_!t;%Z>!4y_(sexS^1bL(-=L19;VD0%;8M8V zpVpjyT8xTxakrJm;&;Ro0~vg4($j_B6}c`~clt5DsuyU*L<3ElM~^$c>M^iY24h1+ z(&bH0*E=JwST$W8ah5bP^a=tMP2$27wR!4YCX~_Fc!9#^jPV@iU(`EU(4{}h+&uPX-k`x-*9plpA7LsB3VP+PNdI=xRFTbhge9Y z@(|@jstz%iNcACR6KQ^k!JjS&#r#I7SFOe>V?;rX*s~3g5)-k-F`af5Bj$6Or)X0_Tkt?~(v+T2x7fE1m pjair*vp@@SnwV{Tm-5%?tK*X+x@FBWzC6t_mR!oha62A#=U?H;j|cz& literal 0 HcmV?d00001 diff --git a/target/classes/uno/mloluyu/desktop/CharacterSelectScreen.class b/target/classes/uno/mloluyu/desktop/CharacterSelectScreen.class index 1727893e0b4f1479317228fa167090f794273fe5..63af0f7f94861176e2b3be0c6f312b8b853907fe 100644 GIT binary patch delta 1322 zcmY*YTTByH82&yA6iQ3Wt+Y_Eih$e)C~_4A<$e(n6-A}e3e`#pREI1XV0@T5rrVjD zsAF!CFqTat*^0ojEm`7{?PX79Pg`Qf#{O9t0|9AfXJLlZ3__#v% z&C})20aWqSJ>9>0W~c%~qIHM!jAO9R<*ak}5BOZeIwmqn4?C09(P&GAjwxKHWvV)0 z$kf=mUY#?PMWirI&y7r1Um0?3nat916A^vFamG<_+UNEZbagfE)H9noDk^&8Kqm9_ z%x5|g;q!L-hTVhx0o51uEMzia8gcnrynPPOZja-vYq-%F!D2$&=JLJh9X=Tg4ITyP zC3eN*& z>(rDnQ?rW=YSEY;lF<_IZr$^`(%{gu9<*#DHU>C3&vB$Nr+Z|`JL1xzmK}PwBVC6c zcIeQ+4%K9;4nM$yT6U|;rW_tpE2bIq{stzfN5E`OaE7D8b~B>e2*)-UQ7ySU1gVkiS`=cJaOwnU zkXa-4qX|dQ3536wV z!4SSMHpoa(Xp_riW?Mbiqm5`oBw?sc2;N$|lOL$65b5xy6 z@@H4kOOg5}xeike+B#uSauw`xrmKdplAbEank;L*9mUah5 zYv>}&{jADPw#8`d>OpeCcx{mTKWSHxw8(m)+>=kPL8ZhoX%k{g6fVMqOJeD(V(FAz z+iP;Ym(htU*ejS5S22pW#FDqgz-xFP*D;G5c!YQG7&G`o?ED9}3CvQ9IhybRE!!|p zJ3eF)K4KZ}vK61Q7k&<6krP-(l^oq8?@b()_fajYz-(6B7adNjYqre9&)A6Hq}W*z zY+^G)X+aWO)I(dExm7EV6neekZ|F+G|3X|5DDE3mEXIJPoqq0-q1n$)RgzLvzgP4_ s*u{M^CW%mwun!00(O`50V;@~XT!Z8C?~Y4(^YZojw_7>D6ZF9PA7h3wJOBUy delta 1394 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 literal 3951 zcma)9>w6Se8UM{@v$NR@5CSAwNNE}fgoI`TSipp0)4IJKKX)S8CUYb_Cl{TBEQLI*p)?5AHH^2GCf50z3kHz1a*(+JF4?KI$ob$fF z_x_$YZ@&H7H30YGZ!&xmwq^}8GMhHj*|}^aq1k5~GZQ(c&T6r^rD=u?KWXCTY-CzZ zq|Kxrk0cWpBHradLd`guCBdI01L=mVfsLrTAprX&1TtxLPB64pP{vcLrN)V5N1}Q% z#SLj|r&TAOlF&W8N_x^#Gbuf8N0NIJkyysk9qoQWOs+L{O3i5Fnvu{fA!yI-xYJoj zPur1LISVmDano=tGo2OyyDBt2M;%o%X$3_Gi=<>!OedvTW3G+1gmuF+>NzzcghWQv z3<>IDdeTsxtVL%HR^A@+KGUj^jKmyEH^ATLC+==_S? zDqy=N7{);}p@mR`W(6D2BB7>p*MyAC64sY2c|f&Ov?hcwn(H9p4h8GbAa-{us6{~R z?ouElC}W$1o#iQU8~26Kjt(JqhlFjFwp7(ti0M?Y25W_*bweA?&Q5FANp(6+=Qa+T zaWy@mTDthoANrk?&ahPGUcphNl&4qycFH_2Bf{{%8-5MB7YpUgS zju4_~4&gY4WjuIO6IvZ^1tU00A=ykqb(o;-7!F|!<1*eWp}ky=p*iPG>r7XP1ksY0trCpu1UkI8|@G#y-0NrN28yZ_x!Yz&|VZxMxQ+U5< zf|^4j)=X3!KdRsZh2u$qqAHk1oL$1Euf|MUcXZQW_&TF>naCbZ!DFK8YNxfNZU~H& zf+Nr+^i+w$Et{YRc1A(kEnx}^u~rNPruc63B6XsoQ`IK4w4+LpqU@kCM~$Chg}YTF z6n7M4agMAs&}(i5?O9Fh>BdrX5N%GdFgND}%Z4J$V6n&7<8gdg#)l}Xf>FUo@KFgt zjm>v1rZJ-{v3bN){y07<;}aFUyio8de44y`2`tqSiQ816*HHeP08ij^GCoUdO2P}b z3O}2SMUS;kV%UU)w6jO(ozID zr(jXktW0N&y78>by<`=uIs{tog<=z4EWLu)-wdnj++= zI}FK>d7}(dvGOsR%M>1@j!J=5Mu1aM@yOrvf9Y1MCHT54`88!!DYTFup zRO^-s?qWZx;S3r;qnH@DYZUVWSD$z~-IdRuyYhi|?>S?TYrT6WxLAeQ$lpyoxd6Y5 zx1(zjO742Ta2PG`wV-ouO^Y};Dzl6_7cpVoINn|6R_s`^QXCP z@xL5=mTPCYuJOA$eD5+g%%g)J&$}Ou^JrPd3k>a#`hxS=w2Uj<|D-QiJPZe~W4$Ld z99+UrYw)l*3WtN?KuvEr;P1`hYB=Z_niPgDNVt3>AD0;s1HT)CY5EGdj|DQo7z{Gu zkD!;H@8<{=-Kas${pyA&f zG~UJ$Dahes9cJ9Pjf(=58uD?Ir8>OomfTv&#|ShqYQ6XiUL$S|Wxs)6;Fm0iD5rLvdtSG0-=uA)d=J;z_? z!V>vCm;E{X!OgxmOV!y#3ju?=nDl*y2o|=$F00ViyuW<-Gbw%a&|kTVf$Jh|cq>r% EKd#aBEC2ui diff --git a/target/classes/uno/mloluyu/desktop/MainGame.class b/target/classes/uno/mloluyu/desktop/MainGame.class index 5bbfb5b9d34e16b881bb403d0a46569a93bd3fdd..56c5d61aa08184bcb3a98f58c9dc363572c0d0f6 100644 GIT binary patch delta 65 zcmaFG@rq+ZJTs&4> Sf#NDamMVi9gZg9_7Bv8XI|+jT diff --git a/target/classes/uno/mloluyu/desktop/TransitionScreen$TransitionType.class b/target/classes/uno/mloluyu/desktop/TransitionScreen$TransitionType.class deleted file mode 100644 index 4efd8375b67d48e17e3837005beb14c743966d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1226 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 A-v9sr diff --git a/target/classes/uno/mloluyu/versatile/FighterController.class b/target/classes/uno/mloluyu/versatile/FighterController.class index 72dea2d78f0e0baffd151438dc6bb76767381df7..cf8407e91bf71f3724c975237406644f1135dc77 100644 GIT binary patch literal 2332 zcma)7T~iZR7=BI?Tu4??8+L=!8I@90L-%wJlFy7?sIp;m^`#jJ4k$?XC{Z9bbQ8$nfINNZ& zeAV%s#%3eGq5QfGY)9n_cDWKLf5vkI-*X)08%PP9DtXoXnzS6RY?tz7>q)-o)*8XI zC2KSmFxFeo1V-oMeoGbU%MwlM`6atrb5!JhQXo_FRlTmP+iJ5eFf{*0ga+}{^V7aB zH)-CnWS3nTG<+p6aiHZ{E@+WW5!_miT^RA9L+wjTNa|JqEraDso zj;zt>^6Mx2`HHzOIGzkb=ZB_j*A8w78E9KmscWHz^AphsZv zAT`qHMpp*}PM9#zZs4TAv5<2}gNG6T`menZ}8JODsw23wx(zIl)K%jfaLzv{nwMVKHOd5E9M~8Us)3}HU z6CdER2H^%P(rFMNr7os%6(1V7CUE9$iq^zOAjeEax|XBD1`ue=7FTmC8vAtu%gN@j32M4QW{d zJ^L8yI&CASWfs&j9vI-hbFaa|4$%0%&{-+OQMH;QgH?QG;7c;y%PQ%b_!{2`m}M0# z`m<_XHXJ7Q+CB*01RswQ@zLPEGa<1ikY3kqxtHgHW@?#GT9=Hks@{eQZ#A~Ei3)61 zZtI)_Y##{w2E2;LCLC1BtW^>Bl%r&wd1Xzo`k4c3chaQEGn#z@S(fkH6da2!z2r6g z633?Q(%v_Q^SIU&Bkb)YM>_|JZg75e>A}F$4t^()=AI*9cYl~Rf)l5czej0d@nwSR z@Yo9+8~X#@4_}~n3w`|T=jXr{2FK2AVd#12ZJ58ki~}4;itjsd3@54ZY4i|@z6*Wf z9lXmOy@r@r?Rv&V5my;e=(__VihUyX#Uh?y#Qrd%W=3C8M0PXY*`@vKbS9m%l@buNcnrxCzL2_EsK}vdxqMqj2 zFmhZkG2jSqhH1wTyM!n338o2PnDT#$8Okxs`{PKqzhWv<21J6s&VhOf+(d!D8tadA zqm>(PVQou3(_jZ)VlLUl?WZ`hvu$Egn+#~Usb_oD9=WM1O_HXbG^-EtG(-rRvjl%)sUghty~ zPeAX62F^6`ClKa%GOQUCw| literal 2761 zcmah~ZBr9x6g^J}#3UOGuNndoMI{NXsiIa3MUW6m4M@wI(5hXMB`hYJbhAPE)_&^r z2edPFrj_Y9{p5$%(b$)n{(w&Vk2;;6XOloMio;CydG6jl_ug~Qz5Mmx?|%Y#9}iq` z2n?2td@PsEXG=S!*tTXCRZGumv4o!4v@~-vZ&+qNo7GGgoC1BRd@i=GrnC8so{DAC z4`MS$p=3>@)dHObTpN|o1p1TpxT#ImR8w>*)__L@yaiJ$7Pa&ZZKo&@N;Y7Zm`O1< zVVdd=-Q5d%#!#)2sR;}p>O7jhfMSI;~BeWJeApen{8JT1%;rRxJWL!->eUhtVSn zqOy?IP1Q(ewb}f(meUN2ElO)yOI_4+^!6=C5@*$d9odC*tfZk{TRo?x03_}^3eMvK z`PPdx%~#YRj$;B(wEyXgY;3nqDL5ef0>IOOJ4%hkKT;I}C z*2r39O?rQVNKx7;kBQhNLhN`Q1B^k z^XvFjVrq_D3?2|(<65YGHX=jcRqz>9wt#L%Mymh{MBg-ZHH-+elq9D(e;jub+|1ij zL6*OvAS220nwo5fJ^nJLu3!uI1pI9KWXUus>ss7M_~6vMK6yz}PJtmSch1C04&E|EbMSd0 z`U0KNKX7dI1p?2}6ZJkvulxx`hn}PV7aQOde|zkpU2vk6!0qTHOaR>ou{{HP-(7*j zX`JDWz;>E!q}-y_ptl)R$ak*~Dqa!v_)9?p4BBG{mG#O{m7oG=F<1>%s@69YeTH7| zH$T7^UFB(DLzedpp*>SbnnKYs!m`#T$XeSO5Il7-$XWhH5w5FoXs^a04B3>wMQ$5IG1b`muR_)G49CyHe9Qw=-^hI+Dp+5=fCK5G_}btBnV(jK}4!~ zK4#>e;IEi&Dr5E`T5H!bJ_`CTKY}~xKf8-QntQ$9eoxgfQD+%TE7A5=vg&*i^k1~S z24D7SKIk>}2uFkd4%>Hl*9HnnM6V4Ll0YN&%h6rW zP>a_oh6G}m#ue`7G0b2bvsl6$?r_DXF^>)2zQiqj#Yz7fxA6_%?BXtd#CjcRkN5ie znD!Lek$v^T-Qx{-18sh*}yigGZ>6D|(eItwb`6ZYyY?#XMHSbC7bKA>Akxw}ZZ^Obi*V8KdaeqAUKmY7f AIsgCw