// twocc.c // // by John D. de Boer #include "twist.h" typedef struct { string name, aka; // synonym or short form picture icon; // icon for occupation type bitmap *bm; // same, but in different format bool show, fem; // whether the occupation has a distictly female name, e.g. "queen" } Occupation; int OCCS; // number of different occupations Occupation **Occs; // the occupation details static stringlist UOcc; // occupation names that were not recognised // Initialisation void InitOccs(void) { OCCS=0; Occs=(Occupation **)handle(0); initstringlist(&UOcc); } static void PurgeOcc(Occupation *P) { if (!P) return; old(P->name); old(P->aka); ReleaseIcon(P->icon,P->bm); } void PurgeOccs(void) { int i; purgestringlist(&UOcc); lock(Occs); for (i=0;iname=copyof(S); MP->aka=NULL; MP->show=1; MP->fem=0; MP->icon=DefaultPersonIcon(); MP->bm=DefaultPersonBitmap(); unlock(Occs); return NEW; } void SetOccIcon(int OCC, picture P) { if (!range(OCC,OCCS) || !P) return; (*Occs)[OCC].icon=P; (*Occs)[OCC].bm=extractbitmap(P); } void SetOccSynonym(int OCC, char *S) { if (!range(OCC,OCCS)) return; (*Occs)[OCC].aka=copyof(S); } void SetOccFemale(int OCC) { if (!range(OCC,OCCS)) return; (*Occs)[OCC].fem=1; } // Parsing occupations static void UnknownOcc(const char *S) { if (stringisinlist(&UOcc,S)) return; WarnOld(cat(0,"Unrecognised occupation: ",(char *)S)); addstringtolist(&UOcc,copyof(S)); } int ParseOccupation(const char *S, bool *Fem) { Occupation Oc; int i; if (!S || !*S) return -1; for (i=0;inocc<1) return DefaultPersonIcon(); OCC=P->occ[0]; if (!range(OCC,OCCS)) return DefaultPersonIcon(); return (*Occs)[OCC].icon; } bitmap *PersonBitmap(Person *P) { int OCC; if (!P || P->nocc<1) return DefaultPersonBitmap(); OCC=P->occ[0]; if (!range(OCC,OCCS)) return DefaultPersonBitmap(); return (*Occs)[OCC].bm; } char *OccName(int OCC) { if (!range(OCC,OCCS)) return "unknown"; return (*Occs)[OCC].name; } bool FamilyMember(Person *P) { int i; if (!P) return 0; for (i=0;inocc;i++) if (streq(OccName(P->occ[i]),"family")) return 1; return 0; } bool OccupationMatch(Person *P, const char *S) { int i; if (!P || !S) return 0; for (i=0;inocc;i++) if (wordin(S,OccName(P->occ[i]),0)) return 1; return 0; }