梦境制作存档
This commit is contained in:
@@ -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
|
||||
|
||||
最终实现需:
|
||||
- 生产级、功能完整
|
||||
- 视觉冲击力强、有记忆点
|
||||
- 美学统一、观点明确
|
||||
- 细节精心打磨
|
||||
|
||||
创造性地解读需求,做出令人意外的选择。每个设计都应独一无二,体现对场景的专门思考。
|
||||
+3515
-1086
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
```
|
||||
|
||||
控制流程:场景中放置 Volume(Global / 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
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f7e9b2391f1a4845a0dbe928367434a
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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">> 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:
|
||||
@@ -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?'>':' '}</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?'>':' '}</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">/></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">/></span> <span class="warn">${userInput}</span>\n\n` +
|
||||
`<span class="sys">>> 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">/></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">/></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">>> VALIDATING</span>');
|
||||
let dots = 0;
|
||||
const dotInterval = setInterval(() => {
|
||||
dots = (dots+1) % 4;
|
||||
checking.innerHTML = `<span class="sys">>> 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">>> WARNING: PROTOTYPE_BARRIER INTEGRITY CHECK FAILED</span>');
|
||||
appendLine(mainBody, '<span class="err">>> 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">>> 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:
|
||||
@@ -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:
|
||||
Binary file not shown.
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d8f3e2a1b4c5d6e7f8a9b0c1d2e3f4a5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b7e4f2a8c9d3e1f5a6b8c0d2e4f6a8b0
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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.
@@ -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:
|
||||
@@ -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>>
|
||||
|
||||
@@ -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}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1395a649a08bede42868208a7f351b9a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user