making ao2xp more powerful

This commit is contained in:
cidoku 2026-02-06 23:18:05 -03:00
parent 1d10293cef
commit c04e55ff1e
6 changed files with 123 additions and 44 deletions

View File

@ -131,7 +131,7 @@ QtCore.qInstallMsgHandler(handler)
audio.init() audio.init()
game = gamewindow() game = gamewindow()
game.show() game.show()
app.aboutToQuit.connect(game.gamewidget.disconnectCommon) app.aboutToQuit.connect(game.gamewidget.exitCommon)
returnc = app.exec_() returnc = app.exec_()
audio.free() audio.free()
sys.exit(returnc) sys.exit(returnc)

View File

@ -3,7 +3,6 @@ import platform
import websocket import websocket
import ssl import ssl
from PyQt4.QtCore import QString
from constants import * from constants import *
@ -51,10 +50,11 @@ class AOtcpSocket(object):
totals[i] = totals[i].split("#") totals[i] = totals[i].split("#")
del totals[i][-1] del totals[i][-1]
if printPackets: if printPackets:
try: for packet in totals:
print "[packet] <-", totals[0] try:
except: print "[packet] <-", packet
print "(unable to print)" except:
print "(unable to print)"
return 0, totals return 0, totals
def send(self, data): def send(self, data):
@ -63,14 +63,15 @@ class AOtcpSocket(object):
print "[packet] ->", data print "[packet] ->", data
except: except:
print "(unable to print)" print "(unable to print)"
# Qt pls if isinstance(data, str) or isinstance(data, unicode):
if isinstance(data, QString): return self.sock.send(data.encode('utf-8'))
else:
# Probably Qstring
#return self.sock.send(unicode(data).encode('utf-8')) #return self.sock.send(unicode(data).encode('utf-8'))
return self.sock.send(str(data.toUtf8())) return self.sock.send(str(data.toUtf8()))
else:
return self.sock.send(data.encode('utf-8'))
def close(self): def close(self):
print "[debug] TCP connection closed"
self.sock.close() self.sock.close()
class AOwebSocket(object): class AOwebSocket(object):
@ -118,10 +119,11 @@ class AOwebSocket(object):
del totals[i][-1] del totals[i][-1]
if printPackets: if printPackets:
try: for packet in totals:
print "[packet] <-", totals[0] try:
except: print "[packet] <-", packet
print "(unable to print)" except:
print "(unable to print)"
return 0, totals return 0, totals
def send(self, data): def send(self, data):
@ -133,4 +135,5 @@ class AOwebSocket(object):
return self.sock.send(unicode(data)) return self.sock.send(unicode(data))
def close(self): def close(self):
print "[debug] Websocket connection closed"
self.sock.close() self.sock.close()

View File

