/* Hack -- count the number of "reproducers" */
if (r_ptr->flags2 & (RF2_MULTIPLY)) num_repro--;
+ if (MON_CSLEEP(m_ptr)) (void)set_monster_csleep(i, 0);
+ if (MON_FAST(m_ptr)) (void)set_monster_fast(i, 0);
+ if (MON_SLOW(m_ptr)) (void)set_monster_slow(i, 0);
+ if (MON_STUNNED(m_ptr)) (void)set_monster_stunned(i, 0);
+ if (MON_CONFUSED(m_ptr)) (void)set_monster_confused(i, 0);
+ if (MON_MONFEAR(m_ptr)) (void)set_monster_monfear(i, 0);
+ if (MON_INVULNER(m_ptr)) (void)set_monster_invulner(i, 0, FALSE);
+
/* Hack -- remove target monster */
if (i == target_who) target_who = 0;
/* Wipe the hole */
(void)WIPE(&m_list[i1], monster_type);
+ for (i = 0; i < MAX_MTIMED; i++)
+ {
+ int mproc_idx = get_mproc_idx(i1, i);
+ if (mproc_idx >= 0) mproc_list[i][mproc_idx] = i2;
+ }
}
{
r_info[MON_BANOR].max_num = 0;
r_info[MON_BANOR].r_pkills++;
+ r_info[MON_BANOR].r_akills++;
if (r_info[MON_BANOR].r_tkills < MAX_SHORT) r_info[MON_BANOR].r_tkills++;
}
if (r_info[MON_LUPART].max_num)
{
r_info[MON_LUPART].max_num = 0;
r_info[MON_LUPART].r_pkills++;
+ r_info[MON_LUPART].r_akills++;
if (r_info[MON_LUPART].r_tkills < MAX_SHORT) r_info[MON_LUPART].r_tkills++;
}
}
/*
* Wiping racial counters of all monsters and incrementing of racial
- * counters of monsters in party_mon[] is required to prevent multiple
+ * counters of monsters in party_mon[] are required to prevent multiple
* generation of unique monster who is the minion of player.
*/
/* Reset "m_cnt" */
m_cnt = 0;
+ /* Reset "mproc_max[]" */
+ for (i = 0; i < MAX_MTIMED; i++) mproc_max[i] = 0;
+
/* Hack -- reset "reproducer" count */
num_repro = 0;
{
hallu_race = &r_info[randint1(max_r_idx - 1)];
}
- while (hallu_race->flags1 & RF1_UNIQUE);
+ while (!hallu_race->name || (hallu_race->flags1 & RF1_UNIQUE));
strcpy(silly_name, (r_name + hallu_race->name));
}
else
{
/* Tanuki? */
- if (is_pet(m_ptr) && m_ptr->ap_r_idx != m_ptr->r_idx)
+ if (is_pet(m_ptr) && !is_original_ap(m_ptr))
{
#ifdef JP
char *t;
(void)sprintf(desc, "%s?", name);
#endif
}
- else if ((cave[m_ptr->fy][m_ptr->fx].m_idx == p_ptr->riding) || !p_ptr->inside_battle)
- (void)strcpy(desc, name);
- else
+
+ /* Inside monster arena, and it is not your mount */
+ else if (p_ptr->inside_battle &&
+ !(p_ptr->riding && (&m_list[p_ptr->riding] == m_ptr)))
+ {
+ /* It is a fake unique monster */
#ifdef JP
(void)sprintf(desc, "%s¤â¤É¤", name);
#else
(void)sprintf(desc, "fake %s", name);
#endif
+ }
+
+ else
+ {
+ (void)strcpy(desc, name);
+ }
}
/* It could be an indefinite monster */
strcat(desc,buf);
}
- if (cave[m_ptr->fy][m_ptr->fx].m_idx == p_ptr->riding)
+ if (p_ptr->riding && (&m_list[p_ptr->riding] == m_ptr))
{
#ifdef JP
strcat(desc,"(¾èÇÏÃæ)");
}
}
- if ((mode & MD_IGNORE_HALLU) && m_ptr->ap_r_idx != m_ptr->r_idx)
+ if ((mode & MD_IGNORE_HALLU) && !is_original_ap(m_ptr))
{
strcat(desc, format("(%s)", r_name + r_info[m_ptr->r_idx].name));
}
/* Detectable */
flag = TRUE;
- if (is_original_ap(m_ptr))
+ if (is_original_ap(m_ptr) && !p_ptr->image)
{
/* Hack -- Memorize mental flags */
if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
if (r_ptr->flags2 & (RF2_EMPTY_MIND))
{
/* Memorize flags */
- if (is_original_ap(m_ptr)) r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags2 |= (RF2_EMPTY_MIND);
}
/* Weird mind, occasional telepathy */
/* Detectable */
flag = TRUE;
- if (is_original_ap(m_ptr))
+ if (is_original_ap(m_ptr) && !p_ptr->image)
{
/* Memorize flags */
r_ptr->r_flags2 |= (RF2_WEIRD_MIND);
/* Detectable */
flag = TRUE;
- if (is_original_ap(m_ptr))
+ if (is_original_ap(m_ptr) && !p_ptr->image)
{
/* Hack -- Memorize mental flags */
if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART);
if ((p_ptr->esp_animal) && (r_ptr->flags3 & (RF3_ANIMAL)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_ANIMAL);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_ANIMAL);
}
/* Magical sensing */
if ((p_ptr->esp_undead) && (r_ptr->flags3 & (RF3_UNDEAD)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_UNDEAD);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_UNDEAD);
}
/* Magical sensing */
if ((p_ptr->esp_demon) && (r_ptr->flags3 & (RF3_DEMON)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_DEMON);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_DEMON);
}
/* Magical sensing */
if ((p_ptr->esp_orc) && (r_ptr->flags3 & (RF3_ORC)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_ORC);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_ORC);
}
/* Magical sensing */
if ((p_ptr->esp_troll) && (r_ptr->flags3 & (RF3_TROLL)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_TROLL);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_TROLL);
}
/* Magical sensing */
if ((p_ptr->esp_giant) && (r_ptr->flags3 & (RF3_GIANT)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_GIANT);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_GIANT);
}
/* Magical sensing */
if ((p_ptr->esp_dragon) && (r_ptr->flags3 & (RF3_DRAGON)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_DRAGON);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_DRAGON);
}
/* Magical sensing */
if ((p_ptr->esp_human) && (r_ptr->flags2 & (RF2_HUMAN)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags2 |= (RF2_HUMAN);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags2 |= (RF2_HUMAN);
}
/* Magical sensing */
if ((p_ptr->esp_evil) && (r_ptr->flags3 & (RF3_EVIL)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_EVIL);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_EVIL);
}
/* Magical sensing */
if ((p_ptr->esp_good) && (r_ptr->flags3 & (RF3_GOOD)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_GOOD);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_GOOD);
}
/* Magical sensing */
((r_ptr->flags3 & (RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING)) == RF3_NONLIVING))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags3 |= (RF3_NONLIVING);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags3 |= (RF3_NONLIVING);
}
/* Magical sensing */
if ((p_ptr->esp_unique) && (r_ptr->flags1 & (RF1_UNIQUE)))
{
flag = TRUE;
- if (is_original_ap(m_ptr)) r_ptr->r_flags1 |= (RF1_UNIQUE);
+ if (is_original_ap(m_ptr) && !p_ptr->image) r_ptr->r_flags1 |= (RF1_UNIQUE);
}
}
/* Visible */
if (flag)
{
- if (is_original_ap(m_ptr))
+ if (is_original_ap(m_ptr) && !p_ptr->image)
{
/* Memorize flags */
if (do_invisible) r_ptr->r_flags2 |= (RF2_INVISIBLE);
if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
/* Hack -- Count "fresh" sightings */
- if ((m_ptr->ap_r_idx == MON_KAGE) && (r_info[MON_KAGE].r_sights < MAX_SHORT))
- r_info[MON_KAGE].r_sights++;
- else if (m_ptr->ap_r_idx == m_ptr->r_idx &&
- r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++;
+ if (!p_ptr->image)
+ {
+ if ((m_ptr->ap_r_idx == MON_KAGE) && (r_info[MON_KAGE].r_sights < MAX_SHORT))
+ r_info[MON_KAGE].r_sights++;
+ else if (is_original_ap(m_ptr) && (r_ptr->r_sights < MAX_SHORT))
+ r_ptr->r_sights++;
+ }
/* Eldritch Horror */
- if (r_ptr->flags2 & RF2_ELDRITCH_HORROR)
+ if (r_info[m_ptr->ap_r_idx].flags2 & RF2_ELDRITCH_HORROR)
{
sanity_blast(m_ptr, FALSE);
}
monster_race *r_ptr;
char old_m_name[80];
bool old_unique = FALSE;
+ int old_r_idx = m_ptr->r_idx;
if (r_info[m_ptr->r_idx].flags1 & RF1_UNIQUE)
old_unique = TRUE;
m_ptr->ap_r_idx = r_idx;
update_mon(m_idx, FALSE);
lite_spot(m_ptr->fy, m_ptr->fx);
+
+ if ((r_info[old_r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)) ||
+ (r_ptr->flags7 & (RF7_LITE_MASK | RF7_DARK_MASK)))
+ p_ptr->update |= (PU_MON_LITE);
+
if (born)
{
/* Sub-alignment of a chameleon */
{
m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
}
+
+ /* Monsters have double hitpoints in Nightmare mode */
+ if (ironman_nightmare)
+ {
+ u32b hp = m_ptr->max_maxhp * 2L;
+ m_ptr->max_maxhp = (s16b)MIN(30000, hp);
+ }
+
m_ptr->maxhp = (long)(m_ptr->maxhp * m_ptr->max_maxhp) / oldmaxhp;
+ if (m_ptr->maxhp < 1) m_ptr->maxhp = 1;
m_ptr->hp = (long)(m_ptr->hp * m_ptr->max_maxhp) / oldmaxhp;
}
cptr name = (r_name + r_ptr->name);
+ int cmi;
+
/* DO NOT PLACE A MONSTER IN THE SMALL SCALE WILDERNESS !!! */
if (p_ptr->wild_mode) return FALSE;
#else
if (cheat_hear) msg_format("Deep Unique (%s).", name);
#endif
-
-
- /* Boost rating by twice delta-depth */
- rating += (r_ptr->level - dun_level) * 2;
}
/* Normal monsters */
#else
if (cheat_hear) msg_format("Deep Monster (%s).", name);
#endif
-
-
- /* Boost rating by delta-depth */
- rating += (r_ptr->level - dun_level);
}
}
m_ptr->r_idx = r_idx;
m_ptr->ap_r_idx = initial_r_appearance(r_idx);
+ /* No flags */
+ m_ptr->mflag = 0;
+ m_ptr->mflag2 = 0;
+
+ /* Hack -- Appearance transfer */
+ if ((mode & PM_MULTIPLY) && (who > 0) && !is_original_ap(&m_list[who]))
+ {
+ m_ptr->ap_r_idx = m_list[who].ap_r_idx;
+
+ /* Hack -- Shadower spawns Shadower */
+ if (m_list[who].mflag2 & MFLAG2_KAGE) m_ptr->mflag2 |= MFLAG2_KAGE;
+ }
+
/* Sub-alignment of a monster */
if ((who > 0) && !(r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)))
m_ptr->sub_align = m_list[who].sub_align;
m_ptr->fx = x;
- /* No "damage" yet */
- m_ptr->stunned = 0;
- m_ptr->confused = 0;
- m_ptr->monfear = 0;
+ /* No "timed status" yet */
+ for (cmi = 0; cmi < MAX_MTIMED; cmi++) m_ptr->mtimed[cmi] = 0;
/* Unknown distance */
m_ptr->cdis = 0;
m_ptr->exp = 0;
- /* No flags */
- m_ptr->mflag = 0;
- m_ptr->mflag2 = 0;
-
/* Your pet summons its pet. */
if (who > 0 && is_pet(&m_list[who]))
choose_new_monster(c_ptr->m_idx, TRUE, 0);
r_ptr = &r_info[m_ptr->r_idx];
m_ptr->mflag2 |= MFLAG2_CHAMELEON;
- rating++;
/* Hack - Set sub_align to neutral when the Chameleon Lord is generated as "GUARDIAN" */
if ((r_ptr->flags1 & RF1_UNIQUE) && (who <= 0))
}
/* Assume no sleeping */
- m_ptr->csleep = 0;
+ m_ptr->mtimed[MTIMED_CSLEEP] = 0;
/* Enforce sleeping if needed */
if ((mode & PM_ALLOW_SLEEP) && r_ptr->sleep && !ironman_nightmare)
{
int val = r_ptr->sleep;
- m_ptr->csleep = ((val * 2) + randint1(val * 10));
+ (void)set_monster_csleep(c_ptr->m_idx, (val * 2) + randint1(val * 10));
}
/* Assign maximal hitpoints */
/* Extract the monster base speed */
m_ptr->mspeed = get_mspeed(r_ptr);
- if (mode & PM_HASTE) m_ptr->fast = 100;
+ if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100);
/* Give a random starting energy */
if (!ironman_nightmare)
if (r_ptr->flags7 & RF7_SELF_LD_MASK)
p_ptr->update |= (PU_MON_LITE);
- else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !m_ptr->csleep)
+ else if ((r_ptr->flags7 & RF7_HAS_LD_MASK) && !MON_CSLEEP(m_ptr))
p_ptr->update |= (PU_MON_LITE);
/* Update the monster */
/* Hack -- Count the number of "reproducers" */
if (r_ptr->flags2 & RF2_MULTIPLY) num_repro++;
-
/* Hack -- Notice new multi-hued monsters */
{
monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx];
/* Ignore annoying locations */
if (!in_bounds(ny, nx)) continue;
- /* Require "line of sight" */
- if (!los(y, x, ny, nx)) continue;
+ /* Require "line of projection" */
+ if (!projectable(y, x, ny, nx)) continue;
if (r_idx > 0)
{
{
/* Walls and Monsters block flow */
if (!cave_empty_bold2(ny, nx)) continue;
-
+
/* ... nor on the Pattern */
if (pattern_tile(ny, nx)) continue;
}
num[i]++;
/* random swap */
- if(one_in_(num[i]))
+ if (one_in_(num[i]))
{
place_x[i] = nx;
place_y[i] = ny;
{
monster_race *r_ptr = &r_info[r_idx];
- int old, n, i;
+ int n, i;
int total = 0, extra = 0;
int hack_n = 0;
if (total > GROUP_MAX) total = GROUP_MAX;
- /* Save the rating */
- old = rating;
-
/* Start on the monster */
hack_n = 1;
hack_x[0] = x;
}
}
- /* Hack -- restore the rating */
- rating = old;
-
/* Success */
return (TRUE);
/*
* Put the Guardian
*/
-bool alloc_guardian(void)
+bool alloc_guardian(bool def_val)
{
int guardian = d_info[dungeon_type].final_guardian;
/* One less try */
try--;
}
+
+ return FALSE;
}
- return FALSE;
+ return def_val;
}
int attempts_left = 10000;
/* Put the Guardian */
- if (alloc_guardian()) return TRUE;
+ if (alloc_guardian(FALSE)) return TRUE;
/* Find a legal, distant, unoccupied, space */
while (attempts_left--)
x = randint0(cur_wid);
/* Require empty floor grid (was "naked") */
- if (dun_level || (wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].terrain != TERRAIN_MOUNTAIN))
+ if (dun_level)
{
if (!cave_empty_bold2(y, x)) continue;
}
else
{
- if (!cave_empty_bold2(y, x) && !have_flag(f_flags_bold(y, x), FF_MOUNTAIN)) continue;
+ if (!cave_empty_bold(y, x)) continue;
}
/* Accept far away grids */
if (m_ptr->mflag2 & MFLAG2_NOPET) mode |= PM_NO_PET;
- /* Hack -- Shadower spawns Shadower */
- if (m_ptr->mflag2 & MFLAG2_KAGE) mode |= PM_KAGE;
-
/* Create a new monster (awake, no groups) */
- if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE)))
+ if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE | PM_MULTIPLY)))
return FALSE;
/* Hack -- Transfer "clone" flag */
m_list[hack_m_idx_ii].mflag2 |= MFLAG2_NOPET;
}
- /* Hack -- Appearance transfer */
- if (!is_original_ap(m_ptr)) m_list[hack_m_idx_ii].ap_r_idx = m_ptr->ap_r_idx;
-
return TRUE;
}