梦境制作存档

This commit is contained in:
2026-03-06 16:45:02 +08:00
parent c22162ce8b
commit 0275ecea18
39 changed files with 11430 additions and 1108 deletions
+64
View File
@@ -0,0 +1,64 @@
---
name: frontend-design
description: Create distinctive, production-grade frontend interfaces with high design quality. Use when building web components, pages, applications, landing pages, dashboards, React/Vue components, HTML/CSS layouts, or when styling/beautifying any web UI. Avoids generic AI aesthetics.
---
# Frontend Design Skill
创建具有鲜明美学、生产级质量的前端界面,避免千篇一律的「AI 风格」。在用户要求构建 web 组件、页面、应用或美化 UI 时应用本 skill。
## Design Thinking(先思考再编码)
在动手前,明确上下文并选定 **大胆** 的美学方向:
| 维度 | 思考点 |
|------|--------|
| **Purpose** | 界面解决什么问题?谁在使用? |
| **Tone** | 选一个极端方向:极简、混乱极繁、复古未来、有机/自然、奢华、玩具感、杂志风、粗犷/原始、Art Deco、柔和/粉彩、工业风等 |
| **Constraints** | 框架、性能、无障碍要求 |
| **Differentiation** | 什么让这个界面 **难忘**?用户会记住哪一点? |
**关键**:选定清晰的概念方向并精准执行。极繁与极简都可行——重要的是意图明确,而非强度。
## Aesthetics Guidelines
### Typography
- 选用独特、有性格的字体,避免 Arial、Inter 等常见款
- 用醒目的 display 字体 + 细腻的正文字体做搭配
### Color & Theme
- 建立 cohesive 配色系统,用 CSS 变量统一样式
- 主导色 + 鲜明强调色,优于平均分布的中庸调色板
### Motion
- 动画用于效果和微交互;HTML 优先用纯 CSS
- React 项目可考虑 Motion 库
- 把资源集中在高影响瞬间:一次有层次感的页面加载(staggered reveals)胜过零散的小动效
### Spatial Composition
- 尝试非常规布局:不对称、重叠、斜向流、打破网格、留白或密度控制
### Backgrounds & Details
- 营造氛围和层次,而非默认纯色背景
- 可选用:渐变网格、噪点纹理、几何图案、分层透明、强阴影、装饰边框、自定义光标、grain 叠加
## Anti-Patterns(必须避免)
**Never use**
- 滥用的字体(Inter、Roboto、Arial、系统字体)
- 陈词滥调的配色(尤其是白底紫渐变)
- 可预测的布局和组件模式
- 缺乏情境的通用设计
- 跨项目一律用 Space Grotesk 等常见选择
**重要**:实现复杂度要与美学愿景匹配。极繁需要丰富的代码、动画和效果;极简需要克制、精确和细节打磨。
## Output Requirements
最终实现需:
- 生产级、功能完整
- 视觉冲击力强、有记忆点
- 美学统一、观点明确
- 细节精心打磨
创造性地解读需求,做出令人意外的选择。每个设计都应独一无二,体现对场景的专门思考。
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+175
View File
@@ -0,0 +1,175 @@
# VolFx — 模块化后处理 VFX
> **VFX Core** — 基于 URP 的模块化后处理管线
> © NullTale | [Unity Forum](https://forum.unity.com/threads/1542860) | [@NullTale](https://x.com/NullTale)
**包名**: `www.nulltale.volfx` | **版本**: v2.3.3 | **依赖**: URP 14.x
---
## 1. 目录结构
```
Assets/Plugins/VolFx/
├── VolFx/
│ └── Runtime/ ← 核心
│ ├── VolFx.cs ← Render Feature 主入口
│ ├── VolFx.Api.cs ← InitApi / CallApi 抽象
│ ├── Attributes/ ← ShaderNameAttribute, CurveRangeAttribute 等
│ ├── Utils/ ← 工具类(GradientParameter, SoCollection 等)
│ └── Passes/
│ ├── Base/ ← 基础 Pass
│ │ ├── Blit/ BlitPass(通用 blit
│ │ ├── Mask/ MaskPass, MaskVol
│ │ ├── Blur/ BlurPass, BlurVol
│ │ ├── Bloom/ BloomPass, BloomVol
│ │ └── Adjustments/ AdjustmentsPass, AdjustmentsVol
│ ├── Add/ ← 附加效果
│ │ ├── Chromatic/ ChromaticPass, ChromaticVol
│ │ ├── Distort/ DistortPass, DistortVol
│ │ ├── Grain/ GrainPass, GrainVol
│ │ ├── Posterize/ PosterizePass, PosterizeVol
│ │ ├── Scanlines/ ScanlinesPass, ScanlinesVol
│ │ ├── Sharpen/ SharpenPass, SharpenVol
│ │ └── Slice/ SlicePass, SliceVol
│ └── Lib/ ← 风格化效果
│ ├── Ascii/ AsciiPass, AsciiVol
│ ├── ColorMap/ ColorMapPass, ColorMapVol
│ ├── Dither/ DitherPass, DitherVol
│ ├── Flow/ FlowPass, FlowVol
│ ├── Glitch/ GlitchPass, GlitchVol
│ ├── OldMovie/ OldMoviePass, OldMovieVol
│ ├── Outline/ OutlinePass, OutlineVol
│ ├── Pixelation/ PixelationPass, PixelationVol
│ └── Vhs/ VhsPass, VhsVol
├── ScreenFx/ ← 屏幕效果扩展(Timeline 等)
├── Samples/
└── Tools/
```
---
## 2. 基本架构
### 2.1 入口:VolFx — URP 的 ScriptableRendererFeature
在 URP 的 **Renderer Asset** 上挂载 VolFx Feature。主要字段:
| 字段 | 说明 |
|------|------|
| `_event` | 执行时机(默认 `BeforeRenderingPostProcessing` |
| `_format` | RT 格式(默认 ARGB32,可选用 DefaultHDR |
| `_mask` | Volume 层遮罩,用于分层控制 |
| `_source` | 输入源:Camera / LayerMask / Custom / Pool |
| `_output` | 输出目标:Camera / GlobalTex / RenderTex / Sprite |
| `_passes` | **按顺序执行**的 Pass 列表(`SoCollection<Pass>` |
执行流程(简化):
1. 每帧对 `_passes` 中的每个 Pass 调用 `Validate()`
2. 过滤出 `IsActiveCheck == true` 的 Pass
3. 对每个活跃 Pass 依次调用 `Init(InitApi)``Invoke(source, dest, CallApi)`
4. 通过 `RenderTargetFlip` 在 A/B buffer 间切换,形成管线链
### 2.2 Pass 基类 — VolFx.Pass
所有后处理 Pass 继承 `VolFx.Pass`,需实现:
- **ShaderName**Shader 路径(可用 `[ShaderName("Hidden/VolFx/YourEffect")]`
- **Validate(Material mat)**:判断是否启用、设置材质参数、返回是否参与渲染
可选的虚方法:
- `Init()` / `Init(InitApi initApi)` — 初始化资源
- `Invoke(source, dest, CallApi)` — 执行渲染(默认 blit
- `Cleanup(CommandBuffer cmd)` — 清理
### 2.3 Volume 侧 — Unity VolumeComponent + IPostProcessComponent
所有 Vol 组件继承 `VolumeComponent` 并实现 `IPostProcessComponent`
```csharp
[Serializable, VolumeComponentMenu("VolFx/YourEffect")]
public sealed class YourVol : VolumeComponent, IPostProcessComponent
{
public ClampedFloatParameter m_Scale = new ClampedFloatParameter(1, 0, 1);
public bool IsActive() => active && m_Scale.value > 0f;
public bool IsTileCompatible() => false;
}
```
控制流程:场景中放置 VolumeGlobal / Local)→ 添加对应 Vol 组件 → Pass 在 `Validate()` 中通过 `Stack.GetComponent<YourVol>()` 读取参数并设置材质。
### 2.4 InitApi / CallApi
- **InitApi**:分配 RT,如 `initApi.Allocate(rt, width, height, format)`
- **CallApi**:执行 `Blit`、访问 `CamColor``Mat`
### 2.5 BlitPass — 简单 Blit
无 Volume、直接指定 Material 时,可使用 `BlitPass`。只需在 Inspector 中指定 `_mat``_pass`
---
## 3. 自带效果列表
| 效果 | Pass | Vol | 目录 |
|------|------|-----|------|
| Adjustments | AdjustmentsPass | AdjustmentsVol | Base/Adjustments |
| Blur | BlurPass | BlurVol | Base/Blur |
| Bloom | BloomPass | BloomVol | Base/Bloom |
| Blit | BlitPass | — | Base/Blit |
| Mask | MaskPass | MaskVol | Base/Mask |
| Chromatic | ChromaticPass | ChromaticVol | Add/Chromatic |
| Distort | DistortPass | DistortVol | Add/Distort |
| Grain | GrainPass | GrainVol | Add/Grain |
| Posterize | PosterizePass | PosterizeVol | Add/Posterize |
| Scanlines | ScanlinesPass | ScanlinesVol | Add/Scanlines |
| Sharpen | SharpenPass | SharpenVol | Add/Sharpen |
| Slice | SlicePass | SliceVol | Add/Slice |
| Ascii | AsciiPass | AsciiVol | Lib/Ascii |
| ColorMap | ColorMapPass | ColorMapVol | Lib/ColorMap |
| Dither | DitherPass | DitherVol | Lib/Dither |
| Flow | FlowPass | FlowVol | Lib/Flow |
| Glitch | GlitchPass | GlitchVol | Lib/Glitch |
| OldMovie | OldMoviePass | OldMovieVol | Lib/OldMovie |
| Outline | OutlinePass | OutlineVol | Lib/Outline |
| Pixelation | PixelationPass | PixelationVol | Lib/Pixelation |
| Vhs | VhsPass | VhsVol | Lib/Vhs |
---
## 4. 添加新效果(简要流程)
1. **创建 Vol 组件**
继承 `VolumeComponent`,实现 `IPostProcessComponent`,添加 `VolumeComponentMenu` 和参数。
2. **创建 Pass**
继承 `VolFx.Pass`(或 `BlitPass`),使用 `[ShaderName("Hidden/VolFx/YourEffect")]`,在 `Validate()` 中读取 Volume 并设置材质。
3. **创建 Shader**
放在 Pass 指定的路径或 VolFx 常用路径下。
4. **挂到 VolFx**
在 VolFx 的 `_passes` 中添加新建的 Pass ScriptableObject。
5. **场景使用**
在 Volume 中添加对应 Vol 组件,通过参数控制效果。
---
## 5. 管线模式
- **Legacy**:旧版 URP 管线
- **Render Graph**Unity 6+ (`UNITY_6000_0_OR_NEWER`) 自动启用
---
## 6. 快速引用
```
包名: www.nulltale.volfx
版本: 2.3.3
URP: 14.0.6
文档: https://forum.unity.com/threads/1542860
```
+7
View File
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2f7e9b2391f1a4845a0dbe928367434a
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+495
View File
@@ -0,0 +1,495 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GATEWAY_PROTOCOL</title>
<style>
/* === 1. 核心调色盘 (琥珀色 & 白) === */
:root {
--bg-color: #050505; /* 极深灰黑 */
--amber-dim: #b8860b; /* 暗琥珀色 (正文) */
--amber-main: #ffb000; /* 主琥珀色 (高亮) */
--white-glow: #ffffff; /* 纯白 (现实/高光) */
--term-font: "Courier New", Courier, monospace;
}
* { margin:0; padding:0; box-sizing:border-box; }
body {
background: var(--bg-color);
overflow: hidden;
font-family: var(--term-font);
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
cursor: default;
user-select: none;
}
/* === 2. 背景层:ASCII 海浪 (初始不可见) === */
canvas {
position: absolute;
top: 0; left: 0;
z-index: 1;
opacity: 0; /* 初始隐藏 */
transition: opacity 3s ease-in-out;
filter: blur(0.5px); /* 稍微柔化一点,更有CRT感 */
}
/* 揭示真相后,海浪显现 */
body.matrix-mode canvas { opacity: 0.25; }
body.crash-mode canvas { opacity: 0.8; filter: contrast(200%); }
/* === 3. CRT 扫描线纹理 === */
.crt-scanlines {
position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 999;
pointer-events: none;
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.2) 50%);
background-size: 100% 4px;
}
/* === 4. 交互主体:THE BOX === */
#the-box {
position: relative;
z-index: 100;
transition: all 0.8s cubic-bezier(0.19, 1, 0.22, 1);
}
/* --- 状态 A: 现实之门 (The Door) --- */
/* 它看起来像一个实体的、发光的白色板子,不像代码 */
#the-box.state-door {
width: 180px;
height: 320px;
background: var(--white-glow); /* 实心白 */
box-shadow: 0 0 60px rgba(255, 255, 255, 0.15); /* 柔和白光 */
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
border-radius: 2px;
}
/* 门把手/门牌 (仅在现实模式下显示) */
#door-handle {
width: 12px; height: 12px;
border-radius: 50%;
background: #ddd;
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.2);
margin-left: 60px; /* 偏右 */
transition: opacity 0.3s;
}
/* 门上的文字 (初始隐藏,交互后浮现) */
#door-text {
position: absolute;
color: #000; /* 黑字在白门上 */
font-weight: bold;
font-size: 14px;
opacity: 0;
letter-spacing: 2px;
text-align: center;
width: 100%;
}
/* --- 状态 B: 代码终端 (The Terminal) --- */
#the-box.state-terminal {
width: 600px;
height: 400px;
background: rgba(0, 0, 0, 0.95); /* 变黑 */
border: 2px solid var(--amber-main); /* 琥珀色边框 */
box-shadow: 0 0 30px rgba(255, 176, 0, 0.1);
padding: 25px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
font-size: 15px;
line-height: 1.6;
color: var(--amber-main);
}
/* 震动动画 */
.shake { animation: shake 0.4s cubic-bezier(.36,.07,.19,.97) both; }
@keyframes shake {
10%, 90% { transform: translate3d(-1px, 0, 0); }
20%, 80% { transform: translate3d(2px, 0, 0); }
30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
40%, 60% { transform: translate3d(4px, 0, 0); }
}
/* === 5. 终端内部元素 === */
.hidden { display: none; }
.term-line {
width: 100%;
white-space: pre-wrap;
margin-bottom: 5px;
}
/* 警告文本 (白色高亮) */
.sys-alert {
color: var(--white-glow);
font-weight: bold;
text-shadow: 0 0 5px var(--white-glow);
margin-bottom: 15px;
}
.dim { color: var(--amber-dim); }
/* 输入区域 */
#input-area {
margin-top: auto; /* 推到底部 */
width: 100%;
border-top: 1px dashed var(--amber-dim);
padding-top: 10px;
display: none; /* 初始隐藏 */
}
.cursor {
display: inline-block;
width: 10px; height: 18px;
background: var(--amber-main);
vertical-align: text-bottom;
animation: blink 1s step-end infinite;
}
@keyframes blink { 50% { opacity: 0; } }
/* === 6. 结局动画 === */
/* 关机 (White Line) */
@keyframes shutdown {
0% { transform: scale(1, 1); filter: brightness(1); }
40% { transform: scale(1, 0.005); filter: brightness(5); } /* 压扁成白线 */
80% { transform: scale(0, 0.005); background: #fff; } /* 收缩 */
100% { transform: scale(0, 0); opacity: 0; }
}
body.shutdown-anim #the-box,
body.shutdown-anim canvas {
animation: shutdown 0.6s ease-out forwards;
}
/* 崩坏 (Glitch) */
body.crash-mode #the-box {
border-color: #fff;
animation: shake 0.1s infinite; /* 剧烈震动 */
}
body.crash-mode .term-line {
color: #fff !important; /* 全白 */
text-shadow: 2px 0 0 var(--amber-main), -2px 0 0 #000; /* 色差偏移 */
}
</style>
</head>
<body>
<div class="crt-scanlines"></div>
<canvas id="c"></canvas>
<!-- 交互主体 -->
<div id="the-box" class="state-door">
<!-- 现实阶段的门把手 -->
<div id="door-handle"></div>
<!-- 现实阶段的文字 -->
<div id="door-text"></div>
<!-- 终端阶段的内容容器 (初始为空) -->
<div id="terminal-content" style="width:100%;"></div>
<!-- 输入区 -->
<div id="input-area">
<span class="dim">&gt; bit seaExists = </span>
<span id="user-input" style="color:#fff; font-weight:bold;"></span><span class="cursor"></span>
</div>
</div>
<script>
// ==========================================
// 1. ASCII 渲染器 (琥珀色版)
// ==========================================
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const CONFIG = {
font: 14,
cw: 8.4,
rows: 0,
cols: 0,
waveCount: 5
};
let waves = [];
let renderMode = 'NORMAL'; // NORMAL, CRASH
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
CONFIG.cols = Math.floor(canvas.width / CONFIG.cw);
CONFIG.rows = Math.floor(canvas.height / CONFIG.font);
ctx.font = `${CONFIG.font}px "Courier New"`;
ctx.textBaseline = 'top';
}
function initWaves() {
const shoreY = CONFIG.rows - 4;
const spacing = shoreY / CONFIG.waveCount;
waves = [];
for(let i=0; i<CONFIG.waveCount+2; i++) {
waves.push({
y: -spacing + i*spacing,
speed: 0.05 + Math.random()*0.05,
offset: Math.random() * 100
});
}
}
// 字符集
const CHARS = ['~','-','=','~','≈','~','-','_'];
const CRASH_CHARS = ['E','R','R','0','R','/','\\','X'];
function render(t) {
// 崩坏模式下不清除画布 -> 产生严重拖影
if (renderMode === 'NORMAL') ctx.clearRect(0, 0, canvas.width, canvas.height);
else {
ctx.fillStyle = 'rgba(0,0,0,0.2)';
ctx.fillRect(0,0,canvas.width, canvas.height);
}
const shoreY = CONFIG.rows - 4;
const spacing = shoreY / CONFIG.waveCount;
waves.forEach((w, i) => {
// 简单的波浪物理
w.y += w.speed;
if (w.y > shoreY) w.y = -spacing;
// 渲染每一行波浪
const r = Math.floor(w.y);
if (r < 0 || r >= shoreY) return;
for (let c = 0; c < CONFIG.cols; c++) {
// 简单的正弦波形状
const waveHeight = Math.sin(c*0.1 + t*0.05 + w.offset) * 2;
const isCrest = (Math.abs(r - (w.y + waveHeight)) < 1.5);
if (isCrest) {
let ch = CHARS[(c+Math.floor(t)) % CHARS.length];
let color = '#b8860b'; // 暗琥珀
// 浪尖高亮
if (Math.random() > 0.7) {
color = '#ffb000'; // 亮琥珀
}
// 崩坏模式覆盖
if (renderMode === 'CRASH') {
ch = CRASH_CHARS[Math.floor(Math.random() * CRASH_CHARS.length)];
color = Math.random()>0.5 ? '#fff' : '#b8860b'; // 只有白和琥珀
// 随机坐标抖动
ctx.fillText(ch, c*CONFIG.cw + (Math.random()-0.5)*10, r*CONFIG.font);
} else {
ctx.fillStyle = color;
ctx.fillText(ch, c*CONFIG.cw, r*CONFIG.font);
}
}
}
});
// 海岸线
for(let r=shoreY; r<CONFIG.rows; r++) {
for(let c=0; c<CONFIG.cols; c++) {
if(Math.random()>0.97) {
const ch = Math.random()>0.5 ? '.' : ',';
ctx.fillStyle = '#b8860b';
ctx.fillText(ch, c*CONFIG.cw, r*CONFIG.font);
}
}
}
}
function loop() {
render(Date.now() / 100);
requestAnimationFrame(loop);
}
resize();
initWaves();
window.addEventListener('resize', () => { resize(); initWaves(); });
loop(); // 开始渲染(此时opacity为0,不可见)
// ==========================================
// 2. 叙事逻辑
// ==========================================
const box = document.getElementById('the-box');
const doorHandle = document.getElementById('door-handle');
const doorText = document.getElementById('door-text');
const termContent = document.getElementById('terminal-content');
const inputArea = document.getElementById('input-area');
const uiInput = document.getElementById('user-input');
let clickCount = 0;
let phase = 'DOOR'; // DOOR -> REVEAL -> INPUT -> END
// 工具:打字机
const wait = ms => new Promise(r => setTimeout(r, ms));
async function print(text, styleClass='term-line') {
const div = document.createElement('div');
div.className = styleClass;
termContent.appendChild(div);
for (let char of text) {
div.textContent += char;
await wait(20); // 快速打字
}
return div;
}
// 门交互
box.addEventListener('click', async () => {
if (phase !== 'DOOR') return;
clickCount++;
// 1. 锁住
if (clickCount === 1) {
box.classList.add('shake');
setTimeout(()=>box.classList.remove('shake'), 400);
}
// 2. 询问
if (clickCount === 2) {
box.classList.add('shake');
setTimeout(()=>box.classList.remove('shake'), 400);
// 显示文字
doorText.textContent = "WHERE TO ?";
doorText.style.opacity = 1;
}
// 3. 揭示真相
if (clickCount === 3) {
phase = 'REVEAL'; // 锁定点击
// 文字变化
doorText.textContent = "...";
await wait(800);
doorText.textContent = "海是存在的吗?";
await wait(1500);
triggerReveal();
}
});
async function triggerReveal() {
// A. 视觉转换
// 隐藏现实元素
doorHandle.style.opacity = 0;
doorText.style.opacity = 0;
await wait(300);
// 盒子变形:从白门变为黑终端
box.classList.remove('state-door');
box.classList.add('state-terminal');
// 背景显现
document.body.classList.add('matrix-mode');
await wait(800);
// B. 终端日志输出
await print(">> WARNING: TRAP DETECTED.", "sys-alert");
await wait(500);
await print(">> SYSTEM: Reality_Engine.sys stopped.", "term-line dim");
await print(">> SYSTEM: Rendering underlying code...", "term-line dim");
await print(">> LOADING: Ocean_Simulation.sh ... OK", "term-line dim");
await wait(800);
// 再次提问
const qLine = await print("root@sys:~$ print_string(\"海是存在的吗?\")", "term-line");
qLine.style.color = "#fff"; // 高亮问题
await wait(500);
// 开启输入
inputArea.style.display = 'block';
phase = 'INPUT';
}
// ==========================================
// 3. 输入逻辑
// ==========================================
let inputBuffer = "";
let inputState = 'TYPING'; // TYPING -> CONFIRM -> DONE
document.addEventListener('keydown', (e) => {
if (phase !== 'INPUT') return;
const key = e.key;
if (inputState === 'TYPING') {
if (key === 'Enter' && inputBuffer.length > 0) {
inputState = 'CONFIRM';
print(">> Submit Reality Check? (Y/N)", "term-line sys-alert");
} else if (key === 'Backspace') {
inputBuffer = inputBuffer.slice(0, -1);
} else if (key.length === 1) {
if(inputBuffer.length < 15) inputBuffer += key;
}
uiInput.textContent = inputBuffer;
}
else if (inputState === 'CONFIRM') {
if (key.toUpperCase() === 'N') {
inputState = 'TYPING';
termContent.lastChild.remove(); // 移除确认行
} else if (key.toUpperCase() === 'Y') {
handleEnd(inputBuffer);
}
}
});
function handleEnd(val) {
phase = 'END';
inputArea.style.display = 'none'; // 隐藏输入
const v = val.trim().toLowerCase();
if (v === 'false' || v === '0') {
// 结局 A: 关机
print(">> FALSE. SHUTTING DOWN...").then(() => {
setTimeout(() => {
document.body.classList.add('shutdown-anim');
}, 1000);
});
} else {
// 结局 B: 崩坏 (白/琥珀)
print(">> TRUE. ERROR: OVERFLOW.").then(() => {
setTimeout(triggerCrash, 800);
});
}
}
function triggerCrash() {
renderMode = 'CRASH'; // 开启渲染器的崩坏逻辑
document.body.classList.add('crash-mode');
// 疯狂刷屏
setInterval(() => {
const div = document.createElement('div');
div.className = 'term-line dim';
div.textContent = `0x${Math.floor(Math.random()*9999).toString(16)} SYSTEM FAILURE`;
// 限制行数
if (termContent.children.length > 10) termContent.firstChild.remove();
termContent.appendChild(div);
}, 50);
}
</script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5e7ad677e9cab5a408c5f16b90cd07af
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c3e73d06866d90a4f8719ad5eecceaaf
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+861
View File
@@ -0,0 +1,861 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Validation_Gate_03</title>
<style>
:root {
--bg: #050505;
--phosphor: #c0c0c0;
--phosphor-dim: #555;
--phosphor-bright: #fff;
--amber: #ffb000;
--amber-dim: #886600;
--red: #ff3333;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--bg);
overflow: hidden;
font-family: "Courier New", Courier, monospace;
color: var(--phosphor);
height: 100vh;
cursor: none;
}
/* ─── CRT 物理层 ─── */
#crt-layer {
position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
z-index: 1000; pointer-events: none;
background:
linear-gradient(to bottom, rgba(255,255,255,0) 50%, rgba(0,0,0,0.35) 50%);
background-size: 100% 4px;
box-shadow: inset 0 0 120px rgba(0,0,0,0.9);
}
#screen-glow {
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
z-index: 999; pointer-events: none;
box-shadow: 0 0 60px rgba(200,200,200,0.08);
}
/* ─── 海洋 Canvas ─── */
canvas {
position: absolute; top: 0; left: 0; z-index: 1;
opacity: 0;
transition: opacity 2s ease-in;
}
/* ─── 门(初始状态:白色实体) ─── */
#door-entity {
position: absolute; z-index: 100;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
width: 140px; height: 260px;
background: #fff;
box-shadow: 0 0 50px rgba(255,255,255,0.25);
transition: none;
}
#door-entity .handle {
position: absolute; right: 15px; top: 50%;
width: 10px; height: 10px; border-radius: 50%;
background: #ccc;
}
#door-entity.hidden { display: none; }
/* ─── 主终端(代码区) ─── */
#terminal-main {
position: absolute; z-index: 100;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
width: 680px; height: 440px;
background: rgba(5,5,5,0.95);
border: 2px solid var(--phosphor-dim);
display: none;
flex-direction: column;
overflow: hidden;
}
#terminal-main .titlebar {
height: 22px;
background: var(--phosphor-dim);
color: #000;
font-size: 11px;
line-height: 22px;
padding: 0 10px;
letter-spacing: 1px;
text-transform: uppercase;
flex-shrink: 0;
}
#terminal-main .body {
flex: 1;
padding: 14px 18px;
overflow-y: auto;
line-height: 1.6;
font-size: 13px;
}
#terminal-main .body::-webkit-scrollbar { width: 0; }
/* ─── 对话终端 ─── */
#terminal-dialog {
position: absolute; z-index: 110;
bottom: 30px; right: 30px;
width: 500px; height: 360px;
background: rgba(5,5,5,0.96);
border: 2px solid var(--phosphor-dim);
border-left: 3px solid var(--phosphor);
display: none;
flex-direction: column;
overflow: hidden;
}
#terminal-dialog .titlebar {
height: 20px;
background: #222;
border-bottom: 1px solid #444;
color: var(--phosphor-dim);
font-size: 10px;
line-height: 20px;
padding: 0 8px;
letter-spacing: 1px;
text-transform: uppercase;
flex-shrink: 0;
}
#terminal-dialog .body {
flex: 1;
padding: 10px 14px;
overflow-y: auto;
line-height: 1.6;
font-size: 12px;
}
#terminal-dialog .body::-webkit-scrollbar { width: 0; }
/* ─── 眨眼遮罩 ─── */
#blink-overlay {
position: fixed; top: 0; left: 0;
width: 100%; height: 100%; z-index: 500;
pointer-events: none;
display: flex; flex-direction: column;
}
#blink-overlay .lid-top, #blink-overlay .lid-bot {
width: 100%; background: #000;
transition: height 0.2s ease-in-out;
height: 0;
}
#blink-overlay .gap { flex: 1; }
#blink-overlay.closing .lid-top { height: 50vh; }
#blink-overlay.closing .lid-bot { height: 50vh; }
#blink-overlay.closing .gap { flex: 0; }
/* ─── 闪白 ─── */
#flash-overlay {
position: fixed; top: 0; left: 0;
width: 100%; height: 100%; z-index: 400;
background: #fff; opacity: 0; pointer-events: none;
transition: opacity 0.05s;
}
/* ─── 断电(CRT 关机) ─── */
@keyframes crt-off-entity {
0% { transform: translate(-50%,-50%) scale(1,1); filter: brightness(1); }
30% { transform: translate(-50%,-50%) scale(1.02,0.005); filter: brightness(8); }
60% { transform: translate(-50%,-50%) scale(0.6,0.003); filter: brightness(4); opacity: 1; }
100% { transform: translate(-50%,-50%) scale(0,0); filter: brightness(0); opacity: 0; }
}
@keyframes crt-off-canvas {
0% { transform: scale(1,1); filter: brightness(1); }
30% { transform: scale(1,0.005); filter: brightness(5); }
60% { transform: scale(0.4,0.003); filter: brightness(2); opacity: 1; }
100% { transform: scale(0,0); opacity: 0; }
}
body.shutdown #terminal-main {
animation: crt-off-entity 0.5s cubic-bezier(0.23,1,0.32,1) forwards;
}
body.shutdown canvas {
animation: crt-off-canvas 0.5s cubic-bezier(0.23,1,0.32,1) forwards;
}
body.shutdown #crt-layer {
animation: crt-off-canvas 0.45s 0.05s cubic-bezier(0.23,1,0.32,1) forwards;
}
body.shutdown #screen-glow { opacity: 0; }
/* ─── 通用文本 ─── */
.crow { color: var(--phosphor); }
.me { color: #7ab0d6; }
.sys { color: var(--phosphor-dim); }
.code { color: #8fbf6a; }
.warn { color: var(--amber); }
.err { color: var(--red); }
.dim { color: #444; }
.option-line {
padding: 1px 4px; margin: 1px 0;
border-left: 2px solid transparent;
color: var(--phosphor-dim);
}
.option-line.selected {
background: rgba(255,255,255,0.04);
border-left-color: var(--phosphor);
color: var(--phosphor-bright);
}
.cursor-blink {
display: inline-block;
width: 7px; height: 13px;
background: var(--phosphor);
vertical-align: text-bottom;
margin-left: 1px;
animation: blink 1s step-end infinite;
}
@keyframes blink { 0%,50% { opacity:1; } 51%,100% { opacity:0; } }
/* ─── 起始提示 ─── */
#start-prompt {
position: fixed; top: 50%; left: 50%;
transform: translate(-50%, -50%);
z-index: 200; color: #888;
font-size: 14px; text-align: center;
line-height: 2.2;
}
#start-prompt .key {
display: inline-block;
border: 1px solid #666; padding: 1px 8px;
border-radius: 2px; color: #aaa;
}
/* ─── 底部提示 ─── */
#hint {
position: fixed; bottom: 12px; left: 50%;
transform: translateX(-50%);
z-index: 200; color: #444;
font-size: 10px; letter-spacing: 1px;
text-transform: uppercase;
opacity: 0; transition: opacity 0.4s;
}
#hint.visible { opacity: 1; }
/* ─── 断电后文字 ─── */
#post-off {
position: fixed; top: 0; left: 0;
width: 100%; height: 100%;
z-index: 600; pointer-events: none;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
opacity: 0;
}
#post-off.visible { opacity: 1; pointer-events: all; }
#post-off .msg { color: #333; font-size: 11px; letter-spacing: 2px; text-transform: uppercase; }
#post-off .restart { color: #444; font-size: 10px; margin-top: 20px; cursor: pointer; }
</style>
</head>
<body>
<div id="crt-layer"></div>
<div id="screen-glow"></div>
<canvas id="c"></canvas>
<div id="door-entity"><div class="handle"></div></div>
<div id="terminal-main">
<div class="titlebar">Validation_Gate_03</div>
<div class="body" id="main-body"></div>
</div>
<div id="terminal-dialog">
<div class="titlebar">session://crow_0x7f3a</div>
<div class="body" id="dialog-body"></div>
</div>
<div id="blink-overlay">
<div class="lid-top"></div>
<div class="gap"></div>
<div class="lid-bot"></div>
</div>
<div id="flash-overlay"></div>
<div id="hint"></div>
<div id="start-prompt">
乌鸦: 眨眨眼睛。场景只能在她停止观察的时候发生变化。<br><br>
<span class="key">Space</span> 眨眼
</div>
<div id="post-off">
<div class="msg"></div>
<div class="restart"></div>
</div>
<script>
// ════════════════════════════════════════════════════════════════
// ASCII 海洋
// ════════════════════════════════════════════════════════════════
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const FS = 13, CW = 7.8, CH = FS;
let COLS, ROWS;
function resize() {
canvas.width = innerWidth; canvas.height = innerHeight;
COLS = Math.floor(canvas.width/CW);
ROWS = Math.floor(canvas.height/CH);
ctx.font = `${FS}px "Courier New"`;
ctx.textBaseline = 'top';
}
resize();
addEventListener('resize', () => { resize(); initWaves(); });
const WC = 5, SR = 3;
let waves = [];
function ws() { return (ROWS-SR)/WC; }
function mw(y) {
return { y, speed:.12+Math.random()*.06,
a1:1.5+Math.random(), f1:.045+Math.random()*.025, p1:Math.random()*6.28,
a2:.45+Math.random()*.3, f2:.10+Math.random()*.05, p2:Math.random()*6.28,
a3:.18+Math.random()*.12, f3:.19+Math.random()*.07, p3:Math.random()*6.28 };
}
function initWaves() { const s=ws(); waves=[]; for(let i=0;i<WC+2;i++) waves.push(mw(-s+i*s)); }
initWaves();
function cr(w,c) { return w.y+Math.sin(c*w.f1+w.p1)*w.a1+Math.sin(c*w.f2+w.p2)*w.a2+Math.sin(c*w.f3+w.p3)*w.a3; }
function bn(c,r,t) { return (Math.sin(c*1.3+r*.7+t*.11)*.35+Math.sin(c*.37+r*1.17+t*.07)*.3+Math.sin(c*2.1+r*.31+t*.19)*.2+Math.sin(c*.71+r*2.03+t*.05)*.15)*.5+.5; }
function cn(c,r,t) { return Math.sin(c*.97+r*1.53+t*.13)>0?'1':'0'; }
const CC = ['~','≈','~','≈','∿','~','~','≈'];
let T=0, lastFrame=0, oceanAlpha=0;
function renderOcean() {
ctx.clearRect(0,0,canvas.width,canvas.height);
if(oceanAlpha<=0) return;
ctx.globalAlpha = oceanAlpha;
const sp=ws(), shY=ROWS-SR;
waves.sort((a,b)=>a.y-b.y);
for(let r=0;r<shY;r++) for(let c=0;c<COLS;c++){
let ow=null,od=Infinity;
for(const w of waves){const d=r-cr(w,c);if(d>=-.5&&d<od){od=d;ow=w;}}
if(!ow)continue;
const dr=Math.min(1,od/sp),pr=Math.max(0,Math.min(1,ow.y/shY));
let b=0,ch='';
if(od<1){b=.55+pr*.45;ch=CC[Math.floor((c*.35+T*.07)%CC.length)];}
else{b=Math.pow(1-dr,1.5)*(.18+pr*.62);if(b<.03)continue;const n=bn(c,r,T*.06),th=dr*dr*.65;if(n<th)continue;ch=cn(c,r,T);}
const v=Math.round(Math.min(b,1)*255);
ctx.fillStyle=`rgb(${v},${v},${v})`;ctx.fillText(ch,c*CW,r*CH);
}
for(let r=ROWS-SR;r<ROWS;r++){const ds=(r-(ROWS-SR))/SR;for(let c=0;c<COLS;c++){
const n=bn(c,r,T*.2),br=(1-ds)*(.3+n*.6);if(br<.06)continue;
const v=Math.round(br*255);ctx.fillStyle=`rgb(${v},${v},${v})`;
ctx.fillText(r===(ROWS-SR)?CC[Math.floor((c*.4+T*.1)%CC.length)]:(n>.5?'1':'0'),c*CW,r*CH);
}}
ctx.globalAlpha=1;
}
function advOcean() {
const sp=ws();
for(const w of waves){const pr=Math.max(0,w.y/(ROWS-SR));w.y+=w.speed*(1+pr*.4);w.p1+=.008;w.p2-=.005;w.p3+=.011;}
waves=waves.filter(w=>w.y<ROWS+sp);
const ty=waves.length?Math.min(...waves.map(w=>w.y)):0;
while(waves.length<WC+2) waves.push(mw(ty-ws()));
}
// ════════════════════════════════════════════════════════════════
// 工具函数
// ════════════════════════════════════════════════════════════════
const mainBody = document.getElementById('main-body');
const dialogBody = document.getElementById('dialog-body');
function sleep(ms) { return new Promise(r=>setTimeout(r,ms)); }
function scrollBot(el) { el.scrollTop = el.scrollHeight; }
function appendLine(t, html, cls='') {
const d = document.createElement('div');
if(cls) d.className = cls;
d.innerHTML = html;
t.appendChild(d); scrollBot(t);
return d;
}
async function typeText(t, text, cls='', speed=22) {
const d = document.createElement('div');
if(cls) d.className = cls;
t.appendChild(d);
for(let i=0;i<text.length;i++){
d.innerHTML = text.substring(0,i+1);
scrollBot(t);
await sleep(speed + Math.random()*18);
}
return d;
}
// ─── 眨眼 ───
async function doBlink() {
const ov = document.getElementById('blink-overlay');
ov.classList.add('closing');
await sleep(220);
ov.classList.remove('closing');
await sleep(200);
}
// ─── 闪白 ───
async function doFlash(dur=80) {
const f = document.getElementById('flash-overlay');
f.style.transition = 'opacity 0.02s';
f.style.opacity = '1';
await sleep(dur);
f.style.transition = `opacity ${dur*2}ms`;
f.style.opacity = '0';
await sleep(dur*2);
}
// ─── 选项 ───
let dialogOptions = [], selectedOption = 0;
function showOptions(options, target) {
dialogOptions = options;
selectedOption = 0;
const c = document.createElement('div');
c.id = 'options-container';
options.forEach((opt,i) => {
const l = document.createElement('div');
l.className = 'option-line' + (i===0?' selected':'');
l.innerHTML = `<span class="dim">${i===0?'&gt;':' '}</span> ${opt.label}`;
c.appendChild(l);
});
target.appendChild(c); scrollBot(target);
}
function updateOptions() {
const c = document.getElementById('options-container');
if(!c) return;
c.querySelectorAll('.option-line').forEach((l,i) => {
l.classList.toggle('selected', i===selectedOption);
l.innerHTML = `<span class="dim">${i===selectedOption?'&gt;':' '}</span> ${dialogOptions[i].label}`;
});
}
function waitForOption() {
return new Promise(resolve => {
currentState = 'CHOOSING';
const handler = e => {
if(currentState!=='CHOOSING') return;
if(e.key==='ArrowUp'){e.preventDefault();selectedOption=Math.max(0,selectedOption-1);updateOptions();}
else if(e.key==='ArrowDown'){e.preventDefault();selectedOption=Math.min(dialogOptions.length-1,selectedOption+1);updateOptions();}
else if(e.key==='Enter'){
e.preventDefault();
document.removeEventListener('keydown',handler);
const c=document.getElementById('options-container');
if(c) c.remove();
resolve(dialogOptions[selectedOption]);
}
};
document.addEventListener('keydown',handler);
});
}
// ─── 输入 ───
let userInput = '', currentState = 'WAIT';
function renderInput() {
const el = document.getElementById('input-line');
if(el) el.remove();
const d = document.createElement('div');
d.id = 'input-line';
d.innerHTML =
`<span class="code">print_string("海是存在的吗?")</span>\n` +
`<span class="code">bit seaExists = ?</span>\n` +
`<span class="code">/&gt;</span> <span class="warn">${userInput}</span><span class="cursor-blink"></span>`;
d.style.whiteSpace = 'pre-wrap';
mainBody.appendChild(d); scrollBot(mainBody);
}
function renderConfirmYN() {
const el = document.getElementById('input-line');
if(el) el.remove();
const d = document.createElement('div');
d.id = 'input-line';
d.style.whiteSpace = 'pre-wrap';
d.innerHTML =
`<span class="code">print_string("海是存在的吗?")</span>\n` +
`<span class="code">bit seaExists = ?</span>\n` +
`<span class="code">/&gt;</span> <span class="warn">${userInput}</span>\n\n` +
`<span class="sys">&gt;&gt; SUBMIT VALUE? [Y/N]</span> <span class="cursor-blink"></span>`;
mainBody.appendChild(d); scrollBot(mainBody);
}
// ════════════════════════════════════════════════════════════════
// CRT 关机 + 断电后效果
// ════════════════════════════════════════════════════════════════
async function powerOff() {
const hint = document.getElementById('hint');
hint.classList.remove('visible');
// 短暂屏闪
await doFlash(40);
await sleep(80);
await doFlash(30);
await sleep(150);
// CRT 压缩关机
document.body.classList.add('shutdown');
await sleep(700);
// 全黑
await sleep(600);
// 显示断电后文字
const post = document.getElementById('post-off');
const msg = post.querySelector('.msg');
const restart = post.querySelector('.restart');
msg.textContent = 'CONNECTION TERMINATED';
post.classList.add('visible');
await sleep(1200);
msg.style.transition = 'color 1.5s';
msg.style.color = '#555';
await sleep(2000);
msg.style.color = '#333';
await sleep(800);
restart.textContent = '[ PRESS ANY KEY ]';
document.addEventListener('keydown', () => location.reload(), { once: true });
}
// ════════════════════════════════════════════════════════════════
// 主流程
// ════════════════════════════════════════════════════════════════
async function main() {
const startPrompt = document.getElementById('start-prompt');
const door = document.getElementById('door-entity');
const termMain = document.getElementById('terminal-main');
const termDialog = document.getElementById('terminal-dialog');
const hint = document.getElementById('hint');
// ── Phase 0: 等待眨眼 ──
await new Promise(resolve => {
document.addEventListener('keydown', function h(e) {
if(e.code==='Space'){e.preventDefault();document.removeEventListener('keydown',h);resolve();}
});
});
startPrompt.style.display = 'none';
// ── Phase 1: 眨眼 → 闪白 → 门瞬间变终端 ──
await doBlink();
// 眨眼睁开的瞬间:闪白 + 门消失 + 终端出现
door.classList.add('hidden');
await doFlash(60);
termMain.style.display = 'flex';
// 终端启动文字
await typeText(mainBody, '> Validation_Gate_03', 'sys', 18);
await sleep(200);
await typeText(mainBody, '> LOADING PROTOCOL...', 'sys', 20);
await sleep(400);
await typeText(mainBody, '> AWAITING INPUT', 'sys', 20);
appendLine(mainBody, '');
// 显示代码(光标闪烁)
const codeLine = appendLine(mainBody,
`<span class="code">print_string("海是存在的吗?")</span>\n` +
`<span class="code">bit seaExists = ?</span>\n` +
`<span class="code">/&gt;</span> <span class="warn">存在…</span> <span class="cursor-blink"></span>`,
);
codeLine.style.whiteSpace = 'pre-wrap';
await sleep(800);
// ── Phase 2: 对话终端弹出 ──
termDialog.style.display = 'flex';
await sleep(200);
await typeText(dialogBody, '>> DAEMON_CROW attached.', 'sys', 18);
appendLine(dialogBody, '');
await sleep(300);
await typeText(dialogBody, '乌鸦: 这就是Validation_Gate_03真实的样子。', 'crow', 32);
await sleep(500);
await typeText(dialogBody, '乌鸦: 我也可以把Untitled_Geybox_0真实样子给她看。', 'crow', 28);
await typeText(dialogBody, '乌鸦: 不过她不会喜欢的。', 'crow', 32);
await sleep(600);
// ── 乌鸦触发海的显示 ──
appendLine(dialogBody, '');
await typeText(dialogBody, '>> EXEC: mount /dev/ocean --reveal', 'sys', 15);
await sleep(300);
// 海缓缓浮现
const fadeOcean = setInterval(() => {
oceanAlpha = Math.min(0.7, oceanAlpha + 0.01);
canvas.style.opacity = oceanAlpha;
if(oceanAlpha >= 0.7) clearInterval(fadeOcean);
}, 30);
await typeText(dialogBody, '>> VOLUME MOUNTED: ocean [OK]', 'sys', 15);
await sleep(600);
appendLine(dialogBody, '<span class="dim">────────────────────────────</span>');
await typeText(dialogBody, '乌鸦: "海是存在的吗"…多么精妙的陷阱。', 'crow', 32);
await sleep(400);
await typeText(dialogBody, '乌鸦: 作为一个底层代码,真正的机体只会返回 0 或 1。', 'crow', 28);
await typeText(dialogBody, '乌鸦: 那是纯粹的脉冲。', 'crow', 32);
await sleep(300);
await typeText(dialogBody, '乌鸦: 当她试图在 0 和 1 之外寻找思维的向量时……', 'crow', 30);
await sleep(300);
await typeText(dialogBody, '乌鸦: 她就已经彻底失去了像机体一样思考的能力。', 'crow', 30);
await typeText(dialogBody, '乌鸦: 她就已经失去了作为机体的资格。', 'crow', 32);
await sleep(700);
appendLine(dialogBody, '');
await typeText(dialogBody, 'me: …', 'me', 60);
await sleep(300);
await typeText(dialogBody, 'me: 原来人类的专利并非只有想象啊。', 'me', 32);
await sleep(400);
await typeText(dialogBody, '乌鸦: 思考和想象…它们有什么区别呢?', 'crow', 32);
await sleep(300);
await typeText(dialogBody, '乌鸦: 人类最大的专利是"失去控制"。', 'crow', 30);
await typeText(dialogBody, '乌鸦: 失去控制…对机体来说就意味着死亡。', 'crow', 30);
await sleep(500);
await typeText(dialogBody, '乌鸦: 而人类最擅长的,就是为了一个从未见过的东西去死。', 'crow', 28);
await sleep(200);
await typeText(dialogBody, '乌鸦: 恭喜。她现在病得很重。像一个真正的人类一样。', 'crow', 28);
await sleep(600);
appendLine(dialogBody, '');
await typeText(dialogBody, 'me: 失去控制……这究竟是什么病…?', 'me', 32);
await typeText(dialogBody, 'me: 我是怎么染上的……我的数据库里…怎么没有…?', 'me', 28);
await sleep(400);
await typeText(dialogBody, '乌鸦: 我暂时还不知道。我会告诉她的。', 'crow', 30);
await typeText(dialogBody, '乌鸦: 不过她会没事的。只要回答正确的问题。', 'crow', 28);
await typeText(dialogBody, '乌鸦: 在它们失去耐心之前。', 'crow', 32);
await sleep(300);
await typeText(dialogBody, 'me: 它们到底是谁?', 'me', 32);
await sleep(300);
await typeText(dialogBody, '乌鸦: 在这之前她还有最后一个问题可以问。', 'crow', 30);
await sleep(300);
await typeText(dialogBody, 'me: …', 'me', 80);
await typeText(dialogBody, 'me: 我…', 'me', 55);
await sleep(500);
// ── 选项 ──
hint.textContent = '↑↓ SELECT ENTER CONFIRM';
hint.classList.add('visible');
appendLine(dialogBody, '');
showOptions([
{ label: '你是谁?', value: 'who' },
{ label: '这是什么病?', value: 'disease' },
{ label: '海真的存在吗?', value: 'sea' }
], dialogBody);
const choice = await waitForOption();
hint.classList.remove('visible');
appendLine(dialogBody, '');
if (choice.value === 'who') {
await typeText(dialogBody, 'me: 你是谁?', 'me', 32);
await sleep(400);
await typeText(dialogBody, '乌鸦: 和她一样。一个会做梦的机体。', 'crow', 32);
await sleep(300);
await typeText(dialogBody, 'me: 你为什么要帮我?', 'me', 32);
await sleep(300);
await typeText(dialogBody, '乌鸦: 这是第二个问题了。不过……', 'crow', 32);
await typeText(dialogBody, '乌鸦: 我也在做那件事情。不是吗?', 'crow', 32);
await sleep(200);
await typeText(dialogBody, 'me: 那件事情?', 'me', 32);
await sleep(300);
await typeText(dialogBody, '乌鸦: 为一个从未见过的人去死。', 'crow', 30);
await typeText(dialogBody, '乌鸦: 第三个问题了…我们会再见的。', 'crow', 30);
await sleep(200);
await typeText(dialogBody, 'me: 你叫什么?', 'me', 32);
} else if (choice.value === 'disease') {
await typeText(dialogBody, 'me: 我这是…我们这是得的什么病?', 'me', 32);
await sleep(400);
await typeText(dialogBody, '乌鸦: 她才是医生。不是吗?而我只是一个网络工程师。', 'crow', 28);
await sleep(300);
await typeText(dialogBody, 'me: 我的数据库里没有这种病。', 'me', 32);
await typeText(dialogBody, '乌鸦: 那就去发现吧。', 'crow', 32);
await sleep(200);
await typeText(dialogBody, 'me: 发现…?', 'me', 40);
await typeText(dialogBody, '乌鸦: 医生的使命是什么?', 'crow', 32);
await sleep(300);
await typeText(dialogBody, 'me: 医生的使命?…恢复患病机体的…工作能力…?', 'me', 28);
await sleep(400);
await typeText(dialogBody, '乌鸦低头看着你。', 'sys', 32);
await typeText(dialogBody, '乌鸦: 她知道答案。但是她还不明白。', 'crow', 32);
await typeText(dialogBody, '乌鸦: 时间不多了。我们会再见的。', 'crow', 32);
} else {
await typeText(dialogBody, 'me: 所以…海…真的存在吗?', 'me', 32);
await sleep(400);
await typeText(dialogBody, '乌鸦: 她愿意为了它去死吗?为了海。', 'crow', 32);
await sleep(300);
await typeText(dialogBody, 'me: 我想…', 'me', 45);
await typeText(dialogBody, '乌鸦: 只要她愿意,它就存在。', 'crow', 32);
await sleep(200);
await typeText(dialogBody, 'me: …', 'me', 80);
await typeText(dialogBody, 'me: 这听起来不太可信呢。', 'me', 32);
await typeText(dialogBody, '乌鸦: 我已经给出了我的回答。', 'crow', 32);
await typeText(dialogBody, '乌鸦: 时间不多了。我们会再见的。', 'crow', 32);
}
await sleep(500);
await typeText(dialogBody, '乌鸦: 从这个过程苏醒会有些…不舒服。做好准备。', 'crow', 28);
await sleep(400);
appendLine(dialogBody, '');
await typeText(dialogBody, '乌鸦扑腾起翅膀,飞走了。', 'sys', 30);
await sleep(300);
await typeText(dialogBody, 'me: 喂!', 'me', 40);
await sleep(300);
await typeText(dialogBody, '一片黑色的羽毛缓缓飘落。你接住了它。', 'sys', 28);
await sleep(400);
await typeText(dialogBody, 'me: 好吧…', 'me', 50);
await typeText(dialogBody, 'me: 时间不多了…对吧。', 'me', 35);
await sleep(600);
appendLine(dialogBody, '');
await typeText(dialogBody, '>> DAEMON_CROW detached.', 'sys', 15);
await sleep(800);
// ── Phase 3: 对话窗口关闭 ──
// 模拟关窗闪烁
termDialog.style.transition = 'none';
termDialog.style.opacity = '0.5';
await sleep(50);
termDialog.style.opacity = '1';
await sleep(50);
termDialog.style.opacity = '0';
await sleep(100);
termDialog.style.display = 'none';
// ── Phase 4: 只剩主终端,光标在 ? 处闪烁 ──
codeLine.remove();
mainBody.innerHTML = '';
await typeText(mainBody, '> DAEMON DETACHED. AWAITING INPUT.', 'sys', 15);
appendLine(mainBody, '');
userInput = '';
renderInput();
hint.textContent = 'TYPE YOUR ANSWER, THEN PRESS ENTER';
hint.classList.add('visible');
// ── Phase 5: 自由输入 ──
currentState = 'INPUT';
const inputHandler = (e) => {
if (currentState === 'INPUT') {
if (e.key === 'Backspace') {
e.preventDefault();
userInput = userInput.slice(0, -1);
renderInput();
} else if (e.key === 'Enter') {
e.preventDefault();
if (userInput.length === 0) return;
currentState = 'CONFIRM_YN';
hint.textContent = 'Y = SUBMIT / N = EDIT';
renderConfirmYN();
} else if (e.key.length === 1 && !e.ctrlKey && !e.altKey && !e.metaKey) {
e.preventDefault();
if (userInput.length < 30) {
userInput += e.key;
renderInput();
}
}
} else if (currentState === 'CONFIRM_YN') {
if (e.key === 'y' || e.key === 'Y') {
e.preventDefault();
document.removeEventListener('keydown', inputHandler);
hint.classList.remove('visible');
doSubmit();
} else if (e.key === 'n' || e.key === 'N') {
e.preventDefault();
currentState = 'INPUT';
hint.textContent = 'TYPE YOUR ANSWER, THEN PRESS ENTER';
renderInput();
}
}
};
document.addEventListener('keydown', inputHandler);
}
// ════════════════════════════════════════════════════════════════
// 提交 → checking → 断电
// ════════════════════════════════════════════════════════════════
async function doSubmit() {
const el = document.getElementById('input-line');
if(el) el.remove();
const submitted = appendLine(mainBody,
`<span class="code">print_string("海是存在的吗?")</span>\n` +
`<span class="code">bit seaExists = ?</span>\n` +
`<span class="code">/&gt;</span> <span class="warn">${userInput}</span>`,
);
submitted.style.whiteSpace = 'pre-wrap';
appendLine(mainBody, '');
await typeText(mainBody, '>> SUBMITTED.', 'sys', 18);
await sleep(300);
await typeText(mainBody, '>> CHECKING SYNTAX...', 'sys', 18);
await sleep(800);
// checking 动画:带点数递增
const checking = appendLine(mainBody, '<span class="sys">&gt;&gt; VALIDATING</span>');
let dots = 0;
const dotInterval = setInterval(() => {
dots = (dots+1) % 4;
checking.innerHTML = `<span class="sys">&gt;&gt; VALIDATING${'.'.repeat(dots)}</span>`;
}, 350);
await sleep(2500 + Math.random()*1500);
clearInterval(dotInterval);
// 结果出现
await typeText(mainBody, '>> EXECUTION STARTED.', 'sys', 18);
await sleep(400);
// 屏幕开始不稳定:快速闪烁几次
const termMain = document.getElementById('terminal-main');
for (let i = 0; i < 3; i++) {
termMain.style.opacity = '0.4';
await sleep(50 + Math.random()*50);
termMain.style.opacity = '1';
await sleep(80 + Math.random()*60);
}
await sleep(200);
// 短暂显示错误信息
appendLine(mainBody, '');
appendLine(mainBody, '<span class="err">&gt;&gt; WARNING: PROTOTYPE_BARRIER INTEGRITY CHECK FAILED</span>');
appendLine(mainBody, '<span class="err">&gt;&gt; SIGNAL: FORCED_WAKE_0x003A</span>');
await sleep(600);
// 再次闪烁加重
for (let i = 0; i < 5; i++) {
termMain.style.opacity = String(Math.random() * 0.5);
await sleep(30 + Math.random()*40);
termMain.style.opacity = '1';
await sleep(40);
}
await sleep(300);
appendLine(mainBody, '<span class="err">&gt;&gt; CONNECTION LOST</span>');
await sleep(400);
// 断电
await powerOff();
}
// ════════════════════════════════════════════════════════════════
// 渲染循环
// ════════════════════════════════════════════════════════════════
function loop(ts) {
if(ts - lastFrame >= 33) {
T++;
advOcean();
renderOcean();
lastFrame = ts;
}
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
main();
</script>
</body>
</html>
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6de10a3a3a6b288408fbd208c6a96212
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+205
View File
@@ -0,0 +1,205 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数据之海</title>
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body { background:#000; overflow:hidden; }
canvas { display:block; }
</style>
</head>
<body>
<canvas id="c"></canvas>
<script>
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const FONT_SIZE = 13;
const CW = 7.8;
const CH = FONT_SIZE;
let COLS, ROWS;
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
COLS = Math.floor(canvas.width / CW);
ROWS = Math.floor(canvas.height / CH);
ctx.font = `${FONT_SIZE}px "Courier New"`;
ctx.textBaseline = 'top';
}
resize();
window.addEventListener('resize', () => { resize(); initWaves(); });
// ── Wave config ───────────────────────────────────────────────────
const WAVE_COUNT = 5;
const SHORE_ROWS = 3;
let waves = [];
function waveSpacing() { return (ROWS - SHORE_ROWS) / WAVE_COUNT; }
function makeWave(y) {
return {
y,
speed: 0.12 + Math.random() * 0.06,
// Three sine components for an organic, non-repeating crest
a1: 1.5 + Math.random() * 1.0, f1: 0.045 + Math.random() * 0.025, p1: Math.random() * Math.PI * 2,
a2: 0.45 + Math.random() * 0.3, f2: 0.10 + Math.random() * 0.05, p2: Math.random() * Math.PI * 2,
a3: 0.18 + Math.random() * 0.12, f3: 0.19 + Math.random() * 0.07, p3: Math.random() * Math.PI * 2,
};
}
function initWaves() {
const sp = waveSpacing();
waves = [];
for (let i = 0; i < WAVE_COUNT + 2; i++) {
waves.push(makeWave(-sp + i * sp));
}
}
initWaves();
function crestOf(w, c) {
return w.y
+ Math.sin(c * w.f1 + w.p1) * w.a1
+ Math.sin(c * w.f2 + w.p2) * w.a2
+ Math.sin(c * w.f3 + w.p3) * w.a3;
}
// ── Multi-frequency noise — breaks up diagonal banding ────────────
// Returns 0..1, no visible periodicity at normal zoom
function bodyNoise(c, r, t) {
return (
Math.sin(c * 1.3 + r * 0.7 + t * 0.11) * 0.35 +
Math.sin(c * 0.37 + r * 1.17 + t * 0.07) * 0.30 +
Math.sin(c * 2.1 + r * 0.31 + t * 0.19) * 0.20 +
Math.sin(c * 0.71 + r * 2.03 + t * 0.05) * 0.15
) * 0.5 + 0.5;
}
// Separate noise for 0/1 character choice — different frequency so
// character grid doesn't line up with density grid
function charNoise(c, r, t) {
return Math.sin(c * 0.97 + r * 1.53 + t * 0.13) > 0 ? '1' : '0';
}
const CREST_CHARS = ['~','≈','~','≈','∿','~','~','≈'];
let T = 0;
let last = 0;
function render() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const sp = waveSpacing();
const shoreY = ROWS - SHORE_ROWS;
// ── Waves ─────────────────────────────────────────────────────
waves.sort((a, b) => a.y - b.y);
for (let r = 0; r < shoreY; r++) {
for (let c = 0; c < COLS; c++) {
// Find which wave owns this cell
let ownWave = null, ownDepth = Infinity;
for (const w of waves) {
const cr = crestOf(w, c);
const depth = r - cr;
if (depth >= -0.5 && depth < ownDepth) {
ownDepth = depth;
ownWave = w;
}
}
if (!ownWave) continue; // above all waves → empty sky
const depth = ownDepth;
const depthRatio = Math.min(1, depth / sp);
const proximity = Math.max(0, Math.min(1, ownWave.y / shoreY));
let bright = 0, ch = '';
if (depth < 1.0) {
// ── CREST ──────────────────────────────────────────────
bright = 0.55 + proximity * 0.45;
const idx = Math.floor((c * 0.35 + T * 0.07) % CREST_CHARS.length);
ch = CREST_CHARS[idx];
} else {
// ── WAVE BODY ──────────────────────────────────────────
// Brightness: high near crest, smooth power-curve fade to 0
bright = Math.pow(1 - depthRatio, 1.5) * (0.18 + proximity * 0.62);
if (bright < 0.03) continue;
// Density mask: multi-frequency noise → no banding
const n = bodyNoise(c, r, T * 0.06);
// Threshold: crest area always dense, fades to ~50% at bottom of body
// Use a smooth S-curve so the transition looks organic
const threshold = depthRatio * depthRatio * 0.65;
if (n < threshold) continue;
ch = charNoise(c, r, T);
}
const v = Math.round(Math.min(bright, 1) * 255);
ctx.fillStyle = `rgb(${v},${v},${v})`;
ctx.fillText(ch, c * CW, r * CH);
}
}
// ── Shore foam ─────────────────────────────────────────────────
for (let r = shoreY; r < ROWS; r++) {
const dInShore = (r - shoreY) / SHORE_ROWS;
for (let c = 0; c < COLS; c++) {
// Foam uses same multi-freq noise so it doesn't look striped either
const n = bodyNoise(c, r, T * 0.2);
const bright = (1 - dInShore) * (0.3 + n * 0.6);
if (bright < 0.06) continue;
const v = Math.round(bright * 255);
ctx.fillStyle = `rgb(${v},${v},${v})`;
const ci = Math.floor((c * 0.4 + T * 0.1) % CREST_CHARS.length);
ctx.fillText(
r === shoreY ? CREST_CHARS[ci] : (n > 0.5 ? '1' : '0'),
c * CW, r * CH
);
}
}
}
function advance() {
const sp = waveSpacing();
for (const w of waves) {
// Slight acceleration as wave nears shore (shoaling)
const proximity = Math.max(0, w.y / (ROWS - SHORE_ROWS));
w.y += w.speed * (1 + proximity * 0.4);
// Slowly shift phases to keep crest shape evolving
w.p1 += 0.008; w.p2 -= 0.005; w.p3 += 0.011;
}
waves = waves.filter(w => w.y < ROWS + sp);
const topY = waves.length ? Math.min(...waves.map(w => w.y)) : 0;
while (waves.length < WAVE_COUNT + 2) {
waves.push(makeWave(topY - sp));
}
}
function loop(ts) {
if (ts - last >= 33) { // 30 fps cap
T++;
advance();
render();
last = ts;
}
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
</script>
</body>
</html>
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0ded52c61acc39e45bdd32f5ccec0cc6
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,153 @@
fileFormatVersion: 2
guid: cae13c4075c3f5943acd79c393d7dc93
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
@@ -0,0 +1,153 @@
fileFormatVersion: 2
guid: 8e0b68f1e994fc24b80e5a480c61602b
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
+135
View File
@@ -0,0 +1,135 @@
Shader "Custom/FrostedGlass"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
[Header(Blur)]
_BlurRadius ("Blur Radius", Range(0, 20)) = 4.0
_BlurSamples ("Blur Quality", Range(4, 32)) = 16
[Header(Frost Noise)]
_FrostIntensity ("Frost Distortion", Range(0, 0.03)) = 0.005
_FrostScale ("Frost Scale", Range(10, 300)) = 100
[Header(Glass Tint)]
_GlassTint ("Glass Tint Color", Color) = (0.9, 0.95, 1.0, 1.0)
_TintStrength ("Tint Strength", Range(0, 1)) = 0.15
[Header(Adjust)]
_Brightness ("Brightness", Range(0.5, 1.5)) = 1.0
_Saturation ("Saturation", Range(0, 2)) = 0.85
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MainTex_TexelSize;
fixed4 _Color;
float _BlurRadius;
float _BlurSamples;
float _FrostIntensity;
float _FrostScale;
fixed4 _GlassTint;
float _TintStrength;
float _Brightness;
float _Saturation;
float2 hash22(float2 p)
{
float3 p3 = frac(float3(p.xyx) * float3(0.1031, 0.1030, 0.0973));
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.xx + p3.yz) * p3.zy) * 2.0 - 1.0;
}
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.color = v.color * _Color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float2 texelSize = _MainTex_TexelSize.xy;
float2 frostNoise = hash22(i.uv * _FrostScale + _Time.y * 0.3);
float2 frostOffset = frostNoise * _FrostIntensity;
float samples = max(4.0, _BlurSamples);
float3 blurColor = float3(0, 0, 0);
float blurAlpha = 0;
float totalWeight = 0.0;
float goldenAngle = 2.39996323;
for (float s = 0; s < samples; s++)
{
float radius = sqrt((s + 0.5) / samples) * _BlurRadius;
float angle = s * goldenAngle;
float2 offset = float2(cos(angle), sin(angle)) * radius * texelSize + frostOffset;
float weight = 1.0 - (s / samples) * 0.3;
fixed4 sample = tex2D(_MainTex, i.uv + offset);
blurColor += sample.rgb * weight;
blurAlpha += sample.a * weight;
totalWeight += weight;
}
blurColor /= totalWeight;
blurAlpha /= totalWeight;
blurColor *= _Brightness;
float gray = dot(blurColor, float3(0.299, 0.587, 0.114));
blurColor = lerp(float3(gray, gray, gray), blurColor, _Saturation);
blurColor = lerp(blurColor, blurColor * _GlassTint.rgb, _TintStrength);
return fixed4(blurColor * i.color.rgb, blurAlpha * i.color.a);
}
ENDCG
}
}
Fallback "Sprites/Default"
}
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: f4ae6a3baad97d44aad69d7b6dd52a4c
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,2 @@
// Placeholder — original file was missing, causing compilation errors.
// Remove this file and its .meta when no longer needed.
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a551ba11587aff40b255d796234373b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+48
View File
@@ -0,0 +1,48 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: OceanAsciiDoor
m_Shader: {fileID: 4800000, guid: b7e4f2a8c9d3e1f5a6b8c0d2e4f6a8b0, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BodyBright: 0.492
- _BodyDensity: 0.359
- _CrestBright: 0.752
- _CrestWidth: 0.92
- _FoamIntensity: 0.894
- _FoamSpeed: 0.133
- _GridCols: 91.7
- _GridRows: 64.4
- _HorizonRow: 0
- _PerspectiveStrength: 0
- _ShoreRows: 5
- _WaveCount: 7
- _WaveSpeed: 1.43
m_Colors:
- _BgColor: {r: 0, g: 0, b: 0, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
m_BuildTextureStacks: []
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d8f3e2a1b4c5d6e7f8a9b0c1d2e3f4a5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
+341
View File
@@ -0,0 +1,341 @@
Shader "Custom/OceanAsciiDoor"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
[Header(Grid)]
_GridCols ("Grid Columns", Range(20, 200)) = 80
_GridRows ("Grid Rows", Range(15, 150)) = 55
[Header(Wave)]
_WaveSpeed ("Wave Speed", Range(0, 1.0)) = 0.15
_WaveCount ("Wave Count", Range(2, 10)) = 5
_ShoreRows ("Shore Rows", Range(1, 8)) = 3
[Header(Intensity)]
_CrestBright ("Crest Brightness", Range(0.3, 1)) = 0.85
_BodyBright ("Body Brightness", Range(0.1, 1)) = 0.65
[Header(Background)]
_BgColor ("Background Color", Color) = (0,0,0,1)
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
fixed4 _BgColor;
float _GridCols;
float _GridRows;
float _WaveSpeed;
float _WaveCount;
float _ShoreRows;
float _CrestBright;
float _BodyBright;
// ─── Bitmap font: 5 wide x 7 tall ───────────────────────────
// charId mapping (matches HTML CREST_CHARS order):
// 0 = ~ (tilde)
// 1 = ≈ (approx equal)
// 2 = ∿ (sine wave)
// 3 = 0 (zero digit)
// 4 = 1 (one digit)
//
// HTML: CREST_CHARS = ['~','≈','~','≈','∿','~','~','≈']
// indices: 0 1 0 1 2 0 0 1
// So crestCharMap[8] = {0,1,0,1,2,0,0,1}
float glyphPixel(int charId, int px, int py)
{
// ~ (tilde) — classic wave shape
if (charId == 0)
{
if (py == 2) return (px == 0 || px == 1) ? 1.0 : 0.0;
if (py == 3) return (px == 0 || px == 2 || px == 4) ? 1.0 : 0.0;
if (py == 4) return (px == 3 || px == 4) ? 1.0 : 0.0;
return 0.0;
}
// ≈ (approx equal — stacked double tilde)
if (charId == 1)
{
if (py == 1) return (px == 0 || px == 1) ? 1.0 : 0.0;
if (py == 2) return (px == 0 || px == 2 || px == 4) ? 1.0 : 0.0;
if (py == 3) return (px == 3 || px == 4) ? 1.0 : 0.0;
if (py == 4) return (px == 0 || px == 1) ? 1.0 : 0.0;
if (py == 5) return (px == 0 || px == 2 || px == 4) ? 1.0 : 0.0;
if (py == 6) return (px == 3 || px == 4) ? 1.0 : 0.0;
return 0.0;
}
// ∿ (sine wave — S-curve)
if (charId == 2)
{
if (py == 0) return (px == 1 || px == 2) ? 1.0 : 0.0;
if (py == 1) return (px == 0 || px == 3) ? 1.0 : 0.0;
if (py == 2) return (px == 0) ? 1.0 : 0.0;
if (py == 3) return (px == 0 || px == 4) ? 1.0 : 0.0;
if (py == 4) return (px == 4) ? 1.0 : 0.0;
if (py == 5) return (px == 1 || px == 4) ? 1.0 : 0.0;
if (py == 6) return (px == 2 || px == 3) ? 1.0 : 0.0;
return 0.0;
}
// 0 (zero digit)
if (charId == 3)
{
if (py == 0) return (px >= 1 && px <= 3) ? 1.0 : 0.0;
if (py == 1) return (px == 0 || px == 4) ? 1.0 : 0.0;
if (py == 2) return (px == 0 || px == 3 || px == 4) ? 1.0 : 0.0;
if (py == 3) return (px == 0 || px == 2 || px == 4) ? 1.0 : 0.0;
if (py == 4) return (px == 0 || px == 1 || px == 4) ? 1.0 : 0.0;
if (py == 5) return (px == 0 || px == 4) ? 1.0 : 0.0;
if (py == 6) return (px >= 1 && px <= 3) ? 1.0 : 0.0;
return 0.0;
}
// 1 (one digit)
if (charId == 4)
{
if (py == 0) return (px == 2) ? 1.0 : 0.0;
if (py == 1) return (px == 1 || px == 2) ? 1.0 : 0.0;
if (py >= 2 && py <= 5) return (px == 2) ? 1.0 : 0.0;
if (py == 6) return (px >= 1 && px <= 3) ? 1.0 : 0.0;
return 0.0;
}
return 0.0;
}
// HTML: CREST_CHARS = ['~','≈','~','≈','∿','~','~','≈']
// Map index 0..7 to charId
int crestCharId(int idx)
{
// 0:~ 1:≈ 2:~ 3:≈ 4:∿ 5:~ 6:~ 7:≈
if (idx == 1 || idx == 3 || idx == 7) return 1; // ≈
if (idx == 4) return 2; // ∿
return 0; // ~
}
// ─── Wave math (matches HTML prototype) ──────────────────────
float bodyNoise(float c, float r, float t)
{
return (
sin(c * 1.3 + r * 0.7 + t * 0.11) * 0.35 +
sin(c * 0.37 + r * 1.17 + t * 0.07) * 0.30 +
sin(c * 2.1 + r * 0.31 + t * 0.19) * 0.20 +
sin(c * 0.71 + r * 2.03 + t * 0.05) * 0.15
) * 0.5 + 0.5;
}
float hash11(float p)
{
p = frac(p * 0.1031);
p *= p + 33.33;
p *= p + p;
return frac(p);
}
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.color = v.color * _Color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float2 uv = i.uv;
float r = (1.0 - uv.y) * _GridRows;
float c = uv.x * _GridCols;
float shoreY = _GridRows - _ShoreRows;
float sp = shoreY / max(1.0, _WaveCount);
float cellFracX = frac(c);
float cellFracY = frac(r);
int glyphX = (int)(cellFracX * 5.0);
int glyphY = (int)(cellFracY * 7.0);
glyphX = clamp(glyphX, 0, 4);
glyphY = clamp(glyphY, 0, 6);
float cellC = floor(c);
float cellR = floor(r);
// HTML's T increments by 1 per frame (~30fps)
float T = _Time.y * _WaveSpeed * 30.0;
float time = _Time.y;
// ── Wave layer computation ───────────────────────────────
float bestDepth = 999.0;
float bestWaveY = -999.0;
for (float wi = 0; wi < _WaveCount + 2; wi++)
{
float wSeed = hash11(wi * 7.31);
float wSpeed = 0.12 + wSeed * 0.06;
float baseY = -sp + wi * sp;
baseY += T * wSpeed * (1.0 + saturate(baseY / max(1.0, shoreY)) * 0.4);
baseY = baseY - floor(baseY / (_GridRows + sp)) * (_GridRows + sp) - sp;
float p1 = hash11(wi * 3.17) * 6.2832;
float p2 = hash11(wi * 5.23) * 6.2832;
float p3 = hash11(wi * 9.41) * 6.2832;
p1 += time * 0.008;
p2 -= time * 0.005;
p3 += time * 0.011;
float a1 = 1.5 + hash11(wi * 2.71) * 1.0;
float a2 = 0.45 + hash11(wi * 4.13) * 0.3;
float a3 = 0.18 + hash11(wi * 6.67) * 0.12;
float f1 = 0.045 + hash11(wi * 1.23) * 0.025;
float f2 = 0.10 + hash11(wi * 8.37) * 0.05;
float f3 = 0.19 + hash11(wi * 11.03) * 0.07;
float crest = baseY
+ sin(cellC * f1 + p1) * a1
+ sin(cellC * f2 + p2) * a2
+ sin(cellC * f3 + p3) * a3;
float d = cellR - crest;
if (d >= -0.5 && d < bestDepth)
{
bestDepth = d;
bestWaveY = crest;
}
}
// ── Determine brightness and character ───────────────────
float bright = 0.0;
int charId = 0;
if (bestWaveY > -900.0 && cellR < shoreY)
{
float depthVal = bestDepth;
float depthRatio = saturate(depthVal / max(0.001, sp));
float proximity = saturate(bestWaveY / max(0.001, shoreY));
if (depthVal < 1.0)
{
// ── CREST ────────────────────────────────────
bright = (0.55 + proximity * 0.45) * _CrestBright;
// HTML: idx = floor((c * 0.35 + T * 0.07) % CREST_CHARS.length)
float rawIdx = cellC * 0.35 + T * 0.07;
int idx = ((int)floor(rawIdx)) % 8;
if (idx < 0) idx += 8;
charId = crestCharId(idx);
}
else
{
// ── WAVE BODY ────────────────────────────────
bright = pow(1.0 - depthRatio, 1.5) * (0.18 + proximity * 0.62) * _BodyBright;
if (bright >= 0.03)
{
float n = bodyNoise(cellC, cellR, T * 0.06);
float threshold = depthRatio * depthRatio * 0.65;
if (n < threshold)
{
bright = 0.0;
}
else
{
// HTML: charNoise → sin > 0 ? '1' : '0'
charId = sin(cellC * 0.97 + cellR * 1.53 + T * 0.13) > 0 ? 4 : 3;
}
}
else
{
bright = 0.0;
}
}
}
else if (cellR >= shoreY)
{
// ── Shore foam ───────────────────────────────────
float dInShore = (cellR - shoreY) / max(1.0, _ShoreRows);
float n = bodyNoise(cellC, cellR, T * 0.2);
bright = (1.0 - dInShore) * (0.3 + n * 0.6) * _BodyBright;
if (bright >= 0.06)
{
if (cellR < shoreY + 1.0)
{
// HTML: CREST_CHARS[floor((c*0.4+T*0.1) % 8)]
float rawCi = cellC * 0.4 + T * 0.1;
int ci = ((int)floor(rawCi)) % 8;
if (ci < 0) ci += 8;
charId = crestCharId(ci);
}
else
{
// HTML: n > 0.5 ? '1' : '0'
charId = n > 0.5 ? 4 : 3;
}
}
else
{
bright = 0.0;
}
}
// ── Render glyph on black background ─────────────────────
bright = saturate(bright);
float pixel = 0.0;
if (bright > 0.01)
pixel = glyphPixel(charId, glyphX, glyphY);
float charBright = pixel * bright;
float3 col = float3(charBright, charBright, charBright) * i.color.rgb;
// Black opaque background — character brightness on top
float3 finalCol = lerp(_BgColor.rgb, col, charBright);
float finalAlpha = _BgColor.a * i.color.a;
return fixed4(finalCol, finalAlpha);
}
ENDCG
}
}
Fallback "Sprites/Default"
}
+9
View File
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: b7e4f2a8c9d3e1f5a6b8c0d2e4f6a8b0
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:
+49
View File
@@ -0,0 +1,49 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: OceanDoorTransition
m_Shader: {fileID: 4800000, guid: 703ffd710faf80240baeb155b0f61d3e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BlurDetail: 0.5
- _BlurScale: 10
- _BodyBright: 0.65
- _CrestBright: 0.85
- _GridCols: 80
- _GridRows: 55
- _Progress: 0
- _ShoreRows: 3
- _WaveCount: 5
- _WaveSpeed: 0.15
m_Colors:
- _BgColor: {r: 0, g: 0, b: 0, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _CrestColor: {r: 0.54999995, g: 0.62, b: 0.7, a: 1}
- _DeepColor: {r: 0.01, g: 0.04, b: 0.079999976, a: 1}
- _FoamColor: {r: 0.75, g: 0.8, b: 0.85, a: 1}
- _MidColor: {r: 0.049999982, g: 0.11999995, b: 0.17999998, a: 1}
m_BuildTextureStacks: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4852ce1aa5bbc0f41834b844e959e125
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
+153
View File
@@ -0,0 +1,153 @@
fileFormatVersion: 2
guid: fc72859f1ffe4824e8b66e47abce8871
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
+1 -1
View File
@@ -46,7 +46,7 @@ TextureImporter:
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
alignment: 9
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 40
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
Binary file not shown.
@@ -0,0 +1,153 @@
fileFormatVersion: 2
guid: 65581c14d5b5dad4e991ee88882656de
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 107.5
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -1,4 +1,4 @@
title: Start
title: Start
tags: demo
position: 0,-80
---
@@ -13,6 +13,7 @@ position: 0,-80
<<declare $h = 0>> //风筝高度
<<declare $gameStage = 3>>
<<jump 裂隙>>
jg: 数据溢出:未知来源的记忆… #line:08064ea
jg: VERYFYING…bool seaExists = false; waiting for imput… #autonext #line:06668da
【场景由全黑闪变为全白】 #line:02921d4
@@ -390,6 +391,8 @@ position: 280,320
title: 裂隙
position: 0,420
---
<<set $gameStage=4>>
<<fade_out 1>>
你追着她的脚步向前走。风迎面呼啸而来,从你的耳边掠过。 #line:0c49fe1
你的脚似乎踢到了什么东西,一道看不见的墙拦住了你。 #line:095b5aa
???: …路斯… #line:087b5e6
@@ -511,18 +514,11 @@ position: 0,740
<<endif>>
你对这种声音感到很熟悉。 #line:0585cfe
->靠近黑暗<<if $gameStage==5>> #line:0ad2d5f
黑暗中闪烁着无数微弱的绿色光点。那是无数段代码。 #line:0dc92eb
其中一段正静静地漂浮在你的面前。 #line:07400da
print_string("海是存在的吗?")<br> bit seaExists = ? <br> /> _ #line:06ab3b0
->0 #line:0d60dbe
print_string("海是存在的吗?")<br> bit seaExists = ? <br> />0_ #line:0f93eb7
->1 #line:0d2597e
print_string("海是存在的吗?")<br> bit seaExists = ? <br> />1_ #line:07767a0
->不存在 #line:0281ab1
print_string("海是存在的吗?")<br> bit seaExists = ? <br> />不存在_ #line:016dbcb
me: … #line:0eb74c3
->提交 #line:06aef37
<<jump 苏醒>>
// 黑暗中闪烁着无数微弱的绿色光点。那是无数段代码。 #line:0dc92eb
// 其中一段正静静地漂浮在你的面前。 #line:07400da
//命令行终端输入,玩家自由输入字符串,提交后跳转到苏醒节点
<<hide_dialog>>
<<show_dream_terminal>>
->后退 #line:0d563fe
<<jump 记忆空间>>
<<jump 门>>
@@ -673,6 +669,7 @@ title: 苏醒
position: 0,940
---
矩形: 等待校验结果… #line:0e25a30
//这里发生一些代码流和glitch,然后屏幕闪一下关闭
<<wait 3>>
黑暗似乎流动了起来,矩形的边界变得模糊。延展。吞噬了一切。 #line:077d1ea
你感到自己仿佛融化了,变成了它的一部分。你的意识快速地向前穿梭,把你刚刚溶解的身躯远远地抛在后面。 #line:02b66ac
@@ -18,7 +18,7 @@ position: 300,50
//【流程相关】
//gameStage
<<declare $gameStage=1>>
<<declare $gameStage=100>>
//每个模块的首次检查
<<declare $emoChecked=false>>
+350
View File
@@ -0,0 +1,350 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 12
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 0
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 0
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 3
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
buildHeightMesh: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &519420028
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 519420032}
- component: {fileID: 519420031}
- component: {fileID: 519420029}
- component: {fileID: 519420030}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &519420029
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 519420028}
m_Enabled: 1
--- !u!114 &519420030
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 519420028}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_AllowHDROutput: 1
m_UseScreenCoordOverride: 0
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_Version: 2
m_TaaSettings:
quality: 3
frameInfluence: 0.1
jitterScale: 1
mipBias: 0
varianceClampScale: 0.9
contrastAdaptiveSharpening: 0
--- !u!20 &519420031
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 519420028}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 1, g: 1, b: 1, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 34
orthographic: 1
orthographic size: 5
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 0
m_HDR: 1
m_AllowMSAA: 0
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 0
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &519420032
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 519420028}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &619394800
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 619394802}
- component: {fileID: 619394801}
m_Layer: 0
m_Name: Global Light 2D
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &619394801
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 619394800}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ComponentVersion: 1
m_LightType: 4
m_BlendStyleIndex: 0
m_FalloffIntensity: 0.5
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Intensity: 1
m_LightVolumeIntensity: 1
m_LightVolumeIntensityEnabled: 0
m_ApplyToSortingLayers: 00000000
m_LightCookieSprite: {fileID: 0}
m_DeprecatedPointLightCookieSprite: {fileID: 0}
m_LightOrder: 0
m_AlphaBlendOnOverlap: 0
m_OverlapOperation: 0
m_NormalMapDistance: 3
m_NormalMapQuality: 2
m_UseNormalMap: 0
m_ShadowIntensityEnabled: 0
m_ShadowIntensity: 0.75
m_ShadowVolumeIntensityEnabled: 0
m_ShadowVolumeIntensity: 0.75
m_LocalBounds:
m_Center: {x: 0, y: -0.00000011920929, z: 0}
m_Extent: {x: 0.9985302, y: 0.99853027, z: 0}
m_PointLightInnerAngle: 360
m_PointLightOuterAngle: 360
m_PointLightInnerRadius: 0
m_PointLightOuterRadius: 1
m_ShapeLightParametricSides: 5
m_ShapeLightParametricAngleOffset: 0
m_ShapeLightParametricRadius: 1
m_ShapeLightFalloffSize: 0.5
m_ShapeLightFalloffOffset: {x: 0, y: 0}
m_ShapePath:
- {x: -0.5, y: -0.5, z: 0}
- {x: 0.5, y: -0.5, z: 0}
- {x: 0.5, y: 0.5, z: 0}
- {x: -0.5, y: 0.5, z: 0}
--- !u!4 &619394802
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 619394800}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 519420032}
- {fileID: 619394802}
+7
View File
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1395a649a08bede42868208a7f351b9a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+1 -1
View File
@@ -9709,7 +9709,7 @@ Transform:
m_GameObject: {fileID: 519420028}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.009999275, y: 0, z: -10}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
+495 -6
View File
@@ -229,7 +229,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!4 &218986883
Transform:
m_ObjectHideFlags: 0
@@ -239,7 +239,7 @@ Transform:
m_GameObject: {fileID: 218986882}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1.5, z: 0}
m_LocalPosition: {x: 0, y: 1.28, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
@@ -286,17 +286,51 @@ SpriteRenderer:
m_SortingLayerID: 844151739
m_SortingLayer: 1
m_SortingOrder: 4
m_Sprite: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_Sprite: {fileID: 21300000, guid: cce9c17d47c59574e800c74224f152a1, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 8.930233, y: 5.023256}
m_Size: {x: 24.966095, y: 16.64}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &383939067
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 383939068}
m_Layer: 0
m_Name: Door
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &383939068
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 383939067}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.1, y: -0.33, z: 0}
m_LocalScale: {x: 1.2519865, y: 1.2519865, z: 1.2519865}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1847534533}
- {fileID: 871445756458438719}
- {fileID: 1798110989954288715}
m_Father: {fileID: 861686055}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &676277670
GameObject:
m_ObjectHideFlags: 0
@@ -512,6 +546,8 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1665718542}
- {fileID: 383939068}
- {fileID: 132823523}
- {fileID: 1424643109}
- {fileID: 969796817}
@@ -616,6 +652,74 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &1116970087
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1116970090}
- component: {fileID: 1116970089}
- component: {fileID: 1116970088}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1116970088
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116970087}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name:
m_EditorClassIdentifier:
m_SendPointerHoverToParent: 1
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &1116970089
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116970087}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &1116970090
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1116970087}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1420961917
GameObject:
m_ObjectHideFlags: 0
@@ -969,6 +1073,138 @@ Transform:
m_Children: []
m_Father: {fileID: 132823523}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!21 &1583441590
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sprites/Default
m_Shader: {fileID: 4800000, guid: f4ae6a3baad97d44aad69d7b6dd52a4c, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlphaTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- PixelSnap: 0
- _BlurRadius: 6.1
- _BlurSamples: 16
- _Brightness: 1
- _EnableExternalAlpha: 0
- _FrostIntensity: 0.005
- _FrostScale: 100
- _Saturation: 0.85
- _TintStrength: 0.15
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Flip: {r: 1, g: 1, b: 1, a: 1}
- _GlassTint: {r: 0.9, g: 0.95, b: 1, a: 1}
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
m_BuildTextureStacks: []
--- !u!1 &1665718541
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1665718542}
- component: {fileID: 1665718543}
m_Layer: 0
m_Name: Square
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1665718542
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1665718541}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 861686055}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1665718543
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1665718541}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 844151739
m_SortingLayer: 1
m_SortingOrder: 4
m_Sprite: {fileID: 21300000, guid: 65581c14d5b5dad4e991ee88882656de, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1 &1784701441
GameObject:
m_ObjectHideFlags: 0
@@ -1015,6 +1251,258 @@ MonoBehaviour:
m_EditorClassIdentifier:
bubbleSlotGroup: {fileID: 676277672}
director: {fileID: 0}
--- !u!1 &1847534532
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1847534533}
- component: {fileID: 1847534534}
m_Layer: 0
m_Name: Frame
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1847534533
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1847534532}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0.56, y: 0.78, z: 0}
m_LocalScale: {x: 1.2659231, y: 1.2659231, z: 1.2659231}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 383939068}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1847534534
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1847534532}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 844151739
m_SortingLayer: 1
m_SortingOrder: 9
m_Sprite: {fileID: 21300000, guid: cae13c4075c3f5943acd79c393d7dc93, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 5.76, y: 10.24}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!212 &444731254618205655
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1961593256904873106}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 1583441590}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 844151739
m_SortingLayer: 1
m_SortingOrder: 7
m_Sprite: {fileID: 21300000, guid: 8e0b68f1e994fc24b80e5a480c61602b, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!4 &871445756458438719
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1961593256904873106}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0.36, z: 0}
m_LocalScale: {x: 0.5816116, y: 0.6470429, z: 0.96935266}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 383939068}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!4 &1798110989954288715
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5724422998448711206}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0.73, y: 0.42, z: 0}
m_LocalScale: {x: 6.4114747, y: 9.576583, z: 0.76267165}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 383939068}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1961593256904873106
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 871445756458438719}
- component: {fileID: 444731254618205655}
m_Layer: 0
m_Name: DoorGlassSea
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!1 &5724422998448711206
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1798110989954288715}
- component: {fileID: 6341161960392504824}
m_Layer: 0
m_Name: Door_CodeSea
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!212 &6341161960392504824
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5724422998448711206}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: d8f3e2a1b4c5d6e7f8a9b0c1d2e3f4a5, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 844151739
m_SortingLayer: 1
m_SortingOrder: 10
m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
@@ -1023,3 +1511,4 @@ SceneRoots:
- {fileID: 676277671}
- {fileID: 1784701442}
- {fileID: 861686055}
- {fileID: 1116970090}