Show what's new on launcher
This commit is contained in:
parent
2ad785f65d
commit
56b2331968
4 changed files with 160 additions and 60 deletions
|
|
@ -3,6 +3,7 @@ import {
|
||||||
buildWorldshaperStudioUrl,
|
buildWorldshaperStudioUrl,
|
||||||
openWorldshaperStudioWindow,
|
openWorldshaperStudioWindow,
|
||||||
} from "./worldshaperStudio/windowing";
|
} from "./worldshaperStudio/windowing";
|
||||||
|
import { CHANGELOG_SECTIONS, CHANGELOG_SPLASH_VERSION } from "./worldshaperStudio/changelogData";
|
||||||
|
|
||||||
type WorldDefaultPayload = {
|
type WorldDefaultPayload = {
|
||||||
worldId?: string;
|
worldId?: string;
|
||||||
|
|
@ -224,6 +225,33 @@ function WorldshaperLauncher() {
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
|
<section className="launcher-whats-new">
|
||||||
|
<div className="launcher-whats-new-head">
|
||||||
|
<h2 className="launcher-whats-new-title">What's New</h2>
|
||||||
|
<p className="launcher-whats-new-version">{CHANGELOG_SPLASH_VERSION}</p>
|
||||||
|
</div>
|
||||||
|
<div className="launcher-whats-new-list">
|
||||||
|
{CHANGELOG_SECTIONS.map((section) => (
|
||||||
|
<section key={section.title} className="launcher-whats-new-section">
|
||||||
|
<h3 className="launcher-whats-new-section-title">{section.title}</h3>
|
||||||
|
<ul className="launcher-whats-new-bullets">
|
||||||
|
{section.items.map((item, index) => {
|
||||||
|
const key = `${section.title}-${index}`;
|
||||||
|
if (typeof item === "string") {
|
||||||
|
return <li key={key}>{item}</li>;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<li key={key}>
|
||||||
|
<div>{item.text}</div>
|
||||||
|
{item.note ? <div className="launcher-whats-new-note">{item.note}</div> : null}
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,68 @@ body {
|
||||||
margin-top: 18px;
|
margin-top: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new {
|
||||||
|
margin-top: 24px;
|
||||||
|
padding-top: 18px;
|
||||||
|
border-top: 1px solid rgba(120, 170, 230, 0.16);
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-head {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: baseline;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-version {
|
||||||
|
margin: 0;
|
||||||
|
color: #9fd8ff;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-list {
|
||||||
|
display: grid;
|
||||||
|
gap: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-section {
|
||||||
|
display: grid;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-section-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.92rem;
|
||||||
|
color: #dff2ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-bullets {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 18px;
|
||||||
|
display: grid;
|
||||||
|
gap: 8px;
|
||||||
|
color: #d5dfec;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-bullets li {
|
||||||
|
line-height: 1.45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-note {
|
||||||
|
margin-top: 3px;
|
||||||
|
color: #9bacbe;
|
||||||
|
font-size: 0.88rem;
|
||||||
|
}
|
||||||
|
|
||||||
.launcher-primary-btn,
|
.launcher-primary-btn,
|
||||||
.launcher-secondary-btn {
|
.launcher-secondary-btn {
|
||||||
min-height: 46px;
|
min-height: 46px;
|
||||||
|
|
@ -1212,6 +1274,11 @@ button.danger:not(:disabled):hover {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.launcher-whats-new-head {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
.launcher-primary-btn,
|
.launcher-primary-btn,
|
||||||
.launcher-secondary-btn {
|
.launcher-secondary-btn {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
||||||
63
src/worldshaperStudio/changelogData.ts
Normal file
63
src/worldshaperStudio/changelogData.ts
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
export type ChangelogItem = string | {
|
||||||
|
text: string;
|
||||||
|
note?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const CHANGELOG_SPLASH_VERSION = "2026-06-22-world-editor-release-v6";
|
||||||
|
|
||||||
|
export const CHANGELOG_SECTIONS = [
|
||||||
|
{
|
||||||
|
title: "World Rendering",
|
||||||
|
items: [
|
||||||
|
"Added live image opacity support in the renderer for both tiles and entity sprites.",
|
||||||
|
{
|
||||||
|
text: "Fixed world painting placement drift on very wide displays.",
|
||||||
|
note: "For the many of you out there using this on superultrawide monitors.",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Graphics & Animation",
|
||||||
|
items: [
|
||||||
|
"Added animation frame timelines to the Graphic Painter.",
|
||||||
|
"Added frame duplication, enable/disable, delete, drag reorder, and default-frame selection.",
|
||||||
|
"Added animation speed and playback settings to graphics data.",
|
||||||
|
"Added animation preview support from the Graphic Painter.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "World Overview",
|
||||||
|
items: [
|
||||||
|
"Added chunk move, duplicate, rotate, flip, and delete workflows from the world overview.",
|
||||||
|
"Added safer chunk management feedback and confirmation flows.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Editor Stability",
|
||||||
|
items: [
|
||||||
|
"Fixed unified graphics conversion so saved image properties flow correctly into runtime tiles and sprites.",
|
||||||
|
"Improved live refresh behavior for renderer-facing graphic updates.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "TBI (To Be Implemented [Or thought about really hard])",
|
||||||
|
items: [
|
||||||
|
"Image animations on renderer with hotkey toggle and engine override toggle.",
|
||||||
|
"Add premade frame duplication effects, like duplicate and shift by direction.",
|
||||||
|
"Add animation effects that change opacity over time.",
|
||||||
|
"Add animation effects that shift saturation over time.",
|
||||||
|
"Work on a system to use an image with animation frames as a tile strip, placing the instance once but specifying which subimage to use.",
|
||||||
|
"Add an elevation system where some tiles can appear at different z-indexes and show a different subframe.",
|
||||||
|
"Allow unsnapped tile placement, possibly via hotkey, writing into a chunk patch instead of chunk rows.",
|
||||||
|
"Explore whether unsnapped placement should be true free placement or an additional sub-layer drawn over an existing layer.",
|
||||||
|
"Add custom prompts for text input and confirmation dialogs.",
|
||||||
|
"Prototype terrain painters for meta chunk painting and tile replacement, like rivers, mountains, and woods.",
|
||||||
|
"Talk to Justin more about zone and subzone music regions via chunk painting.",
|
||||||
|
"Autotilers.",
|
||||||
|
"Prefab stamps.",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
] as const satisfies ReadonlyArray<{
|
||||||
|
title: string;
|
||||||
|
items: ReadonlyArray<ChangelogItem>;
|
||||||
|
}>;
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { clampFloatingWindowRect } from "./floatingWindowUtils";
|
import { clampFloatingWindowRect } from "./floatingWindowUtils";
|
||||||
|
import { CHANGELOG_SECTIONS, CHANGELOG_SPLASH_VERSION } from "./changelogData";
|
||||||
|
import type { ChangelogItem } from "./changelogData";
|
||||||
|
|
||||||
const CHANGELOG_SPLASH_WINDOW_KEY = "changelogSplash";
|
const CHANGELOG_SPLASH_WINDOW_KEY = "changelogSplash";
|
||||||
const CHANGELOG_SPLASH_VERSION = "2026-06-22-world-editor-release-v6";
|
|
||||||
const CHANGELOG_SPLASH_STORAGE_KEY = `worldshaper:studio:changelog-seen:${CHANGELOG_SPLASH_VERSION}`;
|
const CHANGELOG_SPLASH_STORAGE_KEY = `worldshaper:studio:changelog-seen:${CHANGELOG_SPLASH_VERSION}`;
|
||||||
const DEFAULT_WIDTH = 700;
|
const DEFAULT_WIDTH = 700;
|
||||||
const DEFAULT_HEIGHT = 560;
|
const DEFAULT_HEIGHT = 560;
|
||||||
|
|
@ -56,65 +57,6 @@ type OpenOptions = {
|
||||||
markSeen?: boolean;
|
markSeen?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ChangelogItem = string | {
|
|
||||||
text: string;
|
|
||||||
note?: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const CHANGELOG_SECTIONS = [
|
|
||||||
{
|
|
||||||
title: "World Rendering",
|
|
||||||
items: [
|
|
||||||
"Added live image opacity support in the renderer for both tiles and entity sprites.",
|
|
||||||
{
|
|
||||||
text: "Fixed world painting placement drift on very wide displays.",
|
|
||||||
note: "For the many of you out there using this on superultrawide monitors.",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Graphics & Animation",
|
|
||||||
items: [
|
|
||||||
"Added animation frame timelines to the Graphic Painter.",
|
|
||||||
"Added frame duplication, enable/disable, delete, drag reorder, and default-frame selection.",
|
|
||||||
"Added animation speed and playback settings to graphics data.",
|
|
||||||
"Added animation preview support from the Graphic Painter.",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "World Overview",
|
|
||||||
items: [
|
|
||||||
"Added chunk move, duplicate, rotate, flip, and delete workflows from the world overview.",
|
|
||||||
"Added safer chunk management feedback and confirmation flows.",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Editor Stability",
|
|
||||||
items: [
|
|
||||||
"Fixed unified graphics conversion so saved image properties flow correctly into runtime tiles and sprites.",
|
|
||||||
"Improved live refresh behavior for renderer-facing graphic updates.",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "TBI (To Be Implemented [Or thought about really hard])",
|
|
||||||
items: [
|
|
||||||
"Image animations on renderer with hotkey toggle and engine override toggle.",
|
|
||||||
"Add premade frame duplication effects, like duplicate and shift by direction.",
|
|
||||||
"Add animation effects that change opacity over time.",
|
|
||||||
"Add animation effects that shift saturation over time.",
|
|
||||||
"Work on a system to use an image with animation frames as a tile strip, placing the instance once but specifying which subimage to use.",
|
|
||||||
"Add an elevation system where some tiles can appear at different z-indexes and show a different subframe.",
|
|
||||||
"Allow unsnapped tile placement, possibly via hotkey, writing into a chunk patch instead of chunk rows.",
|
|
||||||
"Explore whether unsnapped placement should be true free placement or an additional sub-layer drawn over an existing layer.",
|
|
||||||
"Add custom prompts for text input and confirmation dialogs.",
|
|
||||||
"Prototype terrain painters for meta chunk painting and tile replacement, like rivers, mountains, and woods.",
|
|
||||||
"Talk to Justin more about zone and subzone music regions via chunk painting.",
|
|
||||||
"Autotilers.",
|
|
||||||
"Prefab stamps.",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
function clampWindowRect(layerRect: LayerRect, left: number, top: number, width: number, height: number) {
|
function clampWindowRect(layerRect: LayerRect, left: number, top: number, width: number, height: number) {
|
||||||
return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT);
|
return clampFloatingWindowRect(layerRect, left, top, width, height, MIN_WIDTH, MIN_HEIGHT, DEFAULT_WIDTH, DEFAULT_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue