修复 LightGame 玩家地面抖动、动画切换异常并完善 spike/终点视觉

## 物理与动画(核心修复)

- PlayerController::update:地面状态下跳过 apply_gravity。之前每帧重力累入 velocity.y,sub_pixel_y_ 会缓慢累到 ≥1000 像素阈值,导致玩家下沉 1px 后被 collide_tilemap 推回,每隔几帧抖动一次。这是"动画机切不回 idle"的真正根因 —— 单帧 grounded=false 让状态切到 Falling,下一帧又回 Idle,视觉表现为 idle/fall 帧间歇错位。

- Physics2D::collide_tilemap:发生轴向推回时清掉对应 sub_pixel_x_/y_,防止小数残留在下一帧继续推进位置。
- Physics2D::is_grounded:feet 探测窗口(max.y..max.y+2)跨越的所有 tile 行都要扫描,而非只查 feet.min.y/ts 那一行。原写法在边界帧(feet.max.y 临时为 31n+0)会错把上一行空 tile 当判定行返回 false,触发上述的单帧 Falling 抖动。
- PlayerController::update:grounded && velocity.y >= 0 时无条件清零 velocity.y(不再要求 !was_grounded_),避免重力残留导致连续下沉。

## Spike 行为

- Physics2D::is_tile_solid:spike(tile id 4) 改为非实体,玩家可踩入触发死亡。原先 spike 与普通地块都被当 solid,玩家停在 spike 顶部不会死。
- PlayerController::check_death:spike 击杀区域收紧到 tile 底部 14px(视觉高度),不再用整 32px tile 误判。

## 关卡视觉(出生点 / 检查点 / 终点)

- LevelLoader:玩家出生点附近生成 flag 装饰对象;Checkpoint 触发器初始显示 checkpoint 精灵,被激活后由 LightGameApp 在 check_triggers 中替换为 flag 精灵;LevelComplete 触发器使用 checkpoint 精灵作为终点。
- LevelLoader 暴露 flag_sprite() 静态访问器,供 LightGameApp 触发激活时复用同一份 sprite 引用。

## 资源与配套

- 重新打包 tile_atlas(重新生成 generated/tile_atlas.h),更新 assets/tile/checkpoint.png、flag.png 的视觉素材。
- Level1Data、LevelEditor、LevelRenderer、GameObject、tests 跟随接口调整同步更新;game_engine_tests 重新编译通过。
This commit is contained in:
SepComet 2026-06-13 14:54:29 +08:00
parent 05d7d9783e
commit 254a8ce5c8
21 changed files with 849 additions and 238 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -777,258 +777,258 @@ static const uint16_t tile_atlas_pixels[] = {
0xFFFF, 0xFFFF, 0xFFFF, 0xFEE3, 0xFEE3, 0xFEE3, 0xFEE3, 0xFD51, 0xFD51, 0xFD51, 0x5ADF, 0x5ADF, 0x4A57, 0x4A57, 0x0845, 0x0845, 0xFFFF, 0xFFFF, 0xFFFF, 0xFEE3, 0xFEE3, 0xFEE3, 0xFEE3, 0xFD51, 0xFD51, 0xFD51, 0x5ADF, 0x5ADF, 0x4A57, 0x4A57, 0x0845, 0x0845,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000,
0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0x0000,
0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x20CD, 0x20CD, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000,
0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0xFFFE, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000,
0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFF2, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFF2, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000,
0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x8467, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x8467, 0x8467, 0xADF1, 0xADF1, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0xDF39, 0xDF39, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE,
0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xCCDB, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE,
0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE,
0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xE665, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0xE885,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xE885, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xE885, 0xE885, 0xE885, 0xE885, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xE885, 0xE885, 0x0000, 0x0000, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0001, 0x0001, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0xADF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x0000, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000, 0x0000,
0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x4A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0xFFFE, 0xFFFE,
0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0x8191, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000, 0x0000,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x0000, 0x0000,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0x4A53, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE, 0xFFFE,
0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD,

View File

@ -35,15 +35,13 @@ namespace LightGame
switch (type) switch (type)
{ {
case GameObjectType::Player: return "Player"; case GameObjectType::Player: return "Player";
case GameObjectType::StaticPlatform: return "StaticPlatform";
case GameObjectType::LightPlatform: return "LightPlatform"; case GameObjectType::LightPlatform: return "LightPlatform";
case GameObjectType::ShadowPlatform: return "ShadowPlatform"; case GameObjectType::ShadowPlatform: return "ShadowPlatform";
case GameObjectType::Hazard: return "Hazard";
case GameObjectType::Collectible: return "Collectible"; case GameObjectType::Collectible: return "Collectible";
case GameObjectType::Trigger: return "Trigger"; case GameObjectType::Trigger: return "Trigger";
case GameObjectType::Door: return "Door"; case GameObjectType::Door: return "Door";
} }
return "StaticPlatform"; return "Player";
} }
static const char* TriggerActionToString(TriggerAction action) static const char* TriggerActionToString(TriggerAction action)
@ -66,7 +64,7 @@ namespace LightGame
should_quit_(false), should_quit_(false),
current_tool_(Tool::TileBrush), current_tool_(Tool::TileBrush),
selected_tile_id_(1), selected_tile_id_(1),
selected_object_type_(GameObjectType::StaticPlatform), selected_object_type_(GameObjectType::Player),
selected_object_id_(0), selected_object_id_(0),
preview_light_level_(2048), preview_light_level_(2048),
show_grid_(true), show_grid_(true),
@ -177,7 +175,7 @@ namespace LightGame
const int32_t py = pointer->get_y(); const int32_t py = pointer->get_y();
const int32_t world_x = px + camera_.get_x(); const int32_t world_x = px + camera_.get_x();
const int32_t world_y = py + camera_.get_y(); const int32_t world_y = py - LightGame::LevelRenderer::kTopBlackBorder + camera_.get_y();
const int32_t tile_x = world_to_tile_x(world_x); const int32_t tile_x = world_to_tile_x(world_x);
const int32_t tile_y = world_to_tile_y(world_y); const int32_t tile_y = world_to_tile_y(world_y);
@ -230,11 +228,6 @@ namespace LightGame
obj.solid = false; obj.solid = false;
level_.set_spawn_point(obj.position); level_.set_spawn_point(obj.position);
break; break;
case GameObjectType::StaticPlatform:
obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts));
obj.solid = true;
obj.sprite = &spr_platform;
break;
case GameObjectType::LightPlatform: case GameObjectType::LightPlatform:
obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts));
obj.solid = false; obj.solid = false;
@ -253,11 +246,6 @@ namespace LightGame
obj.light_threshold = LightThreshold(1023, 3192); obj.light_threshold = LightThreshold(1023, 3192);
obj.sprite = &spr_door; obj.sprite = &spr_door;
break; break;
case GameObjectType::Hazard:
obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(0, ts / 2), Math::Vector2Int(ts, ts));
obj.solid = false;
obj.sprite = &spr_spike;
break;
case GameObjectType::Collectible: case GameObjectType::Collectible:
obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(ts / 4, ts / 4), Math::Vector2Int(ts * 3 / 4, ts * 3 / 4)); obj.collider = RenderData::BoundingBox2D(Math::Vector2Int(ts / 4, ts / 4), Math::Vector2Int(ts * 3 / 4, ts * 3 / 4));
obj.solid = false; obj.solid = false;
@ -337,11 +325,11 @@ namespace LightGame
for (int32_t x = start_x; x < end_x; x += ts) for (int32_t x = start_x; x < end_x; x += ts)
{ {
const int32_t sx = x - cam_x; const int32_t sx = x - cam_x;
ctx.draw_line(Math::Vector2Int(sx, 0), Math::Vector2Int(sx, screen_height_), grid_color); ctx.draw_line(Math::Vector2Int(sx, LightGame::LevelRenderer::kTopBlackBorder), Math::Vector2Int(sx, screen_height_), grid_color);
} }
for (int32_t y = start_y; y < end_y; y += ts) for (int32_t y = start_y; y < end_y; y += ts)
{ {
const int32_t sy = y - cam_y; const int32_t sy = y - cam_y + LightGame::LevelRenderer::kTopBlackBorder;
ctx.draw_line(Math::Vector2Int(0, sy), Math::Vector2Int(screen_width_, sy), grid_color); ctx.draw_line(Math::Vector2Int(0, sy), Math::Vector2Int(screen_width_, sy), grid_color);
} }
} }
@ -350,7 +338,7 @@ namespace LightGame
{ {
const Math::Vector2Int sp = level_.get_spawn_point(); const Math::Vector2Int sp = level_.get_spawn_point();
const int32_t sx = sp.x - camera_.get_x(); const int32_t sx = sp.x - camera_.get_x();
const int32_t sy = sp.y - camera_.get_y(); const int32_t sy = sp.y - camera_.get_y() + LightGame::LevelRenderer::kTopBlackBorder;
if (sx < -16 || sx > screen_width_ + 16 || sy < -16 || sy > screen_height_ + 16) return; if (sx < -16 || sx > screen_width_ + 16 || sy < -16 || sy > screen_height_ + 16) return;
const RenderData::Color color(0, 255, 0, 255); const RenderData::Color color(0, 255, 0, 255);
@ -365,7 +353,7 @@ namespace LightGame
const RenderData::BoundingBox2D box = obj->get_world_collider(); const RenderData::BoundingBox2D box = obj->get_world_collider();
const int32_t sx = box.min.x - camera_.get_x(); const int32_t sx = box.min.x - camera_.get_x();
const int32_t sy = box.min.y - camera_.get_y(); const int32_t sy = box.min.y - camera_.get_y() + LightGame::LevelRenderer::kTopBlackBorder;
const int32_t w = box.max.x - box.min.x; const int32_t w = box.max.x - box.min.x;
const int32_t h = box.max.y - box.min.y; const int32_t h = box.max.y - box.min.y;
@ -386,7 +374,7 @@ namespace LightGame
{ {
if (ImGui::MenuItem("New Level", "Ctrl+N")) if (ImGui::MenuItem("New Level", "Ctrl+N"))
{ {
new_level(25, 8, 32); new_level(32, 18, 32);
} }
if (ImGui::BeginMenu("Load Level")) if (ImGui::BeginMenu("Load Level"))
{ {
@ -438,7 +426,9 @@ namespace LightGame
if (current_tool_ == Tool::TileBrush) if (current_tool_ == Tool::TileBrush)
{ {
ImGui::Text("Tile Type"); ImGui::Text("Tile Type");
const char* tile_names[] = { "Empty", "Ground Top", "Ground Fill", "Platform", "Spike" }; const char* tile_names[] = {
"0 Empty", "1 Ground Top", "2 Ground Fill", "3 Platform", "4 Spike"
};
for (int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i)
{ {
if (ImGui::RadioButton(tile_names[i], selected_tile_id_ == i)) if (ImGui::RadioButton(tile_names[i], selected_tile_id_ == i))
@ -451,11 +441,9 @@ namespace LightGame
struct ObjEntry { GameObjectType type; const char* name; }; struct ObjEntry { GameObjectType type; const char* name; };
static const ObjEntry entries[] = { static const ObjEntry entries[] = {
{ GameObjectType::Player, "Player" }, { GameObjectType::Player, "Player" },
{ GameObjectType::StaticPlatform, "Platform" },
{ GameObjectType::LightPlatform, "Light Platform" }, { GameObjectType::LightPlatform, "Light Platform" },
{ GameObjectType::ShadowPlatform, "Shadow Platform" }, { GameObjectType::ShadowPlatform, "Shadow Platform" },
{ GameObjectType::Door, "Door" }, { GameObjectType::Door, "Door" },
{ GameObjectType::Hazard, "Hazard" },
{ GameObjectType::Collectible, "Collectible" }, { GameObjectType::Collectible, "Collectible" },
{ GameObjectType::Trigger, "Trigger" }, { GameObjectType::Trigger, "Trigger" },
}; };

View File

@ -10,10 +10,8 @@ namespace LightGame
enum class GameObjectType enum class GameObjectType
{ {
Player, Player,
StaticPlatform,
LightPlatform, LightPlatform,
ShadowPlatform, ShadowPlatform,
Hazard,
Collectible, Collectible,
Trigger, Trigger,
Door Door
@ -56,7 +54,7 @@ namespace LightGame
GameObject() GameObject()
: id(0), : id(0),
type(GameObjectType::StaticPlatform), type(GameObjectType::Player),
position(), position(),
velocity(), velocity(),
sprite(nullptr), sprite(nullptr),

View File

@ -20,6 +20,7 @@ namespace LightGame
static const RenderData::Sprite spr_shadow_platform_on = MakeTileSprite(&tile_atlas_image, 8, 32, 4); static const RenderData::Sprite spr_shadow_platform_on = MakeTileSprite(&tile_atlas_image, 8, 32, 4);
static const RenderData::Sprite spr_door_closed = MakeTileSprite(&tile_atlas_image, 9, 32, 4); static const RenderData::Sprite spr_door_closed = MakeTileSprite(&tile_atlas_image, 9, 32, 4);
static const RenderData::Sprite spr_coin = MakeTileSprite(&tile_atlas_image, 11, 32, 4); static const RenderData::Sprite spr_coin = MakeTileSprite(&tile_atlas_image, 11, 32, 4);
static const RenderData::Sprite spr_flag = MakeTileSprite(&tile_atlas_image, 12, 32, 4);
static const RenderData::Sprite spr_checkpoint = MakeTileSprite(&tile_atlas_image, 13, 32, 4); static const RenderData::Sprite spr_checkpoint = MakeTileSprite(&tile_atlas_image, 13, 32, 4);
} }
@ -59,13 +60,6 @@ namespace LightGame
switch (spawn.type) switch (spawn.type)
{ {
case GameObjectType::StaticPlatform:
obj.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts));
obj.solid = true;
obj.sprite = &spr_platform;
break;
case GameObjectType::LightPlatform: case GameObjectType::LightPlatform:
obj.collider = RenderData::BoundingBox2D( obj.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts)); Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts));
@ -90,14 +84,6 @@ namespace LightGame
obj.sprite = &spr_door_closed; obj.sprite = &spr_door_closed;
break; break;
case GameObjectType::Hazard:
obj.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, ts / 2),
Math::Vector2Int(ts, ts));
obj.solid = false;
obj.sprite = &spr_spike;
break;
case GameObjectType::Collectible: case GameObjectType::Collectible:
obj.collider = RenderData::BoundingBox2D( obj.collider = RenderData::BoundingBox2D(
Math::Vector2Int(ts / 4, ts / 4), Math::Vector2Int(ts / 4, ts / 4),
@ -117,12 +103,27 @@ namespace LightGame
level.add_checkpoint(Checkpoint(obj.position.x, obj.position.y)); level.add_checkpoint(Checkpoint(obj.position.x, obj.position.y));
obj.sprite = &spr_checkpoint; obj.sprite = &spr_checkpoint;
} }
else if (spawn.trigger_action == TriggerAction::LevelComplete)
{
obj.sprite = &spr_checkpoint;
}
break; break;
case GameObjectType::Player: case GameObjectType::Player:
obj.collider = RenderData::BoundingBox2D( obj.collider = RenderData::BoundingBox2D(
Math::Vector2Int(8, 0), Math::Vector2Int(24, 32)); Math::Vector2Int(8, 0), Math::Vector2Int(24, 32));
obj.solid = false; obj.solid = false;
{
GameObject marker;
marker.type = GameObjectType::Trigger;
marker.position = obj.position;
marker.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(ts, ts));
marker.solid = false;
marker.trigger_action = TriggerAction::None;
marker.sprite = &spr_flag;
level.add_object(marker);
}
break; break;
default: default:
@ -137,4 +138,9 @@ namespace LightGame
level.add_tile_light_rule(data.tile_light_rules[i]); level.add_tile_light_rule(data.tile_light_rules[i]);
} }
} }
const RenderData::Sprite& LevelLoader::flag_sprite()
{
return spr_flag;
}
} }

