Show what's new on launcher

This commit is contained in:
Andraxion 2026-06-26 21:19:33 -04:00
parent 2ad785f65d
commit 56b2331968
4 changed files with 160 additions and 60 deletions

View file

@ -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&apos;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>
); );

View file

@ -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%;

View 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>;
}>;

View file

@ -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);
} }