- [+] new skill: advanced combat

- [+] each level:  10% increase chance of not using stamina to
          attack
    - [+] nov: improvised weapons
    - [+] beg: nausea, being prone don't affect your accuracy
    - [+] adept:
        - [+]  blind fighting ability.
    - [+] skilled: DISARM skill
    - [+] expert: regain stamina once you kill someone
        - [+] FLIP skill
    - [+] master: attacking uses no stamina
    - [+] assign to jobs
        - [+] Ninja starts with ADEPT level.
        - [+] Warrior too?
- [+] genericise plural code:
    - [+] plural_t
        - [+] singular
        - [+] plural
    - [+] change object.c addobject()
    - [+] chnage text.c makeplural()
- [+] move flak jacket to go over shoudlers.
- [+] fix: don't give player skill in their race
This commit is contained in:
Rob Pearce 2012-07-18 10:12:32 +00:00
parent 023c8a5eaa
commit 8b6f5a13a8
9 changed files with 272 additions and 174 deletions

View File

@ -713,9 +713,15 @@ int attackcell(lifeform_t *lf, cell_t *c, int force) {
}
if (isplayer(lf)) {
enum SKILLLEVEL slev;
slev = getskill(lf, SK_COMBAT);
if (slev != PR_MASTER) {
if (!pctchance(slev * 10)) {
// lose a bit of stamina
modstamina(lf, -getattackstamloss(lf));
}
}
}
// stop sprinting
stopsprinting(lf);

68
data.c
View File

