Changeset 419

Show
Ignore:
Timestamp:
08/01/07 02:06:09 (1 year ago)
Author:
ctate
Message:

* Fix #308 - Wands of Wonder now identify if the effect is noticeable, otherwise show as {tried}
* Rework the Wand of Dragon's Breath dispatch to tighten it up

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/effects.c

    r418 r419  
    6262/* 
    6363 * The "wonder" effect. 
     64 *  
     65 * Returns TRUE if the effect is evident. 
    6466 */ 
    65 static void spell_wonder(int dir, int die, int beam) 
     67static bool spell_wonder(int dir, int die, int beam) 
    6668{ 
    6769/* This spell should become more useful (more 
     
    7274   some potent effects only at high level. */ 
    7375 
     76        bool visible = FALSE; 
    7477        int py = p_ptr->py; 
    7578        int px = p_ptr->px; 
     
    7780 
    7881        if (die > 100) 
     82        { 
     83                /* above 100 the effect is always visible */ 
    7984                msg_print("You feel a surge of power!"); 
    80  
    81         if (die < 8) clone_monster(dir); 
    82         else if (die < 14) speed_monster(dir); 
    83         else if (die < 26) heal_monster(dir); 
    84         else if (die < 31) poly_monster(dir); 
     85                visible = TRUE; 
     86        } 
     87 
     88        if (die < 8) visible = clone_monster(dir); 
     89        else if (die < 14) visible = speed_monster(dir); 
     90        else if (die < 26) visible = heal_monster(dir); 
     91        else if (die < 31) visible = poly_monster(dir); 
    8592        else if (die < 36) 
    86                 fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, 
    87                                   damroll(3 + ((plev - 1) / 5), 4)); 
    88         else if (die < 41) confuse_monster(dir, plev); 
    89         else if (die < 46) fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); 
    90         else if (die < 51) lite_line(dir); 
     93                visible = fire_bolt_or_beam(beam - 10, GF_MISSILE, dir, 
     94                                            damroll(3 + ((plev - 1) / 5), 4)); 
     95        else if (die < 41) visible = confuse_monster(dir, plev); 
     96        else if (die < 46) visible = fire_ball(GF_POIS, dir, 20 + (plev / 2), 3); 
     97        else if (die < 51) visible = lite_line(dir); 
    9198        else if (die < 56) 
    92                 fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6)); 
     99                visible = fire_beam(GF_ELEC, dir, damroll(3+((plev-5)/6), 6)); 
    93100        else if (die < 61) 
    94                 fire_bolt_or_beam(beam-10, GF_COLD, dir, 
    95                                   damroll(5+((plev-5)/4), 8)); 
     101                visible = fire_bolt_or_beam(beam-10, GF_COLD, dir, 
     102                                            damroll(5+((plev-5)/4), 8)); 
    96103        else if (die < 66) 
    97                 fire_bolt_or_beam(beam, GF_ACID, dir, 
    98                                   damroll(6+((plev-5)/4), 8)); 
     104                visible = fire_bolt_or_beam(beam, GF_ACID, dir, 
     105                                            damroll(6+((plev-5)/4), 8)); 
    99106        else if (die < 71) 
    100                 fire_bolt_or_beam(beam, GF_FIRE, dir, 
    101                                   damroll(8+((plev-5)/4), 8)); 
    102         else if (die < 76) drain_life(dir, 75); 
    103         else if (die < 81) fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); 
    104         else if (die < 86) fire_ball(GF_ACID, dir, 40 + plev, 2); 
    105         else if (die < 91) fire_ball(GF_ICE, dir, 70 + plev, 3); 
    106         else if (die < 96) fire_ball(GF_FIRE, dir, 80 + plev, 3); 
     107                visible = fire_bolt_or_beam(beam, GF_FIRE, dir, 
     108                                            damroll(8+((plev-5)/4), 8)); 
     109        else if (die < 76) visible = drain_life(dir, 75); 
     110        else if (die < 81) visible = fire_ball(GF_ELEC, dir, 30 + plev / 2, 2); 
     111        else if (die < 86) visible = fire_ball(GF_ACID, dir, 40 + plev, 2); 
     112        else if (die < 91) visible = fire_ball(GF_ICE, dir, 70 + plev, 3); 
     113        else if (die < 96) visible = fire_ball(GF_FIRE, dir, 80 + plev, 3); 
     114        /* above 100 'visible' is already true */ 
    107115        else if (die < 101) drain_life(dir, 100 + plev); 
    108116        else if (die < 104) earthquake(py, px, 12); 
     
    117125                hp_player(300); 
    118126        } 
     127 
     128        return visible; 
    119129} 
    120130 
     
    13631373                case EF_WONDER: 
    13641374                { 
    1365                         spell_wonder(dir, randint(100) + p_ptr->lev / 5, beam)
     1375                        if (spell_wonder(dir, randint(100) + p_ptr->lev / 5, beam)) *ident = TRUE
    13661376                        return TRUE; 
    13671377                } 
     
    13711381                case EF_WAND_BREATH: 
    13721382                { 
    1373                         /* pick a random ball effect... */ 
    1374                         switch (randint(5)) 
    1375                         { 
    1376                                 case 1: 
    1377                                 { 
    1378                                         fire_ball(GF_ACID, dir, 200, 3); 
    1379                                         break; 
    1380                                 } 
    1381  
    1382                                 case 2: 
    1383                                 { 
    1384                                         fire_ball(GF_ELEC, dir, 160, 3); 
    1385                                         break; 
    1386                                 } 
    1387  
    1388                                 case 3: 
    1389                                 { 
    1390                                         fire_ball(GF_FIRE, dir, 200, 3); 
    1391                                         break; 
    1392                                 } 
    1393  
    1394                                 case 4: 
    1395                                 { 
    1396                                         fire_ball(GF_COLD, dir, 160, 3); 
    1397                                         break; 
    1398                                 } 
    1399  
    1400                                 default: 
    1401                                 { 
    1402                                         fire_ball(GF_POIS, dir, 120, 3); 
    1403                                 } 
    1404                         } 
    1405  
    1406                         /* ...and ID the item */ 
    1407                         *ident = TRUE; 
     1383                        /* table of random ball effects and their damages */ 
     1384                        const int breath_types[] = { 
     1385                                GF_ACID, 200, 
     1386                                GF_ELEC, 160, 
     1387                                GF_FIRE, 200, 
     1388                                GF_COLD, 160, 
     1389                                GF_POIS, 120 
     1390                        }; 
     1391                        /* pick a random (type, damage) tuple in the table */ 
     1392                        int which = 2 * rand_int(sizeof(breath_types) / (2 * sizeof(int))); 
     1393                        if (fire_ball(breath_types[which], dir, breath_types[which + 1], 3)) 
     1394                                *ident = TRUE; 
    14081395                        return TRUE; 
    14091396                }