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