From 5bd96d7e5a56f2e64204aab129a33ef8759a934f Mon Sep 17 00:00:00 2001 From: Rob Pearce Date: Thu, 15 Sep 2011 01:40:26 +0000 Subject: [PATCH] - [+] 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. --- ai.c | 4 ++ data/hiscores.db | Bin 5120 -> 5120 bytes defs.h | 5 +- doc/glyphs.txt | 2 +- flag.c | 20 +++++-- god.c | 69 +++++++++++++++++++++++- god.h | 1 + io.c | 81 ++++------------------------ lf.c | 119 ++++++++++++++++++++++++++++++++---------- lf.h | 4 +- map.c | 28 +++++++--- map.h | 1 + move.c | 16 ++++-- objects.c | 87 ++++++++++++++++-------------- spell.c | 10 ++-- vaults/diningroom.vlt | 3 +- 16 files changed, 286 insertions(+), 164 deletions(-) diff --git a/ai.c b/ai.c index d5447af..59f2789 100644 --- a/ai.c +++ b/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 (db) { + dblog(".oO { starting aimovetolf }"); + } + targetflag = lfhasflagval(lf, F_PETOF, target->id, NA, NA, NULL); if (targetflag) { ismaster = B_TRUE; diff --git a/data/hiscores.db b/data/hiscores.db index cbbc7eca87ba25782ead60f6f98e29064f022826..3f1e4c4a61239b933f62640604358fc1db1a107b 100644 GIT binary patch delta 127 zcmZqBXwaA-%^12-<^?;mCbRKmb`F0QW(#KH&50a0nYdV(85lJ|gvMlB?&HkD48JC` z^C+`0ngAJkJZCs9G}#y!g=Hg^Cg-z=swOI=Bo>t@Xq03W<(KCvBvmRTDrDy;<>#bm Z>ZxjgRT{HRe!wO^c|8mJ=4jrfYygRkAHM(q delta 90 zcmZqBXwaA-%^18<<^?;mIpile; + // free mem if (f->text) free(f->text); if (f->altval) { @@ -827,7 +832,14 @@ void killflag(flag_t *f) { 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) { 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 it was an object flag, then everyone who can see // its cell recalcs their los. - if (f->pile->owner) { - setlosdirty(f->pile->owner); + if (lf) { + setlosdirty(lf); //precalclos(f->pile->owner); - if (isplayer(f->pile->owner)) redoscreen = B_TRUE; + if (isplayer(lf)) redoscreen = B_TRUE; } else { // everyone who can see this cell recalcs their los lifeform_t *l; diff --git a/god.c b/god.c index f5077cb..33153f3 100644 --- a/god.c +++ b/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 *lf; // search heaven first @@ -558,7 +625,7 @@ int godgiftmaybe(enum RACE rid) { //setpiety(rid, 101); modpiety(rid, -50); } // end if (pctchance enough to get a gift) - } // end if (piety > 100) + } // end if (piety > 200) return gotgift; } diff --git a/god.h b/god.h index e4dbee9..2d87eab 100644 --- a/god.h +++ b/god.h @@ -2,6 +2,7 @@ void angergod(enum RACE rid, int amt); void angergodmaybe(enum RACE rid, int amt); +void dooffer(void); lifeform_t *findgod(enum RACE rid); int getpiety(enum RACE rid); enum PIETYLEV getpietylev(enum RACE rid, enum COLOUR *col, char *happiness); diff --git a/io.c b/io.c index 34ab0d8..459a7cf 100644 --- a/io.c +++ b/io.c @@ -5105,10 +5105,9 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2, } else { snprintf(mpdesc[nposs], BUFLEN, "(%d/%d)",f->val[1],f->val[2]); validspell[nposs] = B_FALSE; - err[nposs] = E_TOOPOWERFUL; + err[nposs] = E_NOTREADY; } } - nposs++; } } @@ -5217,7 +5216,7 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2, if (validspell[i]) { strcpy(costbuf, ""); } else { - strcpy(costbuf, "(NOT CASTABLE) "); + sprintf(costbuf, "(NOT %s) ", (ot->obclass->id == OC_SPELL) ? "CASTABLE" : "USABLE"); } strcat(costbuf, mpdesc[i]); @@ -5229,6 +5228,8 @@ void makespellchoicelist(prompt_t *pr, lifeform_t *lf, char *ques, char *ques2, addit = B_TRUE; } else if ((err[i] == E_TOOPOWERFUL) && wanttoohard) { addit = B_TRUE; + } else if (err[i] == E_NOTREADY) { + addit = B_TRUE; } if (addit) { @@ -5352,70 +5353,6 @@ void domsghist(void) { 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) { object_t *o; @@ -8177,9 +8114,10 @@ void showlfstats(lifeform_t *lf, int 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 " ); - snprintf(cmdchars, BUFLEN, "@asmeg%s",isplayer(lf) ? "" : "i"); + snprintf(cmdchars, BUFLEN, "@asme%s%s",isplayer(lf) ? "g" : "", isplayer(lf) ? "" : "i"); } else { snprintf(promptstr, BUFLEN, "^h[^W@^n=stats %s ESC=quit]", isplayer(lf) ? "" : "^WI^ntems "); snprintf(cmdchars, BUFLEN, "@i"); @@ -8294,9 +8232,12 @@ void showlfstats(lifeform_t *lf, int showall) { if (isplayer(lf)) { int attpoints; int pct; + long amtneeded; + attpoints = getattpoints(lf); + amtneeded = getspforpoint(lf); 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); if (lf->skillpoints || attpoints ) { /* diff --git a/lf.c b/lf.c index cb7e3f7..7a4d952 100644 --- a/lf.c +++ b/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 if ((nightvisrange != UNLIMITED) && !islit(c)) { - if (dist > nightvisrange) { + if (dist >= nightvisrange) { return B_FALSE; } else { // inside our nightvis range and magically dark @@ -3933,10 +3933,8 @@ void gainxp(lifeform_t *lf, long amt) { // skill xp if (isplayer(lf)) { int amtneeded; - int mod; - mod = getstatmod(lf, A_IQ); - amtneeded = pctof(100 + mod, SKILLXPPERPOINT); + amtneeded = getspforpoint(lf); lf->skillxp += amt; 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 // ie. allies within LOS // 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; for (y = 0; y < lf->cell->map->h; y++) { 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? adjally[*nadjallies] = c->lf; + if (seen) seen[*nadjallies] = cansee(lf, c->lf); (*nadjallies)++; + if (*nadjallies >= MAXFOLLOWLFS) return; } } } @@ -6081,8 +6081,12 @@ object_t *getsecmeleeweapon(lifeform_t *lf) { object_t *getshield(lifeform_t *lf) { object_t *o; o = getequippedob(lf->pack, BP_SECWEAPON); - if (o && isshield(o)) { - return o; + if (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; @@ -6584,6 +6588,14 @@ char *getspeednameshort(int speed, char *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: // accuracy, evasion, lockpicking // result will be between -50 and 50 @@ -6907,6 +6919,17 @@ object_t *getweapon(lifeform_t *lf) { 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 needxp = 0; // 2.8 @@ -9079,7 +9102,7 @@ void initrace(void) { addflag(lastrace->flags, F_UNIQUE, 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_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_ACTIONSPEED, SP_NORMAL, NA, NA, NULL); 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_NOSPELLS, 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_DEAF, B_TRUE, NA, NA, NULL); 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_FOREST, 80, NA, ""); 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_NOBODYPART, BP_WEAPON, 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) { // turn to face the sound - turntoface(l, c); - if (isplayer(noisemaker) && cansee(player, l)) { - char lfname[BUFLEN]; - getlfname(l, lfname); - msg("%s turns to face you.", lfname); + if (isplayer(noisemaker) && cansee(player, l) && cansee(l, player) && !lfhasflag(l, F_AWARENESS)) { + // peaceful things only turn sometimes + if (!ispeaceful(l) || onein(6)) { + char lfname[BUFLEN]; + 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); 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_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_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); @@ -16301,7 +16327,21 @@ int real_skillcheck(lifeform_t *lf, enum CHECKTYPE ct, int diff, int mod, int *r othermod += 10; } } 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_BEGINNER: othermod = 7; 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 obname[BUFLEN]; int isportal = B_FALSE; - lifeform_t *adjally[8]; + lifeform_t *adjally[MAXFOLLOWLFS]; + int seen[MAXFOLLOWLFS]; int nadjallies = 0; int falling = 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 // (getwhowillfollow will handle following through pits) 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? @@ -18338,13 +18387,14 @@ int usestairs(lifeform_t *lf, object_t *o, int onpurpose) { c = getrandomadjcell(newcell, WE_WALKABLE, B_ALLOWEXPAND); if (c) { if (!initiatemove(adjally[n], NULL, NULL)) { + int climbtime; stopsprinting(adjally[n]); movelf(adjally[n], c); + climbtime = getmovespeed(adjally[n]); if ((dir == D_UP) && !isairborne(adjally[n])) { - if (onpurpose) taketime(adjally[n], getmovespeed(adjally[n])*2); // takes longer to climb - } else { - if (onpurpose) taketime(adjally[n], getmovespeed(adjally[n])); + climbtime *= 2; } + if (onpurpose) taketime(adjally[n], climbtime); } } } @@ -19208,16 +19258,27 @@ int weild(lifeform_t *lf, object_t *o) { if (!twohanded && hasbp(lf, otherloc)) { oo = getequippedob(lf->pack, weildloc); if (getskill(lf, SK_TWOWEAPON) && oo && !hasflag(oo->flags, F_TWOHANDED)) { - char buf2[BUFLEN]; char ch; - snprintf(buf2, BUFLEN, "Weild %s in your left hand?",buf); - ch = askchar(buf2, "yn","y", B_TRUE); + if (isplayer(lf)) { + 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') { - enum BODYPART temp; - // swap locations. - temp = weildloc; - weildloc = otherloc; - otherloc = temp; + // make sure we are skiled in 2nd weapon + if (getweaponskill(lf, o)) { + enum BODYPART temp; + // swap locations. + temp = weildloc; + weildloc = otherloc; + otherloc = temp; + } else { + msg("You are not skilled enough to use this weapon in your left hand."); + return B_TRUE; + } } } } diff --git a/lf.h b/lf.h index c82308f..c8c0a93 100644 --- a/lf.h +++ b/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 getactspeed(lifeform_t *lf); 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 ALLEGIENCE getallegiance(lifeform_t *lf); int getallouterarmour(lifeform_t *lf, object_t **ob, int *nobs); @@ -201,6 +201,7 @@ int getskilllevcost(enum SKILLLEVEL slev); int getsounddist(int volume); char *getspeedname(int speed, char *buf); char *getspeednameshort(int speed, char *buf); +long getspforpoint(lifeform_t *lf); float getstatmod(lifeform_t *lf, enum ATTRIB att); char *getskilldesc(enum SKILL id ); char *getskillname(enum SKILL id ); @@ -209,6 +210,7 @@ int getthrowspeed(int str); int getturnspeed(lifeform_t *lf); void getwantdistance(lifeform_t *lf, int *min, int *max, int attacking); object_t *getweapon(lifeform_t *lf); +enum SKILLLEVEL getweaponskill(lifeform_t *lf, object_t *o); long getxpforlev(int level); void givejob(lifeform_t *lf, enum JOB jobid); int givemoney(lifeform_t *from, lifeform_t *to, int amt); diff --git a/map.c b/map.c index e4ef3de..f2f0e13 100644 --- a/map.c +++ b/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 i,d; 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 { // objects here, but we can't see them. draw the cell. *g = c->type->glyph; - if (!islit(c)) { - g->colour = C_BLUE; - } + adjustcellglyphforlight(c, g); } } else { // draw cell normally //drawcell(cell, x, y); *g = c->type->glyph; - if (!islit(c)) { - g->colour = C_BLUE; - } + adjustcellglyphforlight(c, g); } } else { // can't see the cell void *thing; @@ -4699,7 +4713,7 @@ int isnewcellok(cell_t *cell, char *err) { int isnighttime(void) { int hours,mins,secs; splittime(&hours,&mins,&secs); - if ((hours < 5) || (hours >= 19)) { + if ((hours < 7) || (hours >= 19)) { return B_TRUE; } return B_FALSE; diff --git a/map.h b/map.h index 31caa5a..73349de 100644 --- a/map.h +++ b/map.h @@ -11,6 +11,7 @@ region_t *addregion(enum REGIONTYPE rtype, region_t *parent, int outlineid); 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); 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 cellhaslos(cell_t *c1, cell_t *dest); void clearcell(cell_t *c); diff --git a/move.c b/move.c index a5b4768..18102c1 100644 --- a/move.c +++ b/move.c @@ -1044,7 +1044,7 @@ int movelf(lifeform_t *lf, cell_t *newcell) { newcell->lf = lf; // update light - if (lfproduceslight(lf)) { + if ((isplayer(lf) && changedlev) || lfproduceslight(lf)) { calclight(lf->cell->map); } 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) { map_t *adjmap = NULL, *thismap; cell_t *dst = NULL; - lifeform_t *adjally[8]; + lifeform_t *adjally[MAXFOLLOWLFS]; + int seen[MAXFOLLOWLFS]; int nadjallies = 0; int n; @@ -2600,10 +2601,15 @@ int walkoffmap(lifeform_t *lf, int dir, int onpurpose) { return B_TRUE; } - if (onpurpose) { + if (onpurpose && isplayer(lf)) { // get list of adjacent allies - if (isplayer(lf)) { - getwhowillfollow(lf, NULL, adjally, &nadjallies); + getwhowillfollow(lf, NULL, 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); + } } } diff --git a/objects.c b/objects.c index 411e6d3..c988cec 100644 --- a/objects.c +++ b/objects.c @@ -3110,37 +3110,33 @@ int getobaccuracy(object_t *wep, lifeform_t *weilder) { acc += (getobbonus(wep)*5); if (weilder) { - skill_t *sk; + enum SKILLLEVEL slev; // modify for weilder's skill - sk = getobskill(wep); - if (sk) { - enum SKILLLEVEL slev; - - slev = getskill(weilder, sk->id); - if (hasflag(wep->flags, F_MASTERWORK)) { - if (slev < PR_ADEPT) slev++; - } + + slev = getweaponskill(weilder, wep); + if (hasflag(wep->flags, F_MASTERWORK)) { + if (slev < PR_ADEPT) slev++; + } - switch (slev) { - case PR_INEPT: - acc -= 30; - break; - case PR_NOVICE: - acc -= 10; - break; - case PR_BEGINNER: - acc -= 5; - break; - case PR_ADEPT: - break; - case PR_SKILLED: - acc += 25; - break; - case PR_EXPERT: - case PR_MASTER: - acc += 50; - break; - } + switch (slev) { + case PR_INEPT: + acc -= 30; + break; + case PR_NOVICE: + acc -= 10; + break; + case PR_BEGINNER: + acc -= 5; + break; + case PR_ADEPT: + break; + case PR_SKILLED: + acc += 25; + break; + case PR_EXPERT: + case PR_MASTER: + acc += 50; + break; } } @@ -6340,7 +6336,7 @@ void initobjects(void) { 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_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_GLYPH, C_BROWN, NA, NA, "'"); 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); 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_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); addflag(lastot->flags, F_RARITY, H_DUNGEON, 80, RR_UNCOMMON, 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_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); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pile of black powder"); 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!"); 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) { // update destination where = newwhere; @@ -16202,13 +16215,9 @@ int getcritchance(lifeform_t *lf, object_t *o, lifeform_t *victim) { if (lf) { enum SKILLLEVEL weplev = PR_INEPT; - skill_t *wepsk = NULL; - wepsk = getobskill(o); - if (wepsk) { - weplev = getskill(lf, wepsk->id); - if (weplev != PR_INEPT) { - chance += (weplev*5); // ie. up to 30% bonus - } + weplev = getweaponskill(lf, o); + if (weplev != PR_INEPT) { + chance += (weplev*5); // ie. up to 30% bonus } } diff --git a/spell.c b/spell.c index 1f286ed..7608517 100644 --- a/spell.c +++ b/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) { if (o->blessed == B_BLESSED) { 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; } else if (o->blessed == B_CURSED) { 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; } } @@ -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) { if (o->blessed == B_BLESSED) { 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; } else if (o->blessed == B_CURSED) { 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; } } @@ -3550,7 +3550,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ target = caster; if (isplayer(caster)) { int howlong,radius; - howlong = getspellduration(10,20,blessed) + (power*2); + howlong = getspellduration(40,80,blessed) + (power*2); radius = power * 10; addtempflag(target->flags, F_DETECTLIFE, 10, (power >= 8) ? B_TRUE : NA, NA, NULL, howlong); } else { diff --git a/vaults/diningroom.vlt b/vaults/diningroom.vlt index 47b6633..19fea31 100644 --- a/vaults/diningroom.vlt +++ b/vaults/diningroom.vlt @@ -14,7 +14,8 @@ autopop ! tables & chairs scatter(1,1,-2,-2) ob:wooden table: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 ! mayrotate ! mayscale