I was refraining from hunting up more specific examples, but you leave me no choice
http://forums.sinsofasolarempire.com/172889
"You only get 1 serial number per copy of the game. We've made it so that if you're running a home LAN that your serial can spawn a second instance of the game, but it won't work for Internet play."
Gotcha, that's very interesting -- I've never seen anything like that before.
Those guys are very progressive over there at Stardock. But they seem to mostly be using that as a hook to get the secondary player to want to go online to play (since their servers have the limitation). We don't have any such hook, so we'd just be giving away 50% of our products for free. Maybe if we were the size of Stardock we could do that, but right now we need all the player support we can get if we are going to make a go of it. I don't think it's too much to ask that people actually buy the game that they play, given the amount of work that went into it, the low cost, and the high replay value and ongoing free content.
If everybody decides to pirate the game, or just avoid purchasing it by playing off a friend's serial, then this isn't a viable business. I won't be able to keep it up for more than a year, and then I'll have to just do something else where people value the things I produce. I'm not trying to be a smartass there, it's just the reality of the situation. Arcen Games has no money except what I pull out of my own back pocket, or what players decide is worth spending on our products. Same as with any other indie developer (that's the nature of being indie).
If I'm ever rich and famous off all the player support, I'll probably treat that issue differently -- it's good to give back to the community that builds you up. Right now the way I can do that is with ongoing free DLC for the players who decide to buy the game, as well as with really listening to and integrating their feedback so that everyone gets the game they really want. Those are the tools I have, and so that's what I'm using; 50% discounts is not a valid tool for me at the present time.
More specifically from that thread, someone asked about Hamachi and the rep said *that* would not be ok. Enforceable? Not so much, but the point was that they were ok with 2 players using the same serial on a true LAN and not ok with a VPN-LAN like Hamachi.
None of this, of course, has any direct impact on how you choose to license your games, I just wanted to point out that there is precedent. An older precendent would be some of Blizzard's titles like Starcraft where you could have two extra people playing "spawned" in the same game on one paid copy. So 1 paid copy = max of 3 players in the game, 2 paid copies = max of 6. A paid copy had to host.
Ah, I see -- that must be part of where the idea of multiple people playing on one copy came from. Starcraft is so incredibly popular, but that was one I never played (I went from Warcraft II into the AoE franchise). So there definitely is precedent then, I thank you for letting me know -- I had no idea anyone was doing that, it's certainly not common with the EULAs I have read for the games I play. But, there are so many games out there.
Did these practices help the sales of Starcraft and/or SoaSE? I'm not competent to answer that question, but I wouldn't be surprised if there was some marginal gain both from people "converted" by friends with paid copies and from people who are much more likely to buy a game if they can play it with their family but aren't necessarily willing to pay double for that ability (e.g. me).
Sure, word of mouth is incredibly important. I'm really hoping for good word of mouth with AI War (so far so good), and that's why I put so much content into the demo with regard to being able to try out almost all the features. The main thing, for me personally anyway, is that's it's sort of apples and oranges with Starcraft and any indie game. Blizzard already had so much money from past efforts that they could afford to experiment, and they also had the benefit of a huge amount of marketing and promotion. They can absorb losses, not that I'm suggesting they necessarily should have to -- but they have the ability to choose to do so.
I don't mean to get fired up, hopefully none of that came across too strongly, but it's a very tough situation for an independent developer. I'm really happy with the way AI War turned out, and player reception has been awesome and sales are consistent, which is great, but we've not yet hit the point where there is enough exposure to the game to cover the cost of developing AI War, let alone anything new. We're busily working away on AI War and other projects though, trusting that since it's a legitimately good game people will play the demo, buy a license if they want it, and help us spread the word if they like it that much.
It's kind of a simple business model. We don't gouge people with ongoing costs, we don't have advertising on the website or in the game, and we don't try to "monetize" all the DLC and nickle-and-dime our existing customers. We'll live or die by people playing the demo, or playing a friend's copy I suppose, and choosing (or not) to buy the game for themselves.
As of a couple of days ago the game is already up on the pirate bay and isohunt, so clearly there are a number of people who like it well enough to steal it but not enough to buy it. There's no way to stop those people, and I don't want to hurt real customers by trying to. Hence the lack of DRM, low price, etc. We probably could have sold the game for $30, and it's still a bargain compared to the $60 games out there. But I didn't want to do that, because I felt like it would hurt the social aspect of being able to play the game with friends and family.
If I doubled the price but said that every copy could be used for two players, then I'm just gouging the people who only buy it for their own personal use -- they are then paying double for no extra benefit. I figured the simplest, fairest way to handle it was just to license it per active user. If you have five people that all play your game with one license, that's fine with me and not against our EULA, just so long as they don't all do it at once.
Anyway, sorry to beat the horse, I'm pretty sure it died in the middle somewhere.
Yeah, that's okay, you set me back on my horse too, and I think it also died. But I'm glad you brought up the examples you did, because those were new to me and that's good information for me to have. And you raise some excellent points -- with future games, if things are taking off, I might do things differently. This was a good conversation to have. (And if there's more, let me have it.)
I think we feel very similar about C++. It's a cool language, with preposterous amounts of power, but it just doesn't feel right. I think a key thing is having to manage memory addresses, just doesn't sit well with me having to treat "normal" and pointer variables so differently. I much prefer Java/C#'s way of handling value and reference types, there's a distinction but it doesn't require significantly different syntax. Then there's the actual memory management but that's another topic...
Yep -- and, when need be, you can manage pointers and memory very directly in C#. Especially for stuff like dynamic in-memory file handling, things like MemoryStream or even just byte arrays are awesome. I think that in some of the base .NET classes the IDisposable interface is used to excess, but that's just because of all the underlying native/COM code that is behind the scenes there. When working with databases, for example, I tend to prefer to write my own version of the DataSet class, populate it, and then sever the connection immediately. That way my later code doesn't have to remember to dispose the custom dataset, and if there is an unhandled exception there's not a risk of a connection hanging open or something. Except in a few cases of limited usage, I feel kind of the same way about IDisposable that I do about C++ memory management: it's a little to easy to shoot yourself in the foot with that.
Speaking of memory management, you might find this an interesting tip on working with the garbage collector in a game in C#: reuse your objects as much as you can, to prevent a garbage collection hiccup in gameplay every ~2 minutes or so. That was something I learned with AI War in particular just because of the massive number of objects and often temporary objects (shots, explosions, etc) that are constantly cropping up and then being discarded. At first the garbage collector was a periodic problem, but by using hashtables to keep a store of "available" shots and explosions, I can recycle those memory objects and thus never trigger the garbage collector (at least not on that scale so that it causes lag, anyway). I thought that was kind of an interesting discovery, and is part of what I mean when I say that optimization is a bit different in C# than in C++. Seems like your average C++ programmer never thinks of that, they just throw up their hands in disgust at the gc, then go back to their preferred programming language. Their prerogative, I guess; I do basically the same thing with their language.
Out of curiosity, did your attitude about C++ take shape before or after the bulk of your ERP type experience? I'm a web/database programmer myself and write budget systems and whatnot, and I think it's really molded me into craving languages that let me worry about data models, business logic, and more conceptual stuff without bothering much about the particulars of memory and whatnot.
Hmm, I guess it was all kind of simultaneous. As a kid, the only real language I worked in was QBASIC, but I never really liked that. All the explicit line numbers (if you've seen what I'm talking about) seemed really brittle to me. Then I was just an HTML/Javascript scripter for a long time, until in college I got into Java and 8086 ASM, which I really liked except for the strangeness of some of the window and display classes in Java. And it bugged me how noticeably slow Java was. When I first saw C# it was basically introduced to me as just the "Microsoft's version of Java," and for a while that's all I saw it as. A lot of Microsoft's ASP.NET classes are not the fastest, so I saw little practical difference. I guess it was when I started getting into higher-performance stuff and optimizations that I really found the power there, and then when I tried to get more into C++ it was like "why would I do this when there's already something easier with basically this same power?" If I had had more experience with C++ first, my attitude might have been different.
I wrote some scanner software at once point in C#, interfacing with TWAIN drivers with p/invoke. That was a real eye opener for me, too, and really helped cement the idea that the language/platform could do basically anything. I guess I do gravitate to languages that are expressive and straightforward, but which have a lot of depth -- TSQL, Javascript, Actionscript, and C# are really my favorites. I also like PHP pretty well, but Ruby on Rails never did it for me because I felt like it was guiding me too much and not giving me the freedom to do what I really wanted. That was sure a long-winded answer to your question! Anyway, I think we are pretty much thinking along the same lines there, anyway.
If you ever want to shoot the breeze about game programming design or methods, let me know!
Chris