예제 #1
0
 def enterExit(self):
     if not self.mdt.options['development']['show_exit']:
         exit()
     self.__exit_menu = ExitMenu(Utils().menu_args)
예제 #2
0
class YorgFsm(Fsm):
    def __init__(self, mdt):
        Fsm.__init__(self, mdt)
        self.defaultTransitions = {
            'Menu': ['Race', 'Exit'],
            'Race': ['Ranking', 'Menu', 'Exit'],
            'Ranking': ['Tuning', 'Exit'],
            'Tuning': ['Menu', 'Race', 'Exit'],
            'Exit': ['Exit']
        }
        self.load_txt = None
        self.preview = None
        self.cam_tsk = None
        self.cam_node = None
        self.ranking_texts = None
        self.send_tsk = None
        self.cam_pivot = None
        self.ready_clients = None
        self.curr_load_txt = None
        self.__menu = None
        self.race = None
        self.__exit_menu = None

    def enterMenu(self):
        LogMgr().log('entering Menu state')
        menu_props = MenuProps(
            Utils().menu_args, self.mdt.options, [
                'kronos', 'themis', 'diones', 'iapeto', 'phoibe', 'rea',
                'iperion'
            ], 'assets/images/cars/%s.png',
            eng.curr_path + 'assets/models/cars/%s/phys.yml',
            ['desert', 'mountain', 'amusement'],
            lambda: [_('desert'),
                     _('mountain'),
                     _('amusement park')], 'assets/images/tracks/%s.png',
            self.mdt.options['settings']['player_name'], [
                'assets/images/drivers/driver%s.png',
                'assets/images/drivers/driver%s_sel.png'
            ], 'assets/images/cars/%s_sel.png',
            self.mdt.options['development']['multiplayer'],
            'assets/images/gui/yorg_title.png',
            'http://feeds.feedburner.com/ya2tech?format=xml',
            'http://www.ya2.it', 'save' in self.mdt.options.dct,
            self.mdt.options['development']['season'],
            ['prototype', 'desert', 'mountain', 'amusement'],
            'http://www.ya2.it/support-us',
            Utils().drivers)
        self.__menu = YorgMenu(menu_props)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_input_back)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_options_back)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_car_selected)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_car_selected_season)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_driver_selected)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_exit)
        self.__menu.gui.menu.attach_obs(self.mdt.logic.on_continue)
        self.mdt.logic.menu_start()
        if self.mdt.logic.season:
            self.mdt.logic.season.detach_obs(self.mdt.event.on_season_end)
            self.mdt.logic.season.detach_obs(self.mdt.event.on_season_cont)

    def exitMenu(self):
        LogMgr().log('exiting Menu state')
        self.__menu.destroy()
        self.mdt.audio.menu_music.stop()

    def enterRace(self, track_path='', car_path='', drivers=''):
        LogMgr().log('entering Race state')
        base.ignore('escape-up')
        if 'save' not in self.mdt.options.dct:
            self.mdt.options['save'] = {}
        self.mdt.options['save']['track'] = track_path
        self.mdt.options['save']['car'] = car_path
        self.mdt.options['save']['drivers'] = drivers
        self.mdt.options.store()
        keys = self.mdt.options['settings']['keys']
        joystick = self.mdt.options['settings']['joystick']
        sounds = {
            'engine': 'assets/sfx/engine.ogg',
            'brake': 'assets/sfx/brake.ogg',
            'crash': 'assets/sfx/crash.ogg',
            'crash_hs': 'assets/sfx/crash_high_speed.ogg',
            'lap': 'assets/sfx/lap.ogg',
            'landing': 'assets/sfx/landing.ogg'
        }
        if Server().is_active:
            self.season.create_race_server(keys, joystick, sounds)
        elif Client().is_active:
            self.season.create_race_client(keys, joystick, sounds)
        else:
            race_props = self.mdt.logic.build_race_props(
                car_path, drivers, track_path, keys, joystick, sounds)
            self.mdt.logic.season.create_race(race_props)
        LogMgr().log('selected drivers: ' + str(drivers))
        self.mdt.logic.season.race.logic.drivers = drivers
        track_name_transl = track_path
        track_dct = {
            'desert': _('desert'),
            'mountain': _('mountain'),
            'amusement': _('amusement park')
        }
        if track_path in track_dct:
            track_name_transl = track_dct[track_path]
        singlerace = game.logic.season.__class__ == SingleRaceSeason
        self.mdt.logic.season.race.fsm.demand(
            'Loading', track_path, car_path, [], drivers,
            ['prototype', 'desert', 'mountain', 'amusement'],
            track_name_transl, singlerace, [
                'kronos', 'themis', 'diones', 'iapeto', 'phoibe', 'rea',
                'iperion'
            ], 'assets/images/cars/%s_sel.png',
            'assets/images/drivers/driver%s_sel.png',
            game.options['settings']['joystick'],
            game.options['settings']['keys'],
            Utils().menu_args, 'assets/sfx/countdown.ogg')
        self.mdt.logic.season.race.attach_obs(self.mdt.logic.on_race_loaded)
        exit_meth = self.mdt.logic.on_ingame_exit_confirm
        self.mdt.logic.season.race.attach_obs(exit_meth)

    def exitRace(self):
        LogMgr().log('exiting Race state')
        self.mdt.logic.season.race.destroy()
        base.accept('escape-up', self.demand, ['Exit'])

    def enterRanking(self):
        self.mdt.logic.season.ranking.show()
        eng.do_later(10, self.demand, ['Tuning'])

    def exitRanking(self):
        self.mdt.logic.season.ranking.hide()

    def enterTuning(self):
        self.mdt.logic.season.tuning.show_gui()

    def exitTuning(self):
        self.mdt.logic.season.tuning.hide_gui()

    def enterExit(self):
        if not self.mdt.options['development']['show_exit']:
            exit()
        self.__exit_menu = ExitMenu(Utils().menu_args)

    def exitExit(self):
        self.__exit_menu.destroy()
