From 5cc28706d138584fe813489ca4369f9f669c0d9f Mon Sep 17 00:00:00 2001 From: AUSTIN2526 Date: Thu, 16 Feb 2023 06:30:12 +0800 Subject: [PATCH] updata v1.3.1 --- README.md | 34 +++++-- UI.py | 112 +++++++++++--------- app.py | 292 +++++++++++++++++++++++++++++++++++++++-------------- screen.png | Bin 15060 -> 26399 bytes 4 files changed, 307 insertions(+), 131 deletions(-) diff --git a/README.md b/README.md index 7bade76..ecf1b42 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Holocure Trainer -This project can help you dynamically modify the game. - +This is a multipurpose trainer for HoloCure ## Download(exe) ``` @@ -10,7 +9,7 @@ https://github.com/AUSTIN2526/holocure-trainer/releases ## Screenshot ![Image text](https://github.com/AUSTIN2526/holocure-trainer/blob/main/screen.png) -## Funtion +## Dynamic funtion * ### Unlimited HP Increase HP to 99999. @@ -30,11 +29,27 @@ https://github.com/AUSTIN2526/holocure-trainer/releases Reduce the level to 1 to get the upgrade effect. * ### Stop Level Up - Increase level to 999 - -* ### Unlimited Coin(sometime will fail) + Increase level to 999. + +## Save editor +* ### Unlimited Coin Increase coin to 99999999. + +* ### Unlock Armory + Unlock All armory. + +* ### Unlock Achievements + Unlock All achievements. + +* ### ALL Outfits and Characters + Unlock All characters outfits and modify characters LV to 20. + +* ### All Stage + Unlock All stage. +* ### Max Upgrades + Increase upgrades to max. + ## How to use 1.Open HoloCure and Trainer. 2.Click the detection button. @@ -43,7 +58,6 @@ https://github.com/AUSTIN2526/holocure-trainer/releases ## Please Note 1.Don't use HoloCure Launcher open the game(will cause the locked fail). 2.Unlocking the collabs recipe may cause the trainer to fail, you need to restart the stage to solve it. -3.Unlimited Coin function sometime will fail, you need to reopen the HoloCure many a time(this is a bug, next version maybe fix it). -4.If your character is Ame need to use Unlimited SP(Ame) instead of Unlimited SP. -5.If function don't work in stage, press esc can help you solve the problem. -6.The value of some functions needs to exceed 0 to be able to use. +3.If your character is Ame need to use Unlimited SP(Ame) instead of Unlimited SP. +4.If function don't work in stage, press esc can help you solve the problem. +5.The value of some functions needs to exceed 0 to be able to use. diff --git a/UI.py b/UI.py index dc8454f..99a6c5c 100644 --- a/UI.py +++ b/UI.py @@ -1,67 +1,68 @@ -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtGui import locale -class Ui_Form(object): - def setupUi(self, page): - +class Ui_Form: + def __init__(self): + #get language self.language = locale.getdefaultlocale()[0] - #setting different language parameters + + #set system language if self.language =='zh_TW' or self.language =='zh': self.language = 'zh_TW' - self.w, self.h, self.space = 410, 300, 90 + self.w, self.h, self.space, self.row_space = 450, 300, 90, 30 + else: self.language = 'en' - self.w, self.h, self.space = 450, 300, 110 + self.w, self.h, self.space, self.row_space = 620, 300, 140, 30 - #different language text + #UI language (if you want add new function modify here【format func_name_ + "num"】) self.UI_text = {'zh_TW':{'ui_name':'HoloCure修改器 by AUSTIN2526', 'info':'【啟動遊戲後按偵測按鈕遊戲即可啟用功能】', 'detect_button':'偵測遊戲', - #if you want to add a row modify here(format func_name_ + "num") + #modify here 'func_name_1':['鎖血無敵', '全圖撿物', '秒殺怪物', '999 攻速'], 'func_name_2':['無限技能','無限技能(Ame)'], 'func_name_3':['無限升級', '停止升級'], - 'func_name_4':['無限金幣'], + 'func_name_4':['無限金幣', '解鎖裝備', '解鎖成就', '全角色與服裝', '解鎖關卡', '解鎖被動'], - #if you want to add a row modify here(format func_title_ + "num") - 'func_title_1':'主要功能', - 'func_title_2':'特殊技能', - 'func_title_3':'升級', - 'func_title_4':'其他'}, + #modify here + 'func_title_1':'♠ 主要功能 ♠', + 'func_title_2':'♥ 特殊技能 ♥', + 'func_title_3':'♦ 升級 ♦', + 'func_title_4':'♣ 修改存檔 ♣'}, 'en':{'ui_name':'HoloCure Trainer by AUSTIN2526', 'info':'【Pleas click the detection button to enable function】', 'detect_button':'Detect', - #if you want to add a row modify here(format func_name_ + "num") + #modify here 'func_name_1':['Unlimited HP', 'EX Pick Range', 'Spike Monster', '999 Haste'], 'func_name_2':['Unlimited SP','Unlimited SP(Ame)'], 'func_name_3':['Unlimited EXP', 'Stop Level Up'], - 'func_name_4':['Unlimited Coin'], + 'func_name_4':['Unlimited Coin', 'All Armorys', 'All Achievements', 'ALL Outfits and Characters', 'All Stages', 'Max Upgrades'], - #if you want to add a row modify here(format func_title_ + "num") - 'func_title_1':'Main Function', - 'func_title_2':'Special Skill', - 'func_title_3':'Level Up', - 'func_title_4':'Other'}, - - + #modify here + 'func_title_1':'♠ Main Function ♠', + 'func_title_2':'♥ Special Skill ♥', + 'func_title_3':'♦ Level Up ♦', + 'func_title_4':'♣ Save Editor ♣'}, } - #QCheckBox group - self.func_group_1, self.func_group_2, self.func_group_3, self.func_group_4 = [], [], [], [] - self.all_group = [self.func_group_1, self.func_group_2, self.func_group_3, self.func_group_4] + def setupUi(self, page): + + #QCheckBox group(save_editor_func_1 need to be in the last) + self.func_group_1, self.func_group_2, self.func_group_3, self.save_editor_func_1 = [], [], [], [] + self.all_group = [self.func_group_1, self.func_group_2, self.func_group_3, self.save_editor_func_1] - #setting window + #set window page.resize(self.w, self.h) page.setWindowTitle(self.UI_text[self.language]['ui_name']) - - - #detect button + + #set detect button self.makelabel(page, 110, 10, 2000, 30, self.UI_text[self.language]['info']) self.page_button = QtWidgets.QPushButton(page) self.page_button.setGeometry(QtCore.QRect(10, 10, 100, 30)) @@ -72,25 +73,44 @@ def setupUi(self, page): for _ in self.UI_text[self.language][f'func_name_{cnt}']: group_ID.append(QtWidgets.QCheckBox(page)) - - - #set QCheckBox + #UI init position + x, y =10, 50 for cnt, group_ID in enumerate(self.all_group, 1): - #stage 1~3 - self.makelabel(page, 10, 50+(cnt-1)*60, 2000, 30, self.UI_text[self.language][f'func_title_{cnt}']) - for index in range(len(self.UI_text[self.language][f'func_name_{cnt}'])): - group_ID[index].setGeometry(QtCore.QRect(10 + self.space*index, 80+(cnt-1)*60, 2000, 30)) - group_ID[index].setText(self.UI_text[self.language][f'func_name_{cnt}'][index]) - group_ID[index].setEnabled(False) + #title x position always 10 + self.makelabel(page, 10, y, 2000, 30, self.UI_text[self.language][f'func_title_{cnt}']) + + #calc length + func_num = len(self.UI_text[self.language][f'func_name_{cnt}']) + row_cnt = func_num//5 + col_cnt = func_num if func_num < 4 else 4 + + + for row in range(row_cnt+1): + for col in range(col_cnt): + index = row * 4 + col + + #updat x and y position + x = 10 + self.space * index if index < 4 else 10 + self.space * (index-row_cnt*4) + y = y if index % 4 != 0 else y +25 + + group_ID[index].setGeometry(QtCore.QRect(x, y, 2000, 30)) + group_ID[index].setText(self.UI_text[self.language][f'func_name_{cnt}'][index]) + group_ID[index].setEnabled(False) + + col_cnt = func_num if func_num <= 4 else func_num-row_cnt*4 + + #title space + y+=self.row_space + + + + - - - - def makelabel(self, page, x=10, y=10, w=10, h=20, text='', s=True): + font = QtGui.QFont() + font.setPointSize(10) self.label = QtWidgets.QLabel(page) self.label.setGeometry(QtCore.QRect(x, y, w, h)) - self.label.setObjectName('label') self.label.setText(text) self.label.setEnabled(s) - + self.label.setFont(font) diff --git a/app.py b/app.py index c543c39..a98bc97 100644 --- a/app.py +++ b/app.py @@ -2,12 +2,13 @@ import threading from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget from UI import Ui_Form -from pymem import * -from pymem.process import * -from time import sleep +from pymem import Pymem +from pymem.process import module_from_name +import base64 +import os +import json class AppWindow(QWidget): - def __init__(self): super().__init__() self.ui = Ui_Form() @@ -15,116 +16,256 @@ def __init__(self): #info language self.info = {'zh_TW':{'scan':['掃描', '已掃描到遊戲',], - 'error':['錯誤', '請先開啟遊戲後再按偵測程式']}, + 'error':['錯誤', '請先開啟遊戲後再按偵測程式'], + 'data_error':['存檔讀取失敗', '初次下載請先開啟HoloCure,才能修改存檔'], + 'save_editor_success':['修改成功','存檔修改完畢,重新啟動遊戲即可生效'], + 'save_editor_error':['修改失敗','發生不明錯誤,請回報開發者來解決此問題']}, - 'en':{'scan':['Scen','Scan Success'], - 'error':['Error','Please start the game first, then click the detection button']} - + 'en':{'scan':['Scen','Scan Success'], + 'error':['Error','Please start the game first, then click the detection button'], + 'data_error':['Read Failed', 'For the first download, please open HoloCure before use save editor'], + 'save_editor_success':['Success','Modify successful, please restart the game to take effect'], + 'save_editor_error':['Fail','Unknow, please report to the developer to fix this program']}, } - #modeify data(format function_name:[QCheckBox object, value, base address, offsets]) + #if you want to add new function modify here self.modify_data = { - #if you want to add a row modify here(format func_name_ + "num" + _ + "name") - 'func_name_1_hP':[self.ui.func_group_1[0], 1090021872, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x1F70,0x04]], - 'func_name_1_range':[self.ui.func_group_1[1], 1090021872, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x1670,0x04]], - 'func_name_1_atk':[self.ui.func_group_1[2], 1090021872, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x480,0x04]], - 'func_name_1_haste':[self.ui.func_group_1[3], 1083127808, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x1F0,0x04]], + #dynamic editor(format function_name:[QCheckBox object, interlock object, value, base address, offsets]) + 'func_name_1_hP':[self.ui.func_group_1[0], None, 1090021872, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x1F70,0x04]], + 'func_name_1_range':[self.ui.func_group_1[1], None, 1090021872, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x1670,0x04]], + 'func_name_1_atk':[self.ui.func_group_1[2], None, 1090021872, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x480,0x04]], + 'func_name_1_haste':[self.ui.func_group_1[3], None, 1083127808, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x1F0,0x04]], - 'func_name_2_ex':[self.ui.func_group_2[0], 1079558144, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x1B30,0x04]], - 'func_name_2_ex_ame':[self.ui.func_group_2[1], 1079558144, 0x00A1EFD8,[0x70,0x18,0x170,0x98,0x48,0x10,0x1B50,0x04]], - - 'func_name_3_level_up':[self.ui.func_group_3[0], 1072693248, 0x00800B60, [0x48,0x10,0x1840,0x4]], - 'func_name_3_stop_level_up':[self.ui.func_group_3[1], 1083127808, 0x00800B60, [0x48,0x10,0x1840,0x4]], - - 'func_name_4_coin_1':[self.ui.func_group_4[0], 1100470147, 0x00A1EFC8, [0x1A8, 0x0, 0x0, 0x280, 0x34]], + 'func_name_2_ex':[self.ui.func_group_2[0], self.ui.func_group_2[1], 1079558144, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x1B30,0x04]], + 'func_name_2_ex_ame':[self.ui.func_group_2[1], self.ui.func_group_2[0], 1079558144, 0x00A1EFD8, [0x70,0x18,0x170,0x98,0x48,0x10,0x1B50,0x04]], - #this data not in QCheckBox this data will enable in modify function - 'func_name_4_coin_2':[self.ui.func_group_4[0], 1100470147, 0x007D37E0, [0x148,0x18B4]], + 'func_name_3_level_up':[self.ui.func_group_3[0],self.ui.func_group_3[1], 1072693248, 0x00800B60, [0x48,0x10,0x1840,0x4]], + 'func_name_3_stop_level_up':[self.ui.func_group_3[1],self.ui.func_group_3[0], 1083127808, 0x00800B60, [0x48,0x10,0x1840,0x4]], + + + #save editor(format function_name:[QCheckBox object,{key:val}]) + 'save_editor_coin':[self.ui.save_editor_func_1[0], {'holoCoins':99999999, 'randomMoneyKey':0}], + + 'save_editor_armory':[ + self.ui.save_editor_func_1[1], + { + 'unlockedItems':[ + 'BodyPillow', 'FullMeal', 'PikiPikiPiman', 'SuccubusHorn', 'Headphones', 'UberSheep', 'HolyMilk', \ + 'Sake', 'FaceMask', 'CreditCard', 'GorillasPaw', 'InjectionAsacoco', 'IdolCostume', 'Plushie', 'StudyGlasses', \ + 'SuperChattoTime', 'EnergyDrink', 'Halu', 'Membership', 'GWSPill', 'ChickensFeather', 'Bandaid', 'Limiter', \ + 'PiggyBank', 'DevilHat', 'BlacksmithsGear', 'Breastplate', 'HopeSoda', 'Shacklesss' + ], + + 'unlockedWeapons':[ + 'PsychoAxe', 'Glowstick', 'SpiderCooking', 'Tailplug', 'BLBook', 'EliteLava', 'HoloBomb', 'HoloLaser', \ + 'CuttingBoard', 'IdolSong', 'CEOTears', 'WamyWater', 'XPotato', 'BounceBall', 'ENCurse' + ], + + 'seenCollabs':[ + 'BreatheInAsacoco', 'DragonBeam', 'EliteCooking', 'FlatBoard', 'MiComet', 'BLLover', 'LightBeam', \ + 'IdolConcert', 'StreamOfTears', 'MariLamy', 'BrokenDreams', 'RapDog', 'BoneBros', 'RingOfFitness', \ + 'MiKorone', 'SnowSake', 'ImDie', 'AbsoluteWall', 'EldritchHorror' + ], + + 'unlockedOutfits':[ + 'default', 'ameAlt1', 'kiaraAlt1', 'inaAlt1', 'guraAlt1', 'calliAlt1', 'irysAlt1', 'baeAlt1', \ + 'sanaAlt1', 'faunaAlt1', 'mumeiAlt1', 'kroniiAlt1', 'kurokami', 'ameAlt2', 'inaAlt2', 'guraAlt2', \ + 'calliAlt2', 'kiaraAlt2', 'irysAlt2', 'faunaAlt2', 'kroniiAlt2', 'fubukiAlt1', 'mioAlt1', 'koroneAlt1', 'okayuAlt1', \ + 'soraAlt1', 'azkiAlt1', 'robocoAlt1', 'suiseiAlt1', 'mikoAlt1' + ] + + } + ], + + #this option can use for loop modeify it, but will break the system architecture,so I don't use it + 'save_editor_achievements':[ + self.ui.save_editor_func_1[2], + { + 'achievements':{ + 'pacifist': {'flags': {}, 'unlocked': 'True'}, 'midboss': {'flags': {}, 'unlocked': 'True'}, \ + 'kiara10': {'flags': {}, 'unlocked': 'True'}, 'okayuGachikoi': {'flags': {}, 'unlocked': 'True'}, 'melGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'kroniiClear': {'flags': {}, 'unlocked': 'True'}, 'speedrunner': {'flags': {}, 'unlocked': 'True'}, 'soloBeater': {'flags': {}, 'unlocked': 'True'}, \ + 'iDidIt': {'flags': {}, 'unlocked': 'True'}, 'ayameGachikoi': {'flags': {}, 'unlocked': 'True'}, 'haatoGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'shionGachikoi': {'flags': {}, 'unlocked': 'True'}, 'obliterated': {'flags': {}, 'unlocked': 'True'}, 'mumeiGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'SCT': {'flags': {}, 'unlocked': 'True'}, 'okayuClear': {'flags': {}, 'unlocked': 'True'}, 'kiaraGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'akiClear': {'flags': {}, 'unlocked': 'True'}, 'suiseiGachikoi': {'flags': {}, 'unlocked': 'True'}, 'mioGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'CEOnow': {'flags': {}, 'unlocked': 'True'}, 'shion10': {'flags': {}, 'unlocked': 'True'}, 'fired': {'flags': {}, 'unlocked': 'True'}, 'lv100': {'flags': {}, \ + 'unlocked': 'True'}, '2hard': {'flags': {}, 'unlocked': 'True'}, 'subaruGachikoi': {'flags': {}, 'unlocked': 'True'}, 'toohalu': {'flags': {}, 'unlocked': 'True'}, \ + 'chocoClear': {'flags': {}, 'unlocked': 'True'}, 'kroniiGachikoi': {'flags': {}, 'unlocked': 'True'}, 'wamy': {'flags': {}, 'unlocked': 'True'}, \ + 'payDay': {'flags': {}, 'unlocked': 'True'}, 'painPeko': {'flags': {}, 'unlocked': 'True'}, 'akiGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'mumeiClear': {'flags': {}, 'unlocked': 'True'}, 'koroneGachikoi': {'flags': {}, 'unlocked': 'True'}, 'petDog': {'flags': {}, 'unlocked': 'True'}, \ + 'bae10': {'flags': {}, 'unlocked': 'True'}, 'ameClear': {'flags': {}, 'unlocked': 'True'}, 'irysClear': {'flags': {}, 'unlocked': 'True'}, \ + 'thankYou': {'flags': {}, 'unlocked': 'True'}, 'fullyLoaded': {'flags': {}, 'unlocked': 'True'}, 'luckyDay': {'flags': {}, 'unlocked': 'True'}, \ + 'allcomplete': {'flags': {}, 'unlocked': 'True'}, 'ayameClear': {'flags': {}, 'unlocked': 'True'}, 'delusional': {'flags': {}, 'unlocked': 'True'}, \ + 'faunaClear': {'flags': {}, 'unlocked': 'True'}, 'soraGachikoi': {'flags': {}, 'unlocked': 'True'}, 'irysGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'guraGachikoi': {'flags': {}, 'unlocked': 'True'}, 'irys10': {'flags': {}, 'unlocked': 'True'}, 'buyingPower': {'flags': {}, 'unlocked': 'True'}, \ + 'robocoClear': {'flags': {}, 'unlocked': 'True'}, 'fubukiGachikoi': {'flags': {}, 'unlocked': 'True'}, 'baeGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'shionClear': {'flags': {}, 'unlocked': 'True'}, 'mikoClear': {'flags': {}, 'unlocked': 'True'}, 'fubukiClear': {'flags': {}, 'unlocked': 'True'}, \ + 'firstboss': {'flags': {}, 'unlocked': 'True'}, 'freeStickers': {'flags': {}, 'unlocked': 'True'}, 'guraClear': {'flags': {}, 'unlocked': 'True'}, \ + 'idolPower': {'flags': {}, 'unlocked': 'True'}, 'ina10': {'flags': {}, 'unlocked': 'True'}, '1hard': {'flags': {}, 'unlocked': 'True'}, \ + 'melClear': {'flags': {}, 'unlocked': 'True'}, 'haatoClear': {'flags': {}, 'unlocked': 'True'}, '50hamburgers': {'flags': {}, 'unlocked': 'True'}, \ + 'matsuriGachikoi': {'flags': {}, 'unlocked': 'True'}, '1000damage': {'flags': {}, 'unlocked': 'True'}, 'calliClear': {'flags': {}, 'unlocked': 'True'}, \ + 'hallucinated': {'flags': {}, 'unlocked': 'True'}, 'dontFail': {'flags': {}, 'unlocked': 'True'}, 'azkiGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'secondboss': {'flags': {}, 'unlocked': 'True'}, 'azkiClear': {'flags': {}, 'unlocked': 'True'}, 'idolgroup': {'flags': {}, 'unlocked': 'True'}, \ + 'timeToUpgrade': {'flags': {}, 'unlocked': 'True'}, 'matsuriClear': {'flags': {}, 'unlocked': 'True'}, 'subaruClear': {'flags': {}, 'unlocked': 'True'}, \ + 'hardcoreGamer': {'flags': {}, 'unlocked': 'True'}, 'fleshWound': {'flags': {}, 'unlocked': 'True'}, 'ameGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'sanaClear': {'flags': {}, 'unlocked': 'True'}, 'baeClear': {'flags': {}, 'unlocked': 'True'}, 'koroneClear': {'flags': {}, 'unlocked': 'True'}, \ + 'safeISwear': {'flags': {}, 'unlocked': 'True'}, 'suiseiClear': {'flags': {}, 'unlocked': 'True'}, 'couchPotato': {'flags': {}, 'unlocked': 'True'}, \ + 'thirdboss': {'flags': {}, 'unlocked': 'True'}, 'inaGachikoi': {'flags': {}, 'unlocked': 'True'}, 'grind': {'flags': {}, 'unlocked': 'True'}, \ + 'firstclear': {'flags': {}, 'unlocked': 'True'}, 'powerLevelling': {'flags': {}, 'unlocked': 'True'}, 'kiaraClear': {'flags': {}, 'unlocked': 'True'}, \ + 'korone10': {'flags': {}, 'unlocked': 'True'}, 'sana10': {'flags': {}, 'unlocked': 'True'}, 'dontNeed': {'flags': {}, 'unlocked': 'True'}, \ + 'notTakingAnyChances': {'flags': {}, 'unlocked': 'True'}, 'millionaire': {'flags': {}, 'unlocked': 'True'}, 'boing': {'flags': {}, 'unlocked': 'True'}, \ + 'lv50': {'flags': {}, 'unlocked': 'True'}, 'lookImOnTV': {'flags': {}, 'unlocked': 'True'}, 'aquaClear': {'flags': {}, 'unlocked': 'True'}, \ + 'fullCollab': {'flags': {}, 'unlocked': 'True'}, 'faunaGachikoi': {'flags': {}, 'unlocked': 'True'}, 'mikoGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + '10000damage': {'flags': {}, 'unlocked': 'True'}, 'yagoostatue': {'flags': {}, 'unlocked': 'True'}, 'sanaGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'aquaGachikoi': {'flags': {}, 'unlocked': 'True'}, 'trueRNG': {'flags': {}, 'unlocked': 'True'}, 'justRNG': {'flags': {}, 'unlocked': 'True'}, \ + 'payToWin': {'flags': {}, 'unlocked': 'True'}, 'robocoGachikoi': {'flags': {}, 'unlocked': 'True'}, 'calliGachikoi': {'flags': {}, 'unlocked': 'True'}, \ + 'mioClear': {'flags': {}, 'unlocked': 'True'}, 'chocoGachikoi': {'flags': {}, 'unlocked': 'True'}, 'muscle': {'flags': {}, 'unlocked': 'True'}, \ + 'inaClear': {'flags': {}, 'unlocked': 'True'}, 'calli10': {'flags': {}, 'unlocked': 'True'}, 'soraClear': {'flags': {}, 'unlocked': 'True'} + } + } + ], + #this option can use for loop modeify it, but will break the system architecture,so I don't use it + 'save_editor_characters':[ + self.ui.save_editor_func_1[3], + { + 'characters':[ + ['kronii', 20], ['fubuki', 20], ['calli', 20], ['mel', 20], ['suisei', 20], ['matsuri', 20], ['choco', 20], \ + ['ayame', 20], ['haato', 20], ['random', 0], ['none', 0], ['roboco', 20], ['fauna', 20], ['sora', 20], ['miko', 20], ['empty', 0], ['gura', 20], ['sana', 20], \ + ['okayu', 20], ['aki', 20], ['irys', 20], ['shion', 20], ['bae', 20], ['azki', 20], ['kiara', 20], ['aqua', 20], ['ina', 20], ['korone', 20], ['mio', 20], \ + ['ame', 20], ['subaru', 20], ['mumei', 20] + ], + 'unlockedOutfits':['default', 'ameAlt1', 'kiaraAlt1', 'inaAlt1', 'guraAlt1', 'calliAlt1', 'irysAlt1', 'baeAlt1', 'sanaAlt1', 'faunaAlt1', 'mumeiAlt1', 'kroniiAlt1', 'kurokami', \ + 'ameAlt2', 'inaAlt2', 'guraAlt2', 'calliAlt2', 'kiaraAlt2', 'irysAlt2', 'faunaAlt2', 'kroniiAlt2', 'fubukiAlt1', 'mioAlt1', 'koroneAlt1', 'okayuAlt1', 'soraAlt1', \ + 'azkiAlt1', 'robocoAlt1', 'suiseiAlt1', 'mikoAlt1'] + } + ], + + 'save_editor_unlockedStages':[ + self.ui.save_editor_func_1[4], + { + 'unlockedStages':['STAGE 1', 'STAGE 2', 'STAGE 1 (HARD)','STAGE 3','STAGE 2 (HARD)','TIME STAGE 1'], + 'timeModeUnlocked':True + } + + ], + + 'save_editor_upgrades':[ + self.ui.save_editor_func_1[5], + { + 'food': 5, 'growth': 1, 'specUnlock': 1, 'haste': 5, 'mobUp': 5, 'ATK': 10, 'stamps': 1, 'regen': 5, \ + 'specCDR': 5, 'enhanceUp': 5, 'EXP': 5, 'moneyGain': 10, 'reroll': 10, 'enchantments': 1, 'fandom': 1, 'eliminate': 10, \ + 'pickupRange': 10, 'DR': 5, 'SPD': 10, 'HP': 10.0, 'crit': 5.0 + } + ] } - - - - #detect button + + #load game data + self.game_data_path = f'{os.getenv("LOCALAPPDATA")}\HoloCure\save_n.dat' + self.game_data = self.load_game_data() + + #read HoloCure windows self.ui.page_button.clicked.connect(self.find_windows) - - #connect QCheckBox object + + #connect QCheckBox with modify function func_index = 0 - for group_ID in self.ui.all_group: + for group_ID in self.ui.all_group: for function in group_ID: name = list(self.modify_data.keys())[func_index] func_index+=1 - function.clicked.connect(lambda state, x=name: self.thread(x)) + function.clicked.connect(lambda state, x=name: self.select_modify_type(x)) self.move(40, 40) self.show() - + + def load_game_data(self): + try: + #read HoloCure data file + with open(self.game_data_path, 'rb') as f: + #decode data + decode_data = base64.b64decode(f.read()) + + #enable save_editor_func + for function in self.ui.all_group[-1]: + function.setEnabled(True) + + return json.loads(decode_data) + + except: + QMessageBox.critical(None, self.info[self.ui.language]['data_error'][0], self.info[self.ui.language]['data_error'][1]) + def find_windows(self): - - #get game dll + #get HoloCure dll file try: self.windows = Pymem("HoloCure.exe") self.game_module = module_from_name(self.windows.process_handle, "HoloCure.exe").lpBaseOfDll - #enable function - for functions in self.ui.all_group: + #enable func + for functions in self.ui.all_group[:-1]: for function in functions: function.setEnabled(True) - #success QMessageBox.information(None, self.info[self.ui.language]['scan'][0], self.info[self.ui.language]['scan'][1]) except: - - #error QMessageBox.critical(None, self.info[self.ui.language]['error'][0], self.info[self.ui.language]['error'][1]) - - def thread(self, text): - print(text) - t = threading.Thread(target = self.modify, args = (text,)) - t.setDaemon(True) - t.start() + + def select_modify_type(self, text): + #save editor + if text.split('_')[0]== 'save': + self.save_editor(text) + #dynamic modeify + else: + t = threading.Thread(target = self.dynamic_modify, args = (text,)) + t.setDaemon(True) + t.start() + + - def modify(self,text): + def dynamic_modify(self, text): + + function, interlock, value, address, offsets = self.modify_data[text] - #Mistake Proofing - if text == 'func_name_2_ex': - self.ui.func_group_2[1].setChecked(False) - elif text =='func_name_2_ex_ame': - self.ui.func_group_2[0].setChecked(False) - elif text=='func_name_3_level_up': - self.ui.func_group_3[1].setChecked(False) - elif text=='func_name_3_stop_level_up': - self.ui.func_group_3[0].setChecked(False) - - #get modeify data - function, value, address, offsets = self.modify_data[text] + #interlock function + if interlock != None: + interlock.setChecked(False) - #modeify + #modify memory while(1): if function.isChecked(): try: addr = self.calculate_address(self.game_module + address, offsets) - - #coin have 2 address - if text == 'func_name_4_coin_1' and self.windows.read_int(addr) == 0: - function, value, address, offsets = self.modify_data['func_name_4_coin_2'] - addr = self.calculate_address(self.game_module + address, offsets) - - #write data if self.windows.read_int(addr) != value: self.windows.write_int(addr, value) except: pass + else: break - - - - + def save_editor(self, text): + function, data = self.modify_data[text] + try: + #modify game data + if function.isChecked(): + for modify_name, val in data.items(): + self.game_data[modify_name] = val + + #write game data + with open(self.game_data_path, 'wb') as f: + res = base64.b64encode(json.dumps(self.game_data).encode('UTF-8')) + f.write(res) + + QMessageBox.information(None, self.info[self.ui.language]['save_editor_success'][0], self.info[self.ui.language]['save_editor_success'][1]) + + except: + QMessageBox.critical(None, self.info[self.ui.language]['save_editor_error'][0], self.info[self.ui.language]['save_editor_error'][1]) + + + def calculate_address(self, address, offsets): addr = self.windows.read_int(address) for cnt,offset in enumerate(offsets): @@ -134,8 +275,9 @@ def calculate_address(self, address, offsets): - -app = QApplication(sys.argv) -w = AppWindow() -w.show() -sys.exit(app.exec_()) +if __name__ == '__main__': + app = QApplication(sys.argv) + app.setQuitOnLastWindowClosed(True) + w = AppWindow() + w.show() + sys.exit(app.exec_()) diff --git a/screen.png b/screen.png index b7221fc2241991900097b80dc6f52799e38e515b..ec265dd289dfd5b89644dc06d9a8f3a155c80521 100644 GIT binary patch literal 26399 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 literal 15060 zcmch8cT`i`zh}5y!3#+Aihv-Xpdek4-XbC*O{9ZVDbk5Z?;=-vK%{r1w}7D}KnS2f zs1kZF8jwgRp+jhy>L$cL!x{We^CFK!5t;0?_{B)e}=s z5Qwqk*B@0kw9F0!l5k2i=!<3@q&uJo1my&uNo!*h`6;>Vyu>*G#ZaQ-A& zHIxpd`4HK%H0_Xw`5lBzX7M%8Ea)RZ4yQ+Tlrm^?s#{kwQEf{(_wV0#VgO-OptRO& z`~hfO$O>fMZ&cgq(?~pre7z!hc{-MbwxjI~+cdj)x`GL;xxoO+Px!e3a#d7?9$K{? zr=VKM2NFN`x$c)%fZbEbZ&S!0C}r&^KesbWQ2@ zap2M#^aQqe4k5MdqDTCuSz5RFAiGJFEgaV|Wu!4eniu5iFYi035P~0oo@R*#FE0jf zOGC)-7Ml-sLQW`Wr-h+sox7nY>-wd6W0RhXK?jFQXKBY8@?$}S?lFFkKLR17`rgU-T5;n{kH%@m!sMWZFvR&qoG@m=QnM zW~TXssmGCtR#<$+O20slj&QYQ&}xy5uUk&J4@Xq_>2p=()=W`N+l4`K6^Q(MY|9CJ2f34@)<&^5}FCEh(B5VAFv#dm#*{PX@| z(E79kSLh~tXx-MpRnft=BmBEq7E$xDxjW;t2xlr$i`SnP#&E%t79_vpEc)Z)jYaa$ zbl4XTXh>yR^J>ZDX%|9`Dd=bt@?j-&4j8kFVN0hL^)U!$H*jGeO4%osc*slk(Lx(P z6UrWB1d>juySUCeNf^=@*Q?g^+!I{zR;Z@#O4td>7jy8H{(S3xp7%mpF=D{2co(v@ z&_=k8{7BCtVvY)>Tr*zhZ?)Xb%vuv&fmh0tPOBHmN2HaF9CrCTz^)%gdp>z*a|Fsf zDfD%E4di&8Aa%q*mH(AqRKz)O-w^F<-h4EGm(D$&Xd1;qiU;Dy#x9v756#j@fg+bC zlH^h-tHC5nIrzLP(wP_OQ22_(2O)bxDD(;Ela$Q1dlNr9mlC)zON`wf^UdXiQRIR| z_a^joP2P}s6o zZeu5pg5?_ciO_5mavEth13y_0Js-fGor<245p8-)e^1kZ^3c=Rwt6CgY@^n-plOwN zQix;X7%5CRZ$M@q|KtlHb+jGpTq8i=II~{LyF2Q$+fvggg9xtRcBi8%{nf&$s9ygQ!2FGo_242v^q}-K)-Zm9zT_xFx(*%g=Y^eAlmw$^ zN47-{r*UMmRY$yLMfoYy4O%P2l!ZL=HFY_iBoob0FxFPmH*7hg$at^vs(7Z}pG zLL0h8E141_)oHePfP|c%5@HXYs@#!G!P>HVd8c8HYUhuiZ*KSqg^q20(6mG!z6>r_ zz8aeR)oN4okww4G`5r9?WsEk|h$F?;C5z+yPML2A4voKRJu?sKSfCU_cKAY1Wm)Q@ zIqq0yc=Dy8frxT+*6p{eD;WAS@04eWX~=V%oQ@4wU8Vmj#D~WN7#1H)jm02I;P zT!)tPkt}!?`n~b_kp^AxvXPEOJy{b=LhbQi|08BAxFj(r>eqW$uWQbsS-;hr9G^hQ&8U4dh|ygq8}2NR$>NB z;u7L+50P`MWX_+E!?_T!28U@+-Q)CMzTyjUb{~7|$lv9xkqkB4T`kS?X)91t7tZe= zL(A|B_~E1Zn98&V5=@T=xXNcqG|PERgVWh1EgGqg#Ss$6bPU&TiucO}=B3RyP7W(JX|r zDeV{Mtwh54&->1GBi0w)#g^O_DQ9URh(h5IO2T=Rm3CE{6UP}9`OX85&}~|noBhj| zD|1brPVZ$UrBRUGj?tOdz_gRG^CV=y z(n>fr;B>oN6umBffoQByd{m9z95F&zCGBbk6qE>)T*n?-cywKhx3HE|X!}&^-b>n& zYON}>E$gFAD0_Q4ca6m@_35MTaz;I~F8z&@5dH`e+XKshqL9lW;ZrVbNQdO z6lk$XiIh`>-WaL|N`E$9AFB)QMztMNla6x1bNjv__(9(`${>ldjXL*5g`DiCS)IqY zR5u;>RaOU07mMmcrSB&x1xmMoDaUG@f$KGA$D?_t+k}|KLf34=!orBhZh!4M7lnMo zgzBg_$PfB0z72>4pY7B%KCtR&^C>>)At8ui5&rXoqGMgum&gYmH(EFao4Iq+GNruz zIBC3}yMNRooDY)x(*~aqj)rwkEfwl*q~8g|FGJ3|tX`v~fIH7XAM01%OdUxJkj$}W z*pISou`F5U3R$TOfg{d=A^6c9ilTl7`o5+i{Sd+uGo2AyF2*S4RdlS$tbvJtq5^L%(05ob8{~9L*AFLa9T# z1TD9hW5cEOSI&uZu$qNXw~dl2_l}yMzqhTfE@~bvkj^aK##PICLU4f#ONaZLExUtQ zQ(?nUV_l8}N2!E{vz@fI(^OQ;j|npaw@WXKA7D=ANk*n2dPM$|;lfHW0i%gpV@v;Hk+gVo;SvYi zw1UTozA-CKnO8Th_(b1NDelO<+$hL5F^$~&77k{fG*`DU%Tu*0&~nLzgf1XbF~o{W ze1l?7H{^VqNs^4zPPO5c2Y>^n6ISWL+Jnjn<<7k^Je&4G`~BX%ULm)yazQ<6UBqges+W z(({;ri+tl$W!GOY8p2SPv9mhENwtXmS?G~+EfhRn_tPMoUxueS! z#?mF3$5kI@EWiXywOGe8=I*+8X6{X0_8xl8HvuSNL$e!&3_W_9tFW4@HTz;A)i6V( z_P3m<`yGuy)bX|-vChDu7PQtXi0OHL_&>mF_R^wl@`bep@W`1G#&XA#Xq3$vF(<;w zhQSwemQ&OEy<`o%U=p;^cK)s5qz1A@Walo#ZW`7E7|vW;B0t#|B^Oh@QD=uEk|Gw| zsg)9LKu;xi))z2=k>r%Oa+KV^#;pwWANxyk6MM%R%UpEpKCFlnvB{MFw$pw`IaT!0 zB<~n|Q@`%xj`%~na2<{QW+#35wU-ipzHr;bruEwXoluP}G9fP%ShN{5*SrfBk0($O zr0{Wf;-9NWXG#r?(r~NFhZrrs;>f4e))&bR>-ewJ+q39?%kv$Vmkxk@@);LRDVN!Z z5Hlycp(*3tN^&zbHXsvY!9cY4i9#)#|3gWwGptJny2STbI)x{=#* zJP?RK9Lv?M$IcrmG}>eNWu7D4#I4-m1Jett3EqprhpVhi=HBCmL<>CTiT@#baRaLx zcAxW@1$y?uOvEy9G#tw>ICRf)m_guxgvzubRd+;f>W2mJbA6H*)-^ty^Thq=ZW3rn zZ`N?{uSXxN+AA0i@euEMIm7J9<3`gd+7xF7shsnb$)g%wqSO5yD>}6#X`ex@PnZsx zKtRT{u+wXmUduzBjGToY%tJ%hJVQ^k7fHSY>s6L@=ua+_#egD>)ucYRf}Kr=%1#{k zqmkgqa);MuC2>|K9`rwaJ}S9{T+rmMk(}QvQ`AF!EII~9W9nTcZk*TW{RXc|y{iN* zefmQ`?>N~g3gu#J8tSf-Q0b$sa%V~S3F(JP9nlqU1sVSIGti6mczRWGoCnJ-H-^9J zicc9IDfUq9{#Gj^70t0bI$+#i(=-Nw5?a`P*mlP|b^p=~gI~N@bN7d0Pd?>{ak<@i zd`4%jF&9cXJ6?(fXJ3%?38+{^oKga2K!*!~q+i7Cn09?^DtI;4Du@)gn1xjVo{koD z5zr=(qp{E#6x52%j+m#Wbhf-IAK&WXvlhf@im_N=Tls4A*-g9NbhCMmN8tQ;vaOmC z8x|lh9ee!wy2Vn3fjLE(4&?F>xRx8By?_98D&4vbJ6L1Y1EDg7M`$ zFsdpJ3j$B2cbi=R3OkEEpVlOZ*<3#$z&$LG_j6d^8Wk8d=xbZ^b`EgRsK`s z+o2uRULPKhpRRMT^85Y{(3M3@0%=wu

AeCYQ--37R2&;DL@+VDocxbK}NV80cba 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