Browse Source

perf: adjust the structure

tags/0.1.0
shangfengh 2 years ago
parent
commit
c29ede3130
10 changed files with 82 additions and 81 deletions
  1. +1
    -9
      logic/GameClass/GameObj/Character/Character.cs
  2. +5
    -5
      logic/GameClass/GameObj/Map/Doorway.cs
  3. +29
    -39
      logic/Gaming/ActionManager.cs
  4. +6
    -6
      logic/Gaming/AttackManager.cs
  5. +24
    -8
      logic/Gaming/CharacterManager .cs
  6. +2
    -2
      logic/Gaming/Game.cs
  7. +5
    -4
      logic/Gaming/PropManager.cs
  8. +4
    -4
      logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs
  9. +4
    -3
      logic/Server/CopyInfo.cs
  10. +2
    -1
      logic/规则Logic.md

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

@@ -318,18 +318,10 @@ namespace GameClass.GameObj
private GameObj? whatInteractingWith = null; private GameObj? whatInteractingWith = null;
public GameObj? WhatInteractingWith => whatInteractingWith; public GameObj? WhatInteractingWith => whatInteractingWith;


public void SetPlayerState(PlayerStateType value = PlayerStateType.Null, GameObj? gameObj = null)
public void ChangePlayerState(PlayerStateType value = PlayerStateType.Null, GameObj? gameObj = null)
{ {
lock (gameObjLock) lock (gameObjLock)
{ {
switch (playerState)
{
case PlayerStateType.OpeningTheChest:
((Chest)whatInteractingWith).StopOpen();
break;
default:
break;
}
whatInteractingWith = gameObj; whatInteractingWith = gameObj;
if (value != PlayerStateType.Moving) if (value != PlayerStateType.Moving)
IsMoving = false; IsMoving = false;


+ 5
- 5
logic/GameClass/GameObj/Map/Doorway.cs View File

@@ -35,14 +35,14 @@ namespace GameClass.GameObj
} }
} }


private bool isOpening = false;
public bool IsOpening
private int openStartTime = 0;
public int OpenStartTime
{ {
get => isOpening;
get => openStartTime;
set set
{ {
lock (gameObjLock) lock (gameObjLock)
isOpening = value;
openStartTime = value;
} }
} }


@@ -61,6 +61,6 @@ namespace GameClass.GameObj
} }
} }


public bool IsOpen() => (OpenDegree == GameData.degreeOfOpenedDoorway);
public bool IsOpen() => (openDegree == GameData.degreeOfOpenedDoorway);
} }
} }

+ 29
- 39
logic/Gaming/ActionManager.cs View File