예제 #3
0
파일: fsm.py 프로젝트: cflavio/yorg
 def enterExit(self):
     if not self.mediator.options['development']['show_exit']:
         #self.eng.xmpp.destroy()
         sys_exit()
     self.__exit_menu = ExitMenu(self.mediator.gameprops.menu_props)
     base.accept('escape-up', self.demand, ['Menu'])
예제 #4
0
파일: fsm.py 프로젝트: cflavio/yorg
class YorgFsm(FsmColleague):

    def __init__(self, mediator):
        FsmColleague.__init__(self, mediator)
        self.defaultTransitions = {
            'Menu': ['Race', 'Exit'],
            'Race': ['Ranking', 'Menu', 'Exit'],
            'Ranking': ['Tuning', 'Menu', 'Exit'],
            'Tuning': ['Menu', 'Race', 'Exit'],
            'Exit': ['Menu']}
        self.load_txt = self.preview = self.cam_tsk = self.cam_node = \
            self.ranking_texts = self.send_tsk = self.cam_pivot = \
            self.ready_clients = self.curr_load_txt = self.menu = \
            self.race = self.__exit_menu = self.loader_tsk = self.models = None

    def enterMenu(self):
        self.eng.log_mgr.log('entering Menu state')
        self.mediator.reset_drivers()
        self.mediator.gameprops.player_name = self.mediator.options['settings']['player_name']
        self.__menu_props = MenuProps(
            self.mediator.gameprops, self.mediator.options,
            'assets/images/gui/yorg_title.txo',
            'http://feeds.feedburner.com/ya2tech?format=xml',
            'https://www.ya2.it', 'save' in self.mediator.options.dct,
            'https://www.ya2.it/pages/support-us.html')
        self.menu = YorgMenu(self.__menu_props)
        methods = [self.mediator.logic.on_input_back,
                   self.mediator.logic.on_options_back,
                   self.mediator.logic.on_room_back,
                   self.mediator.logic.on_quit,
                   self.mediator.logic.on_car_selected,
                   self.mediator.logic.on_car_start_client,
                   self.mediator.logic.on_car_selected_season,
                   self.mediator.logic.on_driver_selected,
                   self.mediator.logic.on_driver_selected_server,
                   self.mediator.logic.on_driver_selected_mp,
                   self.mediator.logic.on_continue,
                   self.mediator.logic.on_login,
                   self.mediator.logic.on_logout]
        list(map(self.menu.attach_obs, methods))
        self.menu.attach_obs(self.demand, rename='on_exit', args=['Exit'])
        self.mediator.audio.menu_music.play()
        if self.mediator.logic.season:
            self.mediator.logic.season.detach_obs(self.mediator.event.on_season_end)
            self.mediator.logic.season.detach_obs(self.mediator.event.on_season_cont)
        self.models = []
        for car in self.mediator.gameprops.cars_names:
            self.models += [self.mediator.gameprops.damage_paths.low % car]
            self.models += [self.mediator.gameprops.damage_paths.hi % car]
            self.models += [self.mediator.gameprops.model_name % car]

            fpath = self.mediator.gameprops.wheel_gfx_names.front % car
            rpath = self.mediator.gameprops.wheel_gfx_names.rear % car
            m_exists = lambda path: \
                exists(path + '.egg') or exists(path + '.bam')
            b_path = self.mediator.gameprops.wheel_gfx_names.both % car
            front_path = fpath if m_exists(fpath) else b_path
            rear_path = rpath if m_exists(rpath) else b_path
            self.models += [front_path]
            self.models += [rear_path]
        self.load_models(None)
        self.eng.client.attach(self.on_presence_unavailable_room)
        #if self.mediator.logic.mp_frm:
        #    #if self.eng.xmpp.client:  # if we're logged
        #    #    self.mediator.logic.mp_frm.send_is_playing(False)
        #    self.mediator.logic.mp_frm.users_frm.invited_users = []
        #    self.mediator.logic.mp_frm.users_frm.in_match_room = None
        #    self.mediator.logic.mp_frm.msg_frm.curr_match_room = None

    def on_presence_unavailable_room(self, uid, room_name):
        #for usr in self.eng.xmpp.users:
        #    if usr.name == uid:
        #        if self.eng.server.is_active:
        #            for conn in self.eng.server.connections[:]:
        #                if usr.public_addr == conn.getpeername() or usr.local_addr == conn.getpeername():
        #                    self.eng.server.connections.remove(conn)
        if self.getCurrentOrNextState() == 'Menu':
            pass
            #if uid == self.mediator.logic.mp_frm.users_frm.in_match_room:
            #    self.menu.disable()

    def on_start_match(self):
        self.menu.logic.on_push_page('trackpageserver', [self.__menu_props, self.mediator.fsm.menu.logic.curr_room])

    def on_start_match_client(self, track):
        #self.mediator.logic.mp_frm.on_track_selected()
        self.menu.logic.on_track_selected(track)
        self.menu.logic.on_push_page('carpageclient', [self.__menu_props])

    def enable_menu(self, val):
        (self.menu.enable if val else self.menu.disable)()

    def enable_menu_navigation(self, val):
        (self.menu.enable_navigation if val else self.menu.disable_navigation)()

    def on_srv_quitted(self):
        if self.getCurrentOrNextState() == 'Menu':
            self.menu.logic.on_srv_quitted()
        else: self.demand('Menu')

    def on_removed(self): self.menu.logic.on_removed()

    def create_room(self, room, nick):
        self.menu.logic.create_room(room, nick)

    def load_models(self, model):
        if not self.models: return
        model = self.models.pop(0)
        self.loader_tsk = loader.loadModel(model, callback=self.load_models)

    def exitMenu(self):
        self.eng.log_mgr.log('exiting Menu state')
        self.menu.destroy()
        self.mediator.audio.menu_music.stop()
        loader.cancelRequest(self.loader_tsk)
        self.eng.client.detach(self.on_presence_unavailable_room)

    def enterRace(self, track_path='', car_path='', cars=[], drivers='',
                  ranking=None):  # unused ranking, cars
        self.eng.log_mgr.log('entering Race state')
        #if self.mediator.logic.mp_frm:  # None if dev quicksart
        #    self.mediator.logic.mp_frm.hide()
        base.ignore('escape-up')
        seas = self.mediator.logic.season
        if not seas.props.single_race:
            if 'save' not in self.mediator.options.dct:
                self.mediator.options['save'] = {}
            self.mediator.options['save']['track'] = track_path
            self.mediator.options['save']['cars'] = car_path
            self.mediator.options['save']['drivers'] = [
                drv.to_dct() for drv in drivers]
            self.mediator.options['save']['tuning'] = seas.tuning.car2tuning
            self.mediator.options['save']['ranking'] = seas.ranking.carname2points
            self.mediator.options.store()
        keys = self.mediator.options['settings']['keys']
        p1k = PlayerKeys(keys['forward1'], keys['rear1'], keys['left1'], keys['right1'],
                         keys['fire1'], keys['respawn1'])
        p2k = PlayerKeys(keys['forward2'], keys['rear2'], keys['left2'], keys['right2'],
                         keys['fire2'], keys['respawn2'])
        p3k = PlayerKeys(keys['forward3'], keys['rear3'], keys['left3'], keys['right3'],
                         keys['fire3'], keys['respawn3'])
        p4k = PlayerKeys(keys['forward4'], keys['rear4'], keys['left4'], keys['right4'],
                         keys['fire4'], keys['respawn4'])
        keys = Keys([p1k, p2k, p3k, p4k], keys['pause'])
        joystick = self.mediator.options['settings']['joystick1']
        sounds = CarSounds(
            'assets/sfx/engine.ogg', 'assets/sfx/brake.ogg',
            'assets/sfx/crash.ogg', 'assets/sfx/crash_high_speed.ogg',
            'assets/sfx/lap.ogg', 'assets/sfx/landing.ogg',
            'assets/sfx/pitstop.ogg', 'assets/sfx/fire.ogg',
            'assets/sfx/hit.ogg', 'assets/sfx/turbo.ogg',
            'assets/sfx/rotate_all_fire.ogg', 'assets/sfx/rotate_all_hit.ogg')
        race_props = self.mediator.logic.build_race_props(
            seas.logic.drivers, track_path, keys, joystick, sounds,
            self.mediator.options['development']['start_wp'])
        if self.eng.server.is_active:
            #seas.create_race_server(race_props)
            seas.create_race_server(race_props)
        elif self.eng.client.is_client_active:
            seas.create_race_client(race_props)
        else:
            seas.create_race(race_props)
        self.eng.log_mgr.log('selected drivers: ' +
                             str([drv.dprops for drv in drivers]))
        seas.race.logic.drivers = drivers
        track_name_transl = track_path
        track_dct = {
            'toronto': _('Toronto'), 'rome': _('Rome'),
            'sheffield': _('Sheffield'), 'orlando': _('Orlando'),
            'nagano': _('Nagano'), 'dubai': _('Dubai'),
            'moon': _('Sinus Aestuum')}
        if track_path in track_dct:
            track_name_transl = track_dct[track_path]
        seas.race.fsm.demand(
            'Loading', race_props, track_name_transl, drivers, seas.ranking,
            seas.tuning)
        seas.race.attach_obs(self.mediator.logic.on_race_loaded)
        exit_mth = 'on_ingame_exit_confirm'
        seas.race.attach_obs(self.mediator.fsm.demand, rename=exit_mth,
                             args=['Menu'])
        self.eng.client.attach(self.on_presence_unavailable_room)

    def exitRace(self):
        self.eng.log_mgr.log('exiting Race state')
        dev = self.mediator.options['development']
        cars = dev['cars'] if 'cars' in dev else ''
        track = dev['track'] if 'track' in dev else ''
        server = dev['server'] if 'server' in dev else ''
        #if not (cars and track and not server):
        #    self.mediator.logic.mp_frm.show()
        self.mediator.logic.season.race.destroy()
        base.accept('escape-up', self.demand, ['Exit'])
        self.eng.client.detach(self.on_presence_unavailable_room)

    def enterRanking(self):
        self.mediator.logic.season.ranking.show(
            self.mediator.logic.season.race.logic.props,
            self.mediator.logic.season.props, self.mediator.logic.season.logic.ranking)
        self.eng.do_later(.1, self.mediator.logic.season.ranking.attach_obs,
                          [self.on_ranking_end])
        self.eng.do_later(.1, self.mediator.logic.season.ranking.attach_obs,
                          [self.on_ranking_next_race])

    def on_ranking_end(self):
        self.demand('Tuning')

    def on_ranking_next_race(self):
        self.mediator.logic.season.logic.next_race()

    def exitRanking(self):
        self.mediator.logic.season.ranking.detach_obs(self.on_ranking_end)
        self.mediator.logic.season.ranking.detach_obs(self.on_ranking_next_race)
        self.mediator.logic.season.ranking.hide()

    def enterTuning(self):
        self.mediator.logic.season.tuning.show_gui()

    def exitTuning(self):
        self.mediator.logic.season.tuning.hide_gui()

    def enterExit(self):
        if not self.mediator.options['development']['show_exit']:
            #self.eng.xmpp.destroy()
            sys_exit()
        self.__exit_menu = ExitMenu(self.mediator.gameprops.menu_props)
        base.accept('escape-up', self.demand, ['Menu'])

    def exitExit(self):
        self.__exit_menu.destroy()
        base.accept('escape-up', self.demand, ['Exit'])
