Dynamic, Open World Pointy-Clicking: else { Heart.break() }

By Alec Meer on July 15th, 2014 at 5:00 pm.

Well, we were mean about WatchunderscoreDogs, so I guess we should be mean about elseOpenCurlyBracketHeartFullStopbreakOpenParenthesisCloseParenthesisSpaceCloseCurlyBracket too. At least this is a game about programming though, so the silly name is a mite more justified. Or maybe lots of hackers really do use a lot of underscores and we’ve been unfair all this time?

Anyway: we wrote about this back in 2012, but the next game from Erik ‘Blueberry Garden’ Svedäng (with art from sometime collaborator Niklas Akerblad) is currently causing internet-wide cooing thanks to a thoughtful write-up and interview by Leigh over at Gamasutra. Apparently, the game has drifted from its puzzle-based roots during development, and into a new and extremely appealing focus on world-building.

It does (to Svedang’s distress) have a little in common with Blendo’s Quadrilater Cowboy, in terms of having in-game coding as a major conceit, but he’s clear that it’s going off in other, broader directions.

“There is a richness of simulation that encompasses everything from the characters you meet and interact with to various things like computers, the public transportation system, and the in-game internet. Our goal has been that the world has a strong sense of self-sufficiency to it, and that the player character is not the centre of the universe.”

The art approach has shifted too, and Else Heartbreak (because c’mon, I’m not writing all those brackets every time) now boasts a scratchy PlayStation 1 aesthetic. It’s fascinating that we’re far enough along from that time now, at least on a graphical level, that it can (in the right hands) become a deliberate and evocative look rather than one of technological necessity. Looking at those images, I do feel carried back to a time when games seemed a little stranger, a little harder to immediately digest and interpret, where simpler shapes and textures perhaps fired my imagination more than today’s most impeccably-rendered grimdarkscapes do. Else Heartbreak’s setting of Dorisburg is based on Svedäng’s own take on his native Gothenberg, but with industrial attributes and the grungy darkness turned up, and somehow that reminds me of half-forgotten JRPGs and muddled adventures I played in the late 1990s.

I’m dancing around the killer line in that Gama interview, which is this:

“Else Heartbreak is designed to encourage free-form roleplaying where it should be fun to just go for a walk in the park, smoke a cigarette or visit the casino. So perhaps it could be described as a strange kind of homemade Grand Theft Auto, without any guns or cars.”

And that’s what a lot of us want, right? Both from open world games and from walking simulators – just the pleasure of existence in someplace Other. It’s a tall order of course, but at four years and counting, at least it’s been in a reassuringly long period of development already. And, as Alice was saying the other day, there is great power in imagining what a game might be, and of the reality that might be if it did, whether or not the truth of the thing turns out to live up to it. I choose to imagine that Else Heartbreak is what it promises, because I find the idea of it so very pleasing.

Things like release dates or generous amounts of footage have yet to emerge, but I wholeheartedly recommend browsing the well-stocked Tumblr-based devlog here, which is rich in screenshots, clips and behind-the-scenes glimpses.

, , , .

43 Comments »