@@ -23,22 +23,22 @@ namespace Gaming
{ {
if (((Bullet)collisionObj).Parent != player && ((Bullet)collisionObj).TypeOfBullet == BulletType.JumpyDumpty) if (((Bullet)collisionObj).Parent != player && ((Bullet)collisionObj).TypeOfBullet == BulletType.JumpyDumpty)
{ {
if (CharacterManager.BeStunned((Character)player, GameData.TimeOfStunnedWhenJumpyDumpty))
if (characterManager.BeStunned((Character)player, GameData.TimeOfStunnedWhenJumpyDumpty))
player.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.TimeOfStunnedWhenJumpyDumpty)); player.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.TimeOfStunnedWhenJumpyDumpty));
gameMap.Remove((GameObj)collisionObj); gameMap.Remove((GameObj)collisionObj);
} }
} }
if (player.FindIActiveSkill(ActiveSkillType.CanBeginToCharge).IsBeingUsed && collisionObj.Type == GameObjType.Character && ((Character)collisionObj).IsGhost()) if (player.FindIActiveSkill(ActiveSkillType.CanBeginToCharge).IsBeingUsed && collisionObj.Type == GameObjType.Character && ((Character)collisionObj).IsGhost())
{ {
if (CharacterManager.BeStunned((Character)collisionObj, GameData.TimeOfGhostFaintingWhenCharge))
if (characterManager.BeStunned((Character)collisionObj, GameData.TimeOfGhostFaintingWhenCharge))
player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenCharge)); player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenCharge));
CharacterManager.BeStunned(player, GameData.TimeOfStudentFaintingWhenCharge);
characterManager.BeStunned(player, GameData.TimeOfStudentFaintingWhenCharge);
} }
} }
public bool MovePlayer(Character playerToMove, int moveTimeInMilliseconds, double moveDirection) public bool MovePlayer(Character playerToMove, int moveTimeInMilliseconds, double moveDirection)
{ {
if (!playerToMove.Commandable() || !TryToStop()) return false; if (!playerToMove.Commandable() || !TryToStop()) return false;
playerToMove.SetPlayerState(PlayerStateType.Moving);
characterManager.SetPlayerState(playerToMove, PlayerStateType.Moving);
moveEngine.MoveObj(playerToMove, moveTimeInMilliseconds, moveDirection); moveEngine.MoveObj(playerToMove, moveTimeInMilliseconds, moveDirection);
return true; return true;
} }
@@ -47,7 +47,7 @@ namespace Gaming
{ {
if (player.Commandable() || !TryToStop()) if (player.Commandable() || !TryToStop())
{ {
player.SetPlayerState();
characterManager.SetPlayerState(player);
return true; return true;
} }
return false; return false;
@@ -63,7 +63,7 @@ namespace Gaming
return false; return false;


++generatorForFix.NumOfFixing; ++generatorForFix.NumOfFixing;
player.SetPlayerState(PlayerStateType.Fixing);
characterManager.SetPlayerState(player, PlayerStateType.Fixing);
new Thread new Thread
( (
() => () =>
@@ -74,7 +74,7 @@ namespace Gaming
{ {
if (generatorForFix.Repair(player.FixSpeed * GameData.frameDuration, player)) if (generatorForFix.Repair(player.FixSpeed * GameData.frameDuration, player))
{ {
player.SetPlayerState();
characterManager.SetPlayerState(player);
gameMap.NumOfRepairedGenerators++; gameMap.NumOfRepairedGenerators++;
} }
}, },
@@ -96,31 +96,21 @@ namespace Gaming
if (!(player.Commandable()) || player.PlayerState == PlayerStateType.OpeningTheDoorway) if (!(player.Commandable()) || player.PlayerState == PlayerStateType.OpeningTheDoorway)
return false; return false;
Doorway? doorwayToOpen = (Doorway?)gameMap.OneForInteract(player.Position, GameObjType.Doorway); Doorway? doorwayToOpen = (Doorway?)gameMap.OneForInteract(player.Position, GameObjType.Doorway);
if (doorwayToOpen == null || doorwayToOpen.IsOpening || !doorwayToOpen.PowerSupply)
if (doorwayToOpen == null || doorwayToOpen.OpenStartTime > 0 || !doorwayToOpen.PowerSupply)
return false; return false;


player.SetPlayerState(PlayerStateType.OpeningTheDoorway);
doorwayToOpen.IsOpening = true;
characterManager.SetPlayerState(player, PlayerStateType.OpeningTheDoorway, doorwayToOpen);
int startTime = doorwayToOpen.OpenStartTime = gameMap.Timer.nowTime();
new Thread new Thread
( (
() => () =>
{ {
new FrameRateTaskExecutor<int>(
loopCondition: () => player.PlayerState == PlayerStateType.OpeningTheDoorway && gameMap.Timer.IsGaming && doorwayToOpen.OpenDegree < GameData.degreeOfOpenedDoorway,
loopToDo: () =>
{
doorwayToOpen.OpenDegree += GameData.frameDuration;
},
timeInterval: GameData.frameDuration,
finallyReturn: () => 0
)
Thread.Sleep(GameData.degreeOfOpenedDoorway - doorwayToOpen.OpenDegree);


.Start();
doorwayToOpen.IsOpening = false;
if (doorwayToOpen.OpenDegree >= GameData.degreeOfOpenedDoorway)
if (doorwayToOpen.OpenStartTime == startTime)
{ {
if (player.PlayerState == PlayerStateType.OpeningTheDoorway)
player.SetPlayerState();
doorwayToOpen.OpenDegree = GameData.degreeOfOpenedDoorway;
player.SetPlayerStateNaturally();
} }
} }


@@ -172,22 +162,22 @@ namespace Gaming
( (
() => () =>
{ {
playerTreated.SetPlayerState(PlayerStateType.Treated);
player.SetPlayerState(PlayerStateType.Treating);
characterManager.SetPlayerState(player, PlayerStateType.Treated);
characterManager.SetPlayerState(player, PlayerStateType.Treating);
new FrameRateTaskExecutor<int>( new FrameRateTaskExecutor<int>(
loopCondition: () => playerTreated.PlayerState == PlayerStateType.Treated && player.PlayerState == PlayerStateType.Treating && gameMap.Timer.IsGaming, loopCondition: () => playerTreated.PlayerState == PlayerStateType.Treated && player.PlayerState == PlayerStateType.Treating && gameMap.Timer.IsGaming,
loopToDo: () => loopToDo: () =>
{ {
if (playerTreated.AddDegreeOfTreatment(GameData.frameDuration * player.TreatSpeed, player)) if (playerTreated.AddDegreeOfTreatment(GameData.frameDuration * player.TreatSpeed, player))
playerTreated.SetPlayerState();
characterManager.SetPlayerState(playerTreated);
}, },
timeInterval: GameData.frameDuration, timeInterval: GameData.frameDuration,
finallyReturn: () => 0 finallyReturn: () => 0
) )
.Start(); .Start();


if (player.PlayerState == PlayerStateType.Treating) player.SetPlayerState();
else if (playerTreated.PlayerState == PlayerStateType.Treated) playerTreated.SetPlayerState();
if (player.PlayerState == PlayerStateType.Treating) characterManager.SetPlayerState(player);
else if (playerTreated.PlayerState == PlayerStateType.Treated) characterManager.SetPlayerState(playerTreated);
} }
) )
{ IsBackground = true }.Start(); { IsBackground = true }.Start();
@@ -202,8 +192,8 @@ namespace Gaming
} }
if ((!player.Commandable()) || playerRescued.PlayerState != PlayerStateType.Addicted || !GameData.ApproachToInteract(playerRescued.Position, player.Position)) if ((!player.Commandable()) || playerRescued.PlayerState != PlayerStateType.Addicted || !GameData.ApproachToInteract(playerRescued.Position, player.Position))
return false; return false;
player.SetPlayerState(PlayerStateType.Rescuing);
playerRescued.SetPlayerState(PlayerStateType.Rescued);
characterManager.SetPlayerState(player, PlayerStateType.Rescuing);
characterManager.SetPlayerState(playerRescued, PlayerStateType.Rescued);


new Thread new Thread
( (
@@ -225,14 +215,14 @@ namespace Gaming
{ {
if (playerRescued.TimeOfRescue >= GameData.basicTimeOfRescue) if (playerRescued.TimeOfRescue >= GameData.basicTimeOfRescue)
{ {
playerRescued.SetPlayerState();
characterManager.SetPlayerState(playerRescued);
playerRescued.HP = playerRescued.MaxHp / 2; playerRescued.HP = playerRescued.MaxHp / 2;
player.AddScore(GameData.StudentScoreRescue); player.AddScore(GameData.StudentScoreRescue);
} }
else else
playerRescued.SetPlayerState(PlayerStateType.Addicted);
characterManager.SetPlayerState(playerRescued, PlayerStateType.Addicted);
} }
if (player.PlayerState == PlayerStateType.Rescuing) player.SetPlayerState();
if (player.PlayerState == PlayerStateType.Rescuing) characterManager.SetPlayerState(player);
playerRescued.TimeOfRescue = 0; playerRescued.TimeOfRescue = 0;
} }
) )
@@ -249,7 +239,7 @@ namespace Gaming
if (chestToOpen == null || chestToOpen.OpenStartTime > 0) if (chestToOpen == null || chestToOpen.OpenStartTime > 0)
return false; return false;


player.SetPlayerState(PlayerStateType.OpeningTheChest, chestToOpen);
characterManager.SetPlayerState(player, PlayerStateType.OpeningTheChest, chestToOpen);
int startTime = gameMap.Timer.nowTime(); int startTime = gameMap.Timer.nowTime();
chestToOpen.Open(startTime, player); chestToOpen.Open(startTime, player);
new Thread new Thread
@@ -300,7 +290,7 @@ namespace Gaming
//Wall addWall = new Wall(windowForClimb.Position - 2 * windowToPlayer); //Wall addWall = new Wall(windowForClimb.Position - 2 * windowToPlayer);
// gameMap.Add(addWall); // gameMap.Add(addWall);


player.SetPlayerState(PlayerStateType.ClimbingThroughWindows);
characterManager.SetPlayerState(player, PlayerStateType.ClimbingThroughWindows);
windowForClimb.WhoIsClimbing = player; windowForClimb.WhoIsClimbing = player;
new Thread new Thread
( (
@@ -342,7 +332,7 @@ namespace Gaming
// gameMap.Remove(addWall); // gameMap.Remove(addWall);
if (player.PlayerState == PlayerStateType.ClimbingThroughWindows) if (player.PlayerState == PlayerStateType.ClimbingThroughWindows)
{ {
player.SetPlayerState();
characterManager.SetPlayerState(player);
} }
} }


@@ -382,7 +372,7 @@ namespace Gaming
} }
if (!flag) return false; if (!flag) return false;


