Ticket #1693: 0003-Anomalous-races-Add-new-flag-VULN_LIGHT.patch

File 0003-Anomalous-races-Add-new-flag-VULN_LIGHT.patch, 13.3 KB (added by daniel.santos, 7 years ago)
  • src/cave.h

    From aff8a5da6e3f05062bd577a548944089f60a0089 Mon Sep 17 00:00:00 2001
    From: Daniel Santos <daniel.santos@pobox.com>
    Date: Sun, 21 Oct 2012 15:37:19 -0500
    Subject: [PATCH v2 03/11] Anomalous races: Add new flag VULN_LIGHT
    
    This new flag makes a player vulnerable to light.  This means that light
    that would normally cause damage to any monster vulnerable to light to
    also cause damage to the player. Further, the player will take
    considerable damage while out in the sun in town (but not while inside
    shops or their home), which is doubled if it's midday. To assist with
    this, when the player's race has the VULN_LIGHT flag, the dungeon stairs
    will always be near their home and the time of day to be printed at the
    bottom of the screen.
    ---
     src/cave.h                     |    4 +++
     src/defines.h                  |   15 ++++++++++++++
     src/dungeon.c                  |   30 +++++++++++++++++++++++++++
     src/generate.c                 |   22 ++++++++++++++-----
     src/list-gf-types.h            |    4 +-
     src/object/list-object-flags.h |    3 +-
     src/spells2.c                  |   20 +++++++++++++++++-
     src/ui-birth.c                 |    1 +
     src/xtra3.c                    |   43 ++++++++++++++++++++++++++++++++++++++-
     9 files changed, 130 insertions(+), 12 deletions(-)
    
    diff --git a/src/cave.h b/src/cave.h
    index 50f0b04..c96b845 100644
    a b extern bool cave_istrap(struct cave *c, int y, int x); 
    104104extern bool cave_isstairs(struct cave *c, int y, int x); 
    105105extern bool cave_isupstairs(struct cave *c, int y, int x); 
    106106extern bool cave_isdownstairs(struct cave *c, int y, int x); 
     107static inline bool cave_isstore(struct cave *c, int y, int x) { 
     108/*      return c->feat[y][x] >= FEAT_SHOP_HEAD && c->feat[y][x] <= FEAT_SHOP_TAIL;*/ 
     109        return c->feat[y][x] & FEAT_SHOP_HEAD; 
     110} 
    107111 
    108112/* BEHAVIOR PREDICATES */ 
    109113extern bool cave_isopen(struct cave *c, int y, int x); 
  • src/defines.h

    diff --git a/src/defines.h b/src/defines.h
    index eef6989..1921972 100644
    a b  
    170170#define MON_MULT_ADJ            8       /* High value slows multiplication */ 
    171171#define MON_DRAIN_LIFE          2       /* Percent of player exp drained per hit */ 
    172172 
     173/* Total turns in a day */ 
     174#define DAY (10L * TOWN_DAWN) 
     175 
     176/* 
     177 * Start of each portion of a day. (mid- day/night is aproximate, each covering 
     178 * a four hour period) 
     179 */ 
     180static const long TIME_MORNING           = 0L;                          /*  6:00 AM */ 
     181static const long TIME_MIDDAY            = DAY *  8L / 48L;     /* 10:00 AM */ 
     182static const long TIME_AFTERNOON         = DAY * 12L / 48L;     /*  2:00 PM */ 
     183static const long TIME_SUNSET            = DAY * 23L / 48L;     /*  5:30 PM */ 
     184static const long TIME_EVENING           = DAY * 24L / 48L;     /*  6:00 PM */ 
     185static const long TIME_MIDNIGHT          = DAY * 32L / 48L;     /* 10:00 PM */ 
     186static const long TIME_EARLY_MORNING = DAY * 40L / 48L; /*  2:00 AM */ 
     187static const long TIME_PREDAWN           = DAY * 47L / 48L;     /*  5:30 AM */ 
    173188 
    174189/* 
    175190 * There is a 1/50 (2%) chance of inflating the requested monster level 
  • src/dungeon.c

    diff --git a/src/dungeon.c b/src/dungeon.c
    index 6ee6954..3723c0c 100644
    a b static void process_world(struct cave *c) 
    575575                take_hit(p_ptr, i, "a fatal wound"); 
    576576        } 
    577577 
     578        /* Take damage from sun */ 
     579        if(!p_ptr->depth && check_state(p_ptr, OF_VULN_LIGHT, p_ptr->state.flags)) { 
     580                long time = turn % DAY; 
     581 
     582                if (time < TIME_EVENING && !cave_isstore(c, p_ptr->py, p_ptr->px)) { 
     583                        /* double max damage if midday */ 
     584                        int mult = (time >= TIME_MIDDAY && time < TIME_AFTERNOON) ? 2 : 1; 
     585                        int mindam = p_ptr->mhp * mult * 5 / 100; 
     586                        int maxdam = p_ptr->mhp * mult * 15 / 100; 
     587                        int dam; 
     588 
     589                        if (!mindam) 
     590                                mindam = 1; 
     591 
     592                        if (!maxdam) 
     593                                maxdam = 1; 
     594 
     595                        dam = rand_range(mindam, maxdam); 
     596 
     597                        /* adjust for resistance */ 
     598                        dam = adjust_dam(p_ptr, GF_LIGHT_WEAK, dam, RANDOMISE, 
     599                                check_for_resist(p_ptr, GF_LIGHT_WEAK, p_ptr->state.flags, TRUE)); 
     600 
     601                        msg("The sun is out!"); 
     602                        take_hit(p_ptr, dam, "the sun"); 
     603                        disturb(p_ptr, 1, 0); 
     604                } 
     605        } 
     606 
     607 
    578608 
    579609        /*** Check the Food, and Regenerate ***/ 
    580610 
  • src/generate.c

    diff --git a/src/generate.c b/src/generate.c
    index a512d1b..2626c80 100644
    a b bool cavern_gen(struct cave *c, struct player *p) { 
    35313531 * Currently, there is a main street horizontally through the middle of town, 
    35323532 * and all the shops face it (e.g. the shops on the north side face south). 
    35333533 */ 
    3534 static void build_store(struct cave *c, int n, int yy, int xx) { 
     3534static void build_store(struct cave *c, int n, int yy, int xx, int* dy, int* dx) { 
    35353535        /* Find the "center" of the store */ 
    35363536        int y0 = yy * 9 + 6; 
    35373537        int x0 = xx * 14 + 12; 
    static void build_store(struct cave *c, int n, int yy, int xx) { 
    35433543        int x2 = x0 + randint1(5); 
    35443544 
    35453545        /* Determine door location, based on which side of the street we're on */ 
    3546         int dy = (yy == 0) ? y2 : y1; 
    3547         int dx = rand_range(x1, x2); 
     3546        *dy = (yy == 0) ? y2 : y1; 
     3547        *dx = rand_range(x1, x2); 
    35483548 
    35493549        /* Build an invulnerable rectangular building */ 
    35503550        fill_rectangle(c, y1, x1, y2, x2, FEAT_PERM_EXTRA); 
    35513551 
    35523552        /* Clear previous contents, add a store door */ 
    3553         cave_set_feat(c, dy, dx, FEAT_SHOP_HEAD + n); 
     3553        cave_set_feat(c, *dy, *dx, FEAT_SHOP_HEAD + n); 
    35543554} 
    35553555 
    35563556 
    static void build_store(struct cave *c, int n, int yy, int xx) { 
    35703570static void town_gen_hack(struct cave *c, struct player *p) { 
    35713571        int y, x, n, k; 
    35723572        int rooms[MAX_STORES]; 
     3573        int doors[MAX_STORES][2]; 
    35733574 
    35743575        int n_rows = 2; 
    35753576        int n_cols = (MAX_STORES + 1) / n_rows; 
    static void town_gen_hack(struct cave *c, struct player *p) { 
    35843585        /* Place rows of stores */ 
    35853586        for (y = 0; y < n_rows; y++) { 
    35863587                for (x = 0; x < n_cols; x++) { 
     3588                        int room; 
    35873589                        if (n < 1) break; 
    35883590 
    35893591                        /* Pick a remaining store */ 
    35903592                        k = randint0(n); 
     3593                        room = rooms[k]; 
    35913594 
    35923595                        /* Build that store at the proper location */ 
    3593                         build_store(c, rooms[k], y, x); 
     3596                        build_store(c, room, y, x, &doors[room][0], &doors[room][1]); 
    35943597 
    35953598                        /* Shift the stores down, remove one store */ 
    35963599                        rooms[k] = rooms[--n]; 
    static void town_gen_hack(struct cave *c, struct player *p) { 
    35983601        } 
    35993602 
    36003603        /* Place the stairs */ 
    3601         find_empty_range(c, &y, 3, TOWN_HGT - 3, &x, 3, TOWN_WID - 3); 
     3604        if (!of_has(p_ptr->race->flags, OF_VULN_LIGHT)) 
     3605                find_empty_range(c, &y, 3, TOWN_HGT - 3, &x, 3, TOWN_WID - 3); 
     3606        else { 
     3607                /* troll's home must be near cave */ 
     3608                int dy = doors[STORE_HOME][0]; 
     3609                int dx = doors[STORE_HOME][1]; 
     3610                find_empty_range(c, &y, dy - 4, dy + 4, &x, dx - 4, dx + 4); 
     3611        } 
    36023612 
    36033613        /* Clear previous contents, add down stairs */ 
    36043614        cave_set_feat(c, y, x, FEAT_MORE); 
  • src/list-gf-types.h

    diff --git a/src/list-gf-types.h b/src/list-gf-types.h
    index c991e12..2c7e414 100644
    a b GF(ARROW, "something sharp", 0, 0, RV(0,0,0,0), 0, 0, TRUE, 0, 0, 
    2323GF(MISSILE,             "something",            0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              0,                      0,                              0,                              0) 
    2424GF(MANA,                "something",            0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              0,                      0,                              0,                              0) 
    2525GF(HOLY_ORB,    "something",            0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              0,                      0,                              0,                              0) 
    26 GF(LIGHT_WEAK,  NULL,                           0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              0,                      RF_HURT_LIGHT,  0,                              0) 
     26GF(LIGHT_WEAK,  NULL,                           0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   OF_VULN_LIGHT,  0,                      RF_HURT_LIGHT,  0,                              0) 
    2727GF(DARK_WEAK,   NULL,                           0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              0,                      0,                              0,                              0) 
    2828GF(WATER,               "water",                        0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              RF_IM_WATER,0,                          0,                              0) 
    2929GF(PLASMA,              "something",            0,                              0,      RV(0,0,0,0),    0,                              0,                      TRUE,   0,                              RF_RES_PLAS,0,                          0,                              0) 
    GF(ELEC, "lightning", OF_RES_ELEC, 1, RV(3,0,0,0), TMD_OPP_ELEC, OF_I 
    3838GF(FIRE,                "fire",                         OF_RES_FIRE,    1,  RV(3,0,0,0),    TMD_OPP_FIRE,   OF_IM_FIRE, TRUE,   OF_VULN_FIRE,   RF_IM_FIRE, RF_HURT_FIRE,       OF_HATES_FIRE,  OF_IGNORE_FIRE) 
    3939GF(COLD,                "cold",                         OF_RES_COLD,    1,  RV(3,0,0,0),    TMD_OPP_COLD,   OF_IM_COLD, TRUE,   OF_VULN_COLD,   RF_IM_COLD, RF_HURT_COLD,       OF_HATES_COLD,  OF_IGNORE_COLD) 
    4040GF(POIS,                "poison",                       OF_RES_POIS,    1,  RV(3,0,0,0),    TMD_OPP_POIS,   0,          TRUE,   0,              RF_IM_POIS, 0,                          0,                              0) 
    41 GF(LIGHT,               "something",            OF_RES_LIGHT,   4,  RV(6,1,6,0),    0,              0,          TRUE,   0,              0,          RF_HURT_LIGHT,      0,                              0) 
     41GF(LIGHT,               "something",            OF_RES_LIGHT,   4,  RV(6,1,6,0),    0,              0,          TRUE,   OF_VULN_LIGHT,  0,          RF_HURT_LIGHT,      0,                              0) 
    4242GF(DARK,                "something",            OF_RES_DARK,    4,  RV(6,1,6,0),    0,              0,          TRUE,   0,              0,          0,                          0,                              0) 
    4343GF(CONFU,               "something",            OF_RES_CONFU,   6,      RV(6,1,6,0),    TMD_OPP_CONF,   0,                      TRUE,   0,                              0,                      0,                              0,                              0) 
    4444GF(SOUND,               "noise",                        OF_RES_SOUND,   5,  RV(6,1,6,0),    0,              0,          TRUE,   0,              0,          0,                          0,                              0) 
  • src/object/list-object-flags.h

    diff --git a/src/object/list-object-flags.h b/src/object/list-object-flags.h
    index cfc74dc..702f0fd 100644
    a b OF(VULN_ACID, FALSE, 0, OFID_NORMAL,OFT_VULN, -6, 0, 1, 1, 1, 1, 1, 1, 
    6161OF(VULN_ELEC,   FALSE,  0,                              OFID_NORMAL,OFT_VULN,   -6,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
    6262OF(VULN_FIRE,   FALSE,  0,                              OFID_NORMAL,OFT_VULN,   -6,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
    6363OF(VULN_COLD,   FALSE,  0,                              OFID_NORMAL,OFT_VULN,   -6,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
    64 OF(XXX3,        FALSE,  0,                              0,                      0,                      0,              0,      0,      0,      0,              0,      0,              0,              0,              0,              0,      0,              0,              "Your %s glows.") 
     64OF(VULN_LIGHT,  FALSE,  0,                              OFID_NORMAL,OFT_VULN,   -6,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
     65/* OF(XXX3,        FALSE,       0,                              0,                      0,                      0,              0,      0,      0,      0,              0,      0,              0,              0,              0,              0,      0,              0,              "Your %s glows.") */ 
    6566OF(XXX4,        FALSE,  0,                              0,                      0,                      0,              0,      0,      0,      0,              0,      0,              0,              0,              0,              0,      0,              0,              "Your %s glows.") 
    6667OF(IM_ACID,     FALSE,  0,                              OFID_NORMAL,OFT_IMM,    38,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
    6768OF(IM_ELEC,     FALSE,  0,                              OFID_NORMAL,OFT_IMM,    35,             0,      1,      1,      1,              1,      1,              1,              1,              1,              1,      1,              1,              "Your %s glows.") 
  • src/spells2.c

    diff --git a/src/spells2.c b/src/spells2.c
    index 38a73d6..0c1836b 100644
    a b void destroy_area(int y1, int x1, int r, bool full) 
    20592059                        /* Become blind */ 
    20602060                        (void)player_inc_timed(p_ptr, TMD_BLIND, 10 + randint1(10), TRUE, TRUE); 
    20612061                } 
     2062 
     2063                if(check_state(p_ptr, OF_VULN_LIGHT, p_ptr->state.flags)) { 
     2064                        int dam = rand_range(50, 100); 
     2065 
     2066                        dam = adjust_dam(p_ptr, GF_LIGHT, dam, RANDOMISE, 
     2067                                check_for_resist(p_ptr, GF_LIGHT, p_ptr->state.flags, TRUE)); 
     2068 
     2069                        take_hit(p_ptr, dam, "light"); 
     2070                } 
    20622071        } 
    20632072 
    20642073 
    bool light_area(int dam, int rad) 
    26182627        int px = p_ptr->px; 
    26192628 
    26202629        int flg = PROJECT_GRID | PROJECT_KILL; 
     2630        int vuln = check_state(p_ptr, OF_VULN_LIGHT, p_ptr->state.flags); 
    26212631 
    26222632        /* Hack -- Message */ 
    26232633        if (!p_ptr->timed[TMD_BLIND]) 
    2624                 msg("You are surrounded by a white light."); 
     2634                msg("You are surrounded by a white light%s", vuln ? ", it hurts!" : "."); 
    26252635 
    26262636        /* Hook into the "project()" function */ 
    26272637        (void)project(-1, rad, py, px, dam, GF_LIGHT_WEAK, flg); 
    bool light_area(int dam, int rad) 
    26292639        /* Light up the room */ 
    26302640        light_room(py, px, LIGHT); 
    26312641 
     2642        if(vuln) { 
     2643                /* punishment for a troll players */ 
     2644                dam = adjust_dam(p_ptr, GF_LIGHT_WEAK, dam, RANDOMISE, 
     2645                        check_for_resist(p_ptr, GF_LIGHT_WEAK, p_ptr->state.flags, TRUE)); 
     2646 
     2647                take_hit(p_ptr, dam, "light"); 
     2648        } 
     2649 
    26322650        /* Assume seen */ 
    26332651        return (TRUE); 
    26342652} 
  • src/ui-birth.c

    diff --git a/src/ui-birth.c b/src/ui-birth.c
    index 4df2852..a2ce57e 100644
    a b static const char *get_flag_desc(bitflag flag) 
    233233                case OF_FREE_ACT: return "Resists paralysis"; 
    234234                case OF_REGEN: return "Regenerates quickly"; 
    235235                case OF_SEE_INVIS: return "Sees invisible creatures"; 
     236                case OF_VULN_LIGHT: return "Vulnerable to bright light"; 
    236237 
    237238                default: return "Undocumented flag"; 
    238239        } 
  • src/xtra3.c

    diff --git a/src/xtra3.c b/src/xtra3.c
    index 874f401..8ccf8c7 100644
    a b static size_t prt_buttons(int row, int col) 
    949949        return 0; 
    950950} 
    951951 
     952/* 
     953 * Prints time of day indicator outside for trolls 
     954 */ 
     955static size_t prt_time_of_day(int row, int col) 
     956{ 
     957        long time; 
     958        byte color; 
     959        const char *str; 
     960 
     961        /* Only show if player is vulnerable to light. */ 
     962        if (!check_state(p_ptr, OF_VULN_LIGHT, p_ptr->state.flags)) 
     963                return 0; 
     964 
     965        time = turn % DAY; 
     966 
     967        if (p_ptr->depth) 
     968                color = TERM_L_DARK; 
     969        else if ((time >= TIME_EVENING && time < TIME_PREDAWN) 
     970                         || check_state(p_ptr, OF_RES_LIGHT, p_ptr->state.flags)) 
     971                color = TERM_L_GREEN; 
     972        else if (time >= TIME_PREDAWN) 
     973                color = TERM_YELLOW; 
     974        else 
     975                color = TERM_RED; 
     976 
     977        if (time < TIME_MIDDAY)                         str = "Morning"; 
     978        else if (time < TIME_AFTERNOON)         str = "Midday"; 
     979        else if (time < TIME_SUNSET)            str = "Afternoon"; 
     980        else if (time < TIME_EVENING)           str = "Sunset"; 
     981        else if (time < TIME_MIDNIGHT)          str = "Evening"; 
     982        else if (time < TIME_EARLY_MORNING)     str = "Midnight"; 
     983        else if (time < TIME_PREDAWN)           str = "Early Morning"; 
     984        else                                                            str = "Predawn"; 
     985 
     986        c_put_str(color, str, row, col); 
     987 
     988        return strlen(str) + 1; 
     989} 
     990 
    952991 
    953992/* Useful typedef */ 
    954993typedef size_t status_f(int row, int col); 
    955994 
    956995status_f *status_handlers[] = 
    957 { prt_buttons, prt_unignore, prt_recall, prt_state, prt_cut, prt_stun, 
    958   prt_hunger, prt_study, prt_tmd, prt_dtrap }; 
     996{ prt_time_of_day, prt_buttons, prt_unignore, prt_recall, prt_state, prt_cut, 
     997  prt_stun, prt_hunger, prt_study, prt_tmd, prt_dtrap }; 
    959998 
    960999 
    9611000/*