| 5154 | } |
| 5155 | |
| 5156 | int |
| 5157 | select_newcham_form(struct monst *mon) |
| 5158 | { |
| 5159 | int mndx = NON_PM, tryct; |
| 5160 | |
| 5161 | switch (mon->cham) { |
| 5162 | case PM_SANDESTIN: |
| 5163 | if (rn2(7)) |
| 5164 | mndx = pick_nasty(mons[PM_ARCHON].difficulty - 1); |
| 5165 | break; |
| 5166 | case PM_DOPPELGANGER: |
| 5167 | if (!rn2(7)) { |
| 5168 | mndx = pick_nasty(mons[PM_JABBERWOCK].difficulty - 1); |
| 5169 | } else if (rn2(3)) { /* role monsters */ |
| 5170 | mndx = tt_doppel(mon); |
| 5171 | } else if (!rn2(3)) { /* quest guardians */ |
| 5172 | mndx = rn1(PM_APPRENTICE - PM_STUDENT + 1, PM_STUDENT); |
| 5173 | /* avoid own role's guardian */ |
| 5174 | if (mndx == gu.urole.guardnum) |
| 5175 | mndx = NON_PM; |
| 5176 | } else { /* general humanoids */ |
| 5177 | tryct = 5; |
| 5178 | do { |
| 5179 | mndx = rn1(SPECIAL_PM - LOW_PM, LOW_PM); |
| 5180 | /* assert(ismnum(mndx)); */ |
| 5181 | if (humanoid(&mons[mndx]) && polyok(&mons[mndx])) |
| 5182 | break; |
| 5183 | } while (--tryct > 0); |
| 5184 | if (!tryct) |
| 5185 | mndx = NON_PM; |
| 5186 | } |
| 5187 | break; |
| 5188 | case PM_CHAMELEON: |
| 5189 | if (!rn2(3)) |
| 5190 | mndx = pick_animal(); |
| 5191 | break; |
| 5192 | case PM_VLAD_THE_IMPALER: |
| 5193 | case PM_VAMPIRE_LEADER: |
| 5194 | case PM_VAMPIRE: |
| 5195 | mndx = pickvampshape(mon); |
| 5196 | break; |
| 5197 | case NON_PM: /* ordinary */ |
| 5198 | { |
| 5199 | struct obj *m_armr = which_armor(mon, W_ARM); |
| 5200 | |
| 5201 | if (m_armr && Is_dragon_scales(m_armr)) |
| 5202 | mndx = (int) (Dragon_scales_to_pm(m_armr) - mons); |
| 5203 | else if (m_armr && Is_dragon_mail(m_armr)) |
| 5204 | mndx = (int) (Dragon_mail_to_pm(m_armr) - mons); |
| 5205 | } |
| 5206 | break; |
| 5207 | } |
| 5208 | |
| 5209 | /* for debugging: allow control of polymorphed monster */ |
| 5210 | if (wizard && iflags.mon_polycontrol) |
| 5211 | mndx = wiz_force_cham_form(mon); |
| 5212 | |
| 5213 | /* if no form was specified above, pick one at random now */ |
no test coverage detected