@@ -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 }
0 commit comments