- richtig viele bugfixes

This commit is contained in:
Enno Rehling 2009-07-01 01:03:12 +00:00
parent 3fc0e27776
commit f614691713
20 changed files with 204 additions and 79 deletions

View File

@ -1152,17 +1152,25 @@ cr_output_region(FILE * F, report_context * ctx, seen_region * sr)
if (sr->mode>=see_unit) {
fprintf(F, "%d;Silber\n", rmoney(r));
if (skill_enabled[SK_ENTERTAINMENT]) {
fprintf(F, "%d;Unterh\n", entertainmoney(r));
}
if (is_cursed(r->attribs, C_RIOT, 0)){
fprintf(F, "0;Rekruten\n");
} else {
fprintf(F, "%d;Rekruten\n", rpeasants(r) / RECRUITFRACTION);
}
if (production(r)) {
if (markets_module()) { /* hack */
fprintf(F, "%d;Lohn\n", wage(r, NULL, NULL));
} else {
fprintf(F, "%d;Lohn\n", wage(r, f, f->race));
}
}
if (r->land->ownership) {
fprintf(F, "%d;morale\n", r->land->morale);
}
}
/* this writes both some tags (RESOURCECOMPAT) and a block.
* must not write any blocks before it */

View File

@ -579,7 +579,7 @@ recruit(unit * u, struct order * ord, request ** recruitorders)
cmistake(u, ord, 139, MSG_EVENT);
return;
}
else u->race = rc;
else u->irace = u->race = rc;
}
if (has_skill(u, SK_MAGIC)) {

View File

@ -708,7 +708,7 @@ growing_trees(region * r, const int current_season, const int last_weeks_season)
/* Grundchance 1.0% */
/* Jeder Elf in der Region erhöht die Chance um 0.0008%. */
seedchance += (MIN(elves, (production(r)*MAXPEASANTS_PER_AREA)/8)) * 0.0008;
seedchance += (MIN(elves, (production(r)*MAXPEASANTS_PER_AREA)/8)) * 0.0008 * RESOURCE_QUANTITY;
grownup_trees = rtrees(r, 2);
seeds = 0;
@ -2974,6 +2974,9 @@ static void age_region(region * r)
if (stability>MORALE_COOLDOWN) {
if (r->land->ownership->owner && r->land->morale<MORALE_MAX) {
double ch = rc_popularity(r->land->ownership->owner->race);
if (is_cursed(r->attribs, C_GENEROUS, 0)) {
ch *= 1.2; /* 20% improvement */
}
if (chance(ch)) {
++r->land->morale;
r->land->ownership->morale_turn = turn;

View File

@ -951,6 +951,11 @@ describe(FILE * F, const seen_region * sr, faction * f)
bytes = snprintf(bufp, size, ", %d", n);
if (wrptr(&bufp, &size, bytes)!=0) WARN_STATIC_BUFFER();
if (r->land->ownership) {
const char * str = locale_string(f->locale, mkname("morale", itoa10(r->land->morale)));
bytes = snprintf(bufp, size, " %s", str);
if (wrptr(&bufp, &size, bytes)!=0) WARN_STATIC_BUFFER();
}
if (fval(r, RF_ORCIFIED)) {
bytes = (int)strlcpy(bufp, " ", size);
if (wrptr(&bufp, &size, bytes)!=0) WARN_STATIC_BUFFER();
@ -1177,14 +1182,18 @@ statistics(FILE * F, const region * r, const faction * f)
rnl(F);
/* Region */
if (fval(r->terrain, LAND_REGION) && rmoney(r)) {
if (skill_enabled[SK_ENTERTAINMENT] && fval(r->terrain, LAND_REGION) && rmoney(r)) {
m = msg_message("nr_stat_maxentertainment", "max", entertainmoney(r));
nr_render(m, f->locale, buf, sizeof(buf), f);
rparagraph(F, buf, 2, 2, 0);
msg_release(m);
}
if (production(r) && (!fval(r->terrain, SEA_REGION) || f->race == new_race[RC_AQUARIAN])) {
if (markets_module()) { /* hack */
m = msg_message("nr_stat_salary_new", "max", wage(r, NULL, NULL));
} else {
m = msg_message("nr_stat_salary", "max", wage(r, f, f->race));
}
nr_render(m, f->locale, buf, sizeof(buf), f);
rparagraph(F, buf, 2, 2, 0);
msg_release(m);
@ -1195,6 +1204,7 @@ statistics(FILE * F, const region * r, const faction * f)
rparagraph(F, buf, 2, 2, 0);
msg_release(m);
if (!markets_module()) {
if (buildingtype_exists(r, bt_find("caravan"))) {
m = msg_message("nr_stat_luxuries", "max",
(p * 2) / TRADE_FRACTION);
@ -1206,6 +1216,7 @@ statistics(FILE * F, const region * r, const faction * f)
rparagraph(F, buf, 2, 2, 0);
msg_release(m);
}
}
/* info about units */
m = msg_message("nr_stat_people", "max", number);
@ -2185,7 +2196,7 @@ report_plaintext(const char * filename, report_context * ctx, const char * chars
const item_type * lux = r_luxury(r);
const item_type * herb = r->land->herbtype;
message * m = msg_message("nr_market_info", "product herb",
lux->rtype, herb?herb->rtype:0);
lux?lux->rtype:0, herb?herb->rtype:0);
rnl(F);
nr_paragraph(F, m, f);

View File

@ -476,12 +476,15 @@ teach_cmd(unit * u, struct order * ord)
static double
study_speedup(unit * u)
{
#define MINTURN 5 /* 5 */
#define OFSTURN 2 /* 2 */
if (turn>MINTURN) {
static int rule = -1;
if (rule<0) {
rule = get_param_int(global.parameters, "study.speedup", 0);
}
if (rule==1) {
double age = 0;
double age = OFSTURN;
int i;
for (i=0;i!=u->skill_size;++i) {
skill * sv = u->skills+i;
@ -492,6 +495,7 @@ study_speedup(unit * u)
return 2.0-age/turn;
}
}
}
return 1.0;
}

View File

@ -151,6 +151,7 @@ resourcename(const resource_type * rtype, int flags)
{
int i = 0;
if (rtype) {
if (rtype->name) return rtype->name(rtype, flags);
if (flags & NMF_PLURAL) i = 1;
@ -159,6 +160,8 @@ resourcename(const resource_type * rtype, int flags)
}
return rtype->_name[i];
}
return "none";
}
resource_type *
new_resourcetype(const char ** names, const char ** appearances, int flags)

View File

@ -53,6 +53,8 @@
#include <util/rng.h>
#include <util/storage.h>
#include <modules/autoseed.h>
/* libc includes */
#include <assert.h>
#include <ctype.h>
@ -888,6 +890,10 @@ const item_type *
r_luxury(region * r)
{
struct demand * dmd;
if (!r->land->demands) {
fix_demand(r);
assert(r->land->demands);
}
for (dmd=r->land->demands;dmd;dmd=dmd->next) {
if (dmd->value==0) return dmd->type->itype;
}

View File

@ -1032,7 +1032,7 @@ seen_done(seen_region * seehash[])
reuse = seehash[i];
seehash[i] = NULL;
}
free(seehash);
// free(seehash);
}
void

View File

@ -226,7 +226,7 @@ rc_skillmod(const struct race * rc, const region *r, skill_t sk)
{
int mods;
if (!skill_enabled[SK_PERCEPTION]) return 0;
if (!skill_enabled[sk]) return 0;
#ifdef FASTER_SKILLMOD
unsigned int index = hashstring(rc->_name[0]) % RCMODMAXHASH;
struct skillmods **imods = &modhash[index];

View File

@ -4199,10 +4199,10 @@ sp_generous(castorder *co)
message * m = NULL;
fset(u->faction, FFL_SELECT);
if (cansee(u->faction, r, mage, 0)) {
if (msg[0]==NULL) msg[0] = msg_message("song_of_peace_effect_0", "mage", mage);
if (msg[0]==NULL) msg[0] = msg_message("generous_effect_0", "mage", mage);
m = msg[0];
} else {
if (msg[1]==NULL) msg[1] = msg_message("song_of_peace_effect_1", "");
if (msg[1]==NULL) msg[1] = msg_message("generous_effect_1", "");
m = msg[1];
}
r_addmessage(r, u->faction, m);

View File

@ -542,6 +542,11 @@ read_args(int argc, char **argv, lua_State * luaState)
}
/* add some more variables to the lua globals */
if (script_path) {
char str[512];
sprintf(str, "?;?.lua;%s/?.lua;%s/?", script_path, script_path);
setLuaString(luaState, "LUA_PATH", str);
}
setLuaString(luaState, "datapath", datapath());
setLuaString(luaState, "scriptpath", script_path);
setLuaString(luaState, "basepath", basepath());
@ -625,7 +630,7 @@ write_skills(void)
fputs("\"Rasse\",", F);
for (rc=races;rc;rc = rc->next) {
if (playerrace(rc)) {
fprintf(F, "\"%s\",", LOC(loc, rc->_name[0]));
fprintf(F, "\"%s\",", LOC(loc, mkname("race", rc->_name[0])));
}
}
fputc('\n', F);
@ -690,7 +695,9 @@ main(int argc, char *argv[])
if (luafile==NULL) lua_console(luaState);
else {
char buf[MAX_PATH];
if (script_path) sprintf(buf, "%s/%s", script_path, luafile);
if (script_path) {
sprintf(buf, "%s/%s", script_path, luafile);
}
else strcpy(buf, luafile);
#ifdef BINDINGS_LUABIND
try {

View File

@ -163,6 +163,15 @@ tolua_faction_get_options(lua_State* L)
return 1;
}
static int
tolua_faction_set_options(lua_State* L)
{
faction * self = (faction *)tolua_tousertype(L, 1, 0);
int options = (int)tolua_tonumber(L, 2, self->options);
self->options = options;
return 1;
}
static int
tolua_faction_get_lastturn(lua_State* L)
{
@ -452,7 +461,7 @@ tolua_faction_open(lua_State* L)
tolua_variable(L, "score", tolua_faction_get_score, NULL);
tolua_variable(L, "id", tolua_faction_get_id, tolua_faction_set_id);
tolua_variable(L, "age", tolua_faction_get_age, tolua_faction_set_age);
tolua_variable(L, "options", tolua_faction_get_options, NULL);
tolua_variable(L, "options", tolua_faction_get_options, tolua_faction_set_options);
tolua_variable(L, "flags", tolua_faction_get_flags, NULL);
tolua_variable(L, "lastturn", tolua_faction_get_lastturn, NULL);

View File

@ -823,8 +823,10 @@ static int tolua_unit_set_race(lua_State* L)
const char * rcname = tolua_tostring(L, 2, 0);
race * rc = rc_find(rcname);
if (rc!=NULL) {
if (count_unit(self)) --self->faction->no_units;
if (self->irace==self->race) self->irace = rc;
self->race = rc;
if (count_unit(self)) --self->faction->no_units;
}
return 0;
}

View File

@ -166,7 +166,7 @@
</construction>
</building>
<building name="castle" capacity="1" protection="yes">
<building name="castle" capacity="1" protection="yes" taxes="yes">
<function name="name" value="castle_name"/>
<construction skill="building" minskill="1" maxsize="2" reqsize="1">
<requirement type="stone" quantity="1"/>

View File

@ -40,13 +40,13 @@
<equipment>
<set name="first_unit">
<item name="conquesttoken" amount="1"/>
<item name="log" amount="30"/>
<item name="stone" amount="30"/>
<item name="money" amount="4200"/>
<item name="log" amount="10"/>
<item name="stone" amount="10"/>
<item name="money" amount="5000"/>
</set>
<set name="new_faction">
<!--set name="new_faction">
<item name="adamantium" amount="1"/>
</set>
</set-->
</equipment>
<xi:include href="names-undead.xml"/>
@ -178,13 +178,13 @@
</string>
<string name="newbie_info_1">
<text locale="de">Bitte denke daran, deine Befehle mit dem Betreff
ERESSEA BEFEHLE an eressea-server@eressea.de zu senden.</text>
E3 BEFEHLE an eressea-server@eressea.de zu senden.</text>
<text locale="en">Remember to send your orders to
eressea-server@eressea.de with the subject ERESSEA ORDERS.</text>
eressea-server@eressea.de with the subject E3 ORDERS.</text>
</string>
<string name="mailcmd">
<text locale="de">ERESSEA BEFEHLE</text>
<text locale="en">ERESSEA ORDERS</text>
<text locale="de">E3 BEFEHLE</text>
<text locale="en">E3 ORDERS</text>
</string>
</strings>
</eressea>

View File

@ -74,7 +74,7 @@
<function name="itemdrop" value="defaultdrops"/>
<param name="other_race" value="dwarf"/>
<param name="other_cost" value="500"/>
<param name="morale" value="5"/>
<param name="morale" value="8"/>
<param name="luxury_trade" value="600"/>
<skill name="bow" modifier="-1"/>
<skill name="building" modifier="1"/>
@ -103,7 +103,6 @@
<function name="itemdrop" value="defaultdrops"/>
<skill name="cartmaking" modifier="-2"/>
<skill name="forestry" modifier="1"/>
<skill name="magic" modifier="1"/>
<skill name="melee" modifier="1"/>
<skill name="polearm" modifier="1"/>
<skill name="riding" modifier="-1"/>
@ -127,7 +126,6 @@
<skill name="bow" modifier="2"/>
<skill name="building" modifier="-1"/>
<skill name="catapult" modifier="-2"/>
<skill name="magic" modifier="1"/>
<skill name="mining" modifier="-2"/>
<skill name="quarrying" modifier="-1"/>
<skill name="roadwork" modifier="-1"/>
@ -171,7 +169,6 @@
<skill name="building" modifier="2"/>
<skill name="catapult" modifier="2"/>
<skill name="forestry" modifier="-1"/>
<skill name="magic" modifier="-2"/>
<skill name="melee" modifier="1"/>
<skill name="mining" modifier="2"/>
<skill name="quarrying" modifier="2"/>

View File

@ -364,21 +364,21 @@
<!-- end gwyrrd -->
<!-- new tybied - spells known to all schools -->
<spell name="create_potion_p2" type="tybied" ship="true" rank="5" level="2">
<spell name="create_potion_p2" type="tybied" ship="true" rank="5" level="2" variable="true">
<!-- Wasser des Lebens -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="2" cost="linear"/>
<resource name="h4" amount="1" cost="linear"/><!-- Baumringel -->
<resource name="h6" amount="1" cost="linear"/><!-- Gurgelkraut -->
</spell>
<spell name="create_potion_p0" type="tybied" ship="true" rank="5" level="3">
<spell name="create_potion_p0" type="tybied" ship="true" rank="5" level="3" variable="true">
<!-- Siebenmeilentee -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="2" cost="linear"/>
<resource name="h12" amount="1" cost="linear"/><!-- Windbeutel -->
<resource name="h17" amount="1" cost="linear"/><!-- Höhlenglimm -->
</spell>
<spell name="create_potion_p9" type="tybied" ship="true" rank="5" level="4">
<spell name="create_potion_p9" type="tybied" ship="true" rank="5" level="4" variable="true">
<!-- Pferdeglück -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="3" cost="linear"/>
@ -386,7 +386,7 @@
<resource name="h8" amount="1" cost="linear"/><!-- Blasenmorchel -->
<resource name="h15" amount="1" cost="linear"/><!-- Steinbeißer -->
</spell>
<spell name="create_potion_peasantblood" type="tybied" ship="true" rank="5" level="5">
<spell name="create_potion_peasantblood" type="tybied" ship="true" rank="5" level="5" variable="true">
<!-- Bauernblut -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="3" cost="linear"/>
@ -396,7 +396,7 @@
<resource name="peasant" amount="1" cost="fixed"/><!-- Bauer -->
</spell>
<spell name="create_potion_ointment" type="tybied" ship="true" rank="5" level="6">
<spell name="create_potion_ointment" type="tybied" ship="true" rank="5" level="6" variable="true">
<!-- Wundsalbe -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="4" cost="linear"/>
@ -405,7 +405,7 @@
<resource name="h18" amount="1" cost="linear"/><!-- Eisblume -->
<resource name="h11" amount="1" cost="linear"/><!-- Sandfäule -->
</spell>
<spell name="create_potion_p3" type="tybied" ship="true" rank="5" level="7">
<spell name="create_potion_p3" type="tybied" ship="true" rank="5" level="7" variable="true">
<!-- Schaffenstrunk -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="4" cost="linear"/>
@ -414,7 +414,7 @@
<resource name="h20" amount="1" cost="linear"/><!-- Schneekristall -->
<resource name="h9" amount="1" cost="linear"/><!-- Wasserfinder -->
</spell>
<spell name="create_potion_p14" type="tybied" ship="true" rank="5" level="8">
<spell name="create_potion_p14" type="tybied" ship="true" rank="5" level="8" variable="true">
<!-- Heiltrank -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="5" cost="linear"/>
@ -424,7 +424,7 @@
<resource name="h18" amount="1" cost="linear"/><!-- Eisblume -->
<resource name="h9" amount="1" cost="linear"/><!-- Wasserfinder -->
</spell>
<spell name="create_potion_p13" type="tybied" ship="true" rank="5" level="9">
<spell name="create_potion_p13" type="tybied" ship="true" rank="5" level="9" variable="true">
<!-- Elixier der Macht -->
<function name="cast" value="lua_castspell"/>
<resource name="aura" amount="5" cost="linear"/>

View File

@ -42,6 +42,32 @@
<text locale="en">marketplace</text>
</string>
<namespace name="morale">
<string name="0">
<text locale="de">aufständische</text>
<text locale="en">rebellious</text>
</string>
<string name="1">
<text locale="de">zornige</text>
<text locale="en">angry</text>
</string>
<string name="2">
<text locale="de">zufriedene</text>
<text locale="en">content</text>
</string>
<string name="3">
<text locale="de">glückliche</text>
<text locale="en">happy</text>
</string>
<string name="4">
<text locale="de">treue</text>
<text locale="en">loyal</text>
</string>
<string name="5">
<text locale="de">ergebene</text>
<text locale="en">devoted</text>
</string>
</namespace>
<string name="charger">
<text locale="de">Streitross</text>
<text locale="en">charger</text>
@ -59,23 +85,49 @@
<text locale="en">tower shields</text>
</string>
<namespace name="spell">
<string name="create_potion_p0">
<text locale="de">Siebenmeilentee</text>
<text locale="en">seven mile tea</text>
<text locale="de">Braue Siebenmeilentee</text>
<text locale="en">brew seven mile tea</text>
</string>
<string name="create_potion_p2">
<text locale="de">Wasser des Lebens</text>
<text locale="en">water of life</text>
<text locale="de">Braue Wasser des Lebens</text>
<text locale="en">brew water of life</text>
</string>
<string name="create_potion_p3">
<text locale="de">Braue Schaffenstrunk</text>
<text locale="en">brew busy beer</text>
</string>
<string name="create_potion_ointment">
<text locale="de">Braue Wundsalbe</text>
<text locale="en">brew ointment</text>
</string>
<string name="create_potion_peasantblood">
<text locale="de">Braue Bauernblut</text>
<text locale="en">brew peasant blood</text>
</string>
<string name="create_potion_p9">
<text locale="de">Braue Pferdeglück</text>
<text locale="en">brew horsepower potion</text>
</string>
<string name="create_potion_p13">
<text locale="de">Braue Elixier der Macht</text>
<text locale="en">brew elixir of power</text>
</string>
<string name="create_potion_p14">
<text locale="de">Braue Heiltrank</text>
<text locale="en">brew healing potion</text>
</string>
</namespace>
<namespace name="spell">
<namespace name="spellinfo">
<string name="create_potion_p0">
<text locale="en">For Seven Mile Tea, boil up a Cobalt Fungus and pour the resulting brew into a Windbag. Catch and filter the liquid that drips out and administer it. This tea allows up to ten men to move as fast as a horse.</text>
<text locale="de">Für den Siebenmeilentee koche man einen Blauen Baumringel auf und gieße dieses Gebräu in einen Windbeutel. Das heraustropfende Wasser fange man auf, filtere es und verabreiche es alsdann. Durch diesen Tee können bis zu zehn Menschen schnell wie ein Pferd laufen.</text>
</string>
<string name="create_potion_p2">
<text locale="en">The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood.</text>
<text locale="de">Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so daß man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme.</text>
<text locale="en">The Water of Life allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood.</text>
<text locale="de">Das Wasser des Lebens ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so daß man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme.</text>
</string>
<string name="create_potion_p3">
<text locale="en">Allow a Tangy Temerity to simmer for three hours in a litre of water, then add a grated Mandrake, and sprinkle in a Gapgrowth harvested at full moon. The whole brew should then be allowed to stew for three days in a warm place. This potion increases the strength and endurance of ten men so that they can achieve twice as much in a week.</text>
@ -102,5 +154,22 @@
<text locale="de">Für einen Heiltrank nehme man die Schale eines Windbeutels und etwas Gurgelkraut, rühre eine kleingehacktes Elfenlieb dazu und bestreue alles mit den Blüten einer Eisblume. Dies muß vier Tage lang gären, wobei man am zweiten Tag einen Spaltwachs dazutun muß. Dann ziehe man vorsichtig den oben schwimmenden Saft ab. Ein solcher Trank gibt vier Männern (oder einem Mann vier mal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt.</text>
</string>
</namespace>
<namespace name="spell">
<string name="commonfamiliar">
<text locale="de">Vertrauten binden</text>
<text locale="en">Bind Familiar</text>
</string>
</namespace>
<namespace name="spellinfo">
<string name="commonfamiliar">
<text locale="de">Einem erfahrenen Magier wird
irgendwann auf seinen Wanderungen ein
ungewöhnliches Exemplar einer Gattung begegnen,
welches sich dem Magier anschließen wird.</text>
<text locale="en">During their travel, seasoned
magicians will occasionally befriend an extraordinary
creature of an unusual species that will join them.</text>
</string>
</namespace>
</strings>

View File

@ -800,7 +800,13 @@
</type>
<text locale="de">"Lohn für Arbeit: $int($max) Silber"</text>
<text locale="en">"Worker's salary: $int($max) silver"</text>
<text locale="fr">"Worker's salary: $int($max) silver"</text>
</message>
<message name="nr_stat_salary_new" section="nr">
<type>
<arg name="max" type="int"/>
</type>
<text locale="de">"Bauerneinnahmen: $int($max) Silber"</text>
<text locale="en">"Peasant wages: $int($max) silver"</text>
</message>
<message name="nr_stat_people" section="nr">
<type>
@ -6799,7 +6805,7 @@
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Boot zuerst verlassen."</text>
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen."</text>
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building."</text>
</message>
<message name="error12" section="errors">

View File

@ -71,7 +71,7 @@ function process(orders)
spawn_dragons()
spawn_undead()
-- spawn_braineaters(0.25)
spawn_ents()
-- spawn_ents()
-- post-turn updates:
update_guards()