Browse Source

Merge pull request #242 from shangfengh/new

build: 🚧 edit the data about Occupations
tags/0.1.0
Changli Tang GitHub 3 years ago
parent
commit
2b0e066354
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 343 additions and 281 deletions
  1. +1
    -1
      logic/GameClass/GameObj/Character/Character.cs
  2. +1
    -1
      logic/Gaming/ActionManager.cs
  3. +1
    -1
      logic/Gaming/CharacterManager .cs
  4. +2
    -2
      logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs
  5. +28
    -28
      logic/Preparation/Interface/IOccupation.cs
  6. +220
    -220
      logic/Preparation/Interface/ISkill.cs
  7. +13
    -5
      logic/Preparation/Utility/GameData.cs
  8. +77
    -23
      logic/规则Logic.md

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

@@ -472,7 +472,7 @@ namespace GameClass.GameObj
return indexing;
}

public void AddMoveSpeed(int buffTime, double add = 2.0) => buffManager.AddMoveSpeed(add, buffTime, newVal =>
public void AddMoveSpeed(int buffTime, double add = 1.0) => buffManager.AddMoveSpeed(add, buffTime, newVal =>
{ MoveSpeed = newVal < GameData.characterMaxSpeed ? newVal : GameData.characterMaxSpeed; },
OrgMoveSpeed);
public bool HasFasterSpeed => buffManager.HasFasterSpeed;


+ 1
- 1
logic/Gaming/ActionManager.cs View File

@@ -245,7 +245,7 @@ namespace Gaming
return false;
Chest? chestToOpen = (Chest?)gameMap.OneForInteract(player.Position, GameObjType.Chest);

if (chestToOpen == null || chestToOpen.IsOpen() || chestToOpen.OpenDegree > 0)
if (chestToOpen == null || chestToOpen.OpenDegree > 0)
return false;

player.PlayerState = PlayerStateType.OpeningTheChest;


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

@@ -134,7 +134,7 @@ namespace Gaming
{
if (!noise && XY.Distance(newPlayer.Position, person.Position) <= (newPlayer.AlertnessRadius / person.Concealment))
newPlayer.AddBgm(BgmType.GhostIsComing, (double)newPlayer.AlertnessRadius / XY.Distance(newPlayer.Position, person.Position));
if (newPlayer.CharacterType != CharacterType.Teacher && XY.Distance(newPlayer.Position, person.Position) <= GameData.basicViewRange)
if (newPlayer.CharacterType != CharacterType.Teacher && XY.Distance(newPlayer.Position, person.Position) <= newPlayer.ViewRange)
{
TimePinningDown += GameData.checkInterval;
newPlayer.AddScore(GameData.StudentScorePinDown(TimePinningDown) - ScoreAdded);


+ 2
- 2
logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs View File

@@ -239,8 +239,8 @@ namespace Gaming
{
if (gameMap.CanSee(player, character))
{
player.AddScore(GameData.StudentScoreTreat(character.MaxHp - character.HP));
character.AddMoveSpeed(GameData.PropDuration);
player.AddScore(GameData.ScoreInspire);
character.AddMoveSpeed(GameData.TimeOfAddingSpeedWhenInspire, GameData.AddedTimeOfSpeedWhenInspire);
}
}
}


+ 28
- 28
logic/Preparation/Interface/IOccupation.cs View File

@@ -45,10 +45,10 @@ namespace Preparation.Interface
public double concealment = GameData.basicConcealment * 1.5;
public double Concealment => concealment;

public int alertnessRadius = (int)(GameData.basicAlertnessRadius * 1.3);
public int alertnessRadius = (int)(GameData.basicGhostAlertnessRadius * 1.3);
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 1.3);
public int viewRange = (int)(GameData.basicGhostViewRange * 1.2);
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -62,7 +62,7 @@ namespace Preparation.Interface
}
public class Klee : IGhostType
{
private const int moveSpeed = (int)(GameData.basicGhostMoveSpeed * 155 / 127);
private const int moveSpeed = GameData.basicGhostMoveSpeed;
public int MoveSpeed => moveSpeed;

private const int maxHp = GameData.basicHp;
@@ -76,16 +76,16 @@ namespace Preparation.Interface
public double concealment = GameData.basicConcealment;
public double Concealment => concealment;

public int alertnessRadius = (int)(GameData.basicAlertnessRadius * 1.069);
public int alertnessRadius = GameData.basicGhostAlertnessRadius;
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 1.1);
public int viewRange = GameData.basicGhostViewRange;
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = (int)(GameData.basicSpeedOfOpeningOrLocking / 1.1);
public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
public int SpeedOfOpeningOrLocking => speedOfOpeningOrLocking;

