new loot and give rules

This commit is contained in:
Enno Rehling 2009-09-13 13:39:18 +00:00
parent 79cebe53c4
commit 871088807a
3 changed files with 74 additions and 20 deletions

View File

@ -80,6 +80,31 @@ add_give(unit * u, unit * u2, int n, const resource_type * rtype, struct order *
}
}
int give_quota(const unit * src, const unit * dst, const item_type * type, int n)
{
static float divisor = -1;
if (dst && src && src->faction!=dst->faction) {
if (divisor<0) {
divisor = get_param_flt(global.parameters, "rules.items.give_divisor", 1);
assert(divisor==0 || divisor>=1);
}
if (divisor>=1) {
/* predictable > correct: */
#if 0
double r = n / divisor;
int x = (int)r;
r = r - x;
if (chance(r)) ++x;
#else
int x = (int)(n/divisor);
#endif
return x;
}
}
return n;
}
int
give_item(int want, const item_type * itype, unit * src, unit * dest, struct order * ord)
{

View File

@ -129,6 +129,7 @@ static int skill_formula = 0;
#define LOOT_MONSTERS (1<<0)
#define LOOT_SELF (1<<1) /* code is mutually exclusive with LOOT_OTHERS */
#define LOOT_OTHERS (1<<2)
#define LOOT_KEEPLOOT (1<<4)
#define DAMAGE_CRITICAL (1<<0)
#define DAMAGE_MELEE_BONUS (1<<1)
@ -140,7 +141,7 @@ static int skill_formula = 0;
static void
static_rules(void)
{
loot_rules = get_param_int(global.parameters, "rules.combat.loot", LOOT_MONSTERS|LOOT_OTHERS);
loot_rules = get_param_int(global.parameters, "rules.combat.loot", LOOT_MONSTERS|LOOT_OTHERS|LOOT_KEEPLOOT);
/* new formula to calculate to-hit-chance */
skill_formula = get_param_int(global.parameters, "rules.combat.skill_formula", FORMULA_ORIG);
/* maximum number of combat turns */
@ -2484,6 +2485,28 @@ select_ally(fighter * af, int minrow, int maxrow, int allytype)
return no_troop;
}
static int loot_quota(const unit * src, const unit * dst, const item_type * type, int n)
{
static float divisor = -1;
if (dst && src && src->faction!=dst->faction) {
if (divisor<0) {
divisor = get_param_flt(global.parameters, "rules.items.loot_divisor", 1);
assert(divisor==0 || divisor>=1);
}
if (divisor>=1) {
double r = n / divisor;
int x = (int)r;
r = r - x;
if (chance(r)) ++x;
return x;
}
}
return n;
}
static void
loot_items(fighter * corpse)
{
@ -2506,6 +2529,8 @@ loot_items(fighter * corpse)
fighter *fig = NULL;
int looting = 0;
int maxrow = 0;
/* mustloot: we absolutely, positively must have somebody loot this thing */
int mustloot = itm->type->flags & (ITF_CURSED|ITF_NOTLOST);
itm->number -= loot;
maxloot -= loot;
@ -2518,39 +2543,41 @@ loot_items(fighter * corpse)
looting = 2;
}
if (looting) {
if (itm->type->flags & (ITF_CURSED|ITF_NOTLOST)) {
if (mustloot) {
maxrow = LAST_ROW;
} else {
} else if (loot_rules&LOOT_KEEPLOOT) {
int lootchance = 50 + b->keeploot;
if (rng_int() % 100 < lootchance) {
maxrow = BEHIND_ROW;
}
} else {
maxrow = LAST_ROW;
}
}
if (maxrow>0) {
if (looting==1) {
/* enemies get dibs */
fig = select_enemy(corpse, FIGHT_ROW, maxrow, 0).fighter;
} else if (looting==2) {
}
if (!fig) {
/* self and allies get second pick */
fig = select_ally(corpse, FIGHT_ROW, LAST_ROW, ALLY_SELF).fighter;
} else if (itm->type->flags & (ITF_CURSED|ITF_NOTLOST)) {
/* we absolutely, positively must have somebody loot this thing */
fig = select_enemy(corpse, FIGHT_ROW, maxrow, 0).fighter;
if (!fig) {
fig = select_ally(corpse, FIGHT_ROW, LAST_ROW, ALLY_SELF).fighter;
}
}
}
if (fig) {
item * l = fig->loot;
while (l && l->type!=itm->type) l=l->next;
if (!l) {
l = calloc(sizeof(item), 1);
l->next = fig->loot;
fig->loot = l;
l->type = itm->type;
int trueloot = mustloot?loot:loot_quota(corpse->unit, fig->unit, itm->type, loot);
if (trueloot>0) {
item * l = fig->loot;
while (l && l->type!=itm->type) l=l->next;
if (!l) {
l = calloc(sizeof(item), 1);
l->next = fig->loot;
fig->loot = l;
l->type = itm->type;
}
l->number += trueloot;
}
l->number += loot;
}
}
}

View File

@ -148,7 +148,9 @@
<param name="rules.combat.herospeed" value="3"/>
<param name="rules.combat.demon_vampire" value="5"/> <!-- regen 1 hp per X points of damage done -->
<param name="rules.combat.skill_bonus" value="0"/>
<param name="rules.combat.loot" value="3"/> <!-- only self + monsters -->
<param name="rules.combat.loot" value="5"/> <!-- only self + others - keeploot -->
<param name="rules.items.loot_divisor" value="4"/> <!-- damage skims off 3/4 of goods transfers -->
<param name="rules.items.give_divisor" value="3"/> <!-- corruption skims off 2/3 of goods transfers -->
<param name="rules.move.owner_leave" value="1"/> <!-- owner must leave before moving -->
<param name="rules.cavalry.skill" value="2"/>
<param name="rules.cavalry.mode" value="1"/>
@ -167,7 +169,7 @@
<param name="rules.economy.roqf" value="5"/>
<param name="rules.economy.herbrot" value="0"/>
<param name="rules.nmr.destroy" value="1"/>
<param name="rules.give" value="15"/> <!-- self + peasants + herbs + lux - goods -->
<!--param name="rules.give" value="15"/ --> <!-- self + peasants + herbs + lux - goods -->
<param name="rules.economy.grow" value="1"/>
<param name="rules.tactics.formula" value="1"/> <!-- 10% per skilldiff -->
<param name="rules.help.mask" value="fight guard money give"/>