예제 #5
0
 def enterExit(self):
     if not self.mediator.options['development']['show_exit']:
         self.eng.xmpp.destroy()
         sys_exit()
     self.__exit_menu = ExitMenu(self.mediator.gameprops.menu_args)
     base.accept('escape-up', self.demand, ['Menu'])
예제 #6
0
class YorgFsm(FsmColleague):

    def __init__(self, mediator):
        FsmColleague.__init__(self, mediator)
        self.defaultTransitions = {
            'Menu': ['Race', 'Exit'],
            'Race': ['Ranking', 'Menu', 'Exit'],
            'Ranking': ['Tuning', 'Menu', 'Exit'],
            'Tuning': ['Menu', 'Race', 'Exit'],
            'Exit': ['Menu']}
        self.load_txt = self.preview = self.cam_tsk = self.cam_node = \
            self.ranking_texts = self.send_tsk = self.cam_pivot = \
            self.ready_clients = self.curr_load_txt = self.__menu = \
            self.race = self.__exit_menu = self.loader_tsk = self.models = None

    def enterMenu(self):
        self.eng.log_mgr.log('entering Menu state')
        self.mediator.reset_drivers()
        self.mediator.gameprops.player_name = self.mediator.options['settings']['player_name']
        self.__menu_props = MenuProps(
            self.mediator.gameprops, self.mediator.options,
            'assets/images/gui/yorg_title.txo',
            'http://feeds.feedburner.com/ya2tech?format=xml',
            'http://www.ya2.it', 'save' in self.mediator.options.dct,
            'http://www.ya2.it/pages/support-us.html')
        self.__menu = YorgMenu(self.__menu_props)
        methods = [self.mediator.logic.on_input_back,
                   self.mediator.logic.on_options_back,
                   self.mediator.logic.on_room_back,
                   self.mediator.logic.on_quit,
                   self.mediator.logic.on_car_selected,
                   self.mediator.logic.on_car_start_client,
                   self.mediator.logic.on_car_selected_season,
                   self.mediator.logic.on_driver_selected,
                   self.mediator.logic.on_driver_selected_server,
                   self.mediator.logic.on_continue,
                   self.mediator.logic.on_login,
                   self.mediator.logic.on_logout]
        map(self.__menu.attach_obs, methods)
        self.__menu.attach_obs(self.demand, rename='on_exit', args=['Exit'])
        self.mediator.audio.menu_music.play()
        if self.mediator.logic.season:
            self.mediator.logic.season.detach_obs(self.mediator.event.on_season_end)
            self.mediator.logic.season.detach_obs(self.mediator.event.on_season_cont)
        self.models = []
        for car in self.mediator.gameprops.cars_names:
            self.models += [self.mediator.gameprops.damage_paths.low % car]
            self.models += [self.mediator.gameprops.damage_paths.hi % car]
            self.models += [self.mediator.gameprops.model_name % car]

            fpath = self.mediator.gameprops.wheel_gfx_names.front % car
            rpath = self.mediator.gameprops.wheel_gfx_names.rear % car
            m_exists = lambda path: \
                exists(path + '.egg') or exists(path + '.bam')
            b_path = self.mediator.gameprops.wheel_gfx_names.both % car
            front_path = fpath if m_exists(fpath) else b_path
            rear_path = rpath if m_exists(rpath) else b_path
            self.models += [front_path]
            self.models += [rear_path]
        self.load_models(None)
        self.eng.xmpp.attach(self.on_presence_unavailable_room)
        if self.mediator.logic.mp_frm:
            if self.eng.xmpp.client:  # if we're logged
                self.mediator.logic.mp_frm.send_is_playing(False)
            self.mediator.logic.mp_frm.users_frm.invited_users = []
            self.mediator.logic.mp_frm.users_frm.in_match_room = None
            self.mediator.logic.mp_frm.msg_frm.curr_match_room = None

    def on_presence_unavailable_room(self, msg):
        for usr in self.eng.xmpp.users:
            if usr.name == str(msg['muc']['nick']):
                if self.eng.server.is_active:
                    for conn in self.eng.server.connections[:]:
                        if usr.public_addr == conn.getpeername() or usr.local_addr == conn.getpeername():
                            self.eng.server.connections.remove(conn)
        if self.getCurrentOrNextState() == 'Menu':
            if str(msg['muc']['nick']) == self.mediator.logic.mp_frm.users_frm.in_match_room:
                self.__menu.enable(False)

    def on_start_match(self):
        self.__menu.logic.on_push_page('trackpageserver', [self.__menu_props])

    def on_start_match_client(self, track):
        self.mediator.logic.mp_frm.on_track_selected()
        self.__menu.logic.on_track_selected(track)
        self.__menu.logic.on_push_page('carpageclient', [self.__menu_props])

    def enable_menu(self, val): self.__menu.enable(val)

    def enable_menu_navigation(self, val): self.__menu.enable_navigation(val)

    def on_srv_quitted(self):
        if self.getCurrentOrNextState() == 'Menu':
            self.__menu.logic.on_srv_quitted()
        else: self.demand('Menu')

    def on_removed(self): self.__menu.logic.on_removed()

    def create_room(self, room, nick):
        self.__menu.logic.create_room(room, nick)

    def load_models(self, model):
        if not self.models: return
        model = self.models.pop(0)
        self.loader_tsk = loader.loadModel(model, callback=self.load_models)

    def exitMenu(self):
        self.eng.log_mgr.log('exiting Menu state')
        self.__menu.destroy()
        self.mediator.audio.menu_music.stop()
        loader.cancelRequest(self.loader_tsk)
        self.eng.xmpp.detach(self.on_presence_unavailable_room)

    def enterRace(self, track_path='', car_path='', cars=[], drivers='',
                  ranking=None):  # unused ranking, cars
        self.eng.log_mgr.log('entering Race state')
        if self.mediator.logic.mp_frm:  # None if dev quicksart
            self.mediator.logic.mp_frm.hide()
        base.ignore('escape-up')
        seas = self.mediator.logic.season
        if not seas.props.single_race:
            if 'save' not in self.mediator.options.dct:
                self.mediator.options['save'] = {}
            self.mediator.options['save']['track'] = track_path
            self.mediator.options['save']['car'] = car_path
            self.mediator.options['save']['drivers'] = [
                drv.to_dct() for drv in drivers]
            self.mediator.options['save']['tuning'] = seas.tuning.car2tuning
            self.mediator.options['save']['ranking'] = seas.ranking.carname2points
            self.mediator.options.store()
        keys = self.mediator.options['settings']['keys']
        keys = Keys(keys['forward'], keys['rear'], keys['left'], keys['right'],
                    keys['fire'], keys['respawn'], keys['pause'])
        joystick = self.mediator.options['settings']['joystick']
        sounds = CarSounds(
            'assets/sfx/engine.ogg', 'assets/sfx/brake.ogg',
            'assets/sfx/crash.ogg', 'assets/sfx/crash_high_speed.ogg',
            'assets/sfx/lap.ogg', 'assets/sfx/landing.ogg',
            'assets/sfx/pitstop.ogg', 'assets/sfx/fire.ogg',
            'assets/sfx/hit.ogg', 'assets/sfx/turbo.ogg',
            'assets/sfx/rotate_all_fire.ogg', 'assets/sfx/rotate_all_hit.ogg')
        race_props = self.mediator.logic.build_race_props(
            seas.logic.drivers, track_path, keys, joystick, sounds,
            self.mediator.options['development']['start_wp'])
        if self.eng.server.is_active:
            seas.create_race_server(race_props)
        elif self.eng.client.is_active:
            seas.create_race_client(race_props)
        else:
            seas.create_race(race_props)
        self.eng.log_mgr.log('selected drivers: ' +
                             str([drv.dprops for drv in drivers]))
        seas.race.logic.drivers = drivers
        track_name_transl = track_path
        track_dct = {
            'toronto': _('Toronto'), 'rome': _('Rome'),
            'sheffield': _('Sheffield'), 'orlando': _('Orlando'),
            'nagano': _('Nagano'), 'dubai': _('Dubai')}
        if track_path in track_dct:
            track_name_transl = track_dct[track_path]
        seas.race.fsm.demand(
            'Loading', race_props, track_name_transl, drivers, seas.ranking,
            seas.tuning)
        seas.race.attach_obs(self.mediator.logic.on_race_loaded)
        exit_mth = 'on_ingame_exit_confirm'
        seas.race.attach_obs(self.mediator.fsm.demand, rename=exit_mth,
                             args=['Menu'])
        self.eng.xmpp.attach(self.on_presence_unavailable_room)

    def exitRace(self):
        self.eng.log_mgr.log('exiting Race state')
        dev = self.mediator.options['development']
        car = dev['car'] if 'car' in dev else ''
        track = dev['track'] if 'track' in dev else ''
        server = dev['server'] if 'server' in dev else ''
        if not (car and track and not server):
            self.mediator.logic.mp_frm.show()
        self.mediator.logic.season.race.destroy()
        base.accept('escape-up', self.demand, ['Exit'])
        self.eng.xmpp.detach(self.on_presence_unavailable_room)


    def enterRanking(self):
        self.mediator.logic.season.ranking.show(
            self.mediator.logic.season.race.logic.props,
            self.mediator.logic.season.props, self.mediator.logic.season.logic.ranking)
        self.eng.do_later(.1, self.mediator.logic.season.ranking.attach_obs,
                          [self.on_ranking_end])
        self.eng.do_later(.1, self.mediator.logic.season.ranking.attach_obs,
                          [self.on_ranking_next_race])

    def on_ranking_end(self):
        self.demand('Tuning')

    def on_ranking_next_race(self):
        self.mediator.logic.season.logic.next_race()

    def exitRanking(self):
        self.mediator.logic.season.ranking.detach_obs(self.on_ranking_end)
        self.mediator.logic.season.ranking.detach_obs(self.on_ranking_next_race)
        self.mediator.logic.season.ranking.hide()

    def enterTuning(self):
        self.mediator.logic.season.tuning.show_gui()

    def exitTuning(self):
        self.mediator.logic.season.tuning.hide_gui()

    def enterExit(self):
        if not self.mediator.options['development']['show_exit']:
            self.eng.xmpp.destroy()
            sys_exit()
        self.__exit_menu = ExitMenu(self.mediator.gameprops.menu_args)
        base.accept('escape-up', self.demand, ['Menu'])

    def exitExit(self):
        self.__exit_menu.destroy()
        base.accept('escape-up', self.demand, ['Exit'])