annotate skaapsteker/gamestate.py @ 632:0675f390653c

Initial port to Python 3 and Pygame 2.
author Simon Cross <hodgestar@gmail.com>
date Fri, 20 Jan 2023 20:01:06 +0100
parents a91b2e4400a5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
612
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 558
diff changeset
1 try:
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 558
diff changeset
2 import json
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 558
diff changeset
3 except:
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 558
diff changeset
4 import simplejson as json
a91b2e4400a5 Fallback to using simplejson if json does not exist (this appears to be all that is needed to add Python2.5 compatibility).
Simon Cross <hodgestar@gmail.com>
parents: 558
diff changeset
5
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
6 import os
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
7
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 225
diff changeset
8 from . import data
531
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
9 from . import options
248
129afb4417cf Some light cleanup.
Jeremy Thurgood <firxen@gmail.com>
parents: 225
diff changeset
10 from .sprites.base import find_sprite
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
11
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
12
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
13 class StateProxy(object):
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
14
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
15 def __init__(self, data, gamestate):
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
16 self.__dict__['_data'] = data # should be a dict
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
17 self.__dict__['_gamestate'] = gamestate # use sparingly
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
18
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
19 def __getattr__(self, key):
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
20 try:
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
21 value = self._data[key]
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
22 except KeyError:
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
23 raise AttributeError
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
24 if isinstance(value, dict):
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
25 return StateProxy(value, None) # surprise people
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
26 else:
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
27 return value
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
28
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
29 def __setattr__(self, key, value):
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
30 self._data[key] = value
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
31
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
32 def __iter__(self):
632
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
33 return self._data.keys()
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
34
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
35 def __contains__(self, key):
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
36 return key in self._data
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
37
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
38 def copy(self):
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
39 return self._data.copy()
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
40
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
41 def gamestate(self):
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
42 return self._gamestate
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
43
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
44
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
45 class GameState(object):
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
46
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
47 def __init__(self, game_file):
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
48 self._game_file = game_file
454
95527fd29872 More complete game load/save/restart.
Jeremy Thurgood <firxen@gmail.com>
parents: 447
diff changeset
49 self.world = None
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
50
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
51 def can_resume(self):
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
52 return os.path.exists(self._game_file)
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
53
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
54 def load_game(self, game_file=None):
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
55 if game_file is None:
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
56 game_file = self._game_file
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
57 raw_data = open(game_file, "rb").read()
632
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
58 self.data = json.loads(raw_data)
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
59 self.world = StateProxy(self.data, self)
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
60
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
61 def new_game(self):
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
62 self.load_game(data.filepath("game.json"))
531
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
63 if options['all_tails']:
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
64 self.data['fox']['tails'] += [
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
65 "fireball",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
66 "flight",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
67 "invisibility",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
68 "lightning",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
69 "shapeshift",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
70 "shield",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
71 "sprint",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
72 "steal",
5f1058593462 Remove all tails by default
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
73 ]
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
74 self.save_game()
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
75
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
76 def save_game(self):
479
fb9258d66137 New Main Menu
Stefano Rivera <stefano@rivera.za.net>
parents: 454
diff changeset
77 if self.world is None:
fb9258d66137 New Main Menu
Stefano Rivera <stefano@rivera.za.net>
parents: 454
diff changeset
78 return
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
79 save_dir, _ = os.path.split(self._game_file)
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
80 if not os.path.exists(save_dir):
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
81 try:
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
82 os.makedirs(save_dir)
632
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
83 except Exception:
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
84 print("Cannot create save game directory.")
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
85 return
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
86 try:
632
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
87 with open(self._game_file, "w") as f:
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
88 json.dump(self.data, f, indent=4)
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
89 except Exception:
0675f390653c Initial port to Python 3 and Pygame 2.
Simon Cross <hodgestar@gmail.com>
parents: 612
diff changeset
90 print("Cannot create save game file.")
127
e1dd3b785269 Initial game state stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
91
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
92 def create_sprites(self, level):
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
93 sprites = []
193
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
94 for stype, key in [
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
95 ('items', 'items'),
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
96 ('npcs', 'npcs')]:
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
97 for sprite_name, sprite_dict in self.data[key].items():
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
98 sprite_dict = sprite_dict.copy()
193
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
99 sprite_dict['name'] = sprite_name
897eec397cbb Fix state checks for hattori, ichiro, kaneda and kumiko. In the process provide easier access to other npcs.
Simon Cross <hodgestar@gmail.com>
parents: 189
diff changeset
100 sprite_dict['world'] = self.world
189
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
101 if sprite_dict.pop('level') == level:
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
102 sprites.append(find_sprite(sprite_dict, stype))
9d08f99b5ddf Add npcs to gamestate. Update gamestate. Pass world around a bit. Some other stuff.
Simon Cross <hodgestar@gmail.com>
parents: 127
diff changeset
103 return sprites
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
104
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
105 def create_item_sprite(self, item, to_level=None, to_pos=None):
493
cb2060f8316f Tweak gamestate to fail earlier on unknown items.
Simon Cross <hodgestar@gmail.com>
parents: 490
diff changeset
106 itemdef = self.data['items'][item]
447
4bec05fed6c7 Load and save.
Jeremy Thurgood <firxen@gmail.com>
parents: 248
diff changeset
107
490
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
108 if to_level is not None:
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
109 itemdef['level'] = to_level
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
110 if to_pos is not None:
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
111 itemdef['pos'] = to_pos
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
112
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
113 sprite_dict = itemdef.copy()
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
114 sprite_dict.pop('level')
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
115 sprite_dict['name'] = item
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
116 sprite_dict['world'] = self.world
0eade58a71b9 Support item dropping (specifically tails). Have monk drop tail.
Simon Cross <hodgestar@gmail.com>
parents: 483
diff changeset
117 return find_sprite(sprite_dict, 'items')
558
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
118
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
119 def create_npc_sprite(self, npc, to_level=None, to_pos=None):
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
120 npcdef = self.data['npcs'][npc]
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
121
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
122 if to_level is not None:
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
123 npcdef['level'] = to_level
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
124 if to_pos is not None:
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
125 npcdef['pos'] = to_pos
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
126
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
127 sprite_dict = npcdef.copy()
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
128 sprite_dict.pop('level')
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
129 sprite_dict['name'] = npc
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
130 sprite_dict['world'] = self.world
aa01ca54dce2 Add function for warping in NPCs.
Simon Cross <hodgestar@gmail.com>
parents: 554
diff changeset
131 return find_sprite(sprite_dict, 'npcs')