View File

@ -2,6 +2,7 @@
#include "Level.h" #include "Level.h"
#include "LevelData.h" #include "LevelData.h"
#include "Sprite.h"
namespace LightGame namespace LightGame
{ {
@ -9,5 +10,6 @@ namespace LightGame
{ {
public: public:
static void load(Level& level, const LevelData& data); static void load(Level& level, const LevelData& data);
static const RenderData::Sprite& flag_sprite();
}; };
} }

View File

@ -11,8 +11,8 @@ namespace LightGame
if (tilemap.tiles != nullptr && tilemap.atlas != nullptr) if (tilemap.tiles != nullptr && tilemap.atlas != nullptr)
{ {
ctx.draw_tilemap(tilemap, ctx.draw_tilemap(tilemap,
0, 0, 0, kTopBlackBorder,
camera.get_screen_width(), camera.get_screen_height(), camera.get_screen_width(), camera.get_screen_height() - kTopBlackBorder,
camera.get_x(), camera.get_y()); camera.get_x(), camera.get_y());
} }
@ -32,7 +32,7 @@ namespace LightGame
} }
const int32_t screen_x = obj.position.x - camera.get_x(); const int32_t screen_x = obj.position.x - camera.get_x();
const int32_t screen_y = obj.position.y - camera.get_y(); const int32_t screen_y = obj.position.y - camera.get_y() + kTopBlackBorder;
if (screen_x + sprite->width < 0 || screen_x > camera.get_screen_width() || if (screen_x + sprite->width < 0 || screen_x > camera.get_screen_width() ||
screen_y + sprite->height < 0 || screen_y > camera.get_screen_height()) screen_y + sprite->height < 0 || screen_y > camera.get_screen_height())
@ -83,12 +83,11 @@ namespace LightGame
const RenderData::BoundingBox2D world = obj.get_world_collider(); const RenderData::BoundingBox2D world = obj.get_world_collider();
const int32_t sx = world.min.x - camera.get_x(); const int32_t sx = world.min.x - camera.get_x();
const int32_t sy = world.min.y - camera.get_y(); const int32_t sy = world.min.y - camera.get_y() + kTopBlackBorder;
const int32_t w = world.max.x - world.min.x; const int32_t w = world.max.x - world.min.x;
const int32_t h = world.max.y - world.min.y; const int32_t h = world.max.y - world.min.y;
RenderData::Color color = RenderData::Color::Green(); RenderData::Color color = RenderData::Color::Green();
if (obj.type == GameObjectType::Hazard) color = RenderData::Color::Red();
if (obj.type == GameObjectType::LightPlatform) color = RenderData::Color(255, 255, 0, 255); if (obj.type == GameObjectType::LightPlatform) color = RenderData::Color(255, 255, 0, 255);
if (obj.type == GameObjectType::ShadowPlatform) color = RenderData::Color(128, 0, 255, 255); if (obj.type == GameObjectType::ShadowPlatform) color = RenderData::Color(128, 0, 255, 255);
if (obj.type == GameObjectType::Door) color = RenderData::Color(0, 255, 255, 255); if (obj.type == GameObjectType::Door) color = RenderData::Color(0, 255, 255, 255);

View File

@ -19,6 +19,8 @@ namespace LightGame
class LevelRenderer class LevelRenderer
{ {
public: public:
static const int32_t kTopBlackBorder = 24;
void draw(Core::DrawContext& ctx, const Level& level, const Camera2D& camera, void draw(Core::DrawContext& ctx, const Level& level, const Camera2D& camera,
const LightEffectSystem& light_system, uint16_t light_level); const LightEffectSystem& light_system, uint16_t light_level);

View File

@ -9,6 +9,13 @@
#include "Level1Data.h" #include "Level1Data.h"
#include "Level2Data.h" #include "Level2Data.h"
#include "Level3Data.h" #include "Level3Data.h"
#include "Level4Data.h"
#include "Level5Data.h"
#include "Level6Data.h"
#include "Level7Data.h"
#include "Level8Data.h"
#include "Level9Data.h"
#include "Level10Data.h"
#include "sprite_atlas.h" #include "sprite_atlas.h"
#include "Tilemap.h" #include "Tilemap.h"
#include <cassert> #include <cassert>
@ -20,9 +27,16 @@ namespace LightGame
const LevelData* kLevels[] = { const LevelData* kLevels[] = {
&Level1::data, &Level1::data,
&Level2::data, &Level2::data,
&Level3::data &Level3::data,
&Level4::data,
&Level5::data,
&Level6::data,
&Level7::data,
&Level8::data,
&Level9::data,
&Level10::data
}; };
const int32_t kLevelCount = 3; const int32_t kLevelCount = 10;
} }
LightGameApp::LightGameApp( LightGameApp::LightGameApp(
@ -325,6 +339,8 @@ namespace LightGame
break; break;
} }
} }
auto& mut_objects = level_.get_all_objects();
mut_objects[i].sprite = &LevelLoader::flag_sprite();
break; break;
} }

View File

