Skip to content

Commit 3d6c422

Browse files
committed
Process Json: Support specifying the JSON inside the command
1 parent 6908588 commit 3d6c422

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

src/game_interpreter.cpp

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5392,16 +5392,37 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
53925392
};
53935393

53945394
int operation = ValueOrVariable(com.parameters[0], com.parameters[1]);
5395-
int source_var_id = ValueOrVariable(com.parameters[2], com.parameters[3]);
5396-
int target_var_type = ValueOrVariable(com.parameters[4], com.parameters[5]);
5397-
int target_var_id = ValueOrVariable(com.parameters[6], com.parameters[7]);
53985395

5399-
std::string json_path = ToString(CommandStringOrVariable(com, 8, 9));
5396+
json* json_data = nullptr;
5397+
std::optional<json> json_data_imm;
54005398

5401-
if (!Json_Helper::CheckJsonPointer(json_path)) {
5402-
return true;
5399+
int source_var_id = -1;
5400+
5401+
int pos = 0;
5402+
std::string json_path = Main_Data::game_strings->GetWithModeAndPos(com.string, com.parameters[8], com.parameters[9], pos, *Main_Data::game_variables);
5403+
5404+
if (com.parameters[2] == 0) {
5405+
std::string json_str = Main_Data::game_strings->GetWithModeAndPos(com.string, com.parameters[2], com.parameters[3], pos, *Main_Data::game_variables);
5406+
json_data_imm = Json_Helper::Parse(json_str);
5407+
if (json_data_imm) {
5408+
json_data = &*json_data_imm;
5409+
} else {
5410+
Output::Warning("JSON Parse error for {}", json_str);
5411+
return true;
5412+
}
5413+
} else {
5414+
source_var_id = ValueOrVariable(com.parameters[2] - 1, com.parameters[3]);
5415+
json_data = Main_Data::game_strings->ParseJson(source_var_id);
5416+
5417+
if (!json_data) {
5418+
Output::Warning("JSON Parse error for {}", Main_Data::game_strings->Get(source_var_id));
5419+
return true;
5420+
}
54035421
}
54045422

5423+
int target_var_type = ValueOrVariable(com.parameters[4], com.parameters[5]);
5424+
int target_var_id = ValueOrVariable(com.parameters[6], com.parameters[7]);
5425+
54055426
int flags = com.parameters[10];
54065427
bool pretty_print = (flags & 4) == 4;
54075428

@@ -5411,10 +5432,7 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
54115432
json_path = Game_Strings::Extract(json_path, true);
54125433
}
54135434

5414-
auto* json_data = Main_Data::game_strings->ParseJson(source_var_id);
5415-
5416-
if (!json_data) {
5417-
Output::Warning("JSON Parse error for {}", Main_Data::game_strings->Get(source_var_id));
5435+
if (!Json_Helper::CheckJsonPointer(json_path)) {
54185436
return true;
54195437
}
54205438

@@ -5434,6 +5452,11 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
54345452
break;
54355453
}
54365454
case 1: { // Set operation: Update JSON data with a new value
5455+
if (json_data_imm) {
5456+
Output::Warning("CommandEasyRpgProcessJson: Cannot modify constant JSON string");
5457+
return true;
5458+
}
5459+
54375460
std::string new_value = get_var_value(target_var_type, target_var_id);
54385461
result = Json_Helper::SetValue(*json_data, json_path, new_value);
54395462
if (result) {
@@ -5464,7 +5487,7 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
54645487
}
54655488
std::string json_str = "[" + keys_str + "]";
54665489
if (create_keys_obj) {
5467-
json_str = fmt::format(R"({ "keys": {} })", json_str);
5490+
json_str = fmt::format(R"({{ "keys": {} }})", json_str);
54685491
}
54695492
set_var_value(target_var_type, target_var_id, json_str);
54705493
break;
@@ -5494,13 +5517,23 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
54945517
break;
54955518
}
54965519
case 5: { // Remove operation: Remove value from JSON data
5520+
if (json_data_imm) {
5521+
Output::Warning("CommandEasyRpgProcessJson: Cannot modify constant JSON string");
5522+
return true;
5523+
}
5524+
54975525
std::string result = Json_Helper::RemoveValue(*json_data, json_path);
54985526
if (!result.empty()) {
54995527
Main_Data::game_strings->Asg(source_var_id, result);
55005528
}
55015529
break;
55025530
}
55035531
case 6: { // Push operation: Add value to end of array
5532+
if (json_data_imm) {
5533+
Output::Warning("CommandEasyRpgProcessJson: Cannot modify constant JSON string");
5534+
return true;
5535+
}
5536+
55045537
std::string value = get_var_value(target_var_type, target_var_id);
55055538
std::string result = Json_Helper::PushValue(*json_data, json_path, value);
55065539
if (!result.empty()) {
@@ -5514,7 +5547,9 @@ bool Game_Interpreter::CommandEasyRpgProcessJson(lcf::rpg::EventCommand const& c
55145547
// Set popped value to target variable
55155548
set_var_value(target_var_type, target_var_id, element);
55165549
// Update source with modified JSON after pop
5517-
Main_Data::game_strings->Asg(source_var_id, json_obj);
5550+
if (!json_data_imm) {
5551+
Main_Data::game_strings->Asg(source_var_id, json_obj);
5552+
}
55185553
}
55195554
break;
55205555
}

src/json_helper.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@
2929

3030
using json = nlohmann::ordered_json;
3131

32-
namespace {
33-
// Helper function to convert JSON values to strings
34-
std::string GetValueAsString(const json& json_obj);
35-
} // namespace
36-
3732
namespace Json_Helper {
3833
/**
3934
* Parses a JSON string into a JSON object

0 commit comments

Comments
 (0)