Sponsored links by Taboola
  1. PDP-8e says:

    THERE IS NO SEMICOLON AFTER Heart.break()

    THIS IS SACRILEGE OF THE HIGHEST ORDER

    BRING THIS MAN BEFORE THE GALLOWS

    • schlusenbach says:

      This is obviously scala code, no need for a semicolon here. I’d be much more concerned about a static function named ‘break’.

      • Dawngreeter says:

        Yeah, that bothers me as well. Surely this would make more sense”

        { Heart.getInstance().break() }

        Although, really, it implies Gang-of-friggin-four-style-singleton and I’m pretty sure we’re all aware that’s an antipattern. Even if it does make sense that Heart does have only one instance. So maybe it should be appropriately scoped and injected. Like…

        @Inject Heart heart
        { heart.break() }

        Of course, it would ultimately be a lot more straightforward to just have an organ factory which keeps track of the number of instances for key organs. And it would make for a better title anyway:

        { OrganFactory.getHeart().break() }

      • DXN says:

        10 MAKE PROGRAMMING JOKE
        20 GOTO 10

        • Premium User Badge

          Gap Gen says:

          make: *** No rule to make target `PROGRAMMING JOKE’. Stop.

      • Premium User Badge

        Gap Gen says:

        I assumed that the person who wrote that code is a monster who capitalises instances but leaves functions lower case. I like to pretend they use both camelcase and underscores, and use public member variables*.

        * For non-programmers, public member variables are the same as leaving your intestines out so they can trail along the ground as you walk down the street.

        • Dawngreeter says:

          That’s the single greatest description of why public fields are bad that I’ve ever seen! I’m gonna steal it.

          • Premium User Badge

            Gap Gen says:

            Actually I just realised that Heart could be a namespace. Carry on, then.

            The intestines thing works because if you’re in a very sterile environment where you completely trust everyone around not to junk up your exposed organs, it’s probably fine to do that. But when in six months someone lawnmowers your large intestine, it’s probably not entirely their fault.

        • wldmr says:

          public member variables are the same as leaving your intestines out so they can trail along the ground as you walk down the street.

          Or simply a … you know … “public member”.

    • staberas says:

      if(game != game.boring && game == cheap){
      game.preorder();
      }

      // replied on wrong place D:

      • Dawngreeter says:

        Surely game can’t equal cheap. Cheap would just be an attribute that the game object could contain. Although, realistically, cheap isn’t a very well defined attribute. Cheap could be a validator class which could evaluate the object passed to it on various scales (price, metacritic score, length, etc.) and just return a boolean.

        Also, how the heck can game != game.boring work? Unless boring is a public field within (presumably) Game class, and it is also of type Game, that would always evaluate as false. I’d also go with a validator class, as for cheap (though it puzzles me why you thought “cheap” should function differently from “boring”…)

        Finally, how the heck does game.preorder() work? You don’t want the game to perform the preorder function. You want to preorder it. So..


        if (GameEvaluator.isBoring(game) && GameEvaluator.isCheap(game)) {
        preorder(game);
        }

        Assuming preorder is a local function. Which would also be questionable, you’d probably want a separate system for preordering.

        • Grargh says:

          I most definitely applaud your educational posts, but now we’re preordering boring games…

        • Geebs says:

          I dunno, I think you’re introducing unnecessary object orientation there with the evaluator. You can just compare with a value in the user preferences.

          //I’m not big on dot syntax

          – (BOOL) evaluatePurchaseWithItem:(PotentialPurchase *) thisItem andBuyer:(Buyer *) theBuyer{
          if ([thisItem steamPrice] >= [[theBuyer expressedPreferences] priceLimit]) {
          return NO;
          }
          return YES;
          }

          – (void) purchase:(PotentialPurchase *)thisItem {
          BOOL getNewThing = [self evaluatePurchaseWithItem:thisItem andBuyer:[self owner]];
          if (getNewThing) {
          [self goNuts];
          }
          }

          • Dawngreeter says:

            Yeah, overdesigning is a vice I sometimes indulge in.

            Still, having an evaluator class can allow for much easier evolution of the code. And you can bet your chair something so sensitive as evaluating if a game is cheap enough will require constant babysitting.

          • LionsPhil says:

            #!/bin/sh
            IMPULSE_PRICE=500
            . /etc/default/impulsive-purchases

            game=$0

            if evaluate-game "$game"; then
                exec buy-game --preorder "$game"
            else
                exit 0
            fi

            evaluate-game() {
                local game="$0"
                [ "`game-fun $game`" gt 50 ] || return 1
                [ "`game-price $game`" lt "$IMPULSE_PRICE" ] || return 1
                return 0
            }

          • Premium User Badge

            Gap Gen says:

            A man naked but for a flowing beard and considerable body hair leaps out of the bushes, shouts “magic numbers!” and then scurries back into the undergrowth.

          • Geebs says:

            #import Desert.h
            #import Hole.h
            #import Fruit.h

            @interface JuniperBush : Bush

            @property (strong, atomic) Fruit *juniperBerries;

            – (id)getJuniperBerries;
            – (void)setJuniperBerries:(Fruit *)newBerries withUser:(User *)theUser;

            @end;

            @implementation JuniperBush

            – (void)setJuniperBerries:(Fruit *)newBerries withUser:(User *)theUser {
            if (![theUser isEqualTo:self]) {
            @try {
            NSException *e = [NSException
            exceptionWithName:@”Hey! Clear off, the lot of you”
            reason:@”They’re all I’ve got to eat”
            userInfo:nil];
            @throw e;
            }
            }
            }

            By the way, it’s a minor miracle that so many people have managed to post pseudocode without a Style War erupting. I suspect it’s because you can’t do indents at the start of the line on this forum…

        • Premium User Badge

          Hot Trout says:

          How about something functional / lispy ? (then it pretty much doesn’t matter how you might want to extend it later on!)


          (defn shouldPreorderGame? [game]
          (let [evaluatedGame (evaluateGame game)]
          (and (false? (:boring evaluatedGame))
          (true? (:cheap evaluatedGame))))

          (if (shouldPreorderGame? game) (preorder game))

          • laiwm says:

            This is a balm for the eyes of a javascript dev after all that object orientating up there.

          • Premium User Badge

            Gap Gen says:

            A balm made of GRAPEFRUIT JUICE. OO4EVA.

          • Premium User Badge

            Naum says:

            May I serve Messieurs some delicious Haskell (with obstructive line wrapping)?


            preorder :: Game -> Bool
            preorder = boring <&&> cheap

            (<&&>) :: (a -> Bool) -> (a -> Bool) -> (a -> Bool)
            (f <&&> g) x = f x && g x

    • apa says:

      There should be a linefeed after the brace and also after the method call. Don’t people use autoformatters?

      • SRTie4k says:

        IIRC, that is actually the default formatting used in Eclipse and NetBeans (brace follows method on same line).

        I currently use Visual Studio exclusively, which does indeed separate the function call and the subsequent brace.

        • Dawngreeter says:

          Closing brace is a new line by default in Eclipse. Also, opening brace does follow method name but there’s always a line break afterwards. And indentation. Not 100% sure but I believe this One True Way goes back as far as C.

          Visual Studio high as hell, breaking lines before opening braces and shit.

    • ix says:

      I just figured it was Javascript.

  2. SRTie4k says:

    if (this.Game.isGood)
    {
    Heart.flutter();
    int daysInYear = DateTime.IsLeapYear ? 366 : 365;
    for (int x = 0; x < daysInYear; x++) Play(this.Game);
    }
    else
    {
    Heart.break();
    }

  3. Darth Gangrel says:

    You write “OpenCurlyBracketHeartFullStopbreakOpenParenthesisCloseParenthesisSpaceCloseCurlyBracket”, pointing out the space between the parenthesis and the second curly bracket, but don’t acknowledge that there is also a space between the first curly bracket and HeartFullStopbreak. Is that something that programmers don’t bother with pointing out?

    • Premium User Badge

      Harlander says:

      Most programming languages ignore whitespace in most circumstances.

      As an example of the kind of thing programmers find funny, Whitespace is a programming language which ignores everything but whitespace.

      • Darth Gangrel says:

        Thanks for responding! I figured it was inconsequential, but still mentioned it because I like to nitpick.

        Wow, that whitespace thing really is nerd humor on a higher level. Not having any knowledge about programming I’d say the nerd level on such a joke is over 9000, but perhaps it’s closer to 2^13 (i.e. 8192).

  4. hanneswall says:

    It is not Niklas Åkerblad who made “Blueberry Garden” or who dismayed over the similarities to Quadrilateral Cowboy. That was Erik Svedäng. Niklas Åkerblad is an artist who is the main collaborator of Svedäng and who have previously released a few iOS games together.

    (There is also a typo in the first part of the paragraph after the quote box “ntoo”.)

    Sorry to be a nitpicker :P

    • Heliocentric says:

      Not the BG guy? I call shenanigans on Mr Meer .

      • hanneswall says:

        Well, Svedäng IS working on this game as well.
        I think the problem here is that the Gamasutra article focuses heavily on Niklas Åkerblad at the start which may have given Mr. Meer the impression that Åkerblad is the sole or at least largest contributor to this title, while the article later mentions that the concept was originally spawned by Erik Svedäng after he had finished Blueberry Garden.

    • Alec Meer says:

      Whoops, I = goon. All fixed, thanks for pointing it out.

  5. Heliocentric says:

    Blueberry Garden was an apocalyptic survival horror sandbox with a living world. It being a platform game disguised that to most people.

  6. BarryAllen says:

    >Else Heartbreak is designed to encourage free-form roleplaying where it should be fun to just go for a walk in the park, smoke a cigarette or visit the casino.

    Sounds boring to be honest

    • The_Hunter says:

      This guy don’t get it…

    • FrumiousBandersnatch says:

      I know right? As far as i can see there isn’t even a comically oversized gun or people erupting into swarms of physically correct wobbling flesh chunks in this game.

  7. Koozer says:

    As someone who has never owned a Playstation, those screen just look terrible. If it looked like Perfect Dark however…

    It would still be terrible.

  8. Synesthesia says:

    i really, really dig that art style. That point int ime when 3d games had characters with faces barely recognizable, hard, inhuman animation, and gougraud shading. Still very far away from the uncanny valley, kind of like a puppet show.

    Is there somewhere i can see more screenshots of this?