OSDN Git Service

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