- [+] add a bunch of gemstones - worth points

- [+] 'thrust' ability isn't showing up in ABILS
- [+] give slight accuracy penalty when thrusting
- [+] fixed shieldblock difficulty in melee combat
- [+] increased maxstamina
- [+] don't require stamina to move!
- [+] "You hear a roars."
- [+] remove duplicate corpse rot code
- [+] CRASH
    - [+] malloc: *** error for object 0x1349d94f8: incorrect checksum
          for freed object - object was probably modified after being
          freed.
    - [+] #7  0x00000001000f438a in addobject (where=0x134edc060,
          name=0x0, canstack=0, wantlinkholes=-1, forceoid=OT_CLAWS) at
          objects.c:983
          #8  0x00000001000f298d in addobfast (where=0x134edc060,
          oid=OT_CLAWS) at objects.c:409
          #9  0x00000001000b621b in getbestweapon (lf=0x114439ff0) at
          lf.c:5194
          #10 0x00000001000087fa in aiturn (lf=0x114439ff0) at ai.c:1236
    - [+] fixed ?
- [+] instead of everything >=6 being dark, make a CHANCE to be dark
      starting at l6.
- [+] why do i ese gem of seeing so often
    - [+] because i need more types or 'rock'
- [+] have to cook food before eating it?
    - [+] need novice cooking skill for preparecorpse ability
    - [+] otherwise you only get a very small amount of nutrition (10%)
- [+] split ob piles before eating them
- [+] detect poison should detect poison traps
- [+] telling your ally to rest until healed isn't working...
    - [+] wasn't taking injuries or stamina into account.
- [+] change druid spells
    - [+] start with 3 random spells
    - [+] on levelup, select a random nature spell (up to your highest
          level)
This commit is contained in:
Rob Pearce 2011-11-08 01:19:25 +00:00
parent 7cd169637c
commit d5c24cd742
16 changed files with 429 additions and 162 deletions

View File

