/*
+ * 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 */
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)
#endif
}
msg_print(NULL);
- p_ptr->energy = 100;
+ p_ptr->energy_need = 0;
battle_monsters();
}
else if(turn - old_turn == 150*TURNS_PER_TICK)
#endif
p_ptr->au += kakekin;
msg_print(NULL);
- p_ptr->energy = 100;
+ p_ptr->energy_need = 0;
battle_monsters();
}
}
}
/* 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 ***/
/*** 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;
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);
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);
#endif
msg_print(NULL);
world_player = FALSE;
- p_ptr->energy = 0;
+ p_ptr->energy_need = ENERGY_NEED();
handle_stuff();
}
{
if (load_game)
{
- p_ptr->energy = 100;
+ p_ptr->energy_need = 0;
battle_monsters();
}
else
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;
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 */
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;
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
- p_ptr->energy -= 100;
+ p_ptr->energy_need += ENERGY_NEED();
}
}
{
p_ptr->wilderness_x = px;
p_ptr->wilderness_y = py;
- p_ptr->energy = 100;
+ p_ptr->energy_need = 0;
change_wild_mode();
}
{
p_ptr->wilderness_x = px;
p_ptr->wilderness_y = py;
- p_ptr->energy = 100;
+ p_ptr->energy_need = 0;
change_wild_mode();
}
return TRUE;
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);
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;
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);
/* 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
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);
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);
}
}
if (!(r_ptr->flags7 & RF7_CAN_FLY) && !(r_ptr->flags8 & RF8_WILD_WOOD))
{
- m_ptr->energy -= 100;
+ m_ptr->energy_need += ENERGY_NEED();
}
}
*/
void process_monsters(void)
{
- int i, e;
+ int i;
int fx, fy;
bool test;
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 */
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;
/* 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 */
#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);
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 */
/* Window stuff */
p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
- p_ptr->energy -= 100;
+ p_ptr->energy_need += ENERGY_NEED();
}
if (p_ptr->riding)
{
#endif
}
else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
- p_ptr->energy -= 100;
+ p_ptr->energy_need += ENERGY_NEED();
}
break;
}
#endif
}
else teleport_player_to(m_ptr->fy, m_ptr->fx, TRUE);
- p_ptr->energy -= 100;
+ p_ptr->energy_need = ENERGY_NEED();
}
break;
}
#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)
{
#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);
handle_stuff();
py_attack(y, x, 0);
}
- p_ptr->energy -= 100;
+ p_ptr->energy_need += ENERGY_NEED();
}
else
{
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);
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);
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);
}
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 */
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) */
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 */