这是一份更新项目进度后的必读文件。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Commit中过多的内容请全体开发者在这里更新并留档。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2026/2/5
项目启动。

2026/2/13 DrDuck

1. 统一了所有的动画接口，完全弃用image_speed, 改用animation_spd
需要在所有create中手动定义，并在step中动画步骤位置image_index += animation_spd;
顺带更新了animation_end()函数，与新的动画系统适配，防止卡死

2. 新增set_sprite()函数，与名字一致，但会自动检测前后sprite是否一致
并决定是否将image_index归零，防止动画跳帧

3. 可以注意到gml的所有sprite都有独立的fps参数设置，之前设置为15.
gml内部会计算image_index += sprite_fps / game_fps * image_speed等等公式进行适配
所以画面结果没有问题，但是不便于后续维护与统一性
所以将所有sprite统一为60fps, 新的aniation_spd定义为0.25
除攀墙/跳跃等手动状态判断单帧动画，直接将fps设置为0

4. 重定义了玩家碰撞箱反馈逻辑，与父对象统一性，太过繁杂不加具体解释
简单概括，把每种攻击给玩家的反馈都打包进hitbox/create中的hit_feedback(_owner){...}

5. 修正了玩家状态机的命名规范。现在所有可能被赋值给state的函数名字都以state_起始
所有按帧执行的检测/更新逻辑往往以player_check_起始

6. 优化了敌人状态机，不详细展开

7. 我发现点右上角最大化代码窗口显然是更拟人的工作方案，不用把一堆窗口拖来拖去

8. 优化敌人碰撞箱逻辑，封装enemy_create_hitbox(x, y, ...)函数，详见EnemyStates
另外player的碰撞箱被设计为几个自带sprite和参数（例如hit_feedback）的object, 拥有共同父对象
因为player的击中逻辑和碰撞箱形状太过复杂，无法通过简单逻辑变幻得到
而enemy目前的碰撞箱全部为矩形，可以通过2*2的sprite拉伸位移得到
所以enemy统一创建oEnemyHitbox再为其赋不同的属性

9. 新增了oEnemyDummy自动受击反击，方便测试闪避等

10. 你可以接着写

2026/2/14 DrDuck

1. 改进敌人碰撞箱逻辑，将persist改为hitbox_type, "COLLISION", "BLADE",...
可以更方便地检测下劈/拼刀等逻辑

2. 重构rTest方便测试手感，原rTest -> rTest_backup

3. 暂时禁用player_dodge()与相关函数，方便测试
（dash，free，attacked处将调用注释掉）

4. 新增player_calc_gravity()函数，用于计算动态重力，增进手感
替代了原来的y_spd += global.g
此外将oInput的_jump_r改成_jump, 更适配现在的逻辑

5. 对玩家攻击状态机进行微调，使得攻击时可以转向
并销毁碰撞箱（这个还没写）

6. 在oGame中增加点击瞬移，方便调试

7. 需要优化check_hazard逻辑，现在会重复判定！（还没写）见2/15

8. 下劈落地需要回到state_free并销毁碰撞箱（还没写）见2/15

9. oEnemyHitbox的重心在center/middle, 导致玩家可能被向着错误方向击退
（试试站在oEnemyDummy正前方一点的位置攻击，不要闪躲）（还没写）见2/21

10. 计划明天弄一下跨房间？见2/15

11. 有个写了一半的oEnemyFlying, 先不要动

2026/2/15 Dr.Duck

1. 优化check_hazard逻辑，功能实现没问题但不够优雅
而且极端情况可能会出问题，仍需优化

2. 统一了check_attacked与check_hazard逻辑
都通过status_update抓取当前碰撞物体，而非在check中定义临时变量

3. 下劈太简单可能是因为碰撞箱可视化
亲测把刺和刀全部改为美术资源将难一些
所以暂时不再改重力系数等参数

4. 上下劈使用一个碰撞箱导致了击退和玩家反馈错误（未修）
例如上劈会使玩家向上飞起

