From bbf0109080d809aed733efbe950e6c3b4c664ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 17 Aug 2022 17:05:19 +0200 Subject: [PATCH] Create melee weapons system --- .gitignore | 1 + data.mv.db | Bin 16384 -> 24576 bytes .../demo/database/dao/MeleeWeaponDAO.java | 32 +++++++++++++++ .../demo/database/model/MeleeWeaponModel.java | 12 ++++++ .../demo/entity/Character.java | 38 ++++++++++++++++++ .../demo/map/BaseMapHandler.java | 5 +++ .../demo/runner/DemoRunner.java | 26 ++++++++---- .../bartlomiejpluta/demo/util/DiceRoller.java | 31 ++++++++++++++ .../demo/world/weapon/MeleeWeapon.java | 29 +++++++++++++ 9 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/bartlomiejpluta/demo/database/dao/MeleeWeaponDAO.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/database/model/MeleeWeaponModel.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/util/DiceRoller.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java 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 d03fca617dc3de0763084f299eee4157bc69bef8..c0685e41c5e47d47debdaa25a21a303118a831ec 100644 GIT binary patch literal 24576 zcmeaUGSW%P$xqI{NOdD&Km#z{KKMX8A;sVP>57DkClhK9)o zrsg_n`9-;jC02$yWvNBQnfZBOg=smdCCM47MOI0si76=t2F6?rqhK@yMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONV8BCQwEsWgQ84O&(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@Rpm_+uCizVuv;S5`IytF%R)#vci3L_hMmo8P6;@`Z20D4E z6(v?CIt7X8sl`?%Iz{>UB~~UW24Ik6VQ8XLl9`)oWoTk)oSI^Zv?Rbpryw)WIlnZo z#L7T{>HxI5K$>x)0waSUQ$TrseoAUyd~tbxQHmib+!(JjSTVCQ7#bOym@){mC@QE$ z1iOYPI0v~phPcK%g?jq9C>R+S2(lj?l}cDafLtpvdb3bzVS_r>|pBq=L6=B$Df(qVe9Yk@1E~3jTgb za;Po`Ia*VYMO8tSx7yJs#5D-NPZbHv_lG{9CU zc>1}xMj$x@ssidn1_lNL<}LD!42BGXEGTgv5DrcN3c;WR!199K(=f$E+mL~QnVI1_ zgD3+hIHl_u8XLh`#;m!C1$u^TU@{F%85uw*Bd`=ifeDyx3MS2X@)C1X^)mBPQY-XK zAe@~1B$vdJL~gK5PJWVaVgZ~Tl$s_A7SAt8%?l|?%qvbzF3HT#D~4z-NleN~)iXfm z81sSEm*%D9`{bwV8M1@&nx0`Agf=o@1M`iSFoOMKWoQgrzhex|xjC6-slJI7Rt7pC zRscB18W5GAlPxgvvxP-!nwd^%UTHCC`42REL%5D5Vepkd#zpWI)>0vCpj7HN~1JOc&P(&Win~5G)8hIIEJjyV@MVh4_1&EGKMaJg84W# z86pc!2N<#nV7>4-M3Xl(N&&|>)NliEYOz8}IUsgWY8pflGH~Y-VZzDho&PXb6mkz-S1JhQMeDjE2By2#kinAPE6j zD<0ARMy#hd(Sfh0H!(^yHBL260d*g#iMe3*CqmojuwDc){r^zX`nmZvkgnf;;y^eIx);hCs&f zK>dI6Mgnk->_NKzpn*PcMu%{bM*?sS{>_DtS6Dzx8Z%-?0?Z5y(1rj~!6N_$MroF2 zh=Ip617qYNfHZ?dC>Pmz7D#221yb3B7^tv>I?tRG=YfYuEzn(Q0(K_4D`CzeG7v41 zTsd?HDxg&bWS|1dfechYIimv=gQP(+>WtA47!85Z5Eu=C(GVC70h)&ZX8#+}|4&5p z|IJJj%`Giy*#Cz$drhFtUgZ8iX8Rjg%NF5w1)j*@^SqYEsi{WLULC0WWSp964&@>{&lJgdrbyiE#(wgv|7O2`HAY_5Tt5Z{$8SeE#1eInmT4k%s;MB(%N;Qvcrs*7reQiJOY0bCH^w zio6&&3908m{Q&?j1_tK&Oj6iqcP-(4{lp>M*GKeOarO0)d-}w!^M>{(F!yahrgK4^ zLb7Lf5$TxNIcVZXmq>CR@&FWKzyy7n3#{W$&VUJY<`N|safDkUQfC@@NzBmgtwKEy z>8(OJklrek1M007TcIXM%%}#>kW+Iaf9QrNG*?1G6v}~wD3k*VQQB8Xqc)6&z-S1J rhQMeDjE2By2#kinXb8|W1YrGtME@Jn|4%~9|C^^Jnp>vOp#Kj5run11 literal 16384 zcmeaUGSW%P$xqG>&a6tcGBhwS&`B;zO)N=Gu`;wUN=z~|Og1nz*GbDS%1tb>GSo@S zNi9jvNG-BTG)+mfv@|s4Vi*OZAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8Ulkn1V;P+gFJ#poi`c+qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Uj=Zf#i(R zylg8&$Ql4EBb}VoJS#(;+{6MaGo9ST3M)fn1D(9oiV`bhor1*l)M6_moud5w5-Sq} z5HL0~N!BUJ%uTg2(kV+VD$dLY=`P63bIvc#E3qC$RNm~sGt@R z>>8rr9OUX4;u`N1>gnU6U}Rvxz`*d6L6L!%fi*X=K+h0N8i7e;FlhoNO~IrYPhMhf zs$Nchl1pMqA~%fVn^*v62c@Qog2nR-Qu9KJ67z}^lS?x5^NJx_OA?cEQuPe@z)DK< zQu2NB)AbD5KtZKv4Ay9ct`V%(3a%Dxjuq4#u(eh>`AIM*fY?E)X%IzFcQTqWnlPF& z8ZsI)8gW75!zjhThzf~f)QHg#7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu;ss)qo2 z{~OVZhOe}@Fi9~;F-@C*S6vM4Di@ftx!1{6YrU4s-n-4y)%Llj&iJcC1m6_k_| zf*pNA6x7ufJRE~PK(wQaucsda1LG8iW(Gb6c5v`OM-K*c3}GT8*eMtzH947OslJI7 zRt7pCRseX2#(=Exo6@|}V$iOSGz%RF)3GEBKBR+4mWZgO$FK$@nHi;6m{C3FjT$%_ z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UpkU0Z6Y7(f@{Zw2Tlt?JZ4H3{os;)c*$n D)xw%7 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