OSDN Git Service

[Implement] #37285 ドラゴンの特殊召喚を実装 / Added special summon for dragons
authorHourier <hourier@users.sourceforge.jp>
Fri, 25 Sep 2020 14:20:51 +0000 (23:20 +0900)
committerHourier <hourier@users.sourceforge.jp>
Fri, 25 Sep 2020 14:48:41 +0000 (23:48 +0900)
lib/edit/r_info.txt
src/blue-magic/blue-magic-breath.c
src/monster-floor/monster-summon.c
src/monster-race/race-indice-types.h
src/mspell/mspell-summon.c
src/mspell/specified-summon.c
src/mspell/specified-summon.h
src/mspell/summon-checker.c
src/spell/summon-types.h
src/term/z-rand.c
src/term/z-rand.h

index b61203c..4ab3006 100644 (file)
@@ -23919,7 +23919,7 @@ S:CONF | SCARE | BLIND
 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
@@ -24118,7 +24118,7 @@ F:UNIQUE | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | ATTR_MULTI
 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.
@@ -24164,12 +24164,11 @@ D:$They are relentlessly chasing you as against Mirak's noble will.
 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
@@ -24177,7 +24176,9 @@ B:HIT:SUPERHURT:10d11
 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?
index d74312a..af0de28 100644 (file)
@@ -234,7 +234,7 @@ bool cast_blue_breath_nuke(player_type *caster_ptr, bmc_type *bmc_ptr)
         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;
 }
@@ -251,7 +251,7 @@ bool cast_blue_breath_disintegration(player_type *caster_ptr, bmc_type *bmc_ptr)
         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;
 }
index df1d85b..5e103f0 100644 (file)
@@ -104,7 +104,7 @@ bool summon_specific(player_type *player_ptr, MONSTER_IDX who, POSITION y1, POSI
 
     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);
index b877dca..b96933a 100644 (file)
@@ -152,4 +152,9 @@ typedef enum monster_race_type {
     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;
index e4a0cfa..c2880ce 100644 (file)
@@ -140,6 +140,12 @@ void spell_RF6_S_KIN(player_type *target_ptr, POSITION y, POSITION x, MONSTER_ID
     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;
index 4d58d84..abb922b 100644 (file)
@@ -210,3 +210,24 @@ MONSTER_NUMBER summon_NAZGUL(player_type *target_ptr, POSITION y, POSITION x, MO
     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;
+}
index 4951186..1af9b84 100644 (file)
@@ -10,3 +10,5 @@ MONSTER_NUMBER summon_LOUSE(player_type *target_ptr, POSITION y, POSITION x, int
 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);
index 68c24a2..57d2d01 100644 (file)
@@ -25,193 +25,158 @@ bool check_summon_specific(player_type *player_ptr, MONRACE_IDX summoner_idx, MO
     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;
index b172b74..f91bd32 100644 (file)
@@ -48,4 +48,6 @@ typedef enum summon_type {
     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;
index c27ebb3..a828325 100644 (file)
@@ -8,7 +8,6 @@
  * are included in all such copies.  Other copyrights may also apply.
  */
 
-
 /* Purpose: a simple random number generator -BEN- */
 
 #if defined(WINDOWS)
@@ -17,9 +16,6 @@
 
 #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
@@ -52,7 +48,6 @@
  * RNG algorithm was fully rewritten. Upper comment is OLD.
  */
 
-
 /*
  * Currently unused
  */
@@ -63,29 +58,25 @@ u16b Rand_place;
  * 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, u32bstate)
+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;
+    }
 }
 
 /*
@@ -93,20 +84,20 @@ static void Rand_seed(u32b seed, u32b* state)
  */
 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;
@@ -114,46 +105,43 @@ 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
 }
@@ -161,67 +149,61 @@ void Rand_state_init(void)
 /*
  * Backup the RNG state
  */
-void Rand_state_backup(u32bbackup_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(u32bbackup_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, u32bstate)
+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)
@@ -265,8 +247,6 @@ static s16b randnor_table[RANDNOR_NUM] =
        32765,   32765,   32765,   32766,   32766,      32766,   32766,   32767,
 };
 
-
-
 /*
  * Generate a random integer number of NORMAL distribution
  *
@@ -288,65 +268,58 @@ static s16b randnor_table[RANDNOR_NUM] =
  */
 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,
@@ -354,29 +327,28 @@ s16b maxroll(DICE_NUMBER num, DICE_SID sides)
  */
 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.
  *
@@ -384,20 +356,21 @@ s32b div_round(s32b n, s32b d)
  * "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; }
index c679bde..33f595b 100644 (file)
@@ -8,96 +8,73 @@
  * 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