From 411260fbd0070b6ec86be39d237019f54ea438a0 Mon Sep 17 00:00:00 2001 From: cidoku Date: Tue, 11 Feb 2025 14:08:54 -0300 Subject: [PATCH] 2x display, ability to connect to modern servers, some bug fixes --- AO2XPbase/ao2xp_themes/default/theme.py | 14 +- AO2XPbase/font/Ace_Name_Regular.ttf | Bin 0 -> 49972 bytes AO2XPbase/font/Igiari.ttf | Bin 0 -> 432736 bytes AO2XPbase/font/license.txt | 8 + AO2XPbase/font/readme.txt | 31 + .../themes/AceAttorney2x/Ace_Name_Regular.ttf | Bin 0 -> 49972 bytes AO2XPbase/themes/AceAttorney2x/chat.png | Bin 0 -> 345 bytes AO2XPbase/themes/AceAttorney2x/chat_arrow.gif | Bin 0 -> 412 bytes .../themes/AceAttorney2x/chat_arrow.webp | Bin 0 -> 332 bytes AO2XPbase/themes/AceAttorney2x/chatbig.png | Bin 0 -> 345 bytes AO2XPbase/themes/AceAttorney2x/chatblank.png | Bin 0 -> 218 bytes AO2XPbase/themes/AceAttorney2x/chatmed.png | Bin 0 -> 346 bytes .../AceAttorney2x/courtroom_stylesheets.css | 86 + .../AceAttorney2x/courtroombackground.png | Bin 0 -> 4625 bytes .../AceAttorney2x/evidence_background.png | Bin 0 -> 14828 bytes .../evidence_background_private.png | Bin 0 -> 19161 bytes .../themes/AceAttorney2x/evidence_overlay.png | Bin 0 -> 397 bytes .../evidence_overlay_private.png | Bin 0 -> 397 bytes .../themes/AceAttorney2x/igiari-cyrillic.ttf | Bin 0 -> 182156 bytes .../themes/AceAttorney2x/music_display.png | Bin 0 -> 142 bytes audio.py | 5 +- bass_test.py | 24 + build.bat | 7 +- game_version.py | 2 +- gameview.py | 153 +- gameview_scaled.py | 2882 +++++++++++++++++ mainmenu.py | 2 +- quicksetup.py | 1 + 28 files changed, 3144 insertions(+), 71 deletions(-) create mode 100644 AO2XPbase/font/Ace_Name_Regular.ttf create mode 100644 AO2XPbase/font/Igiari.ttf create mode 100644 AO2XPbase/font/license.txt create mode 100644 AO2XPbase/font/readme.txt create mode 100644 AO2XPbase/themes/AceAttorney2x/Ace_Name_Regular.ttf create mode 100644 AO2XPbase/themes/AceAttorney2x/chat.png create mode 100644 AO2XPbase/themes/AceAttorney2x/chat_arrow.gif create mode 100644 AO2XPbase/themes/AceAttorney2x/chat_arrow.webp create mode 100644 AO2XPbase/themes/AceAttorney2x/chatbig.png create mode 100644 AO2XPbase/themes/AceAttorney2x/chatblank.png create mode 100644 AO2XPbase/themes/AceAttorney2x/chatmed.png create mode 100644 AO2XPbase/themes/AceAttorney2x/courtroom_stylesheets.css create mode 100644 AO2XPbase/themes/AceAttorney2x/courtroombackground.png create mode 100644 AO2XPbase/themes/AceAttorney2x/evidence_background.png create mode 100644 AO2XPbase/themes/AceAttorney2x/evidence_background_private.png create mode 100644 AO2XPbase/themes/AceAttorney2x/evidence_overlay.png create mode 100644 AO2XPbase/themes/AceAttorney2x/evidence_overlay_private.png create mode 100644 AO2XPbase/themes/AceAttorney2x/igiari-cyrillic.ttf create mode 100644 AO2XPbase/themes/AceAttorney2x/music_display.png create mode 100644 bass_test.py create mode 100644 gameview_scaled.py diff --git a/AO2XPbase/ao2xp_themes/default/theme.py b/AO2XPbase/ao2xp_themes/default/theme.py index d7fa037..775f8dd 100644 --- a/AO2XPbase/ao2xp_themes/default/theme.py +++ b/AO2XPbase/ao2xp_themes/default/theme.py @@ -1,14 +1,14 @@ -self.gamewindow.setFixedSize(714, 668) +self.gamewindow.setFixedSize(820, 730) -self.ooclog.setGeometry(714 - 288, 0, 288, 256) +self.ooclog.setGeometry(814 - 288, 0, 288, 248) self.oocnameinput.resize(self.oocnameinput.sizeHint().width() - 32, self.oocnameinput.sizeHint().height()) -self.oocnameinput.move(714 - 288, 256) +self.oocnameinput.move(814 - 288, 248) self.oocinput.resize(176, self.oocinput.sizeHint().height()) -self.oocinput.move(714 - 288 + self.oocnameinput.size().width(), 256) +self.oocinput.move(814 - 288 + self.oocnameinput.size().width(), 248) self.ooclogin.resize(48, 20) -self.ooclogin.move(714 - (self.ooclogin.size().width()), self.oocinput.y() + self.ooclogin.size().height()) +self.ooclogin.move(814 - (self.ooclogin.size().width()), self.oocinput.y() + self.ooclogin.size().height()) -self.musicitems.setGeometry(714 - 288, 348, 288, 320) +self.musicitems.setGeometry(814 - 288, 468, 288, 256) self.icLog.setGeometry(8, 8, 714 - 304 - 22, 212) @@ -53,7 +53,7 @@ self.pair_order.setGeometry(self.pairoffset.x(), self.pair_order_l.y()-4, 80, se self.spacebartext.move(self.mocktext.x(), self.mocktext.y()+24) self.autocaps.move(self.spacebartext.x(), self.spacebartext.y()+24) -self.gametabs.move(8, 402) +self.gametabs.move(8, 468) self.gametabs.resize(714 - 304, 256) self.musicslider.setGeometry(self.oocnameinput.x(), self.oocnameinput.y()+24, 192, 16) diff --git a/AO2XPbase/font/Ace_Name_Regular.ttf b/AO2XPbase/font/Ace_Name_Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d5c6e88fbc4ab6342e93a53bdee38d11ac93cc47 GIT binary patch literal 49972 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 CCIKM; literal 0 HcmV?d00001 diff --git a/AO2XPbase/font/Igiari.ttf b/AO2XPbase/font/Igiari.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9b7be36a5dabc7f944f418c14bfe6b01a1479262 GIT binary patch literal 432736 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 z%0A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 literal 0 HcmV?d00001 diff --git a/AO2XPbase/font/license.txt b/AO2XPbase/font/license.txt new file mode 100644 index 0000000..a13fa44 --- /dev/null +++ b/AO2XPbase/font/license.txt @@ -0,0 +1,8 @@ +License for Igiari font + +This font was created by Caveras with FontStruct and is licensed +under a Creative Commons Attribution Non-commercial Share Alike +license. + +http://fontstruct.com/fontstructors/caveras +http://creativecommons.org/licenses/by-nc-sa/3.0/ \ No newline at end of file diff --git a/AO2XPbase/font/readme.txt b/AO2XPbase/font/readme.txt new file mode 100644 index 0000000..63030c5 --- /dev/null +++ b/AO2XPbase/font/readme.txt @@ -0,0 +1,31 @@ +Igiari by Caveras - based on the original main text pixel font used in +the Ace Attorney video game series for Game Boy Advance and Nintendo DS +(Capcom, 2001-2011). + +The font file in this archive was created by Caveras using FontStruct - +the free, online font-building tool. This font has a homepage where this +archive and other versions may be found: +http://fontstruct.com/fontstructors/caveras + +It is also distributed over Caveras' website: http://www.caveras.net + +Try FontStruct at http://fontstruct.com - It’s easy and it’s fun. + +NOTE FOR FLASH USERS: FontStruct fonts (FontStructions) are optimized for +Flash. The font in this archive is a pixel font and best displayed at a +font-size of 8 and multiples of this number. + +FontStruct is sponsored by FontShop. Visit them at http://fontshop.com. +FontShop is the original independent font retailer. We’ve been around since +the dawn of digital type. Whether you need the right font or need to create +the right font from scratch, let our 23 years of experience work for you. + +FontStruct is copyright © 2013-2014 Rob Meek + +LEGAL NOTICE: +In using this font you must comply with the licensing terms described in the +file “license.txt” included with this archive. If you redistribute the font +file in this archive, it must be accompanied by all the other files from this +archive, including this one. + +Copyright © 2014 Caveras / Cliff Modes. \ No newline at end of file diff --git a/AO2XPbase/themes/AceAttorney2x/Ace_Name_Regular.ttf b/AO2XPbase/themes/AceAttorney2x/Ace_Name_Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d5c6e88fbc4ab6342e93a53bdee38d11ac93cc47 GIT binary patch literal 49972 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 CCIKM; literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/chat.png b/AO2XPbase/themes/AceAttorney2x/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..b5aea1eaff125e184603577dd9a30fbf53ec7cfb GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83X0R{=$%H>X=YW(@fKP}kNR)xSp`jrx{XYZ4 ze<1ihVLK;KjIAWdFPNbn1pak>m<<&9;OXKRQgQ3;4M)Zn0|AzUTMNXFF^O$3__uZr z>!;==QBJni%e>F#F=lMO(8k0t>31P#125yd*M;T{hZ*&N`rilv2^i33V(_`RcNXJ? zlBI7#*&RMx?+^h=-4lZ;7!dlvK_*YeEtWgP9M1C{kiTFfEfw^5SuDsYp00i_>zopr E0CWvVr2qf` literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/chat_arrow.gif b/AO2XPbase/themes/AceAttorney2x/chat_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..d247f7753f1784d962073d911a5ea117e4d05af7 GIT binary patch literal 412 zcmZ?wbhEHb6k`x#_`m=HA3l6g{Lk&@8WQa67~pE8XTZz|6a@--<|d}6`X;7lCTH`d zC+6lR+8XGYn1UdK;!hS%4xlO>kO3g07?`wu8dmN;_P@u*z%T0dT*=&fwel)?DVkat zv({XCc_=xetRZuI_`1(MkAp?fP3J{69lPNyLd#C~@+!{K^or6w93kyj$$r8$rE>0r zMU!%VFIijJwd!ss*Q)-#lYfemVR(yR;pyC$O5PzS!yeAvnRg{HUcxOUecqEr>)f@i aHnh!Mym#UK*>Cs6Gc$3ag$tEkZVdom^oJn; literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/chat_arrow.webp b/AO2XPbase/themes/AceAttorney2x/chat_arrow.webp new file mode 100644 index 0000000000000000000000000000000000000000..83ed810507445435c9bece399a52331eb3e49adb GIT binary patch literal 332 zcmWIYbaQiIWMBw)bqWXzu!!JdU|uM%5Ct$W zFah=Xr~}3I1szxf_zgZV+kf~h{~_SQHeO-P1E=J#>UDJdYgc$ORe$}Sf;bC#psC2_ t2xFQfjAqV6VFvRb#ee@Y3SRur!6A{CyZwi59S7VTp!0!%j^^O-7XXpoQ|X=YW(@fKP}kNR)xSp`jrx{XYZ4 ze<1ihVLK;KjIAWdFPNbn1pak>m<<&9;OXKRQgQ3;4M*O?4gxF(mkMw>9~ALP{1MFA zHTB%CERL^lX09_^&c5JmlDq)Jggx1+40a43?6UVV=&@G-^%rCT2^h%XVlZ$$pU38K z`D{^{EW_FNkAQBZ0(h{65>pvFHqyne50sl2{O^s)z4*}Q$iB} D3`s_U literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/chatblank.png b/AO2XPbase/themes/AceAttorney2x/chatblank.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed4928454c233ad73290177e1bdb186cfd7b4b9 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83W-u`W$@hD9<^d_50G|+7kSGItLqo&=|Nl4r zx2*>9SW1HYf*IP|+XKEAPXO{OJzX3_DsH_!r^wjgAi#1U-(i>em&0=wN=X&VC;OjK znZe4yu)!+J;lZjE`tm=@uV^cf3k(!Kyjf7~ut0kiJIkg|jm$giwpiJVxV!?n(bLt> JWt~$(69BsOJtqJF literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/chatmed.png b/AO2XPbase/themes/AceAttorney2x/chatmed.png new file mode 100644 index 0000000000000000000000000000000000000000..72e6d6612c5bef8cdd6e7d50f1cf286ce23efaf4 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83X0R{=$%H>X=YW(@fKP}kNR)xSp`jrx{XYZ4 ze<1ihVLK;KjIAWdFPNbn1pak>m<<&9=;`7ZQgQ3;jnfQA7(`eOF5kelSfEv-Xa6au zC-Xy;uWU@;<^A~z!QO@S#j5ek|OX7cM;FXXd7;P>O6Viln&8xAti)78&q Iol`;+064lwZ~y=R literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/courtroom_stylesheets.css b/AO2XPbase/themes/AceAttorney2x/courtroom_stylesheets.css new file mode 100644 index 0000000..d506274 --- /dev/null +++ b/AO2XPbase/themes/AceAttorney2x/courtroom_stylesheets.css @@ -0,0 +1,86 @@ +QFrame { + color: white; + background-color: transparent; +} + +AOClockLabel { + border: 1px solid rgba(255, 255, 255, 135); + border-radius: 2px; + background-color: rgba(0, 0, 7, 135); + padding: 0px; +} + +QCheckBox { + color: white; + background-color: transparent; +} + +QComboBox { + border: 1px solid black; + border-radius: 3px; + background-color: darkgray; + color: black; +} + +QAbstractItemView { + border: 0px solid darkgray; + background-color: transparent; + color: black; + border-radius: 0px; + selection-background-color: darkgreen; +} + +QListView { + color: black; + background-color: white; + selection-background-color: darkgreen; +} + +QLineEdit { + color: white; + background-color: transparent; +} + +QScrollBar { + height: 12px; + width: 12px; + background-color: transparent; +} + +QScrollBar::add-page { + background: rgba(200, 255, 255, 24) +} + +QScrollBar::sub-page { + background: none +} + +AOButton { + background: darkgray; +} + +QSlider::handle { + background: darkgray; + border: 1px solid #5c5c5c; + border-radius: 3px; +} + + +QTextBrowser#ui_debug_log { + background-color: rgba(20, 20, 20, 255); +} + +QLineEdit#ui_ic_chat_name { + color: white; + background-color: darkgray; +} + +QLabel#ui_size_label { + color: lime; + background-color: black; +} + +AOEmotePreview { + background: rgb(0, 0, 0); + background: qlineargradient(spread:pad, x1:0 y1:0, x2:0 y2:1, stop:0 slategray, stop:1 darkslategray); +} \ No newline at end of file diff --git a/AO2XPbase/themes/AceAttorney2x/courtroombackground.png b/AO2XPbase/themes/AceAttorney2x/courtroombackground.png new file mode 100644 index 0000000000000000000000000000000000000000..c08c6efd548ce685462e251acba6b5dd6704d136 GIT binary patch literal 4625 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 bXb9iM96yO;MXsT?5Qy*T>gTe~DWM4fNdBr^ literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/evidence_overlay_private.png b/AO2XPbase/themes/AceAttorney2x/evidence_overlay_private.png new file mode 100644 index 0000000000000000000000000000000000000000..42ce0b3400c31876799033d02658a72338a07216 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0y~yVB8L5-(z70l0K%v|A3T4fKP}kkpBPw|A&{a-amf& z>hYszx9^m9b;WnhGq@kT4=Bf2666&rcYg8nfz$gkVNy&g|@QKA12QiMwY=)I@knWRfk3LZI(U#&Tzia_wt#%KP7=- c#lTRp)cT7(M>+FruN5G!r>mdKI;Vst0K!wO9{>OV literal 0 HcmV?d00001 diff --git a/AO2XPbase/themes/AceAttorney2x/igiari-cyrillic.ttf b/AO2XPbase/themes/AceAttorney2x/igiari-cyrillic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a846a88dcab7205d1aa9edd187de3f59b4496e77 GIT binary patch literal 182156 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 literal 0 HcmV?d00001 diff --git a/audio.py b/audio.py index c3bcd50..1ce87e5 100644 --- a/audio.py +++ b/audio.py @@ -108,4 +108,7 @@ def sethandleattr(handle, attr, value): Set handle attribute """ if use_ctypes and type(value) == float: value = ctypes.c_float(value) - return dll.BASS_ChannelSetAttribute(handle, attr, value) \ No newline at end of file + return dll.BASS_ChannelSetAttribute(handle, attr, value) + +def getbasserror(): + return dll.BASS_ErrorGetCode() \ No newline at end of file diff --git a/bass_test.py b/bass_test.py new file mode 100644 index 0000000..3790027 --- /dev/null +++ b/bass_test.py @@ -0,0 +1,24 @@ +import __builtin__ +import audio as AUDIO +__builtin__.audio = AUDIO +del AUDIO +from pybass_constants import * + +audio.init() + +mus = "http://files.catbox.moe/nyp4xo.mp3" + +music = audio.loadURLhandle(mus, 0, BASS_STREAM_BLOCK) +print "Trying to play", mus + +if music: + audio.sethandleattr(music, BASS_ATTRIB_VOL, 1.0) + audio.playhandle(music, True) +else: + print "Couldn't play music. Error", audio.getbasserror() + +while (1): + pass + +audio.free() +sys.exit(0) \ No newline at end of file diff --git a/build.bat b/build.bat index 8cc67a4..e01bfbd 100644 --- a/build.bat +++ b/build.bat @@ -1,4 +1,5 @@ -pyinstaller AO2XP.spec -pyinstaller AO2XP_console.spec -pyinstaller install_update.spec +pyinstaller --debug=all AO2XP.spec +pyinstaller --debug=all AO2XP_console.spec +pyinstaller --debug=all install_update.spec move .\dist\* . +pause \ No newline at end of file diff --git a/game_version.py b/game_version.py index f872331..cbac2ac 100644 --- a/game_version.py +++ b/game_version.py @@ -1 +1 @@ -GAME_VERSION = "v1.6" \ No newline at end of file +GAME_VERSION = "2.6.0" \ No newline at end of file diff --git a/gameview.py b/gameview.py index 55388fa..f9945e4 100644 --- a/gameview.py +++ b/gameview.py @@ -62,6 +62,9 @@ C_CYAN = 8 DOWNLOAD_BLACKLIST = [] +VIEWPORT_W = 256*2 +VIEWPORT_H = 192*2 + def delay(msec): dieTime = QtCore.QTime.currentTime().addMSecs(msec) @@ -75,7 +78,12 @@ def encode_ao_str(text): def get_char_ini(char, section, value, default=""): tempini = ConfigParser() - tempini.read(AOpath + 'characters/' + char + '/char.ini') + with open(AOpath + 'characters/' + char + '/char.ini', 'r') as file: + for line in file: + try: + tempini.readfp(file) + except: + pass return ini.read_ini(tempini, section, value, default) def get_option(section, value, default=""): @@ -209,12 +217,13 @@ class AOCharMovie(QtGui.QLabel): def __init__(self, parent): QtGui.QLabel.__init__(self, parent) - self.resize(256, 192) + self.resize(VIEWPORT_W, VIEWPORT_H) self.time_mod = 62 self.play_once = True self.m_flipped = False self.m_movie = QtGui.QMovie() + self.setScaledContents(True) self.preanim_timer = QtCore.QTimer(self) self.preanim_timer.setSingleShot(True) @@ -542,7 +551,8 @@ class ZoomLines(QtGui.QLabel): def __init__(self, parent): super(ZoomLines, self).__init__(parent) - self.resize(256, 192) + self.resize(VIEWPORT_W, VIEWPORT_H) + self.setScaledContents(True) self.movie = QtGui.QMovie() self.movie.frameChanged.connect(self.frame_change) @@ -572,7 +582,8 @@ class WTCE_View(QtGui.QLabel): self.finalframe_timer = QtCore.QTimer() self.finalframe_timer.setSingleShot(False) self.finalframe_timer.timeout.connect(self.finished) - self.resize(256, 192) + self.resize(VIEWPORT_W, VIEWPORT_H) + self.setScaledContents(True) def frame_change(self, frame): if self.movie.state() != QtGui.QMovie.Running: @@ -636,6 +647,9 @@ class gui(QtGui.QWidget): charini = ConfigParser() chatmsg = '' charid = -1 + + wtcesfx = None + #ICchat = QtCore.pyqtSignal(str, str, str, str, str, str, int, int, int, int, int, int, int, int) #ICchat = QtCore.pyqtSignal(list) WTCEsignal = QtCore.pyqtSignal(str, int) @@ -667,9 +681,10 @@ class gui(QtGui.QWidget): self.background = 'default' self.viewport = QtGui.QWidget(self) - self.viewport.resize(256, 192) + self.viewport.resize(VIEWPORT_W, VIEWPORT_H) self.court = QtGui.QLabel(self.viewport) + self.court.resize(VIEWPORT_W, VIEWPORT_H) self.zoom = ZoomLines(self.viewport) self.char = AOCharMovie(self.viewport) @@ -678,23 +693,33 @@ class gui(QtGui.QWidget): self.sidechar.hide() self.bench = QtGui.QLabel(self.viewport) + self.bench.resize(VIEWPORT_W, VIEWPORT_H) bench = QtGui.QPixmap(AOpath + 'background/default/defensedesk.png') self.court.setPixmap(QtGui.QPixmap(AOpath + 'background/default/defenseempty.png')) self.bench.setPixmap(bench) self.effectview = AOMovie(self.viewport) + + font_db = QtGui.QFontDatabase() + font_db.addApplicationFont(AO2XPpath + 'font/Igiari.ttf') + font_db.addApplicationFont(AO2XPpath + 'font/Ace_Name_Regular.ttf') + name_font = QtGui.QFont("Ace Name") + name_font.setPointSize(12) + ao2text_font = QtGui.QFont("Igiari") + ao2text_font.setPointSize(24) self.chatbox = QtGui.QLabel(self.viewport) - chatbox = QtGui.QPixmap(AO2XPpath + 'themes/default/chatmed.png') + chatbox = QtGui.QPixmap(AO2XPpath + 'themes/AceAttorney2x/chatbig.png') + #chatbox = QtGui.QPixmap(AO2XPpath + 'themes/default/chatmed.png') self.chatboxheight = chatbox.size().height() self.chatbox.setPixmap(chatbox) - self.chatbox.move(0, 192 - self.chatboxheight) + self.chatbox.move(0, VIEWPORT_H - self.chatboxheight) self.text = QtGui.QLabel(self.chatbox) self.text.setWordWrap(True) - self.text.resize(250, 96) + self.text.resize(VIEWPORT_W, 96) self.text.move(6, 20) - self.text.setStyleSheet('color: white') + self.text.setStyleSheet('color: white;') self.text.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.ao2text = QtGui.QTextEdit(self.chatbox) @@ -702,19 +727,24 @@ class gui(QtGui.QWidget): self.ao2text.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.ao2text.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.ao2text.setReadOnly(True) - self.ao2text.setGeometry(2, 16, 240+10, 96) + self.ao2text.setGeometry(16, 32, VIEWPORT_W - 16, 112) self.ao2text.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) - self.ao2text.setStyleSheet("background-color: rgba(0, 0, 0, 0);" - "color: white") + self.ao2text.setStyleSheet("background-color: rgba(0, 0, 0, 0); color: white;") + self.ao2text.setFont(ao2text_font) self.name = QtGui.QLabel(self.chatbox) self.name.setStyleSheet('color: white') - self.name.move(5, 0) - self.name.resize(248, self.name.sizeHint().height()) + self.name.move(16, 0) + self.name.resize(248, 32) + #self.name.resize(248, self.name.sizeHint().height()) + self.name.setFont(name_font) + self.wtceview = WTCE_View(self) self.WTCEsignal.connect(self.wtceview.showWTCE) self.objectionview = AOMovie(self.viewport) + self.objectionview.resize(VIEWPORT_W, VIEWPORT_H) + self.objectionview.setScaledContents(True) self.objectionview.done.connect(self.objection_done) self.whiteflashlab = QtGui.QLabel(self.viewport) @@ -859,76 +889,77 @@ class gui(QtGui.QWidget): self.gametabs.addTab(self.gametab_misc, 'Misc') self.icchatinput = QtGui.QLineEdit(self) - self.icchatinput.setGeometry(0, 192, 256, 23) + self.icchatinput.setGeometry(0, VIEWPORT_H, VIEWPORT_W, 23) self.icchatinput.returnPressed.connect(self.onICreturn) self.icchatinput.setPlaceholderText('Game chat') self.emotedropdown = QtGui.QComboBox(self) - self.emotedropdown.setGeometry(192, 344, 128, 20) + self.emotedropdown.setGeometry(164 - 28, 344 + 66 + 4, 72, 20) self.emotedropdown.currentIndexChanged.connect(partial(self.changeEmote, True)) self.colordropdown = QtGui.QComboBox(self) - self.colordropdown.setGeometry(192, 376, 72, 20) + self.colordropdown.setGeometry(self.emotedropdown.x(), 376 + 64, 72, 20) self.colordropdown.currentIndexChanged.connect(self.setChatColor) self.posdropdown = QtGui.QComboBox(self) self.posdropdown.addItems(["def", "pro", "wit", "hld", "hlp", "jud"]) - self.posdropdown.setGeometry(self.emotedropdown.x() + self.emotedropdown.size().width() + 8, 344, 64, 20) + self.posdropdown.setGeometry(self.emotedropdown.x() + self.emotedropdown.size().width() + 4, self.emotedropdown.y(), 72, 20) self.posdropdown.currentIndexChanged.connect(self.setPosition) self.flipbutton = QtGui.QCheckBox(self) self.flipbutton.stateChanged.connect(self.changeFlipCheck) - self.flipbutton.setText('Mirror emote') + self.flipbutton.setText('Mirror') self.flipbutton.resize(self.flipbutton.sizeHint()) - self.flipbutton.move(272, 240) + self.flipbutton.move(self.posdropdown.x() + self.posdropdown.width() + 4, self.colordropdown.y() - 5) self.sfxbutton = QtGui.QCheckBox(self) self.sfxbutton.setChecked(True) self.sfxbutton.stateChanged.connect(self.changeSfxCheck) self.sfxbutton.setText('Play pre-animation') self.sfxbutton.resize(self.sfxbutton.sizeHint()) - self.sfxbutton.move(272, 272-12) + self.sfxbutton.move(self.flipbutton.x(), self.flipbutton.y() + 14) self.nointerruptbtn = QtGui.QCheckBox(self) self.nointerruptbtn.setChecked(False) self.nointerruptbtn.setText('No Interrupt') self.nointerruptbtn.resize(self.nointerruptbtn.sizeHint()) - self.nointerruptbtn.move(272, 272+8) + self.nointerruptbtn.move(self.flipbutton.x() + 140, self.flipbutton.y()) # AO 2.8 self.additivebtn = QtGui.QCheckBox(self) self.additivebtn.setChecked(False) self.additivebtn.setText('Additive text') self.additivebtn.resize(self.additivebtn.sizeHint()) - self.additivebtn.move(272+60, 272+28) + self.additivebtn.move(self.nointerruptbtn.x(), self.sfxbutton.y()) self.additivebtn.clicked.connect(self.onAdditiveCheck) self.deskbtn = QtGui.QCheckBox(self) self.deskbtn.setChecked(True) self.deskbtn.setText('Desk') self.deskbtn.resize(self.nointerruptbtn.sizeHint()) - self.deskbtn.move(self.flipbutton.x()+96, self.flipbutton.y()) + self.deskbtn.move(self.flipbutton.x()+70, self.flipbutton.y()) self.effectdropdown = QtGui.QComboBox(self) - self.effectdropdown.setGeometry(272+60, 272+28+18, 88, 20) - - self.changechar = QtGui.QPushButton(self) - self.changechar.setText('Switch character') - self.changechar.setGeometry(10, 344, 121, 23) - self.changechar.clicked.connect(self.onClick_changeChar) + self.effectdropdown.setGeometry(self.posdropdown.x(), self.colordropdown.y(), 72, 20) + self.callmodbtn = QtGui.QPushButton(self) self.callmodbtn.setText('Call mod') - self.callmodbtn.setGeometry(10, 376, 71, 23) + self.callmodbtn.setGeometry(10, 376 + 62, 60, 23) self.callmodbtn.clicked.connect(self.onClick_callMod) self.settingsbtn = QtGui.QPushButton("Settings", self) - self.settingsbtn.setGeometry(self.callmodbtn.x()+self.callmodbtn.size().width()+8, 376, self.settingsbtn.sizeHint().width(), 23) + self.settingsbtn.setGeometry(self.callmodbtn.x()+self.callmodbtn.size().width(), 376 + 62, self.callmodbtn.width(), 23) self.settingsbtn.clicked.connect(self.gamewindow.showSettings) + + self.changechar = QtGui.QPushButton(self) + self.changechar.setText('Switch character') + self.changechar.setGeometry(10, 344 + 66 + 4, self.callmodbtn.size().width() + self.settingsbtn.size().width(), 23) + self.changechar.clicked.connect(self.onClick_changeChar) - spacing = 9 + spacing = 1 x_mod_count = y_mod_count = 0 - left, top = (10, 218) - width, height = (236, 98) + left, top = (10 + 516, 218+190-24) + width, height = (288, 98) columns = (width - 40) / (spacing + 40) + 1 rows = (height - 40) / (spacing + 40) + 1 self.max_emotes_on_page = columns * rows @@ -944,31 +975,33 @@ class gui(QtGui.QWidget): self.emotebuttons[i].show() self.current_emote_page = 0 - self.prevemotepage = BackEmoteButton(self, 0, 253) + self.prevemotepage = BackEmoteButton(self, 520, 253+190-28) self.prevemotepage.hide() - self.nextemotepage = NextEmoteButton(self, 236, 253) + self.nextemotepage = NextEmoteButton(self, 282 + 516, 253+190-28) self.nextemotepage.show() - self.realizationbtn = buttons.AOToggleButton(self, 265, 192, "realization") + self.realizationbtn = buttons.AOToggleButton(self, 265 + 164, 192 + 304, "realization") self.realizationbtn.clicked.connect(self.onRealizationButton) self.realizationsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0) - self.shakebtn = buttons.AOToggleButton(self, 265+42, 192, "screenshake") # AO 2.8 - self.customobject = buttons.CustomObjection(self, 250, 312) - self.holditbtn = buttons.Objections(self, 10, 312, 1) - self.objectbtn = buttons.Objections(self, 90, 312, 2) - self.takethatbtn = buttons.Objections(self, 170, 312, 3) + self.shakebtn = buttons.AOToggleButton(self, 265+42 + 164, 192 + 304, "screenshake") # AO 2.8 + self.customobject = buttons.CustomObjection(self, 250 + 516 - 30, 312 + 40) + self.takethatbtn = buttons.Objections(self, 170+ 516 - 20, 312 + 40, 3) + self.objectbtn = buttons.Objections(self, 90+ 516 - 10, 312 + 40, 2) + self.holditbtn = buttons.Objections(self, 10+ 516, 312 + 40, 1) self.objectsnd = None self.defensebar = buttons.PenaltyBars(self, 1) self.prosecutionbar = buttons.PenaltyBars(self, 2) - self.defensebar.moveBar(265, 164) - self.prosecutionbar.moveBar(265, 178) + self.defensebar.moveBar(265 + 164, 164 + 304) + self.prosecutionbar.moveBar(265 + 164, 178 + 304) self.defensebar.minusClicked.connect(self.penaltyBarMinus) self.defensebar.plusClicked.connect(self.penaltyBarPlus) self.prosecutionbar.minusClicked.connect(self.penaltyBarMinus) self.prosecutionbar.plusClicked.connect(self.penaltyBarPlus) - self.wtcebtn_1 = buttons.WTCEbuttons(self, 256, 0, 0) - self.wtcebtn_2 = buttons.WTCEbuttons(self, 256 + self.wtcebtn_1.size().width(), 0, 1) - self.notguiltybtn = buttons.WTCEbuttons(self, 256, self.wtcebtn_1.size().height(), 2, 0) - self.guiltybtn = buttons.WTCEbuttons(self, 256 + self.notguiltybtn.size().width(), self.wtcebtn_2.size().height(), 2, 1) + + self.wtcebtn_1 = buttons.WTCEbuttons(self, 429, 544, 0) + self.wtcebtn_2 = buttons.WTCEbuttons(self, self.wtcebtn_1.x(), self.wtcebtn_1.y() + self.wtcebtn_1.size().height(), 1) + self.notguiltybtn = buttons.WTCEbuttons(self, self.wtcebtn_1.x(), self.wtcebtn_2.y() + self.wtcebtn_2.size().height(), 2, 0) + self.guiltybtn = buttons.WTCEbuttons(self, self.wtcebtn_1.x(), self.notguiltybtn.y() + self.notguiltybtn.size().height(), 2, 1) + self.wtcebtn_1.clicked.connect(self.WTCEbuttonPressed) self.wtcebtn_2.clicked.connect(self.WTCEbuttonPressed) self.notguiltybtn.clicked.connect(self.WTCEbuttonPressed) @@ -985,7 +1018,7 @@ class gui(QtGui.QWidget): self.showname = "" self.shownameedit = QtGui.QLineEdit(self) self.shownameedit.textChanged.connect(self.onChangeShowname) - self.shownameedit.setGeometry(self.colordropdown.x()+self.colordropdown.width()+8, self.colordropdown.y(), 144, 20) + self.shownameedit.setGeometry(self.posdropdown.x() + self.posdropdown.width() + 4, self.posdropdown.y(), 168 + 56, 20) self.shownameedit.setPlaceholderText("Showname") self.musicslider = QtGui.QSlider(QtCore.Qt.Horizontal, self) @@ -1638,8 +1671,8 @@ class gui(QtGui.QWidget): bgimg = QtGui.QImage(AOpath + 'background/' + bg + '/' + bgfile[1] + '.png') if not bgimg.isNull(): - if bgimg.size().width() != 256 or bgimg.size().height() != 192: - setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg.scaled(256, 192, transformMode=QtCore.Qt.SmoothTransformation))) + if bgimg.size().width() != VIEWPORT_W or bgimg.size().height() != VIEWPORT_H: + setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg.scaled(VIEWPORT_W, VIEWPORT_H, transformMode=QtCore.Qt.SmoothTransformation))) else: setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg)) else: @@ -1783,12 +1816,12 @@ class gui(QtGui.QWidget): if side == 'def': self.court.setPixmap(self.side_def) self.bench.setPixmap(self.bench_def) - self.bench.move(0, 192 - self.bench_def.size().height()) + self.bench.move(0, VIEWPORT_H - self.bench_def.size().height()) self.presentedevi.move(170, 16) elif side == 'pro': self.court.setPixmap(self.side_pro) self.bench.setPixmap(self.bench_pro) - self.bench.move(256 - self.bench_pro.size().width(), 192 - self.bench_pro.size().height()) + self.bench.move(VIEWPORT_W - self.bench_pro.size().width(), VIEWPORT_H - self.bench_pro.size().height()) self.presentedevi.move(16, 16) elif side == 'wit': self.court.setPixmap(self.side_wit) @@ -2368,13 +2401,14 @@ class gui(QtGui.QWidget): audio.freehandle(self.music) if exists(AOpath + 'sounds/music/' + mus): - self.music = audio.loadhandle(False, AOpath + 'sounds/music/' + mus, 0, 0, 0) + self.music = audio.loadhandle(False, AOpath + 'sounds/music/' + mus, 0, 0, BASS_SAMPLE_LOOP) audio.sethandleattr(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) audio.playhandle(self.music, True) elif ini.read_ini_bool("AO2XP.ini", "General", "download music", True): if mus.lower().startswith("http"): - self.music = audio.loadURLhandle(mus, 0, BASS_STREAM_BLOCK) + self.music = audio.loadURLhandle(mus, 0, BASS_STREAM_BLOCK | BASS_SAMPLE_LOOP) + print "Trying to play", mus.lower() else: for bucket in buckets: if not bucket: continue @@ -2385,6 +2419,8 @@ class gui(QtGui.QWidget): if self.music: audio.sethandleattr(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) audio.playhandle(self.music, True) + else: + print "Couldn't play music. Error", audio.getbasserror() def stopMusic(self): if self.music: @@ -2437,7 +2473,7 @@ class gui(QtGui.QWidget): self.colordropdown.clear() self.colordropdown.addItems(['white', 'green', 'red', 'orange', 'blue']) if "yellowtext" in features: - self.colordropdown.addItems(['yellow', 'gay pride', 'pink', 'cyan']) + self.colordropdown.addItems(['yellow', 'rainbow', 'pink', 'cyan']) self.colordropdown.setCurrentIndex(self.mychatcolor) for hp in hplist: @@ -2825,7 +2861,8 @@ class TCP_Thread(QtCore.QThread): elif header == 'RT': testimony = network[1] wtcefile = AOpath+"sounds/general/sfx-testimony2" - audio.freehandle(self.parent.wtcesfx) + if self.parent.wtcesfx: + audio.freehandle(self.parent.wtcesfx) if testimony == 'judgeruling': variant = int(network[2]) diff --git a/gameview_scaled.py b/gameview_scaled.py new file mode 100644 index 0000000..a564187 --- /dev/null +++ b/gameview_scaled.py @@ -0,0 +1,2882 @@ +import thread, time, os, buttons, urllib, charselect, ini, random +from os.path import exists +from ConfigParser import ConfigParser + +from pybass_constants import * +from PyQt4 import QtGui, QtCore +from functools import partial + +import AOsocket +import images + +AOpath = "base/" +AO2XPpath = "AO2XPbase/" +#AOpath = 'I:/aovanilla1.7.5/client/base/' + +DESK_MOD = 1 +PREANIM = 2 +CHARNAME = 3 +ANIM = 4 +CHATMSG = 5 +SIDE = 6 +SFX = 7 +EMOTE_MOD = 8 +CHAR_ID = 9 +SFX_DELAY = 10 +SHOUT_MOD = 11 +EVIDENCE = 12 +FLIP = 13 +REALIZATION = 14 +TEXT_COLOR = 15 +SHOWNAME = 16 +OTHER_CHARID = 17 +OTHER_NAME = 18 +OTHER_EMOTE = 19 +SELF_OFFSET = 20 +OTHER_OFFSET = 21 +OTHER_FLIP = 22 +NO_INTERRUPT = 23 +LOOPING_SFX = 24 +SCREENSHAKE = 25 +FRAME_SCREENSHAKE = 26 +FRAME_REALIZATION = 27 +FRAME_SFX = 28 +ADDITIVE = 29 +EFFECTS = 30 + +INLINE_BLUE = 0 +INLINE_GREEN = 1 +INLINE_ORANGE = 2 +INLINE_GRAY = 3 +INLINE_RED = 4 + +C_WHITE = 0 +C_GREEN = 1 +C_RED = 2 +C_ORANGE = 3 +C_BLUE = 4 +C_YELLOW = 5 +C_RAINBOW = 6 +C_PINK = 7 +C_CYAN = 8 + +DOWNLOAD_BLACKLIST = [] + +def delay(msec): + dieTime = QtCore.QTime.currentTime().addMSecs(msec) + + while QtCore.QTime.currentTime() < dieTime: + QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) + +def decode_ao_str(text): + return text.replace("", "%").replace("", "#").replace("", "#").replace("", "&").replace("", "$") +def encode_ao_str(text): + return text.replace("%", "").replace("#", "").replace("&", "").replace("$", "") + +def get_char_ini(char, section, value, default=""): + tempini = ConfigParser() + with open(AOpath + 'characters/' + char + '/char.ini', 'r') as file: + for line in file: + try: + tempini.readfp(file) + except: + pass + return ini.read_ini(tempini, section, value, default) + +def get_option(section, value, default=""): + tempini = ConfigParser() + tempini.read("AO2XP.ini") + return ini.read_ini(tempini, section, value, default) + +def get_img_suffix(path): + if exists(path): return path + if exists(path+".webp"): return path+".webp" + if exists(path+".apng"): return path+".apng" + if exists(path+".gif"): return path+".gif" + return path+".png" + +def get_text_color(textcolor): + if textcolor == 0 or textcolor == 6: + return QtGui.QColor(255, 255, 255) + elif textcolor == 1: + return QtGui.QColor(0, 255, 0) + elif textcolor == 2: # OH FUCK MOD + return QtGui.QColor(255, 0, 0) + elif textcolor == 3: + return QtGui.QColor(255, 165, 0) + elif textcolor == 4: + return QtGui.QColor(45, 150, 255) + elif textcolor == 5: + return QtGui.QColor(255, 255, 0) + elif textcolor == 7: + return QtGui.QColor(255, 192, 203) + elif textcolor == 8: + return QtGui.QColor(0, 255, 255) + elif textcolor == "_inline_grey": + return QtGui.QColor(187, 187, 187) + + return QtGui.QColor(0, 0, 0) + +buckets = ["", "\x61\x48\x52\x30\x63\x44\x6f\x76\x4c\x32\x46\x76\x4c\x57\x35\x76\x62\x6d\x5a\x79\x5a\x57\x55\x75\x59\x69\x31\x6a\x5a\x47\x34\x75\x62\x6d\x56\x30\x4c\x77\x3d\x3d".decode("\x62\x61\x73\x65\x36\x34")] # troll +# bucket 0 ("") is used for server's own bucket + +def download_thread(link, savepath): + global DOWNLOAD_BLACKLIST + if link in DOWNLOAD_BLACKLIST: + return + + for bucket in buckets: + if not bucket: continue + i = buckets.index(bucket) + + print "download missing: %s" % link + fp = urllib.urlopen(bucket+link) + if fp.getcode() == 200: + if not os.path.exists(savepath[:-1]): + os.makedirs(savepath[:-1]) + + with open(savepath, "wb") as f: + f.write(fp.read()) + print "successfully downloaded:", link + return + + DOWNLOAD_BLACKLIST.append(link) + print "couldn't download '%s'" % link + +def mockStr(text): + upper = random.choice([True, False]) + l = list(text) + for i in range(len(text)): + if text[i] == " ": + continue + + l[i] = l[i].upper() if upper else l[i].lower() + upper = not upper + return "".join(l) + +class ChatLogs(QtGui.QTextEdit): + def __init__(self, parent, logtype, logfile=None): + QtGui.QTextEdit.__init__(self, parent) + self.type = logtype + self.savelog = ini.read_ini_bool("AO2XP.ini", "General", "save logs") + self.combinelog = ini.read_ini_bool("AO2XP.ini", "General", "combined logs") + if not exists("chatlogs"): + os.mkdir("chatlogs") + + if self.savelog: + currtime = time.localtime() + if self.combinelog: + if self.type == 0: + self.logfile = logfile + else: + self.logfile = open("chatlogs/%d%.2d%.2d_on_%.2d.%.2d.%.2d.txt" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]), "w") + else: + if self.type == 0: + self.logfile = open("chatlogs/IC_%d%.2d%.2d_on_%.2d.%.2d.%.2d.txt" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]), "w") + else: + self.logfile = open("chatlogs/OOC_%d%.2d%.2d_on_%.2d.%.2d.%.2d.txt" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]), "w") + else: + self.logfile = None + + def __del__(self): + if self.savelog: + self.logfile.close() + + def append(self, text): + super(ChatLogs, self).append(text) + if self.savelog: + if isinstance(text, str) or isinstance(text, unicode): + if self.combinelog and not "Log started" in text: + if self.type == 0: + self.logfile.write("[IC] "+text.encode("utf-8")+"\n") + else: + self.logfile.write("[OOC] "+text.encode("utf-8")+"\n") + else: + self.logfile.write(text.encode("utf-8")+"\n") + else: + if self.combinelog and not "Log started" in text: + if self.type == 0: + self.logfile.write("[IC] "+text.toUtf8()+"\n") + else: + self.logfile.write("[OOC] "+text.toUtf8()+"\n") + else: + self.logfile.write(text.toUtf8()+"\n") + +class AOCharMovie(QtGui.QLabel): + done = QtCore.pyqtSignal() + use_pillow = 0 + pillow_frames = [] + pillow_frame = 0 + pillow_speed = 0 + xx = 0 # for restoring from screenshake + yy = 0 # for restoring from screenshake + + def __init__(self, parent): + QtGui.QLabel.__init__(self, parent) + + self.resize(256*2, 192*2) + self.time_mod = 62 + self.play_once = True + self.m_flipped = False + + self.m_movie = QtGui.QMovie() + + self.preanim_timer = QtCore.QTimer(self) + self.preanim_timer.setSingleShot(True) + self.pillow_timer = QtCore.QTimer(self) + self.pillow_timer.setSingleShot(True) + + self.preanim_timer.timeout.connect(self.timer_done) + self.pillow_timer.timeout.connect(self.pillow_frame_change) + self.m_movie.frameChanged.connect(self.frame_change) + + def move(self, x, y, screenShaking=False): + if not screenShaking: + self.xx = x + self.yy = y + super(AOCharMovie, self).move(x, y) + + def set_flipped(self, flip): + self.m_flipped = flip + + def play(self, p_char, p_emote, emote_prefix): + if p_emote[0] == "/" or p_emote[0] == "/": + p_emote = p_emote[1:] + elif "../../characters" in p_emote: + print p_emote + a = p_emote.split("/") + p_char = a[3] + emote = a[4] + emote_prefix = "" + p_emote = emote + + self.pillow_frames = [] + self.pillow_frame = 0 + + original_path = AOpath+"characters/"+p_char+"/"+emote_prefix+p_emote+".gif" + alt_path = AOpath+"characters/"+p_char+"/"+p_emote+".png" + apng_path = AOpath+"characters/"+p_char+"/"+emote_prefix+p_emote+".apng" + webp_path = AOpath+"characters/"+p_char+"/"+emote_prefix+p_emote+".webp" + placeholder_path = AO2XPpath+"themes/default/placeholder.gif" + gif_path = "" + + if exists(apng_path): + gif_path = apng_path + self.use_pillow = 1 + else: + if ini.read_ini_bool("AO2XP.ini", "General", "download characters"): + url = "base/characters/"+p_char.lower()+"/"+emote_prefix+p_emote.lower()+".apng" + url = url.replace(" ", "%20") + thread.start_new_thread(download_thread, (url, apng_path)) + + if exists(webp_path): + gif_path = webp_path + self.use_pillow = 2 + else: + if ini.read_ini_bool("AO2XP.ini", "General", "download characters"): + url = "base/characters/"+p_char.lower()+"/"+p_emote.lower()+".webp" + url = url.replace(" ", "%20") + thread.start_new_thread(download_thread, (url, webp_path)) + + if exists(original_path): + gif_path = original_path + self.use_pillow = 0 + else: + if ini.read_ini_bool("AO2XP.ini", "General", "download characters"): + url = "base/characters/"+p_char.lower()+"/"+emote_prefix+p_emote.lower()+".gif" + url = url.replace(" ", "%20") + thread.start_new_thread(download_thread, (url, original_path)) + + if exists(alt_path): + gif_path = alt_path + self.use_pillow = 0 + else: + if ini.read_ini_bool("AO2XP.ini", "General", "download characters"): + url = "base/characters/"+p_char.lower()+"/"+emote_prefix+p_emote.lower()+".png" + url = url.replace(" ", "%20") + thread.start_new_thread(download_thread, (url, alt_path)) + + if exists(placeholder_path): + gif_path = placeholder_path + else: + gif_path = "" + self.use_pillow = 0 + + if not self.use_pillow: + self.m_movie.stop() + self.m_movie.setFileName(gif_path) + self.m_movie.start() + + elif self.use_pillow == 1: # apng + self.pillow_frames = images.load_apng(apng_path) + if len(self.pillow_frames) > 1: self.pillow_timer.start(int(self.pillow_frames[0][1] * self.pillow_speed)) + self.set_pillow_frame() + + elif self.use_pillow == 2: # webp + self.pillow_frames = images.load_webp(webp_path) + if len(self.pillow_frames) > 1: self.pillow_timer.start(int(self.pillow_frames[0][1] * self.pillow_speed)) + self.set_pillow_frame() + + self.show() + + def play_pre(self, p_char, p_emote, duration): + gif_path = AOpath+"characters/"+p_char+"/"+p_emote+".gif" + apng_path = AOpath+"characters/"+p_char+"/"+p_emote+".apng" + webp_path = AOpath+"characters/"+p_char+"/"+p_emote+".webp" + + full_duration = duration * self.time_mod + real_duration = 0 + + self.play_once = False + self.m_movie.stop() + self.clear() + + if exists(apng_path): + real_duration = images.get_apng_duration(apng_path) + + elif exists(webp_path): + real_duration = images.get_webp_duration(webp_path) + + elif exists(gif_path): + self.m_movie.setFileName(gif_path) + self.m_movie.jumpToFrame(0) + for n_frame in range(self.m_movie.frameCount()): + real_duration += self.m_movie.nextFrameDelay() + self.m_movie.jumpToFrame(n_frame + 1) + + percentage_modifier = 100.0 + + if real_duration != 0 and duration != 0: + modifier = full_duration / float(real_duration) + percentage_modifier = 100 / modifier + + if percentage_modifier > 100.0 or percentage_modifier < 0.0: + percentage_modifier = 100.0 + + self.pillow_fullduration = full_duration + if full_duration == 0 or full_duration >= real_duration: + self.play_once = True + else: + self.play_once = False + if full_duration >= 0: + self.preanim_timer.start(full_duration) + + self.m_movie.setSpeed(int(percentage_modifier)) + self.pillow_speed = percentage_modifier / 100. + self.play(p_char, p_emote, "") + + def play_talking(self, p_char, p_emote): + gif_path = AOpath + 'characters/' + p_char + '/(b)' + p_emote + '.gif' + + self.m_movie.stop() + self.clear() + self.m_movie.setFileName(gif_path) + self.m_movie.jumpToFrame(0) + + self.play_once = False + self.m_movie.setSpeed(100) + self.pillow_speed = 1 + self.play(p_char, p_emote, '(b)') + + def play_idle(self, p_char, p_emote): + gif_path = AOpath + 'characters/' + p_char + '/(a)' + p_emote + '.gif' + + self.m_movie.stop() + self.clear() + self.m_movie.setFileName(gif_path) + self.m_movie.jumpToFrame(0) + + self.play_once = False + self.m_movie.setSpeed(100) + self.pillow_speed = 1 + self.play(p_char, p_emote, '(a)') + + def stop(self): + self.m_movie.stop() + self.preanim_timer.stop() + self.hide() + + @QtCore.pyqtSlot(int) + def frame_change(self, n_frame): + f_img = self.m_movie.currentImage().mirrored(self.m_flipped, False) + if f_img.size().width() != 256 or f_img.size().height() != 192: + f_img = f_img.scaled(256*2, 192*2, transformMode=QtCore.Qt.SmoothTransformation) + + f_pixmap = QtGui.QPixmap.fromImage(f_img) + self.setPixmap(f_pixmap) + + if self.m_movie.frameCount() - 1 == n_frame and self.play_once: + self.preanim_timer.start(self.m_movie.nextFrameDelay()) + + @QtCore.pyqtSlot() + def pillow_frame_change(self): + if not self.pillow_frames: return + + if len(self.pillow_frames)-1 == self.pillow_frame: + if self.play_once: + self.preanim_timer.start(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + elif len(self.pillow_frames) > 1: + self.pillow_frame = 0 + self.pillow_timer.start(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + else: + self.pillow_frame += 1 + self.pillow_timer.start(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + + self.set_pillow_frame() + + def set_pillow_frame(self): + f_img = self.pillow_frames[self.pillow_frame][0].mirrored(self.m_flipped, False) + if f_img.size().width() != 256 or f_img.size().height() != 192: + f_img = f_img.scaled(256*2, 192*2, transformMode=QtCore.Qt.SmoothTransformation) + + f_pixmap = QtGui.QPixmap.fromImage(f_img) + self.setPixmap(f_pixmap) + + @QtCore.pyqtSlot() + def timer_done(self): + self.done.emit() + +class AOMovie(QtGui.QLabel): + play_once = True + done = QtCore.pyqtSignal() + use_pillow = 0 + pillow_frames = [] + pillow_frame = 0 + pillow_speed = 1 + xx = 0 # for restoring from screenshake + yy = 0 # for restoring from screenshake + + def __init__(self, parent): + QtGui.QLabel.__init__(self, parent) + self.m_movie = QtGui.QMovie() + self.setMovie(self.m_movie) + self.m_movie.frameChanged.connect(self.frame_change) + + self.pillow_timer = QtCore.QTimer(self) + self.pillow_timer.setSingleShot(True) + self.pillow_timer.timeout.connect(self.pillow_frame_change) + + def move(self, x, y): + self.xx = x + self.yy = y + super(AOMovie, self).move(x, y) + + def set_play_once(self, once): + self.play_once = once + + def play(self, p_image, p_char=""): + self.stop() + + gif_path = p_image + pillow_modes = {".gif": 0, ".apng": 1, ".webp": 2} + + if not exists(gif_path): + pathlist = [ + get_img_suffix(AO2XPpath+"themes/default/"+p_image+"_bubble"), + get_img_suffix(AOpath+"characters/"+p_char+"/"+p_image), + get_img_suffix(AOpath+"misc/default/"+p_image), + get_img_suffix(AO2XPpath+"themes/default/"+p_image), + AO2XPpath+"themes/default/placeholder.gif" + ] + + for f in pathlist: + if exists(f): + gif_path = f + break + + self.use_pillow = pillow_modes[os.path.splitext(gif_path)[1]] + if not self.use_pillow: + self.m_movie.setFileName(gif_path) + self.m_movie.start() + elif self.use_pillow == 1: # apng + self.pillow_frames = images.load_apng(gif_path) + if len(self.pillow_frames) > 1: self.pillow_timer.start(int(self.pillow_frames[0][1] * self.pillow_speed)) + self.set_pillow_frame() + elif self.use_pillow == 2: # webp + self.pillow_loops = 0 + self.pillow_frames, self.webp_loops = images.load_webp(gif_path) + if len(self.pillow_frames) > 1: self.pillow_timer.start(int(self.pillow_frames[0][1] * self.pillow_speed)) + self.set_pillow_frame() + + self.show() + + def stop(self): + self.pillow_frames = [] + self.pillow_frame = 0 + self.pillow_timer.stop() + self.m_movie.stop() + self.hide() + + @QtCore.pyqtSlot(int) + def frame_change(self, n_frame): + if n_frame == self.m_movie.frameCount() - 1 and self.play_once: + delay(self.m_movie.nextFrameDelay()) + self.stop() + self.done.emit() + + @QtCore.pyqtSlot() + def pillow_frame_change(self): + if not self.pillow_frames: return + + if len(self.pillow_frames)-1 == self.pillow_frame: + if self.play_once or (self.use_pillow == 2 and self.pillow_loops+1 == self.webp_loops): + delay(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + self.stop() + self.done.emit() + elif len(self.pillow_frames) > 1: # loop + self.pillow_loops += 1 + self.pillow_frame = 0 + self.pillow_timer.start(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + elif len(self.pillow_frames) > 1: + self.pillow_frame += 1 + self.pillow_timer.start(int(self.pillow_frames[self.pillow_frame][1] * self.pillow_speed)) + + self.set_pillow_frame() + + def set_pillow_frame(self): + if not self.pillow_frames: return + + f_img = self.pillow_frames[self.pillow_frame][0] + if f_img.size().width() != 256 or f_img.size().height() != 192: + f_img = f_img.scaled(256*2, 192*2, transformMode=QtCore.Qt.SmoothTransformation) + + f_pixmap = QtGui.QPixmap.fromImage(f_img) + self.setPixmap(f_pixmap) + +class ZoomLines(QtGui.QLabel): + + def __init__(self, parent): + super(ZoomLines, self).__init__(parent) + self.resize(256*2, 192*2) + self.movie = QtGui.QMovie() + self.movie.frameChanged.connect(self.frame_change) + + def frame_change(self): + img = self.movie.currentImage() + self.setPixmap(QtGui.QPixmap.fromImage(img)) + + def setZoom(self, on, dir=0): + self.movie.stop() + if not on: + self.hide() + return + self.show() + if dir == 0: + self.movie.setFileName(AO2XPpath + 'themes/default/defense_speedlines.gif') + else: + self.movie.setFileName(AO2XPpath + 'themes/default/prosecution_speedlines.gif') + self.movie.start() + + +class WTCE_View(QtGui.QLabel): + + def __init__(self, parent): + super(WTCE_View, self).__init__(parent) + self.movie = QtGui.QMovie() + self.movie.frameChanged.connect(self.frame_change) + self.finalframe_timer = QtCore.QTimer() + self.finalframe_timer.setSingleShot(False) + self.finalframe_timer.timeout.connect(self.finished) + self.resize(256*2, 192*2) + + def frame_change(self, frame): + if self.movie.state() != QtGui.QMovie.Running: + return + img = self.movie.currentImage() + self.setPixmap(QtGui.QPixmap.fromImage(img)) + if self.movie.currentFrameNumber() == self.movie.frameCount() - 1: + self.finalframe_timer.start(self.movie.nextFrameDelay()) + + def finished(self): + self.finalframe_timer.stop() + self.movie.stop() + self.hide() + + def showWTCE(self, wtce, variant=0): + self.finished() + if wtce == 'testimony1': + self.movie.setFileName(AO2XPpath + 'themes/default/witnesstestimony.gif') + elif wtce == 'testimony2': + self.movie.setFileName(AO2XPpath + 'themes/default/crossexamination.gif') + elif wtce == "judgeruling": + if variant == 0: + self.movie.setFileName(AO2XPpath + 'themes/default/notguilty.gif') + elif variant == 1: + self.movie.setFileName(AO2XPpath + 'themes/default/guilty.gif') + else: + return + self.show() + self.movie.start() + +class gui(QtGui.QWidget): + gamewindow = None + sound = None + music = None + next_character_is_not_special = False + message_is_centered = False + current_display_speed = 3 + message_display_speed = (30, 40, 50, 60, 75, 100, 120) + entire_message_is_blue = False + inline_color_stack = [] #"colour" is for EU nobos + inline_blue_depth = 0 + other_charid = -1 + offset_with_pair = 0 + tick_pos = 0 + blip_pos = 0 + blip_rate = 1 + time_mod = 40 + blip = "male" + blipsnd = None + chatmessage_size = 31 + m_chatmessage = [] + blank_blip = False + chatmessage_is_empty = False + is_additive = False + additive_char = -1 + anim_state = 3 + text_state = 2 + objection_state = 0 + text_color = 0 + + charini = ConfigParser() + chatmsg = '' + charid = -1 + + wtcesfx = None + + #ICchat = QtCore.pyqtSignal(str, str, str, str, str, str, int, int, int, int, int, int, int, int) + #ICchat = QtCore.pyqtSignal(list) + WTCEsignal = QtCore.pyqtSignal(str, int) + healthbars = QtCore.pyqtSignal(int, int) + gotPing = QtCore.pyqtSignal(int) + + def __init__(self, parent=None): + super(gui, self).__init__(parent) + self.gamewindow = parent + + self.gotPing.connect(self.setPing) + + for i in range(self.chatmessage_size): + self.m_chatmessage.append("") + + self.chat_tick_timer = QtCore.QTimer(self) + self.chat_tick_timer.timeout.connect(self.chat_tick) + + self.sfx_delay_timer = QtCore.QTimer(self) + self.sfx_delay_timer.setSingleShot(True) + self.sfx_delay_timer.timeout.connect(self.play_sfx) + + self.modcall = None + + self.healthbars.connect(self.netmsg_hp) + self.disconnectnow = False + self.swapping = False + self.iniswapindex = 0 + self.background = 'default' + + self.viewport = QtGui.QWidget(self) + self.viewport.resize(256*2, 192*2) + + self.court = QtGui.QLabel(self.viewport) + self.zoom = ZoomLines(self.viewport) + + self.char = AOCharMovie(self.viewport) + self.char.done.connect(self.preanim_done) + self.sidechar = AOCharMovie(self.viewport) + self.sidechar.hide() + + self.bench = QtGui.QLabel(self.viewport) + bench = QtGui.QPixmap(AOpath + 'background/default/defensedesk.png') + self.court.setPixmap(QtGui.QPixmap(AOpath + 'background/default/defenseempty.png')) + self.bench.setPixmap(bench) + + self.effectview = AOMovie(self.viewport) + + self.chatbox = QtGui.QLabel(self.viewport) + chatbox = QtGui.QPixmap(AO2XPpath + 'themes/default/chatmed.png') + self.chatboxheight = chatbox.size().height() + self.chatbox.setPixmap(chatbox) + self.chatbox.move(0, 192*2 - self.chatboxheight) + + self.text = QtGui.QLabel(self.chatbox) + self.text.setWordWrap(True) + self.text.resize(250, 96) + self.text.move(6, 20) + self.text.setStyleSheet('color: white') + self.text.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) + + self.ao2text = QtGui.QTextEdit(self.chatbox) + self.ao2text.setFrameStyle(QtGui.QFrame.NoFrame) + self.ao2text.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.ao2text.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.ao2text.setReadOnly(True) + self.ao2text.setGeometry(2, 16, 240+10, 96) + self.ao2text.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) + self.ao2text.setStyleSheet("background-color: rgba(0, 0, 0, 0);" + "color: white") + + self.name = QtGui.QLabel(self.chatbox) + self.name.setStyleSheet('color: white') + self.name.move(5, 0) + self.name.resize(248, self.name.sizeHint().height()) + self.wtceview = WTCE_View(self) + self.WTCEsignal.connect(self.wtceview.showWTCE) + + self.objectionview = AOMovie(self.viewport) + self.objectionview.done.connect(self.objection_done) + + self.whiteflashlab = QtGui.QLabel(self.viewport) + self.whiteflashlab.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/realizationflash.png')) + self.whiteflashlab.setGeometry(0, 0, 256*2, 192*2) + self.whiteflashlab.hide() + self.whiteflash = QtCore.QTimer() + self.whiteflash.setSingleShot(False) + self.whiteflash.timeout.connect(partial(self.setWhiteFlash, False)) + + self.screenshake = QtCore.QTimer() + self.screenshake.timeout.connect(self.screenShakeTick) + self.shakes_remaining = 0 + + self.ooclog = ChatLogs(self, 1) + self.ooclog.setReadOnly(True) + p = self.ooclog.viewport().palette() + p.setColor(self.ooclog.viewport().backgroundRole(), QtGui.QColor(139,139,139)) + self.ooclog.viewport().setPalette(p) + self.ooclog.textChanged.connect(self.ooclog_update) + + self.oocnameinput = QtGui.QLineEdit(self) + self.oocnameinput.setPlaceholderText('Enter a name...') + self.oocnameinput.setStyleSheet('background-color: rgb(139, 139, 139);') + + self.oocinput = QtGui.QLineEdit(self) + self.oocinput.setPlaceholderText('Server chat/OOC chat...') + self.oocinput.setStyleSheet('background-color: rgb(139, 139, 139);') + self.oocinput.returnPressed.connect(self.onOOCreturn) + + self.ooclogin = QtGui.QPushButton("Login", self) + self.ooclogin.clicked.connect(self.onOOCLoginBtn) + + self.musicitems = QtGui.QListWidget(self) + self.musicitems.itemDoubleClicked.connect(self.onMusicClick) + + self.gametabs = QtGui.QTabWidget(self) + self.gametab_log = QtGui.QWidget() # the IC chat log + self.gametab_evidence = QtGui.QWidget() # court record + self.gametab_msgqueue = QtGui.QWidget() # IC messages pending to be sent + self.gametab_iniswap = QtGui.QWidget() # self explanatory + self.gametab_mute = QtGui.QWidget() # mute a player + self.gametab_pair = QtGui.QWidget() # AO2 pair + self.gametab_misc = QtGui.QWidget() # ao2xp misc/fun stuff + + self.icLog = ChatLogs(self.gametab_log, 0, self.ooclog.logfile) + self.icLog.setReadOnly(True) + self.icLog.textChanged.connect(self.icLogChanged) + + self.evidencedropdown = QtGui.QComboBox(self.gametab_evidence) + self.evidencedropdown.currentIndexChanged.connect(self.changeEvidence) + self.evidencedesc = QtGui.QTextEdit(self.gametab_evidence) + self.evidencedesc.setReadOnly(True) + self.evidenceimage = QtGui.QLabel(self.gametab_evidence) + self.evidenceimage.setPixmap(QtGui.QPixmap(AOpath + 'evidence/empty.png')) + self.evidenceimage.show() + self.evidenceadd = QtGui.QPushButton(self.gametab_evidence) + self.evidenceadd.setText('Add') + self.evidenceadd.clicked.connect(self.onAddEvidence) + self.evidenceedit = QtGui.QPushButton(self.gametab_evidence) + self.evidenceedit.setText('Edit') + self.evidenceedit.clicked.connect(self.onEditEvidence) + self.evidencedelete = QtGui.QPushButton(self.gametab_evidence) + self.evidencedelete.setText('Delete') + self.evidencedelete.clicked.connect(self.onDeleteEvidence) + self.evidencepresent = PresentButton(self, self.gametab_evidence) + + self.msgqueueList = QtGui.QListWidget(self.gametab_msgqueue) + self.msgqueueList.itemClicked.connect(self.onClicked_msgqueue) + self.removeQueue = QtGui.QPushButton(self.gametab_msgqueue) + self.removeQueue.setText('Delete') + self.removeQueue.clicked.connect(self.onClicked_removeQueue) + + self.unmutedlist = QtGui.QListWidget(self.gametab_mute) + self.mutedlist = QtGui.QListWidget(self.gametab_mute) + self.mutebtn = QtGui.QPushButton(self.gametab_mute) + self.unmutebtn = QtGui.QPushButton(self.gametab_mute) + self.notmutedlabel = QtGui.QLabel(self.gametab_mute) + self.mutedlabel = QtGui.QLabel(self.gametab_mute) + self.notmutedlabel.setText('Not muted') + self.mutedlabel.setText('Muted') + self.mutebtn.setText('>>') + self.unmutebtn.setText('<<') + self.mutebtn.clicked.connect(self.onMuteClick) + self.unmutebtn.clicked.connect(self.onUnmuteClick) + self.mutedlist.itemClicked.connect(self.changeMuteIndex) + self.unmutedlist.itemClicked.connect(self.changeUnmuteIndex) + + self.iniswaplist = QtGui.QComboBox(self.gametab_iniswap) + self.iniswaplist.currentIndexChanged.connect(self.iniswap_index_change) + self.iniswapconfirm = QtGui.QPushButton(self.gametab_iniswap) + self.iniswapconfirm.setText('Swap') + self.iniswapconfirm.clicked.connect(self.iniswap_confirm) + self.iniswapreset = QtGui.QPushButton(self.gametab_iniswap) + self.iniswapreset.setText('Reset') + self.iniswapreset.clicked.connect(self.resetIniSwap) + self.iniswapinfo = QtGui.QLabel(self.gametab_iniswap) + self.iniswapinfo.setText('Not swapped') + self.iniswaprefresh = QtGui.QPushButton(self.gametab_iniswap) + self.iniswaprefresh.setText('Refresh characters') + self.iniswaprefresh.clicked.connect(self.loadSwapCharacters) + + self.paircheckbox = QtGui.QCheckBox(self.gametab_pair) + self.paircheckbox.setChecked(False) + self.pairdropdown = QtGui.QComboBox(self.gametab_pair) + self.pairoffset = QtGui.QSlider(QtCore.Qt.Horizontal, self.gametab_pair) + self.pairoffset.setRange(-100, 100) + self.pairoffset.setValue(0) + self.pairoffset_l = QtGui.QLabel("X offset", self.gametab_pair) + self.ypairoffset = QtGui.QSlider(QtCore.Qt.Vertical, self.gametab_pair) + self.ypairoffset.setRange(-100, 100) + self.ypairoffset.setValue(0) + self.ypairoffset_l = QtGui.QLabel("Y offset", self.gametab_pair) + self.pairoffsetreset = QtGui.QPushButton("Reset", self.gametab_pair) + self.pairoffsetreset.clicked.connect(self.resetOffsets) + self.pair_order = QtGui.QComboBox(self.gametab_pair) + self.pair_order.addItem("Front") + self.pair_order.addItem("Behind") + self.pair_order_l = QtGui.QLabel("Pairing order", self.gametab_pair) + + self.misc_layout = QtGui.QVBoxLayout(self.gametab_misc) + self.misc_layout.setAlignment(QtCore.Qt.AlignTop) + self.mocktext = QtGui.QCheckBox() + self.mocktext.setChecked(False) + self.mocktext.setText(mockStr("mock text")) + self.spacebartext = QtGui.QCheckBox() + self.spacebartext.setChecked(False) + self.spacebartext.setText("S p a c i n g") + self.autocaps = QtGui.QCheckBox() + self.autocaps.setChecked(False) + self.autocaps.setText("Automatic caps and period") + self.misc_layout.addWidget(self.mocktext) + self.misc_layout.addWidget(self.spacebartext) + self.misc_layout.addWidget(self.autocaps) + + self.gametabs.addTab(self.gametab_log, 'Game log') + self.gametabs.addTab(self.gametab_evidence, 'Evidence') + self.gametabs.addTab(self.gametab_msgqueue, 'Message queue') + self.gametabs.addTab(self.gametab_mute, 'Mute') + self.gametabs.addTab(self.gametab_iniswap, 'Easy IniSwap') + self.gametabs.addTab(self.gametab_pair, 'Pair') + self.gametabs.addTab(self.gametab_misc, 'Misc') + + self.icchatinput = QtGui.QLineEdit(self) + self.icchatinput.setGeometry(0, 192, 256, 23) + self.icchatinput.returnPressed.connect(self.onICreturn) + self.icchatinput.setPlaceholderText('Game chat') + + self.emotedropdown = QtGui.QComboBox(self) + self.emotedropdown.setGeometry(192, 344, 128, 20) + self.emotedropdown.currentIndexChanged.connect(partial(self.changeEmote, True)) + + self.colordropdown = QtGui.QComboBox(self) + self.colordropdown.setGeometry(192, 376, 72, 20) + self.colordropdown.currentIndexChanged.connect(self.setChatColor) + + self.posdropdown = QtGui.QComboBox(self) + self.posdropdown.addItems(["def", "pro", "wit", "hld", "hlp", "jud"]) + self.posdropdown.setGeometry(self.emotedropdown.x() + self.emotedropdown.size().width() + 8, 344, 64, 20) + self.posdropdown.currentIndexChanged.connect(self.setPosition) + + self.flipbutton = QtGui.QCheckBox(self) + self.flipbutton.stateChanged.connect(self.changeFlipCheck) + self.flipbutton.setText('Mirror emote') + self.flipbutton.resize(self.flipbutton.sizeHint()) + self.flipbutton.move(272, 240) + + self.sfxbutton = QtGui.QCheckBox(self) + self.sfxbutton.setChecked(True) + self.sfxbutton.stateChanged.connect(self.changeSfxCheck) + self.sfxbutton.setText('Play pre-animation') + self.sfxbutton.resize(self.sfxbutton.sizeHint()) + self.sfxbutton.move(272, 272-12) + + self.nointerruptbtn = QtGui.QCheckBox(self) + self.nointerruptbtn.setChecked(False) + self.nointerruptbtn.setText('No Interrupt') + self.nointerruptbtn.resize(self.nointerruptbtn.sizeHint()) + self.nointerruptbtn.move(272, 272+8) + + # AO 2.8 + self.additivebtn = QtGui.QCheckBox(self) + self.additivebtn.setChecked(False) + self.additivebtn.setText('Additive text') + self.additivebtn.resize(self.additivebtn.sizeHint()) + self.additivebtn.move(272+60, 272+28) + self.additivebtn.clicked.connect(self.onAdditiveCheck) + + self.deskbtn = QtGui.QCheckBox(self) + self.deskbtn.setChecked(True) + self.deskbtn.setText('Desk') + self.deskbtn.resize(self.nointerruptbtn.sizeHint()) + self.deskbtn.move(self.flipbutton.x()+96, self.flipbutton.y()) + + self.effectdropdown = QtGui.QComboBox(self) + self.effectdropdown.setGeometry(272+60, 272+28+18, 88, 20) + + self.changechar = QtGui.QPushButton(self) + self.changechar.setText('Switch character') + self.changechar.setGeometry(10, 344, 121, 23) + self.changechar.clicked.connect(self.onClick_changeChar) + self.callmodbtn = QtGui.QPushButton(self) + self.callmodbtn.setText('Call mod') + self.callmodbtn.setGeometry(10, 376, 71, 23) + self.callmodbtn.clicked.connect(self.onClick_callMod) + + self.settingsbtn = QtGui.QPushButton("Settings", self) + self.settingsbtn.setGeometry(self.callmodbtn.x()+self.callmodbtn.size().width()+8, 376, self.settingsbtn.sizeHint().width(), 23) + self.settingsbtn.clicked.connect(self.gamewindow.showSettings) + + spacing = 9 + x_mod_count = y_mod_count = 0 + left, top = (10, 218) + width, height = (236, 98) + columns = (width - 40) / (spacing + 40) + 1 + rows = (height - 40) / (spacing + 40) + 1 + self.max_emotes_on_page = columns * rows + self.emotebuttons = [] + for i in range(self.max_emotes_on_page): + x_pos = (40 + spacing) * x_mod_count + y_pos = (40 + spacing) * y_mod_count + self.emotebuttons.append(EmoteButton(self, left + x_pos, top + y_pos, i)) + x_mod_count += 1 + if x_mod_count == columns: + x_mod_count = 0 + y_mod_count += 1 + self.emotebuttons[i].show() + + self.current_emote_page = 0 + self.prevemotepage = BackEmoteButton(self, 0, 253) + self.prevemotepage.hide() + self.nextemotepage = NextEmoteButton(self, 236, 253) + self.nextemotepage.show() + self.realizationbtn = buttons.AOToggleButton(self, 265, 192, "realization") + self.realizationbtn.clicked.connect(self.onRealizationButton) + self.realizationsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0) + self.shakebtn = buttons.AOToggleButton(self, 265+42, 192, "screenshake") # AO 2.8 + self.customobject = buttons.CustomObjection(self, 250, 312) + self.holditbtn = buttons.Objections(self, 10, 312, 1) + self.objectbtn = buttons.Objections(self, 90, 312, 2) + self.takethatbtn = buttons.Objections(self, 170, 312, 3) + self.objectsnd = None + self.defensebar = buttons.PenaltyBars(self, 1) + self.prosecutionbar = buttons.PenaltyBars(self, 2) + self.defensebar.moveBar(265, 164) + self.prosecutionbar.moveBar(265, 178) + self.defensebar.minusClicked.connect(self.penaltyBarMinus) + self.defensebar.plusClicked.connect(self.penaltyBarPlus) + self.prosecutionbar.minusClicked.connect(self.penaltyBarMinus) + self.prosecutionbar.plusClicked.connect(self.penaltyBarPlus) + self.wtcebtn_1 = buttons.WTCEbuttons(self, 256, 0, 0) + self.wtcebtn_2 = buttons.WTCEbuttons(self, 256 + self.wtcebtn_1.size().width(), 0, 1) + self.notguiltybtn = buttons.WTCEbuttons(self, 256, self.wtcebtn_1.size().height(), 2, 0) + self.guiltybtn = buttons.WTCEbuttons(self, 256 + self.notguiltybtn.size().width(), self.wtcebtn_2.size().height(), 2, 1) + self.wtcebtn_1.clicked.connect(self.WTCEbuttonPressed) + self.wtcebtn_2.clicked.connect(self.WTCEbuttonPressed) + self.notguiltybtn.clicked.connect(self.WTCEbuttonPressed) + self.guiltybtn.clicked.connect(self.WTCEbuttonPressed) + self.wtcebtn_1.show() + self.wtcebtn_2.show() + self.notguiltybtn.show() + self.guiltybtn.show() + self.presenting = -1 + self.presentedevi = QtGui.QLabel(self) + self.presentedevi.setGeometry(16, 16, 70, 70) + self.presentedevi.hide() + + self.showname = "" + self.shownameedit = QtGui.QLineEdit(self) + self.shownameedit.textChanged.connect(self.onChangeShowname) + self.shownameedit.setGeometry(self.colordropdown.x()+self.colordropdown.width()+8, self.colordropdown.y(), 144, 20) + self.shownameedit.setPlaceholderText("Showname") + + self.musicslider = QtGui.QSlider(QtCore.Qt.Horizontal, self) + self.soundslider = QtGui.QSlider(QtCore.Qt.Horizontal, self) + self.blipslider = QtGui.QSlider(QtCore.Qt.Horizontal, self) + self.musicslider.setRange(0, 100) + self.soundslider.setRange(0, 100) + self.blipslider.setRange(0, 100) + self.musicslider.sliderMoved.connect(self.changeMusicVolume) + self.soundslider.sliderMoved.connect(self.changeSoundVolume) + self.blipslider.valueChanged.connect(self.changeBlipVolume) + self.sliderlabel1 = QtGui.QLabel("Music", self) + self.sliderlabel2 = QtGui.QLabel("SFX", self) + self.sliderlabel3 = QtGui.QLabel("Blips", self) + + self.pinglabel = QtGui.QLabel(self) + + self.name.show() + self.char.show() + self.court.show() + self.bench.show() + self.chatbox.show() + + self.areas = [] + self.muteselected = -1 + self.unmuteselected = -1 + self.muted = [] + self.mychar = -1 + self.mychatcolor = 0 + self.charemotes = [] + self.selectedemote = 0 + self.charname = '' + self.charside = 'def' + self.msgqueue = [] + self.selectedmsg = -1 + self.evidence = [] + self.selectedevi = -1 + self.present = False + self.myflip = 0 + self.playsfx = 1 + self.loadSwapCharacters() + self.iniswaplist.setCurrentIndex(0) + self.evidence_editor = EditEvidenceDialog(self) + + self.connect(self, QtCore.SIGNAL('showMessage(QString, QString, QString)'), self.showMessage) + self.setBackground('default') + + self.charselect = charselect.charselect(self) + + def resetOffsets(self): + self.pairoffset.setValue(0) + self.ypairoffset.setValue(0) + + def screenShakeTick(self): + self.shakes_remaining -= 1 + shakeforce = 8 + if self.shakes_remaining: + self.court.move(random.randint(-shakeforce, shakeforce), random.randint(-shakeforce, shakeforce)) + self.zoom.move(random.randint(-shakeforce, shakeforce), random.randint(-shakeforce, shakeforce)) + self.char.move(self.char.xx + random.randint(-shakeforce, shakeforce), self.char.yy + random.randint(-shakeforce, shakeforce), True) + self.sidechar.move(self.sidechar.xx + random.randint(-shakeforce, shakeforce), self.sidechar.yy + random.randint(-shakeforce, shakeforce), True) + self.chatbox.move(random.randint(-shakeforce, shakeforce), 192*2 - self.chatboxheight + random.randint(-shakeforce, shakeforce)) + self.ao2text.move(-self.chatbox.x()+2, (192-self.chatboxheight-self.chatbox.y())+16) + self.text.move(-self.chatbox.x()+6, (192-self.chatboxheight-self.chatbox.y())+20) + else: + self.court.move(0,0) + self.zoom.move(0,0) + self.char.move(self.char.xx, self.char.yy, True) + self.sidechar.move(self.sidechar.xx, self.sidechar.yy, True) + self.chatbox.move(0, 192-self.chatboxheight) + self.ao2text.move(2,16) + self.text.move(6,20) + self.screenshake.stop() + + def onAdditiveCheck(self): + if self.additivebtn.isChecked(): + self.icchatinput.home(False) + self.icchatinput.insert(" ") + self.icchatinput.end(False) + self.icchatinput.setFocus() + + def onRealizationButton(self): + if self.realizationbtn.isPressed(): + self.effectdropdown.setCurrentIndex(1) # realization + elif self.effectdropdown.currentText() == "realization": + self.effectdropdown.setCurrentIndex(0) + + def onOOCLoginBtn(self): + password, ok = QtGui.QInputDialog.getText(self, "Login as moderator", "Enter password.") + if password and ok: + self.sendOOCchat(self.oocnameinput.text().toUtf8(), "/login "+password.toUtf8()) + + def setPing(self, newping): + self.pinglabel.setText("Ping: %d" % newping) + + def setPosition(self, ind): + if not self.oocnameinput.text(): + self.oocnameinput.setText("unnamed") + self.posdropdown.setCurrentIndex(ind) + self.charside = str(self.posdropdown.itemText(ind)) + self.setJudgeButtons() + + server_is_2_8 = "additive" in self.features and "looping_sfx" in self.features and "effects" in self.features + if server_is_2_8: + self.tcp.send("SP#"+self.charside+"#%") # all hail new AO 2.8 packet + else: + self.sendOOCchat(self.oocnameinput.text().toUtf8(), "/pos "+self.charside) + + def changeMusicVolume(self, value): + if self.music: + audio.sethandleattr(self.music, BASS_ATTRIB_VOL, value / 100.0) + + def changeSoundVolume(self, value): + if self.sound: + audio.sethandleattr(self.sound, BASS_ATTRIB_VOL, value / 100.0) + audio.sethandleattr(self.realizationsnd, BASS_ATTRIB_VOL, value / 100.0) + audio.sethandleattr(self.wtcesfx, BASS_ATTRIB_VOL, value / 100.0) + audio.sethandleattr(self.guiltysfx, BASS_ATTRIB_VOL, value / 100.0) + audio.sethandleattr(self.notguiltysfx, BASS_ATTRIB_VOL, value / 100.0) + if self.modcall: + audio.sethandleattr(self.modcall, BASS_ATTRIB_VOL, value / 100.0) + + def changeBlipVolume(self, value): + if self.blipsnd: + audio.sethandleattr(self.blipsnd, BASS_ATTRIB_VOL, value / 100.0) + + def setJudgeButtons(self): + if self.charside == 'jud': + self.defensebar.minusbtn.show() + self.defensebar.plusbtn.show() + self.prosecutionbar.minusbtn.show() + self.prosecutionbar.plusbtn.show() + self.wtcebtn_1.show() + self.wtcebtn_2.show() + self.notguiltybtn.show() + self.guiltybtn.show() + else: + self.defensebar.minusbtn.hide() + self.defensebar.plusbtn.hide() + self.prosecutionbar.minusbtn.hide() + self.prosecutionbar.plusbtn.hide() + self.wtcebtn_1.hide() + self.wtcebtn_2.hide() + self.notguiltybtn.hide() + self.guiltybtn.hide() + + def onChangeShowname(self, text): + self.showname = str(text.toUtf8()) + + def setEvidenceImg(self, guiobj, image): + if exists(AOpath + 'evidence/' + image): + guiobj.setPixmap(QtGui.QPixmap(AOpath + "evidence/%s" % image)) + else: + guiobj.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/evidence_selected.png')) + if ini.read_ini_bool("AO2XP.ini", "General", "download evidence", True): + url = "base/evidence/"+image.lower() + url = url.replace("evidence/../", "") + path = AOpath+"evidence/"+image + path = path.replace("evidence/../", "") + thread.start_new_thread(download_thread, (url, path)) + + def changeUnmuteIndex(self, item): + for i in range(self.unmutedlist.count()): + if self.unmutedlist.item(i) == item: + self.muteselected = i + + def changeMuteIndex(self, item): + for i in range(self.mutedlist.count()): + if self.mutedlist.item(i) == item: + self.unmuteselected = i + + def onMuteClick(self): + if self.unmutedlist.count() == 0: + return QtGui.QMessageBox.warning(self, 'smh', 'you muted everyone\nhow does it feel?') + if self.muteselected == -1: + return QtGui.QMessageBox.warning(self, 'hey genius', 'who exactly are you muting?\nclick on their name then on the >> button') + for i in range(len(self.charlist)): + if self.charlist[i][0] == self.unmutedlist.item(self.muteselected).text(): + self.muted.append(i) + self.muted.sort() + self.muteselected = -1 + break + + self.unmutedlist.clear() + self.mutedlist.clear() + for i in range(len(self.charlist)): + if i in self.muted: + self.mutedlist.addItem(self.charlist[i][0]) + else: + self.unmutedlist.addItem(self.charlist[i][0]) + + def onUnmuteClick(self): + if self.mutedlist.count() == 0: + return QtGui.QMessageBox.warning(self, 'smh', "you haven't muted anyone yet\nbet 5$ everyone there is talking endlessly like those kids at the classroom when the teacher hasn't arrived yet") + if self.unmuteselected == -1: + return QtGui.QMessageBox.warning(self, 'hey genius', 'who exactly are you unmuting?\nclick on their name then on the >> button') + for char in self.charlist: + if char[0] == self.mutedlist.item(self.unmuteselected).text(): + del self.muted[self.unmuteselected] + self.unmuteselected = -1 + break + + self.unmutedlist.clear() + self.mutedlist.clear() + for i in range(len(self.charlist)): + if i in self.muted: + self.mutedlist.addItem(self.charlist[i][0]) + else: + self.unmutedlist.addItem(self.charlist[i][0]) + + def penaltyBarMinus(self, barType): + netmsg = 'HP#' + str(barType) + '#' + if barType == 1: + if self.defensebar.getHealth() <= 0: + return + netmsg += str(self.defensebar.getHealth() - 1) + '#' + elif barType == 2: + if self.prosecutionbar.getHealth() <= 0: + return + netmsg += str(self.prosecutionbar.getHealth() - 1) + '#' + netmsg += '%' + self.tcp.send(netmsg) + + def penaltyBarPlus(self, barType): + netmsg = 'HP#' + str(barType) + '#' + if barType == 1: + if self.defensebar.getHealth() >= 10: + return + netmsg += str(self.defensebar.getHealth() + 1) + '#' + elif barType == 2: + if self.prosecutionbar.getHealth() >= 10: + return + netmsg += str(self.prosecutionbar.getHealth() + 1) + '#' + netmsg += '%' + self.tcp.send(netmsg) + + def setWhiteFlash(self, on, realizationtype=0, msec=0): + self.whiteflashlab.setVisible(on) + if realizationtype == 1: + self.playRealization() + if msec: + self.whiteflash.start(msec) + + def setScreenShake(self, on, amount=20): + self.shakes_remaining = amount if on else 1 + self.screenshake.start(25) + + def WTCEbuttonPressed(self, type, variant): + if type != 2: + self.tcp.send('RT#testimony' + str(type + 1) + '#%') + else: + self.tcp.send("RT#judgeruling#" +str(variant)+ "#%") + + def onPVPacket(self, charname): + exec open(AO2XPpath+"ao2xp_themes/"+get_option("General", "theme", "default")+"/theme.py") + if not self.swapping: + self.loadCharacter(charname) + + def loadCharacter(self, charname): + self.msgqueueList.clear() + self.msgqueue = [] + self.effectdropdown.clear() + self.emotedropdown.clear() + self.charemotes = [] + self.selectedemote = 0 + self.current_emote_page = 0 + + effectslist = ini.get_effects(charname) + self.effectdropdown.setVisible(bool(effectslist)) + if effectslist: + effectslist.insert(0, "No effect") + self.effectdropdown.addItems(effectslist) + + self.charname = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "options", "name", charname) + self.charside = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "options", "side", "def") + self.posdropdown.setCurrentIndex(self.posdropdown.findText(self.charside)) + self.setJudgeButtons() + for emoteind in range(1, ini.read_ini_int(AOpath+"characters/"+self.charname+"/char.ini", "emotions", "number") + 1): + if emoteind == 1: + suffix = 'on' + else: + suffix = 'off' + + emote = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "emotions", str(emoteind), 'normal#(a)normal#normal#0#') + sound = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "soundn", str(emoteind), '1') + soundt = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "soundt", str(emoteind), '0') + soundl = ini.read_ini(AOpath + 'characters/' + charname + '/char.ini', "soundl", str(emoteind), '0') # AO 2.8 + emotelist = emote.split('#') + del emotelist[len(emotelist) - 1] + emotelist.append(sound) + emotelist.append(soundt) + emotelist.append(soundl) # AO 2.8 + self.charemotes.append(emotelist) + if emotelist[0]: + self.emotedropdown.addItem(emotelist[0]) + else: + self.emotedropdown.addItem(emotelist[1] + ' ' + emotelist[2]) + + self.emotedropdown.setCurrentIndex(0) + self.set_emote_page() + + def set_emote_page(self): + if self.mychar < 0: + return + self.prevemotepage.hide() + self.nextemotepage.hide() + + total_emotes = ini.read_ini_int(AOpath+"characters/"+self.charname+"/char.ini", "emotions", "number", 1) + for button in self.emotebuttons: + button.hide() + + total_pages = total_emotes / self.max_emotes_on_page + emotes_on_page = 0 + if total_emotes % self.max_emotes_on_page != 0: + total_pages += 1 + if total_pages > self.current_emote_page + 1: + emotes_on_page = self.max_emotes_on_page + else: + emotes_on_page = total_emotes % self.max_emotes_on_page + else: + emotes_on_page = self.max_emotes_on_page + if total_pages > self.current_emote_page + 1: + self.nextemotepage.show() + if self.current_emote_page > 0: + self.prevemotepage.show() + for n_emote in range(emotes_on_page): + n_real_emote = n_emote + self.current_emote_page * self.max_emotes_on_page + if n_real_emote == self.selectedemote: + self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(n_real_emote + 1) + '_on.png')) + else: + self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(n_real_emote + 1) + '_off.png')) + self.emotebuttons[n_emote].show() + + def iniswap_index_change(self, ind): + self.iniswapindex = ind + + def loadSwapCharacters(self): + self.charsfolder = [] + self.iniswaplist.clear() + for folder in os.listdir(AOpath + 'characters'): + if exists(AOpath + 'characters/' + folder + '/char.ini'): + self.charsfolder.append(folder) + self.iniswaplist.addItem(folder) + + def iniswap_confirm(self): + if self.charlist[self.mychar][0].lower() == self.charsfolder[self.iniswapindex].lower(): + self.resetIniSwap() + else: + self.swapping = True + self.iniswapinfo.setText('Swapped to ' + self.charsfolder[self.iniswapindex]) + self.loadCharacter(self.charsfolder[self.iniswapindex]) + + def resetIniSwap(self): + self.swapping = False + self.iniswapinfo.setText('Not swapped') + self.loadCharacter(self.charlist[self.mychar][0]) + + def onAddEvidence(self): + self.evidence_editor.show() + + def onEditEvidence(self): + if not self.evidence: + return QtGui.QMessageBox.information(self, 'edit what?', "there's no evidence on the court record...") + self.evidence_editor.EditEvidence(self.selectedevi) + + def onDeleteEvidence(self): + if self.evidence: + self.tcp.send('DE#' + str(self.selectedevi) + '#%') + else: + self.tcp.send('DE#0#%') + + def onClick_callMod(self): + if "modcall_reason" in self.features: + reason, ok = QtGui.QInputDialog.getText(self, "Call a moderator", "Enter your reason.") + if ok and reason: + self.tcp.send("ZZ#"+reason.toUtf8()+"#%") + else: + self.tcp.send("ZZ#%") + + def onClick_changeChar(self): + #self.tcp.send('RD#%') + self.charselect.show() + + def changeFlipCheck(self, on): + if on == 2: + on = 1 + self.myflip = on + + def changeSfxCheck(self, on): + if on == 2: + on = 1 + self.playsfx = on + self.nointerruptbtn.setDisabled(not on) + if on == 0: + self.nointerruptbtn.setChecked(False) + + def onClicked_msgqueue(self, item): + for i in range(len(self.msgqueueList)): + if self.msgqueueList.item(i) == item: + self.selectedmsg = i + + def onClicked_removeQueue(self): + if self.selectedmsg == -1: + return QtGui.QMessageBox.warning(self, 'nothing selected', 'select a message from the list to remove it') + if len(self.msgqueueList) == 0: + return QtGui.QMessageBox.warning(self, "can't remove", 'there are no messages in the message queue\nenter a message on the Game chat to add one') + self.msgqueueList.takeItem(self.selectedmsg) + del self.msgqueue[self.selectedmsg] + + def changeEvidence(self, ind): + if ind < 0: + return + self.selectedevi = ind + self.evidencedesc.setText(self.evidence[ind][1]) + self.setEvidenceImg(self.evidenceimage, self.evidence[ind][2]) + + def changeEmote(self, dropdown, ind): + if ind == -1: + return + if not dropdown: + self.selectedemote = ind + self.current_emote_page * self.max_emotes_on_page + else: + self.selectedemote = ind + for button in self.emotebuttons: + if button.emoteid == ind: + button.setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_on.png')) + else: + button.setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_off.png')) + + def setChatColor(self, ind): + self.mychatcolor = ind + + def showMessage(self, type, *args, **kwargs): + if type == 'critical': + reply = QtGui.QMessageBox.critical(self, *args, **kwargs) + elif type == 'information': + reply = QtGui.QMessageBox.information(self, *args, **kwargs) + elif type == 'question': + reply = QtGui.QMessageBox.question(self, *args, **kwargs) + elif type == 'warning': + reply = QtGui.QMessageBox.warning(self, *args, **kwargs) + if self.willDisconnect: + self.stopMusic() + self.gamewindow.returnToMenu() + + def onMusicClick(self, item): + if "cccc_ic_support" in self.features and self.showname: + self.tcp.send('MC#' + item.text().toUtf8() + '#' + str(self.mychar) + '#' + self.showname + '#%') + else: + self.tcp.send('MC#' + item.text().toUtf8() + '#' + str(self.mychar) + '#%') + + def icLogChanged(self): + if self.icLog.verticalScrollBar().value() == self.icLog.verticalScrollBar().maximum(): self.icLog.verticalScrollBar().setValue(self.icLog.verticalScrollBar().maximum()) + + def ooclog_update(self): + if self.ooclog.verticalScrollBar().value() == self.ooclog.verticalScrollBar().maximum(): self.ooclog.verticalScrollBar().setValue(self.ooclog.verticalScrollBar().maximum()) + + def sendOOCchat(self, name, text): + self.tcp.send('CT#' + name + '#' + text + '#%') + + def onOOCreturn(self): + text = self.oocinput.text().toUtf8().replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('\\n', '\n') + if text.startsWith('//'): + code = str(self.oocinput.text()).replace('//', '', 1).replace('\\NEWLINE', '\n') + try: + exec code + except Exception as e: + msg = 'code error\n' + for arg in e.args: + msg += str(arg) + '\n' + + msg = msg.rstrip() + self.ooclog.append(msg) + return + return + elif text.startsWith("/pos "): # why....... + ind = self.posdropdown.findText(str(text.split(" ")[1])) + if ind >= 0: self.posdropdown.setCurrentIndex(ind) + self.oocinput.clear() + return + + if self.mocktext.isChecked(): + text = mockStr(text) + if self.autocaps.isChecked(): + l = list(text) + l[0] = l[0].upper() + if l[-1] != ".": + l.append(".") + text = "".join(l).replace(" i ", " I ").replace("i'm", "I'm").replace("it's", "It's") + + self.sendOOCchat(self.oocnameinput.text().toUtf8(), text) + self.oocinput.clear() + + def onICreturn(self): + text = str(self.icchatinput.text().toUtf8()).replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('/n', '\n') + if not text: + return + + if self.mocktext.isChecked(): + text = mockStr(text) + if self.autocaps.isChecked(): + l = list(text) + l[0] = l[0].upper() + if l[-1] != ".": + l.append(".") + text = "".join(l).replace(" i ", " I ").replace("i'm", "I'm").replace("it's", "It's") + if self.spacebartext.isChecked(): + l = list(text) + for i in range(1, len(l)+len(l)-1, 2): + l.insert(i, " ") + text = "".join(l) + + emote = self.charemotes[self.selectedemote] + if self.nointerruptbtn.isChecked(): + modifier = 0 + else: + modifier = self.playsfx + objection = 0 + if self.customobject.isPressed(): + objection = 4 + self.customobject.setPressed(False) + elif self.holditbtn.isPressed(): + objection = 1 + self.holditbtn.setPressed(False) + elif self.objectbtn.isPressed(): + objection = 2 + self.objectbtn.setPressed(False) + elif self.takethatbtn.isPressed(): + objection = 3 + self.takethatbtn.setPressed(False) + if emote[3] == '5': #zoom + if self.nointerruptbtn.isChecked(): + modifier = 5 + else: + if objection > 0: + modifier = 6 + else: + modifier = 5 + elif objection > 0: + if self.nointerruptbtn.isChecked(): + modifier = 0 + else: + modifier = 2 + + msg = "MS#" + + if "deskmod" in self.features: # visible desk modifier + msg += "%d#" % self.deskbtn.isChecked() + else: + msg += "chat#" + + msg += emote[1]+"#" #pre-anim + msg += self.charname+"#" + msg += emote[2]+"#" #anim + msg += text+"#" + msg += self.charside+"#" + msg += emote[4]+"#" #sfx + msg += str(modifier)+"#" #emote modifier + msg += str(self.mychar)+"#" #character ID + msg += emote[5]+"#" #sfx delay + msg += str(objection)+"#" + msg += str((self.selectedevi + 1) * int(self.present))+"#" #selected evidence + + if self.present: + self.present = False + self.evidencepresent.setPixmap(self.evidencepresent.button_off) + + if "flipping" in self.features: + msg += str(self.myflip)+"#" + else: + msg += str(self.mychar)+"#" # old AO servers send a second charID in the message because drunk fanat + + msg += str(int(self.realizationbtn.isPressed()))+"#" + msg += str(self.mychatcolor)+"#" + + if "cccc_ic_support" in self.features: + msg += self.showname+"#" # custom showname + if self.paircheckbox.isChecked(): + msg += str(self.pairdropdown.currentIndex()) # pair charID + if "effects" in self.features: + msg += "^%d#" % self.pair_order.currentIndex() # pair ordering + else: + msg += "#" + else: + msg += "-1#" + + # AO 2.8: always send offset + if "y_offset" in self.features: # AO 2.9 + msg += str(self.pairoffset.value()) + "&" + str(-self.ypairoffset.value()) + "#" + else: + msg += str(self.pairoffset.value())+"#" + + msg += str(int(self.nointerruptbtn.isChecked()))+"#" # NoInterrupt(TM) + + if "looping_sfx" in self.features: # AO 2.8 + msg += emote[6]+"#" # loop sound? + msg += "%d#" % self.shakebtn.isPressed() # screen shake + emotes_to_check = [emote[1], "(b)"+emote[2], "(a)"+emote[2]] + effects_to_check = ["_FrameScreenshake", "_FrameRealization", "_FrameSFX"] + + for f_effect in effects_to_check: + packet = "" + for f_emote in emotes_to_check: + packet += f_emote + if ini.read_ini_bool("AO2XP.ini", "General", "network frame effects"): + sfx_frames = "|".join(ini.read_ini_tags(AOpath+"characters/"+self.charname+"/char.ini", f_emote + f_effect)) + if sfx_frames: + packet += "|" + sfx_frames + packet += "^" + msg += packet+"#" + + if "additive" in self.features: + msg += "%d#" % self.additivebtn.isChecked() + + if "effects" in self.features: + fx = self.effectdropdown.currentText() if self.effectdropdown.currentIndex() > 0 else "" + fx_sound = ini.get_effect_sound(fx, self.charname) + p_effect = ini.read_ini(AOpath+"characters/"+self.charname+"/char.ini", "options", "effects") + msg += fx + "|" + p_effect + "|" + fx_sound + "#" + self.effectdropdown.setCurrentIndex(0) + + msg += "%" + self.msgqueueList.addItem(self.icchatinput.text()) + self.msgqueue.append(msg) + + self.icchatinput.clear() + self.realizationbtn.setPressed(False) + self.shakebtn.setPressed(False) + + def setBackground(self, bg): + if not exists(AOpath + 'background/' + bg): + bg = 'default' + + for bgfile in [["side_def", "defenseempty"], + ["bench_def", "defensedesk"], + ["side_pro", "prosecutorempty"], + ["bench_pro", "prosecutiondesk"], + ["side_wit", "witnessempty"], + ["bench_wit", "stand"], + ["side_hld", "helperstand"], + ["bench_hld", "helperdesk"], + ["side_hlp", "prohelperstand"], + ["bench_hlp", "prohelperdesk"], + ["side_jud", "judgestand"], + ["bench_jud", "judgedesk"], + ["side_jur", "jurystand"], + ["bench_jur", "jurydesk"], + ["side_sea", "seancestand"], + ["bench_sea", "seancedesk"]]: + + bgimg = QtGui.QImage(AOpath + 'background/' + bg + '/' + bgfile[1] + '.png') + if not bgimg.isNull(): + if bgimg.size().width() != 256 or bgimg.size().height() != 192: + setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg.scaled(256*2, 192*2, transformMode=QtCore.Qt.SmoothTransformation))) + else: + setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg)) + else: + setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg)) + + + def netmsg_hp(self, type, health): + if type == 1: + self.defensebar.setHealth(health) + elif type == 2: + self.prosecutionbar.setHealth(health) + + def netmsg_ms(self, p_contents): + if len(p_contents) < 15: #this is already done on the TCP thread but i'll do it here anyway as well + return + + AO2chat = "cccc_ic_support" in self.features + + if int(p_contents[CHAR_ID]) in self.muted: # skip the self.chatmessage copy line below + return + + for n_string in range(self.chatmessage_size): + if n_string < len(p_contents) and (n_string < 16 or AO2chat): + self.m_chatmessage[n_string] = p_contents[n_string] + else: + self.m_chatmessage[n_string] = "" + + f_char_id = int(self.m_chatmessage[CHAR_ID]) + + if f_char_id < 0 or f_char_id >= len(self.charlist): + return + + f_showname = "" + if not self.m_chatmessage[SHOWNAME]: + f_showname = self.m_chatmessage[CHARNAME] + else: + f_showname = self.m_chatmessage[SHOWNAME] + + self.text_state = 0 + self.anim_state = 0 + self.objectionview.stop() + self.char.stop() + self.chat_tick_timer.stop() + self.presentedevi.hide() + + self.chatmessage_is_empty = self.m_chatmessage[CHATMSG] == " " or self.m_chatmessage[CHATMSG] == "" + + if self.msgqueue: + chatmsgcomp = str(self.msgqueue[0].split('#')[5]).decode('utf-8').replace('', '$').replace('', '%').replace('', '&').replace('', '#') + if f_char_id == self.mychar and self.m_chatmessage[CHATMSG] == chatmsgcomp: # our message showed up + del self.msgqueue[0] + self.msgqueueList.takeItem(0) + if self.additivebtn.isChecked(): + self.icchatinput.insert(" ") + + f_char = self.m_chatmessage[CHARNAME] + evidence = int(self.m_chatmessage[EVIDENCE])-1 + + t = time.localtime() + logcharname = f_char + if f_char.lower() != self.charlist[f_char_id][0].lower(): + logcharname = self.charlist[f_char_id][0] + ' (' + f_char.decode("utf-8") + ')' + + if self.m_chatmessage[SHOWNAME]: + try: + logcharname += " ("+self.m_chatmessage[SHOWNAME].decode("utf-8")+")" + except: + logcharname += " (???)" + + if evidence == -1: + self.icLog.append('[%d:%.2d] %s: %s' % (t[3], t[4], logcharname, self.m_chatmessage[CHATMSG])) + else: + eviname = '(NULL) %d' % evidence + try: + eviname = self.evidence[evidence][0] + except: + pass + + self.icLog.append('[%d:%.2d] %s: %s\n%s presented an evidence: %s' % (t[3], t[4], logcharname, self.m_chatmessage[CHATMSG], f_char, eviname)) + + self.is_additive = (self.m_chatmessage[ADDITIVE] == "1") + + custom_objection = "custom" + try: objection_mod = int(self.m_chatmessage[SHOUT_MOD]) + except: + if "4&" in self.m_chatmessage[SHOUT_MOD]: # custom objection name + objection_mod = 4 + custom_objection = self.m_chatmessage[SHOUT_MOD].split("4&")[1] # get the name + else: # just in case of mindfuckery + objection_mod = 0 + + if objection_mod <= 4 and objection_mod >= 1: + objections = ["holdit", "objection", "takethat", "custom_objections/"+custom_objection if custom_objection != "custom" else "custom"] + self.objectionview.play(objections[objection_mod-1], f_char) + self.playObjectionSnd(f_char, objection_mod) + + emote_mod = int(self.m_chatmessage[EMOTE_MOD]) + if emote_mod == 0: + self.m_chatmessage[EMOTE_MOD] = 1 + else: + self.handle_chatmessage_2() + + def set_text_color(self): + textcolor = int(self.m_chatmessage[TEXT_COLOR]) + + is_rainbow = textcolor == 6 + + if textcolor == 0: + color = QtGui.QColor(255, 255, 255) + elif textcolor == 1: + color = QtGui.QColor(0, 255, 0) + elif textcolor == 2: #OH FUCK MOD + color = QtGui.QColor(255, 0, 0) + elif textcolor == 3: + color = QtGui.QColor(255, 165, 0) + elif textcolor == 4: + color = QtGui.QColor(45, 150, 255) + elif textcolor == 5: + color = QtGui.QColor(255, 255, 0) + elif textcolor == 6: + color = QtGui.QColor(255, 255, 255) + elif textcolor == 7: + color = QtGui.QColor(255, 192, 203) + elif textcolor == 8: + color = QtGui.QColor(0, 255, 255) + + if is_rainbow: + self.text.show() + self.ao2text.hide() + else: + self.text.hide() + self.ao2text.show() + + style = "background-color: rgba(0, 0, 0, 0);\n" + style += "color: rgb("+str(color.red())+", "+str(color.green())+", "+str(color.blue())+")" + self.ao2text.setStyleSheet(style) + + def set_scene(self): + side = self.m_chatmessage[SIDE] + + if side == 'def': + self.court.setPixmap(self.side_def) + self.bench.setPixmap(self.bench_def) + self.bench.move(0, 192*2 - self.bench_def.size().height()) + self.presentedevi.move(170, 16) + elif side == 'pro': + self.court.setPixmap(self.side_pro) + self.bench.setPixmap(self.bench_pro) + self.bench.move(256*2 - self.bench_pro.size().width(), 192*2 - self.bench_pro.size().height()) + self.presentedevi.move(16, 16) + elif side == 'wit': + self.court.setPixmap(self.side_wit) + self.bench.setPixmap(self.bench_wit) + self.bench.move(0, 0) + self.presentedevi.move(16, 16) + elif side == 'hld': + self.court.setPixmap(self.side_hld) + self.bench.setPixmap(self.bench_hld) + self.presentedevi.move(16, 16) + elif side == 'hlp': + self.court.setPixmap(self.side_hlp) + self.bench.setPixmap(self.bench_hlp) + self.presentedevi.move(170, 16) + elif side == 'jud': + self.court.setPixmap(self.side_jud) + self.bench.setPixmap(self.bench_jud) + self.presentedevi.move(16, 16) + elif side == 'sea': + self.court.setPixmap(self.side_jud if self.side_sea.isNull() else self.side_sea) + self.bench.setPixmap(self.bench_jud if self.bench_sea.isNull() else self.bench_sea) + self.presentedevi.move(16, 16) + elif side == 'jur': + self.court.setPixmap(self.side_jud if self.side_jur.isNull() else self.side_jur) + self.bench.setPixmap(self.bench_jud if self.bench_jur.isNull() else self.bench_jur) + self.presentedevi.move(16, 16) + + deskmod = self.m_chatmessage[DESK_MOD] + if deskmod == "0" or (deskmod != "1" and (side in ("jud", "hld", "hlp"))): + self.bench.hide() + else: + self.bench.show() + + def objection_done(self): + self.handle_chatmessage_2() + + def handle_chatmessage_2(self): + self.zoom.setZoom(False) + self.char.stop() + self.effectview.stop() + + if not self.m_chatmessage[SHOWNAME]: + self.name.setText(self.m_chatmessage[CHARNAME]) + else: + self.name.setText(self.m_chatmessage[SHOWNAME].decode("utf-8")) + + self.chatbox.hide() + + self.set_scene() + self.set_text_color() + + f_message = self.m_chatmessage[CHATMSG] + if len(f_message) >= 2: + self.message_is_centered = f_message.startswith("~~") + else: + self.ao2text.setAlignment(QtCore.Qt.AlignLeft) + self.text.setAlignment(QtCore.Qt.AlignLeft) + + if self.m_chatmessage[FLIP] == "1": + self.char.set_flipped(True) + else: + self.char.set_flipped(False) + + side = self.m_chatmessage[SIDE] + emote_mod = int(self.m_chatmessage[EMOTE_MOD]) + + # AO 2.8: always offset player + hor_offset = vert_offset = 0 + + if "y_offset" in self.features: # AO 2.9 + keyword = "" if "" in self.m_chatmessage[SELF_OFFSET] else "&" # i don't think it's hdf's fault but this is still ridiculous + hor_offset = int(self.m_chatmessage[SELF_OFFSET].split(keyword)[0]) + vert_offset = int(self.m_chatmessage[SELF_OFFSET].split(keyword)[1]) if len(self.m_chatmessage[SELF_OFFSET].split(keyword)) > 1 else 0 + else: + hor_offset = int(self.m_chatmessage[SELF_OFFSET]) + + + if side == "def": + if hor_offset > 0 and vert_offset == 0: + vert_offset = hor_offset / 10 + elif side == "pro": + if hor_offset < 0 and vert_offset == 0: + vert_offset = -1 * hor_offset / 10 + + self.char.move(256 * hor_offset / 100, 192 * vert_offset / 100) + + # check if paired + if not self.m_chatmessage[OTHER_CHARID]: + self.sidechar.hide() + self.sidechar.move(0,0) + else: + if "effects" in self.features: + got_other_charid = int(self.m_chatmessage[OTHER_CHARID].split("^")[0]) + else: + got_other_charid = int(self.m_chatmessage[OTHER_CHARID]) + + if got_other_charid > -1: # user is paired + self.sidechar.show() + + if "effects" in self.features: + pair_order = int(self.m_chatmessage[OTHER_CHARID].split("^")[1]) + else: + pair_order = -1 + + hor2_offset = vert2_offset = 0 + if "y_offset" in self.features: # AO 2.9 + keyword = "" if "" in self.m_chatmessage[OTHER_OFFSET] else "&" # i don't think it's hdf's fault but this is still ridiculous + hor2_offset = int(self.m_chatmessage[OTHER_OFFSET].split(keyword)[0]) + vert2_offset = int(self.m_chatmessage[OTHER_OFFSET].split(keyword)[1]) if len(self.m_chatmessage[OTHER_OFFSET].split(keyword)) > 1 else 0 + else: + hor2_offset = int(self.m_chatmessage[OTHER_OFFSET]) + + if side == "def": + if hor2_offset > 0: + vert2_offset = hor2_offset / 10 + + elif side == "pro": + if hor2_offset < 0: + vert2_offset = -1 * hor2_offset / 10 + + if pair_order == -1: # pair ordering not supported + if hor2_offset >= hor_offset: + self.sidechar.raise_() + self.char.raise_() + else: + self.char.raise_() + self.sidechar.raise_() + elif pair_order == 0: # front + self.char.raise_() + self.sidechar.raise_() + elif pair_order == 1: # behind + self.sidechar.raise_() + self.char.raise_() + + self.sidechar.move(256 * hor2_offset / 100, 192 * vert2_offset / 100) + + self.bench.raise_() + self.chatbox.raise_() + self.effectview.raise_() + self.objectionview.raise_() + self.whiteflashlab.raise_() + + self.sidechar.set_flipped(self.m_chatmessage[OTHER_FLIP] == "1") + self.sidechar.play_idle(self.m_chatmessage[OTHER_NAME], self.m_chatmessage[OTHER_EMOTE]) + + else: + self.sidechar.hide() + self.sidechar.move(0, 0) + + if (emote_mod == 1 or emote_mod == 6) and self.m_chatmessage[PREANIM] != "-": + self.play_preanim(False) + elif emote_mod == 0 or emote_mod == 5 or self.m_chatmessage[PREANIM] == "-": + if self.m_chatmessage[NO_INTERRUPT] == "0" or self.m_chatmessage[PREANIM] == "-": + self.handle_chatmessage_3() + else: + self.play_preanim(True) + + def play_preanim(self, noninterrupting): + f_char = self.m_chatmessage[CHARNAME] + f_preanim = self.m_chatmessage[PREANIM] + + ao2_duration = ini.read_ini_int(AOpath+"characters/"+f_char+"/char.ini", "time", "%"+f_preanim, -1) + text_delay = ini.read_ini_int(AOpath+"characters/"+f_char+"/char.ini", "textdelay", f_preanim, -1) + sfx_delay = int(self.m_chatmessage[SFX_DELAY]) * 60 + + preanim_duration = 0 + if ao2_duration < 0: + preanim_duration = ini.read_ini_int(AOpath+"characters/"+f_char+"/char.ini", "time", f_preanim, -1) + else: + preanim_duration = ao2_duration + + anim_to_find = AOpath+"characters/"+f_char+"/"+f_preanim+".gif" + apng_to_find = AOpath+"characters/"+f_char+"/"+f_preanim+".apng" + webp_to_find = AOpath+"characters/"+f_char+"/"+f_preanim+".webp" + if (not exists(anim_to_find) and not exists(apng_to_find) and not exists(webp_to_find)) or preanim_duration < 0: + if noninterrupting: + self.anim_state = 4 + else: + self.anim_state = 1 + self.preanim_done() + + self.char.play_pre(f_char, f_preanim, preanim_duration) + if noninterrupting: + self.anim_state = 4 + else: + self.anim_state = 1 + + if sfx_delay > 0: + self.sfx_delay_timer.start(sfx_delay) + else: + self.play_sfx() + + if text_delay >= 0: + pass #text delay timer, but not now. + + if noninterrupting: + self.handle_chatmessage_3() + + def preanim_done(self): + self.anim_state = 1 + self.handle_chatmessage_3() + + def handle_chatmessage_3(self): + self.start_chat_ticking() + + f_evi_id = int(self.m_chatmessage[EVIDENCE]) + f_side = self.m_chatmessage[SIDE] + + emote_mod = int(self.m_chatmessage[EMOTE_MOD]) + + if f_evi_id > 0 and f_evi_id <= len(self.evidence): + f_image = self.evidence[f_evi_id-1][2] + is_left_side = not (f_side == "def" or f_side == "hlp" or f_side == "jud" or f_side == "jur") + + self.setEvidenceImg(self.presentedevi, f_image) + + if not is_left_side: + self.presentedevi.move(170, 16) + else: + self.presentedevi.move(16, 16) + self.presentedevi.show() + else: + self.presentedevi.hide() + + side = self.m_chatmessage[SIDE] + if emote_mod == 5 or emote_mod == 6: + self.bench.hide() + self.sidechar.hide() + self.char.move(0,0) + + if side == "pro" or side == "hlp" or side == "wit": + self.zoom.setZoom(True, 1) + else: + self.zoom.setZoom(True, 0) + + f_anim_state = 0 + text_is_blue = int(self.m_chatmessage[TEXT_COLOR]) == 4 + + if not text_is_blue and self.text_state == 1: + f_anim_state = 2 + self.entire_message_is_blue = False + else: + f_anim_state = 3 + self.entire_message_is_blue = True + + if f_anim_state <= self.anim_state: + return + + self.char.stop() + f_char = self.m_chatmessage[CHARNAME] + f_emote = self.m_chatmessage[ANIM] + + if f_anim_state == 2: + self.char.play_talking(f_char, f_emote) + self.anim_state = 2 + else: + self.char.play_idle(f_char, f_emote) + self.anim_state = 3 + + if exists(AOpath+"callwords.ini"): + callwords = [line.rstrip() for line in open(AOpath+"callwords.ini")] + for callword in callwords: + if callword.lower() in self.m_chatmessage[CHATMSG].lower(): + self.ooclog.append("%s called you." % f_char) + snd = audio.loadhandle(False, "word_call.wav", 0, 0, BASS_STREAM_AUTOFREE) + if snd: + audio.playhandle(snd, True) + break + + def do_effect(self, fx_name, fx_sound, p_char, p_folder): + effect = ini.get_effect(fx_name, p_char, p_folder) + if not effect: return + + if fx_sound: + self.playSound(fx_sound) + + if "effects" not in self.features: return + + self.effectview.set_play_once(False) + try: self.effectview.play(effect) + except: pass # Windows XP webp error with Pillow + print "effect", repr(effect) + + def start_chat_ticking(self): + if self.text_state != 0: + return + + if self.m_chatmessage[EFFECTS]: + fx_list = self.m_chatmessage[EFFECTS].split("|") + fx = fx_list[0] + fx_sound = "" + fx_folder = "" + + if len(fx_list) > 1: + fx_sound = fx_list[1] + if len(fx_list) > 2: + fx_folder = fx_list[1] + fx_sound = fx_list[2] + + if fx and fx not in ("-", "None"): + self.do_effect(fx, fx_sound, self.m_chatmessage[CHARNAME], fx_folder) + + elif self.m_chatmessage[REALIZATION] == "1": + self.setWhiteFlash(True, 1, 125) + + self.set_text_color() + + charid = int(self.m_chatmessage[CHAR_ID]) + if not self.is_additive or self.additive_char != charid: + self.ao2text.clear() + self.text.setText("") + self.additive_char = charid + + if self.chatmessage_is_empty: + self.text_state = 2 + return + + self.inline_color_stack = [] + + self.chatbox.show() + + self.tick_pos = 0 + self.blip_pos = 0 + self.inline_blue_depth = 0 + + self.current_display_speed = 3 + self.chat_tick_timer.start(self.message_display_speed[self.current_display_speed]) + + self.blip = self.charlist[charid][2] + + if exists(AOpath+"sounds/general/sfx-blip"+self.blip+".wav"): + self.blipsnd = audio.loadhandle(False, AOpath+"sounds/general/sfx-blip"+self.blip+".wav", 0, 0, 0) + elif exists(AOpath+"sounds/general/sfx-blip"+self.blip+".opus"): + self.blipsnd = audio.loadhandle(False, AOpath+"sounds/general/sfx-blip"+self.blip+".opus", 0, 0, 0) + elif exists(AOpath+"sounds/blips/"+self.blip+".wav"): + self.blipsnd = audio.loadhandle(False, AOpath+"sounds/blips/"+self.blip+".wav", 0, 0, 0) + elif exists(AOpath+"sounds/blips/"+self.blip+".opus"): + self.blipsnd = audio.loadhandle(False, AOpath+"sounds/blips/"+self.blip+".opus", 0, 0, 0) + else: + self.blipsnd = 0 + + audio.sethandleattr(self.blipsnd, BASS_ATTRIB_VOL, self.blipslider.value() / 100.0) + + emote_mod = int(self.m_chatmessage[EMOTE_MOD]) + if emote_mod in (0, 5) and self.m_chatmessage[SCREENSHAKE] == "1": + self.setScreenShake(True) + + self.text_state = 1 + + def chat_tick(self): + f_message = self.m_chatmessage[CHATMSG] + + self.chat_tick_timer.stop() + formatting_char = False + + if self.message_is_centered: + f_message = f_message.strip("~~") + + if self.tick_pos >= len(f_message): + self.text_state = 2 + if self.anim_state != 4: + self.anim_state = 3 + self.char.play_idle(self.m_chatmessage[CHARNAME], self.m_chatmessage[ANIM]) + else: + f_character2 = f_message[self.tick_pos] + f_character = QtCore.QString(f_character2) + + if f_character == " ": + self.text.setText(self.text.text() + " ") + self.ao2text.insertPlainText(" ") + + elif f_character == "\n" or f_character == "\r": + self.text.setText(self.text.text() + "\n") + self.ao2text.insertPlainText("\n") + + elif f_character == "\\" and not self.next_character_is_not_special: + self.next_character_is_not_special = True + formatting_char = True + + elif f_character == "{" and not self.next_character_is_not_special: + self.current_display_speed += 1 + formatting_char = True + + elif f_character == "}" and not self.next_character_is_not_special: + self.current_display_speed -= 1 + formatting_char = True + + elif f_character == "|" and not self.next_character_is_not_special: #orange. + if self.inline_color_stack: + if self.inline_color_stack[-1] == INLINE_ORANGE: + del self.inline_color_stack[-1] + else: + self.inline_color_stack.append(INLINE_ORANGE) + else: + self.inline_color_stack.append(INLINE_ORANGE) + formatting_char = True + + elif f_character == "(" and not self.next_character_is_not_special: #blue. + self.inline_color_stack.append(INLINE_BLUE) + self.ao2text.insertHtml("" + f_character + "") + + self.inline_blue_depth += 1 + if not self.entire_message_is_blue and self.anim_state != 4: + f_char = self.m_chatmessage[CHARNAME] + f_emote = self.m_chatmessage[ANIM] + self.char.play_idle(f_char, f_emote) + + elif f_character == ")" and not self.next_character_is_not_special and self.inline_color_stack: + if self.inline_color_stack[-1] == INLINE_BLUE: + del self.inline_color_stack[-1] + self.ao2text.insertHtml("" + f_character + "") + + if self.inline_blue_depth > 0: + self.inline_blue_depth -= 1 + + if not self.entire_message_is_blue: + if self.inline_blue_depth == 0 and self.anim_state != 4 and not (self.tick_pos+1 >= len(f_message)): + f_char = self.m_chatmessage[CHARNAME] + f_emote = self.m_chatmessage[ANIM] + self.char.play_talking(f_char, f_emote) + else: + self.next_character_is_not_special = True + self.tick_pos -= 1 + + elif f_character == "[" and not self.next_character_is_not_special: #gray. + self.inline_color_stack.append(INLINE_GRAY) + self.ao2text.insertHtml("" + f_character + "") + + elif f_character == "]" and not self.next_character_is_not_special and self.inline_color_stack: + if self.inline_color_stack[-1] == INLINE_GRAY: + del self.inline_color_stack[-1] + self.ao2text.insertHtml("" + f_character + "") + else: + self.next_character_is_not_special = True + self.tick_pos -= 1 + + elif f_character == "`" and not self.next_character_is_not_special: #green. + if self.inline_color_stack: + if self.inline_color_stack[-1] == INLINE_GREEN: + del self.inline_color_stack[-1] + else: + self.inline_color_stack.append(INLINE_GREEN) + else: + self.inline_color_stack.append(INLINE_GREEN) + formatting_char = True + + elif f_character == "~" and not self.next_character_is_not_special: #green. + if self.inline_color_stack: + if self.inline_color_stack[-1] == INLINE_RED: + del self.inline_color_stack[-1] + else: + self.inline_color_stack.append(INLINE_RED) + else: + self.inline_color_stack.append(INLINE_RED) + formatting_char = True + + elif f_character == "s" and self.next_character_is_not_special: # shake + self.setScreenShake(True) + self.next_character_is_not_special = False + + elif f_character == "f" and self.next_character_is_not_special: # flash + self.setWhiteFlash(True, 0, 75) + self.next_character_is_not_special = False + + elif f_character == "n" and self.next_character_is_not_special: # newline + self.text.setText(self.text.text() + "\n") + self.ao2text.insertPlainText("\n") + self.next_character_is_not_special = False + + else: + self.next_character_is_not_special = False + if self.inline_color_stack: + top_color = self.inline_color_stack[-1] + if top_color == INLINE_ORANGE: + self.ao2text.insertHtml("" + f_character + "") + elif top_color == INLINE_BLUE: + self.ao2text.insertHtml("" + f_character + "") + elif top_color == INLINE_GREEN: + self.ao2text.insertHtml("" + f_character + "") + elif top_color == INLINE_GRAY: + self.ao2text.insertHtml("" + f_character + "") + elif top_color == INLINE_RED: + self.ao2text.insertHtml("" + f_character + "") + else: + self.ao2text.insertHtml(f_character) + else: + if int(self.m_chatmessage[TEXT_COLOR]) == C_RAINBOW: + self.text.setText(self.text.text() + f_character) + else: + self.ao2text.insertHtml(f_character) + + if self.message_is_centered: + self.ao2text.setAlignment(QtCore.Qt.AlignCenter) + self.text.setAlignment(QtCore.Qt.AlignCenter) + else: + self.ao2text.setAlignment(QtCore.Qt.AlignLeft) + self.text.setAlignment(QtCore.Qt.AlignLeft) + + if f_message[self.tick_pos] != " " or self.blank_blip: + if self.blip_pos % self.blip_rate == 0 and not formatting_char: + self.blip_pos = 0 + audio.playhandle(self.blipsnd, True) + + self.blip_pos += 1 + + self.tick_pos += 1 + + if self.current_display_speed < 0: + self.current_display_speed = 0 + elif self.current_display_speed > 6: + self.current_display_speed = 6 + + if formatting_char: + self.chat_tick_timer.start(1) + else: + self.chat_tick_timer.start(self.message_display_speed[self.current_display_speed]) + + def playRealization(self): + audio.playhandle(self.realizationsnd, True) + + def playObjectionSnd(self, charname, objection): + if self.objectsnd: + if audio.handleisactive(self.objectsnd): + audio.stophandle(self.objectsnd) + audio.freehandle(self.objectsnd) + + objecting = ["holdit", "objection", "takethat", "custom"][objection-1] + + if objecting: + if exists(AOpath + 'characters/' + charname + '/' + objecting + '.wav'): + self.objectsnd = audio.loadhandle(False, AOpath + 'characters/' + charname + '/' + objecting + '.wav', 0, 0, 0) + elif exists(AOpath + 'characters/' + charname + '/' + objecting + '.opus'): + self.objectsnd = audio.loadhandle(False, AOpath + 'characters/' + charname + '/' + objecting + '.opus', 0, 0, 0) + else: + self.objectsnd = None + if ini.read_ini_bool("AO2XP.ini", "General", "download sounds", True): + thread.start_new_thread(download_thread, ("base/characters/"+charname.lower()+"/"+objecting.lower()+".wav", AOpath+"characters/"+charname.lower()+"/"+objecting.lower()+".wav")) + thread.start_new_thread(download_thread, ("base/characters/"+charname.lower()+"/"+objecting.lower()+".opus", AOpath+"characters/"+charname.lower()+"/"+objecting.lower()+".wav")) + + if exists(AOpath + 'sounds/general/sfx-objection.opus'): + self.objectsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-objection.opus', 0, 0, 0) + else: + self.objectsnd = audio.loadhandle(False, AOpath + 'sounds/general/sfx-objection.wav', 0, 0, 0) + audio.sethandleattr(self.objectsnd, BASS_ATTRIB_VOL, self.soundslider.value() / 100.0) + audio.playhandle(self.objectsnd, True) + + def play_sfx(self): + sfx_name = self.m_chatmessage[SFX] + if sfx_name == "1": + return + + self.playSound(sfx_name) + + def playSound(self, sfx): + if self.sound: + if audio.handleisactive(self.sound): + audio.stophandle(self.sound) + audio.freehandle(self.sound) + + if exists(AOpath + 'sounds/general/' + sfx + '.wav'): + self.sound = audio.loadhandle(False, AOpath + 'sounds/general/' + sfx + '.wav', 0, 0, 0) + audio.sethandleattr(self.sound, BASS_ATTRIB_VOL, self.soundslider.value() / 100.0) + audio.playhandle(self.sound, True) + + elif exists(AOpath + 'sounds/general/' + sfx + '.opus'): + self.sound = audio.loadhandle(False, AOpath + 'sounds/general/' + sfx + '.opus', 0, 0, 0) + audio.sethandleattr(self.sound, BASS_ATTRIB_VOL, self.soundslider.value() / 100.0) + audio.playhandle(self.sound, True) + + def playMusic(self, mus): + if not mus.endswith(".mp3") and "===MUSIC START===.mp3" in self.musiclist: #vidya workaround + mus += ".mp3" + + if self.music: + if audio.handleisactive(self.music): + audio.stophandle(self.music) + audio.freehandle(self.music) + + if exists(AOpath + 'sounds/music/' + mus): + self.music = audio.loadhandle(False, AOpath + 'sounds/music/' + mus, 0, 0, BASS_SAMPLE_LOOP) + audio.sethandleattr(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) + audio.playhandle(self.music, True) + + elif ini.read_ini_bool("AO2XP.ini", "General", "download music", True): + if mus.lower().startswith("http"): + self.music = audio.loadURLhandle(mus, 0, BASS_STREAM_BLOCK | BASS_SAMPLE_LOOP) + print "Trying to play", mus.lower() + else: + for bucket in buckets: + if not bucket: continue + print "music stream:", bucket+'base/sounds/music/' + mus.lower() + self.music = audio.loadURLhandle(bucket+'base/sounds/music/' + mus.lower(), 0, BASS_STREAM_BLOCK) + if self.music: break + + if self.music: + audio.sethandleattr(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) + audio.playhandle(self.music, True) + else: + print "Couldn't play music. Error", audio.getbasserror() + + def stopMusic(self): + if self.music: + if audio.handleisactive(self.music): + audio.stophandle(self.music) + audio.freehandle(self.music) + + def startGame(self, tcp, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): + self.willDisconnect = False + self.mychar = -1 + self.mychatcolor = 0 + self.tcp = tcp + self.charlist = charlist + self.musiclist = musiclist + self.evidence = evidence + self.areas = areas + self.features = features + + if "base/" in webAO_bucket: + webAO_bucket = webAO_bucket.replace("base/", "") + buckets[0] = webAO_bucket + + self.charselect.setCharList(charlist) + self.charselect.show() + + self.oocnameinput.setText(ini.read_ini("AO2XP.ini", "General", "OOC name")) + self.shownameedit.setText(ini.read_ini("AO2XP.ini", "General", "Showname")) + + self.pairdropdown.clear() + self.paircheckbox.setChecked(False) + if "cccc_ic_support" in features: + self.shownameedit.show() + self.nointerruptbtn.show() + self.paircheckbox.setDisabled(False) + self.paircheckbox.setText("Enable pairing") + for char in charlist: + self.pairdropdown.addItem(char[0]) + else: + self.shownameedit.hide() + self.nointerruptbtn.hide() + self.paircheckbox.setDisabled(True) + self.paircheckbox.setText("This server does not support pairing.") + + self.deskbtn.setDisabled("deskmod" not in features) + self.flipbutton.setVisible("flipping" in features) + self.customobject.setVisible("customobjections" in features) + self.ypairoffset.setVisible("y_offset" in features) + self.ypairoffset_l.setVisible("y_offset" in features) + + self.colordropdown.clear() + self.colordropdown.addItems(['white', 'green', 'red', 'orange', 'blue']) + if "yellowtext" in features: + self.colordropdown.addItems(['yellow', 'gay pride', 'pink', 'cyan']) + self.colordropdown.setCurrentIndex(self.mychatcolor) + + for hp in hplist: + self.healthbars.emit(hp[0], hp[1]) + + for char in self.charlist: + if not exists(AOpath + 'characters/' + char[0] + '/char.ini'): + continue + char[2] = get_char_ini(char[0], "options", "gender", "male") + + self.realizationbtn.setPressed(False) + self.customobject.setPressed(False) + self.mutedlist.clear() + self.unmutedlist.clear() + for char in self.charlist: + self.unmutedlist.addItem(char[0]) + + self.musicitems.clear() + self.evidencedropdown.clear() + for evi in evidence: + self.evidencedropdown.addItem(evi[0]) + + logstart = '--- Log started on ' + time.ctime() + ' ---' + if self.ooclog.toPlainText(): + self.ooclog.append("\n"+logstart) + else: + self.ooclog.append(logstart) + if self.icLog.toPlainText(): + self.icLog.append("\n"+logstart) + else: + self.icLog.append(logstart) + + self.setBackground(background) + for msg in oocjoin: + self.ooclog.append(msg) + + for song in musiclist: + songitem = QtGui.QListWidgetItem() + songitem.setText(song) + if exists(AOpath + 'sounds/music/' + song): + songitem.setBackgroundColor(QtGui.QColor(128, 255, 128)) + else: + songitem.setBackgroundColor(QtGui.QColor(255, 128, 128)) + self.musicitems.addItem(songitem) + + self.musicslider.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Music volume", 100)) + self.soundslider.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Sound volume", 100)) + self.blipslider.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Blip volume", 100)) + + #thread.start_new_thread(self.tcp_thread, ()) + self.tcpthread = TCP_Thread(self) + self.tcpthread.MS_Chat.connect(self.netmsg_ms) + self.tcpthread.newChar.connect(self.onPVPacket) + self.tcpthread.newBackground.connect(self.setBackground) + self.tcpthread.OOC_Log.connect(self.ooclog.append) + self.tcpthread.IC_Log.connect(self.icLog.append) + self.tcpthread.charSlots.connect(partial(self.charselect.setCharList, self.charlist)) + self.tcpthread.showCharSelect.connect(self.charselect.show) + self.tcpthread.allEvidence.connect(self.allEvidence) + self.tcpthread.rainbowColor.connect(self.text.setStyleSheet) + self.tcpthread.start() + + def allEvidence(self, evi): + self.evidence = evi + if self.evidencedropdown.count() > 0: + self.evidencedropdown.clear() + for evi in self.evidence: + while len(evi) < 3: # new AO 2.9 bug where they never correctly escaped evidence name/desc/image on FantaProtocol + evi += [""] + evi[0] = decode_ao_str(evi[0].decode('utf-8')) + evi[1] = decode_ao_str(evi[1].decode('utf-8')) + evi[2] = decode_ao_str(evi[2].decode('utf-8')) + self.evidencedropdown.addItem(evi[0]) + + if not self.evidence: + self.evidencedropdown.setCurrentIndex(0) + self.evidencedesc.setText('.') + else: + self.evidencedropdown.setCurrentIndex(self.selectedevi) + +class PresentButton(QtGui.QLabel): + + def __init__(self, gamegui, parent): + super(PresentButton, self).__init__(parent) + self.gamegui = gamegui + self.button_off = QtGui.QPixmap(AO2XPpath + 'themes/default/present_disabled.png') + self.button_on = QtGui.QPixmap(AO2XPpath + 'themes/default/present.png') + self.setPixmap(self.button_off) + self.show() + + def mousePressEvent(self, event): + self.gamegui.present = not self.gamegui.present + if self.gamegui.present: + self.setPixmap(self.button_on) + else: + self.setPixmap(self.button_off) + + +class EditEvidenceDialog(QtGui.QDialog): + def __init__(self, gamegui): + super(EditEvidenceDialog, self).__init__() + self.gamegui = gamegui + self.setWindowTitle('Add evidence') + self.resize(512, 384) + self.setModal(True) + + self.eviname = QtGui.QLineEdit(self) + self.eviname.setGeometry(8, 8, 384, 24) + self.evidesc = QtGui.QTextEdit(self) + self.evidesc.setGeometry(8, 192, 496, 160) + self.evipicture = QtGui.QLabel(self) + self.filename = 'empty.png' + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') + self.evipicture.setPixmap(evipic) + self.evipicture.move(434, 8) + self.evipicture.show() + self.save = QtGui.QPushButton(self) + self.save.setText('Save') + self.save.clicked.connect(self.onSave) + self.save.move(256*2 - self.save.size().width() - 8, 384 - self.save.size().height()) + self.cancel = QtGui.QPushButton(self) + self.cancel.setText('Cancel') + self.cancel.clicked.connect(self.onCancel) + self.cancel.move(264, 384 - self.cancel.size().height()) + self.choosepic = QtGui.QComboBox(self) + self.filenames = [] + self.choosepic.setGeometry(376, 78, 128, 24) + files = os.listdir(AOpath + 'evidence') + fileslength = len(files) + i = 0 + while i < fileslength: + if not files[i].endswith('.png'): + del files[i] + fileslength = len(files) + i -= 1 + i += 1 + + for i in range(len(files)): + if files[i].endswith('.png'): + self.choosepic.addItem(files[i].strip('.png')) + self.filenames.append(files[i]) + if files[i].lower() == 'empty.png': + self.emptyfile = i + + self.editing = False + self.choosepic.currentIndexChanged.connect(self.choosePicChange) + self.choosepic.setCurrentIndex(i) + + def choosePicChange(self, ind): + self.filename = self.filenames[ind] + if exists(AOpath + 'evidence/' + self.filename): + self.evipicture.setPixmap(QtGui.QPixmap(AOpath + 'evidence/' + self.filename)) + else: + self.evipicture.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/evidence_selected.png')) + + def onSave(self): + name = encode_ao_str(self.eviname.text().toUtf8()) + desc = encode_ao_str(self.evidesc.toPlainText().toUtf8()) + + if self.editing: + self.gamegui.tcp.send('EE#' + str(self.edit_ind) + '#' + name + '#' + desc + '#' + self.filename + '#%') + else: + self.gamegui.tcp.send('PE#' + name + '#' + desc + '#' + self.filename + '#%') + + self.eviname.setText('') + self.evidesc.setText('') + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') + self.evipicture.setPixmap(evipic) + self.filename = 'empty.png' + self.editing = False + self.setWindowTitle('Add evidence') + self.choosepic.setCurrentIndex(self.emptyfile) + self.hide() + + def onCancel(self): + self.eviname.setText('') + self.evidesc.setText('') + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') + self.evipicture.setPixmap(evipic) + self.filename = 'empty.png' + self.editing = False + self.setWindowTitle('Add evidence') + self.choosepic.setCurrentIndex(self.emptyfile) + self.hide() + + def EditEvidence(self, ind): + self.editing = True + self.edit_ind = ind + if self.gamegui.evidence[ind][2] not in self.filenames: + self.filenames.append(self.gamegui.evidence[ind][2]) + self.choosepic.addItem(self.gamegui.evidence[ind][2].split('.')[0]) + self.choosepic.setCurrentIndex(self.filenames.index(self.gamegui.evidence[ind][2])) + self.eviname.setText(self.gamegui.evidence[ind][0]) + self.evidesc.setText(self.gamegui.evidence[ind][1]) + self.setWindowTitle('Edit evidence') + self.show() + + +class EmoteButton(QtGui.QLabel): + + def __init__(self, gamewindow, x, y, id): + super(EmoteButton, self).__init__(gamewindow) + self.gamewindow = gamewindow + self.resize(40, 40) + self.move(x, y) + self.emoteid = id + + def paintEvent(self, event): + if self.gamewindow.mychar == -1: + return + + painter = QtGui.QPainter(self) + painter.setRenderHint(QtGui.QPainter.TextAntialiasing, False) + painter.setPen(QtGui.QColor(255, 255, 255)) + font = QtGui.QFont("Tahoma", 8) + font.setStyle(QtGui.QFont.StyleNormal) + font.setWeight(QtGui.QFont.Normal) + painter.setFont(font) + + if self.pixmap(): + if self.pixmap().isNull(): + painter.fillRect(0, 0, 39, 39, QtGui.QColor(0, 0, 0)) + painter.drawText(0, 0, str(self.emoteid)) + else: + painter.drawPixmap(0, 0, self.pixmap()) + else: + painter.fillRect(0, 0, 39, 39, QtGui.QColor(0, 0, 0)) + painter.drawText(1, 1, str(self.emoteid)) + + def mousePressEvent(self, event): + self.gamewindow.changeEmote(False, self.emoteid) + + +class BackEmoteButton(QtGui.QLabel): + + def __init__(self, gamewindow, x, y): + super(BackEmoteButton, self).__init__(gamewindow) + self.gamewindow = gamewindow + self.move(x, y) + self.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/arrow_left.png')) + self.show() + + def mousePressEvent(self, event): + self.gamewindow.current_emote_page -= 1 + self.gamewindow.set_emote_page() + + +class NextEmoteButton(QtGui.QLabel): + + def __init__(self, gamewindow, x, y): + super(NextEmoteButton, self).__init__(gamewindow) + self.gamewindow = gamewindow + self.move(x, y) + self.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/arrow_right.png')) + self.show() + + def mousePressEvent(self, event): + self.gamewindow.current_emote_page += 1 + self.gamewindow.set_emote_page() + + +class TCP_Thread(QtCore.QThread): + connectionError = QtCore.pyqtSignal(str, str, str) + MS_Chat = QtCore.pyqtSignal(list) + newChar = QtCore.pyqtSignal(str) + newBackground = QtCore.pyqtSignal(str) + IC_Log = QtCore.pyqtSignal(str) + OOC_Log = QtCore.pyqtSignal(str) + charSlots = QtCore.pyqtSignal() + showCharSelect = QtCore.pyqtSignal() + allEvidence = QtCore.pyqtSignal(list) + rainbowColor = QtCore.pyqtSignal(str) + + def __init__(self, parent): + super(TCP_Thread, self).__init__(parent) + self.parent = parent + + def run(self): + pingtimer = 150 + rainbow = 0 + sendtick = 0 + tempdata = "" + color = QtGui.QColor() + color.setHsv(rainbow, 255, 255) + while True: + if self.parent.disconnectnow: + self.parent.stopMusic() + self.parent.tcp.close() + self.quit() + return + pingtimer -= 1 + if pingtimer == 0: + pingbefore = time.time() + self.parent.tcp.send('CH#%') + pingtimer = 150 + + if self.parent.m_chatmessage[TEXT_COLOR] == "6": + color.setHsv(rainbow, 255, 255) + rainbow += 5 + if rainbow > 255: + rainbow = 0 + #self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') + self.rainbowColor.emit('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') + + if sendtick: + sendtick -= 1 + if self.parent.msgqueue and not sendtick: + self.parent.tcp.send(self.parent.msgqueue[0]) + sendtick = 4 + + error, total = self.parent.tcp.recv() + if error == -2: + continue + elif error == -1: + self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', "%s connection to server lost." % ("WebSocket" if self.parent.tcp.isWS else "TCP")) + self.parent.willDisconnect = True + self.quit() + return + + for network in total: + header = network[0] + #del network[-1] + if header == 'MS': + if len(network) < 15: + print '[warning]', 'malformed/incomplete MS#chat (IC chat) network message was received' + continue + + network[CHATMSG] = decode_ao_str(network[CHATMSG].decode('utf-8')) + self.MS_Chat.emit(network) + + elif header == 'MC': + music = decode_ao_str(network[1]) + charid = int(network[2]) + t = time.localtime() + if charid != -1: + try: + name = self.parent.charlist[charid][0] + except: + name = 'char id %d' % charid + + if len(network) > 3 and network[3]: + name += " ("+network[3].decode("utf-8")+")" + #self.parent.icLog.append('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music)) + self.IC_Log.emit('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music)) + else: + self.IC_Log.emit('[%d:%.2d] the music was changed to %s' % (t[3], t[4], music)) + self.parent.playMusic(music) + + elif header == 'BN': + self.newBackground.emit(network[1]) + + elif header == 'CT': + name = decode_ao_str(network[1].decode('utf-8')) + chatmsg = decode_ao_str(network[2].decode('utf-8').replace("\n", "
")) + #self.parent.ooclog.append('%s: %s' % (name, chatmsg)) + self.OOC_Log.emit("%s: %s" % (name, chatmsg)) + + elif header == 'PV': + self.parent.mychar = int(network[3]) + self.parent.charselect.hide() + self.newChar.emit(self.parent.charlist[self.parent.mychar][0]) + + elif header == 'LE': + del network[0] + self.allEvidence.emit([evi.split('&') for evi in network]) + + elif header == 'ZZ': + if self.parent.modcall: + audio.freehandle(self.parent.modcall) + self.parent.modcall = audio.loadhandle(0, "mod_call.wav", 0, 0, 0) + audio.sethandleattr(self.parent.modcall, BASS_ATTRIB_VOL, self.parent.soundslider.value() / 100.0) + audio.playhandle(self.parent.modcall, False) + + if len(network) > 1: + self.OOC_Log.emit('[MOD CALL] ' + network[1].replace("\n", "
") + '
') + else: + self.OOC_Log.emit('[MOD CALL] But there was no extra information. (old server?)') + elif header == 'CharsCheck': + del network[0] + for i in range(len(network)): + self.parent.charlist[i][1] = int(network[i]) + + self.charSlots.emit() + + elif header == 'RT': + testimony = network[1] + wtcefile = AOpath+"sounds/general/sfx-testimony2" + if self.parent.wtcesfx: + audio.freehandle(self.parent.wtcesfx) + + if testimony == 'judgeruling': + variant = int(network[2]) + if variant == 0: + wtcefile = AOpath+"sounds/general/sfx-notguilty" + elif variant == 1: + wtcefile = AOpath+"sounds/general/sfx-guilty" + else: + variant = 0 + self.parent.wtcesfx = audio.loadhandle(False, wtcefile+".opus" if exists(wtcefile+".opus") else wtcefile+".wav", 0, 0, 0) + audio.sethandleattr(self.parent.wtcesfx, BASS_ATTRIB_VOL, self.parent.soundslider.value() / 100.0) + audio.playhandle(self.parent.wtcesfx, True) + self.parent.WTCEsignal.emit(testimony, variant) + + elif header == 'HP': + type = int(network[1]) + health = int(network[2]) + self.parent.healthbars.emit(type, health) + + elif header == 'KK': + reason = network[1] + self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You were kicked off the server. (%s)' % reason) + + elif header == 'KB': + reason = network[1] + self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You have been banned from the server. (%s)' % reason) + + elif header == 'BB': # message popup (AO 2.9) + message = network[1] + self.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'warning', 'Message from server', message) + + elif header == 'AUTH': # login status (AO 2.9) + status = int(network[1]) + statusStrings = ["You have logged out", "Wrong password", "Logged in"] + self.OOC_Log.emit("%s" % (statusStrings[status+1])) + + elif header == "CHECK": #ping + pingafter = time.time() + self.parent.gotPing.emit(int((pingafter - pingbefore)*1000)) + + elif header == 'DONE': + self.showCharSelect.emit() diff --git a/mainmenu.py b/mainmenu.py index 2f51ada..d1ec0b6 100644 --- a/mainmenu.py +++ b/mainmenu.py @@ -517,7 +517,7 @@ class AOServerInfo(QtCore.QThread): print self.webAO_bucket elif header == "ID": - self.tcp.send("ID#AO2XP#%s#%%" % GAME_VERSION[1:]) # need to send this to tsuserver3 servers in order to get feature list (FL) + self.tcp.send("ID#AO2XP#%s#%%" % "2.11.0") # need to send this to tsuserver3 servers in order to get feature list (FL) elif header == "FL": features = network[1:] diff --git a/quicksetup.py b/quicksetup.py index aa39f7a..9285774 100644 --- a/quicksetup.py +++ b/quicksetup.py @@ -100,6 +100,7 @@ if platform.system() == "Windows": print "installing pyqt4" pip_install('PyQt4-4.11.4-cp27-cp27m-win32.whl') + raw_input("Press Enter to continue...") elif platform.system() == "Darwin": print "installing pyobjc"