3 @brief ¥¦¥ë¥Æ¥£¥Þ£´¤ò»²¹Í¤Ë¤·¤¿ÆÁ¤Î¥·¥¹¥Æ¥à¤Î¼ÂÁõ / Enable an Ultima IV style "avatar" game where you try to achieve perfection in various virtues.
10 Copyright (c) 1989 James E. Wilson, Christopher J. Stuart
11 This software may be copied and distributed for educational, research, and
12 not for profit purposes provided that this copyright and statement are
13 included in all such copies.
20 * ÆÁ¤Î̾¾Î / The names of the virtues
22 cptr virtue[MAX_VIRTUE] =
66 bool compare_virtue(int type, int num, int tekitou)
69 if (virtue_number(type))
70 vir = p_ptr->virtues[virtue_number(type) - 1];
77 if (vir > num) return TRUE;
80 if (vir < num) return TRUE;
90 int virtue_number(int type)
95 for (i = 0; i < 8; i++)
97 if (p_ptr->vir_types[i] == type) return i + 1;
106 static void get_random_virtue(int which)
110 /* Randomly choose a type */
111 while (!(type) || virtue_number(type))
113 switch (randint1(29))
115 case 1: case 2: case 3:
118 case 4: case 5: case 6:
121 case 7: case 8: case 9: case 10: case 11: case 12:
124 case 13: case 14: case 15: case 16: case 17:
127 case 18: case 19: case 20: case 21:
136 case 26: case 27: case 28:
146 p_ptr->vir_types[which] = type;
149 static s16b get_realm_virtues(byte realm)
154 if (virtue_number(V_VITALITY)) return V_TEMPERANCE;
155 else return V_VITALITY;
157 if (virtue_number(V_KNOWLEDGE)) return V_ENCHANT;
158 else return V_KNOWLEDGE;
160 if (virtue_number(V_NATURE)) return V_HARMONY;
161 else return V_NATURE;
163 if (virtue_number(V_CHANCE)) return V_INDIVIDUALISM;
164 else return V_CHANCE;
172 if (virtue_number(V_ENCHANT)) return V_INDIVIDUALISM;
173 else return V_ENCHANT;
175 if (virtue_number(V_JUSTICE)) return V_FAITH;
176 else return V_JUSTICE;
178 if (virtue_number(V_JUSTICE)) return V_HONOUR;
179 else return V_JUSTICE;
181 if (virtue_number(V_COMPASSION)) return V_JUSTICE;
182 else return V_COMPASSION;
190 * @brief ºîÀ®Ãæ¤Î¥×¥ì¥¤¥ä¡¼¥¥ã¥é¥¯¥¿¡¼¤ËÆÁ8¼ïÎà¤òÍ¿¤¨¤ë¡£ / Select virtues & reset values for a new character
191 * @details ¿¦¶È¤Ë±þ¤¸¤Æ1¡Á4¼ï¤¬¸ÇÄê¡¢¼ï²¤Ë±þ¤¸¤Æ1¼ïÎबͿ¤¨¤é¤ì¡¢¸å¤Ï½ÅÊ£¤Ê¤¯¥é¥ó¥À¥à¤ËÁªÂò¤µ¤ì¤ë¡£
195 void get_virtues(void)
201 for (i = 0; i < 8; i++)
203 p_ptr->virtues[i] = 0;
204 p_ptr->vir_types[i] = 0;
209 /* Get pre-defined types */
210 /* 1 or more virtues based on class */
211 switch (p_ptr->pclass)
215 p_ptr->vir_types[i++] = V_VALOUR;
216 p_ptr->vir_types[i++] = V_HONOUR;
219 p_ptr->vir_types[i++] = V_KNOWLEDGE;
220 p_ptr->vir_types[i++] = V_ENCHANT;
223 p_ptr->vir_types[i++] = V_FAITH;
224 p_ptr->vir_types[i++] = V_TEMPERANCE;
228 p_ptr->vir_types[i++] = V_HONOUR;
232 p_ptr->vir_types[i++] = V_NATURE;
233 p_ptr->vir_types[i++] = V_TEMPERANCE;
236 p_ptr->vir_types[i++] = V_JUSTICE;
237 p_ptr->vir_types[i++] = V_VALOUR;
238 p_ptr->vir_types[i++] = V_HONOUR;
239 p_ptr->vir_types[i++] = V_FAITH;
241 case CLASS_WARRIOR_MAGE:
243 p_ptr->vir_types[i++] = V_ENCHANT;
244 p_ptr->vir_types[i++] = V_VALOUR;
246 case CLASS_CHAOS_WARRIOR:
247 p_ptr->vir_types[i++] = V_CHANCE;
248 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
251 case CLASS_FORCETRAINER:
252 p_ptr->vir_types[i++] = V_FAITH;
253 p_ptr->vir_types[i++] = V_HARMONY;
254 p_ptr->vir_types[i++] = V_TEMPERANCE;
255 p_ptr->vir_types[i++] = V_PATIENCE;
257 case CLASS_MINDCRAFTER:
258 case CLASS_MIRROR_MASTER:
259 p_ptr->vir_types[i++] = V_HARMONY;
260 p_ptr->vir_types[i++] = V_ENLIGHTEN;
261 p_ptr->vir_types[i++] = V_PATIENCE;
263 case CLASS_HIGH_MAGE:
265 p_ptr->vir_types[i++] = V_ENLIGHTEN;
266 p_ptr->vir_types[i++] = V_ENCHANT;
267 p_ptr->vir_types[i++] = V_KNOWLEDGE;
270 p_ptr->vir_types[i++] = V_ENLIGHTEN;
271 p_ptr->vir_types[i++] = V_CHANCE;
274 p_ptr->vir_types[i++] = V_CHANCE;
276 case CLASS_BLUE_MAGE:
277 p_ptr->vir_types[i++] = V_CHANCE;
278 p_ptr->vir_types[i++] = V_KNOWLEDGE;
280 case CLASS_BEASTMASTER:
281 p_ptr->vir_types[i++] = V_NATURE;
282 p_ptr->vir_types[i++] = V_CHANCE;
283 p_ptr->vir_types[i++] = V_VITALITY;
285 case CLASS_MAGIC_EATER:
286 p_ptr->vir_types[i++] = V_ENCHANT;
287 p_ptr->vir_types[i++] = V_KNOWLEDGE;
290 p_ptr->vir_types[i++] = V_HARMONY;
291 p_ptr->vir_types[i++] = V_COMPASSION;
294 p_ptr->vir_types[i++] = V_VALOUR;
295 p_ptr->vir_types[i++] = V_HARMONY;
297 case CLASS_BERSERKER:
298 p_ptr->vir_types[i++] = V_VALOUR;
299 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
302 p_ptr->vir_types[i++] = V_HONOUR;
303 p_ptr->vir_types[i++] = V_KNOWLEDGE;
306 p_ptr->vir_types[i++] = V_PATIENCE;
307 p_ptr->vir_types[i++] = V_KNOWLEDGE;
308 p_ptr->vir_types[i++] = V_FAITH;
309 p_ptr->vir_types[i++] = V_UNLIFE;
313 /* Get one virtue based on race */
314 switch (p_ptr->prace)
316 case RACE_HUMAN: case RACE_HALF_ELF: case RACE_DUNADAN:
317 p_ptr->vir_types[i++] = V_INDIVIDUALISM;
319 case RACE_ELF: case RACE_SPRITE: case RACE_ENT:
320 p_ptr->vir_types[i++] = V_NATURE;
322 case RACE_HOBBIT: case RACE_HALF_OGRE:
323 p_ptr->vir_types[i++] = V_TEMPERANCE;
325 case RACE_DWARF: case RACE_KLACKON: case RACE_ANDROID:
326 p_ptr->vir_types[i++] = V_DILIGENCE;
328 case RACE_GNOME: case RACE_CYCLOPS:
329 p_ptr->vir_types[i++] = V_KNOWLEDGE;
331 case RACE_HALF_ORC: case RACE_AMBERITE: case RACE_KOBOLD:
332 p_ptr->vir_types[i++] = V_HONOUR;
334 case RACE_HALF_TROLL: case RACE_BARBARIAN:
335 p_ptr->vir_types[i++] = V_VALOUR;
337 case RACE_HIGH_ELF: case RACE_KUTAR:
338 p_ptr->vir_types[i++] = V_VITALITY;
340 case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
341 p_ptr->vir_types[i++] = V_JUSTICE;
343 case RACE_HALF_TITAN:
344 p_ptr->vir_types[i++] = V_HARMONY;
347 p_ptr->vir_types[i++] = V_SACRIFICE;
349 case RACE_MIND_FLAYER:
350 p_ptr->vir_types[i++] = V_ENLIGHTEN;
352 case RACE_DARK_ELF: case RACE_DRACONIAN: case RACE_S_FAIRY:
353 p_ptr->vir_types[i++] = V_ENCHANT;
356 p_ptr->vir_types[i++] = V_PATIENCE;
359 p_ptr->vir_types[i++] = V_FAITH;
361 case RACE_ZOMBIE: case RACE_SKELETON:
362 case RACE_VAMPIRE: case RACE_SPECTRE:
363 p_ptr->vir_types[i++] = V_UNLIFE;
366 p_ptr->vir_types[i++] = V_CHANCE;
370 /* Get a virtue for realms */
373 tmp_vir = get_realm_virtues(p_ptr->realm1);
374 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
378 tmp_vir = get_realm_virtues(p_ptr->realm2);
379 if (tmp_vir) p_ptr->vir_types[i++] = tmp_vir;
382 /* Eliminate doubles */
383 for (i = 0; i < 8; i++)
385 for (j = i + 1; j < 8; j++)
387 if ((p_ptr->vir_types[j] != 0) && (p_ptr->vir_types[j] == p_ptr->vir_types[i]))
388 p_ptr->vir_types[j] = 0;
392 /* Fill in the blanks */
393 for (i = 0; i < 8; i++)
395 if (p_ptr->vir_types[i] == 0) get_random_virtue(i);
399 void chg_virtue(int virtue, int amount)
403 for (i = 0; i < 8; i++)
405 if (p_ptr->vir_types[i] == virtue)
409 if ((amount + p_ptr->virtues[i] > 50) && one_in_(2))
411 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 50);
414 if ((amount + p_ptr->virtues[i] > 80) && one_in_(2))
416 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 80);
419 if ((amount + p_ptr->virtues[i] > 100) && one_in_(2))
421 p_ptr->virtues[i] = MAX(p_ptr->virtues[i], 100);
424 if (amount + p_ptr->virtues[i] > 125)
425 p_ptr->virtues[i] = 125;
427 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
431 if ((amount + p_ptr->virtues[i] < -50) && one_in_(2))
433 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -50);
436 if ((amount + p_ptr->virtues[i] < -80) && one_in_(2))
438 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -80);
441 if ((amount + p_ptr->virtues[i] < -100) && one_in_(2))
443 p_ptr->virtues[i] = MIN(p_ptr->virtues[i], -100);
446 if (amount + p_ptr->virtues[i] < -125)
447 p_ptr->virtues[i] = -125;
449 p_ptr->virtues[i] = p_ptr->virtues[i] + amount;
451 p_ptr->update |= (PU_BONUS);
457 void set_virtue(int virtue, int amount)
461 for (i = 0; i < 8; i++)
463 if (p_ptr->vir_types[i] == virtue)
465 p_ptr->virtues[i] = amount;
471 void dump_virtues(FILE *OutFile)
475 if (!OutFile) return;
477 for (v_nr = 0; v_nr < 8; v_nr++)
480 int tester = p_ptr->virtues[v_nr];
482 strcpy(v_name, virtue[(p_ptr->vir_types[v_nr])-1]);
484 if (p_ptr->vir_types[v_nr] == 0 || p_ptr->vir_types[v_nr] > MAX_VIRTUE)
486 fprintf(OutFile, "¤ª¤Ã¤È¡£%s¤Î¾ðÊó¤Ê¤·¡£", v_name);
488 fprintf(OutFile, "Oops. No info about %s.", v_name);
491 else if (tester < -100)
493 fprintf(OutFile, "[%s]¤ÎÂжË",
495 fprintf(OutFile, "You are the polar opposite of %s.",
499 else if (tester < -80)
501 fprintf(OutFile, "[%s]¤ÎÂçŨ",
503 fprintf(OutFile, "You are an arch-enemy of %s.",
507 else if (tester < -60)
509 fprintf(OutFile, "[%s]¤Î¶¯Å¨",
511 fprintf(OutFile, "You are a bitter enemy of %s.",
515 else if (tester < -40)
517 fprintf(OutFile, "[%s]¤ÎŨ",
519 fprintf(OutFile, "You are an enemy of %s.",
523 else if (tester < -20)
525 fprintf(OutFile, "[%s]¤Îºá¼Ô",
527 fprintf(OutFile, "You have sinned against %s.",
533 fprintf(OutFile, "[%s]¤ÎÌÂÆ»¼Ô",
535 fprintf(OutFile, "You have strayed from the path of %s.",
539 else if (tester == 0)
541 fprintf(OutFile,"[%s]¤ÎÃæΩ¼Ô",
543 fprintf(OutFile,"You are neutral to %s.",
547 else if (tester < 20)
549 fprintf(OutFile,"[%s]¤Î¾®ÆÁ¼Ô",
551 fprintf(OutFile,"You are somewhat virtuous in %s.",
555 else if (tester < 40)
557 fprintf(OutFile,"[%s]¤ÎÃæÆÁ¼Ô",
559 fprintf(OutFile,"You are virtuous in %s.",
563 else if (tester < 60)
565 fprintf(OutFile,"[%s]¤Î¹âÆÁ¼Ô",
567 fprintf(OutFile,"You are very virtuous in %s.",
571 else if (tester < 80)
573 fprintf(OutFile,"[%s]¤ÎÇƼÔ",
575 fprintf(OutFile,"You are a champion of %s.",
579 else if (tester < 100)
581 fprintf(OutFile,"[%s]¤Î°ÎÂç¤ÊÇƼÔ",
583 fprintf(OutFile,"You are a great champion of %s.",
589 fprintf(OutFile,"[%s]¤Î¶ñ¸½¼Ô",
591 fprintf(OutFile,"You are the living embodiment of %s.",
596 fprintf(OutFile, "\n");