# HG changeset patch # User Thibaut Girka # Date 1314391390 -7200 # Node ID e2cb9d434dc2d8f4215b16b83d469ad03a03475a # Parent a701a89192a9cc5431759829c58c0f1764bf48ca Add support for a few opcodes. diff --git a/pytouhou/formats/ecl.py b/pytouhou/formats/ecl.py --- a/pytouhou/formats/ecl.py +++ b/pytouhou/formats/ecl.py @@ -91,7 +91,7 @@ class ECL(object): 90: ('iiii', None), 92: ('i', None), #93: set_spellcard, a string is there - 94: ('', None), + 94: ('', 'end_spellcard'), 95: ('ifffhhi', None), 96: ('', None), 97: ('i', 'set_anim'), @@ -102,18 +102,18 @@ class ECL(object): 102: ('iffff', None), 103: ('fff', 'set_enemy_hitbox'), 104: ('i', None), - 105: ('i', 'set_vulnerable'), + 105: ('i', 'set_damageable'), 106: ('i', 'play_sound'), 107: ('i', None), 108: ('i', 'set_death_callback?'), 109: ('ii', 'memory_write_int'), 111: ('i', 'set_life'), - 112: ('i', None), + 112: ('i', 'set_ellapsed_time'), 113: ('i', 'set_low_life_trigger'), 114: ('i', 'set_low_life_callback'), 115: ('i', 'set_timeout'), - 116: ('i', None), - 117: ('i', None), + 116: ('i', 'set_timeout_callback'), + 117: ('i', 'set_touchable'), 118: ('iihh', None), 119: ('i', 'drop_bonus'), 120: ('i', None), diff --git a/pytouhou/game/eclrunner.py b/pytouhou/game/eclrunner.py --- a/pytouhou/game/eclrunner.py +++ b/pytouhou/game/eclrunner.py @@ -478,8 +478,8 @@ class ECLRunner(object): @instruction(105) - def set_vulnerable(self, vulnerable): - self._enemy.vulnerable = bool(vulnerable & 1) + def set_damageable(self, vulnerable): + self._enemy.damageable = bool(vulnerable & 1) @instruction(108) @@ -502,6 +502,15 @@ class ECLRunner(object): self._enemy.life = value + @instruction(112) + def set_ellapsed_time(self, value): + """Sets the enemy's frame counter. + This is used for timeouts, where the framecounter is compared to the + timeout value (what's displayed is (enemy.timeout - enemy.frame) // 60). + """ + self._enemy.frame = value + + @instruction(113) def set_low_life_trigger(self, value): self._enemy.low_life_trigger = value @@ -517,6 +526,20 @@ class ECLRunner(object): self._enemy.timeout = timeout + @instruction(116) + def set_timeout_callback(self, sub): + self._enemy.timeout_callback = sub + + + @instruction(117) + def set_touchable(self, value): + """Defines whether the enemy is “touchable”. + Bullets only collide with an enemy if it is “touchable”. + Likewise, ReimuA's homing attacks only target “touchable” enemies. + """ + self._enemy.touchable = bool(value) + + @instruction(126) def set_remaining_lives(self, lives): self._enemy.remaining_lives = lives diff --git a/pytouhou/game/enemymanager.py b/pytouhou/game/enemymanager.py --- a/pytouhou/game/enemymanager.py +++ b/pytouhou/game/enemymanager.py @@ -37,14 +37,17 @@ class Enemy(object): self.x, self.y = pos self.life = life self.max_life = life + self.touchable = True + self.damageable = True + self.death_flags = 0 self.pending_bullets = [] self.bullet_attributes = None self.bullet_launch_offset = (0, 0) - self.vulnerable = True self.death_callback = None self.low_life_callback = None self.low_life_trigger = None self.timeout = None + self.timeout_callback = None self.remaining_lives = -1 self.bullet_launch_interval = 0