player.SetPlayerState(PlayerStateType.LockingOrOpeningTheDoor);
characterManager.SetPlayerState(player, PlayerStateType.LockingOrOpeningTheDoor);
new Thread new Thread
( (
() => () =>
@@ -405,7 +395,7 @@ namespace Gaming
doorToLock.IsOpen = (!doorToLock.IsOpen); doorToLock.IsOpen = (!doorToLock.IsOpen);
} }
if (player.PlayerState == PlayerStateType.LockingOrOpeningTheDoor) if (player.PlayerState == PlayerStateType.LockingOrOpeningTheDoor)
player.SetPlayerState();
characterManager.SetPlayerState(player);
doorToLock.OpenOrLockDegree = 0; doorToLock.OpenOrLockDegree = 0;
} }




+ 6
- 6
logic/Gaming/AttackManager.cs View File

@@ -81,14 +81,14 @@ namespace Gaming
{ {
if (objBeingShot == null) if (objBeingShot == null)
{ {
CharacterManager.BackSwing((Character?)bullet.Parent, bullet.Backswing);
characterManager.BackSwing((Character?)bullet.Parent, bullet.Backswing);
return; return;
} }


Debugger.Output(bullet, bullet.TypeOfBullet.ToString()); Debugger.Output(bullet, bullet.TypeOfBullet.ToString());


BombObj(bullet, objBeingShot); BombObj(bullet, objBeingShot);
CharacterManager.BackSwing((Character?)bullet.Parent, bullet.RecoveryFromHit);
characterManager.BackSwing((Character?)bullet.Parent, bullet.RecoveryFromHit);
return; return;
} }


