1 #ifndef EP_TEST_MOCK_ACTOR
2 #define EP_TEST_MOCK_ACTOR
3 
4 #include "game_actors.h"
5 #include "game_party.h"
6 #include "game_enemyparty.h"
7 #include "game_system.h"
8 #include "game_variables.h"
9 #include "game_switches.h"
10 #include "game_player.h"
11 #include "game_battle.h"
12 #include "main_data.h"
13 #include "player.h"
14 #include "output.h"
15 #include <lcf/data.h>
16 
InitEmptyDB()17 static void InitEmptyDB() {
18 	auto initVec = [](auto& v, int size) {
19 		v.resize(size);
20 		for (int i = 0; i < size; ++i) {
21 			v[i].ID = i + 1;
22 		}
23 	};
24 	lcf::Data::data = {};
25 
26 	initVec(lcf::Data::actors, 20);
27 	initVec(lcf::Data::skills, 200);
28 	initVec(lcf::Data::items, 200);
29 	initVec(lcf::Data::enemies, 20);
30 	initVec(lcf::Data::troops, 20);
31 	initVec(lcf::Data::terrains, 20);
32 	initVec(lcf::Data::attributes, 20);
33 	initVec(lcf::Data::states, 20);
34 	initVec(lcf::Data::chipsets, 20);
35 	initVec(lcf::Data::commonevents, 20);
36 	initVec(lcf::Data::battlecommands.commands, 20);
37 	initVec(lcf::Data::classes, 100);
38 	initVec(lcf::Data::battleranimations, 200);
39 	initVec(lcf::Data::switches, 200);
40 	initVec(lcf::Data::variables, 200);
41 	initVec(lcf::Data::animations, 200);
42 
43 	for (auto& actor: lcf::Data::actors) {
44 		actor.initial_level = 1;
45 		actor.final_level = 99;
46 		actor.parameters.Setup(actor.final_level);
47 
48 		actor.state_ranks.resize(lcf::Data::states.size(), 2);
49 		actor.attribute_ranks.resize(lcf::Data::attributes.size(), 2);
50 	}
51 
52 	for (auto& item: lcf::Data::items) {
53 		item.attribute_set = lcf::DBBitArray(lcf::Data::attributes.size());
54 		item.state_set = lcf::DBBitArray(lcf::Data::states.size());
55 	}
56 
57 	for (auto& skill: lcf::Data::skills) {
58 		skill.attribute_effects = lcf::DBBitArray(lcf::Data::attributes.size());
59 		skill.state_effects = lcf::DBBitArray(lcf::Data::states.size());
60 	}
61 
62 	for (auto& enemy: lcf::Data::enemies) {
63 		enemy.state_ranks.resize(lcf::Data::states.size(), 1);
64 		enemy.attribute_ranks.resize(lcf::Data::attributes.size(), 2);
65 	}
66 
67 	for (auto& tp: lcf::Data::troops) {
68 		initVec(tp.members, 8);
69 	}
70 
71 	auto& death = lcf::Data::states[0];
72 	death.priority = 100;
73 	death.restriction = lcf::rpg::State::Restriction_do_nothing;
74 
75 }
76 
77 class MockActor {
78 public:
79 	MockActor(int eng = Player::EngineRpg2k3 | Player::EngineEnglish)
80 	{
81 		_engine = Player::engine;
82 		Player::engine = eng;
83 
84 		_ll = Output::GetLogLevel();
85 		Output::SetLogLevel(LogLevel::Error);
86 
87 		InitEmptyDB();
88 
89 		Main_Data::Cleanup();
90 
91 		Main_Data::game_system = std::make_unique<Game_System>();
92 		Main_Data::game_actors = std::make_unique<Game_Actors>();
93 		Main_Data::game_enemyparty = std::make_unique<Game_EnemyParty>();
94 		Main_Data::game_party = std::make_unique<Game_Party>();
95 		Main_Data::game_switches = std::make_unique<Game_Switches>();
96 		Main_Data::game_variables = std::make_unique<Game_Variables>(Game_Variables::min_2k, Game_Variables::max_2k);
97 		Main_Data::game_player = std::make_unique<Game_Player>();
98 
99 		Main_Data::game_party->SetupNewGame();
100 	}
101 
~MockActor()102 	~MockActor() {
103 		Main_Data::Cleanup();
104 
105 		lcf::Data::data = {};
106 		Player::engine = _engine;
107 		Output::SetLogLevel(_ll);
108 	}
109 private:
110 	int _engine = {};
111 	LogLevel _ll = {};
112 };
113 
114 struct MockBattle : public MockActor {
MockActorMockBattle115 	MockBattle(int party_size = 4, int troop_size = 4, int eng = Player::EngineRpg2k3 | Player::EngineEnglish) : MockActor(eng)
116 	{
117 		Main_Data::game_party->Clear();
118 		for (int i = 0; i < party_size; ++i) {
119 			Main_Data::game_party->AddActor(i + 1);
120 		}
121 
122 		auto& tp = lcf::Data::troops[0];
123 		tp.members.resize(troop_size);
124 		for (int i = 0; i < troop_size; ++i) {
125 			tp.members[i].enemy_id = i + 1;
126 		}
127 		Main_Data::game_enemyparty->ResetBattle(1);
128 		Game_Battle::battle_running = true;
129 	}
130 
~MockBattleMockBattle131 	~MockBattle() {
132 		Game_Battle::battle_running = false;
133 	}
134 };
135 
136 inline lcf::rpg::Actor* MakeDBActor(int id, int level = 1, int final_level = 50,
137 		int hp = 1, int sp = 0, int atk = 0, int def = 0, int spi = 0, int agi = 0,
138 		bool two_weapon = false, bool lock_equip = false, bool autobattle = false, bool super_guard = false)
139 {
140 	auto& actor = lcf::Data::actors[id - 1];
141 	actor.initial_level = 1;
142 	actor.final_level = final_level;
143 	actor.parameters.Setup(actor.final_level);
144 	actor.parameters.maxhp[level - 1] = hp;
145 	actor.parameters.maxsp[level - 1] = sp;
146 	actor.parameters.attack[level - 1] = atk;
147 	actor.parameters.defense[level - 1] = def;
148 	actor.parameters.spirit[level - 1] = spi;
149 	actor.parameters.agility[level - 1] = agi;
150 	actor.two_weapon = two_weapon;
151 	actor.lock_equipment = lock_equip;
152 	actor.auto_battle = autobattle;
153 	actor.super_guard = super_guard;
154 
155 	actor.class_id = 0;
156 	actor.exp_base = 1;
157 	actor.exp_inflation = 677;
158 	actor.exp_correction = 40;
159 	return &actor;
160 }
161 
MakeDBEnemy(int id,int hp,int sp,int atk,int def,int spi,int agi)162 inline lcf::rpg::Enemy* MakeDBEnemy(int id,
163 		int hp, int sp, int atk, int def, int spi, int agi)
164 {
165 	auto& enemy = lcf::Data::enemies[id - 1];
166 	enemy.max_hp = hp;
167 	enemy.max_sp = sp;
168 	enemy.attack = atk;
169 	enemy.defense = def;
170 	enemy.spirit = spi;
171 	enemy.agility = agi;
172 	return &enemy;
173 }
174 
175 inline lcf::rpg::Item* MakeDBEquip(int id, int type,
176 		int atk = 1, int def = 1, int spi = 1, int agi = 1,
177 		int hit=100, int crt=0,
178 		bool w1 = false, bool w2 = false, bool w3 = false, bool w4 = false,
179 		bool a1 = false, bool a2 = false, bool a3 = false, bool a4 = false)
180 {
181 	auto& item = lcf::Data::items[id - 1];
182 	item.type = type;
183 	item.atk_points1 = atk;
184 	item.def_points1 = def;
185 	item.spi_points1 = spi;
186 	item.agi_points1 = agi;
187 	item.hit = hit;
188 	item.critical_hit = crt;
189 	item.preemptive = w1;
190 	item.dual_attack = w2;
191 	item.attack_all = w3;
192 	item.ignore_evasion = w4;
193 	item.prevent_critical = a1;
194 	item.raise_evasion = a2;
195 	item.half_sp_cost = a3;
196 	item.no_terrain_damage = a4;
197 	return &item;
198 }
199 
MakeDBSkill(int id,int hit,int power,int phys,int mag,int var)200 inline lcf::rpg::Skill* MakeDBSkill(int id, int hit, int power, int phys, int mag, int var)
201 {
202 	auto& skill = lcf::Data::skills[id - 1];
203 	skill.type = lcf::rpg::Skill::Type_normal;
204 	skill.hit = hit;
205 	skill.power = power;
206 	skill.physical_rate = phys;
207 	skill.magical_rate = mag;
208 	skill.variance = var;
209 	return &skill;
210 }
211 
MakeDBAttribute(int id,int type,int a,int b,int c,int d,int e)212 inline lcf::rpg::Attribute* MakeDBAttribute(int id, int type, int a, int b, int c, int d, int e)
213 {
214 	auto& attr = lcf::Data::attributes[id - 1];
215 	attr.type = type;
216 	attr.a_rate = a;
217 	attr.b_rate = b;
218 	attr.c_rate = c;
219 	attr.d_rate = d;
220 	attr.e_rate = e;
221 	return &attr;
222 }
223 
SetDBActorAttribute(int id,int attr_id,int rank)224 inline void SetDBActorAttribute(int id, int attr_id, int rank) {
225 	auto& actor = lcf::Data::actors[id - 1];
226 	actor.attribute_ranks[attr_id - 1] = rank;
227 }
228 
SetDBEnemyAttribute(int id,int attr_id,int rank)229 inline void SetDBEnemyAttribute(int id, int attr_id, int rank) {
230 	auto& enemy = lcf::Data::enemies[id - 1];
231 	enemy.attribute_ranks[attr_id - 1] = rank;
232 }
233 
SetDBItemAttribute(int id,int attr_id,bool value)234 inline void SetDBItemAttribute(int id, int attr_id, bool value) {
235 	auto& item = lcf::Data::items[id - 1];
236 	item.attribute_set[attr_id - 1] = value;
237 }
238 
SetDBSkillAttribute(int id,int attr_id,bool value)239 inline void SetDBSkillAttribute(int id, int attr_id, bool value) {
240 	auto& skill = lcf::Data::skills[id - 1];
241 	skill.attribute_effects[attr_id - 1] = value;
242 }
243 
Setup(Game_Actor * actor,int hp,int sp,int atk,int def,int spi,int agi)244 inline void Setup(Game_Actor* actor, int hp, int sp, int atk, int def, int spi, int agi) {
245 	actor->SetBaseMaxHp(hp);
246 	actor->SetHp(hp);
247 	actor->SetBaseMaxSp(sp);
248 	actor->SetSp(sp);
249 	actor->SetBaseAtk(atk);
250 	actor->SetBaseDef(def);
251 	actor->SetBaseSpi(spi);
252 	actor->SetBaseAgi(agi);
253 }
254 
Setup(Game_Enemy * enemy,int hp,int sp,int atk,int def,int spi,int agi)255 inline void Setup(Game_Enemy* enemy, int hp, int sp, int atk, int def, int spi, int agi) {
256 	auto& db = lcf::Data::enemies[enemy->GetId() - 1];
257 	db.max_hp = hp;
258 	db.max_sp = sp;
259 	db.attack = atk;
260 	db.defense = def;
261 	db.spirit = spi;
262 	db.agility = agi;
263 
264 	enemy->SetHp(hp);
265 	enemy->SetSp(sp);
266 }
267 
268 
269 
270 #endif
271