Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
New Yorp New Yorp
Jul 18, 2003

Only in Kenya.
Pillbug

Milotic posted:

Thank you for all the kind words. I found it surprisingly fun. There's a couple of problems with that solution, one of which being it is far too quick - you don't really get the excitement of waiting for the solution. We could throw in Thread.Sleeps, but that's far too predictable. We want people on the edge of their seats.

So I present: GeneticFizzBuzz, with a mutation chance of around 1 in 1 million.

(Why yes, I am on holiday)

You are a god of overcomplication. I'm stunned.

[edit] Although, I noticed you're not really taking advantage of the parallel task library on this one. I took the liberty of altering your code thusly:

code:
        public static FizzBuzzCandidateSolution Mate(FizzBuzzCandidateSolution mother, FizzBuzzCandidateSolution father)
        {
            var child = new FizzBuzzCandidateSolution();
            
            Parallel.ForEach(mother.Map.Keys, key =>
                                                  {
                                                      lock(child.Map)
                                                      {
                                                          child.Map.Add(key, MateValue(key, mother.Map[key], father.Map[key]));   
                                                      }
                                                  });

            return child;
        }
It seems to be working, although I'm not 100% sure it'll return the correct answer, since Dictionary isn't thread-safe as far as I know. It's certainly keeping my 8 CPU cores occupied

New Yorp New Yorp fucked around with this message at 00:33 on May 24, 2011

Adbot
ADBOT LOVES YOU

Milotic
Mar 4, 2009

9CL apologist
Slippery Tilde

Ithaqua posted:

You are a god of overcomplication. I'm stunned.

[edit] Although, I noticed you're not really taking advantage of the paralell task library on this one. I took the liberty of altering your code thusly:

code:
        public static FizzBuzzCandidateSolution Mate(FizzBuzzCandidateSolution mother, FizzBuzzCandidateSolution father)
        {
            var child = new FizzBuzzCandidateSolution();
            
            Parallel.ForEach(mother.Map.Keys, key =>
                                                  {
                                                      lock(child.Map)
                                                      {
                                                          child.Map.Add(key, MateValue(key, mother.Map[key], father.Map[key]));   
                                                      }
                                                  });

            return child;
        }
It seems to be working, although I'm not 100% sure it'll return the correct answer, since Dictionary isn't thread-safe as far as I know. It's certainly keeping my 8 CPU cores occupied

Ah yeah, that's nice. Now it's web-scale. As for being a god of overcomplication, it comes naturally. Up until Friday I was tech lead for the SharePoint platform in my country's central bank. So Enterprise, SharePoint AND Government. I have jury rigged far more hideously complex things than that in my time. Most of my maintenance guides start off apologising for the system.

Opinion Haver
Apr 9, 2007

Weechat has the best scripting interface ever. Instead of your scripting language's object model, you store string representations of pointers.

PDP-1
Oct 12, 2004

It's a beautiful day in the neighborhood.
You guys are overthinking this. FizzBuzz is just a simple state machine that loops between Fi, Bu, Zz, and number printing nodes as shown here.

PDP-1 fucked around with this message at 02:36 on May 24, 2011

Blotto Skorzany
Nov 7, 2008

He's a PSoC, loose and runnin'
came the whisper from each lip
And he's here to do some business with
the bad ADC on his chip
bad ADC on his chiiiiip
If you asked someone to implement fizzbuzz and they drew an fsm what would you do

Contra Duck
Nov 4, 2004

#1 DAD
I'd call them an ambulance.

Hammerite
Mar 9, 2007

And you don't remember what I said here, either, but it was pompous and stupid.
Jade Ear Joe

Contra Duck posted:

I'd call them an ambulance.

I'd call them a wally, but fair enough.

Roseo
Jun 1, 2000
Forum Veteran

qntm posted:

code:
print ["FizzBuzz", $_, $_, "Fizz", $_, "Buzz", "Fizz", $_, $_, "Fizz", "Buzz", $_, "Fizz", $_, $_ ]->[$_ % 15]."\n" for 0..99
I don't think I'm doing it right :shobon:

drat right. You should be using say.

Dessert Rose
May 17, 2004

