Skip to content

Commit 62df5b4

Browse files
committed
buildings: draw top tile for ferry
render error happens, because top height was less than threshold
1 parent 1b1b72c commit 62df5b4

7 files changed

+69
-37
lines changed

src/building/building.h

+1
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ class building_impl {
508508
virtual bool draw_ornaments_and_animations_flat(painter &ctx, vec2i point, tile2i tile, color mask) { return false; }
509509
virtual bool force_draw_flat_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) { return false; }
510510
virtual bool force_draw_height_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) { return false; }
511+
virtual bool force_draw_top_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) { return false; }
511512
virtual e_overlay get_overlay() const { return OVERLAY_NONE; }
512513
virtual bool need_road_access() const { return true; }
513514
virtual bool can_play_animation() const;

src/building/building_barracks.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,6 @@ void info_window_recruiter::window_info_background(object_info &c) {
260260
});
261261
}
262262

263-
inline bool info_window_recruiter::check(object_info &c) {
263+
bool info_window_recruiter::check(object_info &c) {
264264
return c.building_get()->dcast_recruiter();
265265
}

src/building/building_ferry.cpp

+52-26
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,83 @@
22

33
#include "city/labor.h"
44
#include "grid/water.h"
5+
#include "grid/image.h"
56
#include "grid/building.h"
67
#include "grid/building_tiles.h"
78
#include "grid/routing/routing.h"
89
#include "graphics/elements/ui.h"
910

1011
#include "io/gamefiles/lang.h"
1112

12-
#include "js/js_game.h"
13-
1413
buildings::model_t<building_ferry> ferry_m;
15-
16-
ANK_REGISTER_CONFIG_ITERATOR(config_load_building_ferry);
17-
void config_load_building_ferry() {
18-
ferry_m.load();
19-
}
14+
info_window_ferry ferry_infow;
2015

2116
void building_ferry::on_create(int orientation) {
2217
data.industry.orientation = orientation;
2318
}
2419

2520
void building_ferry::on_place_update_tiles(int orientation, int variant) {
26-
int img_id = ferry_m.anim["base"].first_img() + orientation;
27-
map_water_add_building(id(), tile(), ferry_m.building_size, img_id);
28-
map_building_tiles_add(id(), tile(), ferry_m.building_size, img_id, TERRAIN_BUILDING|TERRAIN_ROAD|TERRAIN_FERRY_ROUTE);
21+
int img_id = ferry_m.anim[animkeys().base].first_img() + orientation;
22+
map_water_add_building(id(), tile(), size(), img_id);
23+
map_building_tiles_add(id(), tile(), size(), img_id, TERRAIN_BUILDING|TERRAIN_ROAD|TERRAIN_FERRY_ROUTE);
2924
}
3025

31-
void building_ferry::window_info_background(object_info &c) {
32-
c.help_id = 85;
33-
window_building_play_sound(&c, "Wavs/gatehouse.wav");
34-
outer_panel_draw(c.offset, c.bgsize.x, c.bgsize.y);
35-
lang_text_draw_centered(e_text_ferry_landing, 0, c.offset.x, c.offset.y + 10, 16 * c.bgsize.x, FONT_LARGE_BLACK_ON_LIGHT);
36-
building *ferry = building_get(c.building_id);
37-
if (!map_routing_ferry_has_routes(ferry)) {
38-
window_building_draw_description_at(c, 16 * c.bgsize.y - 158, e_text_ferry_landing, e_text_ferry_landing_no_routes);
39-
} else if (!ferry->has_road_access) {
40-
window_building_draw_description_at(c, 16 * c.bgsize.y - 158, e_text_ferry_landing, e_text_ferry_landing_no_roads);
41-
} else if (ferry->num_workers <= 0) {
42-
window_building_draw_description_at(c, 16 * c.bgsize.y - 158, e_text_ferry_landing, e_text_ferry_landing_no_workers);
26+
void building_ferry::update_map_orientation(int orientation) {
27+
int image_offset = city_view_relative_orientation(data.industry.orientation);
28+
int image_id = ferry_m.anim[animkeys().base].first_img() + image_offset;
29+
map_water_add_building(id(), tile(), size(), image_id);
30+
}
31+
32+
bool building_ferry::force_draw_height_tile(painter &ctx, tile2i t, vec2i pixel, color mask) {
33+
if (this->main()->tile() == t) {
34+
int image_id = map_image_at(t);
35+
ImageDraw::isometric_from_drawtile_top(ctx, image_id, pixel + vec2i{-30, 15}, mask);
36+
37+
return true;
4338
}
39+
40+
return false;
4441
}
4542

46-
void building_ferry::update_map_orientation(int orientation) {
47-
int image_offset = city_view_relative_orientation(data.industry.orientation);
48-
int image_id = ferry_m.anim["base"].first_img() + image_offset;
49-
map_water_add_building(id(), tile(), ferry_m.building_size, image_id);
43+
bool building_ferry::force_draw_top_tile(painter &ctx, tile2i t, vec2i pixel, color mask) {
44+
if (this->main()->tile() == t) {
45+
return true;
46+
}
47+
48+
return false;
5049
}
5150

51+
5252
void building_ferry::highlight_waypoints() {
5353
building_impl::highlight_waypoints();
5454

5555
ferry_tiles fpoints = map_water_docking_points(base);
5656
map_highlight_set(fpoints.point_a, 3);
5757
map_highlight_set(fpoints.point_b, 3);
5858
}
59+
60+
61+
bool info_window_ferry::check(object_info &c) {
62+
return c.building_get()->dcast_ferry();
63+
}
64+
65+
void info_window_ferry::init(object_info &c) {
66+
building_info_window::init(c);
67+
68+
building *ferry = c.building_get();
69+
70+
textid reason{ 0, 0 };
71+
if (!map_routing_ferry_has_routes(ferry)) {
72+
reason = { c.group_id, 1 };
73+
} else if (!ferry->has_road_access) {
74+
reason = { c.group_id, 2 };
75+
} else if (ferry->num_workers <= 0) {
76+
reason = { c.group_id, 3 };
77+
}
78+
79+
fill_employment_details(c);
80+
81+
if (reason.id) {
82+
ui["warning_text"] = reason;
83+
}
84+
}

src/building/building_ferry.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "building/building.h"
4+
#include "window/window_building_info.h"
45

56
class building_ferry : public building_impl {
67
public:
@@ -11,7 +12,13 @@ class building_ferry : public building_impl {
1112

1213
virtual void on_create(int orientation) override;
1314
virtual void on_place_update_tiles(int orientation, int variant) override;
14-
virtual void window_info_background(object_info &c) override;
1515
virtual void update_map_orientation(int orientation) override;
16+
virtual bool force_draw_height_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) override;
17+
virtual bool force_draw_top_tile(painter &ctx, tile2i tile, vec2i pixel, color mask) override;
1618
virtual void highlight_waypoints() override;
19+
};
20+
21+
struct info_window_ferry : public building_info_window_t<info_window_ferry> {
22+
virtual void init(object_info &c) override;
23+
virtual bool check(object_info &c) override;
1724
};

src/scripts/common.js

+1
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ var sidebar_window_extra = {}
223223
var info_window_booth = {}
224224
var dock_info_window = {}
225225
var dock_orders_window = {}
226+
var info_window_ferry = {}
226227

227228
//figures
228229
var figure_fireman = {}

src/widget/city/tile_draw.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,13 @@ void draw_isometric_flat(vec2i pixel, tile2i tile, painter &ctx) {
206206
if (deletion_tool || map_property_is_deleted(tile)) {
207207
color_mask = COLOR_MASK_RED;
208208
}
209-
209+
210+
bool force_tile_draw = false;
210211
if (!map_property_is_draw_tile(grid_offset)) {
211212
bool force_tile_draw = false;
212213
if (building_id > 0) {
213-
building *b = building_get(building_id);
214-
force_tile_draw = b->dcast()->force_draw_flat_tile(ctx, tile, pixel, color_mask);
214+
building_impl *b = building_get(building_id)->dcast();
215+
force_tile_draw = b->force_draw_flat_tile(ctx, tile, pixel, color_mask);
215216
}
216217

217218
if (!force_tile_draw) {
@@ -266,7 +267,7 @@ void draw_isometric_flat(vec2i pixel, tile2i tile, painter &ctx) {
266267
}
267268

268269
int top_height = img->isometric_top_height();
269-
map_render_set(grid_offset, top_height > 0 ? RENDER_TALL_TILE : 0);
270+
map_render_set(grid_offset, (top_height > 0) ? RENDER_TALL_TILE : 0);
270271
}
271272

272273
void draw_isometric_terrain_height(vec2i pixel, tile2i tile, painter &ctx) {
@@ -334,6 +335,7 @@ void draw_isometric_nonterrain_height(vec2i pixel, tile2i tile, painter &ctx) {
334335
bool force_draw_tile = false;
335336
if (building_id > 0) {
336337
force_draw_tile = b->dcast()->force_draw_height_tile(ctx, tile, pixel, color_mask);
338+
b->dcast()->force_draw_top_tile(ctx, tile, pixel, color_mask);
337339
}
338340

339341
if (!force_draw_tile) {

src/window/window_festival_square_info.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ struct festival_square_info_window : building_info_window {
1717

1818
festival_square_info_window festival_square_infow;
1919

20-
ANK_REGISTER_CONFIG_ITERATOR(config_load_festival_square_info_window);
21-
void config_load_festival_square_info_window() {
22-
festival_square_infow.load("festival_square_info_window");
23-
}
24-
2520
void festival_square_info_window::window_info_background(object_info &c) {
2621
building_info_window::window_info_background(c);
2722

0 commit comments

Comments
 (0)