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 void get_random_virtue(int which)
188 /* Randomly choose a type */
189 while (!(type) || virtue_number(type))
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 */
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_FAITH))
412 p_ptr->vir_types[i++] = V_VITALITY;
413 else p_ptr->vir_types[i++] = V_FAITH;
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;
451 /* Get a virtue for realm2 */
455 switch(p_ptr->realm2)
458 if (virtue_number(V_FAITH))
459 p_ptr->vir_types[i++] = V_VITALITY;
460 else p_ptr->vir_types[i++] = V_FAITH;
463 if (virtue_number(V_ENCHANT))
464 p_ptr->vir_types[i++] = V_KNOWLEDGE;
465 else p_ptr->vir_types[i++] = V_ENCHANT;
468 if (virtue_number(V_NATURE))
469 p_ptr->vir_types[i++] = V_HARMONY;
470 else p_ptr->vir_types[i++] = V_NATURE;
473 if (virtue_number(V_CHANCE))
474 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
475 else p_ptr->vir_types[i++] = V_CHANCE;
478 p_ptr->vir_types[i++] = V_UNLIFE;
481 p_ptr->vir_types[i++] = V_KNOWLEDGE;
486 if (virtue_number(V_ENCHANT))
487 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
488 else p_ptr->vir_types[i++] = V_ENCHANT;
491 if (virtue_number(V_JUSTICE))
492 p_ptr->vir_types[i++] = V_FAITH;
493 else p_ptr->vir_types[i++] = V_JUSTICE;
498 /* Eliminate doubles */
499 for (i = 0; i < 8; i++)
501 for (j = i+1; j < 8; j++)
503 if ((p_ptr->vir_types[j] != 0)
504 && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
505 p_ptr->vir_types[j] = 0;
509 /* Fill in the blanks */
511 for (i = 0; i < 8; i++)
513 if (p_ptr->vir_types[i]==0) get_random_virtue(i);
517 void chg_virtue(int virtue, int amount)
521 for (i = 0; i < 8; i++)
523 if (p_ptr->vir_types[i] == virtue)
527 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
529 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
532 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
534 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
537 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
539 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
542 if (amount + p_ptr->virtues[i] > 125)
543 p_ptr->virtues[i] = 125;
545 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
549 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
551 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
554 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
556 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
559 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
561 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
564 if (amount + p_ptr->virtues[i] < -125)
565 p_ptr->virtues[i] = -125;
567 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
569 p_ptr->update |= (PU_BONUS);
576 void set_virtue(int virtue, int amount)
580 for (i = 0; i < 8; i++)
582 if (p_ptr->vir_types[i] == virtue)
584 p_ptr->virtues[i] = amount;
590 void dump_virtues(FILE * OutFile)
594 if (!OutFile) return;
596 for (v_nr = 0; v_nr < 8; v_nr++)
600 int tester = p_ptr->virtues[v_nr];
602 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
604 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] >
607 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
609 fprintf(OutFile, "Oops. No info about %s.", v_name);
612 else if (tester < -100)
614 fprintf(OutFile, "[%s]¤ÎÂжË",
616 fprintf(OutFile, "You are the polar opposite of %s.",
620 else if (tester < -80)
622 fprintf(OutFile, "[%s]¤ÎÂçŨ",
624 fprintf(OutFile, "You are an arch-enemy of %s.",
628 else if (tester < -60)
630 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
632 fprintf(OutFile, "You are a bitter enemy of %s.",
636 else if (tester < -40)
638 fprintf(OutFile, "[%s]¤ÎŨ",
640 fprintf(OutFile, "You are an enemy of %s.",
644 else if (tester < -20)
646 fprintf(OutFile, "[%s]¤Îºá¼Ô",
648 fprintf(OutFile, "You have sinned against %s.",
654 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
656 fprintf(OutFile, "You have strayed from the path of %s.",
660 else if (tester == 0)
662 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
664 fprintf(OutFile,"You are neutral to %s.",
668 else if (tester < 20)
670 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
672 fprintf(OutFile,"You are somewhat virtuous in %s.",
676 else if (tester < 40)
678 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
680 fprintf(OutFile,"You are virtuous in %s.",
684 else if (tester < 60)
686 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
688 fprintf(OutFile,"You are very virtuous in %s.",
692 else if (tester < 80)
694 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
696 fprintf(OutFile,"You are a champion of %s.",
700 else if (tester < 100)
702 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
704 fprintf(OutFile,"You are a great champion of %s.",
710 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
712 fprintf(OutFile,"You are the living embodiment of %s.",
717 fprintf(OutFile, "\n");