Review: No Mario’s Sky/DMCA’s Sky

In my last post, I talked about the recent copyright and trademark infringement takedown actions initiated by Nintendo against No Mario’s Sky and various other games hosted on GameJolt.

Here’s a review of No Mario’s Sky/DMCA’s Sky.

No Mario’s Sky was made in a weekend for Ludum Dare 36. It is a mashup of Hello Games’ No Man’s Sky and Nintendo’s Super Mario Bros. The theme for Ludum Dare 36 was Ancient Technologies. It’s unclear how this game relates to the theme. However, due to the popularity and familiarity of Mario and No Man’s Sky, the game got quite a lot of attention in very little time, and was picked up by websites such as Kotaku and Polygon.

The premise of the game is that Mario is looking for the Princess on an infinite series of procedurally generated 2D Mario worlds. The worlds wrap around a circle, giving them the appearance of planetoids.

Once you’ve satisfied your curiosity on one world, you can summon your spaceship and take off in search of another world. Apart from the color scheme of each world, there’s not all that much to differentiate them, which may be due to the game being developed in just 72 hours, or may be a deliberate commentary on the procedurally generated sameness that many players of No Man’s Sky have complained about.

No Mario's Sky

From a Mario standpoint, the game only borrows the titular character, the goomba enemy, and the basic concept of jumping on platforms and enemies, collecting coins, and hitting platforms from below. No sprite artwork is taken from Nintendo’s games, as all sprites and tiles appear to have been re-created by the ASMB development team, and while the Mario and Goomba characters are recognizable, they are not in any way confusable with Nintendo art assets. There is no brick breaking, no super mario mushroom, no star man, no fire flower. Again, this is likely due to the compressed schedule under which the game was created. Each world plays its own variant of the Super Mario Bros theme music, which is again a re-done composition, not the original music ripped from the Nintendo game.

In short, from a copyright infringement standpoint, this game is in a gray area, but pretty safe, in that nothing is actually copied directly from the Nintendo games. This game is about as much a Mario ripoff as KC Munchkin was a Pac Man ripoff. (Atari successfully sued Philips to stop the sale of K.C. Munchkin, even though the game was not Pac Man, but the case was bullshit and probably would not have succeeded were similar suit brought today.)

From a trademark infringement standpoint, of course, the game clearly is using the identity and behavior of the famed Nintendo mascot, without authorization or permission of Nintendo. If this were a commercial product, it would certainly be liable for trademark infringement. However, this is probably closer to a parody, or a “fan game” or homage. Unfortunately, the latter two concepts don’t exist as legal categories. It might be that the creators could have successfully defended the game as a parody, but that would have involved going to court and rolling the dice to find out whether they could persuade a judge of that. There’s simply no way an independent developer has the time or resources to try to defend what amounts to a weekend’s worth of work against a company the size of Nintendo for what would surely be months or years of litigation.

If ASMB had avoided use of the Mario name, perhaps renaming him something recognizable, like “Mustachhio”, say, and if the music had been done in a way that was recognizably Mario-eque without having the exact same melody, probably Nintendo would not have had any copyright leg to stand on, and the game could have remained as-is. From a trademark standpoint, though, it probably does run afoul of Nintendo’s trademark on the Mario Bros. franchise, given that it uses the Mario and Goomba names and likenesses.

While the game is fairly bland as-is, the concept is certainly fun and held promise. Were the game to be developed further, to better incorporate the Mario characters and play mechanics, it could have been a very enjoyable game.

DMCA’s Sky removes the Mario and Goomba artwork, replacing them with a generic space man and alien, and the music has also been replaced, but otherwise the game is much the same. Interestingly, the jump, coin and 1-up pickup sounds remain recognizably Mario-esque, but again do not appear to be direct rips from original sources.

DMCA's Sky

I suppose Hello Games could also make an IP infringement claim if they wanted to, and force the game to remove the procedurally generated planet hopping, at which point the game wouldn’t have much left in it anymore. Notably, so far at least, they haven’t.

It turns out, though, that when you break down just about any video game into its fundamentals, pretty much every game is based on, or borrows from, concepts that came from some other game. And — this is the important thing that must not be lost sight of — concepts are not subject to copyright. Not even play mechanics are copyrightable. Only actual works are copyrightable.

Of course, copyright is only one branch of Intellectual Property law, and there’s also potentially opportunity for patent and trademark lawsuits to shut down a game that borrows “too much” from a well known existing game.

Despite this, much of the charm of No Mario’s Sky was in its mash-up-ness, and this charm is effectively stripped from it by removing the Mario references. So clearly, the game derives some value from referencing the source material that it is based on. I don’t think that can be denied. I have a harder time seeing how this game harms either Nintendo or Hello, however. It was available for free, not for sale. It isn’t reasonably mistake-able for a real Nintendo game, and if that were a risk it could be prominently disclaimed on the title screen that it was not in any way connected to Nintendo, who retains full ownership of the “real” Mario characters. I see little evidence that the existence of this game or the numerous other Nintendo-IP infringing games done by fans over the years (including ROM hacks, homebrew games, de-makes, and homages) has in any way diminished the Nintendo brand or harmed Nintendo as a business.