@ -613,12 +613,12 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
// long weapon in an enclosed space? // long weapon in an enclosed space?
if (wep && hasflag(wep->flags, F_NEEDSSPACE)) { if (wep && hasflag(wep->flags, F_NEEDSSPACE)) {
if (countcellexits(lf->cell) < 3) { if (countcellexits(lf->cell, DT_COMPASS) < 3) {
if (pctchance(75)) { if (pctchance(75)) {
if (isplayer(lf)) { if (isplayer(lf)) {
msg("^wYour %s glances off a nearby wall.", wepname); msg("^wYour %s glances off a nearby wall.", noprefix(wepname));
} else if (cansee(player, lf)) { } else if (cansee(player, lf)) {
msg("^w%s%s %s glances off a nearby wall.", attackername, getpossessive(attackername), wepname); msg("^w%s%s %s glances off a nearby wall.", attackername, getpossessive(attackername), noprefix(wepname));
} }
//taketime(lf, getattackspeed(lf)); //taketime(lf, getattackspeed(lf));
return B_FALSE; return B_FALSE;
@ -831,7 +831,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
shield = getshield(victim); shield = getshield(victim);
if (shield && cansee(victim, lf)) { if (shield && cansee(victim, lf)) {
int difficulty; int difficulty;
difficulty = 25 + ((gethitdice(lf) - gethitdice(victim)*3) ); difficulty = 25 + ((gethitdice(lf) - gethitdice(victim))*3 );
if (skillcheck(victim, SC_SHIELDBLOCK, difficulty, 0)) { if (skillcheck(victim, SC_SHIELDBLOCK, difficulty, 0)) {
char shname[BUFLEN]; char shname[BUFLEN];
// announce // announce

213
data.c
View File

@ -172,6 +172,7 @@ void initjobs(void) {
// initial skills // initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_LOCKPICKING, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_LOCKPICKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL);
@ -237,6 +238,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 bullets"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 bullets");
// initial skills // initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_FIRSTAID, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_FIRSTAID, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_RANGED, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_RANGED, PR_ADEPT, NA, NULL);
@ -248,7 +250,6 @@ void initjobs(void) {
addflag(lastjob->flags, F_CANLEARN, SK_BACKSTAB, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_BACKSTAB, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_METALWORK, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_METALWORK, NA, NA, NULL);
@ -270,6 +271,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "pair of sandals"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "pair of sandals");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "2 sprigs of mistletoe"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "2 sprigs of mistletoe");
// initial skills // initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_LORE_NATURE, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_LORE_NATURE, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_STAVES, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_STAVES, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_ADEPT, NA, NULL);
@ -277,7 +279,6 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTSKILL, SK_SPEECH, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SPEECH, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_SS_NATURE, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_NATURE, PR_NOVICE, NA, NULL);
// learnable skills // learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_EXOTICWEPS, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_EXOTICWEPS, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, NA, NA, NULL);
@ -289,7 +290,8 @@ void initjobs(void) {
addflag(lastjob->flags, F_CANLEARN, SK_TECHUSAGE, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_TECHUSAGE, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LORE_DRAGONS, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LORE_DRAGONS, PR_BEGINNER, NA, NULL);
// abilities // abilities
mayusespellschool(lastjob->flags, SS_NATURE, F_CANCAST); //mayusespellschool(lastjob->flags, SS_NATURE, F_CANCAST);
addflag(lastjob->flags, F_LEVSPELLSCHOOL, 101, SS_NATURE, B_TRUE, NULL); // new enviromancy spell every 1 level
addflag(lastjob->flags, F_HASPET, NA, NA, NA, "young wolf"); addflag(lastjob->flags, F_HASPET, NA, NA, NA, "young wolf");
addflag(lastjob->flags, F_PARTVEGETARIAN, B_TRUE, NA, NA, NULL); addflag(lastjob->flags, F_PARTVEGETARIAN, B_TRUE, NA, NA, NULL);
addflag(lastjob->flags, F_LEVSKILL, 5, SK_LORE_NATURE, NA, NULL); addflag(lastjob->flags, F_LEVSKILL, 5, SK_LORE_NATURE, NA, NULL);
@ -382,6 +384,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_ADEPT, NA, NULL);
// learnable akills // learnable akills
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
@ -425,6 +428,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTSKILL, SK_STEALTH, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_STEALTH, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_TECHUSAGE, PR_BEGINNER, NA, NULL);
// learnable skills // learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_ARMOUR, PR_NOVICE, NA, NULL); // limit addflag(lastjob->flags, F_CANLEARN, SK_ARMOUR, PR_NOVICE, NA, NULL); // limit
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_BEGINNER, NA, NULL); // limit addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_BEGINNER, NA, NULL); // limit
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL);
@ -473,6 +477,7 @@ void initjobs(void) {
// learnable skills // learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_METALWORK, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_METALWORK, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL);
@ -509,6 +514,7 @@ void initjobs(void) {
// learnable skills // learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_BACKSTAB, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_BACKSTAB, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LORE_ARCANA, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LORE_ARCANA, PR_SKILLED, NA, NULL);
@ -587,6 +593,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10-20 gold coins"); addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10-20 gold coins");
// initial skills // initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_AXES, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_AXES, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CLUBS, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_CLUBS, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_SHORTBLADES, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SHORTBLADES, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_LONGBLADES, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_LONGBLADES, PR_NOVICE, NA, NULL);
@ -601,7 +608,7 @@ void initjobs(void) {
// learnable skills // learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_SKILLED, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_COOKING, PR_ADEPT, NA, NULL); // limit
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_SWIMMING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SWIMMING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_AXES, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_AXES, NA, NA, NULL);
@ -649,6 +656,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, PR_ADEPT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_SHORTBLADES, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SHORTBLADES, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_SEWING, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SEWING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_SPEECH, NA, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SPEECH, NA, NA, NULL);
@ -998,6 +1006,7 @@ void initobjects(void) {
addoc(OC_DFEATURE, "Dungeon Features", "Doors, etc.", '\\', C_GREY, RR_RARE); addoc(OC_DFEATURE, "Dungeon Features", "Doors, etc.", '\\', C_GREY, RR_RARE);
addoc(OC_FURNITURE, "Furniture", "Various kinds of mundane (or not so mundane) furnishings.", '\\', C_BROWN, RR_COMMON); addoc(OC_FURNITURE, "Furniture", "Various kinds of mundane (or not so mundane) furnishings.", '\\', C_BROWN, RR_COMMON);
addocnoun(lastobjectclass, "furniture"); addocnoun(lastobjectclass, "furniture");
addflag(lastobjectclass->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addoc(OC_TERRAIN, "Terrain", "Water, etc.", '\\', C_GREY, RR_NEVER); addoc(OC_TERRAIN, "Terrain", "Water, etc.", '\\', C_GREY, RR_NEVER);
addoc(OC_TRAP, "Trap", "Fiendish traps.", '^', C_GREY, RR_RARE); addoc(OC_TRAP, "Trap", "Fiendish traps.", '^', C_GREY, RR_RARE);
addocnoun(lastobjectclass, "trap"); addocnoun(lastobjectclass, "trap");
@ -1180,43 +1189,8 @@ void initobjects(void) {
addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL); addflag(lastot->flags, F_OBHP, 30, 30, NA, NULL);
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
addot(OT_BOULDER, "boulder", "A massive stone boulder.", MT_STONE, 80, OC_ROCK, SZ_HUGE);
addflag(lastot->flags, F_RARITY, H_ALL, 75, NA, "");
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL);
addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
// addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "50-100 stones");
addot(OT_ICICLE, "huge icicle", "A massive ice stalacmite.", MT_ICE, 200, OC_ROCK, SZ_LARGE);
addflag(lastot->flags, F_GLYPH, C_CYAN, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL);
addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addot(OT_STATUE, "statue", "A stone statue of a monster.", MT_STONE, 80, OC_ROCK, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, "");
addflag(lastot->flags, F_RARITY, H_VILLAGE, 80, NA, "");
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL); // will be overridden
addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "20-50 stones");
addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "a statue");
addot(OT_HOLEINGROUND, "hole in the ground", "A gaping hole in the ground.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); addot(OT_HOLEINGROUND, "hole in the ground", "A gaping hole in the ground.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL);
addflag(lastot->flags, F_GLYPH, C_BLUE, NA, NA, "^"); addflag(lastot->flags, F_GLYPH, C_BLUE, NA, NA, "^");
@ -1461,6 +1435,43 @@ void initobjects(void) {
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some gold"); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some gold");
// rocks
addot(OT_BOULDER, "boulder", "A massive stone boulder.", MT_STONE, 80, OC_ROCK, SZ_HUGE);
addflag(lastot->flags, F_RARITY, H_ALL, 75, NA, "");
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL);
addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
// addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "50-100 stones");
addot(OT_ICICLE, "huge icicle", "A massive ice stalacmite.", MT_ICE, 200, OC_ROCK, SZ_LARGE);
addflag(lastot->flags, F_GLYPH, C_CYAN, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL);
addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addot(OT_STATUE, "statue", "A stone statue of a monster.", MT_STONE, 80, OC_ROCK, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, "");
addflag(lastot->flags, F_RARITY, H_VILLAGE, 80, NA, "");
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "'");
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_LARGE, NA, NULL); // will be overridden
addflag(lastot->flags, F_PUSHABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_BLOCKSLOF, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_OBHP, 80, 80, NA, NULL);
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "20-50 stones");
addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "a statue");
addot(OT_STONE, "stone", "A medium-sized roundish stone.", MT_STONE, 0.5, OC_ROCK, SZ_TINY); addot(OT_STONE, "stone", "A medium-sized roundish stone.", MT_STONE, 0.5, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, "");
@ -1468,6 +1479,64 @@ void initobjects(void) {
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
// gems
addot(OT_AQUAMARINE, "aquamarine stone", "An aqua-coloured gemstone.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_WHITE, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 250, NA, NA, NULL);
addot(OT_AMETHYST, "amethyst", "A purple gemstone.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_MAGENTA, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 15, NA, NA, NULL);
addot(OT_DIAMOND, "diamond", "A sparkling diamond.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_WHITE, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL);
addot(OT_EMERALD, "emerald", "A deep green gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_GREEN, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 650, NA, NA, NULL);
addot(OT_OPAL, "opal", "An amorphous form of silica related to quartz.", MT_STONE, 0.1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_GREY, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 70, NA, NA, NULL);
addot(OT_PEARL, "pearl", "A small pinkish-white gem.", MT_STONE, 0.1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_WHITE, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 30, NA, NA, NULL);
addot(OT_RUBY, "ruby", "A large red gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_RED, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 110, NA, NA, NULL);
addot(OT_SAPPHIRE, "sapphire", "A brilliant blue gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_CYAN, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 850, NA, NA, NULL);
addot(OT_TOPAZ, "topaz stone", "A dull blue gem.", MT_STONE, 0.2, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, C_BLUE, NA, NA, "*");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_VALUE, 60, NA, NA, NULL);
addot(OT_ASH, "pile of ash", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY); addot(OT_ASH, "pile of ash", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, NA, NA, NA, ","); addflag(lastot->flags, F_GLYPH, NA, NA, NA, ",");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
@ -1479,7 +1548,7 @@ void initobjects(void) {
addflag(lastot->flags, F_GLYPH, NA, NA, NA, ","); addflag(lastot->flags, F_GLYPH, NA, NA, NA, ",");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_EXPLODEONDAM, NA, NA, NA, "1d6"); addflag(lastot->flags, F_EXPLODEONDAM, NA, NA, NA, "1d6");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash");
@ -1487,7 +1556,7 @@ void initobjects(void) {
addot(OT_ASHCONCEAL, "pile of concealing powder", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY); addot(OT_ASHCONCEAL, "pile of concealing powder", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, NA, NA, NA, ","); addflag(lastot->flags, F_GLYPH, NA, NA, NA, ",");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash");
@ -1496,19 +1565,19 @@ void initobjects(void) {
addot(OT_ASHSLEEP, "pile of sleeping powder", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY); addot(OT_ASHSLEEP, "pile of sleeping powder", "A pile of ash.", MT_STONE, 0.1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_GLYPH, NA, NA, NA, ","); addflag(lastot->flags, F_GLYPH, NA, NA, NA, ",");
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, ""); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, ""); addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, RR_RARE, "");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of ash");
addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some ash"); addflag(lastot->flags, F_FEELTEXT, NA, NA, NA, "some ash");
addot(OT_GEMOFSEEING, "gem of seeing", "Magically enhances your eyesight.", MT_STONE, 1, OC_ROCK, SZ_TINY); addot(OT_GEMOFSEEING, "gem of seeing", "Magically enhances your eyesight.", MT_STONE, 1, OC_ROCK, SZ_TINY);
addflag(lastot->flags, F_HOLDCONFER, F_XRAYVIS, 2, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_XRAYVIS, 1, NA, NULL);
addflag(lastot->flags, F_HOLDCONFER, F_SEEINVIS, B_TRUE, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_SEEINVIS, B_TRUE, NA, NULL);
addflag(lastot->flags, F_HOLDCONFER, F_ENHANCESEARCH, 20, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_ENHANCESEARCH, 20, NA, NULL);
addflag(lastot->flags, F_HOLDCONFER, F_DETECTAURAS, B_TRUE, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_DETECTAURAS, B_TRUE, NA, NULL);
addflag(lastot->flags, F_HOLDCONFER, F_DETECTMAGIC, B_TRUE, NA, NULL); addflag(lastot->flags, F_HOLDCONFER, F_DETECTMAGIC, B_TRUE, NA, NULL);
addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 50, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 50, RR_VERYRARE, NULL);
// godstones // godstones
addot(OT_GODSTONEJ, "Godstone of Justice", "An ancient artifact representing the power of justice.", MT_STONE, 3, OC_GODSTONE, SZ_SMALL); addot(OT_GODSTONEJ, "Godstone of Justice", "An ancient artifact representing the power of justice.", MT_STONE, 3, OC_GODSTONE, SZ_SMALL);
addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 1000, NA, NA, NULL);
@ -2265,7 +2334,6 @@ void initobjects(void) {
// l1 // l1
addot(OT_S_SPARK, "flambe", "Creates very hot but short lived burst of flame around the target, dealing 1-6 fire damage to creatures and objects.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addot(OT_S_SPARK, "flambe", "Creates very hot but short lived burst of flame around the target, dealing 1-6 fire damage to creatures and objects.", MT_NOTHING, 0, OC_SPELL, SZ_TINY);
addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL);
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL);
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL);
@ -3170,7 +3238,7 @@ void initobjects(void) {
addflag(lastot->flags, F_STAMCOST, 1, NA, NA, NULL); addflag(lastot->flags, F_STAMCOST, 1, NA, NA, NULL);
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
addflag(lastot->flags, F_AICASTTOFLEE, ST_ANYWHERE, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_ANYWHERE, NA, NA, NULL);
addot(OT_A_COOK, "cook", "Combine food and water into a healthy meals.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY); addot(OT_A_COOK, "cook", "Combine various foods into a healthy meal.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
addot(OT_A_DARKWALK, "darkwalk", "Step between the shadows.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY); addot(OT_A_DARKWALK, "darkwalk", "Step between the shadows.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
@ -3220,6 +3288,8 @@ void initobjects(void) {
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
addflag(lastot->flags, F_NOANNOUNCE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOANNOUNCE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, 10, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, 10, NA, NULL);
addot(OT_A_PREPARECORPSE, "prepare corpse", "Prepare and cook a corpse, making it more nutritious.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
addot(OT_A_QUIVERINGPALM, "quivering palm", "A deadly palm strike which knocks the molecules in the target's body out of alignment.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY); addot(OT_A_QUIVERINGPALM, "quivering palm", "A deadly palm strike which knocks the molecules in the target's body out of alignment.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
addflag(lastot->flags, F_STAMCOST, 10, NA, NA, NULL); addflag(lastot->flags, F_STAMCOST, 10, NA, NA, NULL);
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
@ -4180,7 +4250,7 @@ void initobjects(void) {
addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL);
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL); addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
addot(OT_WOODENSTOOL, "wooden footstool", "A small, wooden footstool.", MT_WOOD, 5, OC_FURNITURE, SZ_SMALL); addot(OT_WOODENSTOOL, "wooden footstool", "A small, wooden footstool.", MT_WOOD, 5, OC_FURNITURE, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 83, NA, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 83, NA, NULL);
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "\\"); addflag(lastot->flags, F_GLYPH, NA, NA, NA, "\\");
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
@ -5479,7 +5549,7 @@ void initobjects(void) {
addflag(lastot->flags, F_CRITCHANCE, 8, NA, NA, NULL); addflag(lastot->flags, F_CRITCHANCE, 8, NA, NA, NULL);
addot(OT_WIZARDSTAFF, "neophyte staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addot(OT_WIZARDSTAFF, "neophyte staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL);
addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL);
addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL); addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL);
@ -5489,7 +5559,7 @@ void initobjects(void) {
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch");
addot(OT_WIZARDSTAFF2, "enchanter staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addot(OT_WIZARDSTAFF2, "enchanter staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL);
addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL);
addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL); addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL);
@ -5511,7 +5581,7 @@ void initobjects(void) {
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch");
addot(OT_WIZARDSTAFF4, "spellbinder staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addot(OT_WIZARDSTAFF4, "spellbinder staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL);
addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL);
addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL); addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL);
@ -5522,7 +5592,7 @@ void initobjects(void) {
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch"); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "twisted branch");
addot(OT_WIZARDSTAFF5, "warlock staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN); addot(OT_WIZARDSTAFF5, "warlock staff", "A twisted branch of wood.", MT_DRAGONWOOD, 4, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_RARE, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_VERYRARE, NULL);
addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL); addflag(lastot->flags, F_DAM, DT_BASH, 4, NA, NULL);
addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL); addflag(lastot->flags, F_OBATTACKDELAY, 100, NA, NA, NULL);
addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL); addflag(lastot->flags, F_ACCURACY, 80, NA, NA, NULL);
@ -7714,7 +7784,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
addflag(lastrace->flags, F_VEGETARIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_VEGETARIAN, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, B_COVETS, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL);
addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL);
addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d4;"); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d4;");
@ -7741,7 +7811,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL); addflag(lastrace->flags, F_WANTSOBFLAG, F_EDIBLE, NA, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL);
addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL);
addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d6;"); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:2d6;");
@ -7768,7 +7838,7 @@ void initrace(void) {
addflag(lastrace->flags, F_MAXATTACKS, 2, 2, NA, NULL); addflag(lastrace->flags, F_MAXATTACKS, 2, 2, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_STR, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL);
addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CRITKNOCKDOWN, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, "");
@ -7846,7 +7916,7 @@ void initrace(void) {
addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_POISONGAS, NA, NA, NULL);
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^scuttling"); addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^scuttling");
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_ENHANCESMELL, 4, NA, NA, NULL); addflag(lastrace->flags, F_ENHANCESMELL, 4, NA, NA, NULL);
addflag(lastrace->flags, F_MORALE, 14, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 14, NA, NA, NULL);
addrace(R_CHICKEN, "chicken", 0.5, 'c', C_BROWN, MT_FLESH, RC_ANIMAL, "A common farm-yard chicken."); addrace(R_CHICKEN, "chicken", 0.5, 'c', C_BROWN, MT_FLESH, RC_ANIMAL, "A common farm-yard chicken.");
@ -8537,7 +8607,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL);
@ -8578,7 +8648,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance
addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_SS_AIR, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_SS_AIR, PR_ADEPT, NA, NULL);
@ -8619,7 +8689,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance addflag(lastrace->flags, F_ATTACKRANGE, 2, 5, NA, NULL); // maintain distance
addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_ELECTRIC, NA, NA, NULL);
@ -8666,7 +8736,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL);
@ -8707,7 +8777,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_SS_FIRE, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_SS_FIRE, PR_ADEPT, NA, NULL);
@ -8744,7 +8814,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_FIRE, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_COLD, NA, NA, NULL);
@ -8789,7 +8859,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "roars^a roar");
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL);
@ -8829,7 +8899,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_AVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL);
addflag(lastrace->flags, F_STARTSKILL, SK_SS_COLD, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_SS_COLD, PR_ADEPT, NA, NULL);
@ -8864,7 +8934,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CON, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_WIS, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_CHA, AT_GTAVERAGE, NA, NULL);
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roars"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 5, NA, "roars^a roar");
addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL); addflag(lastrace->flags, F_FLEEONHPPCT, 15, NA, NA, NULL);
addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL);
@ -9483,13 +9553,14 @@ void initskills(void) {
addskilldesc(SK_CLIMBING, PR_EXPERT, "-10% accuracy penalty while climbing.", B_FALSE); addskilldesc(SK_CLIMBING, PR_EXPERT, "-10% accuracy penalty while climbing.", B_FALSE);
addskilldesc(SK_CLIMBING, PR_MASTER, "No accuracy penalty or stamina cost to remain climbing.", B_FALSE); addskilldesc(SK_CLIMBING, PR_MASTER, "No accuracy penalty or stamina cost to remain climbing.", B_FALSE);
addskill(SK_COOKING, "Cooking", "Your ability to combine foods into nutritious meals.", 50); addskill(SK_COOKING, "Cooking", "Your ability to combine foods into nutritious meals.", 50);
addskilldesc(SK_COOKING, PR_INEPT, " - Note: when cooking, all ingredients must already be recognised.", B_TRUE); addskilldesc(SK_COOKING, PR_INEPT, " - Note: when cooking, all ingredients must already be recognised.", B_FALSE);
addskilldesc(SK_COOKING, PR_NOVICE, "^gYou now recognise water and rotting food.^n", B_TRUE); addskilldesc(SK_COOKING, PR_NOVICE, "^gYou can now prepare corpses for consumption.", B_FALSE);
addskilldesc(SK_COOKING, PR_BEGINNER, "^gYou can cook recipes using up to 2 ingredients.", B_TRUE); addskilldesc(SK_COOKING, PR_BEGINNER, "^gYou now recognise bad food.^n", B_TRUE);
addskilldesc(SK_COOKING, PR_ADEPT, "^gYou can cook recipes using up to 3 ingredients.", B_TRUE); addskilldesc(SK_COOKING, PR_BEGINNER, "^gYou can now cook recipes using up to 2 ingredients.", B_TRUE);
addskilldesc(SK_COOKING, PR_SKILLED, "^gYou can cook recipes using up to 4 ingredients.", B_TRUE); addskilldesc(SK_COOKING, PR_ADEPT, "^gYou can now cook recipes using up to 3 ingredients.", B_TRUE);
addskilldesc(SK_COOKING, PR_EXPERT, "^gYou can cook recipes using up to 5 ingredients.", B_TRUE); addskilldesc(SK_COOKING, PR_SKILLED, "^gYou can now cook recipes using up to 4 ingredients.", B_TRUE);
addskilldesc(SK_COOKING, PR_MASTER, "^gYou can cook all recipes.", B_TRUE); addskilldesc(SK_COOKING, PR_EXPERT, "^gYou can now cook recipes using up to 5 ingredients.", B_TRUE);
addskilldesc(SK_COOKING, PR_MASTER, "^gYou can now cook all recipes.", B_TRUE);
addskill(SK_EVASION, "Evasion", "Your ability to dodge blows or traps.", 50); addskill(SK_EVASION, "Evasion", "Your ability to dodge blows or traps.", 50);
addskilldesc(SK_EVASION, PR_NOVICE, "^gIncreases your EV by 5%.^n", B_FALSE); addskilldesc(SK_EVASION, PR_NOVICE, "^gIncreases your EV by 5%.^n", B_FALSE);
addskilldesc(SK_EVASION, PR_BEGINNER, "^gIncreases your EV by 10%.^n", B_FALSE); addskilldesc(SK_EVASION, PR_BEGINNER, "^gIncreases your EV by 10%.^n", B_FALSE);

Binary file not shown.

21
defs.h
View File

@ -1033,14 +1033,26 @@ enum OBTYPE {
OT_TRAPTELEPORT, OT_TRAPTELEPORT,
OT_TRAPTRIP, OT_TRAPTRIP,
OT_TRAPWIND, OT_TRAPWIND,
// rocks / plants // rocks
OT_GOLD,
OT_STONE, OT_STONE,
OT_ASH, OT_ASH,
OT_ASHEXPLODE, OT_ASHEXPLODE,
OT_ASHCONCEAL, OT_ASHCONCEAL,
OT_ASHSLEEP, OT_ASHSLEEP,
OT_GEMOFSEEING, OT_GEMOFSEEING,
// gems
OT_AQUAMARINE,
OT_AMETHYST,
OT_DIAMOND,
OT_EMERALD,
OT_OPAL,
OT_PEARL,
OT_RUBY,
OT_SAPPHIRE,
OT_TOPAZ,
// money
OT_GOLD,
// godstones
OT_GODSTONEJ, OT_GODSTONEJ,
// flora // flora
OT_FLOWER, OT_FLOWER,
@ -1365,6 +1377,7 @@ enum OBTYPE {
OT_A_INSPECT, OT_A_INSPECT,
OT_A_HURRICANESTRIKE, OT_A_HURRICANESTRIKE,
OT_A_POLYREVERT, OT_A_POLYREVERT,
OT_A_PREPARECORPSE,
OT_A_QUIVERINGPALM, OT_A_QUIVERINGPALM,
OT_A_STEAL, OT_A_STEAL,
OT_A_THRUST, // attack up to 2 cells away with a piercing weapon. OT_A_THRUST, // attack up to 2 cells away with a piercing weapon.
@ -1955,6 +1968,7 @@ enum FLAG {
F_TECHLEVEL, // v0 is a PR_xxx enum for tech usage skill F_TECHLEVEL, // v0 is a PR_xxx enum for tech usage skill
// what can you do with this object? // what can you do with this object?
F_TAINTED, // will give food poisoning if you eat/drink it F_TAINTED, // will give food poisoning if you eat/drink it
F_PREPARED, // raw meat has been prepared using cooking skill
F_EDIBLE, // you can eat this. val1 = nutrition. 100 = a meal F_EDIBLE, // you can eat this. val1 = nutrition. 100 = a meal
// -1 means "nutrition is weight x abs(val1)" // -1 means "nutrition is weight x abs(val1)"
// v2 = nutrition left when partially eaten // v2 = nutrition left when partially eaten
@ -2645,7 +2659,7 @@ enum FLAG {
F_LEVSPELL, // at level v0, this job gains f_cancast v1. F_LEVSPELL, // at level v0, this job gains f_cancast v1.
F_LEVSPELLSCHOOL, // at level v0, this job gains f_cancast for a spell F_LEVSPELLSCHOOL, // at level v0, this job gains f_cancast for a spell
// of their choice from school v1. if v1 is SS_NONE, they can // of their choice from school v1. if v1 is SS_NONE, they can
// pick form any school they are skilled in. // pick from any school they are skilled in.
// if v0 is >100, this triggers every (v0-100) levels. // if v0 is >100, this triggers every (v0-100) levels.
F_LEVFLAG, // at level v0, this job gains flagid v1, flagval0=v2, F_LEVFLAG, // at level v0, this job gains flagid v1, flagval0=v2,
// flagtext = text // flagtext = text
@ -2996,6 +3010,7 @@ typedef struct map_s {
int id; int id;
region_t *region; region_t *region;
int depth; int depth;
int lit;
struct room_s room[MAXROOMS]; struct room_s room[MAXROOMS];
int nrooms; // how many rooms on this map int nrooms; // how many rooms on this map
char *name; // name of this map char *name; // name of this map

57
flag.c
View File

@ -207,9 +207,10 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
updatefpindex(fp); updatefpindex(fp);
// notify // notify
if ((gamemode == GM_GAMESTARTED)) { if (f->pile->owner) {
if (f->pile->owner) { if ( ((gamemode == GM_CHARGEN) && isplayer(f->pile->owner)) ||
if (announceflaggain(f->pile->owner, f)) { ((gamemode == GM_GAMESTARTED) && announceflaggain(f->pile->owner, f)) ) {
if (gamemode == GM_GAMESTARTED) {
// don't include flags which interrupt will kill! // don't include flags which interrupt will kill!
switch (f->id) { switch (f->id) {
case F_RUNNING: case F_RUNNING:
@ -225,35 +226,37 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
addflag(f->pile, F_INTERRUPTED, B_TRUE, NA, NA, NULL); addflag(f->pile, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
break; break;
} }
}
f->known = B_TRUE; f->known = B_TRUE;
if (f->obfrom) { if (f->obfrom) {
object_t *ob; object_t *ob;
ob = findobbyid(f->pile->owner->pack, f->obfrom); ob = findobbyid(f->pile->owner->pack, f->obfrom);
if (ob) { if (ob) {
flag_t *f2 = NULL; flag_t *f2 = NULL;
switch (f->lifetime) { switch (f->lifetime) {
case FROMOBEQUIP: case FROMOBEQUIP:
f2 = hasflagval(ob->flags, F_EQUIPCONFER, f->id, NA, NA, NULL); f2 = hasflagval(ob->flags, F_EQUIPCONFER, f->id, NA, NA, NULL);
break; break;
case FROMOBHOLD: case FROMOBHOLD:
f2 = hasflagval(ob->flags, F_HOLDCONFER, f->id, NA, NA, NULL); f2 = hasflagval(ob->flags, F_HOLDCONFER, f->id, NA, NA, NULL);
break; break;
case FROMOBACTIVATE: case FROMOBACTIVATE:
f2 = hasflagval(ob->flags, F_ACTIVATECONFER, f->id, NA, NA, NULL); f2 = hasflagval(ob->flags, F_ACTIVATECONFER, f->id, NA, NA, NULL);
break; break;
} }
if (f2) { if (f2) {
f2->known = B_TRUE; f2->known = B_TRUE;
}
} }
} }
} }
// player flags which cause a redraw }
if (flagcausesredraw(f->pile->owner, f->id)) redrawscreenatend = B_TRUE; // player flags which cause a redraw
if (flagcausesstatredraw(f->pile->owner, f->id)) redrawstatatend = B_TRUE; if (flagcausesredraw(f->pile->owner, f->id)) redrawscreenatend = B_TRUE;
} else if (f->pile->ob) { if (flagcausesstatredraw(f->pile->owner, f->id)) redrawstatatend = B_TRUE;
} else if (f->pile->ob) {
if (gamemode == GM_GAMESTARTED) {
if (announceobflaggain(f->pile->ob, f)) { if (announceobflaggain(f->pile->ob, f)) {
f->known = B_TRUE; f->known = B_TRUE;
} }

4
io.c
View File

@ -1096,11 +1096,11 @@ int announceflaggain(lifeform_t *lf, flag_t *f) {
char *buf2; char *buf2;
char *p; char *p;
if (isdead(player)) { if (player && isdead(player)) {
return B_FALSE; return B_FALSE;
} }
if (!lf->born) { if (!lf->born && !isplayer(lf)) {
return B_FALSE; return B_FALSE;
} }

92
lf.c
View File

@ -1720,6 +1720,7 @@ int celltransparentfor(lifeform_t *lf, cell_t *c, int *xray, int *rangemod) {
if (sizediff >= 2) { if (sizediff >= 2) {
if (xray && *xray) { if (xray && *xray) {
(*xray) -= (sizediff-1); (*xray) -= (sizediff-1);
if (*xray < 0) *xray = 0;
} else return B_FALSE; } else return B_FALSE;
} }
} }
@ -2834,6 +2835,7 @@ int eat(lifeform_t *lf, object_t *o) {
flag_t *alreadyeating; flag_t *alreadyeating;
enum HUNGER hlev,posthlev; enum HUNGER hlev,posthlev;
int stopeating = B_FALSE; int stopeating = B_FALSE;
int rawmeat = B_FALSE;
if (hasflag(o->flags, F_DRINKABLE)) { if (hasflag(o->flags, F_DRINKABLE)) {
drinking = B_TRUE; drinking = B_TRUE;
@ -2890,6 +2892,7 @@ int eat(lifeform_t *lf, object_t *o) {
// get total nutrition // get total nutrition
nutrition = getnutrition(o); nutrition = getnutrition(o);
if (nutrition == 0) { if (nutrition == 0) {
// this might happen if you purposely try to eat a potion. // this might happen if you purposely try to eat a potion.
// technically a potion will pass above checks because you can // technically a potion will pass above checks because you can
@ -2912,6 +2915,30 @@ int eat(lifeform_t *lf, object_t *o) {
} }
} }
// after this point, you ARE going to eat it.
if (o->amt > 1) {
o = splitob(o);
}
// uncooked meat?
if (iscorpse(o) && isplayer(lf)) {
if (!hasflag(o->flags, F_PREPARED)) {
if (getskill(lf, SK_COOKING)) {
int ch;
char ques[BUFLEN];
more();
sprintf(ques,"Really eat %s raw?",obname);
ch = askchar(ques,"yn","y", B_TRUE, B_FALSE);
if (ch != 'y') {
return B_TRUE;
}
}
// limit
if (nutrition > (HUNGERCONST/4)) nutrition = (HUNGERCONST/4);
rawmeat = B_TRUE;
}
}
if (touch(lf, o)) { if (touch(lf, o)) {
taketime(lf, getactspeed(lf)); taketime(lf, getactspeed(lf));
return B_TRUE; return B_TRUE;
@ -2954,25 +2981,26 @@ int eat(lifeform_t *lf, object_t *o) {
// announce // announce
if (turnstoeat <= 1) { if (turnstoeat <= 1) {
char taste[BUFLEN]; char taste[BUFLEN];
if (hasflagval(o->flags, F_CORPSEOF, R_CHICKEN, NA, NA, NULL)) { if (rawmeat) {
sprintf(taste, " Tastes like chicken!"); sprintf(taste, "The raw meat tastes disgusting!");
} else if (hasflagval(o->flags, F_CORPSEOF, R_CHICKEN, NA, NA, NULL)) {
sprintf(taste, "Tastes like chicken!");
} else if (f->val[1] >= 20) { } else if (f->val[1] >= 20) {
sprintf(taste, " Yum!"); sprintf(taste, "Yum!");
} else { } else {
strcpy(taste, ""); strcpy(taste, "");
} }
if (alreadyeating) { if (alreadyeating) {
if (isplayer(lf)) { if (isplayer(lf)) {
msg("You finish %s.%s", drinking ? "drinking" : "eating", msg("You finish %s.", drinking ? "drinking" : "eating");
(f->val[1] >= 20) ? " Yum!" : ""); if (strlen(taste)) msg("%s", taste);
} else if (cansee(player, lf)) { } else if (cansee(player, lf)) {
msg("%s finishes %s.", lfname, drinking ? "drinking" : "eating"); msg("%s finishes %s.", lfname, drinking ? "drinking" : "eating");
} }
} else { } else {
if (isplayer(lf)) { if (isplayer(lf)) {
msg("You %s %s.%s", drinking ? "drink" : "eat", obname, msg("You %s %s.", drinking ? "drink" : "eat", obname);
(f->val[1] >= 20) ? " Yum!" : ""); if (strlen(taste)) msg("%s", taste);
} else if (cansee(player, lf)) { } else if (cansee(player, lf)) {
msg("%s %s %s.", lfname, drinking ? "drinks" : "eats", obname); msg("%s %s %s.", lfname, drinking ? "drinks" : "eats", obname);
} }
@ -5173,9 +5201,11 @@ object_t *getbestweapon(lifeform_t *lf) {
object_t *bestwep = NULL; object_t *bestwep = NULL;
//int bestmaxdam = -999; //int bestmaxdam = -999;
object_t *o; object_t *o;
obpile_t *op = NULL;
flag_t *retflag[MAXCANDIDATES]; flag_t *retflag[MAXCANDIDATES];
int nretflags; int nretflags;
obpile_t *op = NULL;
op = addobpile(NULL, NULL, NULL);
bestwep = getweapon(lf); bestwep = getweapon(lf);
if (!bestwep) { if (!bestwep) {
@ -5185,10 +5215,6 @@ object_t *getbestweapon(lifeform_t *lf) {
for (i = 0; i < nretflags; i++) { for (i = 0; i < nretflags; i++) {
objecttype_t *ot; objecttype_t *ot;
if (!op) {
op = addobpile(NULL, NULL, NULL);
}
ot = findot(retflag[i]->val[0]); ot = findot(retflag[i]->val[0]);
if (ot) { if (ot) {
o = addobfast(op, ot->id); o = addobfast(op, ot->id);
@ -5223,10 +5249,7 @@ object_t *getbestweapon(lifeform_t *lf) {
bestwep = NULL; bestwep = NULL;
} }
if (op) { killobpile(op);
killobpile(op);
}
return bestwep; return bestwep;
} }
@ -6248,7 +6271,7 @@ float getmaxstamina(lifeform_t *lf) {
int slev; int slev;
slev = getskill(lf, SK_ATHLETICS); slev = getskill(lf, SK_ATHLETICS);
limit(&slev, 1, NA); limit(&slev, 1, NA);
stam = (getattr(lf, A_CON) / 3) * (slev); stam = (getattr(lf, A_CON) / 3) * (slev+1);
if (lfhasflagval(lf, F_INJURY, IJ_LUNGCOLLAPSED, NA, NA, NULL)) { if (lfhasflagval(lf, F_INJURY, IJ_LUNGCOLLAPSED, NA, NA, NULL)) {
limit(&stam, NA, 2); limit(&stam, NA, 2);
} }
@ -7927,6 +7950,11 @@ flag_t *giveskill(lifeform_t *lf, enum SKILL id) {
if (isplayer(lf)) { if (isplayer(lf)) {
makeknown(OT_POT_WATER); makeknown(OT_POT_WATER);
} }
newf = hasflagval(lf->flags, F_CANWILL, OT_A_PREPARECORPSE, NA, NA, NULL);
if (!newf) {
newf = addflag(lf->flags, F_CANWILL, OT_A_PREPARECORPSE, NA, NA, NULL);
newf->lifetime = FROMSKILL;
}
} else if (id == SK_LORE_ARCANA) { } else if (id == SK_LORE_ARCANA) {
newf = hasflagval(lf->flags, F_CANWILL, OT_A_INSPECT, NA, NA, NULL); newf = hasflagval(lf->flags, F_CANWILL, OT_A_INSPECT, NA, NA, NULL);
if (!newf) { if (!newf) {
@ -8412,6 +8440,18 @@ int hasfreeaction(lifeform_t *lf) {
return B_TRUE; return B_TRUE;
} }
int hashealableinjuries(lifeform_t *lf) {
flag_t *retflag[MAXCANDIDATES];
int nretflags,i;
int injurycount = 0;
// has injuries which can heal?
getflags(lf->flags, retflag, &nretflags, F_INJURY, F_NONE);
for (i = 0; i < nretflags; i++) {
if (retflag[i]->lifetime > 0) injurycount++;
}
return injurycount;
}
job_t *hasjob(lifeform_t *lf, enum JOB job) { job_t *hasjob(lifeform_t *lf, enum JOB job) {
job_t *j = NULL; job_t *j = NULL;
if (lfhasflagval(lf, F_JOB, job, NA, NA, NULL)) { if (lfhasflagval(lf, F_JOB, job, NA, NA, NULL)) {
@ -11061,7 +11101,7 @@ int losehp_real(lifeform_t *lf, int amt, enum DAMTYPE damtype, lifeform_t *froml
// "while xxx" // "while xxx"
strcpy(buf2, ""); strcpy(buf2, "");
if ((countcellexits(lf->cell) == 1) && fromlf && (getcelldist(fromlf->cell, lf->cell) == 1)) { if ((countcellexits(lf->cell, DT_COMPASS) == 1) && fromlf && (getcelldist(fromlf->cell, lf->cell) == 1)) {
strcat(buf2, "^while cornered"); strcat(buf2, "^while cornered");
} }
if (!hasfreeaction(lf)) { if (!hasfreeaction(lf)) {
@ -12754,7 +12794,9 @@ int sayphrase(lifeform_t *lf, enum SAYPHRASE what, int volume, int val0, char *t
if (cansee(player, lf)) { if (cansee(player, lf)) {
switch (rnd(1,3)) { switch (rnd(1,3)) {
case 1: snprintf(buf, BUFLEN, "I'm attacking %s!", text); break; case 1: snprintf(buf, BUFLEN, "I'm attacking %s!", text); break;
case 2: snprintf(buf, BUFLEN, "%s is mine!", text); break; case 2: snprintf(buf, BUFLEN, "%s is mine!", text);
buf[0] = toupper(buf[0]);
break;
case 3: snprintf(buf, BUFLEN, "I'll take care of %s!", text); break; case 3: snprintf(buf, BUFLEN, "I'll take care of %s!", text); break;
} }
} else { } else {
@ -12781,7 +12823,9 @@ int sayphrase(lifeform_t *lf, enum SAYPHRASE what, int volume, int val0, char *t
case SP_ALLY_TARGETKILL: case SP_ALLY_TARGETKILL:
switch (rnd(1,4)) { switch (rnd(1,4)) {
case 1: snprintf(buf, BUFLEN, "Got it!"); break; case 1: snprintf(buf, BUFLEN, "Got it!"); break;
case 2: snprintf(buf, BUFLEN, "%s one, %s zero!", lf->race->name, noprefix(text)); break; case 2: snprintf(buf, BUFLEN, "%s one, %s zero!", lf->race->name, noprefix(text));
buf[0] = toupper(buf[0]);
break;
case 3: snprintf(buf, BUFLEN, "Pow!"); break; case 3: snprintf(buf, BUFLEN, "Pow!"); break;
case 4: snprintf(buf, BUFLEN, "Take that!"); break; case 4: snprintf(buf, BUFLEN, "Take that!"); break;
} }
@ -16174,8 +16218,10 @@ int rest(lifeform_t *lf, int onpurpose) {
} }
// allies should wake up once healed // allies should wake up once healed
if (areallies(player, lf) && !isplayer(lf)) { if (areallies(player, lf) && !isplayer(lf)) {
if ((lf->hp >= lf->maxhp) && (lf->mp >= getmaxmp(lf))) { if ((lf->hp >= lf->maxhp) && (lf->mp >= getmaxmp(lf)) && (getstamina(lf) >= getmaxstamina(lf))) {
killflagsofid(lf->flags, F_ASLEEP); if (!hashealableinjuries(lf)) {
killflagsofid(lf->flags, F_ASLEEP);
}
} }
} }
} // end if !poisoned } // end if !poisoned

1
lf.h
View File

@ -242,6 +242,7 @@ map_t *gotolev(lifeform_t *lf, int depth, object_t *fromstairs);
int gotosleep(lifeform_t *lf, int onpurpose); int gotosleep(lifeform_t *lf, int onpurpose);
flag_t *hasbleedinginjury(lifeform_t *lf, enum BODYPART bp); flag_t *hasbleedinginjury(lifeform_t *lf, enum BODYPART bp);
int hasfreeaction(lifeform_t *lf); int hasfreeaction(lifeform_t *lf);
int hashealableinjuries(lifeform_t *lf);
job_t *hasjob(lifeform_t *lf, enum JOB job); job_t *hasjob(lifeform_t *lf, enum JOB job);
void inc_quad_range(enum QUADRANT *start, enum QUADRANT *end, int howmuch); void inc_quad_range(enum QUADRANT *start, enum QUADRANT *end, int howmuch);
int injure(lifeform_t *lf, enum BODYPART where, enum DAMTYPE damtype); int injure(lifeform_t *lf, enum BODYPART where, enum DAMTYPE damtype);

62
map.c
View File

@ -168,6 +168,7 @@ map_t *addmap(void) {
} }
a->flags = addflagpile(NULL, NULL); a->flags = addflagpile(NULL, NULL);
a->beingcreated = B_TRUE; a->beingcreated = B_TRUE;
a->lit = B_TRUE;
a->habitat = findhabitat(H_DUNGEON); // default!!! a->habitat = findhabitat(H_DUNGEON); // default!!!
a->lastplayervisit = -1; a->lastplayervisit = -1;
a->nfixedrooms = 0; a->nfixedrooms = 0;
@ -296,9 +297,11 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
} }
} }
} }
// monsters who on dark levels can always see in the dark // nonhuman monsters who on dark levels can always see in the dark
if (!islit(lf->cell) && !lfhasflag(lf, F_SEEINDARK)) { if (!lf->cell->map->lit && !lfhasflag(lf, F_SEEINDARK)) {
addflag(lf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL); if (getraceclass(lf) != RC_HUMANOID) {
addflag(lf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL);
}
} }
} }
@ -337,8 +340,10 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
if (lfhasflag(lf, F_ASLEEP)) { if (lfhasflag(lf, F_ASLEEP)) {
addflag(newlf->flags, F_ASLEEP, NA, ST_ASLEEP, NA, NULL); addflag(newlf->flags, F_ASLEEP, NA, ST_ASLEEP, NA, NULL);
} }
if (!islit(newlf->cell) && !lfhasflag(newlf, F_SEEINDARK)) { if (!newlf->cell->map->lit && !lfhasflag(newlf, F_SEEINDARK)) {
addflag(newlf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL); if (getraceclass(newlf) != RC_HUMANOID) {
addflag(newlf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL);
}
} }
// minions never have certain flags. // minions never have certain flags.
@ -380,8 +385,10 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int
newlf->born = B_FALSE; newlf->born = B_FALSE;
if (lfhasflag(lf, F_ASLEEP)) addflag(newlf->flags, F_ASLEEP, NA, ST_ASLEEP, NA, NULL); if (lfhasflag(lf, F_ASLEEP)) addflag(newlf->flags, F_ASLEEP, NA, ST_ASLEEP, NA, NULL);
if (!islit(newlf->cell) && !lfhasflag(newlf, F_SEEINDARK)) { if (!newlf->cell->map->lit && !lfhasflag(newlf, F_SEEINDARK)) {
addflag(newlf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL); if (getraceclass(newlf) != RC_HUMANOID) {
addflag(newlf->flags, F_SEEINDARK, rnd(3,5), NA, NA, NULL);
}
} }
newlf->born = B_TRUE; newlf->born = B_TRUE;
} }
@ -821,7 +828,7 @@ int autodoors(map_t *map, int roomid, int minx, int miny, int maxx, int maxy, in
// if there is only one way out of the adjacent empty cell, and // if there is only one way out of the adjacent empty cell, and
// walls to either side of the potential door location, then // walls to either side of the potential door location, then
// always add a door // always add a door
if ((countcellexits(newcell) == 1) && wallstoleftright(newcell, d)) { if ((countcellexits(newcell, DT_ORTH) == 1) && wallstoleftright(newcell, d)) {
if (rnd(1,100) <= doorpct) { if (rnd(1,100) <= doorpct) {
makedoor(cell[i], dooropenchance); makedoor(cell[i], dooropenchance);
} else { } else {
@ -1543,7 +1550,8 @@ void calclight(map_t *map) {
makelit(c, L_PERMLIGHT, -1); makelit(c, L_PERMLIGHT, -1);
} }
} else { } else {
if ((map->depth <= 5) && (c->lit != L_PERMDARK)) { //if ((map->depth <= 5) && (c->lit != L_PERMDARK)) {
if (map->lit && (c->lit != L_PERMDARK)) {
makelit(c, L_PERMLIGHT, -1); makelit(c, L_PERMLIGHT, -1);
} }
} }
@ -1640,7 +1648,7 @@ int calcroompos(map_t *map, int w, int h, int xmargin, int ymargin, int *bx, int
// is this cell adjacent to an empty cell and not a // is this cell adjacent to an empty cell and not a
// corner (ie. a valid door location) // corner (ie. a valid door location)
if (countcellexits(cell)) { if (countcellexits(cell, DT_ORTH)) {
score++; score++;
if ( ((ry == y) && (rx == x)) || if ( ((ry == y) && (rx == x)) ||
((ry == y) && (rx == (x+w-1))) || ((ry == y) && (rx == (x+w-1))) ||
@ -1655,7 +1663,7 @@ int calcroompos(map_t *map, int w, int h, int xmargin, int ymargin, int *bx, int
// is this cell empty itself? // is this cell empty itself?
if (!cell->type->solid) score += 3; if (!cell->type->solid) score += 3;
// avoid being adjacent to other room walls // avoid being adjacent to other room walls
if (countcellexits(cell)) score++; if (countcellexits(cell, DT_ORTH)) score++;
score += (countadjrooms(cell)*3); score += (countadjrooms(cell)*3);
@ -1772,12 +1780,21 @@ int countadjwalls(cell_t *cell) {
return walls; return walls;
} }
int countcellexits(cell_t *cell) { int countcellexits(cell_t *cell, int dirtype) {
int d; int d;
int exits = 0; int exits = 0;
int start,end;
cell_t *newcell; cell_t *newcell;
assert(cell); assert(cell);
for (d = D_N; d < MAXDIR_ORTH; d++) { if (dirtype == DT_ORTH) {
start = D_N;
end = D_W;
} else { // ie. dt_compass
start = DC_N;
end = DC_NW;
}
for (d = start; d <= end; d++) {
newcell = getcellindir(cell, d); newcell = getcellindir(cell, d);
if (newcell && !newcell->type->solid) { if (newcell && !newcell->type->solid) {
exits++; exits++;
@ -1855,6 +1872,19 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_
} }
// is the map lit?
if (depth <= 5) {
map->lit = B_TRUE;
} else {
int chance;
chance = (depth - 5) * 10;
if (pctchance(chance)) {
map->lit = B_FALSE;
} else {
map->lit = B_TRUE;
}
}
// what kind of cells will 'empty' ones be? // what kind of cells will 'empty' ones be?
emptycell = map->habitat->emptycelltype; emptycell = map->habitat->emptycelltype;
solidcell = map->habitat->solidcelltype; solidcell = map->habitat->solidcelltype;
@ -1953,7 +1983,7 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_
for (y = 0; y < map->h; y++) { for (y = 0; y < map->h; y++) {
for (x = 0; x < map->w; x++) { for (x = 0; x < map->w; x++) {
cell = getcellat(map, x, y); cell = getcellat(map, x, y);
if (!cell->type->solid && countcellexits(cell) == 1) { if (!cell->type->solid && countcellexits(cell, DT_ORTH) == 1) {
// dead end - maybe make loop from here // dead end - maybe make loop from here
if (rnd(1,100) <= looppct) { if (rnd(1,100) <= looppct) {
int connected = B_FALSE; int connected = B_FALSE;
@ -3446,7 +3476,7 @@ int linkexits(map_t *m, int roomid) {
int ncorridors = 0,d; int ncorridors = 0,d;
// if exit is solid and COMPLETELY surrounded by solid, ignore it. // if exit is solid and COMPLETELY surrounded by solid, ignore it.
if (c->type->solid && (countcellexits(c) == 0)){ if (c->type->solid && (countcellexits(c, DT_ORTH) == 0)){
if (db) dblog("cell is solid and surrounded by solids. ignoring."); if (db) dblog("cell is solid and surrounded by solids. ignoring.");
continue; continue;
} }
@ -5430,7 +5460,7 @@ int remove_deadends(map_t *m, int howmuch) {
for (n = 0; n < m->w * m->h; n++) { for (n = 0; n < m->w * m->h; n++) {
cell_t *c; cell_t *c;
c = m->cell[n]; c = m->cell[n];
if (countcellexits(c) == 1) { if (countcellexits(c, DT_ORTH) == 1) {
// erase this cell // erase this cell
clearcell(c); clearcell(c);
setcelltype(c, solidcell); setcelltype(c, solidcell);

2
map.h
View File

@ -43,7 +43,7 @@ int countadjcellsoftype(cell_t *cell, int id);
int countadjrooms(cell_t *cell); int countadjrooms(cell_t *cell);
int countadjcellswithflag(cell_t *cell, enum FLAG fid, int dirtype); int countadjcellswithflag(cell_t *cell, enum FLAG fid, int dirtype);
int countadjwalls(cell_t *cell); int countadjwalls(cell_t *cell);
int countcellexits(cell_t *cell); int countcellexits(cell_t *cell, int dirtype);
int countcellexitsfor(lifeform_t *lf); int countcellexitsfor(lifeform_t *lf);
int countmapobs(map_t *m, enum OBTYPE oid); int countmapobs(map_t *m, enum OBTYPE oid);
void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob); void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_t *entryob);

10
move.c
View File

@ -2080,18 +2080,18 @@ int initiatemove(lifeform_t *lf, cell_t *cell, int *didmsg) {
// too tired? (if we're attacking, leave the 'too tired' message to // too tired? (if we're attacking, leave the 'too tired' message to
// the attack code) // the attack code)
// note: this only impacts the plaeyr // note: this only impacts the plaeyr
/*
if (!attacking && !getstamina(lf) && isplayer(lf)) { if (!attacking && !getstamina(lf) && isplayer(lf)) {
msg("You are too tired to move!"); msg("You are too tired to move!");
/* //} else {
} else {
// this doesn't count as an action for the player, but it // this doesn't count as an action for the player, but it
// does for monsters // does for monsters
taketime(lf, getmovespeed(lf)); // taketime(lf, getmovespeed(lf));
} //}
*/
reason = E_OK; reason = E_OK;
return B_TRUE; return B_TRUE;
} }
*/
// checks which only happen if we're MOVING (ie not attacking) // checks which only happen if we're MOVING (ie not attacking)
// demon in pentagram // demon in pentagram

14
nexus.c
View File

@ -284,7 +284,19 @@ int main(int argc, char **argv) {
} }
givejob(player, j->id); givejob(player, j->id);
// extra choices for some jobs // extra choices for some jobs
if (j->id == J_WIZARD) { if (j->id == J_DRUID) {
enum OBTYPE spell;
int i;
for (i = 0;i < 3; i++) {
// pick a spell which you don't already have...
spell = getrandomspellfromschool(SS_NATURE, 1);
while (cancast(player, spell, NULL)) {
spell = getrandomspellfromschool(SS_NATURE, 1);
}
// you can now cast it.
addflag(player->flags, F_CANCAST, spell, NA, NA, NULL);
}
} else if (j->id == J_WIZARD) {
skill_t *sk; skill_t *sk;
object_t *sb1,*sb2; object_t *sb1,*sb2;
initprompt(&prompt, "Select your primary spell specialty:"); initprompt(&prompt, "Select your primary spell specialty:");

View File

@ -2905,6 +2905,7 @@ objecttype_t *findotn(char *name) {
modname = strrep(modname, "puddles ", "puddle ", NULL); modname = strrep(modname, "puddles ", "puddle ", NULL);
modname = strrep(modname, "puffs ", "puff ", NULL); modname = strrep(modname, "puffs ", "puff ", NULL);
modname = strrep(modname, "rings ", "ring ", NULL); modname = strrep(modname, "rings ", "ring ", NULL);
modname = strrep(modname, "rubies", "ruby", NULL);
modname = strrep(modname, "scrolls ", "scroll ", NULL); modname = strrep(modname, "scrolls ", "scroll ", NULL);
modname = strrep(modname, "sets ", "set ", NULL); modname = strrep(modname, "sets ", "set ", NULL);
modname = strrep(modname, "splashes ", "splash ", NULL); modname = strrep(modname, "splashes ", "splash ", NULL);
@ -4850,13 +4851,17 @@ char *getobconditionname(object_t *o, char *buf) {
} }
if (iscorpse(o)) { if (iscorpse(o)) {
strcpy(buf, "");
if (hasflag(o->flags, F_PREPARED)) {
strcat(buf, "cooked");
}
// you only know it's rotting if you are smart or a cook // you only know it's rotting if you are smart or a cook
if (isrotting(o) && if (isrotting(o) &&
( (iqb >= AT_GTAVERAGE) || getskill(player, SK_COOKING)) ) { ( (iqb >= AT_GTAVERAGE) || getskill(player, SK_COOKING)) ) {
snprintf(buf, BUFLEN, "rotting"); if (strlen(buf)) strcat(buf, " ");
} else { strcat(buf, "rotting");
strcpy(buf, ""); }
}
} else { } else {
if (iqb >= AT_LOW) { if (iqb >= AT_LOW) {
pct = getobhppct(o); pct = getobhppct(o);
@ -11465,6 +11470,7 @@ void timeeffectsob(object_t *o) {
} }
// corpses rot away... // corpses rot away...
/*
if ((f->id == F_EDIBLE) && (o->type->obclass->id == OC_CORPSE)) { if ((f->id == F_EDIBLE) && (o->type->obclass->id == OC_CORPSE)) {
f->val[1] -= 4; f->val[1] -= 4;
if (f->val[1] < 0) { if (f->val[1] < 0) {
@ -11472,6 +11478,7 @@ void timeeffectsob(object_t *o) {
addflag(o->flags, F_TAINTED, B_TRUE, NA, NA, NULL); addflag(o->flags, F_TAINTED, B_TRUE, NA, NA, NULL);
} }
} }
*/
if (f->id == F_RECHARGE) { if (f->id == F_RECHARGE) {
flag_t *f2; flag_t *f2;

2
save.c
View File

@ -316,6 +316,7 @@ map_t *loadmap(char *basefile) {
fscanf(f, "seed:%u\n",&m->seed); // seed fscanf(f, "seed:%u\n",&m->seed); // seed
fscanf(f, "lastplayervisit:%ld\n",&m->lastplayervisit); fscanf(f, "lastplayervisit:%ld\n",&m->lastplayervisit);
fscanf(f, "dims:%d,%d\n",&m->w, &m->h); // map dimensons fscanf(f, "dims:%d,%d\n",&m->w, &m->h); // map dimensons
fscanf(f, "lit:%d\n",&m->lit);
fscanf(f, "nextmaps:\n"); fscanf(f, "nextmaps:\n");
for (i = 0; i < MAXDIR_ORTH; i++) { for (i = 0; i < MAXDIR_ORTH; i++) {
fscanf(f, "%d\n",&m->nextmap[i]); // map dimensons fscanf(f, "%d\n",&m->nextmap[i]); // map dimensons
@ -880,6 +881,7 @@ int savemap(map_t *m) {
fprintf(f, "seed:%u\n",m->seed); // seed fprintf(f, "seed:%u\n",m->seed); // seed
fprintf(f, "lastplayervisit:%ld\n",m->lastplayervisit); fprintf(f, "lastplayervisit:%ld\n",m->lastplayervisit);
fprintf(f, "dims:%d,%d\n",m->w, m->h); // map dimensons fprintf(f, "dims:%d,%d\n",m->w, m->h); // map dimensons
fprintf(f, "lit:%d\n",m->lit); // seed
fprintf(f, "nextmaps:\n"); fprintf(f, "nextmaps:\n");
for (i = 0; i < MAXDIR_ORTH; i++) { for (i = 0; i < MAXDIR_ORTH; i++) {
fprintf(f, "%d\n",m->nextmap[i] ); // map dimensons fprintf(f, "%d\n",m->nextmap[i] ); // map dimensons

88
spell.c
View File

@ -1840,6 +1840,7 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
} }
} else if (abilid == OT_A_THRUST) { } else if (abilid == OT_A_THRUST) {
object_t *wep; object_t *wep;
flag_t *f;
char targetname[BUFLEN]; char targetname[BUFLEN];
int badweapon = B_FALSE; int badweapon = B_FALSE;
flag_t *damflag; flag_t *damflag;
@ -1882,7 +1883,9 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
} }
getlfname(target, targetname); getlfname(target, targetname);
f = addflag(user->flags, F_ACCURACYMOD, -10, NA, NA, NULL);
attacklf(user, target, wep, damflag); attacklf(user, target, wep, damflag);
killflag(f);
taketime(user, getattackspeed(user)); taketime(user, getattackspeed(user));
} else if (abilid == OT_A_TRAIN) { } else if (abilid == OT_A_TRAIN) {
// can we train? // can we train?
@ -2156,6 +2159,63 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
// this call will also remove this ability... // this call will also remove this ability...
setrace(user, f->val[0], B_TRUE); setrace(user, f->val[0], B_TRUE);
} else if (abilid == OT_A_PREPARECORPSE) {
object_t *o,*corpse = NULL;
char obname[BUFLEN];
if (!isplayer(user)) return B_TRUE;
// check ground first...
for (o = user->cell->obpile->first ; o ; o = o->next) {
if (iscorpse(o) && !hasflag(o->flags, F_PREPARED)) {
char yn;
char ques[BUFLEN];
getobname(o, obname, o->amt);
sprintf(ques, "There %s %s here. Prepare it?", (o->amt == 1) ? "is" : "are",obname);
yn = askchar(ques, "yn","n", B_TRUE, B_FALSE);
if (yn == 'y') {
corpse = o;
break;
}
}
}
if (!corpse) {
initprompt(&prompt, "What will you prepare (ESC to cancel)?");
for (o = user->pack->first ; o ; o = o->next) {
if (iscorpse(o) && !hasflag(o->flags, F_PREPARED)) {
getobname(o, obname, o->amt);
addchoice(&prompt, o->letter, obname, NULL, o, NULL);
}
}
addchoice(&prompt, '-', "(cancel)", NULL, NULL, NULL);
getchoice(&prompt);
corpse = (object_t *)prompt.result;
if (!corpse) {
msg("Cancelled.");
return B_TRUE;
}
}
if (!corpse) {
msg("There are no corpses here to prepare.");
return B_TRUE;
}
if (corpse->amt > 1) {
corpse = splitob(corpse);
}
if (corpse->pile->owner == user) {
// add flag before getting the name
addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL);
getobname(corpse, obname, corpse->amt);
msgnocap("%c - %s.", corpse->letter, obname);
} else {
// add flag after getting the name
getobname(corpse, obname, corpse->amt);
msg("You cook %s.", obname);
addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL);
}
} else if (abilid == OT_A_PRAY) { } else if (abilid == OT_A_PRAY) {
lifeform_t *lf; lifeform_t *lf;
if (!isplayer(user)) return B_FALSE; if (!isplayer(user)) return B_FALSE;
@ -4480,6 +4540,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
isdecayed = B_TRUE; isdecayed = B_TRUE;
} else if (o->type->id == OT_POT_POISON) { } else if (o->type->id == OT_POT_POISON) {
ispoisoned = B_TRUE; ispoisoned = B_TRUE;
} else if ((o->type->id == OT_TRAPARROWP) ||
(o->type->id == OT_TRAPNEEDLEP) ||
(o->type->id == OT_TRAPGAS)) {
char obname[BUFLEN];
getobname(o, obname, o->amt);
msg("%s %s revealed!", obname, (o->amt == 1) ? "is" : "are");
npoisoned++;
killflagsofid(o->flags, F_SECRET);
} else { } else {
for (f = o->flags->first ; f ; f = f->next) { for (f = o->flags->first ; f ; f = f->next) {
if (f->id == F_POISONED) { if (f->id == F_POISONED) {
@ -4492,6 +4560,18 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
break; break;
} }
} }
f = hasflag(o->flags, F_TRAPPED);
if (f) {
if ((f->val[0] == OT_TRAPARROWP) ||
(f->val[0] == OT_TRAPNEEDLEP) ||
(f->val[0] == OT_TRAPGAS)) {
char obname[BUFLEN];
getobname(o, obname, o->amt);
msg("A poison trap on %s is revealed!", obname);
npoisoned++;
f->val[2] = B_TRUE;
}
}
} }
@ -7509,9 +7589,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
donesomething = B_TRUE; donesomething = B_TRUE;
} }
f = hasflag(o->flags, F_TAINTED); if (killflagsofid(o->flags, F_TAINTED)) {
if (f) {
killflag(f);
donesomething = B_TRUE; donesomething = B_TRUE;
} }
} }
@ -9825,8 +9903,8 @@ int getspellpower(lifeform_t *lf, enum OBTYPE spellid) {
// this check doesn't apply for monsters. // this check doesn't apply for monsters.
if (isplayer(lf)) { if (isplayer(lf)) {
int maxspelllevel = MAXSPELLLEV; int maxspelllevel = MAXSPELLLEV;
if (hasjob(lf, J_DRUID) && (school == SS_NATURE)) { // if (hasjob(lf, J_DRUID) && (school == SS_NATURE)) {
} else if ((school == SS_ALLOMANCY) || (school == SS_MENTAL)) { if ((school == SS_ALLOMANCY) || (school == SS_MENTAL)) {
} else { } else {
switch (schoolskill) { switch (schoolskill) {
case PR_INEPT: maxspelllevel = 0; break; case PR_INEPT: maxspelllevel = 0; break;

2
text.c
View File

@ -1113,6 +1113,8 @@ char *makeplural(char *text) {
if (rv) return newtext; if (rv) return newtext;
newtext = strrep(newtext, "ring ", "rings ", &rv); newtext = strrep(newtext, "ring ", "rings ", &rv);
if (rv) return newtext; if (rv) return newtext;
newtext = strrep(newtext, "ruby", "rubies", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "scroll ", "scrolls ", &rv); newtext = strrep(newtext, "scroll ", "scrolls ", &rv);
if (rv) return newtext; if (rv) return newtext;
newtext = strrep(newtext, "splash ", "splashes ", &rv); newtext = strrep(newtext, "splash ", "splashes ", &rv);