OSDN Git Service

スピードシステム改造。
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sun, 14 Apr 2002 18:09:00 +0000 (18:09 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sun, 14 Apr 2002 18:09:00 +0000 (18:09 +0000)
行動1回に必要なエネルギーは ENERGY_NEED() = randnor(100, 31) * 2 。
後で、TURNS_PER_TICK を 10 にしたときにはこの「* 2」は取り除く。

16 files changed:
src/defines.h
src/dungeon.c
src/effects.c
src/generate.c
src/load.c
src/mane.c
src/melee2.c
src/mind.c
src/monster2.c
src/mspells1.c
src/mspells2.c
src/mspells3.c
src/racial.c
src/save.c
src/spells3.c
src/types.h

index a813be8..7cba9e3 100644 (file)
 
 
 /*
+ * Random energy
+ */
+#define ENERGY_NEED() (randnor(100, 31) * 2)  
+
+/*
  * Misc constants
  */
-#define TOWN_DAWN               10000   /* Number of ticks from dawn to dawn XXX */
-#define TURNS_PER_TICK          20L     /* # of energy-gain-turns per ticks */
-#define BREAK_GLYPH             550             /* Rune of protection resistance */
-#define BREAK_MINOR_GLYPH       299             /* For explosive runes */
-#define BTH_PLUS_ADJ    3       /* Adjust BTH per plus-to-hit */
-#define MON_MULT_ADJ    8               /* High value slows multiplication */
-#define MON_SUMMON_ADJ  2               /* Adjust level of summoned creatures */
-#define MON_DRAIN_LIFE  2               /* Percent of player exp drained per hit */
-#define USE_DEVICE      3               /* x> Harder devices x< Easier devices     */
+#define TOWN_DAWN         10000    /* Number of ticks from dawn to dawn XXX */
+#define TURNS_PER_TICK    20L      /* Number of energy-gain-turns per ticks */
+#define BREAK_GLYPH       550      /* Rune of protection resistance */
+#define BREAK_MINOR_GLYPH 299      /* For explosive runes */
+#define BTH_PLUS_ADJ       3       /* Adjust BTH per plus-to-hit */
+#define MON_MULT_ADJ      8       /* High value slows multiplication */
+#define MON_SUMMON_ADJ    2       /* Adjust level of summoned creatures */
+#define MON_DRAIN_LIFE    2       /* Percent of player exp drained per hit */
+#define USE_DEVICE        3       /* x> Harder devices x< Easier devices     */
 
 
 /* "Biases" for random artifact gen */
index 3bd0d3b..abc20db 100644 (file)
@@ -1527,7 +1527,7 @@ msg_print("
                        msg_print("They have kill each other at the same time.");
 #endif
                        msg_print(NULL);
-                       p_ptr->energy = 100;
+                       p_ptr->energy_need = 0;
                        battle_monsters();
                }
                else if ((number_mon-1) == 0)
@@ -1568,7 +1568,7 @@ msg_print("
 #endif
                        }
                        msg_print(NULL);
-                       p_ptr->energy = 100;
+                       p_ptr->energy_need = 0;
                        battle_monsters();
                }
                else if(turn - old_turn == 150*TURNS_PER_TICK)
@@ -1580,7 +1580,7 @@ msg_print("
 #endif
                        p_ptr->au += kakekin;
                        msg_print(NULL);
-                       p_ptr->energy = 100;
+                       p_ptr->energy_need = 0;
                        battle_monsters();
                }
        }
@@ -4955,11 +4955,13 @@ msg_print("
        }
 
        /* Give the player some energy */
-       else if((randint0(60) < ((p_ptr->pspeed > 199) ? 49 : ((p_ptr->pspeed < 0) ? 1 : extract_energy[p_ptr->pspeed]))) && !(load && p_ptr->energy >= 100))
-               p_ptr->energy += gain_energy();
+       else if (!(load && p_ptr->energy_need <= 0))
+       {
+               p_ptr->energy_need -= (p_ptr->pspeed > 199 ? 49 : (p_ptr->pspeed < 0 ? 1 : extract_energy[p_ptr->pspeed]));
+       }
 
        /* No turn yet */
-       if (p_ptr->energy < 100) return;
+       if (p_ptr->energy_need > 0) return;
        if (!command_rep) prt_time();
 
        /*** Check for interupts ***/
