Skip to content

Commit 78da7f8

Browse files
committed
planer: building preview moved to mastaba class from planer logic
1 parent 170d276 commit 78da7f8

File tree

3 files changed

+76
-104
lines changed

3 files changed

+76
-104
lines changed

src/building/construction/build_planner.cpp

-8
Original file line numberDiff line numberDiff line change
@@ -1630,14 +1630,6 @@ void build_planner::draw_graphics(painter &ctx) {
16301630
draw_entertainment_venue(end, pixel, build_type, ctx);
16311631
return;
16321632

1633-
case BUILDING_SMALL_MASTABA:
1634-
building_small_mastaba::ghost_preview(ctx, build_type, pixel, start, end);
1635-
return;
1636-
1637-
case BUILDING_MEDIUM_MASTABA:
1638-
building_medium_mastaba::ghost_preview(ctx, build_type, pixel, start, end);
1639-
return;
1640-
16411633
case BUILDING_FORT_ARCHERS:
16421634
case BUILDING_FORT_CHARIOTEERS:
16431635
case BUILDING_FORT_INFANTRY:

src/building/monument_mastaba.cpp

+63-85
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,63 @@ struct mastaba_part {
5555
building *b;
5656
};
5757

58+
template<typename T>
59+
void building_mastaba::static_params_t<T>::planer_setup_preview_graphics(build_planner &planer) const {
60+
switch (city_view_orientation() / 2) {
61+
case 0: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
62+
case 1: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
63+
case 2: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
64+
case 3: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
65+
}
66+
}
67+
68+
template<class T>
69+
void building_mastaba::static_params_t<T>::planer_ghost_preview(build_planner &planer, painter &ctx, tile2i start, tile2i end, vec2i pixel) const {
70+
int image_id = anim[animkeys().base].first_img();
71+
auto get_image = [image_id] (tile2i tile, tile2i start, vec2i size) {
72+
if (tile == start) {
73+
return image_id;
74+
}
75+
76+
if (tile == start.shifted(size.x - 1, 0)) {
77+
return image_id - 2;
78+
}
79+
80+
if (tile == start.shifted(size.x - 1, size.y - 1)) {
81+
return image_id - 4;
82+
}
83+
84+
if (tile == start.shifted(0, size.y - 1)) {
85+
return image_id - 6;
86+
}
87+
88+
if (tile.y() == start.y()) { return image_id - 1; }
89+
if (tile.y() == start.y() + size.y - 1) { return image_id - 5; }
90+
if (tile.x() == start.x()) { return image_id - 7; }
91+
if (tile.x() == start.x() + size.x - 1) { return image_id - 3; }
92+
93+
return (image_id + 5 + (tile.x() + tile.y()) % 7);
94+
};
95+
96+
vec2i size{ 1, 1 };
97+
vec2i size_b = init_tiles_size();
98+
switch (city_view_orientation() / 2) {
99+
case 0: size = { size_b.x, size_b.y }; break;
100+
case 1: size = { size_b.y, size_b.x }; break;
101+
case 2: size = { size_b.x, size_b.y }; break;
102+
case 3: size = { size_b.y, size_b.x }; break;
103+
}
104+
105+
for (int i = 0; i < size.x; ++i) {
106+
for (int j = 0; j < size.y; ++j) {
107+
vec2i p = pixel + (vec2i(-30, 15) * i) + (vec2i(30, 15) * j);
108+
int image_id = get_image(end.shifted(i, j), end, size);
109+
ImageDraw::isometric_from_drawtile(ctx, image_id, p, COLOR_MASK_GREEN);
110+
ImageDraw::isometric_from_drawtile_top(ctx, image_id, p, COLOR_MASK_GREEN, 1.f);
111+
}
112+
}
113+
}
114+
58115
void map_mastaba_tiles_add(int building_id, tile2i tile, int size, int image_id, int terrain) {
59116
int x_leftmost, y_leftmost;
60117
switch (city_view_orientation()) {
@@ -147,28 +204,11 @@ void building_small_mastaba::update_day() {
147204
return;
148205
}
149206

150-
building_mastaba::update_day(init_tiles_size());
207+
building_mastaba::update_day(current_params().init_tiles_size());
151208
}
152209

153210
bool building_small_mastaba::draw_ornaments_and_animations_flat(painter &ctx, vec2i point, tile2i tile, color mask) {
154-
return draw_ornaments_and_animations_flat_impl(base, ctx, point, tile, mask, init_tiles_size());
155-
}
156-
157-
void building_small_mastaba::ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end) {
158-
building_mastaba::ghost_preview(ctx, type, pixel, start, end, init_tiles_size());
159-
}
160-
161-
vec2i building_small_mastaba::init_tiles_size() {
162-
return vec2i(10, 4);
163-
}
164-
165-
void building_small_mastaba::static_params::planer_setup_preview_graphics(build_planner &planer) const {
166-
switch (city_view_orientation() / 2) {
167-
case 0: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
168-
case 1: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
169-
case 2: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
170-
case 3: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
171-
}
211+
return draw_ornaments_and_animations_flat_impl(base, ctx, point, tile, mask, current_params().init_tiles_size());
172212
}
173213

174214
int building_mastaba::get_image(int orientation, tile2i tile, tile2i start, tile2i end) {
@@ -237,51 +277,6 @@ int building_small_mastabe_get_bricks_image(int orientation, e_building_type typ
237277
void building_mastaba::on_create(int orientation) {
238278
}
239279

240-
void building_mastaba::ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end, const vec2i size_b) {
241-
int image_id = small_mastaba_m.anim[animkeys().base].first_img();
242-
auto get_image = [image_id] (tile2i tile, tile2i start, vec2i size) {
243-
if (tile == start) {
244-
return image_id;
245-
}
246-
247-
if (tile == start.shifted(size.x - 1, 0)) {
248-
return image_id - 2;
249-
}
250-
251-
if (tile == start.shifted(size.x - 1, size.y - 1)) {
252-
return image_id - 4;
253-
}
254-
255-
if (tile == start.shifted(0, size.y - 1)) {
256-
return image_id - 6;
257-
}
258-
259-
if (tile.y() == start.y()) { return image_id - 1; }
260-
if (tile.y() == start.y() + size.y - 1) { return image_id - 5; }
261-
if (tile.x() == start.x()) { return image_id - 7; }
262-
if (tile.x() == start.x() + size.x - 1) { return image_id - 3; }
263-
264-
return (image_id + 5 + (tile.x() + tile.y()) % 7);
265-
};
266-
267-
vec2i size{ 1, 1 };
268-
switch (city_view_orientation() / 2) {
269-
case 0: size = { size_b.x, size_b.y }; break;
270-
case 1: size = { size_b.y, size_b.x }; break;
271-
case 2: size = { size_b.x, size_b.y }; break;
272-
case 3: size = { size_b.y, size_b.x }; break;
273-
}
274-
275-
for (int i = 0; i < size.x; ++i) {
276-
for (int j = 0; j < size.y; ++j) {
277-
vec2i p = pixel + (vec2i(-30, 15) * i) + (vec2i(30, 15) * j);
278-
int image_id = get_image(end.shifted(i, j), end, size);
279-
ImageDraw::isometric_from_drawtile(ctx, image_id, p, COLOR_MASK_GREEN);
280-
ImageDraw::isometric_from_drawtile_top(ctx, image_id, p, COLOR_MASK_GREEN, 1.f);
281-
}
282-
}
283-
}
284-
285280
bool building_mastaba::draw_ornaments_and_animations_flat_impl(building &base, painter &ctx, vec2i point, tile2i tile, color color_mask, const vec2i tiles_size) {
286281
if (building_monument_is_finished(&base)) {
287282
return false;
@@ -630,7 +625,7 @@ bool building_small_mastaba::draw_ornaments_and_animations_height(painter &ctx,
630625
return false;
631626
}
632627

633-
return draw_ornaments_and_animations_hight_impl(base, ctx, point, tile, color_mask, init_tiles_size());
628+
return draw_ornaments_and_animations_hight_impl(base, ctx, point, tile, color_mask, current_params().init_tiles_size());
634629
}
635630

636631
void game_cheat_finish_phase(std::istream &, std::ostream &) {
@@ -655,16 +650,8 @@ void game_cheat_finish_phase(std::istream &, std::ostream &) {
655650
});
656651
}
657652

658-
void building_medium_mastaba::ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end) {
659-
building_mastaba::ghost_preview(ctx, type, pixel, start, end, vec2i{ 14, 6 });
660-
}
661-
662-
vec2i building_medium_mastaba::init_tiles_size() {
663-
return vec2i(14, 6);
664-
}
665-
666653
bool building_medium_mastaba::draw_ornaments_and_animations_flat(painter &ctx, vec2i point, tile2i tile, color mask) {
667-
return draw_ornaments_and_animations_flat_impl(base, ctx, point, tile, mask, init_tiles_size());
654+
return draw_ornaments_and_animations_flat_impl(base, ctx, point, tile, mask, current_params().init_tiles_size());
668655
}
669656

670657
bool building_medium_mastaba::draw_ornaments_and_animations_height(painter &ctx, vec2i point, tile2i tile, color color_mask) {
@@ -676,7 +663,7 @@ bool building_medium_mastaba::draw_ornaments_and_animations_height(painter &ctx,
676663
return false;
677664
}
678665

679-
return draw_ornaments_and_animations_hight_impl(base, ctx, point, tile, color_mask, init_tiles_size());
666+
return draw_ornaments_and_animations_hight_impl(base, ctx, point, tile, color_mask, current_params().init_tiles_size());
680667
}
681668

682669
void building_medium_mastaba::on_place(int orientation, int variant) {
@@ -767,14 +754,5 @@ void building_medium_mastaba::update_day() {
767754
return;
768755
}
769756

770-
building_mastaba::update_day(init_tiles_size());
771-
}
772-
773-
void building_medium_mastaba::static_params::planer_setup_preview_graphics(build_planner &planer) const {
774-
switch (city_view_orientation() / 2) {
775-
case 0: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
776-
case 1: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
777-
case 2: planer.init_tiles(init_tiles_size().y, init_tiles_size().x); break;
778-
case 3: planer.init_tiles(init_tiles_size().x, init_tiles_size().y); break;
779-
}
757+
building_mastaba::update_day(current_params().init_tiles_size());
780758
}

src/building/monument_mastaba.h

+13-11
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,20 @@ class building_mastaba : public building_impl {
2020
virtual void update_month() override;
2121
virtual void update_map_orientation(int map_orientation) override;
2222
virtual bool force_draw_flat_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) override;
23+
24+
template<typename T>
25+
struct static_params_t : public buildings::model_t<T> {
26+
virtual void planer_ghost_preview(build_planner &planer, painter &ctx, tile2i tile, tile2i end, vec2i pixel) const override;
27+
virtual void planer_setup_preview_graphics(build_planner &planer) const override;
28+
virtual vec2i init_tiles_size() const { return vec2i(0, 0); }
29+
};
2330

2431
bool draw_ornaments_and_animations_flat_impl(building &base, painter &ctx, vec2i point, tile2i tile, color mask, const vec2i tiles_size);
2532
bool draw_ornaments_and_animations_hight_impl(building &base, painter &ctx, vec2i point, tile2i tile, color mask, const vec2i tiles_size);
2633

2734
void update_day(const vec2i tiles_size);
2835
custom_span<uint16_t> active_workers();
2936

30-
static void ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end, const vec2i size);
3137
static void update_images(building *b, int curr_phase, const vec2i size_b);
3238
static void finalize(building *b, const vec2i size_b);
3339
static int get_image(int orientation, tile2i tile, tile2i start, tile2i end);
@@ -36,22 +42,19 @@ class building_mastaba : public building_impl {
3642
class building_small_mastaba : public building_mastaba {
3743
public:
3844
BUILDING_METAINFO(BUILDING_SMALL_MASTABA, building_small_mastaba)
39-
4045
building_small_mastaba(building & b) : building_mastaba(b) {}
41-
4246
virtual building_small_mastaba *dcast_small_mastaba() override { return this; }
4347

44-
struct static_params : public buildings::model_t<building_small_mastaba> {
45-
virtual void planer_setup_preview_graphics(build_planner &planer) const override;
48+
struct static_params : public static_params_t<building_small_mastaba> {
49+
virtual vec2i init_tiles_size() const { return vec2i(10, 4); }
4650
};
4751

4852
virtual void on_place(int orientation, int variant) override;
4953
virtual void update_day() override;
5054
virtual bool draw_ornaments_and_animations_flat(painter &ctx, vec2i point, tile2i tile, color mask) override;
5155
virtual bool draw_ornaments_and_animations_height(painter &ctx, vec2i point, tile2i tile, color mask) override;
5256

53-
static void ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end);
54-
static vec2i init_tiles_size();
57+
static const static_params &current_params() { return (const static_params &)params(TYPE); }
5558
};
5659

5760
class building_small_mastaba_part_side : public building_small_mastaba {
@@ -79,17 +82,16 @@ class building_medium_mastaba : public building_mastaba {
7982

8083
virtual building_medium_mastaba *dcast_medium_mastaba() override { return nullptr; }
8184

82-
struct static_params : public buildings::model_t<building_medium_mastaba> {
83-
virtual void planer_setup_preview_graphics(build_planner &planer) const override;
85+
struct static_params : public static_params_t<building_medium_mastaba> {
86+
virtual vec2i init_tiles_size() const { return vec2i(14, 6); }
8487
};
8588

8689
virtual void on_place(int orientation, int variant) override;
8790
virtual void update_day() override;
8891
virtual bool draw_ornaments_and_animations_flat(painter &ctx, vec2i point, tile2i tile, color mask) override;
8992
virtual bool draw_ornaments_and_animations_height(painter &ctx, vec2i point, tile2i tile, color mask) override;
9093

91-
static void ghost_preview(painter &ctx, e_building_type type, vec2i pixel, tile2i start, tile2i end);
92-
static vec2i init_tiles_size();
94+
static const static_params &current_params() { return (const static_params &)params(TYPE); }
9395
};
9496

9597
class building_medium_mastaba_part_side : public building_medium_mastaba {

0 commit comments

Comments
 (0)