The takedown of unauthorized fan games isn’t anything new — it’s just the latest in a string of consistent defenses of Nintendo’s IP rights. It’s clear that Nintendo is aggressive in protecting their IP rights, and have always been. This has been in part due to their corporate culture, but also in larger part due to the nature of IP law.

But IP law isn’t immutable. We could as a culture elect to shape law differently, if we could agree to.

Nintendo’s takedown of videos on youtube and elsewhere, of people playing their games who do not participate in or follow the rules set forth by Nintendo in the “Nintendo Creator’s Program” is ridiculous — it’s not a copyright infringement for me to play a video game, or to talk about a videogame, or to record me talking about a videogame while playing it, and footage of said videogame that I create should legally be my sole creation (while the characters owned by Nintendo and other IP-holders are still retained by those holders).

If I want to make a video of a videogame for purposes of review, criticism, or parody, I shouldn’t have to obtain the permission of the IP rights holders of the videogame, nor should I have to share revenue with them. They earned their revenue already through sale of the game, and did none of the work to produce the video, so why should they be entitled to a share of revenue generated by the video?

Likewise, if I want to make a videogame that references other videogames, much as a work of literature may reference other works of literature, creators should have some right to do so. Exactly how this should work out so that the original creator’s rights are protected and respected isn’t very clear, however.

Ultimately, the power seems to fall to those who have the deepest pockets with which to pay the most and best lawyers. As as a result, the culture, and the game playing public, is poorer for it.

Mario on iOS, Nintendo copyright takedown

Nintendo announced the first (authorized) appearance of Mario on iPhone a few days ago:

There’s much to be made of this.

Ten years ago, while the Wii was selling phenomenally well, there were some wild rumors about Nintendo and Apple teaming up to bring games to the Apple TV device. But, while tantalizing, these rumors never panned out, nor really made sense. While both companies were extremely successful on their own, they didn’t really seem to need each other, or have any reason to cooperate. Nintendo software licensees could have certainly helped put Apple TV in many more homes, but what could Apple have offered Nintendo, who weren’t having any trouble selling the Wii?

Fast forward to 2016, and the successor to the Wii, the Wii U, is widely regarded as a misstep for Nintendo, and now it appears maybe they do need some help. But rather than looking for it in the living room, where they are poised to launch their next-generation NX console in a few months, right now they are going straight for the pocket. Meanwhile, Apple’s huge hit from 2006, the iPhone, has been a juggernaut for much of these last ten years. And here is where Apple and Nintendo can help each other out.

It’s the first time in decades that Nintendo has put software out on a platform that it does not own. This could be seen as a concession that Nintendo is no longer dominant in gaming hardware, or simply an acknowledgment of the vitality of the mobile gaming market. While Nintendo have been hugely dominant in the handheld market since they released the Game Boy in 1989, smartphone and tablet devices have in the last decade created an even bigger market for games. With the massive success of Pokemon Go earlier this year, the writing was on the wall, and Nintendo making this move now only makes sense. In fact, it’s probably overdue.

Entitled Super Mario Run, it appears to be an endless runner type game rather than a typical 2D platformer. Due to the iPhone touch screen being the only controls, and a desire to make the game playable one-handed, this design addresses the constraints imposed by the user interface in about the only way that would work well.

More Nintendo Copyright Takedowns

Nintendo also made headlines this week by issuing takedown notices for a large number of unauthorized games that infringe upon Nintendo-owned trademarks, particularly Mario and Pokemon. It is not surprising at all that this should happen, but still disappointing for people who built or enjoyed those games. While many of these games may have been derivative and inferior games done in homage of, some were parodies or innovative or just fun, well done fan homages.

It’s too bad there doesn’t exist a legal framework in which fan-made games can co-exist peacefully with official releases by commercial studios, but licensing is only a solution if the IP-holder embraces it. Nintendo are within their rights to take these actions to protect their trademark and intellectual property rights, of course, and perhaps it is necessary for them to vigorously defend their trademarks or risk losing them entirely, but it’s nevertheless possible to set up a legal framework by which these unofficial games could be allowed. While it’s entirely ridiculous in my opinion for Nintendo to claim copyright and trademarks on speed run, Let’s Play, and review videos featuring their products, something like the Nintendo Creators Program would make a lot of sense for fan-produced games.

What might such a program look like? I would propose something like the following…

  1. The fangame creator would acknowledge that Nintendo created and owned whatever they owned.
  2. The fangame creator disclaims that Nintendo do not have any responsibility for content the fangame, and that the fangame is not an official Nintendo release.
  3. Any revenue derived from the fangame would need to be disclosed and shared with Nintendo.
  4. The fangame could be nixed by Nintendo (pulled from release) at their sole discretion at any time.

I very much doubt that a company like Nintendo would ever agree to such terms, but it’s too bad. Apart from perhaps Nintendo, everyone is worse off because of it.

The irony of this situation is that Nintendo can copyright and trademark its characters, but not the mechanics or genre of game. (Nor should it.) Someone can invent the infinite runner, and Nintendo can decide to do a Mario infinite runner game, and not owe anything to the inventor of the infinite runner game. So can anyone else. And Nintendo can make a running and jumping platform game, and anyone else can too, duplicating the Mario mechanics and rules system entirely if they should wish to, but simply can’t use the name Mario or the likeness of any of Nintendo’s graphical or audio assets.

GameMaker Humble Bundle – super cheap and source code too!

GameMaker Humble Bundle pay what you want, but for just $15 you can get licenses for GameMaker: Studio Professional and the ability to create games for HTML5, Android, iOS, and Windows UWP, which together normally cost several hundred dollars. The total value of the entire bundle is $1885, making this one of the best value bundles I’ve seen in the history of the Humble store.

Additionally, you can also get a number of commercially released indie games that were built in GameMaker, and for a few of those games, you even get the source code. It’s very exciting to be able to look at source code written by professionals to see how it’s done. Titles offering their source code include: Extreme Burger Defense, Freeway Mutant, Shep Hard, Angry Chicken, Galactic Missile Defense, Uncanny Valley, Ink, 10 Second Ninja X, Cook, Serve, Delicious!, Flop Rocket, Solstice, and Home.

The sheer cheapness of this giveaway leads me to wonder whether the release of GM:S 2.0 may be immanent. Time will tell. In the mean time, this is a spectacular value bundle and well worth buying for the project source alone.

GameMaker Marketplace new checkout system now allows direct downloads!

Yesterday, 9/7, I noticed a big spike in downloads of my GameMaker Marketplace assets. I also happened to notice when looking around on the Marketplace that they’ve changed the checkout so that you can download the .gmex files directly through your web browser, bypassing the My Library interface in the IDE.

As I’ve remarked several times in the past year, My Library is crippled by terrible performance when the user’s purchase manifest exceeds some number that is far too low. Allowing purchases to be downloaded directly through the browser makes a lot of sense, and is probably the simplest solution to the performance issues, which still plague GM:S as of 1.4.1760.

It remains to be seen whether this spike in downloads will be sustained as the new normal, or represents pent-up demand for users who were reluctant to buy due to the poor performance of My Library. Despite the seeming smallness of this change, I’m really excited that YoYoGames have made it, as it alleviates a significant pain point that I’ve been complaining about for well over a year, and means that I’ll likely be making more use of extensions in my projects.

Graph showing sales spike on 9/7/16. Could this be due to the change in delivery method?

On 9/7, 18 downloads. The other spike earlier in August was due to my Ludum Dare 36 sale, when I put my paid assets on sale for $FREE

Update: 9/8 saw another 18 download day.

Tutorial: GameMaker Object with multiple collision zones

GM Version: GameMaker:Studio 1.4 (concept should work in earlier versions)
Target Platform: ALL
Example Download: https://csanyk.com/cs/releases/games/LD48-36_AncientTechnologies/LD48_36_Ancient_Technologies_csanyk.gmz
Links: http://ludumdare.com/compo/ludum-dare-36/?action=preview&uid=10473

Summary:

How to make an object that handles multiple collision zones by using multiple sub-objects

Tutorial:

I used this technique in my recent Ludum Dare game, Ancient Technologies. The project has a TON of extraneous code in it, some of which is pretty messy, so I’ll replace the download link with a cleaner example project of just this technique in coming days.

If you look at the Atari 2600 console in this game, it is actually multiple objects, made to look like a single object. This enables each switch to have its own collision detection and mouse events.

I accomplished this with a few simple techniques that work really well:

The console itself is the main object. Then there are 6 objects for the 6 switches on the console.

I then took the image I wanted to use for the sprite, and cut out all the different clickable regions, putting each into its own subimage by itself. Then once all the subimages were created, I removed each subimage into its own sprite, and set the collision mask to cover just the pixels in the image

Atari 2600 clickmap sheet

As you can see, this approach results in a lot of “wasted” space in the sprite sheet in the form of transparent pixels, but if you’re concerned about this, you could always achieve the same effect by using sprite origin and sprite offset to position the images without all the whitespace in the sprite sheet. I skipped using sprite origin because I didn’t feel like bothering with counting pixels and setting each sprite origin differently. That would have been tedious, and if I had ever needed to change the sprites, could have thrown everything off and required extensive rework to recalculate again. If your sprites are tiny, it probably doesn’t matter too much, but if they’re quite large, then you should probably use sprite origin/offset.

(Note: With the small pieces, you’d need to use origin numbers that are larger than the dimensions of the sprite itself, or possibly negative values for the origin. You’d also need to carefully calculate the distance to set the origin so that the images all line up precisely. The goal is to make all the images align when each instance’s x and y are identical. This makes them easy to move around together as a group, without having to deal with offsets and so on. To make everything align easy, I created sprites that have the same height and width, so that getting them to align takes no extra effort or calculation at all.)

Next, use the “main” object to generate the collision zone objects, in the create event:

Note the example code below isn’t exactly the code in my project, but is cleaned up a bit for easier comprehension.

///oConsole Create Event:
power_switch = instance_create(x, y, oPowerSwitch);
tv_type_switch = instance_create(x, y, oTVTypeSwitch);
left_difficulty_switch = instance_create(x, y, oLeftDifficultySwitch);
right_difficulty_switch = instance_create(x, y, oRightDifficultySwitch);
select_switch = instance_create(x, y, oSelectSwitch);
reset_switch = instance_create(x, y, oResetSwitch);

Since these objects all use sprites that are the same size, they all line up together when their x,y position is the same. Now you have an easy way to place just the main object and have it create all of its collision zone objects, perfectly aligned.

If the main object needs to be able to move, you just need to update the x,y of all the objects whenever you need to.

Another great thing is that each of these instances can have its own animation which is completely separate from the rest of the collection of objects. This means you can do really sophisticated animation rigging.

Also, you can access the instance variables of the collision instances by using the main instance, like so:

oConsole.power_switch.position = UP;

is (essentially) equivalent to:

oPowerSwitch.position = UP;

This allows you to use the collision zone instances’ instance variables like you would use properties of a helper class in another language, which may make accessing these variables easier if you’re used to other programming languages.

As well, if each of these switch instances were of the same object, using the id returned by instance_create() would allow you to differentiate between them. This could be useful for, say, a battleship with multiple turrets that are all of the same object type.

Finally, you’ll want to be mindful that if you destroy the main object, you’ll likely want to destroy all the sub-objects. Perhaps not — maybe you’re doing a spaceship with an escape pod or a rocket with multiple stages that break away. But in that case you’ll wan to be sure that once the main object is gone, you are handling whatever remains somehow.

Managing complexity when implementing complex conditionals

Programming is in large part about managing complexity and imposing structure onto a problem domain in order to make it simple (simple enough for a machine to be able to do the solution, as well as simple enough for human programmers to be able to build it).

Something struck me about a technique that I used when I was developing my game last weekend.

The code that handles the setup of the simulated atari 2600 console is full of conditionals like this:

if PowerPlug.is_plugged_in && (console.switch_power.position == POWER_ON) 
 && (TV.switch_power.position == POWER_ON) && Cartridge.is_plugged_in && 
 Joystick.is_plugged_in 
{
 //simulate the game 
}

So one thing that I had to deal with as I was building this was all the preliminary stuff’ you know, to create all the objects that needed to be checked in the conditional statement above. Rather than do that, all at once, and have a lot of conditions that could have bugs in them, any one of which could make the thing not work, and be hard to figure out since multiple bugs could end up canceling each other out, or mask one another in some way, I opted to simplify things at first:

if true
{
 //simulate the game
}

The advantage here is obvious. It’s simple, and you KNOW that conditional is always going to evaluate to true! So you can get right into working out the code inside the branch, without worrying for now about the conditional logic that would cause it to execute.

Once that was working, I added in stuff:

if PowerPlug.is_plugged_in
{
 //simulate the game
}
else
{
 if PowerPlug.was_plugged_in_previously
 {
 kill_game();
 }
}

Then from there it became easier to elaborate on the conditional:

if PowerPlug.is_plugged_in
{
 if Console.switch_power.position == POWER_ON
 {
 //simulate the game
 }
}
else
{
 if PowerPlug.was_plugged_in_previously
 {
 kill_game();
 }
}

//etc.

(Note, the above isn’t the exact code from my project, which is a bit messy at the moment as I have some refactoring to do, but it illustrates the point.)

I found that by coding it in this way, I could iterate and test each little piece of the logic easily, and make sure it was working before trying the next piece.

I found that doing it this way made it much, much easier to handle the complex nested if business, and as well I found it easier to know which branches of the complex conditional tree the next bit of code needed to belong in.

Now that I did it this way, it seems obvious, nothing of great insight… but 6 years ago I would have tried to code the whole thing out, and then pulled my hair out swearing at myself when it didn’t work as expected, and I had to untangle all the logic to figure out wtf it wasn’t working.

Back then I would have thought that a really superior version of me who I aspired to be would be able to code out all the conditions in one go without making a mistake.

Today a really superior version of me knows better. Start simple, add elaboration through iteration.

This is a good lesson to hang onto. And to pass on.

Of course, there’s also often ways to avoid having to code conditionals at all, but that’s a topic for another post.

Ludum Dare 36

Ancient Technologies is my latest game! Made in about 25 hours of total work time over 49 hours for the Ludum Dare 36 Jam. I’m pretty happy with it.

 

Giveaway: all my paid gamedev assets are free for the duration of Ludum Dare 36

All my paid #GameMaker assets are 100% off this weekend only in celebration of Ludum Dare 36.

itch.io sale bundle.

Check out all my itch.io wares, including some additional always-free stuff.

Or buy on GameMaker: Marketplace instead.

Site changes

In the last few days, I’ve made a number of changes to this site. I wanted to explain them briefly.

Review: Lenovo ThinkPad P50

Back in March, I took ownership of a new Lenovo ThinkPad P50 laptop to replace my venerable and beloved T61p. I’ve had it almost 6 months now, so it’s been a good amount of time to become acquainted.

History

Originally purchased in 2007, my first T61p served me very well until last January (2015), when the video card failed. I looked at the current ThinkPad lineup, and after rejecting the then-current T and W series Thinkpad models due to their keyboard and trackpads, I promptly went out and bought another T61p from a seller on eBay for around $250, and transferred my SSD to it. Over the years that I owned it, the T61p proved its value, with solid construction, great ergonomics, nice, roomy 1680×1050 screen resolution, and ease of service. Originally delivered with Windows Vista, I installed to WinXP Professional, and later upgraded to Windows 7 when it became available. I replaced a keyboard, upgraded the RAM from 4GB to 8GB, and replaced the HDD once, and then upgraded to an SSD a few years ago, when they got cheap enough. The second T61p had a faster CPU (2.4 GHz Core 2 Duo) and the beefier 256 MB Quadro GPU (up from 128 MB on my first) but was otherwise the same as my original 2.0 GHz workhorse.

The extra CPU speed definitely helped me get through the last year, and other than occasionally running out of memory due to RAM-hungry browsers and running with no swap file, the T61p still feels perfectly viable today as an everyday primary workstation. I’ve only had a few occasions in recent months where, possibly due to Windows 7 cruft, the machine has felt slow — occasionally I’ll get a svchost.exe process that uses up 100% CPU and bogs the system way down, but when that’s not happening, the machine has plenty of horsepower for web browsing, software development, graphic design work, and occasional gaming.

In looking for a replacement machine, my main concerns were not performance, but ergonomics.

I wanted a screen with at least the 1680×1050 resolution that I had come to realize was essential. I like to split the screen down the middle and have two windows open side by side, and 1680-wide gives me enough pixels to do that comfortably, while 1050 of height gives me enough lines of code on the screen that I can spend more time reading or typing, and less time scrolling through my project files.

I also had grown very attached to the T61p keyboard, with its near-perfect layout, and full-size scissor-switch keys, and the touchpad with physical buttons. Later generation ThinkPad machines had done away with physical buttons, changed from scissor switch keys to chiclet keys, and worst of all made senseless and wholly unnecessary changes to the keyboard layout, which I found completely unacceptable.

Even so, after almost 8 years on the same hardware, I did want the replacement laptop to feel like a true upgrade, and to have hardware that could feasibly hold up for as many years as I’d gotten from the mighty T61p.

In late 2015, I strongly considered purchasing a W540-series ThinkPad. I held off after seeing a W540 in person, when I saw that the touchpad itself was a clickable button, and there were no separate mouse buttons. Such a trackpad would be completely useless for precision clicking, and thus would require me to plug a mouse in to do any kind of precise work, which in turn would force me to sit at tables where I could use a mouse, and limit where I could easily do useful work comfortably. This would not do.

But then Lenovo released a minor refresh, the W541S, which brought back the physical buttons, and looked like the best thing I’d seen from Lenovo in years. But this model was a bit lacking — where the full-size W540 could take 32 GB of RAM, the W541S was limited to just 16 GB — which, while adequate, didn’t feel as future proof as I would have liked.

The S in W541S stands for slim, so I inquired with Lenovo customer service and was told a full-size W451 was coming soon, which would have the all-important physical touchpad buttons as well as capacity for 32 GB of RAM. I waited weeks and months, and asked again and was told that I had been misinformed, and that no such model was planned. I kept getting different stories from different reps, and got quite frustrated with not having solid, accurate information.

I briefly looked at the Dell XPS 15, which had fantastic specs — 4K IPS display, up to 32 GB of RAM, but again here I didn’t care for the buttonless touchpad.

Finally, in the second half of 2015 I started hearing about the new P-series ThinkPads, and became very interested in the P70. This system is a monster: up to 64 GB of RAM, 4K IPS display, the latest Intel Core i7 CPU, trackpad with physical buttons, and what looked to be an acceptable keyboard layout, though still not the return to perfection that I’d hoped for. I wasn’t crazy about lugging a 17″ laptop, but then a short time later I learned that they were also planning to offer a 15″ model, the P50. Comparing the specs between the two, it looked as though there really weren’t any compromises between the two, so at that point I was sold.

I waited and waited for the P50 to be released, but it kept being delayed. Eventually, in December they became available. As my second T61p was still going strong, I elected to hold off for a bit and wait to see what the initial reviews said. Then, last week, I received email informing me that Lenovo was having one of their EPP sales, which meant steep discounts. I clicked the link and specced out my dream machine: 3.7 GHz Xeon CPU, 4K IPS screen, 4 GB video card, a jaw-dropping 64 GB of RAM, and 512 GB SSD on a PCIe-NVMe bus, and after almost $1000 in discounts, it came to around $2200, which was well under budget for what I had originally put aside for the more expensive P70.

While that sounds like a lot of money for a laptop, I considered that I’d spent around $1900 for my T61p in 2007, and after using it for almost 8 years, that amortizes away to barely anything — less than $1/day. Considering how much I use the machine (regularly 8+ hours/day), and how productive it has made me, that’s an insanely good value. So when you think about it that way, it’s worth spending a lot of money to get something very good, as opposed to spend less and accept compromises, or have something lower end that won’t last as long whether due to durability or performance.

The Hardware

As purchased:

Battery 6cell 90Wh
System Unit P50 NVQ3 4G E3-1505M v5 vPro
Camera 720p HD 2D Camera Mic
AC Adapter and Power Cord 170W 2pin US
Processor Intel Xeon E3-1505M v5 MB
Color Sensor Color Sensor
Display 15.6 4K IPS Non-Touch
Fingerprint Fingerprint Reader*

*(I didn’t want a fingerprint reader, but there wasn’t an option to remove it.)

Graphic Card NVIDIA Quadro M2000M 4GB
Hard drive 1 512GB SSD PCIe-NVMe
HDD Config SSDx1
HDD Config 2 PCIe SSD
HDD Config 3 512GBSSD PCIe
HDD Total capacity 512GB
Keyboard Language KYB NumPad ENG
Publication Language PUB ENG
Total memory 64GB(16×4) DDR4 2133 SoDIMM (non-ECC)
Pointing device 3+3BCP FPR CS
Preload Language W10P DG W7P64-ENG
Preload OS Win10 Pro64 DG Win7 Pro64
Preload Type Standard Image

*(Windows 7 Professional x64)

Recovery Media W10P64 COUPON WW
Sub Series Variation P50 Quadro Workstation
TPM Setting Hardware dTPM Enabled
Display Panel P50 4K NT 2D MC CS WLWW
Selectable Warranty 1 Year Depot or Carry-in
WiFi wireless LAN adapters Intel 8260AC+BT 2×2 vPro

Price as purchased (incl tax and shipping): $2,271.02

I elected not to go with ECC RAM, which would have added about $450 to the cost, and the P50 doesn’t have a bay for an optical drive, so no DVD option unless I want to plug in an external. I haven’t burned, or even read, a DVD in years, though, so I think optical media is pretty close to obsolete.

Curiously, Lenovo do not offer a Blu-Ray drive option for their laptops that do offer an optical drive bay. The ultra-bay adapter for hot swappable hard drives is a nice option to have, but considering the P50 has an internal bay for a 2.5″ SATA device, and 2 PCIe NVMe slots, it wasn’t worth it to me to go to a P70, for almost $2000 more, just to get a DVD-RW/Ultrabay (although to be fair, that $2000 would have also brought with it 8 GB video card).

Lenovo also just came out with a few more models in the P-series: the P40 Yoga, and P50S. I didn’t consider either of these as I was already eager to buy the P50 that I had selected, but after looking at their specs I have no regrets about picking the P50. The Yoga offers a more flexible screen hinge that allows for using the laptop in different configurations, but with less top-end specs, and the P50S is just a slimmer P50 with slightly less capability, and so I wasn’t really interested in either.

Initial impressions

Pros:

  • 64 GB of RAM! This is 8x the RAM of my old T61p (and 16x the advertised max RAM of the T61p). Knock on wood, but I may never run out of RAM ever again with this machine. 64GB ought to be enough for anybody;-)
  • PCIe NVMe performance. The SSD is very, very fast. I’ve been using SSD for a few years now. The T61p originally came with a 7200rpm hard drive, but I upgraded to SSD after they became available at a price point I was willing to pay. I did notice some performance improvement, but the SATA3 SSD was bottlenecked by the SATA2 interface in the T61p, so I didn’t get the full benefit of the upgrade. By contrast, with the ThinkPad P50, read/write speeds on the PCIe NVMe SSD are amazing. After running Windows Update for the first time on the P50 and installing almost 90 updates, after rebooting the “configuring” that Windows 7 does after upgrades are installed, which normally takes several minutes, were completed in about 20-30 seconds. Waking out of hibernation is nearly instantaneous.
  • 4K IPS is a thing of beauty. The screen is exceptionally clean and sharp, with vibrant color even for an LCD screen. The LED backlight is very even, compared to the florescent tube backlight of older screens. IPS is definitely a much better display technology compared to TFT. I’ve had IPS displays on my desktop, but since I use my laptop much more, I haven’t really been able to appreciate it until now.
  • Speakers are much improved over T61p. One of the complaints I remember from reading reviews of the T61p was that its speakers weren’t very loud even at max volume. I didn’t find this to be a major complaint, and most of the time audio levels were adequate, but I did frequently find it difficult to hear the audio track in multimedia being played on the machine. It just depended on how loud the source was. With the P50, the speakers are much more capable. I don’t need to turn the volume level to 100% just to be able to barely hear audio anymore.

