Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ 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; } /** * @param string $url * @return bool|string */ 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); } /** * @param string $url * @return bool|string */ 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); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ 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; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ 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; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $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)) { // take old cache $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); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Wednesday, 30 June 2021

Dream Games raises $155M at a $1B valuation as its Royal Match puzzle game hits a royal flush

Istanbul in Turkey continues to prove itself as very fertile ground for casual gaming startups, which appear to be growing from small seedlings into sizable trees. In the latest development, Dream Games — a developer of mobile puzzle games — has raised $155 million in funding, a Series B that values the startup at $1 billion.

This is a massive leap for the company, which raised $50 million (the largest Series A in Turkey’s startup history) only 3.5 months ago. This latest round is being co-led by Index Ventures and Makers Fund, with Balderton Capital, IVP and Kora also participating. It also comes in the wake of a bigger set of deals in the world of gaming and developers in Turkey, the most prominent of which saw Zynga acquire Peak Games for $1.8 billion, amid other acquisitions. Dream is one of several startups in the region founded by alums from Peak.

The focus of the funding, and currently of Dream Games itself, is Royal Match, a puzzle game (iOS, Android) that launched globally in March.

The game has been a huge hit for Dream, with 6 million monthly active users and $20 million/month in revenues from in-game purchases (not ads), according to figures from AppAnnie. (A source close to the company confirmed the figures are accurate, but Dream did not disclose its revenue numbers or revenues directly.) This has catapulted it into the top-20 grossing games categories in the U.S., U.K., and Germany, the same echelon as much older and bigger titles like Candy Crush and Homescapes.

“The funding will be used for heavy user acquisition in every channel and every geography,” Soner Aydemir, co-founder and CEO, Dream Games, told me in an interview. He said Asia would be a focus in that, specifically Japan, South Korea and China. “Our main target is to scale the game so that it becomes one of the biggest games in the global market.”

The world of mobile gaming has in many respects been a very cyclical and fickle one: today’s hot title becomes tomorrow’s has-been, while for developers, they can go through dozens of development processes and launches (and related costs) before they find a hit, if they find a hit. The role of app-install ads and other marketing tools to juice numbers has also been a problematic lever for growth: take away the costs of running those and often the house of cards falls apart.

Aydemir agrees, and while the company will be investing in those aforementioned in-game ads to encourage more downloads of Royal Match, he also said that this strategy can work, but only if the fundamentals of the game are solid, as is the case here.

“If you don’t have good enough metrics, even with all the money in the world it’s impossible to scale,” he said. “But our LTV [lifetime value] is high, and so we think it can be scaled in a sustainable way because of the quality of the game. It always depends on the product.”

In addition to its huge growth, Dream has taken a very focused approach with Royal Flush, working on it for years before finally releasing it.

“We spent so much time on tiny details, so many tests over several years to create the dynamics of the game,” he said. “But we also have a feel for it,” he added, referring to the team’s previous lives at Peak Games. “Our users really appreciate this approach.”

For now, too, the focus will just one the one game, he said. Why not two, I asked?

“We believe in Pixar’s approach,” Aydemir said. “When Pixar started, it was very low frequency, a movie every 2-3 years but eventually the rate increased. And it will be similar for us. This year we need to focus on Royal Match but if we can find a way to create other games, we will.”

He added that the challenge — one that many startups know all too well — is that building a new product, in this case a new game, can take the focus away when you are a small team and also working on sustaining and maintaining a current game. “That is the most difficult and challenging part. If we can manage it we will be successful; otherwise we will fail because our business model is basically creating new IP.” He added that it’s likely that another game will be released out into the world at the beginning of next year.

The focus, in any case, was one of the selling points for its investors. “The Dream Games team’s deep genre insight, laser-focus on detail and team chemistry has helped create the early success of Royal Match,” said Michael Cheung, General Partner at Makers Fund, in a statement. “We’re excited to be on the journey with them as they grow Royal Match globally.”

In terms of monetization, Dream Games is pretty firmly in the camp of “no ads, just in-app purchases,” he said. “It’s really bad for user experience and we only care about user experience, so if you put ads in, it conflicts with that.”

Some of the struggles of building new while improving old product will of course get solved with this cash, and the subsequent hiring that Dream Games can do (and it’s doing a lot of that, judging by the careers section of its website). As more startups emerge out of the country — not just in gaming but also areas like e-commerce, where startups like Getir are for example making big waves in instant grocery delivery — it will be interesting to see how that bigger talent pool evolves.

“Since its launch in early March, Royal Match has become one of the top casual puzzle titles globally, driven by once in a decade retention metrics. It speaks to the sheer quality of the title that the Dream Games team has built and the flawless polish and execution across the board,” commented Stephane Kurgan, venture partner at Index Ventures and former COO of King. Index is also the backer of Roblox, Discord, King and Supercell, in a statement.



from TechCrunch https://ift.tt/3jswB1L
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support