Erstmal nur der Burgenbonus

Das mit der Größe kommt noch mal extra, der Übersicht wegen.
Sinvoller weise kann man den Bonus jetzt in der castle.xml einstellen.
Mit neuen Defaultwerten in den XML Dateien.
This commit is contained in:
CTD 2015-01-09 15:53:14 +01:00
parent 90f4ed9753
commit ac3195851a
11 changed files with 63 additions and 61 deletions

View File

@ -1,24 +1,24 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<building name="castle" capacity="1"> <building name="castle" capacity="1">
<function name="name" value="castle_name_2"/> <function name="name" value="castle_name_2"/>
<function name="protection" value="lua_building_protection"/> <function name="protection" value="building_protection"/>
<function name="taxes" value="lua_building_taxes"/> <function name="taxes" value="lua_building_taxes"/>
<construction skill="building" minskill="1" maxsize="10" reqsize="1"> <construction skill="building" minskill="1" maxsize="10" reqsize="1" prot="0">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="2" maxsize="40" reqsize="1"> <construction skill="building" minskill="2" maxsize="40" reqsize="1" prot="1">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="3" maxsize="200" reqsize="1"> <construction skill="building" minskill="3" maxsize="200" reqsize="1" prot="3">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="4" maxsize="1000" reqsize="1"> <construction skill="building" minskill="4" maxsize="1000" reqsize="1" prot="5">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="5" maxsize="5000" reqsize="1"> <construction skill="building" minskill="5" maxsize="5000" reqsize="1" prot="8">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="6" reqsize="1"> <construction skill="building" minskill="6" reqsize="1" prot="12">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
</building> </building>

View File

@ -1,26 +1,26 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<building name="castle" capacity="1"> <building name="castle" capacity="1">
<function name="name" value="castle_name"/> <function name="name" value="castle_name"/>
<function name="protection" value="eressea_building_protection"/> <function name="protection" value="building_protection"/>
<construction skill="building" minskill="1" maxsize="2" reqsize="1"> <construction skill="building" minskill="1" maxsize="2" reqsize="1" prot="0">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="1" maxsize="8" reqsize="1"> <construction skill="building" minskill="1" maxsize="8" reqsize="1" prot="0">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="2" maxsize="40" reqsize="1"> <construction skill="building" minskill="2" maxsize="40" reqsize="1" prot="1">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="3" maxsize="200" reqsize="1"> <construction skill="building" minskill="3" maxsize="200" reqsize="1" prot="3">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="4" maxsize="1000" reqsize="1"> <construction skill="building" minskill="4" maxsize="1000" reqsize="1" prot="5">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="5" maxsize="5000" reqsize="1"> <construction skill="building" minskill="5" maxsize="5000" reqsize="1" prot="8">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="6" reqsize="1"> <construction skill="building" minskill="6" reqsize="1" prot="12">
<requirement type="stone" quantity="1"/> <requirement type="stone" quantity="1"/>
</construction> </construction>
</building> </building>

View File

@ -5,15 +5,15 @@
<building name="watch" capacity="1" maxsize="10"> <building name="watch" capacity="1" maxsize="10">
<function name="name" value="fort_name"/> <function name="name" value="fort_name"/>
<function name="protection" value="lua_building_protection"/> <function name="protection" value="building_protection"/>
<function name="taxes" value="lua_building_taxes"/> <function name="taxes" value="lua_building_taxes"/>
<construction skill="building" minskill="1" maxsize="5" reqsize="1"> <construction skill="building" minskill="1" maxsize="5" reqsize="1" prot="0">
<requirement type="log" quantity="1"/> <requirement type="log" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="2" maxsize="5" reqsize="1"> <construction skill="building" minskill="2" maxsize="5" reqsize="1" prot="1">
<requirement type="log" quantity="1"/> <requirement type="log" quantity="1"/>
</construction> </construction>
<construction skill="building" minskill="2" reqsize="1"> <construction skill="building" minskill="2" reqsize="1" prot="2">
<requirement type="log" quantity="1"/> <requirement type="log" quantity="1"/>
</construction> </construction>
</building> </building>

