diff --git a/docs/GameRules.md b/docs/GameRules.md index 2108843..f061ae5 100644 --- a/docs/GameRules.md +++ b/docs/GameRules.md @@ -1,5 +1,5 @@ # 规则 -V5.6.2 +V6.0 - [规则](#规则) - [简则](#简则) - [地图](#地图) @@ -28,6 +28,8 @@ V5.6.2 - [运动员](#运动员) - [教师](#教师) - [学霸](#学霸) + - [机器人Robot](#机器人robot) + - [技术宅TechOtaku](#技术宅techotaku) - [开心果](#开心果) - [细则](#细则) - [特殊说明](#特殊说明) @@ -90,20 +92,21 @@ $$ ### 攻击 - 攻击距离是指攻击(子弹)的移动距离,也就是说理论上最远被攻击的学生的中心与捣蛋鬼的中心=学生的半径+捣蛋鬼的半径+攻击距离+子弹半径(200)*2 -- 攻击类型CommonAttackOfTricker攻击未写完的作业,会造成对应攻击力的损坏 +- 蹦蹦炸弹BombBomb与strike攻击未写完的作业,会造成对应攻击力的损坏 - 捣蛋鬼攻击交互状态或前后摇的学生,将使学生眩晕4.3s - -| 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker| 飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | -| :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- | -| 爆炸范围 | 0 | 0 | 2000 | 1000 | -| 攻击距离 | 2200 | 78000 | 2200 | 4400 | -| 攻击力 | 1500000 | 1200000 | 1800000 | 900000 | -| 移动速度/s | 7400 | 18500 | 6000 | 8600 | -| 前摇(ms) | 297 | 400 | 366 | - | -|未攻击至目标时的后摇(ms)| 800 | 0 | 3700 | - | -|攻击至目标时的后摇(ms)| 3700 | 0 | 3700 | - | -| CD(ms) | 800 | 400 | 3000 | - | -| 最大子弹容量 | 1 | 1 | 1 | - | +- 蹦蹦炸弹BombBomb可以攻击使门被打开 + +| 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike | +| :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- | +| 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 | +| 子弹攻击距离 | 2200 | 78000 | 2200 | 1800 | 2000 | +| 攻击力 | 1500000 | 1200000 | 1800000 | 900000 | 1600000 | +| 移动速度/s | 7400 | 18500 | 6000 | 8600 | 6250 | +| 前摇(ms) | 297 | 600 | 366 | - | 320 | +|未攻击至目标时的后摇(ms)| 800 | 0 | 1200 | - | 800 | +|攻击至目标时的后摇(ms) | 3700 | 0 | 3700 | - | 3700 | +| CD(ms) | 800 | 600 | 3000 | - | 800 | +| 最大子弹容量 | 1 | 1 | 1 | - | 1 | ### 交互 - 除了翻窗,交互目标与交互者在一个**九宫格**方可交互 @@ -189,22 +192,22 @@ $$ ### 捣蛋鬼 -| 捣蛋鬼职业 | Assassin | Klee | 喧哗者ANoisyPerson | Idol | +| 捣蛋鬼职业 | Assassin | Klee | 喧哗者ANoisyPerson | Idol | | :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- | -| 移动速度/s | 3960 | 3600 | 3852 | 3600 | -| 隐蔽度 | 1.5 | 1 | 0.8 | 0.75| -| 警戒范围 | 22100 | 17000 | 15300 | 17000| -| 视野范围 | 15600 | 13000 | 13000 | 14300| -| 开锁门速度/ms | 4000 | 4000 | 4000 |4000 | -| 翻窗速度/s | 2540 | 2540 | 2794 | 2540| -| 翻箱速度/ms | 1000 | 1100 | 1000 |1000| +| 移动速度/s | 3960 | 3600 | 3852 | 3600 | +| 隐蔽度 | 1.5 | 1 | 0.8 | 0.75 | +| 警戒范围 | 22100 | 17000 | 15300 | 17000 | +| 视野范围 | 15600 | 13000 | 13000 | 14300 | +| 开锁门速度/ms| 5000 | 5000 | 5000 | 5000 | +| 翻窗速度/s | 2540 | 2540 | 2794 | 2540 | +| 翻箱速度/ms | 1250 | 1375 | 1250 | 1250 | #### Assassin - 普通攻击为 CommonAttackOfTricker - 主动技能 0. 隐身 BecomeInvisible - CD:40s 持续时间:10s - - 在持续时间内玩家隐身 + - 在持续时间内玩家隐身,人物状态进入UsingSpecialSkill,进入其他状态会使得隐身状态解除 - 使用瞬间得分15 1. 使用飞刀 - CD:30s 持续时间:1s @@ -217,12 +220,17 @@ $$ 0. 蹦蹦炸弹 JumpyBomb - CD:15s 持续时间:3s - 在持续时间内,攻击类型变为蹦蹦炸弹 - - 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,270° 发出2个小炸弹 + - 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,120°,150°,180°,210°,240°,270° 发出7个小炸弹 - 小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕3.07s - 不直接得分,通过眩晕等获得对应得分 + 1. SparksNSplash: + - CD:45s, 持续时间:10s + - 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败) +- 特性 + - 开局获得随机的一个道具(不会是钥匙) #### 喧哗者ANoisyPerson -- 普通攻击为 CommonAttackOfTricker +- 普通攻击为 strike - 主动技能 0. 嚎叫 Howl - CD:25s @@ -237,25 +245,25 @@ $$ 0. ShowTime - CD: 80s 持续时间:10s - 持续时间内 - - 使警戒范围外的学生眩晕并每200ms发送向自己移动200ms的指令(速度为学生本应速度*二者距离/警戒范围) - - 对于视野范围(不是可视区域)内的学生每200ms加600的沉迷度 - - 捣蛋鬼变为0.8倍速 + - 使警戒范围外的学生眩晕并每500ms发送向自己移动500ms的指令(速度为学生本应速度*二者距离/警戒范围) + - 对于视野范围(不是可视区域)内的学生每500ms加1500的沉迷度 + - 捣蛋鬼变为0.8倍速" ### 学生(&老师) -| 学生职业 | 教师Teacher | 健身狂Athlete | 学霸StraightAStudent | 开心果Sunshine | -| :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- | -| 移动速度/s | 2700 | 3150 | 2880 | 3000 | -| 最大毅力值 | 30000000 | 3000000 | 3300000 | 3200000 | -| 最大沉迷度 | 600000 | 54000 | 78000 | 66000 | -| 学习速度/ms | 0 | 73 | 135 | 123 | -| 勉励速度/ms | 80 | 90 | 100 | 120 | -| 隐蔽度 | 0.5 | 0.9 | 0.9 | 0.8 | -| 警戒范围 | 7500 | 15000 | 13500 | 15000 | -| 视野范围 | 9000 | 11000 | 9000 | 10000 | -| 开锁门速度/ms | 4000 | 4000 | 4000 | 2800 | -| 翻窗速度/ms | 611 | 1466 | 1018 | 1222 | -| 翻箱速度/ms | 1000 | 1000 | 1000 | 900 | +| 学生职业 | 教师Teacher | 健身狂Athlete |学霸StraightAStudent | 开心果Sunshine | 机器人Robot | 技术宅TechOtaku | +| :------------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ | +| 移动速度/s | 2700 | 3150 | 2880 | 3000 | 2700 | 2880 | +| 最大毅力值 | 30000000 | 3000000 | 3300000 | 3200000 | 900000 | 2700000 | +| 最大沉迷度 | 600000 | 54000 | 78000 | 60000 | 0 | 60000 | +| 学习速度/ms | 50 | 73 | 135 | 123 | 85 | 110 | +| 勉励速度/ms | 80 | 90 | 100 | 120 | 0 | 100 | +| 隐蔽度 | 0.5 | 0.9 | 0.9 | 0.8 | 0.8 | 1.1 | +| 警戒范围 | 10000 | 15000 | 13500 | 15000 | 0 | 15000 | +| 视野范围 | 9000 | 11000 | 9000 | 10000 | 0 | 9000 | +| 开锁门速度/ms | 5000 | 5000 | 5000 | 3500 | 0 | 5000 | +| 翻窗速度/ms | 1000 | 1466 | 1018 | 1222 | 1 | 1100 | +| 翻箱速度/ms | 1250 | 1250 | 1250 | 1125 | 1000 | 1100 | #### 运动员 - 主动技能 @@ -267,24 +275,53 @@ $$ #### 教师 - 主动技能 0. 惩罚 Punish - - CD:30s - - 使用瞬间,在可视范围内的翻窗、开锁门、攻击前后摇的捣蛋鬼会被眩晕(3070+300*已受伤害/基本伤害(1500000))ms, - - 通过眩晕获得对应得分 + - CD:45s + - “使用瞬间,在视野距离/3范围内(不是可视范围)的翻窗、开锁门、攻击前后摇、使用技能期间的捣蛋鬼会被眩晕(3070+$\frac{500×已受伤害}{基本伤害(1500000)×2^{开局老师数量-1}}$)ms” + - 其眩晕得分为正常眩晕得分/2^开局老师数量-1^ + 1. 喝茶 HaveTea + - CD:90s + - 使用瞬间,向额外参数/1000.0的角度瞬移3000(可以穿墙),如果会碰撞则失败。 - 特性 - 无法获得牵制得分 - 无法毕业 + - 扣血则得分$\frac{100×受到伤害}{基本伤害(1500000)×2^{开局老师数量-1}}$ #### 学霸 - 特性 - 冥想 - 当处于可接受指令状态且不在学习时,会积累“冥想进度”,速度为40/ms - 受到攻击(并非伤害)、进入学习状态或进入不可接受指令状态(包括翻窗)冥想进度清零 -- 主动技能5 +- 主动技能 0. 写答案 WriteAnswers - CD:30s - 使用瞬间,对于可交互范围内的一间教室的作业增加冥想进度,冥想进度清零 - 通过学习获得对应得分 +#### 机器人Robot +- 特性 + - 无技能 + - 不可被眩晕 + - 不可毕业 + - 不可救人 + - 无牵制得分 + - 不可使用道具(可以捡起和扔道具) + +#### 技术宅TechOtaku +- 特性 + - 一名TechOtaku最多可以在场上同时最多拥有3个Robot,无法共享视野 +- 主动技能 + 0. SummonGolem + - CD:40s,持续时间:6s + - 在持续时间中,学生进入人物状态进入UsingSpecialSkill(不能移动),进入其他状态会导致制作机器人失败。 + - 在持续时间中,学生面前生成道具CraftingBench;学生进入其他状态或该道具被碰撞后,CraftingBench消失且制作机器人失败。 + - 持续时间结束后,道具CraftingBench所在位置生成一个Robot,CraftingBench消失 + - TechOtaku的Robot的PlayerId = TechOtaku的PlayerId + n×5(一局游戏理论人数),其中1<=n<=3(自己的n为0) + - 新造的Robot的PlayerId的n总是尽量小 + 1. UseRobot + - CD:2s,持续时间:0s + - 输入额外参数PlayerID,切换到要使用的角色。 + - 切换到其他角色时,自己进入UsingSkill状态。 + #### 开心果 - 主动技能 0. 唤醒 Rouse @@ -367,7 +404,7 @@ $$ ### 技能 - CD冷却计时是在开始使用技能的瞬间开始的 -- Klee的小炸弹有碰撞体积 +- Klee的小炸弹不受道具增益影响 - 除了切换攻击类型的技能,在不能执行指令的状态下(包括翻窗)均不能使用技能 ### 职业 diff --git a/docs/游戏机制与平衡性调整更新(基本不变版).md b/docs/游戏机制与平衡性调整更新(基本不变版).md index 52ee821..8b6e783 100644 --- a/docs/游戏机制与平衡性调整更新(基本不变版).md +++ b/docs/游戏机制与平衡性调整更新(基本不变版).md @@ -6,10 +6,6 @@ ## 游戏接口 - 删除structures.h中Player的属性place -## 游戏规则 - -## 游戏机制 - ## 攻击 - 飞刀FlyingKnife - 前摇与CD变为600ms @@ -20,7 +16,7 @@ - 增强为“可以攻击未写完的作业” - 增强为“可以攻击使门被打开(可以重新被锁上)” - 小炸弹JumpyDumpty - - 攻击距离改为1600 + - 攻击距离改为1800 - 小炸弹不受道具增益影响 - 修改为“小炸弹与自己无碰撞体积” - strike(新增) @@ -30,7 +26,7 @@ | 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike | | :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- | | 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 | -| 子弹攻击距离 | 2200 | 78000 | 2200 | 1600 | 2000 | +| 子弹攻击距离 | 2200 | 78000 | 2200 | 1800 | 2000 | | 攻击力 | 1500000 | 1200000 | 1800000 | 900000 | 1600000 | | 移动速度/s | 7400 | 18500 | 6000 | 8600 | 6250 | | 前摇(ms) | 297 | 600 | 366 | - | 320 | @@ -109,7 +105,7 @@ - CD:45s, 持续时间:10s - 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败) - 主动技能 蹦蹦炸弹 JumpyBomb - - 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上0°,45°,90°,135°,180°,225°,270°,315° 发出8个小炸弹 + - 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,120°,150°,180°,210°,240°,270° 发出7个小炸弹 - Idol 主动技能ShowTime改为 "持续时间内 diff --git a/docs/版本更新说明.md b/docs/版本更新说明.md index ea76265..5a030d7 100644 --- a/docs/版本更新说明.md +++ b/docs/版本更新说明.md @@ -59,5 +59,10 @@ # 5月20日23:30更新 - fix:修复了学习已经完成的作业会卡死的问题 +# 5月21日0:30更新 +- fix:修复了游戏结束判定的bug +- fix:修复了死亡状态设置的bug + # 5月21日更新 -- fix:修复了游戏结束判定的bug \ No newline at end of file +- docs:更新了 游戏机制与平衡性调整更新(基本不变版).pdf + - Klee小炸弹的攻击范围与放射方向调整 \ No newline at end of file diff --git a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs index 9aa78ce..590c8d5 100644 --- a/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs +++ b/logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs @@ -158,6 +158,7 @@ namespace GameClass.GameObj public override BulletType TypeOfBullet => BulletType.BombBomb; } + internal sealed class JumpyDumpty : Bullet { public JumpyDumpty(Character player, XY pos, int radius = GameData.bulletRadius) : base(player, radius, pos) @@ -165,7 +166,7 @@ namespace GameClass.GameObj ap = (int)(GameData.basicApOfGhost * 0.6); } public override double BulletBombRange => GameData.basicBulletBombRange / 2; - public override double AttackDistance => GameData.basicAttackShortRange * 16 / 22; + public override double AttackDistance => GameData.basicAttackShortRange * 18 / 22; public override int Speed => (int)(GameData.basicBulletMoveSpeed * 43 / 37); public override bool IsRemoteAttack => false; diff --git a/logic/GameClass/GameObj/Character/Character.cs b/logic/GameClass/GameObj/Character/Character.cs index fc7058c..88940f2 100644 --- a/logic/GameClass/GameObj/Character/Character.cs +++ b/logic/GameClass/GameObj/Character/Character.cs @@ -595,7 +595,6 @@ namespace GameClass.GameObj lock (actionLock) { if (!TryToRemove()) return false; - Debugger.Output(this, "TryToRemove"); ReSetCanMove(false); SetPlayerState(playerStateType); position = GameData.PosWhoDie; diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index a8ade02..3f7787b 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -52,9 +52,8 @@ namespace Gaming private void BombObj(Bullet bullet, GameObj objBeingShot) { -#if DEBUG Debugger.Output(bullet, "bombed " + objBeingShot.ToString()); -#endif + switch (objBeingShot.Type) { case GameObjType.Character: @@ -122,12 +121,11 @@ namespace Gaming private void BulletBomb(Bullet bullet, GameObj? objBeingShot) { -#if DEBUG if (objBeingShot != null) Debugger.Output(bullet, "bombed with" + objBeingShot.ToString()); else Debugger.Output(bullet, "bombed without objBeingShot"); -#endif + if (!TryRemoveBullet(bullet)) return; if (bullet.BulletBombRange == 0) @@ -155,14 +153,13 @@ namespace Gaming if (bullet.TypeOfBullet == BulletType.BombBomb && objBeingShot != null) { - ProduceBombBomb(bullet, 0); - ProduceBombBomb(bullet, Math.PI / 4); ProduceBombBomb(bullet, Math.PI / 2); - ProduceBombBomb(bullet, Math.PI * 3 / 4); + ProduceBombBomb(bullet, Math.PI * 2 / 3); + ProduceBombBomb(bullet, Math.PI * 5 / 6); ProduceBombBomb(bullet, Math.PI); - ProduceBombBomb(bullet, Math.PI * 5 / 4); + ProduceBombBomb(bullet, Math.PI * 7 / 6); + ProduceBombBomb(bullet, Math.PI * 4 / 3); ProduceBombBomb(bullet, Math.PI * 3 / 2); - ProduceBombBomb(bullet, Math.PI * 7 / 4); } var beAttackedList = new List();