5. 当state_attack被强制打断（回身/冲刺取消后摇，下劈落地）时
需要及时销毁碰撞箱
用current_hb动态维护当前普通攻击碰撞箱
通过在status_update中检测state != state_attack及时销毁

6. 下劈落地回到state_free并销毁碰撞箱，已解决

7. 喜报！！！跨房间初步逻辑已完成！！
通过oDoor的target_room, door_id, target_door_id，与global的同名变量，
以及PlayerStates的check/enter/exit_room函数、内置enter room事件实现了逻辑链路闭环。
具体参见上述代码。
oDoor用蓝色条形sprite指示。

8. 今日询问Gemini：
类银通常直接在房间编辑器中调试房间物品位置，鉴于可视化和精度等原因。
其他游戏通常采用的"oRoomManager"等obj在此类作品中仅用于管理维护某些特殊物品的存在性
例如一次性收集品，剧情boss等
其余物品/enemy直接在room editor中放置即可
若有obj根据房间需要特定初始参数，例如oDoor, 直接在editor中选中inst, 覆盖var def即可

9. 新开了一个rTest_2, 原测试房间更名为rTest_1

2026/2/16 DrDuck

1. 除夕快乐！

2. 今天召集了四位开发人员进行首次会议，宣布项目启动。
这太帅了

2026/2/17 DrDuck

1. 新增rTitle作为起始房间，初始inst为oMain

2. 新增oMain作为主要管理者，其生命周期贯穿整个游戏
并将oInput归入oMain
此外，将oGame更名为oInGameManager

3. 新增oParentInteractive作为所有可互动obj的父类

4. 新增oSavePoint并进行存档相关内容调试

5. 句柄优先级相关代码好像有些问题。明天解决。已解决&优化

6. 在名为SL的script中新增三个函数
get_default_save_data() 负责抓取玩家初始参数
save_game_to_disk() 负责存档
load_game_from_disk() 负责读档

7. 新增一些global变量，举出几例
global.save_data是存储待存档信息的多层结构体
global.player是游戏内玩家inst_id
鉴于gml的obj和inst转换尚不明确，此变量和相似变量为快速找到指定关键inst而提出
稍后优化

8. 注意今日代码存档相关有巨量未完成部分，慎重运行修改！！明天解决！！见2/18

2025/2/18 DrDuck

1. 之后所有测试请用vk_escape在rTitle房间退出，与标准游戏流程相符。
特别是在做存读档相关测试时，一定不要用alt+f4/任务管理器/右上角等方式退出。
可以在rTitle房间看到更为详尽的操作指导。

2. 考虑加入音乐/粒子效果接口。先不做。

3. 状态机优化写到一半，先别动

4. 读存档大概搞定了

2025/2/19 DrDuck

1. 昨天日志没写完……
补充：加入了screen_shake(_mag)函数控制摄像机震动

2. 新增state_death与state_focus使玩家可以正确地回血、回蓝、死亡

3. 试图新增oInventory时因底层代码过于智障而不慎触发句柄连锁反应
已全部优化修复，可作为新学期授课范例，详见另一份日志～

4. 浅尝粒子效果，习得基本原理
击中敌人效果作为半成品留在代码中，后续优化

5. 新增sh_flash的shader实现击中敌人平滑闪白

2025/2/21 DrDuck

1. 由于铸币操作导致2/20版本掉进虚空，难以界定当前所在版本
同时丢失部分2/19日志
尝试按照记忆补救时间线中……

2. 将更新日志分为两个独立部分，方便整理阅读

3. 终于优化了敌人碰撞箱逻辑！（2/20丢失内容，补充完毕）
将全部敌人碰撞箱归类为middle/center, bottom/center, middle/left三类
本来写了详细说明的，懒得补了

4. 玩家死掉会掉落一定Credit和（蓝槽上限），需要收尸才能捡回（2/20丢失内容，补充完毕）

2025/2/23 DrDuck

1. 昨天鸽了一天……