rts-sim-module/entities/switch_entity.go

92 lines
2.6 KiB
Go
Raw Normal View History

2023-09-13 10:05:42 +08:00
package entities
import (
2023-09-26 15:27:12 +08:00
"time"
"github.com/yohamta/donburi/filter"
2023-09-13 10:05:42 +08:00
"joylink.club/ecs"
"joylink.club/rtsssimulation/repository"
2023-09-26 10:25:00 +08:00
"joylink.club/rtsssimulation/simulation"
2023-09-13 10:05:42 +08:00
"joylink.club/rtsssimulation/system"
)
type Position int
const (
SK Position = iota //四开(不会起名字)
D //定位
F //反位
)
2023-09-15 13:50:15 +08:00
// CreateSwitch2jzdj9Entity 双机zdj9
2023-09-14 13:52:36 +08:00
// 默认定位
2023-09-13 10:05:42 +08:00
func CreateSwitch2jzdj9Entity(w ecs.World, switchId string) *ecs.Entry {
2023-09-15 15:07:41 +08:00
e := w.Create(system.EntityIdentityComponent,
system.Switch2jZdj9StateComponent,
2023-09-21 15:22:22 +08:00
system.PercentageDeviceState1Component,
system.PercentageDeviceState2Component)
2023-09-13 10:05:42 +08:00
system.EntityIdentityComponent.Set(e, &system.EntityIdentity{Id: switchId})
2023-09-13 18:03:55 +08:00
//电路
system.Switch2jZdj9StateComponent.Set(e, system.NewSwitch2jZdj9State())
//J1
2023-09-21 15:22:22 +08:00
j1 := system.NewPercentageDeviceStateM() //定位
system.PercentageDeviceState1Component.Set(e, j1)
2023-09-13 18:03:55 +08:00
//J2
2023-09-21 15:22:22 +08:00
j2 := system.NewPercentageDeviceStateM() //定位
system.PercentageDeviceState2Component.Set(e, j2)
2023-09-13 10:05:42 +08:00
return e
}
2023-09-26 10:25:00 +08:00
func CreateTurnoutEntries(world ecs.World, turnouts []*repository.Turnout) []*ecs.Entry {
var entries []*ecs.Entry
for _, turnout := range turnouts {
2023-09-26 10:25:00 +08:00
if len(turnout.RelayGroups()) == 0 {
continue
}
entries = append(entries, CreateSwitch2jzdj9Entity(world, turnout.Id()))
}
return entries
}
2023-09-26 10:25:00 +08:00
func TurnToNormal(worldId ecs.WorldId, turnoutId string) {
sim := simulation.FindSimulation(worldId)
2023-09-26 14:53:37 +08:00
system.Switch2jZdj9DriveYc(sim.World(), turnoutId, true)
system.Switch2jZdj9DriveDc(sim.World(), turnoutId, true)
2023-09-26 14:53:37 +08:00
go func() {
<-time.After(5 * time.Second)
2023-09-26 14:53:37 +08:00
system.Switch2jZdj9DriveYc(sim.World(), turnoutId, false)
system.Switch2jZdj9DriveDc(sim.World(), turnoutId, false)
2023-09-26 14:53:37 +08:00
}()
2023-09-26 10:25:00 +08:00
}
func TurnToReverse(worldId ecs.WorldId, turnoutId string) {
sim := simulation.FindSimulation(worldId)
2023-09-26 14:53:37 +08:00
system.Switch2jZdj9DriveYc(sim.World(), turnoutId, true)
system.Switch2jZdj9DriveFc(sim.World(), turnoutId, true)
2023-09-26 14:53:37 +08:00
go func() {
<-time.After(5 * time.Second)
2023-09-26 14:53:37 +08:00
system.Switch2jZdj9DriveYc(sim.World(), turnoutId, false)
system.Switch2jZdj9DriveFc(sim.World(), turnoutId, false)
2023-09-26 14:53:37 +08:00
}()
2023-09-26 10:25:00 +08:00
}
func GetState(worldId ecs.WorldId, turnoutId string) Position {
sim := simulation.FindSimulation(worldId)
2023-09-26 15:27:12 +08:00
query := ecs.NewQuery(filter.Contains(system.EntityIdentityComponent, system.Switch2jZdj9StateComponent))
var position Position
// 查找道岔位置
query.Each(sim.World(), func(e *ecs.Entry) {
if turnoutId == system.EntityIdentityComponent.Get(e).Id {
state := system.Switch2jZdj9StateComponent.Get(e)
2023-09-26 16:30:39 +08:00
if state.J1_DB_K9 {
2023-09-26 15:27:12 +08:00
position = D
2023-09-26 16:30:39 +08:00
} else if state.J1_FB_K10 {
2023-09-26 15:27:12 +08:00
position = F
} else {
position = SK
}
}
})
return position
}