"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:
Enno Rehling 2008-06-03 07:28:32 +00:00
parent b973330061
commit e26700c8b1
16 changed files with 104 additions and 57 deletions

View File

@ -24,7 +24,7 @@ age_reduceproduction(attrib *a)
int reduce = 100 - (5 * --a->data.sa[1]); int reduce = 100 - (5 * --a->data.sa[1]);
if (reduce < 10) reduce = 10; if (reduce < 10) reduce = 10;
a->data.sa[0] = (short)reduce; 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 = { attrib_type at_reduceproduction = {

View File

@ -45,7 +45,7 @@
static int static int
age_peaceimmune(attrib * a) age_peaceimmune(attrib * a)
{ {
return --a->data.i; return (--a->data.i>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
} }
static attrib_type at_peaceimmune = { static attrib_type at_peaceimmune = {

View File

@ -46,7 +46,7 @@ attrib_type at_faction_special = {
int int
age_prayer_timeout(attrib *a) { 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 = { attrib_type at_prayer_timeout = {

View File

@ -151,10 +151,10 @@ a_ageicastle(struct attrib * a)
ADDMSG(&r->msgs, msg_message("icastle_dissolve", "building", b)); ADDMSG(&r->msgs, msg_message("icastle_dissolve", "building", b));
/* remove_building lets units leave the building */ /* remove_building lets units leave the building */
remove_building(&r->buildings, b); remove_building(&r->buildings, b);
return 0; return AT_AGE_REMOVE;
} }
else data->time--; else data->time--;
return 1; return AT_AGE_KEEP;
} }
static void static void
@ -2345,7 +2345,7 @@ age_unit(attrib * a)
/* if unit is gone or dead, remove the attribute */ /* if unit is gone or dead, remove the attribute */
{ {
unit * u = (unit*)a->data.v; 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 = { attrib_type at_familiarmage = {

View File

@ -131,8 +131,7 @@ shiptrail_age(attrib *a)
traveldir *t = (traveldir *)(a->data.v); traveldir *t = (traveldir *)(a->data.v);
t->age--; t->age--;
if(t->age == 0) return 0; return (t->age>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
return 1;
} }
static int static int
@ -170,7 +169,7 @@ age_speedup(attrib *a)
if (a->data.sa[0] > 0) { if (a->data.sa[0] > 0) {
a->data.sa[0] = a->data.sa[0] - a->data.sa[1]; 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 = { attrib_type at_speedup = {

View File

@ -203,11 +203,8 @@ static int
a_agedirection(attrib *a) a_agedirection(attrib *a)
{ {
spec_direction *d = (spec_direction *)(a->data.v); spec_direction *d = (spec_direction *)(a->data.v);
--d->duration;
if (d->duration > 0) d->duration--; return (d->duration>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
else d->duration = 0;
return d->duration;
} }
typedef struct dir_lookup { typedef struct dir_lookup {

View File

@ -720,7 +720,7 @@ leftship_age(struct attrib * a)
{ {
/* must be aged, so it doesn't affect report generation (cansee) */ /* must be aged, so it doesn't affect report generation (cansee) */
unused(a); unused(a);
return 0; /* remove me */ return AT_AGE_REMOVE; /* remove me */
} }
static attrib_type at_leftship = { static attrib_type at_leftship = {

View File

@ -197,7 +197,7 @@ age_hurting(attrib * a) {
building * b = (building *)a->data.v; building * b = (building *)a->data.v;
unit * u; unit * u;
int active = 0; int active = 0;
if (b==NULL) return 0; if (b==NULL) return AT_AGE_REMOVE;
for (u=b->region->units;u;u=u->next) { for (u=b->region->units;u;u=u->next) {
if (u->building==b) { if (u->building==b) {
if (u->faction->magiegebiet==M_CHAOS) { if (u->faction->magiegebiet==M_CHAOS) {
@ -213,7 +213,7 @@ age_hurting(attrib * a) {
ADDMSG(&b->region->msgs, msg_message("cryinpain", "unit", u)); ADDMSG(&b->region->msgs, msg_message("cryinpain", "unit", u));
} }
} }
return 1; return AT_AGE_KEEP;
} }
static void static void

View File

@ -98,7 +98,7 @@ wormhole_age(struct attrib * a)
ADDMSG(&r->msgs, msg_message("wormhole_dissolve", "region", r)); ADDMSG(&r->msgs, msg_message("wormhole_dissolve", "region", r));
/* age returns 0 if the attribute needs to be removed, !=0 otherwise */ /* age returns 0 if the attribute needs to be removed, !=0 otherwise */
return -1; return AT_AGE_KEEP;
} }
static void static void

View File

@ -2805,10 +2805,8 @@ static int
wall_age(border * b) wall_age(border * b)
{ {
wall_data * fd = (wall_data*)b->data.v; wall_data * fd = (wall_data*)b->data.v;
if (fd->countdown>0) { --fd->countdown;
if (--fd->countdown==0) return 0; return (fd->countdown>0)?AT_AGE_KEEP:AT_AGE_REMOVE;
}
return fd->countdown;
} }
static region * static region *
@ -3140,7 +3138,7 @@ dc_age(struct curse * c)
if (r==NULL || mage==NULL || mage->number==0) { if (r==NULL || mage==NULL || mage->number==0) {
/* if the mage disappears, so does the spell. */ /* if the mage disappears, so does the spell. */
return -1; return AT_AGE_REMOVE;
} }
up = &r->units; up = &r->units;
@ -3161,7 +3159,7 @@ dc_age(struct curse * c)
if (*up==u) up=&u->next; if (*up==u) up=&u->next;
} }
return 0; return AT_AGE_KEEP;
} }
static struct curse_type ct_deathcloud = { static struct curse_type ct_deathcloud = {

View File

@ -242,8 +242,15 @@ a_age(attrib ** p)
* hat Einfluß auf den Besitzer */ * hat Einfluß auf den Besitzer */
while(*ap) { while(*ap) {
attrib * a = *ap; attrib * a = *ap;
if (a->type->age && a->type->age(a)==0) a_remove(p, a); if (a->type->age) {
else ap = &a->next; 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); return (*p!=NULL);
} }

View File

@ -18,7 +18,7 @@
extern "C" { extern "C" {
#endif #endif
struct storage; struct storage;
typedef void (*afun)(void); typedef void (*afun)(void);
typedef struct attrib { typedef struct attrib {
@ -80,6 +80,9 @@ extern void a_write(struct storage * store, const attrib * attribs);
#define AT_READ_OK 0 #define AT_READ_OK 0
#define AT_READ_FAIL -1 #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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -217,23 +217,29 @@ getbuf_utf8(FILE * F)
size_t size; size_t size;
int ret; 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') { if (*bp=='\n' || *bp=='\r') {
/* line breaks, shmine breaks */ /* line breaks, shmine breaks */
break; 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 (*bp=='"' || *bp=='\'') {
if (quote==*bp) { if (quote==*bp) {
quote = 0; quote = 0;
if (cp<fbuf+MAXLINE) *cp++ = *bp++; if (cp<fbuf+MAXLINE) *cp++ = *bp;
++bp;
continue;
} else if (!quote) { } else if (!quote) {
quote = *bp++; quote = *bp++;
if (cp<fbuf+MAXLINE) *cp++ = quote; if (cp<fbuf+MAXLINE) *cp++ = quote;
continue;
} }
} }

View File

@ -50,30 +50,28 @@ lc_age(struct attrib * a)
int retval = -1; int retval = -1;
assert(b!=NULL); assert(b!=NULL);
if (fname==NULL) return -1; if (fname!=NULL) {
lua_State * L = (lua_State *)global.vm_state;
lua_State * L = (lua_State *)global.vm_state; if (is_function(L, fname)) {
if (is_function(L, fname)) { try {
try { if (fparam) {
if (fparam) { std::string param(fparam);
#ifdef TUNNELS /* TODO: Why does this crash? */ retval = luabind::call_function<int>(L, fname, *b, param);
std::string param(fparam); } else {
retval = luabind::call_function<int>(L, fname, *b, param); retval = luabind::call_function<int>(L, fname, *b);
#endif }
} else { }
retval = luabind::call_function<int>(L, fname, *b); catch (luabind::error& e) {
lua_State* L = e.state();
const char* error = lua_tostring(L, -1);
log_error(("An exception occured while %s tried to call '%s': %s.\n",
buildingname(b), fname, error));
lua_pop(L, 1);
/* std::terminate(); */
} }
} }
catch (luabind::error& e) {
lua_State* L = e.state();
const char* error = lua_tostring(L, -1);
log_error(("An exception occured while %s tried to call '%s': %s.\n",
buildingname(b), fname, error));
lua_pop(L, 1);
std::terminate();
}
} }
return retval; return (retval!=0)?AT_AGE_KEEP:AT_AGE_REMOVE;
} }
static int static int

View File

@ -30,7 +30,7 @@ end
-- export, will be called from lc_age() -- export, will be called from lc_age()
function tunnel_action(b, param) function tunnel_action(b, param)
local r = nil local r = nil
print("Tunnel from " .. b .. " [" .. param .. "]") print("Tunnel from " .. tostring(b) .. " [" .. param .. "]")
if tonumber(param)~=nil then if tonumber(param)~=nil then
r = get_region_by_id(tonumber(param)) r = get_region_by_id(tonumber(param))
end end
@ -43,7 +43,7 @@ function tunnel_action(b, param)
end end
if rto~=nil then if rto~=nil then
u.region = rto u.region = rto
print(" - teleported " .. u .. " to " .. rto) print(" - teleported " .. tostring(u) .. " to " .. tostring(rto))
end end
end end
end end

View File

@ -94,13 +94,52 @@ function test_287()
write_game("287.dat", "binary") write_game("287.dat", "binary")
end 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") loadscript("default.lua")
run_scripts() run_scripts()
-- go -- go
-- test_free() -- test_free()
-- test_bmark() -- test_bmark()
-- test_realloc() -- test_realloc()
test_hse() -- test_hse()
test_tunnels()
-- test_md5() -- test_md5()
-- test_287() -- test_287()
-- io.stdin:read("*line") -- io.stdin:read("*line")