annotate pytouhou/vm/eclrunner.py @ 575:e4c9eafab6d0

Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sat, 26 Jul 2014 14:46:03 +0200
parents a0fa01cd9f70
children e15672733c93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
1 # -*- encoding: utf-8 -*-
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
2 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
3 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com>
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
4 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
5 ## This program is free software; you can redistribute it and/or modify
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
6 ## it under the terms of the GNU General Public License as published
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
7 ## by the Free Software Foundation; version 3 only.
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
8 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
9 ## This program is distributed in the hope that it will be useful,
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
12 ## GNU General Public License for more details.
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
13 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
14
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
15
313
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
16 from math import atan2, cos, sin, pi, hypot
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
17
58
3da4de9decd0 Use logging module
Thibaut Girka <thib@sitedethib.com>
parents: 57
diff changeset
18 from pytouhou.utils.helpers import get_logger
3da4de9decd0 Use logging module
Thibaut Girka <thib@sitedethib.com>
parents: 57
diff changeset
19
69
a142e57218a0 Refactor. Move VMs to pytouhou.vm.
Thibaut Girka <thib@sitedethib.com>
parents: 67
diff changeset
20 from pytouhou.vm.common import MetaRegistry, instruction
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
21
69
a142e57218a0 Refactor. Move VMs to pytouhou.vm.
Thibaut Girka <thib@sitedethib.com>
parents: 67
diff changeset
22 logger = get_logger(__name__)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
23
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
24
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
25
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
26 class ECLMainRunner(object):
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
27 __metaclass__ = MetaRegistry
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
28 __slots__ = ('_main', '_subs', '_game', 'frame',
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
29 'instruction_pointer', 'boss_wait', 'handlers')
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
30
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
31 def __init__(self, main, subs, game):
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
32 self._main = main
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
33 self._subs = subs
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
34 self._game = game
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
35 self.handlers = self._handlers[6]
180
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
36 self.frame = 0
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
37 self.boss_wait = False
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
38
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
39 self.instruction_pointer = 0
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
40
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
41
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
42 def run_iter(self):
284
91eb0afcb1e3 Fix time stop handling.
Thibaut Girka <thib@sitedethib.com>
parents: 283
diff changeset
43 if not self._game.boss:
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
44 self.boss_wait = False
284
91eb0afcb1e3 Fix time stop handling.
Thibaut Girka <thib@sitedethib.com>
parents: 283
diff changeset
45
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
46 while True:
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
47 try:
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
48 frame, sub, instr_type, args = self._main[self.instruction_pointer]
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
49 except IndexError:
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
50 break
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
51
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
52 # The msg_wait instruction stops the reading of the ECL, not just the frame incrementation.
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
53 if frame > self.frame or self._game.msg_wait or self.boss_wait:
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
54 break
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
55 else:
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
56 self.instruction_pointer += 1
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
57
180
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
58 if frame == self.frame:
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
59 try:
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
60 callback = self.handlers[instr_type]
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
61 except KeyError:
575
e4c9eafab6d0 Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 564
diff changeset
62 logger.debug('[%d - %04d] unhandled main opcode %d (args: %r)',
e4c9eafab6d0 Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 564
diff changeset
63 id(self), self.frame, instr_type, args)
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
64 else:
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
65 callback(self, sub, instr_type, *args)
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
66
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
67 if not (self._game.msg_wait or self.boss_wait):
180
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
68 self.frame += 1
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
69
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
70
171
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 169
diff changeset
71 def _pop_enemy(self, sub, instr_type, x, y, z, life, bonus_dropped, die_score):
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
72 if instr_type & 4:
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
73 if x < -990: #102h.exe@0x411820
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
74 x = self._game.prng.rand_double() * 368
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
75 if y < -990: #102h.exe@0x41184b
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
76 y = self._game.prng.rand_double() * 416
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
77 if z < -990: #102h.exe@0x411881
270
7a9135b88853 Partially fix some of Flandre's spellcards.
Thibaut Girka <thib@sitedethib.com>
parents: 269
diff changeset
78 z = self._game.prng.rand_double() * 800
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
79 enemy = self._game.new_enemy((x, y, z), life, instr_type,
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
80 bonus_dropped, die_score)
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
81 enemy.process = ECLRunner(self._subs, sub, enemy, self._game, self._pop_enemy) #TODO
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
82 enemy.process.run_iteration()
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
83
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
84
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
85 @instruction(0)
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
86 @instruction(2)
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
87 @instruction(4)
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
88 @instruction(6)
171
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 169
diff changeset
89 def pop_enemy(self, sub, instr_type, x, y, z, life, bonus_dropped, die_score):
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
90 if self._game.boss:
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
91 return
171
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 169
diff changeset
92 self._pop_enemy(sub, instr_type, x, y, z, life, bonus_dropped, die_score)
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
93
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
94
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
95 @instruction(8)
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
96 def call_msg(self, sub, instr_type):
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
97 self._game.new_msg(sub)
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
98
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
99
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
100 @instruction(9)
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
101 def wait_msg(self, sub, instr_type):
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
102 self._game.msg_wait = True
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
103
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
104
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
105 @instruction(10)
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
106 def resume_ecl(self, sub, instr_type, unk1, unk2):
545
bcff39c920ab Set boss mode directly from the enemy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 497
diff changeset
107 boss = self._game.boss
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
108 self._game.msg_wait = False
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
109 if not boss.boss_callback:
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
110 raise Exception #TODO
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
111 boss.boss_callback.fire()
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
112
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
113
283
b6c068c8f7f2 Fix ECL time flow. Spellcard do not stop time. Instruction 0xc does.
Thibaut Girka <thib@sitedethib.com>
parents: 279
diff changeset
114 @instruction(12)
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
115 def wait_for_boss_death(self, sub, instr_type):
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
116 self.boss_wait = True
283
b6c068c8f7f2 Fix ECL time flow. Spellcard do not stop time. Instruction 0xc does.
Thibaut Girka <thib@sitedethib.com>
parents: 279
diff changeset
117
b6c068c8f7f2 Fix ECL time flow. Spellcard do not stop time. Instruction 0xc does.
Thibaut Girka <thib@sitedethib.com>
parents: 279
diff changeset
118
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
119
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 96
diff changeset
120
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
121 class ECLRunner(object):
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
122 __metaclass__ = MetaRegistry
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
123 __slots__ = ('_subs', '_enemy', '_game', '_pop_enemy', 'variables', 'sub',
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
124 'frame', 'instruction_pointer', 'comparison_reg', 'stack',
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
125 'running', 'handlers')
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
126
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
127 def __init__(self, subs, sub, enemy, game, pop_enemy):
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
128 # Things not supposed to change
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
129 self._subs = subs
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
130 self._enemy = enemy
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
131 self._game = game
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
132 self._pop_enemy = pop_enemy
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
133 self.handlers = self._handlers[6]
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
134
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
135 self.running = True
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
136
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
137 # Things supposed to change (and be put in the stack)
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
138 self.variables = [0, 0, 0, 0,
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
139 0., 0., 0., 0.,
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
140 0, 0, 0, 0]
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
141 self.comparison_reg = 0
307
5930b33a0370 Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 306
diff changeset
142 self.switch_to_sub(sub)
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
143
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
144 self.stack = []
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
145
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
146
364
b07e2f71f240 Empty ECL stack when calling a callback.
Thibaut Girka <thib@sitedethib.com>
parents: 362
diff changeset
147 def switch_to_sub(self, sub, preserve_stack=False):
b07e2f71f240 Empty ECL stack when calling a callback.
Thibaut Girka <thib@sitedethib.com>
parents: 362
diff changeset
148 if not preserve_stack:
b07e2f71f240 Empty ECL stack when calling a callback.
Thibaut Girka <thib@sitedethib.com>
parents: 362
diff changeset
149 self.stack = []
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
150 self.running = True
291
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
151 self.frame = 0
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
152 self.sub = sub
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
153 self.instruction_pointer = 0
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
154
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
155
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
156 def run_iteration(self):
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
157 # Process script
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
158 while self.running:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
159 try:
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
160 frame, instr_type, rank_mask, param_mask, args = self._subs[self.sub][self.instruction_pointer]
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
161 except IndexError:
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
162 self.running = False
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
163 break
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
164
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
165 if frame > self.frame:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
166 break
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
167 else:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
168 self.instruction_pointer += 1
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
169
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
170 if not rank_mask & (0x100 << self._game.rank):
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
171 continue
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
172
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
173 if frame == self.frame:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
174 try:
376
69ec72b990a4 Support more than one version of a vm.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 372
diff changeset
175 callback = self.handlers[instr_type]
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
176 except KeyError:
575
e4c9eafab6d0 Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 564
diff changeset
177 logger.debug('[%d %r - %04d] unhandled opcode %d (args: %r)',
e4c9eafab6d0 Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 564
diff changeset
178 id(self), [self.sub] + [e[0] for e in self.stack],
e4c9eafab6d0 Don’t log every instruction executed, nobody is interested in that, and demote unhandled opcodes to debug.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 564
diff changeset
179 self.frame, instr_type, args)
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
180 else:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
181 callback(self, *args)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
182
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
183 self.frame += 1
316
f0be7ea62330 Fix a bug with ECL instruction 96, and fix overall ECL handling.
Thibaut Girka <thib@sitedethib.com>
parents: 313
diff changeset
184
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
185
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
186 def _getval(self, value):
48
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
187 if -10012 <= value <= -10001:
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
188 return self.variables[int(-10001-value)]
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
189 elif -10025 <= value <= -10013:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
190 if value == -10013:
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
191 return self._game.rank
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
192 elif value == -10014:
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
193 return self._game.difficulty
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
194 elif value == -10015:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
195 return self._enemy.x
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
196 elif value == -10016:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
197 return self._enemy.y
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
198 elif value == -10017:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
199 return self._enemy.z
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
200 elif value == -10018:
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
201 player = self._enemy.select_player()
494
6be9c99a3a24 Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 489
diff changeset
202 return player.x
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
203 elif value == -10019:
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
204 player = self._enemy.select_player()
494
6be9c99a3a24 Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 489
diff changeset
205 return player.y
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
206 elif value == -10021:
564
a0fa01cd9f70 Make Enemy.get_angle able to target any Element, not only Player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 545
diff changeset
207 player = self._enemy.select_player()
a0fa01cd9f70 Make Enemy.get_angle able to target any Element, not only Player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 545
diff changeset
208 return self._enemy.get_angle(player)
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
209 elif value == -10022:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
210 return self._enemy.frame
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
211 elif value == -10024:
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
212 return self._enemy.life
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
213 elif value == -10025:
494
6be9c99a3a24 Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 489
diff changeset
214 return self._enemy.select_player().character #TODO
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
215 raise NotImplementedError(value) #TODO
48
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
216 else:
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
217 return value
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
218
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
219
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
220 def _setval(self, variable_id, value):
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
221 if -10012 <= variable_id <= -10001:
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
222 self.variables[int(-10001-variable_id)] = value
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
223 elif -10025 <= variable_id <= -10013:
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
224 if variable_id == -10015:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
225 self._enemy.x = value
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
226 elif variable_id == -10016:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
227 self._enemy.y = value
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
228 elif variable_id == -10017:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
229 self._enemy.z = value
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
230 elif variable_id == -10022:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
231 self._enemy.frame = value
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
232 elif variable_id == -10024:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
233 self._enemy.life = value
55
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
234 else:
de358a7684c8 Fix a few bugs
Thibaut Girka <thib@sitedethib.com>
parents: 53
diff changeset
235 raise IndexError #TODO: proper exception
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
236 else:
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
237 raise IndexError #TODO: proper exception
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
238
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
239
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
240 @instruction(0)
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
241 def noop(self):
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
242 pass #TODO: Really?
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
243
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
244
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
245 @instruction(1)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
246 def destroy(self, arg):
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
247 #TODO: arg?
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 302
diff changeset
248 self._enemy.removed = True
48
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
249
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
250
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
251 @instruction(2)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
252 def relative_jump(self, frame, instruction_pointer):
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
253 """Jumps to a relative offset in the same subroutine.
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
254
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
255 Warning: the relative offset has been translated to an instruction pointer
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
256 by the ECL parsing code (see pytouhou.formats.ecl).
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
257 """
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
258 self.frame, self.instruction_pointer = frame, instruction_pointer
48
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
259
8353c33d53d4 Support a few more instructions
Thibaut Girka <thib@sitedethib.com>
parents: 47
diff changeset
260
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
261 @instruction(3)
53
Thibaut Girka <thib@sitedethib.com>
parents: 52
diff changeset
262 def relative_jump_ex(self, frame, instruction_pointer, variable_id):
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
263 """If the given variable is non-zero, decrease it by 1 and jump to a
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
264 relative offset in the same subroutine.
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
265
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
266 Warning: the relative offset has been translated to an instruction pointer
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
267 by the ECL parsing code (see pytouhou.formats.ecl).
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
268 """
91
f7525fa66bb0 Fix ECL instruction 3
Thibaut Girka <thib@sitedethib.com>
parents: 87
diff changeset
269 counter_value = self._getval(variable_id) - 1
f7525fa66bb0 Fix ECL instruction 3
Thibaut Girka <thib@sitedethib.com>
parents: 87
diff changeset
270 if counter_value > 0:
f7525fa66bb0 Fix ECL instruction 3
Thibaut Girka <thib@sitedethib.com>
parents: 87
diff changeset
271 self._setval(variable_id, counter_value)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
272 self.frame, self.instruction_pointer = frame, instruction_pointer
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
273
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
274
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
275 @instruction(4)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
276 @instruction(5)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
277 def set_variable(self, variable_id, value):
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
278 self._setval(variable_id, self._getval(value))
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
279
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
280
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
281 @instruction(6)
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
282 def set_random_int(self, variable_id, maxval):
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
283 """Set the specified variable to a random int in the [0, maxval) range.
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
284 """
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
285 self._setval(variable_id, int(self._getval(maxval) * self._game.prng.rand_double()))
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
286
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
287
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
288 @instruction(8)
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
289 def set_random_float(self, variable_id, maxval):
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
290 """Set the specified variable to a random float in [0, maxval) range.
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 51
diff changeset
291 """
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
292 self._setval(variable_id, self._getval(maxval) * self._game.prng.rand_double())
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
293
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
294
59
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
295 @instruction(9)
144
cadfc5e5ad7a Fix a stupid inversion of properties.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 140
diff changeset
296 def set_random_float2(self, variable_id, amp, minval):
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
297 self._setval(variable_id, self._getval(minval) + self._getval(amp) * self._game.prng.rand_double())
59
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
298
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
299
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
300 @instruction(10)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
301 def store_x(self, variable_id):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
302 self._setval(variable_id, self._enemy.x)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
303
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
304
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
305 @instruction(14)
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
306 @instruction(21)
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
307 def substract(self, variable_id, a, b):
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
308 #TODO: 14 takes only ints and 21 only floats.
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
309 # The original engine dereferences the variables in the type it waits for, so this isn't exactly the correct implementation, but the data don't contain such case.
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
310 self._setval(variable_id, self._getval(a) - self._getval(b))
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
311
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
312
87
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
313 @instruction(13)
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
314 @instruction(20)
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
315 def add(self, variable_id, a, b):
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
316 #TODO: 13 takes only ints and 20 only floats.
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
317 # The original engine dereferences the variables in the type it waits for, so this isn't exactly the correct implementation, but the data don't contain such case.
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
318 self._setval(variable_id, self._getval(a) + self._getval(b))
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
319
fda176f07d6d Fix add_int
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
320
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
321 @instruction(15)
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
322 def multiply_int(self, variable_id, a, b):
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
323 #TODO: takes only ints.
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
324 self._setval(variable_id, self._getval(a) * self._getval(b))
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
325
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
326
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
327 @instruction(16)
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
328 def divide_int(self, variable_id, a, b):
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
329 #TODO: takes only ints.
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
330 self._setval(variable_id, self._getval(a) // self._getval(b))
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
331
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
332
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
333 @instruction(17)
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
334 def modulo(self, variable_id, a, b):
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
335 self._setval(variable_id, self._getval(a) % self._getval(b))
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
336
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
337
96
54929d495654 Handle ECL instruction 18
Thibaut Girka <thib@sitedethib.com>
parents: 95
diff changeset
338 @instruction(18)
54929d495654 Handle ECL instruction 18
Thibaut Girka <thib@sitedethib.com>
parents: 95
diff changeset
339 def increment(self, variable_id):
54929d495654 Handle ECL instruction 18
Thibaut Girka <thib@sitedethib.com>
parents: 95
diff changeset
340 self._setval(variable_id, self._getval(variable_id) + 1)
54929d495654 Handle ECL instruction 18
Thibaut Girka <thib@sitedethib.com>
parents: 95
diff changeset
341
54929d495654 Handle ECL instruction 18
Thibaut Girka <thib@sitedethib.com>
parents: 95
diff changeset
342
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
343 @instruction(23)
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
344 def divide_float(self, variable_id, a, b):
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
345 #TODO: takes only floats.
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
346 self._setval(variable_id, self._getval(a) / self._getval(b))
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
347
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
348
77
6fa6d74a049a Handle a new ECL instruction, and add some names.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 76
diff changeset
349 @instruction(25)
6fa6d74a049a Handle a new ECL instruction, and add some names.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 76
diff changeset
350 def get_direction(self, variable_id, x1, y1, x2, y2):
6fa6d74a049a Handle a new ECL instruction, and add some names.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 76
diff changeset
351 #TODO: takes only floats.
147
a61c96265779 Fix a crash with ECL instruction 25
Thibaut Girka <thib@sitedethib.com>
parents: 144
diff changeset
352 self._setval(variable_id, atan2(self._getval(y2) - self._getval(y1), self._getval(x2) - self._getval(x1)))
77
6fa6d74a049a Handle a new ECL instruction, and add some names.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 76
diff changeset
353
6fa6d74a049a Handle a new ECL instruction, and add some names.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 76
diff changeset
354
155
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
355 @instruction(26)
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
356 def float_to_unit_circle(self, variable_id):
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
357 #TODO: takes only floats.
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
358 self._setval(variable_id, (self._getval(variable_id) + pi) % (2*pi) - pi)
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
359
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
360
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
361 @instruction(27)
63
8527fe640844 Implement simple arithmetic instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 62
diff changeset
362 @instruction(28)
65
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
363 def compare(self, a, b):
0efec109f798 Merge compare and substract functions, remove dangerous casts and add comments about differences with the original engine.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 64
diff changeset
364 #TODO: 27 takes only ints and 28 only floats.
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
365 a, b = self._getval(a), self._getval(b)
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
366 if a < b:
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
367 self.comparison_reg = -1
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
368 elif a == b:
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
369 self.comparison_reg = 0
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
370 else:
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
371 self.comparison_reg = 1
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
372
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
373
64
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
374 @instruction(29)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
375 def relative_jump_if_lower_than(self, frame, instruction_pointer):
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
376 if self.comparison_reg == -1:
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
377 self.relative_jump(frame, instruction_pointer)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
378
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
379
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
380 @instruction(30)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
381 def relative_jump_if_lower_or_equal(self, frame, instruction_pointer):
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
382 if self.comparison_reg != 1:
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
383 self.relative_jump(frame, instruction_pointer)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
384
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
385
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
386 @instruction(31)
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
387 def relative_jump_if_equal(self, frame, instruction_pointer):
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
388 if self.comparison_reg == 0:
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
389 self.relative_jump(frame, instruction_pointer)
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
390
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
391
64
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
392 @instruction(32)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
393 def relative_jump_if_greater_than(self, frame, instruction_pointer):
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
394 if self.comparison_reg == 1:
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
395 self.relative_jump(frame, instruction_pointer)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
396
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
397
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
398 @instruction(33)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
399 def relative_jump_if_greater_or_equal(self, frame, instruction_pointer):
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
400 if self.comparison_reg != -1:
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
401 self.relative_jump(frame, instruction_pointer)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
402
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
403
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
404 @instruction(34)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
405 def relative_jump_if_not_equal(self, frame, instruction_pointer):
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
406 if self.comparison_reg != 0:
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
407 self.relative_jump(frame, instruction_pointer)
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
408
d469012368b3 Implement conditional jumps.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 63
diff changeset
409
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
410 @instruction(35)
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
411 def call(self, sub, param1, param2):
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
412 self.stack.append((self.sub, self.frame, self.instruction_pointer,
195
52c0b9399413 Fix ECL function calls... again
Thibaut Girka <thib@sitedethib.com>
parents: 194
diff changeset
413 list(self.variables), self.comparison_reg))
185
68e6d3faeee6 Don’t reinitialize variables when another sub is called.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 183
diff changeset
414 self.variables[0] = param1
194
efa847ee8b3c Fix ECL function calls
Thibaut Girka <thib@sitedethib.com>
parents: 193
diff changeset
415 self.variables[4] = param2
364
b07e2f71f240 Empty ECL stack when calling a callback.
Thibaut Girka <thib@sitedethib.com>
parents: 362
diff changeset
416 self.switch_to_sub(sub, preserve_stack=True)
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
417
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
418
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
419 @instruction(36)
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
420 def ret(self):
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
421 self.sub, self.frame, self.instruction_pointer, self.variables, self.comparison_reg = self.stack.pop()
47
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
422
1f1793e7ec8e Handle a few more opcodes
Thibaut Girka <thib@sitedethib.com>
parents: 43
diff changeset
423
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
424 @instruction(39)
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
425 def call_if_equal(self, sub, param1, param2, a, b):
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
426 if self._getval(a) == self._getval(b):
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
427 self.call(sub, param1, param2)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
428
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
429
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
430 @instruction(43)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
431 def set_pos(self, x, y, z):
74
adac26098408 Handle variables in set_pos instruction (Daiyousei...)
Thibaut Girka <thib@sitedethib.com>
parents: 70
diff changeset
432 self._enemy.set_pos(self._getval(x), self._getval(y), self._getval(z))
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
433
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
434
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
435 @instruction(45)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
436 def set_angle_speed(self, angle, speed):
251
4b549894ef6b Change position/speed interpoletor handling to match the original game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 250
diff changeset
437 self._enemy.update_mode = 0
270
7a9135b88853 Partially fix some of Flandre's spellcards.
Thibaut Girka <thib@sitedethib.com>
parents: 269
diff changeset
438 self._enemy.angle, self._enemy.speed = self._getval(angle), self._getval(speed)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
439
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
440
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
441 @instruction(46)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
442 def set_rotation_speed(self, speed):
251
4b549894ef6b Change position/speed interpoletor handling to match the original game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 250
diff changeset
443 self._enemy.update_mode = 0
295
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
444 self._enemy.rotation_speed = self._getval(speed)
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
445
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
446
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
447 @instruction(47)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
448 def set_speed(self, speed):
251
4b549894ef6b Change position/speed interpoletor handling to match the original game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 250
diff changeset
449 self._enemy.update_mode = 0
295
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
450 self._enemy.speed = self._getval(speed)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
451
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
452
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
453 @instruction(48)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
454 def set_acceleration(self, acceleration):
251
4b549894ef6b Change position/speed interpoletor handling to match the original game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 250
diff changeset
455 self._enemy.update_mode = 0
295
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
456 self._enemy.acceleration = self._getval(acceleration)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
457
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
458
70
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
459 @instruction(49)
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
460 def set_random_angle(self, min_angle, max_angle):
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
461 angle = self._game.prng.rand_double() * (max_angle - min_angle) + min_angle
70
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
462 self._enemy.angle = angle
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
463
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
464
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
465 @instruction(50)
70
7c1f20407b3e Add set_random_angle support
Thibaut Girka <thib@sitedethib.com>
parents: 69
diff changeset
466 def set_random_angle_ex(self, min_angle, max_angle):
59
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
467 if self._enemy.screen_box:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
468 minx, miny, maxx, maxy = self._enemy.screen_box
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
469 else:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
470 minx, miny, maxx, maxy = (0., 0., 0., 0.)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
471
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
472 angle = self._game.prng.rand_double() * (max_angle - min_angle) + min_angle
59
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
473 sa, ca = sin(angle), cos(angle)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
474
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
475 if self._enemy.x > maxx - 96.0:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
476 ca = -abs(ca)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
477 elif self._enemy.x < minx + 96.0:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
478 ca = abs(ca)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
479
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
480 if self._enemy.y > maxy - 48.0:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
481 sa = -abs(sa)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
482 elif self._enemy.y < miny + 48.0:
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
483 sa = abs(sa)
4fe37a620b22 Handle set_random_angle properly! At last!
Thibaut Girka <thib@sitedethib.com>
parents: 58
diff changeset
484 self._enemy.angle = atan2(sa, ca)
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
485
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
486
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
487 @instruction(51)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
488 def target_player(self, unknown, speed):
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
489 #TODO: unknown
564
a0fa01cd9f70 Make Enemy.get_angle able to target any Element, not only Player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 545
diff changeset
490 player = self._enemy.select_player()
a0fa01cd9f70 Make Enemy.get_angle able to target any Element, not only Player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 545
diff changeset
491
251
4b549894ef6b Change position/speed interpoletor handling to match the original game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 250
diff changeset
492 self._enemy.update_mode = 0
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
493 self._enemy.speed = speed
564
a0fa01cd9f70 Make Enemy.get_angle able to target any Element, not only Player.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 545
diff changeset
494 self._enemy.angle = self._enemy.get_angle(player)
43
7195aaf95f6e Fix set_counter, and relative_jump(_ex)
Thibaut Girka <thib@sitedethib.com>
parents: 42
diff changeset
495
7195aaf95f6e Fix set_counter, and relative_jump(_ex)
Thibaut Girka <thib@sitedethib.com>
parents: 42
diff changeset
496
183
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
497 @instruction(52)
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
498 def move_in_decel(self, duration, angle, speed):
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
499 self._enemy.angle, self._enemy.speed = angle, speed
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
500 self._enemy.stop_in(duration, lambda x: 2. * x - x ** 2)
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
501
b6d7ce644f34 Implement two new ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 182
diff changeset
502
76
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
503 @instruction(56)
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
504 def move_to_linear(self, duration, x, y, z):
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
505 self._enemy.move_to(duration,
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
506 self._getval(x), self._getval(y), self._getval(z),
489
59bd29568753 Remove identity lambda for interpolators, improves performances slightly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 471
diff changeset
507 None)
76
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
508
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
509
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
510 @instruction(57)
76
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
511 def move_to_decel(self, duration, x, y, z):
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
512 self._enemy.move_to(duration,
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
513 self._getval(x), self._getval(y), self._getval(z),
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
514 lambda x: 2. * x - x ** 2)
62
1f591adcea04 Fix animation determination (ins_98 stuff) and some interpolation functions
Thibaut Girka <thib@sitedethib.com>
parents: 59
diff changeset
515
1f591adcea04 Fix animation determination (ins_98 stuff) and some interpolation functions
Thibaut Girka <thib@sitedethib.com>
parents: 59
diff changeset
516
1f591adcea04 Fix animation determination (ins_98 stuff) and some interpolation functions
Thibaut Girka <thib@sitedethib.com>
parents: 59
diff changeset
517 @instruction(59)
76
f305c0e406d6 Handle all move_to_* ECL instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 75
diff changeset
518 def move_to_accel(self, duration, x, y, z):
140
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
519 self._enemy.move_to(duration,
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
520 self._getval(x), self._getval(y), self._getval(z),
a9d46c4b5764 Fix move_to (handle variables) and spawn_enemy
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
521 lambda x: x ** 2)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
522
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
523
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
524 @instruction(61)
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
525 def stop_in(self, duration):
489
59bd29568753 Remove identity lambda for interpolators, improves performances slightly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 471
diff changeset
526 self._enemy.stop_in(duration, None)
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
527
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
528
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
529 @instruction(63)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
530 def stop_in_accel(self, duration):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
531 self._enemy.stop_in(duration, lambda x: 1. - x)
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
532
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
533
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
534 @instruction(65)
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
535 def set_screen_box(self, xmin, ymin, xmax, ymax):
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
536 self._enemy.screen_box = xmin, ymin, xmax, ymax
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
537
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
538
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
539 @instruction(66)
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
540 def clear_screen_box(self):
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
541 self._enemy.screen_box = None
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
542
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
543
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
544 @instruction(67)
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
545 def set_bullet_attributes1(self, anim, sprite_idx_offset, bullets_per_shot,
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
546 number_of_shots, speed, speed2, launch_angle,
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
547 angle, flags):
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
548 self._enemy.set_bullet_attributes(67, anim,
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
549 self._getval(sprite_idx_offset),
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
550 self._getval(bullets_per_shot),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
551 self._getval(number_of_shots),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
552 self._getval(speed),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
553 self._getval(speed2),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
554 self._getval(launch_angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
555 self._getval(angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
556 flags)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
557
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
558
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
559 @instruction(68)
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
560 def set_bullet_attributes2(self, anim, sprite_idx_offset, bullets_per_shot,
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
561 number_of_shots, speed, speed2, launch_angle,
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
562 angle, flags):
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
563 self._enemy.set_bullet_attributes(68, anim,
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
564 self._getval(sprite_idx_offset),
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
565 self._getval(bullets_per_shot),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
566 self._getval(number_of_shots),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
567 self._getval(speed),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
568 self._getval(speed2),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
569 self._getval(launch_angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
570 self._getval(angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
571 flags)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
572
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
573
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
574 @instruction(69)
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
575 def set_bullet_attributes3(self, anim, sprite_idx_offset, bullets_per_shot,
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
576 number_of_shots, speed, speed2, launch_angle,
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
577 angle, flags):
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
578 self._enemy.set_bullet_attributes(69, anim,
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
579 self._getval(sprite_idx_offset),
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
580 self._getval(bullets_per_shot),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
581 self._getval(number_of_shots),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
582 self._getval(speed),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
583 self._getval(speed2),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
584 self._getval(launch_angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
585 self._getval(angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
586 flags)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
587
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
588
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
589 @instruction(70)
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
590 def set_bullet_attributes4(self, anim, sprite_idx_offset, bullets_per_shot,
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
591 number_of_shots, speed, speed2, launch_angle,
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
592 angle, flags):
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
593 self._enemy.set_bullet_attributes(70, anim,
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
594 self._getval(sprite_idx_offset),
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
595 self._getval(bullets_per_shot),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
596 self._getval(number_of_shots),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
597 self._getval(speed),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
598 self._getval(speed2),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
599 self._getval(launch_angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
600 self._getval(angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
601 flags)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
602
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
603
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
604 @instruction(71)
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
605 def set_bullet_attributes5(self, anim, sprite_idx_offset, bullets_per_shot,
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
606 number_of_shots, speed, speed2, launch_angle,
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
607 angle, flags):
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
608 self._enemy.set_bullet_attributes(71, anim,
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
609 self._getval(sprite_idx_offset),
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
610 self._getval(bullets_per_shot),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
611 self._getval(number_of_shots),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
612 self._getval(speed),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
613 self._getval(speed2),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
614 self._getval(launch_angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
615 self._getval(angle),
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
616 flags)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
617
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
618
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
619 @instruction(74)
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
620 def set_bullet_attributes6(self, anim, sprite_idx_offset, bullets_per_shot,
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
621 number_of_shots, speed, speed2, launch_angle,
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
622 angle, flags):
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
623 #TODO
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
624 self._enemy.set_bullet_attributes(74, anim,
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
625 self._getval(sprite_idx_offset),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
626 self._getval(bullets_per_shot),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
627 self._getval(number_of_shots),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
628 self._getval(speed),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
629 self._getval(speed2),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
630 self._getval(launch_angle),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
631 self._getval(angle),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
632 flags)
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
633
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
634
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
635 @instruction(75)
106
c7847bfed427 Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 105
diff changeset
636 def set_bullet_attributes7(self, anim, sprite_idx_offset, bullets_per_shot,
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
637 number_of_shots, speed, speed2, launch_angle,
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
638 angle, flags):
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
639 #TODO
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
640 self._enemy.set_bullet_attributes(75, anim,
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
641 self._getval(sprite_idx_offset),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
642 self._getval(bullets_per_shot),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
643 self._getval(number_of_shots),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
644 self._getval(speed),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
645 self._getval(speed2),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
646 self._getval(launch_angle),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
647 self._getval(angle),
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
648 flags)
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
649
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 82
diff changeset
650
78
bcf965ede96c Fix/rename/comment a few things
Thibaut Girka <thib@sitedethib.com>
parents: 77
diff changeset
651 @instruction(76)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
652 def set_bullet_interval(self, value):
182
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
653 self._enemy.set_bullet_launch_interval(value)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
654
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
655
78
bcf965ede96c Fix/rename/comment a few things
Thibaut Girka <thib@sitedethib.com>
parents: 77
diff changeset
656 @instruction(77)
bcf965ede96c Fix/rename/comment a few things
Thibaut Girka <thib@sitedethib.com>
parents: 77
diff changeset
657 def set_bullet_interval_ex(self, value):
329
1bb78c469f64 Fix difficulty influence on bullet launch interval, and fix instruction 77's rand usage
Thibaut Girka <thib@sitedethib.com>
parents: 320
diff changeset
658 self._enemy.set_bullet_launch_interval(value, self._game.prng.rand_uint32())
78
bcf965ede96c Fix/rename/comment a few things
Thibaut Girka <thib@sitedethib.com>
parents: 77
diff changeset
659
bcf965ede96c Fix/rename/comment a few things
Thibaut Girka <thib@sitedethib.com>
parents: 77
diff changeset
660
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
661 @instruction(78)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
662 def set_delay_attack(self):
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
663 self._enemy.delay_attack = True
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
664
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
665
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
666 @instruction(79)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
667 def set_no_delay_attack(self):
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
668 self._enemy.delay_attack = False
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
669
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
670
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
671 @instruction(81)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
672 def set_bullet_launch_offset(self, x, y, z):
134
e9ac3640280b Add support for enemy spawnling enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 128
diff changeset
673 self._enemy.bullet_launch_offset = (self._getval(x), self._getval(y))
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
674
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
675
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
676 @instruction(82)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
677 def set_extended_bullet_attributes(self, *attributes):
102
ad9297e0fbf2 Handle variables in ECL instruction 82
Thibaut Girka <thib@sitedethib.com>
parents: 100
diff changeset
678 self._enemy.extended_bullet_attributes = tuple(self._getval(attr) for attr in attributes)
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
679
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
680
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 147
diff changeset
681 @instruction(83)
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 147
diff changeset
682 def change_bullets_into_star_items(self):
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
683 self._game.change_bullets_into_star_items()
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 147
diff changeset
684
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 147
diff changeset
685
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
686 @instruction(85)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
687 def new_laser(self, laser_type, sprite_idx_offset, angle, speed,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
688 start_offset, end_offset, max_length, width,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
689 start_duration, duration, end_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
690 grazing_delay, grazing_extra_duration, unknown):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
691 self._enemy.new_laser(85, laser_type, sprite_idx_offset, self._getval(angle), speed,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
692 start_offset, end_offset, max_length, width,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
693 start_duration, duration, end_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
694 grazing_delay, grazing_extra_duration, unknown)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
695
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
696
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
697 @instruction(86)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
698 def new_laser_towards_player(self, laser_type, sprite_idx_offset, angle, speed,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
699 start_offset, end_offset, max_length, width,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
700 start_duration, duration, end_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
701 grazing_delay, grazing_extra_duration, unknown):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
702 self._enemy.new_laser(86, laser_type, sprite_idx_offset, self._getval(angle), speed,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
703 start_offset, end_offset, max_length, width,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
704 start_duration, duration, end_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
705 grazing_delay, grazing_extra_duration, unknown)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
706
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
707
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
708 @instruction(87)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
709 def set_upcoming_laser_id(self, laser_id):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
710 self._enemy.current_laser_id = laser_id
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
711
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
712
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
713 @instruction(88)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
714 def alter_laser_angle(self, laser_id, delta):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
715 try:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
716 laser = self._enemy.laser_by_id[laser_id]
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
717 except KeyError:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
718 pass #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
719 else:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
720 laser.angle += self._getval(delta)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
721
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
722
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
723 @instruction(90)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
724 def reposition_laser(self, laser_id, ox, oy, oz):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
725 try:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
726 laser = self._enemy.laser_by_id[laser_id]
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
727 except KeyError:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
728 pass #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
729 else:
471
06f0eeb519bb Make Laser and Orb extension types, and use that where possible.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 457
diff changeset
730 laser.set_base_pos(self._enemy.x + ox, self._enemy.y + oy)
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
731
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
732
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
733 @instruction(92)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
734 def cancel_laser(self, laser_id):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
735 try:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
736 laser = self._enemy.laser_by_id[laser_id]
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
737 except KeyError:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
738 pass #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
739 else:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
740 laser.cancel()
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
741
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 273
diff changeset
742
95
e2d8f2a56ea4 Handle ECL opcodes with string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 93
diff changeset
743 @instruction(93)
276
754ff6452d7e Fix spellcard number 0.
Thibaut Girka <thib@sitedethib.com>
parents: 275
diff changeset
744 def set_spellcard(self, face, number, name):
95
e2d8f2a56ea4 Handle ECL opcodes with string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 93
diff changeset
745 #TODO: display it on the game.
308
7a464291dd9d Fix difficulty modifiers within spellcards.
Thibaut Girka <thib@sitedethib.com>
parents: 307
diff changeset
746 self._enemy.difficulty_coeffs = (-.5, .5, 0, 0, 0, 0)
160
606468ab4f7b Clean up bullets when starting a spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
747 self._game.change_bullets_into_star_items()
457
4ccc47828002 Display the name of a spellcard and the face of its invoker.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 445
diff changeset
748 self._game.spellcard = (number, name, face)
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
749 self._game.enable_spellcard_effect()
155
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
750
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
751
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
752 @instruction(94)
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
753 def end_spellcard(self):
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
754 #TODO: return everything back to normal
ed86bec43b93 Implement two new instructions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 154
diff changeset
755 #TODO: give the spellcard bonus.
320
1a4ffdda8735 Cancel the bullets when a boss is killed and transfer them to the score.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 318
diff changeset
756 if self._game.spellcard is not None:
180
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
757 self._game.change_bullets_into_star_items()
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 178
diff changeset
758 self._game.spellcard = None
306
52d791bb7c32 Rename a few attributes/methods to make a little more sense.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
759 self._game.disable_spellcard_effect()
95
e2d8f2a56ea4 Handle ECL opcodes with string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 93
diff changeset
760
e2d8f2a56ea4 Handle ECL opcodes with string.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 93
diff changeset
761
134
e9ac3640280b Add support for enemy spawnling enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 128
diff changeset
762 @instruction(95)
171
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 169
diff changeset
763 def pop_enemy(self, sub, x, y, z, life, bonus_dropped, die_score):
372
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
764 self._pop_enemy(sub, 0, self._getval(x),
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
765 self._getval(y),
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
766 self._getval(z),
704bea2e4360 Use a future-proof ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 365
diff changeset
767 life, bonus_dropped, die_score)
134
e9ac3640280b Add support for enemy spawnling enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 128
diff changeset
768
e9ac3640280b Add support for enemy spawnling enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 128
diff changeset
769
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
770 @instruction(96)
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
771 def kill_enemies(self):
359
130d258217f3 Fix crash in ECL's kill_enemies
Thibaut Girka <thib@sitedethib.com>
parents: 358
diff changeset
772 self._game.kill_enemies()
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
773
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
774
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
775 @instruction(97)
242
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
776 def set_anim(self, script):
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
777 self._enemy.set_anim(script)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
778
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
779
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
780 @instruction(98)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
781 def set_multiple_anims(self, default, end_left, end_right, left, right):
295
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
782 if left == -1:
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
783 self._enemy.movement_dependant_sprites = None
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
784 else:
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
785 self._enemy.movement_dependant_sprites = end_left, end_right, left, right
2a60642e8892 Fix Remilia’s bat form.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 291
diff changeset
786 self._enemy.set_anim(default)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
787
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
788
242
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
789 @instruction(99)
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
790 def set_aux_anm(self, number, script):
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
791 self._enemy.set_aux_anm(number, script)
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
792
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
793
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
794 @instruction(100)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
795 def set_death_anim(self, sprite_index):
181
184196480f59 Don’t use the useless eff00.anm and implement particles (grazing, death, and more).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 180
diff changeset
796 self._enemy.death_anim = sprite_index
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
797
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
798
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
799 @instruction(101)
177
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
800 def set_boss_mode(self, value):
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
801 #TODO: if there are multiple boss, spawned by a 95,
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
802 # only the last one has her life displayed,
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
803 # but standard enemies are blocked only until any of them is killed.
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
804 if value == 0:
545
bcff39c920ab Set boss mode directly from the enemy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 497
diff changeset
805 self._enemy.set_boss(True)
177
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
806 elif value == -1:
545
bcff39c920ab Set boss mode directly from the enemy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 497
diff changeset
807 self._enemy.set_boss(False)
177
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
808 else:
6e8653ff2b23 Fix boss mode and don’t suicide the boss when she just want to kill the other enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
809 raise Exception #TODO
57
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
810
694f25881d0f Fix move_to interpolation, add support for a few ANM and ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 55
diff changeset
811
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
812 @instruction(103)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
813 def set_hitbox(self, width, height, depth):
441
e8dc95a2a287 Make pytouhou.game.enemy an extension type.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 430
diff changeset
814 self._enemy.set_hitbox(width, height)
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
815
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
816
79
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
817 @instruction(104)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
818 def set_collidable(self, collidable):
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
819 """Defines whether the enemy is “collidable”.
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
820 A collision between a collidable enemy and the player will kill the player.
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
821 """
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
822 self._enemy.collidable = bool(collidable & 1)
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
823
ffe2c2b9912c Handle a few more ECL instructions. Prepare for bullet handling \o/
Thibaut Girka <thib@sitedethib.com>
parents: 78
diff changeset
824
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
825 @instruction(105)
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
826 def set_damageable(self, damageable):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
827 self._enemy.damageable = bool(damageable & 1)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
828
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
829
343
94fdb6c782c1 Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 329
diff changeset
830 @instruction(106)
94fdb6c782c1 Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 329
diff changeset
831 def play_sound(self, index):
94fdb6c782c1 Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 329
diff changeset
832 self._enemy.play_sound(index)
94fdb6c782c1 Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 329
diff changeset
833
94fdb6c782c1 Implement sfx for player and enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 329
diff changeset
834
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
835 @instruction(107)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
836 def set_death_flags(self, death_flags):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
837 self._enemy.death_flags = death_flags
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
838
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
839
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
840 @instruction(108)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
841 def set_death_callback(self, sub):
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
842 self._enemy.death_callback.enable(self.switch_to_sub, (sub,))
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
843
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
844
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
845 @instruction(109)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
846 def memory_write(self, value, index):
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
847 if index == 0:
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
848 self._enemy.boss_callback.enable(self.switch_to_sub, (value,))
103
789994275968 Fix boss callback, handle a few more callbacks
Thibaut Girka <thib@sitedethib.com>
parents: 102
diff changeset
849 else:
789994275968 Fix boss callback, handle a few more callbacks
Thibaut Girka <thib@sitedethib.com>
parents: 102
diff changeset
850 raise Exception #TODO
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
851
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
852
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
853 @instruction(111)
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
854 def set_life(self, value):
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
855 self._enemy.life = value
346
862011266f2c Add a gauge and use it for the enemy life bar.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 343
diff changeset
856 self._game.interface.set_boss_life()
51
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
857
0707ff53e7b5 Add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
858
67
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
859 @instruction(112)
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
860 def set_ellapsed_time(self, value):
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
861 """Sets the enemy's frame counter.
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
862 This is used for timeouts, where the framecounter is compared to the
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
863 timeout value (what's displayed is (enemy.timeout - enemy.frame) // 60).
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
864 """
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
865 self._enemy.frame = value
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
866
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
867
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
868 @instruction(113)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
869 def set_low_life_trigger(self, value):
291
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
870 #TODO: the enemy's life bar fills in 100 frames.
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
871 # During those frames, the ECL doesn't seem to be executed.
f6b8483a990d Refactor a bit and fix Rumia's disparition.
Thibaut Girka <thib@sitedethib.com>
parents: 287
diff changeset
872 # However, the ECL isn't directly paused by this instruction itself.
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
873 self._enemy.low_life_trigger = value
347
b150ed7188a2 Show the size of the spellcard life.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 346
diff changeset
874 self._game.interface.set_spell_life()
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
875
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
876
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
877 @instruction(114)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
878 def set_low_life_callback(self, sub):
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
879 self._enemy.low_life_callback.enable(self.switch_to_sub, (sub,))
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
880
23
444ac7bca7bc Refacto ECL stuff, add support for a few instructions, and add some culling
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
881
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
882 @instruction(115)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
883 def set_timeout(self, timeout):
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 284
diff changeset
884 self._enemy.frame = 0
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
885 self._enemy.timeout = timeout
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
886
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
887
67
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
888 @instruction(116)
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
889 def set_timeout_callback(self, sub):
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
890 self._enemy.timeout_callback.enable(self.switch_to_sub, (sub,))
67
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
891
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
892
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
893 @instruction(117)
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
894 def set_touchable(self, value):
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
895 """Defines whether the enemy is “touchable”.
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
896 Bullets only collide with an enemy if it is “touchable”.
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
897 Likewise, ReimuA's homing attacks only target “touchable” enemies.
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
898 """
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
899 self._enemy.touchable = bool(value)
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
900
e2cb9d434dc2 Add support for a few opcodes.
Thibaut Girka <thib@sitedethib.com>
parents: 65
diff changeset
901
389
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
902 @instruction(118)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
903 def drop_particles(self, anim, number, a, b, c, d):
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
904 #TODO: find the utility of the other values.
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
905
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
906 if number == 0 or number > 640: #TODO: remove that hardcoded 640, and verify it.
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
907 number = 640
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
908
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
909 if anim == -1:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
910 return
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
911 if 0 <= anim <= 2:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
912 self._game.new_effect((self._enemy.x, self._enemy.y), anim + 3, number=number)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
913 elif anim == 3:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
914 self._game.new_particle((self._enemy.x, self._enemy.y), 6, 256, number=number) #TODO: make it go back a bit at the end.
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
915 elif 4 <= anim <= 15:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
916 self._game.new_particle((self._enemy.x, self._enemy.y), anim + 5, 192, number=number)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
917 elif anim == 16:
430
c9433188ffdb Remove AnmWrapper, since ANMs are lists of entries now.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 389
diff changeset
918 self._game.new_effect((self._enemy.x, self._enemy.y), 0, self._game.spellcard_effect_anm, number=number)
389
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
919 elif anim == 17:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
920 self._game.new_particle((self._enemy.x, self._enemy.y), anim - 10, 640, number=number, reverse=True, duration=60)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
921 elif anim == 18:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
922 self._game.new_particle((self._enemy.x, self._enemy.y), anim - 10, 640, number=number, reverse=True, duration=240)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
923 elif anim == 19:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
924 self._game.new_effect((self._enemy.x, self._enemy.y), anim - 10, number=number)
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
925 else:
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
926 raise Exception #TODO
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
927
eef492100f4c Add "explosion", instruction 118.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 376
diff changeset
928
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
929 @instruction(119)
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
930 def drop_some_bonus(self, number):
494
6be9c99a3a24 Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 489
diff changeset
931 if self._enemy.select_player().power < 128:
244
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
932 if number > 0:
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
933 #TODO: find the real formula in the binary.
302
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
934 self._game.drop_bonus(self._enemy.x - 64 + self._game.prng.rand_double() * 128,
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
935 self._enemy.y - 64 + self._game.prng.rand_double() * 128,
244
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
936 2)
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
937 for i in xrange(number - 1):
302
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
938 self._game.drop_bonus(self._enemy.x - 64 + self._game.prng.rand_double() * 128,
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
939 self._enemy.y - 64 + self._game.prng.rand_double() * 128,
244
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
940 0)
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
941 else:
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
942 for i in xrange(number):
302
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
943 self._game.drop_bonus(self._enemy.x - 64 + self._game.prng.rand_double() * 128,
34ea45d95489 Fix ECL instruction 119.
Thibaut Girka <thib@sitedethib.com>
parents: 299
diff changeset
944 self._enemy.y - 64 + self._game.prng.rand_double() * 128,
244
2b7f69ad9ccd Drop the correct amount of power with 119.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 242
diff changeset
945 1)
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
946
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
947
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
948 @instruction(120)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
949 def set_automatic_orientation(self, flags):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
950 #TODO: does it change anything else than the sprite's rotation?
82
de48213a02bf Fix a few things
Thibaut Girka <thib@sitedethib.com>
parents: 79
diff changeset
951 self._enemy.automatic_orientation = bool(flags & 1)
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
952
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
953
107
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
954 @instruction(121)
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
955 def call_special_function(self, function, arg):
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
956 if function == 0: # Cirno
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
957 if arg == 0:
249
2ef8f4e181e3 Change ECL special function 0 in order to match the game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 244
diff changeset
958 self._game.new_effect((self._enemy.x, self._enemy.y), 17)
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
959 for bullet in self._game.bullets:
107
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
960 bullet.speed = bullet.angle = 0.
256
507dfd6efe0c Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents: 251
diff changeset
961 bullet.dx, bullet.dy = 0., 0.
128
8ba018617829 Fix Cirno's freezing bullets
Thibaut Girka <thib@sitedethib.com>
parents: 107
diff changeset
962 bullet.set_anim(sprite_idx_offset=15) #TODO: check
107
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
963 else:
249
2ef8f4e181e3 Change ECL special function 0 in order to match the game more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 244
diff changeset
964 self._game.new_effect((self._enemy.x, self._enemy.y), 17)
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
965 for bullet in self._game.bullets:
256
507dfd6efe0c Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents: 251
diff changeset
966 bullet.flags = 16 #TODO: check
250
cd4800154c9b Change ECL special function 0 in order to match the game more closely (again)
Thibaut Girka <thib@sitedethib.com>
parents: 249
diff changeset
967 angle = pi + self._game.prng.rand_double() * 2. * pi
256
507dfd6efe0c Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents: 251
diff changeset
968 bullet.attributes[4:6] = [0.01, angle] #TODO: check
507dfd6efe0c Refactor pytouhou.game.bullet.
Thibaut Girka <thib@sitedethib.com>
parents: 251
diff changeset
969 bullet.attributes[0] = -1 #TODO: check
250
cd4800154c9b Change ECL special function 0 in order to match the game more closely (again)
Thibaut Girka <thib@sitedethib.com>
parents: 249
diff changeset
970 bullet.set_anim(sprite_idx_offset=15) #TODO: check
168
b96d835c0807 Implement Cirno’s 雪符「ダイアモンドブリザード」 spellcard.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 166
diff changeset
971 elif function == 1: # Cirno
207
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
972 offset = (self._game.prng.rand_uint16() % arg - arg / 2,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
973 self._game.prng.rand_uint16() % arg - arg / 2)
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
974 self._enemy.fire(offset=offset)
266
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
975 elif function == 3: # Patchouli’s dual sign spellcards
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
976 values = [[0, 3, 1],
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
977 [2, 3, 4],
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
978 [1, 4, 0],
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
979 [4, 2, 3]]
494
6be9c99a3a24 Merge PlayerState into Player, fix player respawn position.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 489
diff changeset
980 character = self._enemy.select_player().character
266
3a86c4e070dc Implement ECL’s 3rd hardcoded function.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 256
diff changeset
981 self.variables[1:4] = values[character]
299
e04e402e6380 Implemented Sakuya's time stop.
Elias Boutaleb <kagekyio@gmail.com>
parents: 296
diff changeset
982 elif function == 4:
e04e402e6380 Implemented Sakuya's time stop.
Elias Boutaleb <kagekyio@gmail.com>
parents: 296
diff changeset
983 if arg == 1:
e04e402e6380 Implemented Sakuya's time stop.
Elias Boutaleb <kagekyio@gmail.com>
parents: 296
diff changeset
984 self._game.time_stop = True
e04e402e6380 Implemented Sakuya's time stop.
Elias Boutaleb <kagekyio@gmail.com>
parents: 296
diff changeset
985 else:
e04e402e6380 Implemented Sakuya's time stop.
Elias Boutaleb <kagekyio@gmail.com>
parents: 296
diff changeset
986 self._game.time_stop = False
309
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
987 elif function == 7: # Remilia’s laser webs
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
988 base_angle = self._game.prng.rand_double() * 2 * pi
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
989 for i in xrange(16):
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
990 delta = [+pi / 4., -pi / 4.][i % 2]
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
991 ox, oy = self._enemy.bullet_launch_offset
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
992 length = 32. #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
993
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
994 # Inner circle
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
995 angle = base_angle + i * pi / 8.
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
996 ox, oy = ox + cos(angle) * length, oy + sin(angle) * length
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
997 length = 112. #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
998 if arg == 0:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
999 self._enemy.new_laser(85, 1, 1, angle, 0., 0., length, length, 30.,
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1000 100, 80, 15, #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1001 0, 0, 0, offset=(ox, oy))
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1002 else:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1003 self._enemy.fire(offset=(ox, oy))
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1004
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1005 # Middle circle
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1006 ox, oy = ox + cos(angle) * length, oy + sin(angle) * length
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1007 angle += delta
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1008
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1009 if arg == 0:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1010 self._enemy.new_laser(85, 1, 1, angle, 0., 0., length, length, 30.,
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1011 100, 80, 15, #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1012 0, 0, 0, offset=(ox, oy))
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1013 else:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1014 self._enemy.fire(offset=(ox, oy))
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1015
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1016 # Outer circle
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1017 ox, oy = ox + cos(angle) * length, oy + sin(angle) * length
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1018 angle += delta
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1019 length = 400. #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1020
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1021 if arg == 0:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1022 self._enemy.new_laser(85, 1, 1, angle, 0., 0., length, length, 30.,
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1023 100, 80, 15, #TODO: check
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1024 0, 0, 0, offset=(ox, oy))
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1025 else:
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 308
diff changeset
1026 self._enemy.fire(offset=(ox, oy))
296
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1027 elif function == 8: # Remilia’s magic
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1028 bullet_attributes = [70, 1, 1, 1, 1, 0., 0., 0., 0.7, 0]
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1029 n = 0
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1030 for bullet in self._game.bullets:
312
8d1768fa4cbb Fix Remilia's “Red Magic”.
Thibaut Girka <thib@sitedethib.com>
parents: 310
diff changeset
1031 if bullet._bullet_type.type_id < 5:
296
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1032 continue
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1033 n += 1
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1034 bullet_attributes[8] = bullet.angle
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1035 self._enemy.fire(launch_pos=(bullet.x, bullet.y),
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1036 bullet_attributes=bullet_attributes)
c074783d0847 Implement hardcoded function 8 for Remilia.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 295
diff changeset
1037 self._setval(-10004, n)
313
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1038 elif function == 9:
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1039 self._game.new_effect((self._enemy.x, self._enemy.y), 17)
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1040 base_angle = pi + 2. * self._game.prng.rand_double() * pi
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1041 for bullet in self._game.bullets:
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1042 if bullet._bullet_type.type_id < 5 and bullet.speed == 0.:
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1043 bullet.flags = 16 #TODO: check
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1044 distance = hypot(bullet.x - self._enemy.x, bullet.y - self._enemy.y)
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1045 angle = base_angle
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1046 angle += distance /80. #TODO: This is most probably wrong
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1047 bullet.attributes[4:6] = [0.01, angle] #TODO: check
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1048 bullet.attributes[0] = -1 #TODO: check
2ba2462afc70 Implement hardcoded function 9.
Thibaut Girka <thib@sitedethib.com>
parents: 312
diff changeset
1049 bullet.set_anim(sprite_idx_offset=1) #TODO: check
310
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1050 elif function == 11:
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1051 self._game.new_effect((self._enemy.x, self._enemy.y), 17)
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1052 self._game.prng.rand_double() #TODO: what is it for?
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1053 for bullet in self._game.bullets: #TODO Bullet order is WRONG
312
8d1768fa4cbb Fix Remilia's “Red Magic”.
Thibaut Girka <thib@sitedethib.com>
parents: 310
diff changeset
1054 if bullet._bullet_type.type_id < 5 and bullet.speed == 0.:
310
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1055 bullet.flags = 16 #TODO: check
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1056 angle = pi + self._game.prng.rand_double() * 2. * pi
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1057 bullet.attributes[4:6] = [0.01, angle] #TODO: check
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1058 bullet.attributes[0] = -1 #TODO: check
81c5b0b51093 Implement hardcoded function 11.
Thibaut Girka <thib@sitedethib.com>
parents: 309
diff changeset
1059 bullet.set_anim(sprite_idx_offset=1) #TODO: check
169
c4b4f7c068f2 Fix Cirno’s last spellcard and implement something for Patchy in extra stage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 168
diff changeset
1060 elif function == 13:
c4b4f7c068f2 Fix Cirno’s last spellcard and implement something for Patchy in extra stage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 168
diff changeset
1061 if self._enemy.bullet_attributes is None:
c4b4f7c068f2 Fix Cirno’s last spellcard and implement something for Patchy in extra stage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 168
diff changeset
1062 return
c4b4f7c068f2 Fix Cirno’s last spellcard and implement something for Patchy in extra stage.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 168
diff changeset
1063
287
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1064 frame = self._getval(-10004)
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1065 self._setval(-10004, frame + 1)
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1066
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1067 if frame % 6 != 0:
178
0bd5e5f19a73 Fix Patchouli’s 日符「ロイヤルフレア」 spellcard.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 177
diff changeset
1068 return
0bd5e5f19a73 Fix Patchouli’s 日符「ロイヤルフレア」 spellcard.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 177
diff changeset
1069
207
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1070 (type_, anim, sprite_idx_offset, bullets_per_shot, number_of_shots,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1071 speed, speed2, launch_angle, angle, flags) = self._enemy.bullet_attributes
178
0bd5e5f19a73 Fix Patchouli’s 日符「ロイヤルフレア」 spellcard.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 177
diff changeset
1072 for i in range(arg):
287
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1073 _angle = i*2*pi/arg + self._getval(-10007)
178
0bd5e5f19a73 Fix Patchouli’s 日符「ロイヤルフレア」 spellcard.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 177
diff changeset
1074 _distance = self._getval(-10008)
287
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1075 launch_pos = (192 + cos(_angle) * _distance,
981d1893d564 Fix Patchouly's Royal Flare.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
1076 224 + sin(_angle) * _distance)
207
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1077 bullet_attributes = (type_, anim, sprite_idx_offset,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1078 bullets_per_shot, number_of_shots,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1079 speed, speed2,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1080 self._getval(-10006) + _angle, angle, flags)
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1081 self._enemy.fire(launch_pos=launch_pos,
709f42eaa55e Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 195
diff changeset
1082 bullet_attributes=bullet_attributes)
275
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1083 elif function == 14: # Laevateinn
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1084 if arg == 0:
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1085 self.variables[4] = 0
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1086 for laser in self._enemy.laser_by_id.values():
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1087 self.variables[4] += 1
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1088 for pos in laser.get_bullets_pos():
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1089 self._enemy.fire(launch_pos=pos)
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1090 else:
4b0570bf5847 Implement hardcoded function 14 used by spellcard “Lævateinn”.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
1091 pass #TODO: check
273
595b227886b1 Partially implement hardcoded function 16, used for QED: ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 272
diff changeset
1092 elif function == 16: # QED: Ripples of 495 years
595b227886b1 Partially implement hardcoded function 16, used for QED: ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 272
diff changeset
1093 if arg == 0:
360
d55a1843b2a7 Fix Flandre's QED: Ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 359
diff changeset
1094 self.variables[9] = 40 + self._enemy.life // 25
d55a1843b2a7 Fix Flandre's QED: Ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 359
diff changeset
1095 self.variables[7] = 2. - self._enemy.life / 6000.
273
595b227886b1 Partially implement hardcoded function 16, used for QED: ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 272
diff changeset
1096 else:
360
d55a1843b2a7 Fix Flandre's QED: Ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 359
diff changeset
1097 #TODO: I'm really not sure about that...
273
595b227886b1 Partially implement hardcoded function 16, used for QED: ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 272
diff changeset
1098 self.variables[6] = self._game.prng.rand_double() * (self._game.width - 64.) + 32.
595b227886b1 Partially implement hardcoded function 16, used for QED: ripples of 495 years
Thibaut Girka <thib@sitedethib.com>
parents: 272
diff changeset
1099 self.variables[7] = self._game.prng.rand_double() * (self._game.width / 2. - 64.) + 32.
107
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
1100 else:
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
1101 logger.warn("Unimplemented special function %d!", function)
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
1102
5d9052b9a4e8 (almost) implement Cirno's freezing spellcard
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
1103
75
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1104 @instruction(123)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1105 def skip_frames(self, frames):
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1106 #TODO: is that all?
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1107 self.frame += self._getval(frames)
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1108
b3bd421bb895 Handle a few more ECL instructions
Thibaut Girka <thib@sitedethib.com>
parents: 74
diff changeset
1109
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
1110 @instruction(124)
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
1111 def drop_specific_bonus(self, _type):
165
c8c60291c56f Implement item dropping by enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 160
diff changeset
1112 #TODO: if _type < 0, “drop” an bullet animation instead of a bonus (never used).
154
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
1113 self._game.drop_bonus(self._enemy.x, self._enemy.y, _type)
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
1114
364935f6e313 Implement enemy killing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
1115
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
1116 @instruction(126)
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
1117 def set_remaining_lives(self, lives):
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
1118 self._enemy.remaining_lives = lives
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents: 48
diff changeset
1119
182
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
1120
242
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1121 @instruction(128)
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1122 def interrupt(self, event):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 302
diff changeset
1123 self._enemy.anmrunner.interrupt(event)
242
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1124
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1125
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1126 @instruction(129)
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1127 def interrupt_aux(self, number, event):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 302
diff changeset
1128 self._enemy.aux_anm[number].anmrunner.interrupt(event)
242
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1129
1d3c8c7473a2 Implement auxiliary animations of enemies like magic circles, and interruptions from ecl.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 224
diff changeset
1130
182
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
1131 @instruction(131)
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
1132 def set_difficulty_coeffs(self, speed_a, speed_b, nb_a, nb_b, shots_a, shots_b):
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
1133 self._enemy.difficulty_coeffs = (speed_a, speed_b, nb_a, nb_b, shots_a, shots_b)
20843875ad8f (Hopefully) use difficulty as it should.
Thibaut Girka <thib@sitedethib.com>
parents: 181
diff changeset
1134
361
b55939b4b40d Rename set_visible to set_invisible, since it's what it does...
Thibaut Girka <thib@sitedethib.com>
parents: 360
diff changeset
1135
b55939b4b40d Rename set_visible to set_invisible, since it's what it does...
Thibaut Girka <thib@sitedethib.com>
parents: 360
diff changeset
1136 @instruction(132)
b55939b4b40d Rename set_visible to set_invisible, since it's what it does...
Thibaut Girka <thib@sitedethib.com>
parents: 360
diff changeset
1137 def set_invisible(self, value):
b55939b4b40d Rename set_visible to set_invisible, since it's what it does...
Thibaut Girka <thib@sitedethib.com>
parents: 360
diff changeset
1138 self._enemy.visible = not bool(value)
b55939b4b40d Rename set_visible to set_invisible, since it's what it does...
Thibaut Girka <thib@sitedethib.com>
parents: 360
diff changeset
1139
362
3be4c1078095 (partially?) implement ECL's instruction 133
Thibaut Girka <thib@sitedethib.com>
parents: 361
diff changeset
1140
3be4c1078095 (partially?) implement ECL's instruction 133
Thibaut Girka <thib@sitedethib.com>
parents: 361
diff changeset
1141 @instruction(133)
3be4c1078095 (partially?) implement ECL's instruction 133
Thibaut Girka <thib@sitedethib.com>
parents: 361
diff changeset
1142 def copy_callbacks(self):
497
3da7395f39e3 Make enemy callbacks programmables.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 494
diff changeset
1143 self._enemy.timeout_callback.enable(self.switch_to_sub, (self._enemy.death_callback.args[0],))
362
3be4c1078095 (partially?) implement ECL's instruction 133
Thibaut Girka <thib@sitedethib.com>
parents: 361
diff changeset
1144