Brianna Wu / John Walker Flynt - "Biggest Victim of Gamergate," Failed Game Developer, Failed Congressional Candidate

Before I get some sleep, I thought I'd share a bit of programming 101 and what R60 can teach us about how not to write code.

I dug a bit in to R60's AI, if selecting a random move from a list can be called AI. Here's the core AI routine from the decompiled code:

Code:
function int ReturnRandomAnimationIndex()
{
    local int I, arrayLength, Index;
    local float weightsTotal, randomWeight;
    local array<float> NormalizedWeights;

    weightsTotal = 0.0;
    arrayLength = RandomAnimations.Length;
    // End:0x170
    if(arrayLength > 0)
    {
        I = 0;
        J0x3D:
        // End:0xB3 [Loop If]
        if(I < arrayLength)
        {
            weightsTotal = weightsTotal + RandomAnimations[I].AnimationChance;
            NormalizedWeights.AddItem(weightsTotal);
            ++ I;
            // [Loop Continue]
            goto J0x3D;
        }
        // End:0xE8
        if(weightsTotal == 0.0)
        {
            Index = Rand(arrayLength);
            return Index;
        }
        // End:0x16D
        else
        {
            randomWeight = FRand() * weightsTotal;
            I = 0;
            J0x10A:
            // End:0x16D [Loop If]
            if(I < arrayLength)
            {
                // End:0x15F
                if(randomWeight <= NormalizedWeights[I])
                {
                    Index = I;
                    return Index;
                }
                ++ I;
                // [Loop Continue]
                goto J0x10A;
            }
        }
    }
    // End:0x176
    else
    {
        return -1;
    }
    //return ReturnValue;  
}

Now, that's a bit messy. So I'll rephrase it in C, with comments for the non-programmers inspired to follow along at home:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {
    float weights_total;
    float normalised_weights[num_animations];
  
    // "normalise" the animation weights by summing them and adding the sums to a list
    for (int i = 0; i < num_animations; i++) {
        weights_total += animations_list[i].weight;
        normalised_weights[i] = weights_total;
    }
  
    // if the list is unweighted, choose a random index
    if (weights_total == 0)
        return rand(num_animations);
  
    // otherwise, choose a random number beween 0 and weights_total, select that item's index and return it.
    float random_weight = frand() * weights_total;
    for (int i = 0; i < num_animations; i++) {
        if (random_weight <= normalised_weights[i])
            return i;
    }

    return -1;
}

The more astute among you will have noticed that our new array, called normalised_weights is just keeping a running total of the weights we've added up... that's not really necessary is it? Right you are, we can save a bit of space by just keeping the total in the comparison loop. Now our function looks like this:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {
    float weights_total;
  
    // "normalise" the animation weights by summing them and adding the sums to a list
    for (int i = 0; i < num_animations; i++) {
        weights_total += animations_list[i].weight;
    }
  
    // if the list is unweighted, choose a random index
    if (weights_total == 0)
        return rand(num_animations);
  
    // otherwise, choose a random number beween 0 and weights_total, select that item's index and return it.
    float random_weight = frand() * weights_total;
    float running_total = 0;
    for (int i = 0; i < num_animations; i++) {
        running_total += animations_list[i].weight;
        if (random_weight <= running_total)
            return i;
    }

    return -1;
}

If you're even more on the ball, you'll have noticed I put "normalised" in inverted commas. 'Cos there's no actual normalisation going on here. Normalised weight values would mean the total weight always adds up to 1, and that's how a real programmer would do it. Either the weights would be normalised in the class constructor only once, or they'd be normalised in the data files themselves so that no CPU time need be expended on the task. So our function really ought to look like this:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {
  
    float random_weight = frand();
    float running_total = 0;
    for (int i = 0; i < num_animations; i++) {
        running_total += animations_list[i].weight;
        if (random_weight <= running_total)
            return i;
    }

    return -1;
}

There, wasn't that simpler?

You can tell this whole thing was written by people with no practical programming experience. It reminds me a lot of the code I used to write when I was a kid in BASIC, no real structure or reason to it.

Anyway, enough programming sperg. I must sleep.
 
In one tweet John Flynt claims to be the "Godzilla of tech feminism" and in another tweet proves he's a bumbling idiot that doesn't know shit about software engineering or video game development.