public int speedOfClimbingThroughWindows = (int)(GameData.basicGhostSpeedOfClimbingThroughWindows / 1.1);
public int speedOfClimbingThroughWindows = GameData.basicGhostSpeedOfClimbingThroughWindows;
public int SpeedOfClimbingThroughWindows => speedOfClimbingThroughWindows;

public int speedOfOpenChest = (int)(GameData.basicSpeedOfOpenChest * 1.1);
@@ -107,10 +107,10 @@ namespace Preparation.Interface
public double concealment = GameData.basicConcealment * 0.8;
public double Concealment => concealment;

public int alertnessRadius = (int)(GameData.basicAlertnessRadius * 0.9);
public int alertnessRadius = (int)(GameData.basicGhostAlertnessRadius * 0.9);
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange);
public int viewRange = (int)(GameData.basicGhostViewRange);
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -141,16 +141,16 @@ namespace Preparation.Interface
public const int fixSpeed = 0;
public int FixSpeed => fixSpeed;

public const int treatSpeed = GameData.basicTreatSpeed;
public const int treatSpeed = (int)(GameData.basicTreatSpeed * 0.7);
public int TreatSpeed => treatSpeed;

public const double concealment = GameData.basicConcealment * 0.5;
public double Concealment => concealment;

public const int alertnessRadius = GameData.basicAlertnessRadius / 2;
public const int alertnessRadius = GameData.basicStudentAlertnessRadius / 2;
public int AlertnessRadius => alertnessRadius;

public int viewRange = GameData.basicViewRange * 9 / 10;
public int viewRange = GameData.basicStudentViewRange * 9 / 10;
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -164,10 +164,10 @@ namespace Preparation.Interface
}
public class Athlete : IStudentType
{
private const int moveSpeed = GameData.basicStudentMoveSpeed * 40 / 38;
private const int moveSpeed = GameData.basicStudentMoveSpeed * 11 / 10;
public int MoveSpeed => moveSpeed;

private const int maxHp = GameData.basicHp * 32 / 30;
private const int maxHp = GameData.basicHp;
public int MaxHp => maxHp;

private const int maxGamingAddiction = GameData.basicMaxGamingAddiction * 9 / 10;
@@ -187,13 +187,13 @@ namespace Preparation.Interface
public const double concealment = GameData.basicConcealment * 0.9;
public double Concealment => concealment;

public const int alertnessRadius = (int)(GameData.basicAlertnessRadius * 0.9);
public const int alertnessRadius = GameData.basicStudentAlertnessRadius;
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 1.1);
public int viewRange = (int)(GameData.basicStudentViewRange * 1.1);
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking * 12 / 10;
public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
public int SpeedOfOpeningOrLocking => speedOfOpeningOrLocking;

public int speedOfClimbingThroughWindows = GameData.basicStudentSpeedOfClimbingThroughWindows * 12 / 10;
@@ -210,7 +210,7 @@ namespace Preparation.Interface
private const int maxHp = (int)(GameData.basicHp * 1.1);
public int MaxHp => maxHp;

private const int maxGamingAddiction = (int)(GameData.basicMaxGamingAddiction * 1.5);
private const int maxGamingAddiction = (int)(GameData.basicMaxGamingAddiction * 1.3);
public int MaxGamingAddiction => maxGamingAddiction;

public BulletType InitBullet => BulletType.Null;
@@ -227,10 +227,10 @@ namespace Preparation.Interface
public const double concealment = GameData.basicConcealment * 0.9;
public double Concealment => concealment;

