Genre Viability on Steam and Other Trends - An Analysis Using Review Count - by Danny Weinbaum Blogs - 15 November 2019 - 7:33am
Does genre affect your success odds? Using a database of review count-based revenue projections, we dive deep into sales trends on Steam. We look at which tags sell the best, as well as sales trends in release date and review score.
Categories: Game Theory & Design

How to prepare your game design for a holiday season - by Kate AppFollow Blogs - 15 November 2019 - 7:26am
Holidays are no doubt a goldmine for mobile game developers. They offer a great opportunity to show off all of your abilities as a designer, treat players with new engaging challenges, boost app installs and even increase revenue. 
Categories: Game Theory & Design

InternetDevels: Happy 12th birthday, InternetDevels: another great year wrap-up

Planet Drupal - 15 November 2019 - 6:23am

The “lucky dozen” is here for us — our amazing InternetDevels development company is turning twelve today! 12 months after last year’s birthday has rushed by like the wind. But each month had something nice, useful, and outstanding to look back on. Let’s begin!

Read more
Categories: Drupal

How to Build a Better Gaming Experience by Adding Value to User Perspective? - by Shy Lee Blogs - 15 November 2019 - 5:00am
Check out how to build better experience in gaming by adding a user perspective.
Categories: Game Theory & Design

Camdon Turned Me Into a Vampire Part 3–Fimbulwinter

Gnome Stew - 15 November 2019 - 4:30am

Over the last two months, I’ve been looking at the game Thousand Year Old Vampire, by Tim Hutchings. It is a journaling game that you play by recording facts about your character, then rolling dice to answer prompts. These prompts may make you change some of those facts. You have a limited number of memories, and eventually, you have to fight to remember everything that you once were.

Camdon Wright, amazing fellow gnome and game designer extraordinaire, is the one that first asked if I would be interested in looking at this game, and as I’ve never played a journaling game like this before, I was very curious to see what would happen.

Holding Back the Years

As a refresher, my vampire was Jorgrimr, a Viking mercenary who helped secure Kiev around 1000 CE. Jorgrimr was turned into a vampire by a mysterious black wolf, fled Kiev, moved to Germany, and adopted the name Wolfhart.

While he violently clashed with a rival’s troops and fed on them, in his new life, Wolfhart met a girl named Kisaiya, and found a cure for her blood ailment by researching the Blood of Czernobog. He’s feeling pretty human for the first time in about 50 years.

This is going to get messy.

Content Warning

I don’t get too graphic in this chapter, but there is still a lot of violence, reference to severed body parts, and a general disdain for human compassion on the rise, so if that isn’t your thing, please continue accordingly.

Prompt #13

This prompt tells me that I fall asleep for 100 years, and must strike out any mortal characters on my character sheet.

Wolfhart begins to chronicle who he is and what he has accomplished. Foremost on his mind is his arrival in Kiev, his family, Kisaiya, and his invention of the elixir that cured her. He is tired from his work with the mortals, but almost feels human again.

When he awakens, Kisaiya and his work, even who he was, is like a dream that he can only remember when he reads his diary. When he finds out how long he has slept, he realizes Kisaiya, Anichka, Ranssi, even Konstantine are all long gone.

He wants to mourn, but he doesn’t know why.

Wolfhart creates a Diary, and moves a memory to that Diary. All his mortal Characters are gone.

Prompt #14

The prompt tells me that my Diary has been damaged, and I have to remove three nouns from the Diary.

Wolfhart spends another 100 years in a blur. Everything is like a dream. He feels nothing. He does the bare minimum to maintain what he has. He haunts Germany, and when he finally realizes how much time has passed, and what he must do to maintain his estate, he realizes he has neglected his Diary.

He cannot remember the girl he saved with the elixir. He cannot remember his father’s name. The ink is smudged in the diary. He does not even remember the city where he won his glory.

Why am I going through the motions of this long unlife?

Prompt #15 

This prompt tells me that generations have passed, and I wake up covered in dust. I lose a resource to determine how I escape.

