Ticket #934: md_934_vs1714.patch

File md_934_vs1714.patch, 49.3 KB (added by MarbleDice, 10 years ago)

Fixes #934, see comments below. Includes an extra bug fix for the compiler warning.

  • src/attack.c

     
    207207        monster_race *r_ptr = &r_info[m_ptr->r_idx]; 
    208208        monster_lore *l_ptr = &l_list[m_ptr->r_idx]; 
    209209 
    210         u32b f[OBJ_FLAG_N]; 
     210        u32b f[OBJ_FLAG_N], known_f[OBJ_FLAG_N]; 
    211211        object_flags(o_ptr, f); 
     212        object_flags_known(o_ptr, known_f); 
    212213 
    213214        for (s_ptr = slay_table; s_ptr->slay_flag; s_ptr++) 
    214215        { 
    215216                if (!(f[0] & s_ptr->slay_flag)) continue; 
     217                 
     218                /* Learn about monster resistance/vulnerability IF: 
     219                 * 1) The slay flag on the object is known OR 
     220                 * 2) The monster does not possess the appropriate resistance flag OR 
     221                 * 3) The monster does possess the appropriate vulnerability flag 
     222                 */ 
     223                if (known_f[0] & s_ptr->slay_flag || 
     224                    (s_ptr->monster_flag && (r_ptr->flags[2] & s_ptr->monster_flag)) || 
     225                    (s_ptr->resist_flag && !(r_ptr->flags[2] & s_ptr->resist_flag))) 
     226                { 
     227                        if (m_ptr->ml && s_ptr->monster_flag) 
     228                        { 
     229                                l_ptr->flags[2] |= s_ptr->monster_flag; 
     230                        } 
    216231 
     232                        if (m_ptr->ml && s_ptr->resist_flag) 
     233                        { 
     234                                l_ptr->flags[2] |= s_ptr->resist_flag; 
     235                        } 
     236                } 
     237 
    217238                /* notice any brand or slay that would affect the monster */ 
    218239                if ((s_ptr->resist_flag) || (r_ptr->flags[2] & s_ptr->monster_flag)) 
    219240                { 
     
    225246                if ((s_ptr->brand && !(r_ptr->flags[2] & s_ptr->resist_flag)) ||  
    226247                        (r_ptr->flags[2] & s_ptr->monster_flag)) 
    227248                { 
    228                         /* Learn the flag */ 
    229                         if (m_ptr->ml) 
    230                                 l_ptr->flags[2] |= s_ptr->monster_flag; 
    231  
    232249                        if (mult < s_ptr->mult) 
    233250                                mult = s_ptr->mult; 
    234251 
     
    247264                                                s_ptr->active_verb); 
    248265                        } 
    249266                } 
    250  
    251                 /* If the monster resisted, add to the monster lore */ 
    252                 if (r_ptr->flags[2] & s_ptr->resist_flag) 
    253                 { 
    254                         if (m_ptr->ml) 
    255                                 l_ptr->flags[2] |= s_ptr->resist_flag; 
    256                 } 
    257267        } 
    258268         
    259269        return mult; 
     
    270280{ 
    271281        int num = 0, bonus, chance; 
    272282 
    273         monster_type *m_ptr; 
    274         monster_race *r_ptr; 
    275         monster_lore *l_ptr; 
     283        monster_type *m_ptr = &mon_list[cave_m_idx[y][x]]; 
     284        monster_race *r_ptr = &r_info[m_ptr->r_idx]; 
     285        monster_lore *l_ptr = &l_list[m_ptr->r_idx]; 
    276286 
    277287        object_type *o_ptr; 
    278288 
     
    284294 
    285295        const char *crit_msg = NULL; 
    286296 
    287         /* Get the monster */ 
    288         m_ptr = &mon_list[cave_m_idx[y][x]]; 
    289         r_ptr = &r_info[m_ptr->r_idx]; 
    290         l_ptr = &l_list[m_ptr->r_idx]; 
    291297 
    292  
    293298        /* Disturb the player */ 
    294299        disturb(0, 0); 
    295300 
     
    409414                                /* Message */ 
    410415                                msg_print("Your hands stop glowing."); 
    411416 
     417                                /* Update the lore */ 
     418                                if (m_ptr->ml) 
     419                                { 
     420                                        l_ptr->flags[2] |= (RF2_NO_CONF); 
     421                                } 
     422 
    412423                                /* Confuse the monster */ 
    413424                                if (r_ptr->flags[2] & (RF2_NO_CONF)) 
    414425                                { 
    415                                         if (m_ptr->ml) 
    416                                         { 
    417                                                 l_ptr->flags[2] |= (RF2_NO_CONF); 
    418                                         } 
    419  
    420426                                        msg_format("%^s is unaffected.", m_name); 
    421427                                } 
    422428                                else if (randint0(100) < r_ptr->level) 
  • src/externs.h

     
    404404extern void update_smart_learn(int m_idx, int what); 
    405405void monster_death(int m_idx); 
    406406bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note); 
     407extern void monster_flags_known(const monster_race *r_ptr, const monster_lore *l_ptr, u32b flags[]); 
    407408 
    408409/* pathfind.c */ 
    409410extern bool findpath(int y, int x); 
  • src/load-old.c

     
    602602                /* XXX */ 
    603603                strip_bytes(3); 
    604604 
    605                 /* Repair the lore flags */ 
    606                 for (i = 0; i < RACE_FLAG_STRICT_UB; i++) 
    607                         l_ptr->flags[i] &= r_ptr->flags[i]; 
     605                /* Repair the spell lore flags */ 
    608606                for (i = 0; i < RACE_FLAG_SPELL_STRICT_UB; i++) 
    609607                        l_ptr->spell_flags[i] &= r_ptr->spell_flags[i]; 
    610608        } 
  • src/load.c

     
    490490                /* XXX */ 
    491491                strip_bytes(3); 
    492492 
    493                 /* Repair the lore flags */ 
    494                 for (i = 0; i < RACE_FLAG_STRICT_UB; i++) 
    495                         l_ptr->flags[i] &= r_ptr->flags[i]; 
     493                /* Repair the spell lore flags */ 
    496494                for (i = 0; i < RACE_FLAG_SPELL_STRICT_UB; i++) 
    497495                        l_ptr->spell_flags[i] &= r_ptr->spell_flags[i]; 
    498496        } 
  • src/monster/melee1.c

     
    243243 
    244244 
    245245                        /* Hack -- Apply "protection from evil" */ 
    246                         if ((p_ptr->timed[TMD_PROTEVIL] > 0) && 
    247                             (r_ptr->flags[2] & (RF2_EVIL)) && 
    248                             (p_ptr->lev >= rlev) && 
    249                             ((randint0(100) + p_ptr->lev) > 50)) 
     246                        if (p_ptr->timed[TMD_PROTEVIL] > 0) 
    250247                        { 
    251                                 /* Remember the Evil-ness */ 
     248                                /* Learn about the evil flag */ 
    252249                                if (m_ptr->ml) 
    253250                                { 
    254251                                        l_ptr->flags[2] |= (RF2_EVIL); 
    255252                                } 
    256253 
    257                                 /* Message */ 
    258                                 msg_format("%^s is repelled.", m_name); 
     254                                if ((r_ptr->flags[2] & (RF2_EVIL)) && 
     255                                    (p_ptr->lev >= rlev) && 
     256                                    ((randint0(100) + p_ptr->lev) > 50)) 
     257                                { 
     258                                        /* Message */ 
     259                                        msg_format("%^s is repelled.", m_name); 
    259260 
    260                                 /* Hack -- Next attack */ 
    261                                 continue; 
     261                                        /* Hack -- Next attack */ 
     262                                        continue; 
     263                                } 
    262264                        } 
    263265 
    264266 
  • src/monster/melee2.c

     
    31863186 
    31873187        bool did_open_door; 
    31883188        bool did_bash_door; 
    3189         bool did_take_item; 
    3190         bool did_kill_item; 
    3191         bool did_move_body; 
    3192         bool did_kill_body; 
    3193         bool did_pass_wall; 
    3194         bool did_kill_wall; 
    31953189 
    31963190 
    31973191        /* Handle "sleep" */ 
     
    34143408        ox = m_ptr->fx; 
    34153409 
    34163410 
    3417         /* Attempt to "mutiply" if able and allowed */ 
    3418         if ((r_ptr->flags[1] & (RF1_MULTIPLY)) && (num_repro < MAX_REPRO)) 
     3411        /* Attempt to "mutiply" (all monsters are allowed an attempt for lore 
     3412         * purposes, even non-breeders) 
     3413         */ 
     3414        if (num_repro < MAX_REPRO) 
    34193415        { 
    34203416                int k, y, x; 
    34213417 
     
    34293425                        } 
    34303426                } 
    34313427 
    3432                 /* Hack -- multiply slower in crowded areas */ 
    3433                 if ((k < 4) && (!k || one_in_(k * MON_MULT_ADJ))) 
     3428                /* Multiply slower in crowded areas */ 
     3429                if ((k < 4) && (k == 0 || one_in_(k * MON_MULT_ADJ))) 
    34343430                { 
    3435                         /* Try to multiply */ 
    3436                         if (multiply_monster(m_idx)) 
     3431                        /* Successful breeding attempt, learn about that now */ 
     3432                        if (m_ptr->ml) l_ptr->flags[1] |= (RF1_MULTIPLY); 
     3433                         
     3434                        /* Try to multiply (only breeders allowed) */ 
     3435                        if ((r_ptr->flags[1] & (RF1_MULTIPLY)) && multiply_monster(m_idx)) 
    34373436                        { 
    3438                                 /* Take note if visible */ 
     3437                                /* Make a sound */ 
    34393438                                if (m_ptr->ml) 
    34403439                                { 
    3441                                         l_ptr->flags[1] |= (RF1_MULTIPLY); 
    3442  
    3443                                         /* Make a sound */ 
    34443440                                        sound(MSG_MULTIPLY); 
    34453441                                } 
    34463442 
     
    34653461                stagger = TRUE; 
    34663462        } 
    34673463 
    3468         /* Random movement */ 
    3469         else if (r_ptr->flags[0] & (RF0_RAND_50 | RF0_RAND_25)) 
     3464        /* Random movement - always attempt for lore purposes */ 
     3465        else 
    34703466        { 
     3467                int roll = randint0(100); 
     3468                 
    34713469                /* Random movement (25%) */ 
    3472                 if (!(r_ptr->flags[0] & (RF0_RAND_50))) 
     3470                if (roll < 25) 
    34733471                { 
    3474                         /* Random */ 
    3475                         if (randint0(100) < 25) 
    3476                         { 
    3477                                 /* Memorize flags */ 
    3478                                 if (m_ptr->ml) l_ptr->flags[0] |= (RF0_RAND_25); 
     3472                        /* Learn about small random movement */ 
     3473                        if (m_ptr->ml) l_ptr->flags[0] |= (RF0_RAND_25); 
    34793474 
    3480                                 /* Stagger */ 
    3481                                 stagger = TRUE; 
    3482                         } 
     3475                        /* Stagger */                    
     3476                        if (r_ptr->flags[0] & (RF0_RAND_25 | RF0_RAND_50)) stagger = TRUE; 
    34833477                } 
    3484  
     3478                 
    34853479                /* Random movement (50%) */ 
    3486                 else if (!(r_ptr->flags[0] & (RF0_RAND_25))) 
     3480                else if (roll < 50) 
    34873481                { 
    3488                         /* Random */ 
    3489                         if (randint0(100) < 50) 
    3490                         { 
    3491                                 /* Memorize flags */ 
    3492                                 if (m_ptr->ml) l_ptr->flags[0] |= (RF0_RAND_50); 
     3482                        /* Learn about medium random movement */ 
     3483                        if (m_ptr->ml) l_ptr->flags[0] |= (RF0_RAND_50); 
    34933484 
    3494                                 /* Stagger */ 
    3495                                 stagger = TRUE; 
    3496                         } 
     3485                        /* Stagger */                    
     3486                        if (r_ptr->flags[0] & (RF0_RAND_50)) stagger = TRUE; 
    34973487                } 
    3498  
     3488                 
    34993489                /* Random movement (75%) */ 
    3500                 else 
     3490                else if (roll < 75) 
    35013491                { 
    3502                         /* Random */ 
    3503                         if (randint0(100) < 75) 
     3492                        /* Stagger */                    
     3493                        if (r_ptr->flags[0] & (RF0_RAND_25) && 
     3494                            r_ptr->flags[0] & (RF0_RAND_50)) 
    35043495                        { 
    3505                                 /* Memorize flags */ 
    3506                                 if (m_ptr->ml) l_ptr->flags[0] |= (RF0_RAND_50 | RF0_RAND_25); 
    3507  
    3508                                 /* Stagger */ 
    35093496                                stagger = TRUE; 
    35103497                        } 
    35113498                } 
     
    35273514        /* Assume nothing */ 
    35283515        did_open_door = FALSE; 
    35293516        did_bash_door = FALSE; 
    3530         did_take_item = FALSE; 
    3531         did_kill_item = FALSE; 
    3532         did_move_body = FALSE; 
    3533         did_kill_body = FALSE; 
    3534         did_pass_wall = FALSE; 
    3535         did_kill_wall = FALSE; 
    35363517 
    35373518 
    35383519        /* Process moves */ 
     
    35533534                        do_move = TRUE; 
    35543535                } 
    35553536 
    3556                 /* Permanent wall */ 
     3537                /* Permanent wall in the way */ 
    35573538                else if (cave_feat[ny][nx] >= FEAT_PERM_EXTRA) 
    35583539                { 
    35593540                        /* Nothing */ 
    35603541                } 
    35613542 
    3562                 /* Monster moves through walls (and doors) */ 
    3563                 else if (r_ptr->flags[1] & (RF1_PASS_WALL)) 
     3543                /* Normal wall, door, or secret door in the way */ 
     3544                else 
    35643545                { 
    3565                         /* Pass through walls/doors/rubble */ 
    3566                         do_move = TRUE; 
     3546                        /* There's some kind of feature in the way, so learn about 
     3547                         * kill-wall and pass-wall now 
     3548                         */ 
     3549                        if (m_ptr->ml) l_ptr->flags[1] |= (RF1_PASS_WALL | RF1_KILL_WALL); 
    35673550 
    3568                         /* Monster went through a wall */ 
    3569                         did_pass_wall = TRUE; 
    3570                 } 
     3551                        /* Monster moves through walls (and doors) */ 
     3552                        if (r_ptr->flags[1] & (RF1_PASS_WALL)) 
     3553                        { 
     3554                                /* Pass through walls/doors/rubble */ 
     3555                                do_move = TRUE; 
     3556                        } 
    35713557 
    3572                 /* Monster destroys walls (and doors) */ 
    3573                 else if (r_ptr->flags[1] & (RF1_KILL_WALL)) 
    3574                 { 
    3575                         /* Eat through walls/doors/rubble */ 
    3576                         do_move = TRUE; 
     3558                        /* Monster destroys walls (and doors) */ 
     3559                        else if (r_ptr->flags[1] & (RF1_KILL_WALL)) 
     3560                        { 
     3561                                /* Eat through walls/doors/rubble */ 
     3562                                do_move = TRUE; 
    35773563 
    3578                         /* Monster destroyed a wall */ 
    3579                         did_kill_wall = TRUE; 
     3564                                /* Forget the wall */ 
     3565                                cave_info[ny][nx] &= ~(CAVE_MARK); 
    35803566 
    3581                         /* Forget the wall */ 
    3582                         cave_info[ny][nx] &= ~(CAVE_MARK); 
     3567                                /* Notice */ 
     3568                                cave_set_feat(ny, nx, FEAT_FLOOR); 
    35833569 
    3584                         /* Notice */ 
    3585                         cave_set_feat(ny, nx, FEAT_FLOOR); 
     3570                                /* Note changes to viewable region */ 
     3571                                if (player_has_los_bold(ny, nx)) do_view = TRUE; 
     3572                        } 
    35863573 
    3587                         /* Note changes to viewable region */ 
    3588                         if (player_has_los_bold(ny, nx)) do_view = TRUE; 
    3589                 } 
     3574                        /* Handle doors and secret doors */ 
     3575                        else if (((cave_feat[ny][nx] >= FEAT_DOOR_HEAD) && 
     3576                                                 (cave_feat[ny][nx] <= FEAT_DOOR_TAIL)) || 
     3577                                                (cave_feat[ny][nx] == FEAT_SECRET)) 
     3578                        { 
     3579                                bool may_bash = TRUE; 
    35903580 
    3591                 /* Handle doors and secret doors */ 
    3592                 else if (((cave_feat[ny][nx] >= FEAT_DOOR_HEAD) && 
    3593                           (cave_feat[ny][nx] <= FEAT_DOOR_TAIL)) || 
    3594                          (cave_feat[ny][nx] == FEAT_SECRET)) 
    3595                 { 
    3596                         bool may_bash = TRUE; 
     3581                                /* Take a turn */ 
     3582                                do_turn = TRUE; 
     3583                                 
     3584                                /* Learn about door abilities */ 
     3585                                if (m_ptr->ml) l_ptr->flags[1] |= (RF1_OPEN_DOOR | RF1_BASH_DOOR); 
    35973586 
    3598                         /* Take a turn */ 
    3599                         do_turn = TRUE; 
    3600  
    3601                         /* Creature can open doors. */ 
    3602                         if (r_ptr->flags[1] & (RF1_OPEN_DOOR)) 
    3603                         { 
    3604                                 /* Closed doors and secret doors */ 
    3605                                 if ((cave_feat[ny][nx] == FEAT_DOOR_HEAD) || 
    3606                                     (cave_feat[ny][nx] == FEAT_SECRET)) 
     3587                                /* Creature can open doors. */ 
     3588                                if (r_ptr->flags[1] & (RF1_OPEN_DOOR)) 
    36073589                                { 
    3608                                         /* The door is open */ 
    3609                                         did_open_door = TRUE; 
     3590                                        /* Closed doors and secret doors */ 
     3591                                        if ((cave_feat[ny][nx] == FEAT_DOOR_HEAD) || 
     3592                                                 (cave_feat[ny][nx] == FEAT_SECRET)) 
     3593                                        { 
     3594                                                /* The door is open */ 
     3595                                                did_open_door = TRUE; 
    36103596 
    3611                                         /* Do not bash the door */ 
    3612                                         may_bash = FALSE; 
     3597                                                /* Do not bash the door */ 
     3598                                                may_bash = FALSE; 
     3599                                        } 
     3600 
     3601                                        /* Locked doors (not jammed) */ 
     3602                                        else if (cave_feat[ny][nx] < FEAT_DOOR_HEAD + 0x08) 
     3603                                        { 
     3604                                                int k; 
     3605 
     3606                                                /* Door power */ 
     3607                                                k = ((cave_feat[ny][nx] - FEAT_DOOR_HEAD) & 0x07); 
     3608 
     3609                                                /* Try to unlock it XXX XXX XXX */ 
     3610                                                if (randint0(m_ptr->hp / 10) > k) 
     3611                                                { 
     3612                                                        /* Unlock the door */ 
     3613                                                        cave_set_feat(ny, nx, FEAT_DOOR_HEAD + 0x00); 
     3614 
     3615                                                        /* Do not bash the door */ 
     3616                                                        may_bash = FALSE; 
     3617                                                } 
     3618                                        } 
    36133619                                } 
    36143620 
    3615                                 /* Locked doors (not jammed) */ 
    3616                                 else if (cave_feat[ny][nx] < FEAT_DOOR_HEAD + 0x08) 
     3621                                /* Stuck doors -- attempt to bash them down if allowed */ 
     3622                                if (may_bash && (r_ptr->flags[1] & (RF1_BASH_DOOR))) 
    36173623                                { 
    36183624                                        int k; 
    36193625 
    36203626                                        /* Door power */ 
    36213627                                        k = ((cave_feat[ny][nx] - FEAT_DOOR_HEAD) & 0x07); 
    36223628 
    3623                                         /* Try to unlock it XXX XXX XXX */ 
     3629                                        /* Attempt to Bash XXX XXX XXX */ 
    36243630                                        if (randint0(m_ptr->hp / 10) > k) 
    36253631                                        { 
    3626                                                 /* Unlock the door */ 
    3627                                                 cave_set_feat(ny, nx, FEAT_DOOR_HEAD + 0x00); 
     3632                                                /* Message */ 
     3633                                                msg_print("You hear a door burst open!"); 
    36283634 
    3629                                                 /* Do not bash the door */ 
    3630                                                 may_bash = FALSE; 
    3631                                         } 
    3632                                 } 
    3633                         } 
     3635                                                /* Disturb (sometimes) */ 
     3636                                                disturb(0, 0); 
    36343637 
    3635                         /* Stuck doors -- attempt to bash them down if allowed */ 
    3636                         if (may_bash && (r_ptr->flags[1] & (RF1_BASH_DOOR))) 
    3637                         { 
    3638                                 int k; 
     3638                                                /* The door was bashed open */ 
     3639                                                did_bash_door = TRUE; 
    36393640 
    3640                                 /* Door power */ 
    3641                                 k = ((cave_feat[ny][nx] - FEAT_DOOR_HEAD) & 0x07); 
    3642  
    3643                                 /* Attempt to Bash XXX XXX XXX */ 
    3644                                 if (randint0(m_ptr->hp / 10) > k) 
    3645                                 { 
    3646                                         /* Message */ 
    3647                                         msg_print("You hear a door burst open!"); 
    3648  
    3649                                         /* Disturb (sometimes) */ 
    3650                                         disturb(0, 0); 
    3651  
    3652                                         /* The door was bashed open */ 
    3653                                         did_bash_door = TRUE; 
    3654  
    3655                                         /* Hack -- fall into doorway */ 
    3656                                         do_move = TRUE; 
     3641                                                /* Hack -- fall into doorway */ 
     3642                                                do_move = TRUE; 
     3643                                        } 
    36573644                                } 
    36583645                        } 
    36593646 
    3660  
    36613647                        /* Deal with doors in the way */ 
    36623648                        if (did_open_door || did_bash_door) 
    36633649                        { 
     
    37053691                        } 
    37063692                } 
    37073693 
    3708                 /* Some monsters never attack */ 
    3709                 if (do_move && (cave_m_idx[ny][nx] < 0) && 
    3710                     (r_ptr->flags[0] & (RF0_NEVER_BLOW))) 
    3711                 { 
    3712                         /* Hack -- memorize lack of attacks */ 
    3713                         if (m_ptr->ml) l_ptr->flags[0] |= (RF0_NEVER_BLOW); 
    37143694 
    3715                         /* Do not move */ 
    3716                         do_move = FALSE; 
    3717                 } 
    3718  
    3719  
    3720                 /* The player is in the way.  Attack him. */ 
     3695                /* The player is in the way. */ 
    37213696                if (do_move && (cave_m_idx[ny][nx] < 0)) 
    37223697                { 
    3723                         /* Do the attack */ 
    3724                         (void)make_attack_normal(m_idx); 
     3698                        /* Learn about if the monster attacks */ 
     3699                        if (m_ptr->ml) l_ptr->flags[0] |= (RF0_NEVER_BLOW); 
    37253700 
    3726                         /* Do not move */ 
    3727                         do_move = FALSE; 
     3701                        /* Some monsters never attack */ 
     3702                        if (r_ptr->flags[0] & (RF0_NEVER_BLOW)) 
     3703                        { 
     3704                                /* Do not move */ 
     3705                                do_move = FALSE; 
     3706                        } 
     3707                         
     3708                        /* Otherwise, attack the player */ 
     3709                        else 
     3710                        { 
     3711                                /* Do the attack */ 
     3712                                (void)make_attack_normal(m_idx); 
    37283713 
    3729                         /* Took a turn */ 
    3730                         do_turn = TRUE; 
     3714                                /* Do not move */ 
     3715                                do_move = FALSE; 
     3716 
     3717                                /* Took a turn */ 
     3718                                do_turn = TRUE; 
     3719                        } 
    37313720                } 
    37323721 
    37333722 
    37343723                /* Some monsters never move */ 
    37353724                if (do_move && (r_ptr->flags[0] & (RF0_NEVER_MOVE))) 
    37363725                { 
    3737                         /* Hack -- memorize lack of attacks */ 
     3726                        /* Learn about lack of movement */ 
    37383727                        if (m_ptr->ml) l_ptr->flags[0] |= (RF0_NEVER_MOVE); 
    37393728 
    37403729                        /* Do not move */ 
     
    37583747                        /* Assume no movement */ 
    37593748                        do_move = FALSE; 
    37603749 
    3761                         if ((compare_monsters(m_ptr, n_ptr) > 0) && (kill_ok || move_ok)) 
     3750                        if (compare_monsters(m_ptr, n_ptr) > 0) 
    37623751                        { 
    3763                                 /* Get the names of the monsters involved */ 
    3764                                 char m_name[80]; 
    3765                                 char n_name[80]; 
    3766                                 monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND1); 
    3767                                 monster_desc(n_name, sizeof(n_name), n_ptr, MDESC_IND1); 
     3752                                /* Learn about pushing and shoving */ 
     3753                                if (m_ptr->ml) l_ptr->flags[1] |= (RF1_KILL_BODY | RF1_MOVE_BODY); 
    37683754 
    3769                                 /* Allow movement */ 
    3770                                 do_move = TRUE; 
    3771  
    3772                                 /* Monster ate another monster */ 
    3773                                 if (kill_ok) 
     3755                                if (kill_ok || move_ok) 
    37743756                                { 
    3775                                         /* Note if visible */ 
    3776                                         if (m_ptr->ml && (m_ptr->mflag & (MFLAG_VIEW))) 
     3757                                        /* Get the names of the monsters involved */ 
     3758                                        char m_name[80]; 
     3759                                        char n_name[80]; 
     3760                                        monster_desc(m_name, sizeof(m_name), m_ptr, MDESC_IND1); 
     3761                                        monster_desc(n_name, sizeof(n_name), n_ptr, MDESC_IND1); 
     3762 
     3763                                        /* Allow movement */ 
     3764                                        do_move = TRUE; 
     3765 
     3766                                        /* Monster ate another monster */ 
     3767                                        if (kill_ok) 
    37773768                                        { 
    3778                                                 msg_format("%^s tramples over %s.", m_name, n_name); 
    3779                                         } 
     3769                                                /* Note if visible */ 
     3770                                                if (m_ptr->ml && (m_ptr->mflag & (MFLAG_VIEW))) 
     3771                                                { 
     3772                                                        msg_format("%^s tramples over %s.", m_name, n_name); 
     3773                                                } 
    37803774 
    3781                                         did_kill_body = TRUE; 
    3782                                         delete_monster(ny, nx); 
    3783                                 } 
    3784                                 else 
    3785                                 { 
    3786                                         /* Note if visible */ 
    3787                                         if (m_ptr->ml && (m_ptr->mflag & (MFLAG_VIEW))) 
     3775                                                delete_monster(ny, nx); 
     3776                                        } 
     3777                                        else 
    37883778                                        { 
    3789                                                 msg_format("%^s pushes past %s.", m_name, n_name); 
     3779                                                /* Note if visible */ 
     3780                                                if (m_ptr->ml && (m_ptr->mflag & (MFLAG_VIEW))) 
     3781                                                { 
     3782                                                        msg_format("%^s pushes past %s.", m_name, n_name); 
     3783                                                } 
    37903784                                        } 
    3791  
    3792                                         did_move_body = TRUE; 
    37933785                                } 
    37943786                        } 
    37953787                } 
     
    37983790                if (do_move) 
    37993791                { 
    38003792                        s16b this_o_idx, next_o_idx = 0; 
     3793                         
     3794                        /* Learn about no lack of movement */ 
     3795                        if (m_ptr->ml) l_ptr->flags[0] |= (RF0_NEVER_MOVE); 
    38013796 
    38023797                        /* Take a turn */ 
    38033798                        do_turn = TRUE; 
     
    38293824 
    38303825                                /* Skip gold */ 
    38313826                                if (o_ptr->tval == TV_GOLD) continue; 
     3827                                 
     3828                                /* Learn about item pickup behavior */ 
     3829                                if (m_ptr->ml) l_ptr->flags[1] |= (RF1_TAKE_ITEM | RF1_KILL_ITEM); 
    38323830 
    38333831                                /* Take or Kill objects on the floor */ 
    38343832                                if ((r_ptr->flags[1] & (RF1_TAKE_ITEM)) || 
     
    38703868                                                /* Only give a message for "take_item" */ 
    38713869                                                if (r_ptr->flags[1] & (RF1_TAKE_ITEM)) 
    38723870                                                { 
    3873                                                         /* Take note */ 
    3874                                                         did_take_item = TRUE; 
    3875  
    38763871                                                        /* Describe observable situations */ 
    38773872                                                        if (m_ptr->ml && player_has_los_bold(ny, nx) && !squelch_hide_item(o_ptr)) 
    38783873                                                        { 
     
    38893884                                                object_type *i_ptr; 
    38903885                                                object_type object_type_body; 
    38913886 
    3892                                                 /* Take note */ 
    3893                                                 did_take_item = TRUE; 
    3894  
    38953887                                                /* Describe observable situations */ 
    38963888                                                if (player_has_los_bold(ny, nx) && !squelch_hide_item(o_ptr)) 
    38973889                                                { 
     
    39153907                                        /* Destroy the item */ 
    39163908                                        else 
    39173909                                        { 
    3918                                                 /* Take note */ 
    3919                                                 did_kill_item = TRUE; 
    3920  
    39213910                                                /* Describe observable situations */ 
    39223911                                                if (player_has_los_bold(ny, nx) && !squelch_hide_item(o_ptr)) 
    39233912                                                { 
     
    39553944        } 
    39563945 
    39573946 
    3958         /* Learn things from observable monster */ 
    3959         if (m_ptr->ml) 
    3960         { 
    3961                 /* Monster opened a door */ 
    3962                 if (did_open_door) l_ptr->flags[1] |= (RF1_OPEN_DOOR); 
    3963  
    3964                 /* Monster bashed a door */ 
    3965                 if (did_bash_door) l_ptr->flags[1] |= (RF1_BASH_DOOR); 
    3966  
    3967                 /* Monster tried to pick something up */ 
    3968                 if (did_take_item) l_ptr->flags[1] |= (RF1_TAKE_ITEM); 
    3969  
    3970                 /* Monster tried to crush something */ 
    3971                 if (did_kill_item) l_ptr->flags[1] |= (RF1_KILL_ITEM); 
    3972  
    3973                 /* Monster pushed past another monster */ 
    3974                 if (did_move_body) l_ptr->flags[1] |= (RF1_MOVE_BODY); 
    3975  
    3976                 /* Monster ate another monster */ 
    3977                 if (did_kill_body) l_ptr->flags[1] |= (RF1_KILL_BODY); 
    3978  
    3979                 /* Monster passed through a wall */ 
    3980                 if (did_pass_wall) l_ptr->flags[1] |= (RF1_PASS_WALL); 
    3981  
    3982                 /* Monster destroyed a wall */ 
    3983                 if (did_kill_wall) l_ptr->flags[1] |= (RF1_KILL_WALL); 
    3984         } 
    3985  
    3986  
    39873947        /* Hack -- get "bold" if out of options */ 
    39883948        if (!do_turn && !do_move && m_ptr->monfear) 
    39893949        { 
  • src/monster/monster1.c

     
    540540static void describe_monster_spells(int r_idx, const monster_lore *l_ptr, const atk_colors *colors) 
    541541{ 
    542542        const monster_race *r_ptr = &r_info[r_idx]; 
     543        u32b f[RACE_FLAG_STRICT_UB]; 
    543544        int m, n; 
    544545        int msex = 0; 
    545546        bool breath = FALSE; 
     
    549550        int vc[64]; /* list colors */ 
    550551        int vd[64]; /* list avg damage values */ 
    551552        int known_hp; 
     553         
     554        /* Get the known monster flags */ 
     555        monster_flags_known(r_ptr, l_ptr, f); 
    552556 
    553557        /* Extract a gender (if applicable) */ 
    554558        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
     
    11061110                text_out_c(TERM_L_RED, "cast spells"); 
    11071111 
    11081112                /* Adverb */ 
    1109                 if (l_ptr->flags[1] & RF1_SMART) text_out(" intelligently"); 
     1113                if (f[1] & RF1_SMART) text_out(" intelligently"); 
    11101114 
    11111115                /* List */ 
    11121116                text_out(" which "); 
     
    11531157static void describe_monster_drop(int r_idx, const monster_lore *l_ptr) 
    11541158{ 
    11551159        const monster_race *r_ptr = &r_info[r_idx]; 
     1160        u32b f[RACE_FLAG_STRICT_UB]; 
    11561161 
    11571162        int n; 
    11581163        int msex = 0; 
    11591164 
     1165        /* Get the known monster flags */ 
     1166        monster_flags_known(r_ptr, l_ptr, f); 
    11601167 
    11611168        /* Extract a gender (if applicable) */ 
    11621169        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
     
    11801187                        text_out_c(TERM_BLUE, format("%d ", n)); 
    11811188                } 
    11821189 
    1183  
    11841190                /* Quality */ 
    1185                 if (l_ptr->flags[0] & RF0_DROP_GREAT) text_out_c(TERM_BLUE, "exceptional "); 
    1186                 else if (l_ptr->flags[0] & RF0_DROP_GOOD) text_out_c(TERM_BLUE, "good "); 
     1191                if (f[0] & RF0_DROP_GREAT) text_out_c(TERM_BLUE, "exceptional "); 
     1192                else if (f[0] & RF0_DROP_GOOD) text_out_c(TERM_BLUE, "good "); 
    11871193 
    1188  
    11891194                /* Objects */ 
    11901195                if (l_ptr->drop_item) 
    11911196                { 
     
    12141219static void describe_monster_attack(int r_idx, const monster_lore *l_ptr, const atk_colors *colors) 
    12151220{ 
    12161221        const monster_race *r_ptr = &r_info[r_idx]; 
     1222        u32b f[RACE_FLAG_STRICT_UB]; 
    12171223        int m, n, r; 
    12181224        int msex = 0; 
    1219  
     1225         
     1226        /* Get the known monster flags */ 
     1227        monster_flags_known(r_ptr, l_ptr, f); 
     1228         
    12201229        /* Extract a gender (if applicable) */ 
    12211230        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
    12221231        else if (r_ptr->flags[0] & RF0_MALE) msex = 1; 
     
    13501359                text_out(".  "); 
    13511360 
    13521361        /* Notice lack of attacks */ 
    1353         else if (l_ptr->flags[0] & RF0_NEVER_BLOW) 
     1362        else if (f[0] & RF0_NEVER_BLOW) 
    13541363                text_out("%^s has no physical attacks.  ", wd_he[msex]); 
    13551364 
    13561365        /* Or describe the lack of knowledge */ 
     
    13651374static void describe_monster_abilities(int r_idx, const monster_lore *l_ptr) 
    13661375{ 
    13671376        const monster_race *r_ptr = &r_info[r_idx]; 
     1377        u32b f[RACE_FLAG_STRICT_UB]; 
    13681378 
    13691379        int vn; 
    13701380        cptr vp[64]; 
    13711381        bool prev = FALSE; 
    13721382 
    13731383        int msex = 0; 
     1384         
     1385        /* Get the known monster flags */ 
     1386        monster_flags_known(r_ptr, l_ptr, f); 
    13741387 
    1375  
    13761388        /* Extract a gender (if applicable) */ 
    13771389        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
    13781390        else if (r_ptr->flags[0] & RF0_MALE) msex = 1; 
    13791391 
    1380  
    13811392        /* Collect special abilities. */ 
    13821393        vn = 0; 
    1383         if (l_ptr->flags[1] & RF1_OPEN_DOOR) vp[vn++] = "open doors"; 
    1384         if (l_ptr->flags[1] & RF1_BASH_DOOR) vp[vn++] = "bash down doors"; 
    1385         if (l_ptr->flags[1] & RF1_PASS_WALL) vp[vn++] = "pass through walls"; 
    1386         if (l_ptr->flags[1] & RF1_KILL_WALL) vp[vn++] = "bore through walls"; 
    1387         if (l_ptr->flags[1] & RF1_MOVE_BODY) vp[vn++] = "push past weaker monsters"; 
    1388         if (l_ptr->flags[1] & RF1_KILL_BODY) vp[vn++] = "destroy weaker monsters"; 
    1389         if (l_ptr->flags[1] & RF1_TAKE_ITEM) vp[vn++] = "pick up objects"; 
    1390         if (l_ptr->flags[1] & RF1_KILL_ITEM) vp[vn++] = "destroy objects"; 
     1394        if (f[1] & RF1_OPEN_DOOR) vp[vn++] = "open doors"; 
     1395        if (f[1] & RF1_BASH_DOOR) vp[vn++] = "bash down doors"; 
     1396        if (f[1] & RF1_PASS_WALL) vp[vn++] = "pass through walls"; 
     1397        if (f[1] & RF1_KILL_WALL) vp[vn++] = "bore through walls"; 
     1398        if (f[1] & RF1_MOVE_BODY) vp[vn++] = "push past weaker monsters"; 
     1399        if (f[1] & RF1_KILL_BODY) vp[vn++] = "destroy weaker monsters"; 
     1400        if (f[1] & RF1_TAKE_ITEM) vp[vn++] = "pick up objects"; 
     1401        if (f[1] & RF1_KILL_ITEM) vp[vn++] = "destroy objects"; 
    13911402 
    13921403        /* Describe special abilities. */ 
    13931404        output_desc_list(msex, "can", vp, vn, TERM_WHITE); 
     
    13951406 
    13961407        /* Describe detection traits */ 
    13971408        vn = 0; 
    1398         if (l_ptr->flags[1] & RF1_INVISIBLE)  vp[vn++] = "invisible"; 
    1399         if (l_ptr->flags[1] & RF1_COLD_BLOOD) vp[vn++] = "cold blooded"; 
    1400         if (l_ptr->flags[1] & RF1_EMPTY_MIND) vp[vn++] = "not detected by telepathy"; 
    1401         if (l_ptr->flags[1] & RF1_WEIRD_MIND) vp[vn++] = "rarely detected by telepathy"; 
     1409        if (f[1] & RF1_INVISIBLE)  vp[vn++] = "invisible"; 
     1410        if (f[1] & RF1_COLD_BLOOD) vp[vn++] = "cold blooded"; 
     1411        if (f[1] & RF1_EMPTY_MIND) vp[vn++] = "not detected by telepathy"; 
     1412        if (f[1] & RF1_WEIRD_MIND) vp[vn++] = "rarely detected by telepathy"; 
    14021413 
    14031414        output_desc_list(msex, "is", vp, vn, TERM_WHITE); 
    14041415 
    14051416 
    14061417        /* Describe special things */ 
    1407         if (l_ptr->flags[1] & RF1_MULTIPLY) 
     1418        if (f[1] & RF1_MULTIPLY) 
    14081419                text_out("%^s breeds explosively.  ", wd_he[msex]); 
    1409         if (l_ptr->flags[1] & RF1_REGENERATE) 
     1420        if (f[1] & RF1_REGENERATE) 
    14101421                text_out("%^s regenerates quickly.  ", wd_he[msex]); 
    14111422 
    14121423 
    14131424 
    14141425        /* Collect susceptibilities */ 
    14151426        vn = 0; 
    1416         if (l_ptr->flags[2] & RF2_HURT_ROCK) vp[vn++] = "rock remover"; 
    1417         if (l_ptr->flags[2] & RF2_HURT_LITE) vp[vn++] = "bright light"; 
    1418         if (l_ptr->flags[2] & RF2_HURT_FIRE) vp[vn++] = "fire"; 
    1419         if (l_ptr->flags[2] & RF2_HURT_COLD) vp[vn++] = "cold"; 
     1427        if (f[2] & RF2_HURT_ROCK) vp[vn++] = "rock remover"; 
     1428        if (f[2] & RF2_HURT_LITE) vp[vn++] = "bright light"; 
     1429        if (f[2] & RF2_HURT_FIRE) vp[vn++] = "fire"; 
     1430        if (f[2] & RF2_HURT_COLD) vp[vn++] = "cold"; 
    14201431 
    14211432        if (vn) 
    14221433        { 
     
    14281439 
    14291440        /* Collect immunities and resistances */ 
    14301441        vn = 0; 
    1431         if (l_ptr->flags[2] & RF2_IM_ACID)   vp[vn++] = "acid"; 
    1432         if (l_ptr->flags[2] & RF2_IM_ELEC)   vp[vn++] = "lightning"; 
    1433         if (l_ptr->flags[2] & RF2_IM_FIRE)   vp[vn++] = "fire"; 
    1434         if (l_ptr->flags[2] & RF2_IM_COLD)   vp[vn++] = "cold"; 
    1435         if (l_ptr->flags[2] & RF2_IM_POIS)   vp[vn++] = "poison"; 
    1436         if (l_ptr->flags[2] & RF2_IM_WATER)  vp[vn++] = "water"; 
    1437         if (l_ptr->flags[2] & RF2_RES_NETH)  vp[vn++] = "nether"; 
    1438         if (l_ptr->flags[2] & RF2_RES_PLAS)  vp[vn++] = "plasma"; 
    1439         if (l_ptr->flags[2] & RF2_RES_NEXUS) vp[vn++] = "nexus"; 
    1440         if (l_ptr->flags[2] & RF2_RES_DISE)  vp[vn++] = "disenchantment"; 
     1442        if (f[2] & RF2_IM_ACID)   vp[vn++] = "acid"; 
     1443        if (f[2] & RF2_IM_ELEC)   vp[vn++] = "lightning"; 
     1444        if (f[2] & RF2_IM_FIRE)   vp[vn++] = "fire"; 
     1445        if (f[2] & RF2_IM_COLD)   vp[vn++] = "cold"; 
     1446        if (f[2] & RF2_IM_POIS)   vp[vn++] = "poison"; 
     1447        if (f[2] & RF2_IM_WATER)  vp[vn++] = "water"; 
     1448        if (f[2] & RF2_RES_NETH)  vp[vn++] = "nether"; 
     1449        if (f[2] & RF2_RES_PLAS)  vp[vn++] = "plasma"; 
     1450        if (f[2] & RF2_RES_NEXUS) vp[vn++] = "nexus"; 
     1451        if (f[2] & RF2_RES_DISE)  vp[vn++] = "disenchantment"; 
    14411452 
    14421453        if (vn) 
    14431454        { 
     
    14541465 
    14551466        /* Collect non-effects */ 
    14561467        vn = 0; 
    1457         if (l_ptr->flags[2] & RF2_NO_STUN) vp[vn++] = "stunned"; 
    1458         if (l_ptr->flags[2] & RF2_NO_FEAR) vp[vn++] = "frightened"; 
    1459         if (l_ptr->flags[2] & RF2_NO_CONF) vp[vn++] = "confused"; 
    1460         if (l_ptr->flags[2] & RF2_NO_SLEEP) vp[vn++] = "slept"; 
     1468        if (f[2] & RF2_NO_STUN) vp[vn++] = "stunned"; 
     1469        if (f[2] & RF2_NO_FEAR) vp[vn++] = "frightened"; 
     1470        if (f[2] & RF2_NO_CONF) vp[vn++] = "confused"; 
     1471        if (f[2] & RF2_NO_SLEEP) vp[vn++] = "slept"; 
    14611472 
    14621473        if (vn) 
    14631474        { 
     
    15021513        } 
    15031514 
    15041515        /* Describe escorts */ 
    1505         if ((l_ptr->flags[0] & (RF0_ESCORT | RF0_ESCORTS))) 
     1516        if ((f[0] & (RF0_ESCORT | RF0_ESCORTS))) 
    15061517        { 
    15071518                text_out("%^s usually appears with escorts.  ", wd_he[msex]); 
    15081519        } 
    15091520 
    15101521        /* Describe friends */ 
    1511         else if ((l_ptr->flags[0] & (RF0_FRIEND | RF0_FRIENDS))) 
     1522        else if ((f[0] & (RF0_FRIEND | RF0_FRIENDS))) 
    15121523        { 
    15131524                text_out("%^s usually appears in groups.  ", wd_he[msex]); 
    15141525        } 
     
    15211532static void describe_monster_kills(int r_idx, const monster_lore *l_ptr) 
    15221533{ 
    15231534        const monster_race *r_ptr = &r_info[r_idx]; 
     1535        u32b f[RACE_FLAG_STRICT_UB]; 
    15241536 
    15251537        int msex = 0; 
    15261538 
    15271539        bool out = TRUE; 
     1540         
     1541        /* Get the known monster flags */ 
     1542        monster_flags_known(r_ptr, l_ptr, f); 
    15281543 
    1529  
    15301544        /* Extract a gender (if applicable) */ 
    15311545        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
    15321546        else if (r_ptr->flags[0] & RF0_MALE) msex = 1; 
    15331547 
    1534  
    15351548        /* Treat uniques differently */ 
    1536         if (l_ptr->flags[0] & RF0_UNIQUE) 
     1549        if (f[0] & RF0_UNIQUE) 
    15371550        { 
    15381551                /* Hack -- Determine if the unique is "dead" */ 
    15391552                bool dead = (r_ptr->max_num == 0) ? TRUE : FALSE; 
     
    16301643static void describe_monster_toughness(int r_idx, const monster_lore *l_ptr) 
    16311644{ 
    16321645        const monster_race *r_ptr = &r_info[r_idx]; 
     1646        u32b f[RACE_FLAG_STRICT_UB]; 
    16331647 
    16341648        int msex = 0; 
    16351649 
     1650        /* Get the known monster flags */ 
     1651        monster_flags_known(r_ptr, l_ptr, f); 
     1652 
    16361653        /* Extract a gender (if applicable) */ 
    16371654        if (r_ptr->flags[0] & RF0_FEMALE) msex = 2; 
    16381655        else if (r_ptr->flags[0] & RF0_MALE) msex = 1; 
    16391656 
    1640  
    16411657        /* Describe monster "toughness" */ 
    16421658        if (know_armour(r_idx, l_ptr)) 
    16431659        { 
     
    16461662                text_out_c(TERM_L_BLUE, "%d", r_ptr->ac); 
    16471663                text_out(", and a"); 
    16481664 
    1649                 if (!(l_ptr->flags[0] & RF0_UNIQUE)) 
     1665                if (!(f[0] & RF0_UNIQUE)) 
    16501666                        text_out("n average"); 
    16511667 
    16521668                text_out(" life rating of "); 
     
    16591675static void describe_monster_exp(int r_idx, const monster_lore *l_ptr) 
    16601676{ 
    16611677        const monster_race *r_ptr = &r_info[r_idx]; 
     1678        u32b f[RACE_FLAG_STRICT_UB]; 
    16621679 
    16631680        cptr p, q; 
    16641681 
     
    16661683 
    16671684        char buf[20] = ""; 
    16681685 
     1686        /* Get the known monster flags */ 
     1687        monster_flags_known(r_ptr, l_ptr, f); 
     1688 
    16691689        /* Introduction */ 
    1670         if (l_ptr->flags[0] & RF0_UNIQUE) 
     1690        if (f[0] & RF0_UNIQUE) 
    16711691                text_out("Killing"); 
    16721692        else 
    16731693                text_out("A kill of"); 
     
    17111731static void describe_monster_movement(int r_idx, const monster_lore *l_ptr) 
    17121732{ 
    17131733        const monster_race *r_ptr = &r_info[r_idx]; 
     1734        u32b f[RACE_FLAG_STRICT_UB]; 
    17141735 
    17151736        bool old = FALSE; 
    17161737 
     1738        /* Get the known monster flags */ 
     1739        monster_flags_known(r_ptr, l_ptr, f); 
    17171740 
    17181741        text_out("This"); 
    17191742 
     
    17391762        { 
    17401763                byte colour = (r_ptr->level > p_ptr->max_depth) ? TERM_RED : TERM_L_BLUE; 
    17411764 
    1742                 if (l_ptr->flags[0] & RF0_FORCE_DEPTH) 
     1765                if (f[0] & RF0_FORCE_DEPTH) 
    17431766                        text_out(" is found "); 
    17441767                else 
    17451768                        text_out(" is normally found "); 
     
    17581781        text_out(" moves"); 
    17591782 
    17601783        /* Random-ness */ 
    1761         if ((l_ptr->flags[0] & (RF0_RAND_50 | RF0_RAND_25))) 
     1784        if ((f[0] & (RF0_RAND_50 | RF0_RAND_25))) 
    17621785        { 
    17631786                /* Adverb */ 
    1764                 if ((l_ptr->flags[0] & RF0_RAND_50) && (l_ptr->flags[0] & RF0_RAND_25)) 
     1787                if ((f[0] & RF0_RAND_50) && (f[0] & RF0_RAND_25)) 
    17651788                        text_out(" extremely"); 
    1766                 else if (l_ptr->flags[0] & RF0_RAND_50) 
     1789                else if (f[0] & RF0_RAND_50) 
    17671790                        text_out(" somewhat"); 
    1768                 else if (l_ptr->flags[0] & RF0_RAND_25) 
     1791                else if (f[0] & RF0_RAND_25) 
    17691792                        text_out(" a bit"); 
    17701793 
    17711794                /* Adjective */ 
     
    17951818        } 
    17961819 
    17971820        /* The code above includes "attack speed" */ 
    1798         if (l_ptr->flags[0] & RF0_NEVER_MOVE) 
     1821        if (f[0] & RF0_NEVER_MOVE) 
    17991822                text_out(", but does not deign to chase intruders"); 
    18001823 
    18011824        /* End this sentence */ 
     
    18571880        l_ptr->cast_spell = MAX_UCHAR; 
    18581881 
    18591882        /* Hack -- know all the flags */ 
    1860         race_flags_assign(l_ptr->flags, r_ptr->flags); 
     1883        memset(l_ptr->flags, 255, sizeof(l_ptr->flags)); 
    18611884        race_flags_assign_spell(l_ptr->spell_flags, r_ptr->spell_flags); 
    18621885} 
    18631886 
     
    18771900void describe_monster(int r_idx, bool spoilers) 
    18781901{ 
    18791902        monster_lore lore; 
     1903        u32b f[RACE_FLAG_STRICT_UB]; 
    18801904        atk_colors colors; 
    18811905 
    18821906        /* Get the race and lore */ 
     
    18901914        COPY(&lore, l_ptr, monster_lore); 
    18911915 
    18921916        /* Assume some "obvious" flags */ 
    1893         lore.flags[0] |= (r_ptr->flags[0] & RF0_OBVIOUS_MASK); 
     1917        lore.flags[0] |= (RF0_OBVIOUS_MASK); 
    18941918 
    1895  
    18961919        /* Killing a monster reveals some properties */ 
    18971920        if (lore.tkills) 
    18981921        { 
    18991922                /* Know "race" flags */ 
    1900                 lore.flags[2] |= (r_ptr->flags[2] & RF2_RACE_MASK); 
     1923                lore.flags[2] |= (RF2_RACE_MASK); 
    19011924 
    19021925                /* Know "forced" flags */ 
    1903                 lore.flags[0] |= (r_ptr->flags[0] & (RF0_FORCE_DEPTH)); 
     1926                lore.flags[0] |= (RF0_FORCE_DEPTH); 
    19041927        } 
     1928         
     1929        /* Now get the known monster flags */ 
     1930        monster_flags_known(r_ptr, &lore, f); 
    19051931 
    19061932        /* Cheat -- know everything */ 
    19071933        if (OPT(cheat_know) || spoilers) cheat_monster_lore(r_idx, &lore); 
     
    19281954        describe_monster_attack(r_idx, &lore, &colors); 
    19291955 
    19301956        /* Notice "Quest" monsters */ 
    1931         if (lore.flags[0] & RF0_QUESTOR) 
     1957        if (f[0] & RF0_QUESTOR) 
    19321958                text_out("You feel an intense desire to kill this monster...  "); 
    19331959 
    19341960        /* All done */ 
  • src/monster/monster2.c

     
    10401040        unsigned i; 
    10411041 
    10421042        /* Know various things */ 
    1043         race_flags_assign(l_ptr->flags, r_ptr->flags); 
     1043        memset(l_ptr->flags, 255, sizeof(l_ptr->flags)); 
    10441044        race_flags_assign_spell(l_ptr->spell_flags, r_ptr->spell_flags); 
    10451045        for (i = 0; i < MONSTER_BLOW_MAX; i++) 
    10461046                l_ptr->blows[i] = MAX_UCHAR; 
     
    10671067void lore_treasure(int m_idx, int num_item, int num_gold) 
    10681068{ 
    10691069        monster_type *m_ptr = &mon_list[m_idx]; 
    1070         monster_race *r_ptr = &r_info[m_ptr->r_idx]; 
    10711070        monster_lore *l_ptr = &l_list[m_ptr->r_idx]; 
    10721071 
    10731072 
     
    10751074        if (num_item > l_ptr->drop_item) l_ptr->drop_item = num_item; 
    10761075        if (num_gold > l_ptr->drop_gold) l_ptr->drop_gold = num_gold; 
    10771076 
    1078         /* Hack -- memorize the good/great flags */ 
    1079         if (r_ptr->flags[0] & (RF0_DROP_GOOD)) l_ptr->flags[0] |= (RF0_DROP_GOOD); 
    1080         if (r_ptr->flags[0] & (RF0_DROP_GREAT)) l_ptr->flags[0] |= (RF0_DROP_GREAT); 
     1077        /* Learn about drop quality */ 
     1078        l_ptr->flags[0] |= (RF0_DROP_GOOD | RF0_DROP_GREAT); 
    10811079 
    10821080        /* Update monster recall window */ 
    10831081        if (p_ptr->monster_race_idx == m_ptr->r_idx) 
     
    12101208                        /* Empty mind, no telepathy */ 
    12111209                        if (r_ptr->flags[1] & (RF1_EMPTY_MIND)) 
    12121210                        { 
    1213                                 /* Memorize flags */ 
    1214                                 l_ptr->flags[1] |= (RF1_EMPTY_MIND); 
     1211                                /* Nothing! */ 
    12151212                        } 
    12161213 
    12171214                        /* Weird mind, occasional telepathy */ 
     
    12251222 
    12261223                                        /* Check for LOS so that MFLAG_VIEW is set later */ 
    12271224                                        if (player_has_los_bold(fy, fx)) easy = TRUE; 
    1228  
    1229                                         /* Memorize flags */ 
    1230                                         l_ptr->flags[1] |= (RF1_WEIRD_MIND); 
    1231  
    1232                                         /* Hack -- Memorize mental flags */ 
    1233                                         if (r_ptr->flags[1] & (RF1_SMART)) l_ptr->flags[1] |= (RF1_SMART); 
    1234                                         if (r_ptr->flags[1] & (RF1_STUPID)) l_ptr->flags[1] |= (RF1_STUPID); 
    12351225                                } 
    12361226                        } 
    12371227 
     
    12431233 
    12441234                                /* Check for LOS to that MFLAG_VIEW is set later */ 
    12451235                                if (player_has_los_bold(fy, fx)) easy = TRUE; 
    1246  
    1247                                 /* Hack -- Memorize mental flags */ 
    1248                                 if (r_ptr->flags[1] & (RF1_SMART)) l_ptr->flags[1] |= (RF1_SMART); 
    1249                                 if (r_ptr->flags[1] & (RF1_STUPID)) l_ptr->flags[1] |= (RF1_STUPID); 
    12501236                        } 
    12511237                } 
    12521238 
    12531239                /* Normal line of sight, and not blind */ 
    12541240                if (player_has_los_bold(fy, fx) && !p_ptr->timed[TMD_BLIND]) 
    12551241                { 
    1256                         bool do_invisible = FALSE; 
    1257                         bool do_cold_blood = FALSE; 
    1258  
    12591242                        /* Use "infravision" */ 
    12601243                        if (d <= p_ptr->state.see_infra) 
    12611244                        { 
    1262                                 /* Handle "cold blooded" monsters */ 
    1263                                 if (r_ptr->flags[1] & (RF1_COLD_BLOOD)) 
    1264                                 { 
    1265                                         /* Take note */ 
    1266                                         do_cold_blood = TRUE; 
    1267                                 } 
    1268  
     1245                                /* Learn about warm/cold blood */ 
     1246                                l_ptr->flags[1] |= (RF1_COLD_BLOOD); 
     1247                                 
    12691248                                /* Handle "warm blooded" monsters */ 
    1270                                 else 
     1249                                if (!(r_ptr->flags[1] & (RF1_COLD_BLOOD))) 
    12711250                                { 
    12721251                                        /* Easy to see */ 
    12731252                                        easy = flag = TRUE; 
     
    12771256                        /* Use "illumination" */ 
    12781257                        if (player_can_see_bold(fy, fx)) 
    12791258                        { 
     1259                                /* Learn about invisibility */ 
     1260                                l_ptr->flags[1] |= (RF1_INVISIBLE); 
     1261                                 
    12801262                                /* Handle "invisible" monsters */ 
    12811263                                if (r_ptr->flags[1] & (RF1_INVISIBLE)) 
    12821264                                { 
    1283                                         /* Take note */ 
    1284                                         do_invisible = TRUE; 
    1285  
    12861265                                        /* See invisible */ 
    12871266                                        if (p_ptr->state.see_inv) 
    12881267                                        { 
     
    12981277                                        easy = flag = TRUE; 
    12991278                                } 
    13001279                        } 
    1301  
    1302                         /* Visible */ 
    1303                         if (flag) 
    1304                         { 
    1305                                 /* Memorize flags */ 
    1306                                 if (do_invisible) l_ptr->flags[1] |= (RF1_INVISIBLE); 
    1307                                 if (do_cold_blood) l_ptr->flags[1] |= (RF1_COLD_BLOOD); 
    1308                         } 
    13091280                } 
    13101281        } 
    13111282 
     
    13131284        /* The monster is now visible */ 
    13141285        if (flag) 
    13151286        { 
     1287                /* Learn about the monster's mind */ 
     1288                if (p_ptr->state.telepathy) 
     1289                { 
     1290                        l_ptr->flags[1] |= (RF1_EMPTY_MIND | RF1_WEIRD_MIND | RF1_SMART | RF1_STUPID); 
     1291                } 
     1292                 
    13161293                /* It was previously unseen */ 
    13171294                if (!m_ptr->ml) 
    13181295                { 
     
    32843261        return (FALSE); 
    32853262} 
    32863263 
     3264/* 
     3265 * Obtain the "flags" for a monster race which are known to the monster 
     3266 * lore struct. 
     3267 */ 
     3268void monster_flags_known(const monster_race *r_ptr, const monster_lore *l_ptr, u32b flags[]) 
     3269{ 
     3270        int i; 
     3271 
     3272        for (i = 0; i < RACE_FLAG_STRICT_UB; i++) 
     3273        { 
     3274                flags[i] = l_ptr->flags[i] & r_ptr->flags[i]; 
     3275        } 
     3276} 
  • src/monster/types.h

     
    110110 
    111111        byte blows[MONSTER_BLOW_MAX]; /* Number of times each blow type was seen */ 
    112112 
    113         u32b flags[RACE_FLAG_STRICT_UB];        /* Observed racial flags */ 
     113        u32b flags[RACE_FLAG_STRICT_UB]; /* Observed racial flags - a 1 indicates 
     114                                          * the flag (or lack thereof) is known to 
     115                                          * the player */ 
    114116        u32b spell_flags[RACE_FLAG_SPELL_STRICT_UB];    /* Observed racial spell flags */ 
    115117} monster_lore; 
    116118 
  • src/object/obj-info.c

     
    205205         "fiercely smite", NULL, "demons",          NULL }, 
    206206        { TR0_KILL_UNDEAD, RF2_UNDEAD, 0, 5, "deeply pierces", 
    207207         "fiercely smite", NULL, "undead",          NULL }, 
    208         { 0, 0, 0, 0, NULL, NULL, NULL, NULL } 
     208        { 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL } 
    209209}; 
    210210 
    211211/* 
  • src/spells1.c

     
    22052205                case GF_ACID: 
    22062206                { 
    22072207                        if (seen) obvious = TRUE; 
     2208                        if (seen) l_ptr->flags[2] |= (RF2_IM_ACID); 
    22082209                        if (r_ptr->flags[2] & (RF2_IM_ACID)) 
    22092210                        { 
    22102211                                note = " resists a lot."; 
    22112212                                dam /= 9; 
    2212                                 if (seen) l_ptr->flags[2] |= (RF2_IM_ACID); 
    22132213                        } 
    22142214                        break; 
    22152215                } 
     
    22182218                case GF_ELEC: 
    22192219                { 
    22202220                        if (seen) obvious = TRUE; 
     2221                        if (seen) l_ptr->flags[2] |= (RF2_IM_ELEC); 
    22212222                        if (r_ptr->flags[2] & (RF2_IM_ELEC)) 
    22222223                        { 
    22232224                                note = " resists a lot."; 
    22242225                                dam /= 9; 
    2225                                 if (seen) l_ptr->flags[2] |= (RF2_IM_ELEC); 
    22262226                        } 
    22272227                        break; 
    22282228                } 
     
    22312231                case GF_FIRE: 
    22322232                { 
    22332233                        if (seen) obvious = TRUE; 
     2234                        if (seen) l_ptr->flags[2] |= (RF2_IM_FIRE | RF2_HURT_FIRE); 
    22342235                        if (r_ptr->flags[2] & (RF2_IM_FIRE)) 
    22352236                        { 
    22362237                                note = " resists a lot."; 
    22372238                                dam /= 9; 
    2238                                 if (seen) l_ptr->flags[2] |= (RF2_IM_FIRE); 
    22392239                        } 
     2240                        else if (r_ptr->flags[2] & (RF2_HURT_FIRE)) 
     2241                        { 
     2242                                note = " catches on fire!"; 
     2243                                note_dies = " disintegrates!"; 
     2244                                dam *= 2; 
     2245                        } 
    22402246                        break; 
    22412247                } 
    22422248 
     
    22442250                case GF_COLD: 
    22452251                { 
    22462252                        if (seen) obvious = TRUE; 
     2253                        if (seen) l_ptr->flags[2] |= (RF2_IM_COLD | RF2_HURT_COLD); 
    22472254                        if (r_ptr->flags[2] & (RF2_IM_COLD)) 
    22482255                        { 
    22492256                                note = " resists a lot."; 
    22502257                                dam /= 9; 
    2251                                 if (seen) l_ptr->flags[2] |= (RF2_IM_COLD); 
    22522258                        } 
     2259                        else if (r_ptr->flags[2] & (RF2_HURT_COLD)) 
     2260                        { 
     2261                                note = " is badly frozen!"; 
     2262                                note_dies = " freezes and shatters!"; 
     2263                                dam *= 2; 
     2264                        } 
    22532265                        break; 
    22542266                } 
    22552267 
     
    22572269                case GF_POIS: 
    22582270                { 
    22592271                        if (seen) obvious = TRUE; 
     2272                        if (seen) l_ptr->flags[2] |= (RF2_IM_POIS); 
    22602273                        if (r_ptr->flags[2] & (RF2_IM_POIS)) 
    22612274                        { 
    22622275                                note = " resists a lot."; 
    22632276                                dam /= 9; 
    2264                                 if (seen) l_ptr->flags[2] |= (RF2_IM_POIS); 
    22652277                        } 
    22662278                        break; 
    22672279                } 
     
    22702282                case GF_HOLY_ORB: 
    22712283                { 
    22722284                        if (seen) obvious = TRUE; 
     2285                        if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    22732286                        if (r_ptr->flags[2] & (RF2_EVIL)) 
    22742287                        { 
    22752288                                dam *= 2; 
    22762289                                note = " is hit hard."; 
    2277                                 if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    22782290                        } 
    22792291                        break; 
    22802292                } 
     
    22902302                case GF_PLASMA: 
    22912303                { 
    22922304                        if (seen) obvious = TRUE; 
     2305                        if (seen) l_ptr->flags[2] |= RF2_RES_PLAS; 
    22932306                        if (r_ptr->flags[2] & RF2_RES_PLAS) 
    22942307                        { 
    22952308                                note = " resists."; 
    22962309                                dam *= 3; dam /= (randint1(6)+6); 
    2297                                 if (seen) l_ptr->flags[2] |= RF2_RES_PLAS; 
    22982310                        } 
    22992311                        break; 
    23002312                } 
     
    23032315                case GF_NETHER: 
    23042316                { 
    23052317                        if (seen) obvious = TRUE; 
     2318 
     2319                        /* Update the lore */ 
     2320                        if (seen) 
     2321                        { 
     2322                                /* Acquire knowledge of undead type and nether resistance */ 
     2323                                l_ptr->flags[2] |= (RF2_UNDEAD | RF2_RES_NETH); 
     2324                                 
     2325                                /* If it isn't undead, acquire extra knowledge */ 
     2326                                if (!(r_ptr->flags[2] & (RF2_UNDEAD))) 
     2327                                { 
     2328                                        /* Learn this creature breathes nether if true */ 
     2329                                        if (r_ptr->spell_flags[0] & (RSF0_BR_NETH)) 
     2330                                        { 
     2331                                                l_ptr->spell_flags[0] |= (RSF0_BR_NETH); 
     2332                                        } 
     2333 
     2334                                        /* Otherwise learn about evil type */ 
     2335                                        else 
     2336                                        { 
     2337                                                l_ptr->flags[2] |= (RF2_EVIL); 
     2338                                        } 
     2339                                } 
     2340                        } 
     2341 
    23062342                        if (r_ptr->flags[2] & (RF2_UNDEAD)) 
    23072343                        { 
    23082344                                note = " is immune."; 
    23092345                                dam = 0; 
    2310                                 if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
    23112346                        } 
    2312                         else if (r_ptr->spell_flags[0] & (RSF0_BR_NETH)) 
     2347                        else if (r_ptr->flags[2] & (RF2_RES_NETH) || 
     2348                                 r_ptr->spell_flags[0] & (RSF0_BR_NETH)) 
    23132349                        { 
    23142350                                note = " resists."; 
    23152351                                dam *= 3; dam /= (randint1(6)+6); 
     
    23182354                        { 
    23192355                                dam /= 2; 
    23202356                                note = " resists somewhat."; 
    2321                                 if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    23222357                        } 
    23232358                        break; 
    23242359                } 
     
    23272362                case GF_WATER: 
    23282363                { 
    23292364                        if (seen) obvious = TRUE; 
    2330                         if (r_ptr->flags[2] & RF2_IM_WATER) 
     2365                        if (seen) l_ptr->flags[2] |= (RF2_IM_WATER); 
     2366                        if (r_ptr->flags[2] & (RF2_IM_WATER)) 
    23312367                        { 
    23322368                                note = " is immune."; 
    23332369                                dam = 0; 
    2334                                 if (seen) l_ptr->flags[2] |= RF2_IM_WATER; 
    23352370                        } 
    23362371                        break; 
    23372372                } 
     
    23402375                case GF_CHAOS: 
    23412376                { 
    23422377                        if (seen) obvious = TRUE; 
     2378                        if (seen) l_ptr->flags[2] |= (RF2_NO_CONF); 
     2379 
    23432380                        do_poly = TRUE; 
    23442381                        do_conf = (5 + randint1(11) + r) / (r + 1); 
    23452382                        if (r_ptr->spell_flags[0] & (RSF0_BR_CHAO)) 
    23462383                        { 
     2384                                /* Learn about breathers through resistance */ 
     2385                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_CHAO); 
     2386 
    23472387                                note = " resists."; 
    23482388                                dam *= 3; dam /= (randint1(6)+6); 
    23492389                                do_poly = FALSE; 
     
    23572397                        if (seen) obvious = TRUE; 
    23582398                        if (r_ptr->spell_flags[0] & (RSF0_BR_SHAR)) 
    23592399                        { 
     2400                                /* Learn about breathers through resistance */ 
     2401                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_SHAR); 
     2402 
    23602403                                note = " resists."; 
    23612404                                dam *= 3; dam /= (randint1(6)+6); 
    23622405                        } 
     
    23672410                case GF_SOUND: 
    23682411                { 
    23692412                        if (seen) obvious = TRUE; 
     2413                        if (seen) l_ptr->flags[2] |= (RF2_NO_STUN); 
     2414                         
    23702415                        do_stun = (10 + randint1(15) + r) / (r + 1); 
    23712416                        if (r_ptr->spell_flags[0] & (RSF0_BR_SOUN)) 
    23722417                        { 
     2418                                /* Learn about breathers through resistance */ 
     2419                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_SOUN); 
     2420 
    23732421                                note = " resists."; 
    23742422                                dam *= 2; dam /= (randint1(6)+6); 
    23752423                        } 
     
    23802428                case GF_CONFUSION: 
    23812429                { 
    23822430                        if (seen) obvious = TRUE; 
     2431                        if (seen) l_ptr->flags[2] |= (RF2_NO_CONF); 
     2432 
    23832433                        do_conf = (10 + randint1(15) + r) / (r + 1); 
    23842434                        if (r_ptr->spell_flags[0] & (RSF0_BR_CONF)) 
    23852435                        { 
     2436                                /* Learn about breathers through resistance */ 
     2437                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_CONF); 
     2438 
    23862439                                note = " resists."; 
    23872440                                dam *= 2; dam /= (randint1(6)+6); 
    23882441                        } 
     
    23982451                case GF_DISENCHANT: 
    23992452                { 
    24002453                        if (seen) obvious = TRUE; 
    2401                         if (r_ptr->flags[2] & RF2_RES_DISE) 
     2454                        if (seen) l_ptr->flags[2] |= (RF2_RES_DISE); 
     2455                        if (r_ptr->flags[2] & (RF2_RES_DISE)) 
    24022456                        { 
    24032457                                note = " resists."; 
    24042458                                dam *= 3; dam /= (randint1(6)+6); 
    2405                                 if (seen) l_ptr->flags[2] |= RF2_RES_DISE; 
    24062459                        } 
    24072460                        break; 
    24082461                } 
     
    24112464                case GF_NEXUS: 
    24122465                { 
    24132466                        if (seen) obvious = TRUE; 
     2467                        if (seen) l_ptr->flags[2] |= (RF2_RES_NEXUS); 
    24142468                        if (r_ptr->flags[2] & RF2_RES_NEXUS) 
    24152469                        { 
    24162470                                note = " resists."; 
    24172471                                dam *= 3; dam /= (randint1(6)+6); 
    2418                                 if (seen) l_ptr->flags[2] |= RF2_RES_NEXUS; 
    24192472                        } 
    24202473                        break; 
    24212474                } 
     
    24242477                case GF_FORCE: 
    24252478                { 
    24262479                        if (seen) obvious = TRUE; 
     2480                        if (seen) l_ptr->flags[2] |= (RF2_NO_STUN); 
     2481                         
    24272482                        do_stun = (randint1(15) + r) / (r + 1); 
    24282483                        if (r_ptr->spell_flags[0] & (RSF0_BR_WALL)) 
    24292484                        { 
     2485                                /* Learn about breathers through resistance */ 
     2486                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_WALL); 
     2487 
    24302488                                note = " resists."; 
    24312489                                dam *= 3; dam /= (randint1(6)+6); 
    24322490                        } 
     
    24392497                        if (seen) obvious = TRUE; 
    24402498                        if (r_ptr->spell_flags[0] & (RSF0_BR_INER)) 
    24412499                        { 
     2500                                /* Learn about breathers through resistance */ 
     2501                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_INER); 
     2502 
    24422503                                note = " resists."; 
    24432504                                dam *= 3; dam /= (randint1(6)+6); 
    24442505                        } 
     
    24512512                        if (seen) obvious = TRUE; 
    24522513                        if (r_ptr->spell_flags[0] & (RSF0_BR_TIME)) 
    24532514                        { 
     2515                                /* Learn about breathers through resistance */ 
     2516                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_TIME); 
     2517 
    24542518                                note = " resists."; 
    24552519                                dam *= 3; dam /= (randint1(6)+6); 
    24562520                        } 
     
    24682532 
    24692533                        if (r_ptr->spell_flags[0] & (RSF0_BR_GRAV)) 
    24702534                        { 
     2535                                /* Learn about breathers through resistance */ 
     2536                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_GRAV); 
     2537 
    24712538                                note = " resists."; 
    24722539                                dam *= 3; dam /= (randint1(6)+6); 
    24732540                                do_dist = 0; 
     
    24932560                case GF_ICE: 
    24942561                { 
    24952562                        if (seen) obvious = TRUE; 
     2563                        if (seen) l_ptr->flags[2] |= (RF2_IM_COLD | RF2_HURT_COLD | RF2_NO_STUN); 
     2564                         
    24962565                        do_stun = (randint1(15) + 1) / (r + 1); 
    24972566                        if (r_ptr->flags[2] & (RF2_IM_COLD)) 
    24982567                        { 
    24992568                                note = " resists a lot."; 
    25002569                                dam /= 9; 
    2501                                 if (seen) l_ptr->flags[2] |= (RF2_IM_COLD); 
    25022570                        } 
     2571                        else if (r_ptr->flags[2] & (RF2_HURT_COLD)) 
     2572                        { 
     2573                                note = " is badly frozen!"; 
     2574                                note_dies = " freezes and shatters!"; 
     2575                                dam = ((dam * 3) / 2); 
     2576                        } 
    25032577                        break; 
    25042578                } 
    25052579 
     
    25082582                case GF_OLD_DRAIN: 
    25092583                { 
    25102584                        if (seen) obvious = TRUE; 
     2585                        if (seen) l_ptr->flags[2] |= (RF2_UNDEAD | RF2_DEMON); 
    25112586                        if ((r_ptr->flags[2] & (RF2_UNDEAD | RF2_DEMON)) || 
    25122587                            (strchr("Egv", r_ptr->d_char))) 
    25132588                        { 
    2514                                 if (r_ptr->flags[2] & (RF2_UNDEAD)) 
    2515                                 { 
    2516                                         if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
    2517                                 } 
    2518                                 if (r_ptr->flags[2] & (RF2_DEMON)) 
    2519                                 { 
    2520                                         if (seen) l_ptr->flags[2] |= (RF2_DEMON); 
    2521                                 } 
    2522  
    25232589                                note = " is unaffected!"; 
    25242590                                obvious = FALSE; 
    25252591                                dam = 0; 
     
    26472713                case GF_OLD_SLEEP: 
    26482714                { 
    26492715                        if (seen) obvious = TRUE; 
     2716                        if (seen) l_ptr->flags[2] |= (RF2_NO_SLEEP); 
    26502717 
    26512718                        /* Attempt a saving throw */ 
    26522719                        if ((r_ptr->flags[0] & (RF0_UNIQUE)) || 
    26532720                            (r_ptr->flags[2] & (RF2_NO_SLEEP)) || 
    26542721                            (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) 
    26552722                        { 
    2656                                 /* Memorize a flag */ 
    2657                                 if (r_ptr->flags[2] & (RF2_NO_SLEEP)) 
    2658                                 { 
    2659                                         if (seen) l_ptr->flags[2] |= (RF2_NO_SLEEP); 
    2660                                 } 
    2661  
    26622723                                /* No obvious effect */ 
    26632724                                note = " is unaffected!"; 
    26642725                                obvious = FALSE; 
     
    26802741                case GF_OLD_CONF: 
    26812742                { 
    26822743                        if (seen) obvious = TRUE; 
     2744                        if (seen) l_ptr->flags[2] |= (RF2_NO_CONF); 
    26832745 
    26842746                        /* Get confused later */ 
    26852747                        do_conf = damroll(3, (dam / 2)) + 1; 
     
    26892751                            (r_ptr->flags[2] & (RF2_NO_CONF)) || 
    26902752                            (r_ptr->level > randint1((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) 
    26912753                        { 
    2692                                 /* Memorize a flag */ 
    2693                                 if (r_ptr->flags[2] & (RF2_NO_CONF)) 
    2694                                 { 
    2695                                         if (seen) l_ptr->flags[2] |= (RF2_NO_CONF); 
    2696                                 } 
    2697  
    26982754                                /* Resist */ 
    26992755                                do_conf = 0; 
    27002756 
     
    27132769                /* Lite, but only hurts susceptible creatures */ 
    27142770                case GF_LITE_WEAK: 
    27152771                { 
     2772                        if (seen) l_ptr->flags[2] |= (RF2_HURT_LITE); 
     2773 
    27162774                        /* Hurt by light */ 
    27172775                        if (r_ptr->flags[2] & (RF2_HURT_LITE)) 
    27182776                        { 
    27192777                                /* Obvious effect */ 
    27202778                                if (seen) obvious = TRUE; 
    27212779 
    2722                                 /* Memorize the effects */ 
    2723                                 if (seen) l_ptr->flags[2] |= (RF2_HURT_LITE); 
    2724  
    27252780                                /* Special effect */ 
    27262781                                note = " cringes from the light!"; 
    27272782                                note_dies = " shrivels away in the light!"; 
     
    27432798                case GF_LITE: 
    27442799                { 
    27452800                        if (seen) obvious = TRUE; 
     2801                        if (seen) l_ptr->flags[2] |= (RF2_HURT_LITE); 
     2802 
    27462803                        if (r_ptr->spell_flags[0] & (RSF0_BR_LITE)) 
    27472804                        { 
     2805                                /* Learn about breathers through resistance */ 
     2806                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_LITE); 
     2807 
    27482808                                note = " resists."; 
    27492809                                dam *= 2; dam /= (randint1(6)+6); 
    27502810                        } 
    27512811                        else if (r_ptr->flags[2] & (RF2_HURT_LITE)) 
    27522812                        { 
    2753                                 if (seen) l_ptr->flags[2] |= (RF2_HURT_LITE); 
    27542813                                note = " cringes from the light!"; 
    27552814                                note_dies = " shrivels away in the light!"; 
    27562815                                dam *= 2; 
     
    27652824                        if (seen) obvious = TRUE; 
    27662825                        if (r_ptr->spell_flags[0] & (RSF0_BR_DARK)) 
    27672826                        { 
     2827                                /* Learn about breathers through resistance */ 
     2828                                if (seen) l_ptr->spell_flags[0] |= (RSF0_BR_DARK); 
     2829 
    27682830                                note = " resists."; 
    27692831                                dam *= 2; dam /= (randint1(6)+6); 
    27702832                        } 
     
    27752837                /* Stone to Mud */ 
    27762838                case GF_KILL_WALL: 
    27772839                { 
     2840                        if (seen) l_ptr->flags[2] |= (RF2_HURT_ROCK); 
     2841 
    27782842                        /* Hurt by rock remover */ 
    27792843                        if (r_ptr->flags[2] & (RF2_HURT_ROCK)) 
    27802844                        { 
    27812845                                /* Notice effect */ 
    27822846                                if (seen) obvious = TRUE; 
    27832847 
    2784                                 /* Memorize the effects */ 
    2785                                 if (seen) l_ptr->flags[2] |= (RF2_HURT_ROCK); 
    2786  
    27872848                                /* Cute little message */ 
    27882849                                note = " loses some skin!"; 
    27892850                                note_dies = " dissolves!"; 
     
    28032864                /* Teleport undead (Use "dam" as "power") */ 
    28042865                case GF_AWAY_UNDEAD: 
    28052866                { 
     2867                        if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
     2868 
    28062869                        /* Only affect undead */ 
    28072870                        if (r_ptr->flags[2] & (RF2_UNDEAD)) 
    28082871                        { 
    28092872                                if (seen) obvious = TRUE; 
    2810                                 if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
    28112873                                do_dist = dam; 
    28122874                        } 
    28132875 
     
    28272889                /* Teleport evil (Use "dam" as "power") */ 
    28282890                case GF_AWAY_EVIL: 
    28292891                { 
    2830                         /* Only affect undead */ 
     2892                                if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
     2893 
     2894                        /* Only affect evil */ 
    28312895                        if (r_ptr->flags[2] & (RF2_EVIL)) 
    28322896                        { 
    28332897                                if (seen) obvious = TRUE; 
    2834                                 if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    28352898                                do_dist = dam; 
    28362899                        } 
    28372900 
     
    28662929                /* Turn undead (Use "dam" as "power") */ 
    28672930                case GF_TURN_UNDEAD: 
    28682931                { 
     2932                        if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
     2933 
    28692934                        /* Only affect undead */ 
    28702935                        if (r_ptr->flags[2] & (RF2_UNDEAD)) 
    28712936                        { 
    2872                                 /* Learn about type */ 
    2873                                 if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
    2874  
    28752937                                /* Obvious */ 
    28762938                                if (seen) obvious = TRUE; 
    28772939 
     
    29042966                /* Turn evil (Use "dam" as "power") */ 
    29052967                case GF_TURN_EVIL: 
    29062968                { 
     2969                        if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
     2970 
    29072971                        /* Only affect evil */ 
    29082972                        if (r_ptr->flags[2] & (RF2_EVIL)) 
    29092973                        { 
    2910                                 /* Learn about type */ 
    2911                                 if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    2912  
    29132974                                /* Obvious */ 
    29142975                                if (seen) obvious = TRUE; 
    29152976 
     
    29443005                { 
    29453006                        /* Obvious */ 
    29463007                        if (seen) obvious = TRUE; 
     3008                        if (seen) l_ptr->flags[2] |= (RF2_NO_FEAR); 
    29473009 
    29483010                        /* Apply some fear */ 
    29493011                        do_fear = damroll(3, (dam / 2)) + 1; 
     
    29683030                /* Dispel undead */ 
    29693031                case GF_DISP_UNDEAD: 
    29703032                { 
     3033                        if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
     3034 
    29713035                        /* Only affect undead */ 
    29723036                        if (r_ptr->flags[2] & (RF2_UNDEAD)) 
    29733037                        { 
    2974                                 /* Learn about type */ 
    2975                                 if (seen) l_ptr->flags[2] |= (RF2_UNDEAD); 
    2976  
    29773038                                /* Obvious */ 
    29783039                                if (seen) obvious = TRUE; 
    29793040 
     
    29993060                /* Dispel evil */ 
    30003061                case GF_DISP_EVIL: 
    30013062                { 
     3063                        if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
     3064 
    30023065                        /* Only affect evil */ 
    30033066                        if (r_ptr->flags[2] & (RF2_EVIL)) 
    30043067                        { 
    3005                                 /* Learn about type */ 
    3006                                 if (seen) l_ptr->flags[2] |= (RF2_EVIL); 
    3007  
    30083068                                /* Obvious */ 
    30093069                                if (seen) obvious = TRUE; 
    30103070 
     
    31343194 
    31353195        /* Sound and Impact breathers never stun */ 
    31363196        else if (do_stun && 
     3197                 !(r_ptr->flags[2] & (RF2_NO_STUN)) && 
    31373198                 !(r_ptr->spell_flags[0] & (RSF0_BR_SOUN | RSF0_BR_WALL))) 
    31383199        { 
    31393200                /* Obvious */