Bug 2489: Kill the SIEGE command, forever.

This commit is contained in:
Enno Rehling 2018-09-09 21:01:10 +02:00
parent 062abe8102
commit 2e5e8347ac
33 changed files with 16 additions and 547 deletions

View file

@ -28,7 +28,6 @@
"stealth",
"taxation",
"trade",
"besiege",
"steal",
"buy",
"teach",

View file

@ -12,7 +12,6 @@
"work": [ "ARBEITE", "ARBEITEN" ],
"attack": ["ATTACKIERE", "ATTACKIEREN"],
"steal": [ "BEKLAUE", "BEKLAUEN" ],
"besiege": ["BELAGERE", "BELAGERN" ],
"name": [ "BENENNE", "BENENNEN" ],
"use": [ "BENUTZE", "BENUTZEN" ],
"describe": [ "BESCHREIBE", "BESCHREIBEN" ],

View file

@ -710,12 +710,6 @@
<arg name="dir" type="direction"/>
</type>
</message>
<message name="nr_building_besieged" section="nr">
<type>
<arg name="soldiers" type="int"/>
<arg name="diff" type="int"/>
</type>
</message>
<message name="newbie_password" section="events">
<type>
@ -2684,19 +2678,6 @@
<arg name="want" type="int"/>
</type>
</message>
<message name="siege_catapults" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="building" type="building"/>
<arg name="destruction" type="int"/>
</type>
</message>
<message name="siege" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="building" type="building"/>
</type>
</message>
<message name="drown_on_ship" section="events">
<type>
<arg name="unit" type="unit"/>
@ -3351,14 +3332,6 @@
<arg name="command" type="order"/>
</type>
</message>
<message name="entrance_besieged" section="events">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
<arg name="building" type="building"/>
</type>
</message>
<message name="entrance_denied" section="events">
<type>
<arg name="unit" type="unit"/>
@ -3890,13 +3863,6 @@
<arg name="command" type="order"/>
</type>
</message>
<message name="error166" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error165" section="errors">
<type>
<arg name="unit" type="unit"/>
@ -4002,13 +3968,6 @@
<arg name="command" type="order"/>
</type>
</message>
<message name="error60" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error151" section="errors">
<type>
<arg name="unit" type="unit"/>
@ -4993,20 +4952,6 @@
<arg name="command" type="order"/>
</type>
</message>
<message name="error24" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error23" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
<arg name="command" type="order"/>
</type>
</message>
<message name="error22" section="errors">
<type>
<arg name="unit" type="unit"/>

View file

@ -257,9 +257,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man k
msgid "error165"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht.\""
msgid "siege_catapults"
msgstr "\"$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an.\""
msgid "curseinfo::magicstreet"
msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))\""
@ -638,9 +635,6 @@ msgstr "\"$unit($unit) erscheint plötzlich.\""
msgid "magicresistance_effect"
msgstr "\"$unit($unit) wird kurz von einem magischen Licht umhüllt.\""
msgid "siege"
msgstr "\"$unit($unit) belagert $building($building).\""
msgid "missing_force"
msgstr "\"$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern.\""
@ -977,9 +971,6 @@ msgstr "\"$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource
msgid "error276"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen.\""
msgid "error166"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern.\""
msgid "chaosgate_effect_2"
msgstr "\"Ein Wirbel aus blendendem Licht erscheint.\""
@ -998,9 +989,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist
msgid "error82"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer.\""
msgid "error60"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert.\""
msgid "error162"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt.\""
@ -1457,9 +1445,6 @@ msgstr "\"$unit($unit) öffnet eines der Schlösser in $region($region) mit $if(
msgid "error255"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern.\""
msgid "entrance_besieged"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert.\""
msgid "error260"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden.\""
@ -1550,9 +1535,6 @@ msgstr "\"In $region($region) findet ein Kampf statt.\""
msgid "wormhole_dissolve"
msgstr "\"Das Wurmloch in $region($region) schließt sich.\""
msgid "error23"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich.\""
msgid "error12"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht.\""
@ -2135,9 +2117,6 @@ msgstr "\"Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', ang
msgid "deathcloud_effect"
msgstr "\"$unit($mage) beschwört einen Giftelementar in $region($region).\""
msgid "nr_building_besieged"
msgstr "\", belagert von $int($soldiers) Personen$if($lt($diff,0),\"\",\" (abgeschnitten)\")\""
msgid "nr_population"
msgstr "\"Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten.\""
@ -2414,9 +2393,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat
msgid "aborted_battle"
msgstr "\"Der Kampf wurde abgebrochen, da alle Verteidiger flohen.\""
msgid "error24"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich.\""
msgid "usecatapult"
msgstr "\"$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab.\""