public const int alertnessRadius = (int)(GameData.basicAlertnessRadius * 0.9);
public const int alertnessRadius = (int)(GameData.basicStudentAlertnessRadius * 0.9);
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 0.9);
public int viewRange = (int)(GameData.basicStudentViewRange * 0.9);
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -267,10 +267,10 @@ namespace Preparation.Interface
public const double concealment = GameData.basicConcealment;
public double Concealment => concealment;

public const int alertnessRadius = (int)(GameData.basicAlertnessRadius);
public const int alertnessRadius = (int)(GameData.basicStudentAlertnessRadius);
public int AlertnessRadius => alertnessRadius;

public int viewRange = GameData.basicViewRange;
public int viewRange = GameData.basicStudentViewRange;
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -307,10 +307,10 @@ namespace Preparation.Interface
public const double concealment = GameData.basicConcealment;
public double Concealment => concealment;

public const int alertnessRadius = (int)(GameData.basicAlertnessRadius);
public const int alertnessRadius = (int)(GameData.basicStudentAlertnessRadius);
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 0.9);
public int viewRange = (int)(GameData.basicStudentViewRange * 0.9);
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;
@@ -338,19 +338,19 @@ namespace Preparation.Interface
public List<ActiveSkillType> ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.Rouse, ActiveSkillType.Encourage, ActiveSkillType.Inspire });
public List<PassiveSkillType> ListOfIPassiveSkill => new(new PassiveSkillType[] { });

public const int fixSpeed = GameData.basicFixSpeed * 11 / 10;
public const int fixSpeed = GameData.basicFixSpeed;
public int FixSpeed => fixSpeed;

public const int treatSpeed = GameData.basicTreatSpeed * 2;
public int TreatSpeed => treatSpeed;

public const double concealment = GameData.basicConcealment * 1.2;
public const double concealment = GameData.basicConcealment;
public double Concealment => concealment;

public const int alertnessRadius = (int)(GameData.basicAlertnessRadius * 1.2);
public const int alertnessRadius = GameData.basicStudentAlertnessRadius;
public int AlertnessRadius => alertnessRadius;

public int viewRange = (int)(GameData.basicViewRange * 1.1);
public int viewRange = GameData.basicStudentViewRange;
public int ViewRange => viewRange;

public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking;


+ 220
- 220
logic/Preparation/Interface/ISkill.cs View File

@@ -16,286 +16,286 @@ namespace Preparation.Interface
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;
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;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
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;
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;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
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;
public class Punish : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => 0;

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

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

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

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

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

public class Encourage : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2;
public int DurationTime => 0;
public class Encourage : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2;
public int DurationTime => 0;

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

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

public class Inspire : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2;
public int DurationTime => 0;
public class Inspire : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 2;
public int DurationTime => 0;

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

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
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;
public class Howl : IActiveSkill
{
public int SkillCD => GameData.commonSkillCD * 25 / 30;
public int DurationTime => 0;

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

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = value;
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
public class JumpyBomb : IActiveSkill
{
get => isBeingUsed; set => isBeingUsed = value;
}
}
public int SkillCD => GameData.commonSkillCD / 2;
public int DurationTime => GameData.commonSkillTime * 3 / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

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 bool isBeingUsed = false;
public bool IsBeingUsed
public class UseKnife : IActiveSkill
{
get => isBeingUsed; set => isBeingUsed = value;
}
}
public int SkillCD => GameData.commonSkillCD * 2 / 3;
public int DurationTime => GameData.commonSkillTime / 10;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

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 bool isBeingUsed = false;
public bool IsBeingUsed
public class UseRobot : IActiveSkill
{
get => isBeingUsed; set => isBeingUsed = value;
}
}
public int SkillCD => GameData.frameDuration;
public int DurationTime => 0;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public class WriteAnswers : 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;
}
}

private int degreeOfMeditation = 0;
public int DegreeOfMeditation
public class WriteAnswers : IActiveSkill
{
get => degreeOfMeditation;
set
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
{
lock (commonSkillLock)
get => degreeOfMeditation;
set
{
degreeOfMeditation = value;
lock (commonSkillLock)
{
degreeOfMeditation = value;
}
}
}
public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = 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
public class SummonGolem : IActiveSkill
{
get => golemSummoned;
set
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
{
lock (commonSkillLock)
get => golemSummoned;
set
{
golemSummoned = value;
lock (commonSkillLock)
{
golemSummoned = value;
}
}
}
}

public bool isBeingUsed = false;
public bool IsBeingUsed
{
get => isBeingUsed; set => isBeingUsed = 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
public class NullSkill : IActiveSkill
{
get => isBeingUsed; set => isBeingUsed = false;
}
}
public int SkillCD => GameData.commonSkillCD;
public int DurationTime => GameData.commonSkillTime;
private readonly object commonSkillLock = new object();
public object ActiveSkillLock => commonSkillLock;

public static class SkillFactory
{
public static IActiveSkill FindIActiveSkill(ActiveSkillType activeSkillType)
{
switch (activeSkillType)
public bool isBeingUsed = false;
public bool IsBeingUsed
{
case ActiveSkillType.BecomeInvisible:
return new BecomeInvisible();
case ActiveSkillType.UseKnife:
return new UseKnife();
case ActiveSkillType.Howl:
return new Howl();
case ActiveSkillType.Encourage:
return new Encourage();
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();
case ActiveSkillType.Inspire:
return new Inspire();
default:
return new NullSkill();
get => isBeingUsed; set => isBeingUsed = false;
}
}

public static ActiveSkillType FindActiveSkillType(IActiveSkill ActiveSkill)
public static class SkillFactory
{
switch (ActiveSkill)
public static IActiveSkill FindIActiveSkill(ActiveSkillType activeSkillType)
{
case BecomeInvisible:
return ActiveSkillType.BecomeInvisible;
case Howl:
return ActiveSkillType.Howl;
case UseKnife:
return ActiveSkillType.UseKnife;
case Encourage:
return ActiveSkillType.Encourage;
case CanBeginToCharge:
return ActiveSkillType.CanBeginToCharge;
case Inspire:
return ActiveSkillType.Inspire;
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;
switch (activeSkillType)
{
case ActiveSkillType.BecomeInvisible:
return new BecomeInvisible();
case ActiveSkillType.UseKnife:
return new UseKnife();
case ActiveSkillType.Howl:
return new Howl();
case ActiveSkillType.Encourage:
return new Encourage();
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();
case ActiveSkillType.Inspire:
return new Inspire();
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 Encourage:
return ActiveSkillType.Encourage;
case CanBeginToCharge:
return ActiveSkillType.CanBeginToCharge;
case Inspire:
return ActiveSkillType.Inspire;
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;
}
}
}
}

+ 13
- 5
logic/Preparation/Utility/GameData.cs View File

@@ -87,7 +87,7 @@ namespace Preparation.Utility
public const int basicSpeedOfOpeningOrLocking = 40;
public const int basicStudentSpeedOfClimbingThroughWindows = 611;
public const int basicGhostSpeedOfClimbingThroughWindows = 1270;
public const int basicSpeedOfOpenChest = 1000;
public const int basicSpeedOfOpenChest = 100;

public const int basicHp = 3000000; // 初始血量
public const int basicMaxGamingAddiction = 60000;//基本完全沉迷时间
@@ -106,8 +106,10 @@ namespace Preparation.Utility
public const int characterMaxSpeed = 12000; // 最大速度

public const double basicConcealment = 1.0;
public const int basicAlertnessRadius = 10700;
public const int basicViewRange = 5 * numOfPosGridPerCell;
public const int basicStudentAlertnessRadius = 15 * numOfPosGridPerCell;
public const int basicGhostAlertnessRadius = 17 * numOfPosGridPerCell;
public const int basicStudentViewRange = 10 * numOfPosGridPerCell;
public const int basicGhostViewRange = 15 * numOfPosGridPerCell;
public const int maxNumOfPropInPropInventory = 3;

public static XY PosWhoDie = new XY(1, 1);
@@ -168,6 +170,9 @@ namespace Preparation.Utility
public const int ScorePropClairaudience = 10;
public const int ScorePropAddHp = 20;
public const int ScorePropRecoverFromDizziness = 20;

public const int ScoreBecomeInvisible = 10;
public const int ScoreInspire = ScorePropAddSpeed;
#endregion
#region 攻击与子弹相关
public const int basicApOfGhost = 1500000; // 捣蛋鬼攻击力
@@ -204,6 +209,9 @@ namespace Preparation.Utility

public const int TimeOfStunnedWhenJumpyDumpty = 3070;

public const double AddedTimeOfSpeedWhenInspire = 0.6;
public const int TimeOfAddingSpeedWhenInspire = 6000;

#endregion
#region 道具相关
public const int PropRadius = numOfPosGridPerCell / 2;
@@ -222,9 +230,9 @@ namespace Preparation.Utility
public const int numOfTeachingBuilding = 3;
#endregion
#region 物体相关
public const int degreeOfFixedGenerator = 10300000;
public const int degreeOfFixedGenerator = 8180000;
public const int degreeOfLockingOrOpeningTheDoor = 100000;
public const int degreeOfOpenedChest = 10000;
public const int degreeOfOpenedChest = 100000;
public const int degreeOfOpenedDoorway = 18000;
public const int maxNumOfPropInChest = 2;
public const int numOfGeneratorRequiredForRepair = 7;


+ 77
- 23
logic/规则Logic.md View File

@@ -76,7 +76,7 @@
- 当求生者血量归零时,求生者自动原地进入沉迷状态,每毫秒增加1沉迷度
- 该学生可由其他的求生者唤醒,唤醒后,血量恢复至1/2并可以重新行动。沉迷程度不清空。
- 一般情况下,唤醒时间为1秒。
- 进入沉迷状态时。如果求生者原本沉迷程度在(0,20900)中,求生者沉迷程度直接变为20900;如果求生者原本沉迷程度在【20900,40300)中,求生者沉迷程度直接变为40300;如果求生者原本沉迷程度大于40300,从游戏中出局;
- 进入沉迷状态时。如果求生者原本沉迷程度在(0,其最大沉迷度/3)中,求生者沉迷程度直接变为其最大沉迷度/3;如果求生者原本沉迷程度在[其最大沉迷度/3,其最大沉迷度*2/3)中,求生者沉迷程度直接变为其最大沉迷度*2/3;如果求生者原本沉迷程度大于其最大沉迷度*2/3,从游戏中出局;
- 当求生者沉迷程度达到该玩家最大沉迷程度时,从游戏中出局