@ -109,8 +109,8 @@ def mockString(text):
upper = not upper upper = not upper
return "".join(l) return "".join(l)
# Evil HTTPS music download hack for XP systems
class XPMusicDownloadThread(QtCore.QThread): class XPMusicDownloadThread(QtCore.QThread):
# Part of the evil HTTPS music download hack for XP systems
finishedSignal = QtCore.pyqtSignal(int, str) finishedSignal = QtCore.pyqtSignal(int, str)
def __init__(self, caller, url): def __init__(self, caller, url):
@ -1767,6 +1767,13 @@ class GUI(QtGui.QWidget):
self.tcp = None self.tcp = None
self.demoPlayer = None self.demoPlayer = None
# TTS fun
self.speaker = None
if getOption("General", "tts", False) == 'True':
import tts
self.speaker = tts.SpeechThread()
self.speaker.start()
# Finally, load the theme # Finally, load the theme
self.width = 820 self.width = 820
self.height = 730 self.height = 730
@ -3027,6 +3034,12 @@ class GUI(QtGui.QWidget):
self.disconnectCommon() self.disconnectCommon()
self.gamewindow.returnToMenu() self.gamewindow.returnToMenu()
def exitCommon(self):
self.disconnectCommon()
if self.speaker:
self.speaker.stop()
self.speaker.wait()
def disconnectCommon(self): def disconnectCommon(self):
self.onSwitchInventory(True) self.onSwitchInventory(True)
self.selectedPlayer = -1 self.selectedPlayer = -1
@ -3210,10 +3223,11 @@ class GUI(QtGui.QWidget):
msg += str(self.myChatColor) + "#" msg += str(self.myChatColor) + "#"
if "cccc_ic_support" in self.features: if "cccc_ic_support" in self.features:
showname = self.showname.decode('utf-8')
if self.showname == "" and not self.charShowname == "": if self.showname == "" and not self.charShowname == "":
showname = self.charShowname showname = self.charShowname
msg += showname + "#" # custom showname else:
showname = self.showname
msg += encodeAOString(showname).decode('utf-8') + "#" # custom showname
if self.cbPair.isChecked(): if self.cbPair.isChecked():
msg += str(self.boxPair.currentIndex()) # pair charID msg += str(self.boxPair.currentIndex()) # pair charID
if "effects" in self.features: if "effects" in self.features:
@ -3239,10 +3253,10 @@ class GUI(QtGui.QWidget):
for f_effect in effects_to_check: for f_effect in effects_to_check:
packet = "" packet = ""
for f_emote in emotes_to_check: for fEmote in emotes_to_check:
packet += f_emote packet += fEmote
if ini.read_ini_bool("AO2XP.ini", "General", "network frame effects", True): if ini.read_ini_bool("AO2XP.ini", "General", "network frame effects", True):
sfx_frames = "|".join(ini.read_ini_tags(AOpath + "characters/"+self.charName+"/char.ini", f_emote + f_effect)) sfx_frames = "|".join(ini.read_ini_tags(AOpath + "characters/"+self.charName+"/char.ini", fEmote + f_effect))
if sfx_frames: if sfx_frames:
packet += "|" + sfx_frames packet += "|" + sfx_frames
packet += "^" packet += "^"
@ -3594,6 +3608,10 @@ class GUI(QtGui.QWidget):
emoteMod = int(self.mChatMessage[EMOTE_MOD]) emoteMod = int(self.mChatMessage[EMOTE_MOD])
if emoteMod == 0: if emoteMod == 0:
self.mChatMessage[EMOTE_MOD] = 1 self.mChatMessage[EMOTE_MOD] = 1
# TTS fun
if self.speaker:
self.speaker.interrupt.emit()
else: else:
# Old behavior # Old behavior
#self.mChatMessage = mChatMessage #self.mChatMessage = mChatMessage
@ -3755,7 +3773,7 @@ class GUI(QtGui.QWidget):
if not self.mChatMessage[SHOWNAME]: if not self.mChatMessage[SHOWNAME]:
self.name.setText(self.mChatMessage[CHARNAME]) self.name.setText(self.mChatMessage[CHARNAME])
else: else:
self.name.setText(self.mChatMessage[SHOWNAME]) self.name.setText(decodeAOString(self.mChatMessage[SHOWNAME]))
self.chatbox.hide() self.chatbox.hide()
@ -3989,18 +4007,22 @@ class GUI(QtGui.QWidget):
return return
fChar = self.mChatMessage[CHARNAME] fChar = self.mChatMessage[CHARNAME]
f_emote = self.mChatMessage[ANIM] fEmote = self.mChatMessage[ANIM]
if not self.animIsEmpty: if not self.animIsEmpty:
self.char.stop() self.char.stop()
if f_animState == 2: if f_animState == 2:
self.char.playTalking(fChar, f_emote, self.scaling[0]) self.char.playTalking(fChar, fEmote, self.scaling[0])
self.animState = 2 self.animState = 2
else: else:
self.char.playIdle(fChar, f_emote, self.scaling[0]) self.char.playIdle(fChar, fEmote, self.scaling[0])
self.animState = 3 self.animState = 3
# TTS fun
if self.speaker:
self.speaker.say.emit(self.mChatMessage[CHATMSG], self.blip)
def playEffect(self, fxName, fxSound, pChar, pFolder): def playEffect(self, fxName, fxSound, pChar, pFolder):
effect = ini.get_effect(fxName, pChar, pFolder) effect = ini.get_effect(fxName, pChar, pFolder)
if not effect: return if not effect: return
@ -4147,9 +4169,9 @@ class GUI(QtGui.QWidget):
self.inlineBlueDepth += 1 self.inlineBlueDepth += 1
if not self.entireMessageIsBlue and self.animState != 4: if not self.entireMessageIsBlue and self.animState != 4:
fChar = self.mChatMessage[CHARNAME] fChar = self.mChatMessage[CHARNAME]
f_emote = self.mChatMessage[ANIM] fEmote = self.mChatMessage[ANIM]
if not self.animIsEmpty: if not self.animIsEmpty:
self.char.playIdle(fChar, f_emote, self.scaling[0]) self.char.playIdle(fChar, fEmote, self.scaling[0])
elif fCharacter == ")" and not self.nextCharacterIsNotSpecial and self.inlineColorStack: elif fCharacter == ")" and not self.nextCharacterIsNotSpecial and self.inlineColorStack:
if self.inlineColorStack[-1] == INLINE_BLUE: if self.inlineColorStack[-1] == INLINE_BLUE:
@ -4164,8 +4186,8 @@ class GUI(QtGui.QWidget):
if not self.entireMessageIsBlue: if not self.entireMessageIsBlue:
if self.inlineBlueDepth == 0 and self.animState != 4 and not (self.tickPos+1 >= len(fMessage)): if self.inlineBlueDepth == 0 and self.animState != 4 and not (self.tickPos+1 >= len(fMessage)):
fChar = self.mChatMessage[CHARNAME] fChar = self.mChatMessage[CHARNAME]
f_emote = self.mChatMessage[ANIM] fEmote = self.mChatMessage[ANIM]
self.char.playTalking(fChar, f_emote, self.scaling[0]) self.char.playTalking(fChar, fEmote, self.scaling[0])
else: else:
self.nextCharacterIsNotSpecial = True self.nextCharacterIsNotSpecial = True
self.tickPos -= 1 self.tickPos -= 1
@ -4520,13 +4542,19 @@ class GUI(QtGui.QWidget):
del self.playerList[pid] del self.playerList[pid]
else: # Update a player else: # Update a player
if pid in self.playerList: if pid in self.playerList:
self.playerList[pid][utype] = data _data = None
if isinstance(data, unicode) or isinstance(data, str):
_data = self.charList[int(data)][0] if data.isdigit() else decodeAOString(data)
else:
_dataInt, ok = data.toInt()
_data = self.charList[int(_dataInt)][0] if ok else data
self.playerList[pid][utype] = _data
item = self.playerItems.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith) item = self.playerItems.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith)
if item: if item:
name = self.playerList[pid][0] name = self.playerList[pid][0]
char = self.playerList[pid][1] char = self.playerList[pid][1] if len(self.playerList[pid]) > 1 else None
charName = self.playerList[pid][2] charName = self.playerList[pid][2] if len(self.playerList[pid]) > 2 else None
text = "[%s]" % pid text = "[%s]" % pid
if char: if char:
text += " %s" % char text += " %s" % char

