Hasbro Bought D&D Beyond – Thoughts

I saw this video in my feed and if you’re into D&D and especially DDB, you should check this out.

And here are my thoughts, archived for my convenience.

1. Right now, Foundry is the benchmark, king-of-the-hill of VTTs. Nothing comes close. Not Roll20, not FG, and not what DDB has to offer. And at current rate of development, with both Roll20 and DDB working with small teams and Foundry having a small base team but a ton of community developers, I don’t see anyone able to catch up to that. I’m currently at a point that I truly treat DDB as a convenient, digital, online source… to get my D&D material and that’s it. Pretty much everything else I do on Foundry, and with no added subscriptions. I buy the software, I buy the materials, my players just log in. It’s, as if we have one set of books that everyone share at a single table. The D&D 5E version on Foundry even recently added a better level-up mechanism so I only need to download the content (possible through an amazing community developer) to Foundry and that’s it. Unless WotC decide no one is allowed to use D&D in online tools (which will probably be against their SRD and start a huge outcry) it’s not gonna change.

2. With Demiplane on the field, soon Pathfinder, Vampire, even Marvel’s new game will have the same capabilities as D&D in the online space.

3. In the video game space, a lot of companies get bought because the buyer see the value in them. They see that if they give them more resource and more runway, they can do many great things (that will net more profit in the long run). Those almost never see significant changes in how they run.

4. I see where you’re coming from with the VTT concentration and while other VTTs will doubtless always exist, the monolith is scary. The solace is that while a lot of players just play one system, there’s a significant minority who play many games. So, when one player complains that D&D doesn’t allow X or isn’t clear on Y, someone will surely pop up with “Well, system Z does that” and then the discovery begins. And like you say, the fact that third party products will always exist, if DDB won’t allow them “because they’re only core”, people will shift over.


Posted in Gaming, Role-Playing, Thinking Out Loud by with no comments yet.

Useful C# Features (or “Cool Things You Didn’t Know You Could Use in Unity”)

1. Tuples & Discards!

Tuples is something more dynamic languages like JavaScript have been holding over the more static languages for a while. It allows you to do more with less action (higher level ones, that is). While tuples have existed in C# before as a class of their own, they are now getting a proper implementation. It basically makes a complex variable/object without having to predefine it using a class or a struct.

var alphabetStart = (Alpha: "a", Beta: "b");
Console.WriteLine($"{alphabetStart.Alpha}, {alphabetStart.Beta}");

You can even use it to return more than one element from a method(!!!). Unfortunately, the Unity editor doesn’t support handling those kinds of returns yet but they are still useful inside your scripts.

Discards are those underscores you see in the example below. It allows you to deconstruct a tuple and discard the data you don’t want, only keeping what you actually need in its own named variable.

using System;

public class Example
{
    public string NewYorkCityName
    {
        get
        {
            var (_, name, _) = QueryCityData("New York City");
            return name;
        }
    }

    private static (string name, int pop, double size) QueryCityData(string name)
    {
        if (name == "New York City")
        { return (name, 8175133, 468.48); }

        return ("", 0, 0);
    }
}

2. Pattern Matching!

Pattern matching allows you to test a runtime type in an if or switch statement and then convert it to that specific type all in a single statement!

if (input is int count)
{ sum += count; }

It also increases the power of switch, allowing you to do a lot more with less and create much more complex testing blocks.

public static int SumPositiveNumbers(IEnumerable<object> sequence)
{
    int sum = 0;
    foreach (var i in sequence)
    {
        switch (i)
        {
            case 0: break;
            case IEnumerable<int> childSequence:
            {
                foreach(var item in childSequence)
                { sum += (item > 0) ? item : 0; }
                break;
            }
            case int n when n > 0: sum += n; break;
            case null: throw new NullReferenceException("Null found in sequence");
            default: throw new InvalidOperationException("Unrecognized type");
        }
    }
    return sum;
}

3. Local functions

Local functions is currently one of my favorite features in C#. You could already create functions inside functions by assigning a block into an Action or Func variable but now you can just define an anonymous function and not worry about what returns or not returns a value or where exactly you defined which variable. So, if you need a complex block or calling the same function multiple times but you don’t want it available outside, Local Functions are here for you.

private static string GetText(string path, string filename)
{
     string AppendPathSeparator(string filepath)
     { return filepath.EndsWith(@"\") ? filepath : filepath + @"\"; }

     var reader = File.OpenText($"{AppendPathSeparator(path)}{filename}");
     var text = reader.ReadToEnd();
     return text;
}

4. Switch Expressions!

You can now rephrase your Switch blocks into something much nicer and readable.

public static RGBColor FromRainbow(Rainbow colorBand) =>
    colorBand switch
    {
        Rainbow.Red    => new RGBColor(0xFF, 0x00, 0x00),
        Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00),
        Rainbow.Yellow => new RGBColor(0xFF, 0xFF, 0x00),
        Rainbow.Green  => new RGBColor(0x00, 0xFF, 0x00),
        Rainbow.Blue   => new RGBColor(0x00, 0x00, 0xFF),
        Rainbow.Indigo => new RGBColor(0x4B, 0x00, 0x82),
        Rainbow.Violet => new RGBColor(0x94, 0x00, 0xD3),
        _              => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)),
    };

5. Property Patterns

This is another wonderful extension to the switch statement allowing you to switch on a structure and get output depending on its internal properties rather easily.

public static decimal ComputeSalesTax(Address location, decimal salePrice) =>
    location switch
    {
        { State: "WA" } => salePrice * 0.06M,
        { State: "MN" } => salePrice * 0.075M,
        { State: "MI" } => salePrice * 0.05M,
        // other cases removed for brevity...
        _ => 0M
    };

6. Tuple Patterns

This is another cool extension to the switch statement, allowing you to match a case based on individual items inside a tuple breakdown.

public static string RockPaperScissors(string first, string second)
    => (first, second) switch
    {
        ("rock", "paper") => "rock is covered by paper. Paper wins.",
        ("rock", "scissors") => "rock breaks scissors. Rock wins.",
        ("paper", "rock") => "paper covers rock. Paper wins.",
        ("paper", "scissors") => "paper is cut by scissors. Scissors wins.",
        ("scissors", "rock") => "scissors is broken by rock. Rock wins.",
        ("scissors", "paper") => "scissors cuts paper. Scissors wins.",
        (_, _) => "tie"
    };

7. Using Declarations

One of the really nice things in C# over C and C++ is that it is a managed language. Yes, there are performance differences (which Unity has almost 100% taken care of) but it is a huge load of responsibility off the developer. The Using declaration is a great way to take advantage of it. When you need to open a file or create a web request but just for a short time and you want to dispose of it properly… you can go through the whole rigmarole or just enclose the code in a Using block that takes care of everything for you.

static int WriteLinesToFile(IEnumerable<string> lines)
{
    using (var file = new System.IO.StreamWriter("WriteLines2.txt"))
    {
        int skippedLines = 0;
        foreach (string line in lines)
        {
            if (!line.Contains("Second"))
            { file.WriteLine(line); }
            else
            { skippedLines++; }
        }
        return skippedLines;
    } // file is disposed here
}

8. Indices and Ranges

First of all, you can now define a range in C#.

Range phrase = 1..4;

And you can use those numbers or that Range to access a sub-range or a sub-group of another variable. However, be careful because range accessors are beginning inclusive and ending exclusive.

var words = new string[] { "The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" };

var quickBrownFox = words[1..4]; // "quick", "brown", "fox" and no "jumped"

var lazyDog = words[^2..^0];
 // The from-end index accessor. ^0 is the end and not included
var allWords = words[..]; // contains "The" through "dog".
var firstPhrase = words[..4]; // contains "The" through "fox"
var lastPhrase = words[6..]; // contains "the", "lazy" and "dog"
var text = words[phrase]; // is like quickBrownFox

9. Null Coalescing Assignment

The Null Coalescing Operators are some of my favorite features in new C#. It allows you to check for Nullls and then do things accordingly. The null-coalescing assignment operator checks if the left side is null. If it isn’t, it’s returned. If it is, the right side is assigned to it and then it’s returned. It’s a great way to do lazy resource assignment and/or creation. 

List<int> numbers = null;
int? i = null;

numbers ??= new List<int>();
numbers.Add(i ??= 17);
numbers.Add(i ??= 20);

Console.WriteLine(string.Join(" ", numbers));  // output: 17 17
Console.WriteLine(i);  // output: 17

Posted in IT, Life, Programming by with no comments yet.

News: Average User has no Concept of How Much Game Dev Costs

Recently, some clueless joe on Twitter said he will pay 10,000$ to the person who adds a multiplayer aspect to Zelda: Breath of the Wild. If he was going to donate to a modder who was working on it, that would have been fine but it seems like he was thinking that he could hire someone to do something like that for that kind of money.

