diff --git a/scripts/tests/bindings.lua b/scripts/tests/bindings.lua index b37606530..189d34769 100755 --- a/scripts/tests/bindings.lua +++ b/scripts/tests/bindings.lua @@ -45,6 +45,14 @@ function test_process() assert_equal("function", _G.type(eressea.process.regeneration)) assert_equal("function", _G.type(eressea.process.guard_on)) assert_equal("function", _G.type(eressea.process.guard_off)) + assert_equal("function", _G.type(eressea.process.explain)) + assert_equal("function", _G.type(eressea.process.messages)) + assert_equal("function", _G.type(eressea.process.reserve)) + assert_equal("function", _G.type(eressea.process.claim)) + assert_equal("function", _G.type(eressea.process.follow)) + assert_equal("function", _G.type(eressea.process.alliance)) + assert_equal("function", _G.type(eressea.process.idle)) + assert_equal("function", _G.type(eressea.process.set_default)) end function test_settings() diff --git a/scripts/tests/orders.lua b/scripts/tests/orders.lua index b46e0c1c7..e3d30cdfa 100755 --- a/scripts/tests/orders.lua +++ b/scripts/tests/orders.lua @@ -236,3 +236,31 @@ end function test_process_guard_off() eressea.process.guard_off() end + +function test_process_explain() + eressea.process.explain() +end + +function test_process_messages() + eressea.process.messages() +end + +function test_process_reserve() + eressea.process.reserve() +end + +function test_process_claim() + eressea.process.claim() +end + +function test_process_follow() + eressea.process.follow() +end + +function test_process_idle() + eressea.process.idle() +end + +function test_process_set_default() + eressea.process.set_default() +end diff --git a/src/bindings/bind_process.c b/src/bindings/bind_process.c index 926655e66..83420578b 100755 --- a/src/bindings/bind_process.c +++ b/src/bindings/bind_process.c @@ -2,6 +2,8 @@ #include #include +#include +#include #include #include #include @@ -215,6 +217,32 @@ void process_guard_on(void) { process_cmd(K_GUARD, guard_on_cmd, PROC_LAND_REGION); } +void process_explain(void) { + process_cmd(K_RESHOW, reshow_cmd, 0); +} + +void process_reserve(void) { + process_cmd(K_RESERVE, reserve_cmd, 0); +} + +void process_claim(void) { + process_cmd(K_CLAIM, claim_cmd, 0); +} + +void process_follow(void) { + struct region *r; + for (r = regions; r; r = r->next) { + unit * u; + for (u=r->units; u; u=u->next) { + follow_unit(u); + } + } +} + +void process_messages(void) { + process_cmd(K_MAIL, mail_cmd, 0); +} + void process_guard_off(void) { process_cmd(K_GUARD, guard_off_cmd, PROC_LAND_REGION); } @@ -247,3 +275,20 @@ void process_maintenance(void) { maintain_buildings(r, 0); } } + +void process_alliance(void) { + alliance_cmd(); +} + +void process_idle(void) { + region * r; + for (r=regions; r; r=r->next) { + auto_work(r); + } +} + +void process_set_default(void) { + if (!global.disabled[K_DEFAULT]) { + defaultorders(); + } +} diff --git a/src/bindings/bind_process.h b/src/bindings/bind_process.h index 4a9ebc147..767c7eb77 100755 --- a/src/bindings/bind_process.h +++ b/src/bindings/bind_process.h @@ -37,6 +37,14 @@ void process_give_control(void); void process_regeneration(void); void process_guard_on(void); void process_guard_off(void); +void process_explain(void); +void process_messages(void); +void process_reserve(void); +void process_claim(void); +void process_follow(void); +void process_alliance(void); +void process_idle(void); +void process_set_default(void); #ifdef __cplusplus } diff --git a/src/bindings/process.pkg b/src/bindings/process.pkg index bf6f4a83c..fb68e3a42 100755 --- a/src/bindings/process.pkg +++ b/src/bindings/process.pkg @@ -34,5 +34,13 @@ module eressea { void process_regeneration @ regeneration(void); /* regen health & aura */ void process_guard_on @ guard_on(void); /* GUARD */ void process_guard_off @ guard_off(void); /* GUARD NOT */ + void process_explain @ explain(void); /* SHOW */ + void process_messages @ messages(void); /* MESSAGE */ + void process_reserve @ reserve(void); /* RESERVE */ + void process_claim @ claim(void); /* CLAIM */ + void process_follow @ follow(void); /* FOLLOW */ + void process_alliance @ alliance(void); /* FOLLOW */ + void process_idle @ idle(void); /* work.auto */ + void process_set_default @ set_default(void); /* work.auto */ } } diff --git a/src/gamecode/laws.c b/src/gamecode/laws.c index 82ebc4034..0229b9e45 100755 --- a/src/gamecode/laws.c +++ b/src/gamecode/laws.c @@ -2166,7 +2166,7 @@ static void mailfaction(unit * u, int n, struct order *ord, const char *s) cmistake(u, ord, 66, MSG_MESSAGE); } -static int mail_cmd(unit * u, struct order *ord) +int mail_cmd(unit * u, struct order *ord) { region *r = u->region; unit *u2; @@ -2781,7 +2781,7 @@ int guard_off_cmd(unit * u, struct order *ord) return 0; } -static int reshow_cmd(unit * u, struct order *ord) +int reshow_cmd(unit * u, struct order *ord) { const char *s; param_t p = NOPARAM; @@ -3867,9 +3867,11 @@ static void remove_exclusive(order ** ordp) } } -static void defaultorders(void) +void defaultorders(void) { region *r; + + assert(!global.disabled[K_DEFAULT]); for (r = regions; r; r = r->next) { unit *u; for (u = r->units; u; u = u->next) { @@ -4054,7 +4056,39 @@ int pay_cmd(unit * u, struct order *ord) return 0; } -static int claim_cmd(unit * u, struct order *ord) + +int reserve_cmd(unit * u, struct order *ord) +{ + if (u->number > 0 && (urace(u)->ec_flags & GETITEM)) { + int use, count; + const resource_type *rtype; + const char *s; + + init_tokens(ord); + skip_token(); + s = getstrtoken(); + count = atoip((const char *)s); + + if (count == 0 && findparam(s, u->faction->locale) == P_EACH) { + count = getint() * u->number; + } + + rtype = findresourcetype(getstrtoken(), u->faction->locale); + if (rtype == NULL) + return 0; + + set_resvalue(u, rtype, 0); /* make sure the pool is empty */ + use = use_pooled(u, rtype, GET_DEFAULT, count); + if (use) { + set_resvalue(u, rtype, use); + change_resource(u, rtype, use); + return use; + } + } + return 0; +} + +int claim_cmd(unit * u, struct order *ord) { const char *t; int n; diff --git a/src/gamecode/laws.h b/src/gamecode/laws.h index 0d4cbd614..e0faf47f8 100755 --- a/src/gamecode/laws.h +++ b/src/gamecode/laws.h @@ -50,6 +50,7 @@ extern "C" { extern int enter_ship(struct unit *u, struct order *ord, int id, int report); extern void new_units(void); + extern void defaultorders(void); extern void quit(void); extern void monthly_healing(void); extern void renumber_factions(void); @@ -81,7 +82,12 @@ extern "C" { extern int contact_cmd(struct unit *u, struct order *ord); extern int guard_on_cmd(struct unit *u, struct order *ord); extern int guard_off_cmd(struct unit *u, struct order *ord); - + extern int reshow_cmd(struct unit *u, struct order *ord); + extern int mail_cmd(struct unit *u, struct order *ord); + extern int reserve_cmd(struct unit *u, struct order *ord); + extern int claim_cmd(struct unit *u, struct order *ord); + extern int follow_cmd(struct unit *u, struct order *ord); + #ifdef __cplusplus } #endif diff --git a/src/kernel/pool.c b/src/kernel/pool.c index b150f9f9f..f738bc0d6 100644 --- a/src/kernel/pool.c +++ b/src/kernel/pool.c @@ -96,7 +96,7 @@ int change_resource(unit * u, const resource_type * rtype, int change) int get_reservation(const unit * u, const resource_type * rtype) { - struct reservation *res = u->reservations; + reservation *res = u->reservations; if (rtype == oldresourcetype[R_STONE] && (u->race->flags & RCF_STONEGOLEM)) return (u->number * GOLEM_STONE); @@ -111,7 +111,7 @@ int get_reservation(const unit * u, const resource_type * rtype) int change_reservation(unit * u, const resource_type * rtype, int value) { - struct reservation *res, **rp = &u->reservations; + reservation *res, **rp = &u->reservations; if (!value) return 0; @@ -120,7 +120,7 @@ int change_reservation(unit * u, const resource_type * rtype, int value) rp = &(*rp)->next; res = *rp; if (!res) { - *rp = res = calloc(sizeof(struct reservation), 1); + *rp = res = calloc(sizeof(reservation), 1); res->type = rtype; res->value = value; } else if (res && res->value + value <= 0) { @@ -133,9 +133,9 @@ int change_reservation(unit * u, const resource_type * rtype, int value) return res->value; } -static int new_set_resvalue(unit * u, const resource_type * rtype, int value) +int set_resvalue(unit * u, const resource_type * rtype, int value) { - struct reservation *res, **rp = &u->reservations; + reservation *res, **rp = &u->reservations; while (*rp && (*rp)->type != rtype) rp = &(*rp)->next; @@ -143,7 +143,7 @@ static int new_set_resvalue(unit * u, const resource_type * rtype, int value) if (!res) { if (!value) return 0; - *rp = res = calloc(sizeof(struct reservation), 1); + *rp = res = calloc(sizeof(reservation), 1); res->type = rtype; res->value = value; } else if (res && value <= 0) { @@ -253,34 +253,3 @@ use_pooled(unit * u, const resource_type * rtype, unsigned int mode, int count) } return count - use; } - -int reserve_cmd(unit * u, struct order *ord) -{ - if (u->number > 0 && (urace(u)->ec_flags & GETITEM)) { - int use, count; - const resource_type *rtype; - const char *s; - - init_tokens(ord); - skip_token(); - s = getstrtoken(); - count = atoip((const char *)s); - - if (count == 0 && findparam(s, u->faction->locale) == P_EACH) { - count = getint() * u->number; - } - - rtype = findresourcetype(getstrtoken(), u->faction->locale); - if (rtype == NULL) - return 0; - - new_set_resvalue(u, rtype, 0); /* make sure the pool is empty */ - use = use_pooled(u, rtype, GET_DEFAULT, count); - if (use) { - new_set_resvalue(u, rtype, use); - change_resource(u, rtype, use); - return use; - } - } - return 0; -} diff --git a/src/kernel/pool.h b/src/kernel/pool.h index b6a5e6833..6de15bf3c 100644 --- a/src/kernel/pool.h +++ b/src/kernel/pool.h @@ -54,11 +54,7 @@ extern "C" { int change_reservation(struct unit *u, const struct resource_type *res, int value); - int reserve_cmd(struct unit *u, struct order *ord); - -/** init_pool - * initialisiert den regionalen Pool. - */ + int set_resvalue(struct unit * u, const struct resource_type * rtype, int value); #ifdef __cplusplus } diff --git a/src/kernel/unit.h b/src/kernel/unit.h index 7c9e3d8d3..f94a1d4ee 100644 --- a/src/kernel/unit.h +++ b/src/kernel/unit.h @@ -71,6 +71,12 @@ extern "C" { extern int maxheroes(const struct faction *f); extern int countheroes(const struct faction *f); + typedef struct reservation { + struct reservation *next; + const struct resource_type *type; + int value; + } reservation; + typedef struct unit { struct unit *next; /* needs to be first entry, for region's unitlist */ struct unit *nextF; /* nächste Einheit der Partei */ @@ -90,11 +96,7 @@ extern "C" { short skill_size; struct skill *skills; struct item *items; - struct reservation { - struct reservation *next; - const struct resource_type *type; - int value; - } *reservations; + reservation *reservations; /* orders */ struct order *orders;