From 6e214b3f17e600a5a53c131bc2758833edae6f40 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Wed, 12 Feb 2025 12:15:30 +0100 Subject: [PATCH 01/15] Flags: Allow multiple Flags per class This was hardcoded to one Flag per struct. The generator is now smarter and you can specify multiple flags which are resolved by their flag name. --- CMakeLists.txt | 2 +- Makefile.am | 2 +- generator/generate.py | 39 +++++++++++++++++++++----- generator/templates/chunks.tmpl | 3 ++ generator/templates/flag_fwd.tmpl | 13 +++++++++ generator/templates/flag_instance.tmpl | 15 ++++++++++ generator/templates/flag_reader.tmpl | 14 +++++---- generator/templates/fwd.tmpl | 4 +++ generator/templates/fwd_struct.tmpl | 4 +++ generator/templates/reader.tmpl | 4 +++ generator/templates/rpg_header.tmpl | 16 +++++++---- generator/templates/rpg_source.tmpl | 6 +++- src/reader_flags.cpp | 19 +------------ src/reader_struct.h | 17 ++--------- 14 files changed, 104 insertions(+), 54 deletions(-) create mode 100644 generator/templates/flag_fwd.tmpl create mode 100644 generator/templates/flag_instance.tmpl diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ec059bf8..bcd6d90bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,7 +83,7 @@ set(LCF_SOURCES src/generated/ldb_system.cpp src/generated/ldb_terms.cpp src/generated/ldb_terrain.cpp - src/generated/ldb_terrain_flags.h + src/generated/ldb_terrain_special_flags.h src/generated/ldb_testbattler.cpp src/generated/ldb_troop.cpp src/generated/ldb_troopmember.cpp diff --git a/Makefile.am b/Makefile.am index 7f0d49532..09c8d6568 100644 --- a/Makefile.am +++ b/Makefile.am @@ -100,7 +100,7 @@ liblcf_la_SOURCES = \ src/generated/ldb_system.cpp \ src/generated/ldb_terms.cpp \ src/generated/ldb_terrain.cpp \ - src/generated/ldb_terrain_flags.h \ + src/generated/ldb_terrain_special_flags.h \ src/generated/ldb_testbattler.cpp \ src/generated/ldb_troop.cpp \ src/generated/ldb_troopmember.cpp \ diff --git a/generator/generate.py b/generator/generate.py index cd500cbee..c5a72da0d 100755 --- a/generator/generate.py +++ b/generator/generate.py @@ -90,7 +90,7 @@ def cpp_type(ty, prefix=True): m = re.match(r'(.*)_Flags$', ty) if m: - ty = m.expand(r'\1::Flags') + ty = m.expand(r'\1::\1_Flags') if prefix: ty = 'rpg::' + ty return ty @@ -149,6 +149,9 @@ def flag_set(field, bit): return str(res).lower() +def flags_for(typ): + return flags[typ[:-6]] + def filter_structs_without_codes(structs): for struct in structs: if all(f.code for f in sfields[struct.name]): @@ -426,6 +429,8 @@ def generate(): structs=sorted([x.name for x in structs_flat]) )) + flag_fields = [] + for filetype, structlist in structs.items(): for struct in structlist: filename = struct.name.lower() @@ -442,8 +447,8 @@ def generate(): type=filetype )) - - filepath = os.path.join(tmp_dir, 'lcf', 'rpg', '%s.h' % filename) + struct_header = os.path.join('lcf', 'rpg', '%s.h' % filename) + filepath = os.path.join(tmp_dir, struct_header) with openToRender(filepath) as f: f.write(rpg_header_tmpl.render( struct_name=struct.name, @@ -459,14 +464,31 @@ def generate(): filename=filename )) - if struct.name in flags: - filepath = os.path.join(tmp_dir, '%s_%s_flags.h' % (filetype, filename)) + struct_flag_fields = [s for s in sfields[struct.name] if s.type.endswith("_Flags")] + for flag_field in struct_flag_fields: + header_file = '%s_%s_%s.h' % (filetype, filename, flag_field.name) + filepath = os.path.join(tmp_dir, header_file) + flag_fields.append(dict(struct_name=struct.name, struct_header=struct_header, field_name=flag_field.type, flag_header=header_file)) with openToRender(filepath) as f: f.write(flags_tmpl.render( struct_name=struct.name, - type=filetype + type=filetype, + flag_name=flag_field.type, + flag_item=flags[flag_field.type[:-6]] )) + filepath = os.path.join(tmp_dir, 'fwd_flags_impl.h') + with openToRender(filepath) as f: + f.write(flags_fwd_tmpl.render( + flags=flag_fields + )) + + filepath = os.path.join(tmp_dir, 'fwd_flags_instance.h') + with openToRender(filepath) as f: + f.write(flags_instance_tmpl.render( + flags=flag_fields + )) + for dirname, subdirlist, filelist in os.walk(tmp_dir, topdown=False): subdir = os.path.relpath(dirname, tmp_dir) @@ -486,7 +508,7 @@ def main(argv): os.mkdir(dest_dir) global structs, structs_flat, sfields, enums, flags, functions, constants, headers - global chunk_tmpl, lcf_struct_tmpl, rpg_header_tmpl, rpg_source_tmpl, flags_tmpl, enums_tmpl, fwd_tmpl, fwd_struct_tmpl + global chunk_tmpl, lcf_struct_tmpl, rpg_header_tmpl, rpg_source_tmpl, flags_tmpl, flags_fwd_tmpl, flags_instance_tmpl, enums_tmpl, fwd_tmpl, fwd_struct_tmpl structs, structs_flat = get_structs('structs.csv', 'structs_easyrpg.csv') sfields = get_fields('fields.csv', 'fields_easyrpg.csv') @@ -507,6 +529,7 @@ def main(argv): env.filters["num_flags"] = num_flags env.filters["flag_size"] = flag_size env.filters["flag_set"] = flag_set + env.filters["flags_for"] = flags_for env.tests['monotonic_from_0'] = is_monotonic_from_0 env.tests['is_db_string'] = type_is_db_string env.tests['is_array'] = type_is_array @@ -529,6 +552,8 @@ def main(argv): rpg_header_tmpl = env.get_template('rpg_header.tmpl', globals=globals) rpg_source_tmpl = env.get_template('rpg_source.tmpl', globals=globals) flags_tmpl = env.get_template('flag_reader.tmpl', globals=globals) + flags_fwd_tmpl = env.get_template('flag_fwd.tmpl', globals=globals) + flags_instance_tmpl = env.get_template('flag_instance.tmpl', globals=globals) fwd_tmpl = env.get_template('fwd.tmpl', globals=globals) fwd_struct_tmpl = env.get_template('fwd_struct.tmpl', globals=globals) diff --git a/generator/templates/chunks.tmpl b/generator/templates/chunks.tmpl index 328b21066..27174bf74 100644 --- a/generator/templates/chunks.tmpl +++ b/generator/templates/chunks.tmpl @@ -1,3 +1,6 @@ +{# +This template is used for the chunks.h files +-#} {% include "copyright.tmpl" %} #ifndef LCF_{{ type|upper }}_CHUNKS_H #define LCF_{{ type|upper }}_CHUNKS_H diff --git a/generator/templates/flag_fwd.tmpl b/generator/templates/flag_fwd.tmpl new file mode 100644 index 000000000..d357d575f --- /dev/null +++ b/generator/templates/flag_fwd.tmpl @@ -0,0 +1,13 @@ +{# +This template generates "fwd_flags_impl.h" which is included by "reader_struct.h" +and is used to declare the templates used by "Flags" +-#} +{% include "copyright.tmpl" %} + +{%- for flag in flags %} +#include "{{ flag.struct_header }}" +{%- endfor %} + +{%- for flag in flags %} +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +{%- endfor %} diff --git a/generator/templates/flag_instance.tmpl b/generator/templates/flag_instance.tmpl new file mode 100644 index 000000000..e7b0e274d --- /dev/null +++ b/generator/templates/flag_instance.tmpl @@ -0,0 +1,15 @@ +{# +This template generates "fwd_flags_instance.h" which is included by "reader_flags.cpp" +to instantiate the templates used by "Flags" +-#} +{% include "copyright.tmpl" %} + +{%- for flag in flags %} +#include "{{ flag.flag_header }}" +{%- endfor %} + +namespace lcf { +{%- for flag in flags %} +template class Flags; +{%- endfor %} +} diff --git a/generator/templates/flag_reader.tmpl b/generator/templates/flag_reader.tmpl index 2e77db972..2d807093d 100644 --- a/generator/templates/flag_reader.tmpl +++ b/generator/templates/flag_reader.tmpl @@ -1,3 +1,7 @@ +{# +This template generates "*_flags.h" which is used to define the classes used +by flags. Flags are classes that encode bitfields using bools. +-#} {% include "copyright.tmpl" %} /* * Headers @@ -11,18 +15,18 @@ namespace lcf { // Read {{ struct_name }}. template <> -char const* const Flags::name = "{{ struct_name }}_Flags"; +char const* const Flags::name = "{{ struct_name }}_{{ flag_name }}"; template <> -decltype(Flags::flag_names) Flags::flag_names = { -{%- for flag in flags[struct_name] %} +decltype(Flags::flag_names) Flags::flag_names = { +{%- for flag in flag_item %} "{{ flag.field }}"{%- if not loop.last %}, {%- endif %} {%- endfor %} }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { -{%- for flag in flags[struct_name] %} +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +{%- for flag in flag_item %} {{ flag.is2k3 }}{%- if not loop.last %}, {%- endif %} {%- endfor %} }; diff --git a/generator/templates/fwd.tmpl b/generator/templates/fwd.tmpl index eec642a5e..fb599aabd 100644 --- a/generator/templates/fwd.tmpl +++ b/generator/templates/fwd.tmpl @@ -1,3 +1,7 @@ +{# +This template generates "fwd.h" which is installed as part of the library +and is used to forward declare all classes generated by liblcf. +-#} {% include "copyright.tmpl" %} #ifndef LCF_RPG_FWD_H #define LCF_RPG_FWD_H diff --git a/generator/templates/fwd_struct.tmpl b/generator/templates/fwd_struct.tmpl index f53635a6a..a76bd1307 100644 --- a/generator/templates/fwd_struct.tmpl +++ b/generator/templates/fwd_struct.tmpl @@ -1,3 +1,7 @@ +{# +This template generates "fwd_struct_impl.h" which is included by "reader_struct_impl.h" +and is used to forward declare Struct::fields[] to reduce compile times. +-#} {% include "copyright.tmpl" %} // MSVC incorrectly treats these declarations as definitions and fails. #ifndef _MSC_VER diff --git a/generator/templates/reader.tmpl b/generator/templates/reader.tmpl index 6e59d24db..dfa47225e 100644 --- a/generator/templates/reader.tmpl +++ b/generator/templates/reader.tmpl @@ -1,3 +1,7 @@ +{# +This template generates the source files for the metadata of the chunk readers. +Files generated are "ldb/lmu/lsd/lmt_*.cpp" +-#} {% include "copyright.tmpl" %} // Headers #include "lcf/{{ type }}/reader.h" diff --git a/generator/templates/rpg_header.tmpl b/generator/templates/rpg_header.tmpl index ea8d899de..e2673fbbe 100644 --- a/generator/templates/rpg_header.tmpl +++ b/generator/templates/rpg_header.tmpl @@ -1,3 +1,7 @@ +{# +This template generates the headers (*.h) for all the chunks in the "rpg" folder. +These are files for chunks like Actor, Class and Event. +-#} {% include "copyright.tmpl" %} #ifndef LCF_RPG_{{ struct_name|upper }}_H #define LCF_RPG_{{ struct_name|upper }}_H @@ -74,16 +78,16 @@ namespace rpg { {%- for field in fields[struct_name]|field_is_used %} {%- if not field.size %} {%- if field.type.endswith("_Flags") %} - struct Flags { + struct {{ field.type }} { union { struct { - {%- for flag in flags[struct_name] %} + {%- for flag in field.type|flags_for %} bool {{ flag.field }}; {%- endfor %} }; std::array flags; }; - Flags() noexcept + {{ field.type }}() noexcept {%- for flag in flags[struct_name] %} {%- if loop.first %}:{%- else %},{%- endif %} {{ flag.field }}({{ field|flag_set(loop.index) }}) {%- endfor %} @@ -107,15 +111,15 @@ namespace rpg { {%- if not field.size %} {%- if field.type.endswith("_Flags") %} - inline bool operator==(const {{ struct_name }}::Flags& l, const {{ struct_name }}::Flags& r) { + inline bool operator==(const {{ struct_name }}::{{ field.type }}& l, const {{ struct_name }}::{{ field.type }}& r) { return l.flags == r.flags; } - inline bool operator!=(const {{ struct_name }}::Flags& l, const {{ struct_name }}::Flags& r) { + inline bool operator!=(const {{ struct_name }}::{{ field.type }}& l, const {{ struct_name }}::{{ field.type }}& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::Flags& obj); + std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field.type }}& obj); {%- endif %} {%- endif %} {%- endfor %} diff --git a/generator/templates/rpg_source.tmpl b/generator/templates/rpg_source.tmpl index 3092f37b1..8bb4bd64d 100644 --- a/generator/templates/rpg_source.tmpl +++ b/generator/templates/rpg_source.tmpl @@ -1,3 +1,7 @@ +{# +This template generates the sources (*.cpp) for all the chunks in the "rpg" folder. +These are files for chunks like Actor, Class and Event. +-#} {% include "copyright.tmpl" %} // Headers #include "lcf/rpg/{{ filename }}.h" @@ -8,7 +12,7 @@ namespace rpg { {%- if not field.size %} {%- if field.type.endswith("_Flags") %} -std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field.type }}& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/reader_flags.cpp b/src/reader_flags.cpp index 79327ef7b..d696dc7c2 100644 --- a/src/reader_flags.cpp +++ b/src/reader_flags.cpp @@ -8,17 +8,7 @@ */ #include "reader_struct.h" -#include "lcf/rpg/trooppagecondition.h" -#include "lcf/rpg/eventpagecondition.h" -#include "lcf/rpg/terrain.h" -#include "lcf/rpg/savepicture.h" - -#include "ldb_trooppagecondition_flags.h" -#include "ldb_terrain_flags.h" -#include "lmu_eventpagecondition_flags.h" -#include "lsd_savepicture_flags.h" -#include "lsd_saveeasyrpgtext_flags.h" -#include "lsd_saveeasyrpgwindow_flags.h" +#include "fwd_flags_instance.h" namespace lcf { // Templates @@ -143,12 +133,5 @@ void Flags::BeginXml(S& obj, XmlReader& stream) { #pragma warning (disable : 4661) #endif -// Do not forget to add new Flags here -template class Flags; -template class Flags; -template class Flags; -template class Flags; -template class Flags; -template class Flags; } //namespace lcf diff --git a/src/reader_struct.h b/src/reader_struct.h index d247714aa..a3f9158b4 100644 --- a/src/reader_struct.h +++ b/src/reader_struct.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -25,19 +24,13 @@ #include "lcf/writer_lcf.h" #include "lcf/reader_xml.h" #include "lcf/writer_xml.h" -#include "lcf/rpg/eventpagecondition.h" -#include "lcf/rpg/trooppagecondition.h" -#include "lcf/rpg/terrain.h" #include "lcf/rpg/equipment.h" #include "lcf/rpg/parameters.h" #include "lcf/rpg/eventcommand.h" #include "lcf/rpg/movecommand.h" #include "lcf/rpg/treemap.h" #include "lcf/rpg/rect.h" -#include "lcf/rpg/savepicture.h" #include "lcf/rpg/terms.h" -#include "lcf/rpg/saveeasyrpgtext.h" -#include "lcf/rpg/saveeasyrpgwindow.h" #include "log.h" namespace lcf { @@ -64,14 +57,6 @@ struct TypeCategory { static const Category::Index value = Category::Struct; }; -// Do not forget to add new Flags here -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct TypeCategory { static const Category::Index value = Category::Flags; }; - template <> struct TypeCategory { static const Category::Index value = Category::RawStruct; }; template <> struct TypeCategory { static const Category::Index value = Category::RawStruct; }; template <> struct TypeCategory { static const Category::Index value = Category::RawStruct; }; @@ -806,4 +791,6 @@ class RootXmlHandler : public XmlHandler { } //namespace lcf +#include "fwd_flags_impl.h" + #endif From 60fd5f1fc37e8a5340bace8e3946517e1c19359a Mon Sep 17 00:00:00 2001 From: Ghabry Date: Wed, 12 Feb 2025 12:42:15 +0100 Subject: [PATCH 02/15] Add generated files --- src/generated/fwd_flags_impl.h | 23 ++++++++++++++++ src/generated/fwd_flags_instance.h | 26 +++++++++++++++++++ src/generated/lcf/rpg/eventpagecondition.h | 10 +++---- src/generated/lcf/rpg/saveeasyrpgtext.h | 10 +++---- src/generated/lcf/rpg/saveeasyrpgwindow.h | 10 +++---- src/generated/lcf/rpg/savepicture.h | 10 +++---- src/generated/lcf/rpg/terrain.h | 10 +++---- src/generated/lcf/rpg/trooppagecondition.h | 10 +++---- src/generated/ldb_terrain.cpp | 2 +- ...in_flags.h => ldb_terrain_special_flags.h} | 6 ++--- src/generated/ldb_trooppagecondition.cpp | 2 +- src/generated/ldb_trooppagecondition_flags.h | 6 ++--- src/generated/lmu_eventpagecondition.cpp | 2 +- src/generated/lmu_eventpagecondition_flags.h | 6 ++--- src/generated/lsd_saveeasyrpgtext.cpp | 2 +- src/generated/lsd_saveeasyrpgtext_flags.h | 6 ++--- src/generated/lsd_saveeasyrpgwindow.cpp | 2 +- src/generated/lsd_saveeasyrpgwindow_flags.h | 6 ++--- src/generated/lsd_savepicture.cpp | 2 +- src/generated/lsd_savepicture_flags.h | 6 ++--- src/generated/rpg_eventpagecondition.cpp | 2 +- src/generated/rpg_saveeasyrpgtext.cpp | 2 +- src/generated/rpg_saveeasyrpgwindow.cpp | 2 +- src/generated/rpg_savepicture.cpp | 2 +- src/generated/rpg_terrain.cpp | 2 +- src/generated/rpg_trooppagecondition.cpp | 2 +- 26 files changed, 109 insertions(+), 60 deletions(-) create mode 100644 src/generated/fwd_flags_impl.h create mode 100644 src/generated/fwd_flags_instance.h rename src/generated/{ldb_terrain_flags.h => ldb_terrain_special_flags.h} (69%) diff --git a/src/generated/fwd_flags_impl.h b/src/generated/fwd_flags_impl.h new file mode 100644 index 000000000..7369c666b --- /dev/null +++ b/src/generated/fwd_flags_impl.h @@ -0,0 +1,23 @@ +/* !!!! GENERATED FILE - DO NOT EDIT !!!! + * -------------------------------------- + * + * This file is part of liblcf. Copyright (c) liblcf authors. + * https://github.com/EasyRPG/liblcf - https://easyrpg.org + * + * liblcf is Free/Libre Open Source Software, released under the MIT License. + * For the full copyright and license information, please view the COPYING + * file that was distributed with this source code. + */ + +#include "lcf/rpg/trooppagecondition.h" +#include "lcf/rpg/terrain.h" +#include "lcf/rpg/eventpagecondition.h" +#include "lcf/rpg/savepicture.h" +#include "lcf/rpg/saveeasyrpgwindow.h" +#include "lcf/rpg/saveeasyrpgtext.h" +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; diff --git a/src/generated/fwd_flags_instance.h b/src/generated/fwd_flags_instance.h new file mode 100644 index 000000000..11130a3ac --- /dev/null +++ b/src/generated/fwd_flags_instance.h @@ -0,0 +1,26 @@ +/* !!!! GENERATED FILE - DO NOT EDIT !!!! + * -------------------------------------- + * + * This file is part of liblcf. Copyright (c) liblcf authors. + * https://github.com/EasyRPG/liblcf - https://easyrpg.org + * + * liblcf is Free/Libre Open Source Software, released under the MIT License. + * For the full copyright and license information, please view the COPYING + * file that was distributed with this source code. + */ + +#include "ldb_trooppagecondition_flags.h" +#include "ldb_terrain_special_flags.h" +#include "lmu_eventpagecondition_flags.h" +#include "lsd_savepicture_flags.h" +#include "lsd_saveeasyrpgwindow_flags.h" +#include "lsd_saveeasyrpgtext_flags.h" + +namespace lcf { +template class Flags; +template class Flags; +template class Flags; +template class Flags; +template class Flags; +template class Flags; +} diff --git a/src/generated/lcf/rpg/eventpagecondition.h b/src/generated/lcf/rpg/eventpagecondition.h index 30939e29c..3a323a4cc 100644 --- a/src/generated/lcf/rpg/eventpagecondition.h +++ b/src/generated/lcf/rpg/eventpagecondition.h @@ -44,7 +44,7 @@ namespace rpg { "not_equal" ); - struct Flags { + struct EventPageCondition_Flags { union { struct { bool switch_a; @@ -57,7 +57,7 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: switch_a(false), switch_b(false), variable(false), item(false), actor(false), timer(false), timer2(false) + EventPageCondition_Flags() noexcept: switch_a(false), switch_b(false), variable(false), item(false), actor(false), timer(false), timer2(false) {} } flags; int32_t switch_a_id = 1; @@ -75,15 +75,15 @@ namespace rpg { return os; } - inline bool operator==(const EventPageCondition::Flags& l, const EventPageCondition::Flags& r) { + inline bool operator==(const EventPageCondition::EventPageCondition_Flags& l, const EventPageCondition::EventPageCondition_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const EventPageCondition::Flags& l, const EventPageCondition::Flags& r) { + inline bool operator!=(const EventPageCondition::EventPageCondition_Flags& l, const EventPageCondition::EventPageCondition_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const EventPageCondition::Flags& obj); + std::ostream& operator<<(std::ostream& os, const EventPageCondition::EventPageCondition_Flags& obj); inline bool operator==(const EventPageCondition& l, const EventPageCondition& r) { return l.flags == r.flags diff --git a/src/generated/lcf/rpg/saveeasyrpgtext.h b/src/generated/lcf/rpg/saveeasyrpgtext.h index bda8176db..825c752d0 100644 --- a/src/generated/lcf/rpg/saveeasyrpgtext.h +++ b/src/generated/lcf/rpg/saveeasyrpgtext.h @@ -34,7 +34,7 @@ namespace rpg { int32_t font_size = 12; int32_t letter_spacing = 0; int32_t line_spacing = 4; - struct Flags { + struct SaveEasyRpgText_Flags { union { struct { bool draw_gradient; @@ -44,20 +44,20 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: draw_gradient(true), draw_shadow(true), bold(false), italic(false) + SaveEasyRpgText_Flags() noexcept: draw_gradient(true), draw_shadow(true), bold(false), italic(false) {} } flags; }; - inline bool operator==(const SaveEasyRpgText::Flags& l, const SaveEasyRpgText::Flags& r) { + inline bool operator==(const SaveEasyRpgText::SaveEasyRpgText_Flags& l, const SaveEasyRpgText::SaveEasyRpgText_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SaveEasyRpgText::Flags& l, const SaveEasyRpgText::Flags& r) { + inline bool operator!=(const SaveEasyRpgText::SaveEasyRpgText_Flags& l, const SaveEasyRpgText::SaveEasyRpgText_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::Flags& obj); + std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::SaveEasyRpgText_Flags& obj); inline bool operator==(const SaveEasyRpgText& l, const SaveEasyRpgText& r) { return l.text == r.text diff --git a/src/generated/lcf/rpg/saveeasyrpgwindow.h b/src/generated/lcf/rpg/saveeasyrpgwindow.h index 67a795be2..cb427ab29 100644 --- a/src/generated/lcf/rpg/saveeasyrpgwindow.h +++ b/src/generated/lcf/rpg/saveeasyrpgwindow.h @@ -36,7 +36,7 @@ namespace rpg { int32_t height = 0; DBString system_name; int32_t message_stretch = 0; - struct Flags { + struct SaveEasyRpgWindow_Flags { union { struct { bool draw_frame; @@ -44,20 +44,20 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: draw_frame(true), border_margin(true) + SaveEasyRpgWindow_Flags() noexcept: draw_frame(true), border_margin(true) {} } flags; }; - inline bool operator==(const SaveEasyRpgWindow::Flags& l, const SaveEasyRpgWindow::Flags& r) { + inline bool operator==(const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& l, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SaveEasyRpgWindow::Flags& l, const SaveEasyRpgWindow::Flags& r) { + inline bool operator!=(const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& l, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::Flags& obj); + std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& obj); inline bool operator==(const SaveEasyRpgWindow& l, const SaveEasyRpgWindow& r) { return l.texts == r.texts diff --git a/src/generated/lcf/rpg/savepicture.h b/src/generated/lcf/rpg/savepicture.h index bb8e09e8b..6388f6248 100644 --- a/src/generated/lcf/rpg/savepicture.h +++ b/src/generated/lcf/rpg/savepicture.h @@ -128,7 +128,7 @@ namespace rpg { bool spritesheet_play_once = false; int32_t map_layer = 7; int32_t battle_layer = 0; - struct Flags { + struct SavePicture_Flags { union { struct { bool erase_on_map_change; @@ -141,7 +141,7 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: erase_on_map_change(true), erase_on_battle_end(false), unused_bit(false), unused_bit2(false), affected_by_tint(false), affected_by_flash(true), affected_by_shake(true) + SavePicture_Flags() noexcept: erase_on_map_change(true), erase_on_battle_end(false), unused_bit(false), unused_bit2(false), affected_by_tint(false), affected_by_flash(true), affected_by_shake(true) {} } flags; double finish_x = 0.0; @@ -184,15 +184,15 @@ namespace rpg { return os; } - inline bool operator==(const SavePicture::Flags& l, const SavePicture::Flags& r) { + inline bool operator==(const SavePicture::SavePicture_Flags& l, const SavePicture::SavePicture_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SavePicture::Flags& l, const SavePicture::Flags& r) { + inline bool operator!=(const SavePicture::SavePicture_Flags& l, const SavePicture::SavePicture_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SavePicture::Flags& obj); + std::ostream& operator<<(std::ostream& os, const SavePicture::SavePicture_Flags& obj); inline bool operator==(const SavePicture& l, const SavePicture& r) { return l.name == r.name diff --git a/src/generated/lcf/rpg/terrain.h b/src/generated/lcf/rpg/terrain.h index 5aec88afd..848c268be 100644 --- a/src/generated/lcf/rpg/terrain.h +++ b/src/generated/lcf/rpg/terrain.h @@ -74,7 +74,7 @@ namespace rpg { bool background_b_scrollv = false; int32_t background_b_scrollh_speed = 0; int32_t background_b_scrollv_speed = 0; - struct Flags { + struct Terrain_Flags { union { struct { bool back_party; @@ -84,7 +84,7 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: back_party(false), back_enemies(false), lateral_party(false), lateral_enemies(false) + Terrain_Flags() noexcept: back_party(false), back_enemies(false), lateral_party(false), lateral_enemies(false) {} } special_flags; int32_t special_back_party = 15; @@ -107,15 +107,15 @@ namespace rpg { return os; } - inline bool operator==(const Terrain::Flags& l, const Terrain::Flags& r) { + inline bool operator==(const Terrain::Terrain_Flags& l, const Terrain::Terrain_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const Terrain::Flags& l, const Terrain::Flags& r) { + inline bool operator!=(const Terrain::Terrain_Flags& l, const Terrain::Terrain_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const Terrain::Flags& obj); + std::ostream& operator<<(std::ostream& os, const Terrain::Terrain_Flags& obj); inline bool operator==(const Terrain& l, const Terrain& r) { return l.name == r.name diff --git a/src/generated/lcf/rpg/trooppagecondition.h b/src/generated/lcf/rpg/trooppagecondition.h index 56a4ecbe6..66b2e17eb 100644 --- a/src/generated/lcf/rpg/trooppagecondition.h +++ b/src/generated/lcf/rpg/trooppagecondition.h @@ -26,7 +26,7 @@ namespace lcf { namespace rpg { class TroopPageCondition { public: - struct Flags { + struct TroopPageCondition_Flags { union { struct { bool switch_a; @@ -42,7 +42,7 @@ namespace rpg { }; std::array flags; }; - Flags() noexcept: switch_a(false), switch_b(false), variable(false), turn(false), fatigue(false), enemy_hp(false), actor_hp(false), turn_enemy(false), turn_actor(false), command_actor(false) + TroopPageCondition_Flags() noexcept: switch_a(false), switch_b(false), variable(false), turn(false), fatigue(false), enemy_hp(false), actor_hp(false), turn_enemy(false), turn_actor(false), command_actor(false) {} } flags; int32_t switch_a_id = 1; @@ -69,15 +69,15 @@ namespace rpg { int32_t command_id = 1; }; - inline bool operator==(const TroopPageCondition::Flags& l, const TroopPageCondition::Flags& r) { + inline bool operator==(const TroopPageCondition::TroopPageCondition_Flags& l, const TroopPageCondition::TroopPageCondition_Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const TroopPageCondition::Flags& l, const TroopPageCondition::Flags& r) { + inline bool operator!=(const TroopPageCondition::TroopPageCondition_Flags& l, const TroopPageCondition::TroopPageCondition_Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const TroopPageCondition::Flags& obj); + std::ostream& operator<<(std::ostream& os, const TroopPageCondition::TroopPageCondition_Flags& obj); inline bool operator==(const TroopPageCondition& l, const TroopPageCondition& r) { return l.flags == r.flags diff --git a/src/generated/ldb_terrain.cpp b/src/generated/ldb_terrain.cpp index c59752ee0..947e3fe38 100644 --- a/src/generated/ldb_terrain.cpp +++ b/src/generated/ldb_terrain.cpp @@ -181,7 +181,7 @@ static TypedField static_background_b_scrollv_speed( 0, 1 ); -static TypedField static_special_flags( +static TypedField static_special_flags( &rpg::Terrain::special_flags, LDB_Reader::ChunkTerrain::special_flags, "special_flags", diff --git a/src/generated/ldb_terrain_flags.h b/src/generated/ldb_terrain_special_flags.h similarity index 69% rename from src/generated/ldb_terrain_flags.h rename to src/generated/ldb_terrain_special_flags.h index 9f1801e30..ae71aea55 100644 --- a/src/generated/ldb_terrain_flags.h +++ b/src/generated/ldb_terrain_special_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read Terrain. template <> -char const* const Flags::name = "Terrain_Flags"; +char const* const Flags::name = "Terrain_Terrain_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "back_party", "back_enemies", "lateral_party", @@ -32,7 +32,7 @@ decltype(Flags::flag_names) Flags::fla }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 1, 1, 1, diff --git a/src/generated/ldb_trooppagecondition.cpp b/src/generated/ldb_trooppagecondition.cpp index 8bbeee8ab..9ec5e7501 100644 --- a/src/generated/ldb_trooppagecondition.cpp +++ b/src/generated/ldb_trooppagecondition.cpp @@ -20,7 +20,7 @@ namespace lcf { template <> char const* const Struct::name = "TroopPageCondition"; -static TypedField static_flags( +static TypedField static_flags( &rpg::TroopPageCondition::flags, LDB_Reader::ChunkTroopPageCondition::flags, "flags", diff --git a/src/generated/ldb_trooppagecondition_flags.h b/src/generated/ldb_trooppagecondition_flags.h index b57e71c94..9adbd134f 100644 --- a/src/generated/ldb_trooppagecondition_flags.h +++ b/src/generated/ldb_trooppagecondition_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read TroopPageCondition. template <> -char const* const Flags::name = "TroopPageCondition_Flags"; +char const* const Flags::name = "TroopPageCondition_TroopPageCondition_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "switch_a", "switch_b", "variable", @@ -38,7 +38,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lmu_eventpagecondition.cpp b/src/generated/lmu_eventpagecondition.cpp index d64ee868e..2f69146a3 100644 --- a/src/generated/lmu_eventpagecondition.cpp +++ b/src/generated/lmu_eventpagecondition.cpp @@ -20,7 +20,7 @@ namespace lcf { template <> char const* const Struct::name = "EventPageCondition"; -static TypedField static_flags( +static TypedField static_flags( &rpg::EventPageCondition::flags, LMU_Reader::ChunkEventPageCondition::flags, "flags", diff --git a/src/generated/lmu_eventpagecondition_flags.h b/src/generated/lmu_eventpagecondition_flags.h index a54fa8e1b..8354ddf3f 100644 --- a/src/generated/lmu_eventpagecondition_flags.h +++ b/src/generated/lmu_eventpagecondition_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read EventPageCondition. template <> -char const* const Flags::name = "EventPageCondition_Flags"; +char const* const Flags::name = "EventPageCondition_EventPageCondition_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "switch_a", "switch_b", "variable", @@ -35,7 +35,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lsd_saveeasyrpgtext.cpp b/src/generated/lsd_saveeasyrpgtext.cpp index 9a535083f..26892b882 100644 --- a/src/generated/lsd_saveeasyrpgtext.cpp +++ b/src/generated/lsd_saveeasyrpgtext.cpp @@ -69,7 +69,7 @@ static TypedField static_line_spacing( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SaveEasyRpgText::flags, LSD_Reader::ChunkSaveEasyRpgText::flags, "flags", diff --git a/src/generated/lsd_saveeasyrpgtext_flags.h b/src/generated/lsd_saveeasyrpgtext_flags.h index a75dc8bf7..9c20be5ee 100644 --- a/src/generated/lsd_saveeasyrpgtext_flags.h +++ b/src/generated/lsd_saveeasyrpgtext_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read SaveEasyRpgText. template <> -char const* const Flags::name = "SaveEasyRpgText_Flags"; +char const* const Flags::name = "SaveEasyRpgText_SaveEasyRpgText_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "draw_gradient", "draw_shadow", "bold", @@ -32,7 +32,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lsd_saveeasyrpgwindow.cpp b/src/generated/lsd_saveeasyrpgwindow.cpp index c2b79b9fe..6fc071d34 100644 --- a/src/generated/lsd_saveeasyrpgwindow.cpp +++ b/src/generated/lsd_saveeasyrpgwindow.cpp @@ -55,7 +55,7 @@ static TypedField static_message_stretch( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SaveEasyRpgWindow::flags, LSD_Reader::ChunkSaveEasyRpgWindow::flags, "flags", diff --git a/src/generated/lsd_saveeasyrpgwindow_flags.h b/src/generated/lsd_saveeasyrpgwindow_flags.h index 9dd7736c0..dfd4a2ac3 100644 --- a/src/generated/lsd_saveeasyrpgwindow_flags.h +++ b/src/generated/lsd_saveeasyrpgwindow_flags.h @@ -21,16 +21,16 @@ namespace lcf { // Read SaveEasyRpgWindow. template <> -char const* const Flags::name = "SaveEasyRpgWindow_Flags"; +char const* const Flags::name = "SaveEasyRpgWindow_SaveEasyRpgWindow_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "draw_frame", "border_margin" }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0 }; diff --git a/src/generated/lsd_savepicture.cpp b/src/generated/lsd_savepicture.cpp index caa8d12f6..900710776 100644 --- a/src/generated/lsd_savepicture.cpp +++ b/src/generated/lsd_savepicture.cpp @@ -188,7 +188,7 @@ static TypedField static_battle_layer( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SavePicture::flags, LSD_Reader::ChunkSavePicture::flags, "flags", diff --git a/src/generated/lsd_savepicture_flags.h b/src/generated/lsd_savepicture_flags.h index 3e1346a78..3c26027ba 100644 --- a/src/generated/lsd_savepicture_flags.h +++ b/src/generated/lsd_savepicture_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read SavePicture. template <> -char const* const Flags::name = "SavePicture_Flags"; +char const* const Flags::name = "SavePicture_SavePicture_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "erase_on_map_change", "erase_on_battle_end", "unused_bit", @@ -35,7 +35,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 1, 1, 1, diff --git a/src/generated/rpg_eventpagecondition.cpp b/src/generated/rpg_eventpagecondition.cpp index bf3a2a32e..2f582ab1b 100644 --- a/src/generated/rpg_eventpagecondition.cpp +++ b/src/generated/rpg_eventpagecondition.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const EventPageCondition::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const EventPageCondition::EventPageCondition_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_saveeasyrpgtext.cpp b/src/generated/rpg_saveeasyrpgtext.cpp index 96e15bdfd..e6f788d70 100644 --- a/src/generated/rpg_saveeasyrpgtext.cpp +++ b/src/generated/rpg_saveeasyrpgtext.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::SaveEasyRpgText_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_saveeasyrpgwindow.cpp b/src/generated/rpg_saveeasyrpgwindow.cpp index 0046325b4..673c663d1 100644 --- a/src/generated/rpg_saveeasyrpgwindow.cpp +++ b/src/generated/rpg_saveeasyrpgwindow.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_savepicture.cpp b/src/generated/rpg_savepicture.cpp index afa98f985..b708ffbc5 100644 --- a/src/generated/rpg_savepicture.cpp +++ b/src/generated/rpg_savepicture.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SavePicture::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SavePicture::SavePicture_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_terrain.cpp b/src/generated/rpg_terrain.cpp index 8675c1c40..7d703e77b 100644 --- a/src/generated/rpg_terrain.cpp +++ b/src/generated/rpg_terrain.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const Terrain::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const Terrain::Terrain_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_trooppagecondition.cpp b/src/generated/rpg_trooppagecondition.cpp index ae8a218a8..079a2e10a 100644 --- a/src/generated/rpg_trooppagecondition.cpp +++ b/src/generated/rpg_trooppagecondition.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const TroopPageCondition::Flags& obj) { +std::ostream& operator<<(std::ostream& os, const TroopPageCondition::TroopPageCondition_Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } From 30b63f8ddba3af7baffb310ffff8bf3de61a5f01 Mon Sep 17 00:00:00 2001 From: florianessl Date: Fri, 24 Jan 2025 20:04:11 +0100 Subject: [PATCH 03/15] Feature: Updated generator.py & templates to make it possible to specify which enum names are considered to be "scoped" ('class' enums in C++) --- generator/generate.py | 4 ++++ generator/templates/rpg_header.tmpl | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/generator/generate.py b/generator/generate.py index c5a72da0d..0df96756b 100755 --- a/generator/generate.py +++ b/generator/generate.py @@ -400,6 +400,9 @@ def is_monotonic_from_0(enum): expected += 1 return True +def is_scoped_enum(enum_name): + return enum_name == "Code" + def openToRender(path): subdir = os.path.dirname(path) if not os.path.exists(subdir): @@ -531,6 +534,7 @@ def main(argv): env.filters["flag_set"] = flag_set env.filters["flags_for"] = flags_for env.tests['monotonic_from_0'] = is_monotonic_from_0 + env.tests['scoped_enum'] = is_scoped_enum env.tests['is_db_string'] = type_is_db_string env.tests['is_array'] = type_is_array env.tests['is_array_of_struct'] = type_is_array_of_struct diff --git a/generator/templates/rpg_header.tmpl b/generator/templates/rpg_header.tmpl index e2673fbbe..fcacb14ae 100644 --- a/generator/templates/rpg_header.tmpl +++ b/generator/templates/rpg_header.tmpl @@ -41,9 +41,9 @@ namespace rpg { {% endif %} {%- if struct_name in enums %} {%- for name, enum in enums[struct_name].items() %} - enum {% if name == "Code" -%} class {% endif -%} {{ name }} { + enum {% if name is scoped_enum -%} class {% endif -%} {{ name }} { {%- for field in enum %} - {%- if name != "Code" %} + {%- if name is not scoped_enum %} {{ name }}_{{ field.0 }} {%- else %} {{ field.0 }} @@ -59,7 +59,7 @@ namespace rpg { {%- else %} static constexpr auto k{{ name }}Tags = lcf::EnumTags{ {%- for field in enum %} - {%- if name != "Code" %} + {%- if name is not scoped_enum %} {{ name }}_{{ field.0 }}, "{{ field.0 }}"{%- if not loop.last %},{% endif %} {%- else %} {{ name }}::{{ field.0 }}, "{{ field.0 }}"{%- if not loop.last %},{% endif %} From 2d90a93fcf269f50837af403eec8c3b41954f844 Mon Sep 17 00:00:00 2001 From: florianessl Date: Fri, 24 Jan 2025 20:07:53 +0100 Subject: [PATCH 04/15] Fix: Using hexadecimal representation for enum fields would break the code generator --- generator/generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/generate.py b/generator/generate.py index 0df96756b..57d556406 100755 --- a/generator/generate.py +++ b/generator/generate.py @@ -395,7 +395,7 @@ def type_is_array_of_struct(ty): def is_monotonic_from_0(enum): expected = 0 for (val, idx) in enum: - if int(idx) != expected: + if int(idx, 0) != expected: return False expected += 1 return True From 61889b94f17299de9a39708a146a63b86395d606 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Wed, 12 Feb 2025 13:39:33 +0100 Subject: [PATCH 05/15] Add new fields "easyrpg_clone_map_id" and "easyrpg_clone_event_id" to determine if an event has been created by EasyRPGs new "CloneMapEvent" command --- generator/csv/fields_easyrpg.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/generator/csv/fields_easyrpg.csv b/generator/csv/fields_easyrpg.csv index 44fb0b091..f79e67250 100644 --- a/generator/csv/fields_easyrpg.csv +++ b/generator/csv/fields_easyrpg.csv @@ -31,6 +31,8 @@ SaveEasyRpgText,letter_spacing,f,Int32,0x06,0,0,0,Additional spacing between let SaveEasyRpgText,line_spacing,f,Int32,0x07,4,0,0,Additional spacing between lines SaveEasyRpgText,flags,f,SaveEasyRpgText_Flags,0x08,3,0,0,Various text settings SaveMapEventBase,easyrpg_move_failure_count,f,Int32,0xC9,0,0,0,Tracks how often the current move operation in a move route failed +SaveMapEventBase,easyrpg_clone_map_id,f,UInt32,0xCA,0,0,0,The original map id of a cloned event +SaveMapEventBase,easyrpg_clone_event_id,f,UInt32,0xCB,0,0,0,The original event id of a cloned event SavePartyLocation,maniac_horizontal_pan_speed,f,Double,0x8D,0,0,0,horizontal speed in the scrolls of the screen SavePartyLocation,maniac_vertical_pan_speed,f,Double,0x8E,0,0,0,vertical speed in the scrolls of the screen SaveSystem,maniac_strings,f,Vector,0x24,,0,0,rpg::Strings From d60a074c9ee2a1552deb305cc27508b7ce0a6dc6 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Wed, 12 Feb 2025 13:40:20 +0100 Subject: [PATCH 06/15] CloneEvent: Add generated code --- src/generated/lcf/lsd/chunks.h | 18 +++++++++++++++++- src/generated/lcf/rpg/savemapeventbase.h | 6 +++++- src/generated/lsd_savemapevent.cpp | 16 ++++++++++++++++ src/generated/lsd_savemapeventbase.cpp | 16 ++++++++++++++++ src/generated/lsd_savepartylocation.cpp | 16 ++++++++++++++++ src/generated/lsd_savevehiclelocation.cpp | 16 ++++++++++++++++ src/generated/rpg_savemapeventbase.cpp | 2 ++ 7 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/generated/lcf/lsd/chunks.h b/src/generated/lcf/lsd/chunks.h index cfe92f272..7ef395f7c 100644 --- a/src/generated/lcf/lsd/chunks.h +++ b/src/generated/lcf/lsd/chunks.h @@ -410,6 +410,10 @@ namespace LSD_Reader { flash_time_left = 0x55, /** Tracks how often the current move operation in a move route failed */ easyrpg_move_failure_count = 0xC9, + /** The original map id of a cloned event */ + easyrpg_clone_map_id = 0xCA, + /** The original event id of a cloned event */ + easyrpg_clone_event_id = 0xCB, /** */ boarding = 0x65, /** */ @@ -530,6 +534,10 @@ namespace LSD_Reader { flash_time_left = 0x55, /** Tracks how often the current move operation in a move route failed */ easyrpg_move_failure_count = 0xC9, + /** The original map id of a cloned event */ + easyrpg_clone_map_id = 0xCA, + /** The original event id of a cloned event */ + easyrpg_clone_event_id = 0xCB, /** Which vehicle */ vehicle = 0x65, /** From 0 to 255 - In flying vehicles; remaining distance to ascend */ @@ -831,7 +839,11 @@ namespace LSD_Reader { /** int */ flash_time_left = 0x55, /** Tracks how often the current move operation in a move route failed */ - easyrpg_move_failure_count = 0xC9 + easyrpg_move_failure_count = 0xC9, + /** The original map id of a cloned event */ + easyrpg_clone_map_id = 0xCA, + /** The original event id of a cloned event */ + easyrpg_clone_event_id = 0xCB }; }; struct ChunkSaveMapEvent { @@ -916,6 +928,10 @@ namespace LSD_Reader { flash_time_left = 0x55, /** Tracks how often the current move operation in a move route failed */ easyrpg_move_failure_count = 0xC9, + /** The original map id of a cloned event */ + easyrpg_clone_map_id = 0xCA, + /** The original event id of a cloned event */ + easyrpg_clone_event_id = 0xCB, /** If true; this event is waiting for foreground execution. */ waiting_execution = 0x65, /** Index of custom move route */ diff --git a/src/generated/lcf/rpg/savemapeventbase.h b/src/generated/lcf/rpg/savemapeventbase.h index 6bff9dcea..b67cfbff7 100644 --- a/src/generated/lcf/rpg/savemapeventbase.h +++ b/src/generated/lcf/rpg/savemapeventbase.h @@ -68,6 +68,8 @@ namespace rpg { double flash_current_level = 0.0; int32_t flash_time_left = 0; int32_t easyrpg_move_failure_count = 0; + uint32_t easyrpg_clone_map_id = 0; + uint32_t easyrpg_clone_event_id = 0; }; inline bool operator==(const SaveMapEventBase& l, const SaveMapEventBase& r) { @@ -110,7 +112,9 @@ namespace rpg { && l.flash_blue == r.flash_blue && l.flash_current_level == r.flash_current_level && l.flash_time_left == r.flash_time_left - && l.easyrpg_move_failure_count == r.easyrpg_move_failure_count; + && l.easyrpg_move_failure_count == r.easyrpg_move_failure_count + && l.easyrpg_clone_map_id == r.easyrpg_clone_map_id + && l.easyrpg_clone_event_id == r.easyrpg_clone_event_id; } inline bool operator!=(const SaveMapEventBase& l, const SaveMapEventBase& r) { diff --git a/src/generated/lsd_savemapevent.cpp b/src/generated/lsd_savemapevent.cpp index bf14bf839..628b8df43 100644 --- a/src/generated/lsd_savemapevent.cpp +++ b/src/generated/lsd_savemapevent.cpp @@ -300,6 +300,20 @@ static TypedField static_easyrpg_move_failure_count( 0, 0 ); +static TypedField static_easyrpg_clone_map_id( + &rpg::SaveMapEvent::easyrpg_clone_map_id, + LSD_Reader::ChunkSaveMapEvent::easyrpg_clone_map_id, + "easyrpg_clone_map_id", + 0, + 0 +); +static TypedField static_easyrpg_clone_event_id( + &rpg::SaveMapEvent::easyrpg_clone_event_id, + LSD_Reader::ChunkSaveMapEvent::easyrpg_clone_event_id, + "easyrpg_clone_event_id", + 0, + 0 +); static TypedField static_waiting_execution( &rpg::SaveMapEvent::waiting_execution, LSD_Reader::ChunkSaveMapEvent::waiting_execution, @@ -372,6 +386,8 @@ Field const* Struct::fields[] = { &static_flash_current_level, &static_flash_time_left, &static_easyrpg_move_failure_count, + &static_easyrpg_clone_map_id, + &static_easyrpg_clone_event_id, &static_waiting_execution, &static_original_move_route_index, &static_triggered_by_decision_key, diff --git a/src/generated/lsd_savemapeventbase.cpp b/src/generated/lsd_savemapeventbase.cpp index db8e60804..cf832f27a 100644 --- a/src/generated/lsd_savemapeventbase.cpp +++ b/src/generated/lsd_savemapeventbase.cpp @@ -300,6 +300,20 @@ static TypedField static_easyrpg_move_failure_co 0, 0 ); +static TypedField static_easyrpg_clone_map_id( + &rpg::SaveMapEventBase::easyrpg_clone_map_id, + LSD_Reader::ChunkSaveMapEventBase::easyrpg_clone_map_id, + "easyrpg_clone_map_id", + 0, + 0 +); +static TypedField static_easyrpg_clone_event_id( + &rpg::SaveMapEventBase::easyrpg_clone_event_id, + LSD_Reader::ChunkSaveMapEventBase::easyrpg_clone_event_id, + "easyrpg_clone_event_id", + 0, + 0 +); template <> @@ -344,6 +358,8 @@ Field const* Struct::fields[] = { &static_flash_current_level, &static_flash_time_left, &static_easyrpg_move_failure_count, + &static_easyrpg_clone_map_id, + &static_easyrpg_clone_event_id, NULL }; diff --git a/src/generated/lsd_savepartylocation.cpp b/src/generated/lsd_savepartylocation.cpp index 24f786b03..0c625d1ca 100644 --- a/src/generated/lsd_savepartylocation.cpp +++ b/src/generated/lsd_savepartylocation.cpp @@ -300,6 +300,20 @@ static TypedField static_easyrpg_move_failure_c 0, 0 ); +static TypedField static_easyrpg_clone_map_id( + &rpg::SavePartyLocation::easyrpg_clone_map_id, + LSD_Reader::ChunkSavePartyLocation::easyrpg_clone_map_id, + "easyrpg_clone_map_id", + 0, + 0 +); +static TypedField static_easyrpg_clone_event_id( + &rpg::SavePartyLocation::easyrpg_clone_event_id, + LSD_Reader::ChunkSavePartyLocation::easyrpg_clone_event_id, + "easyrpg_clone_event_id", + 0, + 0 +); static TypedField static_boarding( &rpg::SavePartyLocation::boarding, LSD_Reader::ChunkSavePartyLocation::boarding, @@ -470,6 +484,8 @@ Field const* Struct::fields[] = &static_flash_current_level, &static_flash_time_left, &static_easyrpg_move_failure_count, + &static_easyrpg_clone_map_id, + &static_easyrpg_clone_event_id, &static_boarding, &static_aboard, &static_vehicle, diff --git a/src/generated/lsd_savevehiclelocation.cpp b/src/generated/lsd_savevehiclelocation.cpp index 9868b82ed..05a96df89 100644 --- a/src/generated/lsd_savevehiclelocation.cpp +++ b/src/generated/lsd_savevehiclelocation.cpp @@ -300,6 +300,20 @@ static TypedField static_easyrpg_move_failure 0, 0 ); +static TypedField static_easyrpg_clone_map_id( + &rpg::SaveVehicleLocation::easyrpg_clone_map_id, + LSD_Reader::ChunkSaveVehicleLocation::easyrpg_clone_map_id, + "easyrpg_clone_map_id", + 0, + 0 +); +static TypedField static_easyrpg_clone_event_id( + &rpg::SaveVehicleLocation::easyrpg_clone_event_id, + LSD_Reader::ChunkSaveVehicleLocation::easyrpg_clone_event_id, + "easyrpg_clone_event_id", + 0, + 0 +); static TypedField static_vehicle( &rpg::SaveVehicleLocation::vehicle, LSD_Reader::ChunkSaveVehicleLocation::vehicle, @@ -379,6 +393,8 @@ Field const* Struct::fields[ &static_flash_current_level, &static_flash_time_left, &static_easyrpg_move_failure_count, + &static_easyrpg_clone_map_id, + &static_easyrpg_clone_event_id, &static_vehicle, &static_remaining_ascent, &static_remaining_descent, diff --git a/src/generated/rpg_savemapeventbase.cpp b/src/generated/rpg_savemapeventbase.cpp index 03b765547..ef2f89699 100644 --- a/src/generated/rpg_savemapeventbase.cpp +++ b/src/generated/rpg_savemapeventbase.cpp @@ -57,6 +57,8 @@ std::ostream& operator<<(std::ostream& os, const SaveMapEventBase& obj) { os << ", flash_current_level="<< obj.flash_current_level; os << ", flash_time_left="<< obj.flash_time_left; os << ", easyrpg_move_failure_count="<< obj.easyrpg_move_failure_count; + os << ", easyrpg_clone_map_id="<< obj.easyrpg_clone_map_id; + os << ", easyrpg_clone_event_id="<< obj.easyrpg_clone_event_id; os << "}"; return os; } From 01b0b8fd733e65b72be4b0557d09062813614d6d Mon Sep 17 00:00:00 2001 From: Ghabry Date: Wed, 12 Feb 2025 14:14:44 +0100 Subject: [PATCH 07/15] Bugfixes: Use correct class name for flags and flag array had incorrect length --- generator/generate.py | 4 ---- generator/templates/reader.tmpl | 4 ++++ generator/templates/rpg_header.tmpl | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generator/generate.py b/generator/generate.py index 57d556406..6c5a652d7 100755 --- a/generator/generate.py +++ b/generator/generate.py @@ -133,9 +133,6 @@ def pod_default(field): return " = " + str(dfl) -def num_flags(flag): - return len(flag) - def flag_size(flag): return (len(flag) + 7) // 8 @@ -529,7 +526,6 @@ def main(argv): env.filters["field_is_used"] = filter_unused_fields env.filters["field_is_written"] = filter_unwritten_fields env.filters["field_is_not_size"] = filter_size_fields - env.filters["num_flags"] = num_flags env.filters["flag_size"] = flag_size env.filters["flag_set"] = flag_set env.filters["flags_for"] = flags_for diff --git a/generator/templates/reader.tmpl b/generator/templates/reader.tmpl index dfa47225e..751b6ee61 100644 --- a/generator/templates/reader.tmpl +++ b/generator/templates/reader.tmpl @@ -19,7 +19,11 @@ char const* const Struct::name = "{{ LCF_CURRENT_ {%- for field in fields[struct_base]|field_is_written|list + fields[struct_name]|field_is_written|list %} {%- if field|lcf_type in ["Typed", "DatabaseVersion"] %} +{%- if field.type.endswith("_Flags") %} +static {{ field|lcf_type }}Field static_{{ field.name }}( +{%- else %} static {{ field|lcf_type }}Field static_{{ field.name }}( +{%- endif %} &rpg::{{ LCF_CURRENT_STRUCT }}::{{ field.name }}, {{ LCF_CHUNK_SUFFIX }}::Chunk{{ LCF_CURRENT_STRUCT }}::{{ field.name }}, "{{ field.name }}", diff --git a/generator/templates/rpg_header.tmpl b/generator/templates/rpg_header.tmpl index fcacb14ae..12bb86397 100644 --- a/generator/templates/rpg_header.tmpl +++ b/generator/templates/rpg_header.tmpl @@ -85,7 +85,7 @@ namespace rpg { bool {{ flag.field }}; {%- endfor %} }; - std::array flags; + std::array flags; }; {{ field.type }}() noexcept {%- for flag in flags[struct_name] %} From 0aa3ff1e33fa594c2e9faf0ca9652f8e57a4a869 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sun, 23 Feb 2025 19:24:13 +0100 Subject: [PATCH 08/15] clang: Fix Flags template --- generator/templates/flag_fwd.tmpl | 2 +- src/generated/fwd_flags_impl.h | 12 ++++++------ src/reader_flags.cpp | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/generator/templates/flag_fwd.tmpl b/generator/templates/flag_fwd.tmpl index d357d575f..d2cf9f970 100644 --- a/generator/templates/flag_fwd.tmpl +++ b/generator/templates/flag_fwd.tmpl @@ -9,5 +9,5 @@ and is used to declare the templates used by "Flags" {%- endfor %} {%- for flag in flags %} -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; {%- endfor %} diff --git a/src/generated/fwd_flags_impl.h b/src/generated/fwd_flags_impl.h index 7369c666b..6c094827d 100644 --- a/src/generated/fwd_flags_impl.h +++ b/src/generated/fwd_flags_impl.h @@ -15,9 +15,9 @@ #include "lcf/rpg/savepicture.h" #include "lcf/rpg/saveeasyrpgwindow.h" #include "lcf/rpg/saveeasyrpgtext.h" -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; -template <> struct lcf::TypeCategory { static const Category::Index value = Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; diff --git a/src/reader_flags.cpp b/src/reader_flags.cpp index d696dc7c2..cb361dd5f 100644 --- a/src/reader_flags.cpp +++ b/src/reader_flags.cpp @@ -8,7 +8,6 @@ */ #include "reader_struct.h" -#include "fwd_flags_instance.h" namespace lcf { // Templates @@ -133,5 +132,6 @@ void Flags::BeginXml(S& obj, XmlReader& stream) { #pragma warning (disable : 4661) #endif - } //namespace lcf + +#include "fwd_flags_instance.h" From 4f4645432cbd25b5acad70e3cd68ecd778c6d272 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sun, 23 Feb 2025 20:13:03 +0100 Subject: [PATCH 09/15] Events: Remove SmartMoveRoute/StepToward event and replace with Pathfinder event --- generator/csv/enums_easyrpg.csv | 3 +-- src/generated/lcf/rpg/eventcommand.h | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/generator/csv/enums_easyrpg.csv b/generator/csv/enums_easyrpg.csv index 7f42c73cf..7125767d2 100644 --- a/generator/csv/enums_easyrpg.csv +++ b/generator/csv/enums_easyrpg.csv @@ -1,7 +1,6 @@ Structure,Entry,Value,Index EventCommand,Code,EasyRpg_TriggerEventAt,2002 -EventCommand,Code,EasyRpg_SmartMoveRoute,2003 -EventCommand,Code,EasyRpg_SmartStepToward,2004 +EventCommand,Code,EasyRpg_Pathfinder,2003 EventCommand,Code,EasyRpg_CallMovementAction,2050 EventCommand,Code,EasyRpg_WaitForSingleMovement,2051 EventCommand,Code,EasyRpg_AnimateVariable,2052 diff --git a/src/generated/lcf/rpg/eventcommand.h b/src/generated/lcf/rpg/eventcommand.h index 2ff1e08d2..0e5ed36e4 100644 --- a/src/generated/lcf/rpg/eventcommand.h +++ b/src/generated/lcf/rpg/eventcommand.h @@ -158,8 +158,7 @@ namespace rpg { ElseBranch_B = 23310, EndBranch_B = 23311, EasyRpg_TriggerEventAt = 2002, - EasyRpg_SmartMoveRoute = 2003, - EasyRpg_SmartStepToward = 2004, + EasyRpg_Pathfinder = 2003, EasyRpg_CallMovementAction = 2050, EasyRpg_WaitForSingleMovement = 2051, EasyRpg_AnimateVariable = 2052, @@ -325,8 +324,7 @@ namespace rpg { Code::ElseBranch_B, "ElseBranch_B", Code::EndBranch_B, "EndBranch_B", Code::EasyRpg_TriggerEventAt, "EasyRpg_TriggerEventAt", - Code::EasyRpg_SmartMoveRoute, "EasyRpg_SmartMoveRoute", - Code::EasyRpg_SmartStepToward, "EasyRpg_SmartStepToward", + Code::EasyRpg_Pathfinder, "EasyRpg_Pathfinder", Code::EasyRpg_CallMovementAction, "EasyRpg_CallMovementAction", Code::EasyRpg_WaitForSingleMovement, "EasyRpg_WaitForSingleMovement", Code::EasyRpg_AnimateVariable, "EasyRpg_AnimateVariable", From 7c66efe636490e9c2b83546794adbfd209956b94 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sat, 8 Mar 2025 14:56:32 +0100 Subject: [PATCH 10/15] Update sources2buildsystem script to handle fwd_headers and inireader --- builds/sources2buildsystem.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/builds/sources2buildsystem.pl b/builds/sources2buildsystem.pl index 18c6c9ada..a9a495c45 100755 --- a/builds/sources2buildsystem.pl +++ b/builds/sources2buildsystem.pl @@ -2,7 +2,7 @@ # sources2buildsystem.pl - maintainer utility script to keep the # source/header file list for our build systems organized and up-to-date. -# by carstene1ns 2018-2021, released under the MIT license +# by carstene1ns 2018-2025, released under the MIT license use strict; use warnings; @@ -22,7 +22,7 @@ @files = (@others, @generated, @third_party); # split source and headers -my $regex = '(\.cpp|_flags\.h|_impl\.h|src\/[^\/]*\.h)$'; +my $regex = '(\.cpp|_flags\.h|fwd_.*\.h|src\/[^\/]*\.h)$'; my @sources = grep( /$regex/, @files); my @headers = grep(!/$regex/, @files); @@ -57,6 +57,7 @@ sub wanted { return unless -f; return unless /\.(cpp|h)$/; + return if /inireader/; push @files, $File::Find::name; } From 82efaf8d1e00fc65502c2f6ceb1a86273177fba2 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sat, 8 Mar 2025 15:12:43 +0100 Subject: [PATCH 11/15] Specified new field 0xCC "easyrpg_runtime_flags for each of the Interpreter related SaveState structures (SaveEventExecState, SaveEventExecFrame & SaveMapEventBase) Co-Authored-By: florianessl --- generator/csv/fields_easyrpg.csv | 3 +++ generator/csv/flags_easyrpg.csv | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/generator/csv/fields_easyrpg.csv b/generator/csv/fields_easyrpg.csv index f79e67250..408fd0b88 100644 --- a/generator/csv/fields_easyrpg.csv +++ b/generator/csv/fields_easyrpg.csv @@ -8,9 +8,11 @@ SaveEventExecFrame,maniac_event_id,f,Int32,0x0F,0,0,0,Event ID SaveEventExecFrame,maniac_event_page_id,f,Int32,0x10,0,0,0,Page ID when it is a map event SaveEventExecFrame,maniac_loop_info_size,f,Int32,0x11,0,0,0,Amount of loop info groups SaveEventExecFrame,maniac_loop_info,f,Vector,0x12,,0,0,"One group of (Current loop count, end loop value) for each identation" +SaveEventExecFrame,easyrpg_runtime_flags,f,EasyRpgFrameRuntime_Flags,0xCC,0,0,0,Runtime changes to the engine config SaveEventExecState,easyrpg_active,f,Boolean,0xC9,False,0,0,When true state of an event is preserved in easyrpg_string and easyrpg_parameters SaveEventExecState,easyrpg_string,f,DBString,0xCA,,0,0,Preserved string data of an event SaveEventExecState,easyrpg_parameters,f,Vector,0xCB,,0,0,Preserved int parameter of an event +SaveEventExecState,easyrpg_runtime_flags,f,EasyRpgStateRuntime_Flags,0xCC,0,0,0,Runtime changes to the engine config SavePicture,easyrpg_flip,f,Enum,0xC8,0,0,1,How to flip the picture SavePicture,easyrpg_blend_mode,f,Int32,0xC9,0,0,1,Blend mode to use for blit. See Bitmap::BlendMode SavePicture,easyrpg_type,f,Enum,0xCA,0,0,1,Type of this picture @@ -33,6 +35,7 @@ SaveEasyRpgText,flags,f,SaveEasyRpgText_Flags,0x08,3,0,0,Various text settings SaveMapEventBase,easyrpg_move_failure_count,f,Int32,0xC9,0,0,0,Tracks how often the current move operation in a move route failed SaveMapEventBase,easyrpg_clone_map_id,f,UInt32,0xCA,0,0,0,The original map id of a cloned event SaveMapEventBase,easyrpg_clone_event_id,f,UInt32,0xCB,0,0,0,The original event id of a cloned event +SaveMapEventBase,easyrpg_runtime_flags,f,EasyRpgEventRuntime_Flags,0xCC,0,0,0,Runtime changes to the engine config SavePartyLocation,maniac_horizontal_pan_speed,f,Double,0x8D,0,0,0,horizontal speed in the scrolls of the screen SavePartyLocation,maniac_vertical_pan_speed,f,Double,0x8E,0,0,0,vertical speed in the scrolls of the screen SaveSystem,maniac_strings,f,Vector,0x24,,0,0,rpg::Strings diff --git a/generator/csv/flags_easyrpg.csv b/generator/csv/flags_easyrpg.csv index 6e1a6c922..892b94dc6 100644 --- a/generator/csv/flags_easyrpg.csv +++ b/generator/csv/flags_easyrpg.csv @@ -5,3 +5,25 @@ SaveEasyRpgText,draw_gradient,0 SaveEasyRpgText,draw_shadow,0 SaveEasyRpgText,bold,0 SaveEasyRpgText,italic,0 +EasyRpgFrameRuntime,reserved_1,0 +EasyRpgEventRuntime,reserved_1,0 +EasyRpgStateRuntime,conf_override_active,0 +EasyRpgStateRuntime,reserved_1,0 +EasyRpgStateRuntime,reserved_2,0 +EasyRpgStateRuntime,reserved_3,0 +EasyRpgStateRuntime,patch_destiny_on,0 +EasyRpgStateRuntime,patch_destiny_off,0 +EasyRpgStateRuntime,patch_dynrpg_on,0 +EasyRpgStateRuntime,patch_dynrpg_off,0 +EasyRpgStateRuntime,patch_maniac_on,0 +EasyRpgStateRuntime,patch_maniac_off,0 +EasyRpgStateRuntime,patch_common_this_event_on,0 +EasyRpgStateRuntime,patch_common_this_event_off,0 +EasyRpgStateRuntime,patch_unlock_pics_on,0 +EasyRpgStateRuntime,patch_unlock_pics_off,0 +EasyRpgStateRuntime,patch_keypatch_on,0 +EasyRpgStateRuntime,patch_keypatch_off,0 +EasyRpgStateRuntime,patch_rpg2k3_cmds_on,0 +EasyRpgStateRuntime,patch_rpg2k3_cmds_off,0 +EasyRpgStateRuntime,use_rpg2k_battle_system_on,0 +EasyRpgStateRuntime,use_rpg2k_battle_system_off,0 From df49a6308eda9045a4e6682bd6bf98d564ae30d4 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Sat, 8 Mar 2025 15:13:50 +0100 Subject: [PATCH 12/15] Flags: Add generated code --- CMakeLists.txt | 9 ++- Makefile.am | 7 +- src/generated/fwd_flags_impl.h | 6 ++ src/generated/fwd_flags_instance.h | 6 ++ src/generated/lcf/lsd/chunks.h | 18 ++++- src/generated/lcf/rpg/saveeventexecframe.h | 24 +++++- src/generated/lcf/rpg/saveeventexecstate.h | 43 ++++++++++- src/generated/lcf/rpg/savemapeventbase.h | 24 +++++- src/generated/lsd_saveeventexecframe.cpp | 8 ++ ...saveeventexecframe_easyrpg_runtime_flags.h | 36 +++++++++ src/generated/lsd_saveeventexecstate.cpp | 8 ++ ...saveeventexecstate_easyrpg_runtime_flags.h | 74 +++++++++++++++++++ src/generated/lsd_savemapevent.cpp | 8 ++ src/generated/lsd_savemapeventbase.cpp | 8 ++ ...d_savemapeventbase_easyrpg_runtime_flags.h | 36 +++++++++ src/generated/lsd_savepartylocation.cpp | 8 ++ src/generated/lsd_savevehiclelocation.cpp | 8 ++ src/generated/rpg_saveeventexecframe.cpp | 9 +++ src/generated/rpg_saveeventexecstate.cpp | 9 +++ src/generated/rpg_savemapeventbase.cpp | 9 +++ 20 files changed, 349 insertions(+), 9 deletions(-) create mode 100644 src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h create mode 100644 src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h create mode 100644 src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bcd6d90bb..30a30559c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,8 @@ set(LCF_SOURCES src/lmu_movecommand.cpp src/lmu_reader.cpp src/log.h - src/lsd_reader.cpp src/log_handler.cpp + src/lsd_reader.cpp src/reader_flags.cpp src/reader_lcf.cpp src/reader_struct.h @@ -54,6 +54,8 @@ set(LCF_SOURCES src/saveopt.cpp src/writer_lcf.cpp src/writer_xml.cpp + src/generated/fwd_flags_impl.h + src/generated/fwd_flags_instance.h src/generated/fwd_struct_impl.h src/generated/ldb_actor.cpp src/generated/ldb_animation.cpp @@ -109,10 +111,13 @@ set(LCF_SOURCES src/generated/lsd_saveeasyrpgwindow.cpp src/generated/lsd_saveeasyrpgwindow_flags.h src/generated/lsd_saveeventexecframe.cpp + src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h src/generated/lsd_saveeventexecstate.cpp + src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h src/generated/lsd_saveinventory.cpp src/generated/lsd_savemapevent.cpp src/generated/lsd_savemapeventbase.cpp + src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h src/generated/lsd_savemapinfo.cpp src/generated/lsd_savepanorama.cpp src/generated/lsd_savepartylocation.cpp @@ -205,8 +210,8 @@ set(LCF_HEADERS src/lcf/ldb/reader.h src/lcf/lmt/reader.h src/lcf/lmu/reader.h - src/lcf/lsd/reader.h src/lcf/log_handler.h + src/lcf/lsd/reader.h src/lcf/reader_lcf.h src/lcf/reader_util.h src/lcf/reader_xml.h diff --git a/Makefile.am b/Makefile.am index 09c8d6568..b65852577 100644 --- a/Makefile.am +++ b/Makefile.am @@ -58,8 +58,8 @@ liblcf_la_SOURCES = \ src/lmu_movecommand.cpp \ src/lmu_reader.cpp \ src/log.h \ - src/lsd_reader.cpp \ src/log_handler.cpp \ + src/lsd_reader.cpp \ src/reader_flags.cpp \ src/reader_lcf.cpp \ src/reader_struct.h \ @@ -71,6 +71,8 @@ liblcf_la_SOURCES = \ src/saveopt.cpp \ src/writer_lcf.cpp \ src/writer_xml.cpp \ + src/generated/fwd_flags_impl.h \ + src/generated/fwd_flags_instance.h \ src/generated/fwd_struct_impl.h \ src/generated/ldb_actor.cpp \ src/generated/ldb_animation.cpp \ @@ -126,10 +128,13 @@ liblcf_la_SOURCES = \ src/generated/lsd_saveeasyrpgwindow.cpp \ src/generated/lsd_saveeasyrpgwindow_flags.h \ src/generated/lsd_saveeventexecframe.cpp \ + src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h \ src/generated/lsd_saveeventexecstate.cpp \ + src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h \ src/generated/lsd_saveinventory.cpp \ src/generated/lsd_savemapevent.cpp \ src/generated/lsd_savemapeventbase.cpp \ + src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h \ src/generated/lsd_savemapinfo.cpp \ src/generated/lsd_savepanorama.cpp \ src/generated/lsd_savepartylocation.cpp \ diff --git a/src/generated/fwd_flags_impl.h b/src/generated/fwd_flags_impl.h index 6c094827d..7dcaa8848 100644 --- a/src/generated/fwd_flags_impl.h +++ b/src/generated/fwd_flags_impl.h @@ -13,11 +13,17 @@ #include "lcf/rpg/terrain.h" #include "lcf/rpg/eventpagecondition.h" #include "lcf/rpg/savepicture.h" +#include "lcf/rpg/saveeventexecframe.h" +#include "lcf/rpg/saveeventexecstate.h" +#include "lcf/rpg/savemapeventbase.h" #include "lcf/rpg/saveeasyrpgwindow.h" #include "lcf/rpg/saveeasyrpgtext.h" template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; diff --git a/src/generated/fwd_flags_instance.h b/src/generated/fwd_flags_instance.h index 11130a3ac..2a9d67fc8 100644 --- a/src/generated/fwd_flags_instance.h +++ b/src/generated/fwd_flags_instance.h @@ -13,6 +13,9 @@ #include "ldb_terrain_special_flags.h" #include "lmu_eventpagecondition_flags.h" #include "lsd_savepicture_flags.h" +#include "lsd_saveeventexecframe_easyrpg_runtime_flags.h" +#include "lsd_saveeventexecstate_easyrpg_runtime_flags.h" +#include "lsd_savemapeventbase_easyrpg_runtime_flags.h" #include "lsd_saveeasyrpgwindow_flags.h" #include "lsd_saveeasyrpgtext_flags.h" @@ -21,6 +24,9 @@ template class Flags; template class Flags; template class Flags; template class Flags; +template class Flags; +template class Flags; +template class Flags; template class Flags; template class Flags; } diff --git a/src/generated/lcf/lsd/chunks.h b/src/generated/lcf/lsd/chunks.h index 7ef395f7c..1453bea96 100644 --- a/src/generated/lcf/lsd/chunks.h +++ b/src/generated/lcf/lsd/chunks.h @@ -414,6 +414,8 @@ namespace LSD_Reader { easyrpg_clone_map_id = 0xCA, /** The original event id of a cloned event */ easyrpg_clone_event_id = 0xCB, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC, /** */ boarding = 0x65, /** */ @@ -538,6 +540,8 @@ namespace LSD_Reader { easyrpg_clone_map_id = 0xCA, /** The original event id of a cloned event */ easyrpg_clone_event_id = 0xCB, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC, /** Which vehicle */ vehicle = 0x65, /** From 0 to 255 - In flying vehicles; remaining distance to ascend */ @@ -701,7 +705,9 @@ namespace LSD_Reader { /** Amount of loop info groups */ maniac_loop_info_size = 0x11, /** One group of (Current loop count, end loop value) for each identation */ - maniac_loop_info = 0x12 + maniac_loop_info = 0x12, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC }; }; struct ChunkSaveEventExecState { @@ -755,7 +761,9 @@ namespace LSD_Reader { /** Preserved string data of an event */ easyrpg_string = 0xCA, /** Preserved int parameter of an event */ - easyrpg_parameters = 0xCB + easyrpg_parameters = 0xCB, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC }; }; struct ChunkSaveMapEventBase { @@ -843,7 +851,9 @@ namespace LSD_Reader { /** The original map id of a cloned event */ easyrpg_clone_map_id = 0xCA, /** The original event id of a cloned event */ - easyrpg_clone_event_id = 0xCB + easyrpg_clone_event_id = 0xCB, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC }; }; struct ChunkSaveMapEvent { @@ -932,6 +942,8 @@ namespace LSD_Reader { easyrpg_clone_map_id = 0xCA, /** The original event id of a cloned event */ easyrpg_clone_event_id = 0xCB, + /** Runtime changes to the engine config */ + easyrpg_runtime_flags = 0xCC, /** If true; this event is waiting for foreground execution. */ waiting_execution = 0x65, /** Index of custom move route */ diff --git a/src/generated/lcf/rpg/saveeventexecframe.h b/src/generated/lcf/rpg/saveeventexecframe.h index 636ae357f..b812908cd 100644 --- a/src/generated/lcf/rpg/saveeventexecframe.h +++ b/src/generated/lcf/rpg/saveeventexecframe.h @@ -13,6 +13,7 @@ #define LCF_RPG_SAVEEVENTEXECFRAME_H // Headers +#include #include #include #include "lcf/rpg/eventcommand.h" @@ -38,8 +39,28 @@ namespace rpg { int32_t maniac_event_page_id = 0; int32_t maniac_loop_info_size = 0; std::vector maniac_loop_info; + struct EasyRpgFrameRuntime_Flags { + union { + struct { + bool reserved_1; + }; + std::array flags; + }; + EasyRpgFrameRuntime_Flags() noexcept + {} + } easyrpg_runtime_flags; }; + inline bool operator==(const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& l, const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& r) { + return l.flags == r.flags; + } + + inline bool operator!=(const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& l, const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& r) { + return !(l == r); + } + + std::ostream& operator<<(std::ostream& os, const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& obj); + inline bool operator==(const SaveEventExecFrame& l, const SaveEventExecFrame& r) { return l.commands == r.commands && l.current_command == r.current_command @@ -50,7 +71,8 @@ namespace rpg { && l.maniac_event_id == r.maniac_event_id && l.maniac_event_page_id == r.maniac_event_page_id && l.maniac_loop_info_size == r.maniac_loop_info_size - && l.maniac_loop_info == r.maniac_loop_info; + && l.maniac_loop_info == r.maniac_loop_info + && l.easyrpg_runtime_flags == r.easyrpg_runtime_flags; } inline bool operator!=(const SaveEventExecFrame& l, const SaveEventExecFrame& r) { diff --git a/src/generated/lcf/rpg/saveeventexecstate.h b/src/generated/lcf/rpg/saveeventexecstate.h index d49d0104e..480953103 100644 --- a/src/generated/lcf/rpg/saveeventexecstate.h +++ b/src/generated/lcf/rpg/saveeventexecstate.h @@ -13,6 +13,7 @@ #define LCF_RPG_SAVEEVENTEXECSTATE_H // Headers +#include #include #include #include "lcf/dbstring.h" @@ -53,8 +54,47 @@ namespace rpg { bool easyrpg_active = false; DBString easyrpg_string; std::vector easyrpg_parameters; + struct EasyRpgStateRuntime_Flags { + union { + struct { + bool conf_override_active; + bool reserved_1; + bool reserved_2; + bool reserved_3; + bool patch_destiny_on; + bool patch_destiny_off; + bool patch_dynrpg_on; + bool patch_dynrpg_off; + bool patch_maniac_on; + bool patch_maniac_off; + bool patch_common_this_event_on; + bool patch_common_this_event_off; + bool patch_unlock_pics_on; + bool patch_unlock_pics_off; + bool patch_keypatch_on; + bool patch_keypatch_off; + bool patch_rpg2k3_cmds_on; + bool patch_rpg2k3_cmds_off; + bool use_rpg2k_battle_system_on; + bool use_rpg2k_battle_system_off; + }; + std::array flags; + }; + EasyRpgStateRuntime_Flags() noexcept + {} + } easyrpg_runtime_flags; }; + inline bool operator==(const SaveEventExecState::EasyRpgStateRuntime_Flags& l, const SaveEventExecState::EasyRpgStateRuntime_Flags& r) { + return l.flags == r.flags; + } + + inline bool operator!=(const SaveEventExecState::EasyRpgStateRuntime_Flags& l, const SaveEventExecState::EasyRpgStateRuntime_Flags& r) { + return !(l == r); + } + + std::ostream& operator<<(std::ostream& os, const SaveEventExecState::EasyRpgStateRuntime_Flags& obj); + inline bool operator==(const SaveEventExecState& l, const SaveEventExecState& r) { return l.stack == r.stack && l.show_message == r.show_message @@ -80,7 +120,8 @@ namespace rpg { && l.wait_key_enter == r.wait_key_enter && l.easyrpg_active == r.easyrpg_active && l.easyrpg_string == r.easyrpg_string - && l.easyrpg_parameters == r.easyrpg_parameters; + && l.easyrpg_parameters == r.easyrpg_parameters + && l.easyrpg_runtime_flags == r.easyrpg_runtime_flags; } inline bool operator!=(const SaveEventExecState& l, const SaveEventExecState& r) { diff --git a/src/generated/lcf/rpg/savemapeventbase.h b/src/generated/lcf/rpg/savemapeventbase.h index b67cfbff7..768c8b2a6 100644 --- a/src/generated/lcf/rpg/savemapeventbase.h +++ b/src/generated/lcf/rpg/savemapeventbase.h @@ -13,6 +13,7 @@ #define LCF_RPG_SAVEMAPEVENTBASE_H // Headers +#include #include #include #include "lcf/enum_tags.h" @@ -70,8 +71,28 @@ namespace rpg { int32_t easyrpg_move_failure_count = 0; uint32_t easyrpg_clone_map_id = 0; uint32_t easyrpg_clone_event_id = 0; + struct EasyRpgEventRuntime_Flags { + union { + struct { + bool reserved_1; + }; + std::array flags; + }; + EasyRpgEventRuntime_Flags() noexcept + {} + } easyrpg_runtime_flags; }; + inline bool operator==(const SaveMapEventBase::EasyRpgEventRuntime_Flags& l, const SaveMapEventBase::EasyRpgEventRuntime_Flags& r) { + return l.flags == r.flags; + } + + inline bool operator!=(const SaveMapEventBase::EasyRpgEventRuntime_Flags& l, const SaveMapEventBase::EasyRpgEventRuntime_Flags& r) { + return !(l == r); + } + + std::ostream& operator<<(std::ostream& os, const SaveMapEventBase::EasyRpgEventRuntime_Flags& obj); + inline bool operator==(const SaveMapEventBase& l, const SaveMapEventBase& r) { return l.active == r.active && l.map_id == r.map_id @@ -114,7 +135,8 @@ namespace rpg { && l.flash_time_left == r.flash_time_left && l.easyrpg_move_failure_count == r.easyrpg_move_failure_count && l.easyrpg_clone_map_id == r.easyrpg_clone_map_id - && l.easyrpg_clone_event_id == r.easyrpg_clone_event_id; + && l.easyrpg_clone_event_id == r.easyrpg_clone_event_id + && l.easyrpg_runtime_flags == r.easyrpg_runtime_flags; } inline bool operator!=(const SaveMapEventBase& l, const SaveMapEventBase& r) { diff --git a/src/generated/lsd_saveeventexecframe.cpp b/src/generated/lsd_saveeventexecframe.cpp index a29acf33d..2805017f0 100644 --- a/src/generated/lsd_saveeventexecframe.cpp +++ b/src/generated/lsd_saveeventexecframe.cpp @@ -102,6 +102,13 @@ static TypedField> static_maniac_l 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SaveEventExecFrame::easyrpg_runtime_flags, + LSD_Reader::ChunkSaveEventExecFrame::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); template <> @@ -118,6 +125,7 @@ Field const* Struct::fields[] &static_maniac_event_page_id, &static_maniac_loop_info_size, &static_maniac_loop_info, + &static_easyrpg_runtime_flags, NULL }; diff --git a/src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h b/src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h new file mode 100644 index 000000000..64cccbccb --- /dev/null +++ b/src/generated/lsd_saveeventexecframe_easyrpg_runtime_flags.h @@ -0,0 +1,36 @@ +/* !!!! GENERATED FILE - DO NOT EDIT !!!! + * -------------------------------------- + * + * This file is part of liblcf. Copyright (c) liblcf authors. + * https://github.com/EasyRPG/liblcf - https://easyrpg.org + * + * liblcf is Free/Libre Open Source Software, released under the MIT License. + * For the full copyright and license information, please view the COPYING + * file that was distributed with this source code. + */ + +/* + * Headers + */ +#include "lcf/lsd/reader.h" +#include "lcf/lsd/chunks.h" +#include "reader_struct.h" + +namespace lcf { + +// Read SaveEventExecFrame. + +template <> +char const* const Flags::name = "SaveEventExecFrame_EasyRpgFrameRuntime_Flags"; + +template <> +decltype(Flags::flag_names) Flags::flag_names = { + "reserved_1" +}; + +template <> +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { + 0 +}; + +} //namespace lcf diff --git a/src/generated/lsd_saveeventexecstate.cpp b/src/generated/lsd_saveeventexecstate.cpp index e8f684698..fb9f7b3f6 100644 --- a/src/generated/lsd_saveeventexecstate.cpp +++ b/src/generated/lsd_saveeventexecstate.cpp @@ -195,6 +195,13 @@ static TypedField> static_easyrpg_ 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SaveEventExecState::easyrpg_runtime_flags, + LSD_Reader::ChunkSaveEventExecState::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); template <> @@ -224,6 +231,7 @@ Field const* Struct::fields[] &static_easyrpg_active, &static_easyrpg_string, &static_easyrpg_parameters, + &static_easyrpg_runtime_flags, NULL }; diff --git a/src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h b/src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h new file mode 100644 index 000000000..98dbec5a7 --- /dev/null +++ b/src/generated/lsd_saveeventexecstate_easyrpg_runtime_flags.h @@ -0,0 +1,74 @@ +/* !!!! GENERATED FILE - DO NOT EDIT !!!! + * -------------------------------------- + * + * This file is part of liblcf. Copyright (c) liblcf authors. + * https://github.com/EasyRPG/liblcf - https://easyrpg.org + * + * liblcf is Free/Libre Open Source Software, released under the MIT License. + * For the full copyright and license information, please view the COPYING + * file that was distributed with this source code. + */ + +/* + * Headers + */ +#include "lcf/lsd/reader.h" +#include "lcf/lsd/chunks.h" +#include "reader_struct.h" + +namespace lcf { + +// Read SaveEventExecState. + +template <> +char const* const Flags::name = "SaveEventExecState_EasyRpgStateRuntime_Flags"; + +template <> +decltype(Flags::flag_names) Flags::flag_names = { + "conf_override_active", + "reserved_1", + "reserved_2", + "reserved_3", + "patch_destiny_on", + "patch_destiny_off", + "patch_dynrpg_on", + "patch_dynrpg_off", + "patch_maniac_on", + "patch_maniac_off", + "patch_common_this_event_on", + "patch_common_this_event_off", + "patch_unlock_pics_on", + "patch_unlock_pics_off", + "patch_keypatch_on", + "patch_keypatch_off", + "patch_rpg2k3_cmds_on", + "patch_rpg2k3_cmds_off", + "use_rpg2k_battle_system_on", + "use_rpg2k_battle_system_off" +}; + +template <> +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +} //namespace lcf diff --git a/src/generated/lsd_savemapevent.cpp b/src/generated/lsd_savemapevent.cpp index 628b8df43..a7242406f 100644 --- a/src/generated/lsd_savemapevent.cpp +++ b/src/generated/lsd_savemapevent.cpp @@ -314,6 +314,13 @@ static TypedField static_easyrpg_clone_event_id( 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SaveMapEvent::easyrpg_runtime_flags, + LSD_Reader::ChunkSaveMapEvent::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); static TypedField static_waiting_execution( &rpg::SaveMapEvent::waiting_execution, LSD_Reader::ChunkSaveMapEvent::waiting_execution, @@ -388,6 +395,7 @@ Field const* Struct::fields[] = { &static_easyrpg_move_failure_count, &static_easyrpg_clone_map_id, &static_easyrpg_clone_event_id, + &static_easyrpg_runtime_flags, &static_waiting_execution, &static_original_move_route_index, &static_triggered_by_decision_key, diff --git a/src/generated/lsd_savemapeventbase.cpp b/src/generated/lsd_savemapeventbase.cpp index cf832f27a..5fbc48c24 100644 --- a/src/generated/lsd_savemapeventbase.cpp +++ b/src/generated/lsd_savemapeventbase.cpp @@ -314,6 +314,13 @@ static TypedField static_easyrpg_clone_event_id 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SaveMapEventBase::easyrpg_runtime_flags, + LSD_Reader::ChunkSaveMapEventBase::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); template <> @@ -360,6 +367,7 @@ Field const* Struct::fields[] = { &static_easyrpg_move_failure_count, &static_easyrpg_clone_map_id, &static_easyrpg_clone_event_id, + &static_easyrpg_runtime_flags, NULL }; diff --git a/src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h b/src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h new file mode 100644 index 000000000..601572b38 --- /dev/null +++ b/src/generated/lsd_savemapeventbase_easyrpg_runtime_flags.h @@ -0,0 +1,36 @@ +/* !!!! GENERATED FILE - DO NOT EDIT !!!! + * -------------------------------------- + * + * This file is part of liblcf. Copyright (c) liblcf authors. + * https://github.com/EasyRPG/liblcf - https://easyrpg.org + * + * liblcf is Free/Libre Open Source Software, released under the MIT License. + * For the full copyright and license information, please view the COPYING + * file that was distributed with this source code. + */ + +/* + * Headers + */ +#include "lcf/lsd/reader.h" +#include "lcf/lsd/chunks.h" +#include "reader_struct.h" + +namespace lcf { + +// Read SaveMapEventBase. + +template <> +char const* const Flags::name = "SaveMapEventBase_EasyRpgEventRuntime_Flags"; + +template <> +decltype(Flags::flag_names) Flags::flag_names = { + "reserved_1" +}; + +template <> +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { + 0 +}; + +} //namespace lcf diff --git a/src/generated/lsd_savepartylocation.cpp b/src/generated/lsd_savepartylocation.cpp index 0c625d1ca..f532cf520 100644 --- a/src/generated/lsd_savepartylocation.cpp +++ b/src/generated/lsd_savepartylocation.cpp @@ -314,6 +314,13 @@ static TypedField static_easyrpg_clone_event_i 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SavePartyLocation::easyrpg_runtime_flags, + LSD_Reader::ChunkSavePartyLocation::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); static TypedField static_boarding( &rpg::SavePartyLocation::boarding, LSD_Reader::ChunkSavePartyLocation::boarding, @@ -486,6 +493,7 @@ Field const* Struct::fields[] = &static_easyrpg_move_failure_count, &static_easyrpg_clone_map_id, &static_easyrpg_clone_event_id, + &static_easyrpg_runtime_flags, &static_boarding, &static_aboard, &static_vehicle, diff --git a/src/generated/lsd_savevehiclelocation.cpp b/src/generated/lsd_savevehiclelocation.cpp index 05a96df89..71a64faa3 100644 --- a/src/generated/lsd_savevehiclelocation.cpp +++ b/src/generated/lsd_savevehiclelocation.cpp @@ -314,6 +314,13 @@ static TypedField static_easyrpg_clone_event 0, 0 ); +static TypedField static_easyrpg_runtime_flags( + &rpg::SaveVehicleLocation::easyrpg_runtime_flags, + LSD_Reader::ChunkSaveVehicleLocation::easyrpg_runtime_flags, + "easyrpg_runtime_flags", + 0, + 0 +); static TypedField static_vehicle( &rpg::SaveVehicleLocation::vehicle, LSD_Reader::ChunkSaveVehicleLocation::vehicle, @@ -395,6 +402,7 @@ Field const* Struct::fields[ &static_easyrpg_move_failure_count, &static_easyrpg_clone_map_id, &static_easyrpg_clone_event_id, + &static_easyrpg_runtime_flags, &static_vehicle, &static_remaining_ascent, &static_remaining_descent, diff --git a/src/generated/rpg_saveeventexecframe.cpp b/src/generated/rpg_saveeventexecframe.cpp index 55dc3bc46..a36f071cc 100644 --- a/src/generated/rpg_saveeventexecframe.cpp +++ b/src/generated/rpg_saveeventexecframe.cpp @@ -15,6 +15,14 @@ namespace lcf { namespace rpg { +std::ostream& operator<<(std::ostream& os, const SaveEventExecFrame::EasyRpgFrameRuntime_Flags& obj) { + for (size_t i = 0; i < obj.flags.size(); ++i) { + os << (i == 0 ? "[" : ", ") << obj.flags[i]; + } + os << "]"; + return os; +} + std::ostream& operator<<(std::ostream& os, const SaveEventExecFrame& obj) { os << "SaveEventExecFrame{"; os << "commands="; @@ -39,6 +47,7 @@ std::ostream& operator<<(std::ostream& os, const SaveEventExecFrame& obj) { os << (i == 0 ? "[" : ", ") << obj.maniac_loop_info[i]; } os << "]"; + os << ", easyrpg_runtime_flags="<< obj.easyrpg_runtime_flags; os << "}"; return os; } diff --git a/src/generated/rpg_saveeventexecstate.cpp b/src/generated/rpg_saveeventexecstate.cpp index 4c58ae4bf..0e1dc7295 100644 --- a/src/generated/rpg_saveeventexecstate.cpp +++ b/src/generated/rpg_saveeventexecstate.cpp @@ -15,6 +15,14 @@ namespace lcf { namespace rpg { +std::ostream& operator<<(std::ostream& os, const SaveEventExecState::EasyRpgStateRuntime_Flags& obj) { + for (size_t i = 0; i < obj.flags.size(); ++i) { + os << (i == 0 ? "[" : ", ") << obj.flags[i]; + } + os << "]"; + return os; +} + std::ostream& operator<<(std::ostream& os, const SaveEventExecState& obj) { os << "SaveEventExecState{"; os << "stack="; @@ -50,6 +58,7 @@ std::ostream& operator<<(std::ostream& os, const SaveEventExecState& obj) { os << (i == 0 ? "[" : ", ") << obj.easyrpg_parameters[i]; } os << "]"; + os << ", easyrpg_runtime_flags="<< obj.easyrpg_runtime_flags; os << "}"; return os; } diff --git a/src/generated/rpg_savemapeventbase.cpp b/src/generated/rpg_savemapeventbase.cpp index ef2f89699..430b6d920 100644 --- a/src/generated/rpg_savemapeventbase.cpp +++ b/src/generated/rpg_savemapeventbase.cpp @@ -15,6 +15,14 @@ namespace lcf { namespace rpg { +std::ostream& operator<<(std::ostream& os, const SaveMapEventBase::EasyRpgEventRuntime_Flags& obj) { + for (size_t i = 0; i < obj.flags.size(); ++i) { + os << (i == 0 ? "[" : ", ") << obj.flags[i]; + } + os << "]"; + return os; +} + std::ostream& operator<<(std::ostream& os, const SaveMapEventBase& obj) { os << "SaveMapEventBase{"; os << "active="<< obj.active; @@ -59,6 +67,7 @@ std::ostream& operator<<(std::ostream& os, const SaveMapEventBase& obj) { os << ", easyrpg_move_failure_count="<< obj.easyrpg_move_failure_count; os << ", easyrpg_clone_map_id="<< obj.easyrpg_clone_map_id; os << ", easyrpg_clone_event_id="<< obj.easyrpg_clone_event_id; + os << ", easyrpg_runtime_flags="<< obj.easyrpg_runtime_flags; os << "}"; return os; } From 685580b5fd5c94b36dcfa61e72d1c97c72a2667e Mon Sep 17 00:00:00 2001 From: Ghabry Date: Mon, 10 Mar 2025 09:41:52 +0100 Subject: [PATCH 13/15] Flags: Initialise flags correctly when the Flag has a different name than the struct oversight from the refactor Thanks @florianessl --- generator/templates/rpg_header.tmpl | 2 +- src/generated/lcf/rpg/saveeventexecframe.h | 2 +- src/generated/lcf/rpg/saveeventexecstate.h | 2 +- src/generated/lcf/rpg/savemapeventbase.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generator/templates/rpg_header.tmpl b/generator/templates/rpg_header.tmpl index 12bb86397..a22e2fb0c 100644 --- a/generator/templates/rpg_header.tmpl +++ b/generator/templates/rpg_header.tmpl @@ -88,7 +88,7 @@ namespace rpg { std::array flags; }; {{ field.type }}() noexcept - {%- for flag in flags[struct_name] %} + {%- for flag in field.type|flags_for %} {%- if loop.first %}:{%- else %},{%- endif %} {{ flag.field }}({{ field|flag_set(loop.index) }}) {%- endfor %} {} diff --git a/src/generated/lcf/rpg/saveeventexecframe.h b/src/generated/lcf/rpg/saveeventexecframe.h index b812908cd..cf1c21ae2 100644 --- a/src/generated/lcf/rpg/saveeventexecframe.h +++ b/src/generated/lcf/rpg/saveeventexecframe.h @@ -46,7 +46,7 @@ namespace rpg { }; std::array flags; }; - EasyRpgFrameRuntime_Flags() noexcept + EasyRpgFrameRuntime_Flags() noexcept: reserved_1(false) {} } easyrpg_runtime_flags; }; diff --git a/src/generated/lcf/rpg/saveeventexecstate.h b/src/generated/lcf/rpg/saveeventexecstate.h index 480953103..f93e5f56d 100644 --- a/src/generated/lcf/rpg/saveeventexecstate.h +++ b/src/generated/lcf/rpg/saveeventexecstate.h @@ -80,7 +80,7 @@ namespace rpg { }; std::array flags; }; - EasyRpgStateRuntime_Flags() noexcept + EasyRpgStateRuntime_Flags() noexcept: conf_override_active(false), reserved_1(false), reserved_2(false), reserved_3(false), patch_destiny_on(false), patch_destiny_off(false), patch_dynrpg_on(false), patch_dynrpg_off(false), patch_maniac_on(false), patch_maniac_off(false), patch_common_this_event_on(false), patch_common_this_event_off(false), patch_unlock_pics_on(false), patch_unlock_pics_off(false), patch_keypatch_on(false), patch_keypatch_off(false), patch_rpg2k3_cmds_on(false), patch_rpg2k3_cmds_off(false), use_rpg2k_battle_system_on(false), use_rpg2k_battle_system_off(false) {} } easyrpg_runtime_flags; }; diff --git a/src/generated/lcf/rpg/savemapeventbase.h b/src/generated/lcf/rpg/savemapeventbase.h index 768c8b2a6..e31c29285 100644 --- a/src/generated/lcf/rpg/savemapeventbase.h +++ b/src/generated/lcf/rpg/savemapeventbase.h @@ -78,7 +78,7 @@ namespace rpg { }; std::array flags; }; - EasyRpgEventRuntime_Flags() noexcept + EasyRpgEventRuntime_Flags() noexcept: reserved_1(false) {} } easyrpg_runtime_flags; }; From 2999705c9082c54dc2063c3c41801663bc176589 Mon Sep 17 00:00:00 2001 From: Ghabry Date: Fri, 14 Mar 2025 16:26:37 +0100 Subject: [PATCH 14/15] Flags: Make flag generation backward compatible Use only "Flags" when struct = flagname as we originally did. --- generator/generate.py | 25 ++++++++++++++++--------- generator/templates/reader.tmpl | 2 +- generator/templates/rpg_header.tmpl | 17 +++++++++-------- generator/templates/rpg_source.tmpl | 2 +- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/generator/generate.py b/generator/generate.py index 6c5a652d7..4afad371a 100755 --- a/generator/generate.py +++ b/generator/generate.py @@ -90,16 +90,20 @@ def cpp_type(ty, prefix=True): m = re.match(r'(.*)_Flags$', ty) if m: - ty = m.expand(r'\1::\1_Flags') - if prefix: - ty = 'rpg::' + ty - return ty + raise ValueError("use flag_type for flags") if prefix: ty = 'rpg::' + ty return ty +def flag_type(field, struct_name): + field_type = field.type + # Backward compatibility: When Struct Name = Flag Name only emit "Flags" + if struct_name == field.type[:-6]: + field_type = "Flags" + return field_type + def pod_default(field): dfl = field.default ftype = field.type @@ -146,8 +150,8 @@ def flag_set(field, bit): return str(res).lower() -def flags_for(typ): - return flags[typ[:-6]] +def flags_for(field): + return flags[field.type[:-6]] def filter_structs_without_codes(structs): for struct in structs: @@ -468,12 +472,14 @@ def generate(): for flag_field in struct_flag_fields: header_file = '%s_%s_%s.h' % (filetype, filename, flag_field.name) filepath = os.path.join(tmp_dir, header_file) - flag_fields.append(dict(struct_name=struct.name, struct_header=struct_header, field_name=flag_field.type, flag_header=header_file)) + field_name = flag_type(flag_field, struct.name) + flag_fields.append(dict(struct_name=struct.name, struct_header=struct_header, field_name=field_name, flag_header=header_file)) + with openToRender(filepath) as f: f.write(flags_tmpl.render( - struct_name=struct.name, + struct_name=flag_fields[-1]["struct_name"], type=filetype, - flag_name=flag_field.type, + flag_name=flag_fields[-1]["field_name"], flag_item=flags[flag_field.type[:-6]] )) @@ -521,6 +527,7 @@ def main(argv): # Setup Jinja env.filters["lcf_type"] = lcf_type env.filters["cpp_type"] = cpp_type + env.filters["flag_type"] = flag_type env.filters["pod_default"] = pod_default env.filters["struct_has_code"] = filter_structs_without_codes env.filters["field_is_used"] = filter_unused_fields diff --git a/generator/templates/reader.tmpl b/generator/templates/reader.tmpl index 751b6ee61..af590de38 100644 --- a/generator/templates/reader.tmpl +++ b/generator/templates/reader.tmpl @@ -20,7 +20,7 @@ char const* const Struct::name = "{{ LCF_CURRENT_ {%- for field in fields[struct_base]|field_is_written|list + fields[struct_name]|field_is_written|list %} {%- if field|lcf_type in ["Typed", "DatabaseVersion"] %} {%- if field.type.endswith("_Flags") %} -static {{ field|lcf_type }}Field static_{{ field.name }}( +static {{ field|lcf_type }}Field static_{{ field.name }}( {%- else %} static {{ field|lcf_type }}Field static_{{ field.name }}( {%- endif %} diff --git a/generator/templates/rpg_header.tmpl b/generator/templates/rpg_header.tmpl index a22e2fb0c..3f0a3536c 100644 --- a/generator/templates/rpg_header.tmpl +++ b/generator/templates/rpg_header.tmpl @@ -78,17 +78,17 @@ namespace rpg { {%- for field in fields[struct_name]|field_is_used %} {%- if not field.size %} {%- if field.type.endswith("_Flags") %} - struct {{ field.type }} { + struct {{ field|flag_type(struct_name) }} { union { struct { - {%- for flag in field.type|flags_for %} + {%- for flag in field|flags_for %} bool {{ flag.field }}; {%- endfor %} }; - std::array flags; + std::array flags; }; - {{ field.type }}() noexcept - {%- for flag in field.type|flags_for %} + {{ field|flag_type(struct_name) }}() noexcept + {%- for flag in field|flags_for %} {%- if loop.first %}:{%- else %},{%- endif %} {{ flag.field }}({{ field|flag_set(loop.index) }}) {%- endfor %} {} @@ -110,16 +110,17 @@ namespace rpg { {%- for field in fields[struct_name]|field_is_used %} {%- if not field.size %} {%- if field.type.endswith("_Flags") %} + {%- set field_type = field|flag_type(struct_name) %} - inline bool operator==(const {{ struct_name }}::{{ field.type }}& l, const {{ struct_name }}::{{ field.type }}& r) { + inline bool operator==(const {{ struct_name }}::{{ field_type }}& l, const {{ struct_name }}::{{ field_type }}& r) { return l.flags == r.flags; } - inline bool operator!=(const {{ struct_name }}::{{ field.type }}& l, const {{ struct_name }}::{{ field.type }}& r) { + inline bool operator!=(const {{ struct_name }}::{{ field_type }}& l, const {{ struct_name }}::{{ field_type }}& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field.type }}& obj); + std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field_type }}& obj); {%- endif %} {%- endif %} {%- endfor %} diff --git a/generator/templates/rpg_source.tmpl b/generator/templates/rpg_source.tmpl index 8bb4bd64d..9d0847e22 100644 --- a/generator/templates/rpg_source.tmpl +++ b/generator/templates/rpg_source.tmpl @@ -12,7 +12,7 @@ namespace rpg { {%- if not field.size %} {%- if field.type.endswith("_Flags") %} -std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field.type }}& obj) { +std::ostream& operator<<(std::ostream& os, const {{ struct_name }}::{{ field|flag_type(struct_name) }}& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } From b0e6b1399ee3fa81ce13d4c772ba7976d16fafeb Mon Sep 17 00:00:00 2001 From: Ghabry Date: Fri, 14 Mar 2025 16:28:54 +0100 Subject: [PATCH 15/15] Add generated files --- src/generated/fwd_flags_impl.h | 12 ++++++------ src/generated/fwd_flags_instance.h | 12 ++++++------ src/generated/lcf/rpg/eventpagecondition.h | 10 +++++----- src/generated/lcf/rpg/saveeasyrpgtext.h | 10 +++++----- src/generated/lcf/rpg/saveeasyrpgwindow.h | 10 +++++----- src/generated/lcf/rpg/savepicture.h | 10 +++++----- src/generated/lcf/rpg/terrain.h | 10 +++++----- src/generated/lcf/rpg/trooppagecondition.h | 10 +++++----- src/generated/ldb_terrain.cpp | 2 +- src/generated/ldb_terrain_special_flags.h | 6 +++--- src/generated/ldb_trooppagecondition.cpp | 2 +- src/generated/ldb_trooppagecondition_flags.h | 6 +++--- src/generated/lmu_eventpagecondition.cpp | 2 +- src/generated/lmu_eventpagecondition_flags.h | 6 +++--- src/generated/lsd_saveeasyrpgtext.cpp | 2 +- src/generated/lsd_saveeasyrpgtext_flags.h | 6 +++--- src/generated/lsd_saveeasyrpgwindow.cpp | 2 +- src/generated/lsd_saveeasyrpgwindow_flags.h | 6 +++--- src/generated/lsd_savepicture.cpp | 2 +- src/generated/lsd_savepicture_flags.h | 6 +++--- src/generated/rpg_eventpagecondition.cpp | 2 +- src/generated/rpg_saveeasyrpgtext.cpp | 2 +- src/generated/rpg_saveeasyrpgwindow.cpp | 2 +- src/generated/rpg_savepicture.cpp | 2 +- src/generated/rpg_terrain.cpp | 2 +- src/generated/rpg_trooppagecondition.cpp | 2 +- 26 files changed, 72 insertions(+), 72 deletions(-) diff --git a/src/generated/fwd_flags_impl.h b/src/generated/fwd_flags_impl.h index 7dcaa8848..6883f7ae7 100644 --- a/src/generated/fwd_flags_impl.h +++ b/src/generated/fwd_flags_impl.h @@ -18,12 +18,12 @@ #include "lcf/rpg/savemapeventbase.h" #include "lcf/rpg/saveeasyrpgwindow.h" #include "lcf/rpg/saveeasyrpgtext.h" -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; -template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; +template <> struct lcf::TypeCategory { static const lcf::Category::Index value = lcf::Category::Flags; }; diff --git a/src/generated/fwd_flags_instance.h b/src/generated/fwd_flags_instance.h index 2a9d67fc8..829ddd2d6 100644 --- a/src/generated/fwd_flags_instance.h +++ b/src/generated/fwd_flags_instance.h @@ -20,13 +20,13 @@ #include "lsd_saveeasyrpgtext_flags.h" namespace lcf { -template class Flags; -template class Flags; -template class Flags; -template class Flags; +template class Flags; +template class Flags; +template class Flags; +template class Flags; template class Flags; template class Flags; template class Flags; -template class Flags; -template class Flags; +template class Flags; +template class Flags; } diff --git a/src/generated/lcf/rpg/eventpagecondition.h b/src/generated/lcf/rpg/eventpagecondition.h index 3a323a4cc..30939e29c 100644 --- a/src/generated/lcf/rpg/eventpagecondition.h +++ b/src/generated/lcf/rpg/eventpagecondition.h @@ -44,7 +44,7 @@ namespace rpg { "not_equal" ); - struct EventPageCondition_Flags { + struct Flags { union { struct { bool switch_a; @@ -57,7 +57,7 @@ namespace rpg { }; std::array flags; }; - EventPageCondition_Flags() noexcept: switch_a(false), switch_b(false), variable(false), item(false), actor(false), timer(false), timer2(false) + Flags() noexcept: switch_a(false), switch_b(false), variable(false), item(false), actor(false), timer(false), timer2(false) {} } flags; int32_t switch_a_id = 1; @@ -75,15 +75,15 @@ namespace rpg { return os; } - inline bool operator==(const EventPageCondition::EventPageCondition_Flags& l, const EventPageCondition::EventPageCondition_Flags& r) { + inline bool operator==(const EventPageCondition::Flags& l, const EventPageCondition::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const EventPageCondition::EventPageCondition_Flags& l, const EventPageCondition::EventPageCondition_Flags& r) { + inline bool operator!=(const EventPageCondition::Flags& l, const EventPageCondition::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const EventPageCondition::EventPageCondition_Flags& obj); + std::ostream& operator<<(std::ostream& os, const EventPageCondition::Flags& obj); inline bool operator==(const EventPageCondition& l, const EventPageCondition& r) { return l.flags == r.flags diff --git a/src/generated/lcf/rpg/saveeasyrpgtext.h b/src/generated/lcf/rpg/saveeasyrpgtext.h index 825c752d0..bda8176db 100644 --- a/src/generated/lcf/rpg/saveeasyrpgtext.h +++ b/src/generated/lcf/rpg/saveeasyrpgtext.h @@ -34,7 +34,7 @@ namespace rpg { int32_t font_size = 12; int32_t letter_spacing = 0; int32_t line_spacing = 4; - struct SaveEasyRpgText_Flags { + struct Flags { union { struct { bool draw_gradient; @@ -44,20 +44,20 @@ namespace rpg { }; std::array flags; }; - SaveEasyRpgText_Flags() noexcept: draw_gradient(true), draw_shadow(true), bold(false), italic(false) + Flags() noexcept: draw_gradient(true), draw_shadow(true), bold(false), italic(false) {} } flags; }; - inline bool operator==(const SaveEasyRpgText::SaveEasyRpgText_Flags& l, const SaveEasyRpgText::SaveEasyRpgText_Flags& r) { + inline bool operator==(const SaveEasyRpgText::Flags& l, const SaveEasyRpgText::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SaveEasyRpgText::SaveEasyRpgText_Flags& l, const SaveEasyRpgText::SaveEasyRpgText_Flags& r) { + inline bool operator!=(const SaveEasyRpgText::Flags& l, const SaveEasyRpgText::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::SaveEasyRpgText_Flags& obj); + std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::Flags& obj); inline bool operator==(const SaveEasyRpgText& l, const SaveEasyRpgText& r) { return l.text == r.text diff --git a/src/generated/lcf/rpg/saveeasyrpgwindow.h b/src/generated/lcf/rpg/saveeasyrpgwindow.h index cb427ab29..67a795be2 100644 --- a/src/generated/lcf/rpg/saveeasyrpgwindow.h +++ b/src/generated/lcf/rpg/saveeasyrpgwindow.h @@ -36,7 +36,7 @@ namespace rpg { int32_t height = 0; DBString system_name; int32_t message_stretch = 0; - struct SaveEasyRpgWindow_Flags { + struct Flags { union { struct { bool draw_frame; @@ -44,20 +44,20 @@ namespace rpg { }; std::array flags; }; - SaveEasyRpgWindow_Flags() noexcept: draw_frame(true), border_margin(true) + Flags() noexcept: draw_frame(true), border_margin(true) {} } flags; }; - inline bool operator==(const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& l, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& r) { + inline bool operator==(const SaveEasyRpgWindow::Flags& l, const SaveEasyRpgWindow::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& l, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& r) { + inline bool operator!=(const SaveEasyRpgWindow::Flags& l, const SaveEasyRpgWindow::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& obj); + std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::Flags& obj); inline bool operator==(const SaveEasyRpgWindow& l, const SaveEasyRpgWindow& r) { return l.texts == r.texts diff --git a/src/generated/lcf/rpg/savepicture.h b/src/generated/lcf/rpg/savepicture.h index 6388f6248..bb8e09e8b 100644 --- a/src/generated/lcf/rpg/savepicture.h +++ b/src/generated/lcf/rpg/savepicture.h @@ -128,7 +128,7 @@ namespace rpg { bool spritesheet_play_once = false; int32_t map_layer = 7; int32_t battle_layer = 0; - struct SavePicture_Flags { + struct Flags { union { struct { bool erase_on_map_change; @@ -141,7 +141,7 @@ namespace rpg { }; std::array flags; }; - SavePicture_Flags() noexcept: erase_on_map_change(true), erase_on_battle_end(false), unused_bit(false), unused_bit2(false), affected_by_tint(false), affected_by_flash(true), affected_by_shake(true) + Flags() noexcept: erase_on_map_change(true), erase_on_battle_end(false), unused_bit(false), unused_bit2(false), affected_by_tint(false), affected_by_flash(true), affected_by_shake(true) {} } flags; double finish_x = 0.0; @@ -184,15 +184,15 @@ namespace rpg { return os; } - inline bool operator==(const SavePicture::SavePicture_Flags& l, const SavePicture::SavePicture_Flags& r) { + inline bool operator==(const SavePicture::Flags& l, const SavePicture::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const SavePicture::SavePicture_Flags& l, const SavePicture::SavePicture_Flags& r) { + inline bool operator!=(const SavePicture::Flags& l, const SavePicture::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const SavePicture::SavePicture_Flags& obj); + std::ostream& operator<<(std::ostream& os, const SavePicture::Flags& obj); inline bool operator==(const SavePicture& l, const SavePicture& r) { return l.name == r.name diff --git a/src/generated/lcf/rpg/terrain.h b/src/generated/lcf/rpg/terrain.h index 848c268be..5aec88afd 100644 --- a/src/generated/lcf/rpg/terrain.h +++ b/src/generated/lcf/rpg/terrain.h @@ -74,7 +74,7 @@ namespace rpg { bool background_b_scrollv = false; int32_t background_b_scrollh_speed = 0; int32_t background_b_scrollv_speed = 0; - struct Terrain_Flags { + struct Flags { union { struct { bool back_party; @@ -84,7 +84,7 @@ namespace rpg { }; std::array flags; }; - Terrain_Flags() noexcept: back_party(false), back_enemies(false), lateral_party(false), lateral_enemies(false) + Flags() noexcept: back_party(false), back_enemies(false), lateral_party(false), lateral_enemies(false) {} } special_flags; int32_t special_back_party = 15; @@ -107,15 +107,15 @@ namespace rpg { return os; } - inline bool operator==(const Terrain::Terrain_Flags& l, const Terrain::Terrain_Flags& r) { + inline bool operator==(const Terrain::Flags& l, const Terrain::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const Terrain::Terrain_Flags& l, const Terrain::Terrain_Flags& r) { + inline bool operator!=(const Terrain::Flags& l, const Terrain::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const Terrain::Terrain_Flags& obj); + std::ostream& operator<<(std::ostream& os, const Terrain::Flags& obj); inline bool operator==(const Terrain& l, const Terrain& r) { return l.name == r.name diff --git a/src/generated/lcf/rpg/trooppagecondition.h b/src/generated/lcf/rpg/trooppagecondition.h index 66b2e17eb..56a4ecbe6 100644 --- a/src/generated/lcf/rpg/trooppagecondition.h +++ b/src/generated/lcf/rpg/trooppagecondition.h @@ -26,7 +26,7 @@ namespace lcf { namespace rpg { class TroopPageCondition { public: - struct TroopPageCondition_Flags { + struct Flags { union { struct { bool switch_a; @@ -42,7 +42,7 @@ namespace rpg { }; std::array flags; }; - TroopPageCondition_Flags() noexcept: switch_a(false), switch_b(false), variable(false), turn(false), fatigue(false), enemy_hp(false), actor_hp(false), turn_enemy(false), turn_actor(false), command_actor(false) + Flags() noexcept: switch_a(false), switch_b(false), variable(false), turn(false), fatigue(false), enemy_hp(false), actor_hp(false), turn_enemy(false), turn_actor(false), command_actor(false) {} } flags; int32_t switch_a_id = 1; @@ -69,15 +69,15 @@ namespace rpg { int32_t command_id = 1; }; - inline bool operator==(const TroopPageCondition::TroopPageCondition_Flags& l, const TroopPageCondition::TroopPageCondition_Flags& r) { + inline bool operator==(const TroopPageCondition::Flags& l, const TroopPageCondition::Flags& r) { return l.flags == r.flags; } - inline bool operator!=(const TroopPageCondition::TroopPageCondition_Flags& l, const TroopPageCondition::TroopPageCondition_Flags& r) { + inline bool operator!=(const TroopPageCondition::Flags& l, const TroopPageCondition::Flags& r) { return !(l == r); } - std::ostream& operator<<(std::ostream& os, const TroopPageCondition::TroopPageCondition_Flags& obj); + std::ostream& operator<<(std::ostream& os, const TroopPageCondition::Flags& obj); inline bool operator==(const TroopPageCondition& l, const TroopPageCondition& r) { return l.flags == r.flags diff --git a/src/generated/ldb_terrain.cpp b/src/generated/ldb_terrain.cpp index 947e3fe38..c59752ee0 100644 --- a/src/generated/ldb_terrain.cpp +++ b/src/generated/ldb_terrain.cpp @@ -181,7 +181,7 @@ static TypedField static_background_b_scrollv_speed( 0, 1 ); -static TypedField static_special_flags( +static TypedField static_special_flags( &rpg::Terrain::special_flags, LDB_Reader::ChunkTerrain::special_flags, "special_flags", diff --git a/src/generated/ldb_terrain_special_flags.h b/src/generated/ldb_terrain_special_flags.h index ae71aea55..9f1801e30 100644 --- a/src/generated/ldb_terrain_special_flags.h +++ b/src/generated/ldb_terrain_special_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read Terrain. template <> -char const* const Flags::name = "Terrain_Terrain_Flags"; +char const* const Flags::name = "Terrain_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "back_party", "back_enemies", "lateral_party", @@ -32,7 +32,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 1, 1, 1, diff --git a/src/generated/ldb_trooppagecondition.cpp b/src/generated/ldb_trooppagecondition.cpp index 9ec5e7501..8bbeee8ab 100644 --- a/src/generated/ldb_trooppagecondition.cpp +++ b/src/generated/ldb_trooppagecondition.cpp @@ -20,7 +20,7 @@ namespace lcf { template <> char const* const Struct::name = "TroopPageCondition"; -static TypedField static_flags( +static TypedField static_flags( &rpg::TroopPageCondition::flags, LDB_Reader::ChunkTroopPageCondition::flags, "flags", diff --git a/src/generated/ldb_trooppagecondition_flags.h b/src/generated/ldb_trooppagecondition_flags.h index 9adbd134f..b57e71c94 100644 --- a/src/generated/ldb_trooppagecondition_flags.h +++ b/src/generated/ldb_trooppagecondition_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read TroopPageCondition. template <> -char const* const Flags::name = "TroopPageCondition_TroopPageCondition_Flags"; +char const* const Flags::name = "TroopPageCondition_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "switch_a", "switch_b", "variable", @@ -38,7 +38,7 @@ decltype(Flags::flag_names) F }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lmu_eventpagecondition.cpp b/src/generated/lmu_eventpagecondition.cpp index 2f69146a3..d64ee868e 100644 --- a/src/generated/lmu_eventpagecondition.cpp +++ b/src/generated/lmu_eventpagecondition.cpp @@ -20,7 +20,7 @@ namespace lcf { template <> char const* const Struct::name = "EventPageCondition"; -static TypedField static_flags( +static TypedField static_flags( &rpg::EventPageCondition::flags, LMU_Reader::ChunkEventPageCondition::flags, "flags", diff --git a/src/generated/lmu_eventpagecondition_flags.h b/src/generated/lmu_eventpagecondition_flags.h index 8354ddf3f..a54fa8e1b 100644 --- a/src/generated/lmu_eventpagecondition_flags.h +++ b/src/generated/lmu_eventpagecondition_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read EventPageCondition. template <> -char const* const Flags::name = "EventPageCondition_EventPageCondition_Flags"; +char const* const Flags::name = "EventPageCondition_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "switch_a", "switch_b", "variable", @@ -35,7 +35,7 @@ decltype(Flags::flag_names) F }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lsd_saveeasyrpgtext.cpp b/src/generated/lsd_saveeasyrpgtext.cpp index 26892b882..9a535083f 100644 --- a/src/generated/lsd_saveeasyrpgtext.cpp +++ b/src/generated/lsd_saveeasyrpgtext.cpp @@ -69,7 +69,7 @@ static TypedField static_line_spacing( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SaveEasyRpgText::flags, LSD_Reader::ChunkSaveEasyRpgText::flags, "flags", diff --git a/src/generated/lsd_saveeasyrpgtext_flags.h b/src/generated/lsd_saveeasyrpgtext_flags.h index 9c20be5ee..a75dc8bf7 100644 --- a/src/generated/lsd_saveeasyrpgtext_flags.h +++ b/src/generated/lsd_saveeasyrpgtext_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read SaveEasyRpgText. template <> -char const* const Flags::name = "SaveEasyRpgText_SaveEasyRpgText_Flags"; +char const* const Flags::name = "SaveEasyRpgText_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "draw_gradient", "draw_shadow", "bold", @@ -32,7 +32,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0, 0, diff --git a/src/generated/lsd_saveeasyrpgwindow.cpp b/src/generated/lsd_saveeasyrpgwindow.cpp index 6fc071d34..c2b79b9fe 100644 --- a/src/generated/lsd_saveeasyrpgwindow.cpp +++ b/src/generated/lsd_saveeasyrpgwindow.cpp @@ -55,7 +55,7 @@ static TypedField static_message_stretch( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SaveEasyRpgWindow::flags, LSD_Reader::ChunkSaveEasyRpgWindow::flags, "flags", diff --git a/src/generated/lsd_saveeasyrpgwindow_flags.h b/src/generated/lsd_saveeasyrpgwindow_flags.h index dfd4a2ac3..9dd7736c0 100644 --- a/src/generated/lsd_saveeasyrpgwindow_flags.h +++ b/src/generated/lsd_saveeasyrpgwindow_flags.h @@ -21,16 +21,16 @@ namespace lcf { // Read SaveEasyRpgWindow. template <> -char const* const Flags::name = "SaveEasyRpgWindow_SaveEasyRpgWindow_Flags"; +char const* const Flags::name = "SaveEasyRpgWindow_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "draw_frame", "border_margin" }; template <> -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 0, 0 }; diff --git a/src/generated/lsd_savepicture.cpp b/src/generated/lsd_savepicture.cpp index 900710776..caa8d12f6 100644 --- a/src/generated/lsd_savepicture.cpp +++ b/src/generated/lsd_savepicture.cpp @@ -188,7 +188,7 @@ static TypedField static_battle_layer( 0, 0 ); -static TypedField static_flags( +static TypedField static_flags( &rpg::SavePicture::flags, LSD_Reader::ChunkSavePicture::flags, "flags", diff --git a/src/generated/lsd_savepicture_flags.h b/src/generated/lsd_savepicture_flags.h index 3c26027ba..3e1346a78 100644 --- a/src/generated/lsd_savepicture_flags.h +++ b/src/generated/lsd_savepicture_flags.h @@ -21,10 +21,10 @@ namespace lcf { // Read SavePicture. template <> -char const* const Flags::name = "SavePicture_SavePicture_Flags"; +char const* const Flags::name = "SavePicture_Flags"; template <> -decltype(Flags::flag_names) Flags::flag_names = { +decltype(Flags::flag_names) Flags::flag_names = { "erase_on_map_change", "erase_on_battle_end", "unused_bit", @@ -35,7 +35,7 @@ decltype(Flags::flag_names) Flags -decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { +decltype(Flags::flags_is2k3) Flags::flags_is2k3 = { 1, 1, 1, diff --git a/src/generated/rpg_eventpagecondition.cpp b/src/generated/rpg_eventpagecondition.cpp index 2f582ab1b..bf3a2a32e 100644 --- a/src/generated/rpg_eventpagecondition.cpp +++ b/src/generated/rpg_eventpagecondition.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const EventPageCondition::EventPageCondition_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const EventPageCondition::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_saveeasyrpgtext.cpp b/src/generated/rpg_saveeasyrpgtext.cpp index e6f788d70..96e15bdfd 100644 --- a/src/generated/rpg_saveeasyrpgtext.cpp +++ b/src/generated/rpg_saveeasyrpgtext.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::SaveEasyRpgText_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SaveEasyRpgText::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_saveeasyrpgwindow.cpp b/src/generated/rpg_saveeasyrpgwindow.cpp index 673c663d1..0046325b4 100644 --- a/src/generated/rpg_saveeasyrpgwindow.cpp +++ b/src/generated/rpg_saveeasyrpgwindow.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::SaveEasyRpgWindow_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SaveEasyRpgWindow::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_savepicture.cpp b/src/generated/rpg_savepicture.cpp index b708ffbc5..afa98f985 100644 --- a/src/generated/rpg_savepicture.cpp +++ b/src/generated/rpg_savepicture.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const SavePicture::SavePicture_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const SavePicture::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_terrain.cpp b/src/generated/rpg_terrain.cpp index 7d703e77b..8675c1c40 100644 --- a/src/generated/rpg_terrain.cpp +++ b/src/generated/rpg_terrain.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const Terrain::Terrain_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const Terrain::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; } diff --git a/src/generated/rpg_trooppagecondition.cpp b/src/generated/rpg_trooppagecondition.cpp index 079a2e10a..ae8a218a8 100644 --- a/src/generated/rpg_trooppagecondition.cpp +++ b/src/generated/rpg_trooppagecondition.cpp @@ -15,7 +15,7 @@ namespace lcf { namespace rpg { -std::ostream& operator<<(std::ostream& os, const TroopPageCondition::TroopPageCondition_Flags& obj) { +std::ostream& operator<<(std::ostream& os, const TroopPageCondition::Flags& obj) { for (size_t i = 0; i < obj.flags.size(); ++i) { os << (i == 0 ? "[" : ", ") << obj.flags[i]; }