OSDN Git Service

Merge pull request #2692 from Hourier/Move-Object-Kind-to-System
[hengbandforosx/hengbandosx.git] / src / market / play-gamble.cpp
1 #include "market/play-gamble.h"
2 #include "avatar/avatar.h"
3 #include "core/asking-player.h"
4 #include "core/show-file.h"
5 #include "io/input-key-acceptor.h"
6 #include "market/building-actions-table.h"
7 #include "market/building-util.h"
8 #include "market/poker.h"
9 #include "system/player-type-definition.h"
10 #include "term/screen-processor.h"
11 #include "term/term-color-types.h"
12 #include "view/display-fruit.h"
13 #include "view/display-messages.h"
14
15 /*!
16  * @brief カジノ1プレイごとのメインルーチン / gamble_comm
17  * @param player_ptr プレイヤーへの参照ポインタ
18  * @param cmd プレイするゲームID
19  * @return プレイ成立やルール説明のみ等ならTRUE、賭け金不足で不成立ならFALSE
20  */
21 bool gamble_comm(PlayerType *player_ptr, int cmd)
22 {
23     int i;
24     int roll1, roll2, roll3, choice, odds, win;
25     int32_t wager;
26     int32_t maxbet;
27     int32_t oldgold;
28
29     char out_val[160], tmp_str[80], again;
30     concptr p;
31
32     screen_save();
33
34     if (cmd == BACT_GAMBLE_RULES) {
35         (void)show_file(player_ptr, true, _("jgambling.txt", "gambling.txt"), nullptr, 0, 0);
36         screen_load();
37         return true;
38     }
39
40     if (player_ptr->au < 1) {
41         msg_print(_("おい!おまえ一文なしじゃないか!こっから出ていけ!", "Hey! You don't have gold - get out of here!"));
42         msg_print(nullptr);
43         screen_load();
44         return false;
45     }
46
47     clear_bldg(5, 23);
48     maxbet = player_ptr->lev * 200;
49     maxbet = std::min(maxbet, player_ptr->au);
50
51     strcpy(out_val, "");
52     sprintf(tmp_str, _("賭け金 (1-%ld)?", "Your wager (1-%ld) ? "), (long int)maxbet);
53
54     /*
55      * Use get_string() because we may need more than
56      * the int16_t value returned by get_quantity().
57      */
58     if (!get_string(tmp_str, out_val, 32)) {
59         msg_print(nullptr);
60         screen_load();
61         return true;
62     }
63
64     for (p = out_val; *p == ' '; p++) {
65         ;
66     }
67
68     wager = atol(p);
69     if (wager > player_ptr->au) {
70         msg_print(_("おい!金が足りないじゃないか!出ていけ!", "Hey! You don't have the gold - get out of here!"));
71         msg_print(nullptr);
72         screen_load();
73         return false;
74     } else if (wager > maxbet) {
75         msg_format(_("%ldゴールドだけ受けよう。残りは取っときな。", "I'll take %ld gold of that. Keep the rest."), (long int)maxbet);
76         wager = maxbet;
77     } else if (wager < 1) {
78         msg_print(_("OK、1ゴールドからはじめよう。", "Ok, we'll start with 1 gold."));
79         wager = 1;
80     }
81     msg_print(nullptr);
82     win = 0;
83     odds = 0;
84     oldgold = player_ptr->au;
85
86     sprintf(tmp_str, _("ゲーム前の所持金: %9ld", "Gold before game: %9ld"), (long int)oldgold);
87     prt(tmp_str, 20, 2);
88     sprintf(tmp_str, _("現在の掛け金:     %9ld", "Current Wager:    %9ld"), (long int)wager);
89     prt(tmp_str, 21, 2);
90
91     do {
92         player_ptr->au -= wager;
93         switch (cmd) {
94         case BACT_IN_BETWEEN: /* Game of In-Between */
95             c_put_str(TERM_GREEN, _("イン・ビトイーン", "In Between"), 5, 2);
96
97             odds = 4;
98             win = 0;
99             roll1 = randint1(10);
100             roll2 = randint1(10);
101             choice = randint1(10);
102             sprintf(tmp_str, _("黒ダイス: %d        黒ダイス: %d", "Black die: %d       Black Die: %d"), roll1, roll2);
103
104             prt(tmp_str, 8, 3);
105             sprintf(tmp_str, _("赤ダイス: %d", "Red die: %d"), choice);
106
107             prt(tmp_str, 11, 14);
108             if (((choice > roll1) && (choice < roll2)) || ((choice < roll1) && (choice > roll2))) {
109                 win = 1;
110             }
111             break;
112         case BACT_CRAPS: /* Game of Craps */
113             c_put_str(TERM_GREEN, _("クラップス", "Craps"), 5, 2);
114
115             win = 3;
116             odds = 2;
117             roll1 = randint1(6);
118             roll2 = randint1(6);
119             roll3 = roll1 + roll2;
120             choice = roll3;
121             sprintf(tmp_str, _("1振りめ: %d %d      Total: %d", "First roll: %d %d    Total: %d"), roll1, roll2, roll3);
122             prt(tmp_str, 7, 5);
123             if ((roll3 == 7) || (roll3 == 11)) {
124                 win = 1;
125             } else if ((roll3 == 2) || (roll3 == 3) || (roll3 == 12)) {
126                 win = 0;
127             } else {
128                 do {
129                     msg_print(_("なにかキーを押すともう一回振ります。", "Hit any key to roll again"));
130
131                     msg_print(nullptr);
132                     roll1 = randint1(6);
133                     roll2 = randint1(6);
134                     roll3 = roll1 + roll2;
135                     sprintf(tmp_str, _("出目: %d %d          合計:      %d", "Roll result: %d %d   Total:     %d"), roll1, roll2, roll3);
136                     prt(tmp_str, 8, 5);
137                     if (roll3 == choice) {
138                         win = 1;
139                     } else if (roll3 == 7) {
140                         win = 0;
141                     }
142                 } while ((win != 1) && (win != 0));
143             }
144
145             break;
146
147         case BACT_SPIN_WHEEL: /* Spin the Wheel Game */
148             win = 0;
149             odds = 9;
150             c_put_str(TERM_GREEN, _("ルーレット", "Wheel"), 5, 2);
151
152             prt("0  1  2  3  4  5  6  7  8  9", 7, 5);
153             prt("--------------------------------", 8, 3);
154             strcpy(out_val, "");
155             get_string(_("何番? (0-9): ", "Pick a number (0-9): "), out_val, 32);
156
157             for (p = out_val; iswspace(*p); p++) {
158                 ;
159             }
160             choice = atol(p);
161             if (choice < 0) {
162                 msg_print(_("0番にしとくぜ。", "I'll put you down for 0."));
163                 choice = 0;
164             } else if (choice > 9) {
165                 msg_print(_("OK、9番にしとくぜ。", "Ok, I'll put you down for 9."));
166                 choice = 9;
167             }
168             msg_print(nullptr);
169             roll1 = randint0(10);
170             sprintf(tmp_str, _("ルーレットは回り、止まった。勝者は %d番だ。", "The wheel spins to a stop and the winner is %d"), roll1);
171             prt(tmp_str, 13, 3);
172             prt("", 9, 0);
173             prt("*", 9, (3 * roll1 + 5));
174             if (roll1 == choice) {
175                 win = 1;
176             }
177             break;
178
179         case BACT_DICE_SLOTS: /* The Dice Slots */
180             c_put_str(TERM_GREEN, _("ダイス・スロット", "Dice Slots"), 5, 2);
181             c_put_str(TERM_YELLOW, _("レモン   レモン            2", "Lemon    Lemon             2"), 6, 37);
182             c_put_str(TERM_YELLOW, _("レモン   レモン   レモン   5", "Lemon    Lemon    Lemon    5"), 7, 37);
183             c_put_str(TERM_ORANGE, _("オレンジ オレンジ オレンジ 10", "Orange   Orange   Orange   10"), 8, 37);
184             c_put_str(TERM_UMBER, _("剣       剣       剣       20", "Sword    Sword    Sword    20"), 9, 37);
185             c_put_str(TERM_SLATE, _("盾       盾       盾       50", "Shield   Shield   Shield   50"), 10, 37);
186             c_put_str(TERM_VIOLET, _("プラム   プラム   プラム   200", "Plum     Plum     Plum     200"), 11, 37);
187             c_put_str(TERM_RED, _("チェリー チェリー チェリー 1000", "Cherry   Cherry   Cherry   1000"), 12, 37);
188
189             win = 0;
190             roll1 = randint1(21);
191             for (i = 6; i > 0; i--) {
192                 if ((roll1 - i) < 1) {
193                     roll1 = 7 - i;
194                     break;
195                 }
196                 roll1 -= i;
197             }
198             roll2 = randint1(21);
199             for (i = 6; i > 0; i--) {
200                 if ((roll2 - i) < 1) {
201                     roll2 = 7 - i;
202                     break;
203                 }
204                 roll2 -= i;
205             }
206             choice = randint1(21);
207             for (i = 6; i > 0; i--) {
208                 if ((choice - i) < 1) {
209                     choice = 7 - i;
210                     break;
211                 }
212                 choice -= i;
213             }
214             put_str("/--------------------------\\", 7, 2);
215             prt("\\--------------------------/", 17, 2);
216             display_fruit(8, 3, roll1 - 1);
217             display_fruit(8, 12, roll2 - 1);
218             display_fruit(8, 21, choice - 1);
219             if ((roll1 == roll2) && (roll2 == choice)) {
220                 win = 1;
221                 switch (roll1) {
222                 case 1:
223                     odds = 5;
224                     break;
225                 case 2:
226                     odds = 10;
227                     break;
228                 case 3:
229                     odds = 20;
230                     break;
231                 case 4:
232                     odds = 50;
233                     break;
234                 case 5:
235                     odds = 200;
236                     break;
237                 case 6:
238                     odds = 1000;
239                     break;
240                 }
241             } else if ((roll1 == 1) && (roll2 == 1)) {
242                 win = 1;
243                 odds = 2;
244             }
245             break;
246         case BACT_POKER:
247             win = 0;
248             odds = do_poker();
249             if (odds) {
250                 win = 1;
251             }
252             break;
253         }
254
255         if (win) {
256             prt(_("あなたの勝ち", "YOU WON"), 16, 37);
257
258             player_ptr->au += odds * wager;
259             sprintf(tmp_str, _("倍率: %d", "Payoff: %d"), odds);
260
261             prt(tmp_str, 17, 37);
262         } else {
263             prt(_("あなたの負け", "You Lost"), 16, 37);
264             prt("", 17, 37);
265         }
266
267         sprintf(tmp_str, _("現在の所持金:     %9ld", "Current Gold:     %9ld"), (long int)player_ptr->au);
268
269         prt(tmp_str, 22, 2);
270         prt(_("もう一度(Y/N)?", "Again(Y/N)?"), 18, 37);
271
272         move_cursor(18, 52);
273         again = inkey();
274         prt("", 16, 37);
275         prt("", 17, 37);
276         prt("", 18, 37);
277         if (wager > player_ptr->au) {
278             msg_print(_("おい!金が足りないじゃないか!ここから出て行け!", "Hey! You don't have the gold - get out of here!"));
279             msg_print(nullptr);
280
281             /* Get out here */
282             break;
283         }
284     } while ((again == 'y') || (again == 'Y'));
285
286     prt("", 18, 37);
287     if (player_ptr->au >= oldgold) {
288         msg_print(_("「今回は儲けたな!でも次はこっちが勝ってやるからな、絶対に!」", "You came out a winner! We'll win next time, I'm sure."));
289         chg_virtue(player_ptr, V_CHANCE, 3);
290     } else {
291         msg_print(_("「金をスッてしまったな、わはは!うちに帰った方がいいぜ。」", "You lost gold! Haha, better head home."));
292         chg_virtue(player_ptr, V_CHANCE, -3);
293     }
294
295     msg_print(nullptr);
296     screen_load();
297     return true;
298 }