Mercurial > fujo
changeset 74:5b3421b7be82
working savegames
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 04 Jan 2014 13:15:50 +0100 |
| parents | e43ced9ef14f |
| children | 798640df3874 |
| files | fujo/game.py fujo/items.py fujo/level.py fujo/mobs.py fujo/player.py fujo/things.py fujo/title.py |
| diffstat | 7 files changed, 77 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/fujo/game.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/game.py Sat Jan 04 13:15:50 2014 +0100 @@ -8,31 +8,41 @@ from . import player from . import things from . import window +from . import saves class Game(object): def __init__(self): self.display = display.Display() - self.player = player.Player() - self.player.status_window = window.Message( + self.status_window = window.Message( (4, self.display.size[1] - 36, 272, 32), []) - self.player.update_status() - self.display.windows.add(self.player.status_window) + self.display.windows.add(self.status_window) + self.player = None - def new_level(self): - self.player.level += 1 - if self.player.level > 5: - self.running = False - return - self.player.pos = None - self.player.climb = False - self.level = level.Level(self.player.level) - self.level.player = self.player - pos = self.level.empty.pop() - self.level.place_thing(things.Hole(), pos) - self.level.place_mob(self.player, pos) - self.level.explore(self.player.pos) + def new_level(self, next_level=None): + if next_level is None: + if self.player is None: + self.player = player.Player() + else: + self.player.level += 1 + if self.player.level > 5: + self.running = False + return + self.player.pos = None + self.player.climb = False + self.level = level.BasicLevel(self.player.level) + self.level.player = self.player + pos = self.level.empty.pop() + self.level.place_thing(things.Hole(), pos) + self.level.place_mob(self.player, pos) + self.level.explore(self.player.pos) + saves.save(self.level.save()) + else: + self.level = next_level + self.player = self.level.player + self.player.status_window = self.status_window + self.player.update_status() self.display.render_level(self.level) self.display.refresh() @@ -66,13 +76,18 @@ if mob != self.player: mob.act(self.level) - def run(self): + def run(self, load_data=None): self.running = True - self.new_level() + if load_data: + next_level = level.Level.create(load_data) + else: + next_level = None + self.new_level(next_level) while self.running: self.tick() self.display.update() self.display.tick() + saves.delete() options = [ ('again', 'Play again'), ('exit', 'Exit to title'),
--- a/fujo/items.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/items.py Sat Jan 04 13:15:50 2014 +0100 @@ -95,7 +95,7 @@ mob.wound(self.damage * 2) def save(self): - data = super(Item, self).save() + data = super(Weapon, self).save() data['bonus'] = self.bonus return data @@ -170,12 +170,12 @@ self.__class__.identified = True def save(self): - data = super(Item, self).save() + data = super(Spell, self).save() data['identified'] = self.identified return data def load(self, data): - super(Weapon, self).load(data) + super(Spell, self).load(data) if data['identified'] != self.identified: self.identified = data['identified']
--- a/fujo/level.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/level.py Sat Jan 04 13:15:50 2014 +0100 @@ -7,6 +7,7 @@ from . import things from . import items from . import saves +from . import player AREAS = [ @@ -201,7 +202,7 @@ mob_list = [mobs.Mob.create(mob) for mob in data['mobs']] self.mobs = dict((mob.pos, mob) for mob in mob_list) for mob in mob_list: - if isinstance(mob, mobs.Player): + if isinstance(mob, player.Player): self.player = mob break things_list = [things.Thing.create(thing) for thing in data['things']]
--- a/fujo/mobs.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/mobs.py Sat Jan 04 13:15:50 2014 +0100 @@ -74,7 +74,8 @@ def load(self, data): super(Mob, self).load(data) - self.pos = tuple(data['position']) + self.pos = None + self.set_pos(tuple(data['position'])) self.health = data['health']
--- a/fujo/player.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/player.py Sat Jan 04 13:15:50 2014 +0100 @@ -21,7 +21,7 @@ super(Player, self).__init__(RES.player) self.face = 0 self.animation = None - self.level = -1 + self.level = 0 self.status_window = None self.max_food = 200 self.food = 100 @@ -265,6 +265,6 @@ self.max_food = data['max_food'] self.hunger = data['hunger'] self.level = data['level'] - self.items = [item.create() for item in data['items']] + self.items = [items.Item.create(item) for item in data['items']] self.weapon = self.items[data['weapon']] if data['weapon'] else None self.armor = self.items[data['armor']] if data['armor'] else None
--- a/fujo/things.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/things.py Sat Jan 04 13:15:50 2014 +0100 @@ -53,15 +53,18 @@ def load(self, data): super(Thing, self).load(data) - self.pos = tuple(data['position']) + self.pos = None + self.set_pos(tuple(data['position'])) +@Thing.register class Item(Thing): frame = 1 - def __init__(self, item): - self.item = item - self.frame = item.looks + def __init__(self, item=None): + if item is not None: + self.item = item + self.frame = item.looks self.picked_up = False self.dy = 0 super(Item, self).__init__() @@ -86,26 +89,32 @@ self.item = items.Item.kinds[data['item']] +@Thing.register class Ladder(Thing): frame = 2 exit = True +@Thing.register class Hole(Thing): frame = 3 +@Thing.register class SmallBush(Thing): frame = 4 +@Thing.register class Bush(Thing): frame = 5 +@Thing.register class Rocks(Thing): frame = 6 +@Thing.register class Stones(Thing): frame = 7
--- a/fujo/title.py Sat Jan 04 12:20:17 2014 +0100 +++ b/fujo/title.py Sat Jan 04 13:15:50 2014 +0100 @@ -6,6 +6,7 @@ from . import window from . import display from . import game +from . import saves from .resources import RES @@ -29,21 +30,23 @@ pygame.display.update(dirty) def run(self): - if pygame.mixer.get_init(): - RES.load_music() - pygame.mixer.music.play(-1) - options = [ - ('start', 'Start game'), - ('music off', 'Turn music off'), - ('exit', 'Exit'), - ] - else: - options = [ - ('start', 'Start game'), - ('exit', 'Exit'), - ] - menu = window.Menu((256, 64, 160, 32), options) while True: + if pygame.mixer.get_init(): + RES.load_music() + pygame.mixer.music.play(-1) + options = [ + ('start', 'Start new game'), + ('music off', 'Turn music off'), + ('exit', 'Exit'), + ] + else: + options = [ + ('start', 'Start new game'), + ('exit', 'Exit'), + ] + if saves.valid(): + options.insert(0, ('continue', 'Continue')) + menu = window.Menu((256, 64, 160, 32), options) self.screen.blit(RES.title, (0, 0)) menu.set_lines(label for choice, label in options) pygame.display.flip() @@ -52,6 +55,10 @@ run = True while run: run = game.Game().run() + elif choice == 'continue': + run = game.Game().run(saves.load()) + while run: + run = game.Game().run() elif choice == 'music off': pygame.mixer.music.stop() options[1] = ('music on', 'Turn music on')
