It’s finally here and boy is a it big one! The last LEGO® IDEAS release for 2021 and it couldn’t be any more fitting than the LEGO IDEAS 21330 Home Alone set, an iconic Christmas movie released a month before Christmas, this set has the potential to fly off the shelves…
Children of the 80s especially are going to want to get their hands on this set, its not going to be for the faint hearted though, with it consisting of nearly 4000 pieces its going to keep you busy for a little while!
I do not normally look at the sets with the playability factor in mind but this set may convert me to think about playing rather than building, with Kevin making so many iconic tricks, pranks and traps on the Wed Bandits its hard to not relive the hilarious moments from the movie.
Before we jump in to the set I feel like we would not be doing the movie credit without getting in the Home Alone Christmas spirit. If you have never watched Home Alone before check out the trailer, read this post and then find the movie online so you can understand what all the hype is all about!
How great was that huh? So are you going to give the movie a watch?
Those of you that are hardcore Home Alone fans, here’s a little treat for you to put on whilst you are reading…
This set is due to be released on 1st November 2021 and will be priced at US$249.99 / AU$399.99 / CA$349.99 / £249.99 so expect a big build with loads of cool features inside and out, for those AFOL Home Alone fans out there, the McCalister House made from 3955 parts is surely an investment you can get behind?
The LEGO® 21330 Home Alone set includes 5 minifigures, from left to right they are:
Kevin McCallister
Marv
Harry
Kate McCallister (Kevin’s Mum)
“Old Man” Marley
We do not see many accessories for the figures but what they have given is great, crowbars for the Harry and Marc to break in and the shovel for Marley. If you can remember Kevin through Marley was the infamous serial killer “the South Bend Shovel Slayer”.
Unsurprisingly I have seen so many posts about the new Home Alone set all over social media, there are a lot of people who do not think must of how the house looks. I will be honest, this really surprised me as I think it looks absolutely amazing.
I wouldn’t say that the exterior is the most detailed set that I have seen but it works and for me being a huge fan of the movie I could quickly tell what it was. Especially when you put Kevin looking up to no good at the front door!
What I love the most about this set it the way it is completely interactive, as I mentioned earlier playability isn’t something I really look for in any LEGO® set, and that includes whether it is a official LEGO® set or a MOC too…
This set however, I seem to have fallen in love with, it’s brought the kid out in me and I want to just start playing, setting my own traps, reliving the moments that Kevin did in the first Home Alone movie.
Can you remember each of the iconic moments from the rooms in the above picture? How many traps can you see?
Another thing that I love about this set is the way the front is accessible in 5 sections. As an example, if you just wanted to recreate the scene where Kevin looks in the bathroom mirror, puts on aftershave and screams just open the top right section. I will stop now otherwise I will keep rambling on, ha!
As you can see from the above image this house is built in to three modular floors, each floor can be removed to allow for access top down. I think you would agree that this is again a nice little feature to have on such a big set.
I am really looking forward to getting my hands on this set, is it the best set out there? Not sure its the best but its up there in the top 10 for me as it brings back fond memories of laughter and mayhem from when I was young, however I do wonder how interesting this set will be to people who have not watched the Home Alone movies…
Drop a comment below to share your thought’s about this set. Will you be getting it? If you do where are you going to store it…
/* 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);