Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions docs/游戏机制与平衡性调整更新草案.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ v1.6
- 新造的Robot的PlayerId的n总是尽量小
1. UseRobot
- CD:2s,持续时间:0s
- 输入额外参数PlayerID,切换到要使用的角色
- 输入额外参数PlayerID,切换到要使用的角色。
- 切换到其他角色时,自己进入UsingSkill状态。

修改后:

Expand All @@ -107,7 +108,7 @@ v1.6
- 被动技能Lucky!(新增):开局获得随机的一个道具(不会是钥匙)
- 主动技能SparksNSplash(新增):
- CD:45s, 持续时间:10s
- 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每50ms向该角色直线移动
- 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败
- 主动技能 蹦蹦炸弹 JumpyBomb
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上0°,45°,90°,135°,180°,225°,270°,315° 发出8个小炸弹
- Idol
Expand Down
8 changes: 7 additions & 1 deletion docs/版本更新说明.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,10 @@

# 5月15日更新
- feat:Robot可用
- hotfix: 修复了移动相关的bug
- hotfix: 修复了移动相关的bug

# 最新更新
- feat:TechOtaku可用
- feat:Klee、Idol已调整
- fix:修复了InSpire会给Tricker加速的问题
- fix:修复了开锁门的bug
105 changes: 53 additions & 52 deletions logic/Client/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -816,63 +816,63 @@ private int FindIndexOfChest(MessageOfChest msg)

private void Refresh(object? sender, EventArgs e) //log未更新
{
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行
try
{
// Bonus();
if (WindowState == WindowState.Maximized)
MaxButton.Content = "❐";
else
MaxButton.Content = "🗖";
foreach (var obj in listOfHuman)
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行
{
if (!isDataFixed[obj.PlayerId] && obj.PlayerId < GameData.numOfStudent && obj.StudentType != StudentType.Robot)
// Bonus();
if (WindowState == WindowState.Maximized)
MaxButton.Content = "❐";
else
MaxButton.Content = "🗖";
foreach (var obj in listOfHuman)
{
IStudentType occupation = (IStudentType)OccupationFactory.FindIOccupation(Transformation.ToStudentType(obj.StudentType));
totalLife[obj.PlayerId] = occupation.MaxHp;
totalDeath[obj.PlayerId] = occupation.MaxGamingAddiction;
int i = 0;
foreach (var skill in occupation.ListOfIActiveSkill)
if (obj.PlayerId < GameData.numOfStudent && !isDataFixed[obj.PlayerId])
{
var iActiveSkill = SkillFactory.FindActiveSkill(skill);
coolTime[i, obj.PlayerId] = iActiveSkill.SkillCD;
++i;
IStudentType occupation = (IStudentType)OccupationFactory.FindIOccupation(Transformation.ToStudentType(obj.StudentType));
totalLife[obj.PlayerId] = occupation.MaxHp;
totalDeath[obj.PlayerId] = occupation.MaxGamingAddiction;
int i = 0;
foreach (var skill in occupation.ListOfIActiveSkill)
{
var iActiveSkill = SkillFactory.FindActiveSkill(skill);
coolTime[i, obj.PlayerId] = iActiveSkill.SkillCD;
++i;
}
isDataFixed[obj.PlayerId] = true;
}
isDataFixed[obj.PlayerId] = true;
}
}
foreach (var obj in listOfButcher)
{
if (!isDataFixed[obj.PlayerId])
foreach (var obj in listOfButcher)
{
IGhostType occupation1 = (IGhostType)OccupationFactory.FindIOccupation(Transformation.ToTrickerType(obj.TrickerType));
int j = 0;
foreach (var skill in occupation1.ListOfIActiveSkill)
if (!isDataFixed[obj.PlayerId])
{
var iActiveSkill = SkillFactory.FindActiveSkill(skill);
coolTime[j, GameData.numOfStudent] = iActiveSkill.SkillCD;
++j;
IGhostType occupation1 = (IGhostType)OccupationFactory.FindIOccupation(Transformation.ToTrickerType(obj.TrickerType));
int j = 0;
foreach (var skill in occupation1.ListOfIActiveSkill)
{
var iActiveSkill = SkillFactory.FindActiveSkill(skill);
coolTime[j, GameData.numOfStudent] = iActiveSkill.SkillCD;
++j;
}
isDataFixed[obj.PlayerId] = true;
}
isDataFixed[obj.PlayerId] = true;
}
}

for (int i = 0; i < GameData.numOfStudent; i++)
{
StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime);
}
for (int i = 0; i < GameData.numOfStudent; i++)
{
StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime);
}

StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime);
StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime);

for (int i = 0; i < GameData.numOfStudent; i++)
{
StatusBarsOfSurvivor[i].SetFontSize(12 * unitFontsize);
}
for (int i = 0; i < GameData.numOfStudent; i++)
{
StatusBarsOfSurvivor[i].SetFontSize(12 * unitFontsize);
}

StatusBarsOfHunter.SetFontSize(12 * unitFontsize);
StatusBarsOfCircumstance.SetFontSize(12 * unitFontsize);
if (!isClientStocked)
{
try
StatusBarsOfHunter.SetFontSize(12 * unitFontsize);
StatusBarsOfCircumstance.SetFontSize(12 * unitFontsize);
if (!isClientStocked)
{
UpperLayerOfMap.Children.Clear();
foreach (var data in listOfAll)
Expand All @@ -885,7 +885,7 @@ private void Refresh(object? sender, EventArgs e) //log未更新
}
foreach (var data in listOfHuman)
{
if (data.StudentType != StudentType.Robot)
if (data.PlayerId < GameData.numOfStudent)
StatusBarsOfSurvivor[data.PlayerId].SetValue(data, data.PlayerId);
if (CanSee(data))
{
Expand Down Expand Up @@ -1136,15 +1136,15 @@ private void Refresh(object? sender, EventArgs e) //log未更新
}
}
}
catch (Exception exc)
{
ErrorDisplayer error = new("Error: " + exc.ToString());
error.Show();
isClientStocked = true;
PorC.Content = "▶";
}
counter++;
}
counter++;
}
catch (Exception exc)
{
ErrorDisplayer error = new("Error: " + exc.ToString());
error.Show();
isClientStocked = true;
PorC.Content = "▶";
}
}

Expand Down Expand Up @@ -1309,6 +1309,7 @@ private void KeyBoardControl(object sender, KeyEventArgs e)
{
PlayerId = playerID,
SkillId = 0,
SkillParam = 0,
};
client.UseSkill(msgB);
break;
Expand Down
13 changes: 13 additions & 0 deletions logic/GameClass/GameObj/Character/Character.BuffManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,19 @@ public bool TryUseSpear()
return false;
}

public bool TryDeleteInvisible()
{
if (HasInvisible)
{
lock (buffListLock[(int)BuffType.Invisible])
{
buffList[(int)BuffType.Invisible].RemoveFirst();
}
return true;
}
return false;
}

