making ao2xp more powerful
This commit is contained in:
parent
1d10293cef
commit
c04e55ff1e
2
AO2XP.py
2
AO2XP.py
@ -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)
|
||||||
|
|||||||
29
AOsocket.py
29
AOsocket.py
@ -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()
|
||||||
|
|||||||
66
gameview.py
66
gameview.py
@ -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):
|
||||||
@ -1766,6 +1766,13 @@ class GUI(QtGui.QWidget):
|
|||||||
self.XPDownloadThread = None
|
self.XPDownloadThread = None
|
||||||
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
|
||||||
@ -3026,6 +3033,12 @@ class GUI(QtGui.QWidget):
|
|||||||
if self.willDisconnect:
|
if self.willDisconnect:
|
||||||
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)
|
||||||
@ -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,17 +4007,21 @@ 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)
|
||||||
@ -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
|
||||||
@ -4856,4 +4884,4 @@ class GUI(QtGui.QWidget):
|
|||||||
self.areaItems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "house.png"))
|
self.areaItems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "house.png"))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print "[debug] Couldn't update areas. Details:"
|
print "[debug] Couldn't update areas. Details:"
|
||||||
print "[debug]", e
|
print "[debug]", e
|
||||||
|
|||||||
14
mainmenu.py
14
mainmenu.py
@ -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("<", "<").replace("<br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg))
|
||||||
|
|
||||||
elif header == 'PU':
|
elif header == 'PU':
|
||||||
del network[0]
|
del network[0]
|
||||||
|
|||||||
@ -50,7 +50,7 @@ def handlePackets(caller, total, record=True):
|
|||||||
caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg.replace("<", "<").replace("<br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg))
|
caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg.replace("<", "<").replace("<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
54
tts.py
Normal 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
|
||||||
Loading…
Reference in New Issue
Block a user