feat: deduplicate ship name on transfer
This commit is contained in:
@@ -11,6 +11,11 @@ TODO: Препроцессинг и сохранение приказов
|
||||
составленный приказ, но при этом необходимо повторить те команды, которые
|
||||
были отданы верно. К счастью, программа-клиент помогает игроку не запутаться
|
||||
в этом процессе и берёт на себя контроль за целостностью приказов.
|
||||
|
||||
!!! Убедиться, что раса не покинула игру.
|
||||
|
||||
При производстве хода раса может быть исключена по TTL=0.
|
||||
В этом случае нужно игнорировать некоторые приказы, например, передачу ей кораблей.
|
||||
*/
|
||||
|
||||
import (
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
e "github.com/iliadenisov/galaxy/internal/error"
|
||||
"github.com/iliadenisov/galaxy/internal/model/game"
|
||||
"github.com/iliadenisov/galaxy/internal/number"
|
||||
"github.com/iliadenisov/galaxy/internal/util"
|
||||
)
|
||||
|
||||
// ShipGroup is a proxy func, nothing to cache
|
||||
@@ -329,20 +330,6 @@ func (c *Cache) unsafeUnloadCargo(sgi int, q float64) {
|
||||
p.UnpackCapital()
|
||||
}
|
||||
|
||||
/*
|
||||
TODO: Позволить передавать одноимённые группы.
|
||||
|
||||
При генерировании нового имени необходимо убедиться, что оно не превысит 30 символов.
|
||||
|
||||
> Если у расы, которой передается группа кораблей, уже определен класс кораблей с таким же
|
||||
> названием, но другими характеристиками, принимающая раса так же получит новый
|
||||
> класс кораблей, к названию которого будет добавлен случайный суффикс.
|
||||
|
||||
TODO: Убедиться, что раса не покинула игру.
|
||||
|
||||
При производстве хода раса может покинуть, а может и не покинуть игру,
|
||||
в зхависимости от того, были ли ею отданы новые приказы.
|
||||
*/
|
||||
func (c *Cache) shipGroupTransfer(ri, riAccept int, groupID uuid.UUID) (err error) {
|
||||
c.validateRaceIndex(ri)
|
||||
if ri == riAccept {
|
||||
@@ -361,13 +348,14 @@ func (c *Cache) shipGroupTransfer(ri, riAccept int, groupID uuid.UUID) (err erro
|
||||
st := c.ShipGroupShipClass(sgi)
|
||||
|
||||
var stAcc int
|
||||
var name = st.Name
|
||||
if stAcc = slices.IndexFunc(c.g.Race[riAccept].ShipTypes, func(v game.ShipType) bool { return v.Name == st.Name }); stAcc >= 0 &&
|
||||
!st.Equal(c.g.Race[riAccept].ShipTypes[stAcc]) {
|
||||
return e.NewGiveawayGroupShipsTypeNotEqualError("race %q, ship type %q", c.g.Race[riAccept].Name, c.g.Race[riAccept].ShipTypes[stAcc].Name)
|
||||
name = util.AppendRandomSuffix(name)
|
||||
}
|
||||
if stAcc < 0 {
|
||||
if stAcc < 0 || name != st.Name {
|
||||
err = c.ShipClassCreate(riAccept,
|
||||
st.Name,
|
||||
name,
|
||||
st.Drive.F(),
|
||||
int(st.Armament),
|
||||
st.Weapons.F(),
|
||||
|
||||
@@ -3,6 +3,7 @@ package controller_test
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/google/uuid"
|
||||
@@ -226,9 +227,6 @@ func TestShipGroupTransfer(t *testing.T) {
|
||||
assert.ErrorContains(t,
|
||||
g.ShipGroupTransfer(Race_0.Name, Race_1.Name, uuid.New()),
|
||||
e.GenericErrorText(e.ErrInputEntityNotExists))
|
||||
assert.ErrorContains(t,
|
||||
g.ShipGroupTransfer(Race_0.Name, Race_1.Name, c.ShipGroup(0).ID),
|
||||
e.GenericErrorText(e.ErrGiveawayGroupShipsTypeNotEqual))
|
||||
|
||||
orig := *c.ShipGroup(2)
|
||||
assert.NoError(t, g.ShipGroupTransfer(Race_0.Name, Race_1.Name, c.ShipGroup(2).ID)) // group #2 (3)
|
||||
@@ -275,6 +273,18 @@ func TestShipGroupTransfer(t *testing.T) {
|
||||
assert.ErrorContains(t,
|
||||
g.ShipGroupTransfer(Race_1.Name, Race_0.Name, sg.ID),
|
||||
e.GenericErrorText(e.ErrShipsBusy))
|
||||
|
||||
// transfer ship class with existing name
|
||||
originalName := c.MustShipClass(Race_0_idx, ShipType_Cruiser).Name
|
||||
assert.NoError(t, g.ShipGroupTransfer(Race_0.Name, Race_1.Name, c.ShipGroup(0).ID))
|
||||
var s *game.ShipType
|
||||
for st := range c.ListShipTypes(Race_1_idx) {
|
||||
if strings.HasPrefix(st.Name, originalName) && st.Name != originalName {
|
||||
s = st
|
||||
}
|
||||
}
|
||||
assert.NotNil(t, s)
|
||||
assert.Greater(t, len(s.Name), len(originalName))
|
||||
}
|
||||
|
||||
func TestShipGroupLoad(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user