* [+] always add webs if there are randomly generated spiders on a level
- [+] non-wood doors - [+] iron - [+] only interrupt rest for hunger if it's 'starving' or 'vhungry' - [+] limit the amount of jumping we can do from athletics skill. - [+] no message when i lockpick with a -6 combat knife. - [+] make small corpses give much less nutrition! - [+] high unarmed skill should give you unarmed attacks with a 1-handed weapon. - [+] dual weild - [+] if you have twoweapon skill, when you weild a weapon, say "weild as secondary weapon? y/n" - [+] in attackcell(), check if we have a weapon in our second hand AND are skilled in twoweaponing - [+] if so, get an attack with both, but with an accuracy penalty (until adept level) - [+] make sure shiedl code doesn't accept weapons! - [+] knockback() can now knock back other lfs that you hit on the way * [+] faster resting obs (only via R) - [+] replace F_RESTING with F_ASLEEP. v0 = onpurpose. if v0, you wake up when at full hp/mp/etc - [+] implement F_TRAINING with traincounter - [+] don't say 'rest until nearby allies ar eheald' if they aren't damaged - [+] make listen dififculty check dependant on distance to noise - [+] doesn't make sense for druid to be a vegetarian. use "can only eat meat when hungry" - [+] @@ - combine acc+dmg. ie. "weapon: mace (63%,2-9dmg) - [+] @@ - show both weapons if dualweilding. - [+] porcupine shoudl have F_SHARP corpse. implement F_CORPSEFLAGS - [+] create monster - "giant ant" making "giant antlion"! - [+] giant porcupine - [+] implement - [+] should attack ants on sight - f_hatesrace - [+] if race=hatesrace or baserace = hatesrace, will attack it. - [+] gust of wind - blow obs away! - [+] thorns (grow spikes, attackers take dmg) - [+] f_retaliate, v0=ndice,v1=dsides, v2=damype, text=obname - [+] major healing (new spell)
This commit is contained in:
parent
7099d01164
commit
810ab99662
138
ai.c
138
ai.c
|
@ -392,11 +392,12 @@ void aiturn(lifeform_t *lf) {
|
||||||
flag_t *mf;
|
flag_t *mf;
|
||||||
//flag_t *nextf;
|
//flag_t *nextf;
|
||||||
// lifeform_t *fleefrom = NULL;
|
// lifeform_t *fleefrom = NULL;
|
||||||
lifeform_t *target;
|
lifeform_t *target,*newtarget;
|
||||||
enum BODYPART bp;
|
enum BODYPART bp;
|
||||||
cell_t *c;
|
//cell_t *c;
|
||||||
lifeform_t *master = NULL;
|
lifeform_t *master = NULL;
|
||||||
enum IQBRACKET iqb;
|
enum IQBRACKET iqb;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -601,9 +602,6 @@ void aiturn(lifeform_t *lf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (goingtomove && (getcelldist(lf->cell, target->cell) == 1)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lfhasflag(lf, F_HIDING)) {
|
if (!lfhasflag(lf, F_HIDING)) {
|
||||||
objecttype_t *st;
|
objecttype_t *st;
|
||||||
// can we attack with spells (ie. ones which target the victim)?
|
// can we attack with spells (ie. ones which target the victim)?
|
||||||
|
@ -711,7 +709,7 @@ void aiturn(lifeform_t *lf) {
|
||||||
// try to throw it!
|
// try to throw it!
|
||||||
if (!throwat(lf, o, target->cell)) {
|
if (!throwat(lf, o, target->cell)) {
|
||||||
// succesful
|
// succesful
|
||||||
goingtomove = B_FALSE;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (db) dblog(".oO { throw failed! }");
|
if (db) dblog(".oO { throw failed! }");
|
||||||
}
|
}
|
||||||
|
@ -748,7 +746,7 @@ void aiturn(lifeform_t *lf) {
|
||||||
|
|
||||||
if (!operate(lf, o, zapcell)) {
|
if (!operate(lf, o, zapcell)) {
|
||||||
// succesful
|
// succesful
|
||||||
goingtomove = B_FALSE;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (db) dblog(".oO { zap failed! }");
|
if (db) dblog(".oO { zap failed! }");
|
||||||
}
|
}
|
||||||
|
@ -861,8 +859,51 @@ void aiturn(lifeform_t *lf) {
|
||||||
|
|
||||||
|
|
||||||
// not attacking anyone in particular
|
// not attacking anyone in particular
|
||||||
if (db) dblog(".oO { i do not have a target or can't move towards it. }");
|
if (db) dblog(".oO { i do not have a target or can't move towards it. looking for one. }");
|
||||||
// are we hostile? if so, look for a target
|
|
||||||
|
// look for any race which we hate
|
||||||
|
newtarget = NULL;
|
||||||
|
for (n = 0; n < lf->nlos; n++) {
|
||||||
|
lifeform_t *who;
|
||||||
|
who = lf->los[n]->lf;
|
||||||
|
if (who && cansee(lf, who)) {
|
||||||
|
if (lfhasflagval(lf, F_HATESRACE, who->race->id, NA, NA, NULL) ||
|
||||||
|
lfhasflagval(lf, F_HATESRACE, who->race->baseid, NA, NA, NULL) ) {
|
||||||
|
if (db) dblog(".oO { found a hated target - lfid %d (%s) ! }",who->id, who->race->name);
|
||||||
|
newtarget = who;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!newtarget) {
|
||||||
|
// now look for enemies
|
||||||
|
for (n = 0; n < lf->nlos; n++) {
|
||||||
|
lifeform_t *who;
|
||||||
|
who = lf->los[n]->lf;
|
||||||
|
if (who && cansee(lf, who)) {
|
||||||
|
if (areenemies(lf, who)) {
|
||||||
|
if (db) dblog(".oO { found an enemy target - lfid %d (%s) ! }",who->id, who->race->name);
|
||||||
|
newtarget = who;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newtarget) {
|
||||||
|
aiattack(lf, newtarget, AI_FOLLOWTIME);
|
||||||
|
// then move towards them...
|
||||||
|
if (db) dblog(".oO { moving towards my new target }");
|
||||||
|
|
||||||
|
if (icanattack) {
|
||||||
|
if (!movetowards(lf, newtarget->cell, DT_ORTH)) return;
|
||||||
|
} else {
|
||||||
|
if (db) dblog(".oO { won't move towards target - i have no weapon. }");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// look for a target to attack based on our allegiance
|
||||||
switch (getallegiance(lf)) {
|
switch (getallegiance(lf)) {
|
||||||
int i;
|
int i;
|
||||||
int x,y;
|
int x,y;
|
||||||
|
@ -918,6 +959,8 @@ void aiturn(lifeform_t *lf) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
// training
|
// training
|
||||||
|
@ -941,7 +984,7 @@ void aiturn(lifeform_t *lf) {
|
||||||
master = findlf(lf->cell->map, mf->val[0]);
|
master = findlf(lf->cell->map, mf->val[0]);
|
||||||
if (master && cansee(lf, master)) {
|
if (master && cansee(lf, master)) {
|
||||||
// can see my master
|
// can see my master
|
||||||
if (lfhasflag(master, F_RESTING)) {
|
if (isresting(master)) {
|
||||||
// rest as well.
|
// rest as well.
|
||||||
rest(lf, B_TRUE);
|
rest(lf, B_TRUE);
|
||||||
return;
|
return;
|
||||||
|
@ -1143,11 +1186,11 @@ int aispellok(lifeform_t *lf, enum OBTYPE spellid, lifeform_t *victim, enum FLAG
|
||||||
case ST_VICTIM:
|
case ST_VICTIM:
|
||||||
case ST_ADJVICTIM:
|
case ST_ADJVICTIM:
|
||||||
if (needlos && (!victim || !cansee(lf, victim)) ) {
|
if (needlos && (!victim || !cansee(lf, victim)) ) {
|
||||||
dblog(".oO { cant cast %s - no LOS to victim }", ot ? ot->name : "?unkownspell?");
|
if (db) dblog(".oO { cant cast %s - no LOS to victim }", ot ? ot->name : "?unkownspell?");
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
if (needlof && !haslof(lf->cell, victim->cell, needlof, NULL) ) {
|
if (needlof && !haslof(lf->cell, victim->cell, needlof, NULL) ) {
|
||||||
dblog(".oO { cant cast %s - no LOF to victim }", ot ? ot->name : "?unkownspell?");
|
if (db) dblog(".oO { cant cast %s - no LOF to victim }", ot ? ot->name : "?unkownspell?");
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1157,7 +1200,7 @@ int aispellok(lifeform_t *lf, enum OBTYPE spellid, lifeform_t *victim, enum FLAG
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// invalid spell for this purpose
|
// invalid spell for this purpose
|
||||||
dblog(".oO { cant cast %s - not valid for given purpose }", ot ? ot->name : "?unkownspell?");
|
if (db) dblog(".oO { cant cast %s - not valid for given purpose }", ot ? ot->name : "?unkownspell?");
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1197,6 +1240,15 @@ int aispellok(lifeform_t *lf, enum OBTYPE spellid, lifeform_t *victim, enum FLAG
|
||||||
|
|
||||||
// now check whether it meets specific spell conditions
|
// now check whether it meets specific spell conditions
|
||||||
specificcheckok = B_TRUE;
|
specificcheckok = B_TRUE;
|
||||||
|
if (ot->id == OT_S_AIRBLAST) {
|
||||||
|
// target must be in a straight compass dir from us
|
||||||
|
if ((victim->x != lf->x) ||
|
||||||
|
(victim->y != lf->y) ||
|
||||||
|
(abs(victim->x - lf->x) != abs(victim->y - lf->y)) ) {
|
||||||
|
} else {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ot->id == OT_S_ANIMATEMETAL) {
|
if (ot->id == OT_S_ANIMATEMETAL) {
|
||||||
object_t *wep;
|
object_t *wep;
|
||||||
wep = getweapon(lf);
|
wep = getweapon(lf);
|
||||||
|
@ -1210,37 +1262,19 @@ int aispellok(lifeform_t *lf, enum OBTYPE spellid, lifeform_t *victim, enum FLAG
|
||||||
if ((ot->id == OT_S_DRAINLIFE) && isimmuneto(victim->flags, DT_NECROTIC)) {
|
if ((ot->id == OT_S_DRAINLIFE) && isimmuneto(victim->flags, DT_NECROTIC)) {
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
}
|
}
|
||||||
if ((ot->id == OT_A_SWOOP) || (ot->id == OT_A_CHARGE)) {
|
if (ot->id == OT_A_FLURRY) {
|
||||||
flag_t *willflag;
|
if (!isdualweilding(lf)) {
|
||||||
flag_t *srflag;
|
|
||||||
int srange = 5;
|
|
||||||
srflag = lfhasflag(lf, F_SWOOPRANGE);
|
|
||||||
if (srflag) {
|
|
||||||
srange = srflag->val[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
willflag = lfhasflagval(lf, F_CANWILL, ot->id, NA, NA, NULL);
|
|
||||||
if (willflag) {
|
|
||||||
texttospellopts(f->text, NULL, NULL, NULL, &srange);
|
|
||||||
if (!srange) srange = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!haslof(lf->cell, victim->cell, LOF_NEED,NULL)) {
|
|
||||||
specificcheckok = B_FALSE;
|
|
||||||
} else if (isimmobile(lf)) {
|
|
||||||
specificcheckok = B_FALSE;
|
|
||||||
} else if ((ot->id == OT_A_SWOOP) && !lfhasflag(lf, F_FLYING)) {
|
|
||||||
specificcheckok = B_FALSE;
|
|
||||||
} else if (getcelldist(lf->cell, victim->cell) > srange) {
|
|
||||||
specificcheckok = B_FALSE;
|
|
||||||
} else if (getcelldist(lf->cell, victim->cell) == 1) { // ie already adjacent
|
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((ot->id == OT_S_HASTE) && (lfhasflag(victim, F_FASTACT) || lfhasflag(victim, F_FASTACTMOVE)) ) {
|
if ((ot->id == OT_S_HASTE) && (lfhasflag(victim, F_FASTACT) || lfhasflag(victim, F_FASTACTMOVE)) ) {
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
}
|
}
|
||||||
|
if (ot->id == OT_A_HEAVYBLOW) {
|
||||||
|
if (!getweapon(lf)) {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (ot->id == OT_A_HIDE) {
|
if (ot->id == OT_A_HIDE) {
|
||||||
if (lfhasflag(victim, F_HIDING)) {
|
if (lfhasflag(victim, F_HIDING)) {
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
|
@ -1272,6 +1306,34 @@ int aispellok(lifeform_t *lf, enum OBTYPE spellid, lifeform_t *victim, enum FLAG
|
||||||
if ((ot->id == OT_A_SPRINT) && lfhasflag(lf, F_SPRINTING)) {
|
if ((ot->id == OT_A_SPRINT) && lfhasflag(lf, F_SPRINTING)) {
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
}
|
}
|
||||||
|
if ((ot->id == OT_A_SWOOP) || (ot->id == OT_A_CHARGE)) {
|
||||||
|
flag_t *willflag;
|
||||||
|
flag_t *srflag;
|
||||||
|
int srange = 5;
|
||||||
|
srflag = lfhasflag(lf, F_SWOOPRANGE);
|
||||||
|
if (srflag) {
|
||||||
|
srange = srflag->val[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
willflag = lfhasflagval(lf, F_CANWILL, ot->id, NA, NA, NULL);
|
||||||
|
if (willflag) {
|
||||||
|
texttospellopts(f->text, NULL, NULL, NULL, &srange);
|
||||||
|
if (!srange) srange = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!haslof(lf->cell, victim->cell, LOF_NEED,NULL)) {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
} else if (isimmobile(lf)) {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
} else if ((ot->id == OT_A_SWOOP) && !lfhasflag(lf, F_FLYING)) {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
} else if (getcelldist(lf->cell, victim->cell) > srange) {
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
} else if (getcelldist(lf->cell, victim->cell) == 1) { // ie already adjacent
|
||||||
|
specificcheckok = B_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ((ot->id == OT_S_WARPWOOD)) {
|
if ((ot->id == OT_S_WARPWOOD)) {
|
||||||
specificcheckok = B_FALSE;
|
specificcheckok = B_FALSE;
|
||||||
if (victim) {
|
if (victim) {
|
||||||
|
|
148
attack.c
148
attack.c
|
@ -113,6 +113,7 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
int attacktime;
|
int attacktime;
|
||||||
int gotweapon = B_FALSE;
|
int gotweapon = B_FALSE;
|
||||||
int maxattacks = ALL;
|
int maxattacks = ALL;
|
||||||
|
int lastweaponidx = -1;
|
||||||
|
|
||||||
// anyone there? if so just attack.
|
// anyone there? if so just attack.
|
||||||
if (c->lf) {
|
if (c->lf) {
|
||||||
|
@ -155,14 +156,29 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// first use our weapon...
|
// first use our weapon...
|
||||||
wep[0] = getweapon(lf);
|
nweps = 0;
|
||||||
if (wep[0]) {
|
wep[nweps] = getweapon(lf);
|
||||||
damflag[0] = hasflag(wep[0]->flags, F_DAM);
|
if (wep[nweps]) {
|
||||||
validwep[0] = B_TRUE;
|
damflag[nweps] = hasflag(wep[nweps]->flags, F_DAM);
|
||||||
|
validwep[nweps] = B_TRUE;
|
||||||
|
lastweaponidx = 0;
|
||||||
nweps++;
|
nweps++;
|
||||||
gotweapon = B_TRUE;
|
gotweapon = B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we are skilled at twoweaponing, we can attack with our second weapon
|
||||||
|
// as well, with a possible accuracy penalty depending on our skill level.
|
||||||
|
if (getskill(lf, SK_TWOWEAPON)) {
|
||||||
|
wep[nweps] = getsecmeleeweapon(lf);
|
||||||
|
if (wep[nweps]) {
|
||||||
|
damflag[nweps] = hasflag(wep[nweps]->flags, F_DAM);
|
||||||
|
validwep[nweps] = B_TRUE;
|
||||||
|
lastweaponidx = nweps;
|
||||||
|
nweps++;
|
||||||
|
gotweapon = B_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// then use all our innate attacks..
|
// then use all our innate attacks..
|
||||||
for (f = lf->flags->first ; f; f = f->next) {
|
for (f = lf->flags->first ; f; f = f->next) {
|
||||||
if (f->id == F_HASATTACK) {
|
if (f->id == F_HASATTACK) {
|
||||||
|
@ -178,11 +194,12 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
validwep[nweps] = B_TRUE;
|
validwep[nweps] = B_TRUE;
|
||||||
damflag[nweps] = f;
|
damflag[nweps] = f;
|
||||||
nweps++;
|
nweps++;
|
||||||
innateattacks++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
innateattacks = countinnateattacks(lf);
|
||||||
|
|
||||||
// stop sprinting
|
// stop sprinting
|
||||||
f = lfhasflag(lf, F_SPRINTING);
|
f = lfhasflag(lf, F_SPRINTING);
|
||||||
if (f && f->val[0]) {
|
if (f && f->val[0]) {
|
||||||
|
@ -200,36 +217,26 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
return B_TRUE;
|
return B_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxattacks = nweps; // ie. all
|
//maxattacks = nweps; // ie. all
|
||||||
f = lfhasflag(lf, F_MAXATTACKS);
|
|
||||||
if (f) {
|
maxattacks = getmaxattacks(lf);
|
||||||
maxattacks = f->val[0];
|
|
||||||
} else {
|
|
||||||
maxattacks = innateattacks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// if we have a weapon, this takes the place of one of our
|
// if we have a weapon, this takes the place of one of our
|
||||||
// attacks.
|
// attacks.
|
||||||
// for monsters, pick which one to replace randomly.
|
// - for monsters, pick which one to replace randomly.
|
||||||
// for players, never pick the weapon to replace randomly.
|
// - for players, never pick the weapon to replace randomly.
|
||||||
if (gotweapon && (nweps >= 2)) {
|
|
||||||
if (isplayer(lf)) {
|
|
||||||
validwep[rnd(1,nweps-1)] = B_FALSE;
|
|
||||||
} else {
|
|
||||||
validwep[rnd(0,nweps-1)] = B_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// # valid attacks higher than our allowed attacks?
|
// # valid attacks higher than our allowed attacks?
|
||||||
if (nweps > maxattacks) {
|
if (nweps > maxattacks) {
|
||||||
int nvalid;
|
int nvalid;
|
||||||
int first;
|
int first;
|
||||||
|
|
||||||
// player never invalidates their weapon
|
// player never invalidates their equipped weapons
|
||||||
if (isplayer(lf) && gotweapon) {
|
if (isplayer(lf) && gotweapon) {
|
||||||
first = 1;
|
first = lastweaponidx+1;
|
||||||
} else {
|
} else {
|
||||||
first = 0;
|
first = 0;
|
||||||
}
|
}
|
||||||
|
@ -256,6 +263,7 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remember initial cells
|
||||||
for (i = 0; i < nweps; i++) {
|
for (i = 0; i < nweps; i++) {
|
||||||
if (validwep[i]) {
|
if (validwep[i]) {
|
||||||
if (attacktype == AT_LF) {
|
if (attacktype == AT_LF) {
|
||||||
|
@ -266,6 +274,14 @@ int attackcell(lifeform_t *lf, cell_t *c) {
|
||||||
if (attackob(lf, (object_t *)attacktarget, wep[i], damflag[i])) break;
|
if (attackob(lf, (object_t *)attacktarget, wep[i], damflag[i])) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// stop attacking if they somehow got out of range
|
||||||
|
// (eg. dodging)
|
||||||
|
if (attacktype == AT_LF) {
|
||||||
|
if (getcelldist(lf->cell, ((lifeform_t *)attacktarget)->cell) > 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now kill all temp obs
|
// now kill all temp obs
|
||||||
|
@ -286,6 +302,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
char attackername[BUFLEN];
|
char attackername[BUFLEN];
|
||||||
char victimname[BUFLEN];
|
char victimname[BUFLEN];
|
||||||
int fatal = B_FALSE;
|
int fatal = B_FALSE;
|
||||||
|
int deflected = B_FALSE;
|
||||||
int firstisbackstab = B_FALSE;
|
int firstisbackstab = B_FALSE;
|
||||||
int hit = B_FALSE;
|
int hit = B_FALSE;
|
||||||
int critical = 0;
|
int critical = 0;
|
||||||
|
@ -347,8 +364,21 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
|
|
||||||
// did you hit?
|
// did you hit?
|
||||||
ndam = 0;
|
ndam = 0;
|
||||||
if (rolltohit(lf, victim, wep, &critical)) {
|
hit = rolltohit(lf, victim, wep, &critical);
|
||||||
hit = B_TRUE;
|
|
||||||
|
// deflection?
|
||||||
|
if (hit) {
|
||||||
|
object_t *dwep;
|
||||||
|
dwep = isdualweilding(victim);
|
||||||
|
if (dwep && (getskill(victim, SK_TWOWEAPON) >= PR_MASTER)) {
|
||||||
|
if (onein(4)) {
|
||||||
|
deflected = B_TRUE;
|
||||||
|
hit = B_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hit) {
|
||||||
if (aidb) dblog(".oO { i hit! }");
|
if (aidb) dblog(".oO { i hit! }");
|
||||||
|
|
||||||
// special case
|
// special case
|
||||||
|
@ -454,8 +484,6 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
ndam = 0;
|
ndam = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (ndam > 0) {
|
if (ndam > 0) {
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
for (i = 0; i < ndam; i++) {
|
for (i = 0; i < ndam; i++) {
|
||||||
|
@ -464,11 +492,11 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
flag_t *rust;
|
flag_t *rust;
|
||||||
|
|
||||||
if (firstisbackstab && (i == 0)) backstab = B_TRUE;
|
if (firstisbackstab && (i == 0)) backstab = B_TRUE;
|
||||||
dblog("initial dam[%d] = %d",i,dam[i]);
|
//dblog("initial dam[%d] = %d",i,dam[i]);
|
||||||
|
|
||||||
if (lfhasflag(lf, F_HEAVYBLOW) || hasflag(wep->flags, F_HEAVYBLOW)) {
|
if (lfhasflag(lf, F_HEAVYBLOW) || hasflag(wep->flags, F_HEAVYBLOW)) {
|
||||||
dam[i] = (int)pctof(110,dam[i]);
|
dam[i] = (int)pctof(110,dam[i]);
|
||||||
dblog("heavy blow makes dam[%d] = %d",i,dam[i]);
|
//dblog("heavy blow makes dam[%d] = %d",i,dam[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// modify for rust
|
// modify for rust
|
||||||
|
@ -492,7 +520,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
|
|
||||||
// modify based on resistances
|
// modify based on resistances
|
||||||
adjustdamlf(victim, &dam[i], damtype[i]);
|
adjustdamlf(victim, &dam[i], damtype[i]);
|
||||||
dblog("adjusted for lf to dam[%d] = %d",i,dam[i]);
|
//dblog("adjusted for lf to dam[%d] = %d",i,dam[i]);
|
||||||
|
|
||||||
if (!backstab) {
|
if (!backstab) {
|
||||||
// modify for defender's armour
|
// modify for defender's armour
|
||||||
|
@ -500,7 +528,7 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
|
|
||||||
applyarmourdamreduction(victim, wep, reduceamt, &dam[i], damtype[i]);
|
applyarmourdamreduction(victim, wep, reduceamt, &dam[i], damtype[i]);
|
||||||
|
|
||||||
dblog("reduced by armour to dam[%d] = %d",i,dam[i]);
|
//dblog("reduced by armour to dam[%d] = %d",i,dam[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// will this hit be fatal?
|
// will this hit be fatal?
|
||||||
|
@ -703,12 +731,33 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
addflag(lf->flags, F_ATTACHEDTO, victim->id, NA, NA, NULL);
|
addflag(lf->flags, F_ATTACHEDTO, victim->id, NA, NA, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// retaliation happens even if victim died
|
||||||
|
for (f = victim->flags->first ; f ; f = f->next) {
|
||||||
|
if (f->id == F_RETALIATE) {
|
||||||
|
int rdam;
|
||||||
|
char damstring[BUFLEN];
|
||||||
|
rdam = rolldie(f->val[0], f->val[1]);
|
||||||
|
if (cansee(player, victim)) {
|
||||||
|
msg("%s%s %s %s %s!", victimname, getpossessive(victimname),
|
||||||
|
noprefix(f->text),
|
||||||
|
getattackverb(victim, NULL, f->val[2], rdam, lf->maxhp),
|
||||||
|
attackername);
|
||||||
|
}
|
||||||
|
sprintf(damstring, "%s%s %s", victimname, getpossessive(victimname), noprefix(f->text));
|
||||||
|
losehp(lf, rdam, f->val[2], victim, damstring);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else { // miss!
|
} else { // miss!
|
||||||
if (aidb) dblog(".oO { i missed! }");
|
if (aidb) dblog(".oO { i missed! }");
|
||||||
// announce it
|
// announce it
|
||||||
if (lfhasflag(victim, F_MAGSHIELD) && ismetal(wep->material->id)) {
|
if (deflected) {
|
||||||
|
if (cansee(player, lf)) {
|
||||||
|
msg("%s deflect%s %s%s attack.", victimname, isplayer(victim) ? "" : "s",attackername, getpossessive(attackername));
|
||||||
|
}
|
||||||
|
} else if (lfhasflag(victim, F_MAGSHIELD) && ismetal(wep->material->id)) {
|
||||||
if (isplayer(lf) || cansee(player, lf)) {
|
if (isplayer(lf) || cansee(player, lf)) {
|
||||||
sprintf(buf, "%s",attackername);
|
sprintf(buf, "%s",attackername);
|
||||||
|
|
||||||
|
@ -763,6 +812,32 @@ int attacklf(lifeform_t *lf, lifeform_t *victim, object_t *wep, flag_t *damflag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// twoweapon?
|
||||||
|
if (hit) {
|
||||||
|
enum SKILLLEVEL slev;
|
||||||
|
slev = getskill(lf, SK_TWOWEAPON);
|
||||||
|
if (slev >= PR_SKILLED) {
|
||||||
|
object_t *secwep;
|
||||||
|
secwep = getsecmeleeweapon(lf);
|
||||||
|
// ie. if we are using two weapons, and the current one
|
||||||
|
// is the first...
|
||||||
|
if (secwep && (secwep != wep)) {
|
||||||
|
int bonus = 0;
|
||||||
|
// next hit will have enhanced accuracy
|
||||||
|
if (slev == PR_SKILLED) {
|
||||||
|
bonus = 10;
|
||||||
|
} else if (slev == PR_EXPERT) {
|
||||||
|
bonus = 25;
|
||||||
|
} else if (slev == PR_MASTER) {
|
||||||
|
bonus = 40;
|
||||||
|
}
|
||||||
|
if (bonus) {
|
||||||
|
addtempflag(lf->flags, F_ACCURACYMOD, bonus, NA, NA, NULL, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (aidb) dblog(".oO { doattack about to return B_FALSE }");
|
if (aidb) dblog(".oO { doattack about to return B_FALSE }");
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1473,6 +1548,7 @@ int isphysicaldam(enum DAMTYPE damtype) {
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns true if we hit
|
||||||
int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical) {
|
int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical) {
|
||||||
int acc,ev;
|
int acc,ev;
|
||||||
int gothit;
|
int gothit;
|
||||||
|
@ -1540,7 +1616,6 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical)
|
||||||
acc += 50;
|
acc += 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// base 5% critical chance
|
// base 5% critical chance
|
||||||
if (critical) {
|
if (critical) {
|
||||||
int critroll;
|
int critroll;
|
||||||
|
@ -1555,10 +1630,7 @@ int rolltohit(lifeform_t *lf, lifeform_t *victim, object_t *wep, int *critical)
|
||||||
if (critroll >= 95) *critical = 1;
|
if (critroll >= 95) *critical = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (acc < 0) acc = 0;
|
limit(&acc, 0, 100);
|
||||||
if (acc > 100) acc = 100;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//if (aidb) dblog(".oO { my modified chance to hit is %d %% }", acc);
|
//if (aidb) dblog(".oO { my modified chance to hit is %d %% }", acc);
|
||||||
myroll = rnd(1,100);
|
myroll = rnd(1,100);
|
||||||
|
|
78
defs.h
78
defs.h
|
@ -4,7 +4,7 @@
|
||||||
// MACROS
|
// MACROS
|
||||||
#define MAXOF(a,b) (a > b ? a : b)
|
#define MAXOF(a,b) (a > b ? a : b)
|
||||||
|
|
||||||
#define PRACTICETIME 50 // #attempts it takes to learn new skill
|
#define PRACTICETIME 15 // #attempts it takes to learn new weapon skill
|
||||||
|
|
||||||
#define WETTIME 10 // how long it takes for things to dry
|
#define WETTIME 10 // how long it takes for things to dry
|
||||||
#define DRUNKTIME 10 // how long it takes for alcohol to wear off
|
#define DRUNKTIME 10 // how long it takes for alcohol to wear off
|
||||||
|
@ -48,6 +48,7 @@ enum SKILL {
|
||||||
SK_SPOTHIDDEN,
|
SK_SPOTHIDDEN,
|
||||||
SK_STEALTH,
|
SK_STEALTH,
|
||||||
SK_TECHUSAGE,
|
SK_TECHUSAGE,
|
||||||
|
SK_TWOWEAPON,
|
||||||
// knowledge
|
// knowledge
|
||||||
SK_LORE_ARCANA,
|
SK_LORE_ARCANA,
|
||||||
SK_LORE_DEMONS,
|
SK_LORE_DEMONS,
|
||||||
|
@ -68,7 +69,7 @@ enum SKILL {
|
||||||
SK_SS_DEATH,
|
SK_SS_DEATH,
|
||||||
SK_SS_DIVINATION,
|
SK_SS_DIVINATION,
|
||||||
SK_SS_FIRE,
|
SK_SS_FIRE,
|
||||||
SK_SS_ICE,
|
SK_SS_COLD,
|
||||||
SK_SS_GRAVITY,
|
SK_SS_GRAVITY,
|
||||||
SK_SS_LIFE,
|
SK_SS_LIFE,
|
||||||
SK_SS_MODIFICATION,
|
SK_SS_MODIFICATION,
|
||||||
|
@ -78,7 +79,7 @@ enum SKILL {
|
||||||
SK_SS_TRANSLOCATION,
|
SK_SS_TRANSLOCATION,
|
||||||
SK_SS_WILD,
|
SK_SS_WILD,
|
||||||
};
|
};
|
||||||
#define MAXSKILLS 39
|
#define MAXSKILLS 40
|
||||||
|
|
||||||
// proficiency levels
|
// proficiency levels
|
||||||
enum SKILLLEVEL {
|
enum SKILLLEVEL {
|
||||||
|
@ -166,6 +167,8 @@ enum LFCONDITION {
|
||||||
// if target lf is out of view for this many turns, abandon chase
|
// if target lf is out of view for this many turns, abandon chase
|
||||||
#define AI_FOLLOWTIME (10)
|
#define AI_FOLLOWTIME (10)
|
||||||
|
|
||||||
|
#define DEFAULTRESTHEALTIME (3)
|
||||||
|
|
||||||
|
|
||||||
// object confitions for random objects
|
// object confitions for random objects
|
||||||
#define RO_NONE 0
|
#define RO_NONE 0
|
||||||
|
@ -209,8 +212,9 @@ enum LFCONDITION {
|
||||||
#define MORESTRING "--More--"
|
#define MORESTRING "--More--"
|
||||||
#define SOLDOUTSTRING "--SOLD OUT--"
|
#define SOLDOUTSTRING "--SOLD OUT--"
|
||||||
|
|
||||||
// hunger constant
|
// hunger constant - this is how many turns
|
||||||
#define HUNGERCONST 10000
|
// it will take to go from 'normal' to 'hungry' etc
|
||||||
|
#define HUNGERCONST 200
|
||||||
|
|
||||||
|
|
||||||
// LIMITS
|
// LIMITS
|
||||||
|
@ -392,7 +396,7 @@ enum SPELLSCHOOL {
|
||||||
SS_DEATH,
|
SS_DEATH,
|
||||||
SS_DIVINATION,
|
SS_DIVINATION,
|
||||||
SS_FIRE,
|
SS_FIRE,
|
||||||
SS_ICE,
|
SS_COLD,
|
||||||
SS_GRAVITY,
|
SS_GRAVITY,
|
||||||
SS_LIFE,
|
SS_LIFE,
|
||||||
SS_MODIFICATION,
|
SS_MODIFICATION,
|
||||||
|
@ -609,6 +613,7 @@ enum RACE {
|
||||||
R_HAWKFROST,
|
R_HAWKFROST,
|
||||||
R_LEECH,
|
R_LEECH,
|
||||||
R_NEWT,
|
R_NEWT,
|
||||||
|
R_PORCUPINE,
|
||||||
R_RAT,
|
R_RAT,
|
||||||
R_SNAKE,
|
R_SNAKE,
|
||||||
R_SNAKECARPET,
|
R_SNAKECARPET,
|
||||||
|
@ -696,7 +701,8 @@ enum OBTYPE {
|
||||||
// dungeon features
|
// dungeon features
|
||||||
OT_BOULDER,
|
OT_BOULDER,
|
||||||
OT_STATUE,
|
OT_STATUE,
|
||||||
OT_WOODENDOOR,
|
OT_DOORWOOD,
|
||||||
|
OT_DOORIRON,
|
||||||
OT_WOODENTABLE,
|
OT_WOODENTABLE,
|
||||||
OT_WOODENBARREL,
|
OT_WOODENBARREL,
|
||||||
OT_WOODENSTOOL,
|
OT_WOODENSTOOL,
|
||||||
|
@ -727,20 +733,6 @@ enum OBTYPE {
|
||||||
// corpses
|
// corpses
|
||||||
OT_CORPSE,
|
OT_CORPSE,
|
||||||
OT_HEAD,
|
OT_HEAD,
|
||||||
/*
|
|
||||||
OT_CORPSEEYEBAT,
|
|
||||||
OT_CORPSEBAT,
|
|
||||||
OT_CORPSEFLY,
|
|
||||||
OT_CORPSEGLOWBUG,
|
|
||||||
OT_CORPSEGOBLIN,
|
|
||||||
OT_CORPSEHUMAN,
|
|
||||||
OT_CORPSELIZARD,
|
|
||||||
OT_CORPSEOGRE,
|
|
||||||
OT_CORPSEORK,
|
|
||||||
OT_CORPSERODENT,
|
|
||||||
OT_CORPSETROLL,
|
|
||||||
OT_CORPSEWOLF,
|
|
||||||
*/
|
|
||||||
// potions
|
// potions
|
||||||
OT_POT_ACID,
|
OT_POT_ACID,
|
||||||
OT_POT_ACROBATICS,
|
OT_POT_ACROBATICS,
|
||||||
|
@ -754,6 +746,7 @@ enum OBTYPE {
|
||||||
OT_POT_GASEOUSFORM,
|
OT_POT_GASEOUSFORM,
|
||||||
OT_POT_HEALING,
|
OT_POT_HEALING,
|
||||||
OT_POT_HEALINGMIN,
|
OT_POT_HEALINGMIN,
|
||||||
|
OT_POT_HEALINGMAJ,
|
||||||
OT_POT_INVIS,
|
OT_POT_INVIS,
|
||||||
OT_POT_INVULN,
|
OT_POT_INVULN,
|
||||||
OT_POT_MAGIC,
|
OT_POT_MAGIC,
|
||||||
|
@ -802,6 +795,7 @@ enum OBTYPE {
|
||||||
OT_MAN_SPOTHIDDEN,
|
OT_MAN_SPOTHIDDEN,
|
||||||
OT_MAN_STEALTH,
|
OT_MAN_STEALTH,
|
||||||
OT_MAN_TECHUSAGE,
|
OT_MAN_TECHUSAGE,
|
||||||
|
OT_MAN_TWOWEAPON,
|
||||||
// manuals of knowledge
|
// manuals of knowledge
|
||||||
OT_MAN_LORE_ARCANA,
|
OT_MAN_LORE_ARCANA,
|
||||||
OT_MAN_LORE_DEMONS,
|
OT_MAN_LORE_DEMONS,
|
||||||
|
@ -823,7 +817,7 @@ enum OBTYPE {
|
||||||
OT_MAN_SS_DIVINATION,
|
OT_MAN_SS_DIVINATION,
|
||||||
OT_MAN_SS_NATURE,
|
OT_MAN_SS_NATURE,
|
||||||
OT_MAN_SS_FIRE,
|
OT_MAN_SS_FIRE,
|
||||||
OT_MAN_SS_ICE,
|
OT_MAN_SS_COLD,
|
||||||
OT_MAN_SS_GRAVITY,
|
OT_MAN_SS_GRAVITY,
|
||||||
OT_MAN_SS_LIFE,
|
OT_MAN_SS_LIFE,
|
||||||
OT_MAN_SS_MODIFICATION,
|
OT_MAN_SS_MODIFICATION,
|
||||||
|
@ -881,6 +875,7 @@ enum OBTYPE {
|
||||||
// -- life
|
// -- life
|
||||||
OT_SB_HEALING,
|
OT_SB_HEALING,
|
||||||
OT_SB_HEALINGMIN,
|
OT_SB_HEALINGMIN,
|
||||||
|
OT_SB_HEALINGMAJ,
|
||||||
OT_SB_TURNUNDEAD,
|
OT_SB_TURNUNDEAD,
|
||||||
// -- mental / psionic
|
// -- mental / psionic
|
||||||
OT_SB_MINDSCAN,
|
OT_SB_MINDSCAN,
|
||||||
|
@ -964,6 +959,7 @@ enum OBTYPE {
|
||||||
// -- life
|
// -- life
|
||||||
OT_S_HEALING,
|
OT_S_HEALING,
|
||||||
OT_S_HEALINGMIN,
|
OT_S_HEALINGMIN,
|
||||||
|
OT_S_HEALINGMAJ,
|
||||||
OT_S_TURNUNDEAD,
|
OT_S_TURNUNDEAD,
|
||||||
// -- mental / psionic
|
// -- mental / psionic
|
||||||
OT_S_MINDSCAN,
|
OT_S_MINDSCAN,
|
||||||
|
@ -1009,6 +1005,7 @@ enum OBTYPE {
|
||||||
OT_S_SUMMONANIMALSSM,
|
OT_S_SUMMONANIMALSSM,
|
||||||
OT_S_SUMMONANIMALSMD,
|
OT_S_SUMMONANIMALSMD,
|
||||||
OT_S_SUMMONANIMALSLG,
|
OT_S_SUMMONANIMALSLG,
|
||||||
|
OT_S_THORNS,
|
||||||
OT_S_WARPWOOD,
|
OT_S_WARPWOOD,
|
||||||
OT_S_WATERJET,
|
OT_S_WATERJET,
|
||||||
// -- summoning
|
// -- summoning
|
||||||
|
@ -1033,7 +1030,7 @@ enum OBTYPE {
|
||||||
OT_A_LEARN,
|
OT_A_LEARN,
|
||||||
OT_A_LEVELUP,
|
OT_A_LEVELUP,
|
||||||
// abilities
|
// abilities
|
||||||
OT_A_SUCKBLOOD,
|
OT_A_FLURRY,
|
||||||
OT_A_GRAB,
|
OT_A_GRAB,
|
||||||
OT_A_CHARGE,
|
OT_A_CHARGE,
|
||||||
OT_A_CRUSH,
|
OT_A_CRUSH,
|
||||||
|
@ -1041,6 +1038,7 @@ enum OBTYPE {
|
||||||
OT_A_RAGE,
|
OT_A_RAGE,
|
||||||
OT_A_SPRINT,
|
OT_A_SPRINT,
|
||||||
OT_A_STINGACID, // need to define dam in f_canwill
|
OT_A_STINGACID, // need to define dam in f_canwill
|
||||||
|
OT_A_SUCKBLOOD,
|
||||||
OT_A_SWOOP,
|
OT_A_SWOOP,
|
||||||
OT_A_EMPLOY,
|
OT_A_EMPLOY,
|
||||||
OT_A_HEAVYBLOW,
|
OT_A_HEAVYBLOW,
|
||||||
|
@ -1067,6 +1065,7 @@ enum OBTYPE {
|
||||||
OT_WAND_WEAKNESS,
|
OT_WAND_WEAKNESS,
|
||||||
OT_WAND_WONDER,
|
OT_WAND_WONDER,
|
||||||
// tools
|
// tools
|
||||||
|
OT_BLANKET,
|
||||||
OT_BLINDFOLD,
|
OT_BLINDFOLD,
|
||||||
OT_BUGLAMP,
|
OT_BUGLAMP,
|
||||||
OT_CANDLE,
|
OT_CANDLE,
|
||||||
|
@ -1092,7 +1091,9 @@ enum OBTYPE {
|
||||||
OT_MOTIONSCANNER,
|
OT_MOTIONSCANNER,
|
||||||
OT_NVGOGGLES,
|
OT_NVGOGGLES,
|
||||||
OT_PAPERCLIP,
|
OT_PAPERCLIP,
|
||||||
|
OT_SLEEPINGBAG,
|
||||||
OT_TELEPAD,
|
OT_TELEPAD,
|
||||||
|
OT_TENT,
|
||||||
OT_XRAYGOGGLES,
|
OT_XRAYGOGGLES,
|
||||||
// misc objects
|
// misc objects
|
||||||
OT_BONE,
|
OT_BONE,
|
||||||
|
@ -1507,7 +1508,7 @@ enum FLAG {
|
||||||
//F_DAM, // val0 = ndice, val1 = nsidesondie, val2 = mod
|
//F_DAM, // val0 = ndice, val1 = nsidesondie, val2 = mod
|
||||||
F_DAM, // v0 = damtype, text = 1d1+1
|
F_DAM, // v0 = damtype, text = 1d1+1
|
||||||
F_MISSILEDAM, // val0 = dam if it hits (without speed multiplier)
|
F_MISSILEDAM, // val0 = dam if it hits (without speed multiplier)
|
||||||
F_ACCURACY, // 100 - val0 = penalty 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
|
||||||
F_TWOHANDED, // weapon uses two hands to weild
|
F_TWOHANDED, // weapon uses two hands to weild
|
||||||
|
@ -1520,6 +1521,11 @@ enum FLAG {
|
||||||
F_FLAMESTRIKE, // causes fires where you hit
|
F_FLAMESTRIKE, // causes fires where you hit
|
||||||
F_BALANCE, // heals target if their maxhp < your maxhp
|
F_BALANCE, // heals target if their maxhp < your maxhp
|
||||||
F_REVENGE, // causes damage based on your hp
|
F_REVENGE, // causes damage based on your hp
|
||||||
|
F_HELPSREST, // makes you heal mp/hp faster when using 'R'
|
||||||
|
// reduces skillcheck difficulty by v0.
|
||||||
|
// optional v1 = how many less turns between
|
||||||
|
// skillchecks. should not go more than
|
||||||
|
// DEFAULTRESTHEALTIME.
|
||||||
// tech flags
|
// tech flags
|
||||||
F_RNDCHARGES, // ob starts with between val0 and val1 charges
|
F_RNDCHARGES, // ob starts with between val0 and val1 charges
|
||||||
// this will cause F_CHARGES to be filled in
|
// this will cause F_CHARGES to be filled in
|
||||||
|
@ -1588,6 +1594,7 @@ enum FLAG {
|
||||||
F_DEBUG, // debugging enabled
|
F_DEBUG, // debugging enabled
|
||||||
F_ACCURACYMOD, // modify your accuracy by val0
|
F_ACCURACYMOD, // modify your accuracy by val0
|
||||||
F_VEGETARIAN, // this lf will not eat meat.
|
F_VEGETARIAN, // this lf will not eat meat.
|
||||||
|
F_PARTVEGETARIAN,// this lf will only eat if hunger >= 'hungry'
|
||||||
F_SHIELDPENALTY, // lower your accuracy by val0 due to a cumbersome
|
F_SHIELDPENALTY, // lower your accuracy by val0 due to a cumbersome
|
||||||
// shield
|
// shield
|
||||||
F_LEVRACE, // at level v0, this race is promoted to race v1
|
F_LEVRACE, // at level v0, this race is promoted to race v1
|
||||||
|
@ -1599,6 +1606,12 @@ enum FLAG {
|
||||||
F_RESTHEALTIME, // val0 = how long to rest before healing hp
|
F_RESTHEALTIME, // val0 = how long to rest before healing hp
|
||||||
F_RESTHEALAMT, // val0 = how many hp to gain after resting x turns
|
F_RESTHEALAMT, // val0 = how many hp to gain after resting x turns
|
||||||
F_RESTHEALMPAMT, // val0 = how many MP to gain after resting x turns
|
F_RESTHEALMPAMT, // val0 = how many MP to gain after resting x turns
|
||||||
|
F_HOMEOB, // when this monster is auto generated on a level, place
|
||||||
|
// this object underneath them.
|
||||||
|
// text = object name
|
||||||
|
F_HOMELEVOB, // when this monster is auto generated on a level, place
|
||||||
|
// between v0 and v1 objects of type 'text' somewhere on
|
||||||
|
// the level.
|
||||||
F_AUTOCMD, // val0 = how many times to repeat this
|
F_AUTOCMD, // val0 = how many times to repeat this
|
||||||
F_LASTCMD, // text[0] = last command performed, v0/1 = x/y of cell, v2=various
|
F_LASTCMD, // text[0] = last command performed, v0/1 = x/y of cell, v2=various
|
||||||
F_CANLEARN, // lf is able to learn skill val0
|
F_CANLEARN, // lf is able to learn skill val0
|
||||||
|
@ -1612,6 +1625,8 @@ enum FLAG {
|
||||||
F_STARTHIDDENPCT, // val0 = pct chance auto-generated monster will
|
F_STARTHIDDENPCT, // val0 = pct chance auto-generated monster will
|
||||||
// start off hidden
|
// start off hidden
|
||||||
F_CORPSETYPE, // text field specifies what corpse obtype to leave
|
F_CORPSETYPE, // text field specifies what corpse obtype to leave
|
||||||
|
F_CORPSEFLAG, // add flag v0 to our corpse.
|
||||||
|
// v1->v0, v2->v1, text->text
|
||||||
F_MYCORPSE, // text field contains obid of my corpse.
|
F_MYCORPSE, // text field contains obid of my corpse.
|
||||||
// (for ghosts)
|
// (for ghosts)
|
||||||
F_NOCORPSE, // monster's body crumbles to dust after death
|
F_NOCORPSE, // monster's body crumbles to dust after death
|
||||||
|
@ -1644,6 +1659,8 @@ enum FLAG {
|
||||||
// vanish.
|
// vanish.
|
||||||
// v1 is lifetime left. this decrements each turn.
|
// v1 is lifetime left. this decrements each turn.
|
||||||
// when at zero, lf vanishes.
|
// when at zero, lf vanishes.
|
||||||
|
F_HATESRACE, // lf will attack lfs with race=v0 or baseid=v0 on
|
||||||
|
// sight
|
||||||
F_HOSTILE, // lf will attack the player if in sight
|
F_HOSTILE, // lf will attack the player if in sight
|
||||||
F_FRIENDLY, // lf will attack all non-players if in sight
|
F_FRIENDLY, // lf will attack all non-players if in sight
|
||||||
F_WANTS, // lf will try to pick up object type val0. if
|
F_WANTS, // lf will try to pick up object type val0. if
|
||||||
|
@ -1722,7 +1739,8 @@ enum FLAG {
|
||||||
F_MAGICARMOUR,// armour is magically boosted. f->text is the description
|
F_MAGICARMOUR,// armour is magically boosted. f->text is the description
|
||||||
// ie 'magic armour', 'force field'
|
// ie 'magic armour', 'force field'
|
||||||
// v0 is power left.
|
// v0 is power left.
|
||||||
F_ASLEEP, // is asleep
|
F_ASLEEP, // is asleep. if v2 is set, means we are sleeping on
|
||||||
|
// purpose and will wake up when at full hp/mp/etc.
|
||||||
F_ATTACHEDTO, // you are attached to lf id v0, and will move with it
|
F_ATTACHEDTO, // you are attached to lf id v0, and will move with it
|
||||||
F_BEINGSTONED,// turn to stone when v0 drops to zero. (drops 1/turn)
|
F_BEINGSTONED,// turn to stone when v0 drops to zero. (drops 1/turn)
|
||||||
F_BLIND, // cannot see anything
|
F_BLIND, // cannot see anything
|
||||||
|
@ -1795,6 +1813,9 @@ enum FLAG {
|
||||||
F_RESISTMAG, // immunity to magic effects. v0=amt (1-20)
|
F_RESISTMAG, // immunity to magic effects. v0=amt (1-20)
|
||||||
F_MPREGEN, // regenerate MP at val0 per turn
|
F_MPREGEN, // regenerate MP at val0 per turn
|
||||||
F_RAGE, // you are enraged. v0/v1 will be set to player's old hp/maxhp
|
F_RAGE, // you are enraged. v0/v1 will be set to player's old hp/maxhp
|
||||||
|
F_RETALIATE, // deal damage to anyone who hits you
|
||||||
|
// v0=ndice, v1=dsides, v2=damtype, text=obname
|
||||||
|
// text must have at least TWO words
|
||||||
F_RISEASGHOST, // become a ghost when you die.
|
F_RISEASGHOST, // become a ghost when you die.
|
||||||
F_SEEINDARK, // nightvis range is val0
|
F_SEEINDARK, // nightvis range is val0
|
||||||
F_TREMORSENSE, // doesn't need eyes to see, can see in dark with v0
|
F_TREMORSENSE, // doesn't need eyes to see, can see in dark with v0
|
||||||
|
@ -1831,8 +1852,8 @@ enum FLAG {
|
||||||
F_STATGAINREADY, // ready to increase str/int etc. v2 is how many times
|
F_STATGAINREADY, // ready to increase str/int etc. v2 is how many times
|
||||||
// we can do it.
|
// we can do it.
|
||||||
F_INTERRUPTED, // somethign interrupted our rest. stop!
|
F_INTERRUPTED, // somethign interrupted our rest. stop!
|
||||||
F_RESTING, // are we resting? cleared on any action other than rest.
|
F_TRAINING, // are we training? cleared on any action other than rest.
|
||||||
// v2 = if not, NA it is the training counter.
|
// v2 = if not NA, it is the training counter.
|
||||||
// when it hits 0, you finish trainign.
|
// when it hits 0, you finish trainign.
|
||||||
F_RESTUNTILHP, // resting until we have full hp
|
F_RESTUNTILHP, // resting until we have full hp
|
||||||
F_RESTUNTILMP, // resting until we have full mp
|
F_RESTUNTILMP, // resting until we have full mp
|
||||||
|
@ -2018,7 +2039,8 @@ enum ERROR {
|
||||||
//
|
//
|
||||||
E_NOBP = 48,
|
E_NOBP = 48,
|
||||||
E_VEGETARIAN = 49,
|
E_VEGETARIAN = 49,
|
||||||
E_NOOB = 50,
|
E_PARTVEGETARIAN= 50,
|
||||||
|
E_NOOB = 51,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
@ = human
|
||||||
|
: = timid animal
|
||||||
|
} = gas cloud
|
||||||
|
) = dancing weapon
|
||||||
|
A = avian / bird
|
||||||
|
a = ant
|
||||||
|
B = bat
|
||||||
|
C = celestial / divine ?
|
||||||
|
d = canine/dog
|
||||||
|
e = eye
|
||||||
|
f = feline/cat
|
||||||
|
g = goblin
|
||||||
|
i = insect
|
||||||
|
j = jelly/ooze/leech
|
||||||
|
k = kobold
|
||||||
|
G = large goblin
|
||||||
|
n = small humanoid / nymph / sprite
|
||||||
|
o = orc
|
||||||
|
O = ogre
|
||||||
|
p = sPirit
|
||||||
|
c = cockatricoe
|
||||||
|
x = small creature/monster
|
||||||
|
q = quadraped
|
||||||
|
Q = large quadraped
|
||||||
|
r = rodent
|
||||||
|
s = snake
|
||||||
|
S = spider
|
||||||
|
h = humanoid
|
||||||
|
H = large humanoid
|
||||||
|
U = unearthly/demonic/horrific creature
|
||||||
|
w = worm
|
||||||
|
z = lizard-like creature
|
||||||
|
Z = undead
|
||||||
|
|
||||||
|
---
|
||||||
|
C
|
||||||
|
hybrid human animal?
|
34
flag.c
34
flag.c
|
@ -105,7 +105,22 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
|
||||||
if ((gamemode == GM_GAMESTARTED)) {
|
if ((gamemode == GM_GAMESTARTED)) {
|
||||||
if (f->pile->owner) {
|
if (f->pile->owner) {
|
||||||
if (announceflaggain(f->pile->owner, f)) {
|
if (announceflaggain(f->pile->owner, f)) {
|
||||||
addflag(f->pile, F_INTERRUPTED, B_TRUE, NA, NA, NULL); // note: recursive call!
|
// don't include flags which interrupt will kill!
|
||||||
|
switch (f->id) {
|
||||||
|
case F_RUNNING:
|
||||||
|
case F_TRAINING:
|
||||||
|
case F_AUTOCMD:
|
||||||
|
break;
|
||||||
|
case F_ASLEEP:
|
||||||
|
if (f->val[2] == NA) { // ie. sleeping, not resting
|
||||||
|
addflag(f->pile, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
addflag(f->pile, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
f->known = B_TRUE;
|
f->known = B_TRUE;
|
||||||
if (f->obfrom) {
|
if (f->obfrom) {
|
||||||
object_t *ob;
|
object_t *ob;
|
||||||
|
@ -198,6 +213,15 @@ void copyflags(flagpile_t *dst, flagpile_t *src, int lifetime) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int countflags(flagpile_t *fp) {
|
||||||
|
flag_t *f;
|
||||||
|
int count = 0;
|
||||||
|
for (f = fp->first ; f ; f = f->next) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
int flagcausesredraw(lifeform_t *lf, enum FLAG fid) {
|
int flagcausesredraw(lifeform_t *lf, enum FLAG fid) {
|
||||||
if (!lf) return B_FALSE;
|
if (!lf) return B_FALSE;
|
||||||
|
|
||||||
|
@ -334,6 +358,7 @@ void killflag(flag_t *f) {
|
||||||
lifeform_t *lf;
|
lifeform_t *lf;
|
||||||
int doredraw = B_FALSE;
|
int doredraw = B_FALSE;
|
||||||
|
|
||||||
|
|
||||||
lf = f->pile->owner;
|
lf = f->pile->owner;
|
||||||
|
|
||||||
// flags which cause a redraw
|
// flags which cause a redraw
|
||||||
|
@ -364,10 +389,15 @@ void killflag(flag_t *f) {
|
||||||
if (announceflagloss(lf, f)) {
|
if (announceflagloss(lf, f)) {
|
||||||
// don't include flags which interrupt will kill!
|
// don't include flags which interrupt will kill!
|
||||||
switch (f->id) {
|
switch (f->id) {
|
||||||
case F_RESTING:
|
|
||||||
case F_RUNNING:
|
case F_RUNNING:
|
||||||
|
case F_TRAINING:
|
||||||
case F_AUTOCMD:
|
case F_AUTOCMD:
|
||||||
break;
|
break;
|
||||||
|
case F_ASLEEP:
|
||||||
|
if (f->val[2] != NA) { // ie. resting
|
||||||
|
addflag(lf->flags, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
addflag(lf->flags, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
|
addflag(lf->flags, F_INTERRUPTED, B_TRUE, NA, NA, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
1
flag.h
1
flag.h
|
@ -8,6 +8,7 @@ flag_t *addflag_real(flagpile_t *fp, enum FLAG id, int val1, int val2, int val3,
|
||||||
flagpile_t *addflagpile(lifeform_t *owner, object_t *o);
|
flagpile_t *addflagpile(lifeform_t *owner, object_t *o);
|
||||||
void copyflag(flagpile_t *dst, flagpile_t *src, enum FLAG id);
|
void copyflag(flagpile_t *dst, flagpile_t *src, enum FLAG id);
|
||||||
void copyflags(flagpile_t *dst, flagpile_t *src, int lifetime);
|
void copyflags(flagpile_t *dst, flagpile_t *src, int lifetime);
|
||||||
|
int countflags(flagpile_t *fp);
|
||||||
int flagcausesredraw(lifeform_t *lf, enum FLAG fid);
|
int flagcausesredraw(lifeform_t *lf, enum FLAG fid);
|
||||||
int flagstacks(enum FLAG fid);
|
int flagstacks(enum FLAG fid);
|
||||||
int modcounter(flagpile_t *fp, int amt);
|
int modcounter(flagpile_t *fp, int amt);
|
||||||
|
|
273
io.c
273
io.c
|
@ -62,6 +62,8 @@ extern lifeform_t *player;
|
||||||
|
|
||||||
extern map_t *firstmap;
|
extern map_t *firstmap;
|
||||||
|
|
||||||
|
int gettinginput = B_FALSE;
|
||||||
|
|
||||||
int viewx = -9999,viewy = -9999;
|
int viewx = -9999,viewy = -9999;
|
||||||
|
|
||||||
int vieww,viewh;
|
int vieww,viewh;
|
||||||
|
@ -516,18 +518,20 @@ cell_t *askcoords(char *prompt, int targettype) {
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
strcat(extrainfo, "fleeing");
|
strcat(extrainfo, "fleeing");
|
||||||
}
|
}
|
||||||
if (lfhasflag(c->lf, F_PRONE)) {
|
f = lfhasflag(c->lf, F_ASLEEP);
|
||||||
|
if (f) {
|
||||||
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
|
if (f->val[2] == NA) {
|
||||||
|
strcat(extrainfo, "sleeping");
|
||||||
|
} else {
|
||||||
|
strcat(extrainfo, "resting");
|
||||||
|
}
|
||||||
|
} else if (lfhasflag(c->lf, F_PRONE)) {
|
||||||
|
// prevent showing 'prone' AND 'asleep'
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
strcat(extrainfo, "prone");
|
strcat(extrainfo, "prone");
|
||||||
}
|
}
|
||||||
if (lfhasflag(c->lf, F_RESTING)) {
|
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
|
||||||
strcat(extrainfo, "resting");
|
|
||||||
}
|
|
||||||
if (lfhasflag(c->lf, F_ASLEEP)) {
|
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
|
||||||
strcat(extrainfo, "asleep");
|
|
||||||
}
|
|
||||||
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;
|
||||||
|
@ -602,6 +606,13 @@ cell_t *askcoords(char *prompt, int targettype) {
|
||||||
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
strcat(extrainfo, "enraged");
|
strcat(extrainfo, "enraged");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (f = c->lf->flags->first ; f ; f = f->next) {
|
||||||
|
if (f->id == F_RETALIATE) {
|
||||||
|
if (strlen(extrainfo)) strcat(extrainfo, ", ");
|
||||||
|
strcat(extrainfo, f->text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wep = getweapon(c->lf);
|
wep = getweapon(c->lf);
|
||||||
if (wep && (c->lf->race->id != R_DANCINGWEAPON)) {
|
if (wep && (c->lf->race->id != R_DANCINGWEAPON)) {
|
||||||
|
@ -859,7 +870,19 @@ int announceflaggain(lifeform_t *lf, flag_t *f) {
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
break;
|
break;
|
||||||
case F_ASLEEP:
|
case F_ASLEEP:
|
||||||
msg("%s fall%s asleep.",lfname, isplayer(lf) ? "" : "s");
|
if (isplayer(lf) && (f->val[2] != NA)) { // ie. resting
|
||||||
|
object_t *restob;
|
||||||
|
restob = getrestob(lf);
|
||||||
|
if (restob) {
|
||||||
|
char restobname[BUFLEN];
|
||||||
|
getobname(restob, restobname, 1);
|
||||||
|
msg("You start resting (in your %s)...",noprefix(restobname));
|
||||||
|
} else {
|
||||||
|
msg("You start resting (on the ground)...");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msg("%s fall%s asleep.",lfname, isplayer(lf) ? "" : "s");
|
||||||
|
}
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
break;
|
break;
|
||||||
case F_ATTACHEDTO:
|
case F_ATTACHEDTO:
|
||||||
|
@ -1146,6 +1169,12 @@ int announceflaggain(lifeform_t *lf, flag_t *f) {
|
||||||
msg("%s enter%s a berzerker rage!", lfname, isplayer(lf) ? "" : "s");
|
msg("%s enter%s a berzerker rage!", lfname, isplayer(lf) ? "" : "s");
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case F_RETALIATE:
|
||||||
|
msg("%s appear%s from %s%s skin.", noprefix(f->text),
|
||||||
|
(f->text[strlen(f->text)-1] == 's') ? "" : "s",
|
||||||
|
lfname, getpossessive(lfname));
|
||||||
|
donesomething = B_TRUE;
|
||||||
|
break;
|
||||||
case F_REGENERATES:
|
case F_REGENERATES:
|
||||||
if (isplayer(lf)) { // don't know if monsters get it
|
if (isplayer(lf)) { // don't know if monsters get it
|
||||||
msg("Your body's healing rate is enhanced!");
|
msg("Your body's healing rate is enhanced!");
|
||||||
|
@ -1584,6 +1613,12 @@ int announceflagloss(lifeform_t *lf, flag_t *f) {
|
||||||
msg("%s %s less angry now.", lfname, isplayer(lf) ? "feel" : "seems");
|
msg("%s %s less angry now.", lfname, isplayer(lf) ? "feel" : "seems");
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case F_RETALIATE:
|
||||||
|
msg("%s disappear%s from %s%s skin.", noprefix(f->text),
|
||||||
|
(f->text[strlen(f->text)-1] == 's') ? "" : "s",
|
||||||
|
lfname, getpossessive(lfname));
|
||||||
|
donesomething = B_TRUE;
|
||||||
|
break;
|
||||||
case F_REGENERATES:
|
case F_REGENERATES:
|
||||||
if (isplayer(lf)) { // don't know if monsters lose it
|
if (isplayer(lf)) { // don't know if monsters lose it
|
||||||
msg("Your healing rate is no longer enhanced.");
|
msg("Your healing rate is no longer enhanced.");
|
||||||
|
@ -1931,7 +1966,7 @@ object_t *doaskobject(obpile_t *op, char *prompt, int *count, long opts, ...) {
|
||||||
wantflag[nwantflags] = va_arg(flags, enum FLAG);
|
wantflag[nwantflags] = va_arg(flags, enum FLAG);
|
||||||
}
|
}
|
||||||
va_end(flags);
|
va_end(flags);
|
||||||
dblog("nwantflags is %d",nwantflags);
|
//dblog("nwantflags is %d",nwantflags);
|
||||||
|
|
||||||
// remember player's current ammo
|
// remember player's current ammo
|
||||||
if (op->owner) {
|
if (op->owner) {
|
||||||
|
@ -2883,6 +2918,9 @@ void describeob(object_t *o) {
|
||||||
case F_PRODUCESLIGHT:
|
case F_PRODUCESLIGHT:
|
||||||
mvwprintw(mainwin, y, 0, "%s produces light.", buf); y++;
|
mvwprintw(mainwin, y, 0, "%s produces light.", buf); y++;
|
||||||
break;
|
break;
|
||||||
|
case F_RETALIATE:
|
||||||
|
mvwprintw(mainwin, y, 0, "%s protects you with %s.", buf, f->text); y++;
|
||||||
|
break;
|
||||||
case F_RAGE:
|
case F_RAGE:
|
||||||
mvwprintw(mainwin, y, 0, "%s makes you enraged.", buf); y++;
|
mvwprintw(mainwin, y, 0, "%s makes you enraged.", buf); y++;
|
||||||
break;
|
break;
|
||||||
|
@ -3171,6 +3209,7 @@ void docomms(void) {
|
||||||
char buf[BUFLEN];
|
char buf[BUFLEN];
|
||||||
char lfname[BUFLEN];
|
char lfname[BUFLEN];
|
||||||
char ch;
|
char ch;
|
||||||
|
flag_t *f;
|
||||||
|
|
||||||
where = askcoords("Talk to who?", TT_MONSTER);
|
where = askcoords("Talk to who?", TT_MONSTER);
|
||||||
if (where && where->lf && cansee(player, where->lf)) {
|
if (where && where->lf && cansee(player, where->lf)) {
|
||||||
|
@ -3194,7 +3233,9 @@ void docomms(void) {
|
||||||
if (isadjacent(lf->cell, player->cell) && !lfhasflag(lf, F_NOPACK)) {
|
if (isadjacent(lf->cell, player->cell) && !lfhasflag(lf, F_NOPACK)) {
|
||||||
addchoice(&prompt, 't', "Trade items with me", NULL, NULL);
|
addchoice(&prompt, 't', "Trade items with me", NULL, NULL);
|
||||||
}
|
}
|
||||||
if (lfhasflag(lf, F_RESTING)) {
|
|
||||||
|
f = isresting(lf);
|
||||||
|
if (f) {
|
||||||
addchoice(&prompt, 'r', "Stop resting.", NULL, NULL);
|
addchoice(&prompt, 'r', "Stop resting.", NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
addchoice(&prompt, 'r', "Rest until you are healed.", NULL, NULL);
|
addchoice(&prompt, 'r', "Rest until you are healed.", NULL, NULL);
|
||||||
|
@ -3240,7 +3281,8 @@ void docomms(void) {
|
||||||
msg("Cancelled.");
|
msg("Cancelled.");
|
||||||
return;
|
return;
|
||||||
case 'r':
|
case 'r':
|
||||||
if (lfhasflag(lf, F_RESTING)) {
|
f = isresting(lf);
|
||||||
|
if (f) {
|
||||||
stopresting(lf);
|
stopresting(lf);
|
||||||
} else {
|
} else {
|
||||||
if (needstorest(lf, NULL)) {
|
if (needstorest(lf, NULL)) {
|
||||||
|
@ -4465,7 +4507,7 @@ void dorest(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (countnearbyallies(player)) {
|
if (countnearbyhurtallies(player)) {
|
||||||
strcpy(ques, "Rest until nearby allies are healed?");
|
strcpy(ques, "Rest until nearby allies are healed?");
|
||||||
ch = askchar(ques, "yn", "y", B_TRUE);
|
ch = askchar(ques, "yn", "y", B_TRUE);
|
||||||
if (ch == 'y') {
|
if (ch == 'y') {
|
||||||
|
@ -5252,11 +5294,13 @@ int getkey(void) {
|
||||||
key_code = getch();
|
key_code = getch();
|
||||||
|
|
||||||
// XXX NEW CODE:
|
// XXX NEW CODE:
|
||||||
if (strcmp(msgbuf, "")) {
|
if (gettinginput) {
|
||||||
clearmsg();
|
if (strcmp(msgbuf, "")) {
|
||||||
//strcpy(msgbuf, "");
|
clearmsg();
|
||||||
//drawmsg();
|
//strcpy(msgbuf, "");
|
||||||
//drawcursor();
|
//drawmsg();
|
||||||
|
//drawcursor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return keycodetokey(key_code);
|
return keycodetokey(key_code);
|
||||||
|
@ -5347,7 +5391,9 @@ void handleinput(void) {
|
||||||
f->val[0]--;
|
f->val[0]--;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
gettinginput = B_TRUE;
|
||||||
ch = getkey();
|
ch = getkey();
|
||||||
|
gettinginput = B_FALSE;
|
||||||
}
|
}
|
||||||
gotcmd = B_TRUE;
|
gotcmd = B_TRUE;
|
||||||
|
|
||||||
|
@ -5823,7 +5869,7 @@ void drawstatus(void) {
|
||||||
wprintw(statwin, " Next:%ld",xpleft);
|
wprintw(statwin, " Next:%ld",xpleft);
|
||||||
}
|
}
|
||||||
// blinded?
|
// blinded?
|
||||||
if (isblind(player)) {
|
if (isblind(player) && !lfhasflag(player, F_ASLEEP)) {
|
||||||
setcol(statwin, C_RED);
|
setcol(statwin, C_RED);
|
||||||
wprintw(statwin, " Blind");
|
wprintw(statwin, " Blind");
|
||||||
unsetcol(statwin, C_RED);
|
unsetcol(statwin, C_RED);
|
||||||
|
@ -5836,7 +5882,15 @@ void drawstatus(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// paralysed somehow?
|
// paralysed somehow?
|
||||||
if (isimmobile(player)) {
|
if (isresting(player)) {
|
||||||
|
setcol(statwin, C_CYAN);
|
||||||
|
wprintw(statwin, " Resting");
|
||||||
|
unsetcol(statwin, C_CYAN);
|
||||||
|
} else if (lfhasflag(player, F_ASLEEP)) {
|
||||||
|
setcol(statwin, C_BLUE);
|
||||||
|
wprintw(statwin, " Asleep");
|
||||||
|
unsetcol(statwin, C_BLUE);
|
||||||
|
} else if (isimmobile(player)) {
|
||||||
setcol(statwin, C_RED);
|
setcol(statwin, C_RED);
|
||||||
wprintw(statwin, " Immobile");
|
wprintw(statwin, " Immobile");
|
||||||
unsetcol(statwin, C_RED);
|
unsetcol(statwin, C_RED);
|
||||||
|
@ -6283,14 +6337,17 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
int y = 0, y2 = 0, x2 = 40;
|
int y = 0, y2 = 0, x2 = 40;
|
||||||
int x;
|
int x;
|
||||||
int arating, evasion;
|
int arating, evasion;
|
||||||
int speed,acc;
|
int acc;
|
||||||
|
char actbuf[BUFLEN],movebuf[BUFLEN];
|
||||||
int h;
|
int h;
|
||||||
char buf[BUFLEN],buf2[BUFLEN];
|
char buf[BUFLEN],buf2[BUFLEN];
|
||||||
job_t *j;
|
job_t *j;
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
char *ftext= "%12s: ";
|
char *ftext= "%12s: ";
|
||||||
long xpneeded;
|
long xpneeded;
|
||||||
object_t *w;
|
object_t *o;
|
||||||
|
object_t *w[2];
|
||||||
|
int nweps = 0;
|
||||||
objecttype_t *ot;
|
objecttype_t *ot;
|
||||||
int first;
|
int first;
|
||||||
int i;
|
int i;
|
||||||
|
@ -6552,73 +6609,91 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
// now go to second column
|
// now go to second column
|
||||||
|
|
||||||
|
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "# Attacks");
|
||||||
|
wprintw(mainwin, "%d", getmaxattacks(lf)); y2++;
|
||||||
|
y2++;
|
||||||
|
|
||||||
// current weapon + dam
|
// current weapon + dam
|
||||||
w = getweapon(lf);
|
|
||||||
if (w) {
|
|
||||||
int mindam,maxdam;
|
|
||||||
int bonus;
|
|
||||||
|
|
||||||
// weapon
|
nweps = 0;
|
||||||
sprintf(buf, "%s", w->type->name);
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Weapon");
|
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
|
||||||
|
|
||||||
if (showall) {
|
o = getweapon(lf);
|
||||||
// damage
|
if (o) w[nweps++] = o;
|
||||||
f = hasflag(w->flags, F_BONUS);
|
|
||||||
if (f && f->known) {
|
|
||||||
// only tell player about bonuses if they are known.!
|
|
||||||
bonus = f->val[0];
|
|
||||||
} else {
|
|
||||||
bonus = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = hasflag(w->flags, F_DAM);
|
|
||||||
if (f) {
|
|
||||||
getdamrange(f, &mindam, &maxdam);
|
|
||||||
} else {
|
|
||||||
mindam = 0;
|
|
||||||
maxdam = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mindam += bonus;
|
|
||||||
maxdam += bonus;
|
|
||||||
|
|
||||||
// apply damage mod for strength
|
|
||||||
if (!hasflag(w->flags, F_NOSTRDAMMOD) && !lfhasflag(lf, F_NOSTRDAMMOD)) {
|
|
||||||
mindam = (int)((float)mindam * dammod);
|
|
||||||
maxdam = (int)((float)maxdam * dammod);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mindam < 0) mindam = 0;
|
|
||||||
if (maxdam < 0) maxdam = 0;
|
|
||||||
|
|
||||||
sprintf(buf, "%d-%d",(int)mindam,(int)maxdam);
|
|
||||||
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Weapon Dmg");
|
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
|
||||||
|
|
||||||
// chance to hit
|
|
||||||
acc = getlfaccuracy(lf, w);
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Wep.Accuracy");
|
|
||||||
wprintw(mainwin, "%d%%", acc); y2++;
|
|
||||||
|
|
||||||
// attack speed
|
|
||||||
speed = getattackspeed(lf);
|
|
||||||
getspeedname(speed, buf);
|
|
||||||
capitalise(buf);
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Attack Speed");
|
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
|
||||||
|
|
||||||
|
o = getsecmeleeweapon(lf);
|
||||||
|
if (o) {
|
||||||
|
// can't be the same as the first one!
|
||||||
|
if ((nweps == 1) && (o == w[0])) {
|
||||||
|
} else {
|
||||||
|
w[nweps++] = o;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// no damage
|
|
||||||
sprintf(buf, "N/A");
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Current Weapon");
|
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nweps; i++) {
|
||||||
|
if (w[i]) {
|
||||||
|
int mindam,maxdam;
|
||||||
|
int bonus,speed;
|
||||||
|
|
||||||
|
// weapon
|
||||||
|
if (showall) {
|
||||||
|
char buf2[BUFLEN];
|
||||||
|
// calculate damage
|
||||||
|
f = hasflag(w[i]->flags, F_BONUS);
|
||||||
|
if (f && f->known) {
|
||||||
|
// only tell player about bonuses if they are known.!
|
||||||
|
bonus = f->val[0];
|
||||||
|
} else {
|
||||||
|
bonus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = hasflag(w[i]->flags, F_DAM);
|
||||||
|
if (f) {
|
||||||
|
getdamrange(f, &mindam, &maxdam);
|
||||||
|
} else {
|
||||||
|
mindam = 0;
|
||||||
|
maxdam = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mindam += bonus;
|
||||||
|
maxdam += bonus;
|
||||||
|
|
||||||
|
// apply damage mod for strength
|
||||||
|
if (!hasflag(w[i]->flags, F_NOSTRDAMMOD) && !lfhasflag(lf, F_NOSTRDAMMOD)) {
|
||||||
|
mindam = (int)((float)mindam * dammod);
|
||||||
|
maxdam = (int)((float)maxdam * dammod);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mindam < 0) mindam = 0;
|
||||||
|
if (maxdam < 0) maxdam = 0;
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(buf, "%s (%d-%d dmg)", w[i]->type->name,(int)mindam,(int)maxdam);
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "Weapon");
|
||||||
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
|
||||||
|
// attack speed
|
||||||
|
acc = getlfaccuracy(lf, w[i]);
|
||||||
|
speed = getattackspeed(lf);
|
||||||
|
getspeedname(speed, buf2);
|
||||||
|
capitalise(buf2);
|
||||||
|
sprintf(buf, "%s, %d%%",buf2,acc);
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "Speed/Acc");
|
||||||
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// just show weapon name
|
||||||
|
sprintf(buf, "%s", w[i]->type->name);
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "Weapon");
|
||||||
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no weapon
|
||||||
|
sprintf(buf, "N/A");
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "Current Weapon");
|
||||||
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
}
|
||||||
|
} // end for each weapon
|
||||||
|
|
||||||
// skip a line
|
// skip a line
|
||||||
y2++;
|
y2++;
|
||||||
|
|
||||||
|
@ -6675,7 +6750,7 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
|
|
||||||
|
|
||||||
// no attacks at all?
|
// no attacks at all?
|
||||||
if (!w && !op->first) {
|
if ((nweps == 0) && !op->first) {
|
||||||
sprintf(buf, "N/A");
|
sprintf(buf, "N/A");
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Attack");
|
mvwprintw(mainwin, y2, x2, ftext, "Attack");
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
@ -6709,18 +6784,17 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
y2++; // skip line
|
y2++; // skip line
|
||||||
}
|
}
|
||||||
|
|
||||||
speed = getactspeed(lf);
|
getspeednameshort(getactspeed(player), actbuf);
|
||||||
getspeedname(speed, buf);
|
getspeednameshort(getmovespeed(player), movebuf);
|
||||||
capitalise(buf);
|
if (!strcmp(actbuf, movebuf)) {
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Action Speed");
|
sprintf(buf, "%s", actbuf);
|
||||||
|
capitalise(buf);
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "Mv:%s Act:%s", movebuf,actbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
mvwprintw(mainwin, y2, x2, ftext, "Speed");
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
wprintw(mainwin, "%-20s", buf); y2++;
|
||||||
|
|
||||||
speed = getmovespeed(lf);
|
|
||||||
getspeedname(speed, buf);
|
|
||||||
capitalise(buf);
|
|
||||||
mvwprintw(mainwin, y2, x2, ftext, "Move Speed");
|
|
||||||
wprintw(mainwin, "%-20s", buf); y2++;
|
|
||||||
|
|
||||||
|
|
||||||
y2++; // skip line
|
y2++; // skip line
|
||||||
|
|
||||||
|
@ -6993,6 +7067,17 @@ void showlfstats(lifeform_t *lf, int showall) {
|
||||||
y++;
|
y++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
f = lfhasflag(lf, F_RETALIATE);
|
||||||
|
if (f && (f->known)) {
|
||||||
|
if (showall || (lorelev >= PR_BEGINNER)) {
|
||||||
|
mvwprintw(mainwin, y, 0, "%s %s covered by %s (%dd%d %s dmg to attackers).", you(lf), is(lf), f->text,
|
||||||
|
f->val[0], f->val[1], getdamname(f->val[2]));
|
||||||
|
} else {
|
||||||
|
mvwprintw(mainwin, y, 0, "%s %s covered by %s", you(lf), is(lf), f->text);
|
||||||
|
}
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
// fleeing?
|
// fleeing?
|
||||||
if (showall) {
|
if (showall) {
|
||||||
for (f = lf->flags->first ; f ; f = f->next) {
|
for (f = lf->flags->first ; f ; f = f->next) {
|
||||||
|
|
9
lf.h
9
lf.h
|
@ -34,8 +34,10 @@ int cantakeoff(lifeform_t *lf, object_t *o);
|
||||||
int castspell(lifeform_t *lf, enum OBTYPE sid, lifeform_t *targlf, object_t *targob, cell_t *targcell);
|
int castspell(lifeform_t *lf, enum OBTYPE sid, lifeform_t *targlf, object_t *targob, cell_t *targcell);
|
||||||
void checkxp(enum RACE rid);
|
void checkxp(enum RACE rid);
|
||||||
float comparelfs(lifeform_t *lf1, lifeform_t *lf2);
|
float comparelfs(lifeform_t *lf1, lifeform_t *lf2);
|
||||||
|
int countinnateattacks(lifeform_t *lf);
|
||||||
int countmoney(lifeform_t *lf);
|
int countmoney(lifeform_t *lf);
|
||||||
int countnearbyallies(lifeform_t *lf);
|
int countnearbyallies(lifeform_t *lf);
|
||||||
|
int countnearbyhurtallies(lifeform_t *lf);
|
||||||
void debug(lifeform_t *lf);
|
void debug(lifeform_t *lf);
|
||||||
void die(lifeform_t *lf);
|
void die(lifeform_t *lf);
|
||||||
void dumplev(void);
|
void dumplev(void);
|
||||||
|
@ -45,6 +47,7 @@ int eat(lifeform_t *lf, object_t *o);
|
||||||
void enhanceskills(lifeform_t *lf);
|
void enhanceskills(lifeform_t *lf);
|
||||||
object_t *eyesshaded(lifeform_t *lf);
|
object_t *eyesshaded(lifeform_t *lf);
|
||||||
int fall(lifeform_t *lf, lifeform_t *fromlf, int announce);
|
int fall(lifeform_t *lf, lifeform_t *fromlf, int announce);
|
||||||
|
int fallasleep(lifeform_t *lf, int howlong);
|
||||||
void fightback(lifeform_t *lf, lifeform_t *attacker);
|
void fightback(lifeform_t *lf, lifeform_t *attacker);
|
||||||
job_t *findjob(enum JOB jobid);
|
job_t *findjob(enum JOB jobid);
|
||||||
job_t *findjobbyname(char *name);
|
job_t *findjobbyname(char *name);
|
||||||
|
@ -105,6 +108,7 @@ char *getseenlfconditionname(lifeform_t *lf, lifeform_t *viewer);
|
||||||
glyph_t *getlfglyph(lifeform_t *lf);
|
glyph_t *getlfglyph(lifeform_t *lf);
|
||||||
enum MATERIAL getlfmaterial(lifeform_t *lf);
|
enum MATERIAL getlfmaterial(lifeform_t *lf);
|
||||||
enum SKILLLEVEL getlorelevel(lifeform_t *lf, enum RACECLASS rcid);
|
enum SKILLLEVEL getlorelevel(lifeform_t *lf, enum RACECLASS rcid);
|
||||||
|
int getmaxattacks(lifeform_t *lf);
|
||||||
float getmaxcarryweight(lifeform_t *lf);
|
float getmaxcarryweight(lifeform_t *lf);
|
||||||
float getmaxliftweight(lifeform_t *lf);
|
float getmaxliftweight(lifeform_t *lf);
|
||||||
int getmaxmp(lifeform_t *lf);
|
int getmaxmp(lifeform_t *lf);
|
||||||
|
@ -121,6 +125,8 @@ char *getlfnamea(lifeform_t *lf, char *buf);
|
||||||
char *real_getlfnamea(lifeform_t *lf, char *buf, int usevis);
|
char *real_getlfnamea(lifeform_t *lf, char *buf, int usevis);
|
||||||
enum LFSIZE getlfsize(lifeform_t *lf);
|
enum LFSIZE getlfsize(lifeform_t *lf);
|
||||||
float getlfweight(lifeform_t *lf, int withobs);
|
float getlfweight(lifeform_t *lf, int withobs);
|
||||||
|
object_t *getsecmeleeweapon(lifeform_t *lf);
|
||||||
|
object_t *getshield(lifeform_t *lf);
|
||||||
int getspellspeed(lifeform_t *lf);
|
int getspellspeed(lifeform_t *lf);
|
||||||
char *getplayername(char *buf);
|
char *getplayername(char *buf);
|
||||||
char *getplayernamefull(char *buf);
|
char *getplayernamefull(char *buf);
|
||||||
|
@ -133,6 +139,7 @@ object_t *getrandomarmour(lifeform_t *lf);
|
||||||
//int getrandommonlevel(int depth);
|
//int getrandommonlevel(int depth);
|
||||||
race_t *getrandomrace(map_t *map, int forcedepth);
|
race_t *getrandomrace(map_t *map, int forcedepth);
|
||||||
race_t *getreallyrandomrace(void);
|
race_t *getreallyrandomrace(void);
|
||||||
|
object_t *getrestob(lifeform_t *lf);
|
||||||
enum SKILLLEVEL getskill(lifeform_t *lf, enum SKILL id);
|
enum SKILLLEVEL getskill(lifeform_t *lf, enum SKILL id);
|
||||||
char *getspeedname(int speed, char *buf);
|
char *getspeedname(int speed, char *buf);
|
||||||
char *getspeednameshort(int speed, char *buf);
|
char *getspeednameshort(int speed, char *buf);
|
||||||
|
@ -177,6 +184,7 @@ enum BURDENED isburdened(lifeform_t *lf);
|
||||||
int ischarmable(lifeform_t *lf);
|
int ischarmable(lifeform_t *lf);
|
||||||
int isdead(lifeform_t *lf);
|
int isdead(lifeform_t *lf);
|
||||||
flag_t *isdrunk(lifeform_t *lf);
|
flag_t *isdrunk(lifeform_t *lf);
|
||||||
|
object_t *isdualweilding(lifeform_t *lf);
|
||||||
int isfleeing(lifeform_t *lf);
|
int isfleeing(lifeform_t *lf);
|
||||||
int isfreebp(lifeform_t *lf, enum BODYPART bp);
|
int isfreebp(lifeform_t *lf, enum BODYPART bp);
|
||||||
int isfriendly(lifeform_t *lf);
|
int isfriendly(lifeform_t *lf);
|
||||||
|
@ -193,6 +201,7 @@ flag_t *ispoisoned(lifeform_t *lf);
|
||||||
int ispolymorphed(lifeform_t *lf);
|
int ispolymorphed(lifeform_t *lf);
|
||||||
int isprone(lifeform_t *lf);
|
int isprone(lifeform_t *lf);
|
||||||
flag_t *isresistantto(flagpile_t *fp, enum DAMTYPE dt);
|
flag_t *isresistantto(flagpile_t *fp, enum DAMTYPE dt);
|
||||||
|
flag_t *isresting(lifeform_t *lf);
|
||||||
object_t *isstuck(lifeform_t *lf);
|
object_t *isstuck(lifeform_t *lf);
|
||||||
flag_t *isvulnto(flagpile_t *fp, enum DAMTYPE dt);
|
flag_t *isvulnto(flagpile_t *fp, enum DAMTYPE dt);
|
||||||
void killjob(job_t *job);
|
void killjob(job_t *job);
|
||||||
|
|
607
log.txt
607
log.txt
|
@ -2,612 +2,5 @@
|
||||||
|
|
||||||
|
|
||||||
====== NEW LOGFILE ====
|
====== NEW LOGFILE ====
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
xxx
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
finding random lf with rarity val 92-100
|
|
||||||
|
|
||||||
-> possibility: kobold, rarity=95
|
|
||||||
-> possibility: xat, rarity=95
|
|
||||||
-> possibility: giant bat, rarity=95
|
|
||||||
-> possibility: giant newt, rarity=100
|
|
||||||
-> possibility: giant rat, rarity=95
|
|
||||||
got 5 possibilities.
|
|
||||||
rollhitdice() - rolling 2d4 + 2
|
|
||||||
rollhitdice() - mod is +44%
|
|
||||||
rollhitdice() ---- die 1/2 == 4
|
|
||||||
rollhitdice() ---- die 2/2 == 4
|
|
||||||
TOTAL: 8
|
|
||||||
-> modified to: 11
|
|
||||||
test
|
|
||||||
givejob() starting.
|
givejob() starting.
|
||||||
|
|
||||||
processing normal flag: 228
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 174
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 173
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 263
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 175
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 260
|
|
||||||
processing normal flag: 338
|
|
||||||
test
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { cannot see my master - adding F_TARGETCELL for last known loc }
|
|
||||||
.oO { something going to targecell: 1, 2 }
|
|
||||||
.oO { walking from 1,4 towards f_targetcell (1,2) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,3 }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving randomly }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { cannot see my master - adding F_TARGETCELL for last known loc }
|
|
||||||
.oO { your young wolf going to targecell: 1, 1 }
|
|
||||||
.oO { walking from 1,3 towards f_targetcell (1,1) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,2 }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving randomly }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { cannot see my master - adding F_TARGETCELL for last known loc }
|
|
||||||
.oO { something going to targecell: 1, 1 }
|
|
||||||
.oO { walking from 3,1 towards f_targetcell (1,1) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 2,1 }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { walking from 2,1 towards f_targetcell (1,1) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,1 }
|
|
||||||
.oO { arrived at f_targetcell. removing. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { i can see my master - moving towards them }
|
|
||||||
.oO { success. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { cannot see my master - adding F_TARGETCELL for last known loc }
|
|
||||||
.oO { something going to targecell: 1, 13 }
|
|
||||||
.oO { walking from 1,10 towards f_targetcell (1,13) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,11 }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { walking from 1,11 towards f_targetcell (1,13) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,12 }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { walking from 1,12 towards f_targetcell (1,13) ... }
|
|
||||||
.oO { successfully walked towards f_targetcell. arrived at 1,13 }
|
|
||||||
.oO { arrived at f_targetcell. removing. }
|
|
||||||
AIMOVE: your young wolf
|
|
||||||
.oO { looking for covetted objects... }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { looking for any ob which i want. }
|
|
||||||
.oO { no targetcell, so looking for remote objects }
|
|
||||||
.oO { didn't find any obs i want }
|
|
||||||
.oO { i do not have a target or can't move towards it. }
|
|
||||||
.oO { i am friendly to the player. looking for a target. }
|
|
||||||
.oO { cannot see my master and am at last known loc. trying last known dir (Southeast) }
|
|
||||||
.oO { ...successfully }
|
|
||||||
|
|
186
map.c
186
map.c
|
@ -45,6 +45,27 @@ cell_t *addcell(map_t *m, int x, int y) {
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addhomeobs(lifeform_t *lf) {
|
||||||
|
flag_t *f;
|
||||||
|
for (f = lf->flags->first ; f ; f = f->next) {
|
||||||
|
if (f->id == F_HOMEOB) {
|
||||||
|
addob(lf->cell->obpile, f->text);
|
||||||
|
} else if (f->id == F_HOMELEVOB) {
|
||||||
|
int i,amt;
|
||||||
|
amt = rnd(f->val[0],f->val[1]);
|
||||||
|
for (i = 0; i < amt; i++) {
|
||||||
|
cell_t *c;
|
||||||
|
// pick new EMPTY random spot
|
||||||
|
c = getrandomcell(lf->cell->map);
|
||||||
|
while (!cellwalkable(NULL, c, NULL)) {
|
||||||
|
c = getrandomcell(lf->cell->map);
|
||||||
|
}
|
||||||
|
addob(c->obpile, f->text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
map_t *addmap(void) {
|
map_t *addmap(void) {
|
||||||
map_t *a;
|
map_t *a;
|
||||||
int id;
|
int id;
|
||||||
|
@ -166,7 +187,6 @@ lifeform_t *addmonster(cell_t *c, enum RACE raceid, int jobok, int amt, int auto
|
||||||
newlf->born = B_FALSE;
|
newlf->born = B_FALSE;
|
||||||
if (lfhasflag(lf, F_ASLEEP)) addflag(newlf->flags, F_ASLEEP, B_TRUE, NA, NA, NULL);
|
if (lfhasflag(lf, F_ASLEEP)) addflag(newlf->flags, F_ASLEEP, B_TRUE, NA, NA, NULL);
|
||||||
newlf->born = B_TRUE;
|
newlf->born = B_TRUE;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,6 +755,7 @@ void createmap(map_t *map, int depth, int habitat) {
|
||||||
cell_t *cell, *c;
|
cell_t *cell, *c;
|
||||||
object_t *o;
|
object_t *o;
|
||||||
int db = B_FALSE;
|
int db = B_FALSE;
|
||||||
|
lifeform_t *lf;
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
int turnpct = DEF_TURNPCT;
|
int turnpct = DEF_TURNPCT;
|
||||||
|
@ -1240,33 +1261,11 @@ void createmap(map_t *map, int depth, int habitat) {
|
||||||
c = getrandomroomcell(map, i);
|
c = getrandomroomcell(map, i);
|
||||||
// if nothing there
|
// if nothing there
|
||||||
if (c && isempty(c) && !countobs(c->obpile)) {
|
if (c && isempty(c) && !countobs(c->obpile)) {
|
||||||
/*
|
|
||||||
if (roomspecial[i]) {
|
|
||||||
if (getrand(1,4) == 1) { // less chance of monster
|
|
||||||
addlifeform(x, y, curz,getrandommonster(curz),
|
|
||||||
getrand(1,curz+1), C_AI, B_FALSE, B_TRUE);
|
|
||||||
} else {
|
|
||||||
//add objects based on room type
|
|
||||||
if (roomspecial[i] == SP_MEDLAB) {
|
|
||||||
addspecialroomob(x, y, curz, SP_MEDLAB,
|
|
||||||
OR, 3, OP_AI_HEALS, OP_REVIVES);
|
|
||||||
} else if (roomspecial[i] == SP_COMPLAB) {
|
|
||||||
addspecialroomob(x, y, curz, SP_COMPLAB,
|
|
||||||
OR, 0);
|
|
||||||
} else if (roomspecial[i] == SP_ALIENNEST) {
|
|
||||||
addspecialroomob(x, y, curz, SP_ALIENNEST,
|
|
||||||
OR, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*/
|
|
||||||
// slightly more chance of objects in rooms
|
// slightly more chance of objects in rooms
|
||||||
addrandomthing(c,60);
|
addrandomthing(c,60);
|
||||||
done = B_TRUE;
|
done = B_TRUE;
|
||||||
//dblog("----> Success ob at (%d,%d).",c->x,c->y);
|
|
||||||
} else {
|
} else {
|
||||||
ntries++;
|
ntries++;
|
||||||
//dblog("----> Failed, now at retry #%d/%d",ntries, numobs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ntries >= numobs) {
|
if (ntries >= numobs) {
|
||||||
|
@ -1280,132 +1279,11 @@ void createmap(map_t *map, int depth, int habitat) {
|
||||||
|
|
||||||
if (db) dblog("Finished adding objects.");
|
if (db) dblog("Finished adding objects.");
|
||||||
|
|
||||||
/*
|
|
||||||
// some extra monsters in corridors
|
// add home objects
|
||||||
for (i = 0; i < getrand(3,8); i++) {
|
for (lf = map->lf ; lf ; lf = lf->next) {
|
||||||
int x,y;
|
addhomeobs(lf);
|
||||||
lifeform_t *lf;
|
|
||||||
lf = addlifeform(rand() % MAZEW, rand() % MAZEH,curz,getrandommonster(curz), getrand(1,curz+1), C_AI, B_FALSE, B_TRUE);
|
|
||||||
done = B_FALSE;
|
|
||||||
while (!done) {
|
|
||||||
getrandomcell(&x, &y, curz,C_EMPTY );
|
|
||||||
if (isempty(x,y,curz)) {
|
|
||||||
lf->x = x;
|
|
||||||
lf->y = y;
|
|
||||||
lf->z = curz;
|
|
||||||
done = B_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
// add a fixed revival booth
|
|
||||||
done = B_FALSE;
|
|
||||||
while (!done) {
|
|
||||||
getrandomcell(&x,&y, curz,C_ROOM); // get a random cell in a room
|
|
||||||
if (isempty(x,y,curz)) {
|
|
||||||
if (!cellhasobject(x,y,curz)) {
|
|
||||||
done = B_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addobject(&wreck->mazelev[curz].maze[y*MAZEW+x].floorobs, O_REVIVAL);
|
|
||||||
|
|
||||||
// emergency lighting
|
|
||||||
for (y = 0; y < MAZEH; y++) {
|
|
||||||
for (x = 0; x < MAZEW; x++) {
|
|
||||||
if (getfloor(x,y,curz) == C_EMPTY) {
|
|
||||||
if (isempty(x,y,curz) && !hasdangerousobject(NULL,x,y,curz)) {
|
|
||||||
// chance of a light...
|
|
||||||
int lightchance = 5;
|
|
||||||
int roll = getrand(1,100);
|
|
||||||
if (roll <= lightchance) {
|
|
||||||
addobject(&wreck->mazelev[curz].maze[y*MAZEW+x].floorobs, O_EMERGLIGHT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add the reactor
|
|
||||||
done = B_FALSE;
|
|
||||||
while (!done) {
|
|
||||||
getrandomcell(&x,&y, curz,C_ROOM); // get a random cell in a room
|
|
||||||
if (getdistance(x,y,wreck->dockpos.x,wreck->dockpos.y) >= 20) {
|
|
||||||
if (isempty(x,y,curz)) {
|
|
||||||
if (!cellhasobject(x,y,curz)) {
|
|
||||||
done = B_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wreck->mazelev[curz].reactorpos.x = x;
|
|
||||||
wreck->mazelev[curz].reactorpos.y = y;
|
|
||||||
addobject(&wreck->mazelev[curz].maze[y*MAZEW+x].floorobs, O_REACTOR);
|
|
||||||
wreck->mazelev[curz].powered = B_TRUE;
|
|
||||||
wreck->mazelev[curz].lightlevel = getrand(50,100);
|
|
||||||
|
|
||||||
//printf("reactor at %d,%d,%d\n",x,y,curz);
|
|
||||||
|
|
||||||
// all empty cells around it change
|
|
||||||
for (cury = y-2 ; cury <= y+2; cury++) {
|
|
||||||
for (curx = x-2 ; curx <= x+2; curx++) {
|
|
||||||
if (isonmap(curx,cury,curz)) {
|
|
||||||
if (!issolid(curx,cury,curz)) {
|
|
||||||
wreck->mazelev[curz].maze[cury*MAZEW+curx].floor = C_EMPTYHAZARD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// calculate level difficulty
|
|
||||||
wreck->mazelev[curz].mondifficulty = 0;
|
|
||||||
wreck->mazelev[curz].mapdifficulty = 0;
|
|
||||||
|
|
||||||
// monsters
|
|
||||||
for (lf = wreck->mazelev[curz].lifeform ; lf ; lf = lf->next) {
|
|
||||||
if (lf->controller != C_HUMAN) {
|
|
||||||
wreck->mazelev[curz].mondifficulty += (getrdifficulty(lf->race));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// maze layout & objects
|
|
||||||
for (y = 0; y < MAZEH; y++) {
|
|
||||||
for (x = 0; x < MAZEW; x++) {
|
|
||||||
switch (numexits(x,y,curz)) {
|
|
||||||
case 2: // corner
|
|
||||||
wreck->mazelev[curz].mapdifficulty += 0.5;
|
|
||||||
break;
|
|
||||||
case 1: // dead end
|
|
||||||
wreck->mazelev[curz].mapdifficulty += 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (containerhasobject(&wreck->mazelev[curz].maze[y*MAZEW+x].floorobs, O_SPAWNPIT)) {
|
|
||||||
wreck->mazelev[curz].mondifficulty += DF_SPAWNPIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix exithp
|
|
||||||
for (y = 0; y < MAZEH; y++) {
|
|
||||||
for (x = 0; x < MAZEW; x++) {
|
|
||||||
int d;
|
|
||||||
for (d = D_NORTH ; d <= D_WEST; d++) {
|
|
||||||
int extype = getexit(x,y,curz,d);
|
|
||||||
if (isbreakableexit(getexit(x,y,curz,d))) {
|
|
||||||
// using setexit will make sure the hp is right
|
|
||||||
setexit(x,y,curz,d,extype);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
//printf("*** Level difficulty is %0.2f\n", getmazedifficulty(curz));
|
|
||||||
|
|
||||||
map->beingcreated = B_FALSE;
|
map->beingcreated = B_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -2499,11 +2377,19 @@ int linkstairs(object_t *o) {
|
||||||
void makedoor(cell_t *cell) {
|
void makedoor(cell_t *cell) {
|
||||||
object_t *o;
|
object_t *o;
|
||||||
map_t *m;
|
map_t *m;
|
||||||
|
char doorbuf[BUFLEN];
|
||||||
|
|
||||||
m = cell->map;
|
m = cell->map;
|
||||||
|
|
||||||
setcelltype(cell, getemptycelltype(cell->map->habitat));
|
setcelltype(cell, getemptycelltype(m->habitat));
|
||||||
o = addob(cell->obpile, "wooden door");
|
|
||||||
|
if ((rnd(1,100) + m->depth) >= 66) {
|
||||||
|
strcpy(doorbuf, "iron door");
|
||||||
|
} else {
|
||||||
|
strcpy(doorbuf, "wooden door");
|
||||||
|
}
|
||||||
|
|
||||||
|
o = addob(cell->obpile, doorbuf);
|
||||||
if (o && (rnd(1,2) == 1)) {
|
if (o && (rnd(1,2) == 1)) {
|
||||||
opendoor(NULL, o);
|
opendoor(NULL, o);
|
||||||
} else {
|
} else {
|
||||||
|
|
1
map.h
1
map.h
|
@ -1,6 +1,7 @@
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
|
|
||||||
cell_t *addcell(map_t *map, int x, int y);
|
cell_t *addcell(map_t *map, int x, int y);
|
||||||
|
void addhomeobs(lifeform_t *lf);
|
||||||
map_t *addmap(void);
|
map_t *addmap(void);
|
||||||
lifeform_t *addmonster(cell_t *c, enum RACE raceid, int jobok, int amt, int autogen);
|
lifeform_t *addmonster(cell_t *c, enum RACE raceid, int jobok, int amt, int autogen);
|
||||||
void addrandomob(cell_t *c);
|
void addrandomob(cell_t *c);
|
||||||
|
|
68
move.c
68
move.c
|
@ -484,11 +484,22 @@ int getdirtowards(cell_t *src, cell_t *dst, lifeform_t *srclf, int wantcheck, in
|
||||||
return bestdir;
|
return bestdir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// use 'n/a' for zero chance of falling. 0 means 'calculate based on distance'
|
||||||
int knockback(lifeform_t *lf, int dir, int howfar, lifeform_t *pusher, int fallcheckdiff) {
|
int knockback(lifeform_t *lf, int dir, int howfar, lifeform_t *pusher, int fallcheckdiff) {
|
||||||
int i;
|
int i;
|
||||||
char lfname[BUFLEN];
|
char lfname[BUFLEN];
|
||||||
|
char newlfname[BUFLEN];
|
||||||
int seen;
|
int seen;
|
||||||
int hitwall = B_FALSE;
|
int mightfall = B_TRUE;
|
||||||
|
cell_t *newcell;
|
||||||
|
lifeform_t *newlf;
|
||||||
|
|
||||||
|
// calculate chance of falling
|
||||||
|
if (fallcheckdiff == 0) {
|
||||||
|
// chance based on distance
|
||||||
|
fallcheckdiff = howfar*10;
|
||||||
|
}
|
||||||
|
|
||||||
getlfname(lf,lfname);
|
getlfname(lf,lfname);
|
||||||
if (cansee(player, lf)) {
|
if (cansee(player, lf)) {
|
||||||
|
@ -519,11 +530,31 @@ int knockback(lifeform_t *lf, int dir, int howfar, lifeform_t *pusher, int fallc
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case E_WALLINWAY:
|
case E_WALLINWAY:
|
||||||
case E_OFFMAP:
|
case E_OFFMAP:
|
||||||
msg("%s slam%s into a wall!",lfname,isplayer(lf) ? "" : "s");
|
if (seen) msg("%s slam%s into a wall!",lfname,isplayer(lf) ? "" : "s");
|
||||||
losehp(lf, rnd(1,6), DT_BASH, pusher, "slamming into a wall");
|
losehp(lf, rnd(1,6), DT_BASH, pusher, "slamming into a wall");
|
||||||
hitwall = B_TRUE;
|
|
||||||
// stop moving
|
// stop moving
|
||||||
i = howfar;
|
i = howfar;
|
||||||
|
// don't fall
|
||||||
|
mightfall = B_FALSE;
|
||||||
|
break;
|
||||||
|
case E_LFINWAY:
|
||||||
|
newcell = getcellindir(lf->cell, dir);
|
||||||
|
newlf = newcell->lf;
|
||||||
|
if (newlf) { // should always be true
|
||||||
|
int momentumleft;
|
||||||
|
getlfname(newlf, newlfname);
|
||||||
|
if (seen) msg("%s slam%s into %s!",lfname,isplayer(lf) ? "" : "s",newlfname);
|
||||||
|
// remember our momentum
|
||||||
|
momentumleft = howfar - i;
|
||||||
|
// stop moving
|
||||||
|
i = howfar;
|
||||||
|
// higher chance of both falling
|
||||||
|
if (fallcheckdiff != NA) {
|
||||||
|
fallcheckdiff += (momentumleft*5);
|
||||||
|
}
|
||||||
|
// confer our remaining momentum on to them
|
||||||
|
knockback(newcell->lf, dir, momentumleft, lf, fallcheckdiff); // NOTE: recursive call
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -531,16 +562,13 @@ int knockback(lifeform_t *lf, int dir, int howfar, lifeform_t *pusher, int fallc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if you ran into a wall, it will prevent you from falling back.
|
if (fallcheckdiff == NA) {
|
||||||
if (!hitwall) {
|
mightfall = B_FALSE;
|
||||||
int diff;
|
}
|
||||||
if (fallcheckdiff) {
|
|
||||||
diff = fallcheckdiff;
|
if (mightfall) {
|
||||||
} else {
|
|
||||||
diff = howfar*10;
|
|
||||||
}
|
|
||||||
// save to avoid falling
|
// save to avoid falling
|
||||||
if (!skillcheck(lf, SC_FALL, howfar*10, 0)) {
|
if (!skillcheck(lf, SC_FALL, fallcheckdiff, 0)) {
|
||||||
fall(lf, NULL, B_TRUE);
|
fall(lf, NULL, B_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -622,6 +650,8 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
|
||||||
int preroom = -1, postroom = -1;
|
int preroom = -1, postroom = -1;
|
||||||
int prespeed = B_FALSE, postspeed = B_FALSE;
|
int prespeed = B_FALSE, postspeed = B_FALSE;
|
||||||
|
|
||||||
|
assert(newcell);
|
||||||
|
|
||||||
getlfname(lf, lfname);
|
getlfname(lf, lfname);
|
||||||
|
|
||||||
if (newcell->map != lf->cell->map) {
|
if (newcell->map != lf->cell->map) {
|
||||||
|
@ -748,7 +778,7 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
|
||||||
}
|
}
|
||||||
} // end if crushable
|
} // end if crushable
|
||||||
|
|
||||||
if (o->type->id == OT_VINE) {
|
if ((o->type->id == OT_VINE) && !hasjob(lf, J_DRUID)) {
|
||||||
char obname[BUFLEN];
|
char obname[BUFLEN];
|
||||||
getobname(o,obname,o->amt);
|
getobname(o,obname,o->amt);
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
|
@ -807,7 +837,8 @@ int movelf(lifeform_t *lf, cell_t *newcell) {
|
||||||
|
|
||||||
if (isplayer(l)) {
|
if (isplayer(l)) {
|
||||||
if (cansee(l, lf) && areenemies(lf, l)) {
|
if (cansee(l, lf) && areenemies(lf, l)) {
|
||||||
if (lfhasflag(l, F_RUNNING) || lfhasflag(l, F_RESTING)) {
|
if (lfhasflag(l, F_RUNNING) || lfhasflag(l, F_TRAINING)) {
|
||||||
|
// TODO: also check for isresting(l), if we have allies standing watch
|
||||||
char lfname2[BUFLEN];
|
char lfname2[BUFLEN];
|
||||||
getlfname(lf, lfname);
|
getlfname(lf, lfname);
|
||||||
sprintf(lfname2, "%s",noprefix(lfname));
|
sprintf(lfname2, "%s",noprefix(lfname));
|
||||||
|
@ -924,7 +955,7 @@ int moveto(lifeform_t *lf, cell_t *newcell, int onpurpose, int dontclearmsg) {
|
||||||
// see objects on ground
|
// see objects on ground
|
||||||
if (isplayer(lf)) {
|
if (isplayer(lf)) {
|
||||||
int numobs;
|
int numobs;
|
||||||
numobs = countobs(newcell->obpile);
|
numobs = countnoncosmeticobs(newcell->obpile);
|
||||||
if ((numobs == 0) && !newcell->writing) {
|
if ((numobs == 0) && !newcell->writing) {
|
||||||
// just clear the message buffer
|
// just clear the message buffer
|
||||||
if (!didmsg) clearmsg();
|
if (!didmsg) clearmsg();
|
||||||
|
@ -964,10 +995,10 @@ int moveto(lifeform_t *lf, cell_t *newcell, int onpurpose, int dontclearmsg) {
|
||||||
// measure distance when determining which way is "towards"
|
// measure distance when determining which way is "towards"
|
||||||
//
|
//
|
||||||
// in general:
|
// in general:
|
||||||
// use orthogonal for voluntary movement (eg. monster moving
|
// use orthogonal/dt_orth for voluntary movement (eg. monster moving
|
||||||
// towards player), compass
|
// towards player), compass
|
||||||
//
|
//
|
||||||
// use compass for involuntary movement (eg. being knocked back by
|
// use compass/dt_compass for involuntary movement (eg. being knocked back by
|
||||||
// an explosion)
|
// an explosion)
|
||||||
//
|
//
|
||||||
int movetowards(lifeform_t *lf, cell_t *dst, int dirtype) {
|
int movetowards(lifeform_t *lf, cell_t *dst, int dirtype) {
|
||||||
|
@ -1284,6 +1315,9 @@ int initiatemove(lifeform_t *lf, cell_t *cell, int *didmsg) {
|
||||||
if ((o->type->id == OT_WEB) && (lf->race->baseid == R_SPIDER)) {
|
if ((o->type->id == OT_WEB) && (lf->race->baseid == R_SPIDER)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if ((o->type->id == OT_VINE) && hasjob(lf, J_DRUID)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
f = hasflag(o->flags, F_RESTRICTMOVEMENT);
|
f = hasflag(o->flags, F_RESTRICTMOVEMENT);
|
||||||
if (f) {
|
if (f) {
|
||||||
|
|
46
nexus.c
46
nexus.c
|
@ -192,7 +192,7 @@ int main(int argc, char **argv) {
|
||||||
skill_t *sk;
|
skill_t *sk;
|
||||||
initprompt(&prompt, "Select your spell specialty:");
|
initprompt(&prompt, "Select your spell specialty:");
|
||||||
addchoice(&prompt, 'a', getskillname(SK_SS_AIR), NULL, findskill(SK_SS_AIR));
|
addchoice(&prompt, 'a', getskillname(SK_SS_AIR), NULL, findskill(SK_SS_AIR));
|
||||||
addchoice(&prompt, 'i', getskillname(SK_SS_ICE), NULL, findskill(SK_SS_ICE));
|
addchoice(&prompt, 'i', getskillname(SK_SS_COLD), NULL, findskill(SK_SS_COLD));
|
||||||
addchoice(&prompt, 'f', getskillname(SK_SS_FIRE), NULL, findskill(SK_SS_FIRE));
|
addchoice(&prompt, 'f', getskillname(SK_SS_FIRE), NULL, findskill(SK_SS_FIRE));
|
||||||
getchoice(&prompt);
|
getchoice(&prompt);
|
||||||
sk = (skill_t *) prompt.result;
|
sk = (skill_t *) prompt.result;
|
||||||
|
@ -491,21 +491,16 @@ void donextturn(map_t *map) {
|
||||||
int donormalmove = B_TRUE;
|
int donormalmove = B_TRUE;
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
|
|
||||||
if (donormalmove) {
|
|
||||||
// paralyzed etc?
|
|
||||||
if (isimmobile(who)) {
|
|
||||||
rest(who, B_FALSE);
|
|
||||||
donormalmove = B_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// resting?
|
// resting?
|
||||||
if (donormalmove) {
|
if (donormalmove) {
|
||||||
f = hasflag(who->flags, F_RESTING);
|
f = isresting(who);
|
||||||
|
if (!f) {
|
||||||
|
f = lfhasflag(who, F_TRAINING);
|
||||||
|
}
|
||||||
if (f) {
|
if (f) {
|
||||||
// check for interrupt of resting...
|
// check for interrupt of resting...
|
||||||
if (isplayer(who) && checkforkey()) {
|
if (isplayer(who) && checkforkey()) {
|
||||||
msg("Stopped resting.");
|
msg("Stopped %s.",(f->id == F_TRAINING) ? "training" : "resting");
|
||||||
killflag(f);
|
killflag(f);
|
||||||
} else {
|
} else {
|
||||||
rest(who, B_TRUE);
|
rest(who, B_TRUE);
|
||||||
|
@ -514,6 +509,15 @@ void donextturn(map_t *map) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (donormalmove) {
|
||||||
|
// paralyzed etc?
|
||||||
|
if (isimmobile(who)) {
|
||||||
|
rest(who, B_FALSE);
|
||||||
|
donormalmove = B_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (donormalmove) {
|
if (donormalmove) {
|
||||||
if (isplayer(who)) {
|
if (isplayer(who)) {
|
||||||
drawcursor();
|
drawcursor();
|
||||||
|
@ -528,7 +532,7 @@ void donextturn(map_t *map) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasflag(player->flags, F_RESTING)) {
|
if (hasflag(player->flags, F_ASLEEP)) {
|
||||||
// ooo is this right ?
|
// ooo is this right ?
|
||||||
needredraw = B_FALSE;
|
needredraw = B_FALSE;
|
||||||
} else if (isdead(who) || cansee(player, who)) {
|
} else if (isdead(who) || cansee(player, who)) {
|
||||||
|
@ -782,13 +786,17 @@ int isplayerturn(void) {
|
||||||
|
|
||||||
int limit(int *what, int min, int max) {
|
int limit(int *what, int min, int max) {
|
||||||
int limited = B_FALSE;
|
int limited = B_FALSE;
|
||||||
if (*what < min) {
|
if (min != NA) {
|
||||||
*what = min;
|
if (*what < min) {
|
||||||
limited = B_TRUE;
|
*what = min;
|
||||||
|
limited = B_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (*what > max) {
|
if (max != NA) {
|
||||||
*what = max;
|
if (*what > max) {
|
||||||
limited = B_TRUE;
|
*what = max;
|
||||||
|
limited = B_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return limited;
|
return limited;
|
||||||
}
|
}
|
||||||
|
@ -887,7 +895,7 @@ int rollhitdice(lifeform_t *lf) {
|
||||||
int roll = 0;
|
int roll = 0;
|
||||||
int i;
|
int i;
|
||||||
float mod;
|
float mod;
|
||||||
int db = B_TRUE;
|
int db = B_FALSE;
|
||||||
|
|
||||||
f = hasflag(lf->flags, F_HITDICE);
|
f = hasflag(lf->flags, F_HITDICE);
|
||||||
if (f) {
|
if (f) {
|
||||||
|
|
127
objects.c
127
objects.c
|
@ -78,6 +78,7 @@ enum OBCLASS sortorder[] = {
|
||||||
|
|
||||||
char *techadjective[] = {
|
char *techadjective[] = {
|
||||||
"crazy",
|
"crazy",
|
||||||
|
"mysterious",
|
||||||
"odd",
|
"odd",
|
||||||
"strange",
|
"strange",
|
||||||
"weird",
|
"weird",
|
||||||
|
@ -539,9 +540,6 @@ object_t *addobject(obpile_t *where, char *name, int canstack) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (db) dblog("DB: FOUND: ot->name = '%s'", ot->name );
|
if (db) dblog("DB: FOUND: ot->name = '%s'", ot->name );
|
||||||
if (ot->id == OT_WOODENDOOR) {
|
|
||||||
dblog("xxx");
|
|
||||||
}
|
|
||||||
|
|
||||||
// override blessed status from flags...
|
// override blessed status from flags...
|
||||||
f = hasflag(ot->flags, F_STARTBLESSED);
|
f = hasflag(ot->flags, F_STARTBLESSED);
|
||||||
|
@ -721,19 +719,19 @@ object_t *addobject(obpile_t *where, char *name, int canstack) {
|
||||||
if (cf) {
|
if (cf) {
|
||||||
switch (rf->val[0]) {
|
switch (rf->val[0]) {
|
||||||
case SZ_MINI:
|
case SZ_MINI:
|
||||||
cf->val[1] = 5;
|
cf->val[1] = 1;
|
||||||
break;
|
break;
|
||||||
case SZ_TINY:
|
case SZ_TINY:
|
||||||
cf->val[1] = 25;
|
cf->val[1] = 10;
|
||||||
break;
|
break;
|
||||||
case SZ_SMALL:
|
case SZ_SMALL:
|
||||||
cf->val[1] = 55;
|
cf->val[1] = 25;
|
||||||
break;
|
break;
|
||||||
case SZ_MEDIUM:
|
case SZ_MEDIUM:
|
||||||
cf->val[1] = 90;
|
cf->val[1] = 75;
|
||||||
break;
|
break;
|
||||||
case SZ_HUMAN:
|
case SZ_HUMAN:
|
||||||
cf->val[1] = 100;
|
cf->val[1] = 120;
|
||||||
break;
|
break;
|
||||||
case SZ_LARGE:
|
case SZ_LARGE:
|
||||||
cf->val[1] = 150;
|
cf->val[1] = 150;
|
||||||
|
@ -1849,6 +1847,18 @@ int countobs(obpile_t *op) {
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int countnoncosmeticobs(obpile_t *op) {
|
||||||
|
object_t *o;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (o = op->first ; o ; o = o->next) {
|
||||||
|
if (!hasflag(o->flags, F_COSMETIC)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
int curseob(object_t *o) {
|
int curseob(object_t *o) {
|
||||||
int rv = B_FALSE;
|
int rv = B_FALSE;
|
||||||
lifeform_t *lf;
|
lifeform_t *lf;
|
||||||
|
@ -2972,6 +2982,16 @@ char *getobequipinfo(object_t *o, char *buf) {
|
||||||
} else {
|
} else {
|
||||||
strcat(buf, " (weapon)");
|
strcat(buf, " (weapon)");
|
||||||
}
|
}
|
||||||
|
} else if (f->val[0] == BP_SECWEAPON) {
|
||||||
|
if (isshield(o)) {
|
||||||
|
strcat(buf, " (shield)");
|
||||||
|
} else if (ismeleeweapon(o)) {
|
||||||
|
strcat(buf, " (second weapon)");
|
||||||
|
} else if (isfirearm(o)) {
|
||||||
|
strcat(buf, " (firearm)");
|
||||||
|
} else {
|
||||||
|
strcat(buf, " (in left hand)");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
strcat(buf, " (");
|
strcat(buf, " (");
|
||||||
strcat(buf, getbodypartequipname(f->val[0]));
|
strcat(buf, getbodypartequipname(f->val[0]));
|
||||||
|
@ -3771,7 +3791,7 @@ char *getschoolname(enum SPELLSCHOOL sch) {
|
||||||
case SS_MENTAL: return "Psionic Powers";
|
case SS_MENTAL: return "Psionic Powers";
|
||||||
case SS_AIR: return "Elemental/Air Magic";
|
case SS_AIR: return "Elemental/Air Magic";
|
||||||
case SS_FIRE: return "Elemental/Fire Magic";
|
case SS_FIRE: return "Elemental/Fire Magic";
|
||||||
case SS_ICE: return "Elemental/Ice Magic";
|
case SS_COLD: return "Elemental/Cold Magic";
|
||||||
case SS_MODIFICATION: return "Modification Magic";
|
case SS_MODIFICATION: return "Modification Magic";
|
||||||
case SS_DEATH: return "Necromancy";
|
case SS_DEATH: return "Necromancy";
|
||||||
case SS_NATURE: return "Nature";
|
case SS_NATURE: return "Nature";
|
||||||
|
@ -3795,7 +3815,7 @@ char *getschoolnameshort(enum SPELLSCHOOL sch) {
|
||||||
case SS_WILD: return "Wild Magic";
|
case SS_WILD: return "Wild Magic";
|
||||||
case SS_AIR: return "Air Magic";
|
case SS_AIR: return "Air Magic";
|
||||||
case SS_FIRE: return "Fire Magic";
|
case SS_FIRE: return "Fire Magic";
|
||||||
case SS_ICE: return "Ice Magic";
|
case SS_COLD: return "Cold Magic";
|
||||||
case SS_DEATH: return "Necromancy";
|
case SS_DEATH: return "Necromancy";
|
||||||
case SS_LIFE: return "Life Magic";
|
case SS_LIFE: return "Life Magic";
|
||||||
case SS_MENTAL: return "Psionic Powers";
|
case SS_MENTAL: return "Psionic Powers";
|
||||||
|
@ -4358,7 +4378,7 @@ void initobjects(void) {
|
||||||
// object types
|
// object types
|
||||||
|
|
||||||
// dungeon features
|
// dungeon features
|
||||||
addot(OT_WOODENDOOR, "wooden door", "A sturdy wooden door.", MT_WOOD, 150, OC_DFEATURE);
|
addot(OT_DOORWOOD, "wooden door", "A sturdy wooden door.", MT_WOOD, 150, OC_DFEATURE);
|
||||||
// GLYPH here is a special case in getglyph
|
// GLYPH here is a special case in getglyph
|
||||||
addflag(lastot->flags, F_DOOR, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_DOOR, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_IMPASSABLE, SZ_MAX, NA, NA, NULL);
|
addflag(lastot->flags, F_IMPASSABLE, SZ_MAX, NA, NA, NULL);
|
||||||
|
@ -4371,6 +4391,20 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL);
|
addflag(lastot->flags, F_DTVULN, DT_BASH, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
|
addflag(lastot->flags, F_DTVULN, DT_CHOP, NA, NA, NULL);
|
||||||
|
|
||||||
|
addot(OT_DOORIRON, "iron door", "A strong iron door.", MT_METAL, 300, OC_DFEATURE);
|
||||||
|
// GLYPH here is a special case in getglyph
|
||||||
|
addflag(lastot->flags, F_DOOR, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_IMPASSABLE, SZ_MAX, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_BLOCKSVIEW, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_BLOCKSTHROW, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_NOBLESS, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_DAMAGABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_LOCKABLE, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_OBHP, 60, 60, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_DTIMMUNE, DT_PIERCE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_DTIMMUNE, DT_SLASH, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_DTRESIST, DT_CHOP, NA, NA, NULL);
|
||||||
|
|
||||||
addot(OT_WOODENTABLE, "wooden table", "A waist-height wooden table.", MT_WOOD, 25, OC_DFEATURE);
|
addot(OT_WOODENTABLE, "wooden table", "A waist-height wooden table.", MT_WOOD, 25, OC_DFEATURE);
|
||||||
addflag(lastot->flags, F_RARITY, H_ALL, 70, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_ALL, 70, NA, NULL);
|
||||||
addflag(lastot->flags, F_GLYPH, C_BROWN, NA, NA, "\\");
|
addflag(lastot->flags, F_GLYPH, C_BROWN, NA, NA, "\\");
|
||||||
|
@ -4546,7 +4580,7 @@ void initobjects(void) {
|
||||||
// potions (sorted by rarity)
|
// potions (sorted by rarity)
|
||||||
addot(OT_POT_JUICE, "potion of fruit juice", "Tasty (but not very fresh) fruit juice!", MT_GLASS, 1, OC_POTION);
|
addot(OT_POT_JUICE, "potion of fruit juice", "Tasty (but not very fresh) fruit juice!", MT_GLASS, 1, OC_POTION);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL);
|
||||||
addot(OT_POT_HEALINGMIN, "potion of minor healing", "Restores 1-8 health to whoever drinks it.", MT_GLASS, 1, OC_POTION);
|
addot(OT_POT_HEALINGMIN, "potion of minor healing", "Restores 1-10 health to whoever drinks it.", MT_GLASS, 1, OC_POTION);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 100, NA, NULL);
|
||||||
addflag(lastot->flags, F_AIHEALITEM, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_AIHEALITEM, B_TRUE, NA, NA, NULL);
|
||||||
addot(OT_POT_WATER, "potion of water", "Plain, regular water.", MT_GLASS, 1, OC_POTION);
|
addot(OT_POT_WATER, "potion of water", "Plain, regular water.", MT_GLASS, 1, OC_POTION);
|
||||||
|
@ -4555,6 +4589,9 @@ void initobjects(void) {
|
||||||
addot(OT_POT_HEALING, "potion of healing", "Restores 10-20 health to whoever drinks it.", MT_GLASS, 1, OC_POTION);
|
addot(OT_POT_HEALING, "potion of healing", "Restores 10-20 health to whoever drinks it.", MT_GLASS, 1, OC_POTION);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, NULL);
|
||||||
addflag(lastot->flags, F_AIHEALITEM, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_AIHEALITEM, B_TRUE, NA, NA, NULL);
|
||||||
|
addot(OT_POT_HEALINGMAJ, "potion of major healing", "Restores 20-30 health to whoever drinks it.", MT_GLASS, 1, OC_POTION);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 72, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_AIHEALITEM, B_TRUE, NA, NA, NULL);
|
||||||
addot(OT_POT_OIL, "potion of oil", "A bottle of cooking oil.", MT_GLASS, 1, OC_POTION);
|
addot(OT_POT_OIL, "potion of oil", "A bottle of cooking oil.", MT_GLASS, 1, OC_POTION);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 83, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 83, NA, NULL);
|
||||||
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "puddle of oil");
|
addflag(lastot->flags, F_DIECONVERT, NA, NA, NA, "puddle of oil");
|
||||||
|
@ -4918,7 +4955,7 @@ void initobjects(void) {
|
||||||
///////////////////
|
///////////////////
|
||||||
// l2
|
// l2
|
||||||
addot(OT_S_CONECOLD, "cone of cold", "Shoots a blast of ice cold air, dealing 2-6 cold damage.", MT_NOTHING, 0, OC_SPELL);
|
addot(OT_S_CONECOLD, "cone of cold", "Shoots a blast of ice cold air, dealing 2-6 cold damage.", MT_NOTHING, 0, OC_SPELL);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ICE, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_NEED, NA, NULL);
|
addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_NEED, NA, NULL);
|
||||||
|
@ -4927,7 +4964,7 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL);
|
||||||
// l3
|
// l3
|
||||||
addot(OT_S_COLDBURST, "cold burst", "Creates a radial blast of coldness out from the caster.", MT_NOTHING, 0, OC_SPELL);
|
addot(OT_S_COLDBURST, "cold burst", "Creates a radial blast of coldness out from the caster.", MT_NOTHING, 0, OC_SPELL);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ICE, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJSELF, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJSELF, NA, NA, NULL);
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -5013,6 +5050,13 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_MAXPOWER, 4, NA, NA, NULL);
|
addflag(lastot->flags, F_MAXPOWER, 4, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
||||||
|
addot(OT_S_THORNS, "thorns", "Sharp thorns grow from your skin, dealing 1d4 damage to attackers.", MT_NOTHING, 0, OC_SPELL);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_DONTNEED, NA, NULL);
|
||||||
addot(OT_S_WEB, "web", "Slows down pursuers with a burst of sticky spider web.", MT_NOTHING, 0, OC_SPELL);
|
addot(OT_S_WEB, "web", "Slows down pursuers with a burst of sticky spider web.", MT_NOTHING, 0, OC_SPELL);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL);
|
||||||
|
@ -5042,6 +5086,7 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
||||||
addot(OT_S_HAILSTORM, "hail storm", "Creates an intense storm of hail, causing damage to all within.", MT_NOTHING, 0, OC_SPELL);
|
addot(OT_S_HAILSTORM, "hail storm", "Creates an intense storm of hail, causing damage to all within.", MT_NOTHING, 0, OC_SPELL);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL);
|
||||||
|
@ -5157,6 +5202,12 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_SPECIAL, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_SPECIAL, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
||||||
|
addot(OT_S_HEALINGMAJ, "major healing", "Restores 20-30 health to the caster.", MT_NOTHING, 0, OC_SPELL);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_LIFE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_AICASTTOFLEE, ST_SELF, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL);
|
||||||
///////////////////
|
///////////////////
|
||||||
// modification
|
// modification
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -5313,6 +5364,9 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_NEEDSGRAB, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_NEEDSGRAB, B_TRUE, NA, NA, NULL);
|
||||||
|
addot(OT_A_FLURRY, "flurry", "Perform a flurry of attacks, forcing your opponent backwards.", MT_NOTHING, 0, OC_ABILITY);
|
||||||
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL);
|
||||||
addot(OT_A_GRAB, "grab", "You can grab hold of nearby enemies to prevent their escape.", MT_NOTHING, 0, OC_ABILITY);
|
addot(OT_A_GRAB, "grab", "You can grab hold of nearby enemies to prevent their escape.", MT_NOTHING, 0, OC_ABILITY);
|
||||||
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
addflag(lastot->flags, F_SPELLSCHOOL, SS_ABILITY, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL);
|
||||||
|
@ -5379,6 +5433,8 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_STEALTH, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_STEALTH, NA, NA, NULL);
|
||||||
addot(OT_MAN_TECHUSAGE, "manual of technology", "Teaches you the skill 'technology'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_TECHUSAGE, "manual of technology", "Teaches you the skill 'technology'.", MT_PAPER, 3, OC_BOOK);
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_TECHUSAGE, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_TECHUSAGE, NA, NA, NULL);
|
||||||
|
addot(OT_MAN_TWOWEAPON, "manual of dual weilding", "Teaches you the skill 'dual weilding'.", MT_PAPER, 3, OC_BOOK);
|
||||||
|
addflag(lastot->flags, F_MANUALOF, SK_TWOWEAPON, NA, NA, NULL);
|
||||||
// knowledge manuals
|
// knowledge manuals
|
||||||
addot(OT_MAN_LORE_ARCANA, "tome of arcane lore", "Teaches you the skill 'lore:arcana'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_LORE_ARCANA, "tome of arcane lore", "Teaches you the skill 'lore:arcana'.", MT_PAPER, 3, OC_BOOK);
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_LORE_ARCANA, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_LORE_ARCANA, NA, NA, NULL);
|
||||||
|
@ -5418,8 +5474,8 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_SS_NATURE, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_SS_NATURE, NA, NA, NULL);
|
||||||
addot(OT_MAN_SS_FIRE, "manual of fire magic", "Teaches you the skill 'fire magic'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_SS_FIRE, "manual of fire magic", "Teaches you the skill 'fire magic'.", MT_PAPER, 3, OC_BOOK);
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_SS_FIRE, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_SS_FIRE, NA, NA, NULL);
|
||||||
addot(OT_MAN_SS_ICE, "manual of ice magic", "Teaches you the skill 'ice magic'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_SS_COLD, "manual of ice magic", "Teaches you the skill 'ice magic'.", MT_PAPER, 3, OC_BOOK);
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_SS_ICE, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_SS_COLD, NA, NA, NULL);
|
||||||
addot(OT_MAN_SS_GRAVITY, "manual of gravitation magic", "Teaches you the skill 'gravitation magic'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_SS_GRAVITY, "manual of gravitation magic", "Teaches you the skill 'gravitation magic'.", MT_PAPER, 3, OC_BOOK);
|
||||||
addflag(lastot->flags, F_MANUALOF, SK_SS_GRAVITY, NA, NA, NULL);
|
addflag(lastot->flags, F_MANUALOF, SK_SS_GRAVITY, NA, NA, NULL);
|
||||||
addot(OT_MAN_SS_LIFE, "manual of life magic", "Teaches you the skill 'life magic'.", MT_PAPER, 3, OC_BOOK);
|
addot(OT_MAN_SS_LIFE, "manual of life magic", "Teaches you the skill 'life magic'.", MT_PAPER, 3, OC_BOOK);
|
||||||
|
@ -5680,6 +5736,10 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL);
|
||||||
|
|
||||||
// tools
|
// tools
|
||||||
|
addot(OT_BLANKET, "wool blanket", "A warm wool blanket for those cold winter nights.", MT_CLOTH, 2, OC_ARMOUR);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_ALL, 80, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_HELPSREST, 10, NA, NA, NULL);
|
||||||
|
|
||||||
addot(OT_BLINDFOLD, "blindfold", "Short length of wide cloth, used for blocking eyesight.", MT_CLOTH, 0.01, OC_TOOLS);
|
addot(OT_BLINDFOLD, "blindfold", "Short length of wide cloth, used for blocking eyesight.", MT_CLOTH, 0.01, OC_TOOLS);
|
||||||
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_EQUIPCONFER, F_BLIND, B_TRUE, NA, NULL);
|
addflag(lastot->flags, F_EQUIPCONFER, F_BLIND, B_TRUE, NA, NULL);
|
||||||
|
@ -5789,6 +5849,10 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_DAM, DT_PIERCE, NA, NA, "1d1");
|
addflag(lastot->flags, F_DAM, DT_PIERCE, NA, NA, "1d1");
|
||||||
addflag(lastot->flags, F_ACCURACY, 50, NA, NA, NULL);
|
addflag(lastot->flags, F_ACCURACY, 50, NA, NA, NULL);
|
||||||
|
|
||||||
|
addot(OT_SLEEPINGBAG, "sleeping bag", "An insulated bag for sleeping in. Very comfortable.", MT_CLOTH, 4, OC_TECH);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_ALL, 70, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_HELPSREST, 15, NA, NA, NULL);
|
||||||
|
|
||||||
// tech - l1
|
// tech - l1
|
||||||
addot(OT_POCKETWATCH, "pocket watch", "A portable timekeeping device made to be carried in a pocket.", MT_METAL, 0.1, OC_TECH);
|
addot(OT_POCKETWATCH, "pocket watch", "A portable timekeeping device made to be carried in a pocket.", MT_METAL, 0.1, OC_TECH);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 70, NA, NULL);
|
||||||
|
@ -5817,6 +5881,11 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_PRODUCESLIGHT, 2, NA, IFACTIVE, NULL);
|
addflag(lastot->flags, F_PRODUCESLIGHT, 2, NA, IFACTIVE, NULL);
|
||||||
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||||
|
addot(OT_TENT, "tent", "A easy to use, portable shelter made of fabric.", MT_CLOTH, 10, OC_TECH);
|
||||||
|
addflag(lastot->flags, F_RARITY, H_ALL, 60, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_HELPSREST, 15, 1, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_TECHLEVEL, PR_NOVICE, NA, NA, NULL);
|
||||||
|
|
||||||
// tech - l2
|
// tech - l2
|
||||||
addot(OT_FLASHBANG, "flashbang", "A stun grenade which temporarily blinds all within sight.", MT_METAL, 1, OC_TECH);
|
addot(OT_FLASHBANG, "flashbang", "A stun grenade which temporarily blinds all within sight.", MT_METAL, 1, OC_TECH);
|
||||||
|
@ -6439,6 +6508,7 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
|
addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_OBHP, 6, 6, NA, NULL);
|
addflag(lastot->flags, F_OBHP, 6, 6, NA, NULL);
|
||||||
addflag(lastot->flags, F_WATERPROOF, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_WATERPROOF, B_TRUE, NA, NA, NULL);
|
||||||
|
addflag(lastot->flags, F_HELPSREST, 5, NA, NA, NULL);
|
||||||
// armour - waist
|
// armour - waist
|
||||||
addot(OT_BELTLEATHER, "leather belt", "A plain leather belt.", MT_LEATHER, 0.2, OC_ARMOUR);
|
addot(OT_BELTLEATHER, "leather belt", "A plain leather belt.", MT_LEATHER, 0.2, OC_ARMOUR);
|
||||||
addflag(lastot->flags, F_RARITY, H_ALL, 85, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_ALL, 85, NA, NULL);
|
||||||
|
@ -6941,7 +7011,7 @@ void initobjects(void) {
|
||||||
addflag(lastot->flags, F_USESSKILL, SK_SHORTBLADES, NA, NA, NULL);
|
addflag(lastot->flags, F_USESSKILL, SK_SHORTBLADES, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_ATTREQ, A_STR, 6, NA, NULL);
|
addflag(lastot->flags, F_ATTREQ, A_STR, 6, NA, NULL);
|
||||||
addot(OT_SAI, "sai", "A dagger with two long prongs on either side, made to trap opponents' weapons.", MT_METAL, 1, OC_WEAPON);
|
addot(OT_SAI, "sai", "A dagger with two long prongs on either side, made to trap opponents' weapons.", MT_METAL, 1, OC_WEAPON);
|
||||||
addflag(lastot->flags, F_RARITY, H_DUNGEON, 90, NA, NULL);
|
addflag(lastot->flags, F_RARITY, H_DUNGEON, 81, NA, NULL);
|
||||||
addflag(lastot->flags, F_DAM, DT_PIERCE, NA, NA, "1d4");
|
addflag(lastot->flags, F_DAM, DT_PIERCE, NA, NA, "1d4");
|
||||||
addflag(lastot->flags, F_DISARMATTACK, B_TRUE, NA, NA, NULL);
|
addflag(lastot->flags, F_DISARMATTACK, B_TRUE, NA, NA, NULL);
|
||||||
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
addflag(lastot->flags, F_ACCURACY, 100, NA, NA, NULL);
|
||||||
|
@ -7998,9 +8068,11 @@ lifeform_t *makeanimated(lifeform_t *lf, object_t *o, int level) {
|
||||||
return newlf;
|
return newlf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeduller(object_t *o, int howmuch) {
|
// returns true if something hapepned
|
||||||
|
int makeduller(object_t *o, int howmuch) {
|
||||||
char obname[BUFLEN];
|
char obname[BUFLEN];
|
||||||
int oldbonus,newbonus;
|
int oldbonus,newbonus;
|
||||||
|
int rv = B_FALSE;
|
||||||
|
|
||||||
// get object name before changing the bonus
|
// get object name before changing the bonus
|
||||||
getobname(o,obname, 1);
|
getobname(o,obname, 1);
|
||||||
|
@ -8025,7 +8097,11 @@ void makeduller(object_t *o, int howmuch) {
|
||||||
msg("%s seems duller!",obname);
|
msg("%s seems duller!",obname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rv = B_TRUE;
|
||||||
|
} else {
|
||||||
|
rv = B_FALSE;
|
||||||
}
|
}
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeknown(enum OBTYPE otid) {
|
void makeknown(enum OBTYPE otid) {
|
||||||
|
@ -9835,13 +9911,6 @@ void potioneffects(lifeform_t *lf, enum OBTYPE oid, enum BLESSTYPE potblessed, i
|
||||||
break;
|
break;
|
||||||
case OT_POT_RESTORATION:
|
case OT_POT_RESTORATION:
|
||||||
failed = B_TRUE;
|
failed = B_TRUE;
|
||||||
if (getmr(lf) && skillcheck(lf, SC_RESISTMAG, 30, 0)) {
|
|
||||||
if (isplayer(lf)) {
|
|
||||||
msg("You feel momentarily restored.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getattr(lf,A_STR) < lf->baseatt[A_STR]) {
|
if (getattr(lf,A_STR) < lf->baseatt[A_STR]) {
|
||||||
setattr(lf, A_STR, lf->baseatt[A_STR]);
|
setattr(lf, A_STR, lf->baseatt[A_STR]);
|
||||||
failed = B_FALSE;
|
failed = B_FALSE;
|
||||||
|
@ -9978,7 +10047,7 @@ void potioneffects(lifeform_t *lf, enum OBTYPE oid, enum BLESSTYPE potblessed, i
|
||||||
if (seen) *seen = B_TRUE;
|
if (seen) *seen = B_TRUE;
|
||||||
}
|
}
|
||||||
if (potblessed != B_CURSED) {
|
if (potblessed != B_CURSED) {
|
||||||
modhunger(lf, -pctof(10, (float)HUNGERCONST));
|
modhunger(lf, -pctof(25, (float)HUNGERCONST));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: // nothing happens
|
default: // nothing happens
|
||||||
|
@ -10114,7 +10183,7 @@ int readsomething(lifeform_t *lf, object_t *o) {
|
||||||
if (isblessed(o)) power += 4;
|
if (isblessed(o)) power += 4;
|
||||||
|
|
||||||
// enforce maximum
|
// enforce maximum
|
||||||
if (power > 10) power = 10;
|
limit(&power, NA, 10);
|
||||||
|
|
||||||
// for unidentified scrolls which target an object,
|
// for unidentified scrolls which target an object,
|
||||||
// let player select ANY object (even if it won't
|
// let player select ANY object (even if it won't
|
||||||
|
@ -11128,8 +11197,8 @@ int fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int speed,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// an actual physical shield?
|
// an actual physical shield?
|
||||||
shield = getequippedob(target->pack, BP_SECWEAPON);
|
shield = getshield(target);
|
||||||
if (shield && isshield(shield)) {
|
if (shield) {
|
||||||
// block chance based on shield skill
|
// block chance based on shield skill
|
||||||
// ie. ST_AVERAGE = speed3 = 18
|
// ie. ST_AVERAGE = speed3 = 18
|
||||||
// ie. gun = speed10 = 60 = basically impossible
|
// ie. gun = speed10 = 60 = basically impossible
|
||||||
|
|
|
@ -33,6 +33,7 @@ void colourmatchob(object_t *o, lifeform_t *lf);
|
||||||
void copyobprops(object_t *dst, object_t *src);
|
void copyobprops(object_t *dst, object_t *src);
|
||||||
int countnames(char **list);
|
int countnames(char **list);
|
||||||
int countobs(obpile_t *op);
|
int countobs(obpile_t *op);
|
||||||
|
int countnoncosmeticobs(obpile_t *op);
|
||||||
int curseob(object_t *o);
|
int curseob(object_t *o);
|
||||||
void damageallobs(object_t *exception, obpile_t *op, int howmuch, int damtype);
|
void damageallobs(object_t *exception, obpile_t *op, int howmuch, int damtype);
|
||||||
void dumprandomobs(int amt);
|
void dumprandomobs(int amt);
|
||||||
|
@ -161,7 +162,7 @@ void killoc(objectclass_t *oc);
|
||||||
void killot(objecttype_t *ot);
|
void killot(objecttype_t *ot);
|
||||||
int knockbackob(object_t *o, int dir, int howfar, int power, lifeform_t *pusher);
|
int knockbackob(object_t *o, int dir, int howfar, int power, lifeform_t *pusher);
|
||||||
lifeform_t *makeanimated(lifeform_t *lf, object_t *o, int level);
|
lifeform_t *makeanimated(lifeform_t *lf, object_t *o, int level);
|
||||||
void makeduller(object_t *o, int howmuch);
|
int makeduller(object_t *o, int howmuch);
|
||||||
void makeknown(enum OBTYPE otid);
|
void makeknown(enum OBTYPE otid);
|
||||||
void maketried(enum OBTYPE otid);
|
void maketried(enum OBTYPE otid);
|
||||||
void makewet(object_t *o, int amt);
|
void makewet(object_t *o, int amt);
|
||||||
|
|
215
spell.c
215
spell.c
|
@ -184,6 +184,50 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef
|
||||||
// attack
|
// attack
|
||||||
attackcell(user, targcell);
|
attackcell(user, targcell);
|
||||||
}
|
}
|
||||||
|
} else if (abilid == OT_A_FLURRY) {
|
||||||
|
int dir;
|
||||||
|
int dirch;
|
||||||
|
if (!isdualweilding(user)) {
|
||||||
|
if (isplayer(user)) msg("You need two be dual-weilding to perform an attack flurry!");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ask for direction
|
||||||
|
if (targcell) {
|
||||||
|
dir = getdirtowards(user->cell, targcell, NULL, B_FALSE, DT_ORTH);
|
||||||
|
} else {
|
||||||
|
dirch = askchar("Flurry in which direction (- to cancel)", "yuhjklbn-","-", B_FALSE);
|
||||||
|
dir = chartodir(dirch);
|
||||||
|
if (dir == D_NONE) {
|
||||||
|
if (isplayer(user)) msg("Cancelled.");
|
||||||
|
return B_TRUE ;
|
||||||
|
} else {
|
||||||
|
targcell = getcellindir(user->cell, dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
target = targcell->lf;
|
||||||
|
if (!target) {
|
||||||
|
if (isplayer(user)) msg("There is nobody there to attack!");
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
getlfname(target, targetname);
|
||||||
|
|
||||||
|
// announce
|
||||||
|
if (!isplayer(user) && cansee(player, user)) {
|
||||||
|
msg("%s performs a flurry of fast attacks!", username);
|
||||||
|
}
|
||||||
|
|
||||||
|
// push them back
|
||||||
|
knockback(target, dir, 1, user, 5);
|
||||||
|
|
||||||
|
// if we succeeded in pushing them...
|
||||||
|
if (target->cell != targcell) {
|
||||||
|
movelf(user, targcell);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now attack them
|
||||||
|
attackcell(user, target->cell);
|
||||||
} else if (abilid == OT_A_GRAB) {
|
} else if (abilid == OT_A_GRAB) {
|
||||||
char dirch;
|
char dirch;
|
||||||
flag_t *f;
|
flag_t *f;
|
||||||
|
@ -1089,23 +1133,56 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
} else if (spellid == OT_S_AIRBLAST) {
|
} else if (spellid == OT_S_AIRBLAST) {
|
||||||
int dir;
|
int dir;
|
||||||
object_t *o,*nexto;
|
object_t *o,*nexto;
|
||||||
if (!validatespellcell(caster, &targcell, TT_MONSTER, spellid, power)) return B_TRUE;
|
cell_t *firstobcell = NULL;
|
||||||
target = targcell->lf;
|
cell_t *nextc;
|
||||||
|
|
||||||
|
if (targcell) {
|
||||||
|
if (!validatespellcell(caster, &targcell, TT_MONSTER, spellid, power)) return B_TRUE;
|
||||||
|
dir = getdirtowards(caster->cell, targcell, target, B_FALSE, DT_COMPASS);
|
||||||
|
} else {
|
||||||
|
int dirch;
|
||||||
|
dirch = askchar("Airblast in which direction (- to cancel)", "yuhjklbn.-","-", B_FALSE);
|
||||||
|
if ((dirch == '.') || (dir == '-')) {
|
||||||
|
fizzle(caster);
|
||||||
|
return B_TRUE;
|
||||||
|
}
|
||||||
|
dir = chartodir(dirch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep going that dir until the next cell is a wall/lf/impassable ob
|
||||||
|
targcell = caster->cell;
|
||||||
|
nextc = getcellindir(targcell, dir);
|
||||||
|
while (nextc && cellwalkable(NULL, nextc, NULL)) {
|
||||||
|
targcell = nextc;
|
||||||
|
if (!firstobcell) {
|
||||||
|
// obs here?
|
||||||
|
for (o = targcell->obpile->first ;o ; o = o->next) {
|
||||||
|
if (!hasflag(o->flags, F_NOPICKUP) && !hasflag(o->flags, F_COSMETIC)) {
|
||||||
|
firstobcell = targcell;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nextc = getcellindir(targcell, dir);
|
||||||
|
}
|
||||||
|
|
||||||
if (cansee(player, caster)) {
|
if (cansee(player, caster)) {
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
||||||
msg("%s emit%s a powerful blast of air!", castername, isplayer(caster) ? "" : "s");
|
msg("%s emit%s a powerful blast of air!", castername, isplayer(caster) ? "" : "s");
|
||||||
}
|
}
|
||||||
|
// if it was a lifeform which stopped us...
|
||||||
dir = getdirtowards(caster->cell, targcell, target, B_FALSE, DT_COMPASS);
|
if (nextc->lf) {
|
||||||
// lfs
|
targcell = nextc;
|
||||||
if (target) {
|
target = targcell->lf;
|
||||||
knockback(target, dir, power, caster, 0);
|
knockback(target, dir, power, caster, 0);
|
||||||
} else {
|
} else if (firstobcell) {
|
||||||
// objects
|
// objects
|
||||||
for (o = targcell->obpile->first ;o ; o = nexto) {
|
for (o = firstobcell->obpile->first ;o ; o = nexto) {
|
||||||
nexto = o->next;
|
nexto = o->next;
|
||||||
if (!hasflag(o->flags, F_NOPICKUP)) knockbackob(o, dir, power, power, caster);
|
if (!hasflag(o->flags, F_NOPICKUP) && !hasflag(o->flags, F_COSMETIC)) {
|
||||||
|
knockbackob(o, dir, power, power, caster);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (spellid == OT_S_ANIMATEDEAD) {
|
} else if (spellid == OT_S_ANIMATEDEAD) {
|
||||||
|
@ -2628,7 +2705,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
howlong = getspellduration(5,25,blessed) + power;
|
howlong = getspellduration(5,25,blessed) + power;
|
||||||
addtempflag(target->flags, F_FASTACTMOVE, 10, NA, NA, NULL, howlong);
|
addtempflag(target->flags, F_FASTACTMOVE, 10, NA, NA, NULL, howlong);
|
||||||
}
|
}
|
||||||
} else if (spellid == OT_S_HEALING) {
|
} else if ((spellid == OT_S_HEALING) || (spellid == OT_S_HEALINGMIN) || (spellid == OT_S_HEALINGMAJ)) {
|
||||||
int donesomething = B_FALSE;
|
int donesomething = B_FALSE;
|
||||||
if (!validatespellcell(caster, &targcell,TT_ALLY, spellid, power)) return B_TRUE;
|
if (!validatespellcell(caster, &targcell,TT_ALLY, spellid, power)) return B_TRUE;
|
||||||
target = targcell->lf;
|
target = targcell->lf;
|
||||||
|
@ -2641,24 +2718,59 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
if (killflagsofid(target->flags, F_PAIN)) {
|
if (killflagsofid(target->flags, F_PAIN)) {
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
}
|
}
|
||||||
|
if (killflagsofid(target->flags, F_POISONED)) {
|
||||||
|
donesomething = B_TRUE;
|
||||||
|
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((spellid == OT_S_HEALINGMIN) && donesomething) {
|
||||||
|
// minor healing will stop here
|
||||||
|
return B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (target->hp < target->maxhp) {
|
if (target->hp < target->maxhp) {
|
||||||
switch (blessed) {
|
int min,max;
|
||||||
case B_BLESSED:
|
switch (spellid) {
|
||||||
gainhp(target, 20 + (power*2));
|
case OT_S_HEALINGMIN:
|
||||||
|
default:
|
||||||
|
min = 1; max = 10;
|
||||||
break;
|
break;
|
||||||
case B_UNCURSED:
|
case OT_S_HEALING:
|
||||||
gainhp(target, rnd(10,20) + (power*2));
|
min = 10; max = 20;
|
||||||
break;
|
break;
|
||||||
case B_CURSED:
|
case OT_S_HEALINGMAJ:
|
||||||
gainhp(target, 10);
|
min = 20; max = 30;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
gainhp(target, getspellduration(min,max,blessed) + (power*2));
|
||||||
|
|
||||||
if (isplayer(target)) {
|
if (isplayer(target)) {
|
||||||
if (target->hp >= target->maxhp) {
|
if (target->hp >= target->maxhp) {
|
||||||
msg("Your wounds close themselves!");
|
switch (spellid) {
|
||||||
|
case OT_S_HEALINGMIN:
|
||||||
|
msg("All of your scrapes and bruises are healed!");
|
||||||
|
break;
|
||||||
|
case OT_S_HEALING:
|
||||||
|
default:
|
||||||
|
msg("Your wounds close themselves!");
|
||||||
|
break;
|
||||||
|
case OT_S_HEALINGMAJ:
|
||||||
|
msg("Your injuries are healed!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
msg("Some of your wounds close themselves!");
|
switch (spellid) {
|
||||||
|
case OT_S_HEALINGMIN:
|
||||||
|
msg("Some of your scrapes and bruises are healed!");
|
||||||
|
break;
|
||||||
|
case OT_S_HEALING:
|
||||||
|
default:
|
||||||
|
msg("Some of your wounds close themselves!");
|
||||||
|
break;
|
||||||
|
case OT_S_HEALINGMAJ:
|
||||||
|
msg("Your injuries are partially healed!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
||||||
} else if (haslos(player, target->cell)) {
|
} else if (haslos(player, target->cell)) {
|
||||||
|
@ -2668,57 +2780,6 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
}
|
}
|
||||||
donesomething = B_TRUE;
|
donesomething = B_TRUE;
|
||||||
}
|
}
|
||||||
if (killflagsofid(target->flags, F_POISONED)) {
|
|
||||||
donesomething = B_TRUE;
|
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!donesomething) {
|
|
||||||
if (isplayer(target)) {
|
|
||||||
nothinghappens();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (spellid == OT_S_HEALINGMIN) {
|
|
||||||
int donesomething = B_FALSE;
|
|
||||||
if (!validatespellcell(caster, &targcell,TT_ALLY, spellid, power)) return B_TRUE;
|
|
||||||
target = targcell->lf;
|
|
||||||
if (!target) {
|
|
||||||
fizzle(caster);
|
|
||||||
return B_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cure bad effects instead of healing
|
|
||||||
if (killflagsofid(target->flags, F_PAIN)) {
|
|
||||||
return B_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target->hp < target->maxhp) {
|
|
||||||
switch (blessed) {
|
|
||||||
case B_BLESSED:
|
|
||||||
gainhp(target, 8 + power);
|
|
||||||
break;
|
|
||||||
case B_UNCURSED:
|
|
||||||
gainhp(target, rnd(1,8) + power);
|
|
||||||
break;
|
|
||||||
case B_CURSED:
|
|
||||||
gainhp(target, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (isplayer(target)) {
|
|
||||||
msg("%s of your scrapes and bruises are healed!",
|
|
||||||
(target->hp >= target->maxhp) ? "All" : "Some");
|
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
|
||||||
} else if (haslos(player, target->cell)) {
|
|
||||||
getlfname(target, buf);
|
|
||||||
msg("%s looks a little healthier!", buf);
|
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
|
||||||
}
|
|
||||||
donesomething = B_TRUE;
|
|
||||||
}
|
|
||||||
if (killflagsofid(target->flags, F_POISONED)) {
|
|
||||||
donesomething = B_TRUE;
|
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!donesomething) {
|
if (!donesomething) {
|
||||||
if (isplayer(target)) {
|
if (isplayer(target)) {
|
||||||
|
@ -4233,7 +4294,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
return B_FALSE;
|
return B_FALSE;
|
||||||
}
|
}
|
||||||
howlong = getspellduration(5,10,blessed) + (power/2);
|
howlong = getspellduration(5,10,blessed) + (power/2);
|
||||||
addtempflag(target->flags, F_ASLEEP, B_TRUE, NA, NA, NULL, howlong);
|
fallasleep(target, F_ASLEEP);
|
||||||
if (isplayer(target) || haslos(player, target->cell)) {
|
if (isplayer(target) || haslos(player, target->cell)) {
|
||||||
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
if (seenbyplayer) *seenbyplayer = B_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -4747,6 +4808,14 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_
|
||||||
if (failed) {
|
if (failed) {
|
||||||
fizzle(caster);
|
fizzle(caster);
|
||||||
}
|
}
|
||||||
|
} else if (spellid == OT_S_THORNS) {
|
||||||
|
flag_t *f;
|
||||||
|
// always targetted at caster
|
||||||
|
targcell = caster->cell;
|
||||||
|
target = caster;
|
||||||
|
|
||||||
|
f = addtempflag(caster->flags, F_RETALIATE, 1, 4, DT_PIERCE, "sharp thorns", FROMSPELL);
|
||||||
|
f->obfrom = spellid;
|
||||||
} else if (spellid == OT_S_TURNUNDEAD) {
|
} else if (spellid == OT_S_TURNUNDEAD) {
|
||||||
int i;
|
int i;
|
||||||
// works on all undead in sight
|
// works on all undead in sight
|
||||||
|
@ -5079,8 +5148,8 @@ enum SKILL getschoolskill(enum SPELLSCHOOL ss) {
|
||||||
return SK_SS_NATURE;
|
return SK_SS_NATURE;
|
||||||
case SS_FIRE:
|
case SS_FIRE:
|
||||||
return SK_SS_FIRE;
|
return SK_SS_FIRE;
|
||||||
case SS_ICE:
|
case SS_COLD:
|
||||||
return SK_SS_ICE;
|
return SK_SS_COLD;
|
||||||
case SS_GRAVITY:
|
case SS_GRAVITY:
|
||||||
return SK_SS_GRAVITY;
|
return SK_SS_GRAVITY;
|
||||||
case SS_LIFE:
|
case SS_LIFE:
|
||||||
|
|
Loading…
Reference in New Issue