Browse Source

feat: 🎨 add a new SafeValues, AtomicLong

dev
shangfengh 2 years ago
parent
commit
81302bddce
3 changed files with 56 additions and 35 deletions
  1. +33
    -33
      logic/GameClass/GameObj/Character/Character.cs
  2. +2
    -2
      logic/Gaming/CharacterManager.cs
  3. +21
    -0
      logic/Preparation/Utility/SafeValue.cs

+ 33
- 33
logic/GameClass/GameObj/Character/Character.cs View File

@@ -147,38 +147,48 @@ namespace GameClass.GameObj
}
public double OriVampire { get; protected set; }

private AtomicInt degreeOfTreatment = new(0);
private readonly object treatLock = new();
private int degreeOfTreatment = 0;
public int DegreeOfTreatment
{
get => degreeOfTreatment;
get
{
lock (treatLock)
return degreeOfTreatment;
}
}
public void SetDegreeOfTreatment0()
{
degreeOfTreatment.Set(0);
lock (treatLock)
degreeOfTreatment = 0;
}

public bool AddDegreeOfTreatment(int value, Student whoTreatYou)
{
value = degreeOfTreatment.Add(value);
long addV = HP.TryAddAll(value);
if (addV == 0)
lock (treatLock)
{
SetDegreeOfTreatment0();
degreeOfTreatment += value;
long addV = HP.TryAddAll(degreeOfTreatment);
if (addV == 0)
{
degreeOfTreatment = 0;
return false;
}
if (addV > 0)
{
whoTreatYou.AddScore(GameData.StudentScoreTreat(addV));
degreeOfTreatment = 0;
return true;
}
if (degreeOfTreatment >= GameData.basicTreatmentDegree)
{
whoTreatYou.AddScore(GameData.StudentScoreTreat(GameData.basicTreatmentDegree));
HP.AddPositiveV(GameData.basicTreatmentDegree);
degreeOfTreatment = 0;
return true;
}
return false;
}
if (addV > 0)
{
whoTreatYou.AddScore(GameData.StudentScoreTreat(addV));
SetDegreeOfTreatment0();
return true;
}
if (value >= GameData.basicTreatmentDegree)
{
whoTreatYou.AddScore(GameData.StudentScoreTreat(GameData.basicTreatmentDegree));
HP.AddPositiveV(GameData.basicTreatmentDegree);
SetDegreeOfTreatment0();
return true;
}
return false;
}
#endregion
#region 查询状态相关的基本属性与方法
@@ -475,18 +485,8 @@ namespace GameClass.GameObj
/// <summary>
/// 角色所属队伍ID
/// </summary>
private long teamID = long.MaxValue;
public long TeamID
{
get => Interlocked.Read(ref teamID);
set => Interlocked.Exchange(ref teamID, value);
}
private long playerID = long.MaxValue;
public long PlayerID
{
get => Interlocked.Read(ref playerID);
set => Interlocked.Exchange(ref playerID, value);
}
public AtomicLong TeamID { get; } = new AtomicLong(long.MaxValue);
public AtomicLong PlayerID { get; } = new AtomicLong(long.MaxValue);

#region 道具和buff相关属性、方法
private readonly object inventoryLock = new();


+ 2
- 2
logic/Gaming/CharacterManager.cs View File

@@ -57,8 +57,8 @@ namespace Gaming
}
gameMap.Add(newPlayer);

newPlayer.TeamID = teamID;
newPlayer.PlayerID = playerID;
newPlayer.TeamID.Set(teamID);
newPlayer.PlayerID.Set(playerID);
/* #region 人物装弹
new Thread
(


+ 21
- 0
logic/Preparation/Utility/SafeValue.cs View File

@@ -26,6 +26,27 @@ namespace Preparation.Utility
/// <returns>返回操作前的值</returns>
public int CompareExReturnOri(int newV, int compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo);
}
public struct AtomicLong
{
private long v;
public AtomicLong(long x)
{
v = x;
}
public override string ToString() => Interlocked.Read(ref v).ToString();
public long Get() => Interlocked.Read(ref v);
public static implicit operator long(AtomicLong aint) => Interlocked.Read(ref aint.v);
public long Set(long value) => Interlocked.Exchange(ref v, value);

public long Add(long x) => Interlocked.Add(ref v, x);
public long Sub(long x) => Interlocked.Add(ref v, -x);
public long Inc() => Interlocked.Increment(ref v);
public long Dec() => Interlocked.Decrement(ref v);

public void CompareExchange(long newV, long compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo);
/// <returns>返回操作前的值</returns>
public long CompareExReturnOri(long newV, long compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo);
}
public struct AtomicBool
{
private int v;//v==0为false,v==1为true


Loading…
Cancel
Save