You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

规则Logic.md 25 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. # 规则Logic
  2. ## 通过接口了解规则喵
  3. ### 地图
  4. - 地图为矩形区域,地图上的游戏对象坐标为(x, y),且x和y均为整数。
  5. - **x坐标轴正方向竖直向下,y坐标轴正方向水平向右**;
  6. - **极坐标以x坐标轴为极轴,角度逆时针为正方向**。
  7. - 地图由50 * 50个格子构成,其中每个格子代表1000 * 1000的正方形。每个格子的编号(CellX,CellY)可以计算得到:
  8. - 略
  9. - 地图上格子有自己的区域类型:陆地、墙、草地、教室、校门、隐藏校门、门、窗、箱子
  10. ### 移动
  11. - `std::future<bool> Move(int64_t timeInMilliseconds, double angleInRadian)`:移动,`timeInMilliseconds` 为移动时间,单位毫秒;`angleInRadian` 表示移动方向,单位弧度,使用极坐标,**竖直向下方向为x轴,水平向右方向为y轴**
  12. ### 使用技能
  13. - `std::future<bool> UseSkill(int32_t skillID)`:使用对应序号的主动技能
  14. ### 人物
  15. - 人物半径为800
  16. - 人物共有17种不可叠加的状态:
  17. 1. (可)移动状态
  18. - `std::future<bool> EndAllAction()`:可以使处在下者八项状态中的玩家终止交互
  19. 2. 学习
  20. 3. 被勉励
  21. 4. 在勉励
  22. 5. 开或锁门
  23. 6. 翻箱
  24. 7. 使用技能
  25. 8. 开启校门
  26. 9. 唤醒他人中
  27. - 之后八项为不可行动状态
  28. 10. 被唤醒中
  29. 11. 沉迷
  30. 12. 退学
  31. 13. 毕业
  32. 14. 被眩晕
  33. 15. 前摇
  34. 16. 后摇
  35. 17. 翻窗
  36. ### 攻击
  37. - `std::future<bool> Attack(double angleInRadian)`:`angleInRadian`为攻击方向,无论近战远程均产生bullet表示攻击
  38. - 攻击类型CommonAttackOfGhost攻击未写完的作业,会造成对应攻击力的损坏
  39. - 捣蛋鬼攻击交互状态或前后摇的学生,将使学生眩晕4.3s
  40. | 攻击类型 |搞蛋鬼的一般攻击CommonAttackOfGhost| 飞刀FlyingKnife | 蹦蹦炸弹BombBomb | JumpyDumpty |
  41. | :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- |
  42. | 子弹爆炸范围 | 0 | 0 | 1000 | 500 |
  43. | 子弹攻击距离 | 1100 | 39000 | 1100 | 2200 |
  44. | 攻击力 | 1500000 | 1,200,000 | 1,800,000 | 900000 |
  45. | 移动速度/s | 3700 | 7,400 | 3000 | 4300 |
  46. | 前摇(ms) | 297 | 500 | 366 | 0 |
  47. |未攻击至目标时的后摇(ms)| 800 | 0 | 3700 | 0 |
  48. |攻击至目标时的后摇(ms)| 3700 | 0 | 3700 | 0 |
  49. | CD(ms) | 800 | 400 | 3000 | - |
  50. | 最大子弹容量 | 1 | 1 | 1 | - |
  51. ### 交互
  52. - 除了翻窗,交互目标与交互者在一个九宫格方可交互
  53. - 交互进度每毫秒增加对应交互速度的值
  54. - 作业,门,箱子完成/开启进度达到10000000为完成
  55. #### 破译与逃脱
  56. - 每张地图都有10间教室,学生需要完成其中的**7间**教室的作业,才可以开启任意校门。
  57. - `std::future<bool> StartLearning()`:在教室(旁)做作业
  58. - `std::future<bool> StartOpenGate()`:开启校门,所需时间为18秒,开启的进度不清空
  59. - 当**3间**教室的作业完成时,隐藏校门在3-5个刷新点之一随机显现;当只剩1名学生时,隐藏校门自动打开。
  60. - `std::future<bool> Graduate()`:从开启的校门或隐藏校门毕业。
  61. #### 勉励(Treat)
  62. - `std::future<bool> StartTreatMate(int64_t mateID)`:勉励对应玩家ID的学生,当达到被勉励程度达到1500000或者最大学习毅力与当前学习毅力的差值时,勉励完成,学生毅力增加对应被勉励程度。
  63. - 勉励中断时,被勉励程度保留;遭到攻击时被勉励程度清空
  64. #### 沉迷与唤醒
  65. - 当学生学习毅力归零时,学生原地进入沉迷状态,每毫秒增加1沉迷度
  66. - `std::future<bool> StartRescueMate(int64_t mateID)`:唤醒对应玩家ID的沉迷的学生,需要时间1秒,之后学习毅力恢复至1/2。沉迷程度不清空。
  67. - 进入沉迷状态时,如果学生原沉迷程度在(0,该玩家最大沉迷度/3)中,沉迷程度直接变为其最大沉迷度/3;原沉迷程度在[其最大沉迷度/3,其最大沉迷度x2/3)中,沉迷程度直接变为其最大沉迷度x2/3;原沉迷程度大于其最大沉迷度x2/3,从游戏中出局;
  68. - 当学生沉迷程度达到其最大沉迷程度时,从游戏中出局
  69. #### 门
  70. - 门分别属于三个教学区:三教,五教,六教
  71. - 拥有对应教学区的钥匙才能开锁对应的门
  72. - 锁门过程中,门所在格子内有人会使锁门过程中断
  73. - `std::future<bool> OpenDoor()`:开门
  74. - `std::future<bool> CloseDoor()`:关门
  75. #### 窗
  76. - `std::future<bool> SkipWindow()`:翻窗时玩家应当在窗前后左右一个格子内
  77. #### 箱子
  78. - `std::future<bool> StartOpenChest()`:开箱后将有2个随机道具掉落在玩家位置。
  79. ### Bgm
  80. 1. 不详的感觉:捣蛋鬼进入(学生的警戒半径/捣蛋鬼的隐蔽度)时,学生收到;捣蛋鬼距离学生越近,Bgm音量越大。bgmVolume=(警戒半径/二者距离)
  81. 2. 期待搞事的感觉:学生进入(捣蛋鬼的警戒半径/学生的隐蔽度)时,捣蛋鬼收到;捣蛋鬼距离学生越近,Bgm音量越大。bgmVolume=(警戒半径/可被发觉的最近的学生距离)
  82. 3. 学习的声音: 捣蛋鬼警戒半径内有人学习时收到;bgmVolume=(警戒半径x学习进度百分比)/二者距离
  83. ### 队内信息
  84. - `std::future<bool> SendMessage(int64_t, std::string)`:给同队的队友发送消息。第一个参数指定发送的对象,第二个参数指定发送的内容。
  85. - `bool HaveMessage()`:是否有队友发来的尚未接收的信息。
  86. - `std::pair<int64_t, std::string> GetMessage()`:从玩家ID为第一个参数的队友获取信息。
  87. ### 线程控制
  88. - `bool Wait()`:阻塞当前线程,直到下一次消息更新时继续运行。
  89. ### 信息获取
  90. `std::vector<std::shared_ptr<const THUAI6::Student>> GetStudents() const` :返回所有可视学生的信息。
  91. `std::vector<std::shared_ptr<const THUAI6::Tricker>> GetTrickers() const` :返回所有可视捣蛋鬼的信息。
  92. `std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const` :返回所有可视道具的信息。
  93. `std::vector<std::vector<THUAI6::PlaceType>> GetFullMap() const`:返回整张地图的地形信息。
  94. - 下面的 CellX 和 CellY 指的是地图格数,而非绝对坐标。
  95. `THUAI6::PlaceType GetPlaceType(int32_t cellX, int32_t cellY)` :返回某一位置场地种类信息。场地种类详见 structure.h 。
  96. `bool IsDoorOpen(int32_t cellX, int32_t cellY) const`:查询特定位置门是否开启
  97. `int32_t GetChestProgress(int32_t cellX, int32_t cellY) const`:查询特定位置箱子开启进度
  98. `int32_t GetGateProgress(int32_t cellX, int32_t cellY) const`:查询特定位置校门开启进度
  99. `int32_t GetClassroomProgress(int32_t cellX, int32_t cellY) const`:查询特定位置教室作业完成进度
  100. `THUAI6::HiddenGateState GetHiddenGateState(int32_t cellX, int32_t cellY) const`::查询特定位置隐藏校门状态
  101. `int32_t GetDoorProgress(int32_t cellX, int32_t cellY) const`:查询特定位置门开启状态
  102. `std::shared_ptr<const THUAI6::GameInfo> GetGameInfo() const`:查询当前游戏状态
  103. `std::vector<int64_t> GetPlayerGUIDs() const`:获取所有玩家的GUID
  104. `int GetFrameCount() const`:获取目前所进行的帧数
  105. `std::shared_ptr<const THUAI6::Tricker> GetSelfInfo() const`或`std::shared_ptr<const THUAI6::Student> GetSelfInfo() const`:获取自己的信息
  106. ### 道具
  107. - 玩家最多同时拥有三个道具
  108. - `bool PickProp(THUAI6::PropType prop)`捡起与自己处于同一个格子(cell)的道具。
  109. - `bool UseProp(THUAI6::PropType prop)`使用对应类型的道具
  110. - `bool ThrowProp(THUAI6::PropType prop)`将对应类型的道具扔在原地
  111. | 道具 | 对学生增益 | [学生得分条件] | 对搞蛋鬼增益 | [搞蛋鬼得分条件] |
  112. | :-------- | :-------------------------------------- | :-----------------| :-------------------------------------- |:-----------------|
  113. | Key3 | 能开启3教的门 |不得分| 能开启3教的门 |不得分|
  114. | Key5 | 能开启5教的门 |不得分| 能开启5教的门 |不得分|
  115. | Key6 | 能开启6教的门 |不得分| 能开启6教的门 |不得分|
  116. | AddSpeed | 提高移动速度,持续10s |得分?| 提高移动速度,持续10s |得分?|
  117. | AddLifeOrClairaudience |若在10s内Hp归零,该增益消失以使Hp保留100|在10s内Hp归零,得分? |10秒内下一次攻击增伤1800000|10秒内有一次攻击,得分? |
  118. | AddHpOrAp |回血1500000 | 回血成功 | 10秒内下一次攻击增伤1800000|10秒内有一次攻击,得分? |
  119. | ShieldOrSpear | 10秒内能抵挡一次伤害 | 10秒内成功抵挡一次伤害 |10秒内下一次攻击能破盾,如果对方无盾,则增伤900000| 10秒内攻击中学生|
  120. | RecoveryFromDizziness | 使用瞬间从眩晕状态中恢复 | 成功从眩晕状态中恢复,得分?|使用瞬间从眩晕状态中恢复 | 成功从眩晕状态中恢复,得分?|
  121. ## 得分
  122. ### 屠夫
  123. - [Tricker对Student造成伤害时,得伤害*100/基本伤害(1500000)分。]
  124. - *[使用道具/技能得分]*
  125. - 不同道具/技能有不同得分
  126. - 使Student进入沉迷状态时,得50分。
  127. - 使人类进入眩晕状态时,得25分。
  128. - 每淘汰一个Student,得1000分
  129. - 主动解除眩晕,得15分
  130. - 开锁门
  131. ### 人类
  132. - 修机得分
  133. - 人类每修n%的电机,得n分
  134. - 修完一台电机,额外得?分
  135. - [牵制得分]
  136. - 使用道具/技能得分
  137. - 不同道具/技能有不同得分
  138. - 使屠夫进入特殊状态得分(如使之眩晕)
  139. - 救人
  140. - 勉励
  141. - 逃脱
  142. - 解除眩晕
  143. - 开锁门
  144. ## 职业与技能
  145. ### 捣蛋鬼
  146. | 捣蛋鬼职业 | 基本量 | Assassin | Klee | 喧哗者ANoisyPerson |
  147. | :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- |
  148. | 移动速度/s | 1,503 | 1.1 | 1 | 1.07 |
  149. | 隐蔽度 | 1.0 | 1.5 | 1 | 0.8 |
  150. | 警戒范围 | 17000 | 1.3 | 1 | 0.9 |
  151. | 视野范围 | 15000 | 1.2 | 1 | 1 |
  152. | 开锁门速度 | 4000 | 1 | 1 | 1 |
  153. | 翻窗速度 | 1270 | 1 | 1 | 1.1 |
  154. | 翻箱速度 | 1000 | 1 | 1.1 | 1 |
  155. #### 刺客
  156. - 普通攻击为 搞蛋鬼的一般攻击
  157. - 主动技能
  158. - 隐身
  159. - CD:60s 持续时间:6s
  160. - 在持续时间内玩家隐身
  161. - 使用瞬间得分
  162. - 使用飞刀
  163. - CD:30s 持续时间:1s
  164. - 在持续时间内,攻击类型变为飞刀
  165. - 不直接得分
  166. #### Klee
  167. - 普通攻击为 搞蛋鬼的一般攻击
  168. - 主动技能
  169. - 蹦蹦炸弹
  170. - CD:15s 持续时间:3s
  171. - 在持续时间内,攻击类型变为蹦蹦炸弹
  172. - 当蹦蹦炸弹因为碰撞而爆炸,向子弹方向上加上90°,270° 发出2个小炸弹
  173. - 2个小炸弹运动停止前会因为碰撞爆炸,停止运动后学生碰撞会造成眩晕3.07s
  174. - 不直接得分,通过眩晕等获得对应得分
  175. #### 喧哗者
  176. - 普通攻击为 搞蛋鬼的一般攻击
  177. - 主动技能
  178. - 嚎叫
  179. - CD:25s
  180. - 使用瞬间,在视野半径范围内(不是可视区域)的学生被眩晕6110ms,自己进入3070ms的后摇
  181. - 通过眩晕获得对应得分
  182. - 特性
  183. - 在场所有学生Bgm系统被设为无用的值
  184. ### 学生(&老师)
  185. | 学生职业 | 基本量 | 教师Teacher | 健身狂Athlete | 学霸StraightAStudent | 开心果Sunshine |
  186. | :------------ | :--------------------- | :--------------------- | :--------------------- | :--------------------- | :--------------------- |
  187. | 移动速度 | 1,270 | 3 / 4 | 1.1 | 0.8 | 1 |
  188. | 最大毅力值 | 3000000 | 10 | 1 | 1.1 | 32/30 |
  189. | 最大沉迷度 | 60000 | 10 | 0.9 | 1.3 | 1.1 |
  190. | 学习一科速度/s | 1.23% | 0 | 0.6 | 1.1 | 1 |
  191. | 勉励速度 | 100 | 0.7 | 0.8 | 0.8 | 2 |
  192. | 隐蔽度 | 1.0 | 0.5 | 0.9 | 0.9 | 1 |
  193. | 警戒范围 | 15000 | 0.5 | 1 | 0.9 | 1 |
  194. | 视野范围 | 10000 | 0.9 | 1.1 | 0.9 | 1 |
  195. | 开锁门速度 | 4000 | 1 | 1 | 1 | 1 |
  196. | 翻窗速度 | 1270 | 0.5 | 1.2 | 10/12 | 1 |
  197. | 翻箱速度 | 1000 | 1 | 1 | 1 | 1 |
  198. #### 运动员
  199. - 主动技能
  200. - 冲撞
  201. - CD:24s 持续时间:5s
  202. - 在持续时间内,速度变为三倍,期间撞到捣蛋鬼,会导致捣蛋鬼眩晕7.22s,学生眩晕2.09s
  203. - 通过眩晕获得对应得分
  204. #### 教师
  205. - 主动技能
  206. - 惩罚
  207. - CD:30s
  208. - 使用瞬间,在可视范围内的使用技能状态中、攻击前后摇的捣蛋鬼会被眩晕(3070)ms,
  209. - 通过眩晕获得对应得分
  210. - 特性
  211. - 教师无法获得牵制得分
  212. #### 学霸
  213. - 特性
  214. - 冥想
  215. - 当玩家处于可接受指令状态且不在修机时,会积累学习进度,速度为0.3%/ms
  216. - 受到攻击(并非伤害)或学习或进入不可接受治疗状态(包括翻窗)学习进度清零
  217. - 主动技能5
  218. - 写答案
  219. - CD:30s
  220. - 使用瞬间,对于可互动范围内的一台电机增加这个学习进度
  221. - 通过修机获得对应得分
  222. #### 开心果
  223. - 主动技能
  224. - 唤醒
  225. - CD:60s
  226. - 使用瞬间,唤醒可视范围内一个沉迷中的人
  227. - 通过唤醒获得对应得分
  228. - 勉励
  229. - CD:60s
  230. - 使用瞬间,勉励完成可视范围内一个毅力不足的人
  231. - 通过勉励获得对应得分
  232. - 鼓舞
  233. - CD:60s
  234. - 使用瞬间,可视范围内学生(包括自己)获得持续6秒的1.6倍速Buff
  235. - 每鼓舞一个学生得分10
  236. ## 辅助函数
  237. `static inline int CellToGrid(int cell) noexcept`:将地图格数 cell 转换为绝对坐标grid。
  238. `static inline int GridToCell(int grid) noexcept`:将绝对坐标 grid 转换为地图格数cell。
  239. 下面为用于DEBUG的输出函数,选手仅在开启Debug模式的情况下可以使用
  240. ~~~c
  241. void Print(std::string str) const;
  242. void PrintStudent() const;
  243. void PrintTricker() const;
  244. void PrintProp() const;
  245. void PrintSelfInfo() const;
  246. ~~~
  247. ## 接口一览
  248. ~~~csharp
  249. // 指挥本角色进行移动,`timeInMilliseconds` 为移动时间,单位为毫秒;`angleInRadian` 表示移动的方向,单位是弧度,使用极坐标——竖直向下方向为 x 轴,水平向右方向为 y 轴
  250. virtual std::future<bool> Move(int64_t timeInMilliseconds, double angleInRadian) = 0;
  251. // 向特定方向移动
  252. virtual std::future<bool> MoveRight(int64_t timeInMilliseconds) = 0;
  253. virtual std::future<bool> MoveUp(int64_t timeInMilliseconds) = 0;
  254. virtual std::future<bool> MoveLeft(int64_t timeInMilliseconds) = 0;
  255. virtual std::future<bool> MoveDown(int64_t timeInMilliseconds) = 0;
  256. // 捡道具、使用技能
  257. virtual std::future<bool> PickProp(THUAI6::PropType prop) = 0;
  258. virtual std::future<bool> UseProp(THUAI6::PropType prop) = 0;
  259. virtual std::future<bool> UseSkill(int32_t skillID) = 0;
  260. virtual std::future<bool> Attack(double angleInRadian) = 0;
  261. virtual std::future<bool> OpenDoor() = 0;
  262. virtual std::future<bool> CloseDoor() = 0;
  263. virtual std::future<bool> SkipWindow() = 0;
  264. virtual std::future<bool> StartOpenGate() = 0;
  265. virtual std::future<bool> StartOpenChest() = 0;
  266. virtual std::future<bool> EndAllAction() = 0;
  267. // 发送信息、接受信息,注意收消息时无消息则返回nullopt
  268. virtual std::future<bool> SendMessage(int64_t, std::string) = 0;
  269. [[nodiscard]] virtual bool HaveMessage() = 0;
  270. [[nodiscard]] virtual std::pair<int64_t, std::string> GetMessage() = 0;
  271. // 等待下一帧
  272. virtual std::future<bool> Wait() = 0;
  273. // 获取视野内可见的学生/捣蛋鬼的信息
  274. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Student>> GetStudents() const = 0;
  275. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Tricker>> GetTrickers() const = 0;
  276. // 获取视野内可见的道具信息
  277. [[nodiscard]] virtual std::vector<std::shared_ptr<const THUAI6::Prop>> GetProps() const = 0;
  278. // 获取地图信息,视野外的地图统一为Land
  279. [[nodiscard]] virtual std::vector<std::vector<THUAI6::PlaceType>> GetFullMap() const = 0;
  280. [[nodiscard]] virtual THUAI6::PlaceType GetPlaceType(int32_t cellX, int32_t cellY) const = 0;
  281. [[nodiscard]] virtual bool IsDoorOpen(int32_t cellX, int32_t cellY) const = 0;
  282. [[nodiscard]] virtual int32_t GetChestProgress(int32_t cellX, int32_t cellY) const = 0;
  283. [[nodiscard]] virtual int32_t GetGateProgress(int32_t cellX, int32_t cellY) const = 0;
  284. [[nodiscard]] virtual int32_t GetClassroomProgress(int32_t cellX, int32_t cellY) const = 0;
  285. [[nodiscard]] virtual THUAI6::HiddenGateState GetHiddenGateState(int32_t cellX, int32_t cellY) const = 0;
  286. [[nodiscard]] virtual int32_t GetDoorProgress(int32_t cellX, int32_t cellY) const = 0;
  287. [[nodiscard]] virtual std::shared_ptr<const THUAI6::GameInfo> GetGameInfo() const = 0;
  288. // 获取所有玩家的GUID
  289. [[nodiscard]] virtual std::vector<int64_t> GetPlayerGUIDs() const = 0;
  290. // 获取游戏目前所进行的帧数
  291. [[nodiscard]] virtual int GetFrameCount() const = 0;
  292. /*****选手可能用的辅助函数*****/
  293. // 获取指定格子中心的坐标
  294. [[nodiscard]] static inline int CellToGrid(int cell) noexcept
  295. {
  296. return cell * numOfGridPerCell + numOfGridPerCell / 2;
  297. }
  298. // 获取指定坐标点所位于的格子的 X 序号
  299. [[nodiscard]] static inline int GridToCell(int grid) noexcept
  300. {
  301. return grid / numOfGridPerCell;
  302. }
  303. // 用于DEBUG的输出函数,选手仅在开启Debug模式的情况下可以使用
  304. virtual void Print(std::string str) const = 0;
  305. virtual void PrintStudent() const = 0;
  306. virtual void PrintTricker() const = 0;
  307. virtual void PrintProp() const = 0;
  308. virtual void PrintSelfInfo() const = 0;
  309. };
  310. class IStudentAPI : public IAPI
  311. {
  312. public:
  313. /*****学生阵营的特定函数*****/
  314. virtual std::future<bool> StartLearning() = 0;
  315. virtual std::future<bool> StartTreatMate(int64_t mateID) = 0;
  316. virtual std::future<bool> StartRescueMate(int64_t mateID) = 0;
  317. virtual std::future<bool> Graduate() = 0;
  318. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Student> GetSelfInfo() const = 0;
  319. };
  320. class ITrickerAPI : public IAPI
  321. {
  322. public:
  323. /*****捣蛋鬼阵营的特定函数*****/
  324. [[nodiscard]] virtual std::shared_ptr<const THUAI6::Tricker> GetSelfInfo() const = 0;
  325. };
  326. ~~~
  327. ## 细则
  328. ### 特殊说明
  329. - 不加说明,这里“学生”往往包括职业“教师”
  330. ### 移动
  331. - 不鼓励选手面向地图编程,因为移动过程中你可以受到多种干扰使得移动结果不符合你的预期;因此建议小步移动,边移动边考虑之后的行为。
  332. - `bool MoveRight(uint32_t timeInMilliseconds)`即向右移动,`MoveLeft`、`MoveDown`、`MoveUp`同理
  333. ### 人物
  334. - 被唤醒或被勉励不属于交互状态,翻窗属于交互状态
  335. - EndAllAction()及Move指令调用数总和一帧内不超过10次
  336. ### 初始状态
  337. - 玩家出生点固定且一定为空地
  338. ### 道具
  339. - 使用钥匙相当于销毁
  340. ### 交互
  341. - 在指令仍在进行时,重复发出同一类型的交互指令是无效的,你需要先发出Stop指令终止进行的指令
  342. - 实际上唤醒或勉励不同的人是有效的
  343. ### 破译与逃脱
  344. - 隐藏校门与校门对于人有碰撞体积
  345. - 一个校门同时最多可以由一人开启
  346. ### 攻击
  347. - 每次学生受到攻击后会损失对应子弹的攻击力的学习毅力
  348. - 前摇期间攻击被打断时,子弹消失。
  349. - 此处,前摇指 从播放攻击动作开始 攻击者不能交互 的时间
  350. ### 沉迷与唤醒
  351. - 在被救时沉迷度不增加
  352. - 不能两人同时唤醒一个人
  353. ### 门
  354. - 每个教学区都有2把钥匙
  355. - 一扇门只允许同时一个人开锁门
  356. - 开锁门未完成前,门状态表现为原来的状态
  357. - 开锁门进度中断后清空
  358. ### 窗
  359. - 攻击可以穿过窗,道具可以在窗上
  360. - 翻越窗户是一种交互行为,翻窗一共有两个过程
  361. - 跳上窗:从当前位置到窗边缘中点,位置瞬移,时间=距离/爬窗速度。中断时,停留在原位置
  362. - 爬窗:从窗一侧边缘中点到另一侧格子中心,位置渐移,时间=距离/爬窗速度。中断时,停留在另一侧格子中心
  363. - 通常情况下捣蛋鬼翻越窗户的速度高于学生。
  364. - 有人正在翻越窗户时,其他玩家均不可以翻越该窗户。
  365. ### 箱子
  366. - 地图上有8个箱子
  367. - 同一时刻只允许一人进行开启
  368. - 未开启完成的箱子在下一次需要重新开始开启。
  369. - 箱子开启后其中道具才可以被观测和拿取
  370. - 箱子道具不刷新
  371. ### 信息获取
  372. - 查询对应物体状态时物体不存在则返回false
  373. ## 键鼠控制
  374. | 键位 | 效果 |
  375. | ------------ | ---------------------------------------------- |
  376. | W/NumPad8 | (Both)向上移动 |
  377. | S/NumPad2 | (Both)向下移动 |
  378. | D/NumPad6 | (Both)向右移动 |
  379. | A/NumPad4 | (Both)向左移动 |
  380. | J | (Tri)攻击,方向向上 |
  381. | 鼠标双击某点 | (Tri)攻击,方向与从Tricker指向该点的向量相同 |
  382. | K | (Stu)开始学习 |
  383. | R | (Stu)开始营救(陷入沉迷状态的同伴) |
  384. | T | (Stu)开始勉励(学习毅力下降的同伴) |
  385. | G | (Stu)发出毕业请求 |
  386. | H | (Stu)申请毕业(或称为开校门) |
  387. | O | (Both)开(教学楼)门 |
  388. | P | (Both)关(教学楼)门 |
  389. | U | (Both)翻窗 |
  390. | I | (Both)翻箱子 |
  391. | E | (Both)结束当前行动,回到Idle状态 |
  392. | F | (Both)随机捡起一个在周围的道具 |
  393. | C | (Both)随机扔下一个已经持有的道具 |
  394. | V | (Both)随机使用一个已经持有的道具 |
  395. | B | (Both)使用0号技能 |
  396. | N | (Both)使用1号技能 |
  397. | M | (Both)使用2号技能 |