@@ -140,10 +140,10 @@ namespace Gaming


if (objBeingShot == null) if (objBeingShot == null)
{ {
CharacterManager.BackSwing((Character?)bullet.Parent, bullet.Backswing);
characterManager.BackSwing((Character?)bullet.Parent, bullet.Backswing);
} }
else else
CharacterManager.BackSwing((Character?)bullet.Parent, bullet.RecoveryFromHit);
characterManager.BackSwing((Character?)bullet.Parent, bullet.RecoveryFromHit);
} }


public bool Attack(Character? player, double angle) public bool Attack(Character? player, double angle)
@@ -174,7 +174,7 @@ namespace Gaming


if (bullet.CastTime > 0) if (bullet.CastTime > 0)
{ {
player.SetPlayerState(PlayerStateType.TryingToAttack);
characterManager.SetPlayerState(player, PlayerStateType.TryingToAttack);


new Thread new Thread
(() => (() =>
@@ -195,7 +195,7 @@ namespace Gaming
{ {
if (player.PlayerState == PlayerStateType.TryingToAttack) if (player.PlayerState == PlayerStateType.TryingToAttack)
{ {
player.SetPlayerState();
characterManager.SetPlayerState(player);
} }
else else
bullet.IsMoving = false; bullet.IsMoving = false;


+ 24
- 8
logic/Gaming/CharacterManager .cs View File

@@ -7,6 +7,7 @@ using GameEngine;
using Preparation.Interface; using Preparation.Interface;
using Timothy.FrameRateTask; using Timothy.FrameRateTask;
using System.Numerics; using System.Numerics;
using System.Timers;


namespace Gaming namespace Gaming
{ {
@@ -21,6 +22,21 @@ namespace Gaming
this.gameMap = gameMap; this.gameMap = gameMap;
} }


public void SetPlayerState(Character player, PlayerStateType value = PlayerStateType.Null, GameObj? gameObj = null)
{
switch (player.PlayerState)
{
case PlayerStateType.OpeningTheChest:
((Chest)player.WhatInteractingWith).StopOpen();
break;
case PlayerStateType.OpeningTheDoorway:
((Doorway)player.WhatInteractingWith).OpenDegree += gameMap.Timer.nowTime() - ((Doorway)player.WhatInteractingWith).OpenStartTime;
break;
default:
break;
}
player.ChangePlayerState(value, gameObj);
}


public Character? AddPlayer(XY pos, int teamID, int playerID, CharacterType characterType, Character? parent = null) public Character? AddPlayer(XY pos, int teamID, int playerID, CharacterType characterType, Character? parent = null)
{ {
@@ -216,7 +232,7 @@ namespace Gaming
return; return;
} }
} }
player.SetPlayerState(PlayerStateType.Addicted);
SetPlayerState(player, PlayerStateType.Addicted);
new Thread new Thread
(() => (() =>
{ {
@@ -246,23 +262,23 @@ namespace Gaming
{ IsBackground = true }.Start(); { IsBackground = true }.Start();
} }


public static bool BeStunned(Character player, int time)
public bool BeStunned(Character player, int time)
{ {
if (player.PlayerState == PlayerStateType.Stunned || player.NoHp() || player.CharacterType == CharacterType.Robot) return false; if (player.PlayerState == PlayerStateType.Stunned || player.NoHp() || player.CharacterType == CharacterType.Robot) return false;
new Thread new Thread
(() => (() =>
{ {
player.SetPlayerState(PlayerStateType.Stunned);
SetPlayerState(player, PlayerStateType.Stunned);
Thread.Sleep(time); Thread.Sleep(time);
if (player.PlayerState == PlayerStateType.Stunned) if (player.PlayerState == PlayerStateType.Stunned)
player.SetPlayerState();
SetPlayerState(player);
} }
) )
{ IsBackground = true }.Start(); { IsBackground = true }.Start();
return true; return true;
} }


public static bool TryBeAwed(Student character, Bullet bullet)
public bool TryBeAwed(Student character, Bullet bullet)
{ {
if (character.CanBeAwed()) if (character.CanBeAwed())
{ {
@@ -337,11 +353,11 @@ namespace Gaming
else TryBeAwed(student, bullet); else TryBeAwed(student, bullet);
} }


public static bool BackSwing(Character? player, int time)
public bool BackSwing(Character? player, int time)
{ {
if (player == null || time <= 0) return false; if (player == null || time <= 0) return false;
if (player.PlayerState == PlayerStateType.Swinging || (!player.Commandable() && player.PlayerState != PlayerStateType.TryingToAttack)) return false; if (player.PlayerState == PlayerStateType.Swinging || (!player.Commandable() && player.PlayerState != PlayerStateType.TryingToAttack)) return false;
player.SetPlayerState(PlayerStateType.Swinging);
SetPlayerState(player, PlayerStateType.Swinging);


new Thread new Thread
(() => (() =>
@@ -350,7 +366,7 @@ namespace Gaming


if (player.PlayerState == PlayerStateType.Swinging) if (player.PlayerState == PlayerStateType.Swinging)
{ {
player.SetPlayerState();
SetPlayerState(player);
} }
} }
) )


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

@@ -233,7 +233,7 @@ namespace Gaming
Character? player = gameMap.FindPlayerToAction(playerID); Character? player = gameMap.FindPlayerToAction(playerID);
if (player != null) if (player != null)
{ {
PropManager.UseProp(player, propType);
propManager.UseProp(player, propType);
} }
} }
public void ThrowProp(long playerID, PropType propType = PropType.Null) public void ThrowProp(long playerID, PropType propType = PropType.Null)
@@ -375,7 +375,7 @@ namespace Gaming
characterManager = new CharacterManager(gameMap); characterManager = new CharacterManager(gameMap);
attackManager = new AttackManager(gameMap, characterManager); attackManager = new AttackManager(gameMap, characterManager);
actionManager = new ActionManager(gameMap, characterManager); actionManager = new ActionManager(gameMap, characterManager);
propManager = new PropManager(gameMap);
propManager = new PropManager(gameMap, characterManager);
skillManager = new SkillManager(gameMap, actionManager, attackManager, propManager, characterManager); skillManager = new SkillManager(gameMap, actionManager, attackManager, propManager, characterManager);
} }
} }


+ 5
- 4
logic/Gaming/PropManager.cs View File

@@ -16,10 +16,10 @@ namespace Gaming
private class PropManager private class PropManager
{ {
private readonly Map gameMap; private readonly Map gameMap;
private readonly CharacterManager characterManager;
private readonly List<XY> availableCellForGenerateProp; private readonly List<XY> availableCellForGenerateProp;


public static void UseProp(Character player, PropType propType)
public void UseProp(Character player, PropType propType)
{ {
if (player.IsResetting || player.CharacterType == CharacterType.Robot) if (player.IsResetting || player.CharacterType == CharacterType.Robot)
return; return;
@@ -57,7 +57,7 @@ namespace Gaming
if (player.PlayerState == PlayerStateType.Stunned) if (player.PlayerState == PlayerStateType.Stunned)
{ {
player.AddScore(GameData.ScorePropRecoverFromDizziness); player.AddScore(GameData.ScorePropRecoverFromDizziness);
player.SetPlayerState();
player.SetPlayerStateNaturally();
} }
break; break;
default: default:
@@ -210,8 +210,9 @@ namespace Gaming
{ IsBackground = true }.Start(); { IsBackground = true }.Start();
*/ */
} }
public PropManager(Map gameMap) // 道具不能扔过墙
public PropManager(Map gameMap, CharacterManager characterManager) // 道具不能扔过墙
{ {
this.characterManager = characterManager;
this.gameMap = gameMap; this.gameMap = gameMap;
/* this.moveEngine = new MoveEngine( /* this.moveEngine = new MoveEngine(
gameMap: gameMap, gameMap: gameMap,


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

@@ -145,7 +145,7 @@ namespace Gaming
{ {
if (!character.IsGhost() && XY.Distance(character.Position, player.Position) <= player.ViewRange) if (!character.IsGhost() && XY.Distance(character.Position, player.Position) <= player.ViewRange)
{ {
if (CharacterManager.BeStunned(character, GameData.TimeOfStudentFaintingWhenHowl))
if (characterManager.BeStunned(character, GameData.TimeOfStudentFaintingWhenHowl))
player.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.TimeOfStudentFaintingWhenHowl)); player.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.TimeOfStudentFaintingWhenHowl));
break; break;
} }
@@ -155,7 +155,7 @@ namespace Gaming
{ {
gameMap.GameObjLockDict[GameObjType.Character].ExitReadLock(); gameMap.GameObjLockDict[GameObjType.Character].ExitReadLock();
} }
CharacterManager.BackSwing(player, GameData.TimeOfGhostSwingingAfterHowl);
characterManager.BackSwing(player, GameData.TimeOfGhostSwingingAfterHowl);
Debugger.Output(player, "howled!"); Debugger.Output(player, "howled!");
}, },
() => () =>
@@ -177,7 +177,7 @@ namespace Gaming
|| character.PlayerState == PlayerStateType.UsingSkill) || character.PlayerState == PlayerStateType.UsingSkill)
&& gameMap.CanSee(player, character)) && gameMap.CanSee(player, character))
{ {
if (CharacterManager.BeStunned(character, GameData.TimeOfGhostFaintingWhenPunish))
if (characterManager.BeStunned(character, GameData.TimeOfGhostFaintingWhenPunish))
player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenPunish)); player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenPunish));
break; break;
} }
@@ -205,7 +205,7 @@ namespace Gaming
{ {
if ((character.PlayerState == PlayerStateType.Addicted) && gameMap.CanSee(player, character)) if ((character.PlayerState == PlayerStateType.Addicted) && gameMap.CanSee(player, character))
{ {
character.SetPlayerState();
characterManager.SetPlayerState(character);
character.HP = GameData.RemainHpWhenAddLife; character.HP = GameData.RemainHpWhenAddLife;
((Student)character).TimeOfRescue = 0; ((Student)character).TimeOfRescue = 0;
player.AddScore(GameData.StudentScoreRescue); player.AddScore(GameData.StudentScoreRescue);


+ 4
- 3
logic/Server/CopyInfo.cs View File

@@ -32,7 +32,7 @@ namespace Server
case Preparation.Utility.GameObjType.Chest: case Preparation.Utility.GameObjType.Chest:
return Chest((Chest)gameObj, time); return Chest((Chest)gameObj, time);
case Preparation.Utility.GameObjType.Doorway: case Preparation.Utility.GameObjType.Doorway:
return Gate((Doorway)gameObj);
return Gate((Doorway)gameObj, time);
case Preparation.Utility.GameObjType.EmergencyExit: case Preparation.Utility.GameObjType.EmergencyExit:
if (((EmergencyExit)gameObj).CanOpen) if (((EmergencyExit)gameObj).CanOpen)
return HiddenGate((EmergencyExit)gameObj); return HiddenGate((EmergencyExit)gameObj);
@@ -195,13 +195,14 @@ namespace Server
msg.ClassroomMessage.Progress = generator.DegreeOfRepair; msg.ClassroomMessage.Progress = generator.DegreeOfRepair;
return msg; return msg;
} }
private static MessageOfObj Gate(Doorway doorway)
private static MessageOfObj Gate(Doorway doorway, int time)
{ {
MessageOfObj msg = new MessageOfObj(); MessageOfObj msg = new MessageOfObj();
msg.GateMessage = new(); msg.GateMessage = new();
msg.GateMessage.X = doorway.Position.x; msg.GateMessage.X = doorway.Position.x;
msg.GateMessage.Y = doorway.Position.y; msg.GateMessage.Y = doorway.Position.y;
msg.GateMessage.Progress = doorway.OpenDegree;
int progress = ((doorway.OpenStartTime > 0) ? (time - doorway.OpenStartTime) : 0) + doorway.OpenDegree;
msg.GateMessage.Progress = (progress > GameData.degreeOfOpenedDoorway) ? GameData.degreeOfOpenedDoorway : progress;
return msg; return msg;
} }
private static MessageOfObj HiddenGate(EmergencyExit Exit) private static MessageOfObj HiddenGate(EmergencyExit Exit)


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

@@ -252,7 +252,7 @@
- 特性 - 特性
- 冥想 - 冥想
- 当玩家处于可接受指令状态且不在修机时,会积累学习进度,速度为0.3%/ms - 当玩家处于可接受指令状态且不在修机时,会积累学习进度,速度为0.3%/ms
- 受到攻击(并非伤害)或眩晕或翻窗(或攻击他人)学习进度清零
- 受到攻击(并非伤害)或学习或进入不可接受治疗状态(包括翻窗)学习进度清零
- 主动技能5 - 主动技能5
- 写答案 - 写答案
- CD:30s - CD:30s
@@ -401,6 +401,7 @@ public:


### 人物 ### 人物
- 被唤醒或被勉励不属于交互状态,翻窗属于交互状态 - 被唤醒或被勉励不属于交互状态,翻窗属于交互状态
- EndAllAction()及Move指令调用数总和一帧内不超过10次


### 初始状态 ### 初始状态
- 玩家出生点固定且一定为空地 - 玩家出生点固定且一定为空地


Loading…
Cancel
Save