From b157d7bf266d4c00fb5317251e5d310809f73158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 24 Aug 2022 23:14:21 +0200 Subject: [PATCH] Add icons for weapons --- .../0ddac391-4086-4e9c-8310-59db649419ff.png | Bin 0 -> 28891 bytes .../61e67e44-a0cd-4210-8d1e-ccddcd62c78d.png | Bin 11431 -> 0 bytes data.mv.db | Bin 32768 -> 28672 bytes project.bep | 6 +- .../com/bartlomiejpluta/demo/gui/HUD.java | 146 +++++++------- .../demo/runner/DemoRunner.java | 183 +++++++++--------- .../demo/world/weapon/MeleeWeapon.java | 103 +++++----- .../demo/world/weapon/RangedWeapon.java | 132 ++++++------- .../demo/world/weapon/Weapon.java | 11 +- .../00bd0625-b3b8-4abf-97b7-91f42bce28ec.xml | 87 ++++----- .../56ca6b39-f949-4212-9c23-312db25887e0.xml | 104 +++++----- .../ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml | 85 ++++---- 12 files changed, 422 insertions(+), 435 deletions(-) create mode 100644 animations/0ddac391-4086-4e9c-8310-59db649419ff.png delete mode 100644 animations/61e67e44-a0cd-4210-8d1e-ccddcd62c78d.png diff --git a/animations/0ddac391-4086-4e9c-8310-59db649419ff.png b/animations/0ddac391-4086-4e9c-8310-59db649419ff.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fe394a6dbbf67813d70eedfff7122a0d8aff8b GIT binary patch literal 28891 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 literal 0 HcmV?d00001 diff --git a/animations/61e67e44-a0cd-4210-8d1e-ccddcd62c78d.png b/animations/61e67e44-a0cd-4210-8d1e-ccddcd62c78d.png deleted file mode 100644 index 192a81c58f44c5a62fb3cfd51777cf4273e1ae21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11431 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 diff --git a/data.mv.db b/data.mv.db index ba6c01b12e265f28986a4461c2ad2de4033f645a..1eb551ef68a589b720ad02917e6064a5f0ed5904 100644 GIT binary patch literal 28672 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 literal 32768 zcmeaUGSW%P$xqI{NOdD&J*hQ_8k$wjG&C8;S^h89MNNrr~W z2BzjZY57IDi6vHsI%TOv#hLke5S3{;sU^u7sYO=F2Iff?mZoN045MH)1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtubIV6^`~z!5NN{b&e`hQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2+$z};FJ7@km-LbBb}VoJS!ue+{6MaBO?=?+{6kiLklwl zoxIeF5-Urcg2eRHVyjf0qWt_4D+`lk69WSS0~3>^WMiF@%-mEfBhVTF%cNxFWdVjd z1(|uy`K5U!Rt5^x1zZdaT-&wXnS~e(jZ93<%vm{DIa#?_xmkHwg;_;dMOnpI#aSg- zB^d-+6cyAWf?Y!toP%5)LtNvXLOp$46pRcE1X+|6lz5FG!V00mu0aZ(ZVG<>AquV$ zp1~o(3Q9@}!Hzy53hL?#9*)5tAllKz*V9jsMMXh@_XZQiRloUMuLeO=(IQlxeR239?eWBh9 z2=erG42o3nc8x^x9aJ>l+ch%Y&`n9f-w#O=)$1T%YYMWcDJbwxV}=@vBg}#v{oGw$ zhG3wf#|hXYI0HN&)X&)?o^ZrK)S*TXx=p^G!NEir1y+W`Bv6d2lN94lXb}$fE+XEb zF|MJY%3I^;6XF_#kvUK`C^)*fC^-B31&0JVf)Y3)6CniSO_UU%i4K$$HNbW#c>1}x zMj)j;s0whhbW##z(Ns|2-A*W@ItIl1J9)V}hfthNJsg9AT|;ojyIT-AlLz}c`uKSI zg+Oz@r(cL`kfU=*JZkiSVnqvg2%_XMq5{x})BrSeQxas+R#4>ihUQvm=z_u@N0_@B zprs67q`(D7nIMaff+}wn_GE#inkX+hljV^qBWax= zTwEPp;z6|ma;kwQ3y%Pt=_okB)fG`-qn8LyKK{<$o__913Qqq1KIpQj=>}REL9Il~ zm8g;~o~}fcGayx{=@{++P=aO=QBdR!hK4+P=0(cv#%>1jVCi@>v;+l>7bR4;Y6`Nj zh$^V^?qS59upqjKN>j#e21*KU{z0yu?tY+@u7Pe9Mxlet-9fHyu0gJT&aS~oxdqkT z&|=Kb-`T^}*;|l>MNC1F*A*H*gtHs2!0~iZ0)>dUf+}wb5Z9`ATqN4nA21sE6@q_jSFGcqy=G9j662xQOsMxf4O2|CjfgYT zGc_?iC)LvxLBb3%BHj?6;_TF%)RO!>pI~$b!Zb5tofHf+Ek3abv>ZGbW~hQAm=CuE zi`hgc4F(1VKmEfunK>B*nHUTOnHY=(nHWq2nHWq3nHbCjnHbCknHX3(P%?lK3Xhc& zlpo-@UeDzg*feO8F%e_}=L$nXCgjv@B*+8_a&ti@aN;x;WI~EpGeIVJV1jH%4+~aK zK_+NoGKE_WV%X@l%!U*Qto{W#iJ5uv$r-7|CH?^*wt_Q=?FA-_nHd<+GJBO?pEVPM zp%H^18%jnEfEFjgpj-Oz-1?LL_p*e4eS{h85uZy92i(agupZ_?$Kn8V;A%i-Wut6OQ^g*4Z zWXwSwLkr7PL!HvR(&E$<#2^oZ?^qIs*aKpKH1cDVhBWfC8tz(S1E^~)z^*j}yAhXb zAwy7>#%Lo@#_$m+kXsE5j15dsMxZPVNOi2S0g_`y^AdAYt?~;}^FoRe^NJIbOEUBG ziWR`3C5cHnsd|Q%&}}g=zZ)heCqoou=B1=o=ouLhQeZ?#fe97`ieNXC=B4EOph${``kT~eZnHrfxq#+K5?el?o$kfQ38>~AgKgl<-0L~6dO=DnS+F`zr zL4g6B9L>OK(;^Wb1`WhM2*=P8Sqf@7M9K_V#*z>09eD6_fW|@f3{xy% z3`-az5ynVj1FJD+hfqmSIvGM+BtmJZxFw8E23uOQChO45u9h7m}X#x;3XSbSipHE25HHOaGrs&fhmG#oMvc( zq|(?j8DXYTN-C0>MrmdS25?i1Q;kdzZZR=2H86nJ2BVD85Eu=C(GVC7fzc2c4S~@R z7^o0{b>NH<^Y2Le=?!(@`{|8MEiKaw4J<(O$JE1+t|@5iz6rETW&-Y#q0RrpyNVd| z|0&?!7wY`Kv8iREIZ`js*aWF#MLoBJO@hq-J28*W|0|8o|6^ZKLC-}K@JTM@nKYd9 zcaVAg(fNPaLJy+m-c>)i0@{J);kNT2`Lq4E6xH=OhTJfrjf;N=Y-h6Y40BN(0kPZ@;s|Hr60 z|L-`k^Z$($%>Q=}*!=(EAu|8}kCgd;YuxkyR^a)6Uj_!25D^9rUj_zND&2yELea$j`$!oMsh58zI$}R0(dz9Xwn?p zf`ydP1q+6-RSBaD7El)~KnAj53l<f&~cA1iD}W z!hf&~ZC}{p4*26Ia&;J`jmx@Cc zUxWHGkbVC|bYhU4kK8|@nv+ot0$nelsCXINBlkJLz+f>Awj!S&-Xmu*Q+>|BkLZ!3 ztjLFi0H|}0+)t-&=X@!=yK9sN?MRZiP9GBb@KYCPvp^rIR}NdC4_OUDOs^cYKp)~t z8n4Ws4-ZV7BOQjO#>o2~l2H;f1%n+Z!v-i9Ukts$jnVOfJS#jK95A;#sI40vJs2H5 zz_Hx{QXs=d4E*Z=^8 zH#z`-x7{@=IT`|^Aut*OqaiRF0s|QW@cuud|BcdtMy&rgPcck0Hb_P7{!+?=^nOA8 ze^Y43)ErCyA2j0%KK>83Qye}FkOH2TK%L7pHnmJLL!MJLMVh9h)WPWbA^rcW;Qqg_ z0|SG_6f86HJxbBIX5@__Apq+CLpIfq&d4KDBC#{_B#jS2)(Ma|$&J+aM~s(&TxkS9 zLI8i?pPY>>5C^05{Y{XQH}dY5(Oxy)UNy!M3Fs#hfD{ah0}e*}|KLL|Mvprn?zjU; zpL?|bKafqSQM*S&U^E0qLtr!nMnho8gaEw%kLZ6R_5V$g=Kn3z4AV>v4beNml<~O$ DX|`-% diff --git a/project.bep b/project.bep index 2631a3b..1f6a970 100644 --- a/project.bep +++ b/project.bep @@ -18,11 +18,11 @@ $2261c04f-b02e-4486-b388-8a0fa41622e9(2261c04f-b02e-4486-b388-8a0fa41622e9.ttf $ab9d40b4-eb28-45d7-bff2-9432a05eb41a(ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml Start MenuB[ $56ca6b39-f949-4212-9c23-312db25887e0(56ca6b39-f949-4212-9c23-312db25887e0.xml Game MenuBU -$00bd0625-b3b8-4abf-97b7-91f42bce28ec(00bd0625-b3b8-4abf-97b7-91f42bce28ec.xmlHUDJ[ -$61e67e44-a0cd-4210-8d1e-ccddcd62c78d(61e67e44-a0cd-4210-8d1e-ccddcd62c78d.pngSlash (JZ +$00bd0625-b3b8-4abf-97b7-91f42bce28ec(00bd0625-b3b8-4abf-97b7-91f42bce28ec.xmlHUDJZ $e6f067f1-eba0-4e62-99c3-2fd867e6f142(e6f067f1-eba0-4e62-99c3-2fd867e6f142.pngPoof (J[ $312cc4e6-8c44-43e7-828a-e7e2a77836f3(312cc4e6-8c44-43e7-828a-e7e2a77836f3.pngArrow (J[ -$54f657bd-8108-464c-9bbe-63944fc14f6b(54f657bd-8108-464c-9bbe-63944fc14f6b.pngPunch (R] +$54f657bd-8108-464c-9bbe-63944fc14f6b(54f657bd-8108-464c-9bbe-63944fc14f6b.pngPunch (J[ +$0ddac391-4086-4e9c-8310-59db649419ff(0ddac391-4086-4e9c-8310-59db649419ff.pngSlash (R] $1311327d-4b74-4252-94da-23ee4129e357(1311327d-4b74-4252-94da-23ee4129e357.ogg Sword slashR\ $e452e215-f581-40fe-a5cf-f555d3db83b8(e452e215-f581-40fe-a5cf-f555d3db83b8.ogg Deku deathRW diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/HUD.java b/src/main/java/com/bartlomiejpluta/demo/gui/HUD.java index 435dbeb..2e53734 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/HUD.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/HUD.java @@ -1,100 +1,98 @@ package com.bartlomiejpluta.demo.gui; -import lombok.extern.slf4j.Slf4j; - -import com.bartlomiejpluta.base.api.gui.*; -import com.bartlomiejpluta.base.lib.gui.*; - -import com.bartlomiejpluta.base.api.screen.*; import com.bartlomiejpluta.base.api.context.Context; +import com.bartlomiejpluta.base.api.gui.*; import com.bartlomiejpluta.base.api.input.*; - +import com.bartlomiejpluta.base.api.screen.*; +import com.bartlomiejpluta.base.lib.gui.*; +import com.bartlomiejpluta.demo.entity.Player; +import com.bartlomiejpluta.demo.event.EnemyDiedEvent; +import com.bartlomiejpluta.demo.event.HitEvent; import com.bartlomiejpluta.demo.runner.DemoRunner; -import com.bartlomiejpluta.demo.entity.*; - -import com.bartlomiejpluta.demo.event.*; import com.bartlomiejpluta.demo.util.LimitedQueue; +import com.bartlomiejpluta.demo.world.weapon.Weapon; +import lombok.extern.slf4j.Slf4j; import java.util.stream.Collectors; @Slf4j public class HUD extends BorderLayout { - private static final int MAX_LOG_SIZE = 10; - private static final float LOG_VISIBILITY_DURATION = 8000f; - private static final float LOG_VISIBILITY_FADING_OUT = 1000f; - private final DemoRunner runner; - private final Player player; - private final Runtime runtime; - private LimitedQueue logger = new LimitedQueue<>(MAX_LOG_SIZE); + private static final int MAX_LOG_SIZE = 10; + private static final float LOG_VISIBILITY_DURATION = 8000f; + private static final float LOG_VISIBILITY_FADING_OUT = 1000f; + private final DemoRunner runner; + private final Player player; + private final Runtime runtime; + private LimitedQueue logger = new LimitedQueue<>(MAX_LOG_SIZE); - private float logVisibilityDuration = 0f; + private float logVisibilityDuration = 0f; - @Ref("hp") - private Bar hp; + private Weapon currentWeapon; - @Ref("debug") - private Label debugLbl; + @Ref("hp") + private Bar hp; - @Ref("log") - private Label logLbl; + @Ref("debug") + private Label debugLbl; - public HUD(Context context, GUI gui) { - super(context, gui); - this.runner = (DemoRunner) context.getGameRunner(); - this.player = runner.getPlayer(); - this.runtime = Runtime.getRuntime(); - context.addEventListener(HitEvent.TYPE, this::logHitEvent); - context.addEventListener(EnemyDiedEvent.TYPE, this::logEnemyDiedEvent); - } + @Ref("log") + private Label logLbl; - private void logHitEvent(HitEvent event) { - log(String.format("%s hits %s with damage = %d", event.getAttacker().getName(), event.getTarget().getName(), event.getDamage())); - } + @Ref("weapon") + private IconView weapon; - private void log(String message) { - logger.add(message); - log.info(message); - logLbl.setText(logger.stream().collect(Collectors.joining("\n"))); - logVisibilityDuration = LOG_VISIBILITY_DURATION; - } + public HUD(Context context, GUI gui) { + super(context, gui); + this.runner = (DemoRunner) context.getGameRunner(); + this.player = runner.getPlayer(); + this.runtime = Runtime.getRuntime(); + context.addEventListener(HitEvent.TYPE, this::logHitEvent); + context.addEventListener(EnemyDiedEvent.TYPE, this::logEnemyDiedEvent); + } - private void logEnemyDiedEvent(EnemyDiedEvent event) { - log(String.format("%s has died with HP = %d", event.getEnemy().getName(), event.getEnemy().getHp())); - } + private void logHitEvent(HitEvent event) { + log(String.format("%s hits %s with damage = %d", event.getAttacker().getName(), event.getTarget().getName(), event.getDamage())); + } - @Override - public void update(float dt) { - super.update(dt); + private void log(String message) { + logger.add(message); + log.info(message); + logLbl.setText(logger.stream().collect(Collectors.joining("\n"))); + logVisibilityDuration = LOG_VISIBILITY_DURATION; + } - hp.setValue((float) player.getHp() / (float) player.getMaxHp()); + private void logEnemyDiedEvent(EnemyDiedEvent event) { + log(String.format("%s has died with HP = %d", event.getEnemy().getName(), event.getEnemy().getHp())); + } - if(logVisibilityDuration > 0) { - logVisibilityDuration -= dt * 1000; - } else { - logVisibilityDuration = 0; - } - } + @Override + public void update(float dt) { + super.update(dt); - @Override - public void draw(Screen screen, GUI gui) { - var coords = player.getCoordinates(); - var pos = player.getPosition(); - debugLbl.setText(String.format( - "FPS: %.2f\n" + - "Mem: %.2f / %.2f [MB]\n" + - "Coords: %d : %d\n" + - "Pos: %.2f : %.2f\n" + - "Entities: %d", - runner.instantFPS(), - runtime.totalMemory() / 1024f / 1024f, - runtime.maxMemory() / 1024f / 1024f, - coords.x(), coords.y(), - pos.x(), pos.y(), - player.getLayer().getEntities().size() - 1 - )); + hp.setValue((float) player.getHp() / (float) player.getMaxHp()); - logLbl.setAlpha(Math.min(1f, logVisibilityDuration / LOG_VISIBILITY_FADING_OUT)); + if (logVisibilityDuration > 0) { + logVisibilityDuration -= dt * 1000; + } else { + logVisibilityDuration = 0; + } - super.draw(screen, gui); - } + if (player.getWeapon() != null && player.getWeapon() != currentWeapon) { + weapon.setIcon(player.getWeapon().getIcon()); + this.currentWeapon = player.getWeapon(); + } else if (player.getWeapon() == null) { + this.currentWeapon = null; + } + } + + @Override + public void draw(Screen screen, GUI gui) { + var coords = player.getCoordinates(); + var pos = player.getPosition(); + debugLbl.setText(String.format("FPS: %.2f\n" + "Mem: %.2f / %.2f [MB]\n" + "Coords: %d : %d\n" + "Pos: %.2f : %.2f\n" + "Entities: %d", runner.instantFPS(), runtime.totalMemory() / 1024f / 1024f, runtime.maxMemory() / 1024f / 1024f, coords.x(), coords.y(), pos.x(), pos.y(), player.getLayer().getEntities().size() - 1)); + + logLbl.setAlpha(Math.min(1f, logVisibilityDuration / LOG_VISIBILITY_FADING_OUT)); + + super.draw(screen, gui); + } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java index 57e40a0..dac758e 100644 --- a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java +++ b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java @@ -1,122 +1,115 @@ package com.bartlomiejpluta.demo.runner; +import com.bartlomiejpluta.base.api.context.Context; +import com.bartlomiejpluta.base.api.gui.GUI; +import com.bartlomiejpluta.base.api.runner.GameRunner; +import com.bartlomiejpluta.base.api.screen.Screen; +import com.bartlomiejpluta.base.util.profiler.FPSProfiler; +import com.bartlomiejpluta.demo.entity.Player; +import com.bartlomiejpluta.demo.menu.MenuManager; +import com.bartlomiejpluta.demo.world.weapon.RangedWeapon; import lombok.*; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.bartlomiejpluta.base.api.context.Context; -import com.bartlomiejpluta.base.api.input.Input; -import com.bartlomiejpluta.base.api.screen.Screen; -import com.bartlomiejpluta.base.api.runner.GameRunner; -import com.bartlomiejpluta.base.api.gui.GUI; - -import com.bartlomiejpluta.base.util.profiler.FPSProfiler; - -import com.bartlomiejpluta.demo.map.ForrestTempleHandler; -import com.bartlomiejpluta.demo.entity.Player; -import com.bartlomiejpluta.demo.menu.MenuManager; - -import com.bartlomiejpluta.demo.world.weapon.*; - public class DemoRunner implements GameRunner { - private static final Logger log = LoggerFactory.getLogger(DemoRunner.class); - private Screen screen; - private Context context; - private MenuManager menu; - private GUI hud; + private static final Logger log = LoggerFactory.getLogger(DemoRunner.class); + private Screen screen; + private Context context; + private MenuManager menu; + private GUI hud; - @Getter - private Player player; + @Getter + private Player player; - private final FPSProfiler fpsProfiler = FPSProfiler.create(20); + private final FPSProfiler fpsProfiler = FPSProfiler.create(20); - @Override - public void init(Context context) { - this.context = context; - this.screen = context.getScreen(); + @Override + public void init(Context context) { + this.context = context; + this.screen = context.getScreen(); - configureScreen(); - configureCamera(); - initPlayer(); - initHUD(); - initMenu(); + configureScreen(); + configureCamera(); + initPlayer(); + initHUD(); + initMenu(); - menu.showStartMenu(); + menu.showStartMenu(); - screen.show(); - } + screen.show(); + } - private void configureScreen() { - var resolution = screen.getCurrentResolution(); - screen.setSize(1800, 1000); - screen.setPosition((resolution.x() - 1800)/2, (resolution.y() - 1000)/2); - } + private void configureScreen() { + var resolution = screen.getCurrentResolution(); + screen.setSize(1800, 1000); + screen.setPosition((resolution.x() - 1800) / 2, (resolution.y() - 1000) / 2); + } - private void configureCamera() { - context.getCamera().setScale(2f); - } + private void configureCamera() { + context.getCamera().setScale(2f); + } - private void initMenu() { - this.menu = new MenuManager(this, context); - } + private void initMenu() { + this.menu = new MenuManager(this, context); + } - private void initHUD() { - hud = context.newGUI(); - hud.hide(); - var hudComponent = hud.inflateComponent(A.widgets.hud.uid); - hud.setRoot(hudComponent); - } + private void initHUD() { + hud = context.newGUI(); + hud.hide(); + var hudComponent = hud.inflateComponent(A.widgets.hud.uid); + hud.setRoot(hudComponent); + } - private void initPlayer() { - this.player = new Player(context.createCharacter(A.charsets.luna.uid)); - } + private void initPlayer() { + this.player = new Player(context.createCharacter(A.charsets.luna.uid)); + } - private void resetPlayer() { - this.player.changeCharacterSet(A.charsets.luna.uid); - this.player.setScale(1f); - this.player.setSpeed(4f); - this.player.setAnimationSpeed(2f); - this.player.setBlocking(true); - this.player.setWeapon(new RangedWeapon("wooden_bow")); - } + private void resetPlayer() { + this.player.changeCharacterSet(A.charsets.luna.uid); + this.player.setScale(1f); + this.player.setSpeed(4f); + this.player.setAnimationSpeed(1f); + this.player.setBlocking(true); + this.player.setWeapon(new RangedWeapon("wooden_bow")); + } - public void newGame() { - menu.closeAll(); - menu.enableGameMenu(); - resetPlayer(); - context.openMap(A.maps.forrest.uid); - context.getMap().getObjectLayer(A.maps.forrest.layers.main).addEntity(this.player); - player.setCoordinates(5, 36); - context.resume(); - hud.show(); - } + public void newGame() { + menu.closeAll(); + menu.enableGameMenu(); + resetPlayer(); + context.openMap(A.maps.forrest.uid); + context.getMap().getObjectLayer(A.maps.forrest.layers.main).addEntity(this.player); + player.setCoordinates(5, 36); + context.resume(); + hud.show(); + } - public void returnToStartMenu() { - menu.closeAll(); - hud.hide(); - context.pause(); - context.closeMap(); - menu.disableGameMenu(); - menu.showStartMenu(); - } + public void returnToStartMenu() { + menu.closeAll(); + hud.hide(); + context.pause(); + context.closeMap(); + menu.disableGameMenu(); + menu.showStartMenu(); + } - public void exit() { - context.close(); - } + public void exit() { + context.close(); + } - public double instantFPS() { - return fpsProfiler.getInstantFPS(); - } + public double instantFPS() { + return fpsProfiler.getInstantFPS(); + } - @Override - public void update(float dt) { - fpsProfiler.update(dt); - } + @Override + public void update(float dt) { + fpsProfiler.update(dt); + } - @Override - public void dispose() { - // Do something after game loop is end - } + @Override + 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/world/weapon/MeleeWeapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java index 67958b6..206c7d4 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java @@ -1,65 +1,62 @@ package com.bartlomiejpluta.demo.world.weapon; +import com.bartlomiejpluta.base.api.context.*; +import com.bartlomiejpluta.base.api.icon.Icon; +import com.bartlomiejpluta.base.lib.animation.*; +import com.bartlomiejpluta.base.util.random.DiceRoller; +import com.bartlomiejpluta.demo.entity.Creature; +import com.bartlomiejpluta.demo.event.HitEvent; +import lombok.*; +import org.joml.Vector2i; + import java.util.Random; -import lombok.*; -import org.joml.Vector2i; -import com.bartlomiejpluta.base.api.context.*; -import com.bartlomiejpluta.base.lib.animation.*; -import com.bartlomiejpluta.base.util.random.DiceRoller; - -import com.bartlomiejpluta.demo.entity.Creature; - -import com.bartlomiejpluta.demo.event.HitEvent; - public class MeleeWeapon implements Weapon { - private final Random random = new Random(); - private final Context context; - private final DiceRoller roller; - private final AnimationRunner animation; - private final String sound; + private final Random random = new Random(); + private final Context context; + private final DiceRoller roller; + private final AnimationRunner animation; + private final String sound; - @Getter - private String name; + @Getter + private String name; - @Getter - private int cooldown; + @Getter + private final Icon icon; - public MeleeWeapon(@NonNull String id) { - this(DB.dao.melee_weapon.find(id)); - } + @Getter + private int cooldown; - public MeleeWeapon(@NonNull DB.model.MeleeWeaponModel template) { - this.context = ContextHolder.INSTANCE.getContext(); - this.name = template.getName(); - this.roller = DiceRoller.of(template.getDamage()); - this.cooldown = template.getCooldown(); - this.animation = new RandomAnimationsRunner(2) - .nRange(0, 2f) - .nScale(0.2f, 0.15f) - .uAnimationSpeed(0.5f, 1f) - .nRotation(0, 10) - .offset(0, -10) - .uDelay(250, 500) - .with(A.animations.get(template.getAnimation()).uid); - this.sound = A.sounds.get(template.getSound()).uid; - } + public MeleeWeapon(@NonNull String id) { + this(DB.dao.melee_weapon.find(id)); + } - @Override - public boolean attack(Creature attacker) { - var facingNeighbour = attacker.getCoordinates().add(attacker.getFaceDirection().vector, new Vector2i()); - for(var entity : attacker.getLayer().getEntities()) { - if(entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Creature) { - var character = (Creature) entity; - var damage = roller.roll(); - character.hit(attacker, damage); - animation.run(context, character.getLayer(), character); - context.playSound(sound); - context.fireEvent(new HitEvent(attacker, character, damage)); - return true; - } - } + public MeleeWeapon(@NonNull DB.model.MeleeWeaponModel template) { + this.context = ContextHolder.INSTANCE.getContext(); + this.name = template.getName(); + this.roller = DiceRoller.of(template.getDamage()); + this.cooldown = template.getCooldown(); + this.animation = new RandomAnimationsRunner(2).nRange(0, 2f).nScale(0.2f, 0.15f).uAnimationSpeed(0.5f, 1f).nRotation(0, 10).offset(0, -10).uDelay(250, 500).with(A.animations.get(template.getAnimation()).uid); + this.sound = A.sounds.get(template.getSound()).uid; + var icons = template.getIcon().split(","); + this.icon = context.createIcon(A.iconsets.get(icons[0]).uid, Integer.valueOf(icons[1]), Integer.valueOf(icons[2])); + } - return false; - } + @Override + public boolean attack(Creature attacker) { + var facingNeighbour = attacker.getCoordinates().add(attacker.getFaceDirection().vector, new Vector2i()); + for (var entity : attacker.getLayer().getEntities()) { + if (entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Creature) { + var character = (Creature) entity; + var damage = roller.roll(); + character.hit(attacker, damage); + animation.run(context, character.getLayer(), character); + context.playSound(sound); + context.fireEvent(new HitEvent(attacker, character, damage)); + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java index bd2d29f..a687d81 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java @@ -1,89 +1,81 @@ package com.bartlomiejpluta.demo.world.weapon; -import java.util.Random; - -import lombok.*; +import com.bartlomiejpluta.base.api.animation.Animation; import com.bartlomiejpluta.base.api.context.*; import com.bartlomiejpluta.base.api.entity.Entity; -import com.bartlomiejpluta.base.api.animation.Animation; +import com.bartlomiejpluta.base.api.icon.Icon; import com.bartlomiejpluta.base.api.move.*; import com.bartlomiejpluta.base.lib.animation.*; import com.bartlomiejpluta.base.util.random.DiceRoller; - import com.bartlomiejpluta.demo.entity.Creature; - import com.bartlomiejpluta.demo.event.HitEvent; +import lombok.*; + +import java.util.Random; public class RangedWeapon implements Weapon { - private final Random random = new Random(); - private final Context context; - private final DiceRoller dmgRoller; - private final DiceRoller rangeRoller; - private final BulletAnimationRunner animation; - private final String sound; - private final AnimationRunner punchAnimation; - private final String punchSound; - private final AnimationRunner missAnimation; - private final String missSound; + private final Random random = new Random(); + private final Context context; + private final DiceRoller dmgRoller; + private final DiceRoller rangeRoller; + private final BulletAnimationRunner animation; + private final String sound; + private final AnimationRunner punchAnimation; + private final String punchSound; + private final AnimationRunner missAnimation; + private final String missSound; - @Getter - private String name; + @Getter + private String name; - @Getter - private int cooldown; + @Getter + private final Icon icon; - public RangedWeapon(@NonNull String id) { - this(DB.dao.ranged_weapon.find(id)); - } + @Getter + private int cooldown; - public RangedWeapon(@NonNull DB.model.RangedWeaponModel template) { - this.context = ContextHolder.INSTANCE.getContext(); - this.name = template.getName(); - this.dmgRoller = DiceRoller.of(template.getDamage()); - this.rangeRoller = DiceRoller.of(template.getRange()); - this.cooldown = template.getCooldown(); - this.animation = new BulletAnimationRunner(A.animations.get(template.getAnimation()).uid) - .infinite() - .offset(0, -15) - .onHit(this::onHit) - .onMiss(this::onMiss) - .speed(7f) - .animationSpeed(4f) - .scale(0.6f); - this.sound = A.sounds.get(template.getSound()).uid; - this.punchAnimation = new SimpleAnimationRunner(A.animations.get(template.getPunchAnimation()).uid); - this.punchSound = A.sounds.get(template.getPunchSound()).uid; - this.missAnimation = new SimpleAnimationRunner(A.animations.get(template.getMissAnimation()).uid) - .scale(0.4f); - this.missSound = A.sounds.get(template.getMissSound()).uid; - } + public RangedWeapon(@NonNull String id) { + this(DB.dao.ranged_weapon.find(id)); + } - private void onHit(Movable attacker, Entity target) { - if(target.isBlocking() && target instanceof Creature) { - var namedAttacker = (Creature) attacker; - var character = (Creature) target; - var damage = dmgRoller.roll(); - character.hit(namedAttacker, damage); - punchAnimation.run(context, character.getLayer(), character); - context.playSound(punchSound); - context.fireEvent(new HitEvent(namedAttacker, character, damage)); - } - } + public RangedWeapon(@NonNull DB.model.RangedWeaponModel template) { + this.context = ContextHolder.INSTANCE.getContext(); + this.name = template.getName(); + this.dmgRoller = DiceRoller.of(template.getDamage()); + this.rangeRoller = DiceRoller.of(template.getRange()); + this.cooldown = template.getCooldown(); + this.animation = new BulletAnimationRunner(A.animations.get(template.getAnimation()).uid).infinite().offset(0, -15).onHit(this::onHit).onMiss(this::onMiss).speed(7f).animationSpeed(4f).scale(0.6f); + this.sound = A.sounds.get(template.getSound()).uid; + this.punchAnimation = new SimpleAnimationRunner(A.animations.get(template.getPunchAnimation()).uid); + this.punchSound = A.sounds.get(template.getPunchSound()).uid; + this.missAnimation = new SimpleAnimationRunner(A.animations.get(template.getMissAnimation()).uid).scale(0.4f); + this.missSound = A.sounds.get(template.getMissSound()).uid; + var icons = template.getIcon().split(","); + this.icon = context.createIcon(A.iconsets.get(icons[0]).uid, Integer.valueOf(icons[1]), Integer.valueOf(icons[2])); + } - private void onMiss(Movable attacker, Animation animation) { - missAnimation.run(context, ((Creature) attacker).getLayer(), animation.getPosition()); - context.playSound(missSound); - } + private void onHit(Movable attacker, Entity target) { + if (target.isBlocking() && target instanceof Creature) { + var namedAttacker = (Creature) attacker; + var character = (Creature) target; + var damage = dmgRoller.roll(); + character.hit(namedAttacker, damage); + punchAnimation.run(context, character.getLayer(), character); + context.playSound(punchSound); + context.fireEvent(new HitEvent(namedAttacker, character, damage)); + } + } - @Override - public boolean attack(Creature attacker) { - var direction = attacker.getFaceDirection(); - context.playSound(sound); - animation - .range(rangeRoller.roll()) - .direction(direction) - .rotation(direction.xAngle - 180) - .run(context, attacker.getLayer(), attacker); - return true; - } + private void onMiss(Movable attacker, Animation animation) { + missAnimation.run(context, ((Creature) attacker).getLayer(), animation.getPosition()); + context.playSound(missSound); + } + + @Override + public boolean attack(Creature attacker) { + var direction = attacker.getFaceDirection(); + context.playSound(sound); + animation.range(rangeRoller.roll()).direction(direction).rotation(direction.xAngle - 180).run(context, attacker.getLayer(), attacker); + return true; + } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java index 0007166..42782ec 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java @@ -1,9 +1,14 @@ package com.bartlomiejpluta.demo.world.weapon; +import com.bartlomiejpluta.base.api.icon.Icon; import com.bartlomiejpluta.demo.entity.Creature; public interface Weapon { - String getName(); - int getCooldown(); - boolean attack(Creature attacker); + String getName(); + + Icon getIcon(); + + int getCooldown(); + + boolean attack(Creature attacker); } \ No newline at end of file diff --git a/widgets/00bd0625-b3b8-4abf-97b7-91f42bce28ec.xml b/widgets/00bd0625-b3b8-4abf-97b7-91f42bce28ec.xml index 6daf65c..9e1425c 100644 --- a/widgets/00bd0625-b3b8-4abf-97b7-91f42bce28ec.xml +++ b/widgets/00bd0625-b3b8-4abf-97b7-91f42bce28ec.xml @@ -1,55 +1,50 @@ + xmlns:base="com.bartlomiejpluta.base.lib.gui" + xmlns:demo="com.bartlomiejpluta.demo.gui" + widthMode="SizeMode.RELATIVE" + heightMode="SizeMode.RELATIVE" + width="1f" + height="1f"> - + + + - + + + - + + + - - - - - - - - - - - + + + \ No newline at end of file diff --git a/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml b/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml index 5813d1b..2a78074 100644 --- a/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml +++ b/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml @@ -1,63 +1,67 @@ + xmlns:base="com.bartlomiejpluta.base.lib.gui" + xmlns:demo="com.bartlomiejpluta.demo.gui" + windowPosition="WindowPosition.CENTER" + margin="10f" + padding="20f"> - + - Game Menu + Game Menu + - + - Resume game + Resume game + - Back to start menu + Back to start menu + - Exit + Exit + - + - + \ No newline at end of file diff --git a/widgets/ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml b/widgets/ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml index b7e5750..06ee04e 100644 --- a/widgets/ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml +++ b/widgets/ab9d40b4-eb28-45d7-bff2-9432a05eb41a.xml @@ -1,53 +1,56 @@ + xmlns:base="com.bartlomiejpluta.base.lib.gui" + xmlns:demo="com.bartlomiejpluta.demo.gui" + windowPosition="WindowPosition.BOTTOM" + margin="10f" + padding="20f"> - + - Menu + Menu + - + - New Game + New Game + - Exit + Exit + - + - + \ No newline at end of file