def _save(self): if self.isComplete(): hcode = self.currentHookCode() th = texthook.global_() old_hcode = th.currentHookCode() if hcode == old_hcode: growl.msg(my.tr("Hook code is not changed")) self._saveButton.setEnabled(False) skqss.class_(self._hookEdit, 'normal') else: self._addHookToHistory(hcode) if old_hcode: growl.notify(my.tr("Override previous hook code") + "<br/>" + old_hcode) if th.setHookCode(hcode): #self.q.hide() growl.msg(my.tr("Hook code saved")) self._saveButton.setEnabled(False) skqss.class_(self._hookEdit, 'normal') self.q.hookCodeEntered.emit(hcode) else: growl.error(my.tr("Hook code does not work with the current game")) self._saveButton.setEnabled(False) skqss.class_(self._hookEdit, 'error') hooked = bool(texthook.global_().currentHookCode()) self._deleteButton.setEnabled(hooked) dprint("pass")
def _delete(self): #self._hookEdit.clear() self._hookEdit.clearEditText() self._refresh() texthook.global_().clearHookCode() self.q.hookCodeDeleted.emit() growl.msg(my.tr("User-defined hook removed!"))
def setVisible(self, visible): """@reimp @public""" if visible and not self.isVisible(): self.clear() if not visible: texthook.global_().setWhitelistEnabled(True) super(GameWizard, self).setVisible(visible) self.visibleChanged.emit(visible)
def hookPrefsDialog(self): q = self.q import hookprefs ret = hookprefs.HookPrefsDialog(q) ret.hookCodeEntered.connect(q.hookChanged) ret.hookCodeDeleted.connect(partial( q.hookChanged.emit, "")) # Automatically hide me when game exit texthook.global_().processDetached.connect(ret.hide) h = self._deletedHookCode() ret.setDeletedHook(h) return ret
def load(self): th = texthook.global_() hcode = th.currentHookCode() self._addHookToHistory(hcode) #if hcode: self._hookEdit.setEditText(hcode) self._refresh()
def _refresh(self): ok = self.isComplete() self._saveButton.setEnabled(ok) skqss.class_(self._hookEdit, 'normal' if ok else 'error') hooked = bool(texthook.global_().currentHookCode()) self._deleteButton.setEnabled(hooked)
def cleanupPage(self): """@reimp @public""" #self._load() th = texthook.global_() th.setWhitelistEnabled(False) self._ignoresRepeatButton.setChecked(th.removesRepeat()) self._keepsSpaceButton.setChecked(th.keepsSpace()) dprint("pass")
def _setActive(self, active): if self._active != active: th = texthook.global_() if active: th.dataReceived.connect(self._addText) else: th.dataReceived.disconnect(self._addText) self._active = active
def setActive(self, active): if self._active != active: th = texthook.global_() if active: th.dataReceived.connect(self._addText) #th.hookCodeChanged.connect(self._refreshKeepsHookButton) #self._refreshKeepsHookButton() else: th.dataReceived.disconnect(self._addText) #th.hookCodeChanged.disconnect(self._refreshKeepsHookButton) self._active = active
def keepsSpaceButton(self): ret = QtWidgets.QCheckBox( my.tr("Insert spaces between words") + " (%s: %s)" % (tr_("for example"), "Howareyou! => How are you!")) #skqss.class_(ret, 'text-error') #ret.toggled.connect(lambda t: # skqss.class_(ret, 'error' if t else 'text-error')) ret.setToolTip(my.tr("Preserve spaces between (English) words")) ret.toggled.connect(lambda t: t and self._confirmKeepSpace()) ret.toggled.connect(texthook.global_().setKeepsSpace) # this is after confirmation return ret
def initializePage(self): """@reimp @public""" pid = self.wizard().profile().pid if pid and pid != texthook.global_().currentPid(): ok = inject.inject_vnrhook(pid) dprint("attached = %s" % ok) #if ok: # from gameengine import gameengine # gameengine.inject(pid) self._refresh() dprint("pass")
def ignoresRepeatButton(self): ret = QtWidgets.QCheckBox( my.tr("Ignore infinite cyclic repetition in the text") + " (%s: %s)" % (tr_("for example"), "YesYesYes... => Yes")) skqss.class_(ret, 'text-error') ret.toggled.connect(lambda t: skqss.class_(ret, 'error' if t else 'text-error')) ret.setToolTip(my.tr("Warning: Please do not turn on repetition filters unless there are repetitions!")) ret.toggled.connect(lambda t: t and self._confirmRemoveRepeat(ret)) ret.toggled.connect(texthook.global_().setRemovesRepeat) # this is after confirmation return ret
def setVisible(self, visible): """@reimp @public""" d = self.__d if visible: g = _gameprofile() icon = g.icon() if g else None if not icon or icon.isNull(): icon = rc.icon('logo-reader') self.setWindowIcon(icon) title = "%s (%s)" % ( mytr_("Text Settings"), my.tr("Engine: ITH"), ) name = g.name() if g else None if name: title = "%s - %s" % (name, title) self.setWindowTitle(title) if visible: texthook.global_().hijackProcess() if visible != self.isVisible(): if visible: d.clear() d.load() self.updateEnabled() skevents.runlater(self.updateSize) else: d.unload() texthook.global_().setWhitelistEnabled(not visible) d.setActive(visible) super(TextPrefsDialog, self).setVisible(visible)
def inject_vnrhook(pid, hijack=True): """ @param* pid ulong @param* handle HANDLE @return bool """ dprint("enter") for dllpath in config.VNRHOOK_DLLS: #dllpath = os.path.abspath(dllpath) dllpath = skpaths.abspath(dllpath) assert os.path.exists( dllpath), "needed dll does not exist: %s" % dllpath skwinsec.injectdll(dllpath, pid=pid) #and ret ret = texthook.global_().attachProcess(pid, hijack=hijack) dprint("leave: ret = %s" % ret) return ret
def load(self): th = texthook.global_() self.currentIgnoresRepeat = th.removesRepeat() self.ignoresRepeatButton.setChecked(self.currentIgnoresRepeat) self.currentKeepsSpace = th.keepsSpace() self.keepsSpaceButton.setChecked(self.currentKeepsSpace) tm = textman.manager() self.removesRepeatButton.setChecked(tm.removesRepeatText()) self.keepsThreadsButton.setChecked(tm.keepsThreads()) #self.keepsThreadsButton.setEnabled(bool(texthook.global_().currentHookCode())) lang = tm.gameLanguage() try: langIndex = config.LANGUAGES.index(lang) except ValueError: langIndex = 0 self.languageEdit.setCurrentIndex(langIndex) enc = tm.encoding() self._setEncoding(enc) nullThreadFound = False for t in tm.threads(): if t.name == defs.NULL_THREAD_NAME: nullThreadFound = True self._updateThread(t, encoding=enc) if not nullThreadFound: t = textman.TextThread(name=defs.NULL_THREAD_NAME, signature=defs.NULL_THREAD_SIGNATURE) self._updateThread(t, encoding=enc) self._refreshSaveButton() self._refreshHookDialog()
def _ignoresRepeat(self): """ @return bool """ return texthook.global_().removesRepeat()
def unload(self): texthook.global_().setRemovesRepeat(self.currentIgnoresRepeat) texthook.global_().setKeepsSpace(self.currentKeepsSpace)
def __init__(self, wiz): super(SelectThreadPage, self).__init__(wiz) self.setTitle(my.tr("Select the text thread")) self.setCommitPage(True) self._active = False wiz.visibleChanged.connect(self._setActive) wiz.visibleChanged.connect(self._clear) self._threads = {} # {long signature:TextThread} introLabel = QtWidgets.QLabel(my.tr( "Please play the game a little bit, and pick one text thread that has the same contents as the game text. If no text thread appears, please try editing the /H hook code for this game." )) introLabel.setWordWrap(True) # grid of thread sources self._grid = skwidgets.SkRadioButtonGrid(self, col=2) self._grid.currentIndexChanged.connect(self._refresh) self._grid.currentIndexChanged.connect(self.completeChanged) threadGroup = QtWidgets.QGroupBox() threadGroup.setLayout(self._grid.layout()) threadGroup.setTitle(mytr_("Text threads")) self._encodingEdit = QtWidgets.QComboBox() self._encodingEdit.setEditable(False) self._encodingEdit.setToolTip(tr_("Text encoding")) self._encodingEdit.addItems(map(i18n.encoding_desc, config.ENCODINGS)) self._encodingEdit.currentIndexChanged.connect(self._refresh) self._keepsSpaceButton = QtWidgets.QCheckBox( my.tr("Insert spaces between words") + " (%s: %s)" % (tr_("for example"), "Howareyou! => How are you!")) self._keepsSpaceButton.toggled.connect(texthook.global_().setKeepsSpace) self._removesRepeatButton = QtWidgets.QCheckBox( my.tr("Eliminate finite repetition in the text") + " (%s: %s)" % (tr_("for example"), "YYeess!!NoNo! => Yes!No!")) self._removesRepeatButton.toggled.connect(self._refresh) self._ignoresRepeatButton = QtWidgets.QCheckBox( my.tr("Ignore infinite cyclic repetition in the text") + " (%s: %s)" % (tr_("for example"), "YesYesYes... => Yes")) self._ignoresRepeatButton.toggled.connect(texthook.global_().setRemovesRepeat) clearButton = QtWidgets.QPushButton(tr_("Clear")) clearButton.clicked.connect(self._clear) skqss.class_(clearButton, 'btn btn-danger') hookPrefsButton = QtWidgets.QPushButton(my.tr("Edit /H Hook Code")) skqss.class_(hookPrefsButton, 'btn btn-info') hookPrefsButton.clicked.connect(lambda: self.hookPrefsDialog.show()) helpButton = QtWidgets.QPushButton(tr_("Help")) skqss.class_(helpButton, 'btn btn-success') helpButton.clicked.connect(lambda: self.helpDialog.show()) self._textEdit = QtWidgets.QPlainTextEdit() self._textEdit.setReadOnly(True) self._textEdit.setToolTip(mytr_("Game text")) self._textEdit.setPlainText(my.tr("No game text")) layout = QtWidgets.QVBoxLayout() layout.addWidget(introLabel) row = QtWidgets.QHBoxLayout() row.addWidget(self._encodingEdit) row.addWidget(clearButton) row.addStretch() row.addWidget(hookPrefsButton) row.addWidget(helpButton) layout.addLayout(row) layout.addWidget(self._removesRepeatButton) layout.addWidget(self._ignoresRepeatButton) layout.addWidget(self._keepsSpaceButton) layout.addWidget(threadGroup) layout.addWidget(self._textEdit) self.setLayout(layout)
def addHook(self, code, name=''): # str, str -> bool from texthook import texthook return texthook.global_().addHook(code, name=name or self.name(), verbose=self.DEBUG)
def _keepsSpace(self): """ @return bool """ return texthook.global_().keepsSpace()