using Preparation.Utility; using System.Threading; namespace GameClass.GameObj { /// /// 发电机 /// public class Generator : Immovable { public Generator(XY initPos) : base(initPos, GameData.numOfPosGridPerCell / 2, GameObjType.Generator) { } public override bool IsRigid => true; public override ShapeType Shape => ShapeType.Square; private int numOfFixing = 0; public int NumOfFixing { get => Interlocked.CompareExchange(ref numOfFixing, 0, 0); } public void AddNumOfFixing() { Interlocked.Increment(ref numOfFixing); } public void SubNumOfFixing() { Interlocked.Decrement(ref numOfFixing); } private int degreeOfRepair = 0; public int DegreeOfRepair { get { lock (gameObjLock) return degreeOfRepair; } private set { lock (gameObjLock) { if (degreeOfRepair < GameData.degreeOfFixedGenerator)//不允许正常破坏已经修好的发电机 if (value < 0) degreeOfRepair = 0; else degreeOfRepair = value > GameData.degreeOfFixedGenerator ? GameData.degreeOfFixedGenerator : value; } } } 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; } } }