LondonerController.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package me.hammerle.supersnuvi.entity.components.ai;
  2. import me.hammerle.snuviengine.api.Shader;
  3. import me.hammerle.snuviengine.api.Texture;
  4. import me.hammerle.supersnuvi.entity.Entity;
  5. import me.hammerle.supersnuvi.tiles.Location;
  6. import me.hammerle.supersnuvi.util.Face;
  7. import me.hammerle.supersnuvi.util.Utils;
  8. public class LondonerController extends Controller
  9. {
  10. private final static Texture LONDONER = new Texture("resources/londoner.png");
  11. private final boolean evil;
  12. private float ox = 0.0f;
  13. private float tx = 0.0f;
  14. private float ty = 0.0f;
  15. private int walkFrame = 0;
  16. private int transformFrame = -1;
  17. private int deathCounter = 0;
  18. private int deathFrame = 0;
  19. private Face direction = Face.LEFT;
  20. public LondonerController(Entity ent, boolean evil)
  21. {
  22. super(ent);
  23. this.evil = evil;
  24. }
  25. private boolean hasRedEyes()
  26. {
  27. return transformFrame >= 3;
  28. }
  29. @Override
  30. public boolean isAnimated()
  31. {
  32. return deathFrame < 7;
  33. }
  34. @Override
  35. public void tick()
  36. {
  37. if(evil)
  38. {
  39. if(transformFrame != -1)
  40. {
  41. if(transformFrame < 3)
  42. {
  43. ox = ent.getFace() == Face.RIGHT ? 0.0f: -36.0f;
  44. tx = transformFrame * 0.125f + 0.125f;
  45. ty = 0.375f;
  46. transformFrame++;
  47. return;
  48. }
  49. }
  50. else if(ent.getLevel().getHero().getSquaredDistance(ent) <= 16384) // 4 Tiles
  51. {
  52. transformFrame = 0;
  53. }
  54. }
  55. if(ent.getHealth().isDead())
  56. {
  57. ox = ent.getFace() == Face.RIGHT ? -32.0f: -4.0f;
  58. tx = deathFrame * 0.125f;
  59. ty = hasRedEyes() ? 0.125f : 0.25f;
  60. walkFrame = 0;
  61. deathCounter++;
  62. if(deathCounter >= 3)
  63. {
  64. deathCounter = 0;
  65. deathFrame++;
  66. }
  67. return;
  68. }
  69. if(hasRedEyes())
  70. {
  71. float hx = ent.getLevel().getHero().getCenterX();
  72. if(hx < ent.getCenterX())
  73. {
  74. ent.setMotionX(-ent.getMovement().getVelocityX());
  75. }
  76. else
  77. {
  78. ent.setMotionX(ent.getMovement().getVelocityX());
  79. }
  80. }
  81. else
  82. {
  83. if(direction == Face.LEFT)
  84. {
  85. ent.setMotionX(-ent.getMovement().getVelocityX());
  86. }
  87. else
  88. {
  89. ent.setMotionX(ent.getMovement().getVelocityX());
  90. }
  91. }
  92. ox = ent.getFace() == Face.RIGHT ? 0.0f: -36.0f;
  93. if(ent.isOnGround())
  94. {
  95. if(ent.getMotionX() == 0.0f)
  96. {
  97. tx = 0.875f;
  98. ty = hasRedEyes() ? 0.25f : 0.375f;
  99. }
  100. else
  101. {
  102. deathFrame = 0;
  103. walkFrame = (walkFrame + 1) % 6;
  104. tx = walkFrame * 0.125f;
  105. ty = hasRedEyes() ? 0.5f : 0.625f;
  106. }
  107. }
  108. else
  109. {
  110. deathFrame = 0;
  111. walkFrame = 0;
  112. tx = 0.125f;
  113. ty = hasRedEyes() ? 0.5f : 0.625f;
  114. }
  115. }
  116. @Override
  117. public void renderTick(float lag)
  118. {
  119. if(ent.getHealth().wasHurt())
  120. {
  121. Shader.setColorEnabled(true);
  122. Shader.setMixColorEnabled(true);
  123. Shader.setMixColor(1.0f, 0.0f, 0.0f, 1.0f);
  124. }
  125. if(ent.getHealth().wasHealed())
  126. {
  127. Shader.setColorEnabled(true);
  128. Shader.setMixColorEnabled(true);
  129. Shader.setMixColor(0.0f, 1.0f, 0.0f, 1.0f);
  130. }
  131. LONDONER.bind();
  132. float x = Utils.interpolate(ent.getLastX(), ent.getX(), lag);
  133. float y = Utils.interpolate(ent.getLastY(), ent.getY(), lag);
  134. float m1;
  135. float m2;
  136. if(ent.getFace() == Face.LEFT)
  137. {
  138. m1 = 64.0f;
  139. m2 = 0.0f;
  140. }
  141. else
  142. {
  143. m1 = 0.0f;
  144. m2 = 64.0f;
  145. }
  146. Shader.getTextureRenderer().drawRectangle(
  147. x + ox + m1, y,
  148. x + ox + m2, y + 64.0f,
  149. tx, ty,
  150. tx + 0.125f, ty + 0.125f);
  151. if(ent.getHealth().wasHurt() || ent.getHealth().wasHealed())
  152. {
  153. Shader.setColorEnabled(false);
  154. Shader.setMixColorEnabled(false);
  155. }
  156. }
  157. @Override
  158. public void onCollideWithTile(Location loc, Face face)
  159. {
  160. if(hasRedEyes())
  161. {
  162. if(face.getOpposite() == ent.getFace() && ent.getMotionX() == 0.0f)
  163. {
  164. ent.getMovement().jump();
  165. }
  166. }
  167. else
  168. {
  169. if(loc.getTile().shouldAiUseCollisionBox(loc.getX(), loc.getY()))
  170. {
  171. switch(face)
  172. {
  173. case LEFT:
  174. direction = Face.LEFT;
  175. break;
  176. case RIGHT:
  177. direction = Face.RIGHT;
  178. break;
  179. }
  180. }
  181. }
  182. }
  183. @Override
  184. public void onCollideWithEntity(Entity ent, Face face)
  185. {
  186. if(ent.getItemCollector().isHero() && hasRedEyes())
  187. {
  188. ent.getHealth().addHealthPercent(-0.1f);
  189. ent.setMotionY(ent.getMotionY() - 20.0f);
  190. float hx = ent.getLevel().getHero().getCenterX();
  191. if(hx < ent.getCenterX())
  192. {
  193. ent.setMotionX(ent.getMotionX() - 10.0f);
  194. }
  195. else
  196. {
  197. ent.setMotionX(ent.getMotionX() + 10.0f);
  198. }
  199. }
  200. }
  201. }