Merge pull request #886 from ennorehling/develop

Baumwachstum und Flotten-Meldungen
This commit is contained in:
Enno Rehling 2020-01-03 20:28:00 +01:00 committed by GitHub
commit 32d2970965
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 138 additions and 23 deletions

View File

@ -2690,6 +2690,70 @@
</type> </type>
</message> </message>
<message name="error321" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error322" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error323" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error324" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error325" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error326" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error327" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error328" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error319" section="errors"> <message name="error319" section="errors">
<type> <type>
<arg name="unit" type="unit"/> <arg name="unit" type="unit"/>

View File

@ -2775,7 +2775,10 @@ msgid "error324"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit gehört nicht zu unserer Partei.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit gehört nicht zu unserer Partei.\""
msgid "error322" msgid "error322"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist bereits auf einem Schiff.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur Schiffe gleicher Bauart können einen Konvoi bilden.\""
msgid "error328"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur Schiffe an der selben Küste können einen Konvoi bilden.\""
msgid "error323" msgid "error323"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist verzaubert.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist verzaubert.\""

View File

@ -2781,11 +2781,14 @@ msgid "error324"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not one of ours.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not one of ours.\""
msgid "error322" msgid "error322"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already on a ship.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only ships of the same type can form a convoy.\""
msgid "error323" msgid "error323"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is under a spell.\"" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is under a spell.\""
msgid "error328"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - All ships of a convoy must be on the same coast.\""
msgid "dissolve_units_2" msgid "dissolve_units_2"
msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\"" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\""

View File

@ -14,6 +14,29 @@ function setup()
eressea.settings.set("magic.regeneration.enable", "0") eressea.settings.set("magic.regeneration.enable", "0")
end end
function test_undead_cannot_enter_holyground()
local r1 = region.create(0, 0, 'plain')
local r2 = region.create(1, 0, 'plain')
local f = faction.create('human')
local u1 = unit.create(f, r1, 1)
local u2 = unit.create(f, r2, 1)
u2.name = "Xolgrim's Magier"
u1.name = "Xolgrim's Opfer"
u2.magic = 'gwyrrd'
u2:set_skill('magic', 100)
u2.aura = 200
u2:add_spell('holyground')
u2:add_order('ZAUBERE STUFE 10 "Heiliger Boden"')
u1.race = "skeleton"
u1:add_order("NACH Osten")
process_orders()
assert_not_nil(r2:get_curse('holyground'))
assert_equal(r1, u1.region)
end
function test_shapeshift() function test_shapeshift()
local r = region.create(42, 0, "plain") local r = region.create(42, 0, "plain")
local f = faction.create("demon", "noreply@eressea.de", "de") local f = faction.create("demon", "noreply@eressea.de", "de")

View File

@ -28,9 +28,6 @@ static int tolua_levitate_ship(lua_State * L)
return 1; return 1;
} }
extern void spawn_undead(void);
extern void plan_monsters(struct faction *f);
static int tolua_planmonsters(lua_State * L) static int tolua_planmonsters(lua_State * L)
{ {
faction *f = (faction *)tolua_tousertype(L, 1, get_monsters()); faction *f = (faction *)tolua_tousertype(L, 1, get_monsters());

View File

@ -14,7 +14,8 @@
#include <lua.h> #include <lua.h>
void tolua_bind_open(lua_State * L) { void tolua_bind_open(lua_State * L)
{
tolua_eressea_open(L); tolua_eressea_open(L);
tolua_process_open(L); tolua_process_open(L);
tolua_settings_open(L); tolua_settings_open(L);

View File

@ -3,6 +3,7 @@
#endif #endif
#include "bindings.h" #include "bindings.h"
#include "bind_tolua.h"
#include "console.h" #include "console.h"
#include "gamedb.h" #include "gamedb.h"
@ -865,8 +866,6 @@ static int lua_rng_default(lua_State *L) {
return 0; return 0;
} }
void tolua_bind_open(lua_State * L);
int tolua_bindings_open(lua_State * L, const dictionary *inifile) int tolua_bindings_open(lua_State * L, const dictionary *inifile)
{ {
tolua_open(L); tolua_open(L);

View File

@ -12,6 +12,8 @@ extern "C" {
int tolua_selist_push(struct lua_State *L, const char *list_type, int tolua_selist_push(struct lua_State *L, const char *list_type,
const char *elem_type, struct selist *list); const char *elem_type, struct selist *list);
void bind_monsters(struct lua_State *L);
int log_lua_error(struct lua_State *L); int log_lua_error(struct lua_State *L);
void lua_done(struct lua_State *L); void lua_done(struct lua_State *L);

View File

@ -371,7 +371,7 @@ message * give_ship(unit *u1, unit *u2, int n, order *ord)
u2->ship->coast = u1->ship->coast; u2->ship->coast = u1->ship->coast;
} }
else { else {
return msg_error(u1, ord, 182); return msg_error(u1, ord, 328);
} }
} }
} }

View File

@ -62,6 +62,7 @@ static message *missing_feedback(const char *name, const struct unit *u,
log_error("trying to create undefined feedback of type \"%s\"\n", name); log_error("trying to create undefined feedback of type \"%s\"\n", name);
} }
else if (missing_message_mode == MESSAGE_MISSING_REPLACE) { else if (missing_message_mode == MESSAGE_MISSING_REPLACE) {
log_warning("trying to create undefined message of type \"%s\"\n", name);
if (strcmp(name, "missing_feedback") != 0) { if (strcmp(name, "missing_feedback") != 0) {
if (!mt_find("missing_feedback")) { if (!mt_find("missing_feedback")) {
mt_create_va(mt_new("missing_feedback", NULL), "unit:unit", mt_create_va(mt_new("missing_feedback", NULL), "unit:unit",

View File

@ -594,6 +594,13 @@ growing_trees_e3(region * r, const int current_season,
} }
} }
static short cap_short(int i) {
if (i > SHRT_MIN) {
return ((i < SHRT_MAX) ? (short)i : SHRT_MAX);
}
return SHRT_MIN;
}
static void static void
growing_trees(region * r, const season_t current_season, const season_t last_weeks_season) growing_trees(region * r, const season_t current_season, const season_t last_weeks_season)
{ {
@ -687,8 +694,8 @@ growing_trees(region * r, const season_t current_season, const season_t last_wee
a = a_find(r->attribs, &at_germs); a = a_find(r->attribs, &at_germs);
if (!a) { if (!a) {
a = a_add(&r->attribs, a_new(&at_germs)); a = a_add(&r->attribs, a_new(&at_germs));
a->data.sa[0] = (short)rtrees(r, 0); a->data.sa[0] = cap_short(rtrees(r, 0));
a->data.sa[1] = (short)rtrees(r, 1); a->data.sa[1] = cap_short(rtrees(r, 1));
} }
/* wir haben 6 Wochen zum wachsen, jeder Same/Spross hat 18% Chance /* wir haben 6 Wochen zum wachsen, jeder Same/Spross hat 18% Chance
* zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */ * zu wachsen, damit sollten nach 5-6 Wochen alle gewachsen sein */
@ -3712,8 +3719,9 @@ void process(void)
log_debug("- Step %u", prio); log_debug("- Step %u", prio);
while (proc && proc->priority == prio) { while (proc && proc->priority == prio) {
if (proc->name) if (proc->name) {
log_debug(" - %s", proc->name); log_debug(" - %s", proc->name);
}
proc = proc->next; proc = proc->next;
} }
@ -3721,8 +3729,9 @@ void process(void)
pglobal->data.global.process(); pglobal->data.global.process();
pglobal = pglobal->next; pglobal = pglobal->next;
} }
if (pglobal == NULL || pglobal->priority != prio) if (pglobal == NULL || pglobal->priority != prio) {
continue; continue;
}
for (r = regions; r; r = r->next) { for (r = regions; r; r = r->next) {
unit *u; unit *u;
@ -3733,8 +3742,9 @@ void process(void)
pregion->data.per_region.process(r); pregion->data.per_region.process(r);
pregion = pregion->next; pregion = pregion->next;
} }
if (pregion == NULL || pregion->priority != prio) if (pregion == NULL || pregion->priority != prio) {
continue; continue;
}
if (r->units) { if (r->units) {
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
@ -3744,14 +3754,16 @@ void process(void)
punit->data.per_unit.process(u); punit->data.per_unit.process(u);
punit = punit->next; punit = punit->next;
} }
if (punit == NULL || punit->priority != prio) if (punit == NULL || punit->priority != prio) {
continue; continue;
}
porder = punit; porder = punit;
while (porder && porder->priority == prio && porder->type == PR_ORDER) { while (porder && porder->priority == prio && porder->type == PR_ORDER) {
order **ordp = &u->orders; order **ordp = &u->orders;
if (porder->flags & PROC_THISORDER) if (porder->flags & PROC_THISORDER) {
ordp = &u->thisorder; ordp = &u->thisorder;
}
while (*ordp) { while (*ordp) {
order *ord = *ordp; order *ord = *ordp;
if (getkeyword(ord) == porder->data.per_order.kword) { if (getkeyword(ord) == porder->data.per_order.kword) {
@ -3780,8 +3792,9 @@ void process(void)
} }
} }
} }
if (!ord || *ordp == ord) if (!ord || *ordp == ord) {
ordp = &(*ordp)->next; ordp = &(*ordp)->next;
}
} }
porder = porder->next; porder = porder->next;
} }
@ -3798,9 +3811,9 @@ void process(void)
pregion->data.per_region.process(r); pregion->data.per_region.process(r);
pregion = pregion->next; pregion = pregion->next;
} }
if (pregion == NULL || pregion->priority != prio) if (pregion == NULL || pregion->priority != prio) {
continue; continue;
}
} }
} }

View File

@ -290,8 +290,6 @@ void locale_init(void)
} }
} }
extern void bind_monsters(lua_State *L);
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int err = 0; int err = 0;

View File

@ -21,6 +21,10 @@ extern "C" {
bool monster_is_waiting(const struct unit *u); bool monster_is_waiting(const struct unit *u);
void make_zombie(struct unit * u); void make_zombie(struct unit * u);
void spawn_undead(void);
void plan_monsters(struct faction *f);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -974,10 +974,17 @@ bool move_blocked(const unit * u, const region * r, const region * r2)
} }
if (r->attribs) { if (r->attribs) {
const curse_type *fogtrap_ct = &ct_fogtrap; curse *c = get_curse(r->attribs, &ct_fogtrap);
curse *c = get_curse(r->attribs, fogtrap_ct); if (curse_active(c)) {
return true;
}
}
if (r2->attribs && fval(u_race(u), RCF_UNDEAD)) {
curse *c = get_curse(r2->attribs, &ct_holyground);
return curse_active(c); return curse_active(c);
} }
return false; return false;
} }