From 1d405e2ef8f6aa80a6771654274d6857284db859 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 Oct 2019 20:17:25 +0200 Subject: [PATCH] =?UTF-8?q?GIB=200=20n=20SCHIFFE=20Keine=20Boote=20erlaube?= =?UTF-8?q?n=20=C3=9Cbergabe=20an=20eigene=20Besatzung.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/translations/messages.de.po | 6 ++ res/translations/messages.en.po | 3 + scripts/tests/e2/ships.lua | 133 ++++++++++++++++++++++++-------- src/give.c | 99 +++++++++++++++--------- 4 files changed, 171 insertions(+), 70 deletions(-) diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po index 1ea230c8c..5d2717e51 100644 --- a/res/translations/messages.de.po +++ b/res/translations/messages.de.po @@ -2780,6 +2780,12 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist msgid "error323" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist verzaubert.\"" +msgid "error327" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Schiffe kann die Einheit nicht übergeben.\"" + +msgid "error326" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Schiffe können keinen Konvoi bilden.\"" + msgid "dissolve_units_2" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"wurde zum Baum\", \"wurden zu Bäumen\").\"" diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po index e6bc922f2..135053782 100644 --- a/res/translations/messages.en.po +++ b/res/translations/messages.en.po @@ -2771,6 +2771,9 @@ msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot msgid "error325" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Spells can only be cast on a single ship.\"" +msgid "error326" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - These ships cannot form a convoy.\"" + msgid "error324" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not one of ours.\"" diff --git a/scripts/tests/e2/ships.lua b/scripts/tests/e2/ships.lua index f8020f3d7..9286cc8f1 100644 --- a/scripts/tests/e2/ships.lua +++ b/scripts/tests/e2/ships.lua @@ -83,9 +83,9 @@ function test_ship_convoy_capacity() local u = unit.create(f, r1, 1) u:add_order('NACH O') - u:set_skill('sailing', 2, true) - u:add_item('jewel', 40) - u.ship = ship.create(r1, 'boat') + u:set_skill('sailing', 10, true) + u:add_item('jewel', 490) + u.ship = ship.create(r1, 'longboat') assert_equal(1, u.ship.number) process_orders() u:clear_orders() @@ -99,19 +99,17 @@ function test_ship_convoy_capacity() assert_equal(r2, u.region) -- too heavy u:add_order('NACH W') - u:add_item('jewel', 39) + u:add_item('jewel', 489) u.ship.number = 2 u.number = 2 - u:set_skill('sailing', 2, true) + u:set_skill('sailing', 10, true) process_orders() u:clear_orders() assert_equal(r1, u.region) -- double capacity u:add_order('NACH O') u.ship.number = 2 - u.name = 'Bolgrim' u:add_item('jewel', 1) -- too heavy again - u:set_skill('sailing', 2, true) process_orders() u:clear_orders() assert_equal(r1, u.region) @@ -122,17 +120,17 @@ function test_ship_convoy_crew() local r2 = region.create(2, 0, 'ocean') local f = faction.create("human") local u = unit.create(f, r1, 1) - u.ship = ship.create(r1, 'boat') + u.ship = ship.create(r1, 'longboat') u.ship.number = 2 - u:set_skill('sailing', 4, true) + u.number = 2 + u:set_skill('sailing', 5, true) u:add_order('NACH O') process_orders() u:clear_orders() assert_equal(r1, u.region) -- not enough captains - u.number = 2 - u:set_skill('sailing', 2, true) + u:set_skill('sailing', 10, true) u:add_order('NACH O') process_orders() u:clear_orders() @@ -146,20 +144,20 @@ function test_ship_convoy_skill() local f = faction.create("human") local u = unit.create(f, r1, 1) - u:set_skill('sailing', 2, true) - u.ship = ship.create(r1, 'boat') + u:set_skill('sailing', 10, true) + u.ship = ship.create(r1, 'longboat') assert_equal(1, u.ship.number) u:add_order('NACH O') process_orders() assert_equal(r2, u.region) u.ship.number = 2 - u:set_skill('sailing', 4, true) + u:set_skill('sailing', 20, true) process_orders() assert_equal(r2, u.region) -- not enough captains u.number = 2 - u:set_skill('sailing', 2, true) + u:set_skill('sailing', 10, true) process_orders() assert_equal(r3, u.region) end @@ -169,7 +167,7 @@ function test_give_ship() local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - u1.ship = ship.create(r, 'boat') + u1.ship = ship.create(r, 'longboat') u1.ship.number = 2 u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") process_orders() @@ -177,15 +175,84 @@ function test_give_ship() assert_equal(1, u2.ship.number) end +function test_give_ship_new_unit() + local r = region.create(1, 0, 'ocean') + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.ship = ship.create(r, 'longboat') + u1.ship.number = 2 + u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") + process_orders() + assert_equal(1, u1.ship.number) + assert_equal(1, u2.ship.number) +end + +function test_give_ship_same_ship() + local r = region.create(1, 0, 'ocean') + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.ship = ship.create(r, 'longboat') + u2.ship = u1.ship + u1.ship.number = 2 + u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") + process_orders() + assert_equal(1, u1.ship.number) + assert_equal(1, u2.ship.number) + assert_not_equal(u1.ship, u2.ship) +end + +function test_give_ship_dont_give_all() + local r = region.create(1, 0, 'ocean') + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + u1.ship = ship.create(r, 'longboat') + u1.ship.number = 2 + u1:add_order("GIB 0 2 SCHIFF") + process_orders() + assert_equal(2, u1.ship.number) +end + +function test_give_ship_no_boat() + local r = region.create(1, 0, 'ocean') + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.ship = ship.create(r, 'boat') + u1.ship.number = 1 + u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") + process_orders() + assert_equal(1, u1.ship.number) + assert_equal(nil, u2.ship) +end + +function test_give_ship_away() + local r = region.create(1, 0, 'ocean') + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + u1.ship = ship.create(r, 'longboat') + u1.ship.number = 2 + u1:add_order("GIB 0 1 SCHIFF") + process_orders() + assert_equal(1, u1.ship.number) + local count = 0 + for sh in r.ships do + assert_equal(1, sh.number) + count = count + 1 + end + assert_equal(2, count) +end + function test_give_ship_only_to_captain() local r = region.create(1, 0, 'ocean') local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) local u3 = unit.create(f, r, 1) - u1.ship = ship.create(r, 'boat') + u1.ship = ship.create(r, 'longboat') u1.ship.number = 2 - u2.ship = ship.create(r, 'boat') + u2.ship = ship.create(r, 'longboat') u3.ship = u2.ship u1:add_order("GIB " .. itoa36(u3.id) .. " 1 SCHIFF") process_orders() @@ -198,10 +265,10 @@ function test_give_ship_compatible_coasts() local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - u1.ship = ship.create(r, 'boat') + u1.ship = ship.create(r, 'longboat') u1.ship.number = 4 u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") - u2.ship = ship.create(r, 'boat') + u2.ship = ship.create(r, 'longboat') -- cannot give a ship with different coast: u1.ship.coast = 1 @@ -242,8 +309,8 @@ function test_give_ship_only_from_captain() local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) local u3 = unit.create(f, r, 1) - u2.ship = ship.create(r, 'boat') - u1.ship = ship.create(r, 'boat') + u2.ship = ship.create(r, 'longboat') + u1.ship = ship.create(r, 'longboat') u1.ship.number = 2 u3.ship = u1.ship u3:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") @@ -257,8 +324,8 @@ function test_give_ship_merge() local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - u2.ship = ship.create(r, 'boat') - u1.ship = ship.create(r, 'boat') + u2.ship = ship.create(r, 'longboat') + u1.ship = ship.create(r, 'longboat') u1.ship.number = 2 u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") process_orders() @@ -271,8 +338,8 @@ function test_give_ship_only_same() local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - u2.ship = ship.create(r, 'boat') - u1.ship = ship.create(r, 'longboat') + u2.ship = ship.create(r, 'longboat') + u1.ship = ship.create(r, 'caravel') u1.ship.number = 2 u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") process_orders() @@ -285,7 +352,7 @@ function test_give_ship_scale() local f = faction.create("human") local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - local sh = ship.create(r, 'boat') + local sh = ship.create(r, 'longboat') sh.number = 3 sh.damage = 9 sh.size = 12 @@ -305,10 +372,10 @@ function test_give_ship_all_ships() local f = faction.create("human", 'noreply@vg.no') local u1 = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - u1.ship = ship.create(r, 'boat') + u1.ship = ship.create(r, 'longboat') u1.ship.damage = 2 u1.ship.number = 2 - u2.ship = ship.create(r, 'boat') + u2.ship = ship.create(r, 'longboat') u2.ship.number = 1 u1:add_order("GIB " .. itoa36(u2.id) .. " 2 SCHIFF") process_orders() @@ -323,7 +390,7 @@ function test_give_ship_self_only() local f2 = faction.create("human") local u1 = unit.create(f1, r, 1) local u2 = unit.create(f2, r, 1) - local sh = ship.create(r, 'boat') + local sh = ship.create(r, 'longboat') sh.number = 2 u1.ship = sh u1:add_order("GIB " .. itoa36(u2.id) .. " 1 SCHIFF") @@ -337,7 +404,7 @@ function test_give_ship_not_cursed() local f = faction.create("human") local u = unit.create(f, r, 1) local u2 = unit.create(f, r, 1) - local sh = ship.create(r, 'boat') + local sh = ship.create(r, 'longboat') u.ship = sh u:add_item("speedsail", 1) u:add_order("BENUTZE 1 Sonnensegel") @@ -354,7 +421,7 @@ function test_speedsail_on_ship() local r = region.create(1, 0, 'plain') local f = faction.create("human") local u = unit.create(f, r, 1) - local sh = ship.create(r, 'boat') + local sh = ship.create(r, 'longboat') u.ship = sh u:add_item("speedsail", 1) u:add_order("BENUTZE 1 Sonnensegel") @@ -366,7 +433,7 @@ function test_no_speedsail_on_convoy() local r = region.create(1, 0, 'plain') local f = faction.create("human") local u = unit.create(f, r, 1) - local sh = ship.create(r, 'boat') + local sh = ship.create(r, 'longboat') u.ship = sh sh.number = 2 u:add_item("speedsail", 2) diff --git a/src/give.c b/src/give.c index 716bab933..ad157225a 100644 --- a/src/give.c +++ b/src/give.c @@ -299,6 +299,9 @@ static void transfer_ships(ship *s1, ship *s2, int n) s2->damage += s1->damage * n / s1->number; s2->size += s1->size * n / s1->number; s2->number += n; + if (s1->coast != NODIRECTION) { + s2->coast = s1->coast; + } scale_ship(s1, s1->number - n); } @@ -322,8 +325,9 @@ message * give_ship(unit *u1, unit *u2, int n, order *ord) { assert(u1->ship); assert(n > 0 && n <= u1->ship->number); - if (u1->faction != u2->faction) { - return msg_error(u1, ord, 324); + if (u1->ship->type->range < 3) { + /* Keine Boote und anderes Kleinzeug erlaubt */ + return msg_error(u1, ord, 326); } if (ship_cursed(u1->ship)) { return msg_error(u1, ord, 323); @@ -331,51 +335,72 @@ message * give_ship(unit *u1, unit *u2, int n, order *ord) if (u1 != ship_owner(u1->ship)) { return msg_error(u1, ord, 146); } - if (fval(u_race(u2), RCF_CANSAIL)) { - if (u2->ship) { - if (u2 != ship_owner(u2->ship)) { - return msg_error(u1, ord, 146); - } - if (u2->ship->type != u1->ship->type) { - return msg_error(u1, ord, 322); - } - if (ship_cursed(u2->ship)) { - return msg_error(u1, ord, 323); - } - if (u1->ship->coast != u2->ship->coast) { - if (u1->ship->coast != NODIRECTION) { - if (u2->ship->coast == NODIRECTION) { - u2->ship->coast = u1->ship->coast; + if (u2 == NULL) { + if (n < u1->ship->number) { + ship * sh = new_ship(u1->ship->type, u1->region, u1->faction->locale); + scale_ship(sh, 0); + transfer_ships(u1->ship, sh, n); + } + else { + return msg_error(u1, ord, 327); + } + } else { + if (u1->faction != u2->faction) { + return msg_error(u1, ord, 324); + } + if (fval(u_race(u2), RCF_CANSAIL)) { + if (u2->ship) { + if (u2->ship == u1->ship) { + ship * sh = new_ship(u1->ship->type, u1->region, u1->faction->locale); + scale_ship(sh, 0); + leave_ship(u2); + u_set_ship(u2, sh); + } else { + if (u2 != ship_owner(u2->ship)) { + return msg_error(u1, ord, 146); } - else { - return msg_error(u1, ord, 182); + if (u2->ship->type != u1->ship->type) { + return msg_error(u1, ord, 322); + } + if (ship_cursed(u2->ship)) { + return msg_error(u1, ord, 323); + } + if (u1->ship->coast != u2->ship->coast) { + if (u1->ship->coast != NODIRECTION) { + if (u2->ship->coast == NODIRECTION) { + u2->ship->coast = u1->ship->coast; + } + else { + return msg_error(u1, ord, 182); + } + } } } - } - if (n < u1->ship->number) { - transfer_ships(u1->ship, u2->ship, n); + if (n < u1->ship->number) { + transfer_ships(u1->ship, u2->ship, n); + } + else { + transfer_ships(u1->ship, u2->ship, n); + transfer_units(u1->ship, u2->ship); + } } else { - transfer_ships(u1->ship, u2->ship, n); - transfer_units(u1->ship, u2->ship); + if (n < u1->ship->number) { + ship * sh = new_ship(u1->ship->type, u1->region, u1->faction->locale); + scale_ship(sh, 0); + u_set_ship(u2, sh); + transfer_ships(u1->ship, sh, n); + } + else { + u_set_ship(u2, u1->ship); + ship_set_owner(u2); + } } } else { - if (n < u1->ship->number) { - ship * sh = new_ship(u1->ship->type, u1->region, u1->faction->locale); - scale_ship(sh, 0); - u_set_ship(u2, sh); - transfer_ships(u1->ship, sh, n); - } - else { - u_set_ship(u2, u1->ship); - ship_set_owner(u2); - } + return msg_error(u1, ord, 233); } } - else { - return msg_error(u1, ord, 233); - } return NULL; }