21 -> std::expected<ecs::Entity, Error>
23 auto e = _registry.spawn();
25 return std::unexpected{e.error()};
27 auto entity = e.value();
37 auto sprite = t.sprite;
41 std::string entityKey;
45 log::debug(
"EntityBuilder: Checking tag '{}' for entity '{}'", t.tag, t.id);
48 if (t.tag ==
"player_bullet") {
49 entityKey =
"player_shot_6";
50 log::info(
"EntityBuilder: Mapped player_bullet to player_shot_6");
51 }
else if (t.tag ==
"enemy_bullet") {
52 entityKey =
"enemy_shot_6";
53 log::info(
"EntityBuilder: Mapped enemy_bullet to enemy_shot_6");
54 }
else if (t.tag ==
"boomerang_bullet") {
56 log::info(
"EntityBuilder: Mapped boomerang_bullet to shot_1");
57 }
else if (t.tag ==
"player_ship") {
58 entityKey =
"player_ship";
59 log::info(
"EntityBuilder: Mapped player_ship to player_ship");
60 }
else if (sprite.texturePath.find(
"r-typesheet1.gif") != std::string::npos) {
61 if (sprite.rectLeft == 101 && sprite.rectTop == 3) {
62 entityKey =
"player_ship";
63 }
else if (sprite.rectLeft == 134 && sprite.rectTop == 18) {
64 entityKey =
"shot_insane";
65 }
else if (sprite.rectLeft == 2 && sprite.rectTop == 51) {
66 entityKey =
"effect_1";
67 }
else if (sprite.rectLeft == 215 && sprite.rectTop == 85) {
69 }
else if (sprite.rectLeft == 232 && sprite.rectTop == 103) {
71 }
else if (sprite.rectLeft == 200 && sprite.rectTop == 121) {
73 }
else if (sprite.rectLeft == 168 && sprite.rectTop == 137) {
75 }
else if (sprite.rectLeft == 104 && sprite.rectTop == 171) {
77 }
else if (sprite.rectLeft == 211 && sprite.rectTop == 276) {
78 entityKey =
"effect_2";
79 }
else if (sprite.rectLeft == 72 && sprite.rectTop == 296) {
80 entityKey =
"effect_3";
82 }
else if (sprite.texturePath.find(
"r-typesheet2.gif") != std::string::npos) {
83 if (sprite.rectLeft == 159 && sprite.rectTop == 35) {
84 entityKey =
"enemy_1";
85 }
else if (sprite.rectLeft == 300 && sprite.rectTop == 58) {
87 }
else if (sprite.rectLeft == 300 && sprite.rectTop == 71) {
88 entityKey =
"enemy_2";
89 }
else if (sprite.rectLeft == 266 && sprite.rectTop == 94) {
91 }
else if (sprite.rectLeft == 101 && sprite.rectTop == 118) {
92 entityKey =
"effect_4";
93 }
else if (sprite.rectLeft == 157 && sprite.rectTop == 316) {
94 entityKey =
"effect_5";
96 }
else if (sprite.texturePath.find(
"r-typesheet3.gif") != std::string::npos) {
98 if (sprite.rectLeft == 0 && sprite.rectTop == 0) {
99 entityKey =
"power_up_heal";
100 }
else if (sprite.rectLeft == 64 && sprite.rectTop == 0) {
101 entityKey =
"power_up_double";
102 }
else if (sprite.rectLeft == 128 && sprite.rectTop == 0) {
103 entityKey =
"power_up_shield";
105 }
else if (sprite.texturePath.find(
"r-typesheet39.gif") != std::string::npos) {
106 if (sprite.rectLeft == 33 && sprite.rectTop == 1) {
107 entityKey =
"boss_ship";
108 }
else if (sprite.rectLeft == 1 && sprite.rectTop == 72) {
109 entityKey =
"boss_shield";
113 if (!entityKey.empty()) {
114 log::info(
"EntityBuilder: entityKey='{}', hasCustomSprite={}",
115 entityKey, customizer.hasCustomSprite(entityKey));
118 bool hasActiveCustomization =
false;
119 if (!entityKey.empty() && customizer.hasCustomSprite(entityKey)) {
120 int left = sprite.rectLeft;
121 int top = sprite.rectTop;
122 sprite.texturePath = customizer.getSpriteInfo(
130 sprite.rectLeft = left;
131 sprite.rectTop = top;
132 hasActiveCustomization =
true;
138 if (t.withAnimation && !hasActiveCustomization) {
142 if (t.withParallax) {