/**
 * 职业角色对象。
 * @create   2004-09-29 source0
 * @author   source0 source0@hotmail.com
 * @copyright 版权所有（C） 2004  source0
 *                这一程序是自由软件，你可以遵照自由软件基金会出版的GNU通用
 *            公共许可证条款来修改和重新发布这一程序。或者用许可证的第二版，
 *            或者（根据你的选择）用任何更新的版本。
 *                发布这一程序的目的是希望它有用，但没有任何担保。甚至没有
 *            适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证。
 *                你应该已经和程序一起收到一份GNU通用公共许可证的副本。如果
 *            还没有，写信给：
 *                The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
 *                MA02139, USA
 */

/**
 * 职业角色对象。
 * @param id 职业角色的ID。
 * @param name 职业角色的名称。
 * @param talentClasses CTalentClass数组。职业角色的天赋系数组。
 * @create source0
 */
function CRole(id, name, talentClasses){
    this.id = id;
    this.name = name;
    this.talentClasses = talentClasses;

    /**
     * 重置。
     * @create 2004-10-31 source0
     */
    this.reset = function()
    {
        for ( var key in this.talentClasses ){
            this.talentClasses[key].reset();
        }
    }

    /**
     * 根据天赋系的ID得到模型实例。
     * @param id 天赋系的ID。
     * @return 天赋系模型实例。如果找不到，返回 null 。
     */
    this.getTalentClassById = function(id){
        for ( var key in this.talentClasses ){
            if ( this.talentClasses[key].id == id ){
                return this.talentClasses[key];
            }
        }
        return null;
    }

    /**
     * 得到已经加的点数。
     * @return 已经加在各个天赋系上的点数。
     * @create 2004-10-20 source0
     */
    this.getUsedPoints = function(){
        var rt = 0;
        for ( var key in this.talentClasses ){
            rt += parseInt(this.talentClasses[key].getAmount());
        }
        return rt;
    }

    /**
     * 得到已经加的点数需要的级别。
     * @return 级别。如果点数为0，返回0，否则返回 " 级别 + 9 "。
     * @create 2004-10-30 source0
     */
    this.getRequiredRank = function()
    {
        var points = this.getUsedPoints();
        if ( 0 == points )
        {
            return 0;
        }
        else
        {
            return 9 + parseInt(points);
        }
    }
   /**
     * 使用指定的配置信息初始化。
     * @param profile CProfile实例，配置对象实例。
     * @return 如果数据格式合法，返回 null，否则返回出错信息字符串。
     * @create 2004-10-31 source0
     */
    this.init = function(profile)
    {
        /* 校验数据文件与配置信息是否匹配。 */
        if ( this.id != profile.roleId ){
            return ("数据文件与配置信息不匹配：\n数据文件职业ID：" + this.id + "\n配置信息职业ID：" + profile.roleId);
        }

        var ret = "数据文件与配置信息不匹配：\n职业ID：" + this.id;
        for(var c = 0; c < profile.talentClasses.length; c++) {
            var talentClass = this.getTalentClassById(profile.talentClasses[c].id);
            if ( null == talentClass ){
                ret += "\n配置信息天赋系ID：" + profile.talentClasses[c].id;
                ret += "\n在数据文件中不存在";
                return ret;
            }
            var profileTalents = profile.talentClasses[c].getTalents();
            var tv = null;
            for ( var key in profileTalents )
            {
                tv = talentClass.getTalentView(key);
                if ( null == tv ){
                    ret += "\n天赋系ID：" + profile.talentClasses[c].id;
                    ret += "\n天赋ID：" + key;
                    ret += "\n在数据文件中不存在";
                    return ret;
                }
                /* 校验数据是否合法。 */
                if ( tv.model.data.maxRank < profile.talentClasses[c].getRank(key) )
                {
                    ret += "\n天赋系ID：" + profile.talentClasses[c].id;
                    ret += "\n天赋ID：" + key;
                    ret += "\n数据文件天赋最高级别：" + tv.model.data.maxRank;
                    ret += "\n配置信息天赋级别：" + profile.talentClasses[c].getRank(key);
                    ret += "\n配置信息的天赋级别高于允许的最高级别";
                    return ret;
                }
            }
        }

        this.reset();

        /* 初始化数据。*/
        for(var c = 0; c < profile.talentClasses.length; c++) {
            var talentClass = this.getTalentClassById(profile.talentClasses[c].id);
            var profileTalents = profile.talentClasses[c].getTalents();
            for ( var key in profileTalents )
            {
                talentClass.getTalentView(key).init(profile.talentClasses[c].getRank(key));
            }
        }
        return null;
    }

}

