Browse Source

Merge pull request #586 from shangfengh/new

docs: 📝 edit 游戏机制与平衡性调整更新(基本不变版).md
tags/v0.1.0
shangfengh GitHub 2 years ago
parent
commit
cd087a8c4a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 100 additions and 65 deletions
  1. +83
    -46
      docs/GameRules.md
  2. +3
    -7
      docs/游戏机制与平衡性调整更新(基本不变版).md
  3. +6
    -1
      docs/版本更新说明.md
  4. +2
    -1
      logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs
  5. +0
    -1
      logic/GameClass/GameObj/Character/Character.cs
  6. +6
    -9
      logic/Gaming/AttackManager.cs

+ 83
- 46
docs/GameRules.md View File

@@ -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 - 攻击距离是指攻击(子弹)的移动距离,也就是说理论上最远被攻击的学生的中心与捣蛋鬼的中心=学生的半径+捣蛋鬼的半径+攻击距离+子弹半径(200)*2
- 攻击类型CommonAttackOfTricker攻击未写完的作业,会造成对应攻击力的损坏
- 蹦蹦炸弹BombBomb与strike攻击未写完的作业,会造成对应攻击力的损坏
- 捣蛋鬼攻击交互状态或前后摇的学生,将使学生眩晕4.3s - 捣蛋鬼攻击交互状态或前后摇的学生,将使学生眩晕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 #### Assassin
- 普通攻击为 CommonAttackOfTricker - 普通攻击为 CommonAttackOfTricker
- 主动技能 - 主动技能
0. 隐身 BecomeInvisible 0. 隐身 BecomeInvisible
- CD:40s 持续时间:10s - CD:40s 持续时间:10s
- 在持续时间内玩家隐身
- 在持续时间内玩家隐身,人物状态进入UsingSpecialSkill,进入其他状态会使得隐身状态解除
- 使用瞬间得分15 - 使用瞬间得分15
1. 使用飞刀 1. 使用飞刀
- CD:30s 持续时间:1s - CD:30s 持续时间:1s
@@ -217,12 +220,17 @@ $$
0. 蹦蹦炸弹 JumpyBomb 0. 蹦蹦炸弹 JumpyBomb
- CD:15s 持续时间:3s - CD:15s 持续时间:3s
- 在持续时间内,攻击类型变为蹦蹦炸弹 - 在持续时间内,攻击类型变为蹦蹦炸弹
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,270° 发出2个小炸弹
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,120°,150°,180°,210°,240°,270° 发出7个小炸弹
- 小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕3.07s - 小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕3.07s
- 不直接得分,通过眩晕等获得对应得分 - 不直接得分,通过眩晕等获得对应得分
1. SparksNSplash:
- CD:45s, 持续时间:10s
- 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败)
- 特性
- 开局获得随机的一个道具(不会是钥匙)


#### 喧哗者ANoisyPerson #### 喧哗者ANoisyPerson
- 普通攻击为 CommonAttackOfTricker
- 普通攻击为 strike
- 主动技能 - 主动技能
0. 嚎叫 Howl 0. 嚎叫 Howl
- CD:25s - CD:25s
@@ -237,25 +245,25 @@ $$
0. ShowTime 0. ShowTime
- CD: 80s 持续时间:10s - 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 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 - 当处于可接受指令状态且不在学习时,会积累“冥想进度”,速度为40/ms
- 受到攻击(并非伤害)、进入学习状态或进入不可接受指令状态(包括翻窗)冥想进度清零 - 受到攻击(并非伤害)、进入学习状态或进入不可接受指令状态(包括翻窗)冥想进度清零
- 主动技能5
- 主动技能
0. 写答案 WriteAnswers 0. 写答案 WriteAnswers
- CD:30s - 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 0. 唤醒 Rouse
@@ -367,7 +404,7 @@ $$


### 技能 ### 技能
- CD冷却计时是在开始使用技能的瞬间开始的 - CD冷却计时是在开始使用技能的瞬间开始的
- Klee的小炸弹有碰撞体积
- Klee的小炸弹不受道具增益影响
- 除了切换攻击类型的技能,在不能执行指令的状态下(包括翻窗)均不能使用技能 - 除了切换攻击类型的技能,在不能执行指令的状态下(包括翻窗)均不能使用技能


### 职业 ### 职业

+ 3
- 7
docs/游戏机制与平衡性调整更新(基本不变版).md View File

@@ -6,10 +6,6 @@
## 游戏接口 ## 游戏接口
- 删除structures.h中Player的属性place - 删除structures.h中Player的属性place


## 游戏规则

## 游戏机制

## 攻击 ## 攻击
- 飞刀FlyingKnife - 飞刀FlyingKnife
- 前摇与CD变为600ms - 前摇与CD变为600ms
@@ -20,7 +16,7 @@
- 增强为“可以攻击未写完的作业” - 增强为“可以攻击未写完的作业”
- 增强为“可以攻击使门被打开(可以重新被锁上)” - 增强为“可以攻击使门被打开(可以重新被锁上)”
- 小炸弹JumpyDumpty - 小炸弹JumpyDumpty
- 攻击距离改为1600
- 攻击距离改为1800
- 小炸弹不受道具增益影响 - 小炸弹不受道具增益影响
- 修改为“小炸弹与自己无碰撞体积” - 修改为“小炸弹与自己无碰撞体积”
- strike(新增) - strike(新增)
@@ -30,7 +26,7 @@
| 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike | | 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike |
| :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- | | :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- |
| 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 | | 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 |
| 子弹攻击距离 | 2200 | 78000 | 2200 | 1600 | 2000 |
| 子弹攻击距离 | 2200 | 78000 | 2200 | 1800 | 2000 |
| 攻击力 | 1500000 | 1200000 | 1800000 | 900000 | 1600000 | | 攻击力 | 1500000 | 1200000 | 1800000 | 900000 | 1600000 |
| 移动速度/s | 7400 | 18500 | 6000 | 8600 | 6250 | | 移动速度/s | 7400 | 18500 | 6000 | 8600 | 6250 |
| 前摇(ms) | 297 | 600 | 366 | - | 320 | | 前摇(ms) | 297 | 600 | 366 | - | 320 |
@@ -109,7 +105,7 @@
- CD:45s, 持续时间:10s - CD:45s, 持续时间:10s
- 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败) - 技能使用瞬间,对于输入的额外参数PlayerID代表的角色,距离最近的本已停止运动的小炸弹开始追踪该角色(每100ms向该角色直线移动)(该角色无血量则失败)
- 主动技能 蹦蹦炸弹 JumpyBomb - 主动技能 蹦蹦炸弹 JumpyBomb
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上0°,45°,90°,135°,180°,225°,270°,315° 发出8个小炸弹
- 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,120°,150°,180°,210°,240°,270° 发出7个小炸弹
- Idol - Idol
主动技能ShowTime改为 主动技能ShowTime改为
"持续时间内 "持续时间内


+ 6
- 1
docs/版本更新说明.md View File

@@ -59,5 +59,10 @@
# 5月20日23:30更新 # 5月20日23:30更新
- fix:修复了学习已经完成的作业会卡死的问题 - fix:修复了学习已经完成的作业会卡死的问题


# 5月21日0:30更新
- fix:修复了游戏结束判定的bug
- fix:修复了死亡状态设置的bug

# 5月21日更新 # 5月21日更新
- fix:修复了游戏结束判定的bug
- docs:更新了 游戏机制与平衡性调整更新(基本不变版).pdf
- Klee小炸弹的攻击范围与放射方向调整

+ 2
- 1
logic/GameClass/GameObj/Bullet/Bullet.Ghost.cs View File

@@ -158,6 +158,7 @@ namespace GameClass.GameObj
public override BulletType TypeOfBullet => BulletType.BombBomb; public override BulletType TypeOfBullet => BulletType.BombBomb;


} }

internal sealed class JumpyDumpty : Bullet internal sealed class JumpyDumpty : Bullet
{ {
public JumpyDumpty(Character player, XY pos, int radius = GameData.bulletRadius) : base(player, radius, pos) 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); ap = (int)(GameData.basicApOfGhost * 0.6);
} }
public override double BulletBombRange => GameData.basicBulletBombRange / 2; 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 int Speed => (int)(GameData.basicBulletMoveSpeed * 43 / 37);
public override bool IsRemoteAttack => false; public override bool IsRemoteAttack => false;


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

@@ -595,7 +595,6 @@ namespace GameClass.GameObj
lock (actionLock) lock (actionLock)
{ {
if (!TryToRemove()) return false; if (!TryToRemove()) return false;
Debugger.Output(this, "TryToRemove");
ReSetCanMove(false); ReSetCanMove(false);
SetPlayerState(playerStateType); SetPlayerState(playerStateType);
position = GameData.PosWhoDie; position = GameData.PosWhoDie;


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

@@ -52,9 +52,8 @@ namespace Gaming


private void BombObj(Bullet bullet, GameObj objBeingShot) private void BombObj(Bullet bullet, GameObj objBeingShot)
{ {
#if DEBUG
Debugger.Output(bullet, "bombed " + objBeingShot.ToString()); Debugger.Output(bullet, "bombed " + objBeingShot.ToString());
#endif
switch (objBeingShot.Type) switch (objBeingShot.Type)
{ {
case GameObjType.Character: case GameObjType.Character:
@@ -122,12 +121,11 @@ namespace Gaming


private void BulletBomb(Bullet bullet, GameObj? objBeingShot) private void BulletBomb(Bullet bullet, GameObj? objBeingShot)
{ {
#if DEBUG
if (objBeingShot != null) if (objBeingShot != null)
Debugger.Output(bullet, "bombed with" + objBeingShot.ToString()); Debugger.Output(bullet, "bombed with" + objBeingShot.ToString());
else else
Debugger.Output(bullet, "bombed without objBeingShot"); Debugger.Output(bullet, "bombed without objBeingShot");
#endif
if (!TryRemoveBullet(bullet)) return; if (!TryRemoveBullet(bullet)) return;


if (bullet.BulletBombRange == 0) if (bullet.BulletBombRange == 0)
@@ -155,14 +153,13 @@ namespace Gaming


if (bullet.TypeOfBullet == BulletType.BombBomb && objBeingShot != null) if (bullet.TypeOfBullet == BulletType.BombBomb && objBeingShot != null)
{ {
ProduceBombBomb(bullet, 0);
ProduceBombBomb(bullet, Math.PI / 4);
ProduceBombBomb(bullet, Math.PI / 2); 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);
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 * 3 / 2);
ProduceBombBomb(bullet, Math.PI * 7 / 4);
} }


var beAttackedList = new List<IGameObj>(); var beAttackedList = new List<IGameObj>();


Loading…
Cancel
Save