#### 门
@@ -138,53 +138,107 @@
## 职业与技能

### 捣蛋鬼

| 捣蛋鬼职业 | 基本量 | Assassin | Klee | 喧哗者ANoisyPerson |
| :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- |
| 移动速度 | 1,503 | 1.1 | 1 | 1.07 |
| 隐蔽度 | 1.0 | 1.5 | 1 | 0.8 |
| 警戒范围 | 17000 | 1.3 | 1 | 0.9 |
| 视野范围 | 15000 | 1.2 | 1 | 1 |
| 开锁门时间(ms)| 2500 | 1/1 | 1 | 1 |
| 翻窗速度 | 1270 | 1 | 1 | 1.1 |
| 翻箱时间(ms) | 10000 | 1/1 | 1/1.1 | 1 |

#### 刺客
- 普通攻击为 CommonAttackOfGhost
- 主动技能
- 隐身
在DurationTime时间内玩家隐身
- CD:30s 持续时间:6s
- 在持续时间内玩家隐身
- 使用瞬间得分
- 使用飞刀
在DurationTime时间内,攻击类型变为飞刀
- CD:20s 持续时间:1s
- 在持续时间内,攻击类型变为飞刀
- 不得分

#### Klee
- 普通攻击为 CommonAttackOfGhost
- 主动技能
- 蹦蹦炸弹
- 在DurationTime内,攻击类型变为蹦蹦炸弹
- 普通攻击为 CommonAttackOfGhost
- 主动技能
- 蹦蹦炸弹
- CD:15s 持续时间:3s
- 在持续时间内,攻击类型变为蹦蹦炸弹
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,270° 发出2个小炸弹
- 2个小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕(AP / GameData.timeFactorOfGhostFainting)ms
- 2个小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕3.07s
- 不得分

#### 喧哗者
- 主动技能
- 嚎叫
使用瞬间,在视野半径范围内(不是可视区域)的学生被眩晕(GameData.TimeOfStudentFaintingWhenHowl)ms,自己进入(GameData.TimeOfGhostSwingingAfterHowl)ms的后摇
- 被动技能
在场所有学生Bgm系统被设为无用的值
- 普通攻击为 CommonAttackOfGhost
- 主动技能
- 嚎叫
- CD:25s
- 使用瞬间,在视野半径范围内(不是可视区域)的学生被眩晕6110ms,自己进入3070ms的后摇
- 通过眩晕获得对应得分
- 被动技能
- 在场所有学生Bgm系统被设为无用的值


### 学生(&老师)

| 学生职业 | 基本量 | 教师Teacher | 健身狂Athlete | 学霸StraightAStudent | 开心果Sunshine |
| :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- | :--------------------- |
| 移动速度 | 1,270 | 3 / 4 | 1.1 | 0.8 | 1 |
| 最大毅力值 | 3000000 | 10 | 1 | 1.1 | 32/30 |
| 最大沉迷度 | 60000 | 10 | 0.9 | 1.3 | 1.1 |
| 学习一科时间(ms) | 81800 | 1/0 | 10/6 | 10/11 | 1 |
| 治疗速度 | 100 | 0.7 | 0.8 | 0.8 | 2 |
| 隐蔽度 | 1.0 | 0.5 | 0.9 | 0.9 | 1 |
| 警戒范围 | 15000 | 0.5 | 1 | 0.9 | 1 |
| 视野范围 | 10000 | 0.9 | 1.1 | 0.9 | 1 |
| 开锁门时间(ms)| 2500 | 1/1 | 1 | 1 | 1 |
| 翻窗速度 | 1270 | 0.5 | 1.2 | 10/12 | 1 |
| 翻箱时间(ms) | 10000 | 1/1 | 1 | 1 | 1 |

#### 运动员
- 主动技能
- 冲撞
在DurationTime内,速度变为三倍,期间撞到捣蛋鬼,会导致捣蛋鬼眩晕7.22s,学生眩晕2.09s
- 主动技能
- 冲撞
- CD:24s 持续时间:5s
- 在持续时间内,速度变为三倍,期间撞到捣蛋鬼,会导致捣蛋鬼眩晕7.22s,学生眩晕2.09s
- 通过眩晕获得对应得分

#### 教师
- 主动技能
- 惩罚
使用瞬间,在可视范围内的使用技能状态中、攻击前后摇的捣蛋鬼会被眩晕(3070)ms,
- CD:30s
- 使用瞬间,在可视范围内的使用技能状态中、攻击前后摇的捣蛋鬼会被眩晕(3070)ms,
- 通过眩晕获得对应得分
- 特性
教师无法获得牵制得分
- 教师无法获得牵制得分

#### 学霸
- 被动技能
- 冥想
-当玩家处于可接受指令状态且不在修机时,会积累学习进度,速度为(GameData.basicFixSpeed / 4)/ms
-受到攻击(并非伤害)或眩晕或翻窗(或攻击他人)学习进度清零
-主动技能
- 当玩家处于可接受指令状态且不在修机时,会积累学习进度,速度为(GameData.basicFixSpeed / 4)/ms
- 受到攻击(并非伤害)或眩晕或翻窗(或攻击他人)学习进度清零
- 主动技能
- 写答案
-使用瞬间,对于可互动范围内的一台电机增加这个学习进度
- CD:30s
- 使用瞬间,对于可互动范围内的一台电机增加这个学习进度
- 不得分

#### 开心果
- 主动技能
- 唤醒
- CD:60s
- 使用瞬间,唤醒可视范围内一个沉迷中的人
- 通过唤醒获得对应得分
- 勉励
- CD:60s
- 使用瞬间,治疗完成可视范围内一个毅力不足中的人
- 通过治疗获得对应得分
- 鼓舞
- CD:60s
- 使用瞬间,可视范围内学生(包括自己)获得持续6秒的1.6倍速Buff
- 每鼓舞一个学生得分10

## 游戏数据
请自行查看Logic/Preparation/Utility/GameData.cs


Loading…
Cancel
Save