*/
COMMAND_CODE show_floor_items(PlayerType *player_ptr, int target_item, POSITION y, POSITION x, TERM_LEN *min_width, const ItemTester &item_tester)
{
- TermOffsetSetter tos(0, std::nullopt);
-
COMMAND_CODE i, m;
int j, k, l;
ItemEntity *o_ptr;
*/
void make_character_dump(PlayerType *player_ptr, FILE *fff)
{
- TermOffsetSetter tos(0, 0);
+ TermCenteredOffsetSetter tos(std::nullopt, std::nullopt);
fprintf(fff, _(" [%s キャラクタ情報]\n\n", " [%s Character Dump]\n\n"), get_version().data());
* @param height 表示に使用する領域の縦幅
*/
TermCenteredOffsetSetter::TermCenteredOffsetSetter(std::optional<TERM_LEN> width, std::optional<TERM_LEN> height)
+ : term(game_term)
+ , orig_centered_wid(game_term != nullptr ? game_term->centered_wid : std::nullopt)
+ , orig_centered_hgt(game_term != nullptr ? game_term->centered_hgt : std::nullopt)
{
- TERM_LEN term_width, term_height;
- term_get_size(&term_width, &term_height);
-
- const auto offset_x = width.has_value() ? (term_width - width.value()) / 2 : 0;
- const auto offset_y = height.has_value() ? (term_height - height.value()) / 2 : 0;
+ const auto offset_x = width.has_value() ? (game_term->wid - width.value()) / 2 : 0;
+ const auto offset_y = height.has_value() ? (game_term->hgt - height.value()) / 2 : 0;
this->tos.emplace(offset_x, offset_y);
+
+ game_term->centered_wid = (width < game_term->wid) ? width : std::nullopt;
+ game_term->centered_hgt = (height < game_term->hgt) ? height : std::nullopt;
+}
+
+TermCenteredOffsetSetter::~TermCenteredOffsetSetter()
+{
+ if (this->term == nullptr) {
+ return;
+ }
+
+ this->term->centered_wid = this->orig_centered_wid;
+ this->term->centered_hgt = this->orig_centered_hgt;
}
/*
*/
errr term_get_size(TERM_LEN *w, TERM_LEN *h)
{
- /* Access the cursor */
- (*w) = game_term->wid;
- (*h) = game_term->hgt;
+ (*w) = game_term->centered_wid.value_or(game_term->wid);
+ (*h) = game_term->centered_hgt.value_or(game_term->hgt);
return 0;
}
TERM_LEN wid{}; //!< Window Width(max 255)
TERM_LEN hgt{}; //!< Window Height(max 255)
+ std::optional<TERM_LEN> centered_wid{};
+ std::optional<TERM_LEN> centered_hgt{};
+
TERM_LEN offset_x{};
TERM_LEN offset_y{};
class TermCenteredOffsetSetter {
public:
TermCenteredOffsetSetter(std::optional<TERM_LEN> width, std::optional<TERM_LEN> height);
- ~TermCenteredOffsetSetter() = default;
+ ~TermCenteredOffsetSetter();
TermCenteredOffsetSetter(const TermCenteredOffsetSetter &) = delete;
TermCenteredOffsetSetter &operator=(const TermCenteredOffsetSetter &) = delete;
TermCenteredOffsetSetter(TermCenteredOffsetSetter &&) = delete;
private:
std::optional<TermOffsetSetter> tos;
+ term_type *term;
+ std::optional<TERM_LEN> orig_centered_wid;
+ std::optional<TERM_LEN> orig_centered_hgt;
};
/**** Available Constants ****/
*/
COMMAND_CODE show_inventory(PlayerType *player_ptr, int target_item, BIT_FLAGS mode, const ItemTester &item_tester)
{
- TermOffsetSetter tos(0, std::nullopt);
-
COMMAND_CODE i;
int k, l, z = 0;
ItemEntity *o_ptr;
*/
COMMAND_CODE show_equipment(PlayerType *player_ptr, int target_item, BIT_FLAGS mode, const ItemTester &item_tester)
{
- TermOffsetSetter tos(0, std::nullopt);
-
COMMAND_CODE i;
int j, k, l;
ItemEntity *o_ptr;