Here is a long, detailed response to this which you should read but here’s the summary: 10,000$ would pay for about two work months of the average+ programmer. Also, networking is hard. The hardest networking challenges in gaming usually arise in fighting games because they usually need to be exactly per pixel and per frame accurate and, probably over distances where network traffic takes more time to go back and forth than it takes pro players twitch reflexes to react. You can see how important this is if you go back and read about the network woes of Street Fighter V.

Now, the demands of a PvE, open world, action RPG would probably be a lot less strict but these are still difficult problems. Especially if you’re talking about tacking on something like this onto a game that was definitely not designed for it.

You want a more current example? On the one hand, Battlefield 2042 is out now and it’s buggy as hell. On the other hand, Halo Infinite’s multiplayer is also out and it’s much better. Probably because the team is backed and overseen by a very strict corporate overland. On the other other hand, Halo’s campaign will come out in a week but the Co-Op campaign will only come out in May 2022. MAY!!!

343 Industries have been working on the Halo games for over 10 years! They are backed by one of the biggest corporations in the world! [According to Wikipedia] They are 750 strong! And it’ll take them — yes, assuming they have more going on than just Halo Co-Op — five months from campaign release to co-op campaign release.

And some people think you can just add co-op mode on a massive game for 10,000$.


Posted in Gaming, Less Interesting News, Practice, Programming, Thinking Out Loud by with no comments yet.

Portugal just became nicer to employees

Portugal recently passed a law they fondly call “Right to Rest”.

It contains various measures to help employees have a better work-life balance such as the ability to work remotely when you need to take care of a child or companies contributing to household bills when an employee is working remotely a lot. But the nicest thing about it is indeed the ban on contacting employees after work hours. I’m guessing there is a stipulation about emergencies or people like server administrators and doctors who are supposed to be on call but the fact it’s enshrined in law is just amazing.

Kinda makes me want to move to Portugal. :)


Posted in High-Tech, IT, Less Interesting News, Practice, Thinking Out Loud by with no comments yet.

Far Cry 6, PETA, and are Games Educational?

Recently, PETA criticised Ubisoft for including a cockfighting mini-game in their recent franchise title Far Cry 6. And that got me thinking about what is ok or not ok to include in a game.

I completely understand why Far Cry 6, which occurs in a Cuban-esque island country called Yara, includes that aspect. Cuba, a country under heavy sanctions, makes due with whatever they have at hand. And, as far as entertainment goes, while cockfighting is a horrible practice in your regular western-aligned countries, it is not exactly frowned upon in Cuba. So, Far Cry 6 appropriating this symbol for immersion purposes is understandable.

On the other hand, I also completely understand why PETA would criticise this. Far Cry is a very popular franchise. At the time of writing, it has sold poorer than its predecessor but that still puts it above 10 million units moved. That’s a lot of people being exposed to this segment, engaging with cockfighting in a way that might be unhealthy in the future. In the game itself, you do play the cockfighting mini-game in a fighting game style, as a animal encouraged to viciously peck, rip, and tear another animal, both of which were probably forced into this against their will.

So, think about that 13-year-old kid who just got his hands on the new, popular AAA title all their friends are playing and this is the first time they sees something like cockfighting. If that’s the first time they engaged with that sort of thing, they might take it for granted that you can pit animals against each other in a ruthless battle (hopefully not) to the death. And that could lead to animal cruelty in real-life. Not a thing us as a society, hopefully, want to encourage.

I recently saw segments of a Bollywood movie that had a cancer warning at the bottom, but prominently, on screen every time someone on screen even just held a cigarette in their hands. It seems silly but them’s the rules in India. I totally get it. I think it’s totally appropriate, for immersion, to have something like a cock-fighting mini-game in Far Cry 6. But it should be accompanied by an advisory warning, when you engage with it or, at least, every time you start the game.


Posted in Gaming, Humanity, Thinking Out Loud by with no comments yet.

My Foundry Setup

I have been asked about my Foundry setup and what I did to make everything so smooth, easy, and cool. I decided to not do a video about it because most of the modules I use already do a very fine job explaining themselves and Encounter Library already has an extensive set of tutorial videos.
So, here are the modules I use with a short explanation of what exactly they do.

(more…)
Posted in Gaming, Role-Playing, Thinking Out Loud by with no comments yet.

I had a conversation with Riku Nuottajärvi

This might not mean a lot to a lot of people but it’s something I am very much enthused about!

The story is Matt Mercer tweeted about that music track in a game that just breaks you.

I said it’s the Yehat Theme Music from Star Control II.

1

Then Riku Nuottajärvi liked that tweet and I lost it a bit. And he answered me!

2

That’s the person who wrote a lot of the music that accompanied me through the nineties. So, I’m keeping this as a memento. :)


Posted in Art, Gaming, Geekdom, Life by with comments disabled.

מחוננים – אואטר: זיקית (3), חלק ד’

“כמה זמן אמרנו שאנחנו נותנים לזה?” איתןהסתכל על שעונו.
“כמה שצריך,” סטטית אמרה בקשר.
“זה כבר הפאב השמיני בעשרה ימים. כבר שכחתי איך אור שמש נראה.”
“אל תתבכיין. אתה רק צריך לשבת שם ולהיראות כאילו אתה שותה. אם החברים שלך היו יודעים מה אתה עושה, כל אחד מהם היה מתחלף איתך בשנייה.”
“כן, המפקדת.” איתן התיישר ושוב העביר את מבטו על הנוכחים בפאב.
“‘סטטית’ זה מספיק טוב.”
“אבל ברצינות,” איתן אמר, אבל הקשר היה שקט. “הלו? מישהו?”
“שקט,” הדממה התריס.
“אני חושבת שאני קולטת משהו,” סטטית הוסיפה.
אואטר הסיט את מבטו לצד אחד של הפאב. סטטית ישבה בשולחן צדדי, סורקת כל מי שנכנס. עכשיו היא הייתה עם ידה על רקתה, כאילו יש לה מיגרנה. הוא הסתכל לצד השני. הדממה והדף ישבו בשולחן בצד השני. הדף נראתה מאוד מרוכזת באיזה שהוא קוקטייל בעוד הדממה ישב דרוך, אצבעותיו לבנות סביב הבירה שהחזיק.
“בעוד 3…” סטטית התחילה, “2… 1…”
הייתה שנייה מתוחה נוספת שהרגישה כאילו כל הפאב האט ואז חזר לעצמו כשבדלת עברה אישה צעירה. עשרה גבוה או 20 נמוך, לפי הערכתו של איתן. היא הייתה קצת נמוכה, עם שיער שחור מבריק עד הכתפיים. היא לבשה שמלת מיני כחולה כהה, עם רצועת כתף אחת, שהייתה כל כך צמודה עד כדי לא להשאיר מקום לדמיון. נעלי העקב שנתנו לה את השדרוג הנחוץ לגובה התאימו לשמלה. היא הסתכלה מסביב כמשחרת לטרף לפני שפנתה לכיוונו של שולחן פנוי וקרוב.
“אז מה התוכנית?” איתן שאל.
“אני פתוחה להצעות,” סטטית ענתה.
היה שקט ארוך בקשר.
“יש לי רעיון,” איתן אמר. הוא רוקן את בקבוק הבירה שלו והניח אותו חזרה על הדלפק.

סטטית הרימה את המיקרופון שלה לפיה במחשבה לשאול מה היה הרעיון כשראתה את ידו השנייה של איתן, מתחת לדלפק, מבזיקה באור לרגע. היא הסתכלה סביב לראות אם מישהו שם לב. לרגע, זה לא נראה ככה.
“אה, שיט,” איתן פלט כשידו הבזיקה שוב והוא ניסה לסגור אותה בחוזקה.
חלק מהנוכחים הסתכלו מעלה לראות אם משהו השתבש עם האורות של המקום אבל נראה שהאישה בשמלה הכחולה הסתכלה ישירות לכיוונו. גם מאיפה שסטטית ישבה היא הייתה יכולה לראות את הבעת הסקרנות על פניה כשעזבה את השולחן בו הייתה ונעה לכיוון הדלפק.

“היי,” האישה בשמלה הכחולה נשענה על הדלפק והסתכלה על איתן.
“או… היי,” איתן היסס וניסה להסתיר את ידו.
“מה יש לך שם?”
“אה… שום דבר. שום דבר בכלל,” איתן הצמיד את ידו הזוהרת לידו השנייה, כמנסה למחוץ את האור. הוא לקח כמה נשימות עמוקות והאור בין ידיו נחלש.
“מחונן?” היא שאלה.
“מה? אה… לא. בקושי סיימתי 3 יחידות.”
“לא כזה,” היא חייכה אליו. “כזה,” היא מרימה את ידה ביניהם, גב היד לכיוון איתן, להראות לו את ציפורניה מחליפות צבעים.
“או. זה מגניב. איך את עושה את זה?”
“כמו שאתה גורם ליד שלך להאיר.” היא הושיטה את ידה לתפוס בפרק ידו של איתן.
הוא לא עזב את ידיו התפוסות. “אולי זה לא רעיון טוב, את יודעת?” הוא הניד בראשו לשאר הפאב ובחן אם מישהו מסתכל לכיוונם.
“אז בוא איתי. אני מכירה מקום פרטי יותר בו נוכל להכיר אחד את השנייה.”
“אה… אוקיי.”

