source: trunk/game/run.py @ 396

Revision 361, 6.3 KB checked in by orlandov, 10 years ago (diff)

Ticket #104 - Patch by Vaporice and or1andov. Integrate quests into game dialogue and make it possible to persist quest state. fixes[s:trac, t:134]

  • Integrate Vaporice's quest engine implementation
  • Discontinue or1andov's sample dialogue and use Zenbitz's Drunkard
  • Reuse Zenbitz's dialogue functions and callbacks in the game PlayerCharacter? class
  • Whitespace and style tweaks
  • Property svn:eol-style set to native
  • Property svn:executable set to *
RevLine 
[339]1#!/usr/bin/env python
[26]2
[30]3#   This program is free software: you can redistribute it and/or modify
4#   it under the terms of the GNU General Public License as published by
5#   the Free Software Foundation, either version 3 of the License, or
6#   (at your option) any later version.
[26]7
[30]8#   This program is distributed in the hope that it will be useful,
9#   but WITHOUT ANY WARRANTY; without even the implied warranty of
10#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11#   GNU General Public License for more details.
[26]12
[30]13#   You should have received a copy of the GNU General Public License
14#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
[26]15
[222]16import sys, os, shutil, re
[26]17
[32]18from scripts.common import utils
[33]19# add paths to the swig extensions
[48]20utils.addPaths ('../../engine/swigwrappers/python', '../../engine/extensions')
[26]21
[88]22if not os.path.exists('settings.xml'):
23    shutil.copyfile('settings-dist.xml', 'settings.xml')
24
[143]25import fife_compat, fife, fifelog
[157]26import pychan
[26]27from scripts import world
[54]28from scripts import engine
[281]29from scripts import console
[222]30from scripts.engine import Engine
[26]31from scripts.common import eventlistenerbase
32from basicapplication import ApplicationBase
33from settings import Setting
34
35TDS = Setting()
36
[143]37"""This folder holds the main meta-data for PARPG. This file should be
38   minimal, since folding code into the controller with MVC is usually bad
[312]39   All game and logic and data is held held and referenced in
40   /scripts/engine.py. All fife stuff goes in /scripts/world.py"""
[58]41
[26]42class ApplicationListener(eventlistenerbase.EventListenerBase):
[222]43    def __init__(self, engine, world, model):
[143]44        """Initialise the instance.
[302]45           @type engine: engine.Engine
[143]46           @param engine: ???
[302]47           @type world: world.World
[143]48           @param world: ???
[222]49           @type model: engine.Engine
50           @param model: an instance of PARPG's engine"""
[30]51        super(ApplicationListener, self).__init__(engine,
[315]52                                                  reg_keys=True,reg_cmd=True,
53                                                  reg_mouse=False, 
54                                                  reg_console=True,
55                                                  reg_widget=True)
[66]56        self.engine = engine
57        self.world = world
[222]58        self.model = model
[30]59        engine.getEventManager().setNonConsumableKeys([fife.Key.ESCAPE,])
[66]60        self.quit = False
61        self.aboutWindow = None
[281]62        self.console=console.Console(self)
[26]63
[58]64    def quitGame(self):
[143]65        """Forces a quit game on next cycle.
66           @return: None"""
[66]67        self.quit = True
[58]68
[220]69    def onConsoleCommand(self, command):
70        """
[281]71        Called on every console comand, delegates calls  to the a console
72        object, implementing the callbacks
[220]73        @type command: string
74        @param command: the command to run
75        @return: result
76        """
[222]77
[281]78        return self.console.handleConsoleCommand(command)
[222]79
[66]80    def onCommand(self, command):
[143]81        """Enables the game to be closed via the 'X' button on the window frame
82           @type command: fife.Command
83           @param command: The command to read.
84           @return: None"""
[66]85        if(command.getCommandType() == fife.CMD_QUIT_GAME):
86            self.quit = True
[32]87            command.consume()
[26]88
89class PARPG(ApplicationBase):
[54]90    """Main Application class
[58]91       We use an MVC data model.
92       self.world is our view,self.engine is our model
93       This file is the minimal controller"""
[30]94    def __init__(self):
[143]95        """Initialise the instance.
96           @return: None"""
[30]97        super(PARPG,self).__init__()
[66]98        self.world = world.World(self.engine)
99        self.model = engine.Engine(self.world)
[68]100        self.world.data = self.model
[361]101        self.world.initHud()
[222]102        self.listener = ApplicationListener(self.engine,self.world,self.model)
[66]103        self.world.quitFunction = self.listener.quitGame
[310]104        self.model.loadMap("main-map", str(TDS.readSetting("MapFile")))
[157]105        pychan.init(self.engine, debug = True)
[26]106
[30]107    def loadSettings(self):
108        """Load the settings from a python file and load them into the engine.
[143]109           Called in the ApplicationBase constructor.
110           @return: None"""
[30]111        import settings
[66]112        self.settings = settings
[315]113        e_set = self.engine.getSettings()
114        e_set.setDefaultFontGlyphs(str(TDS.readSetting("FontGlyphs",
[66]115                                                      strip=False)))
[315]116        e_set.setDefaultFontPath(str(TDS.readSetting("Font")))
117        e_set.setDefaultFontSize(int(TDS.readSetting("FontSize", default=12)))
118        e_set.setBitsPerPixel(int(TDS.readSetting("BitsPerPixel")))
119        e_set.setInitialVolume(float(TDS.readSetting("InitialVolume")))
120        e_set.setSDLRemoveFakeAlpha(int(TDS.readSetting("SDLRemoveFakeAlpha")))
121        e_set.setScreenWidth(int(TDS.readSetting("ScreenWidth")))
122        e_set.setScreenHeight(int(TDS.readSetting("ScreenHeight")))
123        e_set.setRenderBackend(str(TDS.readSetting("RenderBackend")))
124        e_set.setFullScreen(int(TDS.readSetting("FullScreen")))
[30]125        try:
[315]126            e_set.setWindowTitle(str(TDS.readSetting("WindowTitle")))
127            e_set.setWindowIcon(str(TDS.readSetting("WindowIcon")))
[30]128        except:
129            pass           
130        try:
[315]131            e_set.setImageChunkingSize(int(TDS.readSetting("ImageChunkSize")))
[30]132        except:
133            pass
[26]134
[30]135    def initLogging(self):
[143]136        """Initialize the LogManager.
137           @return: None"""
[66]138        LogModules = TDS.readSetting("LogModules",type='list')
139        self.log = fifelog.LogManager(self.engine,
[32]140                                      int(TDS.readSetting("LogToPrompt")),
141                                      int(TDS.readSetting("LogToFile")))
[58]142        if(LogModules):
[30]143            self.log.setVisibleModules(*LogModules)
[26]144
[30]145    def createListener(self):
[143]146        """@return: None"""
[30]147        # already created in constructor
[143]148        # but if we don't put one here, Fife gets all fussy :-)
[30]149        pass
[26]150
[30]151    def _pump(self):
[143]152        """Main game loop.
153           There are in fact 2 main loops, this one and the one in World.
154           @return: None"""
[30]155        if self.listener.quit:
156            self.breakRequested = True
157        else:
[150]158            self.model.pump()
[30]159            self.world.pump()
[26]160
161def main():
[30]162    """Application code starts from here"""
[66]163    app = PARPG()
[30]164    app.run()
[26]165
166if __name__ == '__main__':
[30]167    main()
[26]168
Note: See TracBrowser for help on using the repository browser.