diff --git a/data.c b/data.c index b0d9dd6..bd489e3 100644 --- a/data.c +++ b/data.c @@ -752,7 +752,6 @@ void initjobs(void) { addflag(lastjob->flags, F_CANLEARN, SK_TWOWEAPON, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_UNARMED, PR_EXPERT, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SS_DIVINATION, PR_ADEPT, NA, NULL); - addflag(lastjob->flags, F_CANLEARN, SK_SS_GRAVITY, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SS_MODIFICATION, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SS_MENTAL, PR_BEGINNER, NA, NULL); addflag(lastjob->flags, F_CANLEARN, SK_SS_TRANSLOCATION, PR_ADEPT, NA, NULL); @@ -848,10 +847,8 @@ void initjobs(void) { addflag(lastjob->flags, F_STARTSKILL, SK_SS_AIR, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_DEATH, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_DIVINATION, PR_NOVICE, NA, NULL); - addflag(lastjob->flags, F_STARTSKILL, SK_SS_ENCHANTMENT, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_FIRE, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_COLD, PR_NOVICE, NA, NULL); - addflag(lastjob->flags, F_STARTSKILL, SK_SS_GRAVITY, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_MODIFICATION, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_SUMMONING, PR_NOVICE, NA, NULL); addflag(lastjob->flags, F_STARTSKILL, SK_SS_TRANSLOCATION, PR_NOVICE, NA, NULL); @@ -2713,7 +2710,6 @@ void initobjects(void) { // l2 addot(OT_S_BLINDNESS, "blindness", "Temporarily blinds the target.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines resistability and duration."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); @@ -2728,7 +2724,6 @@ void initobjects(void) { addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addot(OT_S_FEAR, "cause fear", "Causes intense fear in the target.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines resistability and duration."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_MENTAL, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); @@ -2774,7 +2769,6 @@ void initobjects(void) { addflag(lastot->flags, F_PLEASESGOD, R_GODDEATH, 3, NA, NULL); addot(OT_S_PAIN, "pain", "Causes extreme pain in the target whenever they move.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines the duration of the pain effect."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -2784,7 +2778,6 @@ void initobjects(void) { // l4 addot(OT_S_CURSE, "curse", "Bestow a curse upon the target's equipment, applying a -1 penalty and making them impossible to remove.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines how many objects will be cursed."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -2798,7 +2791,6 @@ void initobjects(void) { addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addot(OT_S_WEAKEN, "weaken", "Temporarily lowers the target's muscle strength by ^bpower^n points.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines the duration of the weakness effect."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -2806,7 +2798,6 @@ void initobjects(void) { addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addflag(lastot->flags, F_PLEASESGOD, R_GODDEATH, 4, NA, NULL); addot(OT_S_PARALYZE, "paralyze", "Disables the target's muscles, leaving them unable to move for ^bpower*2^n turns.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -2815,7 +2806,6 @@ void initobjects(void) { addflag(lastot->flags, F_PLEASESGOD, R_GODDEATH, 4, NA, NULL); addot(OT_S_FEEBLEMIND, "brain freeze", "Temporarily lowers the target's intelligence to that of an animal.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines duration."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_DEATH, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_MENTAL, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); @@ -2926,20 +2916,17 @@ void initobjects(void) { addflag(lastot->flags, F_SPELLSCHOOL, SS_DIVINATION, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); - /////////////////// - // enchantment - /////////////////// - // l7 - addot(OT_S_ENCHANT, "enhancement", "Magically enhances a weapon or piece of armour.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); - // TODO: hardcode how ai casts this spell /////////////////// // elemental - air /////////////////// // l1 + addot(OT_S_TRUESTRIKE, "weapon attraction", "Wind currents gives the target unerring accuracy, making their attacks always hit and negating strength penalties.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines the amount of strikes before it expires."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + 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); 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); @@ -2957,13 +2944,19 @@ void initobjects(void) { addot(OT_S_JOLT, "jolt", "Jolts an adjacent enemy with a short pulse of electricity, dealing 1-^bpower^n damage.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 10, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 5, NA, NA, NULL); addflag(lastot->flags, F_RANGE, 1, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_NEED, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_ADJVICTIM, NA, NA, NULL); // l2 + addot(OT_S_GRAVLOWER, "lessen gravity", "Lessens the weight of the caster's items. Also causes the caster to fall very slowly.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Each power level will reduce caster's load by 15kg."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); + addflag(lastot->flags, F_VARPOWER, B_TRUE, NA, NA, NULL); + addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addot(OT_S_GUSTOFWIND, "gust of wind", "Causes a gust of wind to blow up to ^bpower^n of the target's objects away.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, 1, NA, NA, "The chance of each object blowing away is determined by the spell's power."); addflag(lastot->flags, F_EXTRADESC, 2, NA, NA, "This spell's power is boosted when cast outside."); @@ -2977,7 +2970,6 @@ void initobjects(void) { addot(OT_S_SHATTER, "shatter", "Instantly shatters all glass in the target location.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_OBJECT, NA, NA, NULL); addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); @@ -2990,6 +2982,11 @@ void initobjects(void) { addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_SELF, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); + addot(OT_S_WHATGOESUP, "what goes up", "...must come down. Thrown or fired missiles will return to the caster's hands if not destroyed.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); // l3 addot(OT_S_AIRBLAST, "airblast", "Knocks enemies back with a powerful blast of air.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "This spell's power determines how far objects or enemies will be knocked back."); @@ -2998,7 +2995,7 @@ void initobjects(void) { addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_NEED, NA, NULL); - addot(OT_S_WINDSHIELD, "cyclonic shield", "Surrounds the caster with a whirling cyclone to repel missiles.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addot(OT_S_WINDSHIELD, "cyclonic shield", "Surrounds the caster with a whirling cyclone, dealing 1-^Wpower^n damage to attackers and repelling missiles.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines the speed of missile which can be repelled."); addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); @@ -3006,6 +3003,18 @@ void initobjects(void) { addflag(lastot->flags, F_VARPOWER, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL); + addot(OT_S_SLOW, "slowness", "Causes the air around the target to thicken to a water-like consistency, greatly decreasing their speed.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long the slowness will last."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL); + addot(OT_S_FORCESPHERE, "force sphere", "Radiates a shock wave out from the caster, knocking opponents away.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines the radius of the blast (1 - 3 cells)."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOFLEE, ST_ADJSELF, NA, NA, NULL); // l4 addot(OT_S_CLOUDKILL, "cloudkill", "Creates a cloud of poisonous gas. The cloud's size is 1-3 cells, depending on the spell power.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); @@ -3013,6 +3022,31 @@ void initobjects(void) { addflag(lastot->flags, F_LOSLOF, B_FALSE, LOF_NEED, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); + addot(OT_S_EQANDOP, "equal and opposite", "Causes the caster to emit strong currents of air in all directions, repelling all missiles in a direct path back to their source.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); + + addot(OT_S_GRAVBOOST, "boost gravity", "Greatly increases gravity around the target, preventing them from moving.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long its effects will last."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); + addot(OT_S_LEVITATION, "levitation", "Causes the caster hover a metre above the ground.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + 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, 4, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); + + + + + + + // l5 addot(OT_S_CHAINLIGHTNING, "chain lightning", "Electricity arcs up to 5 times between all nearby enemies. The initial arc deals 3d6 damage, the next deals 3d5 damage, etc.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's range is based on its power."); @@ -3021,6 +3055,20 @@ void initobjects(void) { addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_NEED, NA, NULL); + addot(OT_S_HASTE, "haste", "Increases the speed of the target.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long its effects will last."); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 5, NA, NA, NULL); + addflag(lastot->flags, F_TARGETTEDSPELL, TT_ALLY, NA, NA, NULL); + addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL); + addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); + // l6 + addot(OT_S_FLIGHT, "fly", "Allows the caster to fly.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); + addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); + /////////////////// // elemental - fire magic /////////////////// @@ -3055,7 +3103,6 @@ void initobjects(void) { addot(OT_S_BLADEBURN, "bladeburn", "Ignites the caster's weapon, causing it to temporarily deal fire damage. The spell's power determines how long it will last.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines its duration."); addflag(lastot->flags, F_SPELLSCHOOL, SS_FIRE, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); @@ -3166,7 +3213,6 @@ void initobjects(void) { addflag(lastot->flags, F_NORANDOM, B_TRUE, NA, NA, NULL); addot(OT_S_ICECRUST, "ice crust", "Encrusts your weapon with a layer of sharp ice.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines how long the enchantment will remain."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_COLD, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_ALLY, NA, NA, NULL); @@ -3279,7 +3325,6 @@ void initobjects(void) { addflag(lastot->flags, F_TARGETTEDSPELL, TT_OBJECT, 3, 3, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); addflag(lastot->flags, F_MAXPOWER, 3, NA, NA, NULL); addflag(lastot->flags, F_PLEASESGOD, R_GODNATURE, 1, NA, NULL); @@ -3291,7 +3336,6 @@ void initobjects(void) { addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); // l2 addot(OT_S_BARKSKIN, "barkskin", "Covers the caster with a skin of bark, reducing damage but making them vulnerable to fire.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); @@ -3364,7 +3408,6 @@ void initobjects(void) { addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_WALLSTOP, NA, NULL); addot(OT_S_ENDUREELEMENTS, "endure elements", "Provides resistance to fire and cold.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); @@ -3482,78 +3525,6 @@ void initobjects(void) { addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); addflag(lastot->flags, F_PLEASESGOD, R_GODNATURE, 5, NA, NULL); /////////////////// - // gravity - /////////////////// - // l1 - addot(OT_S_TRUESTRIKE, "weapon attraction", "Gives the target unerring accuracy, making their attacks always hit and negating strength penalties.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines the amount of strikes before it expires."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - 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); - // l2 - addot(OT_S_GRAVLOWER, "lessen gravity", "Lessens the weight of the caster's items. Also causes the caster to fall very slowly.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Each power level will reduce caster's load by 15kg."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); - addflag(lastot->flags, F_VARPOWER, B_TRUE, NA, NA, NULL); - addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); - addot(OT_S_WHATGOESUP, "what goes up", "...must come down. Thrown or fired missiles will return to the caster's hands if not destroyed.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); - addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); - // l3 - addot(OT_S_SLOW, "slowness", "Decreases the speed of the target.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long the slowness will last."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); - addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); - addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); - addflag(lastot->flags, F_AICASTTOFLEE, ST_VICTIM, NA, NA, NULL); - addot(OT_S_FORCESPHERE, "force sphere", "Radiates a shock wave out from the caster, knocking opponents away.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines the radius of the blast (1 - 3 cells)."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); - addflag(lastot->flags, F_AICASTTOFLEE, ST_ADJSELF, NA, NA, NULL); - // l4 - addot(OT_S_GRAVBOOST, "boost gravity", "Greatly increases gravity around the target, preventing them from moving.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long its effects will last."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); - addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); - addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); - addot(OT_S_LEVITATION, "levitation", "Causes the caster hover a metre above the ground.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); - addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); - addot(OT_S_EQANDOP, "equal and opposite", "Surrounds the caster with a negative gravity field, repelling all missiles in a direct path back to their source.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); - addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); - // l5 - // l6 - addot(OT_S_FLIGHT, "fly", "Allows the caster to fly.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_AIR, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); - addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); - addflag(lastot->flags, F_ONGOING, B_TRUE, NA, NA, NULL); - addot(OT_S_HASTE, "haste", "Increases the speed of the target.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long its effects will last."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_GRAVITY, NA, NA, NULL); - addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); - addflag(lastot->flags, F_TARGETTEDSPELL, TT_ALLY, NA, NA, NULL); - addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL); - addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); - /////////////////// // life spells / cleric spells /////////////////// // l1 @@ -3712,7 +3683,6 @@ void initobjects(void) { addot(OT_S_SLEEP, "sleep", "Puts the target creature to sleep.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines how long the sleep effect will last."); addflag(lastot->flags, F_SPELLSCHOOL, SS_MENTAL, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_VICTIM, NA, NA, NULL); @@ -3727,7 +3697,6 @@ void initobjects(void) { // l4 addot(OT_S_PACIFY, "pacify", "Induces calmness in another, preventing them from attacking.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines resistability."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_MENTAL, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 4, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -3740,7 +3709,6 @@ void initobjects(void) { // l5 addot(OT_S_CHARM, "charm", "Causes another lifeform to temporary become friendly.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines resistability and duration."); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_MENTAL, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 5, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_MONSTER, NA, NA, NULL); @@ -3757,7 +3725,6 @@ void initobjects(void) { addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); addot(OT_S_HOLDPORTAL, "seal entrance", "Magically closes and jams a door, preventing it from opening.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_TARGETTEDSPELL, TT_DOOR, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 1, NA, NA, NULL); addflag(lastot->flags, F_LOSLOF, B_TRUE, LOF_DONTNEED, NA, NULL); @@ -3806,7 +3773,6 @@ void initobjects(void) { addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_ANYWHERE, NA, NA, NULL); addot(OT_S_MENDING, "mending", "Repairs minor damage to objects (1d6 + ^bpower^n).", MT_NOTHING, 0, OC_SPELL, SZ_TINY); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL); addflag(lastot->flags, F_SPELLSCHOOL, SS_NATURE, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 2, NA, NA, NULL); @@ -3822,7 +3788,6 @@ void initobjects(void) { addot(OT_S_INVISIBILITY, "invisibility", "Temporarily renders the target invisible.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "The spell's power determines how long the invisibility will last."); addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL); - addflag(lastot->flags, F_SPELLSCHOOL, SS_ENCHANTMENT, NA, NA, NULL); addflag(lastot->flags, F_SPELLLEVEL, 3, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_SELF, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOFLEE, ST_SELF, NA, NA, NULL); @@ -3868,6 +3833,11 @@ void initobjects(void) { addflag(lastot->flags, F_SPELLLEVEL, 5, NA, NA, NULL); addflag(lastot->flags, F_AICASTTOATTACK, ST_ANYWHERE, NA, NA, NULL); // l6 + addot(OT_S_ENCHANT, "enhancement", "Magically enhances a weapon or piece of armour.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); + addflag(lastot->flags, F_MAXPOWER, 1, NA, NA, NULL); + addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL); + addflag(lastot->flags, F_SPELLLEVEL, 6, NA, NA, NULL); + // TODO: hardcode how ai casts this spell addot(OT_S_PETRIFY, "petrify", "Causes a living creature to turn into stone.", MT_NOTHING, 0, OC_SPELL, SZ_TINY); addflag(lastot->flags, F_EXTRADESC, NA, NA, NA, "Spell power determines resistability."); addflag(lastot->flags, F_SPELLSCHOOL, SS_MODIFICATION, NA, NA, NULL); @@ -5105,6 +5075,10 @@ void initobjects(void) { addflag(lastot->flags, F_RARITY, H_CAVE, 75, NA, NULL); addflag(lastot->flags, F_RARITY, H_FOREST, 90, NA, NULL); addflag(lastot->flags, F_RARITY, H_SWAMP, 90, RR_COMMON, NULL); + addflag(lastot->flags, F_OBDIETEXT, NA, NA, NA, "dries up"); + addflag(lastot->flags, F_OBHP, 50, 50, NA, NULL); + addflag(lastot->flags, F_OBHPDRAIN, 1, NA, NA, NULL); + addflag(lastot->flags, F_NOOBDAMTEXT, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_NOPICKUP, B_TRUE, NA, NA, NULL); addflag(lastot->flags, F_DTIMMUNE, DT_WATER, NA, NA, NULL); addflag(lastot->flags, F_REDUCEMOVEMENT, 2, NA, NA, NULL); @@ -7591,10 +7565,8 @@ void initrace(void) { addflag(lastrace->flags, F_NOSKILL, SK_SS_AIR, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_DEATH, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_DIVINATION, NA, NA, NULL); - addflag(lastrace->flags, F_NOSKILL, SK_SS_ENCHANTMENT, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_FIRE, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_COLD, NA, NA, NULL); - addflag(lastrace->flags, F_NOSKILL, SK_SS_GRAVITY, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_LIFE, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_MODIFICATION, NA, NA, NULL); addflag(lastrace->flags, F_NOSKILL, SK_SS_SUMMONING, NA, NA, NULL); @@ -12751,6 +12723,7 @@ void initraceclasses(void) { void initskills(void) { skill_t *sk; + // note: any skill names >13 characters should have a shortened version. addskill(SK_ARMOUR, "Armour", "Reduces evasion and stealth penalties from wearing armour.", 100); addskilldesc(SK_ARMOUR, PR_INEPT, "- Reduces the noise you make when wearing metal armour.", B_FALSE); addskilldesc(SK_ARMOUR, PR_NOVICE, "^gReduces armour penalties by 10%.^n", B_FALSE); @@ -12856,6 +12829,7 @@ void initskills(void) { addskilldesc(SK_RANGED, PR_EXPERT, "^gYour ranged accuracy decreases by 8% per cell.^n", B_FALSE); addskilldesc(SK_RANGED, PR_MASTER, "^gYour ranged attacks now deal 50% more damage.^n", B_TRUE); addskilldesc(SK_RANGED, PR_MASTER, "^gYour ranged accuracy decreases by 6% per cell.^n", B_FALSE); + free(lastskill->shortname); lastskill->shortname = strdup("Ranged Wpns"); addskill(SK_SEWING, "Sewing", "Lets you repair cloth or leather objects.", 25); addskilldesc(SK_SEWING, PR_NOVICE, "^gYou can repair cloth items with condition >= 80%.^n", B_FALSE); addskilldesc(SK_SEWING, PR_BEGINNER, "^gYou can repair cloth items with condition >= 65%.^n", B_FALSE); @@ -12933,6 +12907,7 @@ void initskills(void) { addskilldesc(SK_LORE_ARCANA, PR_NOVICE, "^gYou can attempt to identify objects with the 'inspect' ability.^n", B_FALSE); addskilldesc(SK_LORE_ARCANA, PR_ADEPT, "^gYou gain the 'study scrolls' ability.", B_FALSE); addskill(SK_LORE_DEMONS, "Lore:Demonology", "Determines your knowledge about demons.", 5); + free(lastskill->shortname); lastskill->shortname = strdup("Lore:Demons"); addskill(SK_LORE_HUMANOID, "Lore:Humanoid", "Determines your knowledge about humanoid (bipedal) creatures.", 5); addskill(SK_LORE_NATURE, "Lore:Nature", "Determines your knowledge of plants, animals and insects.", 5); addskill(SK_LORE_UNDEAD, "Lore:Undead", "Determines your knowledge of the undead.", 5); @@ -12942,11 +12917,13 @@ void initskills(void) { addskill(SK_AXES, "Axes", "Helps you use chopping weapons like axes.", 50); addskill(SK_CLUBS, "Clubs", "Helps you use bashing weapons like maces or clubs.", 50); addskill(SK_EXOTICWEPS, "Exotic Weapons", "Helps you use nunchaku, sais, etc.", 50); + free(lastskill->shortname); lastskill->shortname = strdup("Exotic Wpns"); addskill(SK_LONGBLADES, "Long Blades", "Helps you use long swords, scimitars, etc.", 50); addskill(SK_POLEARMS, "Polearms", "Helps you use long bladed weapons like halberds.", 50); addskill(SK_SHORTBLADES, "Short Blades", "Helps you use daggers, gladius', etc.", 50); addskill(SK_STAVES, "Staves", "Helps you use quarterstaffs, staffs, etc.", 50); addskill(SK_UNARMED, "Unarmed Combat", "Helps you fight using your bare hands.", 50); + free(lastskill->shortname); lastskill->shortname = strdup("Unarmed"); addskilldesc(SK_UNARMED, PR_ADEPT, "^gYour unarmed attacks can now smash wooden objects.^n", B_TRUE); addskilldesc(SK_UNARMED, PR_SKILLED, "^gYou can now make melee attacks with your off-hand.^n", B_TRUE); addskilldesc(SK_UNARMED, PR_EXPERT, "^gYou gain the 'flip' ability.^n", B_FALSE); @@ -12996,13 +12973,6 @@ void initskills(void) { addskilldesc(SK_SS_DIVINATION, PR_SKILLED, "Allows you to cast Divination spells up to level 4.", B_FALSE); 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_ENCHANTMENT, "Sorcery:Enchantment", "Boosts casting of spells from this school.", 50); - addskilldesc(SK_SS_ENCHANTMENT, PR_NOVICE, "Allows you to cast Enchantment spells up to level 1.", B_FALSE); - addskilldesc(SK_SS_ENCHANTMENT, PR_BEGINNER, "Allows you to cast Enchantment spells up to level 2.", B_FALSE); - addskilldesc(SK_SS_ENCHANTMENT, PR_ADEPT, "Allows you to cast Enchantment spells up to level 3.", B_FALSE); - addskilldesc(SK_SS_ENCHANTMENT, PR_SKILLED, "Allows you to cast Enchantment spells up to level 4.", B_FALSE); - addskilldesc(SK_SS_ENCHANTMENT, PR_EXPERT, "Allows you to cast Enchantment spells up to level 5.", B_FALSE); - addskilldesc(SK_SS_ENCHANTMENT, PR_MASTER, "Allows you to cast Enchantment 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_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); @@ -13017,13 +12987,6 @@ void initskills(void) { addskilldesc(SK_SS_COLD, PR_SKILLED, "Allows you to cast Cold Magic spells up to level 4.", B_FALSE); 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_GRAVITY, "Sorcery:Gravitation", "Boosts casting of spells from this school.", 50); - addskilldesc(SK_SS_GRAVITY, PR_NOVICE, "Allows you to cast Gravitation spells up to level 1.", B_FALSE); - addskilldesc(SK_SS_GRAVITY, PR_BEGINNER, "Allows you to cast Gravitation spells up to level 2.", B_FALSE); - addskilldesc(SK_SS_GRAVITY, PR_ADEPT, "Allows you to cast Gravitation spells up to level 3.", B_FALSE); - addskilldesc(SK_SS_GRAVITY, PR_SKILLED, "Allows you to cast Gravitation spells up to level 4.", B_FALSE); - addskilldesc(SK_SS_GRAVITY, PR_EXPERT, "Allows you to cast Gravitation spells up to level 5.", B_FALSE); - addskilldesc(SK_SS_GRAVITY, PR_MASTER, "Allows you to cast Gravitation 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_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); diff --git a/data/hiscores.db b/data/hiscores.db index 43ba885..c4dec0a 100644 Binary files a/data/hiscores.db and b/data/hiscores.db differ diff --git a/defs.h b/defs.h index c7c032b..64e7a75 100644 --- a/defs.h +++ b/defs.h @@ -340,7 +340,7 @@ enum SHOPACTION { #define BUFLENSMALL 64 #define BUFLEN 256 #define BIGBUFLEN 512 -#define HUGEBUFLEN 1024 +#define HUGEBUFLEN 2048 #define MAXPNAMELEN 12 // max player name length // file i/o #define DATADIR "data" @@ -607,17 +607,15 @@ enum SKILL { SK_SS_AIR, SK_SS_DEATH, SK_SS_DIVINATION, - SK_SS_ENCHANTMENT, SK_SS_FIRE, SK_SS_COLD, - SK_SS_GRAVITY, SK_SS_LIFE, SK_SS_MODIFICATION, SK_SS_SUMMONING, SK_SS_TRANSLOCATION, SK_SS_WILD, }; -#define MAXSKILLS 54 +#define MAXSKILLS 52 // proficiency levels enum SKILLLEVEL { @@ -786,10 +784,8 @@ enum SPELLSCHOOL { SS_AIR, SS_DEATH, SS_DIVINATION, - SS_ENCHANTMENT, SS_FIRE, SS_COLD, - SS_GRAVITY, SS_LIFE, SS_MODIFICATION, SS_MENTAL, @@ -3433,6 +3429,7 @@ enum ERROR { E_NOLOF, E_IMPOSSIBLE, E_PALADIN, + E_PALADIN2, E_NOTARGET, E_NOAMMO, E_GRAVBOOSTED, @@ -4021,6 +4018,7 @@ typedef struct material_s { typedef struct skill_s { enum SKILL id; char *name; + char *shortname; char *desc; enum SKILLLEVEL skilldesclev[MAXSKILLLEVEL*2]; char *skilldesctext[MAXSKILLLEVEL*2]; diff --git a/god.c b/god.c index 0b7d532..1cba468 100644 --- a/god.c +++ b/god.c @@ -972,9 +972,28 @@ int godgiftmaybe(enum RACE rid, int fromtemple) { if (player->race->id == R_VAMPIRE) { rollagain = B_TRUE; } else { + int orighp; + int origatt[MAXATTS]; + enum ATTRIB a; msg("\"Go forth and kill in my name!\""); msg("You transform into a vampire!"); + // special polymorph - we won't change some stats. + orighp = player->maxhp; + for (a = 0; a < MAXATTS; a++) { + origatt[a] = player->att[a]; + } + + // change the race. setrace(player, R_VAMPIRE, B_FALSE); // ie. don't set origrace! + + // restore stats + player->maxhp = orighp; + player->hp = orighp; + for (a = 0; a < MAXATTS; a++) { + player->att[a] = origatt[a]; + } + statdirty = B_TRUE; + drawscreen(); } break; case 6: // necromancy spells @@ -2042,8 +2061,12 @@ int prayto(lifeform_t *lf, lifeform_t *god) { if (!donesomething && (plev >= PL_PLEASED)) { object_t *o; for (o = player->pack->first ; o ; o = o->next) { - if ((o->type->id == OT_POT_WATER) && !isblessed(o)) { - blessob(o); + if (o->type->id == OT_POT_WATER) { + if (!isblessed(o)) { + blessob(o); + } else if (!o->blessknown) { + dospelleffects(god, OT_S_IDENTIFY, 10, NULL, o, NULL, B_UNCURSED, NULL, B_FALSE); + } } } } diff --git a/io.c b/io.c index f7b677b..5e60d27 100644 --- a/io.c +++ b/io.c @@ -74,6 +74,7 @@ extern command_t *firstcommand; extern option_t *firstoption,*lastoption; extern vault_t *firstvault; extern skill_t *firstskill; +extern job_t *firstjob; extern enum GAMEMODE gamemode; extern long curtime; @@ -1859,9 +1860,9 @@ int announceflaggain(lifeform_t *lf, flag_t *f) { break; case F_WINDSHIELD: if (isplayer(lf)) { - msg("^gYou are surrounded by a whirling cyclone!"); + msg("^gYou are surrounded by a whirling cyclone of debris!"); } else if (cansee(player, lf)) { - msg("%s is surrounded by a whirling cyclone!",lfname); + msg("%s is surrounded by a whirling cyclone of debris!",lfname); } break; case F_VISRANGEMOD: @@ -2690,6 +2691,8 @@ lifeform_t *askgod(char *prompttext, int onlyprayed) { initprompt(&prompt, prompttext); prompt.maycancel = B_TRUE; + addpromptq(&prompt, "Describe which god?"); + for (i = 0 ; i < ngodlfs; i++) { flag_t *f; char godof[BUFLEN],buf[BUFLEN]; @@ -2717,8 +2720,16 @@ lifeform_t *askgod(char *prompttext, int onlyprayed) { } else if (prompt.nchoices == 1) { lf = (lifeform_t *)prompt.choice[0].data; } else { - getchoice(&prompt); - lf = (lifeform_t *)prompt.result; + int done = B_FALSE; + while (!done) { + getchoice(&prompt); + lf = (lifeform_t *)prompt.result; + if (prompt.whichq == 0) { + break; + } else { + describegod(lf); + } + } } return lf; } @@ -3648,6 +3659,34 @@ void describegod(lifeform_t *god) { restoregamewindows(); } +void describejob(enum JOB jid) { + char *buf2; + char buf[BUFLEN]; + job_t *j; + + j = findjob(jid); + cls(); + + // title + snprintf(buf, BUFLEN, "%s",j->name); + capitalise(buf); + mvwprintw(mainwin, 0, 0, buf); + + wmove(mainwin, 2, 0); + + buf2 = malloc(HUGEBUFLEN * sizeof(char)); + makedesc_job(j, buf2); + textwithcol(mainwin, buf2); + free(buf2); + + wrefresh(mainwin); + + // wait for key + getch(); + real_clearmsg(B_TRUE); + restoregamewindows(); +} + void describeob(object_t *o) { char buf[BIGBUFLEN]; char *buf2; @@ -5147,29 +5186,159 @@ char *makedesc_job(job_t *j, char *retbuf) { char thisline[BUFLEN]; flag_t *retflag[MAXCANDIDATES]; int nretflags,i; + skill_t *sk; + char buf[BUFLEN]; + enum ATTRIB a; + int count = 0; + flag_t *f; // start with job description strcpy(retbuf, j->desc); strcat(retbuf, "\n\n"); + strcat(retbuf, "STARTING ATTRIBUTES\n"); + f = hasflag(j->flags, F_ALIGNMENT); + if (f) { + if (f->val[0] == AL_NONE) { + int count = 0; + char *p; + char choices[BUFLEN]; + strcpy(choices, ""); + for ( p = f->text; *p; p++) { + if (strlen(choices)) strcat(choices, "/"); + switch (*p) { + case 'g': strcat(choices, "Good"); count++; break; + case 'n': strcat(choices, "Neutral"); count++; break; + case 'e': strcat(choices, "Evil"); count++; break; + } + } + if (count == 3) { + sprintf(thisline, "Alignment:Any"); + } else { + sprintf(thisline, "Alignment:%s", choices); + } + } else { + char *p; + p = strdup(getalignmentname(f->val[0])); + capitalise(p); + sprintf(thisline, "Alignment:%s",p); + free(p); + } + } else { + sprintf(thisline, "Alignment:Any"); + } + strcat(thisline, " "); + if (hasflag(j->flags, F_JOBATTRMOD)) { + for (a = 0; a < MAXATTS; a++) { + char buf[BUFLEN]; + f = hasflagval(j->flags, F_JOBATTRMOD, a, NA, NA, NULL); + if (f && (f->val[1] != 0)) { + char buf2[BUFLEN]; + if (f->val[1] > 0) { + sprintf(buf, "^%d+%d^n", C_GREEN, f->val[1]); + } else if (f->val[1] < 0) { + sprintf(buf, "^%d%d^n", C_RED, f->val[1]); + } + sprintf(buf2, "%s:%s ", getattrabbrev(a), buf); + strcat(thisline, buf2); + } + } + } + strncat(retbuf, thisline, HUGEBUFLEN); + strncat(retbuf, "\n\n", HUGEBUFLEN); + + // skills + // max skillname length: 21 (sorcery:translocation) + // use blocks of 26 + // NAME:Nvc NAME:Beg NAME:Adp + // NAME:Beg + // NAME:Adp + // NAME:Skl + // NAME:Exp + // NAME:Mas + // -21- + // == 3 per line + // == need 17 lines + strcat(retbuf, "STARTING SKILLS\n"); + count = 0; + strcpy(thisline, ""); + for (sk = firstskill ; sk ; sk = sk->next) { + char lev[BUFLEN]; + enum SKILLLEVEL slev = PR_INEPT; + strcpy(lev, ""); + f = hasflagval(j->flags, F_STARTSKILL, sk->id, NA, NA, NULL); + if (f) { + slev = f->val[1]; + switch (slev) { + case PR_INEPT: strcpy(lev, "---"); break; + case PR_NOVICE: strcpy(lev, "Nov"); break; + case PR_BEGINNER: strcpy(lev, "Beg"); break; + case PR_ADEPT: strcpy(lev, "Adp"); break; + case PR_SKILLED: strcpy(lev, "Skl"); break; + case PR_EXPERT: strcpy(lev, "Exp"); break; + case PR_MASTER: strcpy(lev, "Mst"); break; + } + /* + } else { + f = hasflagval(j->flags, F_CANLEARN, sk->id, NA, NA, NULL); + if (f) { + slev = PR_INEPT; + strcpy(lev, "---"); + } + */ + } + if (strlen(lev)) { + char *p; + //char bufpad[BUFLEN]; + count++; + sprintf(buf, "%13s:^%d%s^n ",sk->shortname, getskilllevelcolour(slev), lev); + //sprintf(buf, "%19s:^%d%3s^n ",sk->name, getskilllevelcolour(slev), lev); + //sprintf(bufpad, "%18s",buf); + // strip trailing spaces + p = buf + strlen(buf) - 2; // ie. last char + while (*p == ' ') { + *p = '\0'; + p--; + } + + strcat(thisline, buf); + if (count == 4) { + count = 0; + assert(strlen_without_colours(thisline) < 78); + // print it. + strcat(thisline, "\n"); + strcat(retbuf, thisline); + strcpy(thisline, ""); + } + } // end if strlen(lev) + } // end foreach skill + + // specialisations getflags(j->flags, retflag, &nretflags, F_CANHAVESUBJOB, F_NONE); + strcpy(thisline, ""); if (nretflags > 0) { int first = B_TRUE; + strcat(retbuf, "SPECIALISATIONS\n"); for (i = 0; i < nretflags; i++) { subjob_t *sj; sj = findsubjob(retflag[i]->val[0]); if (sj) { + char buf[BUFLEN]; if (first) { - sprintf(thisline, "%ss can have the following specialisations:\n",j->name); - strncat(retbuf, thisline, HUGEBUFLEN); + sprintf(buf, "- %s",sj->name); first = B_FALSE; + } else { + sprintf(buf, ", %s",sj->name); } - sprintf(thisline, "- %s\n",sj->name); - strncat(retbuf, thisline, HUGEBUFLEN); + strncat(thisline, buf, HUGEBUFLEN); } } + if (strlen(thisline)) { + strcat(thisline, "\n"); + strncat(retbuf, thisline, HUGEBUFLEN); + } } return retbuf; @@ -6590,9 +6759,11 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel r = findrace(rid); if (showextra) { - int a; + int a,n; int curidx,donesomething; char bonheading[BUFLEN],penheading[BUFLEN]; + enum OBCLASS spellorabil[2]; + sprintf(bonheading, "^%dStrengths^n:\n", C_WHITE); sprintf(penheading, "^%dWeaknesses^n:\n", C_WHITE); // stats @@ -6655,11 +6826,61 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel } } + // abilities? + spellorabil[0] = OC_ABILITY; + spellorabil[1] = OC_SPELL; + getflags(r->flags, retflag, &nretflags, F_CANWILL, F_NONE); + for (n = 0; n <= 1; n++) { + strcpy(buf, ""); + for (i = 0; i < nretflags; i++) { + objecttype_t *ot; + int power = 1; + f = retflag[i]; + ot = findot(f->val[0]); + if (ot && (ot->obclass->id == spellorabil[n])) { + if (i == 0) { + sprintf(buf, "%s: %s", (spellorabil[n] == OC_ABILITY) ? "Ability" : "Spell", + ot->name); + } else { + sprintf(buf, ", %s", ot->name); + } + texttospellopts(f->text, "pw:", &power, NULL); + if (power) { + strcat(buf, " (power "); + strcat(buf, roman(power)); + strcat(buf, ")"); + } + } + } + if (strlen(buf)) { + strncat(retbuf, "@- ", HUGEBUFLEN); + strcat(buf, "\n"); + strncat(retbuf, buf, HUGEBUFLEN); + } + } + + // skills? + getflags(r->flags, retflag, &nretflags, F_STARTSKILL, F_NONE); + strcpy(buf, ""); + for (i = 0; i < nretflags; i++) { + char nextbit[BUFLEN]; + f = retflag[i]; + if (i == 0) { + sprintf(nextbit, "%s %s", getskilllevelname(f->val[1]), getskillname(f->val[0])); + } else { + sprintf(nextbit, ", %s %s", getskilllevelname(f->val[1]), getskillname(f->val[0])); + } + strcat(buf, nextbit); + } + if (strlen(buf)) { + strncat(retbuf, "@- ", HUGEBUFLEN); + strcat(buf, "\n"); + strncat(retbuf, buf, HUGEBUFLEN); + } + // auto bonuses from flags for (f = r->flags->first ; f ; f = f->next) { char *p; - objecttype_t *ot; - int power; strcpy(buf, ""); switch (f->id) { case F_AUTOCREATEOB: @@ -6670,17 +6891,6 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel case F_AQUATIC: strcpy(buf, "Moves normally through water"); break; case F_AWARENESS: strcpy(buf, "Can see in all directions."); break; case F_CANEATRAW: strcpy(buf, "Can safely digest raw meat."); break; - case F_CANWILL: - ot = findot(f->val[0]); - sprintf(buf, "%s: %s", (ot->obclass->id == OC_ABILITY) ? "Ability" : "Spell", - ot->name); - texttospellopts(f->text, "pw:", &power, NULL); - if (power) { - strcat(buf, " (power "); - strcat(buf, roman(power)); - strcat(buf, ")"); - } - break; case F_DODGES: strcpy(buf, "Can dodge fatal attacks into adjacent locations"); break; case F_DTIMMUNE: if (!hasflag(doneflags, F_DTIMMUNE)) { @@ -6756,7 +6966,6 @@ char *makedesc_race(enum RACE rid, char *retbuf, int showextra, int forplayersel case F_SILENTMOVE: sprintf(buf, "Moves silently"); break; case F_SPIDERCLIMB: sprintf(buf, "Adheres to walls"); break; case F_STABILITY: sprintf(buf, "Will not fall on slippery ground."); break; - case F_STARTSKILL: sprintf(buf, "%s %s", getskilllevelname(f->val[1]), getskillname(f->val[0])); break; case F_STENCH: sprintf(buf, "Emits a foul odour which affects others"); break; case F_TREMORSENSE: sprintf(buf, "Can sense vibrations (range %d)", f->val[0]); break; case F_VISRANGEMOD: if (f->val[0] > 0) sprintf(buf, "Enhanced vision range (+%d)", f->val[0]); break; @@ -7674,10 +7883,11 @@ void dohelp(char helpmode) { cls(); if (helpmode == '?') { initprompt(&prompt, "What would you like help with (ESC when done)?"); + addchoice(&prompt, 'g', "God Descriptions", NULL, NULL, NULL); + addchoice(&prompt, 'j', "Job Descriptions", NULL, NULL, NULL); addchoice(&prompt, 'k', "Keyboard Commands", NULL, NULL, NULL); addchoice(&prompt, 'r', "Race Descriptions", NULL, NULL, NULL); addchoice(&prompt, 's', "Skill Descriptions", NULL, NULL, NULL); - addchoice(&prompt, 'g', "God Descriptions", NULL, NULL, NULL); addchoice(&prompt, '-', "(done)", NULL, NULL, NULL); prompt.maycancel = B_TRUE; ch = getchoice(&prompt); @@ -7690,6 +7900,24 @@ void dohelp(char helpmode) { helpmode = ch; break; } + } else if (helpmode == 'j') { + job_t *j; + centre(mainwin,C_WHITE, 0, "JOB REFERENCE"); + y = 2; + + initprompt(&prompt, "Describe which job (ESC when done)?"); + for (j = firstjob ; j ; j = j->next) { + addchoice(&prompt, 'a', j->name, NULL, j, j->desc); + } + addchoice(&prompt, '\0', "(done)", NULL, NULL, NULL); + prompt.maycancel = B_TRUE; + ch = getchoicestr(&prompt, B_FALSE, B_TRUE); + if (!ch) { + done = B_TRUE; + } else { + j = (job_t *)prompt.result; + if (j) describejob(j->id); + } } else if (helpmode == 'k') { centre(mainwin,C_WHITE, 0, "KEYBOARD COMMAND REFERENCE"); y = 2; @@ -8581,6 +8809,46 @@ int drop(object_t *o, int count) { return B_FALSE; } +void dumpskills(void) { + skill_t *sk; + char buf[BUFLEN],thisline[BUFLEN]; + int count = 0; + // max skillname length: 21 (sorcery:translocation) + // use blocks of 26 + // NAME:Nvc NAME:Beg NAME:Adp + // NAME:Beg + // NAME:Adp + // NAME:Skl + // NAME:Exp + // NAME:Mas + // -21- + // == 3 per line + // == need 17 lines + + strcpy(thisline, ""); + for (sk = firstskill ; sk ; sk = sk->next) { + char lev[BUFLEN]; + count++; + switch (rnd(0,6)) { + case 0: strcpy(lev, "---"); break; + case 1: strcpy(lev, "Nov"); break; + case 2: strcpy(lev, "Beg"); break; + case 3: strcpy(lev, "Adp"); break; + case 4: strcpy(lev, "Skl"); break; + case 5: strcpy(lev, "Exp"); break; + case 6: strcpy(lev, "Mst"); break; + } + sprintf(buf, "%21s:%3s ",sk->name, lev); + strcat(thisline, buf); + if (count == 3) { + count = 0; + // print it. + dblog("%s", thisline); + strcpy(thisline, ""); + } + } +} + void dumpbuildingusage(void) { int i; objecttype_t *ot; @@ -8759,6 +9027,9 @@ char getchoice(prompt_t *prompt) { prompt->result = NULL; sel = -1; break; + } else if ((ch == '!') || (ch == '?')) { // toggle prompts + prompt->whichq++; + if (prompt->whichq >= prompt->nqs) prompt->whichq = 0; } else if ((ch == '\\') && (gamemode == GM_GAMESTARTED)) { doknowledgelist(); } else if (ch == ' ') { @@ -10631,7 +10902,7 @@ void showlfstats(lifeform_t *lf, int showall) { strcat(cmdchars, "i"); } if ((lorelev >= PR_ADEPT) || (getskill(player, SK_LORE_ARCANA) >= PR_ADEPT)) { - snprintf(buf, BUFLEN, "^M^agic "); + snprintf(buf, BUFLEN, "^WM^nagic "); strcat(promptstr, buf); strcat(cmdchars, "m"); } @@ -13250,6 +13521,14 @@ char wrapprint(WINDOW *win, int *y, int *x, int newlineindent, char *format, ... if (strlen(word) == 0) { repword = strdup(" "); } else { + + // handle newline chars + while (word[0] == '\n') { + (*y)++; + *x = newlineindent; + memmove(word, word + 1, strlen(word)); + } + repword = strdup(word); while (rv) { repword = strrep(repword, "@", " ", &rv); @@ -13257,7 +13536,7 @@ char wrapprint(WINDOW *win, int *y, int *x, int newlineindent, char *format, ... } // if this word won't fit, put it on the next line. if (*x != 0) { - if (*x + strlen(repword) >= (w-1)) { + if (*x + strlen_without_colours(repword) >= (w-1)) { (*y)++; *x = newlineindent; } diff --git a/io.h b/io.h index 94261a4..345d318 100644 --- a/io.h +++ b/io.h @@ -37,6 +37,7 @@ void clearretobs(void); void cls(void); int contains(enum OBCLASS *array, int nargs, enum OBCLASS want); void describegod(lifeform_t *god); +void describejob(enum JOB jid); void describeob(object_t *o); void describerace(enum RACE rid); void describeskill(enum SKILL skid, enum SKILLLEVEL levhilite); @@ -88,6 +89,7 @@ void drawstatus(void); int drop(object_t *o, int count); void dumpbuildingusage(void); void dumpoc(void); +void dumpskills(void); void dumpspells(void); void dumpweps(void); void forceredraw(void); diff --git a/lf.c b/lf.c index 5951a03..b79b9a5 100644 --- a/lf.c +++ b/lf.c @@ -565,6 +565,22 @@ int cancast(lifeform_t *lf, enum OBTYPE oid, int *mpcost) { return B_FALSE; } + if (hassubjob(lf, SJ_PALADIN)) { + object_t *o; + // using cursed weapons/armour? no spells. + for (o = lf->pack->first ; o ; o = o->next) { + if (isequipped(o) && iscursed(o)) { + if (isweapon(o)) { + reason = E_PALADIN; + return B_FALSE; + } else if (isarmour(o)) { + reason = E_PALADIN2; + return B_FALSE; + } + } + } + } + reason = E_OK; ot = findot(oid); @@ -1583,6 +1599,12 @@ int castspell(lifeform_t *lf, enum OBTYPE sid, lifeform_t *targlf, object_t *tar case E_NOSPELLS: msg("You can't cast spells."); break; + case E_PALADIN: + msg("Your cursed weapon is nullifying your holy magic."); + break; + case E_PALADIN2: + msg("Your cursed armour is nullifying your holy magic."); + break; case E_PRONE: msg("You can't cast spells while prone."); break; @@ -8620,181 +8642,34 @@ float getstatmod(lifeform_t *lf, enum ATTRIB att) { return mod; } + enum ATTRBRACKET getattrbracket(int attrval, enum ATTRIB whichatt, char *buf) { if (attrval <= 12) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "hideous"); break; - case A_CON: - strcpy(buf, "frail"); break; - case A_AGI: - strcpy(buf, "uncoordinated"); break; - case A_IQ: - strcpy(buf, "vegetable"); break; - case A_STR: - strcpy(buf, "helpless"); break; - case A_WIS: - strcpy(buf, "witless"); break; - default: - strcpy(buf, "?extralow?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_EXLOW)); return AT_EXLOW; } else if (attrval <= 23) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "repulsive"); break; - case A_CON: - strcpy(buf, "sickly"); break; - case A_AGI: - strcpy(buf, "oafish"); break; - case A_IQ: - strcpy(buf, "animal"); break; - case A_STR: - strcpy(buf, "feeble"); break; - case A_WIS: - strcpy(buf, "reckless"); break; - default: - strcpy(buf, "?verylow?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_VLOW)); return AT_VLOW; } else if (attrval <= 34) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "ugly"); break; - case A_CON: - strcpy(buf, "unhealthy"); break; - case A_AGI: - strcpy(buf, "clumsy"); break; - case A_IQ: - strcpy(buf, "dim-witted"); break; - case A_STR: - strcpy(buf, "very weak"); break; - case A_WIS: - strcpy(buf, "foolish"); break; - default: - strcpy(buf, "?low?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_LOW)); return AT_LOW; } else if (attrval <= 45) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "unattractive"); break; - case A_CON: - strcpy(buf, "unfit"); break; - case A_AGI: - strcpy(buf, "awkward"); break; - case A_IQ: - strcpy(buf, "dopey"); break; - case A_STR: - strcpy(buf, "weak"); break; - case A_WIS: - strcpy(buf, "naive"); break; - default: - strcpy(buf, "?lt_average?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_LTAVERAGE)); return AT_LTAVERAGE; } else if (attrval <= 56) { - if (buf) { - switch (whichatt) { - case A_CHA: - case A_CON: - case A_AGI: - case A_STR: - case A_IQ: - case A_WIS: - strcpy(buf, "average"); break; - default: - strcpy(buf, "?average?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_AVERAGE)); return AT_AVERAGE; } else if (attrval <= 67) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "attractive"); break; - case A_CON: - strcpy(buf, "healthy"); break; - case A_AGI: - strcpy(buf, "dextrous"); break; - case A_IQ: - strcpy(buf, "smart"); break; - case A_STR: - strcpy(buf, "strong"); break; - case A_WIS: - strcpy(buf, "prudent"); break; - default: - strcpy(buf, "?gt_average?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_GTAVERAGE)); return AT_GTAVERAGE; } else if (attrval <= 78) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "alluring"); break; - case A_CON: - strcpy(buf, "very fit"); break; - case A_AGI: - strcpy(buf, "nimble"); break; - case A_IQ: - strcpy(buf, "enlightened"); break; - case A_STR: - strcpy(buf, "mighty"); break; - case A_WIS: - strcpy(buf, "astute"); break; - default: - strcpy(buf, "?high?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_HIGH)); return AT_HIGH; } else if (attrval <= 89) { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "beautiful"); break; - case A_CON: - strcpy(buf, "hardy"); break; - case A_AGI: - strcpy(buf, "agile"); break; - case A_IQ: - strcpy(buf, "genius"); break; - case A_STR: - strcpy(buf, "powerful"); break; - case A_WIS: - strcpy(buf, "wise"); break; - default: - strcpy(buf, "?veryhigh?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_VHIGH)); return AT_VHIGH; } else { - if (buf) { - switch (whichatt) { - case A_CHA: - strcpy(buf, "stunning"); break; - case A_CON: - strcpy(buf, "very hardy"); break; - case A_AGI: - strcpy(buf, "very agile"); break; - case A_IQ: - strcpy(buf, "supergenius"); break; - case A_STR: - strcpy(buf, "titanic"); break; - case A_WIS: - strcpy(buf, "sagely"); break; - default: - strcpy(buf, "?exhigh?"); break; - } - } + if (buf) strcpy(buf, getattrbracketname(whichatt, AT_EXHIGH)); return AT_EXHIGH; } @@ -9348,7 +9223,6 @@ void givejob(lifeform_t *lf, enum JOB jobid) { // wizards now get a secondary school initprompt(&prompt, "Select your secondary spell school:"); addchoice(&prompt, 'd', getskillname(SK_SS_DIVINATION), NULL, findskill(SK_SS_DIVINATION), NULL); - addchoice(&prompt, 'g', getskillname(SK_SS_GRAVITY), NULL, findskill(SK_SS_GRAVITY), NULL); addchoice(&prompt, 'm', getskillname(SK_SS_MODIFICATION), NULL, findskill(SK_SS_MODIFICATION), NULL); addchoice(&prompt, 's', getskillname(SK_SS_SUMMONING), NULL, findskill(SK_SS_SUMMONING), NULL); addchoice(&prompt, 't', getskillname(SK_SS_TRANSLOCATION), NULL, findskill(SK_SS_TRANSLOCATION), NULL); @@ -9358,9 +9232,6 @@ void givejob(lifeform_t *lf, enum JOB jobid) { case SK_SS_DIVINATION: sb2 = addob(lf->pack, "spellbook of divination magic"); break; - case SK_SS_GRAVITY: - sb2 = addob(lf->pack, "spellbook of gravitation magic"); - break; case SK_SS_MODIFICATION: sb2 = addob(lf->pack, "spellbook of modification magic"); break; @@ -9434,7 +9305,6 @@ void givesubjob(lifeform_t *lf, enum SUBJOB sj) { addtempflag(lf->flags, F_CANLEARN, SK_SS_FIRE, PR_ADEPT, NA, NULL, FROMJOB); addtempflag(lf->flags, F_CANLEARN, SK_SS_COLD, PR_ADEPT, NA, NULL, FROMJOB); addtempflag(lf->flags, F_CANLEARN, SK_SS_AIR, PR_ADEPT, NA, NULL, FROMJOB); - addtempflag(lf->flags, F_CANLEARN, SK_SS_GRAVITY, PR_ADEPT, NA, NULL, FROMJOB); addtempflag(lf->flags, F_CANLEARN, SK_SS_MODIFICATION, PR_ADEPT, NA, NULL, FROMJOB); addtempflag(lf->flags, F_CANLEARN, SK_SS_TRANSLOCATION, PR_ADEPT, NA, NULL, FROMJOB); addtempflag(lf->flags, F_CANLEARN, SK_SS_WILD, PR_ADEPT, NA, NULL, FROMJOB); @@ -11834,10 +11704,8 @@ int isspellskill(enum SKILL skid) { case SK_SS_AIR: case SK_SS_DEATH: case SK_SS_DIVINATION: - case SK_SS_ENCHANTMENT: case SK_SS_FIRE: case SK_SS_COLD: - case SK_SS_GRAVITY: case SK_SS_LIFE: case SK_SS_MODIFICATION: case SK_SS_SUMMONING: @@ -12324,6 +12192,9 @@ skill_t *addskill(enum SKILL id, char *name, char *desc, int traintime) { // props a->id = id; a->name = strdup(name); + a->shortname = strdup(name); + // + strrep(a->shortname, "Sorcery:", "", NULL); a->desc = strdup(desc); a->traintime = traintime; a->nskilldesc = 0; @@ -13790,6 +13661,7 @@ void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fr flag_t *retflag[MAXCANDIDATES],*f; int nretflags; char buf[BUFLEN],lfname[BUFLEN]; + getlfname(lf, lfname); if (lf->hp > 0) { // effects based on damage type if (damtype == DT_COLD) { @@ -13826,8 +13698,6 @@ void losehpeffects(lifeform_t *lf, int dam, enum DAMTYPE damtype, lifeform_t *fr if (isplayer(lf)) { msg("You are engulfed in flames!"); } else if (cansee(player, lf)) { - char lfname[BUFLEN]; - getlfname(lf, lfname); msg("%s is engulfed in flames!", lfname); } addobfast(lf->cell->obpile, OT_FIRESMALL); @@ -19516,6 +19386,7 @@ int unweild(lifeform_t *lf, object_t *o) { int useability(lifeform_t *lf, enum OBTYPE aid, lifeform_t *who, cell_t *where) { int rv; flag_t *cwflag; + float stamcost = 0; if (!cancast(lf, aid, NULL)) { if (isplayer(lf)) { // announce @@ -19543,6 +19414,17 @@ int useability(lifeform_t *lf, enum OBTYPE aid, lifeform_t *who, cell_t *where) return B_TRUE; } + stamcost = getstamcost(lf, aid); + if (stamcost) { + if (getstamina(lf) < stamcost) { + if (isplayer(lf)) { + msg("You are too tired to do that right now."); + } + return B_TRUE; + } + } + + // taketime() will happen during abiltiyeffects() // use the ability diff --git a/move.c b/move.c index 172ae06..09a1b53 100644 --- a/move.c +++ b/move.c @@ -2862,8 +2862,8 @@ int trymove(lifeform_t *lf, int dir, int onpurpose, int strafe) { break; case RD_FORWARDS: if (hasactivespell(lf, OT_S_TAILWIND)) { - // faster - howlong = pctof(75, howlong); + // 50% faster + howlong = pctof(50, howlong); } break; default: diff --git a/objects.c b/objects.c index ad0c238..3323412 100644 --- a/objects.c +++ b/objects.c @@ -3389,26 +3389,6 @@ objecttype_t *findotn(char *name) { } -// ie. "the apple is xxx" -// ie. "the apples are xxx" -char *getfillingname(int nutrition) { - if (nutrition > 100) { - return "extremely substantial"; - } else if (nutrition >= 90) { - return "very filling"; - } else if (nutrition >= 70) { - return "ample for a meal"; - } else if (nutrition >= 50) { - return "enough for a light meal"; - } else if (nutrition >= 25) { - return "snack-sized"; - } else if (nutrition > 0) { - return "barely worth eating"; - } - // ie. < 0 - return "of zero nutritional substance"; -} - int getfirearmrange(object_t *o) { flag_t *f; f = hasflag(o->flags, F_RANGE); @@ -4177,77 +4157,6 @@ enum OBTYPE getrandomtrapforob(void) { return poss[rnd(0,nposs-1)]; } -char *getdamname(enum DAMTYPE damtype) { - switch (damtype) { - case DT_ALL: return "all damage"; - case DT_ACID: return "acid"; - case DT_BASH: return "bludgeoning"; - case DT_BITE: return "biting"; - case DT_CHOP: return "chopping"; - case DT_COLD: return "cold"; - case DT_CRUSH: return "crushing"; - case DT_DIRECT: return "direct"; - case DT_DECAY: return "decay"; - case DT_ELECTRIC: return "electricity"; - case DT_EXPLOSIVE: return "explosive"; - case DT_FALL: return "falling"; - case DT_FIRE: return "fire"; - case DT_HEAT: return "heat"; - case DT_HOLY: return "holy damage"; - case DT_LIGHT: return "light"; - case DT_MAGIC: return "magical"; - case DT_MELT: return "melting"; - case DT_NECROTIC: return "lifedrain"; - case DT_PETRIFY: return "petrification"; - case DT_PIERCE: return "piercing"; - case DT_POISON: return "poison"; - case DT_POISONGAS: return "gas"; - case DT_PROJECTILE: return "projectile"; - case DT_SLASH: return "slashing"; - case DT_SONIC: return "sonic"; - case DT_TOUCH: return "touch"; - case DT_UNARMED: return "unarmed"; - case DT_WATER: return "water"; - default: return "unknown"; - } - return "unknown"; -} - -char *getdamnamenoun(enum DAMTYPE damtype) { - switch (damtype) { - case DT_ALL: return "all damage"; - case DT_ACID: return "acid"; - case DT_MELT: return "melting"; - case DT_PETRIFY: return "petrification"; - case DT_PIERCE: return "piercing damage"; - case DT_POISONGAS: return "gas"; - case DT_POISON: return "poison"; - case DT_SLASH: return "slashing damage"; - case DT_ELECTRIC: return "electricity"; - case DT_EXPLOSIVE: return "explosives"; - case DT_FIRE: return "fire"; - case DT_HEAT: return "heat"; - case DT_BITE: return "bite"; - case DT_BASH: return "bludgeoning"; - case DT_CHOP: return "chopping"; - case DT_COLD: return "cold"; - case DT_PROJECTILE: return "projectiles"; - case DT_HOLY: return "holy damage"; - case DT_DIRECT: return "direct damage"; - case DT_DECAY: return "decay damage"; - case DT_WATER: return "water"; - case DT_MAGIC: return "magical damage"; - case DT_NECROTIC: return "lifedrain damage"; - case DT_TOUCH: return "touch effects"; - case DT_UNARMED: return "unarmed damage"; - case DT_LIGHT: return "light damage"; - case DT_CRUSH: return "crushing damage"; - case DT_SONIC: return "sonic damage"; - case DT_FALL: return "damage from falling"; - default: return "unknown"; - } - return "unkmown"; -} char *gethiddenname(object_t *o) { knowledge_t *k; @@ -6198,57 +6107,6 @@ enum SPELLSCHOOL getschool(enum OBTYPE sid) { return SS_NONE; } -char *getschoolname(enum SPELLSCHOOL sch) { - switch (sch) { - case SS_ABILITY: return "Abilities"; - case SS_ALLOMANCY: return "Allomancy"; - case SS_DIVINE: return "Divine Powers"; - case SS_ENCHANTMENT: return "Enchantments"; - case SS_WILD: return "Wild Magic"; - case SS_MENTAL: return "Psionic Powers"; - case SS_AIR: return "Air Magic"; - case SS_FIRE: return "Fire Magic"; - case SS_COLD: return "Cold Magic"; - case SS_MODIFICATION: return "Modification Magic"; - case SS_DEATH: return "Necromancy"; - case SS_NATURE: return "Enviromancy"; - case SS_LIFE: return "Life Magic"; - case SS_DIVINATION: return "Divination Magic"; - case SS_TRANSLOCATION: return "Translocation Magic"; - case SS_SUMMONING: return "Summoning Magic"; - case SS_GRAVITY: return "Gravitation Magic"; - default: - break; - } - return "badschool"; -} - -char *getschoolnameshort(enum SPELLSCHOOL sch) { - switch (sch) { - case SS_ABILITY: return "Abilities"; - case SS_ALLOMANCY: return "Allomancy"; - case SS_DIVINE: return "Divine Powers"; - case SS_WILD: return "Wild Magic"; - case SS_AIR: return "Air Magic"; - case SS_FIRE: return "Fire Magic"; - case SS_COLD: return "Cold Magic"; - case SS_DEATH: return "Necromancy"; - case SS_ENCHANTMENT: return "Enchantment"; - case SS_LIFE: return "Life Magic"; - case SS_MENTAL: return "Psionic Powers"; - case SS_MODIFICATION: return "Modification"; - case SS_NATURE: return "Nature"; - case SS_DIVINATION: return "Divination"; - case SS_TRANSLOCATION: return "Translocation"; - case SS_SUMMONING: return "Summoning"; - case SS_GRAVITY: return "Gravitation"; - case SS_LAST: return "!invalid school!"; - default: - break; - } - return "unknown school"; -} - void setwaterdepth(cell_t *c, int depth) { object_t *o; if (depth > 0) { @@ -11121,6 +10979,7 @@ int readsomething(lifeform_t *lf, object_t *o) { // too hard? if (getspellpower(lf, linkspell->id) > 0) { + /* // try to learn it int difficulty, mod; difficulty = 15 + (getspelllevel(linkspell->id)*3); @@ -11131,6 +10990,9 @@ int readsomething(lifeform_t *lf, object_t *o) { } else { msg("^bYou fail to learn %s.",linkspell->name); } + */ + // learn it + addflag(lf->flags, F_CANCAST, linkspell->id, NA, NA, NULL); } else { if (isplayer(lf)) msg("This spell is too hard for you to learn right now."); } diff --git a/objects.h b/objects.h index 7dc7acd..2c6a044 100644 --- a/objects.h +++ b/objects.h @@ -101,9 +101,6 @@ objecttype_t *getrandomammofor(object_t *o); brand_t *getrandombrandfor(objecttype_t *ot); objecttype_t *getrandomobofclass(enum OBCLASS ocid, int minrarity, int maxrarity, lifeform_t *forlf); enum OBTYPE getrandomtrapforob(void); -char *getdamname(enum DAMTYPE damtype); -char *getdamnamenoun(enum DAMTYPE damtype); -char *getfillingname(int nutrition); int getfirearmrange(object_t *o); int getfirearmspeed(object_t *o); glyph_t *getglyph(object_t *o); @@ -147,8 +144,6 @@ char *getrandomobwithclass(map_t *map, enum OBCLASS cid, char *buf, int depthmod enum OBCLASS getrandomobclass(enum HABITAT hab); int getobrarity(object_t *o, enum RARITY *rr); enum SPELLSCHOOL getschool(enum OBTYPE sid); -char *getschoolname(enum SPELLSCHOOL sch); -char *getschoolnameshort(enum SPELLSCHOOL sch); int getshatterdam(object_t *o); float getshopprice(object_t *o, lifeform_t *buyer, object_t *shop); int getstairdirection(object_t *o); diff --git a/spell.c b/spell.c index 61ec033..cb9b3ce 100644 --- a/spell.c +++ b/spell.c @@ -58,7 +58,6 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef char buf[BUFLEN]; int power = 0,needgrab = B_FALSE, range = 0; char damstr[BUFLEN],racestr[BUFLEN]; - float stamcost = 0; objecttype_t *ot; flag_t *f; @@ -97,19 +96,6 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef getlfname(target, targetname); } - - stamcost = getstamcost(user, abilid); - - if (stamcost) { - if (getstamina(user) < stamcost) { - if (isplayer(user)) { - msg("You are too tired to do that right now."); - } - return B_TRUE; - } - } - - if (abilid == OT_A_CHARGE) { cell_t *adjcell = NULL,*origcell; char targetname[BUFLEN]; @@ -2535,20 +2521,20 @@ int abilityeffects(lifeform_t *user, enum OBTYPE abilid, cell_t *targcell, lifef // this call will also remove this ability... setrace(user, f->val[0], B_TRUE); } else if (abilid == OT_A_PRAY) { - lifeform_t *lf; + lifeform_t *god; if (!isplayer(user)) return B_FALSE; // ask for which god initprompt(&prompt, "To whom will you pray?"); prompt.maycancel = B_TRUE; - lf = askgod("To whom will you pray?", B_FALSE); - if (!lf) { + god = askgod("To whom will you pray?", B_FALSE); + if (!god) { msg("Cancelled."); return B_TRUE; } - prayto(user, lf); + prayto(user, god); } else if (abilid == OT_A_LEARN) { skill_t *sk; char ch = 'a'; @@ -5862,18 +5848,22 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ } } else if (spellid == OT_S_FORCESPHERE) { cell_t *retcell[MAXRETCELLS]; + char buf[BUFLEN]; int radius,nretcells,n,i; if (!target) target = caster; targcell = target->cell; radius = power/3; + limit(&radius, 1, NA); if (isplayer(target)) { - msg("You unleash a mighty shockwave!"); + sprintf(buf, "You unleash a mighty shockwave!"); if (seenbyplayer) *seenbyplayer = B_TRUE; + animradial(caster->cell, radius, '}', C_RED, DT_COMPASS, buf, buf); } else if (cansee(player, target)) { char tname[BUFLEN]; getlfname(target, tname); - msg("%s unleashes a mighty shockwave!", tname); + sprintf(buf, "%s unleashes a mighty shockwave!", tname); if (seenbyplayer) *seenbyplayer = B_TRUE; + animradial(caster->cell, radius, '}', C_RED, DT_COMPASS, buf, buf); } // start at outside. for (n = radius; n >= 1; n--) { @@ -11084,6 +11074,8 @@ int dospelleffects(lifeform_t *caster, enum OBTYPE spellid, int power, lifeform_ f = addtempflag(caster->flags, F_WINDSHIELD, power, NA, NA, NULL, FROMSPELL); f->obfrom = spellid; + f = addtempflag(target->flags, F_RETALIATE, 1, power, DT_BASH, "whirling debris", FROMSPELL); + f->obfrom = spellid; } else if (spellid == OT_S_WISHLIMITED) { object_t *o = NULL; char obname[BUFLEN]; @@ -11401,12 +11393,11 @@ void fizzle(lifeform_t *caster) { enum OBTYPE getfirstwizspell(enum SPELLSCHOOL school) { enum OBTYPE firstspell = OT_S_MANASPIKE; switch (school) { - case SS_AIR: firstspell = OT_S_MIST; break; + case SS_AIR: firstspell = OT_S_JOLT; break; case SS_COLD: firstspell = OT_S_CHILL; break; case SS_FIRE: firstspell = OT_S_SPARK; break; case SS_DEATH: firstspell = OT_S_STENCH; break; case SS_DIVINATION: firstspell = OT_S_SIXTHSENSE; break; - case SS_GRAVITY: firstspell = OT_S_TRUESTRIKE; break; //case SS_MODIFICATION: firstspell = OT_S_HOLDPORTAL; break; case SS_MODIFICATION: firstspell = OT_S_OBJECTGROWTH; break; case SS_TRANSLOCATION: firstspell = OT_S_APPORTATION; break; @@ -11557,6 +11548,7 @@ enum SPELLSCHOOL getrandomspellschool(lifeform_t *wantknowntolf, int wantknown) return poss[rnd(0,nposs-1)]; } + enum SKILL getschoolskill(enum SPELLSCHOOL ss) { switch (ss) { case SS_ALLOMANCY: @@ -11567,16 +11559,12 @@ enum SKILL getschoolskill(enum SPELLSCHOOL ss) { return SK_SS_DEATH; case SS_DIVINATION: return SK_SS_DIVINATION; - case SS_ENCHANTMENT: - return SK_SS_ENCHANTMENT; case SS_NATURE: return SK_SS_NATURE; case SS_FIRE: return SK_SS_FIRE; case SS_COLD: return SK_SS_COLD; - case SS_GRAVITY: - return SK_SS_GRAVITY; case SS_LIFE: return SK_SS_LIFE; case SS_MODIFICATION: @@ -11606,16 +11594,12 @@ enum SPELLSCHOOL getskillschool(enum SKILL skid) { return SS_DEATH; case SK_SS_DIVINATION: return SS_DIVINATION; - case SK_SS_ENCHANTMENT: - return SS_ENCHANTMENT; case SK_SS_NATURE: return SS_NATURE; case SK_SS_FIRE: return SS_FIRE; case SK_SS_COLD: return SS_COLD; - case SK_SS_GRAVITY: - return SS_GRAVITY; case SK_SS_LIFE: return SS_LIFE; case SK_SS_MODIFICATION: @@ -12159,7 +12143,8 @@ char *getspelldesc(enum OBTYPE spellid, int power, char *buf) { snprintf(buf, BUFLEN, "missiles return to source"); break; case OT_S_WINDSHIELD: - snprintf(buf, BUFLEN, "Protection from missiles <= %d km/h",speedtokph(power)); + snprintf(buf, BUFLEN, "Protection from missiles <= %d km/h, 1-%d dmg to attackers",speedtokph(power), + power); break; default: break; diff --git a/text.c b/text.c index 8032af8..6fd14ba 100644 --- a/text.c +++ b/text.c @@ -599,6 +599,171 @@ char *getattrabbrev(enum ATTRIB att) { return "??"; } +char *getattrbracketname(enum ATTRIB whichatt, enum ATTRBRACKET brack) { + switch (brack) { + case AT_EXLOW: + switch (whichatt) { + case A_CHA: + return "hideous"; + case A_CON: + return "frail"; + case A_AGI: + return "uncoordinated"; + case A_IQ: + return "vegetable"; + case A_STR: + return "helpless"; + case A_WIS: + return "witless"; + default: + return "?extralow?"; + } + break; + case AT_VLOW: + switch (whichatt) { + case A_CHA: + return "repulsive"; + case A_CON: + return "sickly"; + case A_AGI: + return "oafish"; + case A_IQ: + return "animal"; + case A_STR: + return "feeble"; + case A_WIS: + return "reckless"; + default: + return "?verylow?"; + } + break; + case AT_LOW: + switch (whichatt) { + case A_CHA: + return "ugly"; + case A_CON: + return "unhealthy"; + case A_AGI: + return "clumsy"; + case A_IQ: + return "dim-witted"; + case A_STR: + return "very weak"; + case A_WIS: + return "foolish"; + default: + return "?low?"; + } + break; + case AT_LTAVERAGE: + switch (whichatt) { + case A_CHA: + return "unattractive"; + case A_CON: + return "unfit"; + case A_AGI: + return "awkward"; + case A_IQ: + return "dopey"; + case A_STR: + return "weak"; + case A_WIS: + return "naive"; + default: + return "?lt_average?"; + } + break; + case AT_AVERAGE: + switch (whichatt) { + case A_CHA: + case A_CON: + case A_AGI: + case A_STR: + case A_IQ: + case A_WIS: + return "average"; + default: + return "?average?"; + } + break; + case AT_GTAVERAGE: + switch (whichatt) { + case A_CHA: + return "attractive"; + case A_CON: + return "healthy"; + case A_AGI: + return "dextrous"; + case A_IQ: + return "smart"; + case A_STR: + return "strong"; + case A_WIS: + return "prudent"; + default: + return "?gt_average?"; + } + break; + case AT_HIGH: + switch (whichatt) { + case A_CHA: + return "alluring"; + case A_CON: + return "very fit"; + case A_AGI: + return "nimble"; + case A_IQ: + return "enlightened"; + case A_STR: + return "mighty"; + case A_WIS: + return "astute"; + default: + return "?high?"; + } + break; + case AT_VHIGH: + switch (whichatt) { + case A_CHA: + return "beautiful"; + case A_CON: + return "hardy"; + case A_AGI: + return "agile"; + case A_IQ: + return "genius"; + case A_STR: + return "powerful"; + case A_WIS: + return "wise"; + default: + return "?veryhigh?"; + } + break; + case AT_EXHIGH: + switch (whichatt) { + case A_CHA: + return "stunning"; + case A_CON: + return "very hardy"; + case A_AGI: + return "very agile"; + case A_IQ: + return "supergenius"; + case A_STR: + return "titanic"; + case A_WIS: + return "sagely"; + default: + return "?exhigh?"; + } + break; + case AT_RANDOM: + return "random"; + } + return "?unknown?"; +} + char *getattrname(enum ATTRIB att) { switch (att) { case A_NONE: @@ -619,6 +784,79 @@ char *getattrname(enum ATTRIB att) { return "?badattrib?"; } +char *getdamname(enum DAMTYPE damtype) { + switch (damtype) { + case DT_ALL: return "all damage"; + case DT_ACID: return "acid"; + case DT_BASH: return "bludgeoning"; + case DT_BITE: return "biting"; + case DT_CHOP: return "chopping"; + case DT_COLD: return "cold"; + case DT_CRUSH: return "crushing"; + case DT_DIRECT: return "direct"; + case DT_DECAY: return "decay"; + case DT_ELECTRIC: return "electricity"; + case DT_EXPLOSIVE: return "explosive"; + case DT_FALL: return "falling"; + case DT_FIRE: return "fire"; + case DT_HEAT: return "heat"; + case DT_HOLY: return "holy damage"; + case DT_LIGHT: return "light"; + case DT_MAGIC: return "magical"; + case DT_MELT: return "melting"; + case DT_NECROTIC: return "lifedrain"; + case DT_PETRIFY: return "petrification"; + case DT_PIERCE: return "piercing"; + case DT_POISON: return "poison"; + case DT_POISONGAS: return "gas"; + case DT_PROJECTILE: return "projectile"; + case DT_SLASH: return "slashing"; + case DT_SONIC: return "sonic"; + case DT_TOUCH: return "touch"; + case DT_UNARMED: return "unarmed"; + case DT_WATER: return "water"; + default: return "unknown"; + } + return "unknown"; +} + +char *getdamnamenoun(enum DAMTYPE damtype) { + switch (damtype) { + case DT_ALL: return "all damage"; + case DT_ACID: return "acid"; + case DT_MELT: return "melting"; + case DT_PETRIFY: return "petrification"; + case DT_PIERCE: return "piercing damage"; + case DT_POISONGAS: return "gas"; + case DT_POISON: return "poison"; + case DT_SLASH: return "slashing damage"; + case DT_ELECTRIC: return "electricity"; + case DT_EXPLOSIVE: return "explosives"; + case DT_FIRE: return "fire"; + case DT_HEAT: return "heat"; + case DT_BITE: return "bite"; + case DT_BASH: return "bludgeoning"; + case DT_CHOP: return "chopping"; + case DT_COLD: return "cold"; + case DT_PROJECTILE: return "projectiles"; + case DT_HOLY: return "holy damage"; + case DT_DIRECT: return "direct damage"; + case DT_DECAY: return "decay damage"; + case DT_WATER: return "water"; + case DT_MAGIC: return "magical damage"; + case DT_NECROTIC: return "lifedrain damage"; + case DT_TOUCH: return "touch effects"; + case DT_UNARMED: return "unarmed damage"; + case DT_LIGHT: return "light damage"; + case DT_CRUSH: return "crushing damage"; + case DT_SONIC: return "sonic damage"; + case DT_FALL: return "damage from falling"; + default: return "unknown"; + } + return "unkmown"; +} + + char *getdirname(int dir) { switch (dir) { case D_N: @@ -725,6 +963,28 @@ void getdisttext(cell_t *src, cell_t *dst,char *distbuf, char *distbufapprox, ch } +// ie. "the apple is xxx" +// ie. "the apples are xxx" +char *getfillingname(int nutrition) { + if (nutrition > 100) { + return "extremely substantial"; + } else if (nutrition >= 90) { + return "very filling"; + } else if (nutrition >= 70) { + return "ample for a meal"; + } else if (nutrition >= 50) { + return "enough for a light meal"; + } else if (nutrition >= 25) { + return "snack-sized"; + } else if (nutrition > 0) { + return "barely worth eating"; + } + // ie. < 0 + return "of zero nutritional substance"; +} + + + char *getflagsourcetext(flag_t *f) { switch (f->lifetime) { case FROMSKILL: return " (skill perk)"; @@ -1198,6 +1458,54 @@ char *getsizetext(enum LFSIZE sz) { return "unknown-sized"; } +char *getschoolname(enum SPELLSCHOOL sch) { + switch (sch) { + case SS_ABILITY: return "Abilities"; + case SS_ALLOMANCY: return "Allomancy"; + case SS_DIVINE: return "Divine Powers"; + case SS_WILD: return "Wild Magic"; + case SS_MENTAL: return "Psionic Powers"; + case SS_AIR: return "Air Magic"; + case SS_FIRE: return "Fire Magic"; + case SS_COLD: return "Cold Magic"; + case SS_MODIFICATION: return "Modification Magic"; + case SS_DEATH: return "Necromancy"; + case SS_NATURE: return "Enviromancy"; + case SS_LIFE: return "Life Magic"; + case SS_DIVINATION: return "Divination Magic"; + case SS_TRANSLOCATION: return "Translocation Magic"; + case SS_SUMMONING: return "Summoning Magic"; + default: + break; + } + return "badschool"; +} + +char *getschoolnameshort(enum SPELLSCHOOL sch) { + switch (sch) { + case SS_ABILITY: return "Abilities"; + case SS_ALLOMANCY: return "Allomancy"; + case SS_DIVINE: return "Divine Powers"; + case SS_WILD: return "Wild Magic"; + case SS_AIR: return "Air Magic"; + case SS_FIRE: return "Fire Magic"; + case SS_COLD: return "Cold Magic"; + case SS_DEATH: return "Necromancy"; + case SS_LIFE: return "Life Magic"; + case SS_MENTAL: return "Psionic Powers"; + case SS_MODIFICATION: return "Modification"; + case SS_NATURE: return "Nature"; + case SS_DIVINATION: return "Divination"; + case SS_TRANSLOCATION: return "Translocation"; + case SS_SUMMONING: return "Summoning"; + case SS_LAST: return "!invalid school!"; + default: + break; + } + return "unknown school"; +} + + char *gettimetext(char *retbuf) { int hours,mins,secs; splittime(&hours, &mins, &secs); @@ -1755,6 +2063,38 @@ char *strstarts(char *a, char *prefix) { return NULL; } +int strlen_without_colours(char *buf) { + char *p; + int len = 0; + enum { + S_NORM, + S_COLOURDEF, + S_COLOURDEFNUM, + } state = S_NORM; + + for (p = buf ; *p; p++) { + if (state == S_NORM) { + if (*p == '^') { + state = S_COLOURDEF; + } else { + len++; + } + } else if (state == S_COLOURDEF) { + if (isdigit(*p)) { + state = S_COLOURDEFNUM; + } else { + state = S_NORM; + } + } else { // ie. colourdefnum + if (!isdigit(*p)) { + state = S_NORM; + len++; + } + } + } + return len; +} + int strpixmatch(char *haystack, char *needle) { int matched = B_FALSE; char *hword, *nword, *hcont,*ncont; diff --git a/text.h b/text.h index 81d3c14..840a610 100644 --- a/text.h +++ b/text.h @@ -13,10 +13,14 @@ int getaccuracynum(int accpct); char *getalignmentname(enum ALIGNMENT al); char *getattackverb(lifeform_t *lf, object_t *wep, enum DAMTYPE damtype, int dam, int maxhp); char *getattrabbrev(enum ATTRIB att); +char *getattrbracketname(enum ATTRIB whichatt, enum ATTRBRACKET brack); char *getattrname(enum ATTRIB att); +char *getdamname(enum DAMTYPE damtype); +char *getdamnamenoun(enum DAMTYPE damtype); char *getdirname(int dir); char *getdirnameshort(int dir); void getdisttext(cell_t *src, cell_t *dst,char *distbuf, char *distbufapprox, char *dirbuf); +char *getfillingname(int nutrition); char *getflagsourcetext(flag_t *f); int gethitconferlifetime(char *text, int *min, int *max); char *getkillverb(lifeform_t *victim, object_t *wep, enum DAMTYPE damtype, int dam, int maxhp); @@ -33,6 +37,8 @@ char *getrarityname(enum RARITY rr); char *getregionname(char *buf, map_t *m, region_t *r, enum REGIONNAMEFORMAT how); char *getreldirname(int reldir); char *getsizetext(enum LFSIZE sz); +char *getschoolname(enum SPELLSCHOOL sch); +char *getschoolnameshort(enum SPELLSCHOOL sch); char *gettimetext(char *retbuf); char *gettimetextfuzzy(char *retbuf, int wantpm); char *getwaterdepthname(enum DEPTH d); @@ -59,6 +65,7 @@ char *dostrrep(char* in, char** out, char* oldtok, char* newtok, int *rv); int streq(char *a, char *b); char *strends(char *a, char *suffix); char *strstarts(char *a, char *prefix); +int strlen_without_colours(char *buf); int strpixmatch(char *haystack, char *needle); int texttodice(char *text, int *ndice, int *nsides, int *bonus); int texttospellopts(char *text, ... );