class DisplayOptions: notify = DirectNotifyGlobal.directNotify.newCategory('DisplayOptions') def __init__(self): self.restore_failed = False self.settings = Settings() self.loadFromSettings() def loadFromSettings(self): mode = self.settings.getBool('game', 'fullscreen-mode') music = self.settings.getBool('game', 'music', True) sfx = self.settings.getBool('game', 'sfx', True) toonChatSounds = self.settings.getBool('game', 'toon-chat-sounds', True) musicVol = self.settings.getInt('game', 'music-vol', 100) / 100.0 sfxVol = self.settings.getInt('game', 'sfx-vol', 100) / 100.0 res = self.settings.getList('game', 'resolution', default=[800, 600], expectedLength=2) embed = self.settings.getBool('game', 'embed', False) antialias = self.settings.getInt('game', 'antialiasing', 0) if antialias: loadPrcFileData('toonBase Settings Framebuffer MSAA', 'framebuffer-multisample 1') loadPrcFileData('toonBase Settings MSAA Level', 'multisamples %i' % antialias) else: self.settings.updateSetting('game', 'antialiasing', antialias) loadPrcFileData('toonBase Settings Framebuffer MSAA', 'framebuffer-multisample 0') self.notify.debug('before prc settings embedded mode=%s' % str(embed)) self.notify.debug('before prc settings full screen mode=%s' % str(mode)) loadPrcFileData('toonBase Settings Window Res', 'win-size %s %s' % (res[0], res[1])) self.notify.debug('settings resolution = %s' % str(res)) loadPrcFileData('toonBase Settings Window FullScreen', 'fullscreen %s' % mode) self.notify.debug('settings full screen mode=%s' % str(mode)) loadPrcFileData('toonBase Settings Music Active', 'audio-music-active %s' % music) loadPrcFileData('toonBase Settings Sound Active', 'audio-sfx-active %s' % sfx) loadPrcFileData('toonBase Settings Music Volume', 'audio-master-music-volume %s' % musicVol) loadPrcFileData('toonBase Settings Sfx Volume', 'audio-master-sfx-volume %s' % sfxVol) loadPrcFileData('toonBase Settings Toon Chat Sounds', 'toon-chat-sounds %s' % toonChatSounds) self.settingsFullScreen = mode self.settingsWidth = res[0] self.settingsHeight = res[1] self.settingsEmbedded = embed self.antialias = antialias self.notify.debug('settings embedded mode=%s' % str(self.settingsEmbedded)) self.notify.info('settingsFullScreen = %s, embedded = %s width=%d height=%d' % (self.settingsFullScreen, self.settingsEmbedded, self.settingsWidth, self.settingsHeight)) return def restrictToEmbedded(self, restrict, change_display = True): if base.appRunner is None or base.appRunner.windowProperties is None: restrict = 0 self.restrict_to_embedded = choice(restrict, 1, 0) self.notify.debug('restrict_to_embedded: %s' % self.restrict_to_embedded) if change_display: self.set(base.pipe, self.settingsWidth, self.settingsHeight, self.settingsFullScreen, self.settingsEmbedded) return def set(self, pipe, width, height, fullscreen, embedded): self.notify.debugStateCall(self) state = False self.notify.info('SET') if self.restrict_to_embedded: fullscreen = 0 embedded = 1 if embedded: if base.appRunner.windowProperties: width = base.appRunner.windowProperties.getXSize() height = base.appRunner.windowProperties.getYSize() self.current_pipe = base.pipe self.current_properties = WindowProperties(base.win.getProperties()) properties = self.current_properties self.notify.debug('DISPLAY PREVIOUS:') self.notify.debug(' EMBEDDED: %s' % bool(properties.getParentWindow())) self.notify.debug(' FULLSCREEN: %s' % bool(properties.getFullscreen())) self.notify.debug(' X SIZE: %s' % properties.getXSize()) self.notify.debug(' Y SIZE: %s' % properties.getYSize()) self.notify.debug('DISPLAY REQUESTED:') self.notify.debug(' EMBEDDED: %s' % bool(embedded)) self.notify.debug(' FULLSCREEN: %s' % bool(fullscreen)) self.notify.debug(' X SIZE: %s' % width) self.notify.debug(' Y SIZE: %s' % height) if self.current_pipe == pipe and bool(self.current_properties.getParentWindow()) == bool(embedded) and self.current_properties.getFullscreen() == fullscreen and self.current_properties.getXSize() == width and self.current_properties.getYSize() == height: self.notify.info('DISPLAY NO CHANGE REQUIRED') state = True else: properties = WindowProperties() properties.setSize(width, height) properties.setFullscreen(fullscreen) properties.setParentWindow(0) if embedded: if base.appRunner.windowProperties: properties = base.appRunner.windowProperties original_sort = base.win.getSort() if self.resetWindowProperties(pipe, properties): self.notify.debug('DISPLAY CHANGE SET') properties = base.win.getProperties() self.notify.debug('DISPLAY ACHIEVED:') self.notify.debug(' EMBEDDED: %s' % bool(properties.getParentWindow())) self.notify.debug(' FULLSCREEN: %s' % bool(properties.getFullscreen())) self.notify.debug(' X SIZE: %s' % properties.getXSize()) self.notify.debug(' Y SIZE: %s' % properties.getYSize()) if bool(properties.getParentWindow()) == bool(embedded) and properties.getFullscreen() == fullscreen and properties.getXSize() == width and properties.getYSize() == height: self.notify.info('DISPLAY CHANGE VERIFIED') state = True else: self.notify.warning('DISPLAY CHANGE FAILED, RESTORING PREVIOUS DISPLAY') self.restoreWindowProperties() else: self.notify.warning('DISPLAY CHANGE FAILED') self.notify.warning('DISPLAY SET - BEFORE RESTORE') self.restoreWindowProperties() self.notify.warning('DISPLAY SET - AFTER RESTORE') base.win.setSort(original_sort) base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() return state def resetWindowProperties(self, pipe, properties): if base.win: currentProperties = WindowProperties(base.win.getProperties()) gsg = base.win.getGsg() else: currentProperties = WindowProperties.getDefault() gsg = None newProperties = WindowProperties(currentProperties) newProperties.addProperties(properties) if base.pipe != pipe: gsg = None if gsg == None or currentProperties.getFullscreen() != newProperties.getFullscreen() or currentProperties.getParentWindow() != newProperties.getParentWindow(): self.notify.debug('window properties: %s' % properties) self.notify.debug('gsg: %s' % gsg) base.pipe = pipe if not base.openMainWindow(props=properties, gsg=gsg, keepCamera=True): self.notify.warning('OPEN MAIN WINDOW FAILED') return 0 self.notify.info('OPEN MAIN WINDOW PASSED') base.graphicsEngine.openWindows() if base.win.isClosed(): self.notify.warning('Window did not open, removing.') base.closeWindow(base.win) return 0 base.disableShowbaseMouse() if 'libotp' in sys.modules: from libotp import NametagGlobals NametagGlobals.setCamera(base.cam) NametagGlobals.setMouseWatcher(base.mouseWatcherNode) else: self.notify.debug('Adjusting properties') base.win.requestProperties(properties) base.graphicsEngine.renderFrame() return 1 def restoreWindowProperties(self): if self.resetWindowProperties(self.current_pipe, self.current_properties): self.restore_failed = False else: self.notify.warning("Couldn't restore original display settings!") if base.appRunner and base.appRunner.windowProperties: fullscreen = 0 embedded = 1 tryProps = base.appRunner.windowProperties if self.resetWindowProperties(self.current_pipe, tryProps): self.current_properties = copy.copy(tryProps) self.restore_failed = False return if self.current_properties.getFullscreen(): fullscreen = 0 embedded = 0 tryProps = self.current_properties tryProps.setFullscreen(0) if self.resetWindowProperties(self.current_pipe, tryProps): self.current_properties = copy.copy(tryProps) self.restore_failed = False return self.notify.error('Failed opening regular window!') base.panda3dRenderError() self.restore_failed = True @staticmethod def isDefaultEmbedded(): result = False try: embedOption = int(base.launcher.getValue('GAME_DEFAULT_TO_EMBEDDED', None)) if embedOption != None: result = bool(int(embedOption)) except: pass return result @staticmethod def isEmbeddedPossible(): result = False try: showOption = base.launcher.getValue('GAME_SHOW_EMBEDDED_OPTION', None) if showOption != None: result = bool(int(showOption)) except: pass return result @staticmethod def isWindowedPossible(): result = True try: showOption = base.launcher.getValue('GAME_SHOW_WINDOWED_OPTION', None) if showOption != None: result = bool(int(showOption)) except: pass return result
class DisplayOptions: notify = DirectNotifyGlobal.directNotify.newCategory('DisplayOptions') def __init__(self): self.restore_failed = False self.settings = Settings() self.loadFromSettings() def loadFromSettings(self): mode = self.settings.getBool('game', 'fullscreen-mode') music = self.settings.getBool('game', 'music', True) sfx = self.settings.getBool('game', 'sfx', True) toonChatSounds = self.settings.getBool('game', 'toon-chat-sounds', True) musicVol = self.settings.getInt('game', 'music-vol', 100) / 100.0 sfxVol = self.settings.getInt('game', 'sfx-vol', 100) / 100.0 res = self.settings.getList('game', 'resolution', default=[800, 600], expectedLength=2) embed = self.settings.getBool('game', 'embed', False) antialias = self.settings.getInt('game', 'antialiasing', 0) if antialias: loadPrcFileData('toonBase Settings Framebuffer MSAA', 'framebuffer-multisample 1') loadPrcFileData('toonBase Settings MSAA Level', 'multisamples %i' % antialias) else: self.settings.updateSetting('game', 'antialiasing', antialias) loadPrcFileData('toonBase Settings Framebuffer MSAA', 'framebuffer-multisample 0') self.notify.debug('before prc settings embedded mode=%s' % str(embed)) self.notify.debug('before prc settings full screen mode=%s' % str(mode)) loadPrcFileData('toonBase Settings Window Res', 'win-size %s %s' % (res[0], res[1])) self.notify.debug('settings resolution = %s' % str(res)) loadPrcFileData('toonBase Settings Window FullScreen', 'fullscreen %s' % mode) self.notify.debug('settings full screen mode=%s' % str(mode)) loadPrcFileData('toonBase Settings Music Active', 'audio-music-active %s' % music) loadPrcFileData('toonBase Settings Sound Active', 'audio-sfx-active %s' % sfx) loadPrcFileData('toonBase Settings Music Volume', 'audio-master-music-volume %s' % musicVol) loadPrcFileData('toonBase Settings Sfx Volume', 'audio-master-sfx-volume %s' % sfxVol) loadPrcFileData('toonBase Settings Toon Chat Sounds', 'toon-chat-sounds %s' % toonChatSounds) self.settingsFullScreen = mode self.settingsWidth = res[0] self.settingsHeight = res[1] self.settingsEmbedded = embed self.antialias = antialias self.notify.debug('settings embedded mode=%s' % str(self.settingsEmbedded)) self.notify.info('settingsFullScreen = %s, embedded = %s width=%d height=%d' % (self.settingsFullScreen, self.settingsEmbedded, self.settingsWidth, self.settingsHeight)) return def restrictToEmbedded(self, restrict, change_display = True): if base.appRunner is None or base.appRunner.windowProperties is None: restrict = 0 self.restrict_to_embedded = choice(restrict, 1, 0) self.notify.debug('restrict_to_embedded: %s' % self.restrict_to_embedded) if change_display: self.set(base.pipe, self.settingsWidth, self.settingsHeight, self.settingsFullScreen, self.settingsEmbedded) return def set(self, pipe, width, height, fullscreen, embedded): self.notify.debugStateCall(self) state = False self.notify.info('SET') if self.restrict_to_embedded: fullscreen = 0 embedded = 1 if embedded: if base.appRunner.windowProperties: width = base.appRunner.windowProperties.getXSize() height = base.appRunner.windowProperties.getYSize() self.current_pipe = base.pipe self.current_properties = WindowProperties(base.win.getProperties()) properties = self.current_properties self.notify.debug('DISPLAY PREVIOUS:') self.notify.debug(' EMBEDDED: %s' % bool(properties.getParentWindow())) self.notify.debug(' FULLSCREEN: %s' % bool(properties.getFullscreen())) self.notify.debug(' X SIZE: %s' % properties.getXSize()) self.notify.debug(' Y SIZE: %s' % properties.getYSize()) self.notify.debug('DISPLAY REQUESTED:') self.notify.debug(' EMBEDDED: %s' % bool(embedded)) self.notify.debug(' FULLSCREEN: %s' % bool(fullscreen)) self.notify.debug(' X SIZE: %s' % width) self.notify.debug(' Y SIZE: %s' % height) if self.current_pipe == pipe and bool(self.current_properties.getParentWindow()) == bool(embedded) and self.current_properties.getFullscreen() == fullscreen and self.current_properties.getXSize() == width and self.current_properties.getYSize() == height: self.notify.info('DISPLAY NO CHANGE REQUIRED') state = True else: properties = WindowProperties() properties.setSize(width, height) properties.setFullscreen(fullscreen) properties.setParentWindow(0) if embedded: if base.appRunner.windowProperties: properties = base.appRunner.windowProperties original_sort = base.win.getSort() if self.resetWindowProperties(pipe, properties): self.notify.debug('DISPLAY CHANGE SET') properties = base.win.getProperties() self.notify.debug('DISPLAY ACHIEVED:') self.notify.debug(' EMBEDDED: %s' % bool(properties.getParentWindow())) self.notify.debug(' FULLSCREEN: %s' % bool(properties.getFullscreen())) self.notify.debug(' X SIZE: %s' % properties.getXSize()) self.notify.debug(' Y SIZE: %s' % properties.getYSize()) if bool(properties.getParentWindow()) == bool(embedded) and properties.getFullscreen() == fullscreen and properties.getXSize() == width and properties.getYSize() == height: self.notify.info('DISPLAY CHANGE VERIFIED') state = True else: self.notify.warning('DISPLAY CHANGE FAILED, RESTORING PREVIOUS DISPLAY') self.restoreWindowProperties() else: self.notify.warning('DISPLAY CHANGE FAILED') self.notify.warning('DISPLAY SET - BEFORE RESTORE') self.restoreWindowProperties() self.notify.warning('DISPLAY SET - AFTER RESTORE') base.win.setSort(original_sort) base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() return state def resetWindowProperties(self, pipe, properties): if base.win: currentProperties = WindowProperties(base.win.getProperties()) gsg = base.win.getGsg() else: currentProperties = WindowProperties.getDefault() gsg = None newProperties = WindowProperties(currentProperties) newProperties.addProperties(properties) if base.pipe != pipe: gsg = None if gsg == None or currentProperties.getFullscreen() != newProperties.getFullscreen() or currentProperties.getParentWindow() != newProperties.getParentWindow(): self.notify.debug('window properties: %s' % properties) self.notify.debug('gsg: %s' % gsg) base.pipe = pipe if not base.openMainWindow(props=properties, gsg=gsg, keepCamera=True): self.notify.warning('OPEN MAIN WINDOW FAILED') return 0 self.notify.info('OPEN MAIN WINDOW PASSED') base.graphicsEngine.openWindows() if base.win.isClosed(): self.notify.warning('Window did not open, removing.') base.closeWindow(base.win) return 0 base.disableShowbaseMouse() if 'libotp' in sys.modules: from libotp import NametagGlobals NametagGlobals.setCamera(base.cam) NametagGlobals.setMouseWatcher(base.mouseWatcherNode) else: self.notify.debug('Adjusting properties') base.win.requestProperties(properties) base.graphicsEngine.renderFrame() return 1 def restoreWindowProperties(self): if self.resetWindowProperties(self.current_pipe, self.current_properties): self.restore_failed = False else: self.notify.warning("Couldn't restore original display settings!") if base.appRunner and base.appRunner.windowProperties: fullscreen = 0 embedded = 1 tryProps = base.appRunner.windowProperties if self.resetWindowProperties(self.current_pipe, tryProps): self.current_properties = copy.copy(tryProps) self.restore_failed = False return if self.current_properties.getFullscreen(): fullscreen = 0 embedded = 0 tryProps = self.current_properties tryProps.setFullscreen(0) if self.resetWindowProperties(self.current_pipe, tryProps): self.current_properties = copy.copy(tryProps) self.restore_failed = False return self.notify.error('Failed opening regular window!') base.panda3dRenderError() self.restore_failed = True @staticmethod def isDefaultEmbedded(): result = False try: embedOption = int(base.launcher.getValue('GAME_DEFAULT_TO_EMBEDDED', None)) if embedOption != None: result = bool(int(embedOption)) except: pass return result @staticmethod def isEmbeddedPossible(): result = False try: showOption = base.launcher.getValue('GAME_SHOW_EMBEDDED_OPTION', None) if showOption != None: result = bool(int(showOption)) except: pass return result @staticmethod def isWindowedPossible(): result = True try: showOption = base.launcher.getValue('GAME_SHOW_WINDOWED_OPTION', None) if showOption != None: result = bool(int(showOption)) except: pass return result
class GameSettings: notify = DirectNotifyGlobal.directNotify.newCategory('GameSettings') notify.setInfo(True) def __init__(self): self.settings = Settings() def loadFromSettings(self): self.notify.info('Loading settings...') electionEvent = self.settings.getBool('game', 'elections', False) loadPrcFileData('toonBase Settings Election Active', 'want-doomsday %s' % electionEvent) loadPrcFileData('toonBase Elections Event Manager', 'want-event-manager %s' % electionEvent) self.settings.updateSetting('game', 'elections', electionEvent) self.electionEvent = electionEvent retroMode = self.settings.getBool('game', 'retro', False) loadPrcFileData('toonBase Settings Retro Mode', 'want-retro-mode %s' % retroMode) loadPrcFileData('toonBase Settings TTO Map Hover', 'want-map-hover %s' % retroMode) loadPrcFileData('toonBase Settings Retro Make-A-Toon', 'want-retro-makeatoon %s' % retroMode) loadPrcFileData('toonBase Settings TTO Cog Question', 'want-old-question %s' % retroMode) self.settings.updateSetting('game', 'retro', retroMode) self.retroMode = retroMode miniServer = self.settings.getBool('game', 'mini-server', False) loadPrcFileData('toonBase Settings Mini-Servers', 'want-mini-server %s' % miniServer) self.settings.updateSetting('game', 'mini-server', miniServer) self.miniServer = miniServer aspect = self.settings.getBool('game', 'stretched-screen', False) loadPrcFileData('toonBase Settings Aspect Ratio', 'aspect-ratio 1.33' if aspect else '0') self.settings.updateSetting('game', 'stretched-screen', aspect) self.aspect = aspect randomInvasions = self.settings.getBool('game', 'random-invasions', True) loadPrcFileData('toonBase Settings Random Invasions', 'want-random-invasions %s' % randomInvasions) self.settings.updateSetting('game', 'random-invasions', randomInvasions) self.randomInvasions = randomInvasions software = self.settings.getBool('game', 'software-render', False) loadPrcFileData('toonBase Settings Software Rendering', 'framebuffer-hardware %s' % (not software)) loadPrcFileData('toonBase Settings Software Rendering', 'framebuffer-software %s' % software) self.settings.updateSetting('game', 'software-render', software) self.software = software lerp = self.settings.getBool('game', 'interpolate-animations', True) loadPrcFileData('toonBase Settings Interpolated Animations', 'interpolate-animations %s' % lerp) self.settings.updateSetting('game', 'interpolate-animations', lerp) self.lerp = lerp classicCharacters = self.settings.getBool('game', 'classic-characters', True) loadPrcFileData('toonBase Settings Classic Characters', 'want-classic-chars %s' % classicCharacters) self.settings.updateSetting('game', 'classic-characters', classicCharacters) self.classicCharacters = classicCharacters stickyScroll = self.settings.getBool( 'game', 'camera-scroll-select-always-active', False) loadPrcFileData('toonBase Settings Sticky Scroll Camera Selection', 'want-sticky-scroll %s' % stickyScroll) self.settings.updateSetting('game', 'camera-scroll-select-always-active', stickyScroll) self.stickyScroll = stickyScroll spawnProps = self.settings.getBool('game', 'view-props', False) loadPrcFileData('toonBase Settings View Props', 'want-spawn-prop %s' % spawnProps) self.settings.updateSetting('game', 'view-props', spawnProps) self.spawnProps = spawnProps maxLOD = self.settings.getBool('game', 'always-max-lod', False) loadPrcFileData('toonBase Always Max LOD', 'always-max-lod %s' % maxLOD) self.settings.updateSetting('game', 'always-max-lod', maxLOD) self.maxLOD = maxLOD randPic = self.settings.getBool('game', 'random-loading-images', True) loadPrcFileData('toonBase Random Loader Images', 'want-random-pics %s' % randPic) self.settings.updateSetting('game', 'random-loading-images', randPic) self.randPic = randPic localServerAutoStartDefaultValue = True localServerAutoStart = self.settings.getBool( 'game', 'auto-start-local-server', localServerAutoStartDefaultValue) loadPrcFileData('toonBase Auto Start Local Server', 'auto-start-local-server %s' % localServerAutoStart) self.settings.updateSetting('game', 'auto-start-local-server', localServerAutoStart) self.localServerAutoStart = localServerAutoStart trueFriends = self.settings.getBool('game', 'true-friends', True) loadPrcFileData('toonBase True Friends', 'parent-password-set %s' % trueFriends) loadPrcFileData('toonBase True Friends', 'allow-secret-chat %s' % trueFriends) self.settings.updateSetting('game', 'true-friends', trueFriends) self.trueFriends = trueFriends whitelist = self.settings.getBool('game', 'whitelist', False) loadPrcFileData('toonBase Whitelist', 'want-whitelist %s' % whitelist) self.settings.updateSetting('game', 'whitelist', whitelist) self.whitelist = whitelist blacklist = self.settings.getBool('game', 'blacklist', False) loadPrcFileData('toonBase Blacklist', 'want-blacklist %s' % blacklist) self.settings.updateSetting('game', 'blacklist', blacklist) self.blacklist = blacklist sequenceBlacklist = self.settings.getBool('game', 'sequence-blacklist', False) loadPrcFileData('toonBase Sequence Blacklist', 'want-blacklist-sequence %s' % sequenceBlacklist) self.settings.updateSetting('game', 'sequence-blacklist', sequenceBlacklist) self.sequenceBlacklist = sequenceBlacklist toonfest = self.settings.getBool('game', 'toonfest-day-night', False) loadPrcFileData('toonBase ToonFest Day Night Cycle', 'toonfest-day-night %s' % toonfest) self.settings.updateSetting('game', 'toonfest-day-night', toonfest) self.toonfest = toonfest customMusic = self.settings.getBool('game', 'custom-battle-music', False) loadPrcFileData('toonBase Sequence Blacklist', 'custom-battle-music %s' % customMusic) self.settings.updateSetting('game', 'custom-battle-music', customMusic) self.customMusic = customMusic cogFoot = self.settings.getBool('game', 'cog-footsteps', True) loadPrcFileData('toonBase Cog Foot', 'cog-footsteps %s' % cogFoot) self.settings.updateSetting('game', 'cog-footsteps', cogFoot) self.cogFoot = cogFoot self.notify.info('Loaded.')