awoken in control of a lucid deep dream...

Ithaqua posted:

Dictionary isn't thread-safe as far as I know. It's certainly keeping my 8 CPU cores occupied

Dictionary is thread-safe for multiple readers as long as no one is writing to it.

Of course since you have to write your own ReadOnlyDictionary class/wrapper to guarantee that no one is writing to it without a lock, I don't see how that's very useful information.

Zhentar
Sep 28, 2003

Brilliant Master Genius
But there's also ConcurrentDictionary, which is a thread-safe dictionary for reading and writing.

POKEMAN SAM
Jul 8, 2004

Zhentar posted:

But there's also ConcurrentDictionary, which is a thread-safe dictionary for reading and writing.

And reading from a ConcurrentDictionary is also lockless, which is pretty rad.

good jovi
Dec 11, 2000

'm pro-dickgirl, and I VOTE!

Pardot posted:

Since we're still talking about fizzbuzz, here is the best solution:

code:
  (0..99).map {|i| srand(46308667) if (i%15).zero?; ["FizzBuzz", "Buzz", i+1, "Fizz"][rand(4)]}
Find the seed in your language that causes the random number generator to output the sequence.

This is beautiful. I've had 4 cores pegged at 100% for almost an hour trying to find the seed in python. Not really the best use of my work time.

Fiend
Dec 2, 2001
The c# specification wishes to contribute!
code:
class @class
{
    public static void @static(bool @bool)
    {
        if (@bool)
        {
            System.Console.WriteLine("true");
        }
        else
        {
            System.Console.WriteLine("false");
        }
    }
}

Zombywuf
Mar 29, 2008

Fiend posted:

The c# specification wishes to contribute!
code:
class @class
{
    public static void @static(bool @bool)
    {
        if (@bool)
        {
            System.Console.WriteLine("true");
        }
        else
        {
            System.Console.WriteLine("false");
        }
    }
}

That code appears in the codebase at work where it is called BooleanFormatter and is about 10 namespaces in. The only difference is that the strings are parameterised. There is a non generic version just below it in the file, it looks like this:
code:
public static string FormatBoolean(bool b)
{
  return b ? "true" : "false";
}

GROVER CURES HOUSE
Aug 26, 2007

Go on...

quote:

#define in C++ deserves an entire essay on its own to explore its rich possibilities for obfuscation. Use lower case #define variables so they masquerade as ordinary variables. Never use parameters to your preprocessor functions. Do everything with global #defines. One of the most imaginative uses of the preprocessor I have heard of was requiring five passes through CPP before the code was ready to compile. Through clever use of defines and ifdefs, a master of obfuscation can make header files declare different things depending on how many times they are included. This becomes especially interesting when one header is included in another header. Here is a particularly devious example:
pre:
    #ifndef DONE

    #ifdef TWICE

    // put stuff here to declare 3rd time around
    void g(char* str);
    #define DONE

    #else // TWICE
    #ifdef ONCE

    // put stuff here to declare 2nd time around
    void g(void* str);
    #define TWICE

    #else // ONCE

    // put stuff here to declare 1st time around
    void g(std::string str);
    #define ONCE

    #endif // ONCE
    #endif // TWICE
    #endif // DONE 
This one gets fun when passing g() a char*, because a different version of g() will be called depending on how many times the header was included.

I... I must use this. :suspense:

Winkle-Daddy
Mar 10, 2007
Arg, working with a co-worker on a php project...I see he has a bunch of echo getAcctID($acctID); in his code, so I decided to see what the gently caress, and this is what I find:

header.php

code:
if(isset($_GET['acctID']))
{
    $acctID = $_GET['acctID'];
}
functions.php
code:
function getAcctID($acctID)
{
    $theID = new databaseQueries();
    $rc = $theID->getAcctID($acctID);
    return $rc;
}
class.db.queries.php
code:
public function getAcctID($acctID)
{
    $query = "SELECT acctID FROM accounts WHERE acctID = '$acctID';
    $this->_getID = mysql_query($query);
    $acctID = mysql_fetch_assoc($this->_getID);
    return $acctID;
}
What the holy loving gently caress?

