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;
189 /* Select virtues & reset values for a new character */
191 void get_virtues(void)
197 for (i = 0; i < 8; i++)
199 p_ptr->virtues[i] = 0;
200 p_ptr->vir_types[i] = 0;
205 /* Get pre-defined types */
206 /* 1 or more virtues based on class */
207 switch (p_ptr->pclass)
211 p_ptr->vir_types[i++] = V_VALOUR;
212 p_ptr->vir_types[i++] = V_HONOUR;
215 p_ptr->vir_types[i++] = V_KNOWLEDGE;
216 p_ptr->vir_types[i++] = V_ENCHANT;
219 p_ptr->vir_types[i++] = V_FAITH;
220 p_ptr->vir_types[i++] = V_TEMPERANCE;
223 p_ptr->vir_types[i++] = V_HONOUR;
227 p_ptr->vir_types[i++] = V_NATURE;
228 p_ptr->vir_types[i++] = V_TEMPERANCE;
231 p_ptr->vir_types[i++] = V_JUSTICE;
232 p_ptr->vir_types[i++] = V_VALOUR;
233 p_ptr->vir_types[i++] = V_HONOUR;
234 p_ptr->vir_types[i++] = V_FAITH;
236 case CLASS_WARRIOR_MAGE:
238 p_ptr->vir_types[i++] = V_ENCHANT;
239 p_ptr->vir_types[i++] = V_VALOUR;
241 case CLASS_CHAOS_WARRIOR:
242 p_ptr->vir_types[i++] = V_CHANCE;
243 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
246 case CLASS_FORCETRAINER:
247 p_ptr->vir_types[i++] = V_FAITH;
248 p_ptr->vir_types[i++] = V_HARMONY;
249 p_ptr->vir_types[i++] = V_TEMPERANCE;
250 p_ptr->vir_types[i++] = V_PATIENCE;
252 case CLASS_MINDCRAFTER:
253 case CLASS_MIRROR_MASTER:
254 p_ptr->vir_types[i++] = V_HARMONY;
255 p_ptr->vir_types[i++] = V_ENLIGHTEN;
256 p_ptr->vir_types[i++] = V_PATIENCE;
258 case CLASS_HIGH_MAGE:
260 p_ptr->vir_types[i++] = V_ENLIGHTEN;
261 p_ptr->vir_types[i++] = V_ENCHANT;
262 p_ptr->vir_types[i++] = V_KNOWLEDGE;
265 p_ptr->vir_types[i++] = V_ENLIGHTEN;
266 p_ptr->vir_types[i++] = V_CHANCE;
269 p_ptr->vir_types[i++] = V_CHANCE;
271 case CLASS_BLUE_MAGE:
272 p_ptr->vir_types[i++] = V_CHANCE;
273 p_ptr->vir_types[i++] = V_KNOWLEDGE;
275 case CLASS_BEASTMASTER:
276 p_ptr->vir_types[i++] = V_NATURE;
277 p_ptr->vir_types[i++] = V_CHANCE;
278 p_ptr->vir_types[i++] = V_VITALITY;
280 case CLASS_MAGIC_EATER:
281 p_ptr->vir_types[i++] = V_ENCHANT;
282 p_ptr->vir_types[i++] = V_KNOWLEDGE;
285 p_ptr->vir_types[i++] = V_HARMONY;
286 p_ptr->vir_types[i++] = V_COMPASSION;
289 p_ptr->vir_types[i++] = V_VALOUR;
290 p_ptr->vir_types[i++] = V_HARMONY;
292 case CLASS_BERSERKER:
293 p_ptr->vir_types[i++] = V_VALOUR;
294 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
297 p_ptr->vir_types[i++] = V_HONOUR;
298 p_ptr->vir_types[i++] = V_KNOWLEDGE;
301 p_ptr->vir_types[i++] = V_PATIENCE;
302 p_ptr->vir_types[i++] = V_KNOWLEDGE;
303 p_ptr->vir_types[i++] = V_FAITH;
304 p_ptr->vir_types[i++] = V_UNLIFE;
308 /* Get one virtue based on race */
309 switch (p_ptr->prace)
311 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
312 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
314 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
315 p_ptr->vir_types[i++] = V_NATURE;
317 case RACE_HOBBIT: case RACE_HALF_OGRE:
318 p_ptr->vir_types[i++] = V_TEMPERANCE;
320 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
321 p_ptr->vir_types[i++] = V_DILIGENCE;
323 case RACE_GNOME: case RACE_CYCLOPS:
324 p_ptr->vir_types[i++] = V_KNOWLEDGE;
326 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
327 p_ptr->vir_types[i++] = V_HONOUR;
329 case RACE_HALF_TROLL: case RACE_BARBARIAN:
330 p_ptr->vir_types[i++] = V_VALOUR;
332 case RACE_HIGH_ELF: case RACE_KUTA:
333 p_ptr->vir_types[i++] = V_VITALITY;
335 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
336 p_ptr->vir_types[i++] = V_JUSTICE;
338 case RACE_HALF_TITAN:
339 p_ptr->vir_types[i++] = V_HARMONY;
342 p_ptr->vir_types[i++] = V_SACRIFICE;
344 case RACE_MIND_FLAYER:
345 p_ptr->vir_types[i++] = V_ENLIGHTEN;
347 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
348 p_ptr->vir_types[i++] = V_ENCHANT;
351 p_ptr->vir_types[i++] = V_PATIENCE;
354 p_ptr->vir_types[i++] = V_FAITH;
356 case RACE_ZOMBIE: case RACE_SKELETON:
357 case RACE_VAMPIRE: case RACE_SPECTRE:
358 p_ptr->vir_types[i++] = V_UNLIFE;
361 p_ptr->vir_types[i++] = V_CHANCE;
365 /* Get a virtue for realms */
368 tmp_vir = get_realm_virtues(p_ptr->realm1);
369 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
373 tmp_vir = get_realm_virtues(p_ptr->realm2);
374 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
377 /* Eliminate doubles */
378 for (i = 0; i < 8; i++)
380 for (j = i + 1; j < 8; j++)
382 if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
383 p_ptr->vir_types[j] = 0;
387 /* Fill in the blanks */
388 for (i = 0; i < 8; i++)
390 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
394 void chg_virtue(int virtue, int amount)
398 for (i = 0; i < 8; i++)
400 if (p_ptr->vir_types[i] == virtue)
404 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
406 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
409 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
411 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
414 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
416 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
419 if (amount + p_ptr->virtues[i] > 125)
420 p_ptr->virtues[i] = 125;
422 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
426 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
428 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
431 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
433 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
436 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
438 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
441 if (amount + p_ptr->virtues[i] < -125)
442 p_ptr->virtues[i] = -125;
444 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
446 p_ptr->update |= (PU_BONUS);
452 void set_virtue(int virtue, int amount)
456 for (i = 0; i < 8; i++)
458 if (p_ptr->vir_types[i] == virtue)
460 p_ptr->virtues[i] = amount;
466 void dump_virtues(FILE *OutFile)
470 if (!OutFile) return;
472 for (v_nr = 0; v_nr < 8; v_nr++)
475 int tester = p_ptr->virtues[v_nr];
477 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
479 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
481 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
483 fprintf(OutFile, "Oops. No info about %s.", v_name);
486 else if (tester < -100)
488 fprintf(OutFile, "[%s]¤ÎÂжË",
490 fprintf(OutFile, "You are the polar opposite of %s.",
494 else if (tester < -80)
496 fprintf(OutFile, "[%s]¤ÎÂçŨ",
498 fprintf(OutFile, "You are an arch-enemy of %s.",
502 else if (tester < -60)
504 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
506 fprintf(OutFile, "You are a bitter enemy of %s.",
510 else if (tester < -40)
512 fprintf(OutFile, "[%s]¤ÎŨ",
514 fprintf(OutFile, "You are an enemy of %s.",
518 else if (tester < -20)
520 fprintf(OutFile, "[%s]¤Îºá¼Ô",
522 fprintf(OutFile, "You have sinned against %s.",
528 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
530 fprintf(OutFile, "You have strayed from the path of %s.",
534 else if (tester == 0)
536 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
538 fprintf(OutFile,"You are neutral to %s.",
542 else if (tester < 20)
544 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
546 fprintf(OutFile,"You are somewhat virtuous in %s.",
550 else if (tester < 40)
552 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
554 fprintf(OutFile,"You are virtuous in %s.",
558 else if (tester < 60)
560 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
562 fprintf(OutFile,"You are very virtuous in %s.",
566 else if (tester < 80)
568 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
570 fprintf(OutFile,"You are a champion of %s.",
574 else if (tester < 100)
576 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
578 fprintf(OutFile,"You are a great champion of %s.",
584 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
586 fprintf(OutFile,"You are the living embodiment of %s.",
591 fprintf(OutFile, "\n");