fix: 🐛 fix the bug about learning
tags/v0.1.0
| @@ -37,28 +37,32 @@ namespace GameClass.GameObj | |||||
| lock (gameObjLock) | lock (gameObjLock) | ||||
| return degreeOfRepair; | 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; | private uint numOfRepairedGenerators = 0; | ||||
| public uint NumOfRepairedGenerators | 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(); | player.ThreadNum.WaitOne(); | ||||
| if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | ||||
| { | |||||
| player.ThreadNum.Release(); | |||||
| return false; | return false; | ||||
| } | |||||
| generatorForFix.AddNumOfFixing(); | generatorForFix.AddNumOfFixing(); | ||||
| new Thread | new Thread | ||||
| @@ -97,7 +100,7 @@ namespace Gaming | |||||
| loopToDo: () => | loopToDo: () => | ||||
| { | { | ||||
| if (generatorForFix.Repair(player.FixSpeed * GameData.checkInterval, player)) | if (generatorForFix.Repair(player.FixSpeed * GameData.checkInterval, player)) | ||||
| gameMap.NumOfRepairedGenerators++; | |||||
| gameMap.AddNumOfRepairedGenerators(); | |||||
| if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator) | ||||
| { | { | ||||
| lock (player.ActionLock) | lock (player.ActionLock) | ||||
| @@ -230,7 +230,7 @@ namespace Gaming | |||||
| if (generator != null) | if (generator != null) | ||||
| { | { | ||||
| if (generator.Repair(((WriteAnswers)activeSkill).DegreeOfMeditation, player)) | if (generator.Repair(((WriteAnswers)activeSkill).DegreeOfMeditation, player)) | ||||
| gameMap.NumOfRepairedGenerators++; | |||||
| gameMap.AddNumOfRepairedGenerators(); | |||||
| Debugger.Output(player, "uses WriteAnswers in" + generator.ToString() + "with " + (((WriteAnswers)activeSkill).DegreeOfMeditation).ToString()); | Debugger.Output(player, "uses WriteAnswers in" + generator.ToString() + "with " + (((WriteAnswers)activeSkill).DegreeOfMeditation).ToString()); | ||||
| ((WriteAnswers)activeSkill).DegreeOfMeditation = 0; | ((WriteAnswers)activeSkill).DegreeOfMeditation = 0; | ||||
| } | } | ||||