annotate pytouhou/game/game.py @ 295:2a60642e8892

Fix Remilia’s bat form.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Thu, 01 Mar 2012 19:44:35 +0100
parents 94c636f8f863
children e04e402e6380
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
1 # -*- encoding: utf-8 -*-
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
2 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
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: 50
diff changeset
4 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
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: 50
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: 50
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: 50
diff changeset
8 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
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: 50
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: 50
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: 50
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: 50
diff changeset
13 ##
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
14
255
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
15 from itertools import chain
52
ab826bc29aa2 Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents: 50
diff changeset
16
50
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
17 from pytouhou.utils.random import Random
811cefefb5c8 Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents: 49
diff changeset
18
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
19 from pytouhou.vm.eclrunner import ECLMainRunner
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
20 from pytouhou.vm.msgrunner import MSGRunner
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
21
98
d141c851c598 Rename pytouhou.game.enemymanager to pytouhou.game.enemy
Thibaut Girka <thib@sitedethib.com>
parents: 97
diff changeset
22 from pytouhou.game.enemy import Enemy
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
23 from pytouhou.game.item import Item
173
35d850502d1f Move effects where they should be.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 172
diff changeset
24 from pytouhou.game.effect import Effect
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
25 from pytouhou.game.effect import Particle
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
26
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
27
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
28
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
29 class Game(object):
196
1e501e3b6645 Add a subclass for each character, and implement player attacks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 193
diff changeset
30 def __init__(self, resource_loader, players, stage, rank, difficulty,
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
31 bullet_types, laser_types, item_types,
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
32 nb_bullets_max=None, width=384, height=448, prng=None):
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
33 self.resource_loader = resource_loader
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 52
diff changeset
34
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
35 self.width, self.height = width, height
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
36
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
37 self.nb_bullets_max = nb_bullets_max
122
174324a4da51 Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
38 self.bullet_types = bullet_types
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
39 self.laser_types = laser_types
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
40 self.item_types = item_types
122
174324a4da51 Add support for launch animations! (Warning: slow :()
Thibaut Girka <thib@sitedethib.com>
parents: 106
diff changeset
41
196
1e501e3b6645 Add a subclass for each character, and implement player attacks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 193
diff changeset
42 self.players = players
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
43 self.enemies = []
166
dcf32488a2c9 Better enemy death, with animation and (hopefully) correct flags handling.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 165
diff changeset
44 self.effects = []
106
c7847bfed427 Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 98
diff changeset
45 self.bullets = []
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
46 self.lasers = []
161
7e7368356445 Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
47 self.cancelled_bullets = []
164
5271789c067d Implement player bullets rendering and updating.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 161
diff changeset
48 self.players_bullets = []
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
49 self.players_lasers = [None, None]
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
50 self.items = []
106
c7847bfed427 Minor refactoring
Thibaut Girka <thib@sitedethib.com>
parents: 98
diff changeset
51
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
52 self.stage = stage
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
53 self.rank = rank
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
54 self.difficulty = difficulty
198
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
55 self.difficulty_counter = 0
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
56 self.difficulty_min = 12 if rank == 0 else 10
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
57 self.difficulty_max = 20 if rank == 0 else 32
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
58 self.boss = None
180
5a1533677a9a Freeze time during spellcards
Thibaut Girka <thib@sitedethib.com>
parents: 176
diff changeset
59 self.spellcard = None
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
60 self.msg_runner = None
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
61 self.msg_wait = False
203
df8b2ab54639 Make pylint slightly happier (and code analysis easier)
Thibaut Girka <thib@sitedethib.com>
parents: 202
diff changeset
62 self.bonus_list = [0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0,
df8b2ab54639 Make pylint slightly happier (and code analysis easier)
Thibaut Girka <thib@sitedethib.com>
parents: 202
diff changeset
63 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 2]
188
008f90ebfdc0 Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents: 184
diff changeset
64 self.prng = prng or Random()
49
cbe1cb50f2fd Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
65 self.frame = 0
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 52
diff changeset
66
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
67 self.enm_anm_wrapper = resource_loader.get_anm_wrapper2(('stg%denm.anm' % stage,
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
68 'stg%denm2.anm' % stage))
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
69 self.etama4 = resource_loader.get_anm_wrapper(('etama4.anm',))
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
70 ecl = resource_loader.get_ecl('ecldata%d.ecl' % stage)
157
ca6f8b3f739d Remove half of the new_enemy/pop_enemy mess.
Thibaut Girka <thib@sitedethib.com>
parents: 156
diff changeset
71 self.ecl_runner = ECLMainRunner(ecl, self)
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
72
217
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
73 self.effect_anm_wrapper = resource_loader.get_anm_wrapper(('eff0%d.anm' % stage,))
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
74 self.effect = None
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
75
188
008f90ebfdc0 Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents: 184
diff changeset
76 # See 102h.exe@0x413220 if you think you're brave enough.
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
77 self.deaths_count = self.prng.rand_uint16() % 3
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
78 self.next_bonus = self.prng.rand_uint16() % 8
188
008f90ebfdc0 Fix replay handling and add support for encrypted replays
Thibaut Girka <thib@sitedethib.com>
parents: 184
diff changeset
79
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
80 self.last_keystate = 0
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
81
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
82
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
83 def msg_sprites(self):
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
84 return []
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
85
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 52
diff changeset
86
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
87 def lasers_sprites(self):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
88 return [laser for laser in self.players_lasers if laser]
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
89
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
90
198
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
91 def modify_difficulty(self, diff):
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
92 self.difficulty_counter += diff
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
93 while self.difficulty_counter < 0:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
94 self.difficulty -= 1
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
95 self.difficulty_counter += 100
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
96 while self.difficulty_counter >= 100:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
97 self.difficulty += 1
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
98 self.difficulty_counter -= 100
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
99 if self.difficulty < self.difficulty_min:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
100 self.difficulty = self.difficulty_min
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
101 elif self.difficulty > self.difficulty_max:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
102 self.difficulty = self.difficulty_max
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
103
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
104
217
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
105 def enable_effect(self):
227
31460b2ec530 Actually use offset of Sprite in spellcard’s effect, and place it correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 225
diff changeset
106 self.effect = Effect((-32., -16.), 0, self.effect_anm_wrapper) #TODO: find why this offset is necessary.
31460b2ec530 Actually use offset of Sprite in spellcard’s effect, and place it correctly.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 225
diff changeset
107 self.effect._sprite.allow_dest_offset = True #TODO: should be the role of anm’s 25th instruction. Investigate!
217
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
108
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
109
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
110 def disable_effect(self):
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
111 self.effect = None
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
112
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
113
172
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
114 def drop_bonus(self, x, y, _type, end_pos=None):
153
37df8c618c2e Add falling items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
115 player = self.players[0] #TODO
165
c8c60291c56f Implement item dropping by enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 164
diff changeset
116 if _type > 6:
c8c60291c56f Implement item dropping by enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 164
diff changeset
117 return
153
37df8c618c2e Add falling items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
118 item_type = self.item_types[_type]
197
e1bc8c4cbb1a Do the right action when collecting an item.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 196
diff changeset
119 item = Item((x, y), _type, item_type, self, end_pos=end_pos)
153
37df8c618c2e Add falling items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
120 self.items.append(item)
37df8c618c2e Add falling items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
121
37df8c618c2e Add falling items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 152
diff changeset
122
208
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
123 def autocollect(self, player):
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
124 for item in self.items:
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
125 if not item.player:
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
126 item.autocollect(player)
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
127
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
128
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
129 def change_bullets_into_star_items(self):
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
130 player = self.players[0] #TODO
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
131 item_type = self.item_types[6]
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
132 self.items.extend(Item((bullet.x, bullet.y), 6, item_type, self, player=player)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
133 for bullet in self.bullets)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
134 for laser in self.lasers:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
135 self.items.extend(Item(pos, 6, item_type, self, player=player)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
136 for pos in laser.get_bullets_pos())
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
137 laser.cancel()
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
138 self.bullets = []
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
139
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
140
248
77b83064b57e Use the correct animation for player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 229
diff changeset
141 def new_effect(self, pos, anim, anm_wrapper=None):
77b83064b57e Use the correct animation for player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 229
diff changeset
142 self.effects.append(Effect(pos, anim, anm_wrapper or self.etama4))
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
143
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
144
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
145 def new_particle(self, pos, color, size, amp):
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
146 self.effects.append(Particle(pos, 7 + 4 * color + self.prng.rand_uint16() % 4, self.etama4, size, amp, self))
173
35d850502d1f Move effects where they should be.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 172
diff changeset
147
35d850502d1f Move effects where they should be.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 172
diff changeset
148
171
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 166
diff changeset
149 def new_enemy(self, pos, life, instr_type, bonus_dropped, die_score):
2f3665a77f11 Add support for the last unknown value of the enemy spawning.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 166
diff changeset
150 enemy = Enemy(pos, life, instr_type, bonus_dropped, die_score, self.enm_anm_wrapper, self)
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
151 self.enemies.append(enemy)
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
152 return enemy
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
153
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
154
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
155 def new_msg(self, sub):
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
156 self.msg_runner = MSGRunner(self.msg, sub, self)
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
157 self.msg_runner.run_iteration()
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
158
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
159
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
160 def run_iter(self, keystate):
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
161 # 1. VMs.
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
162 self.ecl_runner.run_iter()
198
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
163 if self.frame % (32*60) == (32*60): #TODO: check if that is really that frame.
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
164 self.modify_difficulty(+100)
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
165
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
166 # 2. Filter out destroyed enemies
123
d1c82d43bbf3 Various optimizations
Thibaut Girka <thib@sitedethib.com>
parents: 122
diff changeset
167 self.enemies = [enemy for enemy in self.enemies if not enemy._removed]
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
168 self.effects = [effect for effect in self.effects if not effect._removed]
152
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
169 self.bullets = [bullet for bullet in self.bullets if not bullet._removed]
161
7e7368356445 Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
170 self.cancelled_bullets = [bullet for bullet in self.cancelled_bullets if not bullet._removed]
152
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
171 self.items = [item for item in self.items if not item._removed]
83
fc0294c745b6 Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents: 52
diff changeset
172
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
173
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
174 # 3. Let's play!
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
175 # In the original game, updates are done in prioritized functions called "chains"
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
176 # We have to mimic this functionnality to be replay-compatible with the official game.
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
177
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
178 # Pri 6 is background
217
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
179 self.update_effect() #TODO: Pri unknown
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
180 if self.msg_runner:
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
181 self.update_msg(keystate) # Pri ?
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
182 keystate &= ~3 # Remove the ability to attack (keystates 1 and 2).
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
183 self.update_players(keystate) # Pri 7
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
184 self.update_enemies() # Pri 9
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
185 self.update_effects() # Pri 10
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
186 self.update_bullets() # Pri 11
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
187 for laser in self.lasers: #TODO: what priority is it?
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
188 laser.update()
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
189 # Pri 12 is HUD
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
190
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
191 # 4. Cleaning
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
192 self.cleanup()
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
194 self.frame += 1
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
195
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
196
217
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
197 def update_effect(self):
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
198 if self.effect is not None:
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
199 self.effect.update()
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
200
577f45454402 Change background during spellcards.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 208
diff changeset
201
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
202 def update_enemies(self):
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
203 for enemy in self.enemies:
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
204 enemy.update()
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
205
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
206
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
207 def update_msg(self, keystate):
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
208 if keystate & 1 and not self.last_keystate & 1:
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
209 self.msg_runner.skip()
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
210 if keystate & 256 and self.msg_runner.allow_skip:
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
211 self.msg_runner.skip()
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
212 self.last_keystate = keystate
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
213 self.msg_runner.run_iteration()
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
214
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
215
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
216 def update_players(self, keystate):
130
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
217 for player in self.players:
142
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
218 player.update(keystate) #TODO: differentiate keystates (multiplayer mode)
130
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
219 if player.state.x < 8.:
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
220 player.state.x = 8.
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
221 if player.state.x > self.width - 8:
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
222 player.state.x = self.width - 8
130
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
223 if player.state.y < 16.:
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
224 player.state.y = 16.
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
225 if player.state.y > self.height - 16:
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
226 player.state.y = self.height -16
130
11ab06f4c4c6 Introduce characters!
Thibaut Girka <thib@sitedethib.com>
parents: 123
diff changeset
227
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
228 for bullet in self.players_bullets:
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
229 bullet.update()
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
230
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
231
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
232 def update_effects(self):
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
233 for effect in self.effects:
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
234 effect.update()
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
235
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
236
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
237 def update_bullets(self):
161
7e7368356445 Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
238 for bullet in self.cancelled_bullets:
7e7368356445 Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
239 bullet.update()
7e7368356445 Add bullet cancel anim support
Thibaut Girka <thib@sitedethib.com>
parents: 159
diff changeset
240
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
241 for bullet in self.bullets:
164
5271789c067d Implement player bullets rendering and updating.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 161
diff changeset
242 bullet.update()
5271789c067d Implement player bullets rendering and updating.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 161
diff changeset
243
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
244 for laser in self.players_lasers:
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
245 if laser:
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
246 laser.update()
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
247
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
248 for item in self.items:
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
249 item.update()
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
250
142
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
251 for player in self.players:
172
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
252 if not player.state.touchable:
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
253 continue
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
254
142
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
255 px, py = player.x, player.y
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
256 phalf_size = player.hitbox_half_size
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
257 px1, px2 = px - phalf_size, px + phalf_size
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
258 py1, py2 = py - phalf_size, py + phalf_size
152
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
259
176
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
260 ghalf_size = player.graze_hitbox_half_size
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
261 gx1, gx2 = px - ghalf_size, px + ghalf_size
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
262 gy1, gy2 = py - ghalf_size, py + ghalf_size
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
263
293
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
264 for laser in self.lasers:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
265 if laser.check_collision((px, py)):
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
266 if player.state.invulnerable_time == 0:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
267 player.collide()
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
268 elif laser.check_grazing((px, py)):
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
269 player.state.graze += 1 #TODO
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
270 player.state.score += 500 #TODO
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
271 self.modify_difficulty(+6) #TODO
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
272 self.new_particle((px, py), 0, .8, 192) #TODO
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
273
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
274 for bullet in self.bullets:
142
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
275 half_size = bullet.hitbox_half_size
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
276 bx, by = bullet.x, bullet.y
220
0595315d3880 Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 217
diff changeset
277 bx1, bx2 = bx - half_size[0], bx + half_size[0]
0595315d3880 Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 217
diff changeset
278 by1, by2 = by - half_size[1], by + half_size[1]
142
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
279
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
280 if not (bx2 < px1 or bx1 > px2
c7f0fd9d2145 Simple collision detection
Thibaut Girka <thib@sitedethib.com>
parents: 134
diff changeset
281 or by2 < py1 or by1 > py2):
156
ebfd328e700c Rename a few functions, move a few things around...
Thibaut Girka <thib@sitedethib.com>
parents: 154
diff changeset
282 bullet.collide()
172
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
283 if player.state.invulnerable_time == 0:
ea2ad94c33a0 Implement player death.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 171
diff changeset
284 player.collide()
152
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
285
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
286 elif not bullet.grazed and not (bx2 < gx1 or bx1 > gx2
176
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
287 or by2 < gy1 or by1 > gy2):
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
288 bullet.grazed = True
184
54eb6b254b7b When touched, drop the items at the right place, and add precisions about particles.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 181
diff changeset
289 player.state.graze += 1
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
290 player.state.score += 500 # found experimentally
198
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
291 self.modify_difficulty(+6)
193
9f58e2a6e950 Fix particles, fix "random" item popping, change update order to match the original game's more closely.
Thibaut Girka <thib@sitedethib.com>
parents: 192
diff changeset
292 self.new_particle((px, py), 0, .8, 192) #TODO: find the real size and range.
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
293 #TODO: display a static particle during one frame at
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
294 # 12 pixels of the player, in the axis of the “collision”.
176
80a4c7ed43b3 Add grazing check.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 173
diff changeset
295
208
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
296 #TODO: is it the right place?
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
297 if py < 128 and player.state.power >= 128: #TODO: check py.
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
298 self.autocollect(player)
d07506a2e16e Implement autocollection of items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 203
diff changeset
299
229
5afc75f71fed Add “SHT” support to EoSD, and do a little cleanup.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 227
diff changeset
300 half_size = player.sht.item_hitbox / 2.
152
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
301 for item in self.items:
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
302 bx, by = item.x, item.y
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
303 bx1, bx2 = bx - half_size, bx + half_size
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
304 by1, by2 = by - half_size, by + half_size
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
305
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
306 if not (bx2 < px1 or bx1 > px2
86807b8a63bd Add collisions with enemies and items.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 151
diff changeset
307 or by2 < py1 or by1 > py2):
220
0595315d3880 Fix SHT handling; change a few things to be closer to ZUN’s mind; and first stub of PCB support.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 217
diff changeset
308 item.on_collect(player)
150
4f46717390aa Introduce items, implement ECL instruction 83
Thibaut Girka <thib@sitedethib.com>
parents: 143
diff changeset
309
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
310
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
311 def cleanup(self):
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
312 # Filter out non-visible enemies
255
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
313 for enemy in self.enemies:
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
314 if enemy.is_visible(self.width, self.height):
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
315 enemy._was_visible = True
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
316 elif enemy._was_visible:
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
317 # Filter out-of-screen enemy
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
318 enemy._removed = True
255
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
319
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
320 self.enemies = [enemy for enemy in self.enemies if not enemy._removed]
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
321
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
322 # Filter out-of-scren bullets
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
323 self.bullets = [bullet for bullet in self.bullets
255
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
324 if not bullet._removed]
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
325 self.players_bullets = [bullet for bullet in self.players_bullets
a0d6b1915591 Fix bullet removal condition.
Thibaut Girka <thib@sitedethib.com>
parents: 248
diff changeset
326 if not bullet._removed]
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
327 for i, laser in enumerate(self.players_lasers):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
328 if laser and laser._removed:
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
329 self.players_lasers[i] = None
225
2d35565b5608 Move game size in the game's definition, and don't keep changing the window's size.
Thibaut Girka <thib@sitedethib.com>
parents: 220
diff changeset
330 self.cancelled_bullets = [bullet for bullet in self.cancelled_bullets
259
3631abb6e95b Minor performance improvement.
Thibaut Girka <thib@sitedethib.com>
parents: 258
diff changeset
331 if not bullet._removed]
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 286
diff changeset
332 self.effects = [effect for effect in self.effects if not effect._removed]
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
333
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
334 # Filter “timed-out” lasers
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
335 self.lasers = [laser for laser in self.lasers if not laser._removed]
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 259
diff changeset
336
165
c8c60291c56f Implement item dropping by enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 164
diff changeset
337 # Filter out-of-scren items
198
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
338 items = []
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
339 for item in self.items:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
340 if item.y < 448:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
341 items.append(item)
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
342 else:
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
343 self.modify_difficulty(-3)
13918723d1bc Modify difficulty when it has to.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 197
diff changeset
344 self.items = items
165
c8c60291c56f Implement item dropping by enemies.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 164
diff changeset
345
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
346 # Disable boss mode if it is dead/it has timeout
286
4838e9bab0f9 Implement dialogs (MSG files).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 274
diff changeset
347 if self.boss and self.boss._enemy._removed:
151
5cf927cbd9c5 Merge GameState into Game. TODO: Merge PlayerState into Player
Thibaut Girka <thib@sitedethib.com>
parents: 150
diff changeset
348 self.boss = None
97
ac2e5e1c2c3c Refactor \o/
Thibaut Girka <thib@sitedethib.com>
parents: 83
diff changeset
349