Mercurial > touhou
annotate pytouhou/game/game.py @ 121:1bc0ad774ed4
More impressive data, use a wider range of things, and document things!
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Fri, 09 Sep 2011 21:36:53 +0200 |
parents | c7847bfed427 |
children | 174324a4da51 |
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 |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
50
diff
changeset
|
15 |
50
811cefefb5c8
Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents:
49
diff
changeset
|
16 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
|
17 |
97 | 18 from pytouhou.vm.eclrunner import ECLMainRunner |
19 | |
98
d141c851c598
Rename pytouhou.game.enemymanager to pytouhou.game.enemy
Thibaut Girka <thib@sitedethib.com>
parents:
97
diff
changeset
|
20 from pytouhou.game.enemy import Enemy |
97 | 21 |
22 | |
49
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
23 class GameState(object): |
106 | 24 __slots__ = ('resource_loader', 'bullets', 'players', 'rank', 'difficulty', 'frame', |
97 | 25 'stage', 'boss', 'prng') |
26 def __init__(self, resource_loader, players, stage, rank, difficulty): | |
27 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
|
28 |
106 | 29 self.bullets = [] |
30 | |
49
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
31 self.stage = stage |
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
32 self.players = players |
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
33 self.rank = rank |
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
34 self.difficulty = difficulty |
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
35 self.boss = None |
50
811cefefb5c8
Fix a few bugs and add support for a few instructions
Thibaut Girka <thib@sitedethib.com>
parents:
49
diff
changeset
|
36 self.prng = Random() |
49
cbe1cb50f2fd
Refactor ECLRunner/EnemyManager so that all VM stuff goes to ECLRunner
Thibaut Girka <thib@sitedethib.com>
parents:
diff
changeset
|
37 self.frame = 0 |
83
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
38 |
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
39 |
97 | 40 |
41 class Game(object): | |
42 def __init__(self, resource_loader, players, stage, rank, difficulty): | |
43 self.game_state = GameState(resource_loader, players, stage, rank, difficulty) | |
44 | |
45 self.enemies = [] | |
46 | |
47 self.bonuses = [] | |
48 | |
49 self.enm_anm_wrapper = resource_loader.get_anm_wrapper2(('stg%denm.anm' % stage, | |
50 'stg%denm2.anm' % stage)) | |
51 ecl = resource_loader.get_ecl('ecldata%d.ecl' % stage) | |
52 self.ecl_runner = ECLMainRunner(ecl, self.new_enemy, self.game_state) | |
53 | |
54 | |
55 def new_enemy(self, pos, life, instr_type): | |
56 enemy = Enemy(pos, life, instr_type, self.enm_anm_wrapper, self.game_state) | |
57 self.enemies.append(enemy) | |
58 return enemy | |
59 | |
60 | |
61 def run_iter(self, keystate): | |
62 # 1. VMs. | |
63 self.ecl_runner.run_iter() | |
64 | |
65 # 2. Filter out destroyed enemies | |
66 self.enemies[:] = (enemy for enemy in self.enemies if not enemy._removed) | |
83
fc0294c745b6
Basic bullet handling! Clean up as soon as possible :p
Thibaut Girka <thib@sitedethib.com>
parents:
52
diff
changeset
|
67 |
97 | 68 # 3. Let's play! |
69 for enemy in self.enemies: | |
70 enemy.update() | |
106 | 71 |
72 for bullet in self.game_state.bullets: | |
97 | 73 bullet.update() |
74 | |
75 # 4. Cleaning | |
76 self.cleanup() | |
77 | |
78 self.game_state.frame += 1 | |
79 | |
80 | |
81 def cleanup(self): | |
82 # Filter out non-visible enemies | |
83 for enemy in tuple(self.enemies): | |
84 if enemy.is_visible(384, 448): #TODO | |
85 enemy._was_visible = True | |
86 elif enemy._was_visible: | |
87 # Filter out-of-screen enemy | |
88 enemy._removed = True | |
89 self.enemies.remove(enemy) | |
90 | |
91 # Filter out-of-scren bullets | |
92 # TODO: was_visible thing | |
106 | 93 bullets = self.game_state.bullets |
94 for bullet in tuple(bullets): | |
97 | 95 if not bullet.is_visible(384, 448): |
106 | 96 bullets.remove(bullet) |
97 | 97 |
98 # Disable boss mode if it is dead/it has timeout | |
99 if self.game_state.boss and self.game_state.boss._removed: | |
100 self.game_state.boss = None | |
101 |