forked from github/server
BUG 2396: insect recruit messages fixed, and tests added.
This commit is contained in:
parent
683e3c566d
commit
cba452786f
|
@ -818,6 +818,10 @@
|
||||||
<string name="section_events">
|
<string name="section_events">
|
||||||
<text locale="de">Ereignisse</text>
|
<text locale="de">Ereignisse</text>
|
||||||
</string>
|
</string>
|
||||||
|
<string name="section_nr">
|
||||||
|
<text locale="de">Hinweise</text>
|
||||||
|
<text locale="en">Notifications</text>
|
||||||
|
</string>
|
||||||
<string name="section_mail">
|
<string name="section_mail">
|
||||||
<text locale="de">Botschaften</text>
|
<text locale="de">Botschaften</text>
|
||||||
</string>
|
</string>
|
||||||
|
@ -7305,16 +7309,6 @@
|
||||||
<text locale="en">regular spell</text>
|
<text locale="en">regular spell</text>
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<string name="nr_insectwinter">
|
|
||||||
<text locale="de">Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren.</text>
|
|
||||||
<text locale="en">It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions.</text>
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<string name="nr_insectfall">
|
|
||||||
<text locale="de">Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können.</text>
|
|
||||||
<text locale="en">It is the last week before winter in which insects can still recruit.</text>
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<string name="nr_owner">
|
<string name="nr_owner">
|
||||||
<text locale="de">Eigentümer</text>
|
<text locale="de">Eigentümer</text>
|
||||||
<text locale="en">Owner</text>
|
<text locale="en">Owner</text>
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<messages>
|
<messages>
|
||||||
|
<message name="nr_insectwinter" section="nr">
|
||||||
|
<text locale="de">Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren.</text>
|
||||||
|
<text locale="en">It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions.</text>
|
||||||
|
</message>
|
||||||
|
<message name="nr_insectfall" section="nr">
|
||||||
|
<text locale="de">Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können.</text>
|
||||||
|
<text locale="en">It is the last week before winter in which insects can still recruit.</text>
|
||||||
|
</message>
|
||||||
<message name="newbie_info_game" section="events">
|
<message name="newbie_info_game" section="events">
|
||||||
<type>
|
<type>
|
||||||
<arg name="subject" type="string"/>
|
<arg name="subject" type="string"/>
|
||||||
|
@ -7049,7 +7057,7 @@
|
||||||
<text locale="en">"Please send in orders for the next turn if you want to continue playing."</text>
|
<text locale="en">"Please send in orders for the next turn if you want to continue playing."</text>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="newbieimmunity" section="events">
|
<message name="newbieimmunity" section="nr">
|
||||||
<type>
|
<type>
|
||||||
<arg name="turns" type="int"/>
|
<arg name="turns" type="int"/>
|
||||||
</type>
|
</type>
|
||||||
|
|
|
@ -44,9 +44,10 @@ const gamedate *get_gamedate(int turn, gamedate * gd)
|
||||||
assert(gd);
|
assert(gd);
|
||||||
assert(t>=0);
|
assert(t>=0);
|
||||||
|
|
||||||
|
gd->turn = turn;
|
||||||
gd->week = t % weeks_per_month; /* 0 - weeks_per_month-1 */
|
gd->week = t % weeks_per_month; /* 0 - weeks_per_month-1 */
|
||||||
gd->month = (t / weeks_per_month + first_month) % months_per_year; /* 0 - months_per_year-1 */
|
gd->month = (t / weeks_per_month + first_month) % months_per_year; /* 0 - months_per_year-1 */
|
||||||
gd->year = t / (weeks_per_year)+1;
|
gd->year = 1 + t / weeks_per_year;
|
||||||
gd->season = month_season ? month_season[gd->month] : 0;
|
gd->season = month_season ? month_season[gd->month] : 0;
|
||||||
return gd;
|
return gd;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ extern "C" {
|
||||||
extern int weeks_per_month;
|
extern int weeks_per_month;
|
||||||
|
|
||||||
typedef struct gamedate {
|
typedef struct gamedate {
|
||||||
|
int turn;
|
||||||
int year;
|
int year;
|
||||||
int season;
|
int season;
|
||||||
int month;
|
int month;
|
||||||
|
|
|
@ -1297,10 +1297,6 @@ void quit(void)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
++f->age;
|
++f->age;
|
||||||
if (f->age + 1 < NewbieImmunity()) {
|
|
||||||
ADDMSG(&f->msgs, msg_message("newbieimmunity", "turns",
|
|
||||||
NewbieImmunity() - f->age - 1));
|
|
||||||
}
|
|
||||||
fptr = &f->next;
|
fptr = &f->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -681,7 +681,7 @@ int check_ship_allowed(struct ship *sh, const region * r)
|
||||||
/* insekten dürfen nicht hier rein. haben wir welche? */
|
/* insekten dürfen nicht hier rein. haben wir welche? */
|
||||||
unit *u = ship_owner(sh);
|
unit *u = ship_owner(sh);
|
||||||
|
|
||||||
if (is_freezing(u)) {
|
if (u && is_freezing(u)) {
|
||||||
return SA_NO_INSECT;
|
return SA_NO_INSECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,7 +267,7 @@ static void dragon_name(unit * u)
|
||||||
str = locale_getstring(default_locale, zText);
|
str = locale_getstring(default_locale, zText);
|
||||||
assert(str != NULL);
|
assert(str != NULL);
|
||||||
|
|
||||||
if (u->number > 1) {
|
if (u->region->land && (u->number > 1)) {
|
||||||
const char *no_article = strchr((const char *)str, ' ');
|
const char *no_article = strchr((const char *)str, ' ');
|
||||||
assert(no_article);
|
assert(no_article);
|
||||||
/* TODO: localization */
|
/* TODO: localization */
|
||||||
|
@ -282,7 +282,7 @@ static void dragon_name(unit * u)
|
||||||
sprintf(name, "%s, %s", n, str); /* "Name, der Titel" */
|
sprintf(name, "%s, %s", n, str); /* "Name, der Titel" */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (rng_int() % 3 == 0) {
|
if (u->region->land && (rng_int() % 3 == 0)) {
|
||||||
/* TODO: localization */
|
/* TODO: localization */
|
||||||
snprintf(name, sizeof(name), "%s %s von %s", n, str, rname(u->region, default_locale));
|
snprintf(name, sizeof(name), "%s %s von %s", n, str, rname(u->region, default_locale));
|
||||||
}
|
}
|
||||||
|
|
33
src/report.c
33
src/report.c
|
@ -42,11 +42,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
/* gamecode includes */
|
/* gamecode includes */
|
||||||
#include "alchemy.h"
|
#include "alchemy.h"
|
||||||
|
#include "calendar.h"
|
||||||
#include "economy.h"
|
#include "economy.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "upkeep.h"
|
#include "upkeep.h"
|
||||||
#include "vortex.h"
|
#include "vortex.h"
|
||||||
#include "calendar.h"
|
|
||||||
#include "teleport.h"
|
#include "teleport.h"
|
||||||
|
|
||||||
/* kernel includes */
|
/* kernel includes */
|
||||||
|
@ -744,8 +744,13 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden
|
||||||
newline(out);
|
newline(out);
|
||||||
sprintf(cat_identifier, "section_%s", section->name);
|
sprintf(cat_identifier, "section_%s", section->name);
|
||||||
section_title = LOC(viewer->locale, cat_identifier);
|
section_title = LOC(viewer->locale, cat_identifier);
|
||||||
centre(out, section_title, true);
|
if (section_title) {
|
||||||
newline(out);
|
centre(out, section_title, true);
|
||||||
|
newline(out);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_error("no title defined for section %s in locale %s", section->name, locale_name(viewer->locale));
|
||||||
|
}
|
||||||
k = 1;
|
k = 1;
|
||||||
}
|
}
|
||||||
nr_render(m->msg, viewer->locale, lbuf, sizeof(lbuf), viewer);
|
nr_render(m->msg, viewer->locale, lbuf, sizeof(lbuf), viewer);
|
||||||
|
@ -2050,14 +2055,6 @@ report_plaintext(const char *filename, report_context * ctx,
|
||||||
char buf[8192];
|
char buf[8192];
|
||||||
char *bufp;
|
char *bufp;
|
||||||
size_t size;
|
size_t size;
|
||||||
int thisseason;
|
|
||||||
int nextseason;
|
|
||||||
gamedate date;
|
|
||||||
|
|
||||||
get_gamedate(turn + 1, &date);
|
|
||||||
thisseason = date.season;
|
|
||||||
get_gamedate(turn + 2, &date);
|
|
||||||
nextseason = date.season;
|
|
||||||
|
|
||||||
if (F == NULL) {
|
if (F == NULL) {
|
||||||
perror(filename);
|
perror(filename);
|
||||||
|
@ -2161,20 +2158,6 @@ report_plaintext(const char *filename, report_context * ctx,
|
||||||
centre(out, buf, true);
|
centre(out, buf, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insekten-Winter-Warnung */
|
|
||||||
if (f->race == get_race(RC_INSECT)) {
|
|
||||||
if (thisseason == 0) {
|
|
||||||
centre(out, LOC(f->locale, "nr_insectwinter"), true);
|
|
||||||
newline(out);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (nextseason == 0) {
|
|
||||||
centre(out, LOC(f->locale, "nr_insectfall"), true);
|
|
||||||
newline(out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bufp = buf;
|
bufp = buf;
|
||||||
size = sizeof(buf) - 1;
|
size = sizeof(buf) - 1;
|
||||||
bytes = snprintf(buf, size, "%s:", LOC(f->locale, "nr_options"));
|
bytes = snprintf(buf, size, "%s:", LOC(f->locale, "nr_options"));
|
||||||
|
|
|
@ -19,6 +19,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
|
|
||||||
|
#include "calendar.h"
|
||||||
#include "guard.h"
|
#include "guard.h"
|
||||||
#include "laws.h"
|
#include "laws.h"
|
||||||
#include "spells.h"
|
#include "spells.h"
|
||||||
|
@ -1396,6 +1398,29 @@ static void cb_add_seen(region *r, unit *u, void *cbdata) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void report_warnings(faction *f, const gamedate *date)
|
||||||
|
{
|
||||||
|
if (f->age < NewbieImmunity()) {
|
||||||
|
ADDMSG(&f->msgs, msg_message("newbieimmunity", "turns",
|
||||||
|
NewbieImmunity() - f->age));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (date) {
|
||||||
|
if (f->race == get_race(RC_INSECT)) {
|
||||||
|
if (date->season == 0) {
|
||||||
|
ADDMSG(&f->msgs, msg_message("nr_insectwinter", ""));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gamedate next;
|
||||||
|
get_gamedate(date->turn + 1, &next);
|
||||||
|
if (next.season == 0) {
|
||||||
|
ADDMSG(&f->msgs, msg_message("nr_insectfall", ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** set region.seen based on visibility by one faction.
|
/** set region.seen based on visibility by one faction.
|
||||||
*
|
*
|
||||||
* this function may also update ctx->last and ctx->first for potential
|
* this function may also update ctx->last and ctx->first for potential
|
||||||
|
@ -1408,6 +1433,11 @@ void prepare_report(report_context *ctx, faction *f)
|
||||||
static bool rule_region_owners;
|
static bool rule_region_owners;
|
||||||
static bool rule_lighthouse_units;
|
static bool rule_lighthouse_units;
|
||||||
const struct building_type *bt_lighthouse = bt_find("lighthouse");
|
const struct building_type *bt_lighthouse = bt_find("lighthouse");
|
||||||
|
gamedate now;
|
||||||
|
|
||||||
|
/* Insekten-Winter-Warnung */
|
||||||
|
get_gamedate(turn, &now);
|
||||||
|
report_warnings(f, &now);
|
||||||
|
|
||||||
if (bt_lighthouse && config_changed(&config)) {
|
if (bt_lighthouse && config_changed(&config)) {
|
||||||
rule_region_owners = config_token("rules.region_owner_pay_building", bt_lighthouse->_name);
|
rule_region_owners = config_token("rules.region_owner_pay_building", bt_lighthouse->_name);
|
||||||
|
|
|
@ -29,6 +29,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct gamedate;
|
||||||
struct selist;
|
struct selist;
|
||||||
struct stream;
|
struct stream;
|
||||||
struct seen_region;
|
struct seen_region;
|
||||||
|
@ -116,6 +117,7 @@ extern "C" {
|
||||||
int size, const struct faction *viewer, bool see_unit);
|
int size, const struct faction *viewer, bool see_unit);
|
||||||
int report_items(const struct unit *u, struct item *result, int size,
|
int report_items(const struct unit *u, struct item *result, int size,
|
||||||
const struct unit *owner, const struct faction *viewer);
|
const struct unit *owner, const struct faction *viewer);
|
||||||
|
void report_warnings(struct faction *f, const struct gamedate *date);
|
||||||
void report_item(const struct unit *owner, const struct item *i,
|
void report_item(const struct unit *owner, const struct item *i,
|
||||||
const struct faction *viewer, const char **name, const char **basename,
|
const struct faction *viewer, const char **name, const char **basename,
|
||||||
int *number, bool singular);
|
int *number, bool singular);
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include "reports.h"
|
#include "reports.h"
|
||||||
|
|
||||||
#include "move.h"
|
#include "calendar.h"
|
||||||
#include "spy.h"
|
|
||||||
#include "lighthouse.h"
|
|
||||||
#include "travelthru.h"
|
|
||||||
#include "keyword.h"
|
#include "keyword.h"
|
||||||
|
#include "lighthouse.h"
|
||||||
|
#include "move.h"
|
||||||
#include "spells.h"
|
#include "spells.h"
|
||||||
|
#include "spy.h"
|
||||||
|
#include "travelthru.h"
|
||||||
|
|
||||||
#include <kernel/ally.h>
|
#include <kernel/ally.h>
|
||||||
#include <kernel/config.h>
|
#include <kernel/config.h>
|
||||||
|
@ -780,6 +781,45 @@ static void test_stealth_modifier(CuTest *tc) {
|
||||||
test_cleanup();
|
test_cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_insect_warnings(CuTest *tc) {
|
||||||
|
faction *f;
|
||||||
|
gamedate gd;
|
||||||
|
|
||||||
|
/* OBS: in unit tests, get_gamedate always returns season = 0 */
|
||||||
|
test_setup();
|
||||||
|
f = test_create_faction(test_create_race("insect"));
|
||||||
|
|
||||||
|
gd.turn = 0;
|
||||||
|
gd.season = 3;
|
||||||
|
report_warnings(f, &gd);
|
||||||
|
CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "nr_insectfall"));
|
||||||
|
|
||||||
|
gd.season = 0;
|
||||||
|
report_warnings(f, &gd);
|
||||||
|
CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "nr_insectwinter"));
|
||||||
|
test_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_newbie_warning(CuTest *tc) {
|
||||||
|
faction *f;
|
||||||
|
|
||||||
|
test_setup();
|
||||||
|
f = test_create_faction(test_create_race("insect"));
|
||||||
|
config_set_int("NewbieImmunity", 3);
|
||||||
|
|
||||||
|
f->age = 2;
|
||||||
|
report_warnings(f, NULL);
|
||||||
|
CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "newbieimmunity"));
|
||||||
|
test_clear_messages(f);
|
||||||
|
|
||||||
|
f->age = 3;
|
||||||
|
report_warnings(f, NULL);
|
||||||
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "newbieimmunity"));
|
||||||
|
test_clear_messages(f);
|
||||||
|
|
||||||
|
test_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
CuSuite *get_reports_suite(void)
|
CuSuite *get_reports_suite(void)
|
||||||
{
|
{
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
@ -807,5 +847,7 @@ CuSuite *get_reports_suite(void)
|
||||||
SUITE_ADD_TEST(suite, test_bufunit);
|
SUITE_ADD_TEST(suite, test_bufunit);
|
||||||
SUITE_ADD_TEST(suite, test_bufunit_fstealth);
|
SUITE_ADD_TEST(suite, test_bufunit_fstealth);
|
||||||
SUITE_ADD_TEST(suite, test_arg_resources);
|
SUITE_ADD_TEST(suite, test_arg_resources);
|
||||||
|
SUITE_ADD_TEST(suite, test_insect_warnings);
|
||||||
|
SUITE_ADD_TEST(suite, test_newbie_warning);
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue