4 * Purpose: Enable an Ultima IV style "avatar" game where you try to
5 * achieve perfection in various virtues.
14 * Copyright (c) 1989 James E. Wilson, Christopher J. Stuart
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.
24 /* The names of the virtues */
26 cptr virtue[MAX_VIRTUE] =
139 bool compare_virtue(int type, int num, int tekitou)
142 if (virtue_number(type))
143 vir = p_ptr->virtues[virtue_number(type)-1];
150 if (vir > num) return TRUE;
154 if (vir < num) return TRUE;
166 int virtue_number(int type)
171 for (i = 0; i < 8; i++)
173 if (p_ptr->vir_types[i] == type) return i+1;
184 static void get_random_virtue(int which)
188 /* Randomly choose a type */
189 while (!(type) || virtue_number(type))
191 switch (randint1(29))
193 case 1: case 2: case 3:
196 case 4: case 5: case 6:
199 case 7: case 8: case 9: case 10: case 11: case 12:
202 case 13: case 14: case 15: case 16: case 17:
205 case 18: case 19: case 20: case 21:
214 case 26: case 27: case 28:
224 p_ptr->vir_types[which] = type;
228 /* Select virtues & reset values for a new character */
230 void get_virtues(void)
235 for (i = 0; i < 8; i++)
238 p_ptr->vir_types[i]=0;
243 /* Get pre-defined types */
244 /* 1 or more virtues based on class */
245 switch (p_ptr->pclass)
249 p_ptr->vir_types[i++] = V_VALOUR;
250 p_ptr->vir_types[i++] = V_HONOUR;
253 p_ptr->vir_types[i++] = V_KNOWLEDGE;
254 p_ptr->vir_types[i++] = V_ENCHANT;
257 p_ptr->vir_types[i++] = V_FAITH;
258 p_ptr->vir_types[i++] = V_TEMPERANCE;
261 p_ptr->vir_types[i++] = V_HONOUR;
265 p_ptr->vir_types[i++] = V_NATURE;
266 p_ptr->vir_types[i++] = V_TEMPERANCE;
269 p_ptr->vir_types[i++] = V_JUSTICE;
270 p_ptr->vir_types[i++] = V_VALOUR;
271 p_ptr->vir_types[i++] = V_HONOUR;
272 p_ptr->vir_types[i++] = V_FAITH;
274 case CLASS_WARRIOR_MAGE:
276 p_ptr->vir_types[i++] = V_ENCHANT;
277 p_ptr->vir_types[i++] = V_VALOUR;
279 case CLASS_CHAOS_WARRIOR:
280 p_ptr->vir_types[i++] = V_CHANCE;
281 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
284 case CLASS_FORCETRAINER:
285 p_ptr->vir_types[i++] = V_FAITH;
286 p_ptr->vir_types[i++] = V_HARMONY;
287 p_ptr->vir_types[i++] = V_TEMPERANCE;
288 p_ptr->vir_types[i++] = V_PATIENCE;
290 case CLASS_MINDCRAFTER:
291 case CLASS_MIRROR_MASTER:
292 p_ptr->vir_types[i++] = V_HARMONY;
293 p_ptr->vir_types[i++] = V_ENLIGHTEN;
294 p_ptr->vir_types[i++] = V_PATIENCE;
296 case CLASS_HIGH_MAGE:
298 p_ptr->vir_types[i++] = V_ENLIGHTEN;
299 p_ptr->vir_types[i++] = V_ENCHANT;
300 p_ptr->vir_types[i++] = V_KNOWLEDGE;
303 p_ptr->vir_types[i++] = V_ENLIGHTEN;
304 p_ptr->vir_types[i++] = V_CHANCE;
307 p_ptr->vir_types[i++] = V_CHANCE;
309 case CLASS_BLUE_MAGE:
310 p_ptr->vir_types[i++] = V_CHANCE;
311 p_ptr->vir_types[i++] = V_KNOWLEDGE;
313 case CLASS_BEASTMASTER:
314 p_ptr->vir_types[i++] = V_NATURE;
315 p_ptr->vir_types[i++] = V_CHANCE;
316 p_ptr->vir_types[i++] = V_VITALITY;
318 case CLASS_MAGIC_EATER:
319 p_ptr->vir_types[i++] = V_ENCHANT;
320 p_ptr->vir_types[i++] = V_KNOWLEDGE;
323 p_ptr->vir_types[i++] = V_HARMONY;
324 p_ptr->vir_types[i++] = V_COMPASSION;
327 p_ptr->vir_types[i++] = V_VALOUR;
328 p_ptr->vir_types[i++] = V_HARMONY;
330 case CLASS_BERSERKER:
331 p_ptr->vir_types[i++] = V_VALOUR;
332 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
335 p_ptr->vir_types[i++] = V_HONOUR;
336 p_ptr->vir_types[i++] = V_KNOWLEDGE;
339 p_ptr->vir_types[i++] = V_PATIENCE;
340 p_ptr->vir_types[i++] = V_KNOWLEDGE;
341 p_ptr->vir_types[i++] = V_FAITH;
342 p_ptr->vir_types[i++] = V_UNLIFE;
348 /* Get one virtue based on race */
349 switch (p_ptr->prace)
351 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
352 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
354 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
355 p_ptr->vir_types[i++] = V_NATURE;
357 case RACE_HOBBIT: case RACE_HALF_OGRE:
358 p_ptr->vir_types[i++] = V_TEMPERANCE;
360 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
361 p_ptr->vir_types[i++] = V_DILIGENCE;
363 case RACE_GNOME: case RACE_CYCLOPS:
364 p_ptr->vir_types[i++] = V_KNOWLEDGE;
366 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
367 p_ptr->vir_types[i++] = V_HONOUR;
369 case RACE_HALF_TROLL: case RACE_BARBARIAN:
370 p_ptr->vir_types[i++] = V_VALOUR;
372 case RACE_HIGH_ELF: case RACE_KUTA:
373 p_ptr->vir_types[i++] = V_VITALITY;
375 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
376 p_ptr->vir_types[i++] = V_JUSTICE;
378 case RACE_HALF_TITAN:
379 p_ptr->vir_types[i++] = V_HARMONY;
382 p_ptr->vir_types[i++] = V_SACRIFICE;
384 case RACE_MIND_FLAYER:
385 p_ptr->vir_types[i++] = V_ENLIGHTEN;
387 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
388 p_ptr->vir_types[i++] = V_ENCHANT;
391 p_ptr->vir_types[i++] = V_PATIENCE;
394 p_ptr->vir_types[i++] = V_FAITH;
396 case RACE_ZOMBIE: case RACE_SKELETON:
397 case RACE_VAMPIRE: case RACE_SPECTRE:
398 p_ptr->vir_types[i++] = V_UNLIFE;
401 p_ptr->vir_types[i++] = V_CHANCE;
405 /* Get a virtue for realm1 */
408 switch(p_ptr->realm1)
411 if (virtue_number(V_VITALITY))
412 p_ptr->vir_types[i++] = V_TEMPERANCE;
413 else p_ptr->vir_types[i++] = V_VITALITY;
416 if (virtue_number(V_KNOWLEDGE))
417 p_ptr->vir_types[i++] = V_ENCHANT;
418 else p_ptr->vir_types[i++] = V_KNOWLEDGE;
421 if (virtue_number(V_NATURE))
422 p_ptr->vir_types[i++] = V_HARMONY;
423 else p_ptr->vir_types[i++] = V_NATURE;
426 if (virtue_number(V_CHANCE))
427 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
428 else p_ptr->vir_types[i++] = V_CHANCE;
431 p_ptr->vir_types[i++] = V_UNLIFE;
434 p_ptr->vir_types[i++] = V_KNOWLEDGE;
439 if (virtue_number(V_ENCHANT))
440 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
441 else p_ptr->vir_types[i++] = V_ENCHANT;
444 if (virtue_number(V_JUSTICE))
445 p_ptr->vir_types[i++] = V_FAITH;
446 else p_ptr->vir_types[i++] = V_JUSTICE;
449 if (virtue_number(V_JUSTICE))
450 p_ptr->vir_types[i++] = V_HONOUR;
451 else p_ptr->vir_types[i++] = V_JUSTICE;
456 /* Get a virtue for realm2 */
460 switch(p_ptr->realm2)
463 if (virtue_number(V_VITALITY))
464 p_ptr->vir_types[i++] = V_TEMPERANCE;
465 else p_ptr->vir_types[i++] = V_VITALITY;
468 if (virtue_number(V_ENCHANT))
469 p_ptr->vir_types[i++] = V_KNOWLEDGE;
470 else p_ptr->vir_types[i++] = V_ENCHANT;
473 if (virtue_number(V_NATURE))
474 p_ptr->vir_types[i++] = V_HARMONY;
475 else p_ptr->vir_types[i++] = V_NATURE;
478 if (virtue_number(V_CHANCE))
479 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
480 else p_ptr->vir_types[i++] = V_CHANCE;
483 p_ptr->vir_types[i++] = V_UNLIFE;
486 p_ptr->vir_types[i++] = V_KNOWLEDGE;
491 if (virtue_number(V_ENCHANT))
492 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
493 else p_ptr->vir_types[i++] = V_ENCHANT;
496 if (virtue_number(V_JUSTICE))
497 p_ptr->vir_types[i++] = V_FAITH;
498 else p_ptr->vir_types[i++] = V_JUSTICE;
501 if (virtue_number(V_JUSTICE))
502 p_ptr->vir_types[i++] = V_HONOUR;
503 else p_ptr->vir_types[i++] = V_JUSTICE;
508 /* Eliminate doubles */
509 for (i = 0; i < 8; i++)
511 for (j = i+1; j < 8; j++)
513 if ((p_ptr->vir_types[j] != 0)
514 && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
515 p_ptr->vir_types[j] = 0;
519 /* Fill in the blanks */
521 for (i = 0; i < 8; i++)
523 if (p_ptr->vir_types[i]==0) get_random_virtue(i);
527 void chg_virtue(int virtue, int amount)
531 for (i = 0; i < 8; i++)
533 if (p_ptr->vir_types[i] == virtue)
537 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
539 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
542 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
544 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
547 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
549 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
552 if (amount + p_ptr->virtues[i] > 125)
553 p_ptr->virtues[i] = 125;
555 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
559 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
561 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
564 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
566 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
569 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
571 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
574 if (amount + p_ptr->virtues[i] < -125)
575 p_ptr->virtues[i] = -125;
577 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
579 p_ptr->update |= (PU_BONUS);
586 void set_virtue(int virtue, int amount)
590 for (i = 0; i < 8; i++)
592 if (p_ptr->vir_types[i] == virtue)
594 p_ptr->virtues[i] = amount;
600 void dump_virtues(FILE * OutFile)
604 if (!OutFile) return;
606 for (v_nr = 0; v_nr < 8; v_nr++)
610 int tester = p_ptr->virtues[v_nr];
612 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
614 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] >
617 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
619 fprintf(OutFile, "Oops. No info about %s.", v_name);
622 else if (tester < -100)
624 fprintf(OutFile, "[%s]¤ÎÂжË",
626 fprintf(OutFile, "You are the polar opposite of %s.",
630 else if (tester < -80)
632 fprintf(OutFile, "[%s]¤ÎÂçŨ",
634 fprintf(OutFile, "You are an arch-enemy of %s.",
638 else if (tester < -60)
640 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
642 fprintf(OutFile, "You are a bitter enemy of %s.",
646 else if (tester < -40)
648 fprintf(OutFile, "[%s]¤ÎŨ",
650 fprintf(OutFile, "You are an enemy of %s.",
654 else if (tester < -20)
656 fprintf(OutFile, "[%s]¤Îºá¼Ô",
658 fprintf(OutFile, "You have sinned against %s.",
664 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
666 fprintf(OutFile, "You have strayed from the path of %s.",
670 else if (tester == 0)
672 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
674 fprintf(OutFile,"You are neutral to %s.",
678 else if (tester < 20)
680 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
682 fprintf(OutFile,"You are somewhat virtuous in %s.",
686 else if (tester < 40)
688 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
690 fprintf(OutFile,"You are virtuous in %s.",
694 else if (tester < 60)
696 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
698 fprintf(OutFile,"You are very virtuous in %s.",
702 else if (tester < 80)
704 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
706 fprintf(OutFile,"You are a champion of %s.",
710 else if (tester < 100)
712 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
714 fprintf(OutFile,"You are a great champion of %s.",
720 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
722 fprintf(OutFile,"You are the living embodiment of %s.",
727 fprintf(OutFile, "\n");