@ -9,6 +9,7 @@
#include "nexus.h"
#include "objects.h"
#include "spell.h"
#include "text.h"
extern behaviour_t *firstbehaviour,*lastbehaviour;
extern command_t *firstcommand,*lastcommand;
@ -26,6 +27,7 @@ extern brand_t *firstbrand,*lastbrand;
extern obmod_t *firstobmod,*lastobmod;
extern material_t *material,*lastmaterial;
extern lifeform_t *player;
extern plural_t *firstplural,*lastplural;
extern hiddennamewithcol_t colour[];
extern char *bookadjective[];
@ -405,6 +407,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "combat knife");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "revolver");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "helmet");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "leather armour");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "flak jacket");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "combat pants");
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "leather boots");
@ -416,6 +419,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10 bullets");
// initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COMBAT, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_FIRSTAID, PR_NOVICE, NA, NULL);
@ -460,6 +464,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTSKILL, SK_SPEECH, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_SS_NATURE, PR_NOVICE, NA, NULL);
// learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_COMBAT, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_EXOTICWEPS, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_FIRSTAID, NA, NA, NULL);
@ -501,6 +506,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTSKILL, SK_LORE_HUMANOID, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COMBAT, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_EVASION, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL);
@ -664,7 +670,8 @@ void initjobs(void) {
// initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_ARMOUR, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_ATHLETICS, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_NOVICE, NA, NULL); // limit
addflag(lastjob->flags, F_STARTSKILL, SK_CARTOGRAPHY, PR_NOVICE, NA, NULL); // limited
addflag(lastjob->flags, F_STARTSKILL, SK_COMBAT, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_EVASION, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_PERCEPTION, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_UNARMED, PR_BEGINNER, NA, NULL);
@ -694,7 +701,6 @@ void initjobs(void) {
// abilities
addflag(lastjob->flags, F_MPDICE, 1, NA, NA, NULL);
// gained abilities
addflag(lastjob->flags, F_LEVABIL, 2, OT_A_DISARMLF, NA, NULL);
addflag(lastjob->flags, F_LEVABIL, 4, OT_A_TRIPLF, NA, NULL);
addflag(lastjob->flags, F_LEVABIL, 6, OT_A_FLIP, NA, NULL);
addflag(lastjob->flags, F_HIRABLE, B_TRUE, NA, NA, NULL);
@ -730,6 +736,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CARTOGRAPHY, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CLIMBING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COMBAT, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_METALWORK, NA, NA, NULL);
@ -771,6 +778,7 @@ void initjobs(void) {
// learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_ATHLETICS, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_BACKSTAB, PR_ADEPT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COMBAT, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_LISTEN, PR_EXPERT, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, PR_SKILLED, NA, NULL);
@ -823,6 +831,7 @@ void initjobs(void) {
// learnable skills
addflag(lastjob->flags, F_CANLEARN, SK_ARMOUR, PR_NOVICE, NA, NULL); // limit
addflag(lastjob->flags, F_CANLEARN, SK_CHANNELING, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COMBAT, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_COOKING, NA, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_PERCEPTION, PR_SKILLED, NA, NULL);
addflag(lastjob->flags, F_CANLEARN, SK_SEWING, NA, NA, NULL); //
@ -857,6 +866,7 @@ void initjobs(void) {
addflag(lastjob->flags, F_STARTOB, 100, NA, NA, "10-20 gold dollars");
// initial skills
addflag(lastjob->flags, F_STARTSKILL, SK_AXES, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COMBAT, PR_BEGINNER, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_COOKING, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_CLUBS, PR_NOVICE, NA, NULL);
addflag(lastjob->flags, F_STARTSKILL, SK_SHORTBLADES, PR_NOVICE, NA, NULL);
@ -6746,10 +6756,10 @@ void initobjects(void) {
addflag(lastot->flags, F_OBHP, 120, 120, NA, NULL);
addflag(lastot->flags, F_CRITPROTECTION, 100, NA, NA, NULL);
addot(OT_FLAKJACKET, "flak jacket", "Heavy metal body armour. Designed to stop a bullet, but ineffective against melee attacks.", MT_METAL, 30, OC_ARMOUR, SZ_MEDIUM);
addot(OT_FLAKJACKET, "flak jacket", "Heavy metal vest, worn over the shoulders. Designed to stop a bullet, but ineffective against melee attacks.", MT_METAL, 30, OC_ARMOUR, SZ_MEDIUM);
addflag(lastot->flags, F_RARITY, H_ALL, 100, RR_RARE, NULL);
addflag(lastot->flags, F_MULTISIZE, B_TRUE, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_BODY, NA, NA, NULL);
addflag(lastot->flags, F_GOESON, BP_SHOULDERS, NA, NA, NULL);
addflag(lastot->flags, F_ARMOURRATING, 2, NA, NA, NULL);
addflag(lastot->flags, F_EQUIPCONFER, F_ARMOURPENALTY, 10, 10, NULL);
addflag(lastot->flags, F_ATTREQ, A_STR, 50, NA, NULL);
@ -17723,6 +17733,7 @@ void initskills(void) {
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);
addskilldesc(SK_ARMOUR, PR_NOVICE, "^gYou can now recognise the quality of armour.^n", B_FALSE);
addskilldesc(SK_ARMOUR, PR_BEGINNER, "^gReduces armour penalties by 20%.^n", B_FALSE);
addskilldesc(SK_ARMOUR, PR_ADEPT, "^gReduces armour penalties by 30%.^n", B_FALSE);
addskilldesc(SK_ARMOUR, PR_SKILLED, "^gReduces armour penalties by 40%.^n", B_FALSE);
@ -17768,6 +17779,15 @@ void initskills(void) {
addskilldesc(SK_CLIMBING, PR_SKILLED, "-5 accuracy penalty while climbing.", B_FALSE);
addskilldesc(SK_CLIMBING, PR_EXPERT, "-2 accuracy penalty while climbing.", B_FALSE);
addskilldesc(SK_CLIMBING, PR_MASTER, "No accuracy penalty or stamina cost to remain climbing.", B_FALSE);
addskill(SK_COMBAT, "Advanced Combat", "Affects your ability to fight in adverse situations or unorthodox styles.", 0);
addskilldesc(SK_COMBAT, PR_INEPT, " - Each skill level grants a 10% chance to bypass stamina drain when attacking.", B_FALSE);
addskilldesc(SK_COMBAT, PR_NOVICE, "Unskilled weapon penalties are greatly reduced.", B_FALSE);
addskilldesc(SK_COMBAT, PR_BEGINNER, "Eliminates penalties for being prone or nauseated.", B_FALSE);
addskilldesc(SK_COMBAT, PR_ADEPT, "Eliminates penalties when fighting unseen enemies.", B_FALSE);
addskilldesc(SK_COMBAT, PR_ADEPT, "You gain the 'disarm' ability.", B_FALSE);
addskilldesc(SK_COMBAT, PR_SKILLED, "You gain the 'trip' ability.", B_FALSE);
addskilldesc(SK_COMBAT, PR_EXPERT, "^gSecond wind restores stamina after defeating enemies.^n", B_TRUE);
addskilldesc(SK_COMBAT, PR_MASTER, "^gAttacking will no longer drain your stamina.^n", B_TRUE);
addskill(SK_COOKING, "Cooking", "Your ability to combine foods into nutritious meals.", 50);
addskilldesc(SK_COOKING, PR_INEPT, " - Note: when cooking, all ingredients must already be recognised.", B_FALSE);
addskilldesc(SK_COOKING, PR_NOVICE, "^gYou can now cook corpses before consumption.", B_TRUE);
@ -17841,6 +17861,7 @@ void initskills(void) {
addskill(SK_SHIELDS, "Shields", "Reduces shield accuracy penalty, and raises chance to block attacks.", 50);
addskilldesc(SK_SHIELDS, PR_INEPT, "- Without this skill, shield accuracy penalties are tripled.", B_FALSE);
addskilldesc(SK_SHIELDS, PR_NOVICE, "^gShield accuracy penalties are reduced by 1.^n", B_FALSE);
addskilldesc(SK_SHIELDS, PR_NOVICE, "^gYou can now recognise the quality of shields.^n", B_FALSE);
addskilldesc(SK_SHIELDS, PR_BEGINNER, "^gShield accuracy penalties are reduced by 2.^n", B_FALSE);
addskilldesc(SK_SHIELDS, PR_BEGINNER, "^gYou gain the 'shield bash' ability.^n", B_FALSE);
addskilldesc(SK_SHIELDS, PR_ADEPT, "^gShield accuracy penalties are reduced by 3.^n", B_FALSE);
@ -18070,6 +18091,8 @@ void initskills(void) {
if (isweaponskill(sk->id) || (sk->id == SK_UNARMED)) {
addskilldesc(sk->id, PR_INEPT, "This skill increases your accuracy and damage when using matching weapons.", B_FALSE);
if (sk->id == SK_CLUBS) addskilldesc(sk->id, PR_NOVICE, "^gYou gain the 'merciful fighting' ability.^n", B_FALSE);
addskilldesc(sk->id, PR_NOVICE, "^gYou can now recognise the quality of matching weapons.^n", B_FALSE);
addskilldesc(sk->id, PR_NOVICE, "^gYou no longer suffer accuracy penalties with matching weapons.^n", B_FALSE);
addskilldesc(sk->id, PR_BEGINNER, "^g+1 accuracy.^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);
@ -18083,6 +18106,43 @@ void initskills(void) {
}
}
void inittext(void) {
// scrolls
addplural("bag","bags", B_TRUE);
addplural("berry","berries", B_TRUE);
addplural("block","blocks", B_TRUE);
addplural("can","cans", B_TRUE);
addplural("chunk","chunks", B_TRUE);
addplural("cloud","clouds", B_TRUE);
addplural("clove","cloves", B_TRUE);
addplural("flask","flasks", B_TRUE);
addplural("gem","gems", B_TRUE);
addplural("knife","knives", B_TRUE);
addplural("leaf","leaves", B_TRUE);
addplural("loaf","loaves", B_TRUE);
addplural("lump","lumps", B_TRUE);
addplural("piece","pieces", B_TRUE);
addplural("pile","piles", B_TRUE);
addplural("pinch","pinches", B_TRUE);
addplural("plank","planks", B_TRUE);
addplural("pool","pools", B_TRUE);
addplural("potion","potions", B_TRUE);
addplural("puddle","puddles", B_TRUE);
addplural("puff","puffs", B_TRUE);
addplural("ring","rings", B_TRUE);
addplural("ruby","rubies", B_TRUE);
addplural("scroll","scrolls", B_TRUE);
addplural("splash","splashes", B_TRUE);
addplural("set","sets", B_TRUE);
addplural("sheet","sheets", B_TRUE);
addplural("sprig","sprigs", B_TRUE);
addplural("suit","suits", B_TRUE);
addplural("vial","vials", B_TRUE);
// don't return after finding this one
addplural("pair", "pairs", B_FALSE);
}
void killoption(option_t *w) {
option_t *nextone, *lastone;

1
data.h
View File

@ -11,6 +11,7 @@ void initoptions(void);
void initrace(void);
void initraceclasses(void);
void initskills(void);
void inittext(void);
void killbehaviour(behaviour_t *b);
void killcommand(command_t *cmd);
void killoption(option_t *o);

10
defs.h
View File

@ -652,6 +652,7 @@ enum SKILL {
SK_CARTOGRAPHY,
SK_CHANNELING,
SK_CLIMBING,
SK_COMBAT,
SK_COOKING,
SK_EVASION,
SK_FIRSTAID,
@ -702,7 +703,7 @@ enum SKILL {
SK_SS_TRANSLOCATION,
SK_SS_WILD,
};
#define MAXSKILLS 53
#define MAXSKILLS 54
// proficiency levels
enum SKILLLEVEL {
@ -4161,6 +4162,13 @@ typedef struct option_s {
struct option_s *next, *prev;
} option_t;
typedef struct plural_s {
char *singular;
char *plural;
int stopafter; // stop parsing strings after finding this?
struct plural_s *next, *prev;
} plural_t;
enum BRANCH {
BH_CAVE,
BH_WORLDMAP,

33
lf.c
View File

@ -3284,6 +3284,13 @@ void die(lifeform_t *lf) {
}
}
}
// player might get stamina back...
if (isplayer(killer)) {
if (getskill(player, SK_COMBAT) >= PR_EXPERT) {
modstamina(lf, rnd(1,getmaxstamina(lf)));
}
}
}
// determine where to drop objects
@ -8019,12 +8026,16 @@ int getlfaccuracy(lifeform_t *lf, object_t *wep) {
// modify for blindness
if (isblind(lf)) {
if (getskill(lf, SK_COMBAT) < PR_ADEPT) {
acc -= 50;
}
}
// modify for being on the ground
if (isprone(lf)) {
if (getskill(lf, SK_COMBAT) < PR_BEGINNER) {
acc -= 40;
}
}
// day/night boosts
if (isnighttime()) {
@ -8080,8 +8091,10 @@ int getlfaccuracy(lifeform_t *lf, object_t *wep) {
// modify for nausea
if (lfhasflag(lf, F_NAUSEATED)) {
if (getskill(lf, SK_COMBAT) < PR_BEGINNER) {
acc -= 25;
}
}
// modify for stickiness
if (gamemode == GM_GAMESTARTED) {
@ -8700,7 +8713,7 @@ enum MATERIAL getlfmaterial(lifeform_t *lf) {
enum SKILLLEVEL getlorelevel(lifeform_t *lf, enum RACECLASS rcid) {
enum SKILLLEVEL slev = PR_INEPT;
raceclass_t *rc;
if (gamemode < GM_GAMESTARTED) {
if (gamemode <= GM_LOADING) {
return PR_INEPT;
}
rc = findraceclass(rcid);
@ -10650,7 +10663,7 @@ void givejob(lifeform_t *lf, enum JOB jobid) {
}
// now give start obs/skills from it
// now give start obs/skills from the job
givestartskills(lf, lf->flags);
if (!lfhasflag(lf, F_PHANTASM)) {
givestartobs(lf, NULL, lf->flags);
@ -10965,6 +10978,9 @@ void givesubjob(lifeform_t *lf, enum SUBJOB sj) {
case SJ_SCOURGE:
// remove warrior's level abilities
killflagsofid(lf->flags, F_LEVABIL);
// scourges don't get advanced combat
f = lfhasflagval(lf, F_HASSKILL, SK_COMBAT, NA, NA, NULL);
if (f) killflag(f);
// magic resistance at level 5
addtempflag(lf->flags, F_RESISTMAG, 5, NA, NA, NULL, FROMJOB);
// no mp or other magic.
@ -11352,6 +11368,16 @@ flag_t *giveskill(lifeform_t *lf, enum SKILL id) {
newf = addtempflag(lf->flags, F_CANWILL, OT_S_MAPPING, 50, 50, "pw:1;", FROMSKILL);
}
}
} else if (id == SK_COMBAT) {
if (f->val[1] == PR_SKILLED) {
if (!hasflagval(lf->flags, F_CANWILL, OT_A_DISARM, NA, NA, NULL)) {
newf = addtempflag(lf->flags, F_CANWILL, OT_A_DISARMLF, NA, NA, NULL, FROMSKILL);
}
} else if (f->val[1] == PR_EXPERT) {
if (!hasflagval(lf->flags, F_CANWILL, OT_A_FLIP, NA, NA, NULL)) {
newf = addtempflag(lf->flags, F_CANWILL, OT_A_FLIP, NA, NA, NULL, FROMSKILL);
}
}
} else if (id == SK_COOKING) {
if (f->val[1] == PR_ADEPT) {
if (isplayer(lf)) {
@ -11860,11 +11886,14 @@ void givestartskills(lifeform_t *lf, flagpile_t *fp) {
killflagsofid(fp, F_STARTSKILL);
// all races know about their own race
if (!isplayer(lf)) {
if (getlorelevel(lf, lf->race->raceclass->id) < PR_NOVICE) {
giveskilllev(lf, lf->race->raceclass->skill, PR_NOVICE);
}
}
}
int gotosleep(lifeform_t *lf, int onpurpose) {
char lightid[BUFLEN];
strcpy(lightid, "");

View File

@ -60,6 +60,7 @@ int nbuildingusage = 0;
warning_t *firstwarning = NULL,*lastwarning = NULL;
option_t *firstoption = NULL,*lastoption = NULL;
plural_t *firstplural = NULL,*lastplural = NULL;
int maxmonhitdice = 0; // highest number of hitdice for any monster
@ -1261,6 +1262,7 @@ int init(void) {
// load npc names
loadnpcnames();
inittext();
initoptions();
initcommands();
initobjects();

View File

@ -31,6 +31,7 @@ extern race_t *firstrace, *lastrace;
extern recipe_t *firstrecipe,*lastrecipe;
extern skill_t *firstskill, *lastskill;
extern region_t *firstregion;
extern plural_t *firstplural;
extern buildingusage_t buildingusage[];
extern int nbuildingusage;
@ -3614,6 +3615,7 @@ objecttype_t *findot(enum OBTYPE id) {
objecttype_t *findotn(char *name) {
objecttype_t *ot;
plural_t *pl;
knowledge_t *k;
char *modname;
char *p;
@ -3628,36 +3630,9 @@ objecttype_t *findotn(char *name) {
// make some replacements
//replace scrolls with scroll etc
modname = strrep(modname, "bags ", "bag ", NULL);
modname = strrep(modname, "berries ", "berry ", NULL);
modname = strrep(modname, "blocks ", "block ", NULL);
modname = strrep(modname, "cans ", "can ", NULL);
modname = strrep(modname, "chunks ", "chunk ", NULL);
modname = strrep(modname, "clouds ", "cloud ", NULL);
modname = strrep(modname, "cloves ", "clove ", NULL);
modname = strrep(modname, "flasks ", "flask ", NULL);
modname = strrep(modname, "gems ", "gem ", NULL);
modname = strrep(modname, "knives", "knife", NULL);
modname = strrep(modname, "leaves", "leaf", NULL);
modname = strrep(modname, "loaves ", "loaf ", NULL);
modname = strrep(modname, "lumps ", "lump ", NULL);
modname = strrep(modname, "pieces ", "piece ", NULL);
modname = strrep(modname, "piles ", "pile ", NULL);
modname = strrep(modname, "pinches ", "pinch ", NULL);
modname = strrep(modname, "planks ", "plank ", NULL);
modname = strrep(modname, "pools ", "pool ", NULL);
modname = strrep(modname, "potions ", "potion ", NULL);
modname = strrep(modname, "puddles ", "puddle ", NULL);
modname = strrep(modname, "puffs ", "puff ", NULL);
modname = strrep(modname, "rings ", "ring ", NULL);
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);
modname = strrep(modname, "vials ", "vial ", NULL);
for (pl = firstplural ; pl ; pl = pl->next) {
modname = strrep(modname, pl->plural, pl->singular, NULL);
}
// only at start...
if (strstr(modname, "the ") == modname) modname = strrep(modname, "the ", "", NULL);
@ -4096,6 +4071,13 @@ int getobaccuracy(object_t *wep, lifeform_t *weilder, int forthrow) {
// adjust for weapon skill
weplev = getweaponskill(weilder, wep);
switch (weplev) {
case PR_INEPT:
if (getskill(weilder, SK_COMBAT)) {
acc -= 5; break;
} else {
acc -= 15; break;
}
case PR_NOVICE: break; // no change
case PR_BEGINNER: acc += 5; break;
case PR_ADEPT: acc += 10; break;
case PR_SKILLED: acc += 15; break;

154
text.c
View File

@ -23,6 +23,36 @@ extern enum GAMEMODE gamemode;
extern enum WINGAMETYPE wintype;
extern material_t *material,*lastmaterial;
extern plural_t *firstplural,*lastplural;
plural_t *addplural(char *singulartext, char *pluraltext, int stopafter) {
plural_t *a;
char buf[BUFLEN];
// add to the end of the list
if (firstplural == NULL) {
firstplural = malloc(sizeof(celltype_t));
a = firstplural;
a->prev = NULL;
} else {
// go to end of list
a = lastplural;
a->next = malloc(sizeof(plural_t));
a->next->prev = a;
a = a->next;
}
lastplural = a;
a->next = NULL;
// set props - add spaces at the end of words
sprintf(buf, "%s ",singulartext);
a->singular = strdup(buf);
sprintf(buf, "%s ",pluraltext);
a->plural = strdup(buf);
a->stopafter = stopafter;
return a;
}
int needan(char *text) {
if (isvowel(tolower(text[0]))) {
@ -1300,22 +1330,30 @@ char *getinjurydesc(enum BODYPART where, enum DAMTYPE dt) {
// all strings returned here must also be defined as an obmod altprefix!
//
char *getobmodprefix(object_t *o, obmod_t *om) {
int enoughperception = B_TRUE;
int enoughwepskill = B_TRUE;
if (gamemode == GM_GAMESTARTED) {
if ( (getskill(player, SK_PERCEPTION) < PR_BEGINNER)) {
enoughperception = B_FALSE;
}
if (!getweaponskill(player, o)) {
enoughwepskill = B_FALSE;
}
}
// masterwork/shoddy doors have names based on material.
if (isdoor(o, NULL)) {
// player perceptive enough to notice?
if (om->id == OM_MASTERWORK) {
if ((gamemode == GM_GAMESTARTED) && (getskill(player, SK_PERCEPTION) < PR_BEGINNER)) {
return NULL;
}
if (!enoughperception) return NULL;
switch (o->material->id) {
case MT_STONE: return "reinforced ";
case MT_METAL: return "reinforced ";
default: return "sturdy ";
}
} else if (om->id == OM_SHODDY) {
if ((gamemode == GM_GAMESTARTED) && (getskill(player, SK_PERCEPTION) < PR_BEGINNER)) {
return NULL;
}
if (!enoughperception) return NULL;
switch (o->material->id) {
case MT_STONE: return "crumbling ";
case MT_METAL: return "rusted ";
@ -1326,7 +1364,7 @@ char *getobmodprefix(object_t *o, obmod_t *om) {
skill_t *sk;
sk = getobskill(o->flags);
if (sk) {
if (!player || (getskill(player, sk->id) >= PR_BEGINNER) || (getskill(player, SK_PERCEPTION) >= PR_BEGINNER)) {
if (!player || enoughwepskill || enoughperception) {
if (om->id == OM_MASTERWORK) {
switch (sk->id) {
case SK_CLUBS:
@ -1352,6 +1390,7 @@ char *getobmodprefix(object_t *o, obmod_t *om) {
}
}
} else if (isshield(o)) {
if (!player || enoughperception || getskill(player, SK_SHIELDS)) {
if (om->id == OM_MASTERWORK) {
switch (o->material->id) {
case MT_LEATHER:
@ -1383,7 +1422,9 @@ char *getobmodprefix(object_t *o, obmod_t *om) {
default: break;
}
}
}
} else if (isarmour(o)) {
if (!player || enoughperception || getskill(player, SK_ARMOUR)) {
if (om->id == OM_MASTERWORK) {
switch (o->material->id) {
case MT_LEATHER:
@ -1415,6 +1456,7 @@ char *getobmodprefix(object_t *o, obmod_t *om) {
}
}
}
}
return om->prefix;
}
@ -1849,6 +1891,33 @@ int isvowel (char c) {
return B_FALSE;
}
void killplural(plural_t *w) {
plural_t *nextone, *lastone;
// free mem
if (w->singular) free(w->singular);
if (w->plural) free(w->plural);
// remove from list
nextone = w->next;
if (nextone != NULL) {
nextone->prev = w->prev;
} else { /* last */
lastplural = w->prev;
}
if (w->prev == NULL) {
/* first */
nextone = w->next;
free(firstplural);
firstplural = nextone;
} else {
lastone = w->prev;
free (lastone->next );
lastone->next = nextone;
}
}
// return text for player's F_GUNTARGET flag eg. "goblin [acc:50%]"
void makegunaimstring(lifeform_t *lf, int lfid, char *retbuf) {
char accbuf[BUFLEN];
@ -1932,75 +2001,14 @@ char *makeplural(char *text) {
char lastlet;
char *newtext;
int rv;
plural_t *pl;
newtext = strdup(text);
// scrolls
newtext = strrep(newtext, "bag ", "bags ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "berry ", "berries ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "block ", "blocks ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "can ", "cans ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "chunk ", "chunks ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "cloud ", "clouds ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "clove ", "cloves ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "flask ", "flasks ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "gem ", "gems ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "knife", "knives", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "leaf", "leaves", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "loaf ", "loaves ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "lump ", "lumps ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "piece ", "pieces ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "pile ", "piles ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "pinch ", "pinches ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "plank ", "planks ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "pool ", "pools ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "potion ", "potions ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "puddle ", "puddles ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "puff ", "puffs ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "ring ", "rings ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "ruby", "rubies", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "scroll ", "scrolls ", &rv);
if (rv) return newtext;
newtext = strrep(newtext, "splash ", "splashes ", &rv);
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);
if (rv) return newtext;
newtext = strrep(newtext, "vial ", "vials ", &rv);
if (rv) return newtext;
//
newtext = strrep(newtext, "pair ", "pairs ", &rv);
// don't return
for (pl = firstplural ; pl ; pl = pl->next) {
newtext = strrep(newtext, pl->singular, pl->plural, &rv);
if (rv && pl->stopafter) return newtext;
}
// default
lastlet = text[strlen(text)-1];

2
text.h
View File

@ -1,5 +1,6 @@
#include "defs.h"
plural_t *addplural(char *singulartext, char *pluraltext, int stopafter);
int needan(char *text);
char *capitalise(char *text);
char *capitaliseall(char *text);
@ -49,6 +50,7 @@ char *getweighttext(float weight, char *buf, int shortfmt);
char *is(lifeform_t *lf);
char *it(lifeform_t *lf);
int isvowel(char c);
void killplural(plural_t *w);
void makegunaimstring(lifeform_t *lf, int lfid, char *retbuf);
char *makekillertext(char *retbuf, char *killverb, char *lastdam, map_t *where, int wantextra, int wantlocation);
char *makelowercase(char *text);