public void AddClairaudience(int shieldTime) => AddBuff(new BuffValue(), shieldTime, BuffType.Clairaudience, () =>
{ });
public bool HasClairaudience
Expand Down
63 changes: 45 additions & 18 deletions logic/GameClass/GameObj/Character/Character.cs
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ public PlayerStateType PlayerState
{
lock (actionLock)
{
if (playerState == PlayerStateType.Null && IsMoving) return PlayerStateType.Moving;
if (playerState == PlayerStateType.Moving && IsMoving == 1) return PlayerStateType.Moving;
return playerState;
}
}
Expand Down Expand Up @@ -423,9 +423,7 @@ private long ChangePlayerState(PlayerStateType value = PlayerStateType.Null, Gam
{
//只能被SetPlayerState引用
whatInteractingWith = gameObj;
if (value != PlayerStateType.Moving)
IsMoving = false;
playerState = (value == PlayerStateType.Moving) ? PlayerStateType.Null : value;
playerState = value;
//Debugger.Output(this,playerState.ToString()+" "+IsMoving.ToString());
return ++stateNum;
}
Expand All @@ -434,20 +432,19 @@ private long ChangePlayerStateInOneThread(PlayerStateType value = PlayerStateTyp
{
//只能被SetPlayerState引用
whatInteractingWith = gameObj;
if (value != PlayerStateType.Moving)
IsMoving = false;
playerState = (value == PlayerStateType.Moving) ? PlayerStateType.Null : value;
playerState = value;
//Debugger.Output(this,playerState.ToString()+" "+IsMoving.ToString());
return stateNum;
}


public long SetPlayerState(PlayerStateType value = PlayerStateType.Null, GameObj? gameObj = null)
public long SetPlayerState(PlayerStateType value = PlayerStateType.Null, IGameObj? obj = null)
{
GameObj? gameObj = (GameObj?)obj;
lock (actionLock)
{
PlayerStateType nowPlayerState = PlayerState;
if (nowPlayerState == value) return -1;
if (nowPlayerState == value && value != PlayerStateType.UsingSkill) return -1;
switch (nowPlayerState)
{
case PlayerStateType.Escaped:
Expand All @@ -468,20 +465,21 @@ public long SetPlayerState(PlayerStateType value = PlayerStateType.Null, GameObj
else return -1;

case PlayerStateType.TryingToAttack:
if (value != PlayerStateType.Moving && value != PlayerStateType.ClimbingThroughWindows
&& value != PlayerStateType.LockingTheDoor && value != PlayerStateType.OpeningTheDoor)
if (value == PlayerStateType.Addicted || value == PlayerStateType.Swinging
|| value == PlayerStateType.Deceased || value == PlayerStateType.Stunned
|| value == PlayerStateType.Charmed || value == PlayerStateType.Null)
return ChangePlayerState(value, gameObj);
else return -1;
case PlayerStateType.Stunned:
case PlayerStateType.Charmed:
if (value != PlayerStateType.Moving && value != PlayerStateType.ClimbingThroughWindows
&& value != PlayerStateType.LockingTheDoor && value != PlayerStateType.OpeningTheDoor
&& value != PlayerStateType.Swinging)
if (value == PlayerStateType.Addicted || value == PlayerStateType.Deceased
|| value == PlayerStateType.Null)
return ChangePlayerState(value, gameObj);
else return -1;
case PlayerStateType.Swinging:
if (value != PlayerStateType.Moving && value != PlayerStateType.ClimbingThroughWindows
&& value != PlayerStateType.LockingTheDoor && value != PlayerStateType.OpeningTheDoor)
if (value == PlayerStateType.Addicted
|| value == PlayerStateType.Deceased || value == PlayerStateType.Stunned
|| value == PlayerStateType.Charmed || value == PlayerStateType.Null)
{
try
{
Expand All @@ -494,7 +492,9 @@ public long SetPlayerState(PlayerStateType value = PlayerStateType.Null, GameObj
}
else return -1;
case PlayerStateType.ClimbingThroughWindows:
if (value != PlayerStateType.Moving && value != PlayerStateType.LockingTheDoor && value != PlayerStateType.OpeningTheDoor)
if (value == PlayerStateType.Addicted
|| value == PlayerStateType.Deceased || value == PlayerStateType.Stunned
|| value == PlayerStateType.Charmed || value == PlayerStateType.Null)
{
Window window = (Window)WhatInteractingWith!;
try
Expand Down Expand Up @@ -537,6 +537,28 @@ public long SetPlayerState(PlayerStateType value = PlayerStateType.Null, GameObj
{
ThreadNum.Release();
}
case PlayerStateType.UsingSkill:
if (CharacterType == CharacterType.TechOtaku)
{
if (typeof(CraftingBench).IsInstanceOfType(whatInteractingWith))
{
try
{
((CraftingBench)whatInteractingWith!).StopSkill();
return ChangePlayerState(value, gameObj);
}
finally
{
ThreadNum.Release();
}
}
else
{
if (value != PlayerStateType.UsingSkill)
((UseRobot)FindActiveSkill(ActiveSkillType.UseRobot)).NowPlayerID = (int)playerID;
}
}
return ChangePlayerState(value, gameObj);
default:
return ChangePlayerState(value, gameObj);
}
Expand All @@ -548,7 +570,6 @@ public long SetPlayerStateNaturally()
lock (actionLock)
{
whatInteractingWith = null;
IsMoving = false;
playerState = PlayerStateType.Null;
return ++stateNum;
}
Expand Down Expand Up @@ -777,6 +798,7 @@ private bool GetBuffStatus(BuffType type)
return false;
}
}

public void TryActivatingLIFE()
{
if (buffManager.TryActivatingLIFE())
Expand All @@ -801,6 +823,11 @@ public bool TryUseSpear()
return buffManager.TryUseSpear();
}

public bool TryDeleteInvisible()
{
return buffManager.TryDeleteInvisible();
}

public bool TryUseShield()
{
if (buffManager.TryUseShield())
Expand Down
29 changes: 29 additions & 0 deletions logic/GameClass/GameObj/GameObj.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,35 @@ public abstract class GameObj : IGameObj

public abstract ShapeType Shape { get; }

protected bool isRemoved = false;
public virtual bool IsRemoved
{
get
{
gameObjReaderWriterLock.EnterReadLock();
try
{
return isRemoved;
}
finally
{
gameObjReaderWriterLock.ExitReadLock();
}
}
}
public virtual void TryToRemove()
{
gameObjReaderWriterLock.EnterWriteLock();
try
{
isRemoved = true;
}
finally
{
gameObjReaderWriterLock.ExitWriteLock();
}
}

public int Radius { get; }

public virtual bool IgnoreCollideExecutor(IGameObj targetObj) => false;
Expand Down
4 changes: 2 additions & 2 deletions logic/GameClass/GameObj/Map/Door.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public void StopOpen()
{
if (whoLockOrOpen != null)
{
if (Environment.TickCount64 - openStartTime >= GameData.degreeOfLockingOrOpeningTheDoor)
if ((Environment.TickCount64 - openStartTime) >= GameData.degreeOfLockingOrOpeningTheDoor / whoLockOrOpen.SpeedOfOpeningOrLocking)
isOpen = true;
whoLockOrOpen = null;
}
Expand Down Expand Up @@ -128,7 +128,7 @@ public void StopLock()
lock (gameObjLock)
{
if (lockDegree >= GameData.degreeOfLockingOrOpeningTheDoor)
isOpen = true;
isOpen = false;
whoLockOrOpen = null;
}
}
Expand Down
Loading