From 8fa0dd927f99b5a7dfab7341457eb324204c268f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Mon, 5 May 2014 23:01:56 +0200 Subject: [PATCH] hurt&death anim, item sheet (item sys still 2bd) --- res/img/gui1.png | Bin 1526 -> 2133 bytes res/img/gui1.xcf | Bin 10273 -> 10336 bytes res/img/items16.png | Bin 0 -> 519 bytes res/img/items16.xcf | Bin 0 -> 20810 bytes .../gamecore/util/math/color/Color.java | 2 +- src/mightypork/rogue/Res.java | 64 ++++++++++-------- .../rogue/screens/game/HeartBar.java | 21 +++--- .../rogue/screens/game/HudLayer.java | 36 +++++++++- src/mightypork/rogue/world/entity/Entity.java | 22 +++--- .../world/entity/entities/MonsterAi.java | 10 +-- .../world/entity/entities/PlayerEntity.java | 16 +++-- .../rogue/world/entity/entities/RatAi.java | 6 +- .../world/entity/entities/RatEntity.java | 4 ++ .../entity/modules/EntityModuleHealth.java | 18 +++++ .../entity/modules/EntityModulePosition.java | 28 +++++++- .../entity/renderers/EntityRendererMobLR.java | 33 ++++++++- src/mightypork/rogue/world/level/Level.java | 35 ++++++---- 17 files changed, 210 insertions(+), 85 deletions(-) create mode 100644 res/img/items16.png create mode 100644 res/img/items16.xcf diff --git a/res/img/gui1.png b/res/img/gui1.png index 950b24f7274ef310c56844d6da9ae96dea8ddf59..ec98bf9b0b01dcf65897c0437d1287ff127c9232 100644 GIT binary patch delta 2078 zcmV+(2;ukk3)K*iDlz{6{{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^q*6b}jhwFi2UTPJ@9y-7qtRCwC$n>~*vM-j(=)h{zokBz{r;SSw_6YG-8yh}ht zfI}oBBs+8jdv=IF01*)hp?&KJhljs{0|ErW?ny{K0z`r^l5KhIlen9CX8NTFW}cV5 z+k3I`TDNBY(xd6=n(67P`d3xYPOkvG`SKMdK=)}2q2c(rWoLhXuC~NH{qo6fr$m}Rt#+AgeIH~Cl2>_ z_44f_F8_9q{oS+80d5u4T{jw_qZ@VI33SKZ7z&K?uoHhc?zXdH`)E&ofh2bO_L9X- zc(1<74{qH$+Yo3%bHb~un!i#0q_7DqraU|ee$fhWxWB9QUvBYi4SnBp7kCBEEDYSr zi`!`c0wHu;d0?V{+l`6xKC^szxcsLhKB?fH{&@f{0{=PNB-m`#wv8FOZpr~$y&Wej z!CB>iuM&T*ofyz{a7;JSn?TsA3SC(9g5&M#5FS|n_2A%OeZIfHuK))J2al`LjJ|ywU(a{ly*GI+o zt{psf8GP}^EqVWW^pl(LqgUY9H_ny;W|h^uX(4|!R)Vbr7d8u|wj29bd7vRYUSgXJ z@woW#g{yq{!qv6%2OtMa!qed%`QtC=KG)SR-njLZy=4l(?_a&5 zG=bye?tyW=GQ_t0^>@AoufsD|@8F<1EjG5>E4&ua*TUHM#$wYx?f%o`Pb$o6^5gV% z-F|;>)juiUT)04U;R0_gP%d7;>DYho{qMT_Vy+e&DSRX+PR1H2_J*{?qQiSAH%Suu}G3{FaI3}-|N4zn#GAkPe3m{wMQ*M9V zwE0b-lrn87GNe*Y?4vWrAR?^(*U4zY7y*Q$0wNRz5kXbgKeQk)wx?@QrRX^FYRr@p zs)~q^b6!7h``N~r^*yB&N-1l7Drcyi!5BfrP^P)349 zJBAc_Dl`nkfU6et!+?lE0q^}l4qRh}VcDqoRGrgD~?Ga0+yx|MT5rW5Zy zh>+tjvQ;Ohm4x#(ltf+CRJAAeJ#}R%Y7tGyOP4Nc%3!U<2v}pW7OX%~#TrA5nIUKD zs$$s>7&Cnq7r{;5GRB}<825inZYWtw84Y6%DMdtt7{}|;0;=Sku-1}NLd1ZM&R{aw z7!tA`&lrOdA*X%}8xg#9hyiOWa><|tYds|`$!hT4jUjA3IStf{2Injean!X%P`q=b z6w#bXD9#Fb=qPHatfTMlPzsnjkWxmq;GH0v@y3$U7m`6qwg#t=KOTk!2w`{T2 zV~nA4mN@hnl!b>BdvX-yXO}N&E{dQyXAv_RLnx$FaK-=yFer)`OG=rXGtOB`PIx!& zjZ-ZcGkPqhGBU_IR5O2Ih_OZ05yFDLUlNCeNWof%wPUE{GO`bZoD0?e>HWAH|B z7W$Nt60y!g6}-kBzp$Z3B`Nd;?0!&({R-&w(m zu&6!DKH|NnIzDpCZ?2nP0iv4p?I-T3C2T%wsvs1*|nJ`{fw_24YgknPG^eTzLBF3NMgT zPpBN-kf@wzIgH8FNTE+kGzO88sn%NhzQ=pdojao=w2VppzhagrRlL{PuK)l507*qo IM6N<$f^WI{4FCWD delta 1466 zcmV;r1x5PR5cUg@DlsVl0{{Rw)JRhR000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^n_7Aq?B8O`01TPJ@7UP(kjRCwC$o4=16MHI(BGduR(ECK-+NDu*0pfuN@*c4P0 zP|`w41$Uu@KY)sgh7w{bQii`F1qFh_j)cTfAR43~B?yN|=sfoRm`5=?>veE0mw+SP zF<;5r*?I4F=Y8Mzz1h9crqpTB)U?sxsmmoLkMu1Q2>JRVDT9MAu2m>rvkbT-+wtY$gRcjw|% zZjZkBzghHPFkn0$%VaXyr~q_~%v#v7kT-@M!Z?p}Zb?o&&W;hp!>B+hwNhHc;ZO~S z!;O@ic5c?Dch-NTI0vk?%XHsG&LhQWxM2m@CZ!$iTWfJ0?c03m(3So4_R$)M^4;Ix zf8gv*_J_?i2JC@sjDVS27Ikh{gSRv)n00EP(-U&L8BL7$26Fz+g!7*c*&A%O2bfsY z&IJM-F2uTHaZ?vcfnc{gmZ|G@#o7Hc`4CO)&Yd~i*WrKK)-Ep|9Bj4(a+|MYHSYP# z;8%^gjY>JX2|nx&Fy0%;*7paT*@DGl!6EPtY^)4S%wo3v`YXD&3#f6(&Z z;rzD~{^-M%#mfMk1OD1<6U;k%+mZ(7njX-Zb*%0Lo9Y3N5@yyYz&V)Wg1oWV&aU8W zs|%*x-NAp}bN`poXw;tX?d=J`Xf(R-Zt&yoF6XWv@b1N5`0gq^xnTvE7oOe$ZeW{z ze&z`BcQC^(Gw#6I=DcZ|M>IY)nM@d84uKE%N5|d<-@JODeta4E<2tNi@Sf^ytvy2KLRy^jXVjOu8iA90=Eo) zCDZmU`|%&=9?1L6s|SzlEmHw}_3i~Bw@jz*o^>6G=-NNHatdCD6XH8Kh%^ry-EqVv zi(Il{?xXGH_@qO{fDwuBq9DRGrFbJas7n^f&z@~M)Gau7mg43uDg|FSPIMXQyI#as zkN50_5xaKbn{2@IIomy{dy)tL@=4As65hqBQ+kQzlczIzj7`jXdS-GS(Ftf)2)A9 zDYdfJy7BKDgZG}wdyLjp-qSaREt64s&z8y1S|cKqb&aWgSlptj$+V)EWtc2Dc!4Ku zpV|j!+s`;$l*E7R-0m6bCJ?OxiE)7@)09=++PwrHV}j4TsOXuDst%+mrO2A=YOV3! zlNp0n;dBt1hx_$RM&B4ruUU}E6#XX4 z@kW9$D|~y?!$pZ!ptFpkteAJQqIDJ+Z8GMHlBleCS)r8#LcFlm%jowEMHxtliV#sN z$|$O;C8qM8EM{Ip;PGdp`n>loc_KpH5E9kwiV~wWnFhBg5d;bJ3 z`o;tjn)S`g3fu2dR22YaT~k&yw%==|o@qr<1+q*>>eW2l=drCGhl>gk!S;Ln4d@QC UP#P9tx&QzG07*qoM6N<$f(+i&@&Et; diff --git a/res/img/gui1.xcf b/res/img/gui1.xcf index 8cc075a4f2cbdec8c8bab47bd51061d8a3fcf4e5..76c1f7f608ead1a2c1b6743d0b9880f3cfe20493 100644 GIT binary patch delta 464 zcmZ8du}T9$5PiGZ4Y!90rtyL{Cm1k@O~6(I=`}xK8CWFM{eZbIP&i0o6k45+X-qP{`W*rYEKi5`!-6{PIY1Xwgq=XU@*Z7WfKC&Jt$1%~+ z_#H4cT35pmRSh4h3ypU=H;!?^6pFuy&rqPy6PI6?u{6l#P(jBFb5m-_+|A?iFISD! z<00%{$-+?_S0?hT*d8x!A7x5Gx(I)7O8i(1Sd}JOj@fr;`9~&bSr_CvY S0%{Y^*=ZN3J;Y&cwDkjrw3QwJ delta 385 zcmX|-u}i~16vn^1^8B2+ll6B-A66 zkv1tuBcEnG46OJ_mCSOL6Nez6uU$9i=5!XNvZyOv%uh9-3}GY+(UW#-G7MoTRbVS9 zxJYd%e9^JaX`3hcj6;DrOKe_iVWcrbA*^`CzBMY#ocP0N9VzjHw8%r!$YpF diff --git a/res/img/items16.png b/res/img/items16.png new file mode 100644 index 0000000000000000000000000000000000000000..13f9f7786b2d5b5f5f7dd59f930e78b7ce65e82c GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqE31f=1#i^RZ$Kf*64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aRvs)d`}n0kcwMxukXzg36x-a5PtDkR)<;A#>+R_V;Yz4WOFRy zKNnq|-ndRh|JLgke(nXilcH9y-_H1MdeE;M1& literal 0 HcmV?d00001 diff --git a/res/img/items16.xcf b/res/img/items16.xcf new file mode 100644 index 0000000000000000000000000000000000000000..df5c4c7c76f70c30b34f57e497fb2a0cdf7b44db GIT binary patch literal 20810 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.6 ? img_on : rem>0.25 ? img_half: img_off)); } } diff --git a/src/mightypork/rogue/screens/game/HudLayer.java b/src/mightypork/rogue/screens/game/HudLayer.java index 3ab4fd4..e4f120c 100644 --- a/src/mightypork/rogue/screens/game/HudLayer.java +++ b/src/mightypork/rogue/screens/game/HudLayer.java @@ -11,11 +11,31 @@ import mightypork.gamecore.input.Keys; import mightypork.gamecore.util.math.constraints.num.Num; import mightypork.gamecore.util.math.constraints.rect.Rect; import mightypork.rogue.Res; +import mightypork.rogue.world.WorldProvider; import mightypork.rogue.world.gui.Minimap; public class HudLayer extends ScreenLayer { + private Num playerHealthTotal = new Num() { + + @Override + public double value() + { + return WorldProvider.get().getPlayerEntity().health.getMaxHealth() / 2D; + } + }; + + private Num playerHealthActive = new Num() { + + @Override + public double value() + { + return WorldProvider.get().getPlayerEntity().health.getHealth() / 2D; + } + }; + + public HudLayer(Screen screen) { super(screen); @@ -38,15 +58,25 @@ public class HudLayer extends ScreenLayer { final Rect shrunk = root.shrink(minWH.perc(3)); final Num displays_height = minWH.perc(6); - final HeartBar hearts = new HeartBar(6, 3, Res.getTxQuad("heart_on"), Res.getTxQuad("heart_off"), AlignX.LEFT); + //@formatter:off + final HeartBar hearts = new HeartBar( + playerHealthTotal, + playerHealthActive, + Res.getTxQuad("heart_on"), + Res.getTxQuad("heart_half"), + Res.getTxQuad("heart_off"), + AlignX.LEFT); + //@formatter:on + + final Rect hearts_box = shrunk.topLeft().startRect().growDown(displays_height); hearts.setRect(hearts_box); root.add(hearts); - final HeartBar experience = new HeartBar(6, 2, Res.getTxQuad("xp_on"), Res.getTxQuad("xp_off"), AlignX.RIGHT); + /*final HeartBar experience = new HeartBar(6, 2, Res.getTxQuad("xp_on"), Res.getTxQuad("xp_off"), AlignX.RIGHT); final Rect xp_box = shrunk.topRight().startRect().growDown(displays_height); experience.setRect(xp_box); - root.add(experience); + root.add(experience);*/ final Minimap mm = new Minimap(); diff --git a/src/mightypork/rogue/world/entity/Entity.java b/src/mightypork/rogue/world/entity/Entity.java index b57e372..1428192 100644 --- a/src/mightypork/rogue/world/entity/Entity.java +++ b/src/mightypork/rogue/world/entity/Entity.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.Random; import mightypork.gamecore.eventbus.events.Updateable; import mightypork.gamecore.util.annot.DefaultImpl; @@ -31,6 +32,8 @@ public abstract class Entity implements IonObjBundled, Updateable { private Level level; private final EntityModel model; + protected final Random rand = new Random(); + /** Entity ID */ private int entityId; @@ -39,11 +42,11 @@ public abstract class Entity implements IonObjBundled, Updateable { // default modules public final EntityModulePosition pos = new EntityModulePosition(this); public final EntityModuleHealth health = new EntityModuleHealth(this); + private double despawnDelay = 1; public Entity(EntityModel model, int eid) { - this.entityId = eid; this.model = model; @@ -218,16 +221,7 @@ public abstract class Entity implements IonObjBundled, Updateable { @DefaultImpl public boolean canRemoveCorpse() { - return isDead(); - } - - - /** - * Called when the dead entity was removed from the level. - */ - @DefaultImpl - public void onCorpseRemoved() - { + return isDead() && health.getTimeSinceLastDamage() > despawnDelay; } @@ -244,4 +238,10 @@ public abstract class Entity implements IonObjBundled, Updateable { health.receiveDamage(attackStrength); } + + public void setDespawnDelay(double despawnDelay) + { + this.despawnDelay = despawnDelay; + } + } diff --git a/src/mightypork/rogue/world/entity/entities/MonsterAi.java b/src/mightypork/rogue/world/entity/entities/MonsterAi.java index 90c033b..15411fd 100644 --- a/src/mightypork/rogue/world/entity/entities/MonsterAi.java +++ b/src/mightypork/rogue/world/entity/entities/MonsterAi.java @@ -179,6 +179,11 @@ public class MonsterAi extends EntityModule implements EntityMoveListener { if (chasing && !entity.pos.isMoving()) { final Entity prey = getPreyEntity(); + if(prey==null) { + // prey killed and cleaned from level + stopChasing(); + return; + } if (!isPreyInAttackRange(prey)) { //System.out.println("-upd STEP--"); @@ -214,10 +219,7 @@ public class MonsterAi extends EntityModule implements EntityMoveListener { } startChasing(prey); - } else { - //System.out.println("-- Prey is null."); - } - + } } diff --git a/src/mightypork/rogue/world/entity/entities/PlayerEntity.java b/src/mightypork/rogue/world/entity/entities/PlayerEntity.java index 82a9b50..3d2b9ef 100644 --- a/src/mightypork/rogue/world/entity/entities/PlayerEntity.java +++ b/src/mightypork/rogue/world/entity/entities/PlayerEntity.java @@ -21,8 +21,10 @@ public class PlayerEntity extends Entity { public PlayerAi(Entity entity) { super(entity); - health.setMaxHealth(24); - health.fill(); + setDespawnDelay(3); + + health.setMaxHealth(12); + health.fill(); // fill health bar to max } @@ -117,9 +119,9 @@ public class PlayerEntity extends Entity { return EntityType.PLAYER; } - @Override - public void receiveAttack(Entity attacker, int attackStrength) - { - // FIXME ignore attack - } +// @Override +// public void receiveAttack(Entity attacker, int attackStrength) +// { +// // FIXME ignore attack +// } } diff --git a/src/mightypork/rogue/world/entity/entities/RatAi.java b/src/mightypork/rogue/world/entity/entities/RatAi.java index 178fa92..3af9d6a 100644 --- a/src/mightypork/rogue/world/entity/entities/RatAi.java +++ b/src/mightypork/rogue/world/entity/entities/RatAi.java @@ -11,8 +11,8 @@ public class RatAi extends MonsterAi { super(entity); setAttackTime(1); - setScanTime(2); - setSleepTime(100); + setScanTime(1); + setSleepTime(10); } @@ -33,7 +33,7 @@ public class RatAi extends MonsterAi { @Override protected int getAttackStrength() { - return 1 + rand.nextInt(2); + return 1 + (rand.nextInt(5) == 0 ? 1 : 0); } diff --git a/src/mightypork/rogue/world/entity/entities/RatEntity.java b/src/mightypork/rogue/world/entity/entities/RatEntity.java index f57111b..dabbf1f 100644 --- a/src/mightypork/rogue/world/entity/entities/RatEntity.java +++ b/src/mightypork/rogue/world/entity/entities/RatEntity.java @@ -28,6 +28,10 @@ public class RatEntity extends Entity { pos.addMoveListener(ai); pos.setStepTime(0.5); + setDespawnDelay(3); + + health.setMaxHealth(3 + rand.nextInt(3)); + health.fill(); // fill health bar to max } diff --git a/src/mightypork/rogue/world/entity/modules/EntityModuleHealth.java b/src/mightypork/rogue/world/entity/modules/EntityModuleHealth.java index 6ec619f..59f5570 100644 --- a/src/mightypork/rogue/world/entity/modules/EntityModuleHealth.java +++ b/src/mightypork/rogue/world/entity/modules/EntityModuleHealth.java @@ -21,6 +21,8 @@ public class EntityModuleHealth extends EntityModule { protected int maxHealth = 1; protected boolean dead = false; + private double timeSinceLastDamage = Integer.MAX_VALUE; + @Override public void load(IonBundle bundle) throws IOException @@ -93,6 +95,7 @@ public class EntityModuleHealth extends EntityModule { public void receiveDamage(int attackStrength) { setHealth(health - attackStrength); + timeSinceLastDamage = 0; } @@ -101,4 +104,19 @@ public class EntityModuleHealth extends EntityModule { setHealth(maxHealth); } + + @Override + public void update(double delta) + { + if(timeSinceLastDamage < 3600) timeSinceLastDamage += delta; + } + + + /** + * @return seconds since last attack received (can be used for rendering) + */ + public double getTimeSinceLastDamage() + { + return timeSinceLastDamage; + } } diff --git a/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java b/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java index 0c5afe9..c09a396 100644 --- a/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java +++ b/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java @@ -43,6 +43,7 @@ public class EntityModulePosition extends EntityModule { public void save(IonBundle bundle) throws IOException { bundle.putSequence("path", path); + bundle.putBundled("lpos", lastPos); bundle.putBundled("pos", entityPos); bundle.put("step_time", stepTime); } @@ -52,6 +53,7 @@ public class EntityModulePosition extends EntityModule { public void load(IonBundle bundle) throws IOException { bundle.loadSequence("path", path); + bundle.loadBundled("lpos", lastPos); bundle.loadBundled("pos", entityPos); stepTime = bundle.get("step_time", stepTime); @@ -67,9 +69,29 @@ public class EntityModulePosition extends EntityModule { public void setCoord(Coord coord) { + freeTile(); // release old tile + entityPos.setTo(coord); lastPos.setTo(coord); cancelPath(); // discard remaining steps + + occupyTile(); + } + + + public void occupyTile() + { + if (entity.getLevel() != null) { + entity.getLevel().occupyTile(getCoord()); + } + } + + + public void freeTile() + { + if (entity.getLevel() != null) { + entity.getLevel().freeTile(getCoord()); + } } @@ -79,6 +101,8 @@ public class EntityModulePosition extends EntityModule { @Override public void update(double delta) { + if (entity.isDead()) return; // corpses dont walk + if (!entityPos.isFinished()) { entityPos.update(delta); } @@ -119,10 +143,10 @@ public class EntityModulePosition extends EntityModule { if (step.x() != 0) this.lastXDir = step.x(); if (step.y() != 0) this.lastYDir = step.y(); + freeTile(); lastPos.setTo(entityPos.getCoord()); - entity.getLevel().freeTile(lastPos);// entityPos.walk(step, stepTime); - entity.getLevel().occupyTile(planned); + occupyTile(); } } } diff --git a/src/mightypork/rogue/world/entity/renderers/EntityRendererMobLR.java b/src/mightypork/rogue/world/entity/renderers/EntityRendererMobLR.java index 8d550ea..8ed3aa5 100644 --- a/src/mightypork/rogue/world/entity/renderers/EntityRendererMobLR.java +++ b/src/mightypork/rogue/world/entity/renderers/EntityRendererMobLR.java @@ -5,6 +5,13 @@ import mightypork.gamecore.render.Render; import mightypork.gamecore.resources.textures.TxQuad; import mightypork.gamecore.resources.textures.TxSheet; import mightypork.gamecore.util.math.Calc; +import mightypork.gamecore.util.math.Easing; +import mightypork.gamecore.util.math.color.Color; +import mightypork.gamecore.util.math.color.pal.RGB; +import mightypork.gamecore.util.math.constraints.num.Num; +import mightypork.gamecore.util.math.constraints.num.NumConst; +import mightypork.gamecore.util.math.constraints.num.mutable.NumAnimated; +import mightypork.gamecore.util.math.constraints.num.mutable.NumVar; import mightypork.gamecore.util.math.constraints.rect.Rect; import mightypork.gamecore.util.math.constraints.vect.Vect; import mightypork.rogue.Res; @@ -24,6 +31,10 @@ public class EntityRendererMobLR extends EntityRenderer { protected final Entity entity; + private NumVar animRedVar = Num.makeVar(0); + + private Color hue = Color.rgb(Num.ONE, animRedVar, animRedVar); + public EntityRendererMobLR(Entity entity, String sheetKey) { @@ -35,6 +46,8 @@ public class EntityRendererMobLR extends EntityRenderer { @Override public void render(MapRenderContext context) { + double hurtTime = entity.health.getTimeSinceLastDamage(); + TxQuad q = sheet.getQuad(Calc.frag(entity.pos.getProgress())); if (entity.pos.lastXDir == -1) q = q.flipX(); @@ -43,9 +56,25 @@ public class EntityRendererMobLR extends EntityRenderer { final double w = tileRect.width().value(); final Vect visualPos = entity.pos.getVisualPos(); - Rect spriteRect = Rect.make(visualPos.x() * w, visualPos.y() * w, w, w); + double hurtOffset = (1 - Calc.clamp(hurtTime / 0.1, 0, 1)) * (entity.isDead() ? 0.3 : 0.05); + + + Rect spriteRect = Rect.make(visualPos.x() * w, (visualPos.y() - hurtOffset) * w, w, w); spriteRect = spriteRect.shrink(w * 0.05); - Render.quadTextured(spriteRect, q); + animRedVar.setTo(hurtTime / 0.3); + + Render.pushMatrix(); + + Render.translate(spriteRect.center()); + + if (entity.isDead()) { + Render.rotateZ(Calc.clamp(hurtTime / 0.3, 0, 1) * 90); + } + + double hw = spriteRect.width().half().value(); + + Render.quadTextured(Vect.ZERO.expand(hw, hw, hw, hw), q, hue.withAlpha(entity.isDead() ? 1 - hurtTime / 3 : 1)); + Render.popMatrix(); } } diff --git a/src/mightypork/rogue/world/level/Level.java b/src/mightypork/rogue/world/level/Level.java index 56f56c8..87c6daa 100644 --- a/src/mightypork/rogue/world/level/Level.java +++ b/src/mightypork/rogue/world/level/Level.java @@ -2,11 +2,9 @@ package mightypork.rogue.world.level; import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; + +import javax.print.attribute.standard.MediaSize.ISO; import mightypork.gamecore.logging.Log; import mightypork.gamecore.util.ion.IonBundle; @@ -218,8 +216,15 @@ public class Level implements MapAccess, IonObjBinary { } } + List toRemove = new ArrayList<>(); + for (final Entity e : entitySet) { e.update(delta); + if (e.isDead() && e.canRemoveCorpse()) toRemove.add(e); + } + + for (Entity e : toRemove) { + removeEntity(e); } } @@ -251,7 +256,7 @@ public class Level implements MapAccess, IonObjBinary { public boolean addEntity(Entity entity, Coord pos) { final Tile t = getTile(pos); - if (!t.isWalkable()) return false; + if (!t.isWalkable() || isOccupied(pos)) return false; addEntity(entity); @@ -273,13 +278,13 @@ public class Level implements MapAccess, IonObjBinary { // join to level & world entity.setLevel(this); + occupyTile(entity.getCoord()); } public void removeEntity(Entity entity) { - entityMap.remove(entity.getEntityId()); - entitySet.remove(entity); + removeEntity(entity.getEntityId()); } @@ -287,6 +292,7 @@ public class Level implements MapAccess, IonObjBinary { { final Entity removed = entityMap.remove(eid); entitySet.remove(removed); + freeTile(removed.getCoord()); } @@ -316,14 +322,13 @@ public class Level implements MapAccess, IonObjBinary { } - public void cleanCorpses() + /** + * @param pos tile coord + * @return true if something is standing there. + */ + public boolean isOccupied(Coord pos) { - for (final Entity e : entitySet) { - if (e.isDead() && e.canRemoveCorpse()) { - e.onCorpseRemoved(); - removeEntity(e); - } - } + return getTile(pos).isOccupied(); }