@ -40,7 +40,16 @@ namespace LightGame
} }
const uint16_t tile_id = tilemap.get_tile(tile_x, tile_y); const uint16_t tile_id = tilemap.get_tile(tile_x, tile_y);
return tile_id != 0 && tile_id != RenderData::Tilemap::EmptyTile; if (tile_id == 0 || tile_id == RenderData::Tilemap::EmptyTile)
{
return false;
}
// spike(4) 是杀伤物,不参与碰撞 — 玩家须能踩进去触发 check_death
if (tile_id == 4)
{
return false;
}
return true;
} }
void Physics2D::collide_tilemap(GameObject& obj, const RenderData::Tilemap& tilemap, void Physics2D::collide_tilemap(GameObject& obj, const RenderData::Tilemap& tilemap,
@ -90,6 +99,7 @@ namespace LightGame
obj.position.x += overlap_right; obj.position.x += overlap_right;
} }
obj.velocity.x = 0; obj.velocity.x = 0;
sub_pixel_x_ = 0;
} }
else else
{ {
@ -103,6 +113,7 @@ namespace LightGame
obj.position.y += overlap_bottom; obj.position.y += overlap_bottom;
obj.velocity.y = 0; obj.velocity.y = 0;
} }
sub_pixel_y_ = 0;
} }
} }
} }
@ -207,16 +218,20 @@ namespace LightGame
const int32_t ts = tilemap.tile_w; const int32_t ts = tilemap.tile_w;
const int32_t tile_left = feet.min.x / ts; const int32_t tile_left = feet.min.x / ts;
const int32_t tile_right = (feet.max.x - 1) / ts; const int32_t tile_right = (feet.max.x - 1) / ts;
const int32_t tile_y = feet.min.y / ts; const int32_t tile_top = feet.min.y / ts;
const int32_t tile_bottom = (feet.max.y - 1) / ts;
for (int32_t ty = tile_top; ty <= tile_bottom; ++ty)
{
for (int32_t tx = tile_left; tx <= tile_right; ++tx) for (int32_t tx = tile_left; tx <= tile_right; ++tx)
{ {
if (is_tile_solid(tilemap, tx, tile_y)) if (is_tile_solid(tilemap, tx, ty))
{ {
return true; return true;
} }
} }
} }
}
const auto& all_objects = level.get_all_objects(); const auto& all_objects = level.get_all_objects();
for (size_t i = 0; i < all_objects.size(); ++i) for (size_t i = 0; i < all_objects.size(); ++i)

View File

@ -61,12 +61,15 @@ namespace LightGame
update_input(keyboard, pointer, screen_width, screen_height); update_input(keyboard, pointer, screen_width, screen_height);
update_movement(obj, dt_ms); update_movement(obj, dt_ms);
if (!was_grounded_)
{
physics.apply_gravity(obj, dt_ms); physics.apply_gravity(obj, dt_ms);
}
physics.move_and_collide(obj, level, dt_ms); physics.move_and_collide(obj, level, dt_ms);
const bool grounded = physics.is_grounded(obj, level); const bool grounded = physics.is_grounded(obj, level);
if (grounded && !was_grounded_ && obj.velocity.y >= 0) if (grounded && obj.velocity.y >= 0)
{ {
obj.velocity.y = 0; obj.velocity.y = 0;
} }
@ -233,21 +236,32 @@ namespace LightGame
return; return;
} }
const auto& all_objects = level.get_all_objects(); const RenderData::Tilemap& tilemap = level.get_tilemap();
const RenderData::BoundingBox2D player_box = obj.get_world_collider(); const RenderData::BoundingBox2D player_box = obj.get_world_collider();
if (tilemap.tile_w > 0)
for (size_t i = 0; i < all_objects.size(); ++i)
{ {
const GameObject& other = all_objects[i]; const int32_t ts = tilemap.tile_w;
if (other.id == obj.id || !other.active) // Spike 视觉高度 14px仅 tile 底部 14px 才算杀伤区
const int32_t kSpikeHitHeight = 14;
const int32_t tile_left = player_box.min.x / ts;
const int32_t tile_right = (player_box.max.x - 1) / ts;
const int32_t tile_top = player_box.min.y / ts;
const int32_t tile_bottom = (player_box.max.y - 1) / ts;
for (int32_t ty = tile_top; ty <= tile_bottom; ++ty)
{
for (int32_t tx = tile_left; tx <= tile_right; ++tx)
{
if (tx < 0 || tx >= tilemap.width || ty < 0 || ty >= tilemap.height)
{ {
continue; continue;
} }
const uint16_t tile_id = tilemap.get_tile(tx, ty);
if (other.type == GameObjectType::Hazard) if (tile_id == 4)
{ {
const RenderData::BoundingBox2D other_box = other.get_world_collider(); const int32_t spike_top = (ty + 1) * ts - kSpikeHitHeight;
if (aabb_overlap(player_box, other_box)) const int32_t spike_bottom = (ty + 1) * ts;
if (player_box.max.y > spike_top && player_box.min.y < spike_bottom)
{ {
state_ = PlayerState::Dead; state_ = PlayerState::Dead;
respawn_timer_ms_ = 0; respawn_timer_ms_ = 0;
@ -256,6 +270,8 @@ namespace LightGame
} }
} }
} }
}
}
void PlayerController::kill() void PlayerController::kill()
{ {

View File

@ -0,0 +1,104 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level10
{
// 终极之塔:综合最终关。三段、两个 Checkpoint。
// 段 1地面尖刺 + 光暗台错位 + 暗门(须切到 0-1023
// 段 2阶梯爬升错位光暗台。
// 段 3顶板走廊中间光门1500-2500+ 高速节奏跳到出口。
static const int32_t kMapWidth = 50;
static const int32_t kMapHeight = 12;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
// 顶天墙 1列 18 row 0..8 (仅 row 9 通道给暗门)
// 顶天墙 2列 34 row 0..2 (仅 row 3 通道给中间光门row 4 是门下挡板)
// 阶梯块:(32,4)(33,4) 单格 ground_fill 让玩家从段 2 跳到顶板高度
// 顶板row 4=ground_top, row 5=ground_fill (列 35..49),玩家走在 row 3
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,2,1,1,4,4,4,4,4,4,4,4,4,1,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 9, 0, 0, TriggerAction::None, 0 },
// === 段 14-16地面尖刺 + 光暗错位 ===
{ GameObjectType::ShadowPlatform, 5, 8, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 7, 7, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 9, 8, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 11, 7, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 13, 6, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 15, 7, 3072, 4095, TriggerAction::None, 0 },
// 暗门入口(须切到 0-1023
{ GameObjectType::Door, 18, 9, 0, 1023, TriggerAction::None, 0 },
// Checkpoint 1
{ GameObjectType::Trigger, 19, 9, 0, 0, TriggerAction::Checkpoint, 0 },
// === 段 220-31阶梯爬升错位切换 ===
{ GameObjectType::LightPlatform, 22, 7, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 24, 6, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 26, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 28, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 30, 5, 3072, 4095, TriggerAction::None, 0 },
// 段 2 顶端阶梯:(32,4)(33,4) 是 tilemap 中的 ground_fill
// 玩家立足 row 3 在阶梯顶部停留并切换光强。
// 中间光门:玩家走在 row 3门挡在 (34,3)
{ GameObjectType::Door, 34, 3, 1500, 2500, TriggerAction::None, 0 },
// Checkpoint 2顶板入口
{ GameObjectType::Trigger, 36, 3, 0, 0, TriggerAction::Checkpoint, 0 },
// === 段 335-49顶板走廊浮空台节奏跳 ===
{ GameObjectType::ShadowPlatform, 39, 2, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 42, 1, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 45, 2, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 7, 5, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 13, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 26, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 42, 0, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 45, 1, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 49, 3, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
25,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 9 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -18,7 +18,7 @@ namespace LightGame
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1, 1,1,1,1,4,4,4,4,1,1,4,4,4,4,4,4,1,1,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
}; };
@ -27,24 +27,7 @@ namespace LightGame
{ GameObjectType::Collectible, 5, 5, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 5, 5, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 10, 4, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 10, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 18, 5, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 18, 5, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 12, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 13, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 14, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 23, 5, 0, 0, TriggerAction::LevelComplete, 0 }, { GameObjectType::Trigger, 23, 5, 0, 0, TriggerAction::LevelComplete, 0 },
{ GameObjectType::Hazard, 4, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 6, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 5, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 7, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 10, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 11, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 15, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 18, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 19, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 20, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 20, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 21, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 21, 6, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Hazard, 22, 6, 0, 0, TriggerAction::None, 0 },
}; };
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height); static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
@ -57,7 +40,7 @@ namespace LightGame
&kAtlas, &kAtlas,
tile_atlas_columns, tile_atlas_columns,
spawns, spawns,
22, 5,
nullptr, nullptr,
0, 0,
Math::Vector2Int(64, 160), Math::Vector2Int(64, 160),