You seriously wasted an hour of my time figuring out what you were doing because you set a variable, then three includes later determined it WAS that variable? I would understand IF it actually did something when it returned no value...

Zombywuf
Mar 29, 2008

Broken Knees Club posted:

I... I must use this. :suspense:

You know about this http://www.boost.org/doc/libs/1_46_1/libs/preprocessor/doc/ right?

NotShadowStar
Sep 20, 2000

Winkle-Daddy posted:

Arg, working with a co-worker on a php project...I see he has a bunch of echo getAcctID($acctID); in his code, so I decided to see what the gently caress, and this is what I find:

header.php

code:
if(isset($_GET['acctID']))
{
    $acctID = $_GET['acctID'];
}
functions.php
code:
function getAcctID($acctID)
{
    $theID = new databaseQueries();
    $rc = $theID->getAcctID($acctID);
    return $rc;
}
class.db.queries.php
code:
public function getAcctID($acctID)
{
    $query = "SELECT acctID FROM accounts WHERE acctID = '$acctID';
    $this->_getID = mysql_query($query);
    $acctID = mysql_fetch_assoc($this->_getID);
    return $acctID;
}
What the holy loving gently caress?

You seriously wasted an hour of my time figuring out what you were doing because you set a variable, then three includes later determined it WAS that variable? I would understand IF it actually did something when it returned no value...

http://website.sucks/index.php?acctID=--(DROP%20TABLE%20accounts)

Winkle-Daddy
Mar 10, 2007

NotShadowStar posted:

http://website.sucks/index.php?acctID=--(DROP%20TABLE%20accounts)

Thankfully SQL injection doesn't actually work where I work. Our input validation that's built into PHP/Apache is a blessing and a curse a lot of the time though... (there are probably some more coding horrors I can dig up related to our input validation).

e: VVV I'd love to get into our badass validation, but I think it would potentially put my job at risk :( Any other Yahoo! employees out there know what I'm bitching about though.

Winkle-Daddy fucked around with this message at 02:13 on May 26, 2011

Thel
Apr 28, 2010

Winkle-Daddy posted:

Thankfully SQL injection doesn't actually work where I work. Our input validation that's built into PHP/Apache is a blessing and a curse a lot of the time though... (there are probably some more coding horrors I can dig up related to our input validation).

Anything short of prepared statements is probably vulnerable to some form of SQL injection, it's just how much effort you want to put in to get past the validation.

To contribute, here's something I myself wrote last week. :stare:

code:
//add files as attachments.
/* TODO: Fix this mess so it doesn't suck.
 * It should work though. 
 */

foreach (GroupMemberData GMD in GroupMemberList) {
  if (String.Equals(GMD.Group, Group.Name)) {
    foreach (PeopleData PD in PeopleList) {
      if (String.Equals(GMD.Name, PD.Name)) {
        EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ClientFilename));
        EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ContactFilename));
      }
    }
  }
}
Who needs LINQ, EF or useful variable names. :smugbert:

e: 6 different groups, GroupMemberList is a list with about 50 items, PeopleList is around 80 people.

Thel fucked around with this message at 21:49 on May 25, 2011

POKEMAN SAM
Jul 8, 2004

Thel posted:

Anything short of prepared statements is probably vulnerable to some form of SQL injection, it's just how much effort you want to put in to get past the validation.

To contribute, here's something I myself wrote last week. :stare:

code:
//add files as attachments.
/* TODO: Fix this mess so it doesn't suck.
 * It should work though. 
 */

foreach (GroupMemberData GMD in GroupMemberList) {
  if (String.Equals(GMD.Group, Group.Name)) {
    foreach (PeopleData PD in PeopleList) {
      if (String.Equals(GMD.Name, PD.Name)) {
        EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ClientFilename));
        EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ContactFilename));
      }
    }
  }
}
Who needs LINQ, EF or useful variable names. :smugbert:

e: 6 different groups, GroupMemberList is a list with about 50 items, PeopleList is around 80 people.

The real horror is the useless scope-creation/indenting :smug:

