| @@ -37,28 +37,32 @@ namespace GameClass.GameObj | |||
| lock (gameObjLock) | |||
| return degreeOfRepair; | |||
| } | |||
| private set | |||
| } | |||
| public bool Repair(int addDegree, Character character) | |||
| { | |||
| int orgDegreeOfRepair, value; | |||
| lock (gameObjLock) | |||
| { | |||
| lock (gameObjLock) | |||
| if (degreeOfRepair == GameData.degreeOfFixedGenerator) return false; | |||
| orgDegreeOfRepair = degreeOfRepair; | |||
| degreeOfRepair += addDegree; | |||
| if (degreeOfRepair < 0) degreeOfRepair = 0; | |||
| else | |||
| { | |||
| if (degreeOfRepair < GameData.degreeOfFixedGenerator)//不允许正常破坏已经修好的发电机 | |||
| if (value < 0) degreeOfRepair = 0; | |||
| else degreeOfRepair = value > GameData.degreeOfFixedGenerator ? GameData.degreeOfFixedGenerator : value; | |||
| if (degreeOfRepair > GameData.degreeOfFixedGenerator) degreeOfRepair = GameData.degreeOfFixedGenerator; | |||
| } | |||
| value = degreeOfRepair; | |||
| } | |||
| } | |||
| public bool Repair(int addDegree, Character character) | |||
| { | |||
| if (DegreeOfRepair == GameData.degreeOfFixedGenerator) return false; | |||
| int orgDegreeOfRepair = degreeOfRepair; | |||
| DegreeOfRepair += addDegree; | |||
| if (DegreeOfRepair > orgDegreeOfRepair) | |||
| character.AddScore(GameData.StudentScoreFix(DegreeOfRepair) - GameData.StudentScoreFix(orgDegreeOfRepair)); | |||
| else character.AddScore(GameData.TrickerScoreDamageGenerator(orgDegreeOfRepair) - GameData.TrickerScoreDamageGenerator(DegreeOfRepair)); | |||
| if (DegreeOfRepair == GameData.degreeOfFixedGenerator) | |||
| return true; | |||
| else return false; | |||
| if (value > orgDegreeOfRepair) | |||
| { | |||
| character.AddScore(GameData.StudentScoreFix(value) - GameData.StudentScoreFix(orgDegreeOfRepair)); | |||
| if (value == GameData.degreeOfFixedGenerator) return true; | |||
| } | |||
| else character.AddScore(GameData.TrickerScoreDamageGenerator(orgDegreeOfRepair) - GameData.TrickerScoreDamageGenerator(value)); | |||
| return false; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -58,41 +58,38 @@ namespace GameClass.GameObj | |||
| private uint numOfRepairedGenerators = 0; | |||
| public uint NumOfRepairedGenerators | |||
| { | |||
| get => numOfRepairedGenerators; | |||
| set | |||
| get => Interlocked.CompareExchange(ref numOfDeceasedStudent, 0, 0); | |||
| } | |||
| public void AddNumOfRepairedGenerators() | |||
| { | |||
| uint value = Interlocked.Increment(ref numOfDeceasedStudent); | |||
| if (value == GameData.numOfGeneratorRequiredForEmergencyExit) | |||
| { | |||
| lock (lockForNum) | |||
| GameObjLockDict[GameObjType.EmergencyExit].EnterWriteLock(); | |||
| try | |||
| { | |||
| numOfRepairedGenerators = value; | |||
| if (NumOfRepairedGenerators == GameData.numOfGeneratorRequiredForEmergencyExit) | |||
| { | |||
| GameObjLockDict[GameObjType.EmergencyExit].EnterWriteLock(); | |||
| try | |||
| { | |||
| Random r = new Random(Environment.TickCount); | |||
| EmergencyExit emergencyExit = (EmergencyExit)(GameObjDict[GameObjType.EmergencyExit][r.Next(0, GameObjDict[GameObjType.EmergencyExit].Count)]); | |||
| emergencyExit.CanOpen = true; | |||
| Preparation.Utility.Debugger.Output(emergencyExit, emergencyExit.Position.ToString()); | |||
| } | |||
| finally | |||
| { | |||
| GameObjLockDict[GameObjType.EmergencyExit].ExitWriteLock(); | |||
| } | |||
| } | |||
| else | |||
| if (NumOfRepairedGenerators == GameData.numOfGeneratorRequiredForRepair) | |||
| { | |||
| GameObjLockDict[GameObjType.Doorway].EnterWriteLock(); | |||
| try | |||
| { | |||
| foreach (Doorway doorway in GameObjDict[GameObjType.Doorway]) | |||
| doorway.PowerSupply = true; | |||
| } | |||
| finally | |||
| { | |||
| GameObjLockDict[GameObjType.Doorway].ExitWriteLock(); | |||
| } | |||
| } | |||
| Random r = new Random(Environment.TickCount); | |||
| EmergencyExit emergencyExit = (EmergencyExit)(GameObjDict[GameObjType.EmergencyExit][r.Next(0, GameObjDict[GameObjType.EmergencyExit].Count)]); | |||
| emergencyExit.CanOpen = true; | |||
| Preparation.Utility.Debugger.Output(emergencyExit, emergencyExit.Position.ToString()); | |||
| } | |||
| finally | |||
| { | |||
| GameObjLockDict[GameObjType.EmergencyExit].ExitWriteLock(); | |||
| } | |||
| } | |||
| else | |||
| if (value == GameData.numOfGeneratorRequiredForRepair) | |||
| { | |||
| GameObjLockDict[GameObjType.Doorway].EnterWriteLock(); | |||
| try | |||
| { | |||
| foreach (Doorway doorway in GameObjDict[GameObjType.Doorway]) | |||
| doorway.PowerSupply = true; | |||
| } | |||
| finally | |||
| { | |||
| GameObjLockDict[GameObjType.Doorway].ExitWriteLock(); | |||
| } | |||
| } | |||
| } | |||
| @@ -84,7 +84,10 @@ namespace Gaming | |||
| player.ThreadNum.WaitOne(); | |||
| if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | |||
| { | |||
| player.ThreadNum.Release(); | |||
| return false; | |||
| } | |||
| generatorForFix.AddNumOfFixing(); | |||
| new Thread | |||
| @@ -97,7 +100,7 @@ namespace Gaming | |||
| loopToDo: () => | |||
| { | |||
| if (generatorForFix.Repair(player.FixSpeed * GameData.checkInterval, player)) | |||
| gameMap.NumOfRepairedGenerators++; | |||
| gameMap.AddNumOfRepairedGenerators(); | |||
| if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | |||
| { | |||
| lock (player.ActionLock) | |||
| @@ -230,7 +230,7 @@ namespace Gaming | |||
| if (generator != null) | |||
| { | |||
| if (generator.Repair(((WriteAnswers)activeSkill).DegreeOfMeditation, player)) | |||
| gameMap.NumOfRepairedGenerators++; | |||
| gameMap.AddNumOfRepairedGenerators(); | |||
| Debugger.Output(player, "uses WriteAnswers in" + generator.ToString() + "with " + (((WriteAnswers)activeSkill).DegreeOfMeditation).ToString()); | |||
| ((WriteAnswers)activeSkill).DegreeOfMeditation = 0; | |||
| } | |||