rts-sim-module/fi/signal.go

105 lines
3.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package fi
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/component/component_proto"
"joylink.club/rtsssimulation/entity"
)
// UpdateSignalLightFault 设置信号机灯故障
//
// light : 灯泡
// faultType :故障类型
// set : true-设置故障false-取消故障
func UpdateSignalLightFault(w ecs.World, signalId string, light component_proto.Light_Color, faultType component_proto.Signal_Fault, set bool) error {
r := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
signalEntry, ok := wd.EntityMap[signalId]
if ok {
switch faultType {
case component_proto.Signal_DS: //断丝故障
{
lightEntry := component.SignalLightsType.Get(signalEntry).GetLightByColor(light)
if lightEntry == nil {
return ecs.NewErrResult(fmt.Errorf("信号机[%s]没有色灯[%d]", signalId, light))
}
if set {
if !lightEntry.HasComponent(component.LightFaultDsType) {
lightEntry.AddComponent(component.LightFaultDsType)
}
} else {
if lightEntry.HasComponent(component.LightFaultDsType) {
lightEntry.RemoveComponent(component.LightFaultDsType)
}
}
}
default:
return ecs.NewErrResult(fmt.Errorf("信号机[%s]不支持该故障类型[%s]", signalId, faultType))
}
}
return ecs.NewOkEmptyResult()
})
return r.Err
}
// 更新信号机灯丝断丝故障
func UpdateSignalFaultDS(w ecs.World, uid string, light []component_proto.Light_Color) error {
r := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
signalEntry, ok := wd.EntityMap[uid]
if ok {
lights := component.SignalLightsType.Get(signalEntry)
// 先清除所有故障
for _, e := range lights.Lights {
e.RemoveComponent(component.LightFaultDsType)
}
// 设置故障
for _, light := range light {
lightEntry := component.SignalLightsType.Get(signalEntry).GetLightByColor(light)
if lightEntry == nil {
return ecs.NewErrResult(fmt.Errorf("信号机[%s]没有色灯[%d]", uid, light))
}
lightEntry.AddComponent(component.LightFaultDsType)
}
}
return ecs.NewOkEmptyResult()
})
return r.Err
}
// SignalLightDrive 当没有电路时,直接驱动信号机灯位上的灯
// ldLights : 需要亮的灯;当为空时则信号机所有色灯灭灯
func SignalLightDrive(w ecs.World, signalId string, ldLights ...component_proto.Light_Color) error {
r := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
signalEntry, ok := wd.EntityMap[signalId]
if !ok {
return ecs.NewErrResult(fmt.Errorf("信号机[%s]不存实体", signalId))
}
//
lights := component.SignalLightsType.Get(signalEntry)
//ldLights色灯亮
if len(ldLights) > 0 { //色灯亮
if !lights.HaveLightsByColor(ldLights...) {
return ecs.NewErrResult(fmt.Errorf("要点亮的这几个色灯不在信号机[%s]的灯位中", signalId))
}
for _, mdLightEntry := range lights.Lights {
component.LightDriveType.Get(mdLightEntry).Td = false
}
for _, ldLight := range ldLights {
ldLightEntry := lights.GetLightByColor(ldLight)
component.LightDriveType.Get(ldLightEntry).Td = true
}
} else { //信号机所有色灯灭灯
for _, mdLightEntry := range lights.Lights {
component.LightDriveType.Get(mdLightEntry).Td = false
}
}
return ecs.NewOkEmptyResult()
})
return r.Err
}