code:
foreach (GroupMemberData GMD in GroupMemberList) {
  if (!String.Equals(GMD.Group, Group.Name))
    continue;
  
  foreach (PeopleData PD in PeopleList) {
    if (!String.Equals(GMD.Name, PD.Name))
      continue;
  
    EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ClientFilename));
    EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ContactFilename));
  }
}

Malloc Voidstar
May 7, 2007

Fuck the cowboys. Unf. Fuck em hard.
Terraria is a horror. It's somewhat similar to Minecraft, but with much more of an emphasis on "action RPG" vs "building poo poo." Also its code is worse.

The Item object is a great example of its problems. Every Item instance has 61 instance variables, defining: its owner (by player number, 0-7), whether it is wet, how wet it is, if that wetness is from lava, position, velocity, width & height, whether it is active, whether it is currently being grabbed, its spawn time, whether it is worn as armor, how long you've owned it, how long you've kept it, its type, name, style of being held, style of being used, whether it is an accessory (armor), its animation integer ID, use speed, current stack, max stack, its pick power, its axe power, its hammer power, how much damage it does, its knockback power, how much life it heals, how much mana it restores, whether it is a potion, " " " consumable, " " " auto-reusable (hold mouse to use), its color, alpha value, the ID of its use sound, defense value, tooltip string, rarity, the int ID of the projectile it shoots, how fast it shoots, the int ID of its ammo type, how much ammo it uses, life regen speed, mana regen speed, mana use, whether it does not have a use graphic, whether it can't be used to melee with, and a few other values I either couldn't figure out or didn't type.

Items range from weapons to potions to armor, yet they all have all of those defined. All the items are defined in one method that is ~3500 lines long. Adding a new explosive item requires adding code in ten locations in three classes. Said new explosive item will work in vanilla servers because they do no validation on client data whatsoever; in fact, clients can pretty much tell servers to delete every block in the world.

The class that generates worlds decompiles (from CIL/C#) to ~15,000 lines (750KB). Most of the game's control flow is done using for-loops and nested if-else blocks. Its main class has more than 300 public class/instance variables. Their order in the code is important; if they're sorted alphabetically (Reflector does this) the game will fail due to hitting nulls/going out of bounds of arrays.

Also, items are stored in/loaded from character and world files using only their name string.

Worth the :10bux: on Steam but man is its code horrifying to me.

quiggy
Aug 7, 2010

[in Russian] Oof.


Aleksei Vasiliev posted:

The Item object is a great example of its problems. Every Item instance has 61 instance variables, defining: its owner (by player number, 0-7), whether it is wet, how wet it is, if that wetness is from lava, position, velocity, width & height, whether it is active, whether it is currently being grabbed, its spawn time, whether it is worn as armor, how long you've owned it, how long you've kept it, its type, name, style of being held, style of being used, whether it is an accessory (armor), its animation integer ID, use speed, current stack, max stack, its pick power, its axe power, its hammer power, how much damage it does, its knockback power, how much life it heals, how much mana it restores, whether it is a potion, " " " consumable, " " " auto-reusable (hold mouse to use), its color, alpha value, the ID of its use sound, defense value, tooltip string, rarity, the int ID of the projectile it shoots, how fast it shoots, the int ID of its ammo type, how much ammo it uses, life regen speed, mana regen speed, mana use, whether it does not have a use graphic, whether it can't be used to melee with, and a few other values I either couldn't figure out or didn't type.

:stare:

Terraria's written in C#, right? How can someone write a better game than I ever could and still not know what object-oriented programming is?

Deep Dish Fuckfest
Sep 6, 2006

Advanced
Computer Touching


Toilet Rascal
Someday I hope we'll get to crack open Dwarf Fortress and get something even worse. I imagine it will be like opening the Ark of the Covenant.

pseudorandom name
May 6, 2007

The NetHack source code is available right now.

Thel
Apr 28, 2010

Ugg boots posted:

The real horror is the useless scope-creation/indenting :smug:


I can make it even worse than the original. :v:

code:
foreach (GroupMemberData GMD in GroupMemberList) {
  foreach (PeopleData PD in PeopleList) {
    if (String.Equals(GMD.Group, Group.Name) && String.Equals(GMD.Name, PD.Name)) {
      EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ClientFilename));
      EmailGroup.Attachments.Add(new System.Net.Mail.Attachment(PD.ContactFilename));
    }
  }
}

Doc Hawkins
Jun 15, 2010

Dashing? But I'm not even moving!


quiggy posted:

:stare:

Terraria's written in C#, right? How can someone write a better game than I ever could and still not know what object-oriented programming is?

More evidence that coding isn't shipping, and that :10bux:s are for shippers.

TOO SCSI FOR MY CAT
Oct 12, 2008

this is what happens when you take UI design away from engineers and give it to a bunch of hipster art student "designers"

Doc Hawkins posted:

More evidence that coding isn't shipping, and that :10bux:s are for shippers.
I've written plenty of Python×Haskell, gimme my :10bux:

GROVER CURES HOUSE
Aug 26, 2007

Go on...

Aleksei Vasiliev posted:

Terraria is a horror. It's somewhat similar to Minecraft, but with much more of an emphasis on "action RPG" vs "building poo poo." Also its code is worse.

The Item object is a great example of its problems. Every Item instance has 61 instance variables, defining: its owner (by player number, 0-7), whether it is wet, how wet it is, if that wetness is from lava, position, velocity, width & height, whether it is active, whether it is currently being grabbed, its spawn time, whether it is worn as armor, how long you've owned it, how long you've kept it, its type, name, style of being held, style of being used, whether it is an accessory (armor), its animation integer ID, use speed, current stack, max stack, its pick power, its axe power, its hammer power, how much damage it does, its knockback power, how much life it heals, how much mana it restores, whether it is a potion, " " " consumable, " " " auto-reusable (hold mouse to use), its color, alpha value, the ID of its use sound, defense value, tooltip string, rarity, the int ID of the projectile it shoots, how fast it shoots, the int ID of its ammo type, how much ammo it uses, life regen speed, mana regen speed, mana use, whether it does not have a use graphic, whether it can't be used to melee with, and a few other values I either couldn't figure out or didn't type.

Items range from weapons to potions to armor, yet they all have all of those defined. All the items are defined in one method that is ~3500 lines long. Adding a new explosive item requires adding code in ten locations in three classes. Said new explosive item will work in vanilla servers because they do no validation on client data whatsoever; in fact, clients can pretty much tell servers to delete every block in the world.

