diff -u -rN hengband/src/cave.c hengband-ego/src/cave.c --- hengband/src/cave.c 2007-02-04 21:24:19.979385600 +0900 +++ hengband-ego/src/cave.c 2007-02-04 21:24:24.505894400 +0900 @@ -3006,7 +3006,7 @@ for (i = 1; i < m_max; i++) { m_ptr = &m_list[i]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; diff -u -rN hengband/src/cmd1.c hengband-ego/src/cmd1.c --- hengband/src/cmd1.c 2007-02-04 21:24:20.079529600 +0900 +++ hengband-ego/src/cmd1.c 2007-02-04 21:24:24.606038400 +0900 @@ -220,7 +220,7 @@ { int mult = 10; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; u32b flgs[TR_FLAG_SIZE]; @@ -1712,7 +1712,7 @@ static void touch_zap_player(monster_type *m_ptr) { int aura_damage = 0; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (r_ptr->flags2 & RF2_AURA_FIRE) { @@ -1801,7 +1801,7 @@ int k, bonus, chance; int n_weight = 0; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[80]; int dss, ddd; @@ -1978,7 +1978,7 @@ cave_type *c_ptr = &cave[y][x]; monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Access the weapon */ object_type *o_ptr = &inventory[INVEN_RARM + hand]; @@ -2872,7 +2872,7 @@ monster_desc(m_name, m_ptr, 0); /* Hack -- Get new race */ - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; } } else if (o_ptr->name1 == ART_G_HAMMER) @@ -3071,7 +3071,7 @@ cave_type *c_ptr = &cave[y][x]; monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[80]; /* Disturb the player */ @@ -3893,7 +3893,7 @@ /* Hack -- attack monsters */ if (c_ptr->m_idx && (m_ptr->ml || p_can_enter || p_can_kill_walls)) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Attack -- only if we can see it OR it is not in a wall */ if (!is_hostile(m_ptr) && diff -u -rN hengband/src/cmd2.c hengband-ego/src/cmd2.c --- hengband/src/cmd2.c 2007-02-04 21:24:20.159644800 +0900 +++ hengband-ego/src/cmd2.c 2007-02-04 21:24:24.676139200 +0900 @@ -2961,7 +2961,7 @@ { int mult = 10; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; u32b flgs[TR_FLAG_SIZE]; @@ -3553,7 +3553,7 @@ cave_type *c_ptr = &cave[y][x]; monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Check the visibility */ visible = m_ptr->ml; @@ -4142,7 +4142,7 @@ cave_type *c_ptr = &cave[y][x]; monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Check the visibility */ visible = m_ptr->ml; diff -u -rN hengband/src/cmd5.c hengband-ego/src/cmd5.c --- hengband/src/cmd5.c 2007-02-04 21:24:20.389976000 +0900 +++ hengband-ego/src/cmd5.c 2007-02-04 21:24:24.906470400 +0900 @@ -1611,7 +1611,7 @@ void check_pets_num_and_align(monster_type *m_ptr, bool inc) { s32b old_friend_align = friend_align; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (inc) { @@ -1646,7 +1646,7 @@ m_ptr = &m_list[m_idx]; if (!m_ptr->r_idx) continue; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (is_pet(m_ptr)) { @@ -1891,7 +1891,7 @@ int sn = 0, sy = 0, sx = 0; char m_name[80]; monster_type *m_ptr = &m_list[p_ptr->riding]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; bool fall_dam = FALSE; if (!p_ptr->riding) return FALSE; diff -u -rN hengband/src/cmd6.c hengband-ego/src/cmd6.c --- hengband/src/cmd6.c 2007-02-04 21:24:20.430033600 +0900 +++ hengband-ego/src/cmd6.c 2007-02-04 21:24:24.956542400 +0900 @@ -5201,7 +5201,7 @@ /* Ignore "dead" monsters */ if (!m_ptr->r_idx) continue; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if(r_ptr->flags1 & RF1_UNIQUE) { diff -u -rN hengband/src/defines.h hengband-ego/src/defines.h --- hengband/src/defines.h 2007-02-04 21:24:20.620307200 +0900 +++ hengband-ego/src/defines.h 2007-02-04 21:24:25.056686400 +0900 @@ -5357,6 +5357,8 @@ #define SAVE_MON_MFLAG2 0x00002000 #define SAVE_MON_NICKNAME 0x00004000 #define SAVE_MON_PARENT 0x00008000 +// EGOMON +#define SAVE_MON_EGO 0x00010000 /* diff -u -rN hengband/src/do-spell.c hengband-ego/src/do-spell.c --- hengband/src/do-spell.c 2007-02-04 21:24:20.730465600 +0900 +++ hengband-ego/src/do-spell.c 2007-02-04 21:24:25.166844800 +0900 @@ -10864,7 +10864,7 @@ /* Hack -- attack monsters */ if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT))) { - if (!monster_living(&r_info[m_ptr->r_idx])) + if (!monster_living(m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx])) { char m_name[80]; @@ -11032,7 +11032,7 @@ m_ptr = &m_list[m_idx]; /* Monster cannot move back? */ - if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0)) + if (!monster_can_enter(ny, nx, m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx], 0)) { /* -more- */ if (i < 2) msg_print(NULL); diff -u -rN hengband/src/dungeon.c hengband-ego/src/dungeon.c --- hengband/src/dungeon.c 2007-02-04 21:24:20.860652800 +0900 +++ hengband-ego/src/dungeon.c 2007-02-04 21:24:25.297032000 +0900 @@ -1007,7 +1007,7 @@ { /* Check the i'th monster */ monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ @@ -2690,7 +2690,7 @@ for (monster = 0; monster < m_max; monster++) { monster_type *m_ptr = &m_list[monster]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -3481,7 +3481,7 @@ /* Ignore pet */ if (is_pet(m_ptr)) continue; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Unique monsters */ if (r_ptr->flags1 & (RF1_UNIQUE)) @@ -5564,7 +5564,7 @@ if (p_ptr->riding && !p_ptr->confused && !p_ptr->blind) { monster_type *m_ptr = &m_list[p_ptr->riding]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (MON_CSLEEP(m_ptr)) { diff -u -rN hengband/src/load.c hengband-ego/src/load.c --- hengband/src/load.c 2007-02-04 21:24:21.511588800 +0900 +++ hengband-ego/src/load.c 2007-02-04 21:24:25.967996800 +0900 @@ -903,6 +903,27 @@ if (flags & SAVE_MON_PARENT) rd_s16b(&m_ptr->parent_m_idx); else m_ptr->parent_m_idx = 0; + + // EGOMON + if (flags & SAVE_MON_EGO) { + m_ptr->ego_race = RNEW(monster_race); + memcpy(m_ptr->ego_race,&r_info[m_ptr->r_idx],sizeof(monster_race)); + // + rd_s16b(&m_ptr->ego_race->ac); + rd_s32b(&m_ptr->ego_race->mexp); + rd_byte(&m_ptr->ego_race->freq_spell); + rd_u32b(&m_ptr->ego_race->flags1); + rd_u32b(&m_ptr->ego_race->flags2); + rd_u32b(&m_ptr->ego_race->flags3); + rd_u32b(&m_ptr->ego_race->flags4); + rd_u32b(&m_ptr->ego_race->flags5); + rd_u32b(&m_ptr->ego_race->flags6); + rd_u32b(&m_ptr->ego_race->flags7); + rd_u32b(&m_ptr->ego_race->flags8); + rd_u32b(&m_ptr->ego_race->flags9); + rd_u32b(&m_ptr->ego_race->flagsr); + } + else m_ptr->ego_race = NULL; } diff -u -rN hengband/src/mane.c hengband-ego/src/mane.c --- hengband/src/mane.c 2007-02-04 21:24:22.012308800 +0900 +++ hengband-ego/src/mane.c 2007-02-04 21:24:26.478731200 +0900 @@ -930,7 +930,7 @@ if (!player_has_los_bold(target_row, target_col)) break; if (!projectable(py, px, target_row, target_col)) break; m_ptr = &m_list[cave[target_row][target_col].m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_desc(m_name, m_ptr, 0); if (r_ptr->flagsr & RFR_RES_TELE) { @@ -984,7 +984,7 @@ if (!player_has_los_bold(target_row, target_col)) break; if (!projectable(py, px, target_row, target_col)) break; m_ptr = &m_list[target_m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_desc(m_name, m_ptr, 0); #ifdef JP msg_format("%^sの足を指さした。", m_name); diff -u -rN hengband/src/melee1.c hengband-ego/src/melee1.c --- hengband/src/melee1.c 2007-02-04 21:24:22.042352000 +0900 +++ hengband-ego/src/melee1.c 2007-02-04 21:24:26.508774400 +0900 @@ -144,7 +144,7 @@ { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; int ap_cnt; diff -u -rN hengband/src/melee2.c hengband-ego/src/melee2.c --- hengband/src/melee2.c 2007-02-04 21:24:22.082409600 +0900 +++ hengband-ego/src/melee2.c 2007-02-04 21:24:26.538817600 +0900 @@ -33,7 +33,7 @@ int plus = 1; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_type *t_ptr; @@ -190,7 +190,7 @@ { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[160]; @@ -419,7 +419,7 @@ #ifdef ALLOW_TERROR - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; u16b p_lev, m_lev; u16b p_chp, p_mhp; @@ -493,7 +493,7 @@ int now_cost; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Monster location */ y1 = m_ptr->fy; @@ -591,7 +591,7 @@ bool use_scent = FALSE; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Can monster cast attack spell? */ if (r_ptr->flags4 & (RF4_ATTACK_MASK) || @@ -943,7 +943,7 @@ c_ptr = &cave[y][x]; /* Skip locations in a wall */ - if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], (m_idx == p_ptr->riding) ? CEM_RIDING : 0)) continue; + if (!monster_can_cross_terrain(c_ptr->feat, m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx], (m_idx == p_ptr->riding) ? CEM_RIDING : 0)) continue; /* Check for "availability" (if monsters can flow) */ if (!(m_ptr->mflag2 & MFLAG2_NOFLOW)) @@ -999,7 +999,7 @@ static bool find_hiding(int m_idx, int *yp, int *xp) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; int fy = m_ptr->fy; int fx = m_ptr->fx; @@ -1069,7 +1069,7 @@ static bool get_moves(int m_idx, int *mm) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; int y, ay, x, ax; int move_val = 0; int y2 = py; @@ -1428,7 +1428,7 @@ monster_type *m_ptr = &m_list[m_idx]; monster_type *t_ptr = &m_list[t_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_race *tr_ptr = &r_info[t_ptr->r_idx]; int ap_cnt; @@ -2206,7 +2206,7 @@ static void process_monster(int m_idx) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; int i, d, oy, ox, ny, nx; @@ -2257,7 +2257,7 @@ if ((m_ptr->mflag2 & MFLAG2_CHAMELEON) && one_in_(13) && !MON_CSLEEP(m_ptr)) { choose_new_monster(m_idx, FALSE, 0); - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; } /* Players hidden in shadow are almost imperceptable. -LM- */ @@ -3671,7 +3671,7 @@ { /* Access the monster */ m_ptr = &m_list[i]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Handle "leaving" */ if (p_ptr->leaving) break; @@ -4185,7 +4185,7 @@ { case MTIMED_CSLEEP: { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Assume does not wake up */ bool test = FALSE; @@ -4551,7 +4551,7 @@ void monster_gain_exp(int m_idx, int s_idx) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_race *s_ptr = &r_info[s_idx]; int new_exp; @@ -4583,7 +4583,7 @@ real_r_ptr(m_ptr)->cur_num++; m_ptr->ap_r_idx = m_ptr->r_idx; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (r_ptr->flags1 & RF1_FORCE_MAXHP) { diff -u -rN hengband/src/mind.c hengband-ego/src/mind.c --- hengband/src/mind.c 2007-02-04 21:24:22.142496000 +0900 +++ hengband-ego/src/mind.c 2007-02-04 21:24:26.618932800 +0900 @@ -1111,7 +1111,7 @@ int oy = y, ox = x; int m_idx = cave[y][x].m_idx; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[80]; monster_desc(m_name, m_ptr, 0); diff -u -rN hengband/src/monster1.c hengband-ego/src/monster1.c --- hengband/src/monster1.c 2007-02-04 21:24:22.192568000 +0900 +++ hengband-ego/src/monster1.c 2007-02-04 21:24:26.669004800 +0900 @@ -3508,7 +3508,7 @@ */ bool are_enemies(monster_type *m_ptr, monster_type *n_ptr) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_race *s_ptr = &r_info[n_ptr->r_idx]; if (p_ptr->inside_battle) diff -u -rN hengband/src/monster2.c hengband-ego/src/monster2.c --- hengband/src/monster2.c 2007-02-04 21:24:22.252654400 +0900 +++ hengband-ego/src/monster2.c 2007-02-04 21:31:42.105131200 +0900 @@ -173,7 +173,7 @@ */ monster_race *real_r_ptr(monster_type *m_ptr) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Extract real race */ if (m_ptr->mflag2 & MFLAG2_CHAMELEON) @@ -201,7 +201,7 @@ monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; s16b this_o_idx, next_o_idx = 0; @@ -421,7 +421,7 @@ { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Paranoia -- skip "dead" monsters */ if (!m_ptr->r_idx) continue; @@ -1945,7 +1945,7 @@ { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* If the monster doesn't have original appearance, don't note */ if (!is_original_ap(m_ptr)) return; @@ -2313,7 +2313,7 @@ { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; bool do_disturb = disturb_move; @@ -2717,7 +2717,7 @@ { monster_race *r_ptr = &r_info[r_idx]; monster_type *m_ptr = &m_list[chameleon_change_m_idx]; - monster_race *old_r_ptr = &r_info[m_ptr->r_idx]; + monster_race *old_r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (!(r_ptr->flags1 & (RF1_UNIQUE))) return FALSE; if (r_ptr->flags7 & (RF7_FRIENDLY | RF7_CHAMELEON)) return FALSE; @@ -2748,7 +2748,7 @@ { monster_race *r_ptr = &r_info[r_idx]; monster_type *m_ptr = &m_list[chameleon_change_m_idx]; - monster_race *old_r_ptr = &r_info[m_ptr->r_idx]; + monster_race *old_r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (r_ptr->flags1 & (RF1_UNIQUE)) return FALSE; if (r_ptr->flags2 & RF2_MULTIPLY) return FALSE; @@ -3142,6 +3142,150 @@ /* Get a new monster record */ m_ptr = &m_list[c_ptr->m_idx]; + // EGOMON + if(one_in_(333)){ + m_ptr->ego_race = RNEW(monster_race); + memcpy(m_ptr->ego_race,r_ptr,sizeof(monster_race)); + m_ptr->ego_race->ac = m_ptr->ego_race->ac * rand_range(100,150) / 100; + m_ptr->ego_race->mexp = m_ptr->ego_race->mexp * rand_range(150,200) / 100; + m_ptr->ego_race->flags1 |= RF1_DROP_GOOD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags1 |= RF1_DROP_GREAT; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_STUPID; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_SMART; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_CAN_SPEAK; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_REFLECTING; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_EMPTY_MIND; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_WEIRD_MIND; + m_ptr->ego_race->flags2 &= ~RF2_MULTIPLY; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_REGENERATE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_AURA_FIRE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_AURA_ELEC; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_OPEN_DOOR; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_BASH_DOOR; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_PASS_WALL; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_WALL; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_MOVE_BODY; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_BODY; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_TAKE_ITEM; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_ITEM; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_GOOD; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_AURA_COLD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_FEAR; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_STUN; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_CONF; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_SLEEP; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_SHRIEK; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_DISPEL; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_ROCKET; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_SHOOT; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_ACID; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_ELEC; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_FIRE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_COLD; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_POIS; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NETH; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_LITE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DARK; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_CONF; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_SOUN; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_CHAO; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DISE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NEXU; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_TIME; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_INER; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_GRAV; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_SHAR; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_PLAS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BA_NUKE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NUKE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BA_CHAO; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DISI; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_ACID; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_ELEC; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_FIRE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_COLD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_POIS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_NETH; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_WATE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_MANA; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_DARK; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_DRAIN_MANA; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_MIND_BLAST; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BRAIN_SMASH; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_1; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_2; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_3; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_4; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ACID; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ELEC; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_FIRE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_COLD; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_LITE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_NETH; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_WATE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_MANA; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_PLAS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ICEE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_MISSILE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_SCARE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BLIND; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CONF; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_SLOW; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_HOLD; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HASTE; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HAND_DOOM; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HEAL; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_INVULNER; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_BLINK; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TPORT; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_WORLD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_TO; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_AWAY; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_LEVEL; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_PSY_SPEAR; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_DARKNESS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TRAPS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_FORGET; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_RAISE_DEAD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_KIN; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_CYBER; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_MONSTER; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_MONSTERS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_ANT; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_SPIDER; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HOUND; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HYDRA; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_ANGEL; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_DEMON; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_UNDEAD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_DRAGON; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HI_UNDEAD; + if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HI_DRAGON; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_AMBERITES; + if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_UNIQUE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_ACID; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_ELEC; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_FIRE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_COLD; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_POIS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_LITE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_DARK; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_NETH; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_WATE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_PLAS; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_SHAR; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_SOUN; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_CHAO; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_NEXU; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_DISE; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_WALL; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_INER; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_TIME; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_GRAV; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_ALL; + if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_TELE; + } + /* Save the race */ m_ptr->r_idx = r_idx; m_ptr->ap_r_idx = initial_r_appearance(r_idx); @@ -3183,6 +3327,12 @@ reset_target(m_ptr); m_ptr->nickname = 0; + // EGOMON + if(m_ptr->ego_race){ + char buffer[16]; + get_table_name_aux(buffer); + m_ptr->nickname = quark_add(buffer); + } m_ptr->exp = 0; @@ -3201,7 +3351,7 @@ if (r_ptr->flags7 & RF7_CHAMELEON) { choose_new_monster(c_ptr->m_idx, TRUE, 0); - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; m_ptr->mflag2 |= MFLAG2_CHAMELEON; /* Hack - Set sub_align to neutral when the Chameleon Lord is generated as "GUARDIAN" */ @@ -3250,6 +3400,10 @@ { m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside); } + // EGOMON + if(m_ptr->ego_race){ + m_ptr->max_maxhp = m_ptr->max_maxhp * 3 / 2; + } /* Monsters have double hitpoints in Nightmare mode */ if (ironman_nightmare) @@ -3269,6 +3423,11 @@ /* Extract the monster base speed */ m_ptr->mspeed = get_mspeed(r_ptr); + // EGOMON + if(m_ptr->ego_race){ + m_ptr->mspeed = m_ptr->mspeed * 5 / 4; + if(m_ptr->mspeed > 199) m_ptr->mspeed = 199; + } if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100); @@ -4130,7 +4289,7 @@ int percentage; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[80]; @@ -4837,7 +4996,7 @@ { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Not allowed to learn */ diff -u -rN hengband/src/mspells1.c hengband-ego/src/mspells1.c --- hengband/src/mspells1.c 2007-02-04 21:24:22.332769600 +0900 +++ hengband-ego/src/mspells1.c 2007-02-04 21:24:26.809206400 +0900 @@ -65,7 +65,7 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; u32b f4 = (*f4p); u32b f5 = (*f5p); @@ -509,7 +509,7 @@ int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | PROJECT_PLAYER; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Determine the radius of the blast */ if ((rad < 1) && breath) rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2; @@ -837,7 +837,7 @@ bool dispel_check(int m_idx) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Invulnabilty (including the song) */ if (IS_INVULN()) return (TRUE); @@ -949,7 +949,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; byte escape[96], escape_num = 0; byte attack[96], attack_num = 0; @@ -1299,7 +1299,7 @@ byte spell[96], num = 0; u32b f4, f5, f6; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char m_name[80]; #ifndef JP char m_poss[80]; diff -u -rN hengband/src/mspells2.c hengband-ego/src/mspells2.c --- hengband/src/mspells2.c 2007-02-04 21:24:22.392856000 +0900 +++ hengband-ego/src/mspells2.c 2007-02-04 21:24:26.879307200 +0900 @@ -23,7 +23,7 @@ int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Determine the radius of the blast */ if (rad < 1 && breath) rad = (r_ptr->flags2 & RF2_POWERFUL) ? 3 : 2; @@ -304,7 +304,7 @@ monster_type *m_ptr = &m_list[m_idx]; monster_type *t_ptr = NULL; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_race *tr_ptr = NULL; u32b f4, f5, f6; diff -u -rN hengband/src/mspells3.c hengband-ego/src/mspells3.c --- hengband/src/mspells3.c 2007-02-04 21:24:22.452942400 +0900 +++ hengband-ego/src/mspells3.c 2007-02-04 21:24:26.939393600 +0900 @@ -1357,7 +1357,7 @@ if (!player_has_los_bold(target_row, target_col)) break; if (!projectable(py, px, target_row, target_col)) break; m_ptr = &m_list[cave[target_row][target_col].m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_desc(m_name, m_ptr, 0); if (r_ptr->flagsr & RFR_RES_TELE) { @@ -1411,7 +1411,7 @@ if (!player_has_los_bold(target_row, target_col)) break; if (!projectable(py, px, target_row, target_col)) break; m_ptr = &m_list[target_m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_desc(m_name, m_ptr, 0); #ifdef JP msg_format("%^sの足を指さした。", m_name); diff -u -rN hengband/src/mutation.c hengband-ego/src/mutation.c --- hengband/src/mutation.c 2007-02-04 21:24:22.493000000 +0900 +++ hengband-ego/src/mutation.c 2007-02-04 21:24:26.979451200 +0900 @@ -3745,7 +3745,7 @@ } m_ptr = &m_list[c_ptr->m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if ((r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags1 & RF1_QUESTOR) && diff -u -rN hengband/src/object2.c hengband-ego/src/object2.c --- hengband/src/object2.c 2007-02-04 21:24:22.663244800 +0900 +++ hengband-ego/src/object2.c 2007-02-04 21:24:27.139681600 +0900 @@ -6389,7 +6389,7 @@ /* Calculate spell damages */ static void spell_damcalc(monster_type *m_ptr, int typ, int dam, int limit, int *max) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; int rlev = r_ptr->level; bool ignore_wraith_form = FALSE; @@ -6726,7 +6726,7 @@ if (MON_CSLEEP(m_ptr)) continue; if (!is_hostile(m_ptr)) continue; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Monster spells (only powerful ones)*/ if (projectable(my, mx, yy, xx)) diff -u -rN hengband/src/racial.c hengband-ego/src/racial.c --- hengband/src/racial.c 2007-02-04 21:24:22.783417600 +0900 +++ hengband-ego/src/racial.c 2007-02-04 21:24:27.259854400 +0900 @@ -1287,7 +1287,7 @@ } if (!do_riding(TRUE)) return TRUE; m_ptr = &m_list[p_ptr->riding]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_desc(m_name, m_ptr, 0); #ifdef JP msg_format("%sに乗った。",m_name); diff -u -rN hengband/src/save.c hengband-ego/src/save.c --- hengband/src/save.c 2007-02-04 21:24:22.973691200 +0900 +++ hengband-ego/src/save.c 2007-02-04 21:24:27.460142400 +0900 @@ -179,7 +179,6 @@ if (flags & SAVE_ITEM_ART_NAME) wr_string(quark_str(o_ptr->art_name)); } - /* * Write a "monster" record */ @@ -204,6 +203,8 @@ if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2; if (m_ptr->nickname) flags |= SAVE_MON_NICKNAME; if (m_ptr->parent_m_idx) flags |= SAVE_MON_PARENT; + // EGOMON + if (m_ptr->ego_race) flags |= SAVE_MON_EGO; /*** Monster save flags ***/ wr_u32b(flags); @@ -262,6 +263,22 @@ if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2); if (flags & SAVE_MON_NICKNAME) wr_string(quark_str(m_ptr->nickname)); if (flags & SAVE_MON_PARENT) wr_s16b(m_ptr->parent_m_idx); + // EGOMON + if (flags & SAVE_MON_EGO){ + wr_s16b(m_ptr->ego_race->ac); + wr_s32b(m_ptr->ego_race->mexp); + wr_byte(m_ptr->ego_race->freq_spell); + wr_u32b(m_ptr->ego_race->flags1); + wr_u32b(m_ptr->ego_race->flags2); + wr_u32b(m_ptr->ego_race->flags3); + wr_u32b(m_ptr->ego_race->flags4); + wr_u32b(m_ptr->ego_race->flags5); + wr_u32b(m_ptr->ego_race->flags6); + wr_u32b(m_ptr->ego_race->flags7); + wr_u32b(m_ptr->ego_race->flags8); + wr_u32b(m_ptr->ego_race->flags9); + wr_u32b(m_ptr->ego_race->flagsr); + } } diff -u -rN hengband/src/spells1.c hengband-ego/src/spells1.c --- hengband/src/spells1.c 2007-02-04 21:24:23.033777600 +0900 +++ hengband-ego/src/spells1.c 2007-02-04 21:24:27.520228800 +0900 @@ -1692,7 +1692,7 @@ monster_type *m_ptr = &m_list[c_ptr->m_idx]; monster_type *caster_ptr = (who > 0) ? &m_list[who] : NULL; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; char killer[80]; @@ -5943,7 +5943,7 @@ m_ptr = &m_list[c_ptr->m_idx]; /* Hack -- Get new race */ - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; } /* Handle "teleport" */ @@ -6443,7 +6443,7 @@ /* Get the source monster */ m_ptr = &m_list[who]; /* Extract the monster level */ - rlev = (((&r_info[m_ptr->r_idx])->level >= 1) ? (&r_info[m_ptr->r_idx])->level : 1); + rlev = (((m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx])->level >= 1) ? (m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx])->level : 1); /* Get the monster name */ monster_desc(m_name, m_ptr, 0); @@ -9044,7 +9044,7 @@ if (grids <= 1) { monster_type *m_ptr = &m_list[cave[y][x].m_idx]; - monster_race *ref_ptr = &r_info[m_ptr->r_idx]; + monster_race *ref_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if ((flg & PROJECT_REFLECTABLE) && cave[y][x].m_idx && (ref_ptr->flags2 & RF2_REFLECTING) && ((cave[y][x].m_idx != p_ptr->riding) || !(flg & PROJECT_PLAYER)) && diff -u -rN hengband/src/spells2.c hengband-ego/src/spells2.c --- hengband/src/spells2.c 2007-02-04 21:24:23.153950400 +0900 +++ hengband-ego/src/spells2.c 2007-02-04 21:24:27.640401600 +0900 @@ -3894,7 +3894,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -3956,7 +3956,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4026,7 +4026,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4101,7 +4101,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4168,7 +4168,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4235,7 +4235,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4309,7 +4309,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4593,7 +4593,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; -/* monster_race *r_ptr = &r_info[m_ptr->r_idx]; */ +/* monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; */ /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4643,7 +4643,7 @@ { int msec = delay_factor * delay_factor * delay_factor; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; bool resist = FALSE; if (is_pet(m_ptr) && !player_cast) return FALSE; @@ -4774,7 +4774,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4862,7 +4862,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -4911,7 +4911,7 @@ for (i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Paranoia -- Skip dead monsters */ if (!m_ptr->r_idx) continue; @@ -5129,7 +5129,7 @@ if (c_ptr->m_idx) { monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (in_generate) /* In generation */ { @@ -5605,7 +5605,7 @@ if (c_ptr->m_idx) { monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Quest monsters */ if (r_ptr->flags1 & RF1_QUESTOR) @@ -5898,7 +5898,7 @@ monster_race *r_ptr; if (!m_ptr->r_idx || !is_pet(m_ptr)) continue; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Uniques resist discharging */ if (r_ptr->flags1 & RF1_UNIQUE) @@ -5977,7 +5977,7 @@ monster_type *m_ptr = &m_list[c_ptr->m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* Update the monster */ update_mon(c_ptr->m_idx, FALSE); @@ -6619,7 +6619,7 @@ } m_ptr = &m_list[c_ptr->m_idx]; - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; (void)set_monster_csleep(c_ptr->m_idx, 0); diff -u -rN hengband/src/spells3.c hengband-ego/src/spells3.c --- hengband/src/spells3.c 2007-02-04 21:24:23.244080000 +0900 +++ hengband-ego/src/spells3.c 2007-02-04 21:24:27.750560000 +0900 @@ -37,7 +37,7 @@ if (!(mode & TELEPORT_PASSIVE)) { - if (!monster_can_cross_terrain(c_ptr->feat, &r_info[m_ptr->r_idx], 0)) return FALSE; + if (!monster_can_cross_terrain(c_ptr->feat, m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx], 0)) return FALSE; } return TRUE; @@ -449,7 +449,7 @@ if (tmp_m_idx && (p_ptr->riding != tmp_m_idx)) { monster_type *m_ptr = &m_list[tmp_m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* * The latter limitation is to avoid @@ -487,7 +487,7 @@ if (tmp_m_idx && (p_ptr->riding != tmp_m_idx) && (m_idx != tmp_m_idx)) { monster_type *m_ptr = &m_list[tmp_m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; /* * The latter limitation is to avoid diff -u -rN hengband/src/types.h hengband-ego/src/types.h --- hengband/src/types.h 2007-02-04 21:24:23.544512000 +0900 +++ hengband-ego/src/types.h 2007-02-04 21:24:28.050992000 +0900 @@ -610,6 +610,8 @@ u32b smart; /* Field for "smart_learn" */ s16b parent_m_idx; + // EGOMON + monster_race* ego_race; }; diff -u -rN hengband/src/xtra2.c hengband-ego/src/xtra2.c --- hengband/src/xtra2.c 2007-02-04 21:24:23.885001600 +0900 +++ hengband-ego/src/xtra2.c 2007-02-04 21:24:28.381467200 +0900 @@ -696,7 +696,7 @@ monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; bool visible = ((m_ptr->ml && !p_ptr->image) || (r_ptr->flags1 & RF1_UNIQUE)); @@ -754,7 +754,7 @@ if (m_ptr->mflag2 & MFLAG2_CHAMELEON) { choose_new_monster(m_idx, TRUE, MON_CHAMELEON); - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; } /* Check for quest completion */ @@ -1586,7 +1586,7 @@ */ int mon_damage_mod(monster_type *m_ptr, int dam, bool is_psy_spear) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if ((r_ptr->flagsr & RFR_RES_ALL) && dam > 0) { @@ -1627,7 +1627,7 @@ */ static void get_exp_from_mon(int dam, monster_type *m_ptr) { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; s32b new_exp; u32b new_exp_frac; @@ -1713,7 +1713,7 @@ bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; monster_type exp_mon; @@ -1758,10 +1758,10 @@ { char m_name[80]; - if (r_info[m_ptr->r_idx].flags7 & RF7_TANUKI) + if ((m_ptr->ego_race? *m_ptr->ego_race: r_info[m_ptr->r_idx]).flags7 & RF7_TANUKI) { /* You might have unmasked Tanuki first time */ - r_ptr = &r_info[m_ptr->r_idx]; + r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; m_ptr->ap_r_idx = m_ptr->r_idx; if (r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++; } @@ -4480,7 +4480,7 @@ else if (p_ptr->riding) { monster_type *m_ptr = &m_list[p_ptr->riding]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + monster_race *r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx]; if (MON_CONFUSED(m_ptr)) {