diff --git a/dependency/proto/MessageType.proto b/dependency/proto/MessageType.proto index 9277808..10d6d61 100755 --- a/dependency/proto/MessageType.proto +++ b/dependency/proto/MessageType.proto @@ -43,7 +43,7 @@ enum PropType // 地图中的可拾取道具类型 { NULL_PROP_TYPE = 0; ADD_SPEED = 1; - ADD_LIFE_OR_AP = 2; + ADD_LIFE_OR_AP = 2;//ADD_LIFE_OR_Clairaudience ADD_HP_OR_AP = 3; SHIELD_OR_SPEAR = 4; KEY3 = 5; @@ -54,9 +54,9 @@ enum PropType // 地图中的可拾取道具类型 enum StudentBuffType // 人类可用的增益效果类型 { NULL_SBUFF_TYPE = 0; - SBUFFTYPE1 = 1; - SBUFFTYPE2 = 2; - SBUFFTYPE3 = 3; + SBUFFTYPE1 = 1;//AddSpeed + SBUFFTYPE2 = 2;//AddLIFE + SBUFFTYPE3 = 3;//Shield SBUFFTYPE4 = 4; } @@ -86,10 +86,11 @@ enum PlayerState enum TrickerBuffType // 屠夫可用的增益效果类型 { NULL_TBUFF_TYPE = 0; - TBUFFTYPE1 = 1; - TBUFFTYPE2 = 2; - TBUFFTYPE3 = 3; - TBUFFTYPE4 = 4; + TBUFFTYPE1 = 1;//AddSpeed + TBUFFTYPE2 = 2;//Spear + TBUFFTYPE3 = 3;//AddAp + TBUFFTYPE4 = 4;//Clairaudience + INVISIBLE = 5; } // 特别说明:由于Student阵营和Tricker阵营有显著的隔离,且暂定职业、主动技能和被动效果相互绑定,故不按照THUAI5的方式区分ActiveSkillType和CharacterType,而是选择了按照阵营来给不同阵营赋予不同的职业(及技能)。 @@ -114,7 +115,7 @@ enum TrickerType { NULL_TRICKER_TYPE = 0; ASSASSIN = 1; - TRICKERTYPE2 = 2; + TRICKERTYPE2 = 2;//KLEE TRICKERTYPE3 = 3; TRICKERTYPE4 = 4; } diff --git a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs index 2f803f8..29da347 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs @@ -23,9 +23,9 @@ namespace GameClass.GameObj } } public override int Speed => GameData.basicBulletMoveSpeed; - public override bool IsToBomb => false; + public override bool IsRemoteAttack => false; - public override int CastTime => GameData.basicCastTime; + public override int CastTime => (int)BulletAttackRange / Speed; public override int Backswing => GameData.basicBackswing; public override int RecoveryFromHit => GameData.basicRecoveryFromHit; public const int cd = GameData.basicBackswing; @@ -68,11 +68,11 @@ namespace GameClass.GameObj } } public override int Speed => GameData.basicBulletMoveSpeed * 2; - public override bool IsToBomb => false; + public override bool IsRemoteAttack => true; public override int CastTime => GameData.basicCastTime; - public override int Backswing => GameData.basicBackswing * 2 / 5; - public override int RecoveryFromHit => GameData.basicBackswing * 3 / 4; + public override int Backswing => 0; + public override int RecoveryFromHit => 0; public const int cd = GameData.basicBackswing * 2 / 5 + 100; public override int CD => cd; @@ -94,4 +94,95 @@ namespace GameClass.GameObj public override BulletType TypeOfBullet => BulletType.FlyingKnife; } + + internal sealed class BombBomb : Bullet + { + public BombBomb(Character player, PlaceType placeType, XY pos, int radius = GameData.bulletRadius) : + base(player, radius, placeType, pos) + { + } + public override double BulletBombRange => GameData.basicBulletBombRange; + public override double BulletAttackRange => GameData.basicAttackShortRange; + public int ap = (int)(GameData.basicApOfGhost * 6.0 / 5); + public override int AP + { + get => ap; + set + { + lock (gameObjLock) + ap = value; + } + } + public override int Speed => (int)(GameData.basicBulletMoveSpeed * 0.8); + public override bool IsRemoteAttack => false; + + public override int CastTime => (int)BulletAttackRange / Speed; + public override int Backswing => GameData.basicBackswing; + public override int RecoveryFromHit => GameData.basicRecoveryFromHit; + public const int cd = GameData.basicCD; + public override int CD => cd; + + public override bool CanAttack(GameObj target) + { + return XY.Distance(this.Position, target.Position) <= BulletBombRange; + } + public override bool CanBeBombed(GameObjType gameObjType) + { + switch (gameObjType) + { + case GameObjType.Character: + case GameObjType.Generator: + return true; + default: + return false; + } + } + public override BulletType TypeOfBullet => BulletType.BombBomb; + + } + internal sealed class JumpyDumpty : Bullet + { + public JumpyDumpty(Character player, PlaceType placeType, XY pos, int radius = GameData.bulletRadius) : + base(player, radius, placeType, pos) + { + } + public override double BulletBombRange => GameData.basicBulletBombRange / 2; + public override double BulletAttackRange => GameData.basicAttackShortRange * 2; + public int ap = (int)(GameData.basicApOfGhost * 0.6); + public override int AP + { + get => ap; + set + { + lock (gameObjLock) + ap = value; + } + } + public override int Speed => (int)(GameData.basicBulletMoveSpeed * 1.2); + public override bool IsRemoteAttack => false; + + public override int CastTime => 0; + public override int Backswing => 0; + public override int RecoveryFromHit => 0; + public const int cd = 0; + public override int CD => cd; + + public override bool CanAttack(GameObj target) + { + return XY.Distance(this.Position, target.Position) <= BulletBombRange; + } + public override bool CanBeBombed(GameObjType gameObjType) + { + switch (gameObjType) + { + case GameObjType.Character: + case GameObjType.Generator: + return true; + default: + return false; + } + } + public override BulletType TypeOfBullet => BulletType.JumpyDumpty; + + } } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullet/Bullet.Student.cs b/logic/GameClass/GameObj/Bullet/Bullet.Student.cs index 26510a3..5f42b49 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.Student.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.Student.cs @@ -12,7 +12,7 @@ namespace GameClass.GameObj public override double BulletAttackRange => 0; public override int AP => 7220; public override int Speed => 0; - public override bool IsToBomb => false; + public override bool IsRemoteAttack => false; public override int CastTime => 0; public override int Backswing => 0; public override int RecoveryFromHit => 0; diff --git a/logic/GameClass/GameObj/Bullet/Bullet.cs b/logic/GameClass/GameObj/Bullet/Bullet.cs index a08c6b0..c4e1c70 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.cs @@ -13,7 +13,7 @@ namespace GameClass.GameObj public abstract double BulletAttackRange { get; } public abstract int AP { get; set; } public abstract int Speed { get; } - public abstract bool IsToBomb { get; } + public abstract bool IsRemoteAttack { get; } public abstract int CastTime { get; } public abstract int Backswing { get; } public abstract int RecoveryFromHit { get; } @@ -63,6 +63,10 @@ namespace GameClass.GameObj return new FlyingKnife(character, place, pos); case BulletType.CommonAttackOfGhost: return new CommonAttackOfGhost(character, place, pos); + case BulletType.JumpyDumpty: + return new JumpyDumpty(character, place, pos); + case BulletType.BombBomb: + return new BombBomb(character, place, pos); default: return null; } @@ -71,10 +75,6 @@ namespace GameClass.GameObj { switch (bulletType) { - case BulletType.AtomBomb: - case BulletType.LineBullet: - case BulletType.FastBullet: - case BulletType.OrdinaryBullet: case BulletType.FlyingKnife: default: return GameData.bulletRadius; @@ -88,10 +88,10 @@ namespace GameClass.GameObj return CommonAttackOfGhost.cd; case BulletType.FlyingKnife: return FlyingKnife.cd; - case BulletType.AtomBomb: - case BulletType.LineBullet: - case BulletType.FastBullet: - case BulletType.OrdinaryBullet: + case BulletType.BombBomb: + return BombBomb.cd; + case BulletType.JumpyDumpty: + return JumpyDumpty.cd; default: return GameData.basicCD; } diff --git a/logic/GameClass/GameObj/Character/Character.Skill.cs b/logic/GameClass/GameObj/Character/Character.Skill.cs index b606373..bdf23a8 100644 --- a/logic/GameClass/GameObj/Character/Character.Skill.cs +++ b/logic/GameClass/GameObj/Character/Character.Skill.cs @@ -66,6 +66,12 @@ namespace GameClass.GameObj case CharacterType.Assassin: this.occupation = new Assassin(); break; + case CharacterType.Teacher: + this.occupation = new Teacher(); + break; + case CharacterType.Klee: + this.occupation = new Klee(); + break; case CharacterType.Athlete: default: this.occupation = new Athlete(); @@ -82,7 +88,7 @@ namespace GameClass.GameObj this.characterType = characterType; this.SpeedOfOpeningOrLocking = Occupation.TimeOfOpeningOrLocking; this.SpeedOfClimbingThroughWindows = Occupation.SpeedOfClimbingThroughWindows; - this.SpeedOfOpenChest = Occupation.TimeOfOpenChest; + this.SpeedOfOpenChest = Occupation.SpeedOfOpenChest; foreach (var activeSkill in this.Occupation.ListOfIActiveSkill) { diff --git a/logic/GameClass/GameObj/Character/Character.cs b/logic/GameClass/GameObj/Character/Character.cs index 81d2502..d53f408 100644 --- a/logic/GameClass/GameObj/Character/Character.cs +++ b/logic/GameClass/GameObj/Character/Character.cs @@ -47,7 +47,8 @@ namespace GameClass.GameObj lock (gameObjLock) { bulletOfPlayer = value; - CD = BulletFactory.BulletCD(value); + OrgCD = (BulletFactory.BulletCD(value)); + CD = 0; } } } diff --git a/logic/GameClass/GameObj/Character/Skill.cs b/logic/GameClass/GameObj/Character/Skill.cs index a21d67c..b00a99f 100644 --- a/logic/GameClass/GameObj/Character/Skill.cs +++ b/logic/GameClass/GameObj/Character/Skill.cs @@ -62,10 +62,10 @@ namespace GameClass.GameObj } } - public class NuclearWeapon : IActiveSkill // 核武器 + public class JumpyBomb : IActiveSkill { - public int SkillCD => GameData.commonSkillCD * 7 / 3; - public int DurationTime => GameData.commonSkillTime / 10; + public int SkillCD => GameData.commonSkillCD / 30 * 5; + public int DurationTime => GameData.commonSkillTime / 2; private readonly object commonSkillLock = new object(); public object ActiveSkillLock => commonSkillLock; @@ -132,6 +132,8 @@ namespace GameClass.GameObj return new CanBeginToCharge(); case ActiveSkillType.Punish: return new Punish(); + case ActiveSkillType.JumpyBomb: + return new JumpyBomb(); default: return new NullSkill(); } @@ -149,6 +151,8 @@ namespace GameClass.GameObj return ActiveSkillType.CanBeginToCharge; case Punish: return ActiveSkillType.Punish; + case JumpyBomb: + return ActiveSkillType.JumpyBomb; default: return ActiveSkillType.Null; } diff --git a/logic/GameClass/GameObj/Prop.cs b/logic/GameClass/GameObj/Prop.cs index ac6dd9b..621a453 100644 --- a/logic/GameClass/GameObj/Prop.cs +++ b/logic/GameClass/GameObj/Prop.cs @@ -52,13 +52,13 @@ namespace GameClass.GameObj /// /// 复活甲 /// - public sealed class AddLifeOrAp : Prop + public sealed class AddLifeOrClairaudience : Prop { - public AddLifeOrAp(XY initPos, PlaceType placeType) : + public AddLifeOrClairaudience(XY initPos, PlaceType placeType) : base(initPos, placeType) { } - public override PropType GetPropType() => PropType.AddLifeOrAp; + public override PropType GetPropType() => PropType.AddLifeOrClairaudience; } public sealed class AddHpOrAp : Prop { @@ -141,8 +141,8 @@ namespace GameClass.GameObj { case PropType.AddSpeed: return new AddSpeed(pos, place); - case PropType.AddLifeOrAp: - return new AddLifeOrAp(pos, place); + case PropType.AddLifeOrClairaudience: + return new AddLifeOrClairaudience(pos, place); case PropType.ShieldOrSpear: return new ShieldOrSpear(pos, place); case PropType.AddHpOrAp: @@ -158,4 +158,4 @@ namespace GameClass.GameObj } } } -} +} \ No newline at end of file diff --git a/logic/Gaming/ActionManager.cs b/logic/Gaming/ActionManager.cs index d929746..7db1856 100644 --- a/logic/Gaming/ActionManager.cs +++ b/logic/Gaming/ActionManager.cs @@ -17,8 +17,16 @@ namespace Gaming { // 人物移动 - private void SkillWhenMove(Character player, IGameObj collisionObj) + private static void SkillWhenColliding(Character player, IGameObj collisionObj) { + if (collisionObj.Type == GameObjType.Bullet) + { + if (((Bullet)collisionObj).TypeOfBullet == BulletType.JumpyDumpty) + { + if (AttackManager.BeStunned((Character)collisionObj, ((Bullet)collisionObj).AP / GameData.timeFactorOfGhostFainting)) + player.AddScore(GameData.StudentScoreTrickerBeStunned(((Bullet)collisionObj).AP / GameData.timeFactorOfGhostFainting)); + } + } if (player.UseIActiveSkill(ActiveSkillType.CanBeginToCharge).IsBeingUsed && collisionObj.Type == GameObjType.Character && ((Character)collisionObj).IsGhost()) { if (AttackManager.BeStunned((Character)collisionObj, GameData.TimeOfGhostFaintingWhenCharge)) @@ -495,7 +503,7 @@ namespace Gaming gameMap: gameMap, OnCollision: (obj, collisionObj, moveVec) => { - SkillWhenMove((Character)obj, collisionObj); + SkillWhenColliding((Character)obj, collisionObj); //if (collisionObj is Mine) //{ // ActivateMine((Character)obj, (Mine)collisionObj); diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index 302a726..63f8bde 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -33,7 +33,7 @@ namespace Gaming Debugger.Output(obj, " end move at " + obj.Position.ToString() + " At time: " + Environment.TickCount64); #endif - if (obj.CanMove) + if (obj.CanMove && ((Bullet)obj).TypeOfBullet != BulletType.JumpyDumpty) BulletBomb((Bullet)obj, null); } ); @@ -124,10 +124,6 @@ namespace Gaming gameMap.GameObjLockDict[GameObjType.EmergencyExit].ExitReadLock(); } } - - // player.Reset(); - // ((Character?)bullet.Parent)?.AddScore(GameData.addScoreWhenKillOneLevelPlayer); // 给击杀者加分 - } private void BombObj(Bullet bullet, GameObj objBeingShot) @@ -174,10 +170,10 @@ namespace Gaming #endif bullet.CanMove = false; - if (gameMap.Remove(bullet) && bullet.IsToBomb) + if (gameMap.Remove(bullet) && bullet.BulletBombRange > 0) gameMap.Add(new BombedBullet(bullet)); - if (!bullet.IsToBomb) + if (bullet.BulletBombRange == 0) { if (objBeingShot == null) { @@ -201,7 +197,14 @@ namespace Gaming return; } - + if (bullet.TypeOfBullet == BulletType.BombBomb) + { + bullet.Parent.BulletOfPlayer = BulletType.JumpyDumpty; + Attack((Character)bullet.Parent, 0.0); + Attack((Character)bullet.Parent, Math.PI); + Attack((Character)bullet.Parent, Math.PI / 2.0); + Attack((Character)bullet.Parent, Math.PI * 3.0 / 2.0); + } BombObj(bullet, objBeingShot); if (bullet.RecoveryFromHit > 0) { @@ -304,7 +307,7 @@ namespace Gaming beAttackedList.Clear(); } - public bool Attack(Character? player, double angle) // 射出去的子弹泼出去的水(狗头) + public bool Attack(Character? player, double angle) { // 子弹如果没有和其他物体碰撞,将会一直向前直到超出人物的attackRange if (player == null) { diff --git a/logic/Gaming/PropManager.cs b/logic/Gaming/PropManager.cs index 84205f4..4271dc9 100644 --- a/logic/Gaming/PropManager.cs +++ b/logic/Gaming/PropManager.cs @@ -31,10 +31,10 @@ namespace Gaming player.AddSpear(GameData.PropDuration); else player.AddShield(GameData.PropDuration); break; - case PropType.AddLifeOrAp: + case PropType.AddLifeOrClairaudience: if (!player.IsGhost()) player.AddLIFE(GameData.PropDuration); - else player.AddAp(GameData.PropDuration); + else player.AddClairaudience(GameData.PropDuration); break; case PropType.AddSpeed: player.AddMoveSpeed(GameData.PropDuration); diff --git a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs index 486c0a4..9456c2b 100644 --- a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs +++ b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs @@ -36,7 +36,7 @@ namespace Gaming return ActiveSkillEffect(skill, player, () => { player.AddMoveSpeed(skill.DurationTime, 3.0); - //See SkillWhenMove in ActionManager + //See SkillWhenColliding in ActionManager }, () => { }); @@ -55,12 +55,12 @@ namespace Gaming { }); } - public bool NuclearWeapon(Character player) + public bool JumpyBomb(Character player) { - return ActiveSkillEffect(player.UseIActiveSkill(ActiveSkillType.NuclearWeapon), player, () => + return ActiveSkillEffect(player.UseIActiveSkill(ActiveSkillType.JumpyBomb), player, () => { - player.BulletOfPlayer = BulletType.AtomBomb; - Debugger.Output(player, "uses atombomb!"); + player.BulletOfPlayer = BulletType.BombBomb; + Debugger.Output(player, "uses jumpybomb!"); }, () => { player.BulletOfPlayer = player.OriBulletOfPlayer; }); @@ -92,8 +92,8 @@ namespace Gaming || player.PlayerState == PlayerStateType.UsingSkill || player.PlayerState == PlayerStateType.LockingOrOpeningTheDoor || player.PlayerState == PlayerStateType.OpeningTheChest) && gameMap.CanSee(player, character)) { - if (AttackManager.BeStunned(character, GameData.TimeOfGhostFaintingWhenPunish + (player.MaxHp - player.HP) / GameData.TimeFactorOfGhostFainting)) - player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenPunish + (player.MaxHp - player.HP) / GameData.TimeFactorOfGhostFainting)); + if (AttackManager.BeStunned(character, GameData.TimeOfGhostFaintingWhenPunish + (player.MaxHp - player.HP) / GameData.timeFactorOfGhostFainting)) + player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.TimeOfGhostFaintingWhenPunish + (player.MaxHp - player.HP) / GameData.timeFactorOfGhostFainting)); break; } } diff --git a/logic/Gaming/SkillManager/SkillManager.cs b/logic/Gaming/SkillManager/SkillManager.cs index ff411ef..e4003ca 100644 --- a/logic/Gaming/SkillManager/SkillManager.cs +++ b/logic/Gaming/SkillManager/SkillManager.cs @@ -28,6 +28,9 @@ namespace Gaming case ActiveSkillType.Punish: Punish(character); break; + case ActiveSkillType.JumpyBomb: + JumpyBomb(character); + break; default: return false; } diff --git a/logic/Preparation/Interface/ICharacter.cs b/logic/Preparation/Interface/ICharacter.cs index fe79716..a40d280 100644 --- a/logic/Preparation/Interface/ICharacter.cs +++ b/logic/Preparation/Interface/ICharacter.cs @@ -11,6 +11,8 @@ namespace Preparation.Interface public void AddScore(int add); public double Vampire { get; } public PlayerStateType PlayerState { get; set; } + public BulletType BulletOfPlayer { get; set; } + public bool IsGhost(); } } \ No newline at end of file diff --git a/logic/Preparation/Interface/IOccupation.cs b/logic/Preparation/Interface/IOccupation.cs index 087f156..b2a8cf1 100644 --- a/logic/Preparation/Interface/IOccupation.cs +++ b/logic/Preparation/Interface/IOccupation.cs @@ -16,7 +16,7 @@ namespace Preparation.Interface public int ViewRange { get; } public int TimeOfOpeningOrLocking { get; } public int SpeedOfClimbingThroughWindows { get; } - public int TimeOfOpenChest { get; } + public int SpeedOfOpenChest { get; } } public interface IGhost : IOccupation @@ -32,7 +32,7 @@ namespace Preparation.Interface public class Assassin : IGhost { - private const int moveSpeed = GameData.basicMoveSpeed * 473 / 380; + private const int moveSpeed = (int)(GameData.basicMoveSpeed * 473.0 / 380); public int MoveSpeed => moveSpeed; private const int maxHp = GameData.basicHp; @@ -61,12 +61,12 @@ namespace Preparation.Interface public int speedOfClimbingThroughWindows = GameData.basicGhostSpeedOfClimbingThroughWindows; public int SpeedOfClimbingThroughWindows => speedOfClimbingThroughWindows; - public int timeOfOpenChest = GameData.basicSpeedOfOpenChest; - public int TimeOfOpenChest => timeOfOpenChest; + public int speedOfOpenChest = GameData.basicSpeedOfOpenChest; + public int SpeedOfOpenChest => speedOfOpenChest; } - public class HoD : IGhost + public class Klee : IGhost { - private const int moveSpeed = GameData.basicMoveSpeed * 473 / 380; + private const int moveSpeed = (int)(GameData.basicMoveSpeed * 155 / 127); public int MoveSpeed => moveSpeed; private const int maxHp = GameData.basicHp; @@ -77,26 +77,26 @@ namespace Preparation.Interface public BulletType InitBullet => BulletType.CommonAttackOfGhost; - public List ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.BecomeInvisible, ActiveSkillType.UseKnife }); + public List ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.JumpyBomb }); public List ListOfIPassiveSkill => new(new PassiveSkillType[] { }); - public double concealment = GameData.basicConcealment * 1.5; + public double concealment = GameData.basicConcealment; public double Concealment => concealment; - public int alertnessRadius = (int)(GameData.basicAlertnessRadius * 1.3); + public int alertnessRadius = (int)(GameData.basicAlertnessRadius * 1.069); public int AlertnessRadius => alertnessRadius; - public int viewRange = (int)(GameData.basicViewRange * 1.3); + public int viewRange = (int)(GameData.basicViewRange * 1.1); public int ViewRange => viewRange; - public int timeOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking; + public int timeOfOpeningOrLocking = (int)(GameData.basicSpeedOfOpeningOrLocking / 1.1); public int TimeOfOpeningOrLocking => timeOfOpeningOrLocking; - public int speedOfClimbingThroughWindows = GameData.basicGhostSpeedOfClimbingThroughWindows; + public int speedOfClimbingThroughWindows = (int)(GameData.basicGhostSpeedOfClimbingThroughWindows / 1.1); public int SpeedOfClimbingThroughWindows => speedOfClimbingThroughWindows; - public int timeOfOpenChest = GameData.basicSpeedOfOpenChest; - public int TimeOfOpenChest => timeOfOpenChest; + public int speedOfOpenChest = (int)(GameData.basicSpeedOfOpenChest * 1.1); + public int SpeedOfOpenChest => speedOfOpenChest; } public class Teacher : IStudent { @@ -138,8 +138,8 @@ namespace Preparation.Interface public int speedOfClimbingThroughWindows = GameData.basicStudentSpeedOfClimbingThroughWindows / 2; public int SpeedOfClimbingThroughWindows => speedOfClimbingThroughWindows; - public int timeOfOpenChest = GameData.basicSpeedOfOpenChest; - public int TimeOfOpenChest => timeOfOpenChest; + public int speedOfOpenChest = GameData.basicSpeedOfOpenChest; + public int SpeedOfOpenChest => speedOfOpenChest; } public class Athlete : IStudent { @@ -181,7 +181,7 @@ namespace Preparation.Interface public int speedOfClimbingThroughWindows = GameData.basicStudentSpeedOfClimbingThroughWindows * 12 / 10; public int SpeedOfClimbingThroughWindows => speedOfClimbingThroughWindows; - public int timeOfOpenChest = GameData.basicSpeedOfOpenChest; - public int TimeOfOpenChest => timeOfOpenChest; + public int speedOfOpenChest = GameData.basicSpeedOfOpenChest; + public int SpeedOfOpenChest => speedOfOpenChest; } } diff --git a/logic/Preparation/Utility/EnumType.cs b/logic/Preparation/Utility/EnumType.cs index ab2e79a..3696a1d 100644 --- a/logic/Preparation/Utility/EnumType.cs +++ b/logic/Preparation/Utility/EnumType.cs @@ -53,31 +53,30 @@ namespace Preparation.Utility public enum BulletType // 子弹类型 { Null = 0, - OrdinaryBullet = 1, // 普通子弹 - AtomBomb = 2, // 原子弹 - FastBullet = 3, // 快速子弹 - LineBullet = 4, // 直线子弹 - FlyingKnife = 5, //飞刀 - CommonAttackOfGhost = 6, + FlyingKnife = 1, //飞刀 + CommonAttackOfGhost = 2, + JumpyDumpty = 3, + BombBomb = 4, // Ram = 7, } public enum PropType // 道具类型 { Null = 0, - AddSpeed = 1, - AddLifeOrAp = 2, - AddHpOrAp = 3, - ShieldOrSpear = 4, - Key3 = 5, - Key5 = 6, - Key6 = 7, + Key3 = 1, + Key5 = 2, + Key6 = 3, + AddSpeed = 4, + AddLifeOrClairaudience = 5, + AddHpOrAp = 6, + ShieldOrSpear = 7, + RecoveryFromDizziness = 8, } public enum CharacterType // 职业 { Null = 0, Assassin = 1, Athlete = 2, - RecoverAfterBattle = 3, + Klee = 3, SpeedUpWhenLeavingGrass = 4, Teacher = 5, PSkill5 = 6 @@ -87,7 +86,7 @@ namespace Preparation.Utility Null = 0, BecomeInvisible = 1, BecomeVampire = 2, - NuclearWeapon = 3, + JumpyBomb = 3, SuperFast = 4, UseKnife = 5, CanBeginToCharge = 6, diff --git a/logic/Preparation/Utility/GameData.cs b/logic/Preparation/Utility/GameData.cs index 94c4ab8..da9a633 100644 --- a/logic/Preparation/Utility/GameData.cs +++ b/logic/Preparation/Utility/GameData.cs @@ -35,6 +35,14 @@ namespace Preparation.Utility { return gameObjType != GameObjType.Null && gameObjType != GameObjType.Grass && gameObjType != GameObjType.OutOfBoundBlock && gameObjType != GameObjType.Window && gameObjType != GameObjType.Wall; } + /* public static bool Collide(GameObjType gameObjType) + { + return gameObjType != GameObjType.Null && gameObjType != GameObjType.Grass + && gameObjType != GameObjType.OutOfBoundBlock && gameObjType != GameObjType.Window + && gameObjType != GameObjType.Bullet&&gameObjType != GameObjType.Prop + &&gameObjType != GameObjType.PickedProp&&gameObjType != GameObjType.BombedBullet + &&gameObjType != GameObjType.EmergencyExit&&gameObjType != GameObjType.Doorway; + }*/ public static XY GetCellCenterPos(int x, int y) // 求格子的中心坐标 { @@ -106,6 +114,7 @@ namespace Preparation.Utility return characterType switch { CharacterType.Assassin => true, + CharacterType.Klee=> true, _ => false, }; } @@ -161,13 +170,13 @@ namespace Preparation.Utility public const int basicCD = 3000; // 初始子弹冷却 public const int basicCastTime = 500;//基本前摇时间 public const int basicBackswing = 818;//基本后摇时间 - public const int basicRecoveryFromHit = 4300;//基本命中攻击恢复时长 + public const int basicRecoveryFromHit = 3700;//基本命中攻击恢复时长 public const int basicStunnedTimeOfStudent = 4130; - public const int basicBulletMoveSpeed = 2700; // 基本子弹移动速度,单位:s-1 - public const double basicRemoteAttackRange = 9000; // 基本远程攻击范围 - public const double basicAttackShortRange = 2700; // 基本近程攻击范围 - public const double basicBulletBombRange = 3000; // 基本子弹爆炸范围 + public const int basicBulletMoveSpeed = 1800; // 基本子弹移动速度,单位:s-1 + public const double basicRemoteAttackRange = 3000; // 基本远程攻击范围 + public const double basicAttackShortRange = 900; // 基本近程攻击范围 + public const double basicBulletBombRange = 1000; // 基本子弹爆炸范围 #endregion #region 技能相关 public const int maxNumOfSkill = 3; @@ -183,7 +192,7 @@ namespace Preparation.Utility /// Punish /// public const int TimeOfGhostFaintingWhenPunish = 3070; - public const int TimeFactorOfGhostFainting = 1000; + public const int timeFactorOfGhostFainting = 250; #endregion #region 道具相关 public const int MinPropTypeNum = 1; diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index 6e609db..4404046 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -50,7 +50,7 @@ namespace Server { case Preparation.Utility.PropType.AddSpeed: return Protobuf.PropType.AddSpeed; - case Preparation.Utility.PropType.AddLifeOrAp: + case Preparation.Utility.PropType.AddLifeOrClairaudience: return Protobuf.PropType.AddLifeOrAp; case Preparation.Utility.PropType.AddHpOrAp: return Protobuf.PropType.AddHpOrAp; @@ -74,7 +74,7 @@ namespace Server case Protobuf.PropType.AddSpeed: return Preparation.Utility.PropType.AddSpeed; case Protobuf.PropType.AddLifeOrAp: - return Preparation.Utility.PropType.AddLifeOrAp; + return Preparation.Utility.PropType.AddLifeOrClairaudience; case Protobuf.PropType.AddHpOrAp: return Preparation.Utility.PropType.AddHpOrAp; case Protobuf.PropType.ShieldOrSpear: @@ -195,6 +195,8 @@ namespace Server { case Preparation.Utility.CharacterType.Assassin: return Protobuf.TrickerType.Assassin; + case Preparation.Utility.CharacterType.Klee: + return Protobuf.TrickerType._2; default: return Protobuf.TrickerType.NullTrickerType; } @@ -206,6 +208,8 @@ namespace Server { case Protobuf.TrickerType.Assassin: return Preparation.Utility.CharacterType.Assassin; + case Protobuf.TrickerType._2: + return Preparation.Utility.CharacterType.Klee; default: return Preparation.Utility.CharacterType.Null; } diff --git a/logic/cmd/gameServer.cmd b/logic/cmd/gameServer.cmd index 23c8bb1..72cf3b9 100644 --- a/logic/cmd/gameServer.cmd +++ b/logic/cmd/gameServer.cmd @@ -4,7 +4,7 @@ start cmd /k ..\Server\bin\Debug\net6.0\Server.exe --ip 0.0.0.0 --port 8888 --s ping -n 2 127.0.0.1 > NUL -start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 4 --type 2 --occupation 1 +start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 4 --type 2 --occupation 2 ping -n 2 127.0.0.1 > NUL diff --git a/logic/规则Logic.md b/logic/规则Logic.md index 3a09b2a..ec72ec9 100644 --- a/logic/规则Logic.md +++ b/logic/规则Logic.md @@ -154,7 +154,7 @@ - 子弹爆炸范围 - 子弹攻击力 - 是否可以穿墙 -- 是否可以爆炸 +- 是否为远程攻击 - 移动速度 - 子弹类型 @@ -347,7 +347,7 @@ | 道具 | 对学生增益 | [学生得分条件] | 对搞蛋鬼增益 | [搞蛋鬼得分条件] | | :-------- | :-------------------------------------- | :-----------------| :-------------------------------------- |:-----------------| | AddSpeed | 提高移动速度,持续10s |不得分| 提高移动速度,持续10s |不得分| -| AddLifeOrAp |若在10s内Hp归零,该增益消失以使Hp保留100|在10s内Hp归零,得分? |10秒内下一次攻击增伤1800000|10秒内有一次攻击,得分? | +| AddLifeOrClairaudience |若在10s内Hp归零,该增益消失以使Hp保留100|在10s内Hp归零,得分? |10秒内下一次攻击增伤1800000|10秒内有一次攻击,得分? | | AddHpOrAp |回血1500000 | 回血成功 | 10秒内下一次攻击增伤1800000|10秒内有一次攻击,得分? | | ShieldOrSpear | 10秒内能抵挡一次伤害 | 10秒内成功抵挡一次伤害 |10秒内下一次攻击能破盾,如果对方无盾,则增伤900000| 10秒内攻击中学生| | Key3 | 能开启3教的门 |不得分| 能开启3教的门 |不得分| @@ -494,165 +494,9 @@ public int SkillCD => GameData.commonSkillCD; public int DurationTime => 0; ~~~ - 使用瞬间,在视野范围内的捣蛋鬼会被眩晕(3070+ 玩家损失的血量 / 1000)ms, + 使用瞬间,在可视范围内的使用技能状态中、攻击前后摇、开锁门、开箱的捣蛋鬼会被眩晕(3070+ 玩家损失的血量 / 1000)ms, ## 游戏数据 ### 基本常数 - ~~~csharp - public const int numOfStepPerSecond = 20; // 每秒行走的步数 - public const int frameDuration = 50; // 每帧时长 - public const int checkInterval = 50; // 检查位置标志、补充子弹的帧时长 - - public const long gameDuration = 600000; // 游戏时长600000ms = 10min - - public const int MinSpeed = 1; // 最小速度 - public const int MaxSpeed = int.MaxValue; // 最大速度 - #endregion - #region 地图相关 - public const int numOfPosGridPerCell = 1000; // 每格的【坐标单位】数 - public const int lengthOfMap = 50000; // 地图长度 - public const int rows = 50; // 行数 - public const int cols = 50; // 列数 - - public const int numOfBirthPoint = 5; - public const int numOfGenerator = 9; - public const int numOfChest = 8; - - public static XY GetCellCenterPos(int x, int y) // 求格子的中心坐标 - { - XY ret = new(x * numOfPosGridPerCell + numOfPosGridPerCell / 2, y * numOfPosGridPerCell + numOfPosGridPerCell / 2); - return ret; - } - public static int PosGridToCellX(XY pos) // 求坐标所在的格子的x坐标 - { - return pos.x / numOfPosGridPerCell; - } - public static int PosGridToCellY(XY pos) // 求坐标所在的格子的y坐标 - { - return pos.y / numOfPosGridPerCell; - } - public static XY PosGridToCellXY(XY pos) // 求坐标所在的格子的Xy坐标 - { - return new XY(pos.x / numOfPosGridPerCell, pos.y / numOfPosGridPerCell); - } - ~~~ - -### 角色相关 - ~~~csharp - public const int numOfStudent = 4; - public const int characterRadius = numOfPosGridPerCell / 2 / 5 * 4; // 人物半径 - - public const int basicTreatSpeed = 100; - public const int basicFixSpeed = 100; - public const int basicSpeedOfOpeningOrLocking = 3280; - public const int basicStudentSpeedOfClimbingThroughWindows = 611; - public const int basicGhostSpeedOfClimbingThroughWindows = 1270; - public const int basicSpeedOfOpenChest = 1000; - - public const int basicHp = 3000000; // 初始血量 - public const int basicMaxGamingAddiction = 60000;//基本完全沉迷时间 - public const int BeginGamingAddiction = 10003; - public const int MidGamingAddiction = 30000; - public const int basicTreatmentDegree = 1500000; - public const int basicTimeOfRescue = 1000; - - public const int basicMoveSpeed = 1270; // 基本移动速度,单位:s-1 - public const int characterMaxSpeed = 12000; // 最大速度 - public const int basicBulletMoveSpeed = 2700; // 基本子弹移动速度,单位:s-1 - - public const double basicConcealment = 1.0; - public const int basicAlertnessRadius = 10700; - public const int basicViewRange = 5 * numOfPosGridPerCell; - public const int maxNumOfPropInPropInventory = 3; -~~~ - -### 得分相关 - ~~~csharp - public static int TrickerScoreAttackStudent(int damage) - { - return damage * 100 / basicApOfGhost; - } - public const int TrickerScoreStudentBeAddicted = 50; - public const int TrickerScoreStudentBeStunned = 25; - public const int TrickerScoreStudentDie = 1000; - - public static int StudentScoreFix(int degreeOfFix) - { - return degreeOfFix; - } - public const int StudentScoreFixed = 25; - public static int StudentScorePinDown(int timeOfPiningDown) - { - return 0; - } - public const int StudentScoreTrickerBeStunned = 25; - public const int StudentScoreRescue = 100; - public static int StudentScoreTreat(int degree) - { - return degree; - } - public const int StudentScoreEscape = 1000; - public const int ScorePropRemainHp = 20; - public const int ScorePropUseShield = 20; - public const int ScorePropUseSpear = 20; - public const int ScorePropAddAp = 10; - public const int ScorePropAddHp = 50; - - ~~~ -### 攻击与子弹相关 - ~~~csharp - public const int basicApOfGhost = 1500000; // 捣蛋鬼攻击力 - public const int MinAP = 0; // 最小攻击力 - public const int MaxAP = int.MaxValue; // 最大攻击力 - - public const int factorDamageGenerator = 2;//子弹对电机的破坏=factorDamageGenerator*AP; - public const int bulletRadius = 200; // 默认子弹半径 - public const int basicBulletNum = 3; // 基本初始子弹量 - - public const int basicCD = 3000; // 初始子弹冷却 - public const int basicCastTime = 500;//基本前摇时间 - public const int basicBackswing = 818;//基本后摇时间 - public const int basicRecoveryFromHit = 4300;//基本命中攻击恢复时长 - public const int basicStunnedTimeOfStudent = 4130; - - public const int basicBulletMoveSpeed = 2700; // 基本子弹移动速度,单位:s-1 - public const double basicRemoteAttackRange = 9000; // 基本远程攻击范围 - public const double basicAttackShortRange = 2700; // 基本近程攻击范围 - public const double basicBulletBombRange = 3000; // 基本子弹爆炸范围 -~~~ - -### 技能相关 - ~~~csharp - public const int maxNumOfSkill = 3; - public const int commonSkillCD = 30000; // 普通技能标准冷却时间 - public const int commonSkillTime = 10000; // 普通技能标准持续时间 - ~~~ -### 道具相关 - ~~~csharp - public const int MinPropTypeNum = 1; - public const int MaxPropTypeNum = 10; - public const int PropRadius = numOfPosGridPerCell / 2; - public const int PropMoveSpeed = 3000; - public const int PropMaxMoveDistance = 15 * numOfPosGridPerCell; - public const long PropProduceTime = 20000; - public const int PropDuration = 10000; - - public const int ApPropAdd = basicApOfGhost * 12 / 10; - public const int ApSpearAdd = basicApOfGhost * 6 / 10; - public const int RemainHpWhenAddLife = 100; - - public const int numOfKeyEachArea = 2; - public const int numOfPropTypeNotKey = 4; - public const int numOfTeachingBuilding = 3; - ~~~ -### 物体相关 - ~~~csharp - public const int degreeOfFixedGenerator = 10300000; - public const int degreeOfLockingOrOpeningTheDoor = 10000; - public const int degreeOfOpeningChest = 10000; - public const int degreeOfOpenedDoorway = 18000; - public const int maxNumOfPropInChest = 2; - public const int numOfGeneratorRequiredForRepair = 7; - public const int numOfGeneratorRequiredForEmergencyExit = 3; - ~~~ \ No newline at end of file +请自行查看Logic/Preparation/Utility/GameData.cs \ No newline at end of file