@@ -5271,7 +5273,7 @@ msg_format("%^s
        /*** Handle actual user input ***/
 
        /* Repeat until out of energy */
-       while (p_ptr->energy >= 100)
+       while (p_ptr->energy_need <= 0)
        {
                p_ptr->window |= PW_PLAYER;
                p_ptr->sutemi = FALSE;
@@ -5457,8 +5459,10 @@ msg_format("%s(%c)
                if (energy_use)
                {
                        /* Use some energy */
-                       p_ptr->energy -= energy_use;
-
+                       if (!world_player)
+                               p_ptr->energy_need += (s16b)((s32b)energy_use * ENERGY_NEED() / 100L);
+                       else
+                               p_ptr->energy_need += energy_use * TURNS_PER_TICK / 10;
 
                        /* Hack -- constant hallucination */
                        if (p_ptr->image) p_ptr->redraw |= (PR_MAP);
@@ -5575,7 +5579,7 @@ msg_format("%s(%c)
                                p_ptr->redraw |= (PR_STATE);
                        }
 
-                       if (world_player && (p_ptr->energy < 1000))
+                       if (world_player && (p_ptr->energy_need > - 1000))
                        {
                                /* Redraw map */
                                p_ptr->redraw |= (PR_MAP);
@@ -5593,7 +5597,7 @@ msg_format("%s(%c)
 #endif
                                msg_print(NULL);
                                world_player = FALSE;
-                               p_ptr->energy = 0;
+                               p_ptr->energy_need = ENERGY_NEED();
 
                                handle_stuff();
                        }
@@ -5809,7 +5813,7 @@ static void dungeon(bool load_game)
        {
                if (load_game)
                {
-                       p_ptr->energy = 100;
+                       p_ptr->energy_need = 0;
                        battle_monsters();
                }
                else
@@ -5860,7 +5864,10 @@ msg_print("
 
        hack_mind = TRUE;
 
-       if (p_ptr->energy < 100 && !p_ptr->inside_battle && (dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena)) p_ptr->energy = 100;
+       if (p_ptr->energy_need > 0 && !p_ptr->inside_battle &&
+           (dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena))
+               p_ptr->energy_need = 0;
+
        /* Not leaving dungeon */
        p_ptr->leaving_dungeon = FALSE;
 
@@ -6568,7 +6575,7 @@ if (init_v_info()) quit("
                m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
                m_ptr->max_maxhp = m_ptr->maxhp;
                m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
-               m_ptr->energy = -100;
+               m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
        }
 
        /* Process */
index fc8d104..e169819 100644 (file)
@@ -201,7 +201,7 @@ void reset_tim_flags(void)
        p_ptr->special_attack = 0L;
        p_ptr->special_defense = 0L;
 
-       while(p_ptr->energy > 99) p_ptr->energy -= 100;
+       while(p_ptr->energy_need < 0) p_ptr->energy_need += ENERGY_NEED();
        world_player = FALSE;
 
        if (prace_is_(RACE_DEMON) && (p_ptr->lev > 44)) p_ptr->oppose_fire = 1;
@@ -1623,7 +1623,7 @@ msg_print("̵Ũ
                        /* Window stuff */
                        p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
 
-                       p_ptr->energy -= 100;
+                       p_ptr->energy_need += ENERGY_NEED();
                }
        }
 
@@ -3908,7 +3908,7 @@ msg_print("
                {
                        p_ptr->wilderness_x = px;
                        p_ptr->wilderness_y = py;
-                       p_ptr->energy = 100;
+                       p_ptr->energy_need = 0;
                        change_wild_mode();
                }
 
@@ -5191,7 +5191,7 @@ msg_print("*** 
        {
                p_ptr->wilderness_x = px;
                p_ptr->wilderness_y = py;
-               p_ptr->energy = 100;
+               p_ptr->energy_need = 0;
                change_wild_mode();
        }
        return TRUE;
index 7578fef..5162f4c 100644 (file)
@@ -1510,7 +1510,7 @@ static void place_pet(void)
                        m_ptr->smart = party_mon[i].smart;
                        m_ptr->csleep = 0;
                        m_ptr->nickname = party_mon[i].nickname;
-                       m_ptr->energy = party_mon[i].energy;
+                       m_ptr->energy_need = party_mon[i].energy_need;
                        m_ptr->exp = party_mon[i].exp;
                        set_pet(m_ptr);
 
index 29500c8..5414f54 100644 (file)
@@ -540,9 +540,9 @@ static void rd_monster(monster_type *m_ptr)
        if (z_older_than(10, 4, 2))
        {
                rd_byte(&tmp8u);
-               m_ptr->energy = (s16b)tmp8u;
+               m_ptr->energy_need = (s16b)tmp8u;
        }
-       else rd_s16b(&m_ptr->energy);
+       else rd_s16b(&m_ptr->energy_need);
        if (z_older_than(10,0,7))
        {
                m_ptr->fast = 0;
@@ -1372,7 +1372,7 @@ note(format("
        rd_s16b(&p_ptr->confused);
        rd_s16b(&p_ptr->food);
        strip_bytes(4); /* Old "food_digested" / "protection" */
-       rd_s16b(&p_ptr->energy);
+       rd_s16b(&p_ptr->energy_need);
        rd_s16b(&p_ptr->fast);
        rd_s16b(&p_ptr->slow);
        rd_s16b(&p_ptr->afraid);
@@ -2556,7 +2556,7 @@ if (arg_fiddle) note("
 
        /* Read the extra stuff */
        rd_extra();
-       if (p_ptr->energy > 999) world_player = TRUE;
+       if (p_ptr->energy_need < -999) world_player = TRUE;
 #ifdef JP
 if (arg_fiddle) note("ÆÃÊ̾ðÊó¤ò¥í¡¼¥É¤·¤Þ¤·¤¿");
 #else
index 6650f43..2571889 100644 (file)
@@ -935,7 +935,8 @@ msg_print("̵
                        msg_print("hek!");
                msg_print(NULL);
 
-               p_ptr->energy += (randint1(200)+1200);
+               /* Hack */
+               p_ptr->energy_need -= 1000 + (100 + randint1(200)+200)*TURNS_PER_TICK/10;
 
                /* Redraw map */
                p_ptr->redraw |= (PR_MAP);
index c639b3c..3d01007 100644 (file)
@@ -2676,7 +2676,7 @@ msg_format("%^s
                        msg_format("%^s is no longer invulnerable.", m_name);
 #endif
 
-                       m_ptr->energy -= 100;
+                       m_ptr->energy_need += ENERGY_NEED();
                        if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
                        if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
                }
@@ -3492,7 +3492,7 @@ msg_print("
                                }
                                if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD))
                                {
-                                       m_ptr->energy -= 100;
+                                       m_ptr->energy_need += ENERGY_NEED();
                                }
                        }
 
@@ -3817,7 +3817,7 @@ msg_format("%^s
  */
 void process_monsters(void)
 {
-       int             i, e;
+       int             i;
        int             fx, fy;
 
        bool            test;
@@ -3973,18 +3973,14 @@ void process_monsters(void)
                        if (m_ptr->slow) speed = MAX(0, speed - 10);
                }
 
-               e = extract_energy[speed];
-
                /* Give this monster some energy */
-               if(randint0(60) < e)
-               m_ptr->energy += gain_energy();
-
+               m_ptr->energy_need -= extract_energy[speed];
 
                /* Not enough energy to move */
-               if (m_ptr->energy < 100) continue;
+               if (m_ptr->energy_need > 0) continue;
 
                /* Use up "some" energy */
-               m_ptr->energy -= 100;
+               m_ptr->energy_need += ENERGY_NEED();
 
 
                /* Save global index */
index 52e83dd..1baa247 100644 (file)
@@ -322,9 +322,9 @@ void mindcraft_info(char *p, int use_mind, int power)
        case 11: sprintf(p, " %s%dd6", s_dam, plev / 2);  break;
        case 12: sprintf(p, " %sd%d+%d", s_dam, plev * 3, plev * 3); break;
 #ifdef JP
-       case 13: sprintf(p, " ¹ÔÆ°:%d²ó", (p_ptr->csp + p_ptr->energy - 50)/100); break;
+       case 13: sprintf(p, " ¹ÔÆ°:%d²ó", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
 #else
-       case 13: sprintf(p, " %d acts.", (p_ptr->csp + p_ptr->energy - 50)/100); break;
+       case 13: sprintf(p, " %d acts.", (p_ptr->csp + 100-p_ptr->energy_need - 50)/100); break;
 #endif
        }
       break;
@@ -981,7 +981,7 @@ msg_print("
 
                /* This is always a radius-0 ball now */
                if (fire_ball(GF_PSI_DRAIN, dir, b, 0))
-                       p_ptr->energy -= randint1(150);
+                       p_ptr->energy_need += randint1(150);
                break;
        case 12:
                /* psycho-spear */
@@ -1008,7 +1008,8 @@ msg_print("
 #endif
                msg_print(NULL);
 
-               p_ptr->energy += (p_ptr->csp + 950);
+               /* Hack */
+               p_ptr->energy_need -= 1000 + (100 + p_ptr->csp - 50)*TURNS_PER_TICK/10;
 
                /* Redraw map */
                p_ptr->redraw |= (PR_MAP);
index cf08f5d..8fb066a 100644 (file)
@@ -2958,12 +2958,14 @@ msg_print("
        if (m_ptr->mspeed > 199) m_ptr->mspeed = 199;
 
        /* Give a random starting energy */
-       m_ptr->energy = (byte)randint0(100);
-
-       /* Nightmare monsters are more prepared */
-       if (ironman_nightmare)
+       if (!ironman_nightmare)
+       {
+               m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100);
+       }
+       else
        {
-               m_ptr->energy *= 2;
+               /* Nightmare monsters are more prepared */
+               m_ptr->energy_need = ENERGY_NEED() - (s16b)randint0(100) * 2;
        }
 
        /* Force monster to wait for player, unless in Nightmare mode */
index 408a7b8..6205c96 100644 (file)
@@ -1664,7 +1664,7 @@ msg_format("%^s
                                /* Window stuff */
                                p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
 
-                               p_ptr->energy -= 100;
+                               p_ptr->energy_need += ENERGY_NEED();
                        }
                        if (p_ptr->riding)
                        {
@@ -3612,7 +3612,7 @@ msg_format("%^s
 #endif
                                                                }
                                                                else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
-                                                               p_ptr->energy -= 100;
+                                                               p_ptr->energy_need += ENERGY_NEED();
                                                        }
                                                        break;
                                                }
index 9541002..2a139be 100644 (file)
@@ -3288,7 +3288,7 @@ msg_format("%^s
 #endif
                                                                        }
                                                                        else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
-                                                                       p_ptr->energy -= 100;
+                                                                       p_ptr->energy_need = ENERGY_NEED();
                                                                }
                                                                break;
                                                        }
index d7b17ee..88a76ae 100644 (file)
@@ -775,7 +775,7 @@ msg_format("%s
 #else
                        msg_format("%^s is no longer invulnerable.", m_name);
 #endif
-                       m_ptr->energy -= 100;
+                       m_ptr->energy_need += ENERGY_NEED();
                }
                if (m_ptr->fast)
                {
@@ -1396,7 +1396,8 @@ msg_print("̵
 #endif
                msg_print(NULL);
 
-               p_ptr->energy += (randint1(200)+1200);
+               /* Hack */
+               p_ptr->energy_need -= 1000 + (100 + randint1(200)+200)*TURNS_PER_TICK/10;
 
                /* Redraw map */
                p_ptr->redraw |= (PR_MAP);
index b241e64..033c0ca 100644 (file)
@@ -1077,7 +1077,7 @@ msg_print("Oraoraoraoraoraoraoraoraoraoraoraoraoraoraoraoraora!!!!");
                                                        handle_stuff();
                                                        py_attack(y, x, 0);
                                                }
-                                               p_ptr->energy -= 100;
+                                               p_ptr->energy_need += ENERGY_NEED();
                                        }
                                        else
                                        {
index 37bdb48..ce85631 100644 (file)
@@ -622,7 +622,7 @@ static void wr_monster(monster_type *m_ptr)
        wr_s16b(m_ptr->max_maxhp);
        wr_s16b(m_ptr->csleep);
        wr_byte(m_ptr->mspeed);
-       wr_s16b(m_ptr->energy);
+       wr_s16b(m_ptr->energy_need);
        wr_byte(m_ptr->fast);
        wr_byte(m_ptr->slow);
        wr_byte(m_ptr->stunned);
@@ -1011,7 +1011,7 @@ static void wr_extra(void)
        wr_s16b(p_ptr->food);
        wr_s16b(0);     /* old "food_digested" */
        wr_s16b(0);     /* old "protection" */
-       wr_s16b(p_ptr->energy);
+       wr_s16b(p_ptr->energy_need);
        wr_s16b(p_ptr->fast);
        wr_s16b(p_ptr->slow);
        wr_s16b(p_ptr->afraid);
index a035978..48df39b 100644 (file)
@@ -5538,30 +5538,32 @@ bool dimension_door(void)
 
        if (!tgt_pt(&x, &y)) return FALSE;
 
-       p_ptr->energy -= 60 - plev;
+       p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L);
 
        if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
                (distance(y, x, py, px) > plev / 2 + 10) ||
                (!randint0(plev / 10 + 10)))
        {
-         if( p_ptr->pclass != CLASS_MIRROR_MASTER ){
+               if( p_ptr->pclass != CLASS_MIRROR_MASTER ){
 #ifdef JP
-msg_print("ÀºÎ¤«¤éʪ¼Á³¦¤ËÌá¤ë»þ¤¦¤Þ¤¯¤¤¤«¤Ê¤«¤Ã¤¿¡ª");
+                       msg_print("ÀºÎ¤«¤éʪ¼Á³¦¤ËÌá¤ë»þ¤¦¤Þ¤¯¤¤¤«¤Ê¤«¤Ã¤¿¡ª");
 #else
-               msg_print("You fail to exit the astral plane correctly!");
+                       msg_print("You fail to exit the astral plane correctly!");
 #endif
-         }
-         else {
+               }
+               else
+               {
 #ifdef JP
-msg_print("¶À¤ÎÀ¤³¦¤ò¤¦¤Þ¤¯Ä̤ì¤Ê¤«¤Ã¤¿¡ª");
+                       msg_print("¶À¤ÎÀ¤³¦¤ò¤¦¤Þ¤¯Ä̤ì¤Ê¤«¤Ã¤¿¡ª");
 #else
-               msg_print("You fail to exit the astral plane correctly!");
+                       msg_print("You fail to exit the astral plane correctly!");
 #endif
-         }
-               p_ptr->energy -= 60 - plev;
+               }
+               p_ptr->energy_need += (s16b)((s32b)(60 - plev) * ENERGY_NEED() / 100L);
                teleport_player((plev+2)*2);
        }
-       else teleport_player_to(y, x, TRUE);
+       else
+               teleport_player_to(y, x, TRUE);
 
        return (TRUE);
 }
index e31241f..fcc5ce9 100644 (file)
@@ -569,20 +569,20 @@ typedef struct monster_type monster_type;
 
 struct monster_type
 {
-       s16b r_idx;                     /* Monster race index */
-       s16b ap_r_idx;                  /* Monster race appearance index */
+       s16b r_idx;             /* Monster race index */
+       s16b ap_r_idx;          /* Monster race appearance index */
 
-       byte fy;                        /* Y location on map */
-       byte fx;                        /* X location on map */
+       byte fy;                /* Y location on map */
+       byte fx;                /* X location on map */
 
-       s16b hp;                        /* Current Hit points */
-       s16b maxhp;                     /* Max Hit points */
-       s16b max_maxhp;                 /* Max Max Hit points */
+       s16b hp;                /* Current Hit points */
+       s16b maxhp;             /* Max Hit points */
+       s16b max_maxhp;         /* Max Max Hit points */
 
        s16b csleep;            /* Inactive counter */
 
-       byte mspeed;            /* Monster "speed" */
-       s16b energy;            /* Monster "energy" */
+       byte mspeed;            /* Monster "speed" */
+       s16b energy_need;       /* Monster "energy" */
 
        byte fast;              /* Monster is stunned */
        byte slow;              /* Monster is stunned */
@@ -591,12 +591,12 @@ struct monster_type
        byte monfear;           /* Monster is afraid */
        byte invulner;          /* Monster is temporarily invulnerable */
 
-       byte cdis;                      /* Current dis from player */
+       byte cdis;              /* Current dis from player */
 
-       byte mflag;                     /* Extra monster flags */
-       byte mflag2;                    /* Extra monster flags */
+       byte mflag;             /* Extra monster flags */
+       byte mflag2;            /* Extra monster flags */
 
-       bool ml;                        /* Monster is "visible" */
+       bool ml;                /* Monster is "visible" */
 
        s16b hold_o_idx;        /* Object being held (if any) */
 
@@ -1084,17 +1084,17 @@ struct player_type
        s16b word_recall;       /* Word of recall counter */
        byte recall_dungeon;
 
-       s16b energy;            /* Current energy */
+       s16b energy_need;       /* Energy needed for next move */
 
-       s16b food;                      /* Current nutrition */
+       s16b food;              /* Current nutrition */
 
-       u32b total_weight;              /* Total weight being carried */
+       u32b total_weight;      /* Total weight being carried */
 
        u32b special_attack;    /* Special attack capacity -LM- */
        u32b special_defense;   /* Special block capacity -LM- */
        byte action;            /* Currently action */
 
-       s16b health_who;                /* Health bar trackee */
+       s16b health_who;        /* Health bar trackee */
 
        s16b monster_race_idx;  /* Monster race trackee */