feat: ✨ update balance adjustments
tags/v0.1.0
| @@ -32,10 +32,10 @@ namespace Constants | |||||
| // 人物属性相关 | // 人物属性相关 | ||||
| SCCI int basicEncourageSpeed = 100; | SCCI int basicEncourageSpeed = 100; | ||||
| SCCI int basicFixSpeed = 123; | SCCI int basicFixSpeed = 123; | ||||
| SCCI int basicSpeedOfOpeningOrLocking = 4000; | |||||
| SCCI int basicSpeedOfOpeningOrLocking = 5000; | |||||
| SCCI int basicStudentSpeedOfClimbingThroughWindows = 1222; | SCCI int basicStudentSpeedOfClimbingThroughWindows = 1222; | ||||
| SCCI int basicTrickerSpeedOfClimbingThroughWindows = 2540; | SCCI int basicTrickerSpeedOfClimbingThroughWindows = 2540; | ||||
| SCCI int basicSpeedOfOpenChest = 1000; | |||||
| SCCI int basicSpeedOfOpenChest = 1250; | |||||
| SCCI int basicHp = 3000000; | SCCI int basicHp = 3000000; | ||||
| SCCI int basicMaxGamingAddiction = 60000; | SCCI int basicMaxGamingAddiction = 60000; | ||||
| @@ -138,19 +138,19 @@ namespace Constants | |||||
| SCCI int moveSpeed = basicStudentSpeed * 9 / 10; | SCCI int moveSpeed = basicStudentSpeed * 9 / 10; | ||||
| SCCI int maxHp = basicHp * 10; | SCCI int maxHp = basicHp * 10; | ||||
| SCCI int maxAddiction = basicMaxGamingAddiction * 10; | SCCI int maxAddiction = basicMaxGamingAddiction * 10; | ||||
| SCCI int fixSpeed = basicFixSpeed * 0; | |||||
| SCCI int fixSpeed = (int)(basicFixSpeed * 50 / 123); | |||||
| SCCI int encourageSpeed = basicEncourageSpeed * 8 / 10; | SCCI int encourageSpeed = basicEncourageSpeed * 8 / 10; | ||||
| SCCI double concealment = 0.5; | SCCI double concealment = 0.5; | ||||
| SCCI int alertnessRadius = basicStudentAlertnessRadius / 2; | |||||
| SCCI int viewRange = basicStudentViewRange * 9 / 10; | |||||
| SCCI int alertnessRadius = basicStudentAlertnessRadius * 2 / 3; | |||||
| SCCI int viewRange = basicStudentViewRange * 8 / 10; | |||||
| SCCI int speedOfOpeningOrLocking = basicSpeedOfOpeningOrLocking; | SCCI int speedOfOpeningOrLocking = basicSpeedOfOpeningOrLocking; | ||||
| SCCI int speedOfClimbingThroughWindows = basicStudentSpeedOfClimbingThroughWindows / 2; | |||||
| SCCI int speedOfClimbingThroughWindows = (int)(basicStudentSpeedOfClimbingThroughWindows * 1000 / 1222); | |||||
| SCCI int speedOfOpenChest = basicSpeedOfOpenChest; | SCCI int speedOfOpenChest = basicSpeedOfOpenChest; | ||||
| }; | }; | ||||
| struct StraightAStudent | struct StraightAStudent | ||||
| { | { | ||||
| SCCI int moveSpeed = basicStudentSpeed * 96 / 100; | |||||
| SCCI int moveSpeed = basicStudentSpeed * 24 / 25; | |||||
| SCCI int maxHp = basicHp * 11 / 10; | SCCI int maxHp = basicHp * 11 / 10; | ||||
| SCCI int maxAddiction = basicMaxGamingAddiction * 13 / 10; | SCCI int maxAddiction = basicMaxGamingAddiction * 13 / 10; | ||||
| SCCI int fixSpeed = basicFixSpeed * 11 / 10; | SCCI int fixSpeed = basicFixSpeed * 11 / 10; | ||||
| @@ -165,41 +165,41 @@ namespace Constants | |||||
| struct Robot | struct Robot | ||||
| { | { | ||||
| SCCI int moveSpeed = basicStudentSpeed; | |||||
| SCCI int maxHp = basicHp * 0.4; | |||||
| SCCI int moveSpeed = basicStudentSpeed * 9 / 10; | |||||
| SCCI int maxHp = basicHp * 0.3; | |||||
| SCCI int maxAddiction = basicMaxGamingAddiction * 0; | SCCI int maxAddiction = basicMaxGamingAddiction * 0; | ||||
| SCCI int fixSpeed = basicFixSpeed; | |||||
| SCCI int fixSpeed = (int)(basicFixSpeed * 0.7); | |||||
| SCCI int encourageSpeed = 0; | SCCI int encourageSpeed = 0; | ||||
| SCCI double concealment = 1; | |||||
| SCCI int alertnessRadius = basicStudentAlertnessRadius * 1; | |||||
| SCCI int viewRange = basicStudentViewRange; | |||||
| SCCI int speedOfOpeningOrLocking = basicSpeedOfOpeningOrLocking; | |||||
| SCCI double concealment = 0.8; | |||||
| SCCI int alertnessRadius = 0; | |||||
| SCCI int viewRange = 0; | |||||
| SCCI int speedOfOpeningOrLocking = 0; | |||||
| SCCI int speedOfClimbingThroughWindows = 1; | SCCI int speedOfClimbingThroughWindows = 1; | ||||
| SCCI int speedOfOpenChest = basicSpeedOfOpenChest; | |||||
| SCCI int speedOfOpenChest = basicSpeedOfOpenChest * 4 / 5; | |||||
| }; | }; | ||||
| struct TechOtaku | struct TechOtaku | ||||
| { | { | ||||
| SCCI int moveSpeed = basicStudentSpeed * 3 / 4; | |||||
| SCCI int moveSpeed = (int)(basicStudentSpeed * 0.96); | |||||
| SCCI int maxHp = basicHp * 9 / 10; | SCCI int maxHp = basicHp * 9 / 10; | ||||
| SCCI int maxAddiction = basicMaxGamingAddiction * 11 / 10; | |||||
| SCCI int fixSpeed = basicFixSpeed * 11 / 10; | |||||
| SCCI int encourageSpeed = basicEncourageSpeed * 9 / 10; | |||||
| SCCI double concealment = 1; | |||||
| SCCI int maxAddiction = basicMaxGamingAddiction; | |||||
| SCCI int fixSpeed = (int)(basicFixSpeed * 0.9); | |||||
| SCCI int encourageSpeed = basicEncourageSpeed; | |||||
| SCCI double concealment = 1.1; | |||||
| SCCI int alertnessRadius = basicStudentAlertnessRadius; | SCCI int alertnessRadius = basicStudentAlertnessRadius; | ||||
| SCCI int viewRange = basicStudentViewRange * 9 / 10; | SCCI int viewRange = basicStudentViewRange * 9 / 10; | ||||
| SCCI int speedOfOpeningOrLocking = basicSpeedOfOpeningOrLocking; | SCCI int speedOfOpeningOrLocking = basicSpeedOfOpeningOrLocking; | ||||
| SCCI int speedOfClimbingThroughWindows = basicStudentSpeedOfClimbingThroughWindows * 3 / 4; | |||||
| SCCI int speedOfOpenChest = basicSpeedOfOpenChest; | |||||
| SCCI int speedOfClimbingThroughWindows = (int)(basicStudentSpeedOfClimbingThroughWindows * 0.9); | |||||
| SCCI int speedOfOpenChest = basicSpeedOfOpenChest * 22 / 25; | |||||
| }; | }; | ||||
| struct Sunshine | struct Sunshine | ||||
| { | { | ||||
| SCCI int moveSpeed = basicStudentSpeed; | SCCI int moveSpeed = basicStudentSpeed; | ||||
| SCCI int maxHp = basicHp * 32 / 30; | |||||
| SCCI int maxHp = basicHp * 16 / 15; | |||||
| SCCI int maxAddiction = basicMaxGamingAddiction * 11 / 10; | SCCI int maxAddiction = basicMaxGamingAddiction * 11 / 10; | ||||
| SCCI int fixSpeed = basicFixSpeed; | SCCI int fixSpeed = basicFixSpeed; | ||||
| SCCI int encourageSpeed = basicEncourageSpeed * 12 / 10; | |||||
| SCCI int encourageSpeed = basicEncourageSpeed * 6 / 5; | |||||
| SCCI double concealment = 1; | SCCI double concealment = 1; | ||||
| SCCI int alertnessRadius = basicStudentAlertnessRadius; | SCCI int alertnessRadius = basicStudentAlertnessRadius; | ||||
| SCCI int viewRange = basicStudentViewRange; | SCCI int viewRange = basicStudentViewRange; | ||||
| @@ -244,7 +244,19 @@ namespace Constants | |||||
| struct Punish | struct Punish | ||||
| { | { | ||||
| SCCI int skillCD = commonSkillCD * 1; | |||||
| SCCI int skillCD = commonSkillCD * 3 / 2; | |||||
| SCCI int durationTime = commonSkillTime * 0; | |||||
| }; | |||||
| struct SparksNSplash | |||||
| { | |||||
| SCCI int skillCD = commonSkillCD * 3 / 2; | |||||
| SCCI int durationTime = commonSkillTime * 1; | |||||
| }; | |||||
| struct HaveTea | |||||
| { | |||||
| SCCI int skillCD = commonSkillCD * 3; | |||||
| SCCI int durationTime = commonSkillTime * 0; | SCCI int durationTime = commonSkillTime * 0; | ||||
| }; | }; | ||||
| @@ -292,7 +304,7 @@ namespace Constants | |||||
| struct UseRobot | struct UseRobot | ||||
| { | { | ||||
| SCCI int skillCD = commonSkillCD / 300; | |||||
| SCCI int skillCD = commonSkillCD / 15; | |||||
| SCCI int durationTime = commonSkillTime * 0; | SCCI int durationTime = commonSkillTime * 0; | ||||
| }; | }; | ||||
| @@ -304,8 +316,8 @@ namespace Constants | |||||
| struct SummonGolem | struct SummonGolem | ||||
| { | { | ||||
| SCCI int skillCD = commonSkillCD * 1; | |||||
| SCCI int durationTime = commonSkillTime * 0; | |||||
| SCCI int skillCD = commonSkillCD * 4 / 3; | |||||
| SCCI int durationTime = commonSkillTime * 6; | |||||
| }; | }; | ||||
| struct CommonAttackOfTricker | struct CommonAttackOfTricker | ||||
| @@ -331,10 +343,10 @@ namespace Constants | |||||
| SCCI int Speed = basicBulletMoveSpeed * 25 / 10; | SCCI int Speed = basicBulletMoveSpeed * 25 / 10; | ||||
| SCCI bool IsRemoteAttack = true; | SCCI bool IsRemoteAttack = true; | ||||
| SCCI int CastTime = basicCastTime * 4 / 5; | |||||
| SCCI int CastTime = basicCastTime * 6 / 5; | |||||
| SCCI int Backswing = 0; | SCCI int Backswing = 0; | ||||
| SCCI int RecoveryFromHit = 0; | SCCI int RecoveryFromHit = 0; | ||||
| SCCI int cd = basicBackswing / 2; | |||||
| SCCI int cd = basicBackswing * 3 / 4; | |||||
| SCCI int maxBulletNum = 1; | SCCI int maxBulletNum = 1; | ||||
| }; | }; | ||||
| @@ -347,7 +359,7 @@ namespace Constants | |||||
| SCCI bool IsRemoteAttack = false; | SCCI bool IsRemoteAttack = false; | ||||
| SCCI int CastTime = (int)BulletAttackRange * 1000 / Speed; | SCCI int CastTime = (int)BulletAttackRange * 1000 / Speed; | ||||
| SCCI int Backswing = basicRecoveryFromHit; | |||||
| SCCI int Backswing = basicBackswing * 3 / 2; | |||||
| SCCI int RecoveryFromHit = basicRecoveryFromHit; | SCCI int RecoveryFromHit = basicRecoveryFromHit; | ||||
| SCCI int cd = basicCD; | SCCI int cd = basicCD; | ||||
| SCCI int maxBulletNum = 1; | SCCI int maxBulletNum = 1; | ||||
| @@ -356,10 +368,25 @@ namespace Constants | |||||
| struct JumpyDumpty | struct JumpyDumpty | ||||
| { | { | ||||
| SCCI double BulletBombRange = basicBulletBombRange / 2; | SCCI double BulletBombRange = basicBulletBombRange / 2; | ||||
| SCCI double BulletAttackRange = basicRemoteAttackRange * 2; | |||||
| SCCI double BulletAttackRange = basicAttackShortRange * 16 / 22; | |||||
| SCCI int ap = (int)(basicApOfTricker * 0.6); | SCCI int ap = (int)(basicApOfTricker * 0.6); | ||||
| SCCI int Speed = basicBulletMoveSpeed * 43 / 37; | SCCI int Speed = basicBulletMoveSpeed * 43 / 37; | ||||
| SCCI bool IsRemoteAttack = false; | SCCI bool IsRemoteAttack = false; | ||||
| }; | }; | ||||
| struct Strike | |||||
| { | |||||
| SCCI double BulletBombRange = 0; | |||||
| SCCI double BulletAttackRange = basicAttackShortRange; | |||||
| SCCI int ap = basicApOfTricker * 16 / 15; | |||||
| SCCI int Speed = basicBulletMoveSpeed * 125 / 148; | |||||
| SCCI bool IsRemoteAttack = false; | |||||
| SCCI int CastTime = basicCastTime * 16 / 25; | |||||
| SCCI int Backswing = basicBackswing; | |||||
| SCCI int RecoveryFromHit = basicRecoveryFromHit; | |||||
| SCCI int cd = basicBackswing; | |||||
| SCCI int maxBulletNum = 1; | |||||
| }; | |||||
| } // namespace Constants | } // namespace Constants | ||||
| #endif | #endif | ||||
| @@ -27,10 +27,10 @@ class Constants(NoInstance): | |||||
| # 人物属性相关 | # 人物属性相关 | ||||
| basicEncourageSpeed = 100 | basicEncourageSpeed = 100 | ||||
| basicLearnSpeed = 123 | basicLearnSpeed = 123 | ||||
| basicSpeedOfOpeningOrLocking = 4000 | |||||
| basicSpeedOfOpeningOrLocking = 5000 | |||||
| basicStudentSpeedOfClimbingThroughWindows = 1222 | basicStudentSpeedOfClimbingThroughWindows = 1222 | ||||
| basicTrickerSpeedOfClimbingThroughWindows = 2540 | basicTrickerSpeedOfClimbingThroughWindows = 2540 | ||||
| basicSpeedOfOpenChest = 1000 | |||||
| basicSpeedOfOpenChest = 1250 | |||||
| basicHp = 3000000 | basicHp = 3000000 | ||||
| basicMaxGamingAddiction = 60000 | basicMaxGamingAddiction = 60000 | ||||
| @@ -65,8 +65,8 @@ class Constants(NoInstance): | |||||
| # 道具相关 | # 道具相关 | ||||
| apPropAdd = basicApOfTricker * 12 / 10 | |||||
| apSpearAdd = basicApOfTricker * 6 / 10 | |||||
| apPropAdd = basicApOfTricker * 12 // 10 | |||||
| apSpearAdd = basicApOfTricker * 6 // 10 | |||||
| # 技能相关 | # 技能相关 | ||||
| maxNumOfSkill = 3 | maxNumOfSkill = 3 | ||||
| @@ -85,7 +85,7 @@ class Constants(NoInstance): | |||||
| addedTimeOfSpeedWhenInspire = 1.6 | addedTimeOfSpeedWhenInspire = 1.6 | ||||
| timeOfAddingSpeedWhenInspire = 6000 | timeOfAddingSpeedWhenInspire = 6000 | ||||
| addHpWhenEncourage = basicHp / 4 | |||||
| addHpWhenEncourage = basicHp // 4 | |||||
| checkIntervalWhenShowTime = 200 | checkIntervalWhenShowTime = 200 | ||||
| addAddictionPer100msWhenShowTime = 300 | addAddictionPer100msWhenShowTime = 300 | ||||
| @@ -159,14 +159,14 @@ class Teacher: | |||||
| moveSpeed = (int)(0.9 * Constants.basicStudentSpeed) | moveSpeed = (int)(0.9 * Constants.basicStudentSpeed) | ||||
| maxHp = (int)(10.0 * Constants.basicHp) | maxHp = (int)(10.0 * Constants.basicHp) | ||||
| maxAddiction = (int)(10.0 * Constants.basicMaxGamingAddiction) | maxAddiction = (int)(10.0 * Constants.basicMaxGamingAddiction) | ||||
| LearnSpeed = (int)(0.0 * Constants.basicLearnSpeed) | |||||
| LearnSpeed = (int)( Constants.basicLearnSpeed* 50//123) | |||||
| EncourageSpeed = (int)(0.8 * Constants.basicEncourageSpeed) | EncourageSpeed = (int)(0.8 * Constants.basicEncourageSpeed) | ||||
| concealment = 0.5 * Constants.basicConcealment | concealment = 0.5 * Constants.basicConcealment | ||||
| alertnessRadius = (int)(0.5 * Constants.basicStudentAlertnessRadius) | |||||
| viewRange = (int)(0.9 * Constants.basicStudentViewRange) | |||||
| alertnessRadius = (int)(Constants.basicStudentAlertnessRadius * 2 // 3) | |||||
| viewRange = (int)(0.8 * Constants.basicStudentViewRange) | |||||
| speedOfOpeningOrLocking = (int)(1.0 * Constants.basicSpeedOfOpeningOrLocking) | speedOfOpeningOrLocking = (int)(1.0 * Constants.basicSpeedOfOpeningOrLocking) | ||||
| speedOfClimbingThroughWindows = (int)( | speedOfClimbingThroughWindows = (int)( | ||||
| 0.5 * Constants.basicStudentSpeedOfClimbingThroughWindows | |||||
| Constants.basicStudentSpeedOfClimbingThroughWindows* 1000 // 1222 | |||||
| ) | ) | ||||
| speedOfOpenChest = (int)(1.0 * Constants.basicSpeedOfOpenChest) | speedOfOpenChest = (int)(1.0 * Constants.basicSpeedOfOpenChest) | ||||
| @@ -188,35 +188,33 @@ class StraightAStudent: | |||||
| class Robot: | class Robot: | ||||
| moveSpeed = (int)(1.0 * Constants.basicStudentSpeed) | |||||
| maxHp = (int)(0.4 * Constants.basicHp) | |||||
| moveSpeed = (int)(0.9 * Constants.basicStudentSpeed) | |||||
| maxHp = (int)(0.3 * Constants.basicHp) | |||||
| maxAddiction = (int)(0.0 * Constants.basicMaxGamingAddiction) | maxAddiction = (int)(0.0 * Constants.basicMaxGamingAddiction) | ||||
| LearnSpeed = (int)(1.0 * Constants.basicLearnSpeed) | |||||
| LearnSpeed = (int)(0.7 * Constants.basicLearnSpeed) | |||||
| EncourageSpeed = 0 | EncourageSpeed = 0 | ||||
| concealment = 1.0 * Constants.basicConcealment | |||||
| alertnessRadius = (int)(1.0 * Constants.basicStudentAlertnessRadius) | |||||
| viewRange = (int)(1.0 * Constants.basicStudentViewRange) | |||||
| speedOfOpeningOrLocking = (int)(1.0 * Constants.basicSpeedOfOpeningOrLocking) | |||||
| speedOfClimbingThroughWindows = (int)( | |||||
| 0.0016 * Constants.basicStudentSpeedOfClimbingThroughWindows | |||||
| ) | |||||
| speedOfOpenChest = (int)(1.0 * Constants.basicSpeedOfOpenChest) | |||||
| concealment = 0.8 * Constants.basicConcealment | |||||
| alertnessRadius = (int)(0.0 * Constants.basicStudentAlertnessRadius) | |||||
| viewRange = (int)(0.0 * Constants.basicStudentViewRange) | |||||
| speedOfOpeningOrLocking = (int)(0.0 * Constants.basicSpeedOfOpeningOrLocking) | |||||
| speedOfClimbingThroughWindows = 1 | |||||
| speedOfOpenChest = (int)(0.8 * Constants.basicSpeedOfOpenChest) | |||||
| class TechOtaku: | class TechOtaku: | ||||
| moveSpeed = (int)(0.75 * Constants.basicStudentSpeed) | |||||
| moveSpeed = (int)(0.96 * Constants.basicStudentSpeed) | |||||
| maxHp = (int)(0.9 * Constants.basicHp) | maxHp = (int)(0.9 * Constants.basicHp) | ||||
| maxAddiction = (int)(1.1 * Constants.basicMaxGamingAddiction) | |||||
| LearnSpeed = (int)(1.1 * Constants.basicLearnSpeed) | |||||
| EncourageSpeed = (int)(0.9 * Constants.basicEncourageSpeed) | |||||
| concealment = 1.0 * Constants.basicConcealment | |||||
| maxAddiction = (int)(1.0 * Constants.basicMaxGamingAddiction) | |||||
| LearnSpeed = (int)(0.9 * Constants.basicLearnSpeed) | |||||
| EncourageSpeed = (int)(1.0 * Constants.basicEncourageSpeed) | |||||
| concealment = 1.1 * Constants.basicConcealment | |||||
| alertnessRadius = (int)(1.0 * Constants.basicStudentAlertnessRadius) | alertnessRadius = (int)(1.0 * Constants.basicStudentAlertnessRadius) | ||||
| viewRange = (int)(0.9 * Constants.basicStudentViewRange) | viewRange = (int)(0.9 * Constants.basicStudentViewRange) | ||||
| speedOfOpeningOrLocking = (int)(1.0 * Constants.basicSpeedOfOpeningOrLocking) | speedOfOpeningOrLocking = (int)(1.0 * Constants.basicSpeedOfOpeningOrLocking) | ||||
| speedOfClimbingThroughWindows = (int)( | speedOfClimbingThroughWindows = (int)( | ||||
| 0.75 * Constants.basicStudentSpeedOfClimbingThroughWindows | |||||
| 0.9 * Constants.basicStudentSpeedOfClimbingThroughWindows | |||||
| ) | ) | ||||
| speedOfOpenChest = (int)(1.0 * Constants.basicSpeedOfOpenChest) | |||||
| speedOfOpenChest = (int)(0.88 * Constants.basicSpeedOfOpenChest) | |||||
| class Sunshine: | class Sunshine: | ||||
| @@ -241,12 +239,22 @@ class CanBeginToCharge: | |||||
| class BecomeInvisible: | class BecomeInvisible: | ||||
| skillCD = (int)(4 * Constants.commonSkillCD / 3) | |||||
| skillCD = (int)(4 * Constants.commonSkillCD // 3) | |||||
| durationTime = (int)(Constants.commonSkillTime) | durationTime = (int)(Constants.commonSkillTime) | ||||
| class Punish: | class Punish: | ||||
| skillCD = (int)(1.0 * Constants.commonSkillCD) | |||||
| skillCD = (int)(1.5 * Constants.commonSkillCD) | |||||
| durationTime = (int)(0.0 * Constants.commonSkillTime) | |||||
| class SparksNSplash: | |||||
| skillCD = (int)(1.5 * Constants.commonSkillCD) | |||||
| durationTime = (int)(1.0 * Constants.commonSkillTime) | |||||
| class HaveTea: | |||||
| skillCD = (int)(3 * Constants.commonSkillCD) | |||||
| durationTime = (int)(0.0 * Constants.commonSkillTime) | durationTime = (int)(0.0 * Constants.commonSkillTime) | ||||
| @@ -271,7 +279,7 @@ class Howl: | |||||
| class ShowTime: | class ShowTime: | ||||
| skillCD = (int)(8 * Constants.commonSkillCD / 3) | |||||
| skillCD = (int)(8 * Constants.commonSkillCD // 3) | |||||
| durationTime = (int)(1.0 * Constants.commonSkillTime) | durationTime = (int)(1.0 * Constants.commonSkillTime) | ||||
| @@ -286,7 +294,7 @@ class UseKnife: | |||||
| class UseRobot: | class UseRobot: | ||||
| skillCD = (int)(0.0017 * Constants.commonSkillCD) | |||||
| skillCD = (int)(2 * Constants.commonSkillCD // 30) | |||||
| durationTime = (int)(0.0 * Constants.commonSkillTime) | durationTime = (int)(0.0 * Constants.commonSkillTime) | ||||
| @@ -296,8 +304,8 @@ class WriteAnswers: | |||||
| class SummonGolem: | class SummonGolem: | ||||
| skillCD = (int)(1.0 * Constants.commonSkillCD) | |||||
| durationTime = (int)(0.0 * Constants.commonSkillTime) | |||||
| skillCD = (int)(Constants.commonSkillCD * 4 // 3) | |||||
| durationTime = (int)(6.0 * Constants.commonSkillTime) | |||||
| class CommonAttackOfTricker: | class CommonAttackOfTricker: | ||||
| @@ -306,7 +314,7 @@ class CommonAttackOfTricker: | |||||
| ap = Constants.basicApOfTricker | ap = Constants.basicApOfTricker | ||||
| Speed = Constants.basicBulletMoveSpeed | Speed = Constants.basicBulletMoveSpeed | ||||
| IsRemoteAttack = False | IsRemoteAttack = False | ||||
| CastTime = BulletAttackRange * 1000 / Speed | |||||
| CastTime = BulletAttackRange * 1000 // Speed | |||||
| Backswing = Constants.basicBackswing | Backswing = Constants.basicBackswing | ||||
| RecoveryFromHit = Constants.basicRecoveryFromHit | RecoveryFromHit = Constants.basicRecoveryFromHit | ||||
| cd = Constants.basicBackswing | cd = Constants.basicBackswing | ||||
| @@ -316,32 +324,45 @@ class CommonAttackOfTricker: | |||||
| class FlyingKnife: | class FlyingKnife: | ||||
| BulletBombRange = 0 | BulletBombRange = 0 | ||||
| BulletAttackRange = Constants.basicRemoteAttackRange * 13 | BulletAttackRange = Constants.basicRemoteAttackRange * 13 | ||||
| ap = Constants.basicApOfTricker * 4 / 5 | |||||
| Speed = Constants.basicBulletMoveSpeed * 25 / 10 | |||||
| ap = Constants.basicApOfTricker * 4 // 5 | |||||
| Speed = Constants.basicBulletMoveSpeed * 25 // 10 | |||||
| IsRemoteAttack = True | IsRemoteAttack = True | ||||
| CastTime = Constants.basicCastTime * 4 / 5 | |||||
| CastTime = Constants.basicCastTime * 6 // 5 | |||||
| Backswing = 0 | Backswing = 0 | ||||
| RecoveryFromHit = 0 | RecoveryFromHit = 0 | ||||
| cd = Constants.basicBackswing / 2 | |||||
| cd = Constants.basicBackswing * 3 // 4 | |||||
| maxBulletNum = 1 | maxBulletNum = 1 | ||||
| class BombBomb: | class BombBomb: | ||||
| BulletBombRange = Constants.basicBulletBombRange | BulletBombRange = Constants.basicBulletBombRange | ||||
| BulletAttackRange = Constants.basicAttackShortRange | BulletAttackRange = Constants.basicAttackShortRange | ||||
| ap = Constants.basicApOfTricker * 6 / 5 | |||||
| Speed = Constants.basicBulletMoveSpeed * 30 / 37 | |||||
| ap = Constants.basicApOfTricker * 6 // 5 | |||||
| Speed = Constants.basicBulletMoveSpeed * 30 // 37 | |||||
| IsRemoteAttack = False | IsRemoteAttack = False | ||||
| CastTime = BulletAttackRange * 1000 / Speed | |||||
| Backswing = Constants.basicRecoveryFromHit | |||||
| CastTime = BulletAttackRange * 1000 // Speed | |||||
| Backswing = Constants.basicBackswing * 3 // 2 | |||||
| RecoveryFromHit = Constants.basicRecoveryFromHit | RecoveryFromHit = Constants.basicRecoveryFromHit | ||||
| cd = Constants.basicCD | cd = Constants.basicCD | ||||
| maxBulletNum = 1 | maxBulletNum = 1 | ||||
| class JumpyDumpty: | class JumpyDumpty: | ||||
| BulletBombRange = Constants.basicBulletBombRange / 2 | |||||
| BulletAttackRange = Constants.basicRemoteAttackRange * 2 | |||||
| BulletBombRange = Constants.basicBulletBombRange // 2 | |||||
| BulletAttackRange = Constants.basicAttackShortRange * 16 / 22 | |||||
| ap = (int)(Constants.basicApOfTricker * 0.6) | ap = (int)(Constants.basicApOfTricker * 0.6) | ||||
| Speed = Constants.basicBulletMoveSpeed * 43 / 37 | |||||
| Speed = Constants.basicBulletMoveSpeed * 43 // 37 | |||||
| IsRemoteAttack = False | IsRemoteAttack = False | ||||
| class Strike: | |||||
| BulletBombRange = 0 | |||||
| BulletAttackRange = Constants.basicAttackShortRange | |||||
| ap = Constants.basicApOfTricker * 16 // 5 | |||||
| Speed = Constants.basicBulletMoveSpeed * 125 // 148 | |||||
| IsRemoteAttack = False | |||||
| CastTime = Constants.basicCastTime * 16 // 25 | |||||
| Backswing = Constants.basicBackswing | |||||
| RecoveryFromHit = Constants.basicRecoveryFromHit | |||||
| cd = Constants.basicBackswing | |||||
| maxBulletNum = 1 | |||||
| @@ -147,8 +147,8 @@ start python .\CAPI\python\PyAPI\main.py -I 127.0.0.1 -P 8888 -p 0 -d -o -w | |||||
| | 1 | Athlete | | | 1 | Athlete | | ||||
| | 2 | Teacher | | | 2 | Teacher | | ||||
| | 3 | StraightAStudent | | | 3 | StraightAStudent | | ||||
| | 4 | Robot(目前未实现所有功能) | | |||||
| | 5 | TechOtaku(目前未实现所有功能) | | |||||
| | 4 | Robot | | |||||
| | 5 | TechOtaku | | |||||
| | 6 | Sunshine | | | 6 | Sunshine | | ||||
| * 捣蛋鬼 | * 捣蛋鬼 | ||||
| @@ -22,6 +22,7 @@ v1.6 | |||||
| - 增强为“可以攻击未写完的作业” | - 增强为“可以攻击未写完的作业” | ||||
| - 增强为“可以攻击使门被打开(可以重新被锁上)” | - 增强为“可以攻击使门被打开(可以重新被锁上)” | ||||
| - 小炸弹JumpyDumpty | - 小炸弹JumpyDumpty | ||||
| - 攻击距离改为1600 | |||||
| - 小炸弹不受道具增益影响 | - 小炸弹不受道具增益影响 | ||||
| - 修改为“小炸弹与自己无碰撞体积” | - 修改为“小炸弹与自己无碰撞体积” | ||||
| - strike(新增) | - strike(新增) | ||||
| @@ -31,7 +32,7 @@ v1.6 | |||||
| | 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike | | | 攻击(子弹)类型 |搞蛋鬼的一般攻击CommonAttackOfTricker|飞刀FlyingKnife | 蹦蹦炸弹BombBomb | 小炸弹JumpyDumpty | strike | | ||||
| | :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- | | | :--------------------- | :---------------------| :--------------------- | :--------------------- | :--------------------- | :--------------------- | | ||||
| | 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 | | | 子弹爆炸范围 | 0 | 0 | 2000 | 1000 | 0 | | ||||
| | 子弹攻击距离 | 2200 | 78000 | 2200 | 4400 | 2000 | | |||||
| | 子弹攻击距离 | 2200 | 78000 | 2200 | 1600 | 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 | | ||||
| @@ -51,7 +52,6 @@ v1.6 | |||||
| - Teacher | - Teacher | ||||
| - 学习速度由0改为50 | - 学习速度由0改为50 | ||||
| - 警戒范围由7500改为10000 | - 警戒范围由7500改为10000 | ||||
| - 视野范围由9000降为8000 | |||||
| - 翻窗速度改为1000 | - 翻窗速度改为1000 | ||||
| - 特质: | - 特质: | ||||
| - 扣血则得分100×受到伤害/基本伤害(1500000) | - 扣血则得分100×受到伤害/基本伤害(1500000) | ||||
| @@ -60,7 +60,7 @@ v1.6 | |||||
| - “使用瞬间,在**视野距离/3范围内(不是可视范围)的**翻窗、开锁门、攻击前后摇、**使用技能期间**的捣蛋鬼会被眩晕(3070+**500***已受伤害/基本伤害(1500000))ms” | - “使用瞬间,在**视野距离/3范围内(不是可视范围)的**翻窗、开锁门、攻击前后摇、**使用技能期间**的捣蛋鬼会被眩晕(3070+**500***已受伤害/基本伤害(1500000))ms” | ||||
| - 技能喝茶(HaveTea)(新增) | - 技能喝茶(HaveTea)(新增) | ||||
| - CD:90s | - CD:90s | ||||
| - 在有队友受过伤的情况下,使用瞬间,向当前方向瞬移3000(可以穿墙),如果会碰撞则失败。 | |||||
| - 使用瞬间,向额外参数/1000.0的角度瞬移3000(可以穿墙),如果会碰撞则失败。 | |||||
| - Robot(新增) | - Robot(新增) | ||||
| - 无技能 | - 无技能 | ||||
| - 特性 | - 特性 | ||||
| @@ -71,14 +71,14 @@ v1.6 | |||||
| - 不可使用道具(可以捡起和扔道具) | - 不可使用道具(可以捡起和扔道具) | ||||
| - TechOtaku(新增) | - TechOtaku(新增) | ||||
| - 一名TechOtaku最多可以在场上同时最多拥有3个Robot,无法共享视野 | - 一名TechOtaku最多可以在场上同时最多拥有3个Robot,无法共享视野 | ||||
| 0. SummonGolem | |||||
| 1. SummonGolem | |||||
| - CD:40s,持续时间:6s | - CD:40s,持续时间:6s | ||||
| - 在持续时间中,学生进入人物状态进入UsingSpecialSkill(不能移动),进入其他状态会导致制作机器人失败。 | - 在持续时间中,学生进入人物状态进入UsingSpecialSkill(不能移动),进入其他状态会导致制作机器人失败。 | ||||
| - 在持续时间中,学生面前生成道具CraftingBench;学生进入其他状态或该道具被碰撞后,CraftingBench消失且制作机器人失败。 | - 在持续时间中,学生面前生成道具CraftingBench;学生进入其他状态或该道具被碰撞后,CraftingBench消失且制作机器人失败。 | ||||
| - 持续时间结束后,道具CraftingBench所在位置生成一个Robot,CraftingBench消失 | - 持续时间结束后,道具CraftingBench所在位置生成一个Robot,CraftingBench消失 | ||||
| - TechOtaku的Robot的PlayerId = TechOtaku的PlayerId + n×5(一局游戏理论人数),其中1<=n<=3(自己的n为0) | - TechOtaku的Robot的PlayerId = TechOtaku的PlayerId + n×5(一局游戏理论人数),其中1<=n<=3(自己的n为0) | ||||
| - 新造的Robot的PlayerId的n总是尽量小 | - 新造的Robot的PlayerId的n总是尽量小 | ||||
| 1. UseRobot | |||||
| 2. UseRobot | |||||
| - CD:2s,持续时间:0s | - CD:2s,持续时间:0s | ||||
| - 输入额外参数PlayerID,切换到要使用的角色。 | - 输入额外参数PlayerID,切换到要使用的角色。 | ||||
| - 切换到其他角色时,自己进入UsingSkill状态。 | - 切换到其他角色时,自己进入UsingSkill状态。 | ||||
| @@ -94,7 +94,7 @@ v1.6 | |||||
| | 勉励速度/ms | 80 | 90 | 100 | 120 | 0 | 100 | | | 勉励速度/ms | 80 | 90 | 100 | 120 | 0 | 100 | | ||||
| | 隐蔽度 | 0.5 | 0.9 | 0.9 | 0.8 | 0.8 | 1.1 | | | 隐蔽度 | 0.5 | 0.9 | 0.9 | 0.8 | 0.8 | 1.1 | | ||||
| | 警戒范围 | 10000 | 15000 | 13500 | 15000 | 0 | 15000 | | | 警戒范围 | 10000 | 15000 | 13500 | 15000 | 0 | 15000 | | ||||
| | 视野范围 | 8000 | 11000 | 9000 | 10000 | 0 | 9000 | | |||||
| | 视野范围 | 9000 | 11000 | 9000 | 10000 | 0 | 9000 | | |||||
| | 开锁门速度/ms | 5000 | 5000 | 5000 | 3500 | 0 | 5000 | | | 开锁门速度/ms | 5000 | 5000 | 5000 | 3500 | 0 | 5000 | | ||||
| | 翻窗速度/ms | 1000 | 1466 | 1018 | 1222 | 1 | 1100 | | | 翻窗速度/ms | 1000 | 1466 | 1018 | 1222 | 1 | 1100 | | ||||
| | 翻箱速度/ms | 1250 | 1250 | 1250 | 1125 | 1000 | 1100 | | | 翻箱速度/ms | 1250 | 1250 | 1250 | 1125 | 1000 | 1100 | | ||||
| @@ -44,5 +44,10 @@ | |||||
| - fix:修复了InSpire会给Tricker加速的问题 | - fix:修复了InSpire会给Tricker加速的问题 | ||||
| - fix:修复了开锁门的bug | - fix:修复了开锁门的bug | ||||
| # 5月19日15:00更新 | |||||
| - docs:更新了 游戏机制与平衡性调整更新草案.pdf | |||||
| - hotfix:修复了移动状态设置错误 | |||||
| # 最新更新 | # 最新更新 | ||||
| - feat:Assassin、Teacher已调整 | |||||
| - docs:更新了 游戏机制与平衡性调整更新草案.pdf | - docs:更新了 游戏机制与平衡性调整更新草案.pdf | ||||
| @@ -165,7 +165,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 * 2; | |||||
| public override double AttackDistance => GameData.basicAttackShortRange * 16 / 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; | ||||
| @@ -14,7 +14,7 @@ namespace GameClass.GameObj | |||||
| protected int ap; | protected int ap; | ||||
| public int AP | public int AP | ||||
| { | { | ||||
| get => Interlocked.CompareExchange(ref ap, 0, 1); | |||||
| get => Interlocked.CompareExchange(ref ap, 0, 0); | |||||
| } | } | ||||
| public void AddAP(int addAp) | public void AddAP(int addAp) | ||||
| { | { | ||||
| @@ -52,7 +52,7 @@ namespace GameClass.GameObj | |||||
| public Bullet(Character player, int radius, XY Position) : | public Bullet(Character player, int radius, XY Position) : | ||||
| base(Position, radius, GameObjType.Bullet) | base(Position, radius, GameObjType.Bullet) | ||||
| { | { | ||||
| this.canMove = true; | |||||
| this.ReSetCanMove(true); | |||||
| this.MoveSpeed = this.Speed; | this.MoveSpeed = this.Speed; | ||||
| this.hasSpear = player.TryUseSpear(); | this.hasSpear = player.TryUseSpear(); | ||||
| this.Parent = player; | this.Parent = player; | ||||
| @@ -50,7 +50,7 @@ namespace GameClass.GameObj | |||||
| protected Character(XY initPos, int initRadius, CharacterType characterType) : | protected Character(XY initPos, int initRadius, CharacterType characterType) : | ||||
| base(initPos, initRadius, GameObjType.Character) | base(initPos, initRadius, GameObjType.Character) | ||||
| { | { | ||||
| this.canMove = true; | |||||
| this.ReSetCanMove(true); | |||||
| this.score = 0; | this.score = 0; | ||||
| this.buffManager = new BuffManager(); | this.buffManager = new BuffManager(); | ||||
| this.occupation = OccupationFactory.FindIOccupation(characterType); | this.occupation = OccupationFactory.FindIOccupation(characterType); | ||||
| @@ -362,8 +362,7 @@ namespace GameClass.GameObj | |||||
| lock (actionLock) | lock (actionLock) | ||||
| { | { | ||||
| if (playerState == PlayerStateType.Moving) | if (playerState == PlayerStateType.Moving) | ||||
| if (IsMoving == 1) return PlayerStateType.Moving; | |||||
| else return PlayerStateType.Null; | |||||
| return (IsMoving) ? PlayerStateType.Moving : PlayerStateType.Null; | |||||
| return playerState; | return playerState; | ||||
| } | } | ||||
| } | } | ||||
| @@ -540,27 +539,41 @@ namespace GameClass.GameObj | |||||
| ThreadNum.Release(); | ThreadNum.Release(); | ||||
| } | } | ||||
| case PlayerStateType.UsingSkill: | case PlayerStateType.UsingSkill: | ||||
| if (CharacterType == CharacterType.TechOtaku) | |||||
| { | { | ||||
| if (typeof(CraftingBench).IsInstanceOfType(whatInteractingWith)) | |||||
| switch (CharacterType) | |||||
| { | { | ||||
| try | |||||
| { | |||||
| ((CraftingBench)whatInteractingWith!).StopSkill(); | |||||
| case 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); | |||||
| } | |||||
| } | |||||
| case CharacterType.Assassin: | |||||
| if (value == PlayerStateType.Moving) return StateNum; | |||||
| else | |||||
| { | |||||
| TryDeleteInvisible(); | |||||
| return ChangePlayerState(value, gameObj); | |||||
| } | |||||
| default: | |||||
| return ChangePlayerState(value, gameObj); | return ChangePlayerState(value, gameObj); | ||||
| } | |||||
| finally | |||||
| { | |||||
| ThreadNum.Release(); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| if (value != PlayerStateType.UsingSkill) | |||||
| ((UseRobot)FindActiveSkill(ActiveSkillType.UseRobot)).NowPlayerID = (int)playerID; | |||||
| } | } | ||||
| } | } | ||||
| return ChangePlayerState(value, gameObj); | |||||
| default: | default: | ||||
| return ChangePlayerState(value, gameObj); | return ChangePlayerState(value, gameObj); | ||||
| } | } | ||||
| @@ -581,17 +594,9 @@ namespace GameClass.GameObj | |||||
| { | { | ||||
| lock (actionLock) | lock (actionLock) | ||||
| { | { | ||||
| MoveReaderWriterLock.EnterWriteLock(); | |||||
| try | |||||
| { | |||||
| canMove = false; | |||||
| isRemoved = true; | |||||
| } | |||||
| finally | |||||
| { | |||||
| MoveReaderWriterLock.ExitWriteLock(); | |||||
| } | |||||
| playerState = playerStateType; | |||||
| TryToRemove(); | |||||
| ReSetCanMove(false); | |||||
| SetPlayerState(playerStateType); | |||||
| position = GameData.PosWhoDie; | position = GameData.PosWhoDie; | ||||
| } | } | ||||
| } | } | ||||
| @@ -29,40 +29,23 @@ namespace GameClass.GameObj | |||||
| protected XY facingDirection = new(1, 0); | protected XY facingDirection = new(1, 0); | ||||
| public abstract XY FacingDirection { get; } | public abstract XY FacingDirection { get; } | ||||
| protected bool canMove; | |||||
| public abstract bool CanMove { get; } | public abstract bool CanMove { get; } | ||||
| public abstract bool IsRigid { get; } | public abstract bool IsRigid { get; } | ||||
| public abstract ShapeType Shape { get; } | public abstract ShapeType Shape { get; } | ||||
| protected bool isRemoved = false; | |||||
| public virtual bool IsRemoved | |||||
| protected int isRemoved = 0; | |||||
| public bool IsRemoved | |||||
| { | { | ||||
| get | get | ||||
| { | { | ||||
| gameObjReaderWriterLock.EnterReadLock(); | |||||
| try | |||||
| { | |||||
| return isRemoved; | |||||
| } | |||||
| finally | |||||
| { | |||||
| gameObjReaderWriterLock.ExitReadLock(); | |||||
| } | |||||
| return (Interlocked.CompareExchange(ref isRemoved, 0, 0) == 1); | |||||
| } | } | ||||
| } | } | ||||
| public virtual void TryToRemove() | public virtual void TryToRemove() | ||||
| { | { | ||||
| gameObjReaderWriterLock.EnterWriteLock(); | |||||
| try | |||||
| { | |||||
| isRemoved = true; | |||||
| } | |||||
| finally | |||||
| { | |||||
| gameObjReaderWriterLock.ExitWriteLock(); | |||||
| } | |||||
| Interlocked.Exchange(ref isRemoved, 1); | |||||
| } | } | ||||
| public int Radius { get; } | public int Radius { get; } | ||||
| @@ -48,10 +48,10 @@ namespace GameClass.GameObj | |||||
| } | } | ||||
| private int isMoving = 0; | private int isMoving = 0; | ||||
| public int IsMoving | |||||
| public bool IsMoving | |||||
| { | { | ||||
| get => Interlocked.CompareExchange(ref isMoving, 0, 1); | |||||
| set => Interlocked.Exchange(ref isMoving, value); | |||||
| get => (Interlocked.CompareExchange(ref isMoving, 0, 0) == 1); | |||||
| set => Interlocked.Exchange(ref isMoving, value ? 1 : 0); | |||||
| } | } | ||||
| // 移动,改变坐标 | // 移动,改变坐标 | ||||
| @@ -62,15 +62,7 @@ namespace GameClass.GameObj | |||||
| { | { | ||||
| lock (actionLock) | lock (actionLock) | ||||
| { | { | ||||
| moveReaderWriterLock.EnterReadLock(); | |||||
| try | |||||
| { | |||||
| if (!canMove || isRemoved) return -1; | |||||
| } | |||||
| finally | |||||
| { | |||||
| moveReaderWriterLock.ExitReadLock(); | |||||
| } | |||||
| if (!CanMove || IsRemoved) return -1; | |||||
| if (stateNo != stateNum) return -1; | if (stateNo != stateNum) return -1; | ||||
| facingDirection = moveVec; | facingDirection = moveVec; | ||||
| this.position += moveVec; | this.position += moveVec; | ||||
| @@ -87,49 +79,15 @@ namespace GameClass.GameObj | |||||
| } | } | ||||
| } | } | ||||
| private int canMove; | |||||
| public override bool CanMove | public override bool CanMove | ||||
| { | { | ||||
| get | |||||
| { | |||||
| moveReaderWriterLock.EnterReadLock(); | |||||
| try | |||||
| { | |||||
| return canMove; | |||||
| } | |||||
| finally | |||||
| { | |||||
| moveReaderWriterLock.ExitReadLock(); | |||||
| } | |||||
| } | |||||
| get => (Interlocked.CompareExchange(ref canMove, 0, 0) == 1); | |||||
| } | } | ||||
| public void ReSetCanMove(bool value) | public void ReSetCanMove(bool value) | ||||
| { | { | ||||
| moveReaderWriterLock.EnterWriteLock(); | |||||
| try | |||||
| { | |||||
| canMove = value; | |||||
| } | |||||
| finally | |||||
| { | |||||
| moveReaderWriterLock.ExitWriteLock(); | |||||
| } | |||||
| } | |||||
| public override bool IsRemoved | |||||
| { | |||||
| get | |||||
| { | |||||
| moveReaderWriterLock.EnterReadLock(); | |||||
| try | |||||
| { | |||||
| return isRemoved; | |||||
| } | |||||
| finally | |||||
| { | |||||
| moveReaderWriterLock.ExitReadLock(); | |||||
| } | |||||
| } | |||||
| Interlocked.Exchange(ref canMove, (value ? 1 : 0)); | |||||
| } | } | ||||
| public bool IsAvailableForMove // 是否能接收移动指令 | public bool IsAvailableForMove // 是否能接收移动指令 | ||||
| @@ -138,15 +96,7 @@ namespace GameClass.GameObj | |||||
| { | { | ||||
| lock (actionLock) | lock (actionLock) | ||||
| { | { | ||||
| moveReaderWriterLock.EnterReadLock(); | |||||
| try | |||||
| { | |||||
| return isMoving == 0 && canMove && !isRemoved; | |||||
| } | |||||
| finally | |||||
| { | |||||
| moveReaderWriterLock.ExitReadLock(); | |||||
| } | |||||
| return !IsMoving && CanMove && !IsRemoved; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -157,7 +107,7 @@ namespace GameClass.GameObj | |||||
| /// </summary> | /// </summary> | ||||
| public int MoveSpeed | public int MoveSpeed | ||||
| { | { | ||||
| get => Interlocked.CompareExchange(ref moveSpeed, 0, 1); | |||||
| get => Interlocked.CompareExchange(ref moveSpeed, 0, 0); | |||||
| set => Interlocked.Exchange(ref moveSpeed, value); | set => Interlocked.Exchange(ref moveSpeed, value); | ||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -24,7 +24,7 @@ namespace GameClass.GameObj | |||||
| public Gadget(XY initPos, int radius = GameData.propRadius) : | public Gadget(XY initPos, int radius = GameData.propRadius) : | ||||
| base(initPos, radius, GameObjType.Gadget) | base(initPos, radius, GameObjType.Gadget) | ||||
| { | { | ||||
| this.canMove = false; | |||||
| this.ReSetCanMove(false); | |||||
| this.MoveSpeed = GameData.propMoveSpeed; | this.MoveSpeed = GameData.propMoveSpeed; | ||||
| } | } | ||||
| } | } | ||||
| @@ -17,7 +17,7 @@ namespace GameClass.GameObj | |||||
| public Item(XY initPos, int radius = GameData.propRadius) : | public Item(XY initPos, int radius = GameData.propRadius) : | ||||
| base(initPos, radius, GameObjType.Item) | base(initPos, radius, GameObjType.Item) | ||||
| { | { | ||||
| this.canMove = false; | |||||
| this.ReSetCanMove(false); | |||||
| this.MoveSpeed = 0; | this.MoveSpeed = 0; | ||||
| } | } | ||||
| } | } | ||||
| @@ -102,7 +102,7 @@ namespace GameEngine | |||||
| lock (obj.ActionLock) | lock (obj.ActionLock) | ||||
| { | { | ||||
| if (!obj.IsAvailableForMove) { EndMove(obj); return; } | if (!obj.IsAvailableForMove) { EndMove(obj); return; } | ||||
| obj.IsMoving = 1; | |||||
| obj.IsMoving = true; | |||||
| } | } | ||||
| new Thread | new Thread | ||||
| @@ -139,7 +139,7 @@ namespace GameEngine | |||||
| if (isEnded) | if (isEnded) | ||||
| { | { | ||||
| obj.IsMoving = 0; | |||||
| obj.IsMoving = false; | |||||
| EndMove(obj); | EndMove(obj); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -184,7 +184,7 @@ namespace GameEngine | |||||
| } | } | ||||
| if (isEnded) | if (isEnded) | ||||
| { | { | ||||
| obj.IsMoving = 0; | |||||
| obj.IsMoving = false; | |||||
| EndMove(obj); | EndMove(obj); | ||||
| return; | return; | ||||
| } | } | ||||
| @@ -224,7 +224,7 @@ namespace GameEngine | |||||
| } | } | ||||
| } while (flag); | } while (flag); | ||||
| } | } | ||||
| obj.IsMoving = 0; // 结束移动 | |||||
| obj.IsMoving = false; // 结束移动 | |||||
| EndMove(obj); | EndMove(obj); | ||||
| } | } | ||||
| } | } | ||||
| @@ -13,7 +13,6 @@ namespace Gaming | |||||
| { | { | ||||
| public static bool CanBeginToCharge(Character player) | public static bool CanBeginToCharge(Character player) | ||||
| { | { | ||||
| if ((!player.Commandable())) return false; | if ((!player.Commandable())) return false; | ||||
| ActiveSkill skill = player.FindActiveSkill(ActiveSkillType.CanBeginToCharge); | ActiveSkill skill = player.FindActiveSkill(ActiveSkillType.CanBeginToCharge); | ||||
| Debugger.Output(player, "can begin to charge!"); | Debugger.Output(player, "can begin to charge!"); | ||||
| @@ -93,19 +92,32 @@ namespace Gaming | |||||
| public static bool BecomeInvisible(Character player) | public static bool BecomeInvisible(Character player) | ||||
| { | { | ||||
| if ((!player.Commandable())) return false; | |||||
| ActiveSkill activeSkill = player.FindActiveSkill(ActiveSkillType.BecomeInvisible); | ActiveSkill activeSkill = player.FindActiveSkill(ActiveSkillType.BecomeInvisible); | ||||
| long stateNum = player.SetPlayerState(PlayerStateType.UsingSkill); | |||||
| if (stateNum == -1) | |||||
| { | |||||
| return false; | |||||
| } | |||||
| return ActiveSkillEffect(activeSkill, player, () => | return ActiveSkillEffect(activeSkill, player, () => | ||||
| { | { | ||||
| player.AddScore(GameData.ScoreBecomeInvisible); | player.AddScore(GameData.ScoreBecomeInvisible); | ||||
| player.AddInvisible(activeSkill.DurationTime); | player.AddInvisible(activeSkill.DurationTime); | ||||
| Debugger.Output(player, "become invisible!"); | Debugger.Output(player, "become invisible!"); | ||||
| }, | }, | ||||
| () => | |||||
| { }); | |||||
| () => | |||||
| { | |||||
| lock (player.ActionLock) | |||||
| { | |||||
| if (stateNum == player.StateNum) | |||||
| { | |||||
| player.SetPlayerStateNaturally(); | |||||
| } | |||||
| } | |||||
| } | |||||
| ); | |||||
| } | } | ||||
| public bool UseRobot(Character player, int robotID) | |||||
| public static bool UseRobot(Character player, int robotID) | |||||
| { | { | ||||
| if ((robotID - player.PlayerID) % GameData.numOfPeople != 0) return false; | if ((robotID - player.PlayerID) % GameData.numOfPeople != 0) return false; | ||||
| if ((robotID - (int)player.PlayerID) / GameData.numOfPeople < 0 || (robotID - (int)player.PlayerID) / GameData.numOfPeople > GameData.maxSummonedGolemNum) return false; | if ((robotID - (int)player.PlayerID) / GameData.numOfPeople < 0 || (robotID - (int)player.PlayerID) / GameData.numOfPeople > GameData.maxSummonedGolemNum) return false; | ||||
| @@ -261,8 +273,7 @@ namespace Gaming | |||||
| } | } | ||||
| craftingBench.ParentStateNum = stateNum; | craftingBench.ParentStateNum = stateNum; | ||||
| gameMap.Add(craftingBench); | gameMap.Add(craftingBench); | ||||
| /* | |||||
| */ | |||||
| return ActiveSkillEffect(activeSkill, player, () => | return ActiveSkillEffect(activeSkill, player, () => | ||||
| { | { | ||||
| }, | }, | ||||
| @@ -343,8 +354,8 @@ namespace Gaming | |||||
| || character.PlayerState == PlayerStateType.ClimbingThroughWindows) | || character.PlayerState == PlayerStateType.ClimbingThroughWindows) | ||||
| && XY.DistanceFloor3(character.Position, player.Position) <= player.ViewRange / 3) | && XY.DistanceFloor3(character.Position, player.Position) <= player.ViewRange / 3) | ||||
| { | { | ||||
| if (CharacterManager.BeStunned(character, GameData.timeOfGhostStunnedWhenPunish + GameData.factorOfTimeStunnedWhenPunish * (player.MaxHp - player.HP)) > 0) | |||||
| player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.timeOfGhostStunnedWhenPunish + GameData.factorOfTimeStunnedWhenPunish * (player.MaxHp - player.HP))); | |||||
| if (CharacterManager.BeStunned(character, GameData.timeOfGhostStunnedWhenPunish + GameData.factorOfTimeStunnedWhenPunish * (player.MaxHp - player.HP) / GameData.basicApOfGhost) > 0) | |||||
| player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.timeOfGhostStunnedWhenPunish + GameData.factorOfTimeStunnedWhenPunish * (player.MaxHp - player.HP) / GameData.basicApOfGhost)); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -359,6 +370,41 @@ namespace Gaming | |||||
| { }); | { }); | ||||
| } | } | ||||
| public bool HaveTea(Character player, int angle1000) | |||||
| { | |||||
| long stateNum = player.SetPlayerState(PlayerStateType.UsingSkill); | |||||
| if (stateNum == -1) | |||||
| { | |||||
| return false; | |||||
| } | |||||
| player.ThreadNum.WaitOne(); | |||||
| XY res = player.Position + new XY(angle1000 / 1000.0, GameData.distanceOfHaveTea); | |||||
| Debugger.Output(res.ToString()); | |||||
| if (actionManager.moveEngine.CheckCollision(player, res) != null) | |||||
| { | |||||
| player.ThreadNum.Release(); | |||||
| return false; | |||||
| } | |||||
| Debugger.Output("NO Collision!"); | |||||
| player.ReSetPos(res); | |||||
| lock (player.ActionLock) | |||||
| { | |||||
| if (player.StateNum == stateNum) | |||||
| { | |||||
| player.SetPlayerStateNaturally(); | |||||
| } | |||||
| } | |||||
| player.ThreadNum.Release(); | |||||
| return ActiveSkillEffect(player.FindActiveSkill(ActiveSkillType.HaveTea), player, () => | |||||
| { | |||||
| Debugger.Output(player, "have tea!"); | |||||
| }, | |||||
| () => | |||||
| { }); | |||||
| } | |||||
| public bool Rouse(Character player) | public bool Rouse(Character player) | ||||
| { | { | ||||
| if ((!player.Commandable())) return false; | if ((!player.Commandable())) return false; | ||||
| @@ -30,6 +30,8 @@ namespace Gaming | |||||
| return Encourage(character); | return Encourage(character); | ||||
| case ActiveSkillType.Punish: | case ActiveSkillType.Punish: | ||||
| return Punish(character); | return Punish(character); | ||||
| case ActiveSkillType.HaveTea: | |||||
| return HaveTea(character, parameter); | |||||
| case ActiveSkillType.JumpyBomb: | case ActiveSkillType.JumpyBomb: | ||||
| return JumpyBomb(character); | return JumpyBomb(character); | ||||
| case ActiveSkillType.SparksNSplash: | case ActiveSkillType.SparksNSplash: | ||||
| @@ -8,7 +8,7 @@ namespace Preparation.Interface | |||||
| { | { | ||||
| object ActionLock { get; } | object ActionLock { get; } | ||||
| public int MoveSpeed { get; } | public int MoveSpeed { get; } | ||||
| public int IsMoving { get; set; } | |||||
| public bool IsMoving { get; set; } | |||||
| public bool IsRemoved { get; } | public bool IsRemoved { get; } | ||||
| public bool IsAvailableForMove { get; } | public bool IsAvailableForMove { get; } | ||||
| public long StateNum { get; } | public long StateNum { get; } | ||||
| @@ -166,7 +166,7 @@ namespace Preparation.Interface | |||||
| public BulletType InitBullet => BulletType.Null; | public BulletType InitBullet => BulletType.Null; | ||||
| public List<ActiveSkillType> ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.Punish }); | |||||
| public List<ActiveSkillType> ListOfIActiveSkill => new(new ActiveSkillType[] { ActiveSkillType.Punish, ActiveSkillType.HaveTea }); | |||||
| public List<PassiveSkillType> ListOfIPassiveSkill => new(new PassiveSkillType[] { }); | public List<PassiveSkillType> ListOfIPassiveSkill => new(new PassiveSkillType[] { }); | ||||
| public const int fixSpeed = 50; | public const int fixSpeed = 50; | ||||
| @@ -181,7 +181,7 @@ namespace Preparation.Interface | |||||
| public const int alertnessRadius = GameData.basicStudentAlertnessRadius * 2 / 3; | public const int alertnessRadius = GameData.basicStudentAlertnessRadius * 2 / 3; | ||||
| public int AlertnessRadius => alertnessRadius; | public int AlertnessRadius => alertnessRadius; | ||||
| public int viewRange = GameData.basicStudentViewRange * 8 / 10; | |||||
| public int viewRange = GameData.basicStudentViewRange * 9 / 10; | |||||
| public int ViewRange => viewRange; | public int ViewRange => viewRange; | ||||
| public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking; | public int speedOfOpeningOrLocking = GameData.basicSpeedOfOpeningOrLocking; | ||||
| @@ -34,7 +34,7 @@ namespace Preparation.Interface | |||||
| { | { | ||||
| get | get | ||||
| { | { | ||||
| return Interlocked.CompareExchange(ref timeUntilActiveSkillAvailable, 0, 1); | |||||
| return Interlocked.CompareExchange(ref timeUntilActiveSkillAvailable, 0, 0); | |||||
| } | } | ||||
| set | set | ||||
| { | { | ||||
| @@ -47,7 +47,7 @@ namespace Preparation.Interface | |||||
| public int isBeingUsed = 0;//实为bool | public int isBeingUsed = 0;//实为bool | ||||
| public int IsBeingUsed | public int IsBeingUsed | ||||
| { | { | ||||
| get => Interlocked.CompareExchange(ref isBeingUsed, 0, 1); | |||||
| get => Interlocked.CompareExchange(ref isBeingUsed, 0, 0); | |||||
| set => Interlocked.Exchange(ref isBeingUsed, value); | set => Interlocked.Exchange(ref isBeingUsed, value); | ||||
| } | } | ||||
| } | } | ||||
| @@ -70,6 +70,12 @@ namespace Preparation.Interface | |||||
| public override int DurationTime => 0; | public override int DurationTime => 0; | ||||
| } | } | ||||
| public class HaveTea : ActiveSkill | |||||
| { | |||||
| public override int SkillCD => GameData.commonSkillCD * 3; | |||||
| public override int DurationTime => 0; | |||||
| } | |||||
| public class Rouse : ActiveSkill | public class Rouse : ActiveSkill | ||||
| { | { | ||||
| public override int SkillCD => GameData.commonSkillCD * 4; | public override int SkillCD => GameData.commonSkillCD * 4; | ||||
| @@ -163,7 +169,7 @@ namespace Preparation.Interface | |||||
| private int degreeOfMeditation = 0; | private int degreeOfMeditation = 0; | ||||
| public int DegreeOfMeditation | public int DegreeOfMeditation | ||||
| { | { | ||||
| get => Interlocked.CompareExchange(ref degreeOfMeditation, 0, 1); | |||||
| get => Interlocked.CompareExchange(ref degreeOfMeditation, 0, 0); | |||||
| set => Interlocked.Exchange(ref degreeOfMeditation, value); | set => Interlocked.Exchange(ref degreeOfMeditation, value); | ||||
| } | } | ||||
| } | } | ||||
| @@ -245,6 +251,8 @@ namespace Preparation.Interface | |||||
| return new CanBeginToCharge(); | return new CanBeginToCharge(); | ||||
| case ActiveSkillType.Punish: | case ActiveSkillType.Punish: | ||||
| return new Punish(); | return new Punish(); | ||||
| case ActiveSkillType.HaveTea: | |||||
| return new HaveTea(); | |||||
| case ActiveSkillType.JumpyBomb: | case ActiveSkillType.JumpyBomb: | ||||
| return new JumpyBomb(); | return new JumpyBomb(); | ||||
| case ActiveSkillType.SparksNSplash: | case ActiveSkillType.SparksNSplash: | ||||
| @@ -284,6 +292,8 @@ namespace Preparation.Interface | |||||
| return ActiveSkillType.Inspire; | return ActiveSkillType.Inspire; | ||||
| case Punish: | case Punish: | ||||
| return ActiveSkillType.Punish; | return ActiveSkillType.Punish; | ||||
| case HaveTea: | |||||
| return ActiveSkillType.HaveTea; | |||||
| case JumpyBomb: | case JumpyBomb: | ||||
| return ActiveSkillType.JumpyBomb; | return ActiveSkillType.JumpyBomb; | ||||
| case SparksNSplash: | case SparksNSplash: | ||||
| @@ -214,8 +214,9 @@ namespace Preparation.Utility | |||||
| public const int timeOfStudentStunnedWhenCharge = 2090; | public const int timeOfStudentStunnedWhenCharge = 2090; | ||||
| public const int timeOfGhostStunnedWhenPunish = 3070; | public const int timeOfGhostStunnedWhenPunish = 3070; | ||||
| public const int factorOfTimeStunnedWhenPunish = 500 / basicApOfGhost; | |||||
| public const int factorOfScoreWhenTeacherAttacked = 100;//每个 | |||||
| public const int factorOfTimeStunnedWhenPunish = 500; | |||||
| public const int factorOfScoreWhenTeacherAttacked = 100; | |||||
| public const int distanceOfHaveTea = 3000; | |||||
| public const int timeOfGhostSwingingAfterHowl = 800; | public const int timeOfGhostSwingingAfterHowl = 800; | ||||
| public const int timeOfStudentStunnedWhenHowl = 5500; | public const int timeOfStudentStunnedWhenHowl = 5500; | ||||