Cons:

  • Trust. The most important con to buying Lenovo these days is trusting them not to pre-install malware and rootkits. Lenovo have been found to do this three times in the last year, which for many is unacceptable. Fortunately, I did not find anything pre-installed on my P50 that I needed to remove. It seems that Lenovo responded to being found out and did the right thing in removing the offending software. It should never have been there to begin with, but at least they had removed it from their newly shipping products by the time I ordered mine.
    • Superfish, the SSL-circumventing private http destroyer, was not found on my machine.
    • I did need to disable “Lenovo Customer Feedback Program 64” using TaskSchedulerView.
    • Lenovo have released BIOS updates that omit the OneKey Optimizer malware that they once preloaded on ThinkPads. I wasn’t able to find information as to whether this was ever included in the BIOS for the P50 model; it’s possible it never was, as this model is more recent than the date Lenovo removed it from machines that had it.
  • Other Software I didn’t want
    • McAfee LiveSafe. I didn’t order this, but I had a subscription to it out of the box. I haven’t ever liked McAffee antivirus, since the late 1990’s I’ve been recommending against it.
    • Microsoft Office. Microsoft are really hard-selling their SaaS Office 365 suite. It was something added to my build list by default, and I had to remove it. I got a reminder at check out asking me if I was sure I really didn’t want it. I debated it for a few minutes, but ultimately I don’t use Office very much anymore, and really prefer Google Docs for most everything, for many reasons. Still, my P50 came with something pre-installed — not sure if it’s Office 365 or 2016. Either way, it’s not getting used, and will be removed. I might install a viewer app so I can handle .doc files that people might send me, or I might install an old license of Office 2007 that is still perfectly fine, but I’m not sure I’ll even need to do that.
    • Windows 10 nagware: This isn’t Lenovo’s fault by any means, but Microsoft is also really hard-selling Windows 10. They want the world to upgrade from Windows 7. I don’t ever plan to. Microsoft’s treatment of user’s private data is completely disrespectful, and unacceptable. And I’m not interested in re-learning how to use and manage the new version. I haven’t ever touched Win8, even. And they keep trying to push Windows Updates on Win7 users which keep trying to push an upgrade to Windows 10. At this point, the only thing that’s keeping me tied to Windows is GameMaker: Studio, and if it weren’t for that I’d be happily running on some Linux distro, most likely Ubuntu. I’m hoping that sometime during the lifetime of this hardware, I’ll be able to make the switch and dump Microsoft for good.
  • 4K resolution problems – TL;DR solution: 2048 x 1152

    It turns out that displaying 4K resolution on a 15.4″ display results in very, very, very tiny fonts. Windows 7 does not handle this well at all. I almost returned the machine for an exchange to a 1920×1080 screen, but after playing with settings for a few days, there are a few workarounds, which I find acceptable, but none of which are perfect:

    1. Set font dpi to 200% or better. The control panel only shows options for 100%, 125%, and 150% at first, but you can set a “custom” dpi using a link at the right. The slider control for this tops out at 200%, but you can override this by typing in the value. I found that 250-300% was about where 12pt text started to get readable to me, but it’s still pretty small, and 10pt and lower is still ridiculously tiny. Unfortunately, this amount of magnification starts to break the containers that Windows puts text into, resulting in an ugly, disjointed Explorer GUI, and probably most applications as well.
    2. Use Windows Classic theme and size the text manually. I created a custom theme for this, so you don’t have to. Download Win7_4K and apply it. I basically doubled the size of all the font settings in the theme. Unfortunately, not everything in Windows uses the Theme settings, particularly older software or software developed by amateurs. But even Windows itself doesn’t make all of its font sizes customizable through this interface, even in Explorer windows there will still be some fonts that are ridiculously small. What terrible design. Microsoft should be embarrassed.
    3. Set display resolution to 2048 x 1152. OK, so native display resolution just doesn’t work well in this size display, at least the way Windows renders its GUI. The only other option is to set display resolution to a lower size. Both 2048×1152 and 1920×1080 look great, and other than not having the full resolution at your disposal, there’s not much of a downside.

Keyboard, mousepad

The basic keyboard layout is acceptable, although I still vastly prefer the T61p’s keyboard for many reasons. Let’s examine those.

The P50 uses chiclet key switches, not the scissor switches used in the T61 keyboard, but that’s acceptable.

I miss the “previous page” and “next page” keys from the T61p keyboard, which weree located at the left and right of the Up Arrow key on the T61p keyboard. On the P50, these have been replaced by Page Up and Page Down, which I definitely use a lot more frequently. As well, an accidental page up/down is less disruptive than an accidental previous/next page keystroke, and so I’ve come to like this change. One problem that I did have with the T61p in retrospect was accidentally hitting the “previous page” key when editing text in a web form, resulting in the browser going back to the previous page, losing everything I’d typed, when I’d simply wanted to move the cursor up a line. This happened fairly frequently, and was a serious annoyance.

I do miss that Page Up and Page Down are no longer in a tight cluster with Home/End. I also find that the cursor navigation keys are a bit harder to find by touch than they were on the T61p, where there they are at corners and edges, which made finding them very easy, even in the dark. On the P50, they’re to the right of the Right Ctrl key, but to the left of the 10key pad. I can find them most easily by going directly below the right Shift key.

A notable omission from the P50’s keyboard is a key for the Context Menu. Normally this is thought of as the “right-click” menu, but there’s a dedicated key on most keyboards for this as well, which is known as the Appskey. A workaround, to re-map the right-alt key to Appskey exists, using a free application called AutoHotKey. However, a downside of this is that Alt+PrintScreen is a very commonly used keystroke in my work, and if I re-map the right-alt key (which is right next to the print screen key on the P50) I sacrifice being able to do quick, easy print screen to copy buffer for the current window. But I also use the Appskey very frequently in my work as well. So I can instead re-map right-Ctrl to the Appskey, and do without a right-Ctrl key. None of these arrangements is truly ideal; they’re all compromises. My advice is to try it and see which arrangement you prefer.

The 10-key pad on the right side shifts the main keyboard left of center of the screen, which makes it a bit less comfortable to use, and the navigational keys aren’t as easy to find without taking my eyes off the screen to look for them. If I turn off numlock, though, it turns the 10-keys into Home, End, and arrow keys, which I like. I leave numlock off most of the time, unless I’m actually keying in a lot of numbers, and then I find it handy.

