Skip to content

Commit

Permalink
building: show preview for temple complex upgrade oracle
Browse files Browse the repository at this point in the history
  • Loading branch information
dalerank committed Feb 13, 2025
1 parent 86f8513 commit 773e3cf
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 14 deletions.
3 changes: 3 additions & 0 deletions src/building/building.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ building_wharf *building::dcast_wharf() { return dcast()->dcast_wharf(); }
building_warship_wharf *building::dcast_warship_wharf() { return dcast()->dcast_warship_wharf(); }
building_temple_complex *building::dcast_temple_complex() { return dcast()->dcast_temple_complex(); }
building_temple_complex_altar *building::dcast_temple_complex_altar() { return dcast()->dcast_temple_complex_altar(); }
building_temple_complex_oracle *building::dcast_temple_complex_oracle() { return dcast()->dcast_temple_complex_oracle(); }

building::building() {
}
Expand Down Expand Up @@ -1081,6 +1082,7 @@ void building_impl::static_params::load(archive arch) {
needs.rock = arch.r_bool("need_rock");
needs.ore = arch.r_bool("need_ore");
needs.altar = arch.r_bool("need_altar");
needs.oracle = arch.r_bool("need_oracle");

city_labor_set_category(type, labor_category);

Expand Down Expand Up @@ -1211,6 +1213,7 @@ bool building_impl::static_params::planer_is_need_flag(e_building_flags flag) co
case e_building_flag::Rock: return needs.rock;
case e_building_flag::Ore: return needs.ore;
case e_building_flag::TempleUpgradeAltar: return needs.altar;
case e_building_flag::TempleUpgradeOracle: return needs.oracle;
}