View File

@ -9,11 +9,6 @@ import AOsocket
import ini import ini
from constants import * from constants import *
def decodeAOString(text):
return text.replace("<percent>", "%").replace("<pound>", "#").replace("<num>", "#").replace("<and>", "&").replace("<dollar>", "$")
def encodeAOString(text):
return text.replace("%", "<percent>").replace("#", "<pound>").replace("&", "<and>").replace("$", "<dollar>")
class PicButton(QtGui.QAbstractButton): class PicButton(QtGui.QAbstractButton):
def __init__(self, pixmap, parent=None): def __init__(self, pixmap, parent=None):
super(PicButton, self).__init__(parent) super(PicButton, self).__init__(parent)
@ -507,7 +502,6 @@ class AOServerInfo(QtCore.QThread):
got_stuff = True got_stuff = True
elif header == "decryptor": elif header == "decryptor":
#self.tcp.send("HI#AO2XP %s#%%" % hardware.get_hdid())
self.tcp.send("HI#%s#%%" % hardware.get_hdid()) self.tcp.send("HI#%s#%%" % hardware.get_hdid())
elif header == "ASS": # ha ha ha... elif header == "ASS": # ha ha ha...
@ -519,7 +513,7 @@ class AOServerInfo(QtCore.QThread):
elif header == "FL": elif header == "FL":
features = network[1:] features = network[1:]
print features # print features
elif header == 'BD': elif header == 'BD':
reason = network[1].decode("utf-8") if len(network) > 1 else "Failed to receive ban reason (old server version?)" # new in AO2 2.6 reason = network[1].decode("utf-8") if len(network) > 1 else "Failed to receive ban reason (old server version?)" # new in AO2 2.6
@ -637,9 +631,9 @@ class AOServerInfo(QtCore.QThread):
elif header == 'CT': elif header == 'CT':
if self.disconnect: if self.disconnect:
continue continue
name = network[1].decode("utf-8").replace('<dollar>', '$').replace('<percent>', '%').replace('<and>', '&').replace('<num>', '#').replace('<pound>', '#') name = decodeAOString(network[1].decode('utf-8'))
chatmsg = network[2].decode("utf-8").replace('<dollar>', '$').replace('<percent>', '%').replace('<and>', '&').replace('<num>', '#').replace('<pound>', '#') chatmsg = decodeAOString(network[2].decode('utf-8').replace("\n", "<br />"))
joinOOC.append("%s: %s" % (name, chatmsg)) joinOOC.append("<b>%s:</b> %s" % (name, chatmsg.replace("<", "&lt;").replace("&lt;br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg))
elif header == 'PU': elif header == 'PU':
del network[0] del network[0]

View File

@ -50,7 +50,7 @@ def handlePackets(caller, total, record=True):
caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg.replace("<", "&lt;").replace("&lt;br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg)) caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg.replace("<", "&lt;").replace("&lt;br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg))
elif header == 'PV': elif header == 'PV':
caller.parent.myChar = int(network[3]) if network[3] else 0 caller.parent.myChar = int(network[3])
caller.parent.charSelect.hide() caller.parent.charSelect.hide()
caller.newChar.emit(caller.parent.charList[caller.parent.myChar][0]) caller.newChar.emit(caller.parent.charList[caller.parent.myChar][0])

54
tts.py Normal file
View File

@ -0,0 +1,54 @@
from PyQt4 import QtCore
import random
# WIP - DON'T USE
class SpeechThread(QtCore.QThread):
say = QtCore.pyqtSignal(unicode, str)
interrupt = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(SpeechThread, self).__init__(parent)
self._queue = []
self._running = True
self.say.connect(self._enqueue)
self.interrupt.connect(self._interrupt)
self.maleVoices = [0, 1, 4, 7]
self.femaleVoices = [5, 6, 8, 9, 10]
self.speaker = None
def run(self):
import win32com.client
import pythoncom
pythoncom.CoInitialize()
self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
voices = self.speaker.GetVoices()
while self._running:
if self._queue:
text, gender = self._queue.pop(0)
if "http" in text:
continue
if "female" in gender:
self.speaker.Voice = voices.Item(random.choice(self.femaleVoices))
else:
self.speaker.Voice = voices.Item(random.choice(self.maleVoices))
text = unicode(text.toUtf8(), 'utf-8')
self.speaker.Speak(text, 1)
else:
self.msleep(20)
pythoncom.CoUninitialize()
def _interrupt(self):
if self.speaker:
self.speaker.Speak("", 2)
self._queue[:] = []
def _enqueue(self, text, gender):
self._queue.append([text, gender])
def stop(self):
self._interrupt()
self._running = False