Dec.06.2022 redesign of Amazon's New World MMO with character classes.
PART 1: Preface.
PART 2: Research & Design.
PART 3: V1 Demo UX.
PART 4: Class UI Code.
PART 5: Dash UX.
PART 6: To-Do & Foliage / Wild Grass Demo.
Fast-loading & high performant, AAA Game-like interface using Vanilla JS without canvas or WebGL (alt versions use React & GraphQL). Supports 15+ devices (mobile & desktop). Amazon's New World has 50,000 Daily Active Users (peaking @ 913,000).
It functions as a general graphics test of JS components that is easy to understand (plus, no black screens for those who have Canvas disabled).
For other WebGL & Canvas Demos...
PLATFORM | LOADS | Image | PERFORMANCE |
---|---|---|---|
Chrome (Brave, Vivaldi, Edge) | Yes | AVIF | Best |
Safari (iOS & desktop) | Yes | WebP | Sluggish (see Performance Tips). |
Palemoon (Firefox for old tech) | Yes | WebP | Slow (see Performance Tips). |
TOR Browser (slightly old Firefox for privacy) | Yes | WebP* | Sluggish (see Performance Tips). |
Firefox | No | AVIF | Functional & no errors (bug stops at array value 14 vs 20+). |
Konqueror | Yes | WebP |
*AVIF can be enabled with advanced options.
NOTE: The app will attempt to use AVIF, then WebP, & then fall back to png & jpg.
TEST | RESULT | DETAILS |
---|---|---|
First Cotentful Paint (FCP) | 0.300 s (0 - 3.800 s is fast). | Time to load & render any element on the page. |
Time to Interactive (TTI) | 0.300 s (0 - 3.400 s is fast). | Time to load 'useful content' (like buttons) & register most UI event handlers. |
Speed Index (SI) | 0.500 s (0 - 1.800 s is fast). | Time to display content using video frame capture (like with transition animations). |
Total Blocking Time (TBT) | 0.000 s (0 - 0.200 s is fast). | Time threaded tasks are blocked (like by image & font loading or 3rd party code). |
Largest Cotentful Paint (LCP) | 0.500 s (0 - 2.500 s is fast). | Time to render largest or main content. |
Cumulative Layout Shift (CLS) | 0.002 s (0 - 0.100 s is fast). | Time visible UI elements (like a button or text) move, creating an unpredictable layout. |
NOTE: Lighthouse benchmark results are effected by the speed & quality of the server & your internet connection. I used a Verizon 4G hotspot for this, a typical cabled connection could deliver better results.
Frame from a 3 second video Amazon sent (animation was not snappy so timing is not important).
This was done pre-research to clean-up the assets & experiment with possibilities (plus, have something early to present Amazon).
World of Warcraft character creation screen (in 2021).
World of Warcraft (WoW) was one of the most popular MMOs, so I went through the forum archives for user feedback from various updates (of which there was many).
Baldur's Gate 3 character creation screen (in 2021).
Much better, but still could use some improvement.
First v0 character creation mock for New World MMO.
Amazon feedback was to follow the original UI closer so it would be easier to judge & complete the project.
Original icon as a poster.
Quick redesign to pop as small as 16px x 16px.
Character class Markdown format for GraphQL.
NW MMO UX v1 ↗ (requires WebP images).
NOTE: v1-2+ is Vanilla JavaScript, while v0 was React & GraphQL (v0 demo not shown -- may refactor & post later).
After interviewing @ Google, they mentioned wanting to see Vanilla JavaScript examples. I actually prefer to code in Vanilla JS & microservice rot can be tedious to maintain.
Also, I think using React & GraphQL with microservices may have made the v0 demo project difficult for Amazon to understand (despite using Markdown for classes).
Converting the project to Vanilla JS would be easy, especially when considering a large refactor.
TEST | RESULT | DETAILS |
---|---|---|
First Cotentful Paint (FCP) | 0.300 s (0 - 3.000 s is fast). | Time to load & render any element on the page. |
Time to Interactive (TTI) | 0.300 s (0 - 3.000 s is fast). | Time to load 'useful content' (like buttons) & register most UI event handlers. |
Speed Index (SI) | 0.300 s (0 - 1.800 s is fast). | Time to display content using video frame capture (like with transition animations). |
Total Blocking Time (TBT) | 0.000 s (0 - 0.200 s is fast). | Time threaded tasks are blocked (like by image & font loading or 3rd party code). |
Largest Cotentful Paint (LCP) | 1.300 s (0 - 2.500 s is fast). | Time to render largest or main content. |
Cumulative Layout Shift (CLS) | 0.000 s (0 - 0.100 s is fast). | Time visible UI elements (like a button or text) move, creating an unpredictable layout. |
NOTE: Lighthouse benchmark results are effected by the speed & quality of the server & your internet connection. I used a Verizon 4G hotspot for this, a typical cabled connection could deliver better results.
NW MMO UX v2 ↗ (does NOT require WebP or AVIF).
//************************
// JavaScript ES 6:
//************************
//--------------------------------------------------------------------------------------------
// Class Card UI [from DHTML String literals]:
//--------------------------------------------------------------------------------------------
cardArticle_DOM.insertAdjacentHTML('BeforeEnd', `
<div class="radioDiv" id="div${class1stUpper_S}${ttt_totalClassCards_i_g}">
<input type="radio" name="classRadio" id="radio${class1stUpper_S}${ttt_totalClassCards_i_g}" class="radio0" />
<label for="radio${class1stUpper_S}${ttt_totalClassCards_i_g}" class="radioLabel"> Set ${class1stUpper_S} character class.
<div class="zIndex-999 radio0unchecked_display-inline"></div>
</label>
<a href="/#${class_S_}" class="maxW-350px_maxH-745px aLink">
<div class="portraitDiv">
<article id="portrait${class1stUpper_S}" class="portraitScale portraitScaleUp">
<div class="divMenu cardFogFx classFrameExtrasOn"></div>
<div class="divMenu w-302px_h-702px_opac-0x5 classBg"></div>
<div class="hashBg opac-1"></div>
<div class="divMenu w-302px_h-702px_opac-0x5 classBg"></div>
<div class="divMenu trans-all-0x4_opac-0x5 opac-1 classNamePlate"></div>
<div class="divMenu trans-all-0x4_opac-0x5 classFrameOn"></div>
<div class="divMenu trans-0x4s_opac-0 clip_opac-0x5 classFrameOn"></div>
<div class="divMenu trans-0x4s_opac-0 radio0checked_fadeSlide-1s-easeOut-1_opac-0x7 greeble-tr"></div>
<div class="divPortrait${class1stUpper_S}">
<div class="portraitAll divMenu portrait0 opac-1 portrait${class1stUpper_S}"></div>
<div class="portraitAll divMenu colorDodge_scale-0x93_trans-opac-0x2s-scale0x4s_opac-0 radio0checked__glowAnim_1s portrait${class1stUpper_S}"></div>
<div class="portraitAll divMenu color__scale_0x93__opac_0 opac-1 portrait${class1stUpper_S}"></div>
<div class="portraitAll divMenu screen_trans-0x4s_scale-0x93_opac-0 radio0checked__glowAnim_1s portrait${class1stUpper_S}"></div>
</div>
<div class="classFontDiv top16px">
<h2 class="classFontTitle opac-0x75">${classTitle_S}</h2>
</div>
<div class="classFontDiv top19px">
<h3 class="classFontItem top618px">${item1_S_}</h3>
</div>
<div class="classFontDiv top16px">
<h3 class="classFontItem top660px">${item2_S_}</h3>
</div>
<div class="excerptDiv">
<div class="excerptFont opac-0x75">${excerpt_S_}
</div>
</div>
</article>
</div>
</a>
</div>
`); // END cardArticle_DOM.insertAdjacentHTML.
//************************
// JavaScript ES 6:
//************************
//--------------------------------------------------------------------------------------------
// ttt_doCard_fn [create custom class cards with function calls]:
//--------------------------------------------------------------------------------------------
// NOTE: only ttt_doCard_fn function code parsed (NO comments or anything else).
// Media must be `adventurer`, `expatriate`, `explorer`, `soldier`, `stowaway` or it defaults to `stowaway`.
// Use back tics '`' instead to capture quotes & literals.
// Use a blank space ` ` to avoid setting defaults.
// Debug test:
//ttt_doCard_fn();
//ttt_doCard_fn('');
//ttt_doCard_fn(`className`, `item1`, `item2`, `excerpt`, `media`);
// Base class cards:
ttt_doCard_fn(`adventurer`, `great axe`, `reed blowgun`, `Now having a night, a day, and still another night following before me in New Bedford, ere I could embark for my destined port, it became a matter of concernment where I was to eat and sleep meanwhile.`);
ttt_doCard_fn(`expatriate`, `dual pistols`, `worn whip`, `Tex was bound and half-dragged and half-carried down the slope to the bottom of the valley. Bringing his horse down was a hard proposition for him to bear.`);
ttt_doCard_fn(`explorer`, `heirloom rapier`, `cracked compass`, `He was a very silent man by custom. All day he hung round the cove or upon the cliffs with a brass telescope; all evening he sat in a corner dreaming of riches and fame.`);
ttt_doCard_fn(`soldier`, `sterling rifle`, `health potion`, `You are off to the war, Prince?" said Anna Pavlovna. "General Kutuzov," said Bolkonski, speaking French and stressing the last syllable of each battlefield. `);
ttt_doCard_fn(`stowaway`, `rusty longsword`, `alley dice`, `Then she sprang away and ran around and around the desks and benches, with Tom after her, and took refuge in a corner at last, with her little friend besides her and ready to fight.`);
// Blank Spacer div:
ttt_doCard_fn();
// Custom cards:
ttt_doCard_fn(`wizard`, `spellbook`, `mystical ring`, `Not the wandering wizard that gave Old Took a pair of magic diamond studs that fastened themselves and never came undone till ordered? Not the fellow who used to tell such wonderful tales at parties, about dragons and goblins and giants and the rescue of princesses and the unexpected luck of widows' sons?`, `soldier`);
ttt_doCard_fn(`fur trapper`, `bear trap`, `coonskin hood`, `Gotta catch 'em all!`, `adventurer`);
ttt_doCard_fn(`thief`, `blackjack`, `lock picks`, `Steals, literally.`, `stowaway`);
ttt_doCard_fn(`bard`, `guitar`, `flute`, `Musics man.`, `expatriate`);
ttt_doCard_fn(`assassin`, `frog poison`, `hidden dagger`, `Backstabber!`, `explorer`);
Like this post? Read more from the ^UX topic.