- [+] bug in skillpoint % display in @@
- [+] make detect life last longer - [+] stirge should have enhacnesmell - [+] plants should never "turn to face you". - [+] they should be able to see in all dirs. - [+] don't announce "turns to face" if the lf has f_awareness - [+] AGAIN: walk on to a dark place and i can still see my own cell! needed >= instead of > in celllitfor - [+] don't show sacrifice text if you can't see - [+] butterflies shouldn't produce light. - [+] peaceful things shouldn't turn to face you all the time (only low % chance) - [+] CRASHES when killing flags - [+] killflag() was dereferencing f-> after freeing it. - [+] skill which aren't ready not showing up in 'm' list - [+] i think a previous fix for spells broke this... - [+] whatever it was, it shoudl only apply to spells, not abilities. - [+] don't show @G if you're looking at someone else. - [+] sunrise code didn't work - i immediately went to full fov! - [+] was a bug in isnighttime(). - [+] jimbo needs more hp - [+] diningroom should have a fridge, instead of all food being on ground. - [+] bug: "it is pitch black" as soon as you use stairs....... need to recalc light - [+] show temp lit areas as bold - [+] do it. - [+] test....... - [+] notification of being followed to other maps/stairs: - [+] "you walk up the stairs. xxx follows you." - [+] implement. - [+] move sacrifice code to god.c - [+] change twoewapon->master to make your second weapon act like a shield - [+] ie. getshield() returns it. - [+] act like low level shield skill. special case in SC_SHIELDBLOCK - [+] make twoweaponers only be able to use secondary weapons in which they are skilled.
This commit is contained in:
parent
da656dfa52
commit
5bd96d7e5a
4
ai.c
4
ai.c
|
@ -506,6 +506,10 @@ int aimovetolf(lifeform_t *lf, lifeform_t *target, int wantattack) {
|
||||||
|
|
||||||
if (lfhasflag(lf, F_DEBUG)) db = B_TRUE;
|
if (lfhasflag(lf, F_DEBUG)) db = B_TRUE;
|
||||||
|
|
||||||
|
if (db) {
|
||||||
|
dblog(".oO { starting aimovetolf }");
|
||||||
|
}
|
||||||
|
|
||||||
targetflag = lfhasflagval(lf, F_PETOF, target->id, NA, NA, NULL);
|
targetflag = lfhasflagval(lf, F_PETOF, target->id, NA, NA, NULL);
|
||||||
if (targetflag) {
|
if (targetflag) {
|
||||||
ismaster = B_TRUE;
|
ismaster = B_TRUE;
|
||||||
|
|
BIN
data/hiscores.db
BIN
data/hiscores.db
Binary file not shown.
5
defs.h
5
defs.h
|
@ -108,6 +108,7 @@
|
||||||
#define MAXDIR_ORTH 4
|
#define MAXDIR_ORTH 4
|
||||||
#define MAXDIR_COMPASS 8
|
#define MAXDIR_COMPASS 8
|
||||||
#define MAXFLAGS 500
|
#define MAXFLAGS 500
|
||||||
|
#define MAXFOLLOWLFS 15 // max # of lfs who will follow you up/down stairs
|
||||||
#define MAXHISTORY 20 // max lines of history to keep
|
#define MAXHISTORY 20 // max lines of history to keep
|
||||||
#define MAX_MAPW 80
|
#define MAX_MAPW 80
|
||||||
#define MAX_MAPH 20
|
#define MAX_MAPH 20
|
||||||
|
@ -1308,6 +1309,7 @@ enum OBTYPE {
|
||||||
OT_BLINDFOLD,
|
OT_BLINDFOLD,
|
||||||
OT_BUGLAMP,
|
OT_BUGLAMP,
|
||||||
OT_CANDLE,
|
OT_CANDLE,
|
||||||
|
OT_FRIDGE,
|
||||||
OT_GUNPOWDER,
|
OT_GUNPOWDER,
|
||||||
OT_LAMPOIL,
|
OT_LAMPOIL,
|
||||||
OT_LANTERNOIL,
|
OT_LANTERNOIL,
|
||||||
|
@ -1803,7 +1805,8 @@ enum FLAG {
|
||||||
F_OPERONOFF, // operating this will just turn it on/off
|
F_OPERONOFF, // operating this will just turn it on/off
|
||||||
F_OPERUSECHARGE, // operating this will use 1 charge
|
F_OPERUSECHARGE, // operating this will use 1 charge
|
||||||
F_OPERNEEDTARGET, // need to ask for a target of type val0 when opering
|
F_OPERNEEDTARGET, // need to ask for a target of type val0 when opering
|
||||||
// v0 is target requirements (los/lof)
|
// v1 is bitmask of:
|
||||||
|
// TR_NEEDLOS, TR_NEEDLOF, TR_NONE
|
||||||
// text is prompt
|
// text is prompt
|
||||||
F_OPERNEEDDIR, // need to ask a direction when operating this. text is prompt
|
F_OPERNEEDDIR, // need to ask a direction when operating this. text is prompt
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
} = gas
|
} = gas
|
||||||
^ = trap / dangerous thing
|
^ = trap / dangerous thing
|
||||||
) = weapon
|
) = weapon
|
||||||
ooo
|
------------------------------------------------
|
||||||
A = avian / bird
|
A = avian / bird
|
||||||
a = ant
|
a = ant
|
||||||
B = bat
|
B = bat
|
||||||
|
|
20
flag.c
20
flag.c
|
@ -696,6 +696,7 @@ int killflagsofid(flagpile_t *fp, enum FLAG fid) {
|
||||||
|
|
||||||
void killflag(flag_t *f) {
|
void killflag(flag_t *f) {
|
||||||
flag_t *nextone, *lastone;
|
flag_t *nextone, *lastone;
|
||||||
|
flagpile_t *pile;
|
||||||
lifeform_t *lf;
|
lifeform_t *lf;
|
||||||
map_t *redolight = NULL;
|
map_t *redolight = NULL;
|
||||||
cell_t *redolos = NULL;
|
cell_t *redolos = NULL;
|
||||||
|
@ -801,6 +802,10 @@ void killflag(flag_t *f) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// remember the pile so that we can re-index
|
||||||
|
pile = f->pile;
|
||||||
|
|
||||||
// free mem
|
// free mem
|
||||||
if (f->text) free(f->text);
|
if (f->text) free(f->text);
|
||||||
if (f->altval) {
|
if (f->altval) {
|
||||||
|
@ -827,7 +832,14 @@ void killflag(flag_t *f) {
|
||||||
lastone->next = nextone;
|
lastone->next = nextone;
|
||||||
}
|
}
|
||||||
|
|
||||||
updatefpindex(f->pile);
|
//////////////////////////////////////////
|
||||||
|
// "f" is now gone. don't reference it
|
||||||
|
// anymore!
|
||||||
|
//////////////////////////////////////////
|
||||||
|
f = NULL;
|
||||||
|
|
||||||
|
// re-index the pile
|
||||||
|
updatefpindex(pile);
|
||||||
|
|
||||||
if (gamemode == GM_GAMESTARTED) {
|
if (gamemode == GM_GAMESTARTED) {
|
||||||
for (i = 0; i < ngodlfs; i++) {
|
for (i = 0; i < ngodlfs; i++) {
|
||||||
|
@ -839,10 +851,10 @@ void killflag(flag_t *f) {
|
||||||
// - if this was a lf's flag, they recalc their los.
|
// - if this was a lf's flag, they recalc their los.
|
||||||
// - if it was an object flag, then everyone who can see
|
// - if it was an object flag, then everyone who can see
|
||||||
// its cell recalcs their los.
|
// its cell recalcs their los.
|
||||||
if (f->pile->owner) {
|
if (lf) {
|
||||||
setlosdirty(f->pile->owner);
|
setlosdirty(lf);
|
||||||
//precalclos(f->pile->owner);
|
//precalclos(f->pile->owner);
|
||||||
if (isplayer(f->pile->owner)) redoscreen = B_TRUE;
|
if (isplayer(lf)) redoscreen = B_TRUE;
|
||||||
} else {
|
} else {
|
||||||
// everyone who can see this cell recalcs their los
|
// everyone who can see this cell recalcs their los
|
||||||
lifeform_t *l;
|
lifeform_t *l;
|
||||||
|
|
69
god.c
69
god.c
|
@ -251,6 +251,73 @@ void angergodmaybe(enum RACE rid, int amt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dooffer(void) {
|
||||||
|
object_t *o, *nexto;
|
||||||
|
lifeform_t *god;
|
||||||
|
flag_t *retflag[MAXCANDIDATES];
|
||||||
|
int nretflags,pietyplus = 0;
|
||||||
|
// which god?
|
||||||
|
god = askgod("To whom will you sacrifice?");
|
||||||
|
if (!god) {
|
||||||
|
msg("Cancelled.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
getflags(god->flags, retflag, &nretflags, F_SACRIFICEOB, F_SACRIFICEOBCLASS, F_SACRIFICEOBWITHFLAG, F_NONE);
|
||||||
|
if (nretflags == 0) {
|
||||||
|
msg("%s does not accept sacrifices.", god->race->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// anything here to offer?
|
||||||
|
for (o = player->cell->obpile->first ; o ; o = nexto) {
|
||||||
|
nexto = o->next;
|
||||||
|
// does the god want this?
|
||||||
|
getflags(god->flags, retflag, &nretflags, F_SACRIFICEOB, F_SACRIFICEOBCLASS, F_SACRIFICEOBWITHFLAG, F_NONE);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < nretflags; i++) {
|
||||||
|
int ok = B_FALSE;
|
||||||
|
int thispiety = 0;
|
||||||
|
flag_t *f;
|
||||||
|
f = retflag[i];
|
||||||
|
if ((f->id == F_SACRIFICEOB) && (f->val[0] == o->type->id)) {
|
||||||
|
ok = B_TRUE;
|
||||||
|
thispiety = f->val[2];
|
||||||
|
} else if ((f->id == F_SACRIFICEOBCLASS) && (f->val[0] == o->type->obclass->id)) {
|
||||||
|
ok = B_TRUE;
|
||||||
|
thispiety = f->val[2];
|
||||||
|
} else if ((f->id == F_SACRIFICEOBWITHFLAG) && hasflag(o->flags, f->val[0])) {
|
||||||
|
ok = B_TRUE;
|
||||||
|
thispiety = f->val[2];
|
||||||
|
}
|
||||||
|
if (ok) {
|
||||||
|
char *p;
|
||||||
|
char obname[BUFLEN];
|
||||||
|
if (haslos(player, player->cell)) {
|
||||||
|
getobname(o, obname, ALL);
|
||||||
|
p = strdup(f->text);
|
||||||
|
p = strrep(p, "OB", obname, NULL);
|
||||||
|
if (o->amt == 1) {
|
||||||
|
p = strrep(p, "IS", "is", NULL);
|
||||||
|
} else {
|
||||||
|
p = strrep(p, "IS", "are", NULL);
|
||||||
|
}
|
||||||
|
msg("%s", p);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
removeob(o, ALL);
|
||||||
|
pietyplus += thispiety;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pietyplus) {
|
||||||
|
pleasegod(god->race->id, pietyplus);
|
||||||
|
} else {
|
||||||
|
nothinghappens();
|
||||||
|
}
|
||||||
|
taketime(player, getactspeed(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
lifeform_t *findgod(enum RACE rid) {
|
lifeform_t *findgod(enum RACE rid) {
|
||||||
lifeform_t *lf;
|
lifeform_t *lf;
|
||||||
// search heaven first
|
// search heaven first
|
||||||
|
@ -558,7 +625,7 @@ int godgiftmaybe(enum RACE rid) {
|
||||||
//setpiety(rid, 101);
|
//setpiety(rid, 101);
|
||||||
modpiety(rid, -50);
|
modpiety(rid, -50);
|
||||||
} // end if (pctchance enough to get a gift)
|
} // end if (pctchance enough to get a gift)
|
||||||
} // end if (piety > 100)
|
} // end if (piety > 200)
|
||||||
return gotgift;
|
return gotgift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
god.h
1
god.h
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
void angergod(enum RACE rid, int amt);
|
void angergod(enum RACE rid, int amt);
|
||||||
void angergodmaybe(enum RACE rid, int amt);
|
void angergodmaybe(enum RACE rid, int amt);
|
||||||
|
void dooffer(void);
|
||||||
lifeform_t *findgod(enum RACE rid);
|
lifeform_t *findgod(enum RACE rid);
|
||||||
int getpiety(enum RACE rid);
|
int getpiety(enum RACE rid);
|
||||||
enum PIETYLEV getpietylev(enum RACE rid, enum COLOUR *col, char *happiness);
|
enum PIETYLEV getpietylev(enum RACE rid, enum COLOUR *col, char *happiness);
|
||||||
|
|
81
io.c
81
io.c
|
@ -5105,10 +5105,9 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2,
|
||||||
} else {
|
} else {
|
||||||
snprintf(mpdesc[nposs], BUFLEN, "(%d/%d)",f->val[1],f->val[2]);
|
snprintf(mpdesc[nposs], BUFLEN, "(%d/%d)",f->val[1],f->val[2]);
|
||||||
validspell[nposs] = B_FALSE;
|
validspell[nposs] = B_FALSE;
|
||||||
err[nposs] = E_TOOPOWERFUL;
|
err[nposs] = E_NOTREADY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nposs++;
|
nposs++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5217,7 +5216,7 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2,
|
||||||
if (validspell[i]) {
|
if (validspell[i]) {
|
||||||
strcpy(costbuf, "");
|
strcpy(costbuf, "");
|
||||||
} else {
|
} else {
|
||||||
strcpy(costbuf, "(NOT CASTABLE) ");
|
sprintf(costbuf, "(NOT %s) ", (ot->obclass->id == OC_SPELL) ? "CASTABLE" : "USABLE");
|
||||||
}
|
}
|
||||||
|
|
||||||
strcat(costbuf, mpdesc[i]);
|
strcat(costbuf, mpdesc[i]);
|
||||||
|
@ -5229,6 +5228,8 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2,
|
||||||
addit = B_TRUE;
|
addit = B_TRUE;
|
||||||
} else if ((err[i] == E_TOOPOWERFUL) && wanttoohard) {
|
} else if ((err[i] == E_TOOPOWERFUL) && wanttoohard) {
|
||||||
addit = B_TRUE;
|
addit = B_TRUE;
|
||||||
|
} else if (err[i] == E_NOTREADY) {
|
||||||
|
addit = B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addit) {
|
if (addit) {
|
||||||
|
@ -5352,70 +5353,6 @@ void domsghist(void) {
|
||||||
restoregamewindows();
|
restoregamewindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dooffer(void) {
|
|
||||||
object_t *o, *nexto;
|
|
||||||
lifeform_t *god;
|
|
||||||
flag_t *retflag[MAXCANDIDATES];
|
|
||||||
int nretflags,pietyplus = 0;
|
|
||||||
// which god?
|
|
||||||
god = askgod("To whom will you sacrifice?");
|
|
||||||
if (!god) {
|
|
||||||
msg("Cancelled.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
getflags(god->flags, retflag, &nretflags, F_SACRIFICEOB, F_SACRIFICEOBCLASS, F_SACRIFICEOBWITHFLAG, F_NONE);
|
|
||||||
if (nretflags == 0) {
|
|
||||||
msg("%s does not accept sacrifices.", god->race->name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// anything here to offer?
|
|
||||||
for (o = player->cell->obpile->first ; o ; o = nexto) {
|
|
||||||
nexto = o->next;
|
|
||||||
// does the god want this?
|
|
||||||
getflags(god->flags, retflag, &nretflags, F_SACRIFICEOB, F_SACRIFICEOBCLASS, F_SACRIFICEOBWITHFLAG, F_NONE);
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < nretflags; i++) {
|
|
||||||
int ok = B_FALSE;
|
|
||||||
int thispiety = 0;
|
|
||||||
flag_t *f;
|
|
||||||
f = retflag[i];
|
|
||||||
if ((f->id == F_SACRIFICEOB) && (f->val[0] == o->type->id)) {
|
|
||||||
ok = B_TRUE;
|
|
||||||
thispiety = f->val[2];
|
|
||||||
} else if ((f->id == F_SACRIFICEOBCLASS) && (f->val[0] == o->type->obclass->id)) {
|
|
||||||
ok = B_TRUE;
|
|
||||||
thispiety = f->val[2];
|
|
||||||
} else if ((f->id == F_SACRIFICEOBWITHFLAG) && hasflag(o->flags, f->val[0])) {
|
|
||||||
ok = B_TRUE;
|
|
||||||
thispiety = f->val[2];
|
|
||||||
}
|
|
||||||
if (ok) {
|
|
||||||
char *p;
|
|
||||||
char obname[BUFLEN];
|
|
||||||
getobname(o, obname, ALL);
|
|
||||||
p = strdup(f->text);
|
|
||||||
p = strrep(p, "OB", obname, NULL);
|
|
||||||
if (o->amt == 1) {
|
|
||||||
p = strrep(p, "IS", "is", NULL);
|
|
||||||
} else {
|
|
||||||
p = strrep(p, "IS", "are", NULL);
|
|
||||||
}
|
|
||||||
msg("%s", p);
|
|
||||||
free(p);
|
|
||||||
removeob(o, ALL);
|
|
||||||
pietyplus += thispiety;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pietyplus) {
|
|
||||||
pleasegod(god->race->id, pietyplus);
|
|
||||||
} else {
|
|
||||||
nothinghappens();
|
|
||||||
}
|
|
||||||
taketime(player, getactspeed(player));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void dooperate(obpile_t *op) {
|
void dooperate(obpile_t *op) {
|
||||||
object_t *o;
|
object_t *o;
|
||||||
|
@ -8177,9 +8114,10 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showall) {
|
if (showall) {
|
||||||
snprintf(promptstr, BUFLEN, "^h[^W@^n=stats ^WS^nkills ^WA^nbils ^WM^nagic ^WE^nffects ^WG^nods %s^W?^n=help ^WESC^n=quit^h]",
|
snprintf(promptstr, BUFLEN, "^h[^W@^n=stats ^WS^nkills ^WA^nbils ^WM^nagic ^WE^nffects %s%s^W?^n=help ^WESC^n=quit^h]",
|
||||||
|
isplayer(lf) ? "^WG^nods " : "",
|
||||||
isplayer(lf) ? "" : "^WI^ntems " );
|
isplayer(lf) ? "" : "^WI^ntems " );
|
||||||
snprintf(cmdchars, BUFLEN, "@asmeg%s",isplayer(lf) ? "" : "i");
|
snprintf(cmdchars, BUFLEN, "@asme%s%s",isplayer(lf) ? "g" : "", isplayer(lf) ? "" : "i");
|
||||||
} else {
|
} else {
|
||||||
snprintf(promptstr, BUFLEN, "^h[^W@^n=stats %s ESC=quit]", isplayer(lf) ? "" : "^WI^ntems ");
|
snprintf(promptstr, BUFLEN, "^h[^W@^n=stats %s ESC=quit]", isplayer(lf) ? "" : "^WI^ntems ");
|
||||||
snprintf(cmdchars, BUFLEN, "@i");
|
snprintf(cmdchars, BUFLEN, "@i");
|
||||||
|
@ -8294,9 +8232,12 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
int attpoints;
|
int attpoints;
|
||||||
int pct;
|
int pct;
|
||||||
|
long amtneeded;
|
||||||
|
|
||||||
attpoints = getattpoints(lf);
|
attpoints = getattpoints(lf);
|
||||||
|
amtneeded = getspforpoint(lf);
|
||||||
doheadingsmall(mainwin, y, 0, ftext, "Skill Pts");
|
doheadingsmall(mainwin, y, 0, ftext, "Skill Pts");
|
||||||
pct = ((float)lf->skillxp / (float)SKILLXPPERPOINT) * 100.0;
|
pct = ((float)lf->skillxp / (float)amtneeded) * 100.0;
|
||||||
limit(&pct, 0, 100);
|
limit(&pct, 0, 100);
|
||||||
if (lf->skillpoints || attpoints ) {
|
if (lf->skillpoints || attpoints ) {
|
||||||
/*
|
/*
|
||||||
|
|
119
lf.c
119
lf.c
|
@ -1440,7 +1440,7 @@ int celllitfor(lifeform_t *lf, cell_t *c, int maxvisrange, int nightvisrange) {
|
||||||
|
|
||||||
// outside the range of our light, and not lit
|
// outside the range of our light, and not lit
|
||||||
if ((nightvisrange != UNLIMITED) && !islit(c)) {
|
if ((nightvisrange != UNLIMITED) && !islit(c)) {
|
||||||
if (dist > nightvisrange) {
|
if (dist >= nightvisrange) {
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
} else {
|
} else {
|
||||||
// inside our nightvis range and magically dark
|
// inside our nightvis range and magically dark
|
||||||
|
@ -3933,10 +3933,8 @@ void gainxp(lifeform_t *lf, long amt) {
|
||||||
// skill xp
|
// skill xp
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
int amtneeded;
|
int amtneeded;
|
||||||
int mod;
|
|
||||||
|
|
||||||
mod = getstatmod(lf, A_IQ);
|
amtneeded = getspforpoint(lf);
|
||||||
amtneeded = pctof(100 + mod, SKILLXPPERPOINT);
|
|
||||||
|
|
||||||
lf->skillxp += amt;
|
lf->skillxp += amt;
|
||||||
assert(lf->skillxp >= 0);
|
assert(lf->skillxp >= 0);
|
||||||
|
@ -4239,7 +4237,7 @@ int getadjenemies(lifeform_t *who, lifeform_t **adjlf, int *nadjlfs) {
|
||||||
// include allies or enemies which will follow you up/down stairs etc
|
// include allies or enemies which will follow you up/down stairs etc
|
||||||
// ie. allies within LOS
|
// ie. allies within LOS
|
||||||
// ie. adjacent enemies
|
// ie. adjacent enemies
|
||||||
void getwhowillfollow(lifeform_t *lf, object_t *stairob, lifeform_t **adjally, int *nadjallies) {
|
void getwhowillfollow(lifeform_t *lf, object_t *stairob, lifeform_t **adjally, int *seen, int *nadjallies) {
|
||||||
int x,y;
|
int x,y;
|
||||||
for (y = 0; y < lf->cell->map->h; y++) {
|
for (y = 0; y < lf->cell->map->h; y++) {
|
||||||
for (x = 0; x < lf->cell->map->w; x++) {
|
for (x = 0; x < lf->cell->map->w; x++) {
|
||||||
|
@ -4266,7 +4264,9 @@ void getwhowillfollow(lifeform_t *lf, object_t *stairob, lifeform_t **adjally, i
|
||||||
|
|
||||||
if (ok) { // still ok?
|
if (ok) { // still ok?
|
||||||
adjally[*nadjallies] = c->lf;
|
adjally[*nadjallies] = c->lf;
|
||||||
|
if (seen) seen[*nadjallies] = cansee(lf, c->lf);
|
||||||
(*nadjallies)++;
|
(*nadjallies)++;
|
||||||
|
if (*nadjallies >= MAXFOLLOWLFS) return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6081,8 +6081,12 @@ object_t *getsecmeleeweapon(lifeform_t *lf) {
|
||||||
object_t *getshield(lifeform_t *lf) {
|
object_t *getshield(lifeform_t *lf) {
|
||||||
object_t *o;
|
object_t *o;
|
||||||
o = getequippedob(lf->pack, BP_SECWEAPON);
|
o = getequippedob(lf->pack, BP_SECWEAPON);
|
||||||
if (o && isshield(o)) {
|
if (o) {
|
||||||
return o;
|
if (isshield(o)) return o;
|
||||||
|
// master two-weaponers can use their second weapon as a shield.
|
||||||
|
if ((getskill(lf, SK_TWOWEAPON) >= PR_MASTER) && isweapon(o) && getweaponskill(lf, o)) {
|
||||||
|
return o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -6584,6 +6588,14 @@ char *getspeednameshort(int speed, char *buf) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long getspforpoint(lifeform_t *lf) {
|
||||||
|
float mod;
|
||||||
|
long amtneeded;
|
||||||
|
mod = getstatmod(lf, A_IQ);
|
||||||
|
amtneeded = pctof(100 - mod, SKILLXPPERPOINT);
|
||||||
|
return amtneeded;
|
||||||
|
}
|
||||||
|
|
||||||
// returns a pct addition for things like:
|
// returns a pct addition for things like:
|
||||||
// accuracy, evasion, lockpicking
|
// accuracy, evasion, lockpicking
|
||||||
// result will be between -50 and 50
|
// result will be between -50 and 50
|
||||||
|
@ -6907,6 +6919,17 @@ object_t *getweapon(lifeform_t *lf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum SKILLLEVEL getweaponskill(lifeform_t *lf, object_t *o) {
|
||||||
|
skill_t *sk;
|
||||||
|
sk = getobskill(o);
|
||||||
|
if (sk) {
|
||||||
|
enum SKILLLEVEL weplev;
|
||||||
|
weplev = getskill(lf, sk->id);
|
||||||
|
return weplev;
|
||||||
|
}
|
||||||
|
return PR_INEPT;
|
||||||
|
}
|
||||||
|
|
||||||
long getxpforlev(int level) {
|
long getxpforlev(int level) {
|
||||||
long needxp = 0;
|
long needxp = 0;
|
||||||
// 2.8
|
// 2.8
|
||||||
|
@ -9079,7 +9102,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_UNIQUE, NA, NA, NA, NULL);
|
addflag(lastrace->flags, F_UNIQUE, NA, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOSTILE, NA, NA, NA, NULL);
|
addflag(lastrace->flags, F_HOSTILE, NA, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL);
|
addflag(lastrace->flags, F_SIZE, SZ_HUMAN, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "5d4+2");
|
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "2d4+20");
|
||||||
//addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL);
|
//addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL);
|
||||||
//addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, NULL);
|
//addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d4");
|
addflag(lastrace->flags, F_HASATTACK, OT_FISTS, NA, NA, "1d4");
|
||||||
|
@ -11499,7 +11522,6 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_NOPACK, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_NOPACK, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_PRODUCESLIGHT, 2, NA, NA, NULL);
|
|
||||||
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);
|
||||||
addrace(R_GIANTFLY, "giant fly", 1, 'i', C_GREY, MT_FLESH, RC_INSECT);
|
addrace(R_GIANTFLY, "giant fly", 1, 'i', C_GREY, MT_FLESH, RC_INSECT);
|
||||||
|
@ -11559,6 +11581,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 80, NA, "");
|
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 80, NA, "");
|
||||||
addflag(lastrace->flags, F_RARITY, H_FOREST, 80, NA, "");
|
addflag(lastrace->flags, F_RARITY, H_FOREST, 80, NA, "");
|
||||||
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4+1");
|
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4+1");
|
||||||
|
addflag(lastrace->flags, F_ENHANCESMELL, 2, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d3");
|
addflag(lastrace->flags, F_HASATTACK, OT_TEETH, NA, NA, "1d3");
|
||||||
addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL);
|
addflag(lastrace->flags, F_NOBODYPART, BP_WEAPON, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL);
|
addflag(lastrace->flags, F_NOBODYPART, BP_SECWEAPON, NA, NA, NULL);
|
||||||
|
@ -14424,11 +14447,14 @@ int noise(cell_t *c, lifeform_t *noisemaker, enum NOISECLASS nt, int volume, cha
|
||||||
|
|
||||||
if (willrespond) {
|
if (willrespond) {
|
||||||
// turn to face the sound
|
// turn to face the sound
|
||||||
turntoface(l, c);
|
if (isplayer(noisemaker) && cansee(player, l) && cansee(l, player) && !lfhasflag(l, F_AWARENESS)) {
|
||||||
if (isplayer(noisemaker) && cansee(player, l)) {
|
// peaceful things only turn sometimes
|
||||||
char lfname[BUFLEN];
|
if (!ispeaceful(l) || onein(6)) {
|
||||||
getlfname(l, lfname);
|
char lfname[BUFLEN];
|
||||||
msg("%s turns to face you.", lfname);
|
turntoface(l, c);
|
||||||
|
getlfname(l, lfname);
|
||||||
|
msg("%s turns to face you.", lfname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15896,7 +15922,7 @@ void initskills(void) {
|
||||||
addskilldesc(SK_TRAPS, PR_NOVICE, "^gYou gain the 'disarm traps' ability.", B_FALSE);
|
addskilldesc(SK_TRAPS, PR_NOVICE, "^gYou gain the 'disarm traps' ability.", B_FALSE);
|
||||||
addskill(SK_TWOWEAPON, "Dual Weilding", "Allows you to weild two melee weapons at once.", 50);
|
addskill(SK_TWOWEAPON, "Dual Weilding", "Allows you to weild two melee weapons at once.", 50);
|
||||||
addskilldesc(SK_TWOWEAPON, PR_NOVICE, "^gYou can now weild two weapons at once.", B_TRUE);
|
addskilldesc(SK_TWOWEAPON, PR_NOVICE, "^gYou can now weild two weapons at once.", B_TRUE);
|
||||||
addskilldesc(SK_TWOWEAPON, PR_ADEPT, "gYou no longer suffer an accuracy penalty when weilding two weapons.", B_TRUE);
|
addskilldesc(SK_TWOWEAPON, PR_ADEPT, "^gYou no longer suffer an accuracy penalty when weilding two weapons.", B_TRUE);
|
||||||
addskilldesc(SK_TWOWEAPON, PR_SKILLED, "^gFollow-up attacks with your second weapon are now more accurate.", B_TRUE);
|
addskilldesc(SK_TWOWEAPON, PR_SKILLED, "^gFollow-up attacks with your second weapon are now more accurate.", B_TRUE);
|
||||||
addskilldesc(SK_TWOWEAPON, PR_EXPERT, "^gYou gain the 'flurry attack' ability.", B_FALSE);
|
addskilldesc(SK_TWOWEAPON, PR_EXPERT, "^gYou gain the 'flurry attack' ability.", B_FALSE);
|
||||||
addskilldesc(SK_TWOWEAPON, PR_MASTER, "^gYou can now deflect attacks with your second weapon.", B_TRUE);
|
addskilldesc(SK_TWOWEAPON, PR_MASTER, "^gYou can now deflect attacks with your second weapon.", B_TRUE);
|
||||||
|
@ -16301,7 +16327,21 @@ int real_skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod, int *r
|
||||||
othermod += 10;
|
othermod += 10;
|
||||||
}
|
}
|
||||||
} else if (ct == SC_SHIELDBLOCK) {
|
} else if (ct == SC_SHIELDBLOCK) {
|
||||||
switch (getskill(lf, SK_SHIELDS)) {
|
object_t *shield;
|
||||||
|
enum SKILLLEVEL slev;
|
||||||
|
shield = getshield(lf);
|
||||||
|
if (shield) {
|
||||||
|
if (isshield(shield)) {
|
||||||
|
slev = getskill(lf, SK_SHIELDS);
|
||||||
|
} else {
|
||||||
|
// twoweaponer using their weapon
|
||||||
|
slev = PR_NOVICE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// should never happen!!!
|
||||||
|
slev = PR_INEPT;
|
||||||
|
}
|
||||||
|
switch (slev) {
|
||||||
case PR_NOVICE: othermod = 4; break;
|
case PR_NOVICE: othermod = 4; break;
|
||||||
case PR_BEGINNER: othermod = 7; break;
|
case PR_BEGINNER: othermod = 7; break;
|
||||||
case PR_ADEPT: othermod = 10; break;
|
case PR_ADEPT: othermod = 10; break;
|
||||||
|
@ -18144,7 +18184,8 @@ int usestairs(lifeform_t *lf, object_t *o, int onpurpose) {
|
||||||
char lfname[BUFLEN];
|
char lfname[BUFLEN];
|
||||||
char obname[BUFLEN];
|
char obname[BUFLEN];
|
||||||
int isportal = B_FALSE;
|
int isportal = B_FALSE;
|
||||||
lifeform_t *adjally[8];
|
lifeform_t *adjally[MAXFOLLOWLFS];
|
||||||
|
int seen[MAXFOLLOWLFS];
|
||||||
int nadjallies = 0;
|
int nadjallies = 0;
|
||||||
int falling = B_FALSE;
|
int falling = B_FALSE;
|
||||||
int madenewmap = B_FALSE;
|
int madenewmap = B_FALSE;
|
||||||
|
@ -18247,7 +18288,15 @@ int usestairs(lifeform_t *lf, object_t *o, int onpurpose) {
|
||||||
// find adjacent allies or enemies which will follow you
|
// find adjacent allies or enemies which will follow you
|
||||||
// (getwhowillfollow will handle following through pits)
|
// (getwhowillfollow will handle following through pits)
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
getwhowillfollow(lf, o, adjally, &nadjallies);
|
int n;
|
||||||
|
getwhowillfollow(lf, o, adjally, seen, &nadjallies);
|
||||||
|
for (n = 0; n < nadjallies; n++) {
|
||||||
|
if (seen[n]) {
|
||||||
|
char lname[BUFLEN];
|
||||||
|
real_getlfname(adjally[n], lname, B_FALSE);
|
||||||
|
msg("%s follows you.", lname);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// do stairs go somewhere?
|
// do stairs go somewhere?
|
||||||
|
@ -18338,13 +18387,14 @@ int usestairs(lifeform_t *lf, object_t *o, int onpurpose) {
|
||||||
c = getrandomadjcell(newcell, WE_WALKABLE, B_ALLOWEXPAND);
|
c = getrandomadjcell(newcell, WE_WALKABLE, B_ALLOWEXPAND);
|
||||||
if (c) {
|
if (c) {
|
||||||
if (!initiatemove(adjally[n], NULL, NULL)) {
|
if (!initiatemove(adjally[n], NULL, NULL)) {
|
||||||
|
int climbtime;
|
||||||
stopsprinting(adjally[n]);
|
stopsprinting(adjally[n]);
|
||||||
movelf(adjally[n], c);
|
movelf(adjally[n], c);
|
||||||
|
climbtime = getmovespeed(adjally[n]);
|
||||||
if ((dir == D_UP) && !isairborne(adjally[n])) {
|
if ((dir == D_UP) && !isairborne(adjally[n])) {
|
||||||
if (onpurpose) taketime(adjally[n], getmovespeed(adjally[n])*2); // takes longer to climb
|
climbtime *= 2;
|
||||||
} else {
|
|
||||||
if (onpurpose) taketime(adjally[n], getmovespeed(adjally[n]));
|
|
||||||
}
|
}
|
||||||
|
if (onpurpose) taketime(adjally[n], climbtime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19208,16 +19258,27 @@ int weild(lifeform_t *lf, object_t *o) {
|
||||||
if (!twohanded && hasbp(lf, otherloc)) {
|
if (!twohanded && hasbp(lf, otherloc)) {
|
||||||
oo = getequippedob(lf->pack, weildloc);
|
oo = getequippedob(lf->pack, weildloc);
|
||||||
if (getskill(lf, SK_TWOWEAPON) && oo && !hasflag(oo->flags, F_TWOHANDED)) {
|
if (getskill(lf, SK_TWOWEAPON) && oo && !hasflag(oo->flags, F_TWOHANDED)) {
|
||||||
char buf2[BUFLEN];
|
|
||||||
char ch;
|
char ch;
|
||||||
snprintf(buf2, BUFLEN, "Weild %s in your left hand?",buf);
|
if (isplayer(lf)) {
|
||||||
ch = askchar(buf2, "yn","y", B_TRUE);
|
char buf2[BUFLEN];
|
||||||
|
snprintf(buf2, BUFLEN, "Weild %s in your left hand?",buf);
|
||||||
|
ch = askchar(buf2, "yn","y", B_TRUE);
|
||||||
|
} else {
|
||||||
|
if (getweaponskill(lf, o)) ch = 'y';
|
||||||
|
else ch = 'n';
|
||||||
|
}
|
||||||
if (ch == 'y') {
|
if (ch == 'y') {
|
||||||
enum BODYPART temp;
|
// make sure we are skiled in 2nd weapon
|
||||||
// swap locations.
|
if (getweaponskill(lf, o)) {
|
||||||
temp = weildloc;
|
enum BODYPART temp;
|
||||||
weildloc = otherloc;
|
// swap locations.
|
||||||
otherloc = temp;
|
temp = weildloc;
|
||||||
|
weildloc = otherloc;
|
||||||
|
otherloc = temp;
|
||||||
|
} else {
|
||||||
|
msg("You are not skilled enough to use this weapon in your left hand.");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
lf.h
4
lf.h
|
@ -101,7 +101,7 @@ int get_adjacent_quadrants(int dir, enum QUADRANT *start, enum QUADRANT *end);
|
||||||
int get_circular_fov_endpoints(lifeform_t *lf, int maxvisrange, int *endx, int *endy, int *nendcells);
|
int get_circular_fov_endpoints(lifeform_t *lf, int maxvisrange, int *endx, int *endy, int *nendcells);
|
||||||
int getactspeed(lifeform_t *lf);
|
int getactspeed(lifeform_t *lf);
|
||||||
int getadjenemies(lifeform_t *lf, lifeform_t **adjlf, int *nadjlfs);
|
int getadjenemies(lifeform_t *lf, lifeform_t **adjlf, int *nadjlfs);
|
||||||
void getwhowillfollow(lifeform_t *lf, object_t *stairob, lifeform_t **adjally, int *nadjallies);
|
void getwhowillfollow(lifeform_t *lf, object_t *stairob, lifeform_t **adjally, int *seen, int *nadjallies);
|
||||||
enum ALIGNMENT getalignment(lifeform_t *lf);
|
enum ALIGNMENT getalignment(lifeform_t *lf);
|
||||||
enum ALLEGIENCE getallegiance(lifeform_t *lf);
|
enum ALLEGIENCE getallegiance(lifeform_t *lf);
|
||||||
int getallouterarmour(lifeform_t *lf, object_t **ob, int *nobs);
|
int getallouterarmour(lifeform_t *lf, object_t **ob, int *nobs);
|
||||||
|
@ -201,6 +201,7 @@ int getskilllevcost(enum SKILLLEVEL slev);
|
||||||
int getsounddist(int volume);
|
int getsounddist(int volume);
|
||||||
char *getspeedname(int speed, char *buf);
|
char *getspeedname(int speed, char *buf);
|
||||||
char *getspeednameshort(int speed, char *buf);
|
char *getspeednameshort(int speed, char *buf);
|
||||||
|
long getspforpoint(lifeform_t *lf);
|
||||||
float getstatmod(lifeform_t *lf, enum ATTRIB att);
|
float getstatmod(lifeform_t *lf, enum ATTRIB att);
|
||||||
char *getskilldesc(enum SKILL id );
|
char *getskilldesc(enum SKILL id );
|
||||||
char *getskillname(enum SKILL id );
|
char *getskillname(enum SKILL id );
|
||||||
|
@ -209,6 +210,7 @@ int getthrowspeed(int str);
|
||||||
int getturnspeed(lifeform_t *lf);
|
int getturnspeed(lifeform_t *lf);
|
||||||
void getwantdistance(lifeform_t *lf, int *min, int *max, int attacking);
|
void getwantdistance(lifeform_t *lf, int *min, int *max, int attacking);
|
||||||
object_t *getweapon(lifeform_t *lf);
|
object_t *getweapon(lifeform_t *lf);
|
||||||
|
enum SKILLLEVEL getweaponskill(lifeform_t *lf, object_t *o);
|
||||||
long getxpforlev(int level);
|
long getxpforlev(int level);
|
||||||
void givejob(lifeform_t *lf, enum JOB jobid);
|
void givejob(lifeform_t *lf, enum JOB jobid);
|
||||||
int givemoney(lifeform_t *from, lifeform_t *to, int amt);
|
int givemoney(lifeform_t *from, lifeform_t *to, int amt);
|
||||||
|
|
28
map.c
28
map.c
|
@ -739,6 +739,24 @@ regiontype_t *addregiontype(enum REGIONTYPE id, char *name, enum HABITAT default
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void adjustcellglyphforlight(cell_t *c, glyph_t *g) {
|
||||||
|
if (g->ch == ' ') return;
|
||||||
|
switch (c->lit) {
|
||||||
|
case L_PERMDARK:
|
||||||
|
case L_NOTLIT:
|
||||||
|
g->colour = C_BLUE;
|
||||||
|
break;
|
||||||
|
case L_TEMP: // lit by a light source
|
||||||
|
if (g->colour < 8) {
|
||||||
|
g->colour = g->colour + 8; // ie. make bold
|
||||||
|
if (g->colour >= C_DARKGREY) g->colour = C_WHITE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case L_PERMLIGHT:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int autodoors(map_t *map, int roomid, int minx, int miny, int maxx, int maxy, int doorpct, int dooropenchance) {
|
int autodoors(map_t *map, int roomid, int minx, int miny, int maxx, int maxy, int doorpct, int dooropenchance) {
|
||||||
int i,d;
|
int i,d;
|
||||||
cell_t *poss[MAXCANDIDATES], *cell[MAXCANDIDATES]; // TODO: should this be maxroomw * maxroomh ?
|
cell_t *poss[MAXCANDIDATES], *cell[MAXCANDIDATES]; // TODO: should this be maxroomw * maxroomh ?
|
||||||
|
@ -1256,17 +1274,13 @@ void getcellglyph(glyph_t *g, cell_t *c, lifeform_t *viewer) {
|
||||||
} else {
|
} else {
|
||||||
// objects here, but we can't see them. draw the cell.
|
// objects here, but we can't see them. draw the cell.
|
||||||
*g = c->type->glyph;
|
*g = c->type->glyph;
|
||||||
if (!islit(c)) {
|
adjustcellglyphforlight(c, g);
|
||||||
g->colour = C_BLUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// draw cell normally
|
// draw cell normally
|
||||||
//drawcell(cell, x, y);
|
//drawcell(cell, x, y);
|
||||||
*g = c->type->glyph;
|
*g = c->type->glyph;
|
||||||
if (!islit(c)) {
|
adjustcellglyphforlight(c, g);
|
||||||
g->colour = C_BLUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else { // can't see the cell
|
} else { // can't see the cell
|
||||||
void *thing;
|
void *thing;
|
||||||
|
@ -4699,7 +4713,7 @@ int isnewcellok(cell_t *cell, char *err) {
|
||||||
int isnighttime(void) {
|
int isnighttime(void) {
|
||||||
int hours,mins,secs;
|
int hours,mins,secs;
|
||||||
splittime(&hours,&mins,&secs);
|
splittime(&hours,&mins,&secs);
|
||||||
if ((hours < 5) || (hours >= 19)) {
|
if ((hours < 7) || (hours >= 19)) {
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
|
|
1
map.h
1
map.h
|
@ -11,6 +11,7 @@ region_t *addregion(enum REGIONTYPE rtype, region_t *parent, int outlineid);
|
||||||
regionoutline_t *addregionoutline(enum REGIONTYPE rtype);
|
regionoutline_t *addregionoutline(enum REGIONTYPE rtype);
|
||||||
regionthing_t *addregionthing(regionoutline_t *ro, int depth, int x, int y, enum REGIONTHING whatkind, int value, char *what);
|
regionthing_t *addregionthing(regionoutline_t *ro, int depth, int x, int y, enum REGIONTHING whatkind, int value, char *what);
|
||||||
regiontype_t *addregiontype(enum REGIONTYPE id, char *name, enum HABITAT defaulthabitat, int maxdepth, int stairsperlev, int deeperdir, int major);
|
regiontype_t *addregiontype(enum REGIONTYPE id, char *name, enum HABITAT defaulthabitat, int maxdepth, int stairsperlev, int deeperdir, int major);
|
||||||
|
void adjustcellglyphforlight(cell_t *c, glyph_t *col);
|
||||||
int autodoors(map_t *map, int roomid, int minx, int miny, int maxx, int maxy, int doorpct, int dooropenchance);
|
int autodoors(map_t *map, int roomid, int minx, int miny, int maxx, int maxy, int doorpct, int dooropenchance);
|
||||||
int cellhaslos(cell_t *c1, cell_t *dest);
|
int cellhaslos(cell_t *c1, cell_t *dest);
|
||||||
void clearcell(cell_t *c);
|
void clearcell(cell_t *c);
|
||||||
|
|
16
move.c
16
move.c
|
@ -1044,7 +1044,7 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
|
||||||
newcell->lf = lf;
|
newcell->lf = lf;
|
||||||
|
|
||||||
// update light
|
// update light
|
||||||
if (lfproduceslight(lf)) {
|
if ((isplayer(lf) && changedlev) || lfproduceslight(lf)) {
|
||||||
calclight(lf->cell->map);
|
calclight(lf->cell->map);
|
||||||
}
|
}
|
||||||
setlosdirty(lf);
|
setlosdirty(lf);
|
||||||
|
@ -2550,7 +2550,8 @@ int trymove(lifeform_t *lf, int dir, int onpurpose, int strafe) {
|
||||||
int walkoffmap(lifeform_t *lf, int dir, int onpurpose) {
|
int walkoffmap(lifeform_t *lf, int dir, int onpurpose) {
|
||||||
map_t *adjmap = NULL, *thismap;
|
map_t *adjmap = NULL, *thismap;
|
||||||
cell_t *dst = NULL;
|
cell_t *dst = NULL;
|
||||||
lifeform_t *adjally[8];
|
lifeform_t *adjally[MAXFOLLOWLFS];
|
||||||
|
int seen[MAXFOLLOWLFS];
|
||||||
int nadjallies = 0;
|
int nadjallies = 0;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
@ -2600,10 +2601,15 @@ int walkoffmap(lifeform_t *lf, int dir, int onpurpose) {
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onpurpose) {
|
if (onpurpose && isplayer(lf)) {
|
||||||
// get list of adjacent allies
|
// get list of adjacent allies
|
||||||
if (isplayer(lf)) {
|
getwhowillfollow(lf, NULL, adjally, seen, &nadjallies);
|
||||||
getwhowillfollow(lf, NULL, adjally, &nadjallies);
|
for (n = 0; n < nadjallies; n++) {
|
||||||
|
if (seen[n]) {
|
||||||
|
char lname[BUFLEN];
|
||||||
|
real_getlfname(adjally[n], lname, B_FALSE);
|
||||||
|
msg("%s follows you.", lname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
85
objects.c
85
objects.c
|
@ -3110,37 +3110,33 @@ int getobaccuracy(object_t *wep, lifeform_t *weilder) {
|
||||||
acc += (getobbonus(wep)*5);
|
acc += (getobbonus(wep)*5);
|
||||||
|
|
||||||
if (weilder) {
|
if (weilder) {
|
||||||
skill_t *sk;
|
enum SKILLLEVEL slev;
|
||||||
// modify for weilder's skill
|
// modify for weilder's skill
|
||||||
sk = getobskill(wep);
|
|
||||||
if (sk) {
|
|
||||||
enum SKILLLEVEL slev;
|
|
||||||
|
|
||||||
slev = getskill(weilder, sk->id);
|
slev = getweaponskill(weilder, wep);
|
||||||
if (hasflag(wep->flags, F_MASTERWORK)) {
|
if (hasflag(wep->flags, F_MASTERWORK)) {
|
||||||
if (slev < PR_ADEPT) slev++;
|
if (slev < PR_ADEPT) slev++;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (slev) {
|
switch (slev) {
|
||||||
case PR_INEPT:
|
case PR_INEPT:
|
||||||
acc -= 30;
|
acc -= 30;
|
||||||
break;
|
break;
|
||||||
case PR_NOVICE:
|
case PR_NOVICE:
|
||||||
acc -= 10;
|
acc -= 10;
|
||||||
break;
|
break;
|
||||||
case PR_BEGINNER:
|
case PR_BEGINNER:
|
||||||
acc -= 5;
|
acc -= 5;
|
||||||
break;
|
break;
|
||||||
case PR_ADEPT:
|
case PR_ADEPT:
|
||||||
break;
|
break;
|
||||||
case PR_SKILLED:
|
case PR_SKILLED:
|
||||||
acc += 25;
|
acc += 25;
|
||||||
break;
|
break;
|
||||||
case PR_EXPERT:
|
case PR_EXPERT:
|
||||||
case PR_MASTER:
|
case PR_MASTER:
|
||||||
acc += 50;
|
acc += 50;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6336,7 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
|
addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL);
|
||||||
addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "2d6");
|
addflag(lastot->flags, F_DTVULN, DT_FIRE, NA, NA, "2d6");
|
||||||
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
|
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
|
||||||
addot(OT_STUMP, "stump", "A large tree stump.", MT_WOOD, 150, OC_FLORA, SZ_LARGE);
|
addot(OT_STUMP, "tree stump", "A large tree stump.", MT_WOOD, 150, OC_FLORA, SZ_LARGE);
|
||||||
addflag(lastot->flags, F_RARITY, H_FOREST, 100, NA, "");
|
addflag(lastot->flags, F_RARITY, H_FOREST, 100, NA, "");
|
||||||
addflag(lastot->flags, F_GLYPH, C_BROWN, NA, NA, "'");
|
addflag(lastot->flags, F_GLYPH, C_BROWN, NA, NA, "'");
|
||||||
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_HUMAN, NA, NULL);
|
addflag(lastot->flags, F_IMPASSABLE, SZ_MIN, SZ_HUMAN, NA, NULL);
|
||||||
|
@ -7852,7 +7848,7 @@ void initobjects(void) {
|
||||||
addot(OT_WAND_LIGHT, "wand of light", "A limited-use magical wand which casts the imbued spell.", MT_METAL, 0.5, OC_WAND, SZ_SMALL);
|
addot(OT_WAND_LIGHT, "wand of light", "A limited-use magical wand which casts the imbued spell.", MT_METAL, 0.5, OC_WAND, SZ_SMALL);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 83, RR_UNCOMMON, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 83, RR_UNCOMMON, NULL);
|
||||||
addflag(lastot->flags, F_LINKSPELL, OT_S_LIGHT, 3, NA, NULL);
|
addflag(lastot->flags, F_LINKSPELL, OT_S_LIGHT, 3, NA, NULL);
|
||||||
addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, NA, NA, NULL);
|
addflag(lastot->flags, F_OPERNEEDTARGET, TT_MONSTER, TR_NEEDLOF, NA, NULL);
|
||||||
addot(OT_WAND_REVEALHIDDEN, "wand of reveal hidden", "A limited-use magical wand which casts the imbued spell.", MT_METAL, 0.5, OC_WAND, SZ_SMALL);
|
addot(OT_WAND_REVEALHIDDEN, "wand of reveal hidden", "A limited-use magical wand which casts the imbued spell.", MT_METAL, 0.5, OC_WAND, SZ_SMALL);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, RR_UNCOMMON, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, RR_UNCOMMON, NULL);
|
||||||
addflag(lastot->flags, F_LINKSPELL, OT_S_REVEALHIDDEN, NA, NA, NULL);
|
addflag(lastot->flags, F_LINKSPELL, OT_S_REVEALHIDDEN, NA, NA, NULL);
|
||||||
|
@ -7970,6 +7966,23 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_CHARGELOWMSG, B_TRUE, NA, NA, "flickers");
|
addflag(lastot->flags, F_CHARGELOWMSG, B_TRUE, NA, NA, "flickers");
|
||||||
addflag(lastot->flags, F_CHARGEOUTMSG, B_TRUE, NA, NA, "goes out");
|
addflag(lastot->flags, F_CHARGEOUTMSG, B_TRUE, NA, NA, "goes out");
|
||||||
|
|
||||||
|
addot(OT_FRIDGE, "refrigerator", "An insulated household appliance, made for storing food.", MT_METAL, 80, OC_TOOLS, SZ_HUMAN);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL);
|
||||||
|
addflag(lastot->flags, F_GLYPH, C_WHITE, NA, NA, "]");
|
||||||
|
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, 40, 40, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_OPERABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_CONTAINER, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_STARTOBCLASS, 50, OC_FOOD, NA, NULL);
|
||||||
|
|
||||||
addot(OT_GUNPOWDER, "pile of gunpowder", "A black metallic powder.", MT_METAL, 0.5, OC_TOOLS, SZ_TINY);
|
addot(OT_GUNPOWDER, "pile of gunpowder", "A black metallic powder.", MT_METAL, 0.5, OC_TOOLS, SZ_TINY);
|
||||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of black powder");
|
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_GLYPH, NA, NA, NA, ",");
|
||||||
|
@ -11736,7 +11749,7 @@ int operate(lifeform_t *lf, object_t *o, cell_t *where) {
|
||||||
if (isplayer(lf)) msg("You can't see there!");
|
if (isplayer(lf)) msg("You can't see there!");
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
if ((f->val[1] & TR_NEEDLOF) && !haslof(lf->cell, where, B_TRUE, &newwhere)) {
|
if ((f->val[1] & TR_NEEDLOF) && !haslof(lf->cell, where, LOF_NEED, &newwhere)) {
|
||||||
if (newwhere) {
|
if (newwhere) {
|
||||||
// update destination
|
// update destination
|
||||||
where = newwhere;
|
where = newwhere;
|
||||||
|
@ -16202,13 +16215,9 @@ int getcritchance(lifeform_t *lf, object_t *o, lifeform_t *victim) {
|
||||||
|
|
||||||
if (lf) {
|
if (lf) {
|
||||||
enum SKILLLEVEL weplev = PR_INEPT;
|
enum SKILLLEVEL weplev = PR_INEPT;
|
||||||
skill_t *wepsk = NULL;
|
weplev = getweaponskill(lf, o);
|
||||||
wepsk = getobskill(o);
|
if (weplev != PR_INEPT) {
|
||||||
if (wepsk) {
|
chance += (weplev*5); // ie. up to 30% bonus
|
||||||
weplev = getskill(lf, wepsk->id);
|
|
||||||
if (weplev != PR_INEPT) {
|
|
||||||
chance += (weplev*5); // ie. up to 30% bonus
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
spell.c
10
spell.c
|
@ -3386,11 +3386,11 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
for (o = caster->pack->first ; o ; o = o->next) {
|
for (o = caster->pack->first ; o ; o = o->next) {
|
||||||
if (o->blessed == B_BLESSED) {
|
if (o->blessed == B_BLESSED) {
|
||||||
getobname(o, obname, o->amt);
|
getobname(o, obname, o->amt);
|
||||||
msg("Your %s flash%s white!", noprefix(obname), (o->amt == 1) ? "es" : "");
|
msg("You sense a holy aura from your %s!", noprefix(obname));
|
||||||
somethinghappened = B_TRUE;
|
somethinghappened = B_TRUE;
|
||||||
} else if (o->blessed == B_CURSED) {
|
} else if (o->blessed == B_CURSED) {
|
||||||
getobname(o, obname, o->amt);
|
getobname(o, obname, o->amt);
|
||||||
msg("Your %s flash%s black!", noprefix(obname), (o->amt == 1) ? "es" : "");
|
msg("Your sense an evil aura from your %s!", noprefix(obname));
|
||||||
somethinghappened = B_TRUE;
|
somethinghappened = B_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3399,11 +3399,11 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
for (o = caster->cell->obpile->first ; o ; o = o->next) {
|
for (o = caster->cell->obpile->first ; o ; o = o->next) {
|
||||||
if (o->blessed == B_BLESSED) {
|
if (o->blessed == B_BLESSED) {
|
||||||
getobname(o, obname, o->amt);
|
getobname(o, obname, o->amt);
|
||||||
msg("%s flash%s white!", obname, (o->amt == 1) ? "es" : "");
|
msg("You sense a holy aura from %s!", obname);
|
||||||
somethinghappened = B_TRUE;
|
somethinghappened = B_TRUE;
|
||||||
} else if (o->blessed == B_CURSED) {
|
} else if (o->blessed == B_CURSED) {
|
||||||
getobname(o, obname, o->amt);
|
getobname(o, obname, o->amt);
|
||||||
msg("%s flash%s black!", obname, (o->amt == 1) ? "es" : "");
|
msg("You sense an evil aura from %s!", obname);
|
||||||
somethinghappened = B_TRUE;
|
somethinghappened = B_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3550,7 +3550,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
target = caster;
|
target = caster;
|
||||||
if (isplayer(caster)) {
|
if (isplayer(caster)) {
|
||||||
int howlong,radius;
|
int howlong,radius;
|
||||||
howlong = getspellduration(10,20,blessed) + (power*2);
|
howlong = getspellduration(40,80,blessed) + (power*2);
|
||||||
radius = power * 10;
|
radius = power * 10;
|
||||||
addtempflag(target->flags, F_DETECTLIFE, 10, (power >= 8) ? B_TRUE : NA, NA, NULL, howlong);
|
addtempflag(target->flags, F_DETECTLIFE, 10, (power >= 8) ? B_TRUE : NA, NA, NULL, howlong);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -14,7 +14,8 @@ autopop
|
||||||
! tables & chairs
|
! tables & chairs
|
||||||
scatter(1,1,-2,-2) ob:wooden table:20%
|
scatter(1,1,-2,-2) ob:wooden table:20%
|
||||||
scatter(1,1,-2,-2) ob:wooden footstool:20%
|
scatter(1,1,-2,-2) ob:wooden footstool:20%
|
||||||
scatter(1,1,-2,-2) ob:random food:5-10
|
scatter(1,1,-2,-2) ob:random food:1-2
|
||||||
|
scatter(1,1,-2,-2) ob:refrigerator:1
|
||||||
scatter(1,1,-2,-2) ob:steak knife:1-5
|
scatter(1,1,-2,-2) ob:steak knife:1-5
|
||||||
! mayrotate
|
! mayrotate
|
||||||
! mayscale
|
! mayscale
|
||||||
|
|
Loading…
Reference in New Issue