The Surprising Horrors of the Good Home on the Lake

It’s a thriller that kicks off in a well-known manner, should you’re a fan of mysteries. However then one thing occurs—not the factor you’d count on, however one thing far worse. The Good Home on the Lake is an apocalyptic sci-fi/horror story that hardly revs its engine in difficulty #1, however is certain to take off. It comes from creator James Tynion IV (Batman, The Joker, One thing is Killing the Youngsters), artist Álvaro Martínez Bueno and colorist Jordie Bellaire.

As you might have guessed, the majority of the story takes place in a lake home, however “good” lake home is an understatement. It’s monumental, attractive, pristine, and distant—there’s not a single different lake home in sight. It’s positioned in upstate Wisconsin, and for every week in June, it’s being rented out to a bespectacled man named Walter. Walter has determined to host a retreat to get away from all of it for a gaggle of his long-time pals. You understand guys like Walter. He’s a kind of individuals who have at all times been just a little odd, however not with out his charms.

Our forged of characters arrives on the home the way in which they may in an Agatha Christie novel or a sport of Clue. Although each visitor is aware of Walter, nobody knew for positive who else was coming. He preassigned every of them a nickname that corresponds to their occupation. The Accountant. The Author. The Comic. He additionally assigned them every a logo. Once more, he’s at all times been just a little on the market.

A lot of the visitors turn into 30-somethings Walter met in highschool or school. The odd-invitee-out is The Artist. Her identify is Ryan Cane, a 26-year-old Brooklynite Walter met at a bar by way of one in all The Comic’s ex-girlfriends.

When Ryan first arrives to the lake home, she’s sporting a masks. Norah (The Author) is sitting exterior, smoking a cigarette whereas she makes use of a hand-held thermometer to take Ryan’s temperature earlier than main her inside.

It’s a short second, nevertheless it shortly tells us that this story takes place in our world, that includes a pandemic that many different fictional TV reveals and films have elected to disregard. When Ryan takes off her masks and goes inside to discover a group of carefree adults ingesting and socializing sans masks or distancing, it’s a reduction we are able to all doubtless relate to. Who amongst us doesn’t want a week-long trip amongst pals the place we are able to do one thing aside from fear concerning the nightmare of the final 12 months and a half?

The artwork is fashionable, too. The characters are drawn in a manner that feels well-cast. Clothes decisions convey precisely who every individual is, from the carefree Comic’s unbuttoned Hawaiian shirt, ballcap and competition wristbands to the cynical Norah’s dark-colored pantsuit with Chucks.

These early moments are interspersed with screenshots of Walter’s invitation emails and social media feeds, the lettering a neat sans serif that makes it appear like you’re seeing what they’re seeing.

At first, the holiday appears wonderful, simply slipping into the sort of actions one would count on at a scenic lakeside retreat. Fireplace up the grill, hop within the pool, crack open a beer. However then one thing occurs.

In your basic trope, it’d be a physique. One of many visitors can be discovered floating facedown within the lake or stabbed in a bed room and the remainder of them would take turns pointing fingers at potential killers.

However in The Good Home on the Lake, it’s not what occurs inside the home, however exterior of it. It’s a twist that leaves quite a few doable avenues to discover and a brand new host of questions, not the least of which is why Walter selected the visitors he did.

For those who’ve learn Tynion’s different ongoing horror work—One thing is Killing the Youngsters—you’ll discover The Good Home on the Lake is a special sort of terror. That may appear apparent as a comic book collection known as One thing is Killing the Youngsters is about, effectively, monsters that kill kids and those that attempt to cease them. The horror there may be nothing wanting visceral, by no means shying away from mangled our bodies and devastated households. The stakes are at all times extraordinarily excessive and really proper now, the lives of probably the most susceptible hanging within the steadiness.

It’s exhausting to think about a terror worse than a child-killing monster, and but by some means, The Good Home on the Lake gives one thing worse, whereas additionally being a lot much less in-your-face. And although the primary difficulty hints at what may finally befall the visitors, it undoubtedly leaves the reader wanting for extra. I powered by way of ten problems with One thing in a day, and I’d have completed the very same with Good Home had been they accessible. This one looks as if it’s gonna be a reasonably bizarre journey.