The remnants of the house guard of Wolfhart’s estate, the children of his mercenary company, loot the estate that they once guarded. They set fire to the home under which Wolfhart was buried after an unfortunate rockslide trapped him in the caverns under the manor. After the fire burns away the passages, the rocks fall away, and he realizes that he has lost even more time to his carelessness. He must get control again. He must not let time keep sliding away like sand through his fingers.

He forgets everything about his old love. He knows she existed. Or maybe she was a dream. Has he ever known love?

Wolfhart strikes out his memory of Anichka and his earliest friends. Wolfhart strikes out “My Loyal Troops” as a resource.

Prompt #16

This prompt tells me that I gain a creative skill based on a lost memory due to timeless introspection.

Wolfhart is sure he loved at one point in time. He reads poetry and stories of doomed lovers. He learns to write his own stories, and shares those stories with others. He feels the shadow of something he once knew, and he is even less sure that he ever truly knew love. Can the written word cast such a spell on the mind?

Wolfhart gains the Writer of Love Stories skill.

Prompt #17

This prompt tells me to check a skill to avoid arrest, and if necessary, create a mortal character to take the blame for your crimes.

Gregor Langstrom is a “monster hunter,” using Karina Strausshammer’s inventions to fight the supernatural. He is getting closer to Wolfhart. Wolfhart does not want to feed on the people reading his books, but he can’t make himself care about the real people as much as he cares about the people he makes up in his stories.

The authorities close in on Wolfhart, so he manages to frame Langstrom as a crazed, obsessive zealot, killing people that were reading “perverse” books, and undermining society’s moral framework.

Prompt #18

The prompt tells me to bond with an ancient enemy Character, checking a skill to become friends, and sharing a resource with them to gain a shared resource from them. 

Wolfhart is increasingly annoyed with humans. They feel so ephemeral compared to the people he writes about. His stories speak of epic people that live life on purpose, not weak-willed folk that don’t appreciate beauty or the thrill of living. They might as well be dead.

Wolfhart decides to find his “origin,” to track down the Black Wolf. He uses his skill at ambushing others to trap the wolf, but he doesn’t kill it, as he once fantasized. Instead, he feeds it half the Heart of Czernobog, while eating the other half. He wants the Old Gods back in the world, and he wants to know if the Son can become the Father.

The Black Wolf feasts with him, and shares control of the Great Pack with Wolfhart.

Wolfhart checks the Ambush skill, and shares the Heart of Czernobog. He gains access to the Great Pack resource.

Prompt #19 I don’t know that I will ever truly sleep again . . . I may only lie awake in the dark, in my mockery of a life, waiting to journal again. Share1Tweet1Reddit1Email

This prompt tells me that I am physically trapped in a place from which I can never be rescued, and asks me to come up with what I think about for the first thousand years. It informs me that the game is over.

Wolfhart feels no kinship with the mortals any longer. It has been too long since he had a friend. Wolfhart has the pack now, and he rampages, destroying Strosshammer’s new society that is spreading across Europe. He will single-handedly turn back the clock and make mortals live by the sword and their wits again.

Then, the Black Wolf turns on Wolfhart. This is a Europe rife with possible worshippers. Wolfhart has served his purpose, and the Black Wolf drops him into the Void of Czernobog, a place of darkness between worlds. Because Wolfhart shared the feast of Czernobog’s Heart, he will always have a feeling of what the world is like, moving on without him. For a thousand years, Wolfhart hears the prayers of the faithful in the Black Wolf’s ears, but Wolfhart shares the hunger that he obsesses over, unable to feed.

The Black Wolf thinks about Wolfhart’s hunger, and he becomes a mad god, one that demands as much sacrifice of flesh as of will. In this way, at least, Wolfhart knows he continues to shape the world from the void. Or does he?

Is this all a dream? Is this Niffelheim? Did you die all those years ago, when the wolf bit you? You are so hungry. You are so cold. But you must be still affecting the world. Surely you wouldn’t lie in the cold, eternal winter, having lost your greatest battle, unmourned and unremembered.


Thoughts On An Unlife Well Lived 

I really enjoyed this process. Now that I have a taste of journaling games, I think that I may have been transformed. I may have to feed on more of them. I don’t know that I will ever truly sleep again . . . I may only lie awake in the dark, in my mockery of a life, waiting to journal again.

Recommended–If the product fits in your broad area of gaming interests, you are likely to be happy with this purchase. 

This has been an unorthodox journey of a review process, but if you enjoy wondering exactly what you would do in challenging situations, I think you are going to find a lot of worth-while material in Thousand Year Old Vampire.

I’ll be honest, I’m kind of worn out after that roller coaster spiral that my vampire went into at the end. It took a lot out of me to try to do the story justice, but I also really enjoyed the process.

Do you have any other journaling games you would recommend? What was your experience with them, and what kind of emotional charge did you have after completing them? We want to hear about your experiences below!

Categories: Game Theory & Design Blog: International Splash Awards: A celebration of Drupal innovation

Planet Drupal - 15 November 2019 - 4:06am

The Splash Awards, intended to celebrate the most impactful and innovative Drupal projects, went international at Drupal Europe last year. In this blog post, we congratulate the winners of the third edition of the International Splash Awards held during DrupalCon Amsterdam in October and speak with some of them about their winning projects.

Categories: Drupal

Field View Mode

New Drupal Modules - 15 November 2019 - 2:14am

Field View mode module provides a field to select the view mode, during add / edit entity. You can choose a view mode X of node 1 and view mode Y of node 2, without any custom code.
This empowers the editors to show the data as required, eliminating the need to many more components and different styling.

Categories: Drupal

Form Helper Widget

New Drupal Modules - 14 November 2019 - 10:31pm
Categories: Drupal

Forms as Block

New Drupal Modules - 14 November 2019 - 6:03pm
Categories: Drupal

Block Cache Control

New Drupal Modules - 14 November 2019 - 5:44pm
Categories: Drupal

PreviousNext: Responsive Images for Media Entities in Drupal 8

Planet Drupal - 14 November 2019 - 3:06pm

Images on websites can be a huge pain when you are optimizing a site. We want our images to render as crisp as possible but we also want our sites to load as fast as possible. Content creators will often ask "what size image should I upload" and with the thought of some tiny image being rendered at full-screen width pixelated out of control we'll answer "as large as you've got". The content creator will then upload a 2mb jpeg and the load time/network request size will increase dramatically.

by Nick Fletcher / 15 November 2019

Responsive images can be a decent solution for this. A front end developer can achieve this in many ways. A popular way would be to use a  element with the contents of multiple 's using srcset and `media` attributes and a default  tag.

I'll explain how we can do that in Drupal 8. 
The scenario I'm trying to set up in this example is a paragraph that references a media entity with an image field.

Tutorial Enable the responsive images module from Drupal core.
  1. To enable the responsive image module, go to Admin > Configuration.
  2. Click the checkbox next to Responsive Image.
  3. Click Install.

This module may already be installed on your project so just head to Admin > Config and ensure that the Responsive image styles module is enabled.

Add / Confirm breakpoints

The default theme will already have a breakpoints YAML file. If you're using a custom theme you'll need to make sure you have a breakpoints YAML file for it. This should exist at themes/{theme-name}/{theme-name}.breakpoints.yml, where {theme-name}, is the name of your theme.
Create or open the file and configure your breakpoints. There should be a few breakpoints in there and they'll look something like this

  label: small
  mediaQuery: "(min-width: 0px)"
  weight: 1
    - 1x
    - 2x
  label: medium
  mediaQuery: "(min-width: 768px)"
  weight: 2
    - 1x
    - 2x
  label: large
  mediaQuery: "(min-width: 1024px)"
  weight: 3
    - 1x
    - 2x

You can add as many breakpoints as you need to suit your requirements. The weight should go from 0 for the smallest breakpoint to the highest number for the largest breakpoint. The multipliers are used to provide crisper images for HD and retina displays.

Configure Image Styles (sizes)

Head to Admin > Config > Media > Image Styles and create a size for each breakpoint.

  1. Click Add image style.
  2. Give it an Image style name and click Create new style (e.g. Desktop 1x, Desktop 2x, Tablet 1x etc...).

  3. Select an effect e.g. Scale or Scale and crop.

  4. Set a width (height is calculated automatically) or width and height when cropping.

  5. When creating multiple styles just use the breadcrumbs to get back to Configure Image Styles