View File

@ -26,10 +26,6 @@ function item_canuse(u, iname)
return true return true
end end
function building_protection(b, u)
return 1
end
function building_taxes(b, blevel) function building_taxes(b, blevel)
btype = b.type btype = b.type
if btype=="castle" then if btype=="castle" then

View File

@ -1901,7 +1901,7 @@ int skilldiff(troop at, troop dt, int dist)
init = true; init = true;
} }
if (df->building->type->protection) { if (df->building->type->protection) {
int beff = df->building->type->protection(df->building, du); int beff = df->building->type->protection(df->building, du, DEFENSE_BONUS);
if (beff) { if (beff) {
skdiff -= beff; skdiff -= beff;
is_protected = 2; is_protected = 2;
@ -1918,7 +1918,7 @@ int skilldiff(troop at, troop dt, int dist)
if (magicwalls_ct if (magicwalls_ct
&& curse_active(get_curse(df->building->attribs, magicwalls_ct))) { && curse_active(get_curse(df->building->attribs, magicwalls_ct))) {
/* Verdoppelt Burgenbonus */ /* Verdoppelt Burgenbonus */
skdiff -= buildingeffsize(df->building, false); skdiff -= df->building->type->protection(df->building, du, DEFENSE_BONUS);
} }
} }
/* Goblin-Verteidigung /* Goblin-Verteidigung

View File

@ -57,7 +57,7 @@ static void test_make_fighter(CuTest * tc)
test_cleanup(); test_cleanup();
} }
static int add_two(building * b, unit * u) { static int add_two(building * b, unit * u, buildingbonus bonus) {
return 2; return 2;
} }

View File

@ -388,32 +388,6 @@ static void lua_agebuilding(building * b)
} }
} }
static int lua_building_protection(building * b, unit * u)
{
lua_State *L = (lua_State *) global.vm_state;
const char *fname = "building_protection";
int result = 0;
lua_getglobal(L, fname);
if (lua_isfunction(L, -1)) {
tolua_pushusertype(L, (void *)b, TOLUA_CAST "building");
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
if (lua_pcall(L, 2, 1, 0) != 0) {
const char *error = lua_tostring(L, -1);
log_error("building_protection(%s, %s) calling '%s': %s.\n", buildingname(b), unitname(u), fname, error);
lua_pop(L, 1);
} else {
result = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
}
} else {
log_error("building_protection(%s, %s) calling '%s': not a function.\n", buildingname(b), unitname(u), fname);
lua_pop(L, 1);
}
return result;
}
static double lua_building_taxes(building * b, int level) static double lua_building_taxes(building * b, int level)
{ {
lua_State *L = (lua_State *) global.vm_state; lua_State *L = (lua_State *) global.vm_state;

View File

@ -45,6 +45,9 @@ extern "C" {
int maxsize; /* maximum size of this type */ int maxsize; /* maximum size of this type */
int reqsize; /* size of object using up 1 set of requirement. */ int reqsize; /* size of object using up 1 set of requirement. */
int prot; /* protection bonus (defense) during combat */
int ccbonus; /* close combat attack bonus*/
int rangedbonus; /* ranged attack bonus */
requirement *materials; /* material req'd to build one object */ requirement *materials; /* material req'd to build one object */
const struct building_type *btype; const struct building_type *btype;
/* building type required to make this thing */ /* building type required to make this thing */

View File

@ -316,12 +316,32 @@ const building_type *findbuildingtype(const char *name,
return (const building_type *)type.v; return (const building_type *)type.v;
} }
static int eressea_building_protection(building * b, unit * u) static int building_protection(building * b, unit * u, buildingbonus bonus)
{ {
int beff = buildingeffsize(b, false) - 1;
/* -1 because the tradepost has no protection value */
return beff; int i = 0;
int bsize = buildingeffsize(b, false);
const construction *cons = b->type->construction;
if (!cons || !cons->improvement) {
return 0;
}
for (i = 0; i < bsize; i++)
{
cons = cons->improvement;
}
switch (bonus)
{
case DEFENSE_BONUS:
return cons->prot;
case CC_ATTACK_BONUS:
return cons->ccbonus;
case RANGED_ATTACK_BONUS:
return cons->rangedbonus;
default:
return 0;
}
} }
static int meropis_building_protection(building * b, unit * u) static int meropis_building_protection(building * b, unit * u)
@ -331,8 +351,8 @@ static int meropis_building_protection(building * b, unit * u)
void register_buildings(void) void register_buildings(void)
{ {
register_function((pf_generic)& eressea_building_protection, register_function((pf_generic)& building_protection,
"eressea_building_protection"); "building_protection");
register_function((pf_generic)& meropis_building_protection, register_function((pf_generic)& meropis_building_protection,
"meropis_building_protection"); "meropis_building_protection");
register_function((pf_generic)& init_smithy, "init_smithy"); register_function((pf_generic)& init_smithy, "init_smithy");

View File

@ -48,6 +48,12 @@ extern "C" {
#define BTF_ONEPERTURN 0x80 /* one one sizepoint can be added per turn */ #define BTF_ONEPERTURN 0x80 /* one one sizepoint can be added per turn */
#define BTF_NAMECHANGE 0x100 /* name and description can be changed more than once */ #define BTF_NAMECHANGE 0x100 /* name and description can be changed more than once */
typedef enum {
DEFENSE_BONUS,
CC_ATTACK_BONUS,
RANGED_ATTACK_BONUS,
} buildingbonus;
typedef struct building_type { typedef struct building_type {
char *_name; char *_name;
@ -66,7 +72,7 @@ extern "C" {
const struct building * b, int size); const struct building * b, int size);
void (*init) (struct building_type *); void (*init) (struct building_type *);
void (*age) (struct building *); void (*age) (struct building *);
int (*protection) (struct building *, struct unit *); int (*protection) (struct building *, struct unit *, buildingbonus);
double (*taxes) (const struct building *, int size); double (*taxes) (const struct building *, int size);
struct attrib *attribs; struct attrib *attribs;
} building_type; } building_type;

View File

@ -167,6 +167,9 @@ construction ** consPtr)
con->maxsize = xml_ivalue(node, "maxsize", -1); con->maxsize = xml_ivalue(node, "maxsize", -1);
con->minskill = xml_ivalue(node, "minskill", -1); con->minskill = xml_ivalue(node, "minskill", -1);
con->reqsize = xml_ivalue(node, "reqsize", -1); con->reqsize = xml_ivalue(node, "reqsize", -1);
con->prot = xml_ivalue(node, "prot", 0);
con->ccbonus = xml_ivalue(node, "ccbonus", 0);
con->rangedbonus = xml_ivalue(node, "rangedbonus", 0);
propValue = xmlGetProp(node, BAD_CAST "building"); propValue = xmlGetProp(node, BAD_CAST "building");
if (propValue != NULL) { if (propValue != NULL) {
@ -297,7 +300,7 @@ static int parse_buildings(xmlDocPtr doc)
btype->age = (void(*)(struct building *))fun; btype->age = (void(*)(struct building *))fun;
} }
else if (strcmp((const char *)propValue, "protection") == 0) { else if (strcmp((const char *)propValue, "protection") == 0) {
btype->protection = (int(*)(struct building *, struct unit *))fun; btype->protection = (int(*)(struct building *, struct unit *, buildingbonus))fun;
} }
else if (strcmp((const char *)propValue, "taxes") == 0) { else if (strcmp((const char *)propValue, "taxes") == 0) {
btype->taxes = (double(*)(const struct building *, int))fun; btype->taxes = (double(*)(const struct building *, int))fun;