diff --git a/ai.c b/ai.c index 5d7bc45..b2ae806 100644 --- a/ai.c +++ b/ai.c @@ -671,7 +671,6 @@ flag_t *aigoto(lifeform_t *lf, cell_t *c, enum MOVEREASON why, void *data, int t } - // kill previous target flags. killflagsofid(lf->flags, F_TARGETLF); killflagsofid(lf->flags, F_TARGETCELL); @@ -1768,7 +1767,7 @@ int aimovetolf(lifeform_t *lf, lifeform_t *target, int wantattack) { // not already at their last known cell. try to go there. if (db) dblog(".oO { i cannot see my target. moving to last known loc %d/%d }",lastx,lasty); if (aigoto(lf, targcell, MR_LF, target, PERMENANT)) { - if (db) dblog(".oO { successfuly moved towards LKL. }"); + if (db) dblog(".oO { set target cell for LKL. }"); // success return B_FALSE; } else { diff --git a/data.c b/data.c index a5c2087..c93759d 100644 --- a/data.c +++ b/data.c @@ -125,14 +125,14 @@ void initcommands(void) { addcommand(CMD_RUN_SW, 'B', "Autowalk southwest."); addcommand(CMD_RUN_W, 'H', "Autowalk west."); addcommand(CMD_RUN_NW, 'Y', "Autowalk northwest."); - addcommand(CMD_TURN_N, CMD_TURN_N, "Turn to face North."); - addcommand(CMD_TURN_NE, CMD_TURN_NE, "Turn to face Northeast."); - addcommand(CMD_TURN_E, CMD_TURN_E, "Turn to face East."); - addcommand(CMD_TURN_SE, CMD_TURN_SE, "Turn to face Southeast."); - addcommand(CMD_TURN_S, CMD_TURN_S, "Turn to face South."); - addcommand(CMD_TURN_SW, CMD_TURN_SW, "Turn to face Southwest."); - addcommand(CMD_TURN_W, CMD_TURN_W, "Turn to face West."); - addcommand(CMD_TURN_NW, CMD_TURN_NW, "Turn to face Northwest."); + addcommand(CMD_TURN_N, CH_TURN_N, "Turn to face North."); + addcommand(CMD_TURN_NE, CH_TURN_NE, "Turn to face Northeast."); + addcommand(CMD_TURN_E, CH_TURN_E, "Turn to face East."); + addcommand(CMD_TURN_SE, CH_TURN_SE, "Turn to face Southeast."); + addcommand(CMD_TURN_S, CH_TURN_S, "Turn to face South."); + addcommand(CMD_TURN_SW, CH_TURN_SW, "Turn to face Southwest."); + addcommand(CMD_TURN_W, CH_TURN_W, "Turn to face West."); + addcommand(CMD_TURN_NW, CH_TURN_NW, "Turn to face Northwest."); // Actions addcommand(CMD_UP, '<', "Go up stairs."); addcommand(CMD_DOWN, '>', "Go down stairs, enter a shop/portal."); @@ -446,6 +446,8 @@ void initjobs(void) { addflag(lastjob->flags, F_LEVSKILL, 10, SK_LORE_NATURE, NA, NULL); addflag(lastjob->flags, F_LEVSKILL, 15, SK_LORE_NATURE, NA, NULL); addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); + f = addflag(lastjob->flags, F_RNDSPELLCOUNT, 5, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); + f = addflag(lastjob->flags, F_RNDSPELLSCHOOL, SS_NATURE, 1, 6, NULL); addcondition(f, FC_IFMONSTER, 100); /////////////////////////////////////// addjob(J_MONK, "Monk", "A life of strict self-discipline from an early age makes Monks masters of unarmed combat. This discipline extends to their minds, sometimes allowing them to develop powerful psionic abilities over time. On the downside, they are useless with most weapons and are strict vegetarians."); @@ -512,6 +514,9 @@ void initjobs(void) { // 20: tower of iron will // 21: planeshift addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); + // monsters + f = addflag(lastjob->flags, F_RNDSPELLCOUNT, 4, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); + f = addflag(lastjob->flags, F_RNDSPELLSCHOOL, SS_MENTAL, 1, 6, NULL); addcondition(f, FC_IFMONSTER, 100); addjob(J_HUNTER, "Hunter", "Hunters eke out a living hunting game in the woods. Their dependance on wild animals for sustenance has made them skilled archers."); // stats @@ -906,14 +911,12 @@ void initjobs(void) { addflag(lastjob->flags, F_LEVFLAG, 10, F_CONTROL, B_TRUE, NULL); //addflag(lastjob->flags, F_LEVSPELLSCHOOL, 101, SS_NONE, B_TRUE, NULL); // new spell every 1 level addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL); + // monsters + f = addflag(lastjob->flags, F_RNDSPELLCOUNT, 4, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); + f = addflag(lastjob->flags, F_RNDSPELLSCHOOL, SS_MENTAL, 1, 6, NULL); addcondition(f, FC_IFMONSTER, 100); + + // note: monster spells are defined in subjobs, since wizard MUST have a subjob. // monster job flags - f = addflag(lastjob->flags, F_CANCAST, OT_S_FIREDART, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 50); - f = addflag(lastjob->flags, F_CANCAST, OT_S_COLDRAY, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 50); - f = addflag(lastjob->flags, F_CANCAST, OT_S_HEALINGMIN, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 33); - f = addflag(lastjob->flags, F_CANCAST, OT_S_BLINK, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 33); - f = addflag(lastjob->flags, F_CANCAST, OT_S_TELEKINESIS, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 33); - f = addflag(lastjob->flags, F_CANCAST, OT_S_HASTE, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 20); - f = addflag(lastjob->flags, F_CANCAST, OT_S_HEALING, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 20); addflag(lastjob->flags, F_CASTCHANCE, 30, NA, NA, NULL); // sub jobs addflag(lastjob->flags, F_CANHAVESUBJOB, SJ_AIRMAGE, NA, NA, NULL); @@ -950,6 +953,9 @@ void initjobs(void) { f = addflag(lastjob->flags, F_CANWILL, OT_S_SUMMONANIMALSSM, 10, 10, "pw:5;"); addcondition(f, FC_IFMONSTER, 50); f = addflag(lastjob->flags, F_CANWILL, OT_S_SUMMONANIMALSMD, 10, 10, "pw:5;"); addcondition(f, FC_IFMONSTER, 30); f = addflag(lastjob->flags, F_CANWILL, OT_S_SUMMONANIMALSLG, 10, 10, "pw:5;"); addcondition(f, FC_IFMONSTER, 15); + // plus 2 other random nature spells... + f = addflag(lastjob->flags, F_RNDSPELLCOUNT, 2, NA, NA, NULL); addcondition(f, FC_IFMONSTER, 100); + f = addflag(lastjob->flags, F_RNDSPELLSCHOOL, SS_NATURE, 1, 3, NULL); addcondition(f, FC_IFMONSTER, 100); addjob(J_BERZERKER, "Berzerker", "Berzerkers can enter a start of berzerk rage for short periods."); addflag(lastjob->flags, F_NOPLAYER, B_TRUE, NA, NA, NULL); @@ -2981,12 +2987,14 @@ void initobjects(void) { addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addflag(lastot->flags, F_VARPOWER, B_TRUE, NA, NA, NULL); - addot(OT_S_MIST, "pea soup", "Envelops the area directly ahead of the caster with a thick cloud of mist.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addot(OT_S_MIST, "pea soup", "Envelops an area in front of the caster with a thick cloud of mist.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines how long the mist will last."); addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); + addflag(lastot->flags, F_RANGE, 1, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_ADJSELF, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_NONE, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addot(OT_S_CALLWIND, "zephyr", "Conjures a friendly wind, carrying a single object to the caster's hands.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines its range and the weight of objects affected."); @@ -3322,7 +3330,7 @@ void initobjects(void) { addflag(lastot->flags, F_AICASTTOFLEE, ST_SELF, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); // l4 - addot(OT_S_FROSTBITE, "frostbite", "Deals 1d3 cold damage to target creature per exposed body part.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addot(OT_S_FROSTBITE, "frostbite", "Deals 1d4 cold damage to target creature per exposed body part.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); addflag(lastot->flags, F_RANGE, 4, NA, NA, NULL); @@ -5836,7 +5844,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_WATERPROOF, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HELPSREST, 2, NA, NA, NULL); addot(OT_CLOAKFUR, "fur cloak", "A warm and lightweight fur cloak, great for winter camping trips.", MT_FLESH, 3, OC_ARMOUR, SZ_MEDIUM); @@ -5844,7 +5852,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_COLD, NA, NULL); addflag(lastot->flags, F_HELPSREST, 5, NA, NA, NULL); addot(OT_APRON, "apron", "A sturdy rubber apron, designed to protect against stains.", MT_RUBBER, 2, OC_ARMOUR, SZ_MEDIUM); @@ -5868,7 +5876,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 60, NA, NA, NULL); addot(OT_RIDINGTROUSERS, "pair of riding trousers", "A fitted pair of leather trousers.", MT_LEATHER, 2, OC_ARMOUR, SZ_MEDIUM); @@ -5877,7 +5885,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_LEGS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 75, NA, NA, NULL); addot(OT_COMBATPANTS, "pair of combat pants", "An lightly-armoured pair of camoflauged trousers.", MT_CLOTH, 2, OC_ARMOUR, SZ_MEDIUM); @@ -5913,7 +5921,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 85, NA, NA, NULL); addot(OT_BOOTSRUBBER, "pair of rubber boots", "A waterproof (but somewhat cumbersome) pair of rubber boots.", MT_RUBBER, 6, OC_ARMOUR, SZ_SMALL); @@ -5922,7 +5930,7 @@ void initobjects(void) { addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 0, 5, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTRESIST, DT_ELECTRIC, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 95, NA, NA, NULL); @@ -5931,7 +5939,7 @@ void initobjects(void) { addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_STABILITY, NA, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); @@ -5941,7 +5949,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_FEET, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 35, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addot(OT_BOOTSMETAL, "pair of metal boots", "A strong pair of metal boots.", MT_METAL, 5, OC_ARMOUR, SZ_SMALL); @@ -5960,7 +5968,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 70, NA, NA, NULL); addot(OT_GLOVESLEATHER, "pair of leather gloves", "A pair of coarse leather gloves.", MT_LEATHER, 0.25, OC_ARMOUR, SZ_SMALL); @@ -5968,7 +5976,7 @@ void initobjects(void) { addflag(lastot->flags, F_GOESON, BP_HANDS, NA, NA, NULL); addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 90, NA, NA, NULL); addot(OT_GAUNTLETS, "pair of gauntlets", "A durable pair of metal gauntlets.", MT_METAL, 2, OC_ARMOUR, SZ_SMALL); @@ -5977,7 +5985,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 5, NULL); - addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); + addflag(lastot->flags, F_OBHP, 20, 20, NA, NULL); addflag(lastot->flags, F_ATTREQ, A_AGI, 15, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); // armour - head @@ -5986,13 +5994,13 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addot(OT_PIRATEHAT, "tricorne", "A three cornered hat with a skull and crossbones emblem.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_SCARY, 2, NA, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addot(OT_BALACLAVA, "balaclava", "A form of cloth headgear that covers the whole head, exposing only the eyes.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); @@ -6000,7 +6008,7 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_ANONYMOUS, NA, NA, NULL); addot(OT_CAP, "cap", "Close-fitting headwear with a short shade visor at the front.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); @@ -6009,21 +6017,21 @@ void initobjects(void) { addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addot(OT_CHEFHAT, "toque", "A tall white hat with no brim. Commonly worn by professional cooks.", MT_CLOTH, 1, OC_ARMOUR, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_COMMON, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addot(OT_GASMASK, "gas mask", "A full face mask which protects the wearer from toxic gasses.", MT_METAL, 3.5, OC_ARMOUR, SZ_SMALL); addflag(lastot->flags, F_RARITY, H_ALL, 75, RR_UNCOMMON, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL); addflag(lastot->flags, F_ACCURACYMOD, -10, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); + addflag(lastot->flags, F_OBHP, 15, 15, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_DTIMMUNE, DT_POISONGAS, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -2, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); @@ -6062,7 +6070,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_UNCOMMON, NULL); addflag(lastot->flags, F_GOESON, BP_HEAD, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 1, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 3, 3, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_HASHIDDENNAME, B_TRUE, NA, NA, "pointy hat"); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); @@ -6091,7 +6099,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); + addflag(lastot->flags, F_OBHP, 5, 5, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, 1, NA, NULL); addflag(lastot->flags, F_NOQUALITY, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL); @@ -6101,7 +6109,7 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_FOREST, 100, RR_COMMON, NULL); addflag(lastot->flags, F_GOESON, BP_EYES, NA, NA, NULL); addflag(lastot->flags, F_ARMOURRATING, 0, NA, NA, NULL); - addflag(lastot->flags, F_OBHP, 2, 2, NA, NULL); + addflag(lastot->flags, F_OBHP, 10, 10, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_VISRANGEMOD, -1, NA, NULL); addflag(lastot->flags, F_EQUIPCONFER, F_NIGHTVISRANGEMOD, -1, NA, NULL); addflag(lastot->flags, F_TINTED, B_TRUE, NA, NA, NULL); @@ -7994,7 +8002,7 @@ void initrace(void) { // god abilities addflag(lastrace->flags, F_GODOF, NA, NA, NA, "Purity & Order"); addflag(lastrace->flags, F_FLEEONHPPCT, 10, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_LIGHT, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_LIGHT, NA, NA, "pw:10;"); // may cast all life spells for (ot = objecttype ; ot ; ot = ot->next) { if ((ot->obclass->id == OC_SPELL) && (getspellschool(ot->id) == SS_LIFE)) { @@ -8004,7 +8012,7 @@ void initrace(void) { addflag(lastrace->flags, F_SACRIFICEOBBLESSED, B_CURSED, NA, 5, "OB explode#S in a shower of sparks!"); addflag(lastrace->flags, F_SACRIFICEOB, OT_CORPSE, NA, 10, "OB explode#S in a shower of sparks!"); - addflag(lastrace->flags, F_CANWILL, OT_S_WISHLIMITED, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WISHLIMITED, NA, NA, "pw:10;"); // likes/dislikes addflag(lastrace->flags, F_GODPOISON, B_FALSE, 100, NA, NULL); addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "destroying the undead"); @@ -8158,11 +8166,11 @@ void initrace(void) { addflag(lastrace->flags, F_GODOF, NA, NA, NA, "Revenge & Thievery"); addflag(lastrace->flags, F_FLEEONHPPCT, 10, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_HIDE, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CALLWIND, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CONFISCATE, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_WISHLIMITED, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_BLINKASS, NA, NA, "pw:10;"); - //addflag(lastrace->flags, F_CANWILL, OT_S_HUNGER, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CALLWIND, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CONFISCATE, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WISHLIMITED, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINKASS, NA, NA, "pw:10;"); + //addflag(lastrace->flags, F_CANCAST, OT_S_HUNGER, NA, NA, "pw:1;"); // likes/dislikes addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "backstabbing"); addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "stealing items"); @@ -8253,7 +8261,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANWILL, ot->id, NA, NA, "pw:10;"); } } - addflag(lastrace->flags, F_CANWILL, OT_S_WISHLIMITED, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WISHLIMITED, NA, NA, "pw:10;"); // likes addflag(lastrace->flags, F_GODPOISON, B_TRUE, 3, NA, NULL); addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "killing (especially the good-aligned)"); @@ -8378,12 +8386,12 @@ void initrace(void) { // god abilities addflag(lastrace->flags, F_GODOF, B_FEMALE, NA, NA, "Mercy & Forgiveness"); addflag(lastrace->flags, F_FLEEONHPPCT, 10, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_CUREPOISON, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_HEALINGMAJ, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_WISHLIMITED, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SATEHUNGER, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_DISPERSAL, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SLEEP, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CUREPOISON, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_HEALINGMAJ, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WISHLIMITED, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SATEHUNGER, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DISPERSAL, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SLEEP, NA, NA, "pw:10;"); addflag(lastrace->flags, F_GODPOISON, B_FALSE, 25, NA, NULL); addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "allowing fleeing creatures to escape"); addflag(lastrace->flags, F_GODLIKES, NA, NA, NA, "knocking enemies unconscious"); @@ -8413,11 +8421,11 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_SPELLSPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_CANWILL, OT_S_FIREDART, NA, NA, "pw:5;"); - addflag(lastrace->flags, F_CANWILL, OT_S_WEAKEN, NA, NA, "pw:2;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SLEEP, NA, NA, "pw:2;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SUCK, NA, NA, "pw:2;"); - addflag(lastrace->flags, F_CANWILL, OT_S_PARALYZE, NA, NA, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FIREDART, NA, NA, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WEAKEN, NA, NA, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SLEEP, NA, NA, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SUCK, NA, NA, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_PARALYZE, NA, NA, "pw:2;"); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 8, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "gazes"); addflag(lastrace->flags, F_CASTTYPE, CT_GAZE, NA, NA, NULL); @@ -8426,7 +8434,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_EXPERT, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); - addflag(lastrace->flags, F_CASTCHANCE, 30, NA, NA, NULL); + addflag(lastrace->flags, F_CASTCHANCE, 50, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addrace(R_BUGBEAR, "bugbear", 120, 'G', C_BROWN, MT_FLESH, RC_HUMANOID, "A huge goblinoid creature, similar to a hobgoblin but larger again, with a temperament to match."); @@ -8527,7 +8535,7 @@ void initrace(void) { addflag(lastrace->flags, F_ACTIONSPEED, SP_VERYSLOW, NA, NA, ""); addflag(lastrace->flags, F_CANWILL, OT_S_FLIGHT, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FLIGHT, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DARKNESS, 7, 7, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DARKNESS, 7, 7, "pw:3;"); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_CRUSH, NA, NA, "dam:0d0+5;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "waves its tentacles"); @@ -8593,7 +8601,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_MASTER, NA, NULL); addflag(lastrace->flags, F_AWARENESS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "bellows^a bellow"); - addflag(lastrace->flags, F_CANWILL, OT_S_STUN, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_STUN, 5, 5, "pw:1;"); addflag(lastrace->flags, F_CASTTYPE, CT_GAZE, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_STUN, NA, B_APPENDYOU, "gazes"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); @@ -8701,9 +8709,8 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 4, NA, "bellows^a bellow"); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); - addflag(lastrace->flags, F_CANCAST, OT_S_FIREDART, NA, NA, NULL); - addflag(lastrace->flags, F_CANCAST, OT_S_FLAMEPILLAR, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FLAMEBURST, 4, 4, "pw:4;"); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 3, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_FIRE, 1, 3, "pw:4;"); addflag(lastrace->flags, F_STARTSKILL, SK_SS_FIRE, PR_ADEPT, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); @@ -8737,7 +8744,9 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_WALK, 3, NA, "^crackling flames."); addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, NULL); addflag(lastrace->flags, F_HEAVYBLOW, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_BURNINGWAVE, 3, 3, "pw:6;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BURNINGWAVE, 3, 3, "pw:6;"); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 3, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_FIRE, 1, 5, "pw:6;"); addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); @@ -8891,8 +8900,8 @@ void initrace(void) { addflag(lastrace->flags, F_STARTOBCLASS, 40, OC_POTION, NA, NULL); addflag(lastrace->flags, F_WANTSBETTERWEP, B_TRUE, B_COVETS, NA, NULL); addflag(lastrace->flags, F_WANTS, OT_GOLD, B_COVETS, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DIG, NA, NA, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_PASSWALL, NA, NA, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DIG, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_PASSWALL, NA, NA, "pw:5;"); addflag(lastrace->flags, F_CASTCHANCE, 50, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_PASSWALL, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_DIG, NA, NA, "burrows down into the ground"); @@ -9001,8 +9010,11 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 5, NA, NA, NULL); addflag(lastrace->flags, F_DODGES, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_PACKATTACK, 2, DT_SLASH, 3, NULL); - addflag(lastrace->flags, F_CANCAST, OT_S_BLINDNESS, NA, NA, NULL); - addflag(lastrace->flags, F_CANCAST, OT_S_PAIN, NA, NA, NULL); + //addflag(lastrace->flags, F_CANCAST, OT_S_BLINDNESS, NA, NA, NULL); + //addflag(lastrace->flags, F_CANCAST, OT_S_PAIN, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 2, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_WILD, 1, 3, "pw:3;"); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_DEATH, 1, 2, "pw:3;"); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MINIONS, 90, 1, 2, "goblin"); @@ -9067,7 +9079,7 @@ void initrace(void) { addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_GASEOUSFORM, NA, NA, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_GASEOUSFORM, NA, NA, "pw:3;"); // gremlins also cause tech to fail around them. addrace(R_HOBGOBLIN, "hobgoblin", 90, 'g', C_YELLOW, MT_FLESH, RC_HUMANOID, "A larger, stronger, smarter and more menacing form of a goblin."); @@ -9231,7 +9243,9 @@ void initrace(void) { addflag(lastrace->flags, F_STARTOB, 75, NA, NA, "50-100 gold coins"); addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_BLINK, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINK, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 2, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_TRANSLOCATION, 1, 3, "pw:3;"); addflag(lastrace->flags, F_STARTSKILL, SK_THIEVERY, PR_SKILLED, NA, NULL); addflag(lastrace->flags, F_WANTS, OT_GOLD, B_COVETS, NA, NULL); addflag(lastrace->flags, F_DODGES, B_TRUE, NA, NA, NULL); @@ -9263,7 +9277,7 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 3, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "spits"); - addflag(lastrace->flags, F_CANWILL, OT_S_POISONBOLT, 5, 5, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_POISONBOLT, 5, 5, "pw:5;"); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_SKILLED, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); @@ -9438,9 +9452,9 @@ void initrace(void) { addflag(lastrace->flags, F_STARTOB, 50, NA, NA, "robes"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_SEEINDARK, 4, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DISORIENT, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_BAFFLE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_INVISIBILITY, 10, 10, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DISORIENT, NA, NA, NULL); + addflag(lastrace->flags, F_CANCAST, OT_S_BAFFLE, NA, NA, NULL); + addflag(lastrace->flags, F_CANCAST, OT_S_INVISIBILITY, 10, 10, "pw:1;"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); @@ -9465,8 +9479,8 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 6, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "shouts^a shout"); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_SMITEGOOD, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DARKNESS, NA, NA, "pw:8;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SMITEGOOD, NA, NA, NULL); + addflag(lastrace->flags, F_CANCAST, OT_S_DARKNESS, NA, NA, "pw:8;"); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); @@ -9562,14 +9576,14 @@ void initrace(void) { addflag(lastrace->flags, F_SIZE, SZ_SMALL, NA, NA, NULL); addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "5d4"); addflag(lastrace->flags, F_LEVITATING, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_LEVITATION, NA, NA, NULL); + addflag(lastrace->flags, F_CANCAST, OT_S_LEVITATION, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_LEVITATION, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_CANWILL, OT_S_SUMMONWEAPON, NA, NA, "pw:4;"); - addflag(lastrace->flags, F_CANWILL, OT_S_ICECRUST, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CRYSTALARM, NA, NA, "pw:4;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CRYSTALSHIELD, NA, NA, "pw:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SUMMONWEAPON, NA, NA, "pw:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ICECRUST, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CRYSTALARM, NA, NA, "pw:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CRYSTALSHIELD, NA, NA, "pw:4;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "shimmers"); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 3, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); @@ -9627,7 +9641,7 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_SPELLSPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); - addflag(lastrace->flags, F_CANWILL, OT_S_TELEKINESIS, NA, NA, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_TELEKINESIS, NA, NA, "pw:5;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_SEEINDARK, UNLIMITED, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -9761,7 +9775,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOPACK, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOSLEEP, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOINJURIES, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_SLEEP, NA, NA, "range:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SLEEP, NA, NA, "range:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_SLEEP, NA, B_APPENDYOU, "throws a handful of sand"); addflag(lastrace->flags, F_TREMORSENSE, 4, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_FLY, 1, NA, "^rushing air"); @@ -9839,8 +9853,8 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_STABILITY, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_SNOWBALL, NA, NA, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SLIDE, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SNOWBALL, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SLIDE, NA, NA, "pw:10;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "rubs its hands together"); addflag(lastrace->flags, F_HASATTACK, OT_TOUCHCHILL, 3, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); @@ -9891,7 +9905,7 @@ void initrace(void) { addflag(lastrace->flags, F_STARTATT, A_STR, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_DRILL, 5, NA, NULL); addflag(lastrace->flags, F_MORALE, 10, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DIG, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DIG, NA, NA, "pw:1;"); addflag(lastrace->flags, F_CASTCHANCE, 50, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "pounds its drills into the ground"); addflag(lastrace->flags, F_EATCONFER, F_MUTABLE, B_TRUE, NA, "100"); @@ -9912,7 +9926,9 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_SPELLSPEED, SP_SLOW, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FIREDART, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FIREDART, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 1, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_FIRE, 1, 2, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 3, NA, NULL); addflag(lastrace->flags, F_PRODUCESLIGHT, 3, NA, NA, NULL); @@ -9944,9 +9960,9 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_SPELLSPEED, SP_SLOW, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_SMITEGOOD, NA, NA, "pw:2;"); - addflag(lastrace->flags, F_CANWILL, OT_S_LETHARGY, NA, NA, "pw:3;"); - addflag(lastrace->flags, F_CANWILL, OT_S_ANIMATEDEAD, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SMITEGOOD, NA, NA, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_LETHARGY, NA, NA, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ANIMATEDEAD, NA, NA, "pw:10;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 3, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); @@ -9975,9 +9991,10 @@ void initrace(void) { addflag(lastrace->flags, F_MOVESPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, ""); addflag(lastrace->flags, F_SPELLSPEED, SP_SLOW, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FROSTBITE, NA, NA, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_FREEZEOB, 10, 10, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_ICICLE, 3, 3, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FROSTBITE, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ICICLE, 3, 3, "pw:1;"); + addflag(lastrace->flags, F_RNDSPELLCOUNT, 1, NA, NA, NULL); + addflag(lastrace->flags, F_RNDSPELLSCHOOL, SS_COLD, 1, 2, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "gestures"); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 3, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); @@ -10041,7 +10058,7 @@ void initrace(void) { addflag(lastrace->flags, F_DTIMMUNE, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTVULN, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FROSTBITE, NA, NA, "pw:1; range:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FROSTBITE, NA, NA, "pw:1; range:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FROSTBITE, NA, NA, "exhales a freezing wind"); addflag(lastrace->flags, F_NOCTURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); @@ -10092,10 +10109,10 @@ void initrace(void) { noarmouron(lastrace, BP_FEET); addflag(lastrace->flags, F_HOSTILE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_HUMANOID, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_COMMON, NULL); - addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_UNCOMMON, NULL); - addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_FREQUENT, NULL); - addflag(lastrace->flags, F_RARITY, H_SEWER, NA, RR_UNCOMMON, NULL); + addflag(lastrace->flags, F_RARITY, H_DUNGEON, NA, RR_VERYRARE, NULL); + addflag(lastrace->flags, F_RARITY, H_CAVE, NA, RR_VERYRARE, NULL); + addflag(lastrace->flags, F_RARITY, H_SWAMP, NA, RR_RARE, NULL); + addflag(lastrace->flags, F_RARITY, H_SEWER, NA, RR_RARE, NULL); addflag(lastrace->flags, F_SIZE, SZ_LARGE, NA, NA, NULL); addflag(lastrace->flags, F_ARMOURRATING, 15, NA, NA, NULL); // high armour addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "3d4+4"); @@ -10256,8 +10273,8 @@ void initrace(void) { addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_BASH, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_CLONE, 0, 100, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_ENTANGLE, 50, 50, "pw:2; range:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CLONE, 0, 100, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ENTANGLE, 50, 50, "pw:2; range:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_CLONE, NA, NA, "expands"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_ENTANGLE, NA, NA, "writhes"); @@ -10555,8 +10572,8 @@ void initrace(void) { addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, SV_SHOUT, NA, "croaks^croaking"); addflag(lastrace->flags, F_NOISETEXT, N_SPELLCAST, SV_SHOUT, NA, "gurgles loudly^a loud gurgling"); addflag(lastrace->flags, F_CANWILL, OT_A_JUMP, NA, NA, "stamcost:0;"); - addflag(lastrace->flags, F_CANWILL, OT_S_FLOOD, 20, 20, "pw:6;"); - addflag(lastrace->flags, F_CANWILL, OT_S_WATERJET, NA, NA, "pw:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FLOOD, 20, 20, "pw:6;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WATERJET, NA, NA, "pw:4;"); addflag(lastrace->flags, F_STARTSKILL, SK_SWIMMING, PR_MASTER, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, NULL); addflag(lastrace->flags, F_AISPELLTARGETOVERRIDE, OT_S_FLOOD, ST_SELF, NA, NULL); @@ -10631,7 +10648,7 @@ void initrace(void) { addflag(lastrace->flags, F_VEGETARIAN, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 6, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, NULL); // don't announce spellcasting - addflag(lastrace->flags, F_CANWILL, OT_S_BLINK, 2, 2, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINK, 2, 2, "pw:1;"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 3, NA, "barks^barking"); addflag(lastrace->flags, F_NOISETEXT, N_FRUSTRATED, 3, NA, "growls^growling"); addflag(lastrace->flags, F_NOISETEXT, N_LOWHP, 2, NA, "whines in pain^whining"); @@ -10831,7 +10848,7 @@ void initrace(void) { addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_SWOOP, NA, NA, NULL); addflag(lastrace->flags, F_SWOOPRANGE, 5, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_COLDBURST, 2, 2, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_COLDBURST, 2, 2, "pw:2;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "screeches"); addflag(lastrace->flags, F_MORALE, 10, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, B_TRUE, NA, NA, NULL); @@ -11103,7 +11120,7 @@ void initrace(void) { addflag(lastrace->flags, F_WALKVERB, NA, NA, NA, "slither"); addflag(lastrace->flags, F_NOISETEXT, N_WALK, 1, NA, "^slithering"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "hisses^hissing"); - addflag(lastrace->flags, F_CANWILL, OT_S_POISONBOLT, 4, 4, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_POISONBOLT, 4, 4, "pw:3;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "spits"); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_POISON, NA, NA, NULL); @@ -11133,7 +11150,7 @@ void initrace(void) { addflag(lastrace->flags, F_CASTTYPE, CT_EYESPIT, NA, NA, NULL); addflag(lastrace->flags, F_DEAF, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_POISON, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_BLINDNESS, 4, 4, "pw:3;range:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINDNESS, 4, 4, "pw:3;range:2;"); addflag(lastrace->flags, F_TREMORSENSE, 10, NA, NA, NULL); addflag(lastrace->flags, F_DIURNAL, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOFLEE, B_TRUE, NA, NA, NULL); @@ -11204,7 +11221,7 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 4, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, NULL); // don't announce spellcasting addflag(lastrace->flags, F_SPIDERCLIMB, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:1;range:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WEB, 3, 3, "pw:1;range:4;"); addflag(lastrace->flags, F_CANWILL, OT_A_CLIMB, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); @@ -11233,7 +11250,7 @@ void initrace(void) { addflag(lastrace->flags, F_HITCONFER, F_POISONED, SC_POISON, 26, "10-20"); addflag(lastrace->flags, F_HITCONFERVALS, P_VENOM, 3, NA, NULL); // strong! addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, NULL); // don't announce spellcasting - addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:5;range:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WEB, 3, 3, "pw:5;range:2;"); addflag(lastrace->flags, F_CANWILL, OT_A_CLIMB, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); @@ -11263,7 +11280,7 @@ void initrace(void) { addflag(lastrace->flags, F_HITCONFER, F_PAIN, SC_POISON, 26, "5-15"); addflag(lastrace->flags, F_HITCONFERVALS, DT_POISON, NA, NA, "1d2"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, NULL); // don't announce spellcasting - addflag(lastrace->flags, F_CANWILL, OT_S_WEB, 3, 3, "pw:7;range:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_WEB, 3, 3, "pw:7;range:3;"); addflag(lastrace->flags, F_CANWILL, OT_A_CLIMB, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CASTCHANCE, 60, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); @@ -11358,7 +11375,7 @@ void initrace(void) { addflag(lastrace->flags, F_FLEEONHPPCT, 50, NA, NA, ""); addflag(lastrace->flags, F_HASSKILL, SK_SWIMMING, PR_BEGINNER, NA, NULL); addflag(lastrace->flags, F_MORALE, 11, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_COLDRAY, 10, 10, "pw:2;"); + addflag(lastrace->flags, F_CANCAST, OT_S_COLDRAY, 10, 10, "pw:2;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "unleashes its icy breath"); addflag(lastrace->flags, F_CANINE, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_CANEATRAW, B_TRUE, NA, NA, NULL); @@ -11566,7 +11583,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANCAST, OT_S_LIGHTNINGBOLT, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CANCAST, OT_S_FLOOD, NA, NA, "pw:4;"); addflag(lastrace->flags, F_CANCAST, OT_S_CHAINLIGHTNING, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 30, 30, "pw:6;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 30, 30, "pw:6;"); addflag(lastrace->flags, F_CASTCHANCE, 40, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "unleashes its lightning breath"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_GUSTOFWIND, NA, NA, "flaps its wings"); @@ -11717,7 +11734,7 @@ void initrace(void) { addflag(lastrace->flags, F_CANCAST, OT_S_FLAMEPILLAR, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CANCAST, OT_S_BURNINGWAVE, NA, NA, "pw:10;"); addflag(lastrace->flags, F_CANCAST, OT_S_PYROMANIA, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 30, 30, "pw:6;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 30, 30, "pw:6;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "unleashes its fiery breath"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FEAR, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FLAMEPILLAR, NA, NA, "breaths fire into the ground"); @@ -11896,7 +11913,7 @@ void initrace(void) { addflag(lastrace->flags, F_CORPSEFLAG, F_EXPLODEONDEATH, NA, 2, "32d2"); addflag(lastrace->flags, F_MORALE, 5, NA, NA, NULL); addflag(lastrace->flags, F_WANTS, OT_STONE, B_COVETS, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_DETONATEDELAY, 20, 20, "pw:1;range:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DETONATEDELAY, 20, 20, "pw:1;range:3;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "vibrates"); addrace(R_BUTTERFLY, "butterfly", 0.01, 'i', C_YELLOW, MT_FLESH, RC_INSECT, "A harmless, colourful butterfly."); @@ -12066,7 +12083,7 @@ void initrace(void) { addflag(lastrace->flags, F_HITDICE, NA, NA, NA, "1d4+0"); addflag(lastrace->flags, F_EVASION, 60, NA, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_ZAPPER, 1, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FLASH, 15, 15, "pw:4;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FLASH, 15, 15, "pw:4;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "pulses"); addflag(lastrace->flags, F_NOPACK, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_NOSPELLS, B_TRUE, NA, NA, NULL); @@ -12125,9 +12142,9 @@ void initrace(void) { addflag(lastrace->flags, F_DTRESIST, DT_ACID, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 20, 20, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CLOUDKILL, 20, 20, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SUMMONDEMON, 20, 20, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 20, 20, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CLOUDKILL, 20, 20, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SUMMONDEMON, 20, 20, "pw:3;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "narrows its eyes"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "roars^an other-wordly roar"); @@ -12150,7 +12167,7 @@ void initrace(void) { addflag(lastrace->flags, F_DTRESIST, DT_ACID, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_COLD, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_HEATMETAL, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_HEATMETAL, 5, 5, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "waves its trident"); addflag(lastrace->flags, F_STARTOB, 100, NA, NA, "red-hot trident"); addflag(lastrace->flags, F_NEEDOBFORSPELLS, OT_TRIDENT, NA, NA, NULL); @@ -12175,7 +12192,7 @@ void initrace(void) { addflag(lastrace->flags, F_SEEINDARK, 10, NA, NA, NULL); addflag(lastrace->flags, F_DTIMMUNE, DT_POISON, NA, NA, NULL); addflag(lastrace->flags, F_DTRESIST, DT_ACID, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_SHARDSHOT, 5, 5, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SHARDSHOT, 5, 5, "pw:3;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, B_APPENDYOU, "points its arm"); addflag(lastrace->flags, F_RESISTMAG, 10, NA, NA, NULL); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "roars^an other-wordly roar"); @@ -12215,7 +12232,7 @@ void initrace(void) { addflag(lastrace->flags, F_ACTIONSPEED, SP_NORMAL, NA, NA, NULL); addflag(lastrace->flags, F_STARTATT, A_AGI, AT_HIGH, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_HURRICANESTRIKE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_BLINKASS, 3, 3, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINKASS, 3, 3, "pw:1;"); addflag(lastrace->flags, F_HASATTACK, OT_FISTS, 2, NA, NULL); addflag(lastrace->flags, F_VAMPIRIC, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_SEEINDARK, 10, NA, NA, NULL); @@ -12247,8 +12264,8 @@ void initrace(void) { addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DETECTMAGIC, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_STEALTH, PR_ADEPT, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_ENTANGLE, 3, 3, "pw:5;"); - addflag(lastrace->flags, F_CANWILL, OT_S_INVISIBILITY, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ENTANGLE, 3, 3, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_INVISIBILITY, 5, 5, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "grins"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "screechs^an other-wordly screech"); @@ -12277,8 +12294,8 @@ void initrace(void) { addflag(lastrace->flags, F_DTRESIST, DT_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_DETECTMAGIC, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_STARTSKILL, SK_STEALTH, PR_ADEPT, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 20, 20, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_INVISIBILITY, 20, 20, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 20, 20, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_INVISIBILITY, 20, 20, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "narrows its eyes"); addflag(lastrace->flags, F_NOISETEXT, N_GETANGRY, 2, NA, "screechs^an other-wordly screech"); @@ -12300,6 +12317,7 @@ void initrace(void) { addflag(lastrace->flags, F_EVASION, -10, NA, NA, NULL); addflag(lastrace->flags, F_MOVESPEED, SP_SLOW, NA, NA, NULL); addflag(lastrace->flags, F_ACTIONSPEED, SP_SLOW, NA, NA, NULL); + addflag(lastrace->flags, F_MAXATTACKS, 1, 1, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_CLAWS, 4, NA, NULL); addflag(lastrace->flags, F_HASATTACK, OT_TEETH, 5, NA, NULL); addflag(lastrace->flags, F_CANWILL, OT_A_GRAB, NA, NA, NULL); @@ -12459,7 +12477,7 @@ void initrace(void) { addflag(lastrace->flags, F_MORALE, 30, NA, NA, NULL); addflag(lastrace->flags, F_NATURALFLIGHT, B_TRUE, NA, NA, NULL); addflag(lastrace->flags, F_INDUCEFEAR, B_TRUE, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_INVISIBILITY, 40, 40, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_INVISIBILITY, 40, 40, "pw:1;"); // special: ghosts gain canwill->possession if they are near // their previous corpse. use f_mycorpse->oid for this. @@ -12507,7 +12525,7 @@ void initrace(void) { addflag(lastrace->flags, F_HASATTACK, OT_TOUCHNECROTIC, 12, NA, NULL); addflag(lastrace->flags, F_HITCONFER, F_POISONED, NA, NA, NULL); addflag(lastrace->flags, F_HITCONFERVALS, P_ROT, 3, NA, NULL); // strong! - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 50, 50, "pw:3;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 50, 50, "pw:3;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FEAR, NA, B_APPENDYOU, "gazes"); addflag(lastrace->flags, F_CASTTYPE, CT_GAZE, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -12535,16 +12553,16 @@ void initrace(void) { addflag(lastrace->flags, F_HITCONFER, F_POISONED, NA, NA, NULL); addflag(lastrace->flags, F_HITCONFERVALS, P_ROT, 5, NA, NULL); addflag(lastrace->flags, F_RESISTMAG, 15, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_FEAR, 50, 50, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_STENCH, NA, NA, "pw:8;"); - addflag(lastrace->flags, F_CANWILL, OT_S_BLINDNESS, NA, NA, "pw:8;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SMITEGOOD, 6, 6, "pw:5;"); - addflag(lastrace->flags, F_CANWILL, OT_S_DRAINLIFE, 6, 6, "pw:8;"); - addflag(lastrace->flags, F_CANWILL, OT_S_FLAYFLESH, 10, 10, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_ANIMATEDEAD, NA, NA, "pw:10;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CHILL, 10, 10, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_CURSE, 5, 5, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_PROTGOOD, NA, NA, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FEAR, 50, 50, NULL); + addflag(lastrace->flags, F_CANCAST, OT_S_STENCH, NA, NA, "pw:8;"); + addflag(lastrace->flags, F_CANCAST, OT_S_BLINDNESS, NA, NA, "pw:8;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SMITEGOOD, 6, 6, "pw:5;"); + addflag(lastrace->flags, F_CANCAST, OT_S_DRAINLIFE, 6, 6, "pw:8;"); + addflag(lastrace->flags, F_CANCAST, OT_S_FLAYFLESH, 10, 10, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_ANIMATEDEAD, NA, NA, "pw:10;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CHILL, 10, 10, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CURSE, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_PROTGOOD, NA, NA, "pw:1;"); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_NONE, NA, NA, "begins to chant"); // default addflag(lastrace->flags, F_CASTCHANCE, 40, NA, NA, NULL); addflag(lastrace->flags, F_SILENTMOVE, B_TRUE, NA, NA, NULL); @@ -12583,10 +12601,10 @@ void initrace(void) { addflag(lastrace->flags, F_NATURALFLIGHT, B_TRUE, NA, NA, ""); addflag(lastrace->flags, F_CANWILL, OT_S_FLIGHT, NA, NA, NULL); addflag(lastrace->flags, F_SPELLCASTTEXT, OT_S_FLIGHT, NA, NA, NULL); - addflag(lastrace->flags, F_CANWILL, OT_S_CHARM, 3, 3, "pw:6;"); + addflag(lastrace->flags, F_CANCAST, OT_S_CHARM, 3, 3, "pw:6;"); addflag(lastrace->flags, F_CANWILL, OT_A_CHARGE, NA, NA, "range:3;"); - addflag(lastrace->flags, F_CANWILL, OT_S_STUN, 5, 5, "pw:1;"); - addflag(lastrace->flags, F_CANWILL, OT_S_SHAPESHIFT, 3, 3, "pw:1;race:vampire bat;"); + addflag(lastrace->flags, F_CANCAST, OT_S_STUN, 5, 5, "pw:1;"); + addflag(lastrace->flags, F_CANCAST, OT_S_SHAPESHIFT, 3, 3, "pw:1;race:vampire bat;"); addflag(lastrace->flags, F_CASTCHANCE, 40, NA, NA, NULL); addflag(lastrace->flags, F_DETECTOBS, 10, OT_COFFIN, NA, NULL); addflag(lastrace->flags, F_CORPSETYPE, NA, NA, NA, "pile of ash"); @@ -13002,6 +13020,7 @@ void initskills(void) { // spell schools addskill(SK_SS_ALLOMANCY, "Allomancy", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_ALLOMANCY, PR_INEPT, "- Spell power power depends on your Level and Strength.", B_FALSE); addskilldesc(SK_SS_ALLOMANCY, PR_INEPT, "- Each rank gives you a 20% chance to learn a new allomantic ability when levelling up.", B_FALSE); addskilldesc(SK_SS_ALLOMANCY, PR_NOVICE, "Allows you to cast Allomancy spells up to level 1.", B_FALSE); addskilldesc(SK_SS_ALLOMANCY, PR_BEGINNER, "Allows you to cast Allomancy spells up to level 2.", B_FALSE); @@ -13010,6 +13029,7 @@ void initskills(void) { addskilldesc(SK_SS_ALLOMANCY, PR_EXPERT, "Allows you to cast Allomancy spells up to level 5.", B_FALSE); addskilldesc(SK_SS_ALLOMANCY, PR_MASTER, "Allows you to cast Allomancy spells up to level 6.", B_FALSE); addskill(SK_SS_MENTAL, "Psionics", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_MENTAL, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_MENTAL, PR_INEPT, "- Each rank gives you a 20% chance to learn a new psionic ability when levelling up.", B_FALSE); addskilldesc(SK_SS_MENTAL, PR_NOVICE, "Allows you to cast Psionic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_MENTAL, PR_BEGINNER, "Allows you to cast Psionic spells up to level 2.", B_FALSE); @@ -13018,6 +13038,7 @@ void initskills(void) { addskilldesc(SK_SS_MENTAL, PR_EXPERT, "Allows you to cast Psionic spells up to level 5.", B_FALSE); addskilldesc(SK_SS_MENTAL, PR_MASTER, "Allows you to cast Psionic spells up to level 6.", B_FALSE); addskill(SK_SS_NATURE, "Enviromancy", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_NATURE, PR_INEPT, "- Spell power power depends on your Level and Wisdom.", B_FALSE); addskilldesc(SK_SS_NATURE, PR_NOVICE, "Allows you to cast Nature spells up to level 1.", B_FALSE); addskilldesc(SK_SS_NATURE, PR_BEGINNER, "Allows you to cast Nature spells up to level 2.", B_FALSE); addskilldesc(SK_SS_NATURE, PR_ADEPT, "Allows you to cast Nature spells up to level 3.", B_FALSE); @@ -13025,6 +13046,7 @@ void initskills(void) { addskilldesc(SK_SS_NATURE, PR_EXPERT, "Allows you to cast Nature spells up to level 5.", B_FALSE); addskilldesc(SK_SS_NATURE, PR_MASTER, "Allows you to cast Nature spells up to level 6.", B_FALSE); addskill(SK_SS_AIR, "Sorcery:Air Magic", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_AIR, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_AIR, PR_NOVICE, "Allows you to cast Air Magic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_AIR, PR_BEGINNER, "Allows you to cast Air Magic spells up to level 2.", B_FALSE); addskilldesc(SK_SS_AIR, PR_ADEPT, "Allows you to cast Air Magic spells up to level 3.", B_FALSE); @@ -13032,6 +13054,7 @@ void initskills(void) { addskilldesc(SK_SS_AIR, PR_EXPERT, "Allows you to cast Air Magic spells up to level 5.", B_FALSE); addskilldesc(SK_SS_AIR, PR_MASTER, "Allows you to cast Air Magic spells up to level 6.", B_FALSE); addskill(SK_SS_DEATH, "Sorcery:Necromancy", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_DEATH, PR_INEPT, "- Spell power power depends on your Level, your Intelligence, and Hecta's pleasure.", B_FALSE); addskilldesc(SK_SS_DEATH, PR_NOVICE, "Allows you to cast Necromancy spells up to level 1.", B_FALSE); addskilldesc(SK_SS_DEATH, PR_BEGINNER, "Allows you to cast Necromancy spells up to level 2.", B_FALSE); addskilldesc(SK_SS_DEATH, PR_ADEPT, "Allows you to cast Necromancy spells up to level 3.", B_FALSE); @@ -13039,6 +13062,7 @@ void initskills(void) { addskilldesc(SK_SS_DEATH, PR_EXPERT, "Allows you to cast Necromancy spells up to level 5.", B_FALSE); addskilldesc(SK_SS_DEATH, PR_MASTER, "Allows you to cast Necromancy spells up to level 6.", B_FALSE); addskill(SK_SS_DIVINATION, "Sorcery:Divination", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_DIVINATION, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_DIVINATION, PR_NOVICE, "Allows you to cast Divination spells up to level 1.", B_FALSE); addskilldesc(SK_SS_DIVINATION, PR_BEGINNER, "Allows you to cast Divination spells up to level 2.", B_FALSE); addskilldesc(SK_SS_DIVINATION, PR_ADEPT, "Allows you to cast Divination spells up to level 3.", B_FALSE); @@ -13046,6 +13070,7 @@ void initskills(void) { addskilldesc(SK_SS_DIVINATION, PR_EXPERT, "Allows you to cast Divination spells up to level 5.", B_FALSE); addskilldesc(SK_SS_DIVINATION, PR_MASTER, "Allows you to cast Divination spells up to level 6.", B_FALSE); addskill(SK_SS_FIRE, "Sorcery:Fire Magic", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_FIRE, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_FIRE, PR_NOVICE, "Allows you to cast Fire Magic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_FIRE, PR_BEGINNER, "Allows you to cast Fire Magic spells up to level 2.", B_FALSE); addskilldesc(SK_SS_FIRE, PR_ADEPT, "Allows you to cast Fire Magic spells up to level 3.", B_FALSE); @@ -13053,6 +13078,7 @@ void initskills(void) { addskilldesc(SK_SS_FIRE, PR_EXPERT, "Allows you to cast Fire Magic spells up to level 5.", B_FALSE); addskilldesc(SK_SS_FIRE, PR_MASTER, "Allows you to cast Fire Magic spells up to level 6.", B_FALSE); addskill(SK_SS_COLD, "Sorcery:Cold Magic", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_COLD, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_COLD, PR_NOVICE, "Allows you to cast Cold Magic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_COLD, PR_BEGINNER, "Allows you to cast Cold Magic spells up to level 2.", B_FALSE); addskilldesc(SK_SS_COLD, PR_ADEPT, "Allows you to cast Cold Magic spells up to level 3.", B_FALSE); @@ -13060,6 +13086,7 @@ void initskills(void) { addskilldesc(SK_SS_COLD, PR_EXPERT, "Allows you to cast Cold Magic spells up to level 5.", B_FALSE); addskilldesc(SK_SS_COLD, PR_MASTER, "Allows you to cast Cold Magic spells up to level 6.", B_FALSE); addskill(SK_SS_LIFE, "Sorcery:Life Magic", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_LIFE, PR_INEPT, "- Spell power power depends on your Level, your Intelligence, and Glorana's pleasure.", B_FALSE); addskilldesc(SK_SS_LIFE, PR_NOVICE, "Allows you to cast Life Magic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_LIFE, PR_BEGINNER, "Allows you to cast Life Magic spells up to level 2.", B_FALSE); addskilldesc(SK_SS_LIFE, PR_ADEPT, "Allows you to cast Life Magic spells up to level 3.", B_FALSE); @@ -13067,6 +13094,7 @@ void initskills(void) { addskilldesc(SK_SS_LIFE, PR_EXPERT, "Allows you to cast Life Magic spells up to level 5.", B_FALSE); addskilldesc(SK_SS_LIFE, PR_MASTER, "Allows you to cast Life Magic spells up to level 6.", B_FALSE); addskill(SK_SS_MODIFICATION, "Sorcery:Modification", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_MODIFICATION, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_MODIFICATION, PR_NOVICE, "Allows you to cast Modification spells up to level 1.", B_FALSE); addskilldesc(SK_SS_MODIFICATION, PR_BEGINNER, "Allows you to cast Modification spells up to level 2.", B_FALSE); addskilldesc(SK_SS_MODIFICATION, PR_ADEPT, "Allows you to cast Modification spells up to level 3.", B_FALSE); @@ -13074,6 +13102,7 @@ void initskills(void) { addskilldesc(SK_SS_MODIFICATION, PR_EXPERT, "Allows you to cast Modification spells up to level 5.", B_FALSE); addskilldesc(SK_SS_MODIFICATION, PR_MASTER, "Allows you to cast Modification spells up to level 6.", B_FALSE); addskill(SK_SS_SUMMONING, "Sorcery:Summoning", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_SUMMONING, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_SUMMONING, PR_NOVICE, "Allows you to cast Summoning spells up to level 1.", B_FALSE); addskilldesc(SK_SS_SUMMONING, PR_BEGINNER, "Allows you to cast Summoning spells up to level 2.", B_FALSE); addskilldesc(SK_SS_SUMMONING, PR_ADEPT, "Allows you to cast Summoning spells up to level 3.", B_FALSE); @@ -13081,6 +13110,7 @@ void initskills(void) { addskilldesc(SK_SS_SUMMONING, PR_EXPERT, "Allows you to cast Summoning spells up to level 5.", B_FALSE); addskilldesc(SK_SS_SUMMONING, PR_MASTER, "Allows you to cast Summoning spells up to level 6.", B_FALSE); addskill(SK_SS_TRANSLOCATION, "Sorcery:Translocation", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_TRANSLOCATION, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_TRANSLOCATION, PR_NOVICE, "Allows you to cast Translocation spells up to level 1.", B_FALSE); addskilldesc(SK_SS_TRANSLOCATION, PR_BEGINNER, "Allows you to cast Translocation spells up to level 2.", B_FALSE); addskilldesc(SK_SS_TRANSLOCATION, PR_ADEPT, "Allows you to cast Translocation spells up to level 3.", B_FALSE); @@ -13088,6 +13118,7 @@ void initskills(void) { addskilldesc(SK_SS_TRANSLOCATION, PR_EXPERT, "Allows you to cast Translocation spells up to level 5.", B_FALSE); addskilldesc(SK_SS_TRANSLOCATION, PR_MASTER, "Allows you to cast Translocation spells up to level 6.", B_FALSE); addskill(SK_SS_WILD, "Sorcery:Wild Magic", "Boosts casting of spells from this school.", 50); + addskilldesc(SK_SS_WILD, PR_INEPT, "- Spell power power depends on your Level and Intelligence.", B_FALSE); addskilldesc(SK_SS_WILD, PR_NOVICE, "Allows you to cast Wild Magic spells up to level 1.", B_FALSE); addskilldesc(SK_SS_WILD, PR_BEGINNER, "Allows you to cast Wild Magic spells up to level 2.", B_FALSE); addskilldesc(SK_SS_WILD, PR_ADEPT, "Allows you to cast Wild Magic spells up to level 3.", B_FALSE); @@ -13130,7 +13161,7 @@ void initskills(void) { addskilldesc(sk->id, PR_BEGINNER, "^g-1 accuracy penalty^n", B_FALSE); addskilldesc(sk->id, PR_BEGINNER, "^gYou gain the 'wild strike' ability.^n", B_FALSE); addskilldesc(sk->id, PR_ADEPT, "^g+10% damage bonus.^n", B_FALSE); - addskilldesc(sk->id, PR_ADEPT, "^gYou can now alter your attack style to deal different damage types.", B_FALSE); + addskilldesc(sk->id, PR_ADEPT, "^gYou can now alter your attack style to deal different damage types^n.", B_FALSE); addskilldesc(sk->id, PR_SKILLED, "^g+2 accuracy, +20% damage bonus.^n", B_FALSE); addskilldesc(sk->id, PR_SKILLED, "^gYou can now block certain attacks with this kind of weapon.^n", B_FALSE); addskilldesc(sk->id, PR_EXPERT, "^g+4 accuracy, +30% damage bonus.^n", B_FALSE); diff --git a/data/hiscores.db b/data/hiscores.db index 7967d60..9227e47 100644 Binary files a/data/hiscores.db and b/data/hiscores.db differ diff --git a/defs.h b/defs.h index 890f78a..0465592 100644 --- a/defs.h +++ b/defs.h @@ -2650,6 +2650,16 @@ enum FLAG { // text = copied F_GODFLAG text from god. F_BEHAVIOUR, // textual field describing special behaviour for this // lf + F_RNDSPELLCOUNT, // this monster starts with v0 random spells. + // needs to also have either f_rndspellschool OR + // f_rndspellposs. + F_RNDSPELLSCHOOL, // monster's random spells can come from + // school v0, between level v1 and v2. + // (optional) text = "pw:xxx;" to show spell + // power. if not given, power comes from depth. + F_RNDSPELLPOSS, // monster's random spells can be spellid v0. + // (optional) text = "pw:xxx;" to show spell + // power. if not given, power comes from depth. F_NOSMELL, // lf can't smell. not affected by stench, and // can't get enhancesmell. F_RESTINGINMOTEL, // sounds will not wake up this lf. monster won't diff --git a/io.c b/io.c index c5bef52..c3e4a5e 100644 --- a/io.c +++ b/io.c @@ -2210,7 +2210,7 @@ int announceflagloss(lifeform_t *lf, flag_t *f) { donesomething = B_TRUE; break; case F_FLAMMABLELF: - msg("%s %s no longer covered in %s.", isplayer(lf) ? "are" : "is", f->text); + msg("%s %s no longer covered in %s.", lfname, isplayer(lf) ? "are" : "is", f->text); donesomething = B_TRUE; break; case F_FLEEFROM: @@ -11747,10 +11747,6 @@ void showlfstats(lifeform_t *lf, int showall) { strcat(buf, "."); wrapprint(mainwin, &y, &x, 0, "%s ", buf); } - f = lfhasflag(lf, F_REFLECTION); - if (f && (f->known)) { - wrapprint(mainwin, &y, &x, 0, "%s %s surrounded by a negative gravity field.", you(lf), is(lf)); - } f = lfhasflag(lf, F_RETALIATE); if (f && (f->known)) { @@ -12344,7 +12340,7 @@ void showlfstats(lifeform_t *lf, int showall) { } f = hasflag_real(lf->flags, F_PARTVEGETARIAN, B_TRUE, NULL, FROMRACE); if (f) { - mvwprintw(mainwin, y, 0, "%s %s a part vegetarian (will only eat meat when hunger).", you(lf), is(lf)); + mvwprintw(mainwin, y, 0, "%s %s a part vegetarian (will only eat meat when hungry).", you(lf), is(lf)); y++; } @@ -12859,6 +12855,10 @@ void showlfstats(lifeform_t *lf, int showall) { mvwprintw(mainwin, y, 0, "%s %s enraged, gaining accuracy, damage and hit point bonuses.", you(lf), is(lf)); y++; } + f = lfhasflag(lf, F_REFLECTION); + if (f && (f->known)) { + wrapprint(mainwin, &y, &x, 0, "%s %s surrounded by a negative gravity field.", you(lf), is(lf)); + } f = lfhasknownflag(lf, F_TRUESTRIKE); if (f) { mvwprintw(mainwin, y, 0, "%s%s attacks will automatically hit.", you(lf), getpossessive(you(lf))); diff --git a/lf.c b/lf.c index b692859..be12640 100644 --- a/lf.c +++ b/lf.c @@ -79,6 +79,7 @@ int notime = B_FALSE; // prevent taketime from doing anything void autoweild(lifeform_t *lf) { object_t *bestwep,*bestfirearm; object_t *o,*firearm; + int donesecondary = B_FALSE; int pretimespent; pretimespent = lf->timespent; @@ -98,13 +99,15 @@ void autoweild(lifeform_t *lf) { weild(lf, bestfirearm); } - // weild armour if required + // weild armour if required, + // and mark other weapons as secondary for (o = lf->pack->first ; o ; o = o->next) { - if (canwear(lf, o, BP_NONE)) { - wear(lf, o); + if (!donesecondary && isweapon(o) && !isequipped(o)) { + addflag(o->flags, F_SECONDARY, B_TRUE, NA, NA, NULL); + donesecondary = B_TRUE; } else { - if (isplayer(lf) && (o->type->id == OT_RING_PROTFIRE)) { - dblog("zz"); + if (canwear(lf, o, BP_NONE)) { + wear(lf, o); } } } @@ -2669,7 +2672,7 @@ void die(lifeform_t *lf) { lifeform_t *minion[MAXCANDIDATES]; int nminions = 0; // intelligent monsters will say something - if (!hasflag(lf->flags, F_NODEATHSPEECH)) { + if (!hasflag(lf->flags, F_NODEATHSPEECH) && !lfhasflag(lf, F_SUMMONEDBY)) { if (ispetof(lf, player)) { if (cantalk(lf) && canhear(player, lf->cell, 4)) { sayphrase(lf, SP_DIE, SV_SHOUT, NA, NULL); @@ -6614,8 +6617,13 @@ int gethitstokill(lifeform_t *lf, lifeform_t *victim, int useevasion, int usearm } if (maxdam >= 1) { + int nattacks; hitstokill = victim->hp / maxdam; limit(&hitstokill, 1, NA); + // modify by maxattacks + getattacks(lf, NULL, &nattacks); + hitstokill /= nattacks; + limit(&hitstokill, 1, NA); } else { hitstokill = 0; // ie you'll never kill it. } @@ -9227,9 +9235,9 @@ void givejob(lifeform_t *lf, enum JOB jobid) { // you can now cast it. addflag(lf->flags, F_CANCAST, spell, NA, NA, NULL); } + // druids always worship ekrub if (isplayer(lf)) { lifeform_t *god; - // druids always worship ekrub god = findgod(R_GODNATURE); addflag(god->flags, F_PRAYEDTO, B_TRUE, NA, NA, NULL); } @@ -9320,18 +9328,38 @@ void givesubjob(lifeform_t *lf, enum SUBJOB sj) { case SJ_AIRMAGE: addflag(lf->flags, F_CANSEETHROUGHMAT, MT_GAS, NA, NA, NULL); sb1 = addob(lf->pack, "spellbook of air magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_AIR, 1, lf->level, NULL); + } break; case SJ_ICEMAGE: sb1 = addob(lf->pack, "spellbook of cold magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_COLD, 1, lf->level, NULL); + } break; case SJ_FIREMAGE: sb1 = addob(lf->pack, "spellbook of fire magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_FIRE, 1, lf->level, NULL); + } break; case SJ_NECROMANCER: sb1 = addob(lf->pack, "spellbook of necromancy"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_DEATH, 1, lf->level, NULL); + } break; case SJ_WILDMAGE: sb1 = addob(lf->pack, "spellbook of wild magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_WILD, 1, lf->level, NULL); + } break; // warrior types case SJ_BATTLEMAGE: @@ -9340,10 +9368,18 @@ void givesubjob(lifeform_t *lf, enum SUBJOB sj) { case 1: giveskilllev(lf, SK_SS_FIRE, PR_NOVICE); sb1 = addob(lf->pack, "spellbook of fire magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(1,2), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_FIRE, 1, 3, NULL); + } break; case 2: giveskilllev(lf, SK_SS_COLD, PR_NOVICE); sb1 = addob(lf->pack, "spellbook of cold magic"); + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(1,2), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_COLD, 1, 3, NULL); + } break; } // can learn some spell schools, but only up to adept level @@ -9399,6 +9435,11 @@ void givesubjob(lifeform_t *lf, enum SUBJOB sj) { } // remove warrior's level abilities killflagsofid(lf->flags, F_LEVABIL); + // monster spells + if (!isplayer(lf)) { + addflag(lf->flags, F_RNDSPELLCOUNT, rnd(2,4), NA, NA, NULL); + addflag(lf->flags, F_RNDSPELLSCHOOL, SS_LIFE, 1, 6, NULL); + } break; case SJ_SCOURGE: addtempflag(lf->flags, F_RESISTMAG, 5, NA, NA, NULL, FROMJOB); @@ -12133,7 +12174,6 @@ lifeform_t *real_addlf(cell_t *cell, enum RACE rid, int level, int controller) { setrace(a, rid, B_FALSE); - // now do everything which must occur AFTER setting the race: // remember original attribs so that if we are polymorphed, we're @@ -13023,6 +13063,77 @@ void autoskill(lifeform_t *lf) { } +// hand out random spells to monsters +void autospells(lifeform_t *lf, int howmany) { + int nretflags,i,nposs = 0; + flag_t *retflag[MAXCANDIDATES]; + enum OBTYPE poss[MAXCANDIDATES]; + int powerposs[MAXCANDIDATES]; + int mapdiff; + + mapdiff = getmapdifficulty(lf->cell->map); + + // get list of possible random spells for this lf. + // set random spells? + getflags(lf->flags, retflag, &nretflags, F_RNDSPELLPOSS, F_NONE); + for (i = 0; i < nretflags; i++) { + poss[nposs] = retflag[i]->val[0]; + texttospellopts(retflag[i]->text, "pw:", &powerposs[nposs], NULL); + nposs++; + } + // random spells from schools? + getflags(lf->flags, retflag, &nretflags, F_RNDSPELLSCHOOL, F_NONE); + for (i = 0; i < nretflags; i++) { + int min,max; + enum SPELLSCHOOL ss; + int thispower; + objecttype_t *sp; + ss = retflag[i]->val[0]; + min = retflag[i]->val[1]; + max = retflag[i]->val[2]; + texttospellopts(retflag[i]->text, "pw:", &thispower, NULL); + for (sp = objecttype; sp ; sp = sp->next) { + if ((sp->obclass->id == OC_SPELL) && spellokformonsters(sp->id)) { + int lev; + lev = getspelllevel(sp->id); + if (spellisfromschool(sp->id, ss) && + (lev >= min) && (lev <= max)) { + poss[nposs] = sp->id; + powerposs[nposs] = thispower; + nposs++; + } + } + } + } + + + // power = 0 means select it based on depth + for (i = 0 ; i < nposs; i++) { + if (powerposs[nposs] == 0) { + powerposs[nposs] = mapdiff; + limit(&(powerposs[nposs]), 1, getspellmaxpower(poss[nposs])); + } + } + + // now we have a list of all possible spells. select from these. + for (i = 0; (i < howmany) && nposs; i++) { + int sel,n; + enum OBTYPE spellid; + char pwbuf[BUFLEN]; + sel = rnd(0,nposs-1); + spellid = poss[sel]; + sprintf(pwbuf, "pw:%d;",powerposs[sel]); + //addflag(lf->flags, F_CANCAST, sel, NA, NA, pwbuf); + addflag(lf->flags, F_CANWILL, spellid, NA, NA, pwbuf); + // remove this one... + for (n = sel; n < nposs-1; n++) { + poss[n] = poss[n+1]; + powerposs[n] = powerposs[n+1]; + } + nposs--; + } +} + void autotarget(lifeform_t *lf) { object_t *gun; lifeform_t *targ = NULL,*newtarg = NULL; @@ -15321,6 +15432,7 @@ void preparecorpse(lifeform_t *lf, object_t *corpse) { if (isplayer(lf) && (corpse->pile->owner == lf)) { // add flag _before_ getting the name addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL); + killflagsofid(corpse->flags, F_FROZEN); getobname(corpse, obname, corpse->amt); msgnocap("%c - %s.", corpse->letter, obname); } else if (isplayer(lf)) { @@ -15328,6 +15440,7 @@ void preparecorpse(lifeform_t *lf, object_t *corpse) { getobname(corpse, obname, corpse->amt); msg("You cook %s.", obname); addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL); + killflagsofid(corpse->flags, F_FROZEN); } else if (cansee(player, lf)) { char lfname[BUFLEN]; // add flag after getting the name @@ -15335,8 +15448,10 @@ void preparecorpse(lifeform_t *lf, object_t *corpse) { getobname(corpse, obname, corpse->amt); msg("%s cooks %s.", obname); addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL); + killflagsofid(corpse->flags, F_FROZEN); } else { addflag(corpse->flags, F_PREPARED, B_TRUE, NA, NA, NULL); + killflagsofid(corpse->flags, F_FROZEN); } } @@ -15516,7 +15631,7 @@ void refreshlevelabilities(lifeform_t *lf) { int i; flag_t *retflag[MAXCANDIDATES]; int nretflags; - getflags(lf->flags, retflag, &nretflags, F_LEVABIL, F_LEVFLAG, F_LEVSPELL, F_LEVSPELLSCHOOL, F_LEVSKILL, F_NONE); + getflags(lf->flags, retflag, &nretflags, F_LEVABIL, F_LEVFLAG, F_LEVSPELL, F_LEVSPELLSCHOOL, F_LEVSPELLSCHOOLFROMX, F_LEVSKILL, F_NONE); for (i = 0; i < nretflags; i++) { f = retflag[i]; // we'll set timeleft to -1 while actually assigning these. @@ -15526,6 +15641,7 @@ void refreshlevelabilities(lifeform_t *lf) { case F_LEVSKILL: case F_LEVSPELL: case F_LEVSPELLSCHOOL: + case F_LEVSPELLSCHOOLFROMX: f->lifetime = FROMJOB; break; default: @@ -19972,6 +20088,12 @@ int validateraces(void) { } for (f = r->flags->first ; f ; f = f->next) { + if (f->id == F_RNDSPELLCOUNT) { + if (!hasflag(r->flags, F_RNDSPELLSCHOOL) && !hasflag(r->flags, F_RNDSPELLPOSS)) { + printf("ERROR in race '%s' - F_RNDSPELLCOUNT but no spell candidates.\n", r->name); + goterror = B_TRUE; + } + } if (f->id == F_HASATTACK) { if (!findot(f->val[0])) { printf("ERROR in race '%s' - F_HASATTACK with bad object.\n", r->name); diff --git a/lf.h b/lf.h index 08b6c6b..44e3792 100644 --- a/lf.h +++ b/lf.h @@ -25,6 +25,7 @@ int askforinfo(lifeform_t *lf, int diffmod); char *assignnpcname(lifeform_t *lf); void autoshortcut(lifeform_t *lf, enum OBTYPE spellid); void autoskill(lifeform_t *lf); +void autospells(lifeform_t *lf, int howmany); void autotarget(lifeform_t *lf); void autoweild(lifeform_t *lf); int appearsrandomly(enum RACE rid); diff --git a/map.c b/map.c index 1ccf472..9589122 100644 --- a/map.c +++ b/map.c @@ -281,6 +281,7 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int if (f->id == F_STARTJOB) { if (rnd(1,100) <= f->val[0]) { job_t *j; + enum SUBJOB wantsubjob; if (f->val[1] == J_RANDOM) { job_t *j; j = getrandomjob(B_TRUE); @@ -288,20 +289,29 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int } else { wantjob = f->val[1]; } + // special case: wizards MUST have a subjob. + if (wantjob == J_WIZARD) { + wantsubjob = SJ_RANDOM; + } else { + wantsubjob = f->val[2]; + } givejob(lf, wantjob); + j = findjob(wantjob); // subjob ? - if (j && (f->val[2] != NA)) { + if (j && (wantsubjob != NA)) { // cope with random - if (f->val[2] == SJ_RANDOM) { + if (wantsubjob == SJ_RANDOM) { // find a subjob which applies flag_t *retflag[MAXCANDIDATES]; int nretflags; + + getflags(j->flags, retflag, &nretflags, F_CANHAVESUBJOB, F_NONE); if (nretflags) { givesubjob(lf, retflag[rnd(0,nretflags-1)]->val[0]); } } else { - givesubjob(lf, f->val[2]); + givesubjob(lf, wantsubjob); } } break; @@ -353,9 +363,10 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int } } } - finalisemonster(lf, NULL, wantflags, 0); } + finalisemonster(lf, NULL, wantflags, 0); + // NOTE: because the initial maps (world, heaven, dungeon lev1) are created BEFORE the player, // monsters on these maps will not have their hostility adjusted! if (gamemode == GM_GAMESTARTED) { @@ -515,7 +526,7 @@ lifeform_t *addmonster(cell_t *c, enum RACE rid, char *racename, int jobok, int //if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging } // end if lf - } + } // end if r //if (gamemode == GM_GAMESTARTED) checkallflags(player->cell->map); // debugging // free mem @@ -1471,11 +1482,14 @@ int doelementspread(cell_t *c) { } } // flammable cell floor (and no doors, solid walls, etc) + // just a small chance of spreading. if (cellwalkable(NULL, retcell[i], NULL) && !hasobofmaterial(retcell[i]->obpile, MT_FIRE)) { if (hasflag(retcell[i]->type->material->flags, F_FLAMMABLE)) { - addobfast(retcell[i]->obpile, fireob->type->id); - nspread++; - celldone = B_TRUE; + if (onein(6)) { + addobfast(retcell[i]->obpile, fireob->type->id); + nspread++; + celldone = B_TRUE; + } } } } @@ -2536,6 +2550,10 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_ // is the map lit? + /* + + XXX: have removed this code for now as light recalc code is VERY slow. + if (depth <= 5) { map->illumination = IL_FULLLIT; } else { @@ -2547,9 +2565,10 @@ void createdungeon(map_t *map, int depth, map_t *parentmap, int exitdir, object_ map->illumination = IL_FULLLIT; } } + */ + map->illumination = IL_FULLLIT; // random chance of different wall type - if (onein(6)) { switch (rnd(1,3)) { case 1: @@ -5301,6 +5320,10 @@ void finalisemonster(lifeform_t *lf, lifeform_t *leader, flagpile_t *wantflags, flag_t *f; enum FLAG noflag[MAXCANDIDATES]; int nnoflags = 0,i; + int mapdiff; + + mapdiff = getmapdifficulty(lf->cell->map)/2; + if (leader) { // if leader is asleep: // for unintelligent monsters, minions will also be asleep @@ -5388,6 +5411,12 @@ void finalisemonster(lifeform_t *lf, lifeform_t *leader, flagpile_t *wantflags, killflagsofid(lf->flags, F_FLYING); killflagsofid(lf->flags, F_HIDING); } + + // automatic spells + f = hasflag(lf->flags, F_RNDSPELLCOUNT); + if (f) { + autospells(lf, f->val[0]); + } } celltype_t *findcelltype(enum CELLTYPE cid) { diff --git a/move.c b/move.c index 98dfb09..5f547e9 100644 --- a/move.c +++ b/move.c @@ -3367,6 +3367,7 @@ int willmove(lifeform_t *lf, int dir, enum ERROR *error) { } *bp = '\0'; power = atoi(buf); + limit(&power, 1, NA); if ( gethitdice(lf) <= power) { if (error) *error = E_WONT; return B_FALSE; diff --git a/nexus.c b/nexus.c index 27c7cda..e8b9e8c 100644 --- a/nexus.c +++ b/nexus.c @@ -264,16 +264,18 @@ int main(int argc, char **argv) { surfmap = addmap(); createmap(firstmap, 1, wregion, NULL, D_NONE, NULL); + // create realm of gods - must do this first, so that + // gods get created because any temples. + hregion = findregionbytype(RG_HEAVEN); + assert(hregion); + heaven = addmap(); + createmap(heaven, 1, hregion, NULL, D_NONE, NULL); + // create main dungeon dregion = findregionbytype(RG_MAINDUNGEON); assert(dregion); dmap = addmap(); createmap(dmap, 1, dregion, firstmap, D_DOWN, NULL); - // create realm of gods - hregion = findregionbytype(RG_HEAVEN); - assert(hregion); - heaven = addmap(); - createmap(heaven, 1, hregion, NULL, D_NONE, NULL); // find staircase diff --git a/objects.c b/objects.c index 3323412..675cec1 100644 --- a/objects.c +++ b/objects.c @@ -1262,11 +1262,16 @@ object_t *addobject(obpile_t *where, char *name, int canstack, int wantlinkholes if (god) { addflag(o->flags, F_LINKGOD, god->race->id, NA, NA, NULL); } else { - if (gamemode == GM_GAMESTARTED) { + // this should only ever happen when creating the + // surface map - because the realm of gods (and hence the + // gods themselves) won't exist yet. + // not a big deal, since abandoned temples on the surface + // fit the game theme anyway. + /* msg("DB: created abandoned temple"); more(); dblog("DB: created abandoned temple"); raise(SIGINT); - } + */ // abandoned tamples make no sound killflagsofid(o->flags, F_MAKESNOISE); } @@ -3308,6 +3313,7 @@ objecttype_t *findotn(char *name) { modname = strrep(modname, "rubies", "ruby", NULL); modname = strrep(modname, "scrolls ", "scroll ", NULL); modname = strrep(modname, "sets ", "set ", NULL); + modname = strrep(modname, "sheets ", "sheet ", NULL); modname = strrep(modname, "splashes ", "splash ", NULL); modname = strrep(modname, "sprigs ", "sprig ", NULL); modname = strrep(modname, "suits ", "suit ", NULL); @@ -11930,7 +11936,7 @@ int real_fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int sp char throwernamea[BUFLEN]; char realthrowername[BUFLEN]; char realthrowernamea[BUFLEN]; - char obname[BUFLEN]; + char obname[BUFLEN],realobname[BUFLEN]; char targetname[BUFLEN]; lifeform_t *target; cell_t *srcloc; @@ -11986,6 +11992,7 @@ int real_fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int sp } else { getobname(o, obname, amt); } + getobnametruebase(o, realobname, amt); if (thrower) { getlfname(thrower, throwername); @@ -12575,7 +12582,7 @@ int real_fireat(lifeform_t *thrower, object_t *o, int amt, cell_t *where, int sp } msg("^b%s", buf2); } - snprintf(damstring, BUFLEN, "%s (%s by %s)",obname,throwverbpast, realthrowernamea); + snprintf(damstring, BUFLEN, "%s (%s by %s)",realobname,throwverbpast, realthrowernamea); reduceamt = getarmourdamreduction(target, o, dam, DT_PROJECTILE); diff --git a/spell.c b/spell.c index 0c533d2..c678260 100644 --- a/spell.c +++ b/spell.c @@ -6442,7 +6442,7 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ // how many body parts are impacted? exposedlimbs = getexposedlimbs(target); - dam = rolldie(exposedlimbs, 3); + dam = rolldie(exposedlimbs, 4); if (isplayer(target)) { if (isimmuneto(target->flags, DT_COLD, B_FALSE)) { @@ -6662,68 +6662,67 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ if ((spellid == OT_S_HEALINGMIN) && donesomething) { // minor healing will stop here } else { - if (target->hp < target->maxhp) { - int min,max,amt; - switch (spellid) { - case OT_S_HEALINGMIN: - default: - min = 1; max = 10; - break; - case OT_S_HEALING: - min = 10; max = 20; - break; - case OT_S_HEALINGMAJ: - min = 20; max = 30; - break; + int min,max,amt; + switch (spellid) { + case OT_S_HEALINGMIN: + default: + min = 1; max = 10; + break; + case OT_S_HEALING: + min = 10; max = 20; + break; + case OT_S_HEALINGMAJ: + min = 20; max = 30; + break; + } + amt = getspellduration(min,max,blessed) + (power*2); + + if (undead) { + losehp(target, amt, DT_HOLY, caster, "the power of healing"); + if (isplayer(target) || cansee(player, target)) { + getlfname(target, buf); + msg("%s writhe%s in agony!", buf, isplayer(target) ? "" : "s"); } - amt = getspellduration(min,max,blessed) + (power*2); + } else if (target->hp < target->maxhp) { if (!undead && lfhasflagval(target, F_POISONED, P_ROT, NA, NA, NULL)) { amt /= 10; } if (amt > 0) { - if (undead) { - losehp(target, amt, DT_HOLY, caster, "the power of healing"); - if (isplayer(target) || cansee(player, target)) { - getlfname(target, buf); - msg("%s writhe%s in agony!", buf, isplayer(target) ? "" : "s"); - } - } else { - gainhp(target, amt); - if (isplayer(target)) { - if (target->hp >= target->maxhp) { - 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 { - 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; - } + gainhp(target, amt); + if (isplayer(target)) { + if (target->hp >= target->maxhp) { + 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 { + 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; - } else if (haslos(player, target->cell)) { - getlfname(target, buf); - msg("%s looks healthier!", buf); - if (seenbyplayer) *seenbyplayer = B_TRUE; } - } // end if undead + if (seenbyplayer) *seenbyplayer = B_TRUE; + } else if (haslos(player, target->cell)) { + getlfname(target, buf); + msg("%s looks healthier!", buf); + if (seenbyplayer) *seenbyplayer = B_TRUE; + } donesomething = B_TRUE; } } @@ -8686,7 +8685,6 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ } else if (spellid == OT_S_MIST) { object_t *o; - targcell = getcellindir(caster->cell, caster->facing); if (!targcell || targcell->type->solid) { fizzle(caster); return B_TRUE; @@ -12443,6 +12441,15 @@ int spellisfromschool(int spellid, enum SPELLSCHOOL school) { return B_FALSE; } +int spellokformonsters(int spellid) { + objecttype_t *sp; + sp = findot(spellid); + if (!sp) return B_FALSE; + if (hasflag(sp->flags, F_AICASTTOATTACK)) return B_TRUE; + if (hasflag(sp->flags, F_AICASTTOFLEE)) return B_TRUE; + return B_FALSE; +} + // returns true if the spell was resisted. int spellresisted(lifeform_t *target, lifeform_t *caster, int spellid, int power, int *seenbyplayer, int announce) { char text[BUFLEN],buf[BUFLEN]; diff --git a/spell.h b/spell.h index e6c853b..de8f519 100644 --- a/spell.h +++ b/spell.h @@ -37,6 +37,7 @@ void pullobto(object_t *o, lifeform_t *lf); int schoolappearsinbooks(enum SPELLSCHOOL ss); void spellcloud(cell_t *srcloc, int radius, int ch, enum COLOUR col, enum OBTYPE sid, int power, int frompot, char *seetext, char *noseetext); int spellisfromschool(int spellid, enum SPELLSCHOOL school); +int spellokformonsters(int spellid); int spellresisted(lifeform_t *target, lifeform_t *caster, int spellid, int power, int *seenbyplayer, int announce); int stopspell(lifeform_t *caster, enum OBTYPE spellid); int stopallspells(lifeform_t *lf); diff --git a/text.c b/text.c index 1fa47c1..c1e1093 100644 --- a/text.c +++ b/text.c @@ -1090,7 +1090,13 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d return "smite"; } - if (pct >= 70) { + if (getraceclass(victim) == RC_UNDEAD) { + // can't "kill" the undead + return "destroy"; + } + + // was 80 + if (pct >= 100) { if (damtype == DT_PIERCE) return "impale"; if (damtype == DT_BASH) { if (isunconscious(victim)) { @@ -1101,23 +1107,29 @@ char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int d } if (damtype == DT_BITE) return "gore"; if (damtype == DT_SLASH) { - if (!hasbp(victim, BP_HEAD)) { - return "bisect"; - } else { - if ((getlfsize(victim) >= SZ_MEDIUM) && onein(3)) { - return "behead"; - } else { + skill_t *sk; + int canbehead = B_TRUE; + if (wep) { + sk = getobskill(wep->flags); + if (sk->id == SK_SHORTBLADES) { + // short blades can't behead/bisect. + canbehead = B_FALSE; + } + } + if (canbehead) { + if (!hasbp(victim, BP_HEAD)) { return "bisect"; + } else { + if ((getlfsize(victim) >= SZ_MEDIUM) && onein(3)) { + return "behead"; + } else { + return "bisect"; + } } } } } - if (getraceclass(victim) == RC_UNDEAD) { - // can't "kill" the undead - return "destroy"; - } - // never use 'kill' for bashing since you might just knock them out if (damtype == DT_BASH) { return "clobber"; @@ -1750,6 +1762,8 @@ char *makeplural(char *text) { if (rv) return newtext; newtext = strrep(newtext, "set ", "sets ", &rv); if (rv) return newtext; + newtext = strrep(newtext, "sheet ", "sheets ", &rv); + if (rv) return newtext; newtext = strrep(newtext, "sprig ", "sprigs ", &rv); if (rv) return newtext; newtext = strrep(newtext, "suit ", "suits ", &rv); diff --git a/vault.c b/vault.c index bfe5985..b84b91e 100644 --- a/vault.c +++ b/vault.c @@ -1672,7 +1672,8 @@ int vaultthingok(enum VAULTTHING vt, char *what) { return B_TRUE; } else { op = addobpile(NULL, NULL, NULL); - o = addob(op, what); + // disable linking of holes + o = addobject(op, what, B_TRUE, B_FALSE, OT_NONE); if (o) { killobpile(op); return B_TRUE;