Skip to content

Commit b14dbf1

Browse files
committed
wet-wealth
1 parent 2a5e5cb commit b14dbf1

3 files changed

Lines changed: 91 additions & 36 deletions

File tree

app/src/main/cpp/include/utils.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,55 @@
88
#include <jni.h>
99
#include <string>
1010
#include <vector>
11+
#include <BNM/Class.hpp>
12+
#include <BNM/Method.hpp>
13+
#include <BNM/Field.hpp>
14+
#include <BNM/Property.hpp>
1115

1216
jboolean toJboolean(JNIEnv *env, jobject obj);
1317

1418
jint toJint(JNIEnv *env, jobject obj);
1519

1620
jobjectArray toJobjectArray(JNIEnv *env, const std::vector<std::string> &feats);
1721

22+
23+
template<typename T>
24+
BNM::Method<T> GetMethod(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name,
25+
int parameters = -1) {
26+
BNM::Method<T> method = BNM::Class(instant->klass).GetMethod(name, parameters);
27+
return method[instant];
28+
}
29+
30+
template<typename T>
31+
BNM::Method<T> GetMethod(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name,
32+
const std::initializer_list<std::string_view> &parameterNames) {
33+
BNM::Method<T> method = BNM::Class(instant->klass).GetMethod(name, parameterNames);
34+
return method[instant];
35+
}
36+
37+
template<typename T>
38+
BNM::Method<T> GetMethod(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name,
39+
const std::initializer_list<BNM::CompileTimeClass> &parameterTypes) {
40+
BNM::Method<T> method = BNM::Class(instant->klass).GetMethod(name, parameterTypes);
41+
return method[instant];
42+
}
43+
44+
template<typename T>
45+
T GetField(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name) {
46+
BNM::Field<T> field = BNM::Class(instant->klass).GetField(name);
47+
return field[instant]();
48+
}
49+
50+
template<typename T>
51+
T GetProperty(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name) {
52+
BNM::Property<T> property = BNM::Class(instant->klass).GetProperty(name);
53+
return property[instant]();
54+
}
55+
56+
template<typename T>
57+
void SetProperty(BNM::IL2CPP::Il2CppObject *instant, const std::string_view &name, T value) {
58+
BNM::Property<T> property = BNM::Class(instant->klass).GetProperty(name);
59+
property[instant]() = value;
60+
}
61+
1862
#endif //ANDROID_MOD_MENU_BNM_UTILS_H

app/src/main/cpp/wet-wealth.cpp

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,6 @@ Java_com_android_support_Menu_valueChange(
7474
}
7575
}
7676

77-
BNM::Class UserCharacterFactory{};
78-
BNM::Class CharacterStaticUsecase{};
79-
BNM::Class UserCharactersUsecase{};
80-
BNM::Class CharacterStatic{};
81-
BNM::Class List{};
82-
8377
void (*old_AddItem)(void *instance, void *item, int count);
8478

8579
void new_AddItem(void *instance, void *item, int count) {
@@ -94,31 +88,46 @@ void new_AddCharacterTemptation(void *instance, void *character, int added) {
9488

9589
void (*old_Load)(void *instance);
9690

97-
void new_Load(void *instance) {
91+
void new_Load(BNM::IL2CPP::Il2CppObject *instance) {
9892
old_Load(instance);
9993
if (feature.characters) {
100-
auto userCharacterFactory = static_cast<BNM::Field<BNM::IL2CPP::Il2CppObject *>>(UserCharactersUsecase.GetField(
101-
"userCharacterFactory"))[instance]();
102-
auto characterStaticUsecase = static_cast<BNM::Field<BNM::IL2CPP::Il2CppObject *>>(UserCharacterFactory.GetField(
103-
"characterStaticUsecase"))[userCharacterFactory]();
104-
auto characters = static_cast<BNM::Property<BNM::IL2CPP::Il2CppObject *>>(CharacterStaticUsecase.GetProperty(
105-
"Characters"))[characterStaticUsecase]();
106-
auto CharactersList = List.GetGeneric(
107-
{CharacterStatic});
108-
auto count = static_cast<BNM::Property<int>>(CharactersList.GetProperty(
109-
"Count"))[characters]();
110-
auto getItem = static_cast<BNM::Method<BNM::IL2CPP::Il2CppObject *>>(CharactersList.GetMethod(
111-
"get_Item"))[characters];
112-
BNM::Method<void> AddCharacterOrExperience = UserCharactersUsecase.GetMethod(
113-
"AddCharacterOrExperience")[instance];
114-
BNM::Property<int> Id = CharacterStatic.GetProperty("Id");
94+
auto userCharacterFactory = GetField<BNM::IL2CPP::Il2CppObject *>(instance,
95+
"userCharacterFactory");
96+
auto characterStaticUsecase = GetField<BNM::IL2CPP::Il2CppObject *>(userCharacterFactory,
97+
"characterStaticUsecase");
98+
auto characters = GetProperty<BNM::IL2CPP::Il2CppObject *>(characterStaticUsecase,
99+
"Characters");
100+
101+
auto count = GetProperty<int>(characters, "Count");
102+
auto getItem = GetMethod<BNM::IL2CPP::Il2CppObject *>(characters, "get_Item");
103+
auto AddCharacterOrExperience = GetMethod<void>(instance,
104+
"AddCharacterOrExperience");
115105
for (int i = 0; i < count; ++i) {
116-
AddCharacterOrExperience(Id[getItem(i)](), 100);
106+
auto character = getItem(i);
107+
int id = GetProperty<int>(character, "Id");
108+
AddCharacterOrExperience(id, 100);
117109
}
118110
}
119111
}
120112

121113

114+
int (*old_GetLocationCurrentLevel)(void *instance, void *config);
115+
116+
int new_GetLocationCurrentLevel(BNM::IL2CPP::Il2CppObject *instance,
117+
BNM::IL2CPP::Il2CppObject *config) {
118+
int level = old_GetLocationCurrentLevel(instance, config);
119+
if (level > 5) {
120+
auto staticItems = GetProperty<BNM::IL2CPP::Il2CppObject *>(config, "LocationKey");
121+
auto userInventoryUsecase = GetField<BNM::IL2CPP::Il2CppObject *>(instance,
122+
"userInventoryUsecase");
123+
auto RemoveItem = GetMethod<void>(userInventoryUsecase, "RemoveItem");
124+
RemoveItem(staticItems, level - 5);
125+
level = 5;
126+
}
127+
return level;
128+
}
129+
130+
122131
// [Wet Wealth](https://www.nutaku.net/games/wet-wealth/)
123132
void OnLoaded() {
124133
LOGI("OnLoaded");
@@ -128,20 +137,20 @@ void OnLoaded() {
128137
AssemblyCSharp);
129138
auto AddItem = UserInventoryUsecase.GetMethod("AddItem");
130139

131-
UserCharacterFactory = BNM::Class("WetWealth.Characters", "UserCharacterFactory",
132-
AssemblyCSharp);
133-
CharacterStaticUsecase = BNM::Class("WetWealth.Characters", "CharacterStaticUsecase",
134-
AssemblyCSharp);
135-
CharacterStatic = BNM::Class("WetWealth.Characters", "CharacterStatic",
136-
AssemblyCSharp);
137-
UserCharactersUsecase = BNM::Class("WetWealth.Characters", "UserCharactersUsecase",
138-
AssemblyCSharp);
139-
List = BNM::Class("System.Collections.Generic", "List`1", BNM::Image("mscorlib"));
140+
auto UserCharactersUsecase = BNM::Class("WetWealth.Characters", "UserCharactersUsecase",
141+
AssemblyCSharp);
140142
auto AddCharacterTemptation = UserCharactersUsecase.GetMethod("AddCharacterTemptation");
141143
auto Load = UserCharactersUsecase.GetMethod("Load");
142144

145+
auto CityPaidLocationsUsecase = BNM::Class("WetWealth.PaidLocations",
146+
"CityPaidLocationsUsecase",
147+
AssemblyCSharp);
148+
auto GetLocationCurrentLevel = CityPaidLocationsUsecase.GetMethod("GetLocationCurrentLevel");
149+
143150

144151
BNM::BasicHook(AddItem, new_AddItem, old_AddItem);
145152
BNM::BasicHook(AddCharacterTemptation, new_AddCharacterTemptation, old_AddCharacterTemptation);
146153
BNM::BasicHook(Load, new_Load, old_Load);
154+
BNM::BasicHook(GetLocationCurrentLevel, new_GetLocationCurrentLevel,
155+
old_GetLocationCurrentLevel);
147156
}

app/src/main/java/com/android/support/Menu.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ const val POS_X = 20
4545
const val POS_Y = 50
4646

4747
const val MENU_WIDTH = 290
48-
const val MENU_HEIGHT = 250
4948

5049
val MENU_BG_COLOR = "#EE1C2A35".toColorInt()//#AARRGGBB
5150
val MENU_FEATURE_BG_COLOR = "#DD141C22".toColorInt() //#AARRGGBB
@@ -98,6 +97,9 @@ class Menu(val context: Activity) {
9897
}
9998

10099
MotionEvent.ACTION_UP -> {
100+
var params = rootFrame.layoutParams as WindowManager.LayoutParams
101+
write("POS_X", params.x)
102+
write("POS_Y", params.y)
101103
rootFrame.alpha = 1f
102104
if (isClicked) {
103105
v.performClick()
@@ -122,8 +124,8 @@ class Menu(val context: Activity) {
122124
val frameParams = WindowManager.LayoutParams(
123125
WindowManager.LayoutParams.WRAP_CONTENT,
124126
WindowManager.LayoutParams.WRAP_CONTENT,
125-
POS_X, //initialX
126-
POS_Y, //initialY
127+
read("POS_X", POS_X), //initialX
128+
read("POS_Y", POS_Y), //initialY
127129
WindowManager.LayoutParams.TYPE_APPLICATION,
128130
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
129131
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
@@ -304,7 +306,7 @@ class Menu(val context: Activity) {
304306
@Suppress("UNCHECKED_CAST")
305307
fun <T> read(key: String, defaultValue: T): T {
306308
return when (defaultValue) {
307-
is String -> sharedPreferences.getString(key, defaultValue) ?: defaultValue
309+
is String -> sharedPreferences.getString(key, defaultValue)
308310
is Int -> sharedPreferences.getInt(key, defaultValue)
309311
is Boolean -> sharedPreferences.getBoolean(key, defaultValue)
310312
else -> defaultValue

0 commit comments

Comments
 (0)