public static Creature fromJSONObject(JSONObject json)
    {
        int           creatureId   = (int)json.GetField("creatureId").n;
        string        creatureName = json.GetField("creatureName").str;
        CreatureStats baseStats    = CreatureStats.fromJSONObject(json.GetField("baseStats"));
        //TODO deserialize Abilities
        Ability        ability = null;
        HashSet <Move> moves   = new HashSet <Move>();

        foreach (JSONObject moveName in json.GetField("moves").list)
        {
            string n = moveName.str;
            moves.Add(MoveLibrary.get(n));
        }
        FocalPoints         focalPoints    = FocalPoints.fromJSONObject(json.GetField("focalPoints"));
        CreatureForm        baseForm       = CreatureForm.fromJSONObject(json.GetField("baseForm"));
        List <CreatureForm> availableForms = new List <CreatureForm>();

        foreach (JSONObject formJSON in json.GetField("availableForms").list)
        {
            CreatureForm creatureForm = CreatureForm.fromJSONObject(formJSON);
            availableForms.Add(CreatureForm.fromJSONObject(formJSON));
        }
        Creature result = new Creature(creatureId, creatureName, moves, focalPoints, ability, baseStats, baseForm, availableForms);

        return(result);
    }
        public void testCreatureFormDeserialization()
        {
            string form1 = "{"
                           + "\"creatureTypes\":[\"Flame\"],"
                           + "\"statMods\":{"
                           + "\"STR\":[5, 1],"
                           + "\"ARM\":[0, 2],"
                           + "\"SPD\":[-40, .85] "
                           + "},"
                           + "\"moveId\":null,"
                           + "\"abilityId\":1,"
                           + "\"revealAction\":null"
                           + "}";

            CreatureForm result = CreatureForm.fromJSONObject(JSONObject.Create(form1));

            List <Pair <StatName, StatModifier> > expectedMods = new List <Pair <StatName, StatModifier> >();

            expectedMods.Add(new Pair <StatName, StatModifier>(StatName.STR, new StatModifier(5, 1)));
            expectedMods.Add(new Pair <StatName, StatModifier>(StatName.ARM, new StatModifier(0, 2)));
            expectedMods.Add(new Pair <StatName, StatModifier>(StatName.SPD, new StatModifier(-40, .85)));

            HashSet <CreatureType> creatureTypes = new HashSet <CreatureType>();

            creatureTypes.Add(CreatureType.creatureTypesByName["Flame"]);

            CreatureForm expected = new CreatureForm(creatureTypes, expectedMods, null, null, null);
            CreatureForm actual   = CreatureForm.fromJSONObject(JSONObject.Create(form1));

            Assert.That(expected.Equals(actual));
        }