“נראה שהדג נתפס,” סטטית אמרה בקשר, עוקבת במבטה אחרי זיקית שגררה את איתן בעדינות אחריה אל הדלת ומחוצה לה. “הדף, הדממה, תעקבו אחריהם. אבל ממרחק בטוח. אל תתפסו. ואל תעשו דבר בלי פקודה שלי או אם אואטר קורא לכם במיוחד. אני אשאר פה אלא אם כן תגידו לי שהם מתרחקים מחוץ לטווח.”
הדף והדממה הנהנו בראשם מהצד השני של הפאב. הדממה השאיר כמה שטרות על השולחן כשהדף כבר נעה בנחישות לכיוון הדלת.


Posted in Art, From the Writing Desk, Stories by with comments disabled.

Is Urbanisation Over?

With the pandemic on going, and large tech companies telling their employees to stay home for, possibly, the next year, and many realising that having an office to work out of is not a necessity, what I’m mostly thinking about is…
What are the odds the pandemic will just be ever present? Or, what if it will stick around long enough so that the general urbanisation of the planet over the past few decades will just stop and people will start spreading around so that we end up with small rural communities that are more spread out?

Posted in High-Tech, Humanity, Less Interesting News, Practice, Thinking Out Loud by with comments disabled.

Some Thoughts on Difficulty in Games

Idan Zeierman said this on The Last of Us Part II:

Translation: I don’t know what to say. Along with the first game, they are probably two of the best works of art I ever experienced. But they come in the form of tough survival horror games that take 30 hours to complete and contain a lot of zombies. It’s not an easy bar for experiencing them properly.

I replied:

Translation: On the one hand, that is the reason why a lot of people will never experience some of the greatest works of art ever made (because they’re games). On the other hand, these works won’t be the same if you don’t experience them for yourself.

This got me thinking about difficulty in games.

I think the subject of inclusion and exclusion through difficulty has been tread enough but I think it mostly referred to gamer culture. Some Dark Souls fans would like to think that the game won’t be the same unless it was brutally difficult. Now, you can say that easy for one player might still be brutally difficult for another, but we’re still assuming the same level of potential ability and game literacy. I’m not going to talk about the players who’ve seen Dark Souls, know about it, and it’s just not their jam and they prefer to play Candy Crush or Brawl Royale.

I’m talking about my mother.

Works of art are all about the creator trying to evoke a specific emotion or thought in the ones experiencing them. Dark Souls is not above evoking those emotions but its mechanics are about getting good. They’re about figuring out what makes monsters tick, how they move, how they act, finding weak points and exploiting them; they’re about the grueling process of being a weakling and becoming a hero. I don’t think my mother would be in to that.

But I think my mother might be into Portal, or Brothers, or Life is Strange. But she would never touch any of those because they’re games and “she doesn’t understand games” or “she’s not good at that”. And that’s bullshit. And it has to do with difficulty settings. I’m not saying that every game should have “Click Button to Progress” difficulty setting. Having mechanics to manage, obstacles to overcome by yourself, and decisions to make is part of the parcel of a game. But I do think that every game should have an “Experience” difficulty where it’s the easiest it can be without compromising the intention of the mechanics.

And I also think that every game should have ‘Hint’ button. Something that will remind you of important mechanics, remind you of your current goal, explain the challenge of the moment, remind you of the relevant information you already collected, and then maybe go into recommended strategies, and even the developer recommended course of action at the present moment.

Because, when I’m thinking about my mother, I would gladly give her Life is Strange (except for a couple of stressful or timing situations), and I would gladly give her Brothers (once she’s more experienced with a controller), but I would only give her Portal if I could make the last two levels easier for someone with almost zero game literacy who doesn’t have lightning reflexes and might also have trouble aiming. And, back to the original topic, I would never give her The Last of Us until the easiest difficulty setting was much easier. It doesn’t have to be a cake-walk, but it doesn’t have to be gruesome either.

And I also think Dark Souls could be made better. Don’t let up on the need to explore, to collect items, to decide where points go, to upgrade weapons, to find the right path, to calculate strategy, and definitely don’t let up on the need to study the bosses and to approach the battle tactically. But you can definitely make the mechanically intense moments less intense, slower, and you can definitely give the player more help when it comes to knowing what needs to be done and how.


Posted in Art, Gaming, Practice, Thinking Out Loud by with comments disabled.