Browse Source

refactor: 🎨 refactor the struction of code

tags/0.1.0
shangfengh 2 years ago
parent
commit
11e1be0960
10 changed files with 296 additions and 321 deletions
  1. +2
    -29
      logic/GameClass/GameObj/Character/Character.Skill.cs
  2. +4
    -4
      logic/GameClass/GameObj/Character/Character.Student.cs
  3. +0
    -250
      logic/GameClass/GameObj/Character/Skill.cs
  4. +2
    -3
      logic/Gaming/ActionManager.cs
  5. +0
    -20
      logic/Gaming/Game.cs
  6. +2
    -0
      logic/Preparation/Interface/ICharacter.cs
  7. +38
    -11
      logic/Preparation/Interface/IOccupation.cs
  8. +248
    -1
      logic/Preparation/Interface/ISkill.cs
  9. +0
    -1
      logic/Server/GameServer.cs
  10. +0
    -2
      logic/规则Logic.md

+ 2
- 29
logic/GameClass/GameObj/Character/Character.Skill.cs View File

@@ -61,34 +61,7 @@ namespace GameClass.GameObj
this.CanMove = true;
this.score = 0;
this.buffManager = new BuffManager();
switch (characterType)
{
case CharacterType.Assassin:
this.occupation = new Assassin();
break;
case CharacterType.Robot:
this.occupation = new Robot();
break;
case CharacterType.Teacher:
this.occupation = new Teacher();
break;
case CharacterType.Klee:
this.occupation = new Klee();
break;
case CharacterType.StraightAStudent:
this.occupation = new StraightAStudent();
break;
case CharacterType.ANoisyPerson:
this.occupation = new ANoisyPerson();
break;
case CharacterType.TechOtaku:
this.occupation = new TechOtaku();
break;
case CharacterType.Athlete:
default:
this.occupation = new Athlete();
break;
}
this.occupation = OccupationFactory.FindIOccupation(characterType);
this.MaxHp = this.hp = Occupation.MaxHp;
this.OrgMoveSpeed = this.moveSpeed = Occupation.MoveSpeed;
this.BulletOfPlayer = this.OriBulletOfPlayer = Occupation.InitBullet;
@@ -103,7 +76,7 @@ namespace GameClass.GameObj
foreach (var activeSkill in this.Occupation.ListOfIActiveSkill)
{
this.IActiveSkillDictionary.Add(activeSkill, SkillFactory.FindIActiveSkill(activeSkill));
this.TimeUntilActiveSkillAvailable.Add(activeSkill, IActiveSkillDictionary[activeSkill].SkillCD);
this.TimeUntilActiveSkillAvailable.Add(activeSkill, 0);
}

// UsePassiveSkill(); //创建player时开始被动技能,这一过程也可以放到gamestart时进行


+ 4
- 4
logic/GameClass/GameObj/Character/Character.Student.cs View File

@@ -122,12 +122,12 @@ namespace GameClass.GameObj

public Student(XY initPos, int initRadius, CharacterType characterType) : base(initPos, initRadius, characterType)
{
this.OrgFixSpeed = this.fixSpeed = ((IStudent)Occupation).FixSpeed;
this.TreatSpeed = this.OrgTreatSpeed = ((IStudent)Occupation).TreatSpeed;
this.MaxGamingAddiction = ((IStudent)Occupation).MaxGamingAddiction;
this.OrgFixSpeed = this.fixSpeed = ((IStudentType)Occupation).FixSpeed;
this.TreatSpeed = this.OrgTreatSpeed = ((IStudentType)Occupation).TreatSpeed;
this.MaxGamingAddiction = ((IStudentType)Occupation).MaxGamingAddiction;
}
}
public class Golem : Student
public class Golem : Student, IGolem
{
private Character? parent; // 主人
public Character? Parent


+ 0
- 250
logic/GameClass/GameObj/Character/Skill.cs View File

@@ -1,250 +0,0 @@
using Preparation.Interface;
using Preparation.Utility;

namespace GameClass.GameObj
{
public class CanBeginToCharge : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 24 / 30;
public int DurationTime => GameData.commonSkillTime * 5 / 10;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class BecomeInvisible : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => GameData.commonSkillTime * 6 / 10;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Punish : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Rouse : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Howl : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 3 / 4;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class JumpyBomb : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD / 2;
public int DurationTime => GameData.commonSkillTime * 3 / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class UseKnife : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2 / 3;
public int DurationTime => GameData.commonSkillTime / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class UseRobot : IActiveSkill
{
public int SkillCD => GameData.frameDuration;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class WriteAnswers : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

private int degreeOfMeditation = 0;
public int DegreeOfMeditation
{
get => degreeOfMeditation;
set
{
lock (commonSkillLock)
{
degreeOfMeditation = value;
}
}
}
public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class SummonGolem : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

private Golem? golemSummoned = null;
public Golem? GolemSummoned
{
get => golemSummoned;
set
{
lock (commonSkillLock)
{
golemSummoned = value;
}
}
}

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class NullSkill : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => GameData.commonSkillTime;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = false;
}
}

public static class SkillFactory
{
public static IActiveSkill FindIActiveSkill(ActiveSkillType activeSkillType)
{
switch (activeSkillType)
{
case ActiveSkillType.BecomeInvisible:
return new BecomeInvisible();
case ActiveSkillType.UseKnife:
return new UseKnife();
case ActiveSkillType.Howl:
return new Howl();
case ActiveSkillType.CanBeginToCharge:
return new CanBeginToCharge();
case ActiveSkillType.Punish:
return new Punish();
case ActiveSkillType.JumpyBomb:
return new JumpyBomb();
case ActiveSkillType.WriteAnswers:
return new WriteAnswers();
case ActiveSkillType.SummonGolem:
return new SummonGolem();
case ActiveSkillType.UseRobot:
return new UseRobot();
case ActiveSkillType.Rouse:
return new Rouse();
default:
return new NullSkill();
}
}

public static ActiveSkillType FindActiveSkillType(IActiveSkill ActiveSkill)
{
switch (ActiveSkill)
{
case BecomeInvisible:
return ActiveSkillType.BecomeInvisible;
case Howl:
return ActiveSkillType.Howl;
case UseKnife:
return ActiveSkillType.UseKnife;
case CanBeginToCharge:
return ActiveSkillType.CanBeginToCharge;
case Punish:
return ActiveSkillType.Punish;
case JumpyBomb:
return ActiveSkillType.JumpyBomb;
case WriteAnswers:
return ActiveSkillType.WriteAnswers;
case SummonGolem:
return ActiveSkillType.SummonGolem;
case UseRobot:
return ActiveSkillType.UseRobot;
case Rouse:
return ActiveSkillType.Rouse;
default:
return ActiveSkillType.Null;
}
}
}
}

+ 2
- 3
logic/Gaming/ActionManager.cs View File

@@ -173,7 +173,7 @@ namespace Gaming
playerTreated.PlayerState = PlayerStateType.Treated;
player.PlayerState = PlayerStateType.Treating;
new FrameRateTaskExecutor<int>(
loopCondition: () => playerTreated.PlayerState == PlayerStateType.Treated && player.PlayerState == PlayerStateType.Treating && gameMap.Timer.IsGaming && GameData.ApproachToInteract(playerTreated.Position, player.Position),
loopCondition: () => playerTreated.PlayerState == PlayerStateType.Treated && player.PlayerState == PlayerStateType.Treating && gameMap.Timer.IsGaming,
loopToDo: () =>
{
if (playerTreated.AddDegreeOfTreatment(GameData.frameDuration * player.TreatSpeed, player))
@@ -182,11 +182,10 @@ namespace Gaming
timeInterval: GameData.frameDuration,
finallyReturn: () => 0
)

.Start();

if (playerTreated.PlayerState == PlayerStateType.Treated) playerTreated.PlayerState = PlayerStateType.Null;
if (player.PlayerState == PlayerStateType.Treating) player.PlayerState = PlayerStateType.Null;
else if (playerTreated.PlayerState == PlayerStateType.Treated) playerTreated.PlayerState = PlayerStateType.Null;
}
)
{ IsBackground = true }.Start();


+ 0
- 20
logic/Gaming/Game.cs View File