Teens figure out how to upload and give out free keys on steam every day, John. It should not be complicated for a college educated CEO/Engineer/Journalist/Feminist......
 
brote.jpg

https://twitter.com/alexapdos/status/773352893978185732
 
UPDATE: It's here! Enjoy it while it lasts, it's a full rip of all the game assets.
I don't really know what I'm looking at, but I know plenty of you were curious and wanted to poke around.
https://thepiratebay.org/torrent/15775756

EDIT: There might even be a way to play it from those files, I just don't know how. I'll leave that to the more savvy types.

EDIT The 2nd: My upload speed leaves a bit to be desired at times, but I'll be leaving the torrent up for a few days or so at the very least.
 
Last edited:
Looks like one of the Wu-niverse orbiters made some scathing forum post on Steam that accused people of downrating it because they hated Brianna. Jokes on them, since none of the reviews attacked Brianna or even mentioned she was trans

Pretty much exactly this, even the basic reviews by and large leave out the Wu-niverse altogether and simply point out that it's a terrible game. I mean seriously, I had the stream running in the background this evening while I cooked, and watched portions of it. This game is about on par with N-64 games, and the voice acting out of the N-64 games was levels better than this. That said, if there was a way to play this disaster for free, I wouldn't turn it down.
 
  • Feels
Reactions: JSGOTI
That said, if there was a way to play this disaster for free, I wouldn't turn it down.
Give it a few days, I'm sure someone smarter than me will tell us in no time if/how we can play the game from the files I posted.
 
  • Like
Reactions: Pocket_Sand!
Pretty much exactly this, even the basic reviews by and large leave out the Wu-niverse altogether and simply point out that it's a terrible game. I mean seriously, I had the stream running in the background this evening while I cooked, and watched portions of it. This game is about on par with N-64 games, and the voice acting out of the N-64 games was levels better than this. That said, if there was a way to play this disaster for free, I wouldn't turn it down.

Brianna can't even take full responsibility over the fact that she made a horrible, plagiarized mess instead blaming whoever comes to her mind first over this. I seriously doubt her mental state at this point.
 
Before I get some sleep, I thought I'd share a bit of programming 101 and what R60 can teach us about how not to write code.

I dug a bit in to R60's AI, if selecting a random move from a list can be called AI. Here's the core AI routine from the decompiled code:

Code:
function int ReturnRandomAnimationIndex()
{
    local int I, arrayLength, Index;
    local float weightsTotal, randomWeight;
    local array<float> NormalizedWeights;

    weightsTotal = 0.0;
    arrayLength = RandomAnimations.Length;
    // End:0x170
    if(arrayLength > 0)
    {
        I = 0;
        J0x3D:
        // End:0xB3 [Loop If]
        if(I < arrayLength)
        {
            weightsTotal = weightsTotal + RandomAnimations[I].AnimationChance;
            NormalizedWeights.AddItem(weightsTotal);
            ++ I;
            // [Loop Continue]
            goto J0x3D;
        }
        // End:0xE8
        if(weightsTotal == 0.0)
        {
            Index = Rand(arrayLength);
            return Index;
        }
        // End:0x16D
        else
        {
            randomWeight = FRand() * weightsTotal;
            I = 0;
            J0x10A:
            // End:0x16D [Loop If]
            if(I < arrayLength)
            {
                // End:0x15F
                if(randomWeight <= NormalizedWeights[I])
                {
                    Index = I;
                    return Index;
                }
                ++ I;
                // [Loop Continue]
                goto J0x10A;
            }
        }
    }
    // End:0x176
    else
    {
        return -1;
    }
    //return ReturnValue;
}

Now, that's a bit messy. So I'll rephrase it in C, with comments for the non-programmers inspired to follow along at home:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {
    float weights_total;
    float normalised_weights[num_animations];

    // "normalise" the animation weights by summing them and adding the sums to a list
    for (int i = 0; i < num_animations; i++) {
        weights_total += animations_list[i].weight;
        normalised_weights[i] = weights_total;
    }

    // if the list is unweighted, choose a random index
    if (weights_total == 0)
        return rand(num_animations);

    // otherwise, choose a random number beween 0 and weights_total, select that item's index and return it.
    float random_weight = frand() * weights_total;
    for (int i = 0; i < num_animations; i++) {
        if (random_weight <= normalised_weights[i])
            return i;
    }

    return -1;
}

The more astute among you will have noticed that our new array, called normalised_weights is just keeping a running total of the weights we've added up... that's not really necessary is it? Right you are, we can save a bit of space by just keeping the total in the comparison loop. Now our function looks like this:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {
    float weights_total;

    // "normalise" the animation weights by summing them and adding the sums to a list
    for (int i = 0; i < num_animations; i++) {
        weights_total += animations_list[i].weight;
    }

    // if the list is unweighted, choose a random index
    if (weights_total == 0)
        return rand(num_animations);

    // otherwise, choose a random number beween 0 and weights_total, select that item's index and return it.
    float random_weight = frand() * weights_total;
    float running_total = 0;
    for (int i = 0; i < num_animations; i++) {
        running_total += animations_list[i].weight;
        if (random_weight <= running_total)
            return i;
    }

    return -1;
}

If you're even more on the ball, you'll have noticed I put "normalised" in inverted commas. 'Cos there's no actual normalisation going on here. Normalised weight values would mean the total weight always adds up to 1, and that's how a real programmer would do it. Either the weights would be normalised in the class constructor only once, or they'd be normalised in the data files themselves so that no CPU time need be expended on the task. So our function really ought to look like this:

Code:
// returns a (weighted) random animation index
int random_animation_index(const animation_set* animations_list, int num_animations) {

    float random_weight = frand();
    float running_total = 0;
    for (int i = 0; i < num_animations; i++) {
        running_total += animations_list[i].weight;
        if (random_weight <= running_total)
            return i;
    }

    return -1;
}

There, wasn't that simpler?

You can tell this whole thing was written by people with no practical programming experience. It reminds me a lot of the code I used to write when I was a kid in BASIC, no real structure or reason to it.

Anyway, enough programming sperg. I must sleep.

God, quit mansplaining you oppressive cis-shitlord. I bet you even watch anime.

(Nah, you're good.)

In one tweet John Flynt claims to be the "Godzilla of tech feminism" and in another tweet proves he's a bumbling idiot that doesn't know shit about software engineering or video game development.

Teens figure out how to upload and give out free keys on steam every day, John. It should not be complicated for a college educated CEO/Engineer/Journalist/Feminist......

How difficult it is isn't even an issue for me. The simple fact that this was kickstarted two-plus years ago and she hadn't bothered to make arrangements to get the keys out until NOW when the fucking game is available to the public shows just how fucking inept, lazy, and self-serving she is.

Hope those Kickstarters enjoy their late-ass game, Brianna.
 
s

Enjoy it while it lasts, it's a full rip of THE FULL FUCKING GAME
https://thepiratebay.org/torrent/15775756

EDIT: HOLY FUCKING SHIT. There is ZERO DRM. I just launch it with UDK.exe and its the full fucking game.
Torrenting right now. If it finishes soon, I'll play it while ridiculously baked. *yawn**yawn**yawn*
 
Torrenting right now. If it finishes soon, I'll play it while ridiculously baked. *yawn**yawn**yawn*
Uhhhh.... no promises on that... I've got a dozen people grabbing it from me at the moment, so it might be a little slow since I'm the only seed at the moment that has the full file.
EDIT: I could be mistaken, three of them have over 40pct. I don't know how it distributes, so I don't know if they all have the same segments, or if it propagates intelligently and spreads the chunks out to get more connections able to pass it around.

So she didn't get the keys to the KS backers today? Damn
If nothing else, the KS backers could always just torrent it. Chances are that would finish faster than the email from Wu.
 
THE CONSPIRACY GOES ALL THE WAY UP FOKES
Of -course- it does... no surprise there

ALSO: Get your free copy of the game before its too late!
 
Looks like one of the Wu-niverse orbiters made some scathing forum post on Steam that accused people of downrating it because they hated Brianna. Jokes on them, since none of the reviews attacked Brianna or even mentioned she was trans.:story:

http://steamcommunity.com/app/350200/discussions/0/350540974007894236/

"Flynntellivision" awesome white knight

THE CONSPIRACY GOES ALL THE WAY UP FOKES

LsuVRnR.png

Funny how in ARK there is bitching with insults to the dev and is still there but this get a warning, i wonder how much john has to bitch, Funny thing is not deleted, Just locked because john has to admit that he is a troon to be deleted
 
Back