When you have created all the sizes for your responsive format you can move on to the next step.

Create a responsive Image Style

Head to Admin > Config > Media > Responsive Image Styles

  1. Click Add responsive image style to create a new one.
  2. Give it a label (for example if it's for a paragraph type called profile_image then use that as the name)

  3. Select your theme name from the Breakpoint Group

  4. The breakpoints will load, open the breakpoints that this image style will use and check the radio next to Select a single image style or use multiple.

  5. Select the image style from the Image style dropdown (these are the styles we created in the previous step).

  6. Set the Fallback Image style (this will be used where the browser doesn't understand the  tags inside the picture element. It should be the most appropriate size to use if you could only pick one across all screen sizes)

Add a new view mode for media entities

Head to Admin > Structure > Display Modes > View Modes, click 'Add new view mode' and add your display mode. In this instance, we'll use 'Profile image' again.

Update the display of the image for the entity type

Head to Admin > Structure > Media Types > Image > Manage display

  1. On the default tab click on Custom display settings at the bottom and check the new 'Profile Image' view mode and then Click Save

  2. Click on the tab that matches your new display type (in my example it's Profile image)
  3. On the Image fields row change the Label to Hidden and the Format to Responsive Image.

  4. Click on the cog at the end of the row.

  5. Under Responsive image style select your style.

  6. Select where the file should link to (or Nothing), Click update
  7. Click Save
Update your Paragraph type to use the new display format

Go to Structure > Paragraph Types > {type} > Manage Display

  1. Find the row with the field displaying your media entity and change the format to Rendered Entity
  2. Click the gear icon to configure the view mode by selecting your view mode from the list (in this instance profile image)

  3. Click Save
Testing Our Work

At this point you should be all set.

  1. Create an example page
  2. Select your paragraph to insert into the page
  3. Add an image
  4. Save the page and view it on the front end
  5. Inspect the image element and ensure that a  element is rendered with 's, a default, and when you resize the browser you see what you expect.
  6. To inspect further select the Network tab in your developer tools and filter by images. Resize the browser window and watch as new image sizes are loaded at your defined breakpoints.
Tagged Responsive Design, Responsive Images, Media Entities, Drupal 8, Drupal Theming
Categories: Drupal


New Drupal Modules - 14 November 2019 - 2:52pm

The goal of this project is to enable people to post their crowdfunding information (Patreon, OpenCollective, etc) without needing to allow script tags. Our first customer will be (we hope).

Categories: Drupal

Xbox Game Pass subscriptions have doubled as its library continues to grow

Social/Online Games - Gamasutra - 14 November 2019 - 2:42pm

Spencer neglected to share specific numbers, but that†™s typically the case when it comes to subscriber numbers for Xbox Game Pass and, recently, all Xbox services. ...

Categories: Game Theory & Design

Brazilian Docs

New Drupal Modules - 14 November 2019 - 2:06pm
Categories: Drupal Web Scraping: A Bit of Black Magic

Planet Drupal - 14 November 2019 - 2:00pm

Recently we got an exciting task, to scrape job descriptions from various web pages. There’s no API, no RSS feed, nothing else, just a bunch of different websites, all using different backends (some of them run on Drupal). Is this task even time-boxable? Or just too risky? From the beginning, we declared that the scraping tool that we would provide is on a best effort basis. It will fail eventually (network errors, website changes, application-level firewalls, and so on). How do you communicate that nicely to the client? That’s maybe another blog post, but here let’s discuss how we approach this problem to make sure that the scraping tool degrades gracefully and also in case of an error, the debugging is as simple and as quick as possible.


The two most important factors for the architectural considerations were the error-prone nature of the scraping and the time-intensive process of downloading something from an external source. On the highest level, we split the problem into two distinct parts. First of all, we process the external sources and create a coherent set of intermediate XMLs for each of the job sources. Then, we consume those XMLs and turn it into content in Drupal.

So from a bird-eye-view, it looks like this:

Phase I: scheduling and scraping Phase II: content aggregation

That was our plan before the implementation started, let’s see how well it worked.

Implementation Scraping

You just need to fetch some HTML and extract some data, right? Almost correct. Sometimes you need to use a fake user-agent. Sometimes you need to download JSON (that’s rendered on a website later). Sometimes, if you cannot pass cookies in a browser-like way, you’re out of luck. Sometimes you need to issue a POST to view a listing. Sometimes you have an RSS feed next to the job list (lucky you, but mind the pagination).

For the scraping, we used Drupal plugins, so all the different job sites are discoverable and manageable. That went well.

What did not go so well was that we originally planned to use custom traits, like JobScrapeHtml and JobScrapeRss, but with all the vague factors enumerated above, there’s a better alternative. Goutte is written in order to handle all the various gotchas related to scraping. It was a drop-in replacement for our custom traits and for some sites that expected a more browser-like behavior (ie. no more strange error messages as a response for the HTTP request).

Content synchronization

For this matter, we planned to use Feeds, as it’s a proven solution for this type of task. But wait, only an alpha version for Drupal 8? Don’t get scared, we didn’t even need to patch the module.

Feeds took care of the fetching part, using Feeds Ex, we could parse the XMLs with a bunch of XPath expressions, and Feeds Tamper did the last data transformations we needed.

Feeds and its ecosystem is still the best way for recurring, non-migrate-like data transfer into Drupal. The only downside is the lack of extensive documentation, so check our sample in case you would like to do something similar.


This system has been in production for six months already. The architecture proved to be suitable. We even got a request to include those same jobs on another Drupal site. It was a task with a low time box to implement it, as we could just consume the same set of XMLs with an almost identical Feeds configuration. That was a big win!

Where we could do a bit better actually, was the logging. The first phase where we scraped the sites and generated the XML only contained minimal error handling and logging. Gradually during the weeks, we added more and more calls to record entries in the Drupal log, as network issues could be even environment-specific. It’s not always an option to simply replicate the environment in localhost and give it a go to debug.

Also in such cases, you should be the first one who knows about a failure, not the client, so a central log handling (like Loggly, Rollbar or you name it) is vital. You can then configure various alerts for any failure related to your scraping process.

However, when we got a ticket that a job is missing from the system, the architecture again proved to be useful. Let’s check the XMLs first. If it’s in the XML, we know that it’s a somehow Feeds-related issue. If it’s not, let’s dive deep into the scraping.

The code

In the days of APIs and web of things, sometimes it’s still relevant to use the antique, not so robust method of scraping. The best thing that can happen is to re-publish it in a fully machine consumable form publicly (long live the open data movement).

The basic building blocks of our implementation (ready to spin up on your local using DDEV) is available at, forks, pull requests, comments are welcome!

So start the container (cd server && ./install -y) and check for open positions at Gizra by invoking the cron (ddev . drush core-cron)!

Continue reading…

Categories: Drupal

Lullabot: Lullabot Podcast: with Adam Bergstein

Planet Drupal - 14 November 2019 - 1:52pm

Mike and Matt drag Adam Bergstein onto the show to talk about the free service, which is used to quickly spin up Drupal environments for quick patch testing, reviews, and more. 

Categories: Drupal

Project xCloud preview sees 50 more games, hits Windows 10 in 2020

Social/Online Games - Gamasutra - 14 November 2019 - 1:46pm

Project xCloud is bolstering its library ahead of its eventual launch by increasing its current preview library of 4 games to more than 50 titles, while also detailing how the service will evolve moving into 2020. ...

Categories: Game Theory & Design

Devel - Visualizer

New Drupal Modules - 14 November 2019 - 1:34pm
Categories: Drupal

Dynamic Url Aliases

New Drupal Modules - 14 November 2019 - 12:23pm
Categories: Drupal

Palantir: Dynamic Content From the Edge

Planet Drupal - 14 November 2019 - 10:24am

How to scale content delivery infrastructure by implementing Edge Side Includes in Drupal.

Developers and webmasters who oversee websites with millions of users need to provide a solution to keep their infrastructure from getting overloaded with requests. Scaling up web and database servers is one option, but it can be costly and inefficient. Instead, people have increasingly turned to a Content Delivery Network, or CDN, as a type of protective layer in front of their web and database servers.

What does a CDN do?

The CDN provides a cached layer of content close to the user, often referred to as “the edge.” When a user requests a homepage, for example, they are directed to the cached static version of that page on the CDN rather than overloading the web server or accessing the database, thereby scaling content delivery.

Illustrating scaled content deliver supporting millions of requests while only passing on a small percentage of those requests to a web server, which in turn makes even fewer requests to a database server.

The CDN serves static content. So, what happens when web content is updated? There are a few different options here:

  • The cache can be programmed to expire after a certain number of hours or days.
  • Cache entries can be proactively purged when updates are made.
  • Changes to individual page content can be fetched as each page is requested by a user.

More problematic, however, are the changes that affect each and every page. For example, a global banner or a menu often changes the header or footer. This is where our recent work with Edge Side Includes comes in.

Edge Side Includes

Edge Side Includes (ESI) is both a web standard and an XML-based language that enables the dynamic generation of HTML pages at “the edge”. We recently worked with one client to solve the problem: How can we enable our cached content to remain fresh even after we make updates to some of the global parts?

We used Drupal to solve this problem by generating and rendering this global content as ESI fragments. These ESI fragments could then be included by all of our client’s web properties by using ESI include statements, regardless of how they were built.

Illustrating pseudocode of static markup on a web page, where each web page must include that markup and therefore each page must be retrieved from cache, the web server, and may require a shorter cached lifetime.Illustrating pseudocode of ESI includes and their corresponding ESI fragments indicating that now each web page may be able to have a longer cache lifetime since the ESI fragments are referenced and can have their own cache lifetime.How ESI Works

For our client, we developed a way to render ESI fragments in Drupal that included page parts (specifically the header and footer) on non-Drupal sites so that when those page parts change in Drupal, the non-Drupal sites get those changes automatically. To accomplish this, at the cache layer we have all of these pages that have unique page content and then the same content on each page for including the header and the footer.

Using ESI fragments, if a request is made for a page, the first thing that happens is a request for the header content, and then for the cached footer content. Now if something in the header is changed, only one page needs to be updated.

Drupal and Edge Side Includes

The use case that we solved here was specifically for the header and the footer, but our client wanted to have similar branding across all of their web properties, and they wanted it to be governed by the content management that's done with Drupal. Drupal can do this by rendering the actual ESI fragments at two different endpoints.

Our custom module defines two routes, one for the header and one for the footer. Our controller maps to both of those routes and returns an empty render. Then, in the dot module files, we made sure that we're only including the sort of meta tags that we need and the libraries that we want. In our theme, we have special templates for the ESI fragments. We also made sure that we leveraged some of the core functionality by still going through the render API.

We're rendering blocks, we're rendering menus, we're using libraries, and we're respecting cache tags.

Illustrating the breakdown of responsibilities between Drupal modules (route definition, controller creation, page attachment alters), themes (templates, library definition), and core (render process for various entities, libraries, and cache api).

Our client developed page templates that use business logic to set whatever variables might be needed to deliver their page content, adding our ESI include statements to actually grab the header and the footer content. They’re hosting all of their non-Drupal pages on a server that will provide this ESI service. Our client also determines the cache lifetime, both for their page templates and for the ESI fragments that Drupal's actually hosting.

Illustrating the breakdown of responsibilities for ESI implementers/consumers (business logic, variables parameters for fragments, page templates with variables and includes) and service providers (cache lifetime configuration, ESI fragment routes, ESI service / hosting).Personalization Through ESI

So, what’s next for Drupal and ESI? Another implementation that we're using in Drupal with ESI is a content model where a URL can reference internal or external endpoints and then include content from a URL that references static assets. This is CSS that we can include for personalization. This will allow us to do things like get data from Google tag manager or from Marketo or Mailchimp or a similar platform and make some decisions about the route, which could be a view page. Then, we could dynamically write the ESI include source based on the content they want to render personalized. We’ll let you know as we progress!

Development Drupal
Categories: Drupal


Subscribe to As If Productions aggregator