Skip to content

Commit e04a433

Browse files
committed
Search by Name - Support to different database formats.
It mirrors ManiacPatch::GetLcfName structure. Update game_interpreter.cpp
1 parent 8bc649c commit e04a433

File tree

2 files changed

+128
-28
lines changed

2 files changed

+128
-28
lines changed

Diff for: src/game_interpreter.cpp

+127-27
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
#include "baseui.h"
6969
#include "algo.h"
7070
#include "rand.h"
71-
#include <variant>
7271

7372
enum BranchSubcommand {
7473
eOptionBranchElse = 1
@@ -5110,47 +5109,148 @@ bool Game_Interpreter::CommandManiacCallCommand(lcf::rpg::EventCommand const& co
51105109

51115110
return true;
51125111
}
5113-
bool Game_Interpreter::CommandGetVarByName(lcf::rpg::EventCommand const& com) {
5114-
auto& targetData = lcf::Data::variables;
5112+
bool Game_Interpreter::CommandGetIdByName(lcf::rpg::EventCommand const& com) {
5113+
const int dataType = ValueOrVariable(com.parameters[0], com.parameters[1]);
51155114

5116-
int stringVarParam = 6; // string var is detected at com.parameters[n]
5117-
const std::string targetName = ToString(CommandStringOrVariable(com, stringVarParam, stringVarParam + 1));
5118-
if (targetName.empty()) {
5119-
Output::Warning("The variable name to search is empty.");
5120-
return true;
5121-
}
5122-
5123-
const int outputVar = ValueOrVariable(com.parameters[0], com.parameters[1]);
5115+
const int outputVar = ValueOrVariable(com.parameters[2], com.parameters[3]);
51245116
if (outputVar <= 0) {
51255117
Output::Warning("This command requires a valid variable.");
51265118
return true;
51275119
}
51285120

5129-
int rangeMin = ValueOrVariable(com.parameters[2], com.parameters[3]);
5130-
int rangeMax = ValueOrVariable(com.parameters[4], com.parameters[5]);
5121+
int rangeMin = ValueOrVariable(com.parameters[4], com.parameters[5]);
5122+
int rangeMax = ValueOrVariable(com.parameters[6], com.parameters[7]);
51315123

5132-
if (rangeMin <= 0) rangeMin = 1;
5133-
if (rangeMin > static_cast<int>(targetData.size())) rangeMin = static_cast<int>(targetData.size());
5134-
if (rangeMax <= 0 || rangeMax >= static_cast<int>(targetData.size())) rangeMax = static_cast<int>(targetData.size());
5124+
const std::string targetName = ToString(CommandStringOrVariable(com, 8, 9));
5125+
if (targetName.empty()) {
5126+
Output::Warning("The name to search is empty.");
5127+
return true;
5128+
}
51355129

5136-
if (rangeMax < rangeMin) std::swap(rangeMin, rangeMax);
5130+
auto GetName = [](const auto& obj) -> std::string {
5131+
using T = std::decay_t<decltype(obj)>;
51375132

5138-
auto it = std::find_if(targetData.begin() + rangeMin - 1, targetData.begin() + rangeMax,
5139-
[&](const auto& entry) { return entry.name == targetName; });
5133+
if constexpr (std::is_same_v<T, Game_Event>) {
5134+
return ToString(obj.GetName());
5135+
}
5136+
else if constexpr (std::is_same_v<T, Game_Actor*>) {
5137+
return ToString(obj->GetName());
5138+
}
5139+
else {
5140+
return ToString(obj.name);
5141+
}
5142+
};
51405143

5141-
if (it != targetData.end()) {
5142-
const int id = std::distance(targetData.begin(), it) + 1;
5144+
auto find_by_name = [&](const auto& vec) -> int {
5145+
if (rangeMin <= 0) rangeMin = 1;
5146+
if (rangeMin > static_cast<int>(vec.size())) rangeMin = static_cast<int>(vec.size());
51435147

5144-
if (id >= rangeMin && id <= rangeMax) {
5145-
Output::Debug(" Variable \"{}\" found at ID: {}. Storing ID in variable {}.", targetName, id, outputVar);
5148+
if (rangeMax <= 0 || rangeMax >= static_cast<int>(vec.size())) rangeMax = static_cast<int>(vec.size());
5149+
if (rangeMax < rangeMin) std::swap(rangeMin, rangeMax);
51465150

5147-
Main_Data::game_variables->Set(outputVar, id);
5148-
Game_Map::SetNeedRefresh(true);
5149-
return true;
5151+
for (int i = rangeMin - 1; i < rangeMax; ++i) {
5152+
if (GetName(vec[i]) == targetName) {
5153+
return i + 1;
5154+
}
51505155
}
5156+
return 0;
5157+
};
5158+
5159+
std::string typeName = "Unknown";
5160+
int id = 0;
5161+
switch (dataType) {
5162+
case 0:
5163+
typeName = "Actor";
5164+
id = find_by_name(lcf::Data::actors);
5165+
break;
5166+
case 1:
5167+
typeName = "Skill";
5168+
id = find_by_name(lcf::Data::skills);
5169+
break;
5170+
case 2:
5171+
typeName = "Item";
5172+
id = find_by_name(lcf::Data::items);
5173+
break;
5174+
case 3:
5175+
typeName = "Enemy";
5176+
id = find_by_name(lcf::Data::enemies);
5177+
break;
5178+
case 4:
5179+
typeName = "Troop";
5180+
id = find_by_name(lcf::Data::troops);
5181+
break;
5182+
case 5:
5183+
typeName = "Terrain";
5184+
id = find_by_name(lcf::Data::terrains);
5185+
break;
5186+
case 6:
5187+
typeName = "Attribute";
5188+
id = find_by_name(lcf::Data::attributes);
5189+
break;
5190+
case 7:
5191+
typeName = "State";
5192+
id = find_by_name(lcf::Data::states);
5193+
break;
5194+
case 8:
5195+
typeName = "Animation";
5196+
id = find_by_name(lcf::Data::animations);
5197+
break;
5198+
case 9:
5199+
typeName = "Tileset";
5200+
id = find_by_name(lcf::Data::chipsets);
5201+
break;
5202+
case 10:
5203+
typeName = "Switch";
5204+
id = find_by_name(lcf::Data::switches);
5205+
break;
5206+
case 11:
5207+
typeName = "Variable";
5208+
id = find_by_name(lcf::Data::variables);
5209+
break;
5210+
case 12:
5211+
typeName = "String Variable";
5212+
Output::Warning("{} names are not supported yet.", typeName); // FIXME: .t[a].name? - String variables don't support name yet
5213+
return true;
5214+
// Main_Data::game_strings->GetLcfData();
5215+
// break;
5216+
case 13:
5217+
typeName = "Common Event";
5218+
id = find_by_name(lcf::Data::commonevents);
5219+
break;
5220+
case 14:
5221+
typeName = "Class";
5222+
id = find_by_name(lcf::Data::classes);
5223+
break;
5224+
case 15:
5225+
typeName = "Battler Animation";
5226+
id = find_by_name(lcf::Data::battleranimations);
5227+
break;
5228+
case 16:
5229+
typeName = "Map";
5230+
id = find_by_name(lcf::Data::treemap.maps);
5231+
break;
5232+
case 17:
5233+
typeName = "Map Event";
5234+
id = find_by_name(Game_Map::GetEvents());
5235+
break;
5236+
case 18:
5237+
typeName = "Party Member";
5238+
id = find_by_name(Main_Data::game_party.get()->GetActors());
5239+
break;
5240+
default:
5241+
Output::Warning("Unsupported data type: {}({})", typeName, dataType);
5242+
return true;
5243+
}
5244+
5245+
if (id > 0) {
5246+
Output::Debug(" {} \"{}\" found at ID: {}. Storing ID in variable {}.", typeName, targetName, id, outputVar);
5247+
Main_Data::game_variables->Set(outputVar, id);
5248+
Game_Map::SetNeedRefresh(true);
5249+
}
5250+
else {
5251+
Output::Warning("{} \"{}\" not found within the range {} to {}.", typeName, targetName, rangeMin, rangeMax);
51515252
}
51525253

5153-
Output::Warning("Variable \"{}\" not found within the range of variables {} to {}.", targetName, rangeMin, rangeMax);
51545254
return true;
51555255
}
51565256

Diff for: src/game_interpreter.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ class Game_Interpreter
290290
bool CommandManiacControlStrings(lcf::rpg::EventCommand const& com);
291291
bool CommandManiacCallCommand(lcf::rpg::EventCommand const& com);
292292

293-
bool CommandGetVarByName(lcf::rpg::EventCommand const& com);
293+
bool CommandGetIdByName(lcf::rpg::EventCommand const& com);
294294

295295
int DecodeInt(lcf::DBArray<int32_t>::const_iterator& it);
296296
const std::string DecodeString(lcf::DBArray<int32_t>::const_iterator& it);

0 commit comments

Comments
 (0)