3 @brief ¥¦¥ë¥Æ¥£¥Þ£´¤ò»²¹Í¤Ë¤·¤¿ÆÁ¤Î¥·¥¹¥Æ¥à¤Î¼ÂÁõ / Enable an Ultima IV style "avatar" game where you try to achieve perfection in various virtues.
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.
20 * ÆÁ¤Î̾¾Î / The names of the virtues
22 cptr virtue[MAX_VIRTUE] =
66 * @brief ³ºÅö¤ÎÆÁ¤¬¥×¥ì¥¤¥ä¡¼¤Ë»ØÄꤵ¤ì¤Æ¤¤¤ë¤«Èݤ«¤Ë±þ¤¸¤Ä¤Ä¡¢Âç¾®¤òÈæ³Ó¤¹¤ë¡£
67 * @details ÆÁ¤¬¤Ê¤¤¾ì¹ç¤ÏÃÍ0¤È¤·¤ÆÈæ³Ó¤¹¤ë¡£
68 * @param type Èæ³Ó¤·¤¿¤¤ÆÁ¤ÎID
69 * @param num Èæ³Ó´ð½àÃÍ
70 * @param tekitou VIRTUE_LARGE = ´ð½àÃͤè¤êÂ礤¤¤« / VIRTUE_SMALL = ´ð½àÃͤè¤ê¾®¤µ¤¤¤«
71 * @return Èæ³Ó¤Î¿¿µ¶ÃͤòÊÖ¤¹
72 * @todo °ú¿ô̾¤òľ¤·¤Æ¤ª¤¯
74 bool compare_virtue(int type, int num, int tekitou)
77 if (virtue_number(type))
78 vir = p_ptr->virtues[virtue_number(type) - 1];
85 if (vir > num) return TRUE;
88 if (vir < num) return TRUE;
96 * @brief ¥×¥ì¥¤¥ä¡¼¤Î»ØÄê¤ÎÆÁ¤¬²¿ÈÖÌܤΥ¹¥í¥Ã¥È¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤«¤òÊÖ¤¹¡£ / Aux function
97 * @param type ³Îǧ¤·¤¿¤¤ÆÁ¤ÎID
98 * @return ¥¹¥í¥Ã¥È¤¬¤¢¤ë¤Ê¤é¤Ð¥¹¥í¥Ã¥È¤ÎID(0¡Á7)+1¡¢¤Ê¤¤¾ì¹ç¤Ï0¤òÊÖ¤¹¡£
100 int virtue_number(int type)
105 for (i = 0; i < 8; i++)
107 if (p_ptr->vir_types[i] == type) return i + 1;
115 * @brief ¥×¥ì¥¤¥ä¡¼¤Î¿¦¶È¤ä¼ï²¤Ë°Í¸¤·¤Ê¤¤¥é¥ó¥À¥à¤ÊÆÁ¤ò¼èÆÀ¤¹¤ë / Aux function
116 * @param which ³Îǧ¤·¤¿¤¤ÆÁ¤ÎID
119 static void get_random_virtue(int which)
123 /* Randomly choose a type */
124 while (!(type) || virtue_number(type))
126 switch (randint1(29))
128 case 1: case 2: case 3:
131 case 4: case 5: case 6:
134 case 7: case 8: case 9: case 10: case 11: case 12:
137 case 13: case 14: case 15: case 16: case 17:
140 case 18: case 19: case 20: case 21:
149 case 26: case 27: case 28:
159 p_ptr->vir_types[which] = type;
163 * @brief ¥×¥ì¥¤¥ä¡¼¤ÎÁª¤ó¤ÀËâË¡Îΰè¤Ë±þ¤¸¤ÆÂбþ¤¹¤ëÆÁ¤òÊÖ¤¹¡£
164 * @param realm ËâË¡Îΰè¤ÎID
165 * @return Âбþ¤¹¤ëÆÁ¤ÎID
167 static s16b get_realm_virtues(byte realm)
172 if (virtue_number(V_VITALITY)) return V_TEMPERANCE;
173 else return V_VITALITY;
175 if (virtue_number(V_KNOWLEDGE)) return V_ENCHANT;
176 else return V_KNOWLEDGE;
178 if (virtue_number(V_NATURE)) return V_HARMONY;
179 else return V_NATURE;
181 if (virtue_number(V_CHANCE)) return V_INDIVIDUALISM;
182 else return V_CHANCE;
190 if (virtue_number(V_ENCHANT)) return V_INDIVIDUALISM;
191 else return V_ENCHANT;
193 if (virtue_number(V_JUSTICE)) return V_FAITH;
194 else return V_JUSTICE;
196 if (virtue_number(V_JUSTICE)) return V_HONOUR;
197 else return V_JUSTICE;
199 if (virtue_number(V_COMPASSION)) return V_JUSTICE;
200 else return V_COMPASSION;
208 * @brief ºîÀ®Ãæ¤Î¥×¥ì¥¤¥ä¡¼¥¥ã¥é¥¯¥¿¡¼¤ËÆÁ8¼ïÎà¤òÍ¿¤¨¤ë¡£ / Select virtues & reset values for a new character
209 * @details ¿¦¶È¤Ë±þ¤¸¤Æ1¡Á4¼ï¤¬¸ÇÄê¡¢¼ï²¤Ë±þ¤¸¤Æ1¼ïÎबͿ¤¨¤é¤ì¡¢¸å¤Ï½ÅÊ£¤Ê¤¯¥é¥ó¥À¥à¤ËÁªÂò¤µ¤ì¤ë¡£
213 void get_virtues(void)
219 for (i = 0; i < 8; i++)
221 p_ptr->virtues[i] = 0;
222 p_ptr->vir_types[i] = 0;
227 /* Get pre-defined types */
228 /* 1 or more virtues based on class */
229 switch (p_ptr->pclass)
233 p_ptr->vir_types[i++] = V_VALOUR;
234 p_ptr->vir_types[i++] = V_HONOUR;
237 p_ptr->vir_types[i++] = V_KNOWLEDGE;
238 p_ptr->vir_types[i++] = V_ENCHANT;
241 p_ptr->vir_types[i++] = V_FAITH;
242 p_ptr->vir_types[i++] = V_TEMPERANCE;
246 p_ptr->vir_types[i++] = V_HONOUR;
250 p_ptr->vir_types[i++] = V_NATURE;
251 p_ptr->vir_types[i++] = V_TEMPERANCE;
254 p_ptr->vir_types[i++] = V_JUSTICE;
255 p_ptr->vir_types[i++] = V_VALOUR;
256 p_ptr->vir_types[i++] = V_HONOUR;
257 p_ptr->vir_types[i++] = V_FAITH;
259 case CLASS_WARRIOR_MAGE:
261 p_ptr->vir_types[i++] = V_ENCHANT;
262 p_ptr->vir_types[i++] = V_VALOUR;
264 case CLASS_CHAOS_WARRIOR:
265 p_ptr->vir_types[i++] = V_CHANCE;
266 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
269 case CLASS_FORCETRAINER:
270 p_ptr->vir_types[i++] = V_FAITH;
271 p_ptr->vir_types[i++] = V_HARMONY;
272 p_ptr->vir_types[i++] = V_TEMPERANCE;
273 p_ptr->vir_types[i++] = V_PATIENCE;
275 case CLASS_MINDCRAFTER:
276 case CLASS_MIRROR_MASTER:
277 p_ptr->vir_types[i++] = V_HARMONY;
278 p_ptr->vir_types[i++] = V_ENLIGHTEN;
279 p_ptr->vir_types[i++] = V_PATIENCE;
281 case CLASS_HIGH_MAGE:
283 p_ptr->vir_types[i++] = V_ENLIGHTEN;
284 p_ptr->vir_types[i++] = V_ENCHANT;
285 p_ptr->vir_types[i++] = V_KNOWLEDGE;
288 p_ptr->vir_types[i++] = V_ENLIGHTEN;
289 p_ptr->vir_types[i++] = V_CHANCE;
292 p_ptr->vir_types[i++] = V_CHANCE;
294 case CLASS_BLUE_MAGE:
295 p_ptr->vir_types[i++] = V_CHANCE;
296 p_ptr->vir_types[i++] = V_KNOWLEDGE;
298 case CLASS_BEASTMASTER:
299 p_ptr->vir_types[i++] = V_NATURE;
300 p_ptr->vir_types[i++] = V_CHANCE;
301 p_ptr->vir_types[i++] = V_VITALITY;
303 case CLASS_MAGIC_EATER:
304 p_ptr->vir_types[i++] = V_ENCHANT;
305 p_ptr->vir_types[i++] = V_KNOWLEDGE;
308 p_ptr->vir_types[i++] = V_HARMONY;
309 p_ptr->vir_types[i++] = V_COMPASSION;
312 p_ptr->vir_types[i++] = V_VALOUR;
313 p_ptr->vir_types[i++] = V_HARMONY;
315 case CLASS_BERSERKER:
316 p_ptr->vir_types[i++] = V_VALOUR;
317 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
320 p_ptr->vir_types[i++] = V_HONOUR;
321 p_ptr->vir_types[i++] = V_KNOWLEDGE;
324 p_ptr->vir_types[i++] = V_PATIENCE;
325 p_ptr->vir_types[i++] = V_KNOWLEDGE;
326 p_ptr->vir_types[i++] = V_FAITH;
327 p_ptr->vir_types[i++] = V_UNLIFE;
331 /* Get one virtue based on race */
332 switch (p_ptr->prace)
334 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
335 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
337 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
338 p_ptr->vir_types[i++] = V_NATURE;
340 case RACE_HOBBIT: case RACE_HALF_OGRE:
341 p_ptr->vir_types[i++] = V_TEMPERANCE;
343 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
344 p_ptr->vir_types[i++] = V_DILIGENCE;
346 case RACE_GNOME: case RACE_CYCLOPS:
347 p_ptr->vir_types[i++] = V_KNOWLEDGE;
349 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
350 p_ptr->vir_types[i++] = V_HONOUR;
352 case RACE_HALF_TROLL: case RACE_BARBARIAN:
353 p_ptr->vir_types[i++] = V_VALOUR;
355 case RACE_HIGH_ELF: case RACE_KUTAR:
356 p_ptr->vir_types[i++] = V_VITALITY;
358 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
359 p_ptr->vir_types[i++] = V_JUSTICE;
361 case RACE_HALF_TITAN:
362 p_ptr->vir_types[i++] = V_HARMONY;
365 p_ptr->vir_types[i++] = V_SACRIFICE;
367 case RACE_MIND_FLAYER:
368 p_ptr->vir_types[i++] = V_ENLIGHTEN;
370 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
371 p_ptr->vir_types[i++] = V_ENCHANT;
374 p_ptr->vir_types[i++] = V_PATIENCE;
377 p_ptr->vir_types[i++] = V_FAITH;
379 case RACE_ZOMBIE: case RACE_SKELETON:
380 case RACE_VAMPIRE: case RACE_SPECTRE:
381 p_ptr->vir_types[i++] = V_UNLIFE;
384 p_ptr->vir_types[i++] = V_CHANCE;
388 /* Get a virtue for realms */
391 tmp_vir = get_realm_virtues(p_ptr->realm1);
392 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
396 tmp_vir = get_realm_virtues(p_ptr->realm2);
397 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
400 /* Eliminate doubles */
401 for (i = 0; i < 8; i++)
403 for (j = i + 1; j < 8; j++)
405 if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
406 p_ptr->vir_types[j] = 0;
410 /* Fill in the blanks */
411 for (i = 0; i < 8; i++)
413 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
418 * @brief Âбþ¤¹¤ëÆÁ¤ò¥×¥ì¥¤¥ä¡¼¤¬¥¹¥í¥Ã¥È¤ËÅÐÏ¿¤·¤Æ¤¤¤ë¾ì¹ç¤Ë²Ã¸º¤ò¹Ô¤¦¡£
419 * @detail ÈϰϤÏ-125¡Á125¡¢´ðËÜŪ¤ËÀäÂÐÃͤ¬Â礤¤¤Û¤ÉÀäÂÐÃͤ¬¾å¤¬¤ê¿É¤¯¤Ê¤ë¡£
420 * @param virtue ÆÁ¤ÎID
421 * @param amount ²Ã¸ºÎÌ
424 void chg_virtue(int virtue, int amount)
428 for (i = 0; i < 8; i++)
430 if (p_ptr->vir_types[i] == virtue)
434 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
436 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
439 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
441 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
444 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
446 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
449 if (amount + p_ptr->virtues[i] > 125)
450 p_ptr->virtues[i] = 125;
452 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
456 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
458 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
461 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
463 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
466 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
468 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
471 if (amount + p_ptr->virtues[i] < -125)
472 p_ptr->virtues[i] = -125;
474 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
476 p_ptr->update |= (PU_BONUS);
483 * @brief Âбþ¤¹¤ëÆÁ¤ò¥×¥ì¥¤¥ä¡¼¤¬¥¹¥í¥Ã¥È¤ËÅÐÏ¿¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¸ÇÄêÃͤò¥»¥Ã¥È¤¹¤ë¡£
484 * @param virtue ÆÁ¤ÎID
485 * @param amount ¥»¥Ã¥È¤·¤¿¤¤ÃÍ¡£
488 void set_virtue(int virtue, int amount)
492 for (i = 0; i < 8; i++)
494 if (p_ptr->vir_types[i] == virtue)
496 p_ptr->virtues[i] = amount;
503 * @brief ÆÁ¤Î¥À¥ó¥×ɽ¼¨¤ò¹Ô¤¦¡£
504 * @param OutFile ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¡£
507 void dump_virtues(FILE *OutFile)
511 if (!OutFile) return;
513 for (v_nr = 0; v_nr < 8; v_nr++)
516 int tester = p_ptr->virtues[v_nr];
518 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
520 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
522 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
524 fprintf(OutFile, "Oops. No info about %s.", v_name);
527 else if (tester < -100)
529 fprintf(OutFile, "[%s]¤ÎÂжË",
531 fprintf(OutFile, "You are the polar opposite of %s.",
535 else if (tester < -80)
537 fprintf(OutFile, "[%s]¤ÎÂçŨ",
539 fprintf(OutFile, "You are an arch-enemy of %s.",
543 else if (tester < -60)
545 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
547 fprintf(OutFile, "You are a bitter enemy of %s.",
551 else if (tester < -40)
553 fprintf(OutFile, "[%s]¤ÎŨ",
555 fprintf(OutFile, "You are an enemy of %s.",
559 else if (tester < -20)
561 fprintf(OutFile, "[%s]¤Îºá¼Ô",
563 fprintf(OutFile, "You have sinned against %s.",
569 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
571 fprintf(OutFile, "You have strayed from the path of %s.",
575 else if (tester == 0)
577 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
579 fprintf(OutFile,"You are neutral to %s.",
583 else if (tester < 20)
585 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
587 fprintf(OutFile,"You are somewhat virtuous in %s.",
591 else if (tester < 40)
593 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
595 fprintf(OutFile,"You are virtuous in %s.",
599 else if (tester < 60)
601 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
603 fprintf(OutFile,"You are very virtuous in %s.",
607 else if (tester < 80)
609 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
611 fprintf(OutFile,"You are a champion of %s.",
615 else if (tester < 100)
617 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
619 fprintf(OutFile,"You are a great champion of %s.",
625 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
627 fprintf(OutFile,"You are the living embodiment of %s.",
632 fprintf(OutFile, "\n");