D:$A huge dragon whose scales shimmer in myriad hues.
D:巨大なドラゴンで、その鱗は様々な色に輝いている。
-N:1199:ã\82°ã\83¬ã\83¼ã\82¿ã\83¼・万色ワイアーム
+N:1199:ã\82°ã\83¬ã\83¼ã\83\88・万色ワイアーム
E:Great Wyrm of Many Colours
G:D:v
I:125:65d100:40:170:255
F:DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_GREAT | CAN_FLY | EVIL
F:DROP_GOOD | CAN_FLY | IM_COLD | IM_FIRE | IM_ELEC | RES_SOUN
F:BASH_DOOR | MOVE_BODY | DRAGON | NO_CONF | NO_SLEEP | NO_STUN | RIDING
-S:1_IN_3 | SCARE | BLINK | S_HI_DRAGON | ANIM_DEAD
+S:1_IN_3 | SCARE | BLINK | S_KIN | ANIM_DEAD
S:BR_ELEC | BR_FIRE | BR_COLD | BR_SOUN | BR_WALL | BR_MANA
D:$The first dragon created in one of the plural worlds.
D:$ It eats people's souls, destroys everything and destroys all dimensions.
D:ミラークの堕落した願いに賛同している者共の一人だ。
D:彼らはあなたをミラークの崇高な意志に反する者として執拗に追っている。
-# 1/4ずつの確率で信者どちらか、1/4ずつでdまたはDを召喚
N:1212:原初の竜殺し『ミラーク』
E:Miraak, the first Dragon-soul Taker
G:p:v
-I:125:80d80:45:125:10
-W:66:3:0:36000:0:0
+I:125:100d90:45:125:10
+W:73:3:0:36000:0:0
B:SLASH:UN_BONUS:13d11
B:HIT:UN_POWER:13d11
B:SLASH:EXP_VAMP:13d11
F:UNIQUE | FORCE_MAXHP | HUMAN | MALE | EVIL | DROP_SKELETON
F:POWERFUL | SMART | IM_FIRE | IM_COLD | IM_ELEC | RES_CHAO
F:NO_SLEEP | NO_CONF | BASH_DOOR | KILL_BODY | PASS_WALL
-S:1_IN_3 | TELE_TO | TPORT | HEAL | S_KIN | BA_ELEC | BA_FIRE | BA_COLD | BR_SOUN
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT
+S:1_IN_3 | TELE_TO | TPORT | HEAL | S_KIN | BA_ELEC | BA_FIRE | BA_COLD
+S:BR_SOUN | BR_DISI
D:$This man can completely absorb the soul of dragons
D:$ without giving him time to save the power to revive in Mordor nor Oblivion.
D:$ Will there ever be a dragon who can not hang its head to him?
return FALSE;
msg_print(_("放射性廃棄物のブレスを吐いた。", "You breathe toxic waste."));
- bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_NUKE), bmc_ptr->plev, DAM_ROLL);
+ bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, MS_BR_NUKE, bmc_ptr->plev, DAM_ROLL);
fire_breath(caster_ptr, GF_NUKE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
return TRUE;
}
return FALSE;
msg_print(_("分解のブレスを吐いた。", "You breathe disintegration."));
- bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, (MS_BR_DISI), bmc_ptr->plev, DAM_ROLL);
+ bmc_ptr->damage = monspell_bluemage_damage(caster_ptr, MS_BR_DISI, bmc_ptr->plev, DAM_ROLL);
fire_breath(caster_ptr, GF_DISINTEGRATE, bmc_ptr->dir, bmc_ptr->damage, (bmc_ptr->plev > 40 ? 3 : 2));
return TRUE;
}
summon_specific_who = who;
summon_specific_type = type;
- summon_unique_okay = (mode & PM_ALLOW_UNIQUE) ? TRUE : FALSE;
+ summon_unique_okay = (mode & PM_ALLOW_UNIQUE) != 0;
get_mon_num_prep(player_ptr, summon_specific_okay, get_monster_hook2(player_ptr, y, x));
MONRACE_IDX r_idx = get_mon_num(player_ptr, (floor_ptr->dun_level + lev) / 2 + 5, 0);
MON_BRONZE_LICH = 1180,
MON_ULT_BEHOLDER = 1185,
MON_G_TITAN = 1187,
+ MON_WYRM_COLOURS = 1198,
+ MON_ALDUIN = 1209,
+ MON_FOLLOWER_WARRIOR = 1210,
+ MON_FOLLOWER_MAGE = 1211,
+ MON_MIRAAK = 1212,
} monster_race_type;
case MON_DEMON_SLAYER_SENIOR:
count += summon_DEMON_SLAYER(target_ptr, y, x, m_idx);
break;
+ case MON_ALDUIN:
+ count += summon_HIGHEST_DRAGON(target_ptr, y, x, m_idx);
+ break;
+ case MON_MIRAAK:
+ count += summon_APOCRYPHA(target_ptr, y, x, m_idx);
+ break;
default:
count += summon_Kin(target_ptr, y, x, rlev, m_idx);
break;
msg_print(NULL);
return count;
}
+
+MONSTER_NUMBER summon_APOCRYPHA(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 4 + randint1(4);
+ summon_type followers = next_bool() ? SUMMON_APOCRYPHA_FOLLOWERS : SUMMON_APOCRYPHA_DRAGONS;
+ for (int k = 0; k < num; k++)
+ count += summon_specific(target_ptr, m_idx, y, x, 200, followers, PM_ALLOW_UNIQUE);
+
+ return count;
+}
+
+MONSTER_NUMBER summon_HIGHEST_DRAGON(player_type* target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx)
+{
+ int count = 0;
+ int num = 4 + randint1(4);
+ for (int k = 0; k < num; k++)
+ count += summon_specific(target_ptr, m_idx, y, x, 100, SUMMON_APOCRYPHA_DRAGONS, PM_ALLOW_UNIQUE);
+
+ return count;
+}
MONSTER_NUMBER summon_MOAI(player_type *target_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
MONSTER_NUMBER summon_DEMON_SLAYER(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_APOCRYPHA(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_HIGHEST_DRAGON(player_type *target_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
monster_race *r_ptr = &r_info[r_idx];
bool is_match = FALSE;
switch (summon_specific_type) {
- case SUMMON_ANT: {
+ case SUMMON_ANT:
is_match = r_ptr->d_char == 'a';
break;
- }
- case SUMMON_SPIDER: {
+ case SUMMON_SPIDER:
is_match = r_ptr->d_char == 'S';
break;
- }
- case SUMMON_HOUND: {
- is_match = ((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z'));
+ case SUMMON_HOUND:
+ is_match = (r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z');
break;
- }
- case SUMMON_HYDRA: {
+ case SUMMON_HYDRA:
is_match = r_ptr->d_char == 'M';
break;
- }
- case SUMMON_ANGEL: {
+ case SUMMON_ANGEL:
is_match = (r_ptr->d_char == 'A') && (((r_ptr->flags3 & RF3_EVIL) != 0) || ((r_ptr->flags3 & RF3_GOOD) != 0));
break;
- }
- case SUMMON_DEMON: {
+ case SUMMON_DEMON:
is_match = (r_ptr->flags3 & RF3_DEMON) != 0;
break;
- }
- case SUMMON_UNDEAD: {
+ case SUMMON_UNDEAD:
is_match = (r_ptr->flags3 & RF3_UNDEAD) != 0;
break;
- }
- case SUMMON_DRAGON: {
+ case SUMMON_DRAGON:
is_match = (r_ptr->flags3 & RF3_DRAGON) != 0;
break;
- }
- case SUMMON_HI_UNDEAD: {
+ case SUMMON_HI_UNDEAD:
is_match = (r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W');
break;
- }
- case SUMMON_HI_DRAGON: {
+ case SUMMON_HI_DRAGON:
is_match = (r_ptr->d_char == 'D');
break;
- }
- case SUMMON_HI_DEMON: {
+ case SUMMON_HI_DEMON:
is_match = ((r_ptr->d_char == 'U') || (r_ptr->d_char == 'H') || (r_ptr->d_char == 'B')) && ((r_ptr->flags3 & RF3_DEMON) != 0);
break;
- }
- case SUMMON_AMBERITES: {
+ case SUMMON_AMBERITES:
is_match = (r_ptr->flags3 & RF3_AMBERITE) != 0;
break;
- }
- case SUMMON_UNIQUE: {
+ case SUMMON_UNIQUE:
is_match = (r_ptr->flags1 & RF1_UNIQUE) != 0;
break;
- }
- case SUMMON_MOLD: {
+ case SUMMON_MOLD:
is_match = r_ptr->d_char == 'm';
break;
- }
- case SUMMON_BAT: {
+ case SUMMON_BAT:
is_match = r_ptr->d_char == 'b';
break;
- }
- case SUMMON_QUYLTHULG: {
+ case SUMMON_QUYLTHULG:
is_match = r_ptr->d_char == 'Q';
break;
- }
- case SUMMON_COIN_MIMIC: {
+ case SUMMON_COIN_MIMIC:
is_match = r_ptr->d_char == '$';
break;
- }
- case SUMMON_MIMIC: {
+ case SUMMON_MIMIC:
is_match = ((r_ptr->d_char == '!') || (r_ptr->d_char == '?') || (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|'));
break;
- }
- case SUMMON_GOLEM: {
+ case SUMMON_GOLEM:
is_match = (r_ptr->d_char == 'g');
break;
- }
- case SUMMON_CYBER: {
+ case SUMMON_CYBER:
is_match = (r_ptr->d_char == 'U') && ((r_ptr->flags4 & RF4_ROCKET) != 0);
break;
- }
case SUMMON_KIN: {
SYMBOL_CODE summon_kin_type = summoner_idx > 0 ? r_info[summoner_idx].d_char : get_summon_symbol_from_player(player_ptr);
is_match = (r_ptr->d_char == summon_kin_type) && (r_idx != MON_HAGURE);
break;
}
- case SUMMON_DAWN: {
+ case SUMMON_DAWN:
is_match = r_idx == MON_DAWN;
break;
- }
- case SUMMON_ANIMAL: {
+ case SUMMON_ANIMAL:
is_match = (r_ptr->flags3 & RF3_ANIMAL) != 0;
break;
- }
- case SUMMON_ANIMAL_RANGER: {
+ case SUMMON_ANIMAL_RANGER:
is_match = ((r_ptr->flags3 & (RF3_ANIMAL)) && (angband_strchr("abcflqrwBCHIJKMRS", r_ptr->d_char)) && !(r_ptr->flags3 & (RF3_DRAGON))
&& !(r_ptr->flags3 & (RF3_EVIL)) && !(r_ptr->flags3 & (RF3_UNDEAD)) && !(r_ptr->flags3 & (RF3_DEMON)) && !(r_ptr->flags2 & (RF2_MULTIPLY))
&& !(r_ptr->flags4 || r_ptr->a_ability_flags1 || r_ptr->a_ability_flags2));
break;
- }
- case SUMMON_SMALL_MOAI: {
+ case SUMMON_SMALL_MOAI:
is_match = r_idx == MON_SMALL_MOAI;
break;
- }
- case SUMMON_HI_DRAGON_LIVING: {
+ case SUMMON_HI_DRAGON_LIVING:
is_match = ((r_ptr->d_char == 'D') && monster_living(r_idx));
break;
- }
- case SUMMON_LIVING: {
+ case SUMMON_LIVING:
is_match = monster_living(r_idx);
break;
- }
- case SUMMON_PHANTOM: {
+ case SUMMON_PHANTOM:
is_match = (r_idx == MON_PHANTOM_B) || (r_idx == MON_PHANTOM_W);
break;
- }
- case SUMMON_BLUE_HORROR: {
+ case SUMMON_BLUE_HORROR:
is_match = r_idx == MON_BLUE_HORROR;
break;
- }
- case SUMMON_TOTEM_MOAI: {
+ case SUMMON_TOTEM_MOAI:
is_match = r_idx == MON_TOTEM_MOAI;
break;
- }
- case SUMMON_ELEMENTAL: {
+ case SUMMON_ELEMENTAL:
is_match = r_ptr->d_char == 'E';
break;
- }
- case SUMMON_VORTEX: {
+ case SUMMON_VORTEX:
is_match = r_ptr->d_char == 'v';
break;
- }
- case SUMMON_HYBRID: {
+ case SUMMON_HYBRID:
is_match = r_ptr->d_char == 'H';
break;
- }
- case SUMMON_BIRD: {
+ case SUMMON_BIRD:
is_match = r_ptr->d_char == 'B';
break;
- }
- case SUMMON_KAMIKAZE: {
+ case SUMMON_KAMIKAZE:
for (int i = 0; i < 4; i++)
if (r_ptr->blow[i].method == RBM_EXPLODE)
is_match = TRUE;
break;
- }
- case SUMMON_KAMIKAZE_LIVING: {
+ case SUMMON_KAMIKAZE_LIVING:
for (int i = 0; i < 4; i++)
if (r_ptr->blow[i].method == RBM_EXPLODE)
is_match = TRUE;
is_match &= monster_living(r_idx);
break;
- }
- case SUMMON_MANES: {
+ case SUMMON_MANES:
is_match = r_idx == MON_MANES;
break;
- }
- case SUMMON_LOUSE: {
+ case SUMMON_LOUSE:
is_match = r_idx == MON_LOUSE;
break;
- }
- case SUMMON_GUARDIANS: {
+ case SUMMON_GUARDIANS:
is_match = (r_ptr->flags7 & RF7_GUARDIAN) != 0;
break;
- }
- case SUMMON_KNIGHTS: {
+ case SUMMON_KNIGHTS:
is_match = ((r_idx == MON_NOV_PALADIN) || (r_idx == MON_NOV_PALADIN_G) || (r_idx == MON_PALADIN) || (r_idx == MON_W_KNIGHT)
|| (r_idx == MON_ULTRA_PALADIN) || (r_idx == MON_KNI_TEMPLAR));
break;
- }
- case SUMMON_EAGLES: {
+ case SUMMON_EAGLES:
is_match = (r_ptr->d_char == 'B') && ((r_ptr->flags8 & RF8_WILD_MOUNTAIN) != 0) && ((r_ptr->flags8 & RF8_WILD_ONLY) != 0);
break;
- }
- case SUMMON_PIRANHAS: {
+ case SUMMON_PIRANHAS:
is_match = r_idx == MON_PIRANHA;
break;
- }
- case SUMMON_ARMAGE_GOOD: {
+ case SUMMON_ARMAGE_GOOD:
is_match = (r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_GOOD) != 0);
break;
- }
- case SUMMON_ARMAGE_EVIL: {
+ case SUMMON_ARMAGE_EVIL:
is_match = ((r_ptr->flags3 & RF3_DEMON) != 0) || ((r_ptr->d_char == 'A') && ((r_ptr->flags3 & RF3_EVIL) != 0));
break;
- }
+ case SUMMON_APOCRYPHA_FOLLOWERS:
+ is_match = (r_idx == MON_FOLLOWER_WARRIOR) || (r_idx == MON_FOLLOWER_MAGE);
+ break;
+ case SUMMON_APOCRYPHA_DRAGONS:
+ is_match = (r_ptr->d_char == 'D') && (r_ptr->level >= 60) && (r_idx != MON_WYRM_COLOURS) && (r_idx != MON_ALDUIN);
+ break;
+ default:
+ break;
}
return is_match;
SUMMON_PIRANHAS = 65, /*!< \8f¢\8a«\83^\83C\83v: \83s\83\89\83j\83A\81E\83g\83\89\83b\83v\97p */
SUMMON_ARMAGE_GOOD = 66, /*!< \8f¢\8a«\83^\83C\83v: \83n\83\8b\83}\83Q\83h\83\93\81E\83g\83\89\83b\83v\97p\93V\8eg\90w\89c */
SUMMON_ARMAGE_EVIL = 67, /*!< \8f¢\8a«\83^\83C\83v: \83n\83\8b\83}\83Q\83h\83\93\81E\83g\83\89\83b\83v\97p\88«\96\82\90w\89c */
+ SUMMON_APOCRYPHA_FOLLOWERS = 68, /*!< \8f¢\8a«\83^\83C\83v: \90M\8eÒ */
+ SUMMON_APOCRYPHA_DRAGONS = 69, /*!< \8f¢\8a«\83^\83C\83v: \8b\97Í\82È\8cÃ\91ã\83h\83\89\83S\83\93 */
} summon_type;
* are included in all such copies. Other copyrights may also apply.
*/
-
/* Purpose: a simple random number generator -BEN- */
#if defined(WINDOWS)
#include "term/z-rand.h"
-
-
-
/*
* Angband 2.7.9 introduced a new (optimized) random number generator,
* based loosely on the old "random.c" from Berkeley but with some major
* RNG algorithm was fully rewritten. Upper comment is OLD.
*/
-
/*
* Currently unused
*/
* Only index 0 to 3 are used
*/
u32b Rand_state[RAND_DEG] = {
- 123456789,
- 362436069,
- 521288629,
- 88675123,
+ 123456789,
+ 362436069,
+ 521288629,
+ 88675123,
};
-
-static u32b u32b_rotl(const u32b x, int k)
-{
- return (x << k) | (x >> (32 - k));
-}
+static u32b u32b_rotl(const u32b x, int k) { return (x << k) | (x >> (32 - k)); }
/*
* Initialize RNG state
*/
-static void Rand_seed(u32b seed, u32b* state)
+static void Rand_seed(u32b seed, u32b *state)
{
- int i;
+ int i;
- for (i = 1; i <= 4; ++ i) {
- seed = 1812433253UL * (seed ^ (seed >> 30)) + i;
- state[i-1] = seed;
- }
+ for (i = 1; i <= 4; ++i) {
+ seed = 1812433253UL * (seed ^ (seed >> 30)) + i;
+ state[i - 1] = seed;
+ }
}
/*
*/
static u32b Rand_Xoshiro128starstar(u32b *state)
{
- const u32b result = u32b_rotl(state[1] * 5, 7) * 9;
+ const u32b result = u32b_rotl(state[1] * 5, 7) * 9;
- const u32b t = state[1] << 9;
+ const u32b t = state[1] << 9;
- state[2] ^= state[0];
- state[3] ^= state[1];
- state[1] ^= state[2];
- state[0] ^= state[3];
+ state[2] ^= state[0];
+ state[3] ^= state[1];
+ state[1] ^= state[2];
+ state[0] ^= state[3];
- state[2] ^= t;
+ state[2] ^= t;
- state[3] = u32b_rotl(state[3], 11);
+ state[3] = u32b_rotl(state[3], 11);
- return result;
+ return result;
}
static const u32b Rand_Xorshift_max = 0xFFFFFFFF;
/*
* Initialize the RNG using a new seed
*/
-void Rand_state_set(u32b seed)
-{
- Rand_seed(seed, Rand_state);
-}
+void Rand_state_set(u32b seed) { Rand_seed(seed, Rand_state); }
void Rand_state_init(void)
{
#ifdef RNG_DEVICE
- FILE *fp = fopen(RNG_DEVICE, "r");
- int n;
-
- do {
- n = fread(Rand_state, sizeof(Rand_state[0]), 4, fp);
- } while (n != 4 || (Rand_state[0] | Rand_state[1] | Rand_state[2] | Rand_state[3]) == 0);
-
- fclose(fp);
+ FILE *fp = fopen(RNG_DEVICE, "r");
+ int n;
+
+ do {
+ n = fread(Rand_state, sizeof(Rand_state[0]), 4, fp);
+ } while (n != 4 || (Rand_state[0] | Rand_state[1] | Rand_state[2] | Rand_state[3]) == 0);
+
+ fclose(fp);
#elif defined(WINDOWS)
- HCRYPTPROV hProvider;
+ HCRYPTPROV hProvider;
- CryptAcquireContext(&hProvider, NULL, NULL, PROV_RSA_FULL, 0);
+ CryptAcquireContext(&hProvider, NULL, NULL, PROV_RSA_FULL, 0);
- do {
- CryptGenRandom(hProvider, sizeof(Rand_state[0]) * 4, (BYTE*)Rand_state);
- } while ((Rand_state[0] | Rand_state[1] | Rand_state[2] | Rand_state[3]) == 0);
+ do {
+ CryptGenRandom(hProvider, sizeof(Rand_state[0]) * 4, (BYTE *)Rand_state);
+ } while ((Rand_state[0] | Rand_state[1] | Rand_state[2] | Rand_state[3]) == 0);
- CryptReleaseContext(hProvider, 0);
+ CryptReleaseContext(hProvider, 0);
#else
- /* Basic seed */
- u32b seed = (time(NULL));
+ /* Basic seed */
+ u32b seed = (time(NULL));
#ifdef SET_UID
- /* Mutate the seed on Unix machines */
- seed = ((seed >> 3) * (getpid() << 1));
+ /* Mutate the seed on Unix machines */
+ seed = ((seed >> 3) * (getpid() << 1));
#endif
- /* Seed the RNG */
- Rand_state_set(seed);
+ /* Seed the RNG */
+ Rand_state_set(seed);
#endif
}
/*
* Backup the RNG state
*/
-void Rand_state_backup(u32b* backup_state)
+void Rand_state_backup(u32b *backup_state)
{
- int i;
+ int i;
- for (i = 0; i < 4; ++ i) {
- backup_state[i] = Rand_state[i];
- }
+ for (i = 0; i < 4; ++i) {
+ backup_state[i] = Rand_state[i];
+ }
}
/*
* Restore the RNG state
*/
-void Rand_state_restore(u32b* backup_state)
+void Rand_state_restore(u32b *backup_state)
{
- int i;
+ int i;
- for (i = 0; i < 4; ++ i) {
- Rand_state[i] = backup_state[i];
- }
+ for (i = 0; i < 4; ++i) {
+ Rand_state[i] = backup_state[i];
+ }
}
-
/*
* Extract a "random" number from 0 to m-1, via "division"
*/
-static s32b Rand_div_impl(s32b m, u32b* state)
+static s32b Rand_div_impl(s32b m, u32b *state)
{
- u32b scaling;
- u32b past;
- u32b ret;
-
- /* Hack -- simple case */
- if (m <= 1) return 0;
+ u32b scaling;
+ u32b past;
+ u32b ret;
- scaling = Rand_Xorshift_max / m;
- past = scaling * m;
+ /* Hack -- simple case */
+ if (m <= 1)
+ return 0;
- do {
- ret = Rand_Xoshiro128starstar(state);
- } while (ret >= past);
+ scaling = Rand_Xorshift_max / m;
+ past = scaling * m;
- return ret / scaling;
-}
+ do {
+ ret = Rand_Xoshiro128starstar(state);
+ } while (ret >= past);
-s32b Rand_div(s32b m)
-{
- return Rand_div_impl(m, Rand_state);
+ return ret / scaling;
}
-
-
+s32b Rand_div(s32b m) { return Rand_div_impl(m, Rand_state); }
/*
* The number of entries in the "randnor_table"
*/
-#define RANDNOR_NUM 256
+#define RANDNOR_NUM 256
/*
* The standard deviation of the "randnor_table"
*/
-#define RANDNOR_STD 64
+#define RANDNOR_STD 64
/*
* The normal distribution table for the "randnor()" function (below)
32765, 32765, 32765, 32766, 32766, 32766, 32766, 32767,
};
-
-
/*
* Generate a random integer number of NORMAL distribution
*
*/
s16b randnor(int mean, int stand)
{
- s16b tmp;
- s16b offset;
-
- s16b low = 0;
- s16b high = RANDNOR_NUM;
- if (stand < 1) return (s16b)(mean);
-
- /* Roll for probability */
- tmp = (s16b)randint0(32768);
-
- /* Binary Search */
- while (low < high)
- {
- int mid = (low + high) >> 1;
-
- /* Move right if forced */
- if (randnor_table[mid] < tmp)
- {
- low = mid + 1;
- }
-
- /* Move left otherwise */
- else
- {
- high = (s16b)mid;
- }
- }
-
- /* Convert the index into an offset */
- offset = (long)stand * (long)low / RANDNOR_STD;
-
- /* One half should be negative */
- if (randint0(100) < 50) return (mean - offset);
-
- /* One half should be positive */
- return (mean + offset);
-}
+ s16b tmp;
+ s16b offset;
+ s16b low = 0;
+ s16b high = RANDNOR_NUM;
+ if (stand < 1)
+ return (s16b)(mean);
+ /* Roll for probability */
+ tmp = (s16b)randint0(32768);
+
+ /* Binary Search */
+ while (low < high) {
+ int mid = (low + high) >> 1;
+
+ /* Move right if forced */
+ if (randnor_table[mid] < tmp) {
+ low = mid + 1;
+ }
+
+ /* Move left otherwise */
+ else {
+ high = (s16b)mid;
+ }
+ }
+
+ /* Convert the index into an offset */
+ offset = (long)stand * (long)low / RANDNOR_STD;
+
+ /* One half should be negative */
+ if (randint0(100) < 50)
+ return (mean - offset);
+
+ /* One half should be positive */
+ return (mean + offset);
+}
/*
* Generates damage for "2d6" style dice rolls
*/
s16b damroll(DICE_NUMBER num, DICE_SID sides)
{
- int i, sum = 0;
- for (i = 0; i < num; i++) sum += randint1(sides);
- return (s16b)(sum);
+ int i, sum = 0;
+ for (i = 0; i < num; i++)
+ sum += randint1(sides);
+ return (s16b)(sum);
}
-
/*
* Same as above, but always maximal
*/
-s16b maxroll(DICE_NUMBER num, DICE_SID sides)
-{
- return (num * sides);
-}
-
+s16b maxroll(DICE_NUMBER num, DICE_SID sides) { return (num * sides); }
/*
* Given a numerator and a denominator, supply a properly rounded result,
*/
s32b div_round(s32b n, s32b d)
{
- s32b tmp;
-
- /* Refuse to divide by zero */
- if (!d) return (n);
-
- /* Division */
- tmp = n / d;
-
- /* Rounding */
- if ((ABS(n) % ABS(d)) > randint0(ABS(d)))
- {
- /* Increase the absolute value */
- if (n * d > 0L) tmp += 1L;
- else tmp -= 1L;
- }
-
- /* Return */
- return (tmp);
+ s32b tmp;
+
+ /* Refuse to divide by zero */
+ if (!d)
+ return (n);
+
+ /* Division */
+ tmp = n / d;
+
+ /* Rounding */
+ if ((ABS(n) % ABS(d)) > randint0(ABS(d))) {
+ /* Increase the absolute value */
+ if (n * d > 0L)
+ tmp += 1L;
+ else
+ tmp -= 1L;
+ }
+
+ /* Return */
+ return (tmp);
}
-
-
-
/*
* Extract a "random" number from 0 to m-1, using the RNG.
*
* "external" program parts like the main-*.c files. It preserves
* the current RNG state to prevent influences on game-play.
*
- * Could also use rand() from <stdlib.h> directly.
+ * Could also use rand() from <stdlib.h> directly.
*/
s32b Rand_external(s32b m)
{
- static bool initialized = FALSE;
- static u32b Rand_state_external[4];
-
- if (!initialized)
- {
- /* Initialize with new seed */
- u32b seed = (u32b)time(NULL);
- Rand_seed(seed, Rand_state_external);
- initialized = TRUE;
- }
-
- return Rand_div_impl(m, Rand_state_external);
+ static bool initialized = FALSE;
+ static u32b Rand_state_external[4];
+
+ if (!initialized) {
+ /* Initialize with new seed */
+ u32b seed = (u32b)time(NULL);
+ Rand_seed(seed, Rand_state_external);
+ initialized = TRUE;
+ }
+
+ return Rand_div_impl(m, Rand_state_external);
}
+
+bool next_bool() { return randint0(2) == 0; }
* are included in all such copies. Other copyrights may also apply.
*/
-
#ifndef INCLUDED_Z_RAND_H
#define INCLUDED_Z_RAND_H
#include "system/h-basic.h"
-
-
/**** Available constants ****/
-
/*
* Random Number Generator -- Degree of "complex" RNG -- see "misc.c"
* This value is hard-coded at 63 for a wide variety of reasons.
*/
#define RAND_DEG 63
-
-
-
/**** Available macros ****/
-
/*
* Generates a random long integer X where O<=X<M.
* The integer X falls along a uniform distribution.
* For example, if M is 100, you get "percentile dice"
*/
-#define randint0(M) \
- ((s32b)Rand_div(M))
+#define randint0(M) ((s32b)Rand_div(M))
/*
* Generates a random long integer X where A<=X<=B
* The integer X falls along a uniform distribution.
* Note: rand_range(0,N-1) == randint0(N)
*/
-#define rand_range(A,B) \
- ((A) + (randint0(1+(B)-(A))))
+#define rand_range(A, B) ((A) + (randint0(1 + (B) - (A))))
/*
* Generate a random long integer X where A-D<=X<=A+D
* The integer X falls along a uniform distribution.
* Note: rand_spread(A,D) == rand_range(A-D,A+D)
*/
-#define rand_spread(A,D) \
- ((A) + (randint0(1+(D)+(D))) - (D))
-
+#define rand_spread(A, D) ((A) + (randint0(1 + (D) + (D))) - (D))
/*
* Generate a random long integer X where 1<=X<=M
* Also, "correctly" handle the case of M<=1
*/
-#define randint1(M) \
- (randint0(M) + 1)
-
+#define randint1(M) (randint0(M) + 1)
/*
* Evaluate to TRUE "P" percent of the time
*/
-#define magik(P) \
- (randint0(100) < (P))
+#define magik(P) (randint0(100) < (P))
-
-#define one_in_(X) \
- (randint0(X) == 0)
+#define one_in_(X) (randint0(X) == 0)
/*
* Evaluate to TRUE "S" percent of the time
*/
-#define saving_throw(S) \
- (randint0(100) < (S))
-
-
-/**** Available Variables ****/
+#define saving_throw(S) (randint0(100) < (S))
extern u16b Rand_place;
extern u32b Rand_state[RAND_DEG];
-
-/**** Available Functions ****/
-
-extern void Rand_state_init(void);
-extern void Rand_state_set(u32b seed);
-extern void Rand_state_backup(u32b* backup_state);
-extern void Rand_state_restore(u32b* backup_state);
-extern s32b Rand_div(s32b m);
-extern s16b randnor(int mean, int stand);
-extern s16b damroll(DICE_NUMBER num, DICE_SID sides);
-extern s16b maxroll(DICE_NUMBER num, DICE_SID sides);
-extern s32b div_round(s32b n, s32b d);
-extern s32b Rand_external(s32b m);
+void Rand_state_init(void);
+void Rand_state_set(u32b seed);
+void Rand_state_backup(u32b *backup_state);
+void Rand_state_restore(u32b *backup_state);
+s32b Rand_div(s32b m);
+s16b randnor(int mean, int stand);
+s16b damroll(DICE_NUMBER num, DICE_SID sides);
+s16b maxroll(DICE_NUMBER num, DICE_SID sides);
+s32b div_round(s32b n, s32b d);
+s32b Rand_external(s32b m);
+bool next_bool();
#endif