forked from github/server
commit
f0fc37bd69
|
@ -1,24 +0,0 @@
|
||||||
<?xml version="1.0"?>
|
|
||||||
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
||||||
|
|
||||||
<xi:include href="config://game/familiars.xml"/>
|
|
||||||
<xi:include href="config://game/equipment.xml"/>
|
|
||||||
<equipment>
|
|
||||||
<set name="autoseed_unit">
|
|
||||||
<item name="log" amount="50"/>
|
|
||||||
<item name="stone" amount="50"/>
|
|
||||||
<item name="iron" amount="50"/>
|
|
||||||
<item name="laen" amount="10"/>
|
|
||||||
<item name="sword" amount="1"/>
|
|
||||||
<item name="mallorn" amount="10"/>
|
|
||||||
<item name="skillpotion" amount="5"/>
|
|
||||||
<item name="p2" amount="5"/>
|
|
||||||
<item name="money" amount="20000"/>
|
|
||||||
<skill name="perception" level="30"/>
|
|
||||||
<skill name="melee" level="1"/>
|
|
||||||
</set>
|
|
||||||
<set name="autoseed_faction">
|
|
||||||
<item name="adamantium" amount="1"/>
|
|
||||||
</set>
|
|
||||||
</equipment>
|
|
||||||
</eressea>
|
|
2
s/setup
2
s/setup
|
@ -56,7 +56,7 @@ done
|
||||||
[ -z $INIFILE ] && INIFILE=$TOOLS/inifile
|
[ -z $INIFILE ] && INIFILE=$TOOLS/inifile
|
||||||
[ -e $INIFILE ] || INIFILE=$TOOLS/iniparser/inifile
|
[ -e $INIFILE ] || INIFILE=$TOOLS/iniparser/inifile
|
||||||
|
|
||||||
[ -e $SOURCE/conf/$rules/config.xml ] || abort "cannot find conf/$rules/config.xml"
|
[ -e $SOURCE/conf/$rules/config.json ] || abort "cannot find conf/$rules/config.json"
|
||||||
|
|
||||||
cd $ERESSEA
|
cd $ERESSEA
|
||||||
if [ -d $dir ] ; then
|
if [ -d $dir ] ; then
|
||||||
|
|
|
@ -1066,3 +1066,48 @@ function test_give_silver()
|
||||||
assert_equal(21, r:get_resource("money"))
|
assert_equal(21, r:get_resource("money"))
|
||||||
assert_equal(10, u:get_item("money"))
|
assert_equal(10, u:get_item("money"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function test_give_horses()
|
||||||
|
local r = region.create(0, 0, "plain")
|
||||||
|
local f = create_faction('human')
|
||||||
|
local u = unit.create(f, r, 1)
|
||||||
|
|
||||||
|
r:set_resource("horse", 0)
|
||||||
|
u:add_item("horse", 21)
|
||||||
|
u:add_item("dolphin", 10)
|
||||||
|
u:add_order("GIB 0 7 PFERD")
|
||||||
|
u:add_order("GIB 0 5 DELPHIN")
|
||||||
|
process_orders()
|
||||||
|
assert_equal(7, r:get_resource("horse"))
|
||||||
|
assert_equal(5, u:get_item("dolphin"))
|
||||||
|
assert_equal(14, u:get_item("horse"))
|
||||||
|
end
|
||||||
|
|
||||||
|
function test_give_silver()
|
||||||
|
local r = region.create(0, 0, "plain")
|
||||||
|
local f = create_faction('human')
|
||||||
|
local u = unit.create(f, r, 1)
|
||||||
|
|
||||||
|
r:set_resource("peasant", 0)
|
||||||
|
r:set_resource("money", 11)
|
||||||
|
u:clear_orders()
|
||||||
|
u:add_item("money", 20)
|
||||||
|
u:add_order("GIB 0 10 SILBER")
|
||||||
|
process_orders()
|
||||||
|
assert_equal(21, r:get_resource("money"))
|
||||||
|
assert_equal(10, u:get_item("money"))
|
||||||
|
end
|
||||||
|
|
||||||
|
function test_build_castle()
|
||||||
|
local r = region.create(0, 0, "plain")
|
||||||
|
local f = create_faction('human')
|
||||||
|
local u = unit.create(f, r, 1)
|
||||||
|
|
||||||
|
u:add_item('stone', 1)
|
||||||
|
u:set_skill('building', 1)
|
||||||
|
u:add_order("MACHE BURG")
|
||||||
|
process_orders()
|
||||||
|
assert_not_nil(u.building)
|
||||||
|
assert_equal(1, u.building.size)
|
||||||
|
assert_equal(u.building.name, "Burg")
|
||||||
|
end
|
||||||
|
|
|
@ -1416,9 +1416,6 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (r->land) {
|
|
||||||
print_items(F, r->land->items, f->locale);
|
|
||||||
}
|
|
||||||
cr_output_curses_compat(F, f, r, TYP_REGION);
|
cr_output_curses_compat(F, f, r, TYP_REGION);
|
||||||
cr_borders(r, f, r->seen.mode, F);
|
cr_borders(r, f, r->seen.mode, F);
|
||||||
if (r->seen.mode == seen_unit && is_astral(r)
|
if (r->seen.mode == seen_unit && is_astral(r)
|
||||||
|
|
172
src/helpers.c
172
src/helpers.c
|
@ -211,43 +211,6 @@ static int lua_callspell(castorder * co, const char *fname)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** callback to initialize a familiar from lua. */
|
|
||||||
static int lua_initfamiliar(unit * u)
|
|
||||||
{
|
|
||||||
lua_State *L = (lua_State *)global.vm_state;
|
|
||||||
char fname[64];
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
strlcpy(fname, "initfamiliar_", sizeof(fname));
|
|
||||||
strlcat(fname, u_race(u)->_name, sizeof(fname));
|
|
||||||
|
|
||||||
lua_getglobal(L, fname);
|
|
||||||
if (lua_isfunction(L, -1)) {
|
|
||||||
tolua_pushusertype(L, u, TOLUA_CAST "unit");
|
|
||||||
|
|
||||||
if (lua_pcall(L, 1, 1, 0) != 0) {
|
|
||||||
const char *error = lua_tostring(L, -1);
|
|
||||||
log_error("familiar(%s) calling '%s': %s.\n", unitname(u), fname, error);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = (int)lua_tonumber(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_warning("familiar(%s) calling '%s': not a function.\n", unitname(u), fname);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
create_mage(u, M_GRAY);
|
|
||||||
|
|
||||||
strlcpy(fname, u_race(u)->_name, sizeof(fname));
|
|
||||||
strlcat(fname, "_familiar", sizeof(fname));
|
|
||||||
equip_unit(u, get_equipment(fname));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lua_changeresource(unit * u, const struct resource_type *rtype, int delta)
|
lua_changeresource(unit * u, const struct resource_type *rtype, int delta)
|
||||||
{
|
{
|
||||||
|
@ -281,127 +244,6 @@ lua_changeresource(unit * u, const struct resource_type *rtype, int delta)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lua_getresource(unit * u, const struct resource_type *rtype)
|
|
||||||
{
|
|
||||||
lua_State *L = (lua_State *)global.vm_state;
|
|
||||||
int result = -1;
|
|
||||||
char fname[64];
|
|
||||||
|
|
||||||
strlcpy(fname, rtype->_name, sizeof(fname));
|
|
||||||
strlcat(fname, "_getresource", sizeof(fname));
|
|
||||||
|
|
||||||
lua_getglobal(L, fname);
|
|
||||||
if (lua_isfunction(L, -1)) {
|
|
||||||
tolua_pushusertype(L, u, TOLUA_CAST "unit");
|
|
||||||
|
|
||||||
if (lua_pcall(L, 1, 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 = (int)lua_tonumber(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, int in_turn)
|
|
||||||
{
|
|
||||||
lua_State *L = (lua_State *)global.vm_state;
|
|
||||||
const char *fname = "wage";
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
lua_getglobal(L, fname);
|
|
||||||
if (lua_isfunction(L, -1)) {
|
|
||||||
tolua_pushusertype(L, (void *)r, TOLUA_CAST "region");
|
|
||||||
tolua_pushusertype(L, (void *)f, TOLUA_CAST "faction");
|
|
||||||
tolua_pushstring(L, rc ? rc->_name : 0);
|
|
||||||
lua_pushinteger(L, in_turn);
|
|
||||||
|
|
||||||
if (lua_pcall(L, 3, 1, 0) != 0) {
|
|
||||||
const char *error = lua_tostring(L, -1);
|
|
||||||
log_error("wage(%s) calling '%s': %s.\n", regionname(r, NULL), fname, error);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = (int)lua_tonumber(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_error("wage(%s) calling '%s': not a function.\n", regionname(r, NULL), fname);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lua_maintenance(const unit * u)
|
|
||||||
{
|
|
||||||
lua_State *L = (lua_State *)global.vm_state;
|
|
||||||
const char *fname = "maintenance";
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
lua_getglobal(L, fname);
|
|
||||||
if (lua_isfunction(L, -1)) {
|
|
||||||
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
|
|
||||||
|
|
||||||
if (lua_pcall(L, 1, 1, 0) != 0) {
|
|
||||||
const char *error = lua_tostring(L, -1);
|
|
||||||
log_error("maintenance(%s) calling '%s': %s.\n", unitname(u), fname, error);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = (int)lua_tonumber(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_error("maintenance(%s) calling '%s': not a function.\n", unitname(u), fname);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lua_equipmentcallback(const struct equipment *eq, unit * u)
|
|
||||||
{
|
|
||||||
lua_State *L = (lua_State *)global.vm_state;
|
|
||||||
char fname[64];
|
|
||||||
int result = -1;
|
|
||||||
|
|
||||||
strlcpy(fname, "equip_", sizeof(fname));
|
|
||||||
strlcat(fname, eq->name, sizeof(fname));
|
|
||||||
|
|
||||||
lua_getglobal(L, fname);
|
|
||||||
if (lua_isfunction(L, -1)) {
|
|
||||||
tolua_pushusertype(L, (void *)u, TOLUA_CAST "unit");
|
|
||||||
|
|
||||||
if (lua_pcall(L, 1, 1, 0) != 0) {
|
|
||||||
const char *error = lua_tostring(L, -1);
|
|
||||||
log_error("equip(%s) calling '%s': %s.\n", unitname(u), fname, error);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = (int)lua_tonumber(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_error("equip(%s) calling '%s': not a function.\n", unitname(u), fname);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** callback for an item-use function written in lua. */
|
/** callback for an item-use function written in lua. */
|
||||||
static int
|
static int
|
||||||
use_item_lua(unit *u, const item_type *itype, int amount, struct order *ord)
|
use_item_lua(unit *u, const item_type *itype, int amount, struct order *ord)
|
||||||
|
@ -447,7 +289,6 @@ use_item_lua(unit *u, const item_type *itype, int amount, struct order *ord)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* compat code for old data files */
|
/* compat code for old data files */
|
||||||
static int caldera_read(trigger *t, struct gamedata *data)
|
static int caldera_read(trigger *t, struct gamedata *data)
|
||||||
{
|
{
|
||||||
|
@ -469,17 +310,10 @@ void register_tolua_helpers(void)
|
||||||
at_register(&at_building_action);
|
at_register(&at_building_action);
|
||||||
|
|
||||||
callbacks.cast_spell = lua_callspell;
|
callbacks.cast_spell = lua_callspell;
|
||||||
|
callbacks.use_item = use_item_lua;
|
||||||
|
callbacks.produce_resource = produce_resource_lua;
|
||||||
|
callbacks.limit_resource = limit_resource_lua;
|
||||||
|
|
||||||
register_function((pf_generic)lua_initfamiliar, "lua_initfamiliar");
|
|
||||||
register_function((pf_generic)lua_getresource, "lua_getresource");
|
|
||||||
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_wage, "lua_wage");
|
|
||||||
register_function((pf_generic)lua_maintenance, "lua_maintenance");
|
|
||||||
|
|
||||||
item_use_fun = use_item_lua;
|
|
||||||
res_produce_fun = produce_resource_lua;
|
|
||||||
res_limit_fun = limit_resource_lua;
|
|
||||||
register_item_give(lua_giveitem, "lua_giveitem");
|
register_item_give(lua_giveitem, "lua_giveitem");
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,9 +196,6 @@ const char *buildingtype(const building_type * btype, const building * b, int bs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (btype->name) {
|
|
||||||
return btype->name(btype, b, bsize);
|
|
||||||
}
|
|
||||||
if (btype->construction && btype->construction->name) {
|
if (btype->construction && btype->construction->name) {
|
||||||
if (b) {
|
if (b) {
|
||||||
bsize = adjust_size(b, bsize);
|
bsize = adjust_size(b, bsize);
|
||||||
|
@ -362,9 +359,6 @@ building *new_building(const struct building_type * btype, region * r,
|
||||||
*bptr = b;
|
*bptr = b;
|
||||||
|
|
||||||
update_lighthouse(b);
|
update_lighthouse(b);
|
||||||
if (b->type->name) {
|
|
||||||
bname = LOC(lang, buildingtype(btype, b, 0));
|
|
||||||
}
|
|
||||||
if (!bname) {
|
if (!bname) {
|
||||||
bname = LOC(lang, btype->_name);
|
bname = LOC(lang, btype->_name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,14 +68,11 @@ extern "C" {
|
||||||
struct maintenance *maintenance; /* array of requirements */
|
struct maintenance *maintenance; /* array of requirements */
|
||||||
struct construction *construction; /* construction of 1 building-level */
|
struct construction *construction; /* construction of 1 building-level */
|
||||||
struct resource_mod *modifiers; /* modify production skills */
|
struct resource_mod *modifiers; /* modify production skills */
|
||||||
|
|
||||||
const char *(*name) (const struct building_type *,
|
|
||||||
const struct building * b, int size);
|
|
||||||
struct attrib *attribs;
|
|
||||||
} building_type;
|
} building_type;
|
||||||
|
|
||||||
extern struct selist *buildingtypes;
|
extern struct selist *buildingtypes;
|
||||||
extern struct attrib_type at_building_action;
|
extern struct attrib_type at_building_action;
|
||||||
|
extern struct attrib_type at_building_generic_type;
|
||||||
|
|
||||||
int cmp_castle_size(const struct building *b, const struct building *a);
|
int cmp_castle_size(const struct building *b, const struct building *a);
|
||||||
int building_protection(const struct building_type *btype, int stage);
|
int building_protection(const struct building_type *btype, int stage);
|
||||||
|
@ -114,13 +111,13 @@ extern "C" {
|
||||||
int flags;
|
int flags;
|
||||||
} building;
|
} building;
|
||||||
|
|
||||||
extern struct attrib_type at_building_generic_type;
|
|
||||||
extern const char *buildingtype(const building_type * btype,
|
const char *buildingtype(const building_type * btype,
|
||||||
const struct building *b, int bsize);
|
const struct building *b, int bsize);
|
||||||
extern const char *write_buildingname(const building * b, char *ibuf,
|
const char *write_buildingname(const building * b, char *ibuf,
|
||||||
size_t size);
|
size_t size);
|
||||||
extern int buildingcapacity(const struct building *b);
|
int buildingcapacity(const struct building *b);
|
||||||
extern struct building *new_building(const struct building_type *typ,
|
struct building *new_building(const struct building_type *typ,
|
||||||
struct region *r, const struct locale *lang);
|
struct region *r, const struct locale *lang);
|
||||||
int build_building(struct unit *u, const struct building_type *typ,
|
int build_building(struct unit *u, const struct building_type *typ,
|
||||||
int id, int size, struct order *ord);
|
int id, int size, struct order *ord);
|
||||||
|
@ -145,9 +142,9 @@ extern "C" {
|
||||||
void bunhash(struct building *b);
|
void bunhash(struct building *b);
|
||||||
int buildingcapacity(const struct building *b);
|
int buildingcapacity(const struct building *b);
|
||||||
|
|
||||||
extern void remove_building(struct building **blist, struct building *b);
|
void remove_building(struct building **blist, struct building *b);
|
||||||
extern void free_building(struct building *b);
|
void free_building(struct building *b);
|
||||||
extern void free_buildings(void);
|
void free_buildings(void);
|
||||||
|
|
||||||
const struct building_type *findbuildingtype(const char *name,
|
const struct building_type *findbuildingtype(const char *name,
|
||||||
const struct locale *lang);
|
const struct locale *lang);
|
||||||
|
@ -155,16 +152,16 @@ extern "C" {
|
||||||
#include "build.h"
|
#include "build.h"
|
||||||
#define NOBUILDING NULL
|
#define NOBUILDING NULL
|
||||||
|
|
||||||
extern int resolve_building(variant data, void *address);
|
int resolve_building(variant data, void *address);
|
||||||
extern void write_building_reference(const struct building *b,
|
void write_building_reference(const struct building *b,
|
||||||
struct storage *store);
|
struct storage *store);
|
||||||
extern variant read_building_reference(struct gamedata *data);
|
variant read_building_reference(struct gamedata *data);
|
||||||
|
|
||||||
extern struct building *findbuilding(int n);
|
struct building *findbuilding(int n);
|
||||||
|
|
||||||
extern struct unit *building_owner(const struct building *b);
|
struct unit *building_owner(const struct building *b);
|
||||||
extern void building_set_owner(struct unit * u);
|
void building_set_owner(struct unit * u);
|
||||||
extern void building_update_owner(struct building * bld);
|
void building_update_owner(struct building * bld);
|
||||||
|
|
||||||
bool buildingtype_exists(const struct region *r,
|
bool buildingtype_exists(const struct region *r,
|
||||||
const struct building_type *bt, bool working);
|
const struct building_type *bt, bool working);
|
||||||
|
@ -172,10 +169,10 @@ extern "C" {
|
||||||
bool is_building_type(const struct building_type *btype, const char *name);
|
bool is_building_type(const struct building_type *btype, const char *name);
|
||||||
struct building *active_building(const struct unit *u, const struct building_type *btype);
|
struct building *active_building(const struct unit *u, const struct building_type *btype);
|
||||||
|
|
||||||
extern const char *buildingname(const struct building *b);
|
const char *buildingname(const struct building *b);
|
||||||
|
|
||||||
extern const char *building_getname(const struct building *b);
|
const char *building_getname(const struct building *b);
|
||||||
extern void building_setname(struct building *self, const char *name);
|
void building_setname(struct building *self, const char *name);
|
||||||
|
|
||||||
struct region *building_getregion(const struct building *b);
|
struct region *building_getregion(const struct building *b);
|
||||||
void building_setregion(struct building *bld, struct region *r);
|
void building_setregion(struct building *bld, struct region *r);
|
||||||
|
|
|
@ -294,9 +294,8 @@ static void test_btype_defaults(CuTest *tc) {
|
||||||
CuAssertStrEquals(tc, "hodor", btype->_name);
|
CuAssertStrEquals(tc, "hodor", btype->_name);
|
||||||
CuAssertPtrEquals(tc, 0, btype->maintenance);
|
CuAssertPtrEquals(tc, 0, btype->maintenance);
|
||||||
CuAssertPtrEquals(tc, 0, btype->construction);
|
CuAssertPtrEquals(tc, 0, btype->construction);
|
||||||
CuAssertTrue(tc, !btype->name);
|
|
||||||
CuAssertTrue(tc, !btype->taxes);
|
|
||||||
CuAssertDblEquals(tc, 1.0, btype->auraregen, 0.0);
|
CuAssertDblEquals(tc, 1.0, btype->auraregen, 0.0);
|
||||||
|
CuAssertIntEquals(tc, 0, btype->taxes);
|
||||||
CuAssertIntEquals(tc, -1, btype->maxsize);
|
CuAssertIntEquals(tc, -1, btype->maxsize);
|
||||||
CuAssertIntEquals(tc, 1, btype->capacity);
|
CuAssertIntEquals(tc, 1, btype->capacity);
|
||||||
CuAssertIntEquals(tc, -1, btype->maxcapacity);
|
CuAssertIntEquals(tc, -1, btype->maxcapacity);
|
||||||
|
|
|
@ -24,9 +24,18 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct castorder;
|
struct castorder;
|
||||||
|
struct order;
|
||||||
|
struct unit;
|
||||||
|
struct region;
|
||||||
|
struct item_type;
|
||||||
|
struct resource_type;
|
||||||
|
|
||||||
struct callback_struct {
|
struct callback_struct {
|
||||||
int (*cast_spell)(struct castorder *co, const char *fname);
|
int (*cast_spell)(struct castorder *co, const char *fname);
|
||||||
|
int (*use_item)(struct unit *u, const struct item_type *itype,
|
||||||
|
int amount, struct order *ord);
|
||||||
|
void(*produce_resource)(struct region *, const struct resource_type *, int);
|
||||||
|
int(*limit_resource)(const struct region *, const struct resource_type *);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct callback_struct callbacks;
|
extern struct callback_struct callbacks;
|
||||||
|
|
|
@ -911,25 +911,27 @@ void read_items(struct storage *store, item ** ilist)
|
||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char ibuf[32];
|
char ibuf[32];
|
||||||
const item_type *itype;
|
|
||||||
int i;
|
int i;
|
||||||
READ_STR(store, ibuf, sizeof(ibuf));
|
READ_STR(store, ibuf, sizeof(ibuf));
|
||||||
if (!strcmp("end", ibuf)) {
|
if (!strcmp("end", ibuf)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
itype = it_find(ibuf);
|
|
||||||
READ_INT(store, &i);
|
READ_INT(store, &i);
|
||||||
if (i <= 0) {
|
if (ilist) {
|
||||||
log_error("data contains an entry with %d %s", i, ibuf);
|
const item_type *itype;
|
||||||
}
|
itype = it_find(ibuf);
|
||||||
else {
|
if (i <= 0) {
|
||||||
if (itype && itype->rtype) {
|
log_error("data contains an entry with %d %s", i, ibuf);
|
||||||
i_change(ilist, itype, i);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log_error("data contains unknown item type %s.", ibuf);
|
if (itype && itype->rtype) {
|
||||||
|
i_change(ilist, itype, i);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_error("data contains unknown item type %s.", ibuf);
|
||||||
|
}
|
||||||
|
assert(itype && itype->rtype);
|
||||||
}
|
}
|
||||||
assert(itype && itype->rtype);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,11 +339,6 @@ static void json_building(cJSON *json, building_type *bt) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case cJSON_String:
|
case cJSON_String:
|
||||||
if (strcmp(child->string, "name") == 0) {
|
|
||||||
bt->name = (const char *(*)(const struct building_type *,
|
|
||||||
const struct building *, int))get_function(child->valuestring);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
log_error("building %s contains unknown attribute %s", json->string, child->string);
|
log_error("building %s contains unknown attribute %s", json->string, child->string);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1080,8 +1080,7 @@ void terraform_region(region * r, const terrain_type * terrain)
|
||||||
|
|
||||||
if (!fval(terrain, LAND_REGION)) {
|
if (!fval(terrain, LAND_REGION)) {
|
||||||
region_setinfo(r, NULL);
|
region_setinfo(r, NULL);
|
||||||
if (r->land != NULL) {
|
if (r->land) {
|
||||||
i_freeall(&r->land->items);
|
|
||||||
free_land(r->land);
|
free_land(r->land);
|
||||||
r->land = NULL;
|
r->land = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1101,7 +1100,6 @@ void terraform_region(region * r, const terrain_type * terrain)
|
||||||
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
for (d = 0; d != MAXDIRECTIONS; ++d) {
|
||||||
rsetroad(r, d, 0);
|
rsetroad(r, d, 0);
|
||||||
}
|
}
|
||||||
i_freeall(&r->land->items);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
static struct surround {
|
static struct surround {
|
||||||
|
@ -1176,11 +1174,6 @@ void terraform_region(region * r, const terrain_type * terrain)
|
||||||
|
|
||||||
if (fval(terrain, LAND_REGION)) {
|
if (fval(terrain, LAND_REGION)) {
|
||||||
const item_type *itype = NULL;
|
const item_type *itype = NULL;
|
||||||
char equip_hash[64];
|
|
||||||
|
|
||||||
/* TODO: put the equipment in struct terrain, faster */
|
|
||||||
sprintf(equip_hash, "terrain_%s", terrain->_name);
|
|
||||||
equip_items(&r->land->items, get_equipment(equip_hash));
|
|
||||||
|
|
||||||
if (r->terrain->herbs) {
|
if (r->terrain->herbs) {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
|
@ -105,7 +105,6 @@ extern "C" {
|
||||||
int peasants;
|
int peasants;
|
||||||
int newpeasants;
|
int newpeasants;
|
||||||
int money;
|
int money;
|
||||||
struct item *items; /* items that can be claimed */
|
|
||||||
struct region_owner *ownership;
|
struct region_owner *ownership;
|
||||||
} land_region;
|
} land_region;
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <kernel/config.h>
|
|
||||||
#include "resources.h"
|
#include "resources.h"
|
||||||
|
|
||||||
/* kernel includes */
|
/* kernel includes */
|
||||||
|
#include <kernel/config.h>
|
||||||
|
#include <kernel/callbacks.h>
|
||||||
#include "build.h"
|
#include "build.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "region.h"
|
#include "region.h"
|
||||||
|
@ -213,16 +214,11 @@ struct rawmaterial_type *rmt_create(struct resource_type *rtype)
|
||||||
return rmtype;
|
return rmtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
int(*item_use_fun)(struct unit *u, const struct item_type *itype, int amount,
|
|
||||||
struct order *ord);
|
|
||||||
int(*res_limit_fun)(const struct region *, const struct resource_type *);
|
|
||||||
void(*res_produce_fun)(struct region *, const struct resource_type *, int);
|
|
||||||
|
|
||||||
int limit_resource(const struct region *r, const resource_type *rtype)
|
int limit_resource(const struct region *r, const resource_type *rtype)
|
||||||
{
|
{
|
||||||
assert(!rtype->raw);
|
assert(!rtype->raw);
|
||||||
if (res_limit_fun) {
|
if (callbacks.limit_resource) {
|
||||||
return res_limit_fun(r, rtype);
|
return callbacks.limit_resource(r, rtype);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -230,7 +226,7 @@ int limit_resource(const struct region *r, const resource_type *rtype)
|
||||||
void produce_resource(struct region *r, const struct resource_type *rtype, int amount)
|
void produce_resource(struct region *r, const struct resource_type *rtype, int amount)
|
||||||
{
|
{
|
||||||
assert(!rtype->raw);
|
assert(!rtype->raw);
|
||||||
if (res_produce_fun) {
|
if (callbacks.produce_resource) {
|
||||||
res_produce_fun(r, rtype, amount);
|
callbacks.produce_resource(r, rtype, amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <util/variant.h>
|
||||||
|
|
||||||
struct building_type;
|
struct building_type;
|
||||||
struct race;
|
struct race;
|
||||||
|
struct region;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
RM_USED = 1 << 0, /* resource has been used */
|
RM_USED = 1 << 0, /* resource has been used */
|
||||||
|
@ -71,10 +74,6 @@ extern "C" {
|
||||||
int base, int divisor, const struct resource_type *rtype);
|
int base, int divisor, const struct resource_type *rtype);
|
||||||
struct rawmaterial_type *rmt_create(struct resource_type *rtype);
|
struct rawmaterial_type *rmt_create(struct resource_type *rtype);
|
||||||
|
|
||||||
extern int(*res_limit_fun)(const struct region *, const struct resource_type *);
|
|
||||||
extern void(*res_produce_fun)(struct region *, const struct resource_type *, int);
|
|
||||||
extern int (*item_use_fun)(struct unit *, const struct item_type *, int amount,
|
|
||||||
struct order *ord);
|
|
||||||
int limit_resource(const struct region *r, const struct resource_type *rtype);
|
int limit_resource(const struct region *r, const struct resource_type *rtype);
|
||||||
void produce_resource(struct region *r, const struct resource_type *rtype, int amount);
|
void produce_resource(struct region *r, const struct resource_type *rtype, int amount);
|
||||||
|
|
||||||
|
|
|
@ -1021,7 +1021,9 @@ static region *readregion(struct gamedata *data, int x, int y)
|
||||||
if (!r->land->demands) {
|
if (!r->land->demands) {
|
||||||
fix_demand(r);
|
fix_demand(r);
|
||||||
}
|
}
|
||||||
read_items(data->store, &r->land->items);
|
if (data->version < NOLANDITEM_VERSION) {
|
||||||
|
read_items(data->store, NULL);
|
||||||
|
}
|
||||||
if (data->version >= REGIONOWNER_VERSION) {
|
if (data->version >= REGIONOWNER_VERSION) {
|
||||||
READ_INT(data->store, &n);
|
READ_INT(data->store, &n);
|
||||||
region_set_morale(r, MAX(0, (short)n), -1);
|
region_set_morale(r, MAX(0, (short)n), -1);
|
||||||
|
@ -1095,7 +1097,6 @@ void writeregion(struct gamedata *data, const region * r)
|
||||||
WRITE_INT(data->store, demand->value);
|
WRITE_INT(data->store, demand->value);
|
||||||
}
|
}
|
||||||
WRITE_TOK(data->store, "end");
|
WRITE_TOK(data->store, "end");
|
||||||
write_items(data->store, r->land->items);
|
|
||||||
WRITE_SECTION(data->store);
|
WRITE_SECTION(data->store);
|
||||||
#if RELEASE_VERSION>=REGIONOWNER_VERSION
|
#if RELEASE_VERSION>=REGIONOWNER_VERSION
|
||||||
WRITE_INT(data->store, region_get_morale(r));
|
WRITE_INT(data->store, region_get_morale(r));
|
||||||
|
|
|
@ -356,14 +356,7 @@ static int parse_buildings(xmlDocPtr doc)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assert(propValue != NULL);
|
assert(propValue != NULL);
|
||||||
if (strcmp((const char *)propValue, "name") == 0) {
|
log_error("unknown function type '%s' for building %s\n", (const char *)propValue, btype->_name);
|
||||||
btype->name =
|
|
||||||
(const char *(*)(const struct building_type *,
|
|
||||||
const struct building *, int))fun;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_error("unknown function type '%s' for building %s\n", (const char *)propValue, btype->_name);
|
|
||||||
}
|
|
||||||
xmlFree(propValue);
|
xmlFree(propValue);
|
||||||
}
|
}
|
||||||
xmlXPathFreeObject(result);
|
xmlXPathFreeObject(result);
|
||||||
|
|
|
@ -45,6 +45,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
/* kernel includes */
|
/* kernel includes */
|
||||||
#include <kernel/alliance.h>
|
#include <kernel/alliance.h>
|
||||||
#include <kernel/ally.h>
|
#include <kernel/ally.h>
|
||||||
|
#include <kernel/callbacks.h>
|
||||||
#include <kernel/connection.h>
|
#include <kernel/connection.h>
|
||||||
#include <kernel/curse.h>
|
#include <kernel/curse.h>
|
||||||
#include <kernel/building.h>
|
#include <kernel/building.h>
|
||||||
|
@ -3218,7 +3219,7 @@ static int use_item(unit * u, const item_type * itype, int amount, struct order
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itype->flags & ITF_CANUSE) {
|
if (itype->flags & ITF_CANUSE) {
|
||||||
int result = item_use_fun(u, itype, amount, ord);
|
int result = callbacks.use_item(u, itype, amount, ord);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
use_pooled(u, itype->rtype, GET_DEFAULT, result);
|
use_pooled(u, itype->rtype, GET_DEFAULT, result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4534,12 +4534,7 @@ int sp_icastle(castorder * co)
|
||||||
b->size = ((rng_int() % (int)(power)) + 1) * 5;
|
b->size = ((rng_int() % (int)(power)) + 1) * 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type->name == NULL) {
|
bname = LOC(mage->faction->locale, buildingtype(type, b, 0));
|
||||||
bname = LOC(mage->faction->locale, type->_name);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bname = LOC(mage->faction->locale, buildingtype(type, b, 0));
|
|
||||||
}
|
|
||||||
building_setname(b, bname);
|
building_setname(b, bname);
|
||||||
|
|
||||||
/* TODO: Auf timeout und action_destroy umstellen */
|
/* TODO: Auf timeout und action_destroy umstellen */
|
||||||
|
|
|
@ -33,10 +33,11 @@
|
||||||
#define ATHASH_VERSION 353 /* attribute-type hash, not name */
|
#define ATHASH_VERSION 353 /* attribute-type hash, not name */
|
||||||
#define NOWATCH_VERSION 354 /* plane->watchers is gone */
|
#define NOWATCH_VERSION 354 /* plane->watchers is gone */
|
||||||
#define KEYVAL_VERSION 355 /* at_keys has values */
|
#define KEYVAL_VERSION 355 /* at_keys has values */
|
||||||
|
#define NOLANDITEM_VERSION 356 /* land_region has no items */
|
||||||
/* unfinished: */
|
/* unfinished: */
|
||||||
#define CRYPT_VERSION 400 /* passwords are encrypted */
|
#define CRYPT_VERSION 400 /* passwords are encrypted */
|
||||||
|
|
||||||
#define RELEASE_VERSION KEYVAL_VERSION /* current datafile */
|
#define RELEASE_VERSION NOLANDITEM_VERSION /* current datafile */
|
||||||
#define MIN_VERSION INTPAK_VERSION /* minimal datafile we support */
|
#define MIN_VERSION INTPAK_VERSION /* minimal datafile we support */
|
||||||
#define MAX_VERSION RELEASE_VERSION /* change this if we can need to read the future datafile, and we can do so */
|
#define MAX_VERSION RELEASE_VERSION /* change this if we can need to read the future datafile, and we can do so */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue