OSDN Git Service

s64bのシフト演算マクロ s64b_LSHIFT()とs64b_RSHIFT()をbit数指定に拡張して、
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 1 Dec 2003 11:39:13 +0000 (11:39 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Mon, 1 Dec 2003 11:39:13 +0000 (11:39 +0000)
(1L<<16)を掛け算する所を16bit シフトに直した。regenmana()書き変え、コメント修正。

src/dungeon.c
src/xtra2.c
src/z-util.c
src/z-util.h

index 63f27f5..600fa86 100644 (file)
@@ -859,7 +859,6 @@ static void regenhp(int percent)
 
 /*
  * Regenerate mana points
- * Get ((new_mana) / 2^32) mana point once called.
  */
 static void regenmana(int percent)
 {
@@ -871,10 +870,15 @@ static void regenmana(int percent)
         */
        if (p_ptr->csp > p_ptr->msp)
        {
-               u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE) << 16;
+               /* PY_REGEN_NORMAL is Regen factor in unit (1/2^16) */
+               s32b decay = 0;
+               u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
+
+               /* Convert the unit (1/2^16) to (1/2^32) */
+               s64b_LSHIFT(decay, decay_frac, 16);
 
                /* Decay */
-               s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), 0, decay_frac);
+               s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), decay, decay_frac);
 
                /* Stop decaying */
                if (p_ptr->csp < p_ptr->msp)
@@ -884,18 +888,15 @@ static void regenmana(int percent)
                }
        }
 
-       /* Regerating mana (unless the player has excess mana) */
+       /* Regenerating mana (unless the player has excess mana) */
        else if (percent > 0)
        {
-               /*
-                * (percent/100) is from constants PY_REGEN_* , 
-                * which is Regen factor*2^16 . 
-                */
+               /* (percent/100) is Regen factor in unit (1/2^16) */
                s32b new_mana = 0;
                u32b new_mana_frac = (p_ptr->msp * percent / 100 + PY_REGEN_MNBASE);
 
-               /* Convert the unit x2^16 -> x2^32 */
-               s64b_mul(&new_mana, &new_mana_frac, 0, 0x1L<<16);
+               /* Convert the unit (1/2^16) to (1/2^32) */
+               s64b_LSHIFT(new_mana, new_mana_frac, 16);
 
                /* Regenerate */
                s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), new_mana, new_mana_frac);
@@ -912,12 +913,17 @@ static void regenmana(int percent)
        /* Reduce mana (even when the player has excess mana) */
        if (percent < 0)
        {
-               u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE) << 16;
+               /* PY_REGEN_NORMAL is Regen factor in unit (1/2^16) */
+               s32b reduce_mana = 0;
+               u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
+
+               /* Convert the unit (1/2^16) to (1/2^32) */
+               s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
 
                /* Reduce mana */
-               s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), 0, reduce_mana_frac);
+               s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), reduce_mana, reduce_mana_frac);
 
-               /* check for overflow */
+               /* Check overflow */
                if (p_ptr->csp < 0)
                {
                        p_ptr->csp = 0;
@@ -957,7 +963,7 @@ static void regenmagic(int percent)
                new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8;
                p_ptr->magic_num1[i] += new_mana;
 
-               /* Must set frac to zero even if equal */
+               /* Check maximum charge */
                if (p_ptr->magic_num1[i] > (p_ptr->magic_num2[i] << 16))
                {
                        p_ptr->magic_num1[i] = ((long)p_ptr->magic_num2[i] << 16);
@@ -1821,7 +1827,8 @@ static void check_music(void)
        need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC);
        need_mana_frac = 0;
 
-       s64b_RSHIFT(need_mana, need_mana_frac);
+       /* Divide by 2 */
+       s64b_RSHIFT(need_mana, need_mana_frac, 1);
 
        if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0)
        {
index b0a390e..00333f6 100644 (file)
@@ -1645,8 +1645,7 @@ static void get_exp_from_mon(int dam, monster_type *m_ptr)
                while (monnum_penarty--)
                {
                        /* Divide by 4 */
-                       s64b_RSHIFT(new_exp, new_exp_frac);
-                       s64b_RSHIFT(new_exp, new_exp_frac);
+                       s64b_RSHIFT(new_exp, new_exp_frac, 2);
                }
        }
 
index d2830d0..4650661 100644 (file)
@@ -229,7 +229,7 @@ void s64b_div(s32b *A1, u32b *A2, s32b B1, u32b B2)
         */
        while (s64b_cmp(A1val, A2val, B1, B2) == 1)
        {
-               s64b_LSHIFT(B1, B2);
+               s64b_LSHIFT(B1, B2, 1);
                bit++;
        }
 
@@ -246,7 +246,7 @@ void s64b_div(s32b *A1, u32b *A2, s32b B1, u32b B2)
                        s64b_sub(&A1val, &A2val, B1, B2);
                }
        
-               s64b_RSHIFT(B1, B2);
+               s64b_RSHIFT(B1, B2, 1);
                bit--;
        }
 
index 6c91c16..bb0ac63 100644 (file)
@@ -52,8 +52,8 @@ extern void core(cptr str);
 
 
 /* 64-bit integer operations */
-#define s64b_LSHIFT(V1, V2) {V1 = (V1<<1) | (V2>>31); V2 <<= 1;}
-#define s64b_RSHIFT(V1, V2) {V2 = (V1<<31) | (V2>>1); V1 >>= 1;}
+#define s64b_LSHIFT(V1, V2, N) {V1 = (V1<<(N)) | (V2>>(32-(N))); V2 <<= (N);}
+#define s64b_RSHIFT(V1, V2, N) {V2 = (V1<<(32-(N))) | (V2>>(N)); V1 >>= (N);}
 extern void s64b_add(s32b *A1, u32b *A2, s32b B1, u32b B2);
 extern void s64b_sub(s32b *A1, u32b *A2, s32b B1, u32b B2);
 extern int s64b_cmp(s32b A1, u32b A2, s32b B1, u32b B2);