View File

@ -0,0 +1,71 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level4
{
// 影中漫步前半段须降到暗0-1023踩 ShadowPlatform
// 中央安全岛切换光强后半段须升到亮3072-4095踩 LightPlatform。
// 地面间隙下方是 spike掉下即死。
static const int32_t kMapWidth = 25;
static const int32_t kMapHeight = 8;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,4,4,4,4,4,4,4,1,1,1,4,4,4,4,4,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 },
// 前半段:暗时实
{ GameObjectType::ShadowPlatform, 4, 4, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 6, 3, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 8, 4, 0, 1023, TriggerAction::None, 0 },
// 后半段:亮时实
{ GameObjectType::LightPlatform, 13, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 15, 3, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 17, 2, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 19, 3, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 21, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 6, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 11, 5, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 17, 1, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 24, 5, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
13,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 5 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -0,0 +1,73 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level5
{
// 三色之门:必须依次通过 3 道光阈值不同的门。
// 实心墙到顶,门是唯一通路。
// 门 1暗门(0-1023)
// 门 2中间光门(1500-2500)
// 门 3亮门(3300-4095)
// 每两段间留有空间和提示性平台供玩家手动调光。
static const int32_t kMapWidth = 25;
static const int32_t kMapHeight = 8;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 3=platform 4=spike
// 墙体 y=0..4 顶天y=5 留空作为门的通道y=6 是 ground_top 玩家立足
static const uint16_t tiles[] = {
0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 },
// 三道门(站立层)
{ GameObjectType::Door, 4, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::Door, 12, 5, 1500, 2500, TriggerAction::None, 0 },
{ GameObjectType::Door, 19, 5, 3300, 4095, TriggerAction::None, 0 },
// 中段提示:每段中央放对应阈值的浮空平台
{ GameObjectType::ShadowPlatform, 7, 3, 0, 1500, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 15, 3, 1500, 3000, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 22, 3, 3000, 4095, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 7, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 15, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 22, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 24, 5, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
11,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 5 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -0,0 +1,79 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level6
{
// 刺影回廊:长尖刺走廊,依靠光感平台跳跃前进。
// 光台与暗台错位排列,强迫玩家在跳跃中切换光强。
// 此关引入 Checkpoint约 1/2 处一个救援点。
static const int32_t kMapWidth = 35;
static const int32_t kMapHeight = 8;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 5, 0, 0, TriggerAction::None, 0 },
// 第一段尖刺走廊:暗台与光台错位(玩家须在跳跃间切换)
{ GameObjectType::ShadowPlatform, 5, 4, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 7, 3, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 9, 4, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 11, 3, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 13, 4, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 15, 3, 3072, 4095, TriggerAction::None, 0 },
// 中段安全岛 + Checkpoint
{ GameObjectType::Trigger, 18, 5, 0, 0, TriggerAction::Checkpoint, 0 },
// 第二段更密:跳跃间隔更短
{ GameObjectType::LightPlatform, 21, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 23, 3, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 25, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 27, 3, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 29, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 31, 4, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 7, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 13, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 25, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 31, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 34, 5, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
19,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 5 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -0,0 +1,80 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level7
{
// 暗井攀登:垂直关卡,从底部 Z 字形爬升到顶部。
// 光台与暗台交替排布,玩家须不断切换光强。
// 中段 Checkpoint 作为安全点,顶部出口落在左侧。
static const int32_t kMapWidth = 25;
static const int32_t kMapHeight = 12;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
// 顶台在 y=1(ground_top) / y=2(ground_fill),玩家从下方跳到顶台上方 y=0 站立。
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 9, 0, 0, TriggerAction::None, 0 },
// Z 字形阶梯:右上方向爬升
{ GameObjectType::LightPlatform, 5, 9, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 8, 8, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 11, 7, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 14, 6, 0, 1023, TriggerAction::None, 0 },
// 中段 Checkpoint站在亮光实台上
{ GameObjectType::LightPlatform, 17, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 17, 5, 0, 0, TriggerAction::Checkpoint, 0 },
// 上半段回头向左爬
{ GameObjectType::LightPlatform, 14, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 11, 3, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 8, 3, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 8, 7, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 17, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 11, 2, 0, 0, TriggerAction::None, 0 },
// 顶部出口:站在顶台 ground_top 上方
{ GameObjectType::Trigger, 7, 0, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
14,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 9 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -0,0 +1,85 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level8
{
// 双相迷宫:节奏跳 + 门锁 + 长尖刺综合关。
// 三段式spike 节奏 → 双门夹道(须切换光强通过)→ 长走廊高速切换。
// Checkpoint 设在第二段后。
static const int32_t kMapWidth = 40;
static const int32_t kMapHeight = 10;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
// 列 14 与列 24 是顶天实墙(仅留 y=7 一格作为门通道)
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,4,4,4,4,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,4,4,4,4,4,4,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 7, 0, 0, TriggerAction::None, 0 },
// 第一段spike 4-7 节奏跳
{ GameObjectType::LightPlatform, 5, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 7, 5, 0, 1023, TriggerAction::None, 0 },
// 第一道暗门(站立层 14,7暗光通过
{ GameObjectType::Door, 14, 7, 0, 1023, TriggerAction::None, 0 },
// 中段安全区 15-23
{ GameObjectType::Collectible, 18, 6, 0, 0, TriggerAction::None, 0 },
// 第二道亮门24,7亮光通过
{ GameObjectType::Door, 24, 7, 3072, 4095, TriggerAction::None, 0 },
// Checkpoint刚过亮门
{ GameObjectType::Trigger, 25, 7, 0, 0, TriggerAction::Checkpoint, 0 },
// 第三段spike 27-37 高速切换
{ GameObjectType::LightPlatform, 28, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 30, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 32, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 34, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 36, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 5, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 30, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 36, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 39, 7, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
16,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 7 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -0,0 +1,93 @@
#pragma once
#include "LevelData.h"
#include "tile_atlas.h"
namespace LightGame
{
namespace Level9
{
// 光暗交界:综合挑战。三段,每段一个 Checkpoint。
// 段 1尖刺 + 阶梯,引入"中间光"门(1500-2500)。
// 段 2长尖刺走廊光台暗台双层错位。
// 段 3双门夹道暗 → 亮),失误重置回上一 CP。
static const int32_t kMapWidth = 45;
static const int32_t kMapHeight = 10;
static const int32_t kTileSize = 32;
// Tile IDs: 0=empty 1=ground_top 2=ground_fill 4=spike
// 列 16、列 30 是顶天实墙(仅 y=7 通道)
static const uint16_t tiles[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,4,4,4,4,4,4,4,4,1,1,1,1,2,1,4,4,4,4,4,4,4,4,4,4,4,1,2,1,4,4,4,4,1,1,4,4,4,4,4,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
static const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 2, 7, 0, 0, TriggerAction::None, 0 },
// === 段 14-15 ===
{ GameObjectType::LightPlatform, 5, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 7, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 9, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 11, 5, 0, 1023, TriggerAction::None, 0 },
// 中间光门(须把光强调到中间区间)
{ GameObjectType::Door, 16, 7, 1500, 2500, TriggerAction::None, 0 },
// 段 1 末尾 Checkpoint
{ GameObjectType::Trigger, 17, 7, 0, 0, TriggerAction::Checkpoint, 0 },
// === 段 218-29双层错位 ===
{ GameObjectType::LightPlatform, 19, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 21, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 23, 4, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 25, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 27, 6, 3072, 4095, TriggerAction::None, 0 },
// 段 2 末尾 Checkpoint
{ GameObjectType::Trigger, 29, 7, 0, 0, TriggerAction::Checkpoint, 0 },
// === 段 330-43双门夹道 ===
{ GameObjectType::Door, 30, 7, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 33, 6, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 35, 5, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::LightPlatform, 39, 6, 3072, 4095, TriggerAction::None, 0 },
{ GameObjectType::ShadowPlatform, 41, 5, 0, 1023, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 9, 4, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 23, 2, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 35, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Collectible, 41, 3, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::Trigger, 44, 7, 0, 0, TriggerAction::LevelComplete, 0 },
};
static const RenderData::Image kAtlas(tile_atlas_pixels, tile_atlas_width, tile_atlas_height);
static const LevelData data = {
tiles,
kMapWidth,
kMapHeight,
kTileSize,
&kAtlas,
tile_atlas_columns,
spawns,
23,
nullptr,
0,
Math::Vector2Int(2 * kTileSize, 7 * kTileSize),
0,
0,
kMapWidth * kTileSize,
kMapHeight * kTileSize
};
}
}

View File

@ -16,7 +16,7 @@ namespace
{ {
GameObject obj; GameObject obj;
assert(obj.id == 0); assert(obj.id == 0);
assert(obj.type == GameObjectType::StaticPlatform); assert(obj.type == GameObjectType::Player);
assert(obj.position.x == 0); assert(obj.position.x == 0);
assert(obj.position.y == 0); assert(obj.position.y == 0);
assert(obj.velocity.x == 0); assert(obj.velocity.x == 0);
@ -48,7 +48,7 @@ namespace
assert(level.object_count() == 0); assert(level.object_count() == 0);
GameObject platform; GameObject platform;
platform.type = GameObjectType::StaticPlatform; platform.type = GameObjectType::Collectible;
platform.position = Math::Vector2Int(0, 400); platform.position = Math::Vector2Int(0, 400);
uint32_t id1 = level.add_object(platform); uint32_t id1 = level.add_object(platform);
assert(id1 == 1); assert(id1 == 1);
@ -63,7 +63,7 @@ namespace
const GameObject* found = level.get_object(id1); const GameObject* found = level.get_object(id1);
assert(found != nullptr); assert(found != nullptr);
assert(found->type == GameObjectType::StaticPlatform); assert(found->type == GameObjectType::Collectible);
assert(found->id == 1); assert(found->id == 1);
const GameObject* not_found = level.get_object(999); const GameObject* not_found = level.get_object(999);
@ -88,7 +88,7 @@ namespace
Level level; Level level;
GameObject platform; GameObject platform;
platform.type = GameObjectType::StaticPlatform; platform.type = GameObjectType::Collectible;
level.add_object(platform); level.add_object(platform);
GameObject light_plat; GameObject light_plat;
@ -99,15 +99,15 @@ namespace
player.type = GameObjectType::Player; player.type = GameObjectType::Player;
level.add_object(player); level.add_object(player);
auto platforms = level.get_objects_by_type(GameObjectType::StaticPlatform); auto platforms = level.get_objects_by_type(GameObjectType::Collectible);
assert(platforms.size() == 1); assert(platforms.size() == 1);
assert(platforms[0]->type == GameObjectType::StaticPlatform); assert(platforms[0]->type == GameObjectType::Collectible);
auto players = level.get_objects_by_type(GameObjectType::Player); auto players = level.get_objects_by_type(GameObjectType::Player);
assert(players.size() == 1); assert(players.size() == 1);
auto hazards = level.get_objects_by_type(GameObjectType::Hazard); auto doors = level.get_objects_by_type(GameObjectType::Door);
assert(hazards.size() == 0); assert(doors.size() == 0);
} }
void TestLevelQueryRegion() void TestLevelQueryRegion()
@ -115,14 +115,14 @@ namespace
Level level; Level level;
GameObject obj1; GameObject obj1;
obj1.type = GameObjectType::StaticPlatform; obj1.type = GameObjectType::Collectible;
obj1.position = Math::Vector2Int(100, 100); obj1.position = Math::Vector2Int(100, 100);
obj1.collider = RenderData::BoundingBox2D( obj1.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(32, 32)); Math::Vector2Int(0, 0), Math::Vector2Int(32, 32));
level.add_object(obj1); level.add_object(obj1);
GameObject obj2; GameObject obj2;
obj2.type = GameObjectType::StaticPlatform; obj2.type = GameObjectType::Collectible;
obj2.position = Math::Vector2Int(500, 500); obj2.position = Math::Vector2Int(500, 500);
obj2.collider = RenderData::BoundingBox2D( obj2.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(32, 32)); Math::Vector2Int(0, 0), Math::Vector2Int(32, 32));
@ -226,7 +226,7 @@ namespace
level.set_bounds(LevelBounds(0, 0, 800, 600)); level.set_bounds(LevelBounds(0, 0, 800, 600));
GameObject ground; GameObject ground;
ground.type = GameObjectType::StaticPlatform; ground.type = GameObjectType::Collectible;
ground.position = Math::Vector2Int(0, 400); ground.position = Math::Vector2Int(0, 400);
ground.collider = RenderData::BoundingBox2D( ground.collider = RenderData::BoundingBox2D(
Math::Vector2Int(0, 0), Math::Vector2Int(800, 32)); Math::Vector2Int(0, 0), Math::Vector2Int(800, 32));
@ -249,7 +249,8 @@ namespace
void TestOneWayPlatform() void TestOneWayPlatform()
{ {
Level level; Level level;
level.set_bounds(LevelBounds(0, 0, 800, 600)); LevelBounds bounds(0, 0, 800, 600);
level.set_bounds(bounds);
GameObject platform; GameObject platform;
platform.type = GameObjectType::LightPlatform; platform.type = GameObjectType::LightPlatform;
@ -349,17 +350,17 @@ namespace
{ {
LightEffectSystem system; LightEffectSystem system;
GameObject platform; GameObject collectible;
platform.type = GameObjectType::StaticPlatform; collectible.type = GameObjectType::Collectible;
platform.solid = true; collectible.solid = true;
GameObject hazard; GameObject trigger;
hazard.type = GameObjectType::Hazard; trigger.type = GameObjectType::Trigger;
hazard.solid = true; trigger.solid = true;
std::vector<GameObject> objects; std::vector<GameObject> objects;
objects.push_back(platform); objects.push_back(collectible);
objects.push_back(hazard); objects.push_back(trigger);
system.update(objects, 0); system.update(objects, 0);
assert(objects[0].solid == true); assert(objects[0].solid == true);
@ -380,7 +381,7 @@ namespace
const ObjectSpawn spawns[] = { const ObjectSpawn spawns[] = {
{ GameObjectType::Player, 1, 1, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Player, 1, 1, 0, 0, TriggerAction::None, 0 },
{ GameObjectType::StaticPlatform, 0, 2, 0, 0, TriggerAction::None, 0 }, { GameObjectType::Collectible, 0, 2, 0, 0, TriggerAction::None, 0 },
}; };
const LevelData data = { const LevelData data = {