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,
|
||||
openWorldshaperStudioWindow,
|
||||
} from "./worldshaperStudio/windowing";
|
||||
import { CHANGELOG_SECTIONS, CHANGELOG_SPLASH_VERSION } from "./worldshaperStudio/changelogData";
|
||||
|
||||
type WorldDefaultPayload = {
|
||||
worldId?: string;
|
||||
|
|
@ -224,6 +225,33 @@ function WorldshaperLauncher() {
|
|||
</button>
|
||||
</div>
|
||||
) : 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>
|
||||
</main>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -88,6 +88,68 @@ body {
|
|||
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-secondary-btn {
|
||||
min-height: 46px;
|
||||
|
|
@ -1212,6 +1274,11 @@ button.danger:not(:disabled):hover {
|
|||
flex-direction: column;
|
||||
}
|
||||
|
||||
.launcher-whats-new-head {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.launcher-primary-btn,
|
||||
.launcher-secondary-btn {
|
||||
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 { CHANGELOG_SECTIONS, CHANGELOG_SPLASH_VERSION } from "./changelogData";
|
||||
import type { ChangelogItem } from "./changelogData";
|
||||
|
||||
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 DEFAULT_WIDTH = 700;
|
||||
const DEFAULT_HEIGHT = 560;
|
||||
|
|
@ -56,65 +57,6 @@ type OpenOptions = {
|
|||
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) {
|
||||
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