@@ -155,6 +155,9 @@ class ProjectConverter3To4::RegExContainer {
155155 int joypad_button_mappings[23 ] = { 0 , 1 , 2 , 3 , 9 , 10 , -1 /* L2*/ , -1 /* R2*/ , 7 , 8 , 4 , 6 , 11 , 12 , 13 , 14 , 5 , 15 , 16 , 17 , 18 , 19 , 20 };
156156 // Entries for L2 and R2 are -1 since they match to joypad axes and no longer to joypad buttons in Godot 4.
157157
158+ // Animation suffixes.
159+ RegEx animation_suffix = RegEx(" ([\" '])([a-zA-Z0-9_-]+)(-(?:loop|cycle))([\" '])" );
160+
158161 LocalVector<RegEx *> class_regexes;
159162
160163 RegEx class_temp_tscn = RegEx(" \\ bTEMP_RENAMED_CLASS.tscn\\ b" );
@@ -406,6 +409,7 @@ bool ProjectConverter3To4::convert() {
406409 rename_common (RenamesMap3To4::shaders_renames, reg_container.shaders_regexes , source_lines);
407410 rename_common (RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes , source_lines);
408411 rename_common (RenamesMap3To4::theme_override_renames, reg_container.theme_override_regexes , source_lines);
412+ rename_animation_suffixes (source_lines, reg_container);
409413
410414 custom_rename (source_lines, " \\ .shader" , " .gdshader" );
411415
@@ -428,6 +432,7 @@ bool ProjectConverter3To4::convert() {
428432 rename_common (RenamesMap3To4::shaders_renames, reg_container.shaders_regexes , source_lines);
429433 rename_common (RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes , source_lines);
430434 rename_common (RenamesMap3To4::theme_override_renames, reg_container.theme_override_regexes , source_lines);
435+ rename_animation_suffixes (source_lines, reg_container);
431436
432437 custom_rename (source_lines, " \\ .shader" , " .gdshader" );
433438
@@ -598,6 +603,7 @@ bool ProjectConverter3To4::validate_conversion() {
598603 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::shaders_renames, reg_container.shaders_regexes , lines));
599604 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes , lines));
600605 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::theme_override_renames, reg_container.theme_override_regexes , lines));
606+ changed_elements.append_array (check_for_rename_animation_suffixes (lines, reg_container));
601607
602608 changed_elements.append_array (check_for_custom_rename (lines, " \\ .shader" , " .gdshader" ));
603609 } else if (file_name.ends_with (" .tscn" )) {
@@ -616,6 +622,7 @@ bool ProjectConverter3To4::validate_conversion() {
616622 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::shaders_renames, reg_container.shaders_regexes , lines));
617623 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes , lines));
618624 changed_elements.append_array (check_for_rename_common (RenamesMap3To4::theme_override_renames, reg_container.theme_override_regexes , lines));
625+ changed_elements.append_array (check_for_rename_animation_suffixes (lines, reg_container));
619626
620627 changed_elements.append_array (check_for_custom_rename (lines, " \\ .shader" , " .gdshader" ));
621628 } else if (file_name.ends_with (" .cs" )) {
@@ -2832,6 +2839,43 @@ Vector<String> ProjectConverter3To4::check_for_rename_input_map_scancode(Vector<
28322839 return found_renames;
28332840}
28342841
2842+ void ProjectConverter3To4::rename_animation_suffixes (Vector<SourceLine> &source_lines, const RegExContainer ®_container) {
2843+ for (SourceLine &source_line : source_lines) {
2844+ if (source_line.is_comment ) {
2845+ continue ;
2846+ }
2847+ String &line = source_line.line ;
2848+ if (uint64_t (line.length ()) <= maximum_line_length) {
2849+ TypedArray<RegExMatch> reg_match = reg_container.animation_suffix .search_all (line);
2850+ for (int i = 0 ; i < reg_match.size (); ++i) {
2851+ Ref<RegExMatch> match = reg_match[i];
2852+ PackedStringArray strings = match->get_strings ();
2853+ String replacement = strings[1 ] + strings[2 ] + strings[4 ];
2854+ line = line.replace (strings[0 ], replacement);
2855+ }
2856+ }
2857+ }
2858+ }
2859+
2860+ Vector<String> ProjectConverter3To4::check_for_rename_animation_suffixes (Vector<String> &lines, const RegExContainer ®_container) {
2861+ Vector<String> found_renames;
2862+ int current_line = 1 ;
2863+
2864+ for (String &line : lines) {
2865+ if (uint64_t (line.length ()) <= maximum_line_length) {
2866+ TypedArray<RegExMatch> reg_match = reg_container.animation_suffix .search_all (line);
2867+ for (int i = 0 ; i < reg_match.size (); ++i) {
2868+ Ref<RegExMatch> match = reg_match[i];
2869+ PackedStringArray strings = match->get_strings ();
2870+ String replacement = strings[1 ] + strings[2 ] + strings[4 ];
2871+ found_renames.append (line_formatter (current_line, strings[0 ], replacement, line));
2872+ }
2873+ }
2874+ current_line++;
2875+ }
2876+ return found_renames;
2877+ }
2878+
28352879void ProjectConverter3To4::custom_rename (Vector<SourceLine> &source_lines, const String &from, const String &to) {
28362880 RegEx reg = RegEx (String (" \\ b" ) + from + " \\ b" );
28372881 CRASH_COND (!reg.is_valid ());
0 commit comments