View file

@ -257,9 +257,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings canno
msgid "error165"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit.\""
msgid "siege_catapults"
msgstr "\"$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction.\""
msgid "curseinfo::magicstreet"
msgstr "\"The roads are extremely dry and well-kept. ($int36($id))\""
@ -638,9 +635,6 @@ msgstr "\"$unit($unit) appears.\""
msgid "magicresistance_effect"
msgstr "\"$unit($unit) is briefly surrounded by a magical light.\""
msgid "siege"
msgstr "\"$building($building) is under siege by $unit($unit).\""
msgid "missing_force"
msgstr "\"$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level).\""
@ -977,9 +971,6 @@ msgstr "\"$unit($mage) sees after the wounded and heals $int($amount). A $resour
msgid "error276"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here.\""
msgid "error166"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle.\""
msgid "chaosgate_effect_2"
msgstr "\"A vortex of blinding light appears.\""
@ -998,9 +989,6 @@ msgstr "\"'$order($command)' - $unit($unit) marched into $region($region) during
msgid "error82"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number.\""
msgid "error60"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is under siege.\""
msgid "error162"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed.\""
@ -1457,9 +1445,6 @@ msgstr "\"$unit($unit) unlocks one of the locks in $region($region) with $if($eq
msgid "error255"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this.\""
msgid "entrance_besieged"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege.\""
msgid "error260"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted.\""
@ -1550,9 +1535,6 @@ msgstr "\"There is a battle in $region($region).\""
msgid "wormhole_dissolve"
msgstr "\"The wormhole in $region($region) disappears.\""
msgid "error23"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege.\""
msgid "error12"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is not ours.\""
@ -2135,9 +2117,6 @@ msgstr "\"Member of '$name ($int36($id))' for $int($age) weeks, led by $faction(
msgid "deathcloud_effect"
msgstr "\"$unit($mage) summons a poison elemental in $region($region).\""
msgid "nr_building_besieged"
msgstr "\", besieged by $int($soldiers) soldiers$if($lt($diff,0),\"\",\" (cut off)\")\""
msgid "nr_population"
msgstr "\"Your faction has $int($population) people in $int($units) of $int($limit) possible units.\""
@ -2414,9 +2393,6 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has mo
msgid "aborted_battle"
msgstr "\"The battle was aborted because all enemies escaped.\""
msgid "error24"
msgstr "\"$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege.\""
msgid "usecatapult"
msgstr "\"$int($amount) fighters of $unit($unit) launch their catapults.\""

View file

@ -2772,10 +2772,6 @@ msgstr "Dieser wunderschoen geschmueckte Baum entfaltet in den Wintermonaten ein
msgid "h10"
msgstr "Kakteenschwitz"
msgctxt "keyword"
msgid "besiege"
msgstr "BELAGERE"
msgid "h11"
msgstr "Sandfäule"

View file

@ -2421,10 +2421,6 @@ msgctxt "iteminfo"
msgid "xmastree"
msgstr "In the winter months, this beautifully decorated tree has a magical effect on the entire forest."
msgctxt "keyword"
msgid "besiege"
msgstr "BESIEGE"
msgid "h10"
msgstr "peyote"

View file

@ -31,7 +31,6 @@ function test_process()
assert_equal("function", _G.type(eressea.process.movement))
assert_equal("function", _G.type(eressea.process.use))
assert_equal("function", _G.type(eressea.process.battle))
assert_equal("function", _G.type(eressea.process.siege))
assert_equal("function", _G.type(eressea.process.leave))
assert_equal("function", _G.type(eressea.process.promote))
assert_equal("function", _G.type(eressea.process.restack))

View file

@ -182,13 +182,13 @@ void register_attributes(void)
at_register(&at_seenspell);
at_register(&at_seenspells);
/* neue REGION-Attribute */
/* REGION Attribute */
at_register(&at_moveblock);
at_register(&at_deathcount);
at_register(&at_woodcount);
at_register(&at_germs);
/* neue UNIT-Attribute */
at_register(&at_siege);
/* UNIT Attribute */
at_register(&at_effect);
at_register(&at_private);
@ -205,8 +205,7 @@ void register_attributes(void)
register_bordertype(&bt_illusionwall);
register_bordertype(&bt_road);
at_register(&at_germs);
at_deprecate("siege", a_readint);
at_deprecate("maxmagicians", a_readint); /* factions with differnt magician limits, probably unused */
at_deprecate("hurting", a_readint); /* an old arena attribute */
at_deprecate("chaoscount", a_readint); /* used to increase the chance of monster spawns */

View file

@ -3577,17 +3577,6 @@ static void join_allies(battle * b)
}
if (se == s_end)
continue;
/* Wenn die Einheit belagert ist, mu<6D> auch einer der Alliierten belagert sein: */
if (besieged(u)) {
fighter *ally;
for (ally = s->fighters; ally; ally = ally->next) {
if (besieged(ally->unit)) {
break;
}
}
if (ally == NULL)
continue;
}
/* keine Einw<6E>nde, also soll er mitmachen: */
if (c == NULL) {
if (!join_battle(b, u, false, &c)) {

View file

@ -76,10 +76,6 @@ void process_battle(void) {
do_battles();
}
void process_siege(void) {
process_cmd(K_BESIEGE, siege_cmd, PROC_LAND_REGION);
}
void process_update_long_order(void) {
region * r;
for (r = regions; r; r = r->next) {

View file

@ -645,7 +645,6 @@ static void cr_output_building(struct stream *out, building *b,
const unit *owner, int fno, faction *f)
{
const char *bname, *billusion;
int i;
stream_printf(out, "BURG %d\n", b->no);
@ -675,11 +674,6 @@ static void cr_output_building(struct stream *out, building *b,
stream_printf(out, "%d;Partei\n", fno);
}
i = building_get_siege(b);
if (i) {
stream_printf(out, "%d;Belagerer\n", i);
}
cr_output_curses(out, f, b, TYP_BUILDING);
}
@ -784,7 +778,6 @@ void cr_output_unit(stream *out, const faction * f,
const item_type *lasttype;
int pr;
item *itm, *show = NULL;
building *b;
const char *pzTmp;
skill *sv;
item result[MAX_INVENTORY];
@ -883,9 +876,6 @@ void cr_output_unit(stream *out, const faction * f,
if (is_guard(u)) {
stream_printf(out, "%d;bewacht\n", 1);
}
if ((b = usiege(u)) != NULL) {
stream_printf(out, "%d;belagert\n", b->no);
}
/* additional information for own units */
if (u->faction == f || omniscient(f)) {
order *ord;

View file

@ -980,11 +980,6 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want)
}
}
if (besieged(u)) {
cmistake(u, u->thisorder, 60, MSG_PRODUCE);
return;
}
if (rtype->modifiers) {
message *msg = get_modifiers(u, sk, rtype, &save_mod, &skill_mod);
if (msg) {
@ -1606,11 +1601,6 @@ static void buy(unit * u, econ_request ** buyorders, struct order *ord)
cmistake(u, ord, 26, MSG_COMMERCE);
return;
}
if (besieged(u)) {
/* Belagerte Einheiten k<>nnen nichts kaufen. */
cmistake(u, ord, 60, MSG_COMMERCE);
return;
}
/* Entweder man ist Insekt in Sumpf/Wueste, oder es muss
* einen Handelsposten in der Region geben: */
@ -1930,12 +1920,6 @@ static bool sell(unit * u, econ_request ** sellorders, struct order *ord)
return false;
}
}
/* Belagerte Einheiten k<>nnen nichts verkaufen. */
if (besieged(u)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error60", ""));
return false;
}
/* In der Region mu<6D> es eine Burg geben. */
if (u_race(u) == get_race(RC_INSECT)) {
@ -2409,10 +2393,6 @@ void entertain_cmd(unit * u, struct order *ord)
cmistake(u, ord, 58, MSG_INCOME);
return;
}
if (besieged(u)) {
cmistake(u, ord, 60, MSG_INCOME);
return;
}
if (u->ship && is_guarded(r, u)) {
cmistake(u, ord, 69, MSG_INCOME);
return;
@ -2501,11 +2481,6 @@ static int do_work(unit * u, order * ord, econ_request * o)
cmistake(u, ord, 313, MSG_INCOME);
return -1;
}
if (besieged(u)) {
if (ord)
cmistake(u, ord, 60, MSG_INCOME);
return -1;
}
if (u->ship && is_guarded(r, u)) {
if (ord)
cmistake(u, ord, 69, MSG_INCOME);
@ -2614,10 +2589,6 @@ void tax_cmd(unit * u, struct order *ord, econ_request ** taxorders)
return;
}
if (besieged(u)) {
cmistake(u, ord, 60, MSG_INCOME);
return;
}
n = armedmen(u, false);
if (!n) {
@ -2688,10 +2659,6 @@ void loot_cmd(unit * u, struct order *ord, econ_request ** lootorders)
return;
}
if (besieged(u)) {
cmistake(u, ord, 60, MSG_INCOME);
return;
}
n = armedmen(u, false);
if (!n) {

View file

@ -105,8 +105,6 @@ static bool is_guardian_r(const unit * guard)
{
if (guard->number == 0)
return false;
if (besieged(guard))
return false;
/* if region_owners exist then they may be guardians: */
if (guard->building && rule_region_owners() && guard == building_owner(guard->building)) {

View file

@ -120,7 +120,7 @@ static void test_disable(CuTest * tc)
const char * data = "{\"disabled\": [ "
"\"alchemy\","
"\"pay\","
"\"besiege\","
"\"attack\","
"\"module\""
"]}";
cJSON *json = cJSON_Parse(data);
@ -129,13 +129,13 @@ static void test_disable(CuTest * tc)
CuAssertTrue(tc, skill_enabled(SK_ALCHEMY));
CuAssertTrue(tc, !keyword_disabled(K_BANNER));
CuAssertTrue(tc, !keyword_disabled(K_PAY));
CuAssertTrue(tc, !keyword_disabled(K_BESIEGE));
CuAssertTrue(tc, !keyword_disabled(K_ATTACK));
CuAssertIntEquals(tc, 1, config_get_int("module.enabled", 1));
json_config(json);
CuAssertTrue(tc, !skill_enabled(SK_ALCHEMY));
CuAssertTrue(tc, !keyword_disabled(K_BANNER));
CuAssertTrue(tc, keyword_disabled(K_PAY));
CuAssertTrue(tc, keyword_disabled(K_BESIEGE));
CuAssertTrue(tc, keyword_disabled(K_ATTACK));
CuAssertIntEquals(tc, 0, config_get_int("module.enabled", 1));
cJSON_Delete(json);
test_teardown();

View file

@ -279,10 +279,6 @@ void build_road(unit * u, int size, direction_t d)
cmistake(u, u->thisorder, 103, MSG_PRODUCE);
return;
}
if (besieged(u)) {
cmistake(u, u->thisorder, 60, MSG_PRODUCE);
return;
}
if (rn == NULL || rn->terrain->max_road < 0) {
cmistake(u, u->thisorder, 94, MSG_PRODUCE);
@ -780,11 +776,6 @@ build_building(unit * u, const building_type * btype, int id, int want, order *
cmistake(u, ord, 93, MSG_PRODUCE);
return 0;
}
if (besieged(u)) {
/* units under siege can not build */
cmistake(u, ord, 60, MSG_PRODUCE);
return 0;
}
if (btype->flags & BTF_NOBUILD) {
/* special building, cannot be built */
cmistake(u, ord, 221, MSG_PRODUCE);
@ -949,10 +940,6 @@ create_ship(unit * u, const struct ship_type *newtype, int want,
cmistake(u, ord, 100, MSG_PRODUCE);
return;
}
if (besieged(u)) {
cmistake(u, ord, 60, MSG_PRODUCE);
return;
}
/* check if skill and material for 1 size is available */
if (effskill(u, cons->skill, 0) < cons->minskill) {

View file

@ -870,14 +870,3 @@ int cmp_current_owner(const building * b, const building * a)
}
return 0;
}
int building_get_siege(const struct building *b)
{
return b->_besieged;
}
int building_add_siege(struct building *b, int delta)
{
b->_besieged += delta;
return b->_besieged;
}

View file

@ -118,7 +118,6 @@ extern "C" {
int no;
int size;
int sizeleft; /* is only used during battle. should be a temporary attribute */
int _besieged; /* should be an attribute */
int flags;
} building;
@ -134,9 +133,6 @@ extern "C" {
int id, int size, struct order *ord);
bool building_finished(const struct building *b);
int building_get_siege(const struct building *b);
int building_add_siege(struct building *b, int delta);
int wage(const struct region *r, const struct faction *f,
const struct race *rc, int in_turn);

View file

@ -373,7 +373,6 @@ bool is_repeated(keyword_t kwd)
case K_ROUTE:
case K_DRIVE:
case K_WORK:
case K_BESIEGE:
case K_ENTERTAIN:
case K_TAX:
case K_RESEARCH:
@ -414,7 +413,6 @@ bool is_exclusive(const order * ord)
case K_ROUTE:
case K_DRIVE:
case K_WORK:
case K_BESIEGE:
case K_ENTERTAIN:
case K_TAX:
case K_RESEARCH:
@ -456,7 +454,6 @@ bool is_long(keyword_t kwd)
case K_ROUTE:
case K_DRIVE:
case K_WORK:
case K_BESIEGE:
case K_ENTERTAIN:
case K_TAX:
case K_RESEARCH:

View file

@ -530,60 +530,6 @@ attrib_type at_target = {
NO_READ
};
/*********************/
/* at_siege */
/*********************/
void a_writesiege(const variant *var, const void *owner, struct storage *store)
{
struct building *b = (struct building *)var->v;
write_building_reference(b, store);
}
int a_readsiege(variant *var, void *owner, gamedata *data)
{
if (read_building_reference(data, (building **)&var->v, NULL) <= 0) {
return AT_READ_FAIL;
}
return AT_READ_OK;
}
attrib_type at_siege = {
"siege",
DEFAULT_INIT,
DEFAULT_FINALIZE,
DEFAULT_AGE,
a_writesiege,
a_readsiege
};
struct building *usiege(const unit * u)
{
attrib *a;
if (!fval(u, UFL_SIEGE))
return NULL;
a = a_find(u->attribs, &at_siege);
assert(a || !"flag set, but no siege found");
return (struct building *)a->data.v;
}
void usetsiege(unit * u, const struct building *t)
{
attrib *a = a_find(u->attribs, &at_siege);
if (!a && t)
a = a_add(&u->attribs, a_new(&at_siege));
if (a) {
if (!t) {
a_remove(&u->attribs, a);
freset(u, UFL_SIEGE);
}
else {
a->data.v = (void *)t;
fset(u, UFL_SIEGE);
}
}
}
/*********************/
/* at_contact */
/*********************/
@ -1914,16 +1860,6 @@ int getunit(const region * r, const faction * f, unit **uresult)
return result;
}
int besieged(const unit * u)
{
/* belagert kann man in schiffen und burgen werden */
if (u && !keyword_disabled(K_BESIEGE) && u->building) {
building * b = u->building;
return building_get_siege(b) >= b->size * SIEGEFACTOR;
}
return false;
}
bool has_horses(const unit * u)
{
item *itm = u->items;

View file

@ -47,7 +47,6 @@ extern "C" {
#define UFL_NOTMOVING (1<<9) /* Die Einheit kann sich wg. langen Kampfes nicht bewegen */
#define UFL_DEFENDER (1<<10)
#define UFL_HUNGER (1<<11) /* kann im Folgemonat keinen langen Befehl außer ARBEITE ausführen */
#define UFL_SIEGE (1<<12) /* speedup: belagert eine burg, siehe attribut */
#define UFL_TARGET (1<<13) /* speedup: hat ein target, siehe attribut */
#define UFL_WERE (1<<14)
#define UFL_ENTER (1<<15) /* unit has entered a ship/building and will not leave it */
@ -121,7 +120,6 @@ extern "C" {
extern struct attrib_type at_creator;
extern struct attrib_type at_alias;
extern struct attrib_type at_siege;
extern struct attrib_type at_target;
extern struct attrib_type at_potionuser;
extern struct attrib_type at_contact;
@ -138,8 +136,6 @@ extern "C" {
const struct race *u_irace(const struct unit *u);
const struct race *u_race(const struct unit *u);
void u_setrace(struct unit *u, const struct race *);
struct building *usiege(const struct unit *u);
void usetsiege(struct unit *u, const struct building *b);
const char *uprivate(const struct unit *u);
void usetprivate(struct unit *u, const char *c);
@ -257,7 +253,6 @@ extern "C" {
int read_unitid(const struct faction *f, const struct region *r);
/* !< sets combatstatus of a unit */
int besieged(const struct unit *u);
bool has_horses(const struct unit *u);
int maintenance_cost(const struct unit *u);
bool has_limited_skills(const struct unit *u);

View file

@ -94,7 +94,7 @@ const char *keywords[MAXKEYWORDS] = {
"work",
"attack",
"steal",
"besiege",
"deprecated_besiege",
"name",
"use",
"describe",

View file

@ -17,7 +17,7 @@ extern "C"
K_WORK,
K_ATTACK,
K_STEAL,
K_BESIEGE,
K_BESIEGE_UNUSED,
K_NAME,
K_USE,
K_DISPLAY,

View file

@ -901,61 +901,6 @@ void demographics(void)
immigration();
}
/* ------------------------------------------------------------- */
/* test if the unit can slip through a siege undetected.
* returns 0 if siege is successful, or 1 if the building is either
* not besieged or the unit can slip through the siege due to better stealth.
*/
static int slipthru(const region * r, const unit * u, const building * b)
{
unit *u2;
int n, o;
/* b ist die burg, in die man hinein oder aus der man heraus will. */
if (b == NULL || building_get_siege(b) < b->size * SIEGEFACTOR) {
return 1;
}
/* u wird am hinein- oder herausschluepfen gehindert, wenn STEALTH <=
* OBSERVATION +2 der belagerer u2 ist */
n = effskill(u, SK_STEALTH, r);
for (u2 = r->units; u2; u2 = u2->next) {
if (usiege(u2) == b) {
if (invisible(u, u2) >= u->number)
continue;
o = effskill(u2, SK_PERCEPTION, r);
if (o + 2 >= n) {
return 0; /* entdeckt! */
}
}
}
return 1;
}
int can_contact(const region * r, const unit * u, const unit * u2) {
/* hier geht es nur um die belagerung von burgen */
UNUSED_ARG(r);
if (u->building == u2->building) {
return 1;
}
/* unit u is trying to contact u2 - unasked for contact. wenn u oder u2
* nicht in einer burg ist, oder die burg nicht belagert ist, ist
* slipthru () == 1. ansonsten ist es nur 1, wenn man die belagerer */
if (slipthru(u->region, u, u->building) && slipthru(u->region, u2, u2->building)) {
return 1;
}
return (alliedunit(u, u2->faction, HELP_GIVE));
}
int contact_cmd(unit * u, order * ord)
{
unit *u2;
@ -966,10 +911,6 @@ int contact_cmd(unit * u, order * ord)
u2 = findunit(n);
if (u2 != NULL) {
if (!can_contact(u->region, u, u2)) {
cmistake(u, u->thisorder, 23, MSG_EVENT);
return -1;
}
usetcontact(u, u2);
}
return 0;
@ -994,13 +935,7 @@ int leave_cmd(unit * u, struct order *ord)
return 0;
}
}
if (!slipthru(r, u, u->building)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "entrance_besieged",
"building", u->building));
}
else {
leave(u, true);
}
leave(u, true);
return 0;
}
@ -1148,13 +1083,6 @@ int enter_building(unit * u, order * ord, int id, bool report)
}
return 0;
}
if (!slipthru(r, u, b)) {
if (report) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "entrance_besieged",
"building", b));
}
return 0;
}
if (leave(u, 0)) {
fset(u, UFL_ENTER);
@ -3804,98 +3732,6 @@ int armedmen(const unit * u, bool siege_weapons)
return n;
}
int siege_cmd(unit * u, order * ord)
{
region *r = u->region;
building *b;
int d, pooled;
int bewaffnete, katapultiere = 0;
resource_type *rt_catapultammo = NULL;
resource_type *rt_catapult = NULL;
init_order_depr(ord);
b = getbuilding(r);
if (!b) {
cmistake(u, ord, 31, MSG_BATTLE);
return 31;
}
if (!playerrace(u_race(u))) {
/* keine Drachen, Illusionen, Untote etc */
cmistake(u, ord, 166, MSG_BATTLE);
return 166;
}
/* schaden durch katapulte */
rt_catapultammo = rt_find("catapultammo");
rt_catapult = rt_find("catapult");
d = i_get(u->items, rt_catapult->itype);
if (d > u->number) d = u->number;
pooled = get_pooled(u, rt_catapultammo, GET_DEFAULT, d);
if (d > pooled) d = pooled;
if (effskill(u, SK_CATAPULT, 0) >= 1) {
katapultiere = d;
d *= effskill(u, SK_CATAPULT, 0);
}
else {
d = 0;
}
bewaffnete = armedmen(u, true);
if (d == 0 && bewaffnete == 0) {
/* abbruch, falls unbewaffnet oder unfaehig, katapulte zu benutzen */
cmistake(u, ord, 80, MSG_EVENT);
return 80;
}
if (!is_guard(u)) {
/* abbruch, wenn die einheit nicht vorher die region bewacht - als
* warnung fuer alle anderen! */
cmistake(u, ord, 81, MSG_EVENT);
return 81;
}
/* einheit und burg markieren - spart zeit beim behandeln der einheiten
* in der burg, falls die burg auch markiert ist und nicht alle
* einheiten wieder abgesucht werden muessen! */
usetsiege(u, b);
if (katapultiere < bewaffnete) katapultiere = bewaffnete;
building_add_siege(b, katapultiere);
/* definitiver schaden eingeschraenkt */
if (d > b->size - 1) d = b->size - 1;
/* meldung, schaden anrichten */
if (d && !curse_active(get_curse(b->attribs, &ct_magicwalls))) {
b->size -= d;
use_pooled(u, rt_catapultammo,
GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, d);
/* send message to the entire region */
ADDMSG(&r->msgs, msg_message("siege_catapults",
"unit building destruction", u, b, d));
}
else {
/* send message to the entire region */
ADDMSG(&r->msgs, msg_message("siege", "unit building", u, b));
}
return 0;
}
void do_siege(region * r)
{
if (fval(r->terrain, LAND_REGION)) {
unit *u;
for (u = r->units; u; u = u->next) {
if (getkeyword(u->thisorder) == K_BESIEGE) {
siege_cmd(u, u->thisorder);
}
}
}
}
static void enter_1(region * r)
{
do_enter(r, 0);
@ -3979,11 +3815,6 @@ void init_processor(void)
p += 10;
add_proc_global(p, do_battles, "Attackieren");
if (!keyword_disabled(K_BESIEGE)) {
p += 10;
add_proc_region(p, do_siege, "Belagern");
}
p += 10; /* can't allow reserve before siege (weapons) */
add_proc_region(p, enter_1, "Betreten (3. Versuch)"); /* to claim a castle after a victory and to be able to DESTROY it in the same turn */
if (config_get_int("rules.reserve.twophase", 0)) {
@ -4201,7 +4032,7 @@ cansee(const faction * f, const region * r, const unit * u, int modifier)
}
/* simple visibility, just gotta have a viewer in the region to see 'em */
if (leftship(u) || is_guard(u) || usiege(u) || u->building || u->ship) {
if (leftship(u) || is_guard(u) || u->building || u->ship) {
return true;
}
@ -4239,7 +4070,7 @@ bool cansee_unit(const unit * u, const unit * target, int modifier)
else {
int n, rings;
if (is_guard(target) || usiege(target) || target->building
if (is_guard(target) || target->building
|| target->ship) {
return true;
}
@ -4282,7 +4113,7 @@ cansee_durchgezogen(const faction * f, const region * r, const unit * u,
else {
int rings, n;
if (is_guard(u) || usiege(u) || u->building || u->ship) {
if (is_guard(u) || u->building || u->ship) {
return true;
}

View file

@ -48,7 +48,6 @@ extern "C" {
bool renamed_building(const struct building * b);
int rename_building(struct unit * u, struct order * ord, struct building * b, const char *name);
void get_food(struct region * r);
int can_contact(const struct region *r, const struct unit *u, const struct unit *u2);
int enter_building(struct unit *u, struct order *ord, int id, bool report);
int enter_ship(struct unit *u, struct order *ord, int id, bool report);
@ -82,7 +81,6 @@ extern "C" {
int quit_cmd(struct unit *u, struct order *ord);
int name_cmd(struct unit *u, struct order *ord);
int use_cmd(struct unit *u, struct order *ord);
int siege_cmd(struct unit *u, struct order *ord);
int leave_cmd(struct unit *u, struct order *ord);
int pay_cmd(struct unit *u, struct order *ord);
int promotion_cmd(struct unit *u, struct order *ord);

View file

@ -95,38 +95,6 @@ static void test_rename_building_twice(CuTest * tc)
test_teardown();
}
static void test_contact(CuTest * tc)
{
region *r;
unit *u1, *u2, *u3;
building *b;
building_type *btype;
ally *al;
test_setup();
test_create_locale();
btype = test_create_buildingtype("castle");
r = test_create_region(0, 0, NULL);
b = new_building(btype, r, default_locale);
u1 = test_create_unit(test_create_faction(NULL), r);
u2 = test_create_unit(test_create_faction(NULL), r);
u3 = test_create_unit(test_create_faction(NULL), r);
set_level(u3, SK_PERCEPTION, 2);
usetsiege(u3, b);
building_add_siege(b, 1);
CuAssertIntEquals(tc, 1, building_get_siege(b));
CuAssertIntEquals(tc, 1, can_contact(r, u1, u2));
u_set_building(u1, b);
CuAssertIntEquals(tc, 0, can_contact(r, u1, u2));
al = ally_add(&u1->faction->allies, u2->faction);
al->status = HELP_ALL;
CuAssertIntEquals(tc, HELP_GIVE, can_contact(r, u1, u2));
u_set_building(u2, b);
CuAssertIntEquals(tc, 1, can_contact(r, u1, u2));
test_teardown();
}
static void test_enter_building(CuTest * tc)
{
unit *u;
@ -1833,7 +1801,6 @@ CuSuite *get_laws_suite(void)
SUITE_ADD_TEST(suite, test_pay_cmd_must_be_owner);
SUITE_ADD_TEST(suite, test_new_units);
SUITE_ADD_TEST(suite, test_cannot_create_unit_above_limit);
SUITE_ADD_TEST(suite, test_contact);
SUITE_ADD_TEST(suite, test_enter_building);
SUITE_ADD_TEST(suite, test_enter_ship);
SUITE_ADD_TEST(suite, test_display_cmd);

View file

@ -21,7 +21,6 @@ module eressea {
void process_movement @ movement(void); /* MOVE/FOLLOW/ROUTE */
void process_use @ use(void); /* USE */
void process_battle @ battle(void); /* ATTACK */
void process_siege @ siege(void); /* SIEGE */
void process_leave @ leave(void); /* LEAVE */
void process_maintenance @ maintenance(void); /* PAY */
void process_promote @ promote(void); /* PROMOTE */

View file

@ -435,30 +435,6 @@ static int tolua_process_eressea_process_battle00(lua_State* tolua_S)
#endif
}
/* function: process_siege */
static int tolua_process_eressea_process_siege00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isnoobj(tolua_S,1,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
{
process_siege();
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'siege'.",&tolua_err);
return 0;
#endif
}
/* function: process_leave */
static int tolua_process_eressea_process_leave00(lua_State* tolua_S)
{
@ -993,7 +969,6 @@ LUALIB_API int luaopen_process (lua_State* tolua_S)
tolua_function(tolua_S,"movement",tolua_process_eressea_process_movement00);
tolua_function(tolua_S,"use",tolua_process_eressea_process_use00);
tolua_function(tolua_S,"battle",tolua_process_eressea_process_battle00);
tolua_function(tolua_S,"siege",tolua_process_eressea_process_siege00);
tolua_function(tolua_S,"leave",tolua_process_eressea_process_leave00);
tolua_function(tolua_S,"maintenance",tolua_process_eressea_process_maintenance00);
tolua_function(tolua_S,"promote",tolua_process_eressea_process_promote00);

View file

@ -1821,7 +1821,6 @@ nr_building(struct stream *out, const region *r, const building *b, const factio
const char *name, *bname, *billusion = NULL;
const struct locale *lang;
char buffer[8192];
message *msg;
size_t size;
sbstring sbs;
@ -1853,17 +1852,6 @@ nr_building(struct stream *out, const region *r, const building *b, const factio
sbs_strcat(&sbs, LOC(lang, "nr_building_inprogress"));
}
if (!keyword_disabled(K_BESIEGE) && r->seen.mode >= seen_lighthouse) {
int s = building_get_siege(b);
if (s > 0) {
msg = msg_message("nr_building_besieged", "soldiers diff", s,
s - b->size * SIEGEFACTOR);
size = nr_render(msg, lang, sbs.end, sbs.size - (sbs.end - sbs.begin), f);
sbs.end += size;
msg_release(msg);
}
}
i = 0;
if (b->display && b->display[0]) {
sbs_strcat(&sbs, "; ");

View file

@ -683,7 +683,6 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
int i, dh;
int getarnt = fval(u, UFL_ANON_FACTION);
const char *pzTmp, *str;
building *b;
bool isbattle = (bool)(mode == seen_battle);
item *itm, *show = NULL;
faction *fv;
@ -807,11 +806,6 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf,
bufp = STRLCPY(bufp, LOC(lang, "unit_guards"), size);
}
if ((b = usiege(u)) != NULL) {
bufp = STRLCPY(bufp, ", belagert ", size);
bufp = STRLCPY(bufp, buildingname(b), size);
}
dh = 0;
if (u->faction == f) {
skill *sv;

View file

@ -137,10 +137,6 @@ int spy_cmd(unit * u, struct order *ord)
msg_feedback(u, u->thisorder, "feedback_unit_not_found", ""));
return 0;
}
if (!can_contact(r, u, target)) {
cmistake(u, u->thisorder, 24, MSG_EVENT);
return 0;
}
if (effskill(u, SK_SPY, 0) < 1) {
cmistake(u, u->thisorder, 39, MSG_EVENT);
return 0;

View file

@ -198,17 +198,17 @@ static void test_setstealth_cmd(CuTest *tc) {
test_setup();
u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0));
lang = u->faction->locale;
u->flags = UFL_ANON_FACTION | UFL_SIEGE;
u->flags = UFL_ANON_FACTION | UFL_DEFENDER;
u->thisorder = create_order(K_SETSTEALTH, lang, "%s %s",
LOC(lang, parameters[P_FACTION]),
LOC(lang, parameters[P_NOT]));
setstealth_cmd(u, u->thisorder);
CuAssertIntEquals(tc, UFL_SIEGE, u->flags);
CuAssertIntEquals(tc, UFL_DEFENDER, u->flags);
free_order(u->thisorder);
u->thisorder = create_order(K_SETSTEALTH, lang, "%s",
LOC(lang, parameters[P_FACTION]));
setstealth_cmd(u, u->thisorder);
CuAssertIntEquals(tc, UFL_SIEGE | UFL_ANON_FACTION, u->flags);
CuAssertIntEquals(tc, UFL_DEFENDER | UFL_ANON_FACTION, u->flags);
test_teardown();
}

View file

@ -188,10 +188,6 @@ void steal_cmd(unit * u, struct order *ord, econ_request ** stealorders)
}
assert(u->region == u2->region);
if (!can_contact(r, u, u2)) {
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error60", ""));
return;
}
effsk = effskill(u, SK_STEALTH, 0);
n = effsk - max_skill(r, f, SK_PERCEPTION);