Permalink
Cannot retrieve contributors at this time
executable file
334 lines (315 sloc)
13.1 KB
| import argparse, sys | |
| from sys import platform, path | |
| from logging import info | |
| from importlib import reload | |
| from copy import deepcopy | |
| from os import walk | |
| from os.path import exists, dirname | |
| from json import load | |
| from panda3d.core import Filename | |
| from yyagl.game import Game | |
| from yyagl.dictfile import DctFile | |
| from yyagl.engine.configuration import Cfg, GuiCfg, ProfilingCfg, LangCfg, \ | |
| CursorCfg, DevCfg | |
| from yyagl.engine.gui.menu import MenuProps, NavInfo, NavInfoPerPlayer | |
| from yyagl.engine.logic import EngineLogic | |
| from yyagl.lib.p3d.p3d import LibP3d | |
| from yracing.gameprops import GameProps | |
| from yracing.driver.driver import Driver | |
| from .logic import YorgLogic | |
| from .event import YorgEvent | |
| from .fsm import YorgFsm | |
| from .audio import YorgAudio | |
| from .client import YorgClient | |
| from .thanksnames import ThanksNames | |
| class DriverPaths: | |
| def __init__(self, path, path_sel): | |
| self.path = path | |
| self.path_sel = path_sel | |
| class DamageInfo: | |
| def __init__(self, low, hi): | |
| self.low = low | |
| self.hi = hi | |
| class WheelGfxNames: | |
| def __init__(self, front, rear, both): | |
| self.front = front | |
| self.rear = rear | |
| self.both = both | |
| class Yorg(Game): | |
| def __init__(self): | |
| default_opt = { | |
| 'settings': { | |
| 'lang': 'en', | |
| 'volume': 1, | |
| 'fullscreen': 0, | |
| 'resolution': '1280 720', | |
| 'antialiasing': 0, | |
| 'cars_number': 8, | |
| 'keys': { | |
| 'forward1': 'raw-arrow_up', | |
| 'rear1': 'raw-arrow_down', | |
| 'left1': 'raw-arrow_left', | |
| 'right1': 'raw-arrow_right', | |
| 'fire1': 'raw-rcontrol', | |
| 'respawn1': 'raw-rshift', | |
| 'forward2': 'raw-w', | |
| 'rear2': 'raw-s', | |
| 'left2': 'raw-a', | |
| 'right2': 'raw-d', | |
| 'fire2': 'raw-x', | |
| 'respawn2': 'raw-c', | |
| 'forward3': 'raw-i', | |
| 'rear3': 'raw-k', | |
| 'left3': 'raw-j', | |
| 'right3': 'raw-l', | |
| 'fire3': 'raw-n', | |
| 'respawn3': 'raw-m', | |
| 'forward4': 'raw-t', | |
| 'rear4': 'raw-g', | |
| 'left4': 'raw-f', | |
| 'right4': 'raw-h', | |
| 'fire4': 'raw-v', | |
| 'respawn4': 'raw-b' | |
| }, | |
| 'joystick': { | |
| 'forward1': 'rtrigger', | |
| 'rear1': 'ltrigger', | |
| 'fire1': 'face_x', | |
| 'respawn1': 'face_y', | |
| 'menu1': 'rshoulder', | |
| 'forward2': 'rtrigger', | |
| 'rear2': 'ltrigger', | |
| 'fire2': 'face_x', | |
| 'respawn2': 'face_y', | |
| 'menu2': 'rshoulder', | |
| 'forward3': 'rtrigger', | |
| 'rear3': 'ltrigger', | |
| 'fire3': 'face_x', | |
| 'respawn3': 'face_y', | |
| 'menu3': 'rshoulder', | |
| 'forward4': 'rtrigger', | |
| 'rear4': 'ltrigger', | |
| 'fire4': 'face_x', | |
| 'respawn4': 'face_y', | |
| 'menu4': 'rshoulder'}, | |
| 'last_version': '0.7.0-x', | |
| 'player_names': [], | |
| 'stored_player_names': [], | |
| 'shaders': 1, | |
| 'camera': 'top', | |
| 'login': | |
| {'usr': '', 'pwd': ''}}, | |
| 'development': { | |
| 'multithreaded_render': 1, | |
| 'ai': 0, | |
| 'ai_debug': 0, | |
| 'fps': 0, | |
| 'cars': '', | |
| 'track': '', | |
| 'start_wp': '', | |
| 'shaders_dev': 0, | |
| 'pbr': 0, | |
| 'gamma': 2.2, | |
| 'show_waypoints': 0, | |
| 'show_exit': 1, | |
| 'menu_joypad': 1, | |
| 'win_orig': '', | |
| 'port': 9099, | |
| 'profiling': 0, | |
| 'pyprof_percall': 0, | |
| 'verbose': '', | |
| 'verbose_log': 0, | |
| 'race_start_time': 3.5, | |
| 'countdown_seconds': 3, | |
| 'xmpp_debug': 0, | |
| 'xmpp_server': 'ya2_yorg@jabb3r.org', | |
| 'server': 'ya2tech.it:9099', | |
| 'server_dev': 'ya2tech.it:9098', | |
| 'mp_srv_usr': '', | |
| 'fixed_fps': 0, | |
| 'srgb': 0, | |
| 'opengl_3_2': 0}} | |
| opt_path = '' | |
| if platform in ['win32', 'linux'] and not exists('main.py'): | |
| # it is the deployed version for windows | |
| opt_path = str(Filename.get_user_appdata_directory()) + '/Yorg' | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--win_orig') | |
| parser.add_argument('--user') | |
| parser.add_argument('--pwd') | |
| parser.add_argument('--cars') | |
| parser.add_argument('--server') | |
| parser.add_argument('--optfile') | |
| args = parser.parse_args(EngineLogic.cmd_line()) | |
| optfile = args.optfile if args.optfile else 'options.json' | |
| #old_def = deepcopy(default_opt) | |
| self.options = DctFile( | |
| LibP3d.fixpath(opt_path + '/' + optfile) if opt_path else optfile, | |
| default_opt) | |
| #if self._get_server() == '': | |
| # self.options['development']['server'] = \ | |
| # old_def['development']['server'] | |
| # self.options['development']['server_dev'] = \ | |
| # old_def['development']['server'] | |
| opt_dev = self.options['development'] | |
| win_orig = opt_dev['win_orig'] | |
| if args.win_orig: win_orig = args.win_orig | |
| if args.cars: opt_dev['cars'] = args.cars | |
| if args.server: | |
| opt_dev['server'] = args.server | |
| opt_dev['server_dev'] = args.server | |
| gui_cfg = GuiCfg( | |
| win_title='Yorg', win_orig=win_orig, | |
| win_size=self.options['settings']['resolution'], | |
| fullscreen=self.options['settings']['fullscreen'], | |
| antialiasing=self.options['settings']['antialiasing'], | |
| fps=opt_dev['fps'], shaders=self.options['settings']['shaders'], | |
| volume=self.options['settings']['volume'], | |
| fixed_fps=self.options['development']['fixed_fps']) | |
| profiling_cfg = ProfilingCfg( | |
| profiling=opt_dev['profiling'], | |
| pyprof_percall=opt_dev['pyprof_percall']) | |
| lang_cfg = LangCfg(lang=self.options['settings']['lang'], | |
| lang_domain='yorg', | |
| languages=[('English', 'en'), ('Deutsch', 'de'), | |
| (u'Espa\u00F1ol', 'es'), | |
| (u'Fran\u00E7ais', 'fr'), | |
| (u'G\u00E0idhlig', 'gd'), | |
| ('Galego', 'gl'), ('Italiano', 'it')]) | |
| cursor_cfg = CursorCfg( | |
| cursor_path='assets/images/gui/cursor.txo', | |
| cursor_scale=((256/352.0) * .08, 1, .08), | |
| cursor_hotspot=(.1, .06)) | |
| dev_cfg = DevCfg( | |
| mt_render=opt_dev['multithreaded_render'], | |
| shaders_dev=opt_dev['shaders_dev'], | |
| pbr=opt_dev['pbr'], | |
| gamma=opt_dev['gamma'], | |
| menu_joypad=opt_dev['menu_joypad'], verbose=opt_dev['verbose'], | |
| verbose_log=opt_dev['verbose_log'], | |
| xmpp_server=opt_dev['xmpp_server'], | |
| start_wp=opt_dev['start_wp'], port=opt_dev['port'], | |
| server=opt_dev['server'], | |
| srgb=opt_dev['srgb'], | |
| opengl_3_2=opt_dev['opengl_3_2']) | |
| conf = Cfg(gui_cfg, profiling_cfg, lang_cfg, cursor_cfg, dev_cfg) | |
| keys = self.options['settings']['keys'] | |
| nav1 = NavInfoPerPlayer( | |
| keys['left1'], keys['right1'], keys['forward1'], keys['rear1'], | |
| keys['fire1']) | |
| nav2 = NavInfoPerPlayer( | |
| keys['left2'], keys['right2'], keys['forward2'], keys['rear2'], | |
| keys['fire2']) | |
| nav3 = NavInfoPerPlayer( | |
| keys['left3'], keys['right3'], keys['forward3'], keys['rear3'], | |
| keys['fire3']) | |
| nav4 = NavInfoPerPlayer( | |
| keys['left4'], keys['right4'], keys['forward4'], keys['rear4'], | |
| keys['fire4']) | |
| nav = NavInfo([nav1, nav2, nav3, nav4]) | |
| menu_props = MenuProps( | |
| 'assets/fonts/Hanken-Book.ttf', (.75, .75, .25, 1), | |
| (.75, .75, .75, 1), (.75, .25, .25, 1), .1, | |
| (-4.6, 4.6, -.32, .88), (0, 0, 0, .2), | |
| 'assets/images/gui/menu_background.txo', | |
| 'assets/sfx/menu_over.wav', 'assets/sfx/menu_clicked.ogg', | |
| 'assets/images/icons/%s.txo', nav) | |
| damage_info = DamageInfo('assets/cars/%s/models/cardamage1', | |
| 'assets/cars/%s/models/cardamage2') | |
| Game.__init__(self, conf, YorgClient) | |
| self.fsm = YorgFsm(self) | |
| self.logic = YorgLogic(self) | |
| self.audio = YorgAudio(self) | |
| self.event = YorgEvent(self) | |
| cars_names = self.__compute_cars() | |
| wheel_gfx_names = ['wheelfront', 'wheelrear', 'wheel'] | |
| wheel_gfx_names = [ | |
| self.eng.curr_path + 'assets/cars/%s/models/' + wname | |
| for wname in wheel_gfx_names] | |
| wheel_gfx_names = WheelGfxNames(*wheel_gfx_names) | |
| social_sites = [ | |
| ('facebook', 'https://www.facebook.com/Ya2Tech'), | |
| ('twitter', 'https://twitter.com/ya2tech'), | |
| #('google_plus', 'https://plus.google.com/118211180567488443153'), | |
| ('youtube', | |
| 'https://www.youtube.com/user/ya2games?sub_confirmation=1'), | |
| #('pinterest', 'https://www.pinterest.com/ya2tech'), | |
| #('tumblr', 'https://ya2tech.tumblr.com'), | |
| ('feed', 'https://www.ya2.it/pages/feed_following.html')] | |
| tracks = self.__compute_tracks() | |
| tracks_tr = self.__compute_tracks_tr() | |
| self.gameprops = GameProps( | |
| menu_props, cars_names, self.drivers(), tracks, tracks_tr, | |
| 'assets/tracks/%s/images/menu.txo', | |
| self.options['settings']['player_names'], | |
| self.options['settings']['stored_player_names'], | |
| DriverPaths('assets/images/drivers/driver%s.txo', | |
| 'assets/images/drivers/driver%s_sel.txo'), | |
| 'assets/cars/%s/images/car_sel.txo', | |
| 'assets/cars/%s/images/car.txo', | |
| self.eng.curr_path + 'assets/cars/%s/phys.json', | |
| 'assets/cars/%s/models/car', | |
| damage_info, wheel_gfx_names, opt_dev['xmpp_debug'], | |
| social_sites) | |
| self.log_conf(self.options.dct) | |
| self.eng.lib.set_icon('assets/images/icon/yorg.ico') | |
| def log_conf(self, dct, pref=''): | |
| for key, val in dct.items(): | |
| if isinstance(val, dict): | |
| self.log_conf(val, pref + key + '::') | |
| elif key != 'pwd': | |
| info('option %s%s = %s' % (pref, key, val)) | |
| def __compute_tracks(self): | |
| curr_path = dirname(__file__) + '/' | |
| if __file__.endswith('.py'): curr_path += '../' | |
| if sys.platform == 'darwin': curr_path += '../Resources/' | |
| tracks = [r for r in next(walk(curr_path + 'assets/tracks'))[1] | |
| if r not in ['__pycache__', 'models']] | |
| tracks_i = [] | |
| for track in tracks: | |
| with open(self.eng.curr_path + 'assets/tracks/' + track + | |
| '/track.json') as ftrack: | |
| sorting = load(ftrack)['sorting'] | |
| tracks_i += [(track, sorting)] | |
| tracks_i = sorted(tracks_i, key=lambda elm: elm[1]) | |
| return [track[0] for track in tracks_i] | |
| def __compute_tracks_tr(self): | |
| translated = [] | |
| for track in self.__compute_tracks(): | |
| path.insert(0, self.eng.curr_path + 'assets/tracks/' + track) | |
| mod = __import__('track_tr') | |
| reload(mod) | |
| translated += [mod.translated] | |
| path.pop(0) | |
| return lambda: translated | |
| def __compute_cars(self): | |
| curr_path = dirname(__file__) + '/' | |
| if __file__.endswith('.py'): curr_path += '../' | |
| if sys.platform == 'darwin': curr_path += '../Resources/' | |
| cars = [r for r in next(walk(curr_path + 'assets/cars'))[1]] | |
| cars_i = [] | |
| for car in cars: | |
| with open(self.eng.curr_path + 'assets/cars/' + car + | |
| '/phys.json') as fcar: | |
| sorting = load(fcar)['sorting'] | |
| cars_i += [(car, sorting)] | |
| cars_i = sorted(cars_i, key=lambda elm: elm[1]) | |
| return [car[0] for car in cars_i] | |
| def reset_drivers(self): | |
| self.gameprops.drivers_info = self.drivers() | |
| def kill(self): | |
| self.eng.server.destroy() | |
| self.eng.client.destroy() | |
| @staticmethod | |
| def drivers(): | |
| names = ThanksNames.get_thanks(8, 5) | |
| _drivers = [ | |
| Driver(0, names[0], 4, -2, -2), | |
| Driver(1, names[1], -2, 4, -2), | |
| Driver(2, names[2], 0, 4, -4), | |
| Driver(3, names[3], 4, -4, 0), | |
| Driver(4, names[4], -2, -2, 4), | |
| Driver(5, names[5], -4, 0, 4), | |
| Driver(6, names[6], 4, 0, -4), | |
| Driver(7, names[7], -4, 4, 0)] | |
| return _drivers |