- [+] weapon/armour shop:

- [+] pay to repair.  3 gold per hp. then modify total by speech.
- [+] "splash of water" shouldn't stop you from running. at the moment
      when your boots are wet you can never run because you keep
      dropping water!
- [+] make delvers vuln to light
- [+] reduce potion of growth rarity
- [+] make resist poison skillcheck difficulty harder.
- [+] make holycircle/pentagram detect cursed/blessed items too
    - [+] "your %s feels warm/cold"
- [+] spear shoudl have f_rodshaped
- [+] light not blinding creatures for long enough
    - [+] The area is lit by a magical light!  The skeleton is blinded!
          The skeleton turns to flee from you!  The skeleton can see
          again.
This commit is contained in:
Rob Pearce 2012-01-20 02:46:34 +00:00
parent 4f8f478139
commit 499ef0c0e1
10 changed files with 107 additions and 15 deletions

View File

@ -2398,7 +2398,7 @@ void wepeffects(flagpile_t *fp, cell_t *where, flag_t *damflag, int dam) {
if (f->val[1] != NA) { if (f->val[1] != NA) {
int scdiff; int scdiff;
if (f->val[2] == NA) { if (f->val[2] == NA) {
scdiff = 20; // default scdiff = 30; // default
} else { } else {
scdiff = f->val[2]; scdiff = f->val[2];
} }

16
data.c
View File

@ -962,7 +962,7 @@ void initobjects(void) {
addobmod(OM_SHODDY,"shoddy"); addobmod(OM_SHODDY,"shoddy");
addflag_real(lastobmod->flags, F_SHODDY, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_SHODDY, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
addobmod(OM_POISONED,"poisoned"); addobmod(OM_POISONED,"poisoned");
addflag_real(lastobmod->flags, F_HITCONFER, F_POISONED, SC_POISON, 25, "15-30", PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_HITCONFER, F_POISONED, SC_POISON, 30, "15-30", PERMENANT, B_KNOWN, -1);
addflag_real(lastobmod->flags, F_HITCONFERVALS, P_VENOM, 1, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_HITCONFERVALS, P_VENOM, 1, NA, NULL, PERMENANT, B_KNOWN, -1);
addobmod(OM_WET1,"damp"); addobmod(OM_WET1,"damp");
addflag_real(lastobmod->flags, F_WET, W_DAMP, NA, NA, NULL, PERMENANT, B_KNOWN, -1); addflag_real(lastobmod->flags, F_WET, W_DAMP, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
@ -1471,8 +1471,9 @@ void initobjects(void) {
addflag(lastot->flags, F_CONTAINER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CONTAINER, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_SHOPMENU, 0, MA_GOTOMENU, SM_PURCHASEITEMS, "a:buy something"); addflag(lastot->flags, F_SHOPMENU, 0, MA_GOTOMENU, SM_PURCHASEITEMS, "a:buy something");
addflag(lastot->flags, F_SHOPMENU, 1, MA_GOTOMENU, SM_DONATE, "d:donate something"); addflag(lastot->flags, F_SHOPMENU, 1, MA_GOTOMENU, SM_DONATE, "d:donate something");
addflag(lastot->flags, F_SHOPMENU, 2, MA_GOTOMENU, SM_RESIZE, "r:resize equipment"); addflag(lastot->flags, F_SHOPMENU, 2, MA_GOTOMENU, SM_REPAIR, "r:repair equipment");
addflag(lastot->flags, F_SHOPMENU, 3, MA_QUIT, NA, "q:leave"); addflag(lastot->flags, F_SHOPMENU, 3, MA_GOTOMENU, SM_RESIZE, "s:resize equipment");
addflag(lastot->flags, F_SHOPMENU, 4, MA_QUIT, NA, "q:leave");
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
addflag(lastot->flags, F_STARTOBCLASS, 100, OC_ARMOUR, RANDOM, NULL); addflag(lastot->flags, F_STARTOBCLASS, 100, OC_ARMOUR, RANDOM, NULL);
} }
@ -1571,7 +1572,7 @@ void initobjects(void) {
addflag(lastot->flags, F_NOPICKUP, 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_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, ".");
addflag(lastot->flags, F_REPELBLESSED, B_CURSED, NA, NA, NULL); addflag(lastot->flags, F_REPELBLESSED, B_CURSED, B_BLESSED, NA, NULL);
addflag(lastot->flags, F_NOFEEL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOFEEL, B_TRUE, NA, NA, NULL);
addot(OT_PENTAGRAM, "pentagram", "A area imbued with evil.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE); addot(OT_PENTAGRAM, "pentagram", "A area imbued with evil.", MT_NOTHING, 0, OC_DFEATURE, SZ_LARGE);
@ -1580,7 +1581,7 @@ void initobjects(void) {
addflag(lastot->flags, F_NOPICKUP, 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_NOBLESS, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, "."); addflag(lastot->flags, F_THEREISHERE, B_TRUE, NA, NA, ".");
addflag(lastot->flags, F_REPELBLESSED, B_BLESSED, NA, NA, NULL); addflag(lastot->flags, F_REPELBLESSED, B_BLESSED, B_CURSED, NA, NULL);
addflag(lastot->flags, F_NOFEEL, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOFEEL, B_TRUE, NA, NA, NULL);
@ -2214,7 +2215,7 @@ void initobjects(void) {
addot(OT_POT_CANINETRACKING, "potion of canine tracking", "Mimics the effects of a 'canine tracking' spell.", MT_GLASS, 1, OC_POTION, SZ_TINY); addot(OT_POT_CANINETRACKING, "potion of canine tracking", "Mimics the effects of a 'canine tracking' spell.", MT_GLASS, 1, OC_POTION, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
addot(OT_POT_GROWTH, "potion of growth", "A magical liquid which causes the imbiber's body to instantly undergo rapid growth.", MT_GLASS, 1, OC_POTION, SZ_TINY); addot(OT_POT_GROWTH, "potion of growth", "A magical liquid which causes the imbiber's body to instantly undergo rapid growth.", MT_GLASS, 1, OC_POTION, SZ_TINY);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_RARE, NULL);
addflag(lastot->flags, F_VALUE, 50, NA, NA, NULL); addflag(lastot->flags, F_VALUE, 50, NA, NA, NULL);
addot(OT_POT_HEALINGMIN, "potion of minor healing", "Restores 1-10 health to whoever drinks it.", MT_GLASS, 1, OC_POTION, SZ_TINY); addot(OT_POT_HEALINGMIN, "potion of minor healing", "Restores 1-10 health to whoever drinks it.", MT_GLASS, 1, OC_POTION, SZ_TINY);
@ -4766,6 +4767,7 @@ void initobjects(void) {
addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "0d1+100"); addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "0d1+100");
addflag(lastot->flags, F_LINKOB, OT_POT_WATER, NA, NA, NULL); addflag(lastot->flags, F_LINKOB, OT_POT_WATER, NA, NA, NULL);
addflag(lastot->flags, F_COSMETIC, B_TRUE, NA, NA, NULL);
addot(OT_MUDPOOL, "pool of mud", "A large puddle of wet mud.", MT_WATER, 60, OC_MISC, SZ_MEDIUM); addot(OT_MUDPOOL, "pool of mud", "A large puddle of wet mud.", MT_WATER, 60, OC_MISC, SZ_MEDIUM);
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
@ -6517,6 +6519,7 @@ void initobjects(void) {
addflag(lastot->flags, F_USESSKILL, SK_POLEARMS, NA, NA, NULL); addflag(lastot->flags, F_USESSKILL, SK_POLEARMS, NA, NA, NULL);
addflag(lastot->flags, F_ATTREQ, A_AGI, 50, 5, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 50, 5, NULL);
addflag(lastot->flags, F_CRITCHANCE, 1, NA, NA, NULL); addflag(lastot->flags, F_CRITCHANCE, 1, NA, NA, NULL);
addflag(lastot->flags, F_RODSHAPED, B_TRUE, NA, NA, NULL);
addot(OT_TRIDENT, "trident", "A three-pronged stabbing weapon.", MT_METAL, 5, OC_WEAPON, SZ_HUMAN); addot(OT_TRIDENT, "trident", "A three-pronged stabbing weapon.", MT_METAL, 5, OC_WEAPON, SZ_HUMAN);
addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL);
addflag(lastot->flags, F_RARITY, H_CAVE, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_CAVE, 75, NA, NULL);
@ -7268,6 +7271,7 @@ void initrace(void) {
addflag(lastrace->flags, F_STARTSKILL, SK_METALWORK, PR_NOVICE, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_METALWORK, PR_NOVICE, NA, NULL);
// penalties // penalties
addflag(lastrace->flags, F_MPMOD, -3, NA, NA, NULL); addflag(lastrace->flags, F_MPMOD, -3, NA, NA, NULL);
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, "1d6");
addflag(lastrace->flags, F_TAMABLE, 35, NA, NA, NULL); addflag(lastrace->flags, F_TAMABLE, 35, NA, NA, NULL);

Binary file not shown.

3
defs.h
View File

@ -2033,6 +2033,7 @@ enum FLAG {
F_STARTBLESSED, // v0 = b_blessed or b_cursed F_STARTBLESSED, // v0 = b_blessed or b_cursed
F_REPELBLESSED, // v0 = b_blessed or b_cursed. repels other obejcts F_REPELBLESSED, // v0 = b_blessed or b_cursed. repels other obejcts
// of this blesstype. // of this blesstype.
// if v1 == b_blessed or b_cursed, will ID these blessings/curses
F_TRAIL, // this object denotes the trail left by a lf. F_TRAIL, // this object denotes the trail left by a lf.
// v0 = raceid of lf who left it // v0 = raceid of lf who left it
// v1 = direction the lf moved out of this cell // v1 = direction the lf moved out of this cell
@ -2067,6 +2068,7 @@ enum FLAG {
// v0 is either NA (white) or colourid (C_xxx). // v0 is either NA (white) or colourid (C_xxx).
F_NOGLYPH, // this object doesn't appear normally F_NOGLYPH, // this object doesn't appear normally
F_COSMETIC, // this object is mostly cosmetic, don't say 'you see xx' F_COSMETIC, // this object is mostly cosmetic, don't say 'you see xx'
// also don't stop the player running past it.
F_INVISOB, // this object cannot be seen F_INVISOB, // this object cannot be seen
F_NOPICKUP, // cannot pick this up F_NOPICKUP, // cannot pick this up
F_ATTACKABLE, // can attack this with 'A' F_ATTACKABLE, // can attack this with 'A'
@ -3937,6 +3939,7 @@ enum SHOPMENU {
SM_REST = -7, SM_REST = -7,
// weapon/armour shops // weapon/armour shops
SM_RESIZE = -8, SM_RESIZE = -8,
SM_REPAIR = -9,
}; };
enum SHOPRETURN { enum SHOPRETURN {

2
lf.c
View File

@ -12620,7 +12620,7 @@ int losehp_real(lifeform_t *lf, int amt, enum DAMTYPE damtype, lifeform_t *froml
} }
} else if (damtype == DT_POISONGAS) { } else if (damtype == DT_POISONGAS) {
if (amt > 0) { if (amt > 0) {
if (!skillcheck(lf, SC_POISON, 25, 0)) { if (!skillcheck(lf, SC_POISON, 35, 0)) { // HARD.
poison(lf, rnd(5,10), P_GAS, 2, "poison gas"); poison(lf, rnd(5,10), P_GAS, 2, "poison gas");
} }
} }

6
map.c
View File

@ -6697,8 +6697,10 @@ void makelitradius(cell_t *c, int radius, enum LIGHTLEV how, int howlong) {
if (gamemode == GM_GAMESTARTED) { if (gamemode == GM_GAMESTARTED) {
lifeform_t *lf; lifeform_t *lf;
for (lf = c->map->lf ; lf ; lf = lf->next) { for (lf = c->map->lf ; lf ; lf = lf->next) {
//if (haslos(lf, c) || haslosdark(lf, c)) { //OLD: if (haslos(lf, c) || haslosdark(lf, c)) {
if (distfunc(lf->cell,c) <= (radius + MAXVISRANGE)) { // need to verify lf->cell because it might be NULL if we're
// swapping places with someone else.
if (lf->cell && (distfunc(lf->cell,c) <= (radius + MAXVISRANGE))) {
setlosdirty(lf); setlosdirty(lf);
} }
} }

View File

@ -5061,7 +5061,7 @@ char *real_getobname(object_t *o, char *buf, int count, int wantpremods, int wan
case OT_RING_STR: case OT_RING_STR:
f = hasflag(o->flags, F_EQUIPCONFER); f = hasflag(o->flags, F_EQUIPCONFER);
if (f) { if (f) {
snprintf(buf2, BUFLENSMALL, "%s%d ",(f->val[2] < 0) ? "-" : "+", abs(f->val[2])); snprintf(buf2, BUFLENSMALL, "%s%d ",(f->val[2] < 0) ? "-" : "+", abs(f->val[2])/5);
strcat(localbuf, buf2); strcat(localbuf, buf2);
} }
break; break;
@ -12408,7 +12408,7 @@ void timeeffectsob(object_t *o) {
} }
} }
// sacred ground? // sacred ground object repel
sg = hasobwithflagval(location->obpile, F_REPELBLESSED, o->blessed, NA, NA, NULL); sg = hasobwithflagval(location->obpile, F_REPELBLESSED, o->blessed, NA, NA, NULL);
if (sg) { if (sg) {
char sgname[BUFLEN]; char sgname[BUFLEN];
@ -12454,6 +12454,16 @@ void timeeffectsob(object_t *o) {
return; return;
} }
} }
if (isplayer(o->pile->owner)) {
// sacred ground bless/curse detect
sg = hasobwithflagval(location->obpile, F_REPELBLESSED, NA, o->blessed, NA, NULL);
if (sg && !o->blessknown) {
// announce
msg("Your %s feels very %s!", noprefix(obname), (o->blessed == B_BLESSED) ? "warm" : "cold");
// player now knows that this is blessed/cursed
o->blessknown = B_TRUE;
}
}
if (hasflag(o->flags, F_TANGLEMISSILE)) { if (hasflag(o->flags, F_TANGLEMISSILE)) {
if (!location || !location->lf) { if (!location || !location->lf) {

72
shops.c
View File

@ -22,6 +22,7 @@
#define DEF_BLESSCOST 50 #define DEF_BLESSCOST 50
#define DEF_SURCHARGE 15 #define DEF_SURCHARGE 15
#define DEF_RESIZECOST 80 #define DEF_RESIZECOST 80
#define DEF_REPAIRCOSTPERHP 5
extern enum GAMEMODE gamemode; extern enum GAMEMODE gamemode;
extern prompt_t prompt; extern prompt_t prompt;
@ -162,6 +163,9 @@ void shop(lifeform_t *lf, object_t *vm) {
} else if (curmenu == SM_RESIZE) { } else if (curmenu == SM_RESIZE) {
shopfunc = shopresize; shopfunc = shopresize;
shoparg = &ndonated; shoparg = &ndonated;
} else if (curmenu == SM_REPAIR) {
shopfunc = shoprepair;
shoparg = &ndonated;
} }
if (shopfunc) { if (shopfunc) {
@ -789,6 +793,74 @@ enum SHOPRETURN shoppurchase(lifeform_t *lf, object_t *vm, int starty, char *top
return SR_CONTINUE; return SR_CONTINUE;
} }
enum SHOPRETURN shoprepair(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *ndonated) {
object_t *o;
char ch,buf[BUFLEN];
int y,hpcost;
char obname[BUFLEN];
flag_t *f;
y = starty;
hpcost = DEF_REPAIRCOSTPERHP;
// get list of objects to repair
sprintf(buf, "Repair which object (you have $%d)?", countmoney(lf->pack));
initprompt(&prompt, buf);
for (o = player->pack->first ; o ; o = o->next) {
if (isarmour(o) && isdamaged(o)) {
char desc[BUFLEN];
int thiscost;
// determine cost...
f = hasflag(o->flags, F_OBHP);
thiscost = applyshoppricemod((f->val[1] - f->val[0]) * hpcost, lf);
// add to prompt
getobname(o, obname, o->amt);
sprintf(desc, "%s ($%d)", obname,thiscost);
addchoice(&prompt, o->letter, desc, desc, o, NULL);
}
}
addchoice(&prompt, '-', "(nothing)", NULL, NULL, NULL);
mvwprintw(mainwin, y, 0, "We offer repair services for most kinds armour."); y+=2;
if (prompt.nchoices == 1) {
mvwprintw(mainwin, y, 0, "You have no armour in need of repair."); y += 2;
mvwprintw(mainwin, y, 0, "[Press any key]");
} else {
mvwprintw(mainwin, y, 0, "Pay to repair your armour (you have $%d) [yn]? ", countmoney(lf->pack));
}
ch = getch();
if ((prompt.nchoices == 1) || (ch != 'y')) {
return SR_BACK;
}
// ask which object
ch = getchoice(&prompt);
o = (object_t *)prompt.result;
if (o) {
int thiscost;
// determine cost...
f = hasflag(o->flags, F_OBHP);
thiscost = applyshoppricemod((f->val[1] - f->val[0]) * hpcost, lf);
if (thiscost > countmoney(player->pack)) {
msg("You can't afford to repair that item!"); more();
return SR_CONTINUE;
}
msg("You hand over $%d.", thiscost); more();
givemoney(player, NULL, thiscost);
f->val[0] = f->val[1];
getobname(o, obname, o->amt);
msg("Your %s %s completely repaired.", obname, (o->amt == 1) ? "is" : "are"); more();
}
return SR_CONTINUE;
}
enum SHOPRETURN shopresize(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *ndonated) { enum SHOPRETURN shopresize(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *ndonated) {
object_t *o; object_t *o;
char ch,buf[BUFLEN]; char ch,buf[BUFLEN];

View File

@ -9,6 +9,7 @@ enum SHOPRETURN shopdonate(lifeform_t *lf, object_t *vm, int starty, char *topte
enum SHOPRETURN shopdetectcurse(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased); enum SHOPRETURN shopdetectcurse(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);
enum SHOPRETURN shopmiracle(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased); enum SHOPRETURN shopmiracle(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);
enum SHOPRETURN shoppurchase(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased); enum SHOPRETURN shoppurchase(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);
enum SHOPRETURN shoprepair(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);
enum SHOPRETURN shopresize(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased); enum SHOPRETURN shopresize(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);
enum SHOPRETURN shoprest(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased); enum SHOPRETURN shoprest(lifeform_t *lf, object_t *vm, int starty, char *toptext, int *npurchased);

View File

@ -1905,7 +1905,7 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
// announce // announce
if (cansee(player, target)) { if (cansee(player, target)) {
msg("%s suck%s blood from %s!", username, isplayer(user) ? "" : "s", targetname); msg("^%c%s suck%s blood from %s!", getlfcol(target, CC_BAD), username, isplayer(user) ? "" : "s", targetname);
} }
// fixed damage? // fixed damage?
@ -7710,11 +7710,11 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
// if you don't have eyes, your'e safe! // if you don't have eyes, your'e safe!
if (!lfhasflagval(l, F_NOBODYPART, BP_EYES, NA, NA, NULL)) { if (!lfhasflagval(l, F_NOBODYPART, BP_EYES, NA, NA, NULL)) {
// blind for 1-3 turns // blind for 1-3 turns
addtempflag(l->flags, F_BLIND, B_TRUE, NA, NA, NULL, rnd(1,3)); addtempflag(l->flags, F_BLIND, B_TRUE, NA, NA, NULL, rnd(3,5));
} }
} }
// undead will flee from light // undead will flee from light
if (isundead(l)) { if (isundead(l) && !skillcheck(l, SC_WILL, 20, 0)) {
// runs away from caster // runs away from caster
addtempflag(l->flags, F_FLEEFROM, caster->id, NA, NA, NULL, 20); addtempflag(l->flags, F_FLEEFROM, caster->id, NA, NA, NULL, 20);
} }