- [+] when saying "learn a new spell/psionic power/etc", show your
maxmp in the prompt? - [+] manriki - throw it, tripand take time if you hit (and they fail a trip check withbig penalties, or if they're flying) - [+] f_tanglemissile - [+] throwing net (add f_sticky on hit) - [+] tweak throing accuracy - [+] shadowcats now only produce smoke puffs, not clouds - [+] giant fly corpse should be poisonous - initial work on climbing ability....
This commit is contained in:
parent
965fcdd4c0
commit
1222ee9550
37
data.c
37
data.c
|
@ -425,6 +425,7 @@ void initjobs(void) {
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_SEWING, NA, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_SEWING, NA, NA, NULL);
|
||||||
|
addflag(lastjob->flags, F_CANLEARN, SK_STAVES, NA, NA, NULL);
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_STEALTH, PR_ADEPT, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_STEALTH, PR_ADEPT, NA, NULL);
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_TECHUSAGE, PR_BEGINNER, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_TECHUSAGE, PR_BEGINNER, NA, NULL);
|
||||||
addflag(lastjob->flags, F_CANLEARN, SK_TWOWEAPON, NA, NA, NULL);
|
addflag(lastjob->flags, F_CANLEARN, SK_TWOWEAPON, NA, NA, NULL);
|
||||||
|
@ -3081,6 +3082,9 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_NEEDSGRAB, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_NEEDSGRAB, B_TRUE, NA, NA, NULL);
|
||||||
addot(OT_A_CHECKSTAIRS, "check stairs", "Attempt to determine what lies on the other end of a staircase.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
addot(OT_A_CHECKSTAIRS, "check stairs", "Attempt to determine what lies on the other end of a staircase.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
|
addot(OT_A_CLIMB, "climb wall", "Climb up a wall to escape your enemies.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
||||||
|
addflag(lastot->flags, F_STAMCOST, 2, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
addot(OT_A_COOK, "cook", "Combine food and water into a healthy meals.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
addot(OT_A_COOK, "cook", "Combine food and water into a healthy meals.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
addot(OT_A_DARKWALK, "darkwalk", "Step between the shadows.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
addot(OT_A_DARKWALK, "darkwalk", "Step between the shadows.", MT_NOTHING, 0, OC_ABILITY, SZ_TINY);
|
||||||
|
@ -4937,6 +4941,13 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_HITCONFER, F_ASLEEP, SC_CON, 27, "20-30");
|
addflag(lastot->flags, F_HITCONFER, F_ASLEEP, SC_CON, 27, "20-30");
|
||||||
addflag(lastot->flags, F_HITCONFERVALS, B_TRUE, ST_ASLEEP, NA, NULL);
|
addflag(lastot->flags, F_HITCONFERVALS, B_TRUE, ST_ASLEEP, NA, NULL);
|
||||||
|
|
||||||
|
addot(OT_MANRIKI, "manriki", "A pair of weights on the end of a metal chain, designed to entangle those at whom it is thrown.", MT_METAL, 0.1, OC_MISSILE, SZ_SMALL);
|
||||||
|
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_MISSILEDAM, 0, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL);
|
||||||
|
addflag(lastot->flags, F_TANGLEMISSILE, 26, 21, B_FALSE, NULL);
|
||||||
|
|
||||||
addot(OT_NEEDLE, "needle", "A tiny pointed needle.", MT_METAL, 0.02, OC_MISSILE, SZ_TINY);
|
addot(OT_NEEDLE, "needle", "A tiny pointed needle.", MT_METAL, 0.02, OC_MISSILE, SZ_TINY);
|
||||||
addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "It makes sewing easier.");
|
addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "It makes sewing easier.");
|
||||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
|
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
|
||||||
|
@ -4947,6 +4958,17 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 25, NA, NULL);
|
addflag(lastot->flags, F_CANHAVEOBMOD, OM_POISONED, 25, NA, NULL);
|
||||||
addflag(lastot->flags, F_RODSHAPED, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_RODSHAPED, B_TRUE, NA, NA, NULL);
|
||||||
|
|
||||||
|
addot(OT_NET, "throwing net", "A grid of strong cords, weighted at the edges. Made for throwing over a target.", MT_CLOTH, 3, OC_MISSILE, SZ_MEDIUM);
|
||||||
|
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_MISSILEDAM, 0, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, RR_UNCOMMON, NULL);
|
||||||
|
addflag(lastot->flags, F_NUMAPPEAR, 1, 2, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_TANGLEMISSILE, 33, 30, B_TRUE, NULL);
|
||||||
|
|
||||||
addot(OT_JAVELIN, "javelin", "A long, sharp missile weapon.", MT_METAL, 6, OC_MISSILE, SZ_MEDIUM);
|
addot(OT_JAVELIN, "javelin", "A long, sharp missile weapon.", MT_METAL, 6, OC_MISSILE, SZ_MEDIUM);
|
||||||
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
|
addflag(lastot->flags, F_STACKABLE, B_TRUE, NA, NA, "");
|
||||||
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
|
addflag(lastot->flags, F_THROWMISSILE, B_TRUE, NA, NA, "");
|
||||||
|
@ -6704,7 +6726,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL);
|
addflag(lastrace->flags, F_ALIGNMENT, AL_EVIL, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 95, NA, NULL);
|
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 95, NA, NULL);
|
||||||
addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_NUMAPPEAR, 1, 3, NA, "");
|
addflag(lastrace->flags, F_NUMAPPEAR, 1, 3, NA, "");
|
||||||
addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL);
|
addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4");
|
addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4");
|
||||||
|
@ -6731,7 +6753,7 @@ void initrace(void) {
|
||||||
|
|
||||||
addrace(R_TROGLODYTE, "troglodyte", 20, 'z', C_GREY, MT_FLESH, RC_HUMANOID, "Troglodytes are smaller, stunted lizardmen who at outcast at birth. They linger on the outskirts of society, scavenging garbage and living in their own filth.");
|
addrace(R_TROGLODYTE, "troglodyte", 20, 'z', C_GREY, MT_FLESH, RC_HUMANOID, "Troglodytes are smaller, stunted lizardmen who at outcast at birth. They linger on the outskirts of society, scavenging garbage and living in their own filth.");
|
||||||
addflag(lastrace->flags, F_COLDBLOOD, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_COLDBLOOD, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL);
|
addflag(lastrace->flags, F_SIZE, SZ_MEDIUM, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 78, NA, NULL);
|
addflag(lastrace->flags, F_RARITY, H_DUNGEON, 78, NA, NULL);
|
||||||
|
@ -7064,7 +7086,8 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "hisses^a hiss");
|
addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "hisses^a hiss");
|
||||||
addflag(lastrace->flags, F_SEEINDARK, 8, NA, NA, NULL);
|
addflag(lastrace->flags, F_SEEINDARK, 8, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_CANSEETHROUGHMAT, MT_GAS, NA, NA, NULL);
|
addflag(lastrace->flags, F_CANSEETHROUGHMAT, MT_GAS, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_AUTOCREATEOB, 1, NA, NA, "cloud of smoke");
|
addflag(lastrace->flags, F_AUTOCREATEOB, 1, NA, NA, "puff of smoke");
|
||||||
|
addflag(lastrace->flags, F_BLOODOB, NA, NA, NA, "puff of smoke");
|
||||||
addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL);
|
addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws");
|
addflag(lastrace->flags, F_BODYPARTNAME, BP_HANDS, NA, NA, "paws");
|
||||||
addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw");
|
addflag(lastrace->flags, F_BODYPARTNAME, BP_RIGHTFINGER, NA, NA, "right foreclaw");
|
||||||
|
@ -8180,7 +8203,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
||||||
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "1-10 webs");
|
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "1-10 webs");
|
||||||
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
||||||
|
@ -8210,7 +8233,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
||||||
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "20-30 webs");
|
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "20-30 webs");
|
||||||
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
||||||
|
@ -8240,7 +8263,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
addflag(lastrace->flags, F_DTVULN, DT_LIGHT, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_POISONOUS, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
addflag(lastrace->flags, F_HOMEOB, NA, NA, NA, "web");
|
||||||
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "10-20 webs");
|
addflag(lastrace->flags, F_HOMELEVOB, NA, NA, NA, "10-20 webs");
|
||||||
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
addflag(lastrace->flags, F_BODYPARTNAME, BP_HEAD, NA, NA, "cephalothorax");
|
||||||
|
@ -8323,6 +8346,7 @@ void initrace(void) {
|
||||||
lastrace->baseid = R_GIANTFLY;
|
lastrace->baseid = R_GIANTFLY;
|
||||||
addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
|
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
|
||||||
addflag(lastrace->flags, F_MOVESPEED, SP_VERYFAST, NA, NA, "");
|
addflag(lastrace->flags, F_MOVESPEED, SP_VERYFAST, NA, NA, "");
|
||||||
addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL);
|
addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL);
|
||||||
|
@ -8351,6 +8375,7 @@ void initrace(void) {
|
||||||
addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_INSECT, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
|
addflag(lastrace->flags, F_STARTATT, A_IQ, IQ_ANIMAL, NA, NULL);
|
||||||
|
addflag(lastrace->flags, F_POISONCORPSE, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "giant fly corpse");
|
addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "giant fly corpse");
|
||||||
addflag(lastrace->flags, F_MOVESPEED, SP_VERYFAST, NA, NA, "");
|
addflag(lastrace->flags, F_MOVESPEED, SP_VERYFAST, NA, NA, "");
|
||||||
addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL);
|
addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL);
|
||||||
|
|
BIN
data/hiscores.db
BIN
data/hiscores.db
Binary file not shown.
12
defs.h
12
defs.h
|
@ -1305,6 +1305,7 @@ enum OBTYPE {
|
||||||
// abilities
|
// abilities
|
||||||
OT_A_AIMEDSTRIKE,
|
OT_A_AIMEDSTRIKE,
|
||||||
OT_A_CHECKSTAIRS,
|
OT_A_CHECKSTAIRS,
|
||||||
|
OT_A_CLIMB,
|
||||||
OT_A_COOK,
|
OT_A_COOK,
|
||||||
OT_A_DARKWALK,
|
OT_A_DARKWALK,
|
||||||
OT_A_DISARM, // disarm a trap
|
OT_A_DISARM, // disarm a trap
|
||||||
|
@ -1569,7 +1570,9 @@ enum OBTYPE {
|
||||||
OT_DART,
|
OT_DART,
|
||||||
OT_DARTNANO,
|
OT_DARTNANO,
|
||||||
OT_DARTTRANQ,
|
OT_DARTTRANQ,
|
||||||
|
OT_MANRIKI,
|
||||||
OT_NEEDLE,
|
OT_NEEDLE,
|
||||||
|
OT_NET,
|
||||||
OT_JAVELIN,
|
OT_JAVELIN,
|
||||||
OT_BULLET,
|
OT_BULLET,
|
||||||
OT_RUBBERBULLET,
|
OT_RUBBERBULLET,
|
||||||
|
@ -2020,6 +2023,11 @@ enum FLAG {
|
||||||
F_DAM, // v0 = damtype,
|
F_DAM, // v0 = damtype,
|
||||||
// v1=DR (this takes precedence)
|
// v1=DR (this takes precedence)
|
||||||
F_MISSILEDAM, // val0 = dam if it hits (without speed multiplier)
|
F_MISSILEDAM, // val0 = dam if it hits (without speed multiplier)
|
||||||
|
F_TANGLEMISSILE, // this object will trip anyone it is thrown at
|
||||||
|
// (if it hits), unless they pass a SC_SLIP
|
||||||
|
// check of difficulty v0
|
||||||
|
// if V1/V2 are set, then F_RESTRICTMOVEMENT
|
||||||
|
// v1->v0, v2->v1 is added to this object after it hits.
|
||||||
F_ACCURACY, // 100 - val0 = modify to tohit% (ie. higher is better)
|
F_ACCURACY, // 100 - val0 = modify to tohit% (ie. higher is better)
|
||||||
F_UNARMEDWEP, // this is not a real weapon, ie. claws, teeth etc
|
F_UNARMEDWEP, // this is not a real weapon, ie. claws, teeth etc
|
||||||
F_ARMOURPIERCE, // goes through armour
|
F_ARMOURPIERCE, // goes through armour
|
||||||
|
@ -2124,6 +2132,7 @@ enum FLAG {
|
||||||
F_PRAYEDTO, // player has prayed to this god before.
|
F_PRAYEDTO, // player has prayed to this god before.
|
||||||
F_GAVEMONEY, // v0 tracks how much money we gave away this turn
|
F_GAVEMONEY, // v0 tracks how much money we gave away this turn
|
||||||
// used for r_godgreed anger effects.
|
// used for r_godgreed anger effects.
|
||||||
|
F_CLIMBING, // lf is currently climbing a wall
|
||||||
F_COUNTER, // generic counter flag for race abilities.
|
F_COUNTER, // generic counter flag for race abilities.
|
||||||
F_DEBUG, // debugging enabled
|
F_DEBUG, // debugging enabled
|
||||||
F_ACCURACYMOD, // modify your accuracy by val0
|
F_ACCURACYMOD, // modify your accuracy by val0
|
||||||
|
@ -2385,7 +2394,7 @@ enum FLAG {
|
||||||
F_NOPACK, // this race cannot hold objects
|
F_NOPACK, // this race cannot hold objects
|
||||||
F_NOSPELLS, // this race cannot cast spells
|
F_NOSPELLS, // this race cannot cast spells
|
||||||
F_INDUCEFEAR, // causes fear when you attack it
|
F_INDUCEFEAR, // causes fear when you attack it
|
||||||
F_POISONOUS, // lf's corpse will be poisonous
|
F_POISONCORPSE, // lf's corpse will be poisonous
|
||||||
F_AUTOCREATEOB, // produces obtype 'text' wherever it walks, v0=radius
|
F_AUTOCREATEOB, // produces obtype 'text' wherever it walks, v0=radius
|
||||||
// (only if ob of that type not already there)
|
// (only if ob of that type not already there)
|
||||||
F_PACKATTACK, // deal v0 extra damage of type v1 if there are
|
F_PACKATTACK, // deal v0 extra damage of type v1 if there are
|
||||||
|
@ -2732,6 +2741,7 @@ enum ERROR {
|
||||||
E_NOUNARMEDATTACK,
|
E_NOUNARMEDATTACK,
|
||||||
E_NOTEQUIPPED,
|
E_NOTEQUIPPED,
|
||||||
E_NOPICKUP,
|
E_NOPICKUP,
|
||||||
|
E_STUCK,
|
||||||
E_MONSTERNEARBY,
|
E_MONSTERNEARBY,
|
||||||
E_NOEFFECT,
|
E_NOEFFECT,
|
||||||
E_FAILED,
|
E_FAILED,
|
||||||
|
|
63
io.c
63
io.c
|
@ -641,7 +641,7 @@ cell_t *askcoords(char *prompt, char *subprompt, int targettype, lifeform_t *src
|
||||||
if (cansee(player, c->lf)) {
|
if (cansee(player, c->lf)) {
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
object_t *wep,*o;
|
object_t *wep,*o;
|
||||||
char extrainfo[BUFLEN];
|
char extrainfo[BIGBUFLEN];
|
||||||
strcpy(extrainfo, "");
|
strcpy(extrainfo, "");
|
||||||
getlfnamea(c->lf, buf);
|
getlfnamea(c->lf, buf);
|
||||||
if (lfhasflag(c->lf, F_NAME)) {
|
if (lfhasflag(c->lf, F_NAME)) {
|
||||||
|
@ -733,6 +733,11 @@ cell_t *askcoords(char *prompt, char *subprompt, int targettype, lifeform_t *src
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lfhasflag(c->lf, F_CLIMBING)) {
|
||||||
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
|
strcat(extrainfo, "climbing");
|
||||||
|
}
|
||||||
|
|
||||||
f = lfhasflag(c->lf, F_ATTACHEDTO);
|
f = lfhasflag(c->lf, F_ATTACHEDTO);
|
||||||
if (lfhasflag(c->lf, F_ATTACHEDTO)) {
|
if (lfhasflag(c->lf, F_ATTACHEDTO)) {
|
||||||
lifeform_t *alf;
|
lifeform_t *alf;
|
||||||
|
@ -747,6 +752,16 @@ cell_t *askcoords(char *prompt, char *subprompt, int targettype, lifeform_t *src
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
o = isstuck(c->lf);
|
||||||
|
if (o) {
|
||||||
|
char obname[BUFLEN];
|
||||||
|
char buf2[BUFLEN];
|
||||||
|
real_getobname(o, obname, o->amt, B_FALSE, B_FALSE, B_TRUE, B_FALSE, B_FALSE);
|
||||||
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
|
snprintf(buf2, BUFLEN, "stuck in %s",obname);
|
||||||
|
strcat(extrainfo, buf2);
|
||||||
|
}
|
||||||
|
|
||||||
if ((getallegiance(c->lf) == AL_HOSTILE) &&
|
if ((getallegiance(c->lf) == AL_HOSTILE) &&
|
||||||
(getlorelevel(player, c->lf->race->raceclass->id) >= PR_ADEPT)) {
|
(getlorelevel(player, c->lf->race->raceclass->id) >= PR_ADEPT)) {
|
||||||
char dangerbuf[BUFLEN];
|
char dangerbuf[BUFLEN];
|
||||||
|
@ -773,17 +788,8 @@ cell_t *askcoords(char *prompt, char *subprompt, int targettype, lifeform_t *src
|
||||||
strcat(extrainfo, dangerbuf);
|
strcat(extrainfo, dangerbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
o = isstuck(c->lf);
|
|
||||||
if (o) {
|
|
||||||
char buf2[BUFLEN];
|
|
||||||
char obname[BUFLEN];
|
|
||||||
|
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
|
||||||
getobname(o, obname, o->amt);
|
|
||||||
snprintf(buf2, BUFLEN, "stuck in %s", obname);
|
|
||||||
strcat(extrainfo, buf2);
|
|
||||||
}
|
|
||||||
// hp
|
// hp
|
||||||
|
if (!isplayer(c->lf)) {
|
||||||
if (isgenius(player) || (getseenlfconditioncutoff(player) == C_HEALTHY) ||
|
if (isgenius(player) || (getseenlfconditioncutoff(player) == C_HEALTHY) ||
|
||||||
(getlorelevel(player, c->lf->race->raceclass->id) >= PR_SKILLED)
|
(getlorelevel(player, c->lf->race->raceclass->id) >= PR_SKILLED)
|
||||||
) {
|
) {
|
||||||
|
@ -801,6 +807,7 @@ cell_t *askcoords(char *prompt, char *subprompt, int targettype, lifeform_t *src
|
||||||
strcat(extrainfo, buf2);
|
strcat(extrainfo, buf2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (lfhasflag(c->lf, F_HOLYAURA)) {
|
if (lfhasflag(c->lf, F_HOLYAURA)) {
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
|
@ -9455,6 +9462,10 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
snprintf(buf, BUFLEN,"%s %s attached to %s.",you(lf), is(lf), grabeename);
|
snprintf(buf, BUFLEN,"%s %s attached to %s.",you(lf), is(lf), grabeename);
|
||||||
wrapprint(mainwin, &y, &x, "%s ", buf);
|
wrapprint(mainwin, &y, &x, "%s ", buf);
|
||||||
}
|
}
|
||||||
|
f = lfhasknownflag(lf, F_CLIMBING);
|
||||||
|
if (f && (f->known)) {
|
||||||
|
wrapprint(mainwin, &y, &x, "%s %s climbing on a wall. ", you(lf), is(lf));
|
||||||
|
}
|
||||||
f = lfhasknownflag(lf, F_FASTMETAB);
|
f = lfhasknownflag(lf, F_FASTMETAB);
|
||||||
if (f && (f->known)) {
|
if (f && (f->known)) {
|
||||||
wrapprint(mainwin, &y, &x, "%s metabolic rate has been increased. ", your(lf), getpossessive(you(lf)));
|
wrapprint(mainwin, &y, &x, "%s metabolic rate has been increased. ", your(lf), getpossessive(you(lf)));
|
||||||
|
@ -9697,42 +9708,19 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
|
|
||||||
} else if (mode == 's') {
|
} else if (mode == 's') {
|
||||||
char skilltitle[BUFLEN];
|
char skilltitle[BUFLEN];
|
||||||
flag_t *known[MAXSKILLS], *available[MAXSKILLS];
|
|
||||||
int numknown = 0, numavailable = 0;
|
|
||||||
int n;
|
|
||||||
enum SKILLLEVEL slev;
|
enum SKILLLEVEL slev;
|
||||||
skill_t *sk;
|
skill_t *sk;
|
||||||
int finished = B_FALSE,dounknown;
|
int finished = B_FALSE,dounknown;
|
||||||
|
|
||||||
centre(mainwin, C_WHITE, 0, "SKILLS");
|
centre(mainwin, C_WHITE, 0, "SKILLS");
|
||||||
|
|
||||||
/*
|
|
||||||
// get available skills
|
|
||||||
for (f = lf->flags->first ; f ; f = f->next) {
|
|
||||||
if (f->id == F_CANLEARN) {
|
|
||||||
if (!getskill(lf, f->val[0])) {
|
|
||||||
available[numavailable++] = f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// get known skills, in order
|
|
||||||
for (slev = PR_MASTER ; slev >= PR_NOVICE; slev--) {
|
|
||||||
for (f = lf->flags->first ; f ; f = f->next) {
|
|
||||||
if ((f->id == F_HASSKILL) && (f->val[1] == slev)) {
|
|
||||||
known[numknown++] = f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
y = 2;
|
y = 2;
|
||||||
|
|
||||||
snprintf(skilltitle, BUFLEN, "%-21s"," ");
|
snprintf(skilltitle, BUFLEN, "%-21s"," ");
|
||||||
for (i = PR_NOVICE; i <= PR_MASTER; i++) {
|
for (i = PR_NOVICE; i <= PR_MASTER; i++) {
|
||||||
char toadd[BUFLEN], *sn;
|
char toadd[BUFLEN], *sn;
|
||||||
int prepad,postpad,n;
|
int prepad,postpad,n;
|
||||||
// construct "|xxxxxxxx"
|
// construct: "|xxxxxxxx"
|
||||||
// ie "|Beginner"
|
// ie "|Beginner"
|
||||||
// ie "| Inept "
|
// ie "| Inept "
|
||||||
sn = getskilllevelname(i);
|
sn = getskilllevelname(i);
|
||||||
|
@ -9757,7 +9745,9 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
slev = getskill(lf, sk->id);
|
slev = getskill(lf, sk->id);
|
||||||
if (!dounknown && (slev != PR_INEPT)) {
|
if (!dounknown && (slev != PR_INEPT)) {
|
||||||
// known skill
|
// known skill
|
||||||
sprintf(thisline, "%-21s[^%d", sk->name, getskilllevelcolour(slev));
|
sprintf(thisline, "^%c%-21s^n[^%d",
|
||||||
|
ismaxedskill(lf, sk->id) ? 'h' : 'n',
|
||||||
|
sk->name, getskilllevelcolour(slev));
|
||||||
for (i = PR_NOVICE; i <= PR_MASTER; i++) {
|
for (i = PR_NOVICE; i <= PR_MASTER; i++) {
|
||||||
char toadd[BUFLEN];
|
char toadd[BUFLEN];
|
||||||
|
|
||||||
|
@ -9815,7 +9805,6 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
|
|
||||||
centre(mainwin, C_WHITE, y, "MAGIC"); y += 2;
|
centre(mainwin, C_WHITE, y, "MAGIC"); y += 2;
|
||||||
doheading(mainwin, &y, 0, subheading);
|
doheading(mainwin, &y, 0, subheading);
|
||||||
//if (!isplayer(lf)) {
|
|
||||||
// show spells monster can cast using mp
|
// show spells monster can cast using mp
|
||||||
for (lev = 0; (lev <= 9) && !exitnow; lev++) {
|
for (lev = 0; (lev <= 9) && !exitnow; lev++) {
|
||||||
for (ot = objecttype ; ot && !exitnow ; ot = ot->next) {
|
for (ot = objecttype ; ot && !exitnow ; ot = ot->next) {
|
||||||
|
|
97
lf.c
97
lf.c
|
@ -792,6 +792,10 @@ int canpickup(lifeform_t *lf, object_t *o, int amt) {
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
if (lf) {
|
if (lf) {
|
||||||
|
if (isstuck(lf) == o) {
|
||||||
|
reason = E_STUCK;
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
if (getobsize(o) > getlfsize(lf)) {
|
if (getobsize(o) > getlfsize(lf)) {
|
||||||
reason = E_TOOBIG;
|
reason = E_TOOBIG;
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
|
@ -1561,8 +1565,8 @@ int celltransparentfor(lifeform_t *lf, cell_t *c, int *xray, int *rangemod) {
|
||||||
|
|
||||||
if (rangemod) *rangemod = 0;
|
if (rangemod) *rangemod = 0;
|
||||||
|
|
||||||
// solid cells stop los
|
// solid cells stop los (unless it's your own cell)
|
||||||
if (!c->type->transparent) {
|
if (!c->type->transparent && (c != lf->cell)) {
|
||||||
if (xray && *xray) {
|
if (xray && *xray) {
|
||||||
(*xray)--;
|
(*xray)--;
|
||||||
} else return B_FALSE;
|
} else return B_FALSE;
|
||||||
|
@ -2193,7 +2197,7 @@ void die(lifeform_t *lf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// tainted?
|
// tainted?
|
||||||
if ((lf->lastdamtype == DT_POISONGAS) || lfhasflag(lf, F_POISONOUS) || lfhasflag(lf, F_POISONED)) {
|
if ((lf->lastdamtype == DT_POISONGAS) || lfhasflag(lf, F_POISONCORPSE) || lfhasflag(lf, F_POISONED)) {
|
||||||
addflag(corpse->flags, F_TAINTED, B_TRUE, NA, NA, NULL);
|
addflag(corpse->flags, F_TAINTED, B_TRUE, NA, NA, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3281,8 +3285,10 @@ void enhanceskills(lifeform_t *lf) {
|
||||||
} else if (f->id == F_LEVSPELLSCHOOL) { // select a spell from school
|
} else if (f->id == F_LEVSPELLSCHOOL) { // select a spell from school
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
int done = B_FALSE;
|
int done = B_FALSE;
|
||||||
|
char qbuf[BUFLEN];
|
||||||
|
sprintf(qbuf, "Learn which new spell (maxmp=%d):", getmaxmp(player));
|
||||||
while (!done) {
|
while (!done) {
|
||||||
makespellchoicelist(&prompt, player, "Learn which new spell:","Describe which spell:", f->val[1], B_TRUE, B_FALSE, B_FALSE, player->maxmp);
|
makespellchoicelist(&prompt, player, qbuf, "Describe which spell:", f->val[1], B_TRUE, B_FALSE, B_FALSE, player->maxmp);
|
||||||
if (prompt.nchoices > 0) {
|
if (prompt.nchoices > 0) {
|
||||||
objecttype_t *ot;
|
objecttype_t *ot;
|
||||||
getchoicestr(&prompt, B_TRUE, B_TRUE);
|
getchoicestr(&prompt, B_TRUE, B_TRUE);
|
||||||
|
@ -3415,8 +3421,10 @@ void enhanceskills(lifeform_t *lf) {
|
||||||
// psionics sometimes lets you learn spells
|
// psionics sometimes lets you learn spells
|
||||||
slev = getskill(lf, SK_SS_MENTAL);
|
slev = getskill(lf, SK_SS_MENTAL);
|
||||||
if (pctchance(slev*20)) {
|
if (pctchance(slev*20)) {
|
||||||
|
char qbuf[BUFLEN];
|
||||||
|
sprintf(qbuf, "Learn which psionic power (maxmp=%d):", getmaxmp(player));
|
||||||
// construct list of castable mental spells
|
// construct list of castable mental spells
|
||||||
makespellchoicelist(&prompt, lf, "Learn which new psionic power:","Describe which psionic power:", SS_MENTAL, B_TRUE, B_FALSE, B_FALSE, player->maxmp);
|
makespellchoicelist(&prompt, lf, qbuf, "Describe which psionic power:", SS_MENTAL, B_TRUE, B_FALSE, B_FALSE, player->maxmp);
|
||||||
if (prompt.nchoices > 0) {
|
if (prompt.nchoices > 0) {
|
||||||
objecttype_t *ot;
|
objecttype_t *ot;
|
||||||
msg("Your brain has unlocked a new psionic power!"); more();
|
msg("Your brain has unlocked a new psionic power!"); more();
|
||||||
|
@ -7726,6 +7734,12 @@ flag_t *giveskill(lifeform_t *lf, enum SKILL id) {
|
||||||
newf = addflag(lf->flags, F_CANWILL, OT_A_SPRINT, NA, NA, NULL);
|
newf = addflag(lf->flags, F_CANWILL, OT_A_SPRINT, NA, NA, NULL);
|
||||||
newf->lifetime = FROMSKILL;
|
newf->lifetime = FROMSKILL;
|
||||||
}
|
}
|
||||||
|
} else if (id == SK_CLIMBING) {
|
||||||
|
newf = hasflagval(lf->flags, F_CANWILL, OT_A_CLIMB, NA, NA, NULL);
|
||||||
|
if (!newf) {
|
||||||
|
newf = addflag(lf->flags, F_CANWILL, OT_A_CLIMB, NA, NA, NULL);
|
||||||
|
newf->lifetime = FROMSKILL;
|
||||||
|
}
|
||||||
} else if (id == SK_COOKING) {
|
} else if (id == SK_COOKING) {
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
makeknown(OT_POT_WATER);
|
makeknown(OT_POT_WATER);
|
||||||
|
@ -8902,7 +8916,8 @@ int haslos(lifeform_t *viewer, cell_t *dest) {
|
||||||
|
|
||||||
// can't see when you're dead UNLESS you are the player. this is
|
// can't see when you're dead UNLESS you are the player. this is
|
||||||
// to prevent the screen from going black when "You die" appears.
|
// to prevent the screen from going black when "You die" appears.
|
||||||
if (isdead(viewer) && !isplayer(viewer)) return B_FALSE;
|
//if (isdead(viewer) && !isplayer(viewer)) return B_FALSE;
|
||||||
|
if (lfhasflag(viewer, F_DEAD) && !isplayer(viewer)) return B_FALSE;
|
||||||
|
|
||||||
|
|
||||||
if (viewer->losdirty) {
|
if (viewer->losdirty) {
|
||||||
|
@ -9106,6 +9121,13 @@ int ischarmable(lifeform_t *lf) {
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isclimbing(lifeform_t *lf) {
|
||||||
|
if (hasflag(lf->flags, F_CLIMBING)) {
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
int isdead(lifeform_t *lf) {
|
int isdead(lifeform_t *lf) {
|
||||||
if (!lf->alive) return B_TRUE;
|
if (!lf->alive) return B_TRUE;
|
||||||
if (lf->hp <= 0) return B_TRUE;
|
if (lf->hp <= 0) return B_TRUE;
|
||||||
|
@ -11688,6 +11710,9 @@ int pickup(lifeform_t *lf, object_t *what, int howmany, int fromground, int want
|
||||||
case E_NOPACK:
|
case E_NOPACK:
|
||||||
msg("You lack the ability to carry things!");
|
msg("You lack the ability to carry things!");
|
||||||
break;
|
break;
|
||||||
|
case E_STUCK:
|
||||||
|
msg("You can't pick up %s while caught in it!",obname);
|
||||||
|
break;
|
||||||
case E_NOPICKUP:
|
case E_NOPICKUP:
|
||||||
msg("You can't pick up %s!",obname);
|
msg("You can't pick up %s!",obname);
|
||||||
break;
|
break;
|
||||||
|
@ -12253,7 +12278,15 @@ void relinklf(lifeform_t *src, map_t *dst) {
|
||||||
sortlf(dst, src);
|
sortlf(dst, src);
|
||||||
}
|
}
|
||||||
|
|
||||||
// strat resting...
|
int startclimbing(lifeform_t *lf, cell_t *where) {
|
||||||
|
int dir;
|
||||||
|
dir = getdirtowards(lf->cell, where, lf, B_FALSE, DT_ORTH);
|
||||||
|
movelf(lf, where);
|
||||||
|
setfacing(lf, diropposite(dir));
|
||||||
|
addflag(lf->flags, F_CLIMBING, B_TRUE, NA, NA, NULL);
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
int startresting(lifeform_t *lf, int willtrain) {
|
int startresting(lifeform_t *lf, int willtrain) {
|
||||||
int traincounter;
|
int traincounter;
|
||||||
|
|
||||||
|
@ -12649,8 +12682,8 @@ void setattr(lifeform_t *lf, enum ATTRIB attr, int val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int setfacing(lifeform_t *lf, int dir) {
|
int setfacing(lifeform_t *lf, int dir) {
|
||||||
if (dir == D_NONE) {
|
if (isclimbing(lf)) { // can't change dir while climbing
|
||||||
dblog("xxx");
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
if (lf->facing == dir) { // already facing that way
|
if (lf->facing == dir) { // already facing that way
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
|
@ -13533,7 +13566,7 @@ void startlfturn(lifeform_t *lf) {
|
||||||
|
|
||||||
// stuck inside solid cells?
|
// stuck inside solid cells?
|
||||||
if (!cellwalkable(lf, lf->cell, &error)) {
|
if (!cellwalkable(lf, lf->cell, &error)) {
|
||||||
if (error == E_WALLINWAY) {
|
if ((error == E_WALLINWAY) && !isclimbing(lf)) {
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
msg("You reintegrate inside a solid object!");
|
msg("You reintegrate inside a solid object!");
|
||||||
}
|
}
|
||||||
|
@ -14174,7 +14207,7 @@ void startlfturn(lifeform_t *lf) {
|
||||||
if (isdead(lf)) return;
|
if (isdead(lf)) return;
|
||||||
|
|
||||||
|
|
||||||
getflags(lf->flags, retflag, &nretflags, F_ATTACHEDTO, F_CANWILL, F_CHARMEDBY, F_FLEEFROM,
|
getflags(lf->flags, retflag, &nretflags, F_ATTACHEDTO, F_CANWILL, F_CHARMEDBY, F_CLIMBING, F_FLEEFROM,
|
||||||
F_GRABBEDBY, F_GRABBING, F_BOOSTSPELL, F_FEIGNINGDEATH, F_INJURY,
|
F_GRABBEDBY, F_GRABBING, F_BOOSTSPELL, F_FEIGNINGDEATH, F_INJURY,
|
||||||
F_NOFLEEFROM, F_PETOF, F_SPOTTED, F_STABBEDBY, F_TARGETCELL, F_TARGETLF, F_NONE);
|
F_NOFLEEFROM, F_PETOF, F_SPOTTED, F_STABBEDBY, F_TARGETCELL, F_TARGETLF, F_NONE);
|
||||||
for (i = 0; i < nretflags; i++) {
|
for (i = 0; i < nretflags; i++) {
|
||||||
|
@ -14252,6 +14285,12 @@ void startlfturn(lifeform_t *lf) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (f->id == F_CLIMBING) {
|
||||||
|
if (!lf->cell->type->solid) {
|
||||||
|
killflag(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((f->id == F_CHARMEDBY) ||
|
if ((f->id == F_CHARMEDBY) ||
|
||||||
(f->id == F_PETOF) ||
|
(f->id == F_PETOF) ||
|
||||||
(f->id == F_FLEEFROM) ||
|
(f->id == F_FLEEFROM) ||
|
||||||
|
@ -14462,6 +14501,42 @@ void stopeating(lifeform_t *lf) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stopclimbing(lifeform_t *lf, int onpurpose) {
|
||||||
|
cell_t *c;
|
||||||
|
char lfname[BUFLEN];
|
||||||
|
getlfname(lf, lfname);
|
||||||
|
if (!onpurpose) {
|
||||||
|
if (isplayer(lf)) {
|
||||||
|
msg("You fall off %s!", lf->cell->type->name);
|
||||||
|
} else if (cansee(player, lf)) {
|
||||||
|
msg("%s falls off %s!", lfname, lf->cell->type->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c = getcellindir(lf->cell, lf->facing);
|
||||||
|
if (!cellwalkable(lf, c, NULL)) {
|
||||||
|
if (onpurpose) {
|
||||||
|
if (isplayer(lf)) {
|
||||||
|
msg("There is no room for you to stop climbing!");
|
||||||
|
}
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
// if not on purpose, try to find another cell
|
||||||
|
c = getrandomadjcell(c, WE_WALKABLE, B_ALLOWEXPAND);
|
||||||
|
if (!c) {
|
||||||
|
if (isplayer(lf)) {
|
||||||
|
msg("Luckily, there is no room for you to fall.");
|
||||||
|
}
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
movelf(lf, c);
|
||||||
|
killflagsofid(lf->flags, F_CLIMBING);
|
||||||
|
if (!onpurpose) {
|
||||||
|
fall(lf, NULL, B_TRUE);
|
||||||
|
}
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void stopresting(lifeform_t *lf) {
|
void stopresting(lifeform_t *lf) {
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
|
|
||||||
|
|
3
lf.h
3
lf.h
|
@ -261,6 +261,7 @@ int isbleeding(lifeform_t *lf);
|
||||||
int isblind(lifeform_t *lf);
|
int isblind(lifeform_t *lf);
|
||||||
enum BURDENED isburdened(lifeform_t *lf);
|
enum BURDENED isburdened(lifeform_t *lf);
|
||||||
int ischarmable(lifeform_t *lf);
|
int ischarmable(lifeform_t *lf);
|
||||||
|
int isclimbing(lifeform_t *lf);
|
||||||
int isdead(lifeform_t *lf);
|
int isdead(lifeform_t *lf);
|
||||||
int isdeaf(lifeform_t *lf);
|
int isdeaf(lifeform_t *lf);
|
||||||
object_t *isdualweilding(lifeform_t *lf);
|
object_t *isdualweilding(lifeform_t *lf);
|
||||||
|
@ -339,6 +340,7 @@ int recruit(lifeform_t *lf);
|
||||||
void refreshlevelabilities(lifeform_t *lf);
|
void refreshlevelabilities(lifeform_t *lf);
|
||||||
void relinklf(lifeform_t *src, map_t *dst);
|
void relinklf(lifeform_t *src, map_t *dst);
|
||||||
int rest(lifeform_t *lf, int onpurpose);
|
int rest(lifeform_t *lf, int onpurpose);
|
||||||
|
int startclimbing(lifeform_t *lf, cell_t *where);
|
||||||
int startresting(lifeform_t *lf, int willtrain);
|
int startresting(lifeform_t *lf, int willtrain);
|
||||||
int rollattr(enum ATTRBRACKET bracket);
|
int rollattr(enum ATTRBRACKET bracket);
|
||||||
int rollstat(lifeform_t *lf, enum ATTRIB attr);
|
int rollstat(lifeform_t *lf, enum ATTRIB attr);
|
||||||
|
@ -367,6 +369,7 @@ void sortlf(map_t *map, lifeform_t *lf);
|
||||||
void startlfturn(lifeform_t *lf);
|
void startlfturn(lifeform_t *lf);
|
||||||
int steal(lifeform_t *lf, obpile_t *op, enum FLAG wantflag);
|
int steal(lifeform_t *lf, obpile_t *op, enum FLAG wantflag);
|
||||||
int stone(lifeform_t *lf);
|
int stone(lifeform_t *lf);
|
||||||
|
int stopclimbing(lifeform_t *lf, int onpurpose);
|
||||||
void stopeating(lifeform_t *lf);
|
void stopeating(lifeform_t *lf);
|
||||||
void stopresting(lifeform_t *lf);
|
void stopresting(lifeform_t *lf);
|
||||||
void stoprunning(lifeform_t *lf);
|
void stoprunning(lifeform_t *lf);
|
||||||
|
|
3
move.c
3
move.c
|
@ -2059,7 +2059,7 @@ int initiatemove(lifeform_t *lf, cell_t *cell, int *didmsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
getlfname(lf,lfname);
|
getlfname(lf,lfname);
|
||||||
getobname(o, buf, o->amt);
|
real_getobname(o, buf, o->amt, B_FALSE, B_FALSE, B_TRUE, B_FALSE, B_FALSE);
|
||||||
|
|
||||||
// for stacks of sticky objects, each one after the first adds
|
// for stacks of sticky objects, each one after the first adds
|
||||||
// quarter its difficuly. ie:
|
// quarter its difficuly. ie:
|
||||||
|
@ -2341,6 +2341,7 @@ int trymove(lifeform_t *lf, int dir, int onpurpose, int strafe) {
|
||||||
|
|
||||||
reldir = getrelativedir(lf, dir);
|
reldir = getrelativedir(lf, dir);
|
||||||
|
|
||||||
|
if (isclimbing(lf)) strafe = B_TRUE;
|
||||||
|
|
||||||
if (onpurpose) {
|
if (onpurpose) {
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
|
|
83
objects.c
83
objects.c
|
@ -6612,9 +6612,18 @@ void makewet(object_t *o, int amt) {
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// get wet
|
// get wet
|
||||||
if (haslos(player, loc) && !isdead(player)) {
|
if (!isdead(player)) {
|
||||||
|
int doannounce = B_FALSE;
|
||||||
|
if (owner) {
|
||||||
|
if (cansee(player, owner)) doannounce = B_TRUE;
|
||||||
|
} else {
|
||||||
|
if (haslos(player, loc)) doannounce = B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doannounce) {
|
||||||
msg("%s get%s wet.",obnamefull, (o->amt == 1) ? "s" : "");
|
msg("%s get%s wet.",obnamefull, (o->amt == 1) ? "s" : "");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
f = addflag(o->flags, F_WET, amt, TM_WETTIME, NA, NULL);
|
f = addflag(o->flags, F_WET, amt, TM_WETTIME, NA, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10263,7 +10272,7 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
char throwverbpres[BUFLEN];
|
char throwverbpres[BUFLEN];
|
||||||
int acc,myroll;
|
int acc,myroll;
|
||||||
int youhit = B_FALSE;
|
int youhit = B_FALSE;
|
||||||
int missiledam = 0;
|
int missiledam = 0; // how much damage the missile itself will take
|
||||||
object_t *newob = NULL;
|
object_t *newob = NULL;
|
||||||
cell_t *newloc;
|
cell_t *newloc;
|
||||||
int db = B_TRUE;
|
int db = B_TRUE;
|
||||||
|
@ -10671,7 +10680,16 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
} else if (!lfhasflag(target, F_CASTINGSPELL) && skillcheck(target, SC_DODGE, 7*speed, dodgemod)) {
|
} else if (!lfhasflag(target, F_CASTINGSPELL) && skillcheck(target, SC_DODGE, 7*speed, dodgemod)) {
|
||||||
// then check if we dodge it...
|
// then check if we dodge it...
|
||||||
if (db) dblog("target passed dodge check.");
|
if (db) dblog("target passed dodge check.");
|
||||||
|
|
||||||
youhit = B_FALSE;
|
youhit = B_FALSE;
|
||||||
|
if (seen) {
|
||||||
|
if (isplayer(target)) {
|
||||||
|
msg("You dodge %s.", obname);
|
||||||
|
} else {
|
||||||
|
msg("%s dodges %s.", targetname, obname);
|
||||||
|
}
|
||||||
|
announcedmiss = B_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10712,7 +10730,9 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
int dam = 0;
|
int dam = 0;
|
||||||
char damstring[BUFLEN];
|
char damstring[BUFLEN];
|
||||||
int reduceamt = 0;
|
int reduceamt = 0;
|
||||||
|
int willtangle = B_FALSE;
|
||||||
int throwdam;
|
int throwdam;
|
||||||
|
flag_t *f;
|
||||||
|
|
||||||
op = addobpile(NOOWNER, NOLOC, NULL);
|
op = addobpile(NOOWNER, NOLOC, NULL);
|
||||||
|
|
||||||
|
@ -10739,10 +10759,24 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
shattered = B_TRUE;
|
shattered = B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// will the missile trip them over?
|
||||||
|
f = hasflag(o->flags, F_TANGLEMISSILE);
|
||||||
|
if (f) {
|
||||||
|
if (isairborne(target) || !skillcheck(target, SC_SLIP, f->val[0], 0)) {
|
||||||
|
willtangle = B_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// announce
|
// announce
|
||||||
if (seen) {
|
if (seen) {
|
||||||
char buf2[BUFLEN];
|
char buf2[BUFLEN];
|
||||||
snprintf(buf2, BUFLEN, "%s hit%s %s.",obname,(amt == 1) ? "s" : "", targetname);
|
char verb[BUFLEN];
|
||||||
|
if (willtangle) {
|
||||||
|
sprintf(verb, "wrap%s around", (amt == 1) ? "s" : "");
|
||||||
|
} else {
|
||||||
|
sprintf(verb, "hit%s", (amt == 1) ? "s" : "");
|
||||||
|
}
|
||||||
|
snprintf(buf2, BUFLEN, "%s %s %s.",obname, verb, targetname);
|
||||||
if (lfhasflag(player, F_EXTRAINFO)) {
|
if (lfhasflag(player, F_EXTRAINFO)) {
|
||||||
char damstring[BUFLEN];
|
char damstring[BUFLEN];
|
||||||
snprintf(damstring, BUFLEN, " [%d dmg]",dam);
|
snprintf(damstring, BUFLEN, " [%d dmg]",dam);
|
||||||
|
@ -10774,6 +10808,32 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
|
|
||||||
missiledam += ((speed*2)+1);
|
missiledam += ((speed*2)+1);
|
||||||
|
|
||||||
|
if (willtangle) {
|
||||||
|
missiledam = 0; // don't damage the misisle
|
||||||
|
|
||||||
|
fall(target, NULL, B_TRUE);
|
||||||
|
taketime(target, getactspeed(target));
|
||||||
|
|
||||||
|
if (f->val[1] != NA) {
|
||||||
|
addflag(o->flags, F_RESTRICTMOVEMENT, f->val[1], f->val[2], B_FALSE, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
f = hasflag(o->flags, F_TANGLEMISSILE);
|
||||||
|
if (f) {
|
||||||
|
missiledam = 0;
|
||||||
|
if (isairborne(target) || !skillcheck(target, SC_SLIP, f->val[0], 0)) {
|
||||||
|
fall(target, NULL, B_TRUE);
|
||||||
|
taketime(target, getactspeed(target)*2);
|
||||||
|
|
||||||
|
if (f->val[1] != NA) {
|
||||||
|
addflag(o->flags, F_RESTRICTMOVEMENT, f->val[1], f->val[2], B_FALSE, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (thrower) {
|
if (thrower) {
|
||||||
if (firearm) {
|
if (firearm) {
|
||||||
practice(thrower, SK_THROWING, 1);
|
practice(thrower, SK_THROWING, 1);
|
||||||
|
@ -10981,6 +11041,14 @@ void timeeffectsob(object_t *o) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasflag(o->flags, F_TANGLEMISSILE)) {
|
||||||
|
if (!location || !location->lf) {
|
||||||
|
// thrown entangling weapons lose their "stickiness"
|
||||||
|
// once the target escapes
|
||||||
|
killflagsofid(o->flags, F_RESTRICTMOVEMENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (location) {
|
if (location) {
|
||||||
// does object's material change cell type?
|
// does object's material change cell type?
|
||||||
|
@ -11004,7 +11072,6 @@ void timeeffectsob(object_t *o) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// checks based on object
|
// checks based on object
|
||||||
if (o->type->id == OT_VINE) {
|
if (o->type->id == OT_VINE) {
|
||||||
lifeform_t *creator;
|
lifeform_t *creator;
|
||||||
|
@ -11969,11 +12036,11 @@ int getmissileaccuracy(lifeform_t *thrower, cell_t *where, object_t *missile, ob
|
||||||
// ie. inept = -30%, adept = 0%, master = +30%
|
// ie. inept = -30%, adept = 0%, master = +30%
|
||||||
acc += ((slev - PR_ADEPT) * 10);
|
acc += ((slev - PR_ADEPT) * 10);
|
||||||
} else {
|
} else {
|
||||||
slev = getskill(thrower, whichskill);
|
|
||||||
acc = 60;
|
acc = 60;
|
||||||
// ie. inept = -30%, adept = 0%, master = +30%
|
// ie. inept = -45%, adept = 0%, master = +45%
|
||||||
acc += ((slev - PR_ADEPT) * 10);
|
slev = getskill(thrower, whichskill);
|
||||||
// acc will now be 10 - 70
|
acc += ((slev - PR_ADEPT) * 15);
|
||||||
|
// acc will now be 25 - 115
|
||||||
}
|
}
|
||||||
|
|
||||||
// adjust for range
|
// adjust for range
|
||||||
|
|
1
save.c
1
save.c
|
@ -503,7 +503,6 @@ map_t *loadmap(char *basefile) {
|
||||||
// successful load - kill the map now
|
// successful load - kill the map now
|
||||||
unlink(filename);
|
unlink(filename);
|
||||||
|
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
57
spell.c
57
spell.c
|
@ -554,6 +554,49 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
||||||
}
|
}
|
||||||
|
|
||||||
taketime(user, getactspeed(user)*2);
|
taketime(user, getactspeed(user)*2);
|
||||||
|
} else if (abilid == OT_A_CLIMB) {
|
||||||
|
if (lfhasflag(user, F_CLIMBING)) {
|
||||||
|
// stop climbing
|
||||||
|
stopclimbing(user, B_TRUE);
|
||||||
|
taketime(user, getmovespeed(user));
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isprone(user)) {
|
||||||
|
if (isplayer(user)) msg("You will need to stand up first!");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
// ask for direction
|
||||||
|
if (!targcell) {
|
||||||
|
int dirch,dir;
|
||||||
|
dirch = askchar("Climb wall in which direction (- to cancel)", "yuhjklbn.-","-", B_FALSE, B_TRUE);
|
||||||
|
if ((dirch == '-') || !dirch) {
|
||||||
|
if (isplayer(user)) msg("Cancelled.");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
dir = chartodir(dirch);
|
||||||
|
if (dir == D_NONE) {
|
||||||
|
targcell = user->cell;
|
||||||
|
} else {
|
||||||
|
targcell = getcellindir(user->cell, dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!targcell) {
|
||||||
|
if (isplayer(user)) msg("Cancelled.");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!targcell->type->solid) {
|
||||||
|
if (isplayer(user)) msg("There is no wall there!");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
if (targcell->lf) {
|
||||||
|
if (isplayer(user)) msg("There is no wall there!");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
startclimbing(user, targcell);
|
||||||
|
taketime(user, getmovespeed(user));
|
||||||
} else if (abilid == OT_A_COOK) {
|
} else if (abilid == OT_A_COOK) {
|
||||||
object_t *water,*o;
|
object_t *water,*o;
|
||||||
race_t *r = NULL;
|
race_t *r = NULL;
|
||||||
|
@ -1535,6 +1578,13 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
||||||
|
|
||||||
} else if (abilid == OT_A_SPRINT) {
|
} else if (abilid == OT_A_SPRINT) {
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
|
f = lfhasflag(user, F_SPRINTING);
|
||||||
|
if (f) {
|
||||||
|
// stop sprinting.
|
||||||
|
killflag(f);
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (lfhasflagval(user, F_INJURY, IJ_WINDPIPECRUSHED, NA, NA, NULL)) {
|
if (lfhasflagval(user, F_INJURY, IJ_WINDPIPECRUSHED, NA, NA, NULL)) {
|
||||||
if (isplayer(user)) msg("You can't sprint with a crushed windpipe.");
|
if (isplayer(user)) msg("You can't sprint with a crushed windpipe.");
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
|
@ -1545,13 +1595,6 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
f = lfhasflag(user, F_SPRINTING);
|
|
||||||
if (f) {
|
|
||||||
if (isplayer(user)) {
|
|
||||||
msg("You are already sprinting!");
|
|
||||||
}
|
|
||||||
return B_TRUE;
|
|
||||||
}
|
|
||||||
if (isburdened(user)) {
|
if (isburdened(user)) {
|
||||||
if (isplayer(user)) {
|
if (isplayer(user)) {
|
||||||
msg("You cannot sprint while burdened.");
|
msg("You cannot sprint while burdened.");
|
||||||
|
|
Loading…
Reference in New Issue