zeljkovranjes/waw-color-tags
GitHub: zeljkovranjes/waw-color-tags
通过逆向工程从《使命召唤:战争世界》游戏中提取并用纯 JavaScript 在浏览器中精确复刻家族标签动画效果的开源项目。
Stars: 0 | Forks: 0
# waw-color-tags
《使命召唤:战争世界》(Call of Duty: World at War,2008)动画 clan tag 效果的浏览器复刻版。
可以在[我的博客](https://blog.zeljkovranjes.com/posts/call-of-duty-world-at-war-clan-tag-effects)上查看预览。
每个效果都是通过挂载调试器、定位引擎 color table 和 clan tag 分发器,并反编译每个 animator 函数,从正在运行的游戏 (`CoDWaW.exe`) 中逆向工程得到的。确切的计时、调色板和逐字母逻辑使用纯 JavaScript 复现,无需构建步骤,也无任何依赖。
## 它是什么
在修改过的 WaW 客户端中,将你的 clan tag 设置为特殊关键字会触发内置的名称动画。分发器会将 tag 与预设列表进行比较,并将其路由到一个小型 animator,该 animator 会使用引擎 `^` color code(或通过移动字符)在每一帧重写名称。本项目在浏览器中以 1:1 的比例重建了这些 animator。
打开 `index.html` 即可查看在 `Unknown Soldier` 名称上运行的所有效果。
## 效果
| Tag | 效果 | 源函数 |
|-----|--------|-----------------|
| `cycl` | 粘性颜色擦除。一种颜色从左到右每次填充一个字母,直到填满整个单词,然后下一种颜色擦入。 | `0x65CED0` |
| `rain` | 逐字母的彩虹渐变,每 100 毫秒滚动一步。每个字母都是不同的颜色。 | `0x65CE20` |
| `cyln` / `krdr` | 单个红色字母来回扫描,由余弦驱动,在两端速度较慢。(Cylon / Knight Rider 扫描仪。) | `0x65D010` |
| `move` | 无颜色。文本在 40 个字符的字段内左右滑动。 | `0x65D1A0` |
| `....` | 弹跳的 `o` 在点之间来回移动。仅限 Tag。 | `0x65D100` |
| `****` | 弹跳的 `+` 在破折号之间来回移动。与 `....` 使用相同的函数。 | `0x65D100` |
| `RED` `GRN` `YELW` `BLUE` `CYAN` | 静态颜色 Tag。Tag 文本以固定颜色显示。 | `0x65D260` |
## 调色板
`^` code 使用的引擎 color table (`g_color_table`):
| Code | 名称 | Hex |
|------|------|-----|
| `^1` | red | `#FF3333` |
| `^2` | green | `#00FF00` |
| `^3` | yellow | `#FFFF00` |
| `^4` | blue | `#0000FF` |
| `^5` | cyan | `#00FFFF` |
`^1` red 和 `^6` pink 在 WaW 中进行了柔化处理(`^1` 是 `255, 51, 51`,而不是纯原色),这就是为什么简单的 Quake 3 调色板无法匹配的原因。
## 计时的工作原理
所有 animator 都会读取毫秒级时钟 (`winmm.timeGetTime`) 并从中推导出步骤。
```
cycl base = floor(t / (L*100)) % 5 ; pos = floor(t / 100) % L
color[i] = (i < pos) ? base : (base+4)%5 // sticky two color wipe
rain base = floor(t / 100) % 5
color[i] = (base + i) % 5 // scrolling gradient, 500 ms cycle
cyln pos = floor( (cos(t * 0.004) + 1) * 0.5 * L ) // cosine bounce, ~1571 ms
color[i] = (i == pos) ? red : white
move off = floor( (1 - |sin(t * 0.004)|) * (40 - L) ) // leading spaces, ~785 ms bounce
dots phase = floor(t / 75) & 7
pos = phase < 4 ? phase : 7 - phase // ping pong, 600 ms
```
`L` 是动画文本的长度。
## 文件
```
index.html demo page, one line per effect
js/cycl.js cycl wipe
js/rain.js rain gradient
js/cyln.js cyln / krdr scanner
js/move.js move slide
js/dots.js .... bouncing dot
js/stars.js **** bouncing plus
js/colors.js RED GRN YELW BLUE CYAN static colors
doc.txt extracted color palette reference
```
## 运行
无需服务器或构建。在任何现代浏览器中打开 `index.html` 即可。
## 注意事项
这是出于教育和保存目的对可见行为的全新复刻。它不包含任何游戏代码或资源。
标签:CMS安全, JavaScript, 云资产清单, 代码还原, 前端, 动画效果, 多模态安全, 数据可视化, 游戏, 自定义脚本, 逆向工程