This commit is contained in:
parent
4ddc70a314
commit
5f393e02e0
2
attack.c
2
attack.c
|
@ -202,8 +202,10 @@ int attacklf(lifeform_t *lf, lifeform_t *victim) {
|
|||
|
||||
if (!willheal) {
|
||||
// modify for strength
|
||||
if (!hasflag(wep->flags, F_NOSTRDAMMOD) && !lfhasflag(lf, F_NOSTRDAMMOD)) {
|
||||
dam[ndam] = (int)((float)dam[ndam] * getstrdammod(lf));
|
||||
}
|
||||
}
|
||||
|
||||
// damtype?
|
||||
damtype[ndam] = getdamtype(wep);
|
||||
|
|
27
defs.h
27
defs.h
|
@ -373,6 +373,7 @@ enum OBCLASS {
|
|||
OC_FOOD,
|
||||
OC_CORPSE,
|
||||
OC_ROCK,
|
||||
OC_TOOLS,
|
||||
OC_TECH,
|
||||
OC_MISC,
|
||||
OC_SPELL,
|
||||
|
@ -738,8 +739,14 @@ enum OBTYPE {
|
|||
OT_WAND_SLOW,
|
||||
OT_WAND_WEAKNESS,
|
||||
OT_WAND_WONDER,
|
||||
// tech/tools
|
||||
// tools
|
||||
OT_BLINDFOLD,
|
||||
OT_BUGLAMP,
|
||||
OT_GUNPOWDER,
|
||||
OT_LANTERNOIL,
|
||||
OT_LOCKPICK,
|
||||
OT_PICKAXE,
|
||||
// tech
|
||||
OT_POCKETWATCH,
|
||||
OT_C4,
|
||||
OT_CREDITCARD,
|
||||
|
@ -749,15 +756,11 @@ enum OBTYPE {
|
|||
OT_INFOVISOR,
|
||||
OT_INSECTICIDE,
|
||||
OT_JETPACK,
|
||||
OT_BUGLAMP,
|
||||
OT_LANTERNLED,
|
||||
OT_LANTERNOIL,
|
||||
OT_LOCKHACKER,
|
||||
OT_LOCKPICK,
|
||||
OT_MOTIONSCANNER,
|
||||
OT_NVGOGGLES,
|
||||
OT_PAPERCLIP,
|
||||
OT_PICKAXE,
|
||||
OT_TELEPAD,
|
||||
OT_XRAYGOGGLES,
|
||||
// misc objects
|
||||
|
@ -1010,7 +1013,9 @@ enum FLAG {
|
|||
// v0 is target requirements (los/lof)
|
||||
// text is prompt
|
||||
F_OPERNEEDDIR, // need to ask a direction when operating this. text is prompt
|
||||
// what can ou do with this object?
|
||||
// technology flags
|
||||
F_TECHLEVEL, // v0 is a PR_xxx enum for tech usage skill
|
||||
// what can you do with this object?
|
||||
F_EDIBLE, // you can eat this. val2 = nutrition. 100 = a meal
|
||||
// -1 means "nutrition is weight x abs(val1)"
|
||||
F_OPERABLE, // can operate?
|
||||
|
@ -1034,7 +1039,7 @@ enum FLAG {
|
|||
F_SHARP, // does damage when you step on it. v0/1 are min/max dam
|
||||
F_SLIPPERY, // you might slip when stepping on it. v0 is amt
|
||||
F_SLIPMOVE, // if someone slips on this, it will move to an adj cell
|
||||
F_FLAMMABLE, // object will catch alight if burnt
|
||||
F_FLAMMABLE, // object will catch alight if burnt (ie fire damage)
|
||||
// object mods/effects
|
||||
F_ONFIRE, // burning, also deals extra fire damage
|
||||
F_HEADLESS, // for corpses. can go on LFs too.
|
||||
|
@ -1062,6 +1067,8 @@ enum FLAG {
|
|||
F_DONTSHOWCHARGES, // don't show 'xx charges left' when id'd
|
||||
F_RECHARGEWHENOFF, // get power back when you turn it off
|
||||
F_REFILLWITH, // pour obj id val0 onto this to refill its charges
|
||||
//
|
||||
F_POWDER, // this item is a powder
|
||||
// ob appearance flags
|
||||
F_SHINY,
|
||||
// armour flags
|
||||
|
@ -1093,6 +1100,9 @@ enum FLAG {
|
|||
F_AIBOOSTITEM, // ai will use this item to boost/buff itself
|
||||
F_AIHEALITEM, // ai will use this item when low on hp
|
||||
F_AIFLEEITEM, // ai will use this item when fleeing
|
||||
// object _AND_ lifeform flags
|
||||
F_NOSTRDAMMOD, // this object/lf does not have attacks modified
|
||||
// using their strength
|
||||
// lifeform flags
|
||||
F_DEBUG, // debugging enabled
|
||||
F_ATTRMOD, // modify attribute val0 by val1. ie. 0=A_STR,1=-3
|
||||
|
@ -1367,6 +1377,7 @@ enum ERROR {
|
|||
E_BLIND = 32,
|
||||
E_GRABBEDBY = 33,
|
||||
E_CANTMOVE = 34,
|
||||
E_NOTKNOWN = 35,
|
||||
};
|
||||
|
||||
|
||||
|
@ -1565,8 +1576,10 @@ typedef struct material_s {
|
|||
|
||||
|
||||
enum SKILL {
|
||||
SK_ATHLETICS,
|
||||
SK_LOCKPICKING,
|
||||
SK_RESEARCH,
|
||||
SK_TECHUSAGE,
|
||||
};
|
||||
|
||||
// proficiency levels
|
||||
|
|
|
@ -13,6 +13,9 @@ lf.c:
|
|||
update skillcheck()
|
||||
update gainlevel() question
|
||||
update givejob()
|
||||
update modattr()
|
||||
|
||||
io.c:
|
||||
update announceflaggain() and loss() for this stat
|
||||
|
||||
|
||||
ooooooo replace startxxx with startstat
|
||||
|
|
13
flag.c
13
flag.c
|
@ -29,7 +29,6 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
|
|||
known = B_KNOWN;
|
||||
}
|
||||
|
||||
|
||||
// certain flags stack...
|
||||
if (flagstacks(id)) {
|
||||
f = hasflag(fp, id);
|
||||
|
@ -293,11 +292,19 @@ void killflag(flag_t *f) {
|
|||
|
||||
if (lf && (f->id == F_SPRINTING)) {
|
||||
int howlong;
|
||||
// you get tired when you finish sprinting
|
||||
int slev;
|
||||
|
||||
howlong = 5;
|
||||
// you get tired when you finish sprinting
|
||||
howlong = 15;
|
||||
// adjust for athletics skill. -2 per level.
|
||||
slev = getskill(lf, SK_ATHLETICS);
|
||||
if (slev != PR_INEPT) {
|
||||
howlong -= (2*slev);
|
||||
}
|
||||
// adjust for constitution
|
||||
howlong = howlong - (int) ((float)howlong * (getstatmod(lf, A_CON) / 100) );
|
||||
// enforce minimum
|
||||
if (howlong < 1) howlong = 1;
|
||||
addtempflag(f->pile, F_TIRED, B_TRUE, NA, NA, NULL, howlong);
|
||||
}
|
||||
|
||||
|
|
188
io.c
188
io.c
|
@ -615,6 +615,9 @@ int announceflaggain(lifeform_t *lf, flag_t *f) {
|
|||
case A_DEX:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < 0) ? "less agile" : "more agile");
|
||||
break;
|
||||
case A_CON:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < 0) ? "less healthy" : "healthier");
|
||||
break;
|
||||
}
|
||||
donesomething = B_TRUE;
|
||||
break;
|
||||
|
@ -630,7 +633,10 @@ int announceflaggain(lifeform_t *lf, flag_t *f) {
|
|||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < myatt) ? "foolish" : "smart");
|
||||
break;
|
||||
case A_DEX:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < myatt) ? "non-agile" : "agile");
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < myatt) ? "sluggish" : "agile");
|
||||
break;
|
||||
case A_CON:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] < 0) ? "less healthy" : "healthier");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -913,7 +919,10 @@ int announceflagloss(lifeform_t *lf, flag_t *f) {
|
|||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > 0) ? "less smart" : "smarter");
|
||||
break;
|
||||
case A_DEX:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > 0) ? "less agile" : "more gile");
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > 0) ? "less agile" : "more agile");
|
||||
break;
|
||||
case A_CON:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > 0) ? "less healthy" : "healthier");
|
||||
break;
|
||||
}
|
||||
donesomething = B_TRUE;
|
||||
|
@ -930,7 +939,10 @@ int announceflagloss(lifeform_t *lf, flag_t *f) {
|
|||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > myatt) ? "foolish" : "smart");
|
||||
break;
|
||||
case A_DEX:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > myatt) ? "non-agile" : "agile");
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > myatt) ? "sluggish" : "agile");
|
||||
break;
|
||||
case A_CON:
|
||||
msg("%s %s %s!",lfname, isplayer(lf) ? "feel" : "seems", (f->val[1] > 0) ? "less healthy" : "healthier");
|
||||
break;
|
||||
}
|
||||
donesomething = B_TRUE;
|
||||
|
@ -2542,6 +2554,12 @@ void doeat(obpile_t *op) {
|
|||
char buf[BUFLEN];
|
||||
char obname[BUFLEN];
|
||||
|
||||
// stuffed?
|
||||
if (gethungerlevel(gethungerval(player)) >= H_STUFFED) {
|
||||
msg("You couldn't eat another bite!");
|
||||
return;
|
||||
}
|
||||
|
||||
// edible objects here?
|
||||
for (o = player->cell->obpile->first; o ; o = o->next) {
|
||||
if (isedible(o)) {
|
||||
|
@ -3211,11 +3229,14 @@ void dolockpick(obpile_t *op) {
|
|||
o = askobjectwithflag(op, "Lockpick using what", NULL, AO_NONE, F_PICKLOCKS);
|
||||
if (o) {
|
||||
if (hasflag(o->flags, F_PICKLOCKS)) {
|
||||
lockpick(player, targ, o);
|
||||
} else {
|
||||
msg("That can't be used to pick locks!");
|
||||
}
|
||||
} else {
|
||||
msg("Cancelled.");
|
||||
return;
|
||||
}
|
||||
lockpick(player, targ, o);
|
||||
} else {
|
||||
// fail
|
||||
msg("There is nothing locked there!");
|
||||
|
@ -3485,15 +3506,25 @@ void drawscannedcell(cell_t *cell, int x, int y) {
|
|||
*/
|
||||
|
||||
// returns TRUE if escape pressed
|
||||
int downline(int *y, int h, char *heading, char *subheading) {
|
||||
int downline(int *y, int h, char *heading, char *subheading, char *bottomstring, char *cmdchars, char *retchar) {
|
||||
char headbuf[BUFLEN];
|
||||
int ch;
|
||||
sprintf(headbuf, "%s (continued)", heading);
|
||||
(*y)++;
|
||||
if (*y >= (h-2)) {
|
||||
centre(mainwin, h-1, MORESTRING);
|
||||
if (*y >= (h-3)) {
|
||||
centre(mainwin, h-2, MORESTRING);
|
||||
if (bottomstring) {
|
||||
centre(mainwin, h-1, bottomstring);
|
||||
}
|
||||
ch = getch();
|
||||
if (getch() == 27) { return B_TRUE; }
|
||||
if (cmdchars && strchr(cmdchars, ch)) {
|
||||
if (retchar) *retchar = ch;
|
||||
return B_TRUE;
|
||||
} else if (ch == 27) { // ESC
|
||||
if (retchar) *retchar = ch;
|
||||
return B_TRUE;
|
||||
}
|
||||
|
||||
cls(); *y = 0;
|
||||
centre(mainwin, *y, headbuf);
|
||||
*y += 2;
|
||||
|
@ -4755,9 +4786,32 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
enum BODYPART missingbp[MAXBODYPARTS];
|
||||
int nmissingbp;
|
||||
|
||||
char ch;
|
||||
char mode = '@';
|
||||
char prompt[BUFLEN];
|
||||
char cmdchars[BUFLEN];
|
||||
int done = B_FALSE;
|
||||
|
||||
h = getmaxy(mainwin);
|
||||
|
||||
// override showall sometimes...
|
||||
if (isplayer(lf) || isgenius(player)) {
|
||||
showall = B_TRUE;
|
||||
}
|
||||
|
||||
if (showall) {
|
||||
sprintf(prompt, "[@=stats A=abilities/skills S=spells E=effects %sESC=quit]", isplayer(lf) ? "" : "I=items " );
|
||||
sprintf(cmdchars, "@ase%s",isplayer(lf) ? "" : "i");
|
||||
} else {
|
||||
sprintf(prompt, "%s", "[ESC=quit]");
|
||||
sprintf(cmdchars, "%s", "@");
|
||||
}
|
||||
|
||||
while (!done) {
|
||||
cls();
|
||||
y = 0;
|
||||
ch = '\0';
|
||||
if (mode == '@') {
|
||||
if (isplayer(lf)) {
|
||||
centre(mainwin, 0, "CHARACTER DETAILS");
|
||||
} else{
|
||||
|
@ -4766,11 +4820,6 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
y = 2;
|
||||
y2 = 2;
|
||||
|
||||
// overrise showall sometimes...
|
||||
if (isplayer(lf) || isgenius(player)) {
|
||||
showall = B_TRUE;
|
||||
}
|
||||
|
||||
dammod = getstrdammod(lf);
|
||||
accmod = getstatmod(lf, A_DEX);
|
||||
|
||||
|
@ -5027,8 +5076,11 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
mindam += bonus;
|
||||
maxdam += bonus;
|
||||
|
||||
// apply damage mod for strength
|
||||
if (!hasflag(w->flags, F_NOSTRDAMMOD) && !lfhasflag(lf, F_NOSTRDAMMOD)) {
|
||||
mindam = (int)((float)mindam * dammod);
|
||||
maxdam = (int)((float)maxdam * dammod);
|
||||
}
|
||||
|
||||
if (mindam < 0) mindam = 0;
|
||||
if (maxdam < 0) maxdam = 0;
|
||||
|
@ -5322,25 +5374,13 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
}
|
||||
|
||||
|
||||
// wait for key
|
||||
centre(mainwin, h-1, "[Press any key]");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
|
||||
if (showall) {
|
||||
int anyfound = B_FALSE;
|
||||
char subheading[BUFLEN];
|
||||
int lev;
|
||||
|
||||
sprintf(subheading, " %-4s%-25s%-22s%s","Lv","Spell", "School", "Cost");
|
||||
} else if (mode == 'a') {
|
||||
int exitnow = B_FALSE;
|
||||
|
||||
// now show intrinsics on next page
|
||||
cls();
|
||||
centre(mainwin, 0, "ABILITIES");
|
||||
y = 2;
|
||||
|
||||
// TODO : change this to be like monster - show all CANWILL & CANCAST abilities
|
||||
// show abilities (but not spells - they are displayed using a different
|
||||
// command)
|
||||
for (ot = objecttype ; ot ; ot = ot->next) {
|
||||
if (ot->obclass->id == OC_ABILITY) {
|
||||
f = lfhasknownflagval(lf, F_CANWILL, ot->id, NA, NA, NULL);
|
||||
|
@ -5354,36 +5394,43 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
}
|
||||
sprintf(buf, "%-12s%s%s", ot->name, ot->desc, expirebuf);
|
||||
mvwprintw(mainwin, y, 0, buf);
|
||||
if (downline(&y, h, "ABILITIES", NULL)) {
|
||||
drawscreen(); real_clearmsg(B_TRUE); return;
|
||||
if (downline(&y, h, "ABILITIES", NULL, prompt, cmdchars, &ch)) {
|
||||
exitnow = B_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
y++;
|
||||
|
||||
if (!exitnow) {
|
||||
if (hasflag(lf->flags, F_HASSKILL)) {
|
||||
centre(mainwin, y, "SKILLS"); y += 2;
|
||||
for (f = lf->flags->first ; f ; f = f->next) {
|
||||
if (f->id == F_HASSKILL) {
|
||||
mvwprintw(mainwin, y, 0, "- %s %s",getskilllevelname(f->val[1]), getskillname(f->val[0]));
|
||||
if (downline(&y, h, "SKILLS", NULL)) {
|
||||
drawscreen(); real_clearmsg(B_TRUE); return;
|
||||
if (downline(&y, h, "SKILLS", NULL, prompt, cmdchars, &ch)) {
|
||||
exitnow = B_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (mode == 's') {
|
||||
char subheading[BUFLEN];
|
||||
int lev;
|
||||
int anyfound;
|
||||
int exitnow = B_FALSE;
|
||||
|
||||
sprintf(subheading, " %-4s%-25s%-22s%s","Lv","Spell", "School", "Cost");
|
||||
|
||||
centre(mainwin, h-1, "[Press any key]");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
cls(); y = 0;
|
||||
//wmove(mainwin, y, 0);
|
||||
centre(mainwin, y, "SPELLS"); y += 2;
|
||||
doheading(mainwin, &y, 0, subheading);
|
||||
//if (!isplayer(lf)) {
|
||||
// show spells monster can cast using mp
|
||||
for (lev = 0; lev <= 9; lev++) {
|
||||
for (ot = objecttype ; ot ; ot = ot->next) {
|
||||
for (lev = 0; (lev <= 9) && !exitnow; lev++) {
|
||||
for (ot = objecttype ; ot && !exitnow ; ot = ot->next) {
|
||||
if (ot->obclass->id == OC_SPELL) {
|
||||
int thislev;
|
||||
thislev = getspelllevel(ot->id);
|
||||
|
@ -5404,8 +5451,9 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
sprintf(buf, " %-4d%-25s%-22s%s",thislev, ot->name, getschoolname(getspellschool(ot->id)), mpbuf);
|
||||
mvwprintw(mainwin, y, 0, "%s\n", buf);
|
||||
anyfound = B_TRUE;
|
||||
if (downline(&y, h, "SPELLS", subheading)) {
|
||||
drawscreen(); real_clearmsg(B_TRUE); return;
|
||||
if (downline(&y, h, "SPELLS", subheading, prompt, cmdchars, &ch)) {
|
||||
exitnow = B_TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5415,12 +5463,7 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
if (!anyfound) {
|
||||
mvwprintw(mainwin, y, 0, "You cannot cast any spells.");
|
||||
}
|
||||
//}
|
||||
|
||||
centre(mainwin, h-1, "[Press any key]");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
cls(); y = 0;
|
||||
|
||||
} else if (mode == 'e') {
|
||||
x = 0; // override
|
||||
// down a line.
|
||||
centre(mainwin, y, "EFFECTS");
|
||||
|
@ -5509,7 +5552,7 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
}
|
||||
f = lfhasknownflag(lf, F_HEAVYBLOW);
|
||||
if (f && (f->known)) {
|
||||
sprintf(buf,"%s attacks knock enemies back.", getpossessive(you(lf)));
|
||||
sprintf(buf,"%s attacks knock enemies back.", you(lf), getpossessive(you(lf)));
|
||||
mvwprintw(mainwin, y, 0, buf);
|
||||
y++;
|
||||
}
|
||||
|
@ -5557,12 +5600,6 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
y++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
f = lfhasflag(lf, F_PARALYZED);
|
||||
if (f && (f->known)) {
|
||||
mvwprintw(mainwin, y, 0, "%s %s paralyzed.", you(lf), isplayer(lf) ? "are" : "is");
|
||||
|
@ -5625,13 +5662,7 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
y++;
|
||||
}
|
||||
}
|
||||
|
||||
// wait for key
|
||||
centre(mainwin, h-1, "[Press any key]");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
}
|
||||
|
||||
if (!isplayer(lf) && showall) {
|
||||
} else if (mode == 'i') {
|
||||
object_t *o;
|
||||
cls();
|
||||
centre(mainwin, 0, "INVENTORY");
|
||||
|
@ -5643,20 +5674,37 @@ void showlfstats(lifeform_t *lf, int showall) {
|
|||
getobextrainfo(o, buf2);
|
||||
|
||||
mvwprintw(mainwin, y, 0, "%s%s", buf,buf2);
|
||||
y++;
|
||||
if (y >= (h-3) && (o->next)) {
|
||||
|
||||
if (o->next && downline(&y, h, "INVENTORY", NULL, prompt, cmdchars, &ch)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// wait for key
|
||||
centre(mainwin, h-1, "-- More --");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
cls();
|
||||
centre(mainwin, 0, "INVENTORY");
|
||||
y = 2;
|
||||
centre(mainwin, h-1, prompt);
|
||||
if (ch == '\0') {
|
||||
ch = getch();
|
||||
}
|
||||
switch (ch) {
|
||||
case 27: // ESC
|
||||
done = B_TRUE;
|
||||
break;
|
||||
case '@':
|
||||
mode = ch;
|
||||
break;
|
||||
case 'a':
|
||||
case 's':
|
||||
case 'e':
|
||||
if (showall) mode = ch;
|
||||
break;
|
||||
case 'i':
|
||||
if (showall && !isplayer(lf)) mode = ch;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// wait for key
|
||||
centre(mainwin, h-1, "[Press any key]");
|
||||
if (getch() == 27) { drawscreen(); real_clearmsg(B_TRUE); return; }
|
||||
}
|
||||
} // end while !done
|
||||
|
||||
drawscreen();
|
||||
real_clearmsg(B_TRUE);
|
||||
|
|
2
io.h
2
io.h
|
@ -59,7 +59,7 @@ void dothrow(obpile_t *op);
|
|||
void dovendingmachine(lifeform_t *lf, object_t *vm);
|
||||
int dowear(obpile_t *op);
|
||||
int doweild(obpile_t *op);
|
||||
int downline(int *y, int h, char *heading, char *subheading);
|
||||
int downline(int *y, int h, char *heading, char *subheading, char *bottomstring, char *cmdchars, char *retchar);
|
||||
void drawunviscell(cell_t *cell, int x, int y);
|
||||
void drawcellwithcontents(cell_t *cell, int x, int y);
|
||||
void drawcursor(void);
|
||||
|
|
57
lf.c
57
lf.c
|
@ -776,6 +776,11 @@ int canwear(lifeform_t *lf, object_t *o, enum BODYPART where) {
|
|||
return B_FALSE;
|
||||
}
|
||||
|
||||
if (gettechlevel(o) > getskill(lf, SK_TECHUSAGE)) {
|
||||
reason = E_NOTKNOWN;
|
||||
return B_FALSE;
|
||||
}
|
||||
|
||||
if (where == BP_NONE) {
|
||||
// can we wear it ANYWHERE?
|
||||
enum BODYPART possbp[MAXBODYPARTS];
|
||||
|
@ -3280,7 +3285,7 @@ int giveskill(lifeform_t *lf, enum SKILL id) {
|
|||
}
|
||||
} else {
|
||||
// gaining a new skill
|
||||
addflag(lf->flags, F_HASSKILL, id, PR_NOVICE, NA, NULL);
|
||||
f = addflag(lf->flags, F_HASSKILL, id, PR_NOVICE, NA, NULL);
|
||||
if (isplayer(lf) && gamestarted) {
|
||||
msg("You have learned the %s %s skill!", getskilllevelname(PR_NOVICE), getskillname(sk->id));
|
||||
}
|
||||
|
@ -3288,6 +3293,27 @@ int giveskill(lifeform_t *lf, enum SKILL id) {
|
|||
// special effects...
|
||||
if (id == SK_RESEARCH) {
|
||||
addflag(lf->flags, F_CANWILL, OT_A_INSPECT, NA, NA, NULL);
|
||||
} else if (id == SK_ATHLETICS) {
|
||||
addflag(lf->flags, F_CANWILL, OT_A_SPRINT, NA, NA, NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (id == SK_TECHUSAGE) {
|
||||
objecttype_t *ot;
|
||||
// automatically make known all tech <= our skill level
|
||||
for (ot = objecttype ; ot ; ot = ot->next) {
|
||||
// if objecttype is not known...
|
||||
if (!isknownot(ot)) {
|
||||
flag_t *tf;
|
||||
tf = hasflag(ot->flags, F_TECHLEVEL);
|
||||
// if objecttype has a tech level , and it is
|
||||
// lower (or equal to) our tech knowledge...
|
||||
if (tf && !isknownot(ot) && (tf->val[0] <= f->val[1])) {
|
||||
// then make it known!
|
||||
makeknown(ot->id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return B_FALSE;
|
||||
|
@ -3359,6 +3385,11 @@ void givestartobs(lifeform_t *lf, flagpile_t *fp) {
|
|||
killflagsofid(fp, F_STARTOB);
|
||||
killflagsofid(fp, F_STARTOBDT);
|
||||
killflagsofid(fp, F_STARTOBCLASS);
|
||||
|
||||
// make sure lf doesn't start off burdened!
|
||||
while (isburdened(lf)) {
|
||||
modattr(lf, A_STR, 1); // get stronger
|
||||
}
|
||||
}
|
||||
|
||||
void givestartskills(lifeform_t *lf, flagpile_t *fp) {
|
||||
|
@ -4076,8 +4107,8 @@ void initjobs(void) {
|
|||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 gold coins");
|
||||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "3 potions of healing");
|
||||
addflag(lastjob->flags, F_MPDICE, 1, NA, NA, NULL);
|
||||
addflag(lastjob->flags, F_CANWILL, OT_A_SPRINT, 3, 3, NULL);
|
||||
addflag(lastjob->flags, F_STARTSKILL, SK_LOCKPICKING, PR_NOVICE, NA, NULL);
|
||||
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_NOVICE, NA, NULL);
|
||||
addjob(J_ALLOMANCER, "Allomancer");
|
||||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "1 gold coins");
|
||||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "club");
|
||||
|
@ -4128,6 +4159,7 @@ void initjobs(void) {
|
|||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 bullets");
|
||||
addflag(lastjob->flags, F_STARTATT, A_STR, ST_STRONG, NA, NULL);
|
||||
addflag(lastjob->flags, F_STARTATT, A_IQ, IQ_DOPEY, NA, NULL);
|
||||
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_ADEPT, NA, NULL);
|
||||
// TODO skill: athletics 2
|
||||
addjob(J_WIZARD, "Wizard");
|
||||
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "knife");
|
||||
|
@ -4155,6 +4187,7 @@ void initjobs(void) {
|
|||
addflag(lastjob->flags, F_MPREGEN, 1, NA, NA, NULL);
|
||||
// can detect magic objects
|
||||
addflag(lastjob->flags, F_DETECTMAGIC, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastjob->flags, F_STARTSKILL, SK_RESEARCH, PR_ADEPT, NA, NULL);
|
||||
// TODO skill: magic knowledge
|
||||
// for monster wizards only:
|
||||
addflag(lastjob->flags, F_IFMONSTER, NA, NA, NA, NULL);
|
||||
|
@ -4384,6 +4417,7 @@ void initrace(void) {
|
|||
addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL);
|
||||
addflag(lastrace->flags, F_HEAVYBLOW, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastrace->flags, F_CANWILL, OT_S_BURNINGWAVE, 3, 3, NULL);
|
||||
addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL);
|
||||
|
||||
// TODO: storm giant
|
||||
// TODO: storm titan
|
||||
|
@ -5718,6 +5752,9 @@ int modattr(lifeform_t *lf, enum ATTRIB attr, int amt) {
|
|||
case A_STR:
|
||||
strcpy(adverb, "stronger");
|
||||
break;
|
||||
case A_CON:
|
||||
strcpy(adverb, "healthier");
|
||||
break;
|
||||
case A_DEX:
|
||||
strcpy(adverb, "more agile");
|
||||
break;
|
||||
|
@ -5732,8 +5769,11 @@ int modattr(lifeform_t *lf, enum ATTRIB attr, int amt) {
|
|||
case A_STR:
|
||||
strcpy(adverb, "weaker");
|
||||
break;
|
||||
case A_CON:
|
||||
strcpy(adverb, "less healthy");
|
||||
break;
|
||||
case A_DEX:
|
||||
strcpy(adverb, "less agile");
|
||||
strcpy(adverb, "sluggish");
|
||||
break;
|
||||
case A_IQ:
|
||||
strcpy(adverb, "foolish");
|
||||
|
@ -6553,8 +6593,10 @@ void setlastdam(lifeform_t *lf, char *buf) {
|
|||
}
|
||||
|
||||
void initskills(void) {
|
||||
addskill(SK_ATHLETICS, "Athletics", "Your athletics skill determines how far you can run, and how long it takes for you to recover afterwards.");
|
||||
addskill(SK_LOCKPICKING, "Lockpicking", "Enhances your ability to pick locks.");
|
||||
addskill(SK_RESEARCH, "Research", "Allows you a chance of recognising unknown objects.");
|
||||
addskill(SK_TECHUSAGE, "Tech Usage", "Lets you comprehend the usage of use modern technological items.");
|
||||
}
|
||||
|
||||
void interrupt(lifeform_t *lf) {
|
||||
|
@ -7774,7 +7816,7 @@ int wear(lifeform_t *lf, object_t *o) {
|
|||
if (gamestarted && lf->created) {
|
||||
switch (reason) {
|
||||
case E_ALREADYUSING:
|
||||
if (lf->controller == C_PLAYER) {
|
||||
if (isplayer(lf)) {
|
||||
msg("You're already wearing that!");
|
||||
}
|
||||
break;
|
||||
|
@ -7807,11 +7849,14 @@ int wear(lifeform_t *lf, object_t *o) {
|
|||
}
|
||||
} else {
|
||||
// should never happen
|
||||
msg("You can't wear that!");
|
||||
if (isplayer(lf)) msg("You can't wear that!");
|
||||
}
|
||||
break;
|
||||
case E_NOTKNOWN:
|
||||
if (isplayer(lf)) msg("You can't wear that!");
|
||||
break;
|
||||
default:
|
||||
if (lf->controller == C_PLAYER) {
|
||||
if (isplayer(lf)) {
|
||||
msg("You can't wear that!");
|
||||
}
|
||||
break;
|
||||
|
|
12
nexus.c
12
nexus.c
|
@ -68,6 +68,7 @@ int numdraws = 0;
|
|||
int main(int argc, char **argv) {
|
||||
int newworld = B_FALSE;
|
||||
object_t *o;
|
||||
char welcomemsg[BUFLEN];
|
||||
|
||||
atexit(cleanup);
|
||||
|
||||
|
@ -133,19 +134,15 @@ int main(int argc, char **argv) {
|
|||
// player needs hunger
|
||||
addflag(player->flags, F_HUNGER, 0, NA, NA, NULL);
|
||||
|
||||
drawscreen();
|
||||
getplayernamefull(pname);
|
||||
msg("Greetings %s, welcome to %snexus!", pname, newworld ? "the new " : "");
|
||||
more();
|
||||
sprintf(welcomemsg, "Greetings %s, welcome to %snexus!", pname, newworld ? "the new " : "");
|
||||
// XXX testing
|
||||
//addlf(getcellindir(player->cell, D_N), R_GOBLIN, 1);
|
||||
|
||||
// 00:00 - 23:59
|
||||
curtime = rnd(0,86399);
|
||||
} else {
|
||||
drawscreen();
|
||||
msg("Welcome back!");
|
||||
more();
|
||||
sprintf(welcomemsg, "Welcome back!");
|
||||
}
|
||||
|
||||
// start game - this will cause debug messages to now
|
||||
|
@ -161,6 +158,9 @@ int main(int argc, char **argv) {
|
|||
// show level
|
||||
drawscreen();
|
||||
|
||||
msg("%s",welcomemsg);
|
||||
more();
|
||||
|
||||
// MAIN LOOP
|
||||
|
||||
// basic flow is:
|
||||
|
|
432
objects.c
432
objects.c
|
@ -63,6 +63,7 @@ enum OBCLASS sortorder[] = {
|
|||
OC_CORPSE,
|
||||
OC_RING,
|
||||
OC_TECH,
|
||||
OC_TOOLS,
|
||||
OC_BOOK,
|
||||
OC_ROCK,
|
||||
OC_MISC,
|
||||
|
@ -70,6 +71,27 @@ enum OBCLASS sortorder[] = {
|
|||
OC_NULL
|
||||
};
|
||||
|
||||
|
||||
|
||||
char *techadjective[] = {
|
||||
"crazy",
|
||||
"odd",
|
||||
"strange",
|
||||
"weird",
|
||||
"",
|
||||
};
|
||||
char *technoun[] = {
|
||||
"contraption",
|
||||
"device",
|
||||
"doodad",
|
||||
"doohickey",
|
||||
"gadget",
|
||||
"thing",
|
||||
"object",
|
||||
"",
|
||||
};
|
||||
|
||||
|
||||
long nextoid = 0;
|
||||
|
||||
brand_t *addbrand(enum BRAND id, char *suffix, enum BODYPART bp) {
|
||||
|
@ -1104,6 +1126,7 @@ void adjustdamob(object_t *o, unsigned int *dam, enum DAMTYPE damtype) {
|
|||
*dam = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
// only some objects can be hurt
|
||||
if (!hasflag(o->flags, F_DAMAGABLE)) {
|
||||
if (damtype != DT_DIRECT) {
|
||||
|
@ -1513,16 +1536,16 @@ void explodeob(object_t *o, flag_t *f, int bigness) {
|
|||
// announce
|
||||
if (o->pile->owner) {
|
||||
if (isplayer(o->pile->owner)) {
|
||||
msg("Your %s explodes!", noprefix(obname));
|
||||
msg("Your %s explode%s!", noprefix(obname), (o->amt == 1) ? "s" : "");
|
||||
} else if (haslos(player, o->pile->owner->cell)) {
|
||||
char lfname[BUFLEN];
|
||||
getlfname(o->pile->owner, lfname);
|
||||
msg("%s%s %s explodes!", lfname, getpossessive(lfname), noprefix(obname));
|
||||
msg("%s%s %s explode%s!", lfname, getpossessive(lfname), noprefix(obname), (o->amt == 1) ? "s" : "");
|
||||
}
|
||||
} else if (haslos(player, c)) {
|
||||
msg("%s explodes!", obname);
|
||||
msg("%s explode%s!", obname, (o->amt == 1) ? "s" : "");
|
||||
}
|
||||
explodecells(c, dam, bigness ? B_TRUE : B_FALSE, o, bigness ? 1 : 0, B_FALSE);
|
||||
explodecells(c, dam * o->amt, bigness ? B_TRUE : B_FALSE, o, bigness ? 1 : 0, B_FALSE);
|
||||
|
||||
// hurt everything!
|
||||
/*
|
||||
|
@ -1537,6 +1560,8 @@ void explodeob(object_t *o, flag_t *f, int bigness) {
|
|||
explodecell(c, dam, (bigness) ? B_TRUE : B_FALSE, NULL);
|
||||
}
|
||||
*/
|
||||
// object dies.
|
||||
removeob(o, o->amt);
|
||||
}
|
||||
|
||||
void extinguish(object_t *o) {
|
||||
|
@ -1821,10 +1846,16 @@ void fragments(cell_t *centre, char *what, int speed) {
|
|||
|
||||
void genhiddennames(void) {
|
||||
objecttype_t *ot;
|
||||
flag_t *f;
|
||||
for (ot = objecttype ; ot ; ot = ot->next) {
|
||||
if (hasflag(ot->flags, F_HASHIDDENNAME)) {
|
||||
f = hasflag(ot->flags, F_HASHIDDENNAME);
|
||||
if (f) {
|
||||
char *thisname;
|
||||
if (strlen(f->text)) {
|
||||
thisname = strdup(f->text);
|
||||
} else {
|
||||
thisname = genhiddenname(ot->obclass->id);
|
||||
}
|
||||
addknowledge(ot->id, thisname, B_UNKNOWN);
|
||||
// some descriptions confer other effecst too...
|
||||
if (strstr(thisname, "glowing")) {
|
||||
|
@ -3284,6 +3315,16 @@ int getshatterdam(object_t *o) {
|
|||
return shatterdam;
|
||||
}
|
||||
|
||||
enum SKILLLEVEL gettechlevel(object_t *o) {
|
||||
flag_t *f;
|
||||
enum SKILLLEVEL tlev = PR_INEPT;
|
||||
f = hasflag(o->flags, F_TECHLEVEL);
|
||||
if (f) {
|
||||
tlev = f->val[0];
|
||||
}
|
||||
return tlev;
|
||||
}
|
||||
|
||||
int getthrowdam(object_t *o) {
|
||||
double dam = 0;
|
||||
flag_t *f;
|
||||
|
@ -3436,7 +3477,7 @@ void ignite(object_t *o) {
|
|||
|
||||
void initobjects(void) {
|
||||
//int ch;
|
||||
//int i;
|
||||
int i,n;
|
||||
objecttype_t *ot;
|
||||
|
||||
// generate hidden names
|
||||
|
@ -3540,13 +3581,26 @@ void initobjects(void) {
|
|||
addhiddenname(OC_WAND, "sapphire wand");
|
||||
addhiddenname(OC_WAND, "wooden wand");
|
||||
|
||||
// gems
|
||||
addhiddenname(OC_RING, "ruby ring");
|
||||
addhiddenname(OC_RING, "diamond ring");
|
||||
addhiddenname(OC_RING, "emerald ring");
|
||||
addhiddenname(OC_RING, "silver ring");
|
||||
addhiddenname(OC_RING, "gold ring");
|
||||
|
||||
for (n = 0; strlen(technoun[n]); n++) {
|
||||
// add it without an adjective
|
||||
addhiddenname(OC_TECH, technoun[n]);
|
||||
// add it with all known adjectives
|
||||
for (i = 0; strlen(techadjective[i]) ; i++) {
|
||||
char buf[BUFLEN];
|
||||
sprintf(buf, "%s %s",techadjective[i], technoun[n]);
|
||||
addhiddenname(OC_TECH, buf);
|
||||
}
|
||||
}
|
||||
|
||||
shufflehiddennames();
|
||||
|
||||
|
||||
// object modifiers - flags can be either known or not, depending on if it's obvious
|
||||
addobmod(OM_FLAMING,"flaming");
|
||||
addflag_real(lastobmod->flags, F_ONFIRE, B_TRUE, NA, NA, NULL, PERMENANT, B_KNOWN, -1);
|
||||
|
@ -3683,7 +3737,10 @@ void initobjects(void) {
|
|||
addflag(lastobjectclass->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastobjectclass->flags, F_OBHP, 50, 50, NA, NULL);
|
||||
addflag(lastobjectclass->flags, F_OBHPDRAIN, 1, DT_DECAY, NA, NULL); // ie. corpses last for 50 turns
|
||||
addoc(OC_TECH, "Tools/Technology", "Useful items, from the common to the obscure.", '~');
|
||||
addoc(OC_TECH, "Technology", "A strange piece of futuristic technology.", '~');
|
||||
addflag(lastobjectclass->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastobjectclass->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addoc(OC_TOOLS, "Tools", "Useful items, from the common to the obscure.", '[');
|
||||
addflag(lastobjectclass->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastobjectclass->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addoc(OC_MISC, "Miscellaneous", "This could be anything.", '\\');
|
||||
|
@ -3792,6 +3849,7 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, "");
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_GEMOFSEEING, "gem of seeing", "Magically enhances your eyesight.", MT_STONE, 1, OC_ROCK);
|
||||
addflag(lastot->flags, F_HOLDCONFER, F_XRAYVIS, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_HOLDCONFER, F_DETECTAURAS, B_TRUE, NA, NULL);
|
||||
|
@ -4515,45 +4573,54 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_OPERNEEDTARGET, TT_NONE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_AICASTATVICTIM, NA, NA, NA, NULL);
|
||||
|
||||
// tech/tools
|
||||
addot(OT_POCKETWATCH, "pocket watch", "A portable timekeeping device made to be carried in a pocket.", MT_METAL, 0.1, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_DIGITALWATCH, "digital watch", "An electronic timekeeping device which shows the time as a number.", MT_METAL, 0.1, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 50, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_BLINDFOLD, "blindfold", "Short length of wide cloth, used for blocking eyesight.", MT_CLOTH, 0.01, OC_TECH);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_BLIND, B_TRUE, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL);
|
||||
|
||||
addot(OT_C4, "block of c4", "A highly explosive plastic which explodes a medium time after activation.", MT_PLASTIC, 1, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 25, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERONOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_CHARGES, 5, 5, NA, NULL);
|
||||
addflag(lastot->flags, F_DONTSHOWCHARGES, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RECHARGEWHENOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDEATH, 30, B_BIG, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_GRENADE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_BUGLAMP, "glowing flask", "A glass flask with a glowbug corpse inside.", MT_GLASS, 0.3, OC_TECH);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_PRODUCESLIGHT, 2, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HOLDCONFER, F_PRODUCESLIGHT, 2, IFKNOWN, NULL);
|
||||
|
||||
// tech - l0
|
||||
addot(OT_CREDITCARD, "credit card", "A rectangular plastic card.", MT_PLASTIC, 0.01, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||
addflag(lastot->flags, F_PICKLOCKS, 2, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_PAPERCLIP, "paperclip", "A thin, looped wire for holding paper together.", MT_METAL, 0.01, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||
addflag(lastot->flags, F_PICKLOCKS, 4, B_DIEONFAIL, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
// can use as a (very bad) weapon too...
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_PIERCE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 1, 1, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 50, NA, NA, NULL);
|
||||
|
||||
|
||||
// tech - l1
|
||||
addot(OT_POCKETWATCH, "pocket watch", "A portable timekeeping device made to be carried in a pocket.", MT_METAL, 0.1, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_DIGITALWATCH, "digital watch", "An electronic timekeeping device which shows the time as a number.", MT_METAL, 0.1, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 50, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_INSECTICIDE, "can of insecticide", "A spraycan containing poisonous chemicals.", MT_METAL, 0.5, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERUSECHARGE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, "Where will you spray?");
|
||||
addflag(lastot->flags, F_RNDCHARGES, 5, 10, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_LANTERNLED, "LED lantern", "A low-powered but efficient lantern which will last almost forever.", MT_METAL, 0.5, OC_TECH);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 20, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERONOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_ACTIVATECONFER, F_PRODUCESLIGHT, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
|
||||
// tech - l2
|
||||
addot(OT_FLASHBANG, "flashbang", "A stun grenade which temporarily blinds all within sight.", MT_METAL, 1, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 40, NA, NULL);
|
||||
|
@ -4568,7 +4635,8 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_FLASHONDEATH, 4, NA, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_FLASHONDAM, 4, NA, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_GRENADE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_BEGINNER, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_GRENADE, "grenade", "An explosive weapon which explodes a short time after activation.", MT_METAL, 1, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 30, NA, NULL);
|
||||
|
@ -4580,23 +4648,28 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_RECHARGEWHENOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDEATH, 10, NA, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDEATH, 15, NA, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDAM, 10, NA, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_GRENADE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
|
||||
addot(OT_INFOVISOR, "infovisor", "Sleek looking metal visor which displays info directly into the retina.", MT_METAL, 0.2, OC_TECH);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_EXTRAINFO, B_TRUE, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 30, NA, NULL);
|
||||
|
||||
addot(OT_INSECTICIDE, "can of insecticide", "A spraycan containing poisonous chemicals.", MT_METAL, 0.5, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_BEGINNER, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_C4, "block of c4", "A highly explosive plastic which explodes a medium time after activation.", MT_PLASTIC, 1, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 25, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERUSECHARGE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, "Where will you spray?");
|
||||
addflag(lastot->flags, F_RNDCHARGES, 5, 10, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERONOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_CHARGES, 5, 5, NA, NULL);
|
||||
addflag(lastot->flags, F_DONTSHOWCHARGES, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RECHARGEWHENOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOOBDIETEXT, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDEATH, 30, B_BIG, B_IFACTIVATED, NULL);
|
||||
addflag(lastot->flags, F_GRENADE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_BEGINNER, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
|
||||
// tech - l3
|
||||
addot(OT_JETPACK, "jet pack", "A portable ion-thruster which allows the wearer to fly.", MT_METAL, 10, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 30, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
@ -4605,20 +4678,63 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_REFILLWITH, OT_POT_OIL, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_ACTIVATECONFER, F_FLYING, B_TRUE, NA, NULL);
|
||||
addflag(lastot->flags, F_ACTIVATECONFER, F_PRODUCESLIGHT, 1, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_ADEPT, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
|
||||
// tech - l4
|
||||
addot(OT_INFOVISOR, "infovisor", "Sleek looking metal visor which displays info directly into the retina.", MT_METAL, 0.2, OC_TECH);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_EXTRAINFO, B_TRUE, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 30, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_SKILLED, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_LOCKHACKER, "lock hacker", "A sophisticated machine to manipulate physical locks.", MT_METAL, 3, OC_TECH);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 20, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_SKILLED, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_LANTERNLED, "LED lantern", "A low-powered but efficient lantern which will last almost forever.", MT_METAL, 0.5, OC_TECH);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 20, NA, NULL);
|
||||
// tech - l5
|
||||
addot(OT_TELEPAD, "teleport beacon", "A metal cone which will teleport the user to the nearest similar cone.", MT_METAL, 3, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 40, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERONOFF, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_ACTIVATECONFER, F_PRODUCESLIGHT, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_EXPERT, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_XRAYGOGGLES, "pair of xray goggles", "Bulky looking goggles which allow you to see through walls.", MT_METAL, 0.3, OC_TECH);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_XRAYVIS, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 25, NA, NULL);
|
||||
addflag(lastot->flags, F_TECHLEVEL, PR_EXPERT, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_LANTERNOIL, "oil lantern", "An oil-powered lantern which produces a lot of light.", MT_METAL, 1, OC_TECH);
|
||||
// tech - l6 ???
|
||||
|
||||
// tools
|
||||
addot(OT_BLINDFOLD, "blindfold", "Short length of wide cloth, used for blocking eyesight.", MT_CLOTH, 0.01, OC_TOOLS);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_BLIND, B_TRUE, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 60, NA, NULL);
|
||||
|
||||
addot(OT_BUGLAMP, "glowing flask", "A glass flask with a glowbug corpse inside.", MT_GLASS, 0.3, OC_TOOLS);
|
||||
addflag(lastot->flags, F_GLYPH, NA, NA, NA, "!");
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_PRODUCESLIGHT, 2, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HOLDCONFER, F_PRODUCESLIGHT, 2, IFKNOWN, NULL);
|
||||
|
||||
addot(OT_GUNPOWDER, "pile of gunpowder", "A black metallic powder.", MT_METAL, 0.5, OC_TOOLS);
|
||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of black powder");
|
||||
addflag(lastot->flags, F_GLYPH, NA, NA, NA, ",");
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 65, NA, NULL);
|
||||
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EXPLODEONDAM, 15, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "2d6");
|
||||
addflag(lastot->flags, F_FLAMMABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_POWDER, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_LANTERNOIL, "oil lantern", "An oil-powered lantern which produces a lot of light.", MT_METAL, 1, OC_TOOLS);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 55, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
@ -4628,36 +4744,17 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_RNDCHARGES, 100, 200, NA, NULL);
|
||||
addflag(lastot->flags, F_REFILLWITH, OT_POT_OIL, NA, NA, NULL);
|
||||
|
||||
addot(OT_LOCKPICK, "lockpick", "An angled piece of metal, used to open locks.", MT_METAL, 0.05, OC_TECH);
|
||||
addot(OT_LOCKPICK, "lockpick", "An angled piece of metal, used to open locks.", MT_METAL, 0.05, OC_TOOLS);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 75, NA, NULL);
|
||||
addflag(lastot->flags, F_PICKLOCKS, 10, B_DIEONFAIL, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_PAPERCLIP, "paperclip", "A thin, looped wire for holding paper together.", MT_METAL, 0.01, OC_TECH);
|
||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||
addflag(lastot->flags, F_PICKLOCKS, 4, B_DIEONFAIL, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
// can use as a (very bad) weapon too...
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_PIERCE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 1, 1, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 50, NA, NA, NULL);
|
||||
|
||||
addot(OT_PICKAXE, "pickaxe", "A heavy tool for breaking rock.", MT_METAL, 8, OC_TECH);
|
||||
addot(OT_PICKAXE, "pickaxe", "A heavy tool for breaking rock.", MT_METAL, 8, OC_TOOLS);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 65, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_TELEPAD, "teleport beacon", "A metal cone which will teleport the user to the nearest similar cone.", MT_METAL, 3, OC_TECH);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 40, NA, NULL);
|
||||
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_XRAYGOGGLES, "pair of xray goggles", "Bulky looking goggles which allow you to see through walls.", MT_METAL, 0.3, OC_TECH);
|
||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_EQUIPCONFER, F_XRAYVIS, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 25, NA, NULL);
|
||||
|
||||
// misc
|
||||
|
||||
|
@ -5167,6 +5264,7 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_DAMTYPE, DT_BITE, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 1, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
|
||||
|
||||
addot(OT_CLAWS, "claws", "claws object", MT_BONE, 0, OC_WEAPON);
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_CLAW, NA, NA, NULL);
|
||||
|
@ -5187,22 +5285,26 @@ void initobjects(void) {
|
|||
addflag(lastot->flags, F_DAMTYPE, DT_ELECTRIC, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 1, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
|
||||
|
||||
// monster weapons
|
||||
addot(OT_ACIDATTACK, "acidattack", "acid attack object", MT_WATER, 0, OC_WEAPON);
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_ACID, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 1, 2, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 60, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_TOUCHPARALYZE, "paralyzing touch", "paralyzing touch object", MT_BONE, 0, OC_WEAPON);
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_TOUCH, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 0, 1, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, B_TRUE, NA, "2-4");
|
||||
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
|
||||
addot(OT_TOUCHPARALYZE2, "strong paralyzing touch", "strong paralyzing touch object", MT_BONE, 0, OC_WEAPON);
|
||||
addflag(lastot->flags, F_DAMTYPE, DT_TOUCH, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_DAM, 0, 1, NA, NULL);
|
||||
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
||||
addflag(lastot->flags, F_HITCONFER, F_PARALYZED, B_TRUE, NA, "5-10");
|
||||
addflag(lastot->flags, F_NOSTRDAMMOD, B_TRUE, NA, NA, NULL);
|
||||
|
||||
// missiles
|
||||
addot(OT_DART, "dart", "A small, sharp projectile weapon.", MT_WOOD, 0.5, OC_MISSILE);
|
||||
|
@ -5708,14 +5810,20 @@ int isflammable(object_t *o) {
|
|||
}
|
||||
|
||||
int isknown(object_t *o) {
|
||||
knowledge_t *k;
|
||||
// if id'd, return the full name
|
||||
if (hasflag(o->flags, F_IDENTIFIED)) {
|
||||
return B_TRUE;
|
||||
}
|
||||
|
||||
return isknownot(o->type);
|
||||
}
|
||||
|
||||
int isknownot(objecttype_t *ot) {
|
||||
knowledge_t *k;
|
||||
// if id'd, return the full name
|
||||
|
||||
for (k = knowledge; k ; k = k->next) {
|
||||
if (k->id == o->type->id) {
|
||||
if (k->id == ot->id) {
|
||||
// it DOES have a hidden name.
|
||||
// does the player know about it?
|
||||
if (k->known) {
|
||||
|
@ -5732,6 +5840,7 @@ int isknown(object_t *o) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
// is the object fully identified?
|
||||
// ie. its type is known ("potion of healing" rather than "red potion")
|
||||
// AND
|
||||
|
@ -6367,6 +6476,7 @@ void obdie(object_t *o) {
|
|||
} else {
|
||||
explodeob(o, f, (f->val[1] == B_BIG) ? 1 : 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// flashes?
|
||||
|
@ -6520,8 +6630,15 @@ int operate(lifeform_t *lf, object_t *o, cell_t *where) {
|
|||
|
||||
// if not a wand, must know what a tool is before you can use it
|
||||
if (!isknown(o) && (o->type->obclass->id != OC_WAND)) {
|
||||
if (lf->controller == C_PLAYER) {
|
||||
msg("You don't know how to use that (yet)!");
|
||||
if (isplayer(lf)) {
|
||||
msg("You don't know how to use %s!", obname);
|
||||
}
|
||||
return B_TRUE;
|
||||
}
|
||||
|
||||
if (gettechlevel(o) > getskill(lf, SK_TECHUSAGE)) {
|
||||
if (isplayer(lf)) {
|
||||
msg("This technology is beyond your understanding.");
|
||||
}
|
||||
return B_TRUE;
|
||||
}
|
||||
|
@ -7933,6 +8050,55 @@ void setinscription(object_t *o, char *text) {
|
|||
o->inscription = strdup(text);
|
||||
}
|
||||
|
||||
// randomizes hidden names
|
||||
void shufflehiddennames(void) {
|
||||
int i,n;
|
||||
int total;
|
||||
hiddenname_t *a, *temp;
|
||||
int shuffleamt = 20;
|
||||
|
||||
|
||||
total = 0;
|
||||
for (a = firsthiddenname ; a ; a = a->next) {
|
||||
total++;
|
||||
}
|
||||
|
||||
if (total <= 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < shuffleamt; i++) {
|
||||
int which;
|
||||
|
||||
// select random element (but never the first)
|
||||
which = (rand() % (total-1))+1;
|
||||
|
||||
// go there
|
||||
a = firsthiddenname;
|
||||
for (n = 0; n < which; n++) {
|
||||
if (a->next != NULL) a = a->next;
|
||||
}
|
||||
temp = a;
|
||||
|
||||
// remove from list
|
||||
temp->prev->next = temp->next;
|
||||
|
||||
|
||||
if (temp->next) {
|
||||
temp->next->prev = temp->prev;
|
||||
} else {
|
||||
lasthiddenname = temp->prev;
|
||||
}
|
||||
|
||||
// re-add this element to the start
|
||||
temp->next = firsthiddenname;
|
||||
temp->prev = NULL;
|
||||
|
||||
firsthiddenname->prev = temp;
|
||||
firsthiddenname = temp;
|
||||
}
|
||||
}
|
||||
|
||||
object_t *splitob(object_t *o) {
|
||||
object_t *newob;
|
||||
// decrease count on original stack temporarily, in case we
|
||||
|
@ -7992,6 +8158,51 @@ int takedamage(object_t *o, unsigned int howmuch, int damtype) {
|
|||
}
|
||||
|
||||
adjustdamob(o, &howmuch, damtype);
|
||||
|
||||
// effects which have to happen before damage is applied...
|
||||
// explodes?
|
||||
f = hasflag(o->flags, F_EXPLODEONDAM);
|
||||
if (f) {
|
||||
if (f->val[2] == B_IFACTIVATED) {
|
||||
if (hasflag(o->flags, F_ACTIVATED)) {
|
||||
if (hasflag(o->flags, F_EXPLODEONDEATH)) {
|
||||
// object dies!
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
} else {
|
||||
// explode
|
||||
explodeob(o, f, (f->val[1] == B_BIG) ? 1 : 0);
|
||||
return howmuch;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (hasflag(o->flags, F_EXPLODEONDEATH)) {
|
||||
// object dies!
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
} else {
|
||||
// explode
|
||||
explodeob(o, f, (f->val[1] == B_BIG) ? 1 : 0);
|
||||
return howmuch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// flashes?
|
||||
f = hasflag(o->flags, F_FLASHONDAM);
|
||||
if (f) {
|
||||
if (f->val[2] == B_IFACTIVATED) {
|
||||
if (hasflag(o->flags, F_ACTIVATED)) {
|
||||
// flash, then object dies
|
||||
brightflash(getoblocation(o),f->val[0], NULL);
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
}
|
||||
} else {
|
||||
// flash, then object dies
|
||||
brightflash(getoblocation(o),f->val[0], NULL);
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
}
|
||||
return howmuch;
|
||||
}
|
||||
|
||||
if (howmuch <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -8046,7 +8257,6 @@ int takedamage(object_t *o, unsigned int howmuch, int damtype) {
|
|||
// object dies!
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
} else if (hpflag) {
|
||||
flag_t *f;
|
||||
// object was just damaged
|
||||
getobconditionname(o, postdamname);
|
||||
|
||||
|
@ -8084,46 +8294,6 @@ int takedamage(object_t *o, unsigned int howmuch, int damtype) {
|
|||
|
||||
|
||||
|
||||
// explodes?
|
||||
f = hasflag(o->flags, F_EXPLODEONDAM);
|
||||
if (f) {
|
||||
if (f->val[2] == B_IFACTIVATED) {
|
||||
if (hasflag(o->flags, F_ACTIVATED)) {
|
||||
if (hasflag(o->flags, F_EXPLODEONDEATH)) {
|
||||
// object dies!
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
} else {
|
||||
// explode
|
||||
explodeob(o, f, (f->val[1] == B_BIG) ? 1 : 0);
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
if (hasflag(o->flags, F_EXPLODEONDEATH)) {
|
||||
// object dies!
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
} else {
|
||||
// explode
|
||||
explodeob(o, f, (f->val[1] == B_BIG) ? 1 : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// flashes?
|
||||
f = hasflag(o->flags, F_FLASHONDAM);
|
||||
if (f) {
|
||||
if (f->val[2] == B_IFACTIVATED) {
|
||||
if (hasflag(o->flags, F_ACTIVATED)) {
|
||||
// flash, then object dies
|
||||
brightflash(getoblocation(o),f->val[0], NULL);
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
}
|
||||
} else {
|
||||
// flash, then object dies
|
||||
brightflash(getoblocation(o),f->val[0], NULL);
|
||||
addflag(o->flags, F_DEAD, B_TRUE, NA, NA, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
return damtaken;
|
||||
}
|
||||
|
@ -8292,7 +8462,7 @@ int fireat(lifeform_t *thrower, object_t *o, cell_t *where, int speed, object_t
|
|||
//taketime(thrower, SPEED_THROW);
|
||||
|
||||
// some obejcts will die when thrown.
|
||||
if (o->type->id == OT_ASH) {
|
||||
if (hasflag(o->flags, F_POWDER)) {
|
||||
if (haslos(player, srcloc)) {
|
||||
msg("%s disperses into the air.", obname);
|
||||
}
|
||||
|
@ -9018,6 +9188,7 @@ int validateobs(void) {
|
|||
objecttype_t *ot;
|
||||
int foundspells = B_FALSE;
|
||||
int goterror = B_FALSE;
|
||||
flag_t *f;
|
||||
for (ot = objecttype ; ot ; ot = ot->next) {
|
||||
if ((ot->obclass->id == OC_SPELL) || (ot->obclass->id == OC_ABILITY)) {
|
||||
if (!foundspells) foundspells = B_TRUE;
|
||||
|
@ -9050,6 +9221,13 @@ int validateobs(void) {
|
|||
printf("ERROR in object '%s' - firearms need to have F_RANGE.", ot->name);
|
||||
goterror = B_TRUE;
|
||||
}
|
||||
f = hasflag(ot->flags, F_TECHLEVEL);
|
||||
if (f && (f->val[0] != PR_INEPT)) {
|
||||
if (!hasflag(ot->flags, F_HASHIDDENNAME)) {
|
||||
printf("ERROR in object '%s' - has a techlevel but doesn't have a hidden name.", ot->name);
|
||||
goterror = B_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return goterror;
|
||||
|
|
|
@ -87,6 +87,7 @@ char *getrandomobwithclass(map_t *map, enum OBCLASS cid, char *buf);
|
|||
enum SPELLSCHOOL getschool(enum OBTYPE sid);
|
||||
char *getschoolname(enum SPELLSCHOOL sch);
|
||||
int getshatterdam(object_t *o);
|
||||
enum SKILLLEVEL gettechlevel(object_t *o);
|
||||
int getthrowdam(object_t *o);
|
||||
int hasedibleob(obpile_t *op);
|
||||
object_t *hasknownob(obpile_t *op, enum OBTYPE oid);
|
||||
|
@ -116,6 +117,7 @@ int isequippedon(object_t *o, enum BODYPART bp);
|
|||
int isfirearm(object_t *o);
|
||||
int isflammable(object_t *o);
|
||||
int isknown(object_t *o);
|
||||
int isknownot(objecttype_t *ot);
|
||||
int isidentified(object_t *o);
|
||||
int isimpassableob(object_t *o, lifeform_t *lf);
|
||||
int ismetal(enum MATERIAL mat);
|
||||
|
@ -160,6 +162,7 @@ int removeob(object_t *o, int howmany);
|
|||
object_t *relinkob(object_t *src, obpile_t *dst);
|
||||
void setblessed(object_t *o, enum BLESSTYPE wantbless);
|
||||
void setinscription(object_t *o, char *text);
|
||||
void shufflehiddennames(void);
|
||||
object_t *splitob(object_t *o);
|
||||
int takedamage(object_t *o, unsigned int howmuch, int damtype);
|
||||
int fireat(lifeform_t *thrower, object_t *o, cell_t *where, int speed, object_t *firearm);
|
||||
|
|
10
spell.c
10
spell.c
|
@ -244,6 +244,7 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
|||
}
|
||||
} else if (abilid == OT_A_SPRINT) {
|
||||
int howlong;
|
||||
int slev;
|
||||
if (lfhasflag(user, F_TIRED)) {
|
||||
if (isplayer(user)) {
|
||||
msg("You are too tired to sprint right now.");
|
||||
|
@ -256,6 +257,11 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
|||
return B_TRUE;
|
||||
}
|
||||
howlong = 5;
|
||||
// +2 for each athletics skill level
|
||||
slev = getskill(user, SK_ATHLETICS);
|
||||
if (slev > PR_INEPT) {
|
||||
howlong += (2*slev);
|
||||
}
|
||||
// modify for constitution
|
||||
howlong = modifybystat(howlong, user, A_CON);
|
||||
|
||||
|
@ -416,7 +422,7 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
|||
getobname(o, obname, o->amt);
|
||||
msgnocap("This seems to be %s!", obname);
|
||||
} else {
|
||||
msg("You are not yet sure what this is.");
|
||||
msg("You cannot determine what this is.");
|
||||
addflag(user->flags, F_FAILEDINSPECT, o->type->id, NA, NA, NULL);
|
||||
}
|
||||
taketime(user, getactspeed(user));
|
||||
|
@ -2302,7 +2308,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, lifeform_t *target,
|
|||
if (!validatespellcell(caster, &targcell,TT_OBJECT | TT_MONSTER, B_FALSE, spellid)) return B_TRUE;
|
||||
|
||||
if (haslos(player, targcell)) {
|
||||
msg("A small spark appears.");
|
||||
msg("A small spark of flame appears.");
|
||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue