Rapid Prototyping Tip: Defining data as code files
Comments
If anyone is interested in rapidly utilizing this and more with Unity, I have created a tool to save you much time: https://www.assetstore.unity3d.com/en/#!/content/49521
I came to the same conclusion not to long ago. I was planning to make a lot of things datadriven for my RPG, including things such as NPCs, items, player classes along with their skill and stats progression tables etc, but in the end I came to the conclusion: Why design a new syntax and write a parser for it when I can just as easily use my language of choice - C# to define such things... It's not like I'm gonna be working with a team of non-coders any time soon anyway since I'm just myself.
I believe that if things are properly separated, even for games that expect to grow up exponentially, data-in-code can be good deal, as it follows KISS and YAGNI. Overall, you can do small refactors and incrementally build a parser as needed. Of course, you'd lose time refactoring, but earn time in actually coding only the features you need (if ever). So, maybe, it might be a good way to go most of the times, as long as you don't already own/know a parser (which then you can just use it)
I believe that if things are properly separated, even for games that expect to grow up exponentially, data-in-code can be good deal, as it follows KISS and YAGNI. Overall, you can do small refactors and incrementally build a parser as needed. Of course, you'd lose time refactoring, but earn time in actually coding only the features you need (if ever). So, maybe, it might be a good way to go most of the times, as long as you don't already own/know a parser (which then you can just use it)
Good points about separation - Data Definition code files / classes should plug in to the rest of the game code the same way you would have otherwise plugged in file loading/parsing classes.
Oh yea excellent point, a little abstraction layer is especially effective with this approach. In the game described, I never reference the newspapers directly via the array defined in code, instead I had a NewspaperMan(ager) class that abstracted it via simple functions like GetNewspapersForDayX() or ApproveOrBanNewspaper(). I could then completely refactor how I store the data without teaching any of the other code.
This post seems like a no brainer to me? If you're trying to write lots of parsers and tools for a very small project you need to quickly iterate on and don't have a lot of time to work on, you're overengineering and have a problem. Cut through the bullshit, and work on what needs to get done instead of wasting your time on things that don't have to be done with the time you have. It's a personal problem, through lack of good organization and time management. I have that problem with my personal stuff.
But also because of that, this approach isn't useful to anyone in the work world where you do need to develop tools and provide good support for a project. I was hoping to get something useful out of this post to apply to the real world.
>> It's barely a little bit of extra syntax fluff,
>> Yes, it does require more syntax fluff,
the extra keystrokes for coding is nothing compared to the extra keystrokes for implementing a data driven solution with parser, data files etc.
this makes non-data driven a very powerful tool for increasing productivity - but one which is most useful to solo devs, and not really an option for non-coders or large teams.
i use mostly non-data driven in Caveman 3.0. i can compile 150,000+ lines of c++ in 1 second, and link a 2+ meg executable in about 10 seconds. its only about 20 seconds + edit time to save, quit, make a change, recompile, restart the game, and load back up where i was to test the change.
to avoid writing parsers for data driven stuff, i have a generic data driven file format and API. the files are text files, with one data value per line. read / write order implicitly defines what var goes with what value - so you don't have to map key,value pairs to variables - like with a generic json read. The API provides routines for reading ints, floats, and strings. any line that begins with a "/" is a comment, and is skipped by the read routines. this lets you embed comments in the data file to help identify what the values are - since there are no explicit keys. this single format and 3 routine API can be used for just about anything, from lists of assets to load, to data driven entity definitions. and its less work than a json type approach, while still giving you data driven capabilities.
non-data driven is not just for prototyping. what matters most is what is most productive for your situation.
with short build times, one or just a few coders, and no non-coders, that can often be non-data driven, as opposed to data driven.
When you're trying to churn out a game fast, it might make more sense to define your items, texts or conversation in code files. Here's how to do it, an example from my current project.
Wish I read this before I wrote my own parser.