feat: deduplicate ship name on transfer

This commit is contained in:
Ilia Denisov
2026-02-17 22:02:17 +02:00
parent f394c105b0
commit de91d575d0
7 changed files with 100 additions and 30 deletions
+5 -17
View File
@@ -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(),