From 287eb4350a8be226f0d0550e20218a43fb9065c6 Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Sat, 20 May 2023 22:36:21 +0800 Subject: [PATCH] fix: :bug: fix the bug about learning --- logic/GameClass/GameObj/Map/Generator.cs | 40 ++++++------ logic/GameClass/GameObj/Map/Map.cs | 63 +++++++++---------- logic/Gaming/ActionManager.cs | 5 +- .../SkillManager/SkillManager.ActiveSkill.cs | 2 +- 4 files changed, 57 insertions(+), 53 deletions(-) diff --git a/logic/GameClass/GameObj/Map/Generator.cs b/logic/GameClass/GameObj/Map/Generator.cs index ed8e479..83eacd2 100644 --- a/logic/GameClass/GameObj/Map/Generator.cs +++ b/logic/GameClass/GameObj/Map/Generator.cs @@ -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; } } -} +} \ No newline at end of file diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 311443a..a0278a3 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -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(); } } } diff --git a/logic/Gaming/ActionManager.cs b/logic/Gaming/ActionManager.cs index 17489f0..461e8bf 100644 --- a/logic/Gaming/ActionManager.cs +++ b/logic/Gaming/ActionManager.cs @@ -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) diff --git a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs index fd8abf6..c4a8a4e 100644 --- a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs +++ b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs @@ -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; }