forked from github/server
limiting items to specific races
This commit is contained in:
parent
37fa742bae
commit
0bdb05270e
4 changed files with 53 additions and 7 deletions
|
@ -636,6 +636,14 @@ select_weapon(const troop t, boolean attacking, boolean ismissile)
|
||||||
return preferred_weapon(t, attacking);
|
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
|
static int
|
||||||
weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
|
weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
|
||||||
/* the 'pure' skill when using this weapon to attack or defend.
|
/* 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);
|
skill = effskill(u, SK_WEAPONLESS);
|
||||||
if (skill<=0) {
|
if (skill<=0) {
|
||||||
/* wenn kein waffenloser kampf, dann den rassen-defaultwert */
|
/* 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 sword = effskill(u, SK_MELEE);
|
||||||
int spear = effskill(u, SK_SPEAR);
|
int spear = effskill(u, SK_SPEAR);
|
||||||
skill = MAX(sword, spear) - 3;
|
skill = MAX(sword, spear) - 3;
|
||||||
|
@ -680,10 +688,11 @@ weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* changed: if we own a weapon, we have at least a skill of 0 */
|
/* 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);
|
skill = effskill(u, wtype->skill);
|
||||||
if (skill < wtype->minskill) skill = 0;
|
if (skill < wtype->minskill) skill = 0;
|
||||||
if (skill > 0) {
|
if (skill > 0) {
|
||||||
if(attacking) {
|
if (attacking) {
|
||||||
skill += u->race->at_bonus;
|
skill += u->race->at_bonus;
|
||||||
} else {
|
} else {
|
||||||
skill += u->race->df_bonus;
|
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;
|
if (wtype==NULL || itm->number==0) continue;
|
||||||
weapons[w].attackskill = weapon_skill(wtype, u, true);
|
weapons[w].attackskill = weapon_skill(wtype, u, true);
|
||||||
weapons[w].defenseskill = weapon_skill(wtype, u, false);
|
weapons[w].defenseskill = weapon_skill(wtype, u, false);
|
||||||
weapons[w].type = wtype;
|
if (weapons[w].attackskill>=0 || weapons[w].defenseskill>=0) {
|
||||||
weapons[w].used = 0;
|
weapons[w].type = wtype;
|
||||||
weapons[w].count = itm->number;
|
weapons[w].used = 0;
|
||||||
++w;
|
weapons[w].count = itm->number;
|
||||||
|
++w;
|
||||||
|
}
|
||||||
assert(w!=WMAX);
|
assert(w!=WMAX);
|
||||||
}
|
}
|
||||||
fig->weapons = calloc(sizeof(weapon), w+1);
|
fig->weapons = calloc(sizeof(weapon), w+1);
|
||||||
|
|
|
@ -127,6 +127,7 @@ typedef struct item_type {
|
||||||
int capacity;
|
int capacity;
|
||||||
struct construction * construction;
|
struct construction * construction;
|
||||||
/* --- functions --- */
|
/* --- 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 (*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 (*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);
|
int (*give)(struct unit * src, struct unit * dest, const struct item_type * itm, int number, struct order * ord);
|
||||||
|
|
|
@ -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;
|
itype->give = (int (*)(struct unit*, struct unit*, const struct item_type *, int, struct order *))fun;
|
||||||
} else if (strcmp((const char*)propValue, "use")==0) {
|
} else if (strcmp((const char*)propValue, "use")==0) {
|
||||||
itype->use = (int (*)(struct unit *, const struct item_type *, int, struct order *))fun;
|
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) {
|
} 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 {
|
} else {
|
||||||
log_error(("unknown function type '%s' for item '%s'\n",
|
log_error(("unknown function type '%s' for item '%s'\n",
|
||||||
(const char*)propValue, rtype->_name[0]));
|
(const char*)propValue, rtype->_name[0]));
|
||||||
|
|
|
@ -313,6 +313,37 @@ lua_getresource(unit * u, const struct resource_type * rtype)
|
||||||
return result;
|
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
|
static int
|
||||||
lua_wage(const region * r, const faction * f, const race * rc)
|
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_function((pf_generic)&lua_initfamiliar, "lua_initfamiliar");
|
||||||
register_item_use(&lua_useitem, "lua_useitem");
|
register_item_use(&lua_useitem, "lua_useitem");
|
||||||
register_function((pf_generic)&lua_getresource, "lua_getresource");
|
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_changeresource, "lua_changeresource");
|
||||||
register_function((pf_generic)&lua_equipmentcallback, "lua_equip");
|
register_function((pf_generic)&lua_equipmentcallback, "lua_equip");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue