forked from github/server
"Zeilenumbruch im Einheitennamen" - prevented line breaks in unit names http://eressea.upb.de/mantis/view.php?id=1436 "lc_age throws an exception" - fixed adding tostring() in script. - not calling std::terminate also: - added AT_AGE_* macros to be returned from attrib-age functions
This commit is contained in:
parent
b973330061
commit
e26700c8b1
16 changed files with 104 additions and 57 deletions
|
@ -24,7 +24,7 @@ age_reduceproduction(attrib *a)
|
|||
int reduce = 100 - (5 * --a->data.sa[1]);
|
||||
if (reduce < 10) reduce = 10;
|
||||
a->data.sa[0] = (short)reduce;
|
||||
return a->data.sa[1];
|
||||
return (a->data.sa[1]>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
attrib_type at_reduceproduction = {
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
static int
|
||||
age_peaceimmune(attrib * a)
|
||||
{
|
||||
return --a->data.i;
|
||||
return (--a->data.i>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
static attrib_type at_peaceimmune = {
|
||||
|
|
|
@ -46,7 +46,7 @@ attrib_type at_faction_special = {
|
|||
|
||||
int
|
||||
age_prayer_timeout(attrib *a) {
|
||||
return --a->data.sa[0];
|
||||
return (--a->data.sa[0]>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
attrib_type at_prayer_timeout = {
|
||||
|
|
|
@ -151,10 +151,10 @@ a_ageicastle(struct attrib * a)
|
|||
ADDMSG(&r->msgs, msg_message("icastle_dissolve", "building", b));
|
||||
/* remove_building lets units leave the building */
|
||||
remove_building(&r->buildings, b);
|
||||
return 0;
|
||||
return AT_AGE_REMOVE;
|
||||
}
|
||||
else data->time--;
|
||||
return 1;
|
||||
return AT_AGE_KEEP;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2345,7 +2345,7 @@ age_unit(attrib * a)
|
|||
/* if unit is gone or dead, remove the attribute */
|
||||
{
|
||||
unit * u = (unit*)a->data.v;
|
||||
return (u!=NULL && u->number>0);
|
||||
return (u!=NULL && u->number>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
attrib_type at_familiarmage = {
|
||||
|
|
|
@ -131,8 +131,7 @@ shiptrail_age(attrib *a)
|
|||
traveldir *t = (traveldir *)(a->data.v);
|
||||
|
||||
t->age--;
|
||||
if(t->age == 0) return 0;
|
||||
return 1;
|
||||
return (t->age>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -170,7 +169,7 @@ age_speedup(attrib *a)
|
|||
if (a->data.sa[0] > 0) {
|
||||
a->data.sa[0] = a->data.sa[0] - a->data.sa[1];
|
||||
}
|
||||
return a->data.sa[0]>0;
|
||||
return (a->data.sa[0]>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
attrib_type at_speedup = {
|
||||
|
|
|
@ -203,11 +203,8 @@ static int
|
|||
a_agedirection(attrib *a)
|
||||
{
|
||||
spec_direction *d = (spec_direction *)(a->data.v);
|
||||
|
||||
if (d->duration > 0) d->duration--;
|
||||
else d->duration = 0;
|
||||
|
||||
return d->duration;
|
||||
--d->duration;
|
||||
return (d->duration>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
typedef struct dir_lookup {
|
||||
|
|
|
@ -720,7 +720,7 @@ leftship_age(struct attrib * a)
|
|||
{
|
||||
/* must be aged, so it doesn't affect report generation (cansee) */
|
||||
unused(a);
|
||||
return 0; /* remove me */
|
||||
return AT_AGE_REMOVE; /* remove me */
|
||||
}
|
||||
|
||||
static attrib_type at_leftship = {
|
||||
|
|
|
@ -197,7 +197,7 @@ age_hurting(attrib * a) {
|
|||
building * b = (building *)a->data.v;
|
||||
unit * u;
|
||||
int active = 0;
|
||||
if (b==NULL) return 0;
|
||||
if (b==NULL) return AT_AGE_REMOVE;
|
||||
for (u=b->region->units;u;u=u->next) {
|
||||
if (u->building==b) {
|
||||
if (u->faction->magiegebiet==M_CHAOS) {
|
||||
|
@ -213,7 +213,7 @@ age_hurting(attrib * a) {
|
|||
ADDMSG(&b->region->msgs, msg_message("cryinpain", "unit", u));
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
return AT_AGE_KEEP;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -98,7 +98,7 @@ wormhole_age(struct attrib * a)
|
|||
ADDMSG(&r->msgs, msg_message("wormhole_dissolve", "region", r));
|
||||
|
||||
/* age returns 0 if the attribute needs to be removed, !=0 otherwise */
|
||||
return -1;
|
||||
return AT_AGE_KEEP;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -2805,10 +2805,8 @@ static int
|
|||
wall_age(border * b)
|
||||
{
|
||||
wall_data * fd = (wall_data*)b->data.v;
|
||||
if (fd->countdown>0) {
|
||||
if (--fd->countdown==0) return 0;
|
||||
}
|
||||
return fd->countdown;
|
||||
--fd->countdown;
|
||||
return (fd->countdown>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
static region *
|
||||
|
@ -3140,7 +3138,7 @@ dc_age(struct curse * c)
|
|||
|
||||
if (r==NULL || mage==NULL || mage->number==0) {
|
||||
/* if the mage disappears, so does the spell. */
|
||||
return -1;
|
||||
return AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
up = &r->units;
|
||||
|
@ -3161,7 +3159,7 @@ dc_age(struct curse * c)
|
|||
if (*up==u) up=&u->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return AT_AGE_KEEP;
|
||||
}
|
||||
|
||||
static struct curse_type ct_deathcloud = {
|
||||
|
|
|
@ -242,8 +242,15 @@ a_age(attrib ** p)
|
|||
* hat Einfluß auf den Besitzer */
|
||||
while(*ap) {
|
||||
attrib * a = *ap;
|
||||
if (a->type->age && a->type->age(a)==0) a_remove(p, a);
|
||||
else ap = &a->next;
|
||||
if (a->type->age) {
|
||||
int result = a->type->age(a);
|
||||
assert(result>=0 || !"age() returned a negative value");
|
||||
if (result==0) {
|
||||
a_remove(p, a);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ap = &a->next;
|
||||
}
|
||||
return (*p!=NULL);
|
||||
}
|
||||
|
|
|
@ -80,6 +80,9 @@ extern void a_write(struct storage * store, const attrib * attribs);
|
|||
#define AT_READ_OK 0
|
||||
#define AT_READ_FAIL -1
|
||||
|
||||
#define AT_AGE_REMOVE 0 /* remove the attribute after calling age() */
|
||||
#define AT_AGE_KEEP 1 /* keep the attribute for another turn */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -217,23 +217,29 @@ getbuf_utf8(FILE * F)
|
|||
size_t size;
|
||||
int ret;
|
||||
|
||||
if (!quote) {
|
||||
while (*bp==COMMENT_CHAR) {
|
||||
/* comment begins. we need to keep going, to look for CONTINUE_CHAR */
|
||||
comment = true;
|
||||
++bp;
|
||||
}
|
||||
}
|
||||
|
||||
if (*bp=='\n' || *bp=='\r') {
|
||||
/* line breaks, shmine breaks */
|
||||
break;
|
||||
}
|
||||
|
||||
if (*bp==COMMENT_CHAR && !quote) {
|
||||
/* comment begins. we need to keep going, to look for CONTINUE_CHAR */
|
||||
comment = true;
|
||||
++bp;
|
||||
}
|
||||
if (*bp=='"' || *bp=='\'') {
|
||||
if (quote==*bp) {
|
||||
quote = 0;
|
||||
if (cp<fbuf+MAXLINE) *cp++ = *bp++;
|
||||
if (cp<fbuf+MAXLINE) *cp++ = *bp;
|
||||
++bp;
|
||||
continue;
|
||||
} else if (!quote) {
|
||||
quote = *bp++;
|
||||
if (cp<fbuf+MAXLINE) *cp++ = quote;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,16 +50,13 @@ lc_age(struct attrib * a)
|
|||
int retval = -1;
|
||||
|
||||
assert(b!=NULL);
|
||||
if (fname==NULL) return -1;
|
||||
|
||||
if (fname!=NULL) {
|
||||
lua_State * L = (lua_State *)global.vm_state;
|
||||
if (is_function(L, fname)) {
|
||||
try {
|
||||
if (fparam) {
|
||||
#ifdef TUNNELS /* TODO: Why does this crash? */
|
||||
std::string param(fparam);
|
||||
retval = luabind::call_function<int>(L, fname, *b, param);
|
||||
#endif
|
||||
} else {
|
||||
retval = luabind::call_function<int>(L, fname, *b);
|
||||
}
|
||||
|
@ -70,10 +67,11 @@ lc_age(struct attrib * a)
|
|||
log_error(("An exception occured while %s tried to call '%s': %s.\n",
|
||||
buildingname(b), fname, error));
|
||||
lua_pop(L, 1);
|
||||
std::terminate();
|
||||
/* std::terminate(); */
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
return (retval!=0)?AT_AGE_KEEP:AT_AGE_REMOVE;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -30,7 +30,7 @@ end
|
|||
-- export, will be called from lc_age()
|
||||
function tunnel_action(b, param)
|
||||
local r = nil
|
||||
print("Tunnel from " .. b .. " [" .. param .. "]")
|
||||
print("Tunnel from " .. tostring(b) .. " [" .. param .. "]")
|
||||
if tonumber(param)~=nil then
|
||||
r = get_region_by_id(tonumber(param))
|
||||
end
|
||||
|
@ -43,7 +43,7 @@ function tunnel_action(b, param)
|
|||
end
|
||||
if rto~=nil then
|
||||
u.region = rto
|
||||
print(" - teleported " .. u .. " to " .. rto)
|
||||
print(" - teleported " .. tostring(u) .. " to " .. tostring(rto))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -94,13 +94,52 @@ function test_287()
|
|||
write_game("287.dat", "binary")
|
||||
end
|
||||
|
||||
function tunnel_action(b, param)
|
||||
local r = nil
|
||||
print("Tunnel from " .. tostring(b) .. " [" .. param .. "]")
|
||||
|
||||
if tonumber(param)~=nil then
|
||||
r = get_region_by_id(tonumber(param))
|
||||
end
|
||||
if r~=nil then
|
||||
local units = tunnel_travelers(b)
|
||||
for key, u in pairs(units) do
|
||||
local rto = r
|
||||
if r==nil then
|
||||
rto = get_target(param)
|
||||
end
|
||||
if rto~=nil then
|
||||
u.region = rto
|
||||
print(" - teleported " .. tostring(u) .. " to " .. tostring(rto))
|
||||
end
|
||||
end
|
||||
end
|
||||
return 1 -- return 0 to destroy
|
||||
end
|
||||
|
||||
function action(b, param)
|
||||
print(b)
|
||||
print(param)
|
||||
return 1
|
||||
end
|
||||
|
||||
function test_tunnels()
|
||||
r = terraform(0, 0, "glacier")
|
||||
b = add_building(r, "portal")
|
||||
b:add_action("tunnel_action", "tnnL")
|
||||
r2 = terraform(5, 5, "plain")
|
||||
r2:set_key("tnnL", true)
|
||||
process_orders()
|
||||
end
|
||||
|
||||
loadscript("default.lua")
|
||||
run_scripts()
|
||||
-- go
|
||||
-- test_free()
|
||||
-- test_bmark()
|
||||
-- test_realloc()
|
||||
test_hse()
|
||||
-- test_hse()
|
||||
test_tunnels()
|
||||
-- test_md5()
|
||||
-- test_287()
|
||||
-- io.stdin:read("*line")
|
||||
|
|
Loading…
Reference in a new issue