OSDN Git Service

Add Doxygen comment to avatar.c.
[hengband/hengband.git] / src / avatar.c
1 /*!
2     @file avater.c
3     @brief ¥¦¥ë¥Æ¥£¥Þ£´¤ò»²¹Í¤Ë¤·¤¿ÆÁ¤Î¥·¥¹¥Æ¥à¤Î¼ÂÁõ / Enable an Ultima IV style "avatar" game where you try to achieve perfection in various virtues.
4     @date 2013/12/23
5     @author
6     Topi Ylinen 1998\n
7     f1toyl@uta.fi\n
8     topi.ylinen@noodi.fi\n
9     \n
10     Copyright (c) 1989 James E. Wilson, Christopher J. Stuart
11     This software may be copied and distributed for educational, research, and
12     not for profit purposes provided that this copyright and statement are
13     included in all such copies.
14 */
15
16
17 #include "angband.h"
18
19 /*!
20  * ÆÁ¤Î̾¾Î / The names of the virtues
21  */
22 cptr virtue[MAX_VIRTUE] =
23 {
24 #ifdef JP
25         "¾ð",
26         "ÍÀ",
27         "Àµ",
28         "µ¾",
29         "¼±",
30         "À¿",
31         "·¼",
32         "Èë",
33         "±¿",
34         "Á³",
35         "Ĵ",
36         "³è",
37         "»à",
38         "Ǧ",
39         "Àá",
40         "¶Ð",
41         "ͦ",
42         "¸Ä",
43 #else
44         "Compassion",
45         "Honour",
46         "Justice",
47         "Sacrifice",
48         "Knowledge",
49         "Faith",
50         "Enlightenment",
51         "Mysticism",
52         "Chance",
53         "Nature",
54         "Harmony",
55         "Vitality",
56         "Unlife",
57         "Patience",
58         "Temperance",
59         "Diligence",
60         "Valour",
61         "Individualism",
62 #endif
63 };
64
65
66 bool compare_virtue(int type, int num, int tekitou)
67 {
68         int vir;
69         if (virtue_number(type))
70                 vir = p_ptr->virtues[virtue_number(type) - 1];
71         else
72                 vir = 0;
73
74         switch (tekitou)
75         {
76         case VIRTUE_LARGE:
77                 if (vir > num) return TRUE;
78                 else return FALSE;
79         case VIRTUE_SMALL:
80                 if (vir < num) return TRUE;
81                 else return FALSE;
82         }
83
84         return FALSE;
85 }
86
87
88 /* Aux function */
89
90 int virtue_number(int type)
91 {
92         int i;
93
94         /* Search */
95         for (i = 0; i < 8; i++)
96         {
97                 if (p_ptr->vir_types[i] == type) return i + 1;
98         }
99
100         /* No match */
101         return 0;
102 }
103
104 /* Aux function */
105
106 static void get_random_virtue(int which)
107 {
108         int type = 0;
109
110         /* Randomly choose a type */
111         while (!(type) || virtue_number(type))
112         {
113                 switch (randint1(29))
114                 {
115                 case 1: case 2: case 3:
116                         type = V_SACRIFICE;
117                         break;
118                 case 4: case 5: case 6:
119                         type = V_COMPASSION;
120                         break;
121                 case 7: case 8: case 9: case 10: case 11: case 12:
122                         type = V_VALOUR;
123                         break;
124                 case 13: case 14: case 15: case 16: case 17:
125                         type = V_HONOUR;
126                         break;
127                 case 18: case 19: case 20: case 21:
128                         type = V_JUSTICE;
129                         break;
130                 case 22: case 23:
131                         type = V_TEMPERANCE;
132                         break;
133                 case 24: case 25:
134                         type = V_HARMONY;
135                         break;
136                 case 26: case 27: case 28:
137                         type = V_PATIENCE;
138                         break;
139                 default:
140                         type = V_DILIGENCE;
141                         break;
142                 }
143         }
144
145         /* Chosen */
146         p_ptr->vir_types[which] = type;
147 }
148
149 static s16b get_realm_virtues(byte realm)
150 {
151         switch (realm)
152         {
153         case REALM_LIFE:
154                 if (virtue_number(V_VITALITY)) return V_TEMPERANCE;
155                 else return V_VITALITY;
156         case REALM_SORCERY:
157                 if (virtue_number(V_KNOWLEDGE)) return V_ENCHANT;
158                 else return V_KNOWLEDGE;
159         case REALM_NATURE:
160                 if (virtue_number(V_NATURE)) return V_HARMONY;
161                 else return V_NATURE;
162         case REALM_CHAOS:
163                 if (virtue_number(V_CHANCE)) return V_INDIVIDUALISM;
164                 else return V_CHANCE;
165         case REALM_DEATH:
166                 return V_UNLIFE;
167         case REALM_TRUMP:
168                 return V_KNOWLEDGE;
169         case REALM_ARCANE:
170                 return 0;
171         case REALM_CRAFT:
172                 if (virtue_number(V_ENCHANT)) return V_INDIVIDUALISM;
173                 else return V_ENCHANT;
174         case REALM_DAEMON:
175                 if (virtue_number(V_JUSTICE)) return V_FAITH;
176                 else return V_JUSTICE;
177         case REALM_CRUSADE:
178                 if (virtue_number(V_JUSTICE)) return V_HONOUR;
179                 else return V_JUSTICE;
180         case REALM_HEX:
181                 if (virtue_number(V_COMPASSION)) return V_JUSTICE;
182                 else return V_COMPASSION;
183         };
184
185         return 0;
186 }
187
188
189 /*!
190  * @brief ºîÀ®Ãæ¤Î¥×¥ì¥¤¥ä¡¼¥­¥ã¥é¥¯¥¿¡¼¤ËÆÁ8¼ïÎà¤òÍ¿¤¨¤ë¡£ / Select virtues & reset values for a new character
191  * @details ¿¦¶È¤Ë±þ¤¸¤Æ1¡Á4¼ï¤¬¸ÇÄê¡¢¼ï²¤Ë±þ¤¸¤Æ1¼ïÎबͿ¤¨¤é¤ì¡¢¸å¤Ï½ÅÊ£¤Ê¤¯¥é¥ó¥À¥à¤ËÁªÂò¤µ¤ì¤ë¡£
192  * @param ¤Ê¤·
193  * @return ¤Ê¤·
194  */
195 void get_virtues(void)
196 {
197         int i = 0, j = 0;
198         s16b tmp_vir;
199
200         /* Reset */
201         for (i = 0; i < 8; i++)
202         {
203                 p_ptr->virtues[i] = 0;
204                 p_ptr->vir_types[i] = 0;
205         }
206
207         i = 0;
208
209         /* Get pre-defined types */
210         /* 1 or more virtues based on class */
211         switch (p_ptr->pclass)
212         {
213         case CLASS_WARRIOR:
214         case CLASS_SAMURAI:
215                 p_ptr->vir_types[i++] = V_VALOUR;
216                 p_ptr->vir_types[i++] = V_HONOUR;
217                 break;
218         case CLASS_MAGE:
219                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
220                 p_ptr->vir_types[i++] = V_ENCHANT;
221                 break;
222         case CLASS_PRIEST:
223                 p_ptr->vir_types[i++] = V_FAITH;
224                 p_ptr->vir_types[i++] = V_TEMPERANCE;
225                 break;
226         case CLASS_ROGUE:
227         case CLASS_SNIPER:
228                 p_ptr->vir_types[i++] = V_HONOUR;
229                 break;
230         case CLASS_RANGER:
231         case CLASS_ARCHER:
232                 p_ptr->vir_types[i++] = V_NATURE;
233                 p_ptr->vir_types[i++] = V_TEMPERANCE;
234                 break;
235         case CLASS_PALADIN:
236                 p_ptr->vir_types[i++] = V_JUSTICE;
237                 p_ptr->vir_types[i++] = V_VALOUR;
238                 p_ptr->vir_types[i++] = V_HONOUR;
239                 p_ptr->vir_types[i++] = V_FAITH;
240                 break;
241         case CLASS_WARRIOR_MAGE:
242         case CLASS_RED_MAGE:
243                 p_ptr->vir_types[i++] = V_ENCHANT;
244                 p_ptr->vir_types[i++] = V_VALOUR;
245                 break;
246         case CLASS_CHAOS_WARRIOR:
247                 p_ptr->vir_types[i++] = V_CHANCE;
248                 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
249                 break;
250         case CLASS_MONK:
251         case CLASS_FORCETRAINER:
252                 p_ptr->vir_types[i++] = V_FAITH;
253                 p_ptr->vir_types[i++] = V_HARMONY;
254                 p_ptr->vir_types[i++] = V_TEMPERANCE;
255                 p_ptr->vir_types[i++] = V_PATIENCE;
256                 break;
257         case CLASS_MINDCRAFTER:
258         case CLASS_MIRROR_MASTER:
259                 p_ptr->vir_types[i++] = V_HARMONY;
260                 p_ptr->vir_types[i++] = V_ENLIGHTEN;
261                 p_ptr->vir_types[i++] = V_PATIENCE;
262                 break;
263         case CLASS_HIGH_MAGE:
264         case CLASS_SORCERER:
265                 p_ptr->vir_types[i++] = V_ENLIGHTEN;
266                 p_ptr->vir_types[i++] = V_ENCHANT;
267                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
268                 break;
269         case CLASS_TOURIST:
270                 p_ptr->vir_types[i++] = V_ENLIGHTEN;
271                 p_ptr->vir_types[i++] = V_CHANCE;
272                 break;
273         case CLASS_IMITATOR:
274                 p_ptr->vir_types[i++] = V_CHANCE;
275                 break;
276         case CLASS_BLUE_MAGE:
277                 p_ptr->vir_types[i++] = V_CHANCE;
278                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
279                 break;
280         case CLASS_BEASTMASTER:
281                 p_ptr->vir_types[i++] = V_NATURE;
282                 p_ptr->vir_types[i++] = V_CHANCE;
283                 p_ptr->vir_types[i++] = V_VITALITY;
284                 break;
285         case CLASS_MAGIC_EATER:
286                 p_ptr->vir_types[i++] = V_ENCHANT;
287                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
288                 break;
289         case CLASS_BARD:
290                 p_ptr->vir_types[i++] = V_HARMONY;
291                 p_ptr->vir_types[i++] = V_COMPASSION;
292                 break;
293         case CLASS_CAVALRY:
294                 p_ptr->vir_types[i++] = V_VALOUR;
295                 p_ptr->vir_types[i++] = V_HARMONY;
296                 break;
297         case CLASS_BERSERKER:
298                 p_ptr->vir_types[i++] = V_VALOUR;
299                 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
300                 break;
301         case CLASS_SMITH:
302                 p_ptr->vir_types[i++] = V_HONOUR;
303                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
304                 break;
305         case CLASS_NINJA:
306                 p_ptr->vir_types[i++] = V_PATIENCE;
307                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
308                 p_ptr->vir_types[i++] = V_FAITH;
309                 p_ptr->vir_types[i++] = V_UNLIFE;
310                 break;
311         };
312
313         /* Get one virtue based on race */
314         switch (p_ptr->prace)
315         {
316         case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
317                 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
318                 break;
319         case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
320                 p_ptr->vir_types[i++] = V_NATURE;
321                 break;
322         case RACE_HOBBIT: case RACE_HALF_OGRE:
323                 p_ptr->vir_types[i++] = V_TEMPERANCE;
324                 break;
325         case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
326                 p_ptr->vir_types[i++] = V_DILIGENCE;
327                 break;
328         case RACE_GNOME: case RACE_CYCLOPS:
329                 p_ptr->vir_types[i++] = V_KNOWLEDGE;
330                 break;
331         case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
332                 p_ptr->vir_types[i++] = V_HONOUR;
333                 break;
334         case RACE_HALF_TROLL: case RACE_BARBARIAN:
335                 p_ptr->vir_types[i++] = V_VALOUR;
336                 break;
337         case RACE_HIGH_ELF: case RACE_KUTAR:
338                 p_ptr->vir_types[i++] = V_VITALITY;
339                 break;
340         case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
341                 p_ptr->vir_types[i++] = V_JUSTICE;
342                 break;
343         case RACE_HALF_TITAN:
344                 p_ptr->vir_types[i++] = V_HARMONY;
345                 break;
346         case RACE_YEEK:
347                 p_ptr->vir_types[i++] = V_SACRIFICE;
348                 break;
349         case RACE_MIND_FLAYER:
350                 p_ptr->vir_types[i++] = V_ENLIGHTEN;
351                 break;
352         case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
353                 p_ptr->vir_types[i++] = V_ENCHANT;
354                 break;
355         case RACE_NIBELUNG:
356                 p_ptr->vir_types[i++] = V_PATIENCE;
357                 break;
358         case RACE_IMP:
359                 p_ptr->vir_types[i++] = V_FAITH;
360                 break;
361         case RACE_ZOMBIE: case RACE_SKELETON:
362         case RACE_VAMPIRE: case RACE_SPECTRE:
363                 p_ptr->vir_types[i++] = V_UNLIFE;
364                 break;
365         case RACE_BEASTMAN:
366                 p_ptr->vir_types[i++] = V_CHANCE;
367                 break;
368         }
369
370         /* Get a virtue for realms */
371         if (p_ptr->realm1)
372         {
373                 tmp_vir = get_realm_virtues(p_ptr->realm1);
374                 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
375         }
376         if (p_ptr->realm2)
377         {
378                 tmp_vir = get_realm_virtues(p_ptr->realm2);
379                 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
380         }
381
382         /* Eliminate doubles */
383         for (i = 0; i < 8; i++)
384         {
385                 for (j = i + 1; j < 8; j++)
386                 {
387                         if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
388                                 p_ptr->vir_types[j] = 0;
389                 }
390         }
391
392         /* Fill in the blanks */
393         for (i = 0; i < 8; i++)
394         {
395                 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
396         }
397 }
398
399 void chg_virtue(int virtue, int amount)
400 {
401         int i = 0;
402
403         for (i = 0; i < 8; i++)
404         {
405                 if (p_ptr->vir_types[i] == virtue)
406                 {
407                         if (amount > 0)
408                         {
409                                 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
410                                 {
411                                         p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
412                                         return;
413                                 }
414                                 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
415                                 {
416                                         p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
417                                         return;
418                                 }
419                                 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
420                                 {
421                                         p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
422                                         return;
423                                 }
424                                 if (amount + p_ptr->virtues[i] > 125)
425                                         p_ptr->virtues[i] = 125;
426                                 else
427                                         p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
428                         }
429                         else
430                         {
431                                 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
432                                 {
433                                         p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
434                                         return;
435                                 }
436                                 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
437                                 {
438                                         p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
439                                         return;
440                                 }
441                                 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
442                                 {
443                                         p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
444                                         return;
445                                 }
446                                 if (amount + p_ptr->virtues[i] < -125)
447                                         p_ptr->virtues[i] = -125;
448                                 else
449                                         p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
450                         }
451                         p_ptr->update |= (PU_BONUS);
452                         return;
453                 }
454         }
455 }
456
457 void set_virtue(int virtue, int amount)
458 {
459         int i = 0;
460
461         for (i = 0; i < 8; i++)
462         {
463                 if (p_ptr->vir_types[i] == virtue)
464                 {
465                         p_ptr->virtues[i] = amount;
466                         return;
467                 }
468         }
469 }
470
471 void dump_virtues(FILE *OutFile)
472 {
473         int v_nr = 0;
474
475         if (!OutFile) return;
476
477         for (v_nr = 0; v_nr < 8; v_nr++)
478         {
479                 char v_name [20];
480                 int tester = p_ptr->virtues[v_nr];
481
482                 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
483
484                 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
485 #ifdef JP
486                         fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
487 #else
488                         fprintf(OutFile, "Oops. No info about %s.", v_name);
489 #endif
490
491                 else if (tester < -100)
492 #ifdef JP
493                         fprintf(OutFile, "[%s]¤ÎÂжË",
494 #else
495                         fprintf(OutFile, "You are the polar opposite of %s.",
496 #endif
497
498                                 v_name);
499                 else if (tester < -80)
500 #ifdef JP
501                         fprintf(OutFile, "[%s]¤ÎÂçŨ",
502 #else
503                         fprintf(OutFile, "You are an arch-enemy of %s.",
504 #endif
505
506                                 v_name);
507                 else if (tester < -60)
508 #ifdef JP
509                         fprintf(OutFile, "[%s]¤Î¶¯Å¨",
510 #else
511                         fprintf(OutFile, "You are a bitter enemy of %s.",
512 #endif
513
514                                 v_name);
515                 else if (tester < -40)
516 #ifdef JP
517                         fprintf(OutFile, "[%s]¤ÎŨ",
518 #else
519                         fprintf(OutFile, "You are an enemy of %s.",
520 #endif
521
522                                 v_name);
523                 else if (tester < -20)
524 #ifdef JP
525                         fprintf(OutFile, "[%s]¤Îºá¼Ô",
526 #else
527                         fprintf(OutFile, "You have sinned against %s.",
528 #endif
529
530                                 v_name);
531                 else if (tester < 0)
532 #ifdef JP
533                         fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
534 #else
535                         fprintf(OutFile, "You have strayed from the path of %s.",
536 #endif
537
538                                 v_name);
539                 else if (tester == 0)
540 #ifdef JP
541                         fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
542 #else
543                         fprintf(OutFile,"You are neutral to %s.",
544 #endif
545
546                                 v_name);
547                 else if (tester < 20)
548 #ifdef JP
549                         fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
550 #else
551                         fprintf(OutFile,"You are somewhat virtuous in %s.",
552 #endif
553
554                                 v_name);
555                 else if (tester < 40)
556 #ifdef JP
557                         fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
558 #else
559                         fprintf(OutFile,"You are virtuous in %s.",
560 #endif
561
562                                 v_name);
563                 else if (tester < 60)
564 #ifdef JP
565                         fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
566 #else
567                         fprintf(OutFile,"You are very virtuous in %s.",
568 #endif
569
570                                 v_name);
571                 else if (tester < 80)
572 #ifdef JP
573                         fprintf(OutFile,"[%s]¤ÎÇƼÔ",
574 #else
575                         fprintf(OutFile,"You are a champion of %s.",
576 #endif
577
578                                 v_name);
579                 else if (tester < 100)
580 #ifdef JP
581                         fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
582 #else
583                         fprintf(OutFile,"You are a great champion of %s.",
584 #endif
585
586                                 v_name);
587                 else
588 #ifdef JP
589                         fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
590 #else
591                         fprintf(OutFile,"You are the living embodiment of %s.",
592 #endif
593
594                                 v_name);
595
596             fprintf(OutFile, "\n");
597         }
598 }