caveman.lua 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. Caveman = extend(Person)
  2. Caveman.rangeRange = {200, 350}
  3. Caveman.reloadRange = {1, 1.5}
  4. ----------------
  5. -- Core
  6. ----------------
  7. function Caveman:activate()
  8. self.gender = love.math.random() < .5 and 'female' or 'male'
  9. self.index = love.math.random(1, self.gender == 'male' and 1 or 2)
  10. self.image = data.media.graphics.dinoland[self.gender]['normal' .. self.index]
  11. self.direction = 1
  12. --self.hasSpear = love.math.random() > .5
  13. self.state = self.state or self.idle
  14. self.walkTimer = 1
  15. self.reloadTimer = 0
  16. self.range = lume.random(unpack(self.rangeRange))
  17. Person.activate(self)
  18. end
  19. function Caveman:update()
  20. self.walkTimer = timer.rot(self.walkTimer)
  21. Person.update(self)
  22. end
  23. ----------------
  24. -- Helpers
  25. ----------------
  26. function Caveman:reloadSpear()
  27. self.reloadTimer = timer.rot(self.reloadTimer)
  28. end
  29. function Caveman:inRange()
  30. return self:distanceTo(ctx.pigeon) < self.range
  31. end
  32. ----------------
  33. -- States
  34. ----------------
  35. Caveman.idle = {}
  36. Caveman.idle.walkRate = {.4, .5}
  37. function Caveman.idle:update()
  38. self.image = data.media.graphics.dinoland[self.gender]['normal' .. self.index]
  39. if ctx.pigeon and self:distanceTo(ctx.pigeon) < 300 then
  40. self:changeState(love.math.random() < .5 and 'panic' or 'attack')
  41. end
  42. if self.walkTimer == 0 then
  43. self:hop(0)
  44. self.walkTimer = lume.random(unpack(self.state.walkRate))
  45. end
  46. end
  47. Caveman.panic = {}
  48. Caveman.panic.walkRate = {.3, .4}
  49. function Caveman.panic:update()
  50. self.direction = 1 -- -self:directionTo(ctx.pigeon)
  51. self.image = data.media.graphics.dinoland[self.gender]['panic' .. self.index]
  52. if self.walkTimer == 0 then
  53. self:hop(self.direction)
  54. self.walkTimer = lume.random(unpack(self.state.walkRate))
  55. end
  56. self:reloadSpear()
  57. end
  58. Caveman.attack = {}
  59. Caveman.attack.walkRate = {.4, .6}
  60. function Caveman.attack:update()
  61. self.direction = self:directionTo(ctx.pigeon)
  62. self.image = data.media.graphics.dinoland[self.gender]['normal' .. self.index]
  63. self:reloadSpear()
  64. if self:inRange() then
  65. if self.walkTimer == 0 and self.reloadTimer == 0 then
  66. self.reloadTimer = lume.random(unpack(self.reloadRange))
  67. ctx.projectiles:add(Spear, {x = self.body:getX(), y = self.body:getY() - self.h, direction = self.direction})
  68. end
  69. else
  70. if self.walkTimer == 0 then
  71. self:hop(self.direction)
  72. self.walkTimer = lume.random(unpack(self.state.walkRate))
  73. end
  74. end
  75. end