limiting items to specific races

This commit is contained in:
Enno Rehling 2009-06-03 21:56:57 +00:00
parent 37fa742bae
commit 0bdb05270e
4 changed files with 53 additions and 7 deletions

View File

@ -636,6 +636,14 @@ select_weapon(const troop t, boolean attacking, boolean ismissile)
return preferred_weapon(t, attacking);
}
static boolean can_use(const unit * u, const weapon_type * wtype)
{
if (wtype->itype->canuse) {
return wtype->itype->canuse(u, wtype->itype);
}
return true;
}
static int
weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
/* the 'pure' skill when using this weapon to attack or defend.
@ -648,7 +656,7 @@ weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
skill = effskill(u, SK_WEAPONLESS);
if (skill<=0) {
/* wenn kein waffenloser kampf, dann den rassen-defaultwert */
if(u->race == new_race[RC_URUK]) {
if (u->race == new_race[RC_URUK]) {
int sword = effskill(u, SK_MELEE);
int spear = effskill(u, SK_SPEAR);
skill = MAX(sword, spear) - 3;
@ -680,10 +688,11 @@ weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
}
} else {
/* changed: if we own a weapon, we have at least a skill of 0 */
if (!can_use(u, wtype)) return -1;
skill = effskill(u, wtype->skill);
if (skill < wtype->minskill) skill = 0;
if (skill > 0) {
if(attacking) {
if (attacking) {
skill += u->race->at_bonus;
} else {
skill += u->race->df_bonus;
@ -3220,10 +3229,12 @@ make_fighter(battle * b, unit * u, side * s1, boolean attack)
if (wtype==NULL || itm->number==0) continue;
weapons[w].attackskill = weapon_skill(wtype, u, true);
weapons[w].defenseskill = weapon_skill(wtype, u, false);
weapons[w].type = wtype;
weapons[w].used = 0;
weapons[w].count = itm->number;
++w;
if (weapons[w].attackskill>=0 || weapons[w].defenseskill>=0) {
weapons[w].type = wtype;
weapons[w].used = 0;
weapons[w].count = itm->number;
++w;
}
assert(w!=WMAX);
}
fig->weapons = calloc(sizeof(weapon), w+1);

View File

@ -127,6 +127,7 @@ typedef struct item_type {
int capacity;
struct construction * construction;
/* --- functions --- */
int (*canuse)(const struct unit * user, const struct item_type * itype);
int (*use)(struct unit * user, const struct item_type * itype, int amount, struct order * ord);
int (*useonother)(struct unit * user, int targetno, const struct item_type * itype, int amount, struct order * ord);
int (*give)(struct unit * src, struct unit * dest, const struct item_type * itm, int number, struct order * ord);

View File

@ -862,8 +862,10 @@ xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype)
itype->give = (int (*)(struct unit*, struct unit*, const struct item_type *, int, struct order *))fun;
} else if (strcmp((const char*)propValue, "use")==0) {
itype->use = (int (*)(struct unit *, const struct item_type *, int, struct order *))fun;
} else if (strcmp((const char*)propValue, "canuse")==0) {
itype->canuse = (int (*)(const struct unit *, const struct item_type *))fun;
} else if (strcmp((const char*)propValue, "useonother")==0) {
itype->useonother = (int (*)(struct unit *, int targetno, const struct item_type *, int, struct order *))fun;
itype->useonother = (int (*)(struct unit *, int, const struct item_type *, int, struct order *))fun;
} else {
log_error(("unknown function type '%s' for item '%s'\n",
(const char*)propValue, rtype->_name[0]));

View File

@ -313,6 +313,37 @@ lua_getresource(unit * u, const struct resource_type * rtype)
return result;
}
static int
lua_canuse_item(const unit * u, const struct item_type * itype)
{
lua_State * L = (lua_State *)global.vm_state;
int result = -1;
const char * fname = "item_canuse";
lua_pushstring(L, fname);
lua_rawget(L, LUA_GLOBALSINDEX);
if (lua_isfunction(L, 1)) {
tolua_pushusertype(L, (void *)u, "unit");
tolua_pushstring(L, itype->rtype->_name[0]);
if (lua_pcall(L, 2, 1, 0)!=0) {
const char* error = lua_tostring(L, -1);
log_error(("get(%s) calling '%s': %s.\n",
unitname(u), fname, error));
lua_pop(L, 1);
} else {
result = lua_toboolean(L, -1);
lua_pop(L, 1);
}
} else {
log_error(("get(%s) calling '%s': not a function.\n",
unitname(u), fname));
lua_pop(L, 1);
}
return result;
}
static int
lua_wage(const region * r, const faction * f, const race * rc)
{
@ -505,6 +536,7 @@ register_tolua_helpers(void)
register_function((pf_generic)&lua_initfamiliar, "lua_initfamiliar");
register_item_use(&lua_useitem, "lua_useitem");
register_function((pf_generic)&lua_getresource, "lua_getresource");
register_function((pf_generic)&lua_canuse_item, "lua_canuse_item");
register_function((pf_generic)&lua_changeresource, "lua_changeresource");
register_function((pf_generic)&lua_equipmentcallback, "lua_equip");