@@ -16,14 +16,17 @@ public class Game
1616 private IMap _map { get ; set ; }
1717 public string Map => _map . Name ;
1818
19+ public int ThreadNum = Server . MaxThread ;
20+
1921 private GameState _state ;
2022 public GameState State { get { return _state ; } }
2123
2224 private ConcurrentQueue < Command > _commands = new ConcurrentQueue < Command > ( ) ;
2325
2426 internal Hashtable Players { get ; } = new Hashtable ( ) ;
2527
26- internal int ThreadId { get ; set ; }
28+ internal string _MainThreadName { get ; set ; }
29+ internal string _EnergyThreadName { get ; set ; }
2730
2831 internal DateTime CreateTime { get ; set ; } = DateTime . Now ;
2932
@@ -51,13 +54,18 @@ public string ToJson()
5154 return string . Format ( json , Id , _map . Name , ( int ) State , players , _map . Cells ( ) ) ;
5255 }
5356
54- public Game ( IMap map )
57+ public Game ( IMap map , int thread )
5558 {
5659 _state = GameState . Wait ;
57- _map = map . Clone ( ) ;
60+ _map = map . Clone ( ) ;
61+
62+ if ( thread <= 0 || thread > Server . MaxThread )
63+ ThreadNum = Server . MaxThread ;
64+ else
65+ ThreadNum = thread ;
5866
5967 Task . Factory . StartNew ( ( ) => {
60- ThreadId = Thread . CurrentThread . ManagedThreadId ;
68+ _MainThreadName = "GameMainThread." + Thread . CurrentThread . ManagedThreadId . ToString ( ) ;
6169 while ( _state == GameState . Wait )
6270 {
6371 var ts = DateTime . Now - CreateTime ;
@@ -103,6 +111,34 @@ public Game(IMap map)
103111 Thread . Sleep ( 10000 ) ;
104112 Server . RemoveGame ( Id ) ;
105113 } ) ;
114+
115+ Task . Factory . StartNew ( ( ) => {
116+ _EnergyThreadName = "GameEnergyThread." + Thread . CurrentThread . ManagedThreadId . ToString ( ) ;
117+ while ( true )
118+ {
119+ if ( _state == GameState . Playing )
120+ {
121+ ProcessEnergy ( ) ;
122+ }
123+ else if ( _state >= GameState . Recycling )
124+ {
125+ break ;
126+ }
127+ Thread . Sleep ( 1000 ) ;
128+ }
129+ } ) ;
130+ }
131+
132+ private void ProcessEnergy ( )
133+ {
134+ foreach ( Player player in Players . Values )
135+ {
136+ if ( player . State == PlayerState . Playing )
137+ {
138+ double inc = player . Cells . Count * 0.2 ;
139+ player . AddEnergy ( inc ) ;
140+ }
141+ }
106142 }
107143
108144 private void ProcessAttack ( Command cmd , IMap map )
@@ -113,12 +149,12 @@ private void ProcessAttack(Command cmd, IMap map)
113149 var cell = map . Locate ( cmd . Target ) ;
114150 var player = Core . Players . Get ( cmd . Sender ) ;
115151
116- if ( cell != null && cell . CanAttack ( player ) )
152+ if ( cell != null && cell . CanAttack ( player , ThreadNum ) )
117153 {
118154 time = ActionLogic . Calc ( cmd . Action , cell , player ) ;
119155 Task < bool > . Factory . StartNew ( ( ) =>
120156 {
121- return cell . BeginChangeOwner ( player , time ) ;
157+ return cell . BeginChangeOwner ( player , time , ThreadNum ) ;
122158 } ) . ContinueWith ( ( task ) =>
123159 {
124160 if ( task . Result )
0 commit comments