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] =
70 bool compare_virtue(int type, int num, int tekitou)
73 if (virtue_number(type))
74 vir = p_ptr->virtues[virtue_number(type) - 1];
81 if (vir > num) return TRUE;
84 if (vir < num) return TRUE;
94 int virtue_number(int type)
99 for (i = 0; i < 8; i++)
101 if (p_ptr->vir_types[i] == type) return i + 1;
110 static void get_random_virtue(int which)
114 /* Randomly choose a type */
115 while (!(type) || virtue_number(type))
117 switch (randint1(29))
119 case 1: case 2: case 3:
122 case 4: case 5: case 6:
125 case 7: case 8: case 9: case 10: case 11: case 12:
128 case 13: case 14: case 15: case 16: case 17:
131 case 18: case 19: case 20: case 21:
140 case 26: case 27: case 28:
150 p_ptr->vir_types[which] = type;
153 static s16b get_realm_virtues(byte realm)
158 if (virtue_number(V_VITALITY)) return V_TEMPERANCE;
159 else return V_VITALITY;
161 if (virtue_number(V_KNOWLEDGE)) return V_ENCHANT;
162 else return V_KNOWLEDGE;
164 if (virtue_number(V_NATURE)) return V_HARMONY;
165 else return V_NATURE;
167 if (virtue_number(V_CHANCE)) return V_INDIVIDUALISM;
168 else return V_CHANCE;
176 if (virtue_number(V_ENCHANT)) return V_INDIVIDUALISM;
177 else return V_ENCHANT;
179 if (virtue_number(V_JUSTICE)) return V_FAITH;
180 else return V_JUSTICE;
182 if (virtue_number(V_JUSTICE)) return V_HONOUR;
183 else return V_JUSTICE;
185 if (virtue_number(V_COMPASSION)) return V_JUSTICE;
186 else return V_COMPASSION;
192 /* Select virtues & reset values for a new character */
194 void get_virtues(void)
200 for (i = 0; i < 8; i++)
202 p_ptr->virtues[i] = 0;
203 p_ptr->vir_types[i] = 0;
208 /* Get pre-defined types */
209 /* 1 or more virtues based on class */
210 switch (p_ptr->pclass)
214 p_ptr->vir_types[i++] = V_VALOUR;
215 p_ptr->vir_types[i++] = V_HONOUR;
218 p_ptr->vir_types[i++] = V_KNOWLEDGE;
219 p_ptr->vir_types[i++] = V_ENCHANT;
222 p_ptr->vir_types[i++] = V_FAITH;
223 p_ptr->vir_types[i++] = V_TEMPERANCE;
227 p_ptr->vir_types[i++] = V_HONOUR;
231 p_ptr->vir_types[i++] = V_NATURE;
232 p_ptr->vir_types[i++] = V_TEMPERANCE;
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;
240 case CLASS_WARRIOR_MAGE:
242 p_ptr->vir_types[i++] = V_ENCHANT;
243 p_ptr->vir_types[i++] = V_VALOUR;
245 case CLASS_CHAOS_WARRIOR:
246 p_ptr->vir_types[i++] = V_CHANCE;
247 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
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;
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;
262 case CLASS_HIGH_MAGE:
264 p_ptr->vir_types[i++] = V_ENLIGHTEN;
265 p_ptr->vir_types[i++] = V_ENCHANT;
266 p_ptr->vir_types[i++] = V_KNOWLEDGE;
269 p_ptr->vir_types[i++] = V_ENLIGHTEN;
270 p_ptr->vir_types[i++] = V_CHANCE;
273 p_ptr->vir_types[i++] = V_CHANCE;
275 case CLASS_BLUE_MAGE:
276 p_ptr->vir_types[i++] = V_CHANCE;
277 p_ptr->vir_types[i++] = V_KNOWLEDGE;
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;
284 case CLASS_MAGIC_EATER:
285 p_ptr->vir_types[i++] = V_ENCHANT;
286 p_ptr->vir_types[i++] = V_KNOWLEDGE;
289 p_ptr->vir_types[i++] = V_HARMONY;
290 p_ptr->vir_types[i++] = V_COMPASSION;
293 p_ptr->vir_types[i++] = V_VALOUR;
294 p_ptr->vir_types[i++] = V_HARMONY;
296 case CLASS_BERSERKER:
297 p_ptr->vir_types[i++] = V_VALOUR;
298 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
301 p_ptr->vir_types[i++] = V_HONOUR;
302 p_ptr->vir_types[i++] = V_KNOWLEDGE;
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;
312 /* Get one virtue based on race */
313 switch (p_ptr->prace)
315 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
316 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
318 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
319 p_ptr->vir_types[i++] = V_NATURE;
321 case RACE_HOBBIT: case RACE_HALF_OGRE:
322 p_ptr->vir_types[i++] = V_TEMPERANCE;
324 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
325 p_ptr->vir_types[i++] = V_DILIGENCE;
327 case RACE_GNOME: case RACE_CYCLOPS:
328 p_ptr->vir_types[i++] = V_KNOWLEDGE;
330 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
331 p_ptr->vir_types[i++] = V_HONOUR;
333 case RACE_HALF_TROLL: case RACE_BARBARIAN:
334 p_ptr->vir_types[i++] = V_VALOUR;
336 case RACE_HIGH_ELF: case RACE_KUTAR:
337 p_ptr->vir_types[i++] = V_VITALITY;
339 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
340 p_ptr->vir_types[i++] = V_JUSTICE;
342 case RACE_HALF_TITAN:
343 p_ptr->vir_types[i++] = V_HARMONY;
346 p_ptr->vir_types[i++] = V_SACRIFICE;
348 case RACE_MIND_FLAYER:
349 p_ptr->vir_types[i++] = V_ENLIGHTEN;
351 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
352 p_ptr->vir_types[i++] = V_ENCHANT;
355 p_ptr->vir_types[i++] = V_PATIENCE;
358 p_ptr->vir_types[i++] = V_FAITH;
360 case RACE_ZOMBIE: case RACE_SKELETON:
361 case RACE_VAMPIRE: case RACE_SPECTRE:
362 p_ptr->vir_types[i++] = V_UNLIFE;
365 p_ptr->vir_types[i++] = V_CHANCE;
369 /* Get a virtue for realms */
372 tmp_vir = get_realm_virtues(p_ptr->realm1);
373 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
377 tmp_vir = get_realm_virtues(p_ptr->realm2);
378 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
381 /* Eliminate doubles */
382 for (i = 0; i < 8; i++)
384 for (j = i + 1; j < 8; j++)
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;
391 /* Fill in the blanks */
392 for (i = 0; i < 8; i++)
394 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
398 void chg_virtue(int virtue, int amount)
402 for (i = 0; i < 8; i++)
404 if (p_ptr->vir_types[i] == virtue)
408 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
410 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
413 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
415 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
418 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
420 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
423 if (amount + p_ptr->virtues[i] > 125)
424 p_ptr->virtues[i] = 125;
426 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
430 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
432 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
435 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
437 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
440 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
442 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
445 if (amount + p_ptr->virtues[i] < -125)
446 p_ptr->virtues[i] = -125;
448 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
450 p_ptr->update |= (PU_BONUS);
456 void set_virtue(int virtue, int amount)
460 for (i = 0; i < 8; i++)
462 if (p_ptr->vir_types[i] == virtue)
464 p_ptr->virtues[i] = amount;
470 void dump_virtues(FILE *OutFile)
474 if (!OutFile) return;
476 for (v_nr = 0; v_nr < 8; v_nr++)
479 int tester = p_ptr->virtues[v_nr];
481 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
483 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
485 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
487 fprintf(OutFile, "Oops. No info about %s.", v_name);
490 else if (tester < -100)
492 fprintf(OutFile, "[%s]¤ÎÂжË",
494 fprintf(OutFile, "You are the polar opposite of %s.",
498 else if (tester < -80)
500 fprintf(OutFile, "[%s]¤ÎÂçŨ",
502 fprintf(OutFile, "You are an arch-enemy of %s.",
506 else if (tester < -60)
508 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
510 fprintf(OutFile, "You are a bitter enemy of %s.",
514 else if (tester < -40)
516 fprintf(OutFile, "[%s]¤ÎŨ",
518 fprintf(OutFile, "You are an enemy of %s.",
522 else if (tester < -20)
524 fprintf(OutFile, "[%s]¤Îºá¼Ô",
526 fprintf(OutFile, "You have sinned against %s.",
532 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
534 fprintf(OutFile, "You have strayed from the path of %s.",
538 else if (tester == 0)
540 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
542 fprintf(OutFile,"You are neutral to %s.",
546 else if (tester < 20)
548 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
550 fprintf(OutFile,"You are somewhat virtuous in %s.",
554 else if (tester < 40)
556 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
558 fprintf(OutFile,"You are virtuous in %s.",
562 else if (tester < 60)
564 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
566 fprintf(OutFile,"You are very virtuous in %s.",
570 else if (tester < 80)
572 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
574 fprintf(OutFile,"You are a champion of %s.",
578 else if (tester < 100)
580 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
582 fprintf(OutFile,"You are a great champion of %s.",
588 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
590 fprintf(OutFile,"You are the living embodiment of %s.",
595 fprintf(OutFile, "\n");