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')