diff --git a/res/eressea/races.xml b/res/eressea/races.xml index b29b84ede..513797d8d 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -717,7 +717,7 @@ - + diff --git a/src/battle.c b/src/battle.c index 392b24441..534984fb1 100644 --- a/src/battle.c +++ b/src/battle.c @@ -1037,31 +1037,33 @@ static int rc_specialdamage(const unit *au, const unit *du, const struct weapon_ { const race *ar = u_race(au); int m, modifier = 0; - - switch (old_race(ar)) { - case RC_HALFLING: - if (wtype != NULL && dragonrace(u_race(du))) { - modifier += 5; + if (wtype != NULL) { + if (fval(u_race(du), RCF_DRAGON)) { + static int cache; + static race *rc_halfling; + if (rc_changed(&cache)) { + rc_halfling = get_race(RC_HALFLING); + } + if (ar == rc_halfling) { + modifier += 5; + } } - break; - default: - break; - } - if (wtype != NULL && wtype->modifiers != NULL) { - for (m = 0; wtype->modifiers[m].value; ++m) { - /* weapon damage for this weapon, possibly by race */ - if (wtype->modifiers[m].flags & WMF_DAMAGE) { - race_list *rlist = wtype->modifiers[m].races; - if (rlist != NULL) { - while (rlist) { - if (rlist->data == ar) - break; - rlist = rlist->next; + if (wtype->modifiers != NULL) { + for (m = 0; wtype->modifiers[m].value; ++m) { + /* weapon damage for this weapon, possibly by race */ + if (wtype->modifiers[m].flags & WMF_DAMAGE) { + race_list *rlist = wtype->modifiers[m].races; + if (rlist != NULL) { + while (rlist) { + if (rlist->data == ar) + break; + rlist = rlist->next; + } + if (rlist == NULL) + continue; } - if (rlist == NULL) - continue; + modifier += wtype->modifiers[m].value; } - modifier += wtype->modifiers[m].value; } } } diff --git a/src/economy.c b/src/economy.c index 1eda7bf61..ae13d5ecc 100644 --- a/src/economy.c +++ b/src/economy.c @@ -114,16 +114,20 @@ static void recruit_init(void) int income(const unit * u) { - switch (old_race(u_race(u))) { - case RC_FIREDRAGON: - return 150 * u->number; - case RC_DRAGON: - return 1000 * u->number; - case RC_WYRM: - return 5000 * u->number; - default: - return 20 * u->number; + // TODO: make this a property, like race.income, no hard-coding of values + if (fval(u_race(u), RCF_DRAGON)) { + switch (old_race(u_race(u))) { + case RC_FIREDRAGON: + return 150 * u->number; + case RC_DRAGON: + return 1000 * u->number; + case RC_WYRM: + return 5000 * u->number; + default: + break; + } } + return 20 * u->number; } static void scramble(void *data, unsigned int n, size_t width) @@ -478,7 +482,7 @@ static void recruit(unit * u, struct order *ord, request ** recruitorders) init_order(ord); n = getint(); - if (n<=0) { + if (n <= 0) { syntax_error(u, ord); return; } @@ -796,7 +800,7 @@ static int maintain(building * b) cost -= use_pooled(u, m->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, - cost); + cost); assert(cost == 0); } if (work) { @@ -815,7 +819,7 @@ void maintain_buildings(region * r) while (*bp) { building *b = *bp; int flags = BLD_MAINTAINED; - + if (!curse_active(get_curse(b->attribs, nocost_ct))) { flags = maintain(b); } @@ -929,12 +933,12 @@ static void manufacture(unit * u, const item_type * itype, int want) case EBUILDINGREQ: ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "building_needed", "building", - itype->construction->btype->_name)); + itype->construction->btype->_name)); return; case ELOWSKILL: ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "manufacture_skills", - "skill minskill product", sk, minskill, itype->rtype, 1)); + "skill minskill product", sk, minskill, itype->rtype, 1)); return; case ENOMATERIALS: ADDMSG(&u->faction->msgs, msg_materials_required(u, u->thisorder, @@ -1077,8 +1081,8 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want) skill_t sk = itype->construction->skill; add_message(&u->faction->msgs, msg_feedback(u, u->thisorder, "manufacture_skills", - "skill minskill product", sk, itype->construction->minskill, - itype->rtype)); + "skill minskill product", sk, itype->construction->minskill, + itype->rtype)); return; } else { @@ -1276,7 +1280,7 @@ attrib_allocation(const resource_type * rtype, region * r, allocation * alist) } typedef void(*allocate_function) (const resource_type *, struct region *, -struct allocation *); + struct allocation *); static allocate_function get_allocator(const struct resource_type *rtype) { @@ -1345,7 +1349,7 @@ static void create_potion(unit * u, const potion_type * ptype, int want) case EBUILDINGREQ: ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "building_needed", "building", - ptype->itype->construction->btype->_name)); + ptype->itype->construction->btype->_name)); break; case ECOMPLETE: assert(0); @@ -1687,7 +1691,7 @@ static void buy(unit * u, request ** buyorders, struct order *ord) kwd = init_order(ord); assert(kwd == K_BUY); n = getint(); - if (n<=0) { + if (n <= 0) { cmistake(u, ord, 26, MSG_COMMERCE); return; } @@ -2082,7 +2086,7 @@ static bool sell(unit * u, request ** sellorders, struct order *ord) * produktion, wo für jedes produkt einzeln eine obere limite * existiert, so dass man arrays von orders machen kann. */ - /* Ein Händler kann nur 10 Güter pro Talentpunkt handeln. */ + /* Ein Händler kann nur 10 Güter pro Talentpunkt handeln. */ k = u->number * 10 * effskill(u, SK_TRADE, 0); /* hat der Händler bereits gehandelt, muss die Menge der bereits @@ -2188,7 +2192,7 @@ static void plant(unit * u, int raw) if (skill < 6) { ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "plant_skills", - "skill minskill product", SK_HERBALISM, 6, itype->rtype, 1)); + "skill minskill product", SK_HERBALISM, 6, itype->rtype, 1)); return; } /* Wasser des Lebens prüfen */ @@ -2202,7 +2206,7 @@ static void plant(unit * u, int raw) if (n == 0) { ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "resource_missing", "missing", - itype->rtype)); + itype->rtype)); return; } @@ -2218,7 +2222,7 @@ static void plant(unit * u, int raw) /* Alles ok. Abziehen. */ use_pooled(u, rt_water, GET_DEFAULT, 1); use_pooled(u, itype->rtype, GET_DEFAULT, n); - rsetherbs(r, (short) (rherbs(r) + planted)); + rsetherbs(r, (short)(rherbs(r) + planted)); ADDMSG(&u->faction->msgs, msg_message("plant", "unit region amount herb", u, r, planted, itype->rtype)); } @@ -2241,13 +2245,13 @@ static void planttrees(unit * u, int raw) if (skill < 6) { ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "plant_skills", - "skill minskill product", SK_HERBALISM, 6, rtype, 1)); + "skill minskill product", SK_HERBALISM, 6, rtype, 1)); return; } if (fval(r, RF_MALLORN) && skill < 7) { ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "plant_skills", - "skill minskill product", SK_HERBALISM, 7, rtype, 1)); + "skill minskill product", SK_HERBALISM, 7, rtype, 1)); return; } @@ -2284,7 +2288,7 @@ static void breedtrees(unit * u, int raw) int current_season; region *r = u->region; gamedate date; - + get_gamedate(turn, &date); current_season = date.season; @@ -2536,7 +2540,7 @@ static void steal_cmd(unit * u, struct order *ord, request ** stealorders) return; } id = read_unitid(u->faction, r); - if (id>0) { + if (id > 0) { u2 = findunitr(r, id); } if (u2 && u2->region == u->region) { diff --git a/src/guard.c b/src/guard.c index f779e7e2e..326b89bee 100644 --- a/src/guard.c +++ b/src/guard.c @@ -67,28 +67,34 @@ void update_guards(void) unsigned int guard_flags(const unit * u) { + // TODO: this should be a property of the race, like race.guard_flags + static int rc_cache; + static race *rc_elf, *rc_ent, *rc_ironkeeper; + const race *rc = u_race(u); unsigned int flags = GUARD_CREWS | GUARD_LANDING | GUARD_TRAVELTHRU | GUARD_TAX; + // TODO: configuration, not define #if GUARD_DISABLES_PRODUCTION == 1 flags |= GUARD_PRODUCE; #endif #if GUARD_DISABLES_RECRUIT == 1 flags |= GUARD_RECRUIT; #endif - switch (old_race(u_race(u))) { - case RC_ELF: - if (u->faction->race != u_race(u)) - break; - /* else fallthrough */ - case RC_TREEMAN: + if (rc_changed(&rc_cache)) { + rc_elf = get_race(RC_ELF); + rc_ent = get_race(RC_TREEMAN); + rc_ironkeeper = get_race(RC_IRONKEEPER); + } + if (rc == rc_elf) { + if (u->faction->race == u_race(u)) { + flags |= GUARD_TREES; + } + } + else if (rc == rc_ent) { flags |= GUARD_TREES; - break; - case RC_IRONKEEPER: + } + else if (rc == rc_ironkeeper) { flags = GUARD_MINING; - break; - default: - /* TODO: This should be configuration variables, all of it */ - break; } return flags; } diff --git a/src/kernel/race.h b/src/kernel/race.h index 6e8e4bd36..d11dc5fd1 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -244,7 +244,7 @@ extern "C" { #define omniscient(f) ((f)->race==get_race(RC_ILLUSION) || (f)->race==get_race(RC_TEMPLATE)) #define playerrace(rc) (!fval((rc), RCF_NPC)) -#define dragonrace(rc) ((rc) == get_race(RC_FIREDRAGON) || (rc) == get_race(RC_DRAGON) || (rc) == get_race(RC_WYRM) || (rc) == get_race(RC_BIRTHDAYDRAGON)) +#define dragonrace(rc) (fval(rc, RCF_DRAGON)) #define humanoidrace(rc) (fval((rc), RCF_UNDEAD) || (rc)==get_race(RC_DRACOID) || playerrace(rc)) #define illusionaryrace(rc) (fval(rc, RCF_ILLUSIONARY))