@@ -270,26 +270,6 @@ namespace Gaming
else
return false;
}
public void AllActiveSkillDisabledTemporarily()
{
if (!gameMap.Timer.IsGaming)
return;
gameMap.GameObjLockDict[GameObjType.Character].EnterWriteLock();
try
{
foreach (Character player in gameMap.GameObjDict[GameObjType.Character])
{
foreach (var activeSkill in player.Occupation.ListOfIActiveSkill)
{
player.SetTimeUntilActiveSkillAvailable(activeSkill, 0);
}
}
}
finally
{
gameMap.GameObjLockDict[GameObjType.Character].ExitWriteLock();
}
}

public void AllPlayerUsePassiveSkill()
{


+ 2
- 0
logic/Preparation/Interface/ICharacter.cs View File

@@ -15,4 +15,6 @@ namespace Preparation.Interface

public bool IsGhost();
}
public interface IStudent : ICharacter { }
public interface IGolem : IStudent { }
}

+ 38
- 11
logic/Preparation/Interface/IOccupation.cs View File

@@ -18,18 +18,18 @@ namespace Preparation.Interface
public int SpeedOfOpenChest { get; }
}

public interface IGhost : IOccupation
public interface IGhostType : IOccupation
{
}

public interface IStudent : IOccupation
public interface IStudentType : IOccupation
{
public int FixSpeed { get; }
public int TreatSpeed { get; }
public int MaxGamingAddiction { get; }
}

