LondonerController.java 6.9 KB

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