规则Logic
说明
- 版本V2.0
- 该规则直接服务于Sever,并非选手版本
- 斜体表示Logic底层尚未(完全)实现
- []表示待决定
表示暂不实现
游戏简介
- 1位监管者对抗4位求生者的非对称竞技模式
- [本届THUAI电子系赛道为以4名同学和1名捣蛋鬼的求学与阻挠展开的非对称竞技模式,同学需要完成足够的家庭作业和考试,相互督促以避免沉迷娱乐生活,利用道具地形躲避捣蛋鬼的各种干扰诱惑,完成学业;捣蛋鬼则要极力阻止。]
- [我们的设计是一个非对称游戏,类似第五人格,分为学生、捣蛋鬼两个阵营。在游戏中,学生修完若干课程之后通过考试即可顺利毕业,捣蛋鬼试图干扰学生使其沉迷游戏,以致于无法修完规定课程,直至挂科、退学。]
[对于选手来说,需要提前制定好学生的学习方案以抵御对方捣蛋鬼的干扰,类似地,也需要制定好捣蛋鬼的行动策略以影响对方学生的学习,也即每队至少要写好两份代码以执行不同阵营的不同策略。]
[当一局比赛结束(场上的学生有且仅有两种状态:退学或毕业)时,分别记录双方总得分;之后双方换边进行下半场比赛。最终将每队的学生方、捣蛋鬼方的得分相加,比较总得分判断胜负。]
地图
- 地图为矩形区域,地图上的游戏对象坐标为(x, y),且x和y均为整数。x坐标轴正方向竖直向下,
- y坐标轴正方向水平向右;极坐标以x坐标轴为极轴,角度逆时针为正方向。
- 地图由50 * 50个格子构成,其中每个格子代表1000 * 1000的正方形。每个格子的编号(CellX,CellY)可以计算得到:
- 略
- 也就是说,地图实际大小是 50000 * 50000
- 地图上的每个格子有自己的区域类型:墙、草地、电机、出口、紧急出口、门、窗、箱子
- 出生点固定且一定为空地
游戏内的枚举类型、类与属性
- 底层实现中的属性,不代表界面全部都需要展示,也可能需要额外展示信息
- 只展示外部需要的属性,部分属性被省略
BgmType
- 枚举类BgmType
- 不详的感觉:监管者进入(求生者的警戒半径/监管者的隐蔽度)时,求生者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/二者距离)
- 期待搞事的感觉:求生者进入(监管者的警戒半径/求生者的隐蔽度)时,监管者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/可被发觉的最近的求生者距离)
- 修理电机的声音: 监管者警戒半径内有电机正在被修理时收到;bgmVolume=(警戒半径*电机修理程度/二者距离)/10300000
public enum BgmType
{
Null = 0,
GhostIsComing = 1,
StudentIsApproaching = 2,
GeneratorIsBeingFixed = 3,
}
技能
public enum ActiveSkillType // 主动技能
{
Null = 0,
BecomeInvisible = 1,
...
UseKnife = 5,
BeginToCharge = 6
}
public enum PassiveSkillType
{
Null = 0,
}
物体
- 位置
- 位置地形
- ID
- 类型
- 面向角度
- 形状
- 半径
- 是否可移动
- 是否在移动
- 移动速度
人物:物体
- 装弹CD
- 持有子弹数量
- 血量
- 最大血量
- 玩家状态(不可叠加)
public enum PlayerStateType
{
Null = 0,
IsAddicted = 1,
IsEscaped = 2,
IsSwinging = 3,//指后摇
IsDeceased = 4,
IsMoving = 5,
IsTreating = 6,
IsRescuing = 7,
IsFixing = 8,
IsTreated = 9,
IsRescued = 10,
IsStunned = 11,
IsTryingToAttack = 12,//指前摇
IsLockingTheDoor = 13,
IsOpeningTheChest = 14,
IsClimbingThroughWindows = 15,
IsUsingSpecialSkill = 16,
}
- 可执行指令的(不用给选手)
public bool Commandable() => (playerState != PlayerStateType.IsDeceased && playerState != PlayerStateType.IsEscaped
&& playerState != PlayerStateType.IsAddicted && playerState != PlayerStateType.IsRescuing
&& playerState != PlayerStateType.IsSwinging && playerState != PlayerStateType.IsTryingToAttack
&& playerState != PlayerStateType.IsClimbingThroughWindows && playerState != PlayerStateType.IsStunned);
- Bgm(字典)
- 得分
回血率/原始回血率
- 当前子弹类型
- 原始子弹类型
- 持有道具 (最多三个)(数组)
- 是否隐身
- 队伍ID
- 玩家ID
- 当前Buff
- 职业类型
- 拥有的被动技能(列表)
- 拥有的主动技能(列表)
- 各个主动技能CD(字典)
- 警戒半径
- double 隐蔽度
- 翻窗时间
- 开锁门时间
- 开箱时间
- 视野范围
学生:人物
- 修理电机速度
- 治疗速度
救人速度
自愈次数
- 沉迷游戏程度
- 最大沉迷游戏程度
- 被治疗程度
- (去)救援(别人)程度
搞蛋鬼:人物
无
队伍:
所有物:
子弹:所有物
- 子弹攻击范围
- 子弹爆炸范围
- 子弹攻击力
- 是否可以穿墙
- 是否可以爆炸
- 移动速度
- 子弹类型
爆炸中的子弹:物体
道具:所有物
被捡起的道具:物体
出口:物体
紧急出口:物体
墙:物体
窗:物体
箱子:物体
门:物体
- 属于那个教学区
- 是否锁上
- 开锁门进度
- 不提供是否可以锁上的属性
电机(建议称为homework):物体
行为逻辑
初始状态
交互
- 除了逃离,交互目标与交互者在一个九宫格内则为可交互
- 在指令仍在进行时,重复发出同一类型的交互指令是无效的,你需要先发出Stop指令终止进行的指令
破译与逃脱
- 每张地图都会刷新 9台电机,求生者需要破译其中的7台,并开启任意一个大门后从任意一个开启的大门- 逃脱,亦或者在只剩1名求生者的情况下从紧急出口逃脱;
- 求生者和监管者在靠近电机时,可以看到电机的破译进度条。
- 紧急出口会在电机破译完成3台的情况下在地图的3-5个固定紧急出口刷新点之一随机刷新。
- 当求生者只剩1名时,紧急出口盖将会自动打开,该求生者可从紧急出口逃脱。
- 开启大门所需时间为18秒。
- 大门开启的进度不清空
攻击
-
每次求生者收到攻击后会损失对应子弹的攻击力的血量
-
小部分求生者通过手持物可以获得一定程度反击监管者的手段,可使其丧失行动能力(称为击晕),但监管者不会永久丧失行动能力。
-
无论搞蛋鬼或学生,攻击时,从播放攻击动作到可以开始产生伤害的期间,称为前摇。(前摇阶段,搞蛋鬼产生通常为不可爆炸(部分搞蛋鬼能可以产生可爆炸)子弹(爆炸范围=0),[子弹大小待商榷],期间监管者攻击被打断时,子弹消失)(无论近战远程均产生子弹)
-
无论搞蛋鬼或学生,攻击后,通常会出现一段无伤害判定的攻击动作后置时间,称为后摇。击中物体时后摇更长
-
假如监管者攻击或一些监管者的特定技能击中正在交互的求生者,将使求生者眩晕
- 处于前摇或后摇
- 治疗或解救他人
- 修理电机
- 开锁门
- 翻窗
- 开启箱子
门
- 门分别属于三个教学区:三教,五教,六教
- 监管者或求生者都需要拿到对应教学区的钥匙才能打开或锁住对应的门
- 锁门和开门都需要一定时间,进出门为正常移动过程
- 门只有开、锁两种状态,锁住时门有碰撞体积
- 当门所在格子内有人时,无法锁门(必须从门外锁门)
- 锁门时其他人可以进入门所在格子,锁门过程中断
- 钥匙只会出现在箱子中,每个教学区都有2把钥匙
- 一扇门只允许同时一个人开锁门
- 开锁门未完成前,门状态表现为原来的状态
- 开锁门进度中断后清空
窗
- 求生者和监管者都可以翻越窗户,但通常情况下监管者翻越窗户的速度高于求生者。
- 在求生者或监管者正在翻越窗户时,其他玩家均不可以翻越该窗户。
- 窗始终有碰撞体积
- 翻越窗户是一种交互行为,执行时,实质是限定方向的减速运动
箱子
- 监管者和求生者都能与箱子交互,同一时刻只允许一人进行开启
- 开启箱子有不同概率获得不同道具。
- 开启箱子的基础持续时间为10秒。
- 未开启完成的箱子在下一次需要重新开始开启。
- 箱子开启后其中道具才可以被观测和拿取
- [箱子道具不刷新]
- [箱子不可被关闭]
- [箱子内道具最多两个]
道具
- 每次玩家试图捡起道具时,需要确保道具栏有空位
- indexing指道具栏数组下标从0开始
- 扔道具
public void ThrowProp(long playerID, int indexing)
- 使用道具
public void UseProp(long playerID,int indexing)
治疗
- 可行动的求生者可以对受伤的其他求生者进行治疗,治疗完成后会回复被治疗程度的血量。
- 治疗时每毫秒增加相当于治疗者治疗速度的被治疗程度
- 当达到被治疗程度达到1500000或者最大血量与当前血量的差值时,治疗结束。
- 治疗他人未完成时重新发出治疗指令是无效的(无论是否要求治疗同一人)
- 治疗中断时,被治疗程度保留;被治疗者遭到攻击时被治疗程度清空
沉迷
- 当求生者血量归零时,求生者自动原地进入沉迷状态,每毫秒增加1沉迷度
- 该求生者可由其他的求生者救下,救下后,血量恢复至1/2并可以重新行动。沉迷程度不清空。
- 进入沉迷状态时,如果求生者原本沉迷程度在【10003,30000】中,求生者沉迷程度直接变为30000
- 当求生者沉迷程度达到该玩家最大沉迷程度(学生有的属性)时,从游戏中出局
救人
- 一般情况下,救人时间为1秒。
- 不能两人同时救一个人