public class Assassin : IGhost
public class Assassin : IGhostType
{
private const int moveSpeed = (int)(GameData.basicGhostMoveSpeed * 1.1);
public int MoveSpeed => moveSpeed;
@@ -60,7 +60,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class Klee : IGhost
public class Klee : IGhostType
{
private const int moveSpeed = (int)(GameData.basicGhostMoveSpeed * 155 / 127);
public int MoveSpeed => moveSpeed;
@@ -91,7 +91,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = (int)(GameData.basicSpeedOfOpenChest * 1.1);
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class ANoisyPerson : IGhost
public class ANoisyPerson : IGhostType
{
private const int moveSpeed = (int)(GameData.basicGhostMoveSpeed * 1.07);
public int MoveSpeed => moveSpeed;
@@ -122,7 +122,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = (int)(GameData.basicSpeedOfOpenChest);
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class Teacher : IStudent
public class Teacher : IStudentType
{
private const int moveSpeed = GameData.basicStudentMoveSpeed * 3 / 4;
public int MoveSpeed => moveSpeed;
@@ -162,7 +162,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class Athlete : IStudent
public class Athlete : IStudentType
{
private const int moveSpeed = GameData.basicStudentMoveSpeed * 40 / 38;
public int MoveSpeed => moveSpeed;
@@ -202,7 +202,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class StraightAStudent : IStudent
public class StraightAStudent : IStudentType
{
private const int moveSpeed = (int)(GameData.basicStudentMoveSpeed * 0.8);
public int MoveSpeed => moveSpeed;
@@ -242,7 +242,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class Robot : IStudent
public class Robot : IStudentType
{
private const int moveSpeed = (int)(GameData.basicStudentMoveSpeed);
public int MoveSpeed => moveSpeed;
@@ -282,7 +282,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class TechOtaku : IStudent
public class TechOtaku : IStudentType
{
private const int moveSpeed = (int)(GameData.basicStudentMoveSpeed * 0.75);
public int MoveSpeed => moveSpeed;
@@ -322,7 +322,7 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}
public class Sunshine : IStudent
public class Sunshine : IStudentType
{
private const int moveSpeed = GameData.basicStudentMoveSpeed;
public int MoveSpeed => moveSpeed;
@@ -362,4 +362,31 @@ namespace Preparation.Interface
public int speedOfOpenChest = GameData.basicSpeedOfOpenChest;
public int SpeedOfOpenChest => speedOfOpenChest;
}

public static class OccupationFactory
{
public static IOccupation FindIOccupation(CharacterType characterType)
{
switch (characterType)
{
case CharacterType.Assassin:
return new Assassin();
case CharacterType.Robot:
return new Robot();
case CharacterType.Teacher:
return new Teacher();
case CharacterType.Klee:
return new Klee();
case CharacterType.StraightAStudent:
return new StraightAStudent();
case CharacterType.ANoisyPerson:
return new ANoisyPerson();
case CharacterType.TechOtaku:
return new TechOtaku();
case CharacterType.Athlete:
default:
return new Athlete();
}
}
}
}

+ 248
- 1
logic/Preparation/Interface/ISkill.cs View File

@@ -1,4 +1,7 @@
namespace Preparation.Interface
using Preparation.Interface;
using Preparation.Utility;

namespace Preparation.Interface
{
public interface ISkill
{
@@ -13,4 +16,248 @@
public object ActiveSkillLock { get; }
public bool IsBeingUsed { get; set; }
}
}
public class CanBeginToCharge : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 24 / 30;
public int DurationTime => GameData.commonSkillTime * 5 / 10;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class BecomeInvisible : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => GameData.commonSkillTime * 6 / 10;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Punish : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Rouse : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class Howl : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 3 / 4;
public int DurationTime => 0;

private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class JumpyBomb : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD / 2;
public int DurationTime => GameData.commonSkillTime * 3 / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class UseKnife : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2 / 3;
public int DurationTime => GameData.commonSkillTime / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class UseRobot : IActiveSkill
{
public int SkillCD => GameData.frameDuration;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class WriteAnswers : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

private int degreeOfMeditation = 0;
public int DegreeOfMeditation
{
get => degreeOfMeditation;
set
{
lock (commonSkillLock)
{
degreeOfMeditation = value;
}
}
}
public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class SummonGolem : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

private IGolem? golemSummoned = null;
public IGolem? GolemSummoned
{
get => golemSummoned;
set
{
lock (commonSkillLock)
{
golemSummoned = value;
}
}
}

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
}
}

public class NullSkill : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => GameData.commonSkillTime;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = false;
}
}

public static class SkillFactory
{
public static IActiveSkill FindIActiveSkill(ActiveSkillType activeSkillType)
{
switch (activeSkillType)
{
case ActiveSkillType.BecomeInvisible:
return new BecomeInvisible();
case ActiveSkillType.UseKnife:
return new UseKnife();
case ActiveSkillType.Howl:
return new Howl();
case ActiveSkillType.CanBeginToCharge:
return new CanBeginToCharge();
case ActiveSkillType.Punish:
return new Punish();
case ActiveSkillType.JumpyBomb:
return new JumpyBomb();
case ActiveSkillType.WriteAnswers:
return new WriteAnswers();
case ActiveSkillType.SummonGolem:
return new SummonGolem();
case ActiveSkillType.UseRobot:
return new UseRobot();
case ActiveSkillType.Rouse:
return new Rouse();
default:
return new NullSkill();
}
}

public static ActiveSkillType FindActiveSkillType(IActiveSkill ActiveSkill)
{
switch (ActiveSkill)
{
case BecomeInvisible:
return ActiveSkillType.BecomeInvisible;
case Howl:
return ActiveSkillType.Howl;
case UseKnife:
return ActiveSkillType.UseKnife;
case CanBeginToCharge:
return ActiveSkillType.CanBeginToCharge;
case Punish:
return ActiveSkillType.Punish;
case JumpyBomb:
return ActiveSkillType.JumpyBomb;
case WriteAnswers:
return ActiveSkillType.WriteAnswers;
case SummonGolem:
return ActiveSkillType.SummonGolem;
case UseRobot:
return ActiveSkillType.UseRobot;
case Rouse:
return ActiveSkillType.Rouse;
default:
return ActiveSkillType.Null;
}
}
}

+ 0
- 1
logic/Server/GameServer.cs View File

@@ -59,7 +59,6 @@ namespace Server
{
game.AllPlayerUsePassiveSkill();
ReportGame(GameState.GameStart);
game.AllActiveSkillDisabledTemporarily();
flag = false;
}
else ReportGame(GameState.GameRunning);


+ 0
- 2
logic/规则Logic.md View File

@@ -196,8 +196,6 @@
- 不加说明,这里“学生”往往包括职业“教师”

### 初始状态
- 所有玩家可以立刻使用主动技能
- 虽然一开始会接到仍需的冷却时间,但实际上是CD
- 玩家出生点固定且一定为空地

### 交互


Loading…
Cancel
Save