forked from github/server
introduce an rcoption struct.
used for pretty rare options that have no property in the race struct.
This commit is contained in:
parent
de10a8ad65
commit
998dcffab2
2
clibs
2
clibs
|
@ -1 +1 @@
|
||||||
Subproject commit f91ef37f08c5244bf616f1836c0aa9caaf36805c
|
Subproject commit 27c8b3202b52766465743c3324fc0b52c5ba4b11
|
2
cmake
2
cmake
|
@ -1 +1 @@
|
||||||
Subproject commit f1fb3943ace59994d90d71a891b80033dc2700a2
|
Subproject commit d88983c7ff4bc3a4884a7c3f74e8190bac5eab23
|
|
@ -558,20 +558,12 @@ void faction_setpassword(faction * f, const char *pwhash)
|
||||||
f->_password = strdup(pwhash);
|
f->_password = strdup(pwhash);
|
||||||
}
|
}
|
||||||
|
|
||||||
const race *other_race(const race *rc) {
|
|
||||||
if (rc->parameters) {
|
|
||||||
const char *str = get_param(rc->parameters, "other_race");
|
|
||||||
return str ? rc_find(str) : NULL;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool valid_race(const struct faction *f, const struct race *rc)
|
bool valid_race(const struct faction *f, const struct race *rc)
|
||||||
{
|
{
|
||||||
if (f->race == rc)
|
if (f->race == rc)
|
||||||
return true;
|
return true;
|
||||||
else {
|
else {
|
||||||
return other_race(f->race) == rc;
|
return rc_otherrace(f->race) == rc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <util/language.h>
|
#include <util/language.h>
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
|
#include <util/variant.h>
|
||||||
|
|
||||||
#include <storage.h>
|
#include <storage.h>
|
||||||
|
|
||||||
|
@ -77,6 +78,59 @@ static const char *racenames[MAXRACES] = {
|
||||||
"clone"
|
"clone"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MAXOPTIONS 4
|
||||||
|
typedef struct rcoption {
|
||||||
|
unsigned char key[MAXOPTIONS];
|
||||||
|
variant value[MAXOPTIONS];
|
||||||
|
} rcoption;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RCO_NONE,
|
||||||
|
RCO_SCARE,
|
||||||
|
RCO_OTHER
|
||||||
|
};
|
||||||
|
|
||||||
|
static void rc_setoption(race *rc, int key, const char *value) {
|
||||||
|
int i;
|
||||||
|
variant *v = NULL;
|
||||||
|
if (!rc->options) {
|
||||||
|
rc->options = malloc(sizeof(rcoption));
|
||||||
|
rc->options->key[0] = key;
|
||||||
|
rc->options->key[1] = RCO_NONE;
|
||||||
|
v = rc->options->value;
|
||||||
|
} else {
|
||||||
|
for (i=0;!v && i < MAXOPTIONS && rc->options->key[i]!=RCO_NONE;++i) {
|
||||||
|
if (rc->options->key[i]==key) {
|
||||||
|
v = rc->options->value+i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!v) {
|
||||||
|
assert(i<MAXOPTIONS || !"MAXOPTIONS too small for race");
|
||||||
|
v = rc->options->value+i;
|
||||||
|
rc->options->key[i] = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(v);
|
||||||
|
if (key == RCO_SCARE) {
|
||||||
|
v->i = atoi(value);
|
||||||
|
}
|
||||||
|
else if (key == RCO_OTHER) {
|
||||||
|
v->v = rc_get_or_create(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static variant *rc_getoption(const race *rc, int key) {
|
||||||
|
if (rc->options) {
|
||||||
|
int i;
|
||||||
|
for (i=0;i!=MAXOPTIONS && rc->options->key[i]!=RCO_NONE;++i) {
|
||||||
|
if (rc->options->key[i]==key) {
|
||||||
|
return rc->options->value+i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
const struct race *findrace(const char *s, const struct locale *lang)
|
const struct race *findrace(const char *s, const struct locale *lang)
|
||||||
{
|
{
|
||||||
void **tokens = get_translations(lang, UT_RACES);
|
void **tokens = get_translations(lang, UT_RACES);
|
||||||
|
@ -297,7 +351,14 @@ int rc_armor_bonus(const race *rc)
|
||||||
|
|
||||||
int rc_scare(const struct race *rc)
|
int rc_scare(const struct race *rc)
|
||||||
{
|
{
|
||||||
return get_param_int(rc->parameters, "ai.scare", 0);
|
variant *v = rc_getoption(rc, RCO_SCARE);
|
||||||
|
return v ? v->i : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const race *rc_otherrace(const race *rc)
|
||||||
|
{
|
||||||
|
variant *v = rc_getoption(rc, RCO_OTHER);
|
||||||
|
return v ? (const race *)v->v : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rc_migrants_formula(const race *rc)
|
int rc_migrants_formula(const race *rc)
|
||||||
|
@ -314,6 +375,12 @@ void rc_set_param(struct race *rc, const char *key, const char *value) {
|
||||||
rc->flags |= RCF_MIGRANTS;
|
rc->flags |= RCF_MIGRANTS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (strcmp(key, "other_race")==0) {
|
||||||
|
rc_setoption(rc, RCO_OTHER, value);
|
||||||
|
}
|
||||||
|
else if (strcmp(key, "ai.scare")==0) {
|
||||||
|
rc_setoption(rc, RCO_SCARE, value);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
set_param(&rc->parameters, key, value);
|
set_param(&rc->parameters, key, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ extern "C" {
|
||||||
struct spell;
|
struct spell;
|
||||||
struct spellref;
|
struct spellref;
|
||||||
struct locale;
|
struct locale;
|
||||||
|
struct rcoption;
|
||||||
|
|
||||||
extern int num_races;
|
extern int num_races;
|
||||||
|
|
||||||
|
@ -153,6 +154,8 @@ extern "C" {
|
||||||
struct item *(*itemdrop) (const struct race *, int size);
|
struct item *(*itemdrop) (const struct race *, int size);
|
||||||
void(*init_familiar) (struct unit *);
|
void(*init_familiar) (struct unit *);
|
||||||
|
|
||||||
|
struct rcoption *options; // rarely used properties
|
||||||
|
|
||||||
const struct race *familiars[MAXMAGIETYP];
|
const struct race *familiars[MAXMAGIETYP];
|
||||||
struct race *next;
|
struct race *next;
|
||||||
} race;
|
} race;
|
||||||
|
@ -189,6 +192,7 @@ extern "C" {
|
||||||
double rc_maxaura(const struct race *rc);
|
double rc_maxaura(const struct race *rc);
|
||||||
int rc_armor_bonus(const struct race *rc);
|
int rc_armor_bonus(const struct race *rc);
|
||||||
int rc_scare(const struct race *rc);
|
int rc_scare(const struct race *rc);
|
||||||
|
const race *rc_otherrace(const race *rc);
|
||||||
|
|
||||||
#define MIGRANTS_NONE 0
|
#define MIGRANTS_NONE 0
|
||||||
#define MIGRANTS_LOG10 1
|
#define MIGRANTS_LOG10 1
|
||||||
|
|
Loading…
Reference in New Issue