spacepaste

  1.  
  2. import functools
  3. import math
  4. import warnings
  5. from pandac.PandaModules import *
  6. from direct.task import TaskManagerGlobal
  7. from types import ClassType
  8. from zc.logic.logicnode import LogicNode
  9. from zc.shaders import shader_manipulator
  10. from zc.ai.empty import EmptyAi
  11. def strict_callback(callback):
  12. @functools.wraps(callback)
  13. def wrapper(self, event, issuer, target, *args, **kwargs):
  14. if (issuer != "logic") and (issuer != self._name):
  15. return
  16. if (target != self._name):
  17. return
  18. callback(self, event, issuer, target, *args, **kwargs)
  19. return wrapper
  20. def higher_callback(callback):
  21. @functools.wraps(callback)
  22. def wrapper(self, event, issuer, target, *args, **kwargs):
  23. if (issuer != "logic"):
  24. return
  25. if (target != self._name):
  26. return
  27. callback(self, event, issuer, target, *args, **kwargs)
  28. return wrapper
  29. def loose_callback(callback):
  30. # this one is just for the sake of having decorator
  31. @functools.wraps(callback)
  32. def wrapper(self, event, target, *args, **kwargs):
  33. if (target != self._name):
  34. return
  35. callback(self, event, target, *args, **kwargs)
  36. return wrapper
  37. class BaseUnit(LogicNode):
  38. def __init__(self, game, renderer, x, y, controller, Ai=None, name=None):
  39. LogicNode.__init__(self)
  40. self._game = game
  41. self._panda = renderer
  42. self._controller = controller
  43. self._name = self._generate_name(name)
  44. self._posx = x
  45. self._posy = y
  46. self._orient = 0
  47. self._siz = 0
  48. self.__taskname = "t" + self._name
  49. self._game.game_values["used_names"].append(self._name)
  50. # semaphores
  51. self._moving = False
  52. self._angle = [None, None]
  53. if Ai is None:
  54. self._ai = EmptyAi(self)
  55. else:
  56. self._ai = Ai(self)
  57. def _getheight(self, x, y):
  58. return self._game._map.get_c_height(x, y)
  59. self._actor = shader_manipulator.new_instance(self._game._map.f, self._name, self._model,
  60. self.__save_model)
  61. def update(self, **what):
  62. warnings.warn("No need for this when shaders are working!", DeprecationWarning)
  63. if len(what) > 0:
  64. if "all" in what:
  65. self.__update_task_tex()
  66. elif "size" in what:
  67. self.__update_task_size()
  68. else:
  69. self.__update_task()
  70. else:
  71. self.__update_task()
  72. def update_anim(self, anim):
  73. warnings.warn("No need for this when shaders are working!", DeprecationWarning)
  74. self._actor = self._actor.loop(anim)
  75. def __update_task(self):
  76. self._actor.setPos(self._posx, self._posy, self._getheight(self._posx, self._posy))
  77. self._actor.setHpr(self._orient, 0.0, 0.0)
  78. def __update_task_size(self):
  79. self._actor.setScale(self._siz, self._siz, self._siz)
  80. self.__update_task()
  81. def _generate_name(self, name):
  82. if name is None:
  83. id = "10000000"
  84. while id in self._game.game_values["used_names"]:
  85. id = str(self._game.game_values["static_random"].randint(10000000, 99999999))
  86. return id
  87. else:
  88. if name in self._game.game_values["used_names"]:
  89. raise KeyError("Name already used!")
  90. else:
  91. return name
  92. def _get_next_position(self, cx, cy, tx, ty):
  93. if self._angle[0] is None:
  94. deltax = tx - cx
  95. deltay = ty - cy
  96. self._angle[0] = math.atan2(deltax,deltay)
  97. self._angle[1] = self._angle[0]*180.0/math.pi
  98. if cx > tx:
  99. nx = cx - 1
  100. elif cx < tx:
  101. nx = cx + 1
  102. else:
  103. nx = cx
  104. if cy > ty:
  105. ny = cy - 1
  106. elif cy < ty:
  107. ny = cy + 1
  108. else:
  109. ny = cy
  110. return nx, ny, self._angle[1]
  111.