The class that generates worlds decompiles (from CIL/C#) to ~15,000 lines (750KB). Most of the game's control flow is done using for-loops and nested if-else blocks. Its main class has more than 300 public class/instance variables. Their order in the code is important; if they're sorted alphabetically (Reflector does this) the game will fail due to hitting nulls/going out of bounds of arrays.

Also, items are stored in/loaded from character and world files using only their name string.

Worth the :10bux: on Steam but man is its code horrifying to me.

What are the chances that Reflector is choking on obfuscated code? I have no idea how anyone could ever wrangle such a codebase.

PalmTreeFun
Apr 25, 2010

*toot*

Aleksei Vasiliev posted:

Terraria is a horror. It's somewhat similar to Minecraft, but with much more of an emphasis on "action RPG" vs "building poo poo." Also its code is worse.

The Item object is a great example of its problems. Every Item instance has 61 instance variables, defining: its owner (by player number, 0-7), whether it is wet, how wet it is, if that wetness is from lava, position, velocity, width & height, whether it is active, whether it is currently being grabbed, its spawn time, whether it is worn as armor, how long you've owned it, how long you've kept it, its type, name, style of being held, style of being used, whether it is an accessory (armor), its animation integer ID, use speed, current stack, max stack, its pick power, its axe power, its hammer power, how much damage it does, its knockback power, how much life it heals, how much mana it restores, whether it is a potion, " " " consumable, " " " auto-reusable (hold mouse to use), its color, alpha value, the ID of its use sound, defense value, tooltip string, rarity, the int ID of the projectile it shoots, how fast it shoots, the int ID of its ammo type, how much ammo it uses, life regen speed, mana regen speed, mana use, whether it does not have a use graphic, whether it can't be used to melee with, and a few other values I either couldn't figure out or didn't type.

Items range from weapons to potions to armor, yet they all have all of those defined. All the items are defined in one method that is ~3500 lines long. Adding a new explosive item requires adding code in ten locations in three classes. Said new explosive item will work in vanilla servers because they do no validation on client data whatsoever; in fact, clients can pretty much tell servers to delete every block in the world.

The class that generates worlds decompiles (from CIL/C#) to ~15,000 lines (750KB). Most of the game's control flow is done using for-loops and nested if-else blocks. Its main class has more than 300 public class/instance variables. Their order in the code is important; if they're sorted alphabetically (Reflector does this) the game will fail due to hitting nulls/going out of bounds of arrays.

Also, items are stored in/loaded from character and world files using only their name string.

Worth the :10bux: on Steam but man is its code horrifying to me.

:stare:

Stand aside Minecraft, we will show you the true meaning of bad code!

gibbed
Apr 10, 2006

Broken Knees Club posted:

What are the chances that Reflector is choking on obfuscated code? I have no idea how anyone could ever wrangle such a codebase.
It's not obfuscated.

GROVER CURES HOUSE
Aug 26, 2007

Go on...

gibbed posted:

It's not obfuscated.

Manual obfuscation is an honorable trade, you classist. :colbert:

Zombywuf
Mar 29, 2008

Could it just be heavily inlined?

gibbed
Apr 10, 2006

That wouldn't influence the obscene classes Terraria has though.

gibbed fucked around with this message at 09:26 on May 26, 2011

dwazegek
Feb 11, 2005

WE CAN USE THIS :byodood:

Aleksei Vasiliev posted:

Its main class has more than 300 public class/instance variables. Their order in the code is important; if they're sorted alphabetically (Reflector does this) the game will fail due to hitting nulls/going out of bounds of arrays.

How the gently caress do you even accomplish this?

zeekner
Jul 14, 2007

dwazegek posted:

How the gently caress do you even accomplish this?

I could only imagine some variables refer to previous variables, and rely on the specific initialization order.

int ONE = 1;
int TWO = ONE+ONE;
ect.

zeekner fucked around with this message at 09:48 on May 26, 2011

Wheany
Mar 17, 2006

Spinyahahahahahahahahahahahaha!

Doctor Rope
God drat I'm starting to hate Javascript.

Firebug and other development tools have made it easy to set breakpoints and that just makes things too drat easy.

function renderPoopCheckBox()

Hmm, how do we get here, I can't find a reference to this function anywhere.

Lets go up the call stack:

code:
var action = getAction.call(this, func_name, classes[i]);
if(action) {
	el = action.call(this);
:sigh:, okay, so what does getAction look like...

code:
function getAction(f_name, c_name){
[...]
	var action = f_name + c_name;
	action = eval(action);
		if(action && $type(action) == 'function') 
		return action;
[...]	
}
Okay, so the func_name is clearly "renderPoop", but where does that "CheckBox" part come from, that is a weird spelling...

There is no CheckBox in any file, but there is a mention of a "CheckBoxParent".

So I try searching for '\bParent\b':
    var reg = /Parent/;
:(

And a few lines later...
cl.replace(reg, "");

By the way, this is part of the code that generates that 30 element deep DOM tree that I complained about earlier.

If you teach people that Go To statement is considered harmful, they will invent a better goto.

Zombywuf
Mar 29, 2008

Wheany posted:

If you teach people that Go To statement is considered harmful, they will invent a better goto.

I think in this case they were trying to get Javascript to do virtual method calls like "real" OO.

dwazegek
Feb 11, 2005

WE CAN USE THIS :byodood:

Geekner posted:

I could only imagine some variables refer to previous variables, and rely on the specific initialization order.

int ONE = 1;
int TWO = ONE+ONE;
ect.

Wouldn't compile though, you can't reference the current instance during initialization.

Although you can do it with static members. I thought he was referring specifically to instance members, but I must've misread.

Adbot
ADBOT LOVES YOU

Mustach
Mar 2, 2003

In this long line, there's been some real strange genes. You've got 'em all, with some extras thrown in.

quiggy posted:

:stare:

Terraria's written in C#, right? How can someone write a better game than I ever could and still not know what object-oriented programming is?
http://prog21.dadgum.com/87.html

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply