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;
224 p_ptr->vir_types[i++] = V_HONOUR;
228 p_ptr->vir_types[i++] = V_NATURE;
229 p_ptr->vir_types[i++] = V_TEMPERANCE;
232 p_ptr->vir_types[i++] = V_JUSTICE;
233 p_ptr->vir_types[i++] = V_VALOUR;
234 p_ptr->vir_types[i++] = V_HONOUR;
235 p_ptr->vir_types[i++] = V_FAITH;
237 case CLASS_WARRIOR_MAGE:
239 p_ptr->vir_types[i++] = V_ENCHANT;
240 p_ptr->vir_types[i++] = V_VALOUR;
242 case CLASS_CHAOS_WARRIOR:
243 p_ptr->vir_types[i++] = V_CHANCE;
244 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
247 case CLASS_FORCETRAINER:
248 p_ptr->vir_types[i++] = V_FAITH;
249 p_ptr->vir_types[i++] = V_HARMONY;
250 p_ptr->vir_types[i++] = V_TEMPERANCE;
251 p_ptr->vir_types[i++] = V_PATIENCE;
253 case CLASS_MINDCRAFTER:
254 case CLASS_MIRROR_MASTER:
255 p_ptr->vir_types[i++] = V_HARMONY;
256 p_ptr->vir_types[i++] = V_ENLIGHTEN;
257 p_ptr->vir_types[i++] = V_PATIENCE;
259 case CLASS_HIGH_MAGE:
261 p_ptr->vir_types[i++] = V_ENLIGHTEN;
262 p_ptr->vir_types[i++] = V_ENCHANT;
263 p_ptr->vir_types[i++] = V_KNOWLEDGE;
266 p_ptr->vir_types[i++] = V_ENLIGHTEN;
267 p_ptr->vir_types[i++] = V_CHANCE;
270 p_ptr->vir_types[i++] = V_CHANCE;
272 case CLASS_BLUE_MAGE:
273 p_ptr->vir_types[i++] = V_CHANCE;
274 p_ptr->vir_types[i++] = V_KNOWLEDGE;
276 case CLASS_BEASTMASTER:
277 p_ptr->vir_types[i++] = V_NATURE;
278 p_ptr->vir_types[i++] = V_CHANCE;
279 p_ptr->vir_types[i++] = V_VITALITY;
281 case CLASS_MAGIC_EATER:
282 p_ptr->vir_types[i++] = V_ENCHANT;
283 p_ptr->vir_types[i++] = V_KNOWLEDGE;
286 p_ptr->vir_types[i++] = V_HARMONY;
287 p_ptr->vir_types[i++] = V_COMPASSION;
290 p_ptr->vir_types[i++] = V_VALOUR;
291 p_ptr->vir_types[i++] = V_HARMONY;
293 case CLASS_BERSERKER:
294 p_ptr->vir_types[i++] = V_VALOUR;
295 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
298 p_ptr->vir_types[i++] = V_HONOUR;
299 p_ptr->vir_types[i++] = V_KNOWLEDGE;
302 p_ptr->vir_types[i++] = V_PATIENCE;
303 p_ptr->vir_types[i++] = V_KNOWLEDGE;
304 p_ptr->vir_types[i++] = V_FAITH;
305 p_ptr->vir_types[i++] = V_UNLIFE;
309 /* Get one virtue based on race */
310 switch (p_ptr->prace)
312 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
313 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
315 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
316 p_ptr->vir_types[i++] = V_NATURE;
318 case RACE_HOBBIT: case RACE_HALF_OGRE:
319 p_ptr->vir_types[i++] = V_TEMPERANCE;
321 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
322 p_ptr->vir_types[i++] = V_DILIGENCE;
324 case RACE_GNOME: case RACE_CYCLOPS:
325 p_ptr->vir_types[i++] = V_KNOWLEDGE;
327 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
328 p_ptr->vir_types[i++] = V_HONOUR;
330 case RACE_HALF_TROLL: case RACE_BARBARIAN:
331 p_ptr->vir_types[i++] = V_VALOUR;
333 case RACE_HIGH_ELF: case RACE_KUTA:
334 p_ptr->vir_types[i++] = V_VITALITY;
336 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
337 p_ptr->vir_types[i++] = V_JUSTICE;
339 case RACE_HALF_TITAN:
340 p_ptr->vir_types[i++] = V_HARMONY;
343 p_ptr->vir_types[i++] = V_SACRIFICE;
345 case RACE_MIND_FLAYER:
346 p_ptr->vir_types[i++] = V_ENLIGHTEN;
348 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
349 p_ptr->vir_types[i++] = V_ENCHANT;
352 p_ptr->vir_types[i++] = V_PATIENCE;
355 p_ptr->vir_types[i++] = V_FAITH;
357 case RACE_ZOMBIE: case RACE_SKELETON:
358 case RACE_VAMPIRE: case RACE_SPECTRE:
359 p_ptr->vir_types[i++] = V_UNLIFE;
362 p_ptr->vir_types[i++] = V_CHANCE;
366 /* Get a virtue for realms */
369 tmp_vir = get_realm_virtues(p_ptr->realm1);
370 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
374 tmp_vir = get_realm_virtues(p_ptr->realm2);
375 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
378 /* Eliminate doubles */
379 for (i = 0; i < 8; i++)
381 for (j = i + 1; j < 8; j++)
383 if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
384 p_ptr->vir_types[j] = 0;
388 /* Fill in the blanks */
389 for (i = 0; i < 8; i++)
391 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
395 void chg_virtue(int virtue, int amount)
399 for (i = 0; i < 8; i++)
401 if (p_ptr->vir_types[i] == virtue)
405 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
407 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
410 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
412 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
415 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
417 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
420 if (amount + p_ptr->virtues[i] > 125)
421 p_ptr->virtues[i] = 125;
423 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
427 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
429 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
432 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
434 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
437 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
439 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
442 if (amount + p_ptr->virtues[i] < -125)
443 p_ptr->virtues[i] = -125;
445 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
447 p_ptr->update |= (PU_BONUS);
453 void set_virtue(int virtue, int amount)
457 for (i = 0; i < 8; i++)
459 if (p_ptr->vir_types[i] == virtue)
461 p_ptr->virtues[i] = amount;
467 void dump_virtues(FILE *OutFile)
471 if (!OutFile) return;
473 for (v_nr = 0; v_nr < 8; v_nr++)
476 int tester = p_ptr->virtues[v_nr];
478 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
480 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
482 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
484 fprintf(OutFile, "Oops. No info about %s.", v_name);
487 else if (tester < -100)
489 fprintf(OutFile, "[%s]¤ÎÂжË",
491 fprintf(OutFile, "You are the polar opposite of %s.",
495 else if (tester < -80)
497 fprintf(OutFile, "[%s]¤ÎÂçŨ",
499 fprintf(OutFile, "You are an arch-enemy of %s.",
503 else if (tester < -60)
505 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
507 fprintf(OutFile, "You are a bitter enemy of %s.",
511 else if (tester < -40)
513 fprintf(OutFile, "[%s]¤ÎŨ",
515 fprintf(OutFile, "You are an enemy of %s.",
519 else if (tester < -20)
521 fprintf(OutFile, "[%s]¤Îºá¼Ô",
523 fprintf(OutFile, "You have sinned against %s.",
529 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
531 fprintf(OutFile, "You have strayed from the path of %s.",
535 else if (tester == 0)
537 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
539 fprintf(OutFile,"You are neutral to %s.",
543 else if (tester < 20)
545 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
547 fprintf(OutFile,"You are somewhat virtuous in %s.",
551 else if (tester < 40)
553 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
555 fprintf(OutFile,"You are virtuous in %s.",
559 else if (tester < 60)
561 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
563 fprintf(OutFile,"You are very virtuous in %s.",
567 else if (tester < 80)
569 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
571 fprintf(OutFile,"You are a champion of %s.",
575 else if (tester < 100)
577 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
579 fprintf(OutFile,"You are a great champion of %s.",
585 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
587 fprintf(OutFile,"You are the living embodiment of %s.",
592 fprintf(OutFile, "\n");