diff --git a/.gitignore b/.gitignore index 567609b..e236026 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build/ +data.trace.db diff --git a/data.mv.db b/data.mv.db index d03fca6..c0685e4 100644 Binary files a/data.mv.db and b/data.mv.db differ diff --git a/src/main/java/com/bartlomiejpluta/demo/database/dao/MeleeWeaponDAO.java b/src/main/java/com/bartlomiejpluta/demo/database/dao/MeleeWeaponDAO.java new file mode 100644 index 0000000..e7dc8be --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/database/dao/MeleeWeaponDAO.java @@ -0,0 +1,32 @@ +package com.bartlomiejpluta.demo.database.dao; + +import java.sql.*; +import java.util.*; + +import com.bartlomiejpluta.base.api.context.Context; + +import com.bartlomiejpluta.demo.database.model.MeleeWeaponModel; + +public class MeleeWeaponDAO { + private final Map items = new HashMap<>(); + + public void init(Context context) { + context.withDatabase(db -> { + var result = db.prepareStatement("SELECT * FROM `melee_weapon`").executeQuery(); + + while(result.next()) { + var weapon = MeleeWeaponModel.builder() + .id(result.getString("id")) + .name(result.getString("name")) + .damage(result.getString("damage")) + .cooldown(result.getInt("cooldown")) + .build(); + items.put(result.getString("id"), weapon); + } + }); + } + + public MeleeWeaponModel get(String id) { + return items.get(id); + } +} \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/database/model/MeleeWeaponModel.java b/src/main/java/com/bartlomiejpluta/demo/database/model/MeleeWeaponModel.java new file mode 100644 index 0000000..ed45fda --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/database/model/MeleeWeaponModel.java @@ -0,0 +1,12 @@ +package com.bartlomiejpluta.demo.database.model; + +import lombok.*; + +@Data +@Builder +public class MeleeWeaponModel { + private final String id; + private final String name; + private final String damage; + private final int cooldown; +} \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Character.java b/src/main/java/com/bartlomiejpluta/demo/entity/Character.java index e3352d1..fa9de17 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Character.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Character.java @@ -1,15 +1,53 @@ package com.bartlomiejpluta.demo.entity; import lombok.*; +import org.slf4j.*; +import org.joml.Vector2i; import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.entity.Entity; import com.bartlomiejpluta.base.lib.entity.EntityDelegate; +import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon; + public class Character extends EntityDelegate { + private static final Logger log = LoggerFactory.getLogger(Character.class); protected final Context context; + protected int attackCooldown = 0; + + @Setter + private MeleeWeapon weapon; public Character(@NonNull Context context, @NonNull Entity entity) { super(entity); this.context = context; } + + public void attack() { + if(weapon == null) { + return; + } + + if(attackCooldown >= weapon.getCooldown()) { + var facingNeighbour = getCoordinates().add(getFaceDirection().vector, new Vector2i()); + for(var entity : getLayer().getEntities()) { + if(entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Character) { + weapon.attack((Character) entity); + attackCooldown = 0; + } + } + } + } + + public void hit(int dmg) { + log.info(toString() + " received " + dmg + " damage"); + } + + @Override + public void update(float dt) { + super.update(dt); + + if(weapon != null && attackCooldown < weapon.getCooldown()) { + attackCooldown += (int) (dt * 1000f); + } + } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java index 4a3a7d7..d8d9b81 100644 --- a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java +++ b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java @@ -13,6 +13,7 @@ import com.bartlomiejpluta.base.lib.camera.*; import com.bartlomiejpluta.demo.runner.DemoRunner; import com.bartlomiejpluta.demo.entity.Player; +import com.bartlomiejpluta.demo.entity.Character; public abstract class BaseMapHandler implements MapHandler { protected Screen screen; @@ -41,6 +42,10 @@ public abstract class BaseMapHandler implements MapHandler { return; } + if(input.isKeyPressed(Key.KEY_SPACE)) { + player.attack(); + } + if(input.isKeyPressed(Key.KEY_LEFT_CONTROL)) { if(input.isKeyPressed(Key.KEY_DOWN)) { player.setFaceDirection(Direction.DOWN); diff --git a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java index 8cb74cc..ab9d772 100644 --- a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java +++ b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java @@ -13,6 +13,9 @@ import com.bartlomiejpluta.base.api.runner.GameRunner; import com.bartlomiejpluta.demo.map.ForrestTempleHandler; import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.menu.MenuManager; +import com.bartlomiejpluta.demo.database.dao.MeleeWeaponDAO; + +import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon; public class DemoRunner implements GameRunner { private static final Logger log = LoggerFactory.getLogger(DemoRunner.class); @@ -20,6 +23,9 @@ public class DemoRunner implements GameRunner { private Context context; private MenuManager menu; + @Getter + private MeleeWeaponDAO meleeWeaponDAO = new MeleeWeaponDAO(); + @Getter private Player player; @@ -27,9 +33,10 @@ public class DemoRunner implements GameRunner { public void init(Context context) { this.context = context; this.screen = context.getScreen(); - + configureScreen(); configureCamera(); + initDAOs(); initMenu(); initPlayer(); @@ -37,17 +44,21 @@ public class DemoRunner implements GameRunner { screen.show(); } - + private void configureScreen() { var resolution = screen.getCurrentResolution(); screen.setSize(800, 600); screen.setPosition((resolution.x() - 800)/2, (resolution.y() - 600)/2); } - + private void configureCamera() { context.getCamera().setScale(2f); } - + + private void initDAOs() { + meleeWeaponDAO.init(context); + } + private void initMenu() { this.menu = new MenuManager(this, context); } @@ -55,7 +66,7 @@ public class DemoRunner implements GameRunner { private void initPlayer() { this.player = new Player(context, context.createEntity("815a5c5c-4979-42f5-a42a-ccbbff9a97e5")); } - + private void resetPlayer() { this.player.changeEntitySet("815a5c5c-4979-42f5-a42a-ccbbff9a97e5"); this.player.setScale(1.0f); @@ -63,8 +74,9 @@ public class DemoRunner implements GameRunner { this.player.setAnimationSpeed(0.005f); this.player.setBlocking(true); this.player.setCoordinates(0, 11); + this.player.setWeapon(new MeleeWeapon(meleeWeaponDAO.get("wooden_sword"))); } - + public void newGame() { menu.closeAll(); menu.enableGameMenu(); @@ -95,6 +107,4 @@ public class DemoRunner implements GameRunner { public void dispose() { // Do something after game loop is end } - - } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/util/DiceRoller.java b/src/main/java/com/bartlomiejpluta/demo/util/DiceRoller.java new file mode 100644 index 0000000..7b253ce --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/util/DiceRoller.java @@ -0,0 +1,31 @@ +package com.bartlomiejpluta.demo.util; + +import lombok.*; +import java.util.*; +import java.util.regex.*; + +@Data +@AllArgsConstructor +public class DiceRoller { + private static final Pattern CODE_PATTERN = Pattern.compile("(\\d+)d(\\d+)([+-]\\d+)?"); + private final Random random = new Random(); + private int rolls; + private int dice; + private int modifier; + + public int roll() { + var sum = modifier; + + for(int i=0; i