This commit is contained in:
cidoku 2026-02-07 21:12:18 -03:00
parent 968ea04abe
commit 8024b3e806

140
AO2XP.py
View File

@ -25,6 +25,10 @@ app = QtGui.QApplication(sys.argv)
path = sys.argv[0]
demofile = None
# Experimental. No setting for this yet.
tabsEnabled = False
tabAmount = 2
if len(sys.argv) > 1:
demofile = sys.argv[-1]
if not exists(demofile):
@ -40,30 +44,62 @@ if missing:
QtGui.QMessageBox.critical(None, "Unable to launch game", "Couldn't find the file %s on the client folder.\nAO2XP needs this file in order to play sounds and music.\nThe file is included in the client's zip file, make sure it's in the same folder as the AO2XP exe.\n\nAdditional info:\n%s\n%s" % (missing, sys.argv, os.getcwd()))
os._exit(-2)
class gamewindow(QtGui.QMainWindow):
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(gamewindow, self).__init__()
self.stackwidget = QtGui.QStackedWidget(self)
super(MainWindow, self).__init__()
self.widgetStackList = None
self.gameWidgetList = None
self.menuWidgetList = None
self.gameWidget = None
self.mainMenuWidget = None
self.gameWidget = None
self.currentTab = 0
if tabsEnabled:
self.gameTabs = QtGui.QTabWidget(self)
self.gameTabs.currentChanged.connect(self.currentTabChanged)
self.widgetStackList = []
self.gameWidgetList = []
self.menuWidgetList = []
for i in range(tabAmount):
print "[debug] Added instance", i
self.widgetStackList.append(QtGui.QStackedWidget(self))
self.gameWidgetList.append(gameview.GUI(self))
self.menuWidgetList.append(mainmenu.Lobby(self, demofile))
for i, stack in enumerate(self.widgetStackList):
self.gameTabs.addTab(stack, "Game %s" % (i + 1))
stack.addWidget(self.menuWidgetList[i])
stack.addWidget(self.gameWidgetList[i])
self.gameWidgetList[i].setObjectName("AO2XPGameWidget")
stack.setCurrentWidget(self.mainMenuWidget)
self.widgetStack = self.widgetStackList[self.currentTab]
self.mainMenuWidget = self.menuWidgetList[self.currentTab]
self.gameWidget = self.gameWidgetList[self.currentTab]
self.setCentralWidget(self.gameTabs)
self.setFixedSize(self.mainMenuWidget.lobbyimg.size().width(), self.mainMenuWidget.lobbyimg.size().height(), True)
else:
self.mainMenuWidget = mainmenu.Lobby(self, demofile)
self.gameWidget = gameview.GUI(self)
self.gameWidget.setObjectName("AO2XPGameWidget")
self.widgetStack = QtGui.QStackedWidget(self)
self.widgetStack.addWidget(self.mainMenuWidget)
self.widgetStack.addWidget(self.gameWidget)
self.widgetStack.setCurrentWidget(self.mainMenuWidget)
self.setCentralWidget(self.widgetStack)
self.setFixedSize(self.mainMenuWidget.lobbyimg.size().width(), self.mainMenuWidget.lobbyimg.size().height(), True)
self.widget = mainmenu.lobby(self, demofile)
self.gamewidget = gameview.GUI(self)
self.stackwidget.addWidget(self.widget)
self.stackwidget.addWidget(self.gamewidget)
self.setCentralWidget(self.stackwidget)
self.stackwidget.setCurrentWidget(self.widget)
self.setFixedSize(self.widget.lobbyimg.size().width(), self.widget.lobbyimg.size().height())
self.center()
self.setWindowTitle("AO2XP")
self.setWindowIcon(QtGui.QIcon("AO2XP.ico"))
self.setWindowFlags(QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint)
self.settingsgui = options.Settings(self)
self.demopickergui = demo.DemoPicker(self)
self.aboutgui = self.aboutBox()
self.settingsWidget = options.Settings(self)
self.demoPickerWidget = demo.DemoPicker(self)
if demofile:
self.gamewidget.startDemo(demofile)
self.stackwidget.setCurrentWidget(self.gamewidget)
self.gameWidget.startDemo(demofile)
self.widgetStack.setCurrentWidget(self.gameWidget)
def center(self):
frameGm = self.frameGeometry()
@ -71,38 +107,65 @@ class gamewindow(QtGui.QMainWindow):
frameGm.moveCenter(centerPoint)
self.move(frameGm.topLeft())
def showGame(self, tcp, playerList, charList, musicList, background, evidence, areas, features=[], joinOOC=[], hpList=[], webAO_bucket=""):
self.gamewidget.disconnectNow = False
self.gamewidget.startGame(tcp, playerList, charList, musicList, background, evidence, areas, features, joinOOC, hpList, webAO_bucket)
self.stackwidget.setCurrentWidget(self.gamewidget)
def showGame(self, gameData):
self.gameWidget.disconnectNow = False
self.gameWidget.startGame(*gameData)
self.widgetStack.setCurrentWidget(self.gameWidget)
def returnToMenu(self):
self.gamewidget.disconnectNow = True
self.setFixedSize(self.widget.lobbyimg.size().width(), self.widget.lobbyimg.size().height())
self.widget.onClicked_cancelconnect()
self.stackwidget.setCurrentWidget(self.widget)
self.gameWidget.disconnectNow = True
self.setFixedSize(self.mainMenuWidget.lobbyimg.size().width(), self.mainMenuWidget.lobbyimg.size().height())
self.mainMenuWidget.onClickedCancelconnect()
self.widgetStack.setCurrentWidget(self.mainMenuWidget)
self.setWindowTitle("AO2XP")
self.center()
def showSettings(self):
self.settingsgui.showSettings()
self.settingsWidget.showSettings()
def show_demo_picker(self):
self.demopickergui.show()
def showDemoPicker(self):
self.demoPickerWidget.show()
def aboutBox(self):
def showAboutBox(self):
box = QtGui.QMessageBox()
box.setText("AO2XP %s\nRunning on %s %s %s (Python %s)\n\n2019-2025 headshot / cidoku" % (GAME_VERSION, platform.system(), platform.release(), platform.machine(), platform.python_version()))
box.setText("AO2XP %s\nRunning on %s %s %s (Python %s)\n\n2019-%s headshot / cidoku" % (GAME_VERSION, platform.system(), platform.release(), platform.machine(), platform.python_version(), YEAR))
box.setWindowTitle("About AO2XP")
box.setStandardButtons(QtGui.QMessageBox.Close)
box.setWindowIcon(QtGui.QIcon("AO2XP.ico"))
box.setIconPixmap(QtGui.QPixmap(AO2XPpath + "icons/about.png"))
box.button(QtGui.QMessageBox.Close).setText('Take that!')
return box
box.exec_()
def currentTabChanged(self):
self.currentTab = self.gameTabs.currentIndex()
self.widgetStack = self.widgetStackList[self.currentTab]
self.mainMenuWidget = self.menuWidgetList[self.currentTab]
self.gameWidget = self.gameWidgetList[self.currentTab]
def setFixedSize(self, w, h, initial = False):
if tabsEnabled:
if initial:
super(MainWindow, self).setFixedSize(w + 4, h + self.gameTabs.tabBar().height())
return
tabH = self.gameTabs.tabBar().height()
oldW = self.width() - 4
oldH = self.height() - tabH
super(MainWindow, self).setFixedSize(max(w, oldW) + 4, max(h, oldH) + tabH)
else:
super(MainWindow, self).setFixedSize(w, h)
def aboutToQuit(self):
if tabsEnabled:
for widget in self.gameWidgetList:
widget.exitCommon()
else:
self.gameWidget.exitCommon()
# Vanilla downloader
force_downloader = len(sys.argv) > 1 and sys.argv[1] == "download"
if force_downloader or (not exists("base/background") and not exists("base/characters") and not exists("base/sounds") and not exists("base/evidence")):
forceDownloader = len(sys.argv) > 1 and sys.argv[1] == "download"
if forceDownloader or (not exists(BASE_PATH + "background") and not exists(BASE_PATH + "characters") and not exists(BASE_PATH + "sounds") and not exists(BASE_PATH + "evidence")):
jm = QtGui.QMessageBox.information(None, "Warning", "You seem to be missing the included Attorney Online content.\nWould you like to download them automatically?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
if jm == QtGui.QMessageBox.Yes:
import basedownloader
@ -112,16 +175,15 @@ if force_downloader or (not exists("base/background") and not exists("base/chara
os._exit(-3)
# AO2XP update checker
can_update = ini.read_ini_bool("AO2XP.ini", "General", "install updates", False) # Automatic updates are opt-in!
force_update = "forceupdate" in sys.argv[1:]
if can_update or force_update:
# Automatic updates are opt-in!
canUpdate = ini.read_ini_bool("AO2XP.ini", "General", "install updates", False)
forceUpdate = "forceupdate" in sys.argv[1:]
if canUpdate or forceUpdate:
import updater
code = updater.checkForUpdates(force_update)
code = updater.checkForUpdates(forceUpdate)
if code == 0:
subprocess.Popen(["./AO2XPupdat"])
os._exit(0)
elif osname == "Darwin": # bundle
os.chdir(path.resourcePath()) # return to Resources folder
# This hides stupid useless QT warnings
def handler(msg_type, msg_string):
@ -129,9 +191,9 @@ def handler(msg_type, msg_string):
QtCore.qInstallMsgHandler(handler)
audio.init()
game = gamewindow()
game = MainWindow()
game.show()
app.aboutToQuit.connect(game.gamewidget.exitCommon)
app.aboutToQuit.connect(game.aboutToQuit)
returnc = app.exec_()
audio.free()
sys.exit(returnc)