Files
slgserver/server/slgserver/logic/mgr/army_mgr.go
2025-11-18 18:08:48 +08:00

287 lines
5.7 KiB
Go

package mgr
import (
"log/slog"
"slgserver/db"
"slgserver/server/slgserver/model"
"slgserver/server/slgserver/static_conf/facility"
"sync"
)
type armyMgr struct {
mutex sync.RWMutex
armyById map[int]*model.Army //key:armyId
armyByCityId map[int][]*model.Army //key:cityId
armyByRId map[int][]*model.Army //key:rid
}
var AMgr = &armyMgr{
armyById: make(map[int]*model.Army),
armyByCityId: make(map[int][]*model.Army),
armyByRId: make(map[int][]*model.Army),
}
func (this*armyMgr) Load() {
db.MasterDB.Table(model.Army{}).Find(this.armyById)
for _, army := range this.armyById {
//处理征兵
army.CheckConscript()
cid := army.CityId
c,ok:= this.armyByCityId[cid]
if ok {
this.armyByCityId[cid] = append(c, army)
}else{
this.armyByCityId[cid] = make([]*model.Army, 0)
this.armyByCityId[cid] = append(this.armyByCityId[cid], army)
}
//rid
if _, ok := this.armyByRId[army.RId]; ok == false{
this.armyByRId[army.RId] = make([]*model.Army, 0)
}
this.armyByRId[army.RId] = append(this.armyByRId[army.RId], army)
this.updateGenerals(army)
}
}
func (this*armyMgr) insertOne(army *model.Army) {
aid := army.Id
cid := army.CityId
this.armyById[aid] = army
if _, r:= this.armyByCityId[cid]; r == false{
this.armyByCityId[cid] = make([]*model.Army, 0)
}
this.armyByCityId[cid] = append(this.armyByCityId[cid], army)
if _, ok := this.armyByRId[army.RId]; ok == false{
this.armyByRId[army.RId] = make([]*model.Army, 0)
}
this.armyByRId[army.RId] = append(this.armyByRId[army.RId], army)
this.updateGenerals(army)
}
func (this*armyMgr) insertMutil(armys []*model.Army) {
for _, v := range armys {
this.insertOne(v)
}
}
func (this*armyMgr) Get(aid int) (*model.Army, bool){
this.mutex.RLock()
a, ok := this.armyById[aid]
this.mutex.RUnlock()
if ok {
a.CheckConscript()
return a, true
}else{
army := &model.Army{}
ok, err := db.MasterDB.Table(model.Army{}).Where("id=?", aid).Get(army)
if ok {
this.mutex.Lock()
this.insertOne(army)
this.mutex.Unlock()
return army, true
}else{
if err == nil{
slog.Warn("armyMgr GetByRId armyId db not found",
"armyId", aid)
return nil, false
}else{
slog.Warn("armyMgr GetByRId db error", "armyId", aid)
return nil, false
}
}
}
}
func (this*armyMgr) GetByCity(cid int) ([]*model.Army, bool){
this.mutex.RLock()
as, ok := this.armyByCityId[cid]
this.mutex.RUnlock()
if ok {
for _, a := range as {
a.CheckConscript()
}
return as, true
}else{
m := make([]*model.Army, 0)
err := db.MasterDB.Table(model.Army{}).Where("cityId=?", cid).Find(&m)
if err!=nil{
slog.Warn("armyMgr GetByCity db error", "cityId", cid)
return m, false
}else{
this.mutex.Lock()
this.insertMutil(m)
this.mutex.Unlock()
return m, true
}
}
}
func (this*armyMgr) GetByCityOrder(cid int, order int8) (*model.Army, bool){
rs, ok := this.GetByCity(cid)
if ok {
for _, r := range rs {
if r.Order == order{
return r, true
}
}
}else{
return nil, false
}
return nil, false
}
func (this*armyMgr) GetByRId(rid int) ([]*model.Army, bool){
this.mutex.RLock()
as, ok := this.armyByRId[rid]
this.mutex.RUnlock()
if ok {
for _, a := range as {
a.CheckConscript()
}
}
return as, ok
}
//归属于该位置的军队数量
func (this*armyMgr) BelongPosArmyCnt(rid int, x, y int) int{
cnt := 0
armys, ok := this.GetByRId(rid)
if ok {
for _, army := range armys {
if army.FromX == x && army.FromY == y{
cnt += 1
}else if army.Cmd == model.ArmyCmdTransfer && army.ToX == x && army.ToY == y {
cnt += 1
}
}
}
return cnt
}
func (this*armyMgr) GetOrCreate(rid int, cid int, order int8) (*model.Army, error){
this.mutex.RLock()
armys, ok := this.armyByCityId[cid]
this.mutex.RUnlock()
if ok {
for _, v := range armys {
if v.Order == order{
return v, nil
}
}
}
//需要创建
army := &model.Army{RId: rid,
Order: order,
CityId: cid,
Generals: `[0,0,0]`,
Soldiers: `[0,0,0]`,
GeneralArray: []int{0,0,0},
SoldierArray: []int{0,0,0},
ConscriptCnts: `[0,0,0]`,
ConscriptTimes: `[0,0,0]`,
ConscriptCntArray: []int{0,0,0},
ConscriptTimeArray: []int64{0,0,0},
}
city, ok := RCMgr.Get(cid)
if ok {
army.FromX = city.X
army.FromY = city.Y
army.ToX = city.X
army.ToY = city.Y
}
_, err := db.MasterDB.Insert(army)
if err == nil{
this.mutex.Lock()
this.insertOne(army)
this.mutex.Unlock()
return army, nil
}else{
slog.Warn("db error", "error", err)
return nil, err
}
}
func (this*armyMgr) GetSpeed(army*model.Army) int{
speed := 100000
for _, g := range army.Gens {
if g != nil {
s := g.GetSpeed()
if s < speed {
speed = s
}
}
}
//阵营加成
camp := army.GetCamp()
campAdds := []int{0}
if camp > 0{
campAdds = RFMgr.GetAdditions(army.CityId, facility.TypeHanAddition-1+camp)
}
return speed + campAdds[0]
}
//能否已经重复上阵了
func (this*armyMgr) IsRepeat(rid int, cfgId int) bool{
armys, ok := this.GetByRId(rid)
if ok == false{
return true
}
for _, army := range armys {
for _, g := range army.Gens {
if g != nil {
if g.CfgId == cfgId && g.CityId != 0{
return false
}
}
}
}
return true
}
func (this*armyMgr) updateGenerals(armys... *model.Army) {
for _, army := range armys {
army.Gens = make([]*model.General, 0)
for _, gid := range army.GeneralArray {
if gid == 0{
army.Gens = append(army.Gens, nil)
}else{
g, _ := GMgr.GetByGId(gid)
army.Gens = append(army.Gens, g)
}
}
}
}
func (this*armyMgr) All()[]*model.Army {
this.mutex.RLock()
defer this.mutex.RUnlock()
armys := make([]*model.Army, 0)
for _, army := range this.armyById {
armys = append(armys, army)
}
return armys
}