VehicleOperation.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { oops } from "../../../../../extensions/oops-plugin-framework/assets/core/Oops";
  2. import { ecs } from "../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
  3. import { ECSEntity } from "../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECSEntity";
  4. import { smc } from "../../common/SingletonModuleComp";
  5. import { UIID } from "../../common/config/GameUIConfig";
  6. import { MoveToComp } from "../../common/ecs/position/MoveTo";
  7. import { VehicleState } from "../../vehicle/model/VehicleModelComp";
  8. import { Checkpoint } from "../Checkpoint";
  9. import { CheckpointModelComp } from "../model/CheckpointModel";
  10. import { CheckpointLevelPassViewComp } from "../view/CheckpointLevelPassViewComp";
  11. import { CheckpointCheckPassComp } from "./CheckpointCheck";
  12. import { StationOperationComp } from "./StationOperation";
  13. /**
  14. * 车辆调度
  15. */
  16. @ecs.register('VehicleOperation')
  17. export class VehicleOperationComp extends ecs.Comp {
  18. isRun: boolean = false
  19. reset() {
  20. this.isRun = false
  21. }
  22. }
  23. export class VehicleOperationSystem extends ecs.ComblockSystem implements ecs.IEntityEnterSystem, ecs.ISystemUpdate {
  24. filter(): ecs.IMatcher {
  25. return ecs.allOf(CheckpointModelComp, VehicleOperationComp);
  26. }
  27. entityEnter(e: Checkpoint): void {
  28. e.CheckpointModel.curVehicle = null
  29. e.CheckpointModel.nextVehicle = null
  30. this.initCar(e)
  31. }
  32. initCar(e: Checkpoint) {
  33. // const vehiclesCopy = e.CheckpointModel.vehicles
  34. let vColor = e.CheckpointModel.puppets.filter(val => val.PathFind?.canReach).map(v => v.PuppetModel?.color)
  35. // console.log(vColor)
  36. if (vColor.length < 2) {
  37. vColor = e.CheckpointModel.puppets.slice(0, 8).map(v => v.PuppetModel?.color)
  38. }
  39. // console.log(vColor)
  40. // 统计颜色频率并按频率降序排序
  41. const colorFrequency = vColor.reduce((acc, color) => {
  42. acc[color] = (acc[color] || 0) + 1;
  43. return acc;
  44. }, {});
  45. // console.log('e.CheckpointModel.nextVehicle.VehicleModel.color:',e.CheckpointModel.curVehicle?.VehicleModel?.color)
  46. if(e.CheckpointModel.nextVehicle?.VehicleModel?.color&&colorFrequency[e.CheckpointModel.nextVehicle.VehicleModel.color]){
  47. colorFrequency[e.CheckpointModel.nextVehicle.VehicleModel.color] -=3
  48. // console.log('当前车辆色减去3个再计算多少')
  49. }
  50. // console.log(colorFrequency)
  51. const sortedColors = Object.keys(colorFrequency).sort((a, b) => colorFrequency[b] - colorFrequency[a]);
  52. const vehicles = e.CheckpointModel.vehicles
  53. const getColorVehicle = () => {
  54. const sortColor = sortedColors.shift()
  55. const colorIndex = vehicles.findIndex(v=>v.VehicleModel.color===sortColor)
  56. if(colorIndex>-1){
  57. return vehicles.splice(colorIndex,1)[0]
  58. }else{
  59. return vehicles.shift()
  60. }
  61. }
  62. if (!e.CheckpointModel.nextVehicle) {
  63. const vehicle = getColorVehicle()
  64. if (vehicle) {
  65. e.CheckpointModel.curVehicle = vehicle
  66. vehicle.VehicleView.animator.onStationComplete = () => {
  67. // vehicle.remove(MoveToComp)
  68. oops.audio.playEffect("common/audio/bus_horn");
  69. e.add(StationOperationComp)
  70. }
  71. vehicle.VehicleView?.animator.moveToStation()
  72. }
  73. } else {
  74. const vehicle = e.CheckpointModel.nextVehicle
  75. e.CheckpointModel.curVehicle = vehicle
  76. vehicle.VehicleView.animator.onStationComplete = () => {
  77. // vehicle.remove(MoveToComp)
  78. oops.audio.playEffect("common/audio/bus_horn");
  79. e.add(StationOperationComp)
  80. }
  81. e.CheckpointModel.nextVehicle = null
  82. vehicle.VehicleView?.animator.moveToStation()
  83. }
  84. if (!e.CheckpointModel.nextVehicle) {
  85. const nextVehicle = getColorVehicle()
  86. if (nextVehicle) {
  87. e.CheckpointModel.nextVehicle = nextVehicle
  88. nextVehicle.VehicleView?.animator.moveToWait()
  89. }
  90. }
  91. }
  92. update(e: Checkpoint): void {
  93. const vehicle = e.CheckpointModel.curVehicle
  94. if (e.CheckpointModel.peopleCount <= 0) {
  95. // console.log('过关了')
  96. e.add(CheckpointCheckPassComp)
  97. return
  98. }
  99. if (vehicle && vehicle.VehicleModel?.ready) {
  100. vehicle.VehicleView.animator.onLeaveComplete = () => {
  101. vehicle.destroy()
  102. }
  103. vehicle.VehicleView.animator.moveToLeave()
  104. this.initCar(e)
  105. }
  106. }
  107. }