Mercurial > touhou
annotate pytouhou/vm/eclrunner.py @ 581:cb8a443bc046
Fix a compilation issue on Cython 0.20.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 07 Sep 2014 13:26:41 +0200 |
parents | e4c9eafab6d0 |
children | e15672733c93 |
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 | 18 from pytouhou.utils.helpers import get_logger |
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 | 26 class ECLMainRunner(object): |
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 | 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 | 38 |
39 self.instruction_pointer = 0 | |
40 | |
41 | |
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 | 46 while True: |
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 | 49 except IndexError: |
50 break | |
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 | 54 break |
55 else: | |
56 self.instruction_pointer += 1 | |
57 | |
180
5a1533677a9a
Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents:
178
diff
changeset
|
58 if frame == self.frame: |
97 | 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 | 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 | 64 else: |
65 callback(self, sub, instr_type, *args) | |
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 | 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 | 85 @instruction(0) |
86 @instruction(2) | |
87 @instruction(4) | |
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 | 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 | 93 |
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 | 119 |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 234 else: |
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 | 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 | 269 counter_value = self._getval(variable_id) - 1 |
270 if counter_value > 0: | |
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 | 313 @instruction(13) |
314 @instruction(20) | |
315 def add(self, variable_id, a, b): | |
316 #TODO: 13 takes only ints and 20 only floats. | |
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. | |
318 self._setval(variable_id, self._getval(a) + self._getval(b)) | |
319 | |
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 | 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 | 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 | 548 self._enemy.set_bullet_attributes(67, anim, |
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 | 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 | 563 self._enemy.set_bullet_attributes(68, anim, |
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 | 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 | 578 self._enemy.set_bullet_attributes(69, anim, |
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 | 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 | 593 self._enemy.set_bullet_attributes(70, anim, |
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 | 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 | 608 self._enemy.set_bullet_attributes(71, anim, |
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 | 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 | 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 | 972 offset = (self._game.prng.rand_uint16() % arg - arg / 2, |
973 self._game.prng.rand_uint16() % arg - arg / 2) | |
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 | 1070 (type_, anim, sprite_idx_offset, bullets_per_shot, number_of_shots, |
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 | 1077 bullet_attributes = (type_, anim, sprite_idx_offset, |
1078 bullets_per_shot, number_of_shots, | |
1079 speed, speed2, | |
1080 self._getval(-10006) + _angle, angle, flags) | |
1081 self._enemy.fire(launch_pos=launch_pos, | |
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 |