I am trying to write a simple role playing game in C# to become more familiar with the language.
I have a class that loads data from CSV file, creates an object, and
If you stick to your current design (CSV + dictionary) you could use the ExpandoObject class to get what you are looking for, create a simple factory class:
public static class ObjectFactory
{
public static dynamic CreateInstance(Dictionary<string, string> objectFromFile)
{
dynamic instance = new ExpandoObject();
var instanceDict = (IDictionary<string, object>)instance;
foreach (var pair in objectFromFile)
{
instanceDict.Add(pair.Key, pair.Value);
}
return instance;
}
}
This factory will create an object instance of whatever dictionary you give it, i.e. just one method to create all your different kinds of objects. Use it like this:
// Simulating load of dictionary from file
var actorFromFile = new Dictionary<string, string>();
actorFromFile.Add("Id", "1");
actorFromFile.Add("Age", "37");
actorFromFile.Add("Name", "Angelina Jolie");
// Instantiate dynamically
dynamic actor = ObjectFactory.CreateInstance(actorFromFile);
// Test using properties
Console.WriteLine("Actor.Id = " + actor.Id +
" Name = " + actor.Name +
" Age = " + actor.Age);
Console.ReadLine();
Hopes this helps. (And yes she was born 1975)
Derive from DynamicObject and override TryGetMember
so that it returns the appropriate dictionary entry. Exactly what Microsoft did in MVC 3's ViewBag.
Example usage (if your derived type was named CsvBag
):
dynamic bag = new CsvBag(csvFileStream);
_monitor.Monster.LookUp(*bag.Id*).Attack(player); // whatever..
You need to read up on serialization - instead of holding the files in CSV files, you can store them in a serialized format and load them directly into the wanted type.
You will only need a couple of methods to serialize and deserialize.
I suggest reading up on:
The above links are to different serializers (and I have certainly left some off - anyone in the know, if there is a good serializer that you know, please add) - read through, see their APIs, play around with them and see their on-disk formats and make your decision.
Why not create a manager object responsible for reading data and returning instances of specified objects? Something like:
var actors = ActorsLoader.Load("actors.cvs");
where ActorsLoader.Load could be implemented as:
IEnumerable<Actor> Load( string fileName )
{
//1. reading each line (each line = new actor) & creating actor object
//2. adding created actor object to a collection
//3. returning back a collection
}
I have assumed that each type of in-game objects are stored in separate files (so that you have: actors.csv, items.csv, skills.csv etc.)