However, a huge negative with this keyboard is its rollover. If N-key rollover isn’t possible for technical reasons, I feel that at this price point a minimum of 6KRO should be expected. I can’t play games that use the keyboard for controls, because after just 2 buttons held down, a third key press is not reliably detected and reported to the OS. As a gamer and game developer, this matters, and is a huge, huge disappointment. If I gave laptop reviews a star rating, I’d penalize the P50 an entire star just for this issue. Maybe two stars. The built-in keyboard is that important to me.

The mousepad is off-center from the screen, but centered under the spacebar. It’s large enough that my palms will accidentally bump it occasionally, and this can be annoying, but it’s not a severe problem. I think I would like a slightly smaller mousepad, all the same.

The return of the physical buttons (three of them!) above and below the mousepad is what I like the most. It’s great to have physical buttons back in this generation of Thinkpad. The lack of them was why I refused to buy a W540 last year, when I first considered replacing the T61p.

If the machine didn’t have a 10key pad, and the layout was more like the T61p keyboard overall, and it had NKRO, I’d be completely in love. As it is, the keyboard is mostly decent, other than that it completely sucks for gaming.

BIOS tweaks

Looking in the UEFI BIOS, there’s a couple of nice configurable settings. Foremost, Lenovo have enabled the user to decide to switch the Fn and left Ctrl key. This was a popular 3rd party hack for the T61p BIOS, but I never bothered with it because I didn’t want to risk running an unofficial BIOS. Now that it’s an officially supported option, I’m happy to have Ctrl in the standard location where it belongs, even if the keycaps aren’t identically shaped so I can’t switch them physically.

Also, there’s a BIOS setting to change the top row of keys from being special functions or F-keys. By default, if you press the top row keys, they’ll do things like adjust volume or dim the screen. If you’re used to using the F-keys for shortcuts, Alt+F4 closes windows, and F5 is browser refresh — I use that all the time. For me, it’s essential to switch this in BIOS. I could also do it by hitting Fn+Esc, which sets the Function lock on, but then the Fn lock LED is lit all the time, and I’d rather not have it lit all the time, just to save what little bit of battery drain it might use if for no other reason.

I didn’t find a default Numlock state setting in the BIOS, but I’d like the numlock to be disabled, so I can use the 10-key pad for its alternative function of navigating by cursor. Keeping the 10-key pad in this mode makes the keyboard layout slightly less annoying, since Home, End, Page Up, and Page Down, and another set of Arrow keys are all available through the 10-key keys. It’s just a single keystroke to toggle the numlock, but it’d be nice if it was always off after a reboot. Fortunately I don’t need to deal with this much, as I don’t reboot very often.

Warranty Service

In August, I had to send my P50 back to Lenovo for warranty service, after a column of pixels got stuck on.

P50 4K IPS screen with a column of stuck pixels

At 5 months, a column of pixels got stuck “on”. Lenovo fixed the issue under warranty, and the machine was out of my hands for a little over 48 hours. Very impressed.

Overall the experience was great, but contacting the right folks at Lenovo and getting a clear connection was not as easy as it should have been. After a few attempts I finally got a hold of the right department, they asked me some rudimentary troubleshooting questions, and once they understood the problem I was describing, they issued me a support ticket number and explained the process for the warranty repair.

The next day, a return shipping box was at my door. I removed my SSD, not wanting to risk my data being lost or falling into the wrong hands. Lenovo considers the SSD to be a “Customer Replaceable Unit” so there was no problem for me to do this, and it did not void my warranty. With the SSD removed, I packaged the laptop up and shipped it on a Wednesday, and it was returned to me Friday morning. This made me very happy.

Considering they had told me to expect it to be gone 7 days, I was very happy with the turnaround time. I don’t know what the problem was with the screen, but I suspect that it may have just been that the video cable needed to be reseated. They did not replace the screen (the tape I had put over the webcam was still there when I got it back), but the problem is gone.

Overall Recommendation

This is a very high end midsize laptop with a ton of value and great features. Performance is outstanding, and the warranty support is even better. It’s pricey compared to lower end machines, but if you need a high end laptop, this is a very good one.

If it lasts me as long as my T61p did, it will have been well worth it. My T61p lasted me an incredible 8 years, and while I don’t think anyone expects that from a laptop (most are replaced in 2-4 years, typically) if I get 7 years out of the P50, that works out to less than a dollar per day. When you think about it that way, suddenly spending over $2.2k on a laptop seems very reasonable.

My only complaint with it is the keyboard. The keyboard is very good compared to most current laptops, but unfortunately it has terrible key rollover characteristics that make it a dud as a gaming machine. The keyboard layout may not be everything I wanted, but considering what we saw Lenovo putting on ThinkPads between the T6x generation and now, it’s nearly a return to their old form, and close enough to what I wanted that I can live with it, although I absolutely want Lenovo to deliver an NKRO keyboard with their next hardware revision.

Some users might feel that the lack of an optical drive/ultrabay is a disadvantage, and to them I would point them toward the ThinkPad P70.

The Dell XPS 13 and XPS 15 are also worth looking at in this performance class. But I think the P50 likely edges them out in most respects, but especially on the mousepad and keyboard. If you would prefer to avoid Lenovo for now due to the trust issues mentioned above, or other reasons, they might be more for you.

I haven’t tried out Linux on this machine yet, so I have no remarks as to it’s compatibility and stability with a Linux distro running on it.