Merge pull request #220 from badgerman/hotfix/bug-2109-give-unit

bug 2109 (GIVE UNIT limits)
This commit is contained in:
Enno Rehling 2015-06-08 09:41:10 +02:00
commit 5fb8748132
2 changed files with 33 additions and 6 deletions

View File

@ -401,7 +401,7 @@ message * disband_men(int n, unit * u, struct order *ord) {
void give_unit(unit * u, unit * u2, order * ord) void give_unit(unit * u, unit * u2, order * ord)
{ {
region *r = u->region; region *r = u->region;
int n = u->number; int maxt = max_transfers();
if (!rule_transfermen() && u->faction != u2->faction) { if (!rule_transfermen() && u->faction != u2->faction) {
cmistake(u, ord, 74, MSG_COMMERCE); cmistake(u, ord, 74, MSG_COMMERCE);
@ -472,9 +472,11 @@ void give_unit(unit * u, unit * u2, order * ord)
cmistake(u, ord, 105, MSG_COMMERCE); cmistake(u, ord, 105, MSG_COMMERCE);
return; return;
} }
if (u2->faction->newbies + n > max_transfers()) { if (maxt >= 0 && u->faction != u2->faction) {
cmistake(u, ord, 129, MSG_COMMERCE); if (u2->faction->newbies + u->number > maxt) {
return; cmistake(u, ord, 129, MSG_COMMERCE);
return;
}
} }
if (u_race(u) != u2->faction->race) { if (u_race(u) != u2->faction->race) {
if (u2->faction->race != get_race(RC_HUMAN)) { if (u2->faction->race != get_race(RC_HUMAN)) {
@ -510,9 +512,9 @@ void give_unit(unit * u, unit * u2, order * ord)
cmistake(u, ord, 156, MSG_COMMERCE); cmistake(u, ord, 156, MSG_COMMERCE);
return; return;
} }
add_give(u, u2, n, n, get_resourcetype(R_PERSON), ord, 0); add_give(u, u2, u->number, u->number, get_resourcetype(R_PERSON), ord, 0);
u_setfaction(u, u2->faction); u_setfaction(u, u2->faction);
u2->faction->newbies += n; u2->faction->newbies += u->number;
} }
bool can_give_to(unit *u, unit *u2) { bool can_give_to(unit *u, unit *u2) {

View File

@ -3,6 +3,7 @@
#include "give.h" #include "give.h"
#include "economy.h" #include "economy.h"
#include <kernel/ally.h>
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/item.h> #include <kernel/item.h>
#include <kernel/terrain.h> #include <kernel/terrain.h>
@ -34,6 +35,10 @@ static void setup_give(struct give *env) {
env->dst = env->f2 ? test_create_unit(env->f2, env->r) : 0; env->dst = env->f2 ? test_create_unit(env->f2, env->r) : 0;
env->itype = it_get_or_create(rt_get_or_create("money")); env->itype = it_get_or_create(rt_get_or_create("money"));
env->itype->flags |= ITF_HERB; env->itype->flags |= ITF_HERB;
if (env->f1 && env->f2) {
ally * al = ally_add(&env->f2->allies, env->f1);
al->status = HELP_GIVE;
}
} }
static void test_give_unit_to_peasants(CuTest * tc) { static void test_give_unit_to_peasants(CuTest * tc) {
@ -49,6 +54,25 @@ static void test_give_unit_to_peasants(CuTest * tc) {
test_cleanup(); test_cleanup();
} }
static void test_give_unit(CuTest * tc) {
struct give env;
test_cleanup();
env.f1 = test_create_faction(0);
env.f2 = test_create_faction(0);
setup_give(&env);
env.r->terrain = test_create_terrain("ocean", SEA_REGION);
set_param(&global.parameters, "rules.give.max_men", "0");
give_unit(env.src, env.dst, NULL);
CuAssertPtrEquals(tc, env.f1, env.src->faction);
CuAssertIntEquals(tc, 0, env.f2->newbies);
set_param(&global.parameters, "rules.give.max_men", "-1");
give_unit(env.src, env.dst, NULL);
CuAssertPtrEquals(tc, env.f2, env.src->faction);
CuAssertIntEquals(tc, 1, env.f2->newbies);
CuAssertPtrEquals(tc, 0, env.f1->units);
test_cleanup();
}
static void test_give_unit_in_ocean(CuTest * tc) { static void test_give_unit_in_ocean(CuTest * tc) {
struct give env; struct give env;
test_cleanup(); test_cleanup();
@ -284,6 +308,7 @@ CuSuite *get_give_suite(void)
SUITE_ADD_TEST(suite, test_give_men_other_faction); SUITE_ADD_TEST(suite, test_give_men_other_faction);
SUITE_ADD_TEST(suite, test_give_men_requires_contact); SUITE_ADD_TEST(suite, test_give_men_requires_contact);
SUITE_ADD_TEST(suite, test_give_men_not_to_self); SUITE_ADD_TEST(suite, test_give_men_not_to_self);
SUITE_ADD_TEST(suite, test_give_unit);
SUITE_ADD_TEST(suite, test_give_unit_in_ocean); SUITE_ADD_TEST(suite, test_give_unit_in_ocean);
SUITE_ADD_TEST(suite, test_give_unit_to_peasants); SUITE_ADD_TEST(suite, test_give_unit_to_peasants);
SUITE_ADD_TEST(suite, test_give_peasants); SUITE_ADD_TEST(suite, test_give_peasants);