‘Attack of the Clones’ the second instalment in George Lucas’ Star Wars prequel trilogy, features a moment many franchise-fans had been waiting a long time for: when the diminutive “space frog” actually brandishes his Jedi weapon, an emerald green lightsaber to kick some serious Sith ass, in the form of Count Dooku (played by Christopher Lee).
That is the inspiration behind this set (75255), rendered in 1,771 pieces and aimed at ten years and above (as with the latter set), for a rather painstaking (some might say boring) build as you construct a simple armature or base frame out of Technic components to which later, more detailed aspects are added onto much in the same way the Brick Headz models are put together.
This latter stage, in particular, has drawn the ire of many Lego-Heads.
Whilst this might not win any awards for being the sexiest build ever, the designers have, in my book achieved an impressive look, through a steady and patience-testing accumulation of standard pieces to emulate this Jedi master’s flowing robes and hooded cloak.
Much like viewing a painting by Monet, this build looks better from afar. Yet dedicated builders will be rewarded with a finished model that does resemble the original Stuart Freeborn design for the character based upon Ralph McQuarry’s initial concept art.
Just make sure to keep reviewing your build against the instruction manual and box photos for, as this blogger surely discovered, to find you that have made a mistake (especially with the clothing) only to then puzzle over the dizzyingly complex structure of brick design is a Sisyphean recipe for frustration and a sure-fire ticket to the opticians!
Yoda’s head, in particular, is a marvel of LEGO® engineering: with its cranial bumps and simulated, scattered tufts of hair; not to mention the articulated eyelids that grant myriad expressions, it is a tricky but well-conceived piece of assembly. Nearly 800 years there are in those eyes.
I don’t understand those critics who bemoan that, in LEGO® brick form, Yoda looks like an ‘alien’: from where do these people think he comes? Forced to ponder, I am.
To be fair, the packet photos do not do Yoda’s eyes justice as in reality they actually look superbly splendid when built. The ears are expertly crafted, through a combined wall of regular, slanted and curved green bricks. But the ears remain static, which is a shame.
However, you can position the fingers, with its claws, around the cleverly-realised lightsaber but the posability is somewhat limited due to the overall immobile nature of the piece, mainly due to the fixed arms.
The toes, which, like the fingers, have articulated joints are useful for display purposes. What you are left with is a surprisingly accurate rendition of the Jedi Master that stands 16”/41cm and answers the question: “Yoda, you seek Yoda!”
Many light-years beyond AOTC, a renewed appetite for all-things-Star Wars gave us the Disney Plus streaming sensation: ‘The Mandalorian’ which featured an infant descendent of Yoda’s species, otherwise known as Baby Yoda or ‘The Child’ (later to be fully named ‘Grogu’ in the second season). ‘The Child’ quickly became a fan favourite for all genders and key narrative force (geddit?) for the show. Now here he is, taking up 1,073 bricks to capture his essence (set 75318).
The build is, of course, extremely similar to the one outlined above, but due to the smaller size of the character and hence lower brick (not to mention price) count, the detailing on the cloak and head isn’t as intricate here. The same Technic base frame upon which four sides to the character are built up separately and subsequently attached, must be erected first.
However, to paraphrase Han Solo, LEGO® have made some “special modifications themselves” to the earlier model, and we now get moveable ears that are facilitated by ball and socket joints that grant up-and-down movement.
Best of all, a great deal of expression, courtesy of a simple but surprisingly effective hinge-and-cradle mouth piece is a winning feature.
As you might assume, The Child’s hands are considerably smaller than Yoda’s and are therefore less easy to manoeuvre but have the same ball-jointed wrists with three clip-and-bar fingers that allow for some key poses:
You can make Grogu hold his much coveted gearshift knob accessory (just don’t tell Mando!) or give him that Force power gesture familiar to all Force-sensitive types.
The same fluid, subtle motion of the neck is afforded, and indeed improved upon here, as with Yoda and it is amazing just how much expressivity you can achieve through the simplest adjustment of The Child’s ears in conjunction with his mouth’s minute movements.
It is all about the eyes though, which despite not having the adjustable eyelids of the bigger model, perfectly capture, through their opaque design, that utterly adorable and cute characteristic of The Child’s screen incarnation that made him such an enduring hit with audience’s worldwide.
This model of The Child, however, does not come with the feet that gave the Yoda set recognisable design elements:
But as with Grogu’s depiction in the show, we never actually saw his feet so their omission here is apt. His cloak fans out to enclose a solid foundation of tiles.
Standing over 7.5”(19cm), 8.5”(21cm) wide and 5”(13cm) deep, he’s far easier to carry around than Yoda is anyway.
As with Yoda, the overall lack of interaction and playability might prove to be a drawback to some, but The Child continues to demonstrate Lego’s commitment to high quality depictions of pop culture favourites. Eager to capitalise on the growing success of ‘The Mandalorian’ and The Child’s almost universal adoration with audiences across the globe, LEGO® cleverly released this model in October of 2020, just in time for Christmas.
Both sets come with information plaques, adorned with scaled-down mini-figures. The Child’s head is made from rubber and manages to, even at this scale, convey an accuracy of expression. Just on the cuteness factor alone, this one wins over the Yoda mini-figure although that does come with a tiny lightsaber so what you gain on the swings you lose on the roundabouts, to coin a phrase.
You could play Top Trumps with these sets all day (“You can’t open Yoda’s mouth” vs. “The Child has no eye lids”) but one thing cannot be denied: they look great together, they surely do. Which model has the Force for you?
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
/**
* Renders all unrendred LinkedIn Badges on the page
*/
window.LIRenderAll = function () {
var CALLBACK_NAME = 'LIBadgeCallback', //Must match callback on helpers.js
BADGE_NAMES = '.LI-profile-badge, .LI-entity-badge',
// TODO -- tracking param for other badge types
TRACKING_PARAM = 'profile-badge',
responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
expectedResponses = 0, //Keeps track of number of responses to expect
scripts = [ ], //Keeps track of scripts added for proper cleanup when finished
childScripts = {}, //Keeps track of child scripts to render
badges = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));
var i, len, badge, rendered;
for (i = 0, len = badges.length; i < len; i++) {
badge = badges[i];
rendered = badge.getAttribute('data-rendered');
if (!rendered) {
expectedResponses++;
badge.setAttribute('data-rendered', true);
renderBadge(badge);
}
}
function isCNDomain() {
if (typeof window !== "undefined") {
var hostName = window.location && window.location.hostname || '';
return (/linkedin(-ei)?.cn$/).test(hostName);
}
return false;
}
function generateUrl(isEI) {
var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
if (isCNDomain()) {
return domainPrefix + ".cn/";
}
return domainPrefix + ".com/";
}
function getBadgeKeyQueryParams(badge) {
return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
return attr.name.lastIndexOf('data-key-', 0) !== -1;
}).map(function (attr) {
// Most browsers automatically lowercase the attribute name when its being read
// We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
});
}
/*
* Renders a single badge on the page
* @param badge: div element of badge to render
*/
function renderBadge(badge) {
var size = badge.getAttribute('data-size'),
locale = badge.getAttribute('data-locale'),
type = badge.getAttribute('data-type'),
theme = badge.getAttribute('data-theme'),
vanity = badge.getAttribute('data-vanity'),
version = badge.getAttribute('data-version'),
isEI = badge.hasAttribute('data-ei'),
entity = badge.getAttribute('data-entity'),
isCreatePage = badge.hasAttribute('data-iscreate'),
uid = Math.round(1000000 * Math.random()),
baseUrl = generateUrl(isEI),
queryParams = [
'locale=' + encodeURIComponent(locale),
'badgetype=' + encodeURIComponent(type),
'badgetheme=' + encodeURIComponent(theme),
'uid=' + encodeURIComponent(uid),
'version=' + encodeURIComponent(version)
],
url;
if (version === 'v2') {
baseUrl += 'view';
queryParams.push('badgesize=' + encodeURIComponent(size));
queryParams.push('entity=' + encodeURIComponent(entity));
queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
} else {
baseUrl += 'profile';
queryParams.push('maxsize=' + encodeURIComponent(size));
queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
queryParams.push('vanityname=' + encodeURIComponent(vanity));
}
if (isCreatePage) {
queryParams.push('fromCreate=true');
}
url = baseUrl + '?' + queryParams.join('&');
badge.setAttribute('data-uid' , uid);
jsonp(url); //Calls responseHandler when done
}
/**
* Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
* @param badgeHtml: String representing contents of the badge
* @param badgeUid: UID of the badge to target
**/
function responseHandler(badgeHtml, badgeUid) {
responsesReceived ++;
var i, badge, uid, isCreate;
var defaultWidth = 330 // max possible width
var defaultHeight = 300 // max possible height
for (i = 0, len = badges.length; i < len; i++) {
badge = badges[i];
// isCreate needed to prevent reloading artdeco script tag
isCreate = badge.getAttribute('data-iscreate');
uid = parseInt(badge.getAttribute('data-uid'), 10);
if (uid === badgeUid) {
var badgeMarkup = `<body>${badgeHtml}</body>`
var iframe = document.createElement('iframe');
iframe.onload = function() {
var iframeBody = iframe.contentWindow.document.body;
// 5 px buffer to avoid the badge border being cut off.
iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
};
iframe.setAttribute('frameBorder', '0');
iframe.style.display = 'block';
badge.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(badgeMarkup);
iframe.contentWindow.document.close();
replaceScriptTags(badge, isCreate);
}
}
tryClean();
}
// These functions are needed because badge markup is added via innerHtml property which does not run script tags
function replaceScriptTags(node, isCreate) {
if (shouldReplaceNode(node, isCreate)) {
node.parentNode.replaceChild(cloneScriptNode(node), node);
childScripts[node.src] = true;
} else {
var i = 0,
children = node.childNodes;
while (i < children.length) {
replaceScriptTags(children[i++], isCreate);
}
}
return node;
}
function shouldReplaceNode(node, isCreate) {
return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
}
function isScriptNode(node) {
return node.tagName === 'SCRIPT';
}
function cloneScriptNode(node){
var script = document.createElement("script");
for( var i = node.attributes.length-1; i >= 0; i-- ) {
script.setAttribute( node.attributes[i].name, node.attributes[i].value );
}
return script;
}
// Gets all incoming responses
window[CALLBACK_NAME] = responseHandler;
/**
* Tries to clean added tags
**/
function tryClean() {
//Clean up after all requests are done..
//Accounts for people including script more than once
var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
if (done) {
delete window[CALLBACK_NAME];
// remove all script tags
scripts.map(function(script){
document.body.removeChild(script);
});
}
}
/*
* Makes Jsonp request, responses handles by CALLBACK_NAME
* @param url String: url of server to make request to
*/
function jsonp(url) {
var script = document.createElement('script');
script.src = url;
scripts.push(script);
document.body.appendChild(script);
}
};
if (document.readyState === 'complete') {
window.LIRenderAll();
} else {
window.addEventListener('load', window.LIRenderAll, false);
}
})(window);