return false;
Expand Down
4 changes: 4 additions & 0 deletions src/building/building.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class building_shrine;
class building_transport_wharf;
class building_temple_complex;
class building_temple_complex_altar;
class building_temple_complex_oracle;
struct tooltip_context;
struct object_info;
struct painter;
Expand Down Expand Up @@ -493,6 +494,7 @@ class building {
building_warship_wharf *dcast_warship_wharf();
building_temple_complex *dcast_temple_complex();
building_temple_complex_altar *dcast_temple_complex_altar();
building_temple_complex_oracle *dcast_temple_complex_oracle();

bool spawn_noble(bool spawned);
void set_water_supply_graphic();
Expand Down Expand Up @@ -557,6 +559,7 @@ class building_impl {
bool rock;
bool ore;
bool altar;
bool oracle;
} needs;

void load(archive arch);
Expand Down Expand Up @@ -674,6 +677,7 @@ class building_impl {
virtual building_transport_wharf *dcast_transport_wharf() { return nullptr; }
virtual building_temple_complex *dcast_temple_complex() { return nullptr; }
virtual building_temple_complex_altar *dcast_temple_complex_altar() { return nullptr; }
virtual building_temple_complex_oracle *dcast_temple_complex_oracle() { return nullptr; }

inline building_impl *next() { return base.next()->dcast(); }
inline building_impl *main() { return base.main()->dcast(); }
Expand Down
31 changes: 26 additions & 5 deletions src/building/building_temple_complex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,21 @@ void building_temple_complex::static_params_t<T>::planer_setup_preview_graphics(
}
}

void building_temple_complex_altar::static_params::planer_ghost_preview(build_planner &planer, painter &ctx, tile2i tile, tile2i end, vec2i pixel) const {
template<typename T>
void building_temple_complex_upgrade::static_params_t<T>::planer_ghost_preview(build_planner &planer, painter &ctx, tile2i tile, tile2i end, vec2i pixel) const {
int city_orientation = city_view_orientation() / 2;
int orientation = (1 + building_rotation_global_rotation() + city_orientation) % 2;
int image_id = anim[animkeys().base].first_img() + orientation;
int image_id = this->anim[animkeys().base].first_img() + orientation;
auto complex = building_at_ex<building_temple_complex>(end);
if (complex) {
building *altar = complex->get_altar();
building *upgrade_base = nullptr;
if (this->TYPE == BUILDING_TEMPLE_COMPLEX_ALTAR) {
upgrade_base = complex->get_altar();
} else if (this->TYPE == BUILDING_TEMPLE_COMPLEX_ORACLE) {
upgrade_base = complex->get_oracle();
} else {
upgrade_base = &complex->main()->base;
}

tile2i offset = { 0, 0 };
int bsize = building_size - 1;
Expand All @@ -177,8 +185,8 @@ void building_temple_complex_altar::static_params::planer_ghost_preview(build_pl
case 3: offset = { bsize, bsize }; break;
}

vec2i pixel_altar = tile_to_pixel(altar->tile.shifted(offset));
planer.draw_building_ghost(ctx, image_id, pixel_altar);
vec2i pixel_upgrade = tile_to_pixel(upgrade_base->tile.shifted(offset));
planer.draw_building_ghost(ctx, image_id, pixel_upgrade);
}
}

Expand All @@ -188,6 +196,7 @@ building_temple_complex_ptah::static_params building_temple_complex_ptah_m;
building_temple_complex_seth::static_params building_temple_complex_seth_m;
building_temple_complex_bast::static_params building_temple_complex_bast_m;
building_temple_complex_altar::static_params building_temple_complex_altar_m;
building_temple_complex_oracle::static_params building_temple_complex_oracle_m;

void building_temple_complex::on_create(int orientation) {
data.monuments.variant = (10 - (2 * orientation)) % 8; // ugh!
Expand Down Expand Up @@ -249,6 +258,18 @@ building *building_temple_complex::get_altar() const {
return next;
}

building *building_temple_complex::get_oracle() const {
building *next = base.next();
while (next) {
if (next->type == BUILDING_TEMPLE_COMPLEX_ORACLE) {
break;
}
next = next->next();
}

return next;
}

void building_temple_complex::update_count() const {
const bool is_active = num_workers() > 0;
g_city.buildings.track_building(base, is_active);
Expand Down
27 changes: 23 additions & 4 deletions src/building/building_temple_complex.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,41 @@ class building_temple_complex : public building_impl {
void set_attachement(e_temple_compex_attachement a) { data.monuments.temple_complex_attachments |= a; }

building *get_altar() const;
building *get_oracle() const;

virtual e_sound_channel_city sound_channel() const override { return SOUND_CHANNEL_CITY_NONE; }
};

class building_temple_complex_altar : public building_impl {
class building_temple_complex_upgrade : public building_impl {
public:
BUILDING_METAINFO(BUILDING_TEMPLE_COMPLEX_ALTAR, building_temple_complex_altar)
building_temple_complex_altar(building &b) : building_impl(b) {}
building_temple_complex_upgrade(building &b) : building_impl(b) {}

struct static_params : public buildings::model_t<building_temple_complex_altar> {
template<typename T>
struct static_params_t : public buildings::model_t<T> {
virtual void planer_ghost_preview(build_planner &p, painter &ctx, tile2i tile, tile2i end, vec2i pixel) const override;
};
};

class building_temple_complex_altar : public building_temple_complex_upgrade {
public:
BUILDING_METAINFO(BUILDING_TEMPLE_COMPLEX_ALTAR, building_temple_complex_altar)
building_temple_complex_altar(building &b) : building_temple_complex_upgrade(b) {}

using static_params = static_params_t<building_temple_complex_altar>;

virtual building_temple_complex_altar *dcast_temple_complex_altar() override { return this; }
};

class building_temple_complex_oracle : public building_temple_complex_upgrade {
public:
BUILDING_METAINFO(BUILDING_TEMPLE_COMPLEX_ORACLE, building_temple_complex_oracle)
building_temple_complex_oracle(building &b) : building_temple_complex_upgrade(b) {}

using static_params = static_params_t<building_temple_complex_oracle>;

virtual building_temple_complex_oracle *dcast_temple_complex_oracle() override { return this; }
};

class building_temple_complex_osiris : public building_temple_complex {
public:
BUILDING_METAINFO(BUILDING_TEMPLE_COMPLEX_OSIRIS, building_temple_complex_osiris)
Expand Down
7 changes: 2 additions & 5 deletions src/building/construction/build_planner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,8 @@ void build_planner::setup_build(e_building_type type) { // select building for c
void build_planner::setup_build_flags() {
const auto &params = building_impl::params(build_type);

const e_building_flag flags[] = { e_building_flag::Meadow, e_building_flag::Rock, e_building_flag::Ore, e_building_flag::TempleUpgradeAltar };
const e_building_flag flags[] = { e_building_flag::Meadow, e_building_flag::Rock, e_building_flag::Ore, e_building_flag::TempleUpgradeAltar,
e_building_flag::TempleUpgradeOracle, };

for (const auto flag: flags) {
const bool is_need = params.planer_is_need_flag(flag);
Expand Down Expand Up @@ -565,10 +566,6 @@ void build_planner::setup_build_flags() {
case BUILDING_CLEAR_LAND:
set_flag(e_building_flag::IgnoreNearbyEnemy);
break;

case BUILDING_TEMPLE_COMPLEX_ORACLE:
set_flag(e_building_flag::TempleUpgradeOracle);
break;
}

if (building_is_draggable(build_type)) {
Expand Down
11 changes: 11 additions & 0 deletions src/scripts/buildings.js
Original file line number Diff line number Diff line change
Expand Up @@ -1956,6 +1956,17 @@ building building_temple_complex_altar = {
need_altar : true,
}

building building_temple_complex_oracle = {
animations : {
preview : { pack:PACK_TEMPLE_NILE, id:7, offset:2},
base : { pack:PACK_TEMPLE_NILE, id:7, offset:2},
},

building_size : 3,
labor_category : LABOR_CATEGORY_RELIGION,
need_oracle : true,
}

building building_temple_complex_altar_ra = {
animations : {
preview : { pack:PACK_GENERAL, id:42},
Expand Down

0 comments on commit 773e3cf

Please sign in to comment.