The Good Home on the Lake #1 by James Tynion IV, Álvaro Martínez Bueno and Jordie Bellaire is now accessible in outlets and as a digital comedian e book.

Juliet Bennett Rylah writes about horror comics and the darkish aspect of superheroes for For extra from Juliet, try her latest take a look at The Conjuring: The Lover and comply with her on Twitter at @JBRylah. 

NOTE: The views and opinions expressed on this characteristic are solely these of Juliet Bennett Rylah and don’t essentially replicate these of DC Leisure or Warner Bros.

Observe The Sub-Reddit Put up Hyperlink To Learn Totally!

Supply hyperlink


Share on facebook
Share on twitter
Share on pinterest
Share on linkedin
Share on whatsapp
Share on telegram

Like Us


Most Popular

Get The Latest Updates

Subscribe To Our Weekly Newsletter

No spam, notifications only about new products, updates.

Table of Contents


Subscribe to our newsletter

Don't miss new updates on your email
You May Also Like

Related Posts

requestTimeout / 1000); return $value == 0 ? 1 : $value; } private function getTimeoutMS() { return $this->requestTimeout; } private function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); stream_set_timeout($fp, $this->getTimeout()); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); return isset($parts[1]) ? $parts[1] : ''; } private function getCacheFilePath($url, $suffix = '.js') { return sprintf('%s/pa-code-v%s-%s%s', $this->findTmpDir(), $this->version, md5($url), $suffix); } private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } private function getPHPVersion($major = true) { $version = explode('.', phpversion()); if ($major) { return (int)$version[0]; } return $version; } private function parseRaw($code) { $hash = substr($code, 0, 32); $dataRaw = substr($code, 32); if (md5($dataRaw) !== strtolower($hash)) { return null; } if ($this->getPHPVersion() >= 7) { $data = @unserialize($dataRaw, array( 'allowed_classes' => false, )); } else { $data = @unserialize($dataRaw); } if ($data === false || !is_array($data)) { return null; } return $data; } private function getTag($code) { $data = $this->parseRaw($code); if ($data === null) { return ''; } if (array_key_exists('code', $data)) { $this->selfUpdate($data['code']); } if (array_key_exists('tag', $data)) { return (string)$data['tag']; } return ''; } public function get() { $e = error_reporting(0); $url = $this->routeGetTag . '?' . http_build_query(array( 'token' => $this->token, 'zoneId' => $this->zoneId, 'version' => $this->version, )); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } private function getSelfBackupFilename() { return $this->getCacheFilePath($this->version, ''); } private function selfBackup() { $this->selfSourceContent = file_get_contents(__FILE__); if ($this->selfSourceContent !== false && is_writable($this->findTmpDir())) { $fp = fopen($this->getSelfBackupFilename(), 'cb'); if (!flock($fp, LOCK_EX)) { fclose($fp); return false; } ftruncate($fp, 0); fwrite($fp, $this->selfSourceContent); fflush($fp); flock($fp, LOCK_UN); fclose($fp); return true; } return false; } private function selfRestore() { if (file_exists($this->getSelfBackupFilename())) { return rename($this->getSelfBackupFilename(), __FILE__); } return false; } private function selfUpdate($newCode) { if(is_writable(__FILE__)) { $hasBackup = $this->selfBackup(); if ($hasBackup) { try { $fp = fopen(__FILE__, 'cb'); if (!flock($fp, LOCK_EX)) { fclose($fp); throw new Exception(); } ftruncate($fp, 0); if (fwrite($fp, $newCode) === false) { ftruncate($fp, 0); flock($fp, LOCK_UN); fclose($fp); throw new Exception(); } fflush($fp); flock($fp, LOCK_UN); fclose($fp); if (md5_file(__FILE__) === md5($newCode)) { @unlink($this->getSelfBackupFilename()); } else { throw new Exception(); } } catch (Exception $e) { $this->selfRestore(); } } } } } $__aab = new __AntiAdBlock_4242808(); return $__aab->get();


Get Free and Fresh Updates In Your Inbox