Skip to content

Commit

Permalink
Merge branch 'develop' into macos-develop
Browse files Browse the repository at this point in the history
  • Loading branch information
backwardsEric committed Aug 22, 2024
2 parents d777351 + 9bbd4aa commit 59912a2
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 43 deletions.
54 changes: 25 additions & 29 deletions src/market/melee-arena.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,24 @@
#include "view/display-messages.h"
#include "world/world.h"
#include <algorithm>
#include <sstream>
#include <string>

namespace {
void display_gladiators()
{
prt(_("モンスター 倍率", "Monsters Odds"), 4, 4);
const auto &melee_arena = MeleeArena::get_instance();
const auto names = melee_arena.build_gladiators_names();
for (auto i = 0; i < NUM_GLADIATORS; i++) {
constexpr auto fmt = _("%d) %-58s %4d.%02d倍", "%d) %-58s %4d.%02d");
const auto &gladiator = melee_arena.get_gladiator(i);
prt(format(fmt, i + 1, names[i].data(), gladiator.odds / 100, gladiator.odds % 100), 5 + i, 1);
}

prt(_("どれに賭けますか:", "Which monster: "), 0, 0);
}
}

/*!
* @brief モンスター闘技場のメインルーチン
Expand All @@ -46,47 +64,26 @@ bool melee_arena_comm(PlayerType *player_ptr)
}

clear_bldg(4, 10);

prt(_("モンスター 倍率", "Monsters Odds"), 4, 4);
const auto &melee_arena = MeleeArena::get_instance();
for (auto i = 0; i < NUM_GLADIATORS; i++) {
const auto &gladiator = melee_arena.get_gladiator(i);
const auto &monrace = monraces_info[gladiator.monrace_id]; //@ 後でシングルトンに差し替え.
std::string name;
if (monrace.kind_flags.has(MonsterKindType::UNIQUE)) {
name = _(monrace.name, "Fake ");
name.append(_("もどき", monrace.name));
} else {
name = monrace.name;
name.append(_(" ", ""));
}

constexpr auto fmt = _("%d) %-58s %4d.%02d倍", "%d) %-58s %4d.%02d");
prt(format(fmt, i + 1, name.data(), gladiator.odds / 100, gladiator.odds % 100), 5 + i, 1);
}

prt(_("どれに賭けますか:", "Which monster: "), 0, 0);
display_gladiators();
auto &melee_arena = MeleeArena::get_instance();
while (true) {
const auto i = inkey();
if (i == ESCAPE) {
screen_load();
return false;
}

if (i >= '1' && i <= '4') {
bet_number = i - '1';
battle_odds = melee_arena.get_gladiator(bet_number).odds;
if ((i >= '1') && (i <= '4')) {
melee_arena.set_bet_number(i - '1');
break;
}

else {
bell();
}
bell();
}

clear_bldg(4, 4);
for (auto i = 0; i < NUM_GLADIATORS; i++) {
if (i != bet_number) {
if (!melee_arena.matches_bet_number(i)) {
clear_bldg(i + 5, i + 5);
}
}
Expand All @@ -108,8 +105,7 @@ bool melee_arena_comm(PlayerType *player_ptr)
}

msg_print(nullptr);
battle_odds = std::max(*wager + 1, *wager * battle_odds / 100);
wager_melee = *wager;
melee_arena.set_wager(*wager);
player_ptr->au -= *wager;
reset_tim_flags(player_ptr);

Expand Down
2 changes: 1 addition & 1 deletion src/room/rooms-special.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ namespace {
void place_floor_glass(PlayerType *player_ptr, Grid &grid)
{
place_grid(player_ptr, &grid, GB_FLOOR);
grid.feat = feat_glass_wall;
grid.feat = feat_glass_floor;
}

void place_outer_glass(PlayerType *player_ptr, Grid &grid)
Expand Down
46 changes: 43 additions & 3 deletions src/system/building-type-definition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
#include <numeric>

std::array<building_type, MAX_BUILDINGS> buildings;
int battle_odds;
int wager_melee;
int bet_number;

MeleeGladiator::MeleeGladiator(MonsterRaceId monrace_id, uint32_t odds)
: monrace_id(monrace_id)
Expand All @@ -31,6 +28,31 @@ MeleeArena &MeleeArena::get_instance()
return instance;
}

bool MeleeArena::matches_bet_number(int value) const
{
return this->bet_number == value;
}

void MeleeArena::set_bet_number(int value)
{
this->bet_number = value;
}

void MeleeArena::set_wager(int value)
{
this->wager = value;
}

int MeleeArena::get_payback(bool is_draw) const
{
if (is_draw) {
return this->wager;
}

const int odds = this->get_gladiator(this->bet_number).odds;
return std::max(this->wager + 1, this->wager * odds / 100);
}

MeleeGladiator &MeleeArena::get_gladiator(int n)
{
return this->gladiators.at(n);
Expand All @@ -51,6 +73,24 @@ const std::array<MeleeGladiator, NUM_GLADIATORS> &MeleeArena::get_gladiators() c
return this->gladiators;
}

std::vector<std::string> MeleeArena::build_gladiators_names() const
{
std::vector<std::string> names;
for (const auto &gladiator : this->gladiators) {
const auto &monrace = gladiator.get_monrace();
std::stringstream ss;
if (monrace.kind_flags.has(MonsterKindType::UNIQUE)) {
ss << _(monrace.name, "Fake ") << _("もどき", monrace.name);
} else {
ss << monrace.name << _(" ", "");
}

names.push_back(ss.str());
}

return names;
}

/*!
* @brief モンスター闘技場に参加するモンスターを更新する。
* @param player_ptr プレイヤーへの参照ポインタ
Expand Down
12 changes: 8 additions & 4 deletions src/system/building-type-definition.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <array>
#include <cstdint>
#include <string>
#include <vector>

struct building_type {
Expand Down Expand Up @@ -36,10 +37,6 @@ class MeleeGladiator {
const MonsterRaceInfo &get_monrace() const;
};

extern int battle_odds;
extern int wager_melee;
extern int bet_number;

//!< モンスター闘技場定義.
constexpr auto NUM_GLADIATORS = 4;
class PlayerType; //!< @todo 暫定、後で消す.
Expand All @@ -52,16 +49,23 @@ class MeleeArena {
MeleeArena &operator=(MeleeArena &&) = delete;
static MeleeArena &get_instance();

bool matches_bet_number(int value) const;
void set_bet_number(int value);
void set_wager(int value);
int get_payback(bool is_draw = false) const;
MeleeGladiator &get_gladiator(int n);
const MeleeGladiator &get_gladiator(int n) const;
void set_gladiator(int n, const MeleeGladiator &gladiator);
const std::array<MeleeGladiator, NUM_GLADIATORS> &get_gladiators() const; //!< @detail セーブデータへの書き込みにしか使わないこと.
std::vector<std::string> build_gladiators_names() const; //!< @detail 要素数は常にNUM_GLADIATORSと同じ.
void update_gladiators(PlayerType *player_ptr);

private:
MeleeArena() = default;
static MeleeArena instance;

int bet_number = 0;
int wager = 0;
std::array<MeleeGladiator, NUM_GLADIATORS> gladiators{};

int decide_max_level() const;
Expand Down
13 changes: 7 additions & 6 deletions src/world/world-turn-processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,18 +178,19 @@ void WorldTurnProcessor::process_monster_arena_winner(int win_m_idx)
msg_format(_("%sが勝利した!", "%s won!"), m_name.data());
msg_print(nullptr);

if (win_m_idx == (bet_number + 1)) {
auto &melee_arena = MeleeArena::get_instance();
if (melee_arena.matches_bet_number(win_m_idx - 1)) {
msg_print(_("おめでとうございます。", "Congratulations."));
msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
this->player_ptr->au += battle_odds;
const auto payback = melee_arena.get_payback();
msg_format(_("%d$を受け取った。", "You received %d gold."), payback);
this->player_ptr->au += payback;
} else {
msg_print(_("残念でした。", "You lost gold."));
}

msg_print(nullptr);
this->player_ptr->energy_need = 0;
auto &melee_arena = MeleeArena::get_instance();
melee_arena.update_gladiators(player_ptr);
melee_arena.update_gladiators(this->player_ptr);
}

void WorldTurnProcessor::process_monster_arena_draw()
Expand All @@ -200,7 +201,7 @@ void WorldTurnProcessor::process_monster_arena_draw()
}

msg_print(_("申し訳ありませんが、この勝負は引き分けとさせていただきます。", "Sorry, but this battle ended in a draw."));
this->player_ptr->au += wager_melee;
this->player_ptr->au += MeleeArena::get_instance().get_payback(true);
msg_print(nullptr);
this->player_ptr->energy_need = 0;
auto &melee_arena = MeleeArena::get_instance();
Expand Down

0 comments on commit 59912a2

Please sign in to comment.