using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
///
/// 英雄Proxy
///
class HeroProxy : ProxyBase
{
///
/// init
///
public HeroProxy() => this.opeCode = OpeCode.ope_hero;
#region 数值 计算公式 变化 升阶 升级
///
/// 获得 角色某个等级 等阶 状态下的属性值
///
///
/// 等级
/// 品阶(SCBD)
///
public float getHeroProperty(string modelId, EHeroProperties attType,
int level, string gradeLevel)
{
float result = 0; // 结果
float gradeF = 0; // 品阶加成
sm_hero heroMo = sm_hero.GetMoByID(modelId);
if (heroMo == null) // 找不到英雄模板数据
{
return 0;
}
////========================================
#region 属性成长
//第一步, 根据玩家的等阶,来找出,对应的等阶,的各个属性成长的曲线类型,也就是说0阶的时候, 各个属性的成长系数是SABCD的哪搞一个。
//然后 根据 SABCD的类型以及 想查找的属性, 找出对应的 这个属性的成长系数
var gradeLevelMo = sm_heroextra_level.GetMoById(heroMo.heroId, gradeLevel);
if (gradeLevelMo != null)
{
switch (attType)
{
case EHeroProperties.HP:
gradeF = gradeLevelMo.hp;
break;
case EHeroProperties.MOFAKANGXING:
gradeF = gradeLevelMo.mofakangxing;
break;
case EHeroProperties.FASHUQIANGDU:
gradeF = gradeLevelMo.fashuqiangdu;
break;
case EHeroProperties.WULIGONGJI:
gradeF = gradeLevelMo.wuligongji;
break;
case EHeroProperties.FANGYUHUJIA:
gradeF = gradeLevelMo.fangyuhujia;
break;
case EHeroProperties.NENGLIANGZHI:
gradeF = gradeLevelMo.nengliangzhi;
break;
case EHeroProperties.GONGJISUDU:
gradeF = gradeLevelMo.gongjisudu;
break;
case EHeroProperties.CRICITAL:
gradeF = gradeLevelMo.baoji;
break;
case EHeroProperties.KANGBAOJI:
gradeF = gradeLevelMo.kangbaoji;
break;
case EHeroProperties.YANLI:
gradeF = gradeLevelMo.yanli;
break;
}
}
else
{
gradeF = 0;
}
#endregion
/* 角色成长公式
生命=初始生命+生命成长*(角色等级-1))+武器加成+言灵加成
言能=初始言能+言能成长*(角色等级-1))
物攻=初始物攻+物攻成长*(角色等级-1))+武器加成+言灵加成
护甲=初始护甲+护甲成长*(角色等级-1))+武器加成+言灵加成
言攻=初始言攻+言攻成长*(角色等级-1))+武器加成+言灵加成
言抗=初始言抗+言抗成长*(角色等级-1))+武器加成+言灵加成
暴击=初始暴击+暴击成长*(角色等级-1))+武器加成+言灵加成
暴击率=暴击/(75+角色等级*5)
*/
// 武器成长 和 言灵成长都是直接数值, 所以放到外面再做加法也可以.
////========================================
if (heroMo != null)
{
switch (attType)
{
case EHeroProperties.HP:
result += heroMo.hp + gradeF * (level - 1);
break;
case EHeroProperties.NENGLIANGZHI:
result += heroMo.nengliangzhi + gradeF * (level - 1);
break;
case EHeroProperties.WULIGONGJI:
result += heroMo.wuligongji + gradeF * (level - 1);
break;
case EHeroProperties.FANGYUHUJIA:
result += heroMo.fangyuhujia + gradeF * (level - 1);
break;
case EHeroProperties.FASHUQIANGDU:
result += heroMo.fashuqiangdu + gradeF * (level - 1);
break;
case EHeroProperties.MOFAKANGXING:
result += heroMo.mofakangxing + gradeF * (level - 1);
break;
case EHeroProperties.GONGJISUDU:
result += heroMo.gongjisudu + gradeF * (level - 1);
break;
case EHeroProperties.CRICITAL:
//result += heroMo.baoji / (75 + level * 5); // 2020.6.3 修正暴击算法, 暴击率是暴击值/(75+level*5) 而此处只计算暴击值,战斗中根据这个公式计算暴击率
result += heroMo.baoji + gradeF * (level - 1);
break;
case EHeroProperties.KANGBAOJI:
//result += heroMo.baoji / (75 + level * 5); // 2020.6.3 修正暴击算法, 暴击率是暴击值/(75+level*5) 而此处只计算暴击值,战斗中根据这个公式计算暴击率
result += heroMo.kangbaoji + gradeF * (level - 1);
break;
case EHeroProperties.YANLI:
//result += heroMo.baoji / (75 + level * 5); // 2020.6.3 修正暴击算法, 暴击率是暴击值/(75+level*5) 而此处只计算暴击值,战斗中根据这个公式计算暴击率
result += heroMo.yanli + gradeF * (level - 1);
break;
}
}
return result;
}
#endregion
#region ' API '
#region 注释掉内容
///////
/////// [6301] 升级英雄 消耗其他英雄卡牌来升级【功能一模式】
///////
/////// 玩家ID
/////// 分区ID
/////// 英雄ID
/////// 消耗的英雄UID字符组
/////// 消耗金币
/////// 成功回调(无返回参数)
////public void HeroLevelUpgrade(string uid, int zoneid, string heroId, string costHeroListStr, int costGold, Action callback)
////{
//// Post(CmdCode.hero_levelup, uid, zoneid, new object[] { heroId, costHeroListStr, costGold },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
/////
///// [6301] 升级英雄 消耗经验卡 碎片等来升级 【功能二模式】
/////
/////
/////
/////
/////
/////
/////
//public void HeroLevelUpgradeCostItem(string uid, int zoneid, string heroId, string costItemListStr, int costGold, Action callback)
//{
// Post(CmdCode.hero_levelup, uid, zoneid, new object[] { heroId, costItemListStr, costGold },
// resp =>
// {
// if (callback != null)
// {
// callback.Invoke(resp.result);
// }
// });
//}
#endregion
///
/// [6304] 英雄升阶 (消耗碎片
/// version: 2020.1.15 调试对接
/// 2019.12.10 代码整理按照策划要求修改第一版.
///
///
/// 消耗道具(经验丹)Id
/// 消耗数量
///
public void HeroUpgrade(string heroUid, string nextGrade, Action callback)
{
Post(CmdCode.hero_stageup, new object[] { heroUid, nextGrade },
resp =>
{
if (callback != null)
{
//undone: 扣减碎片数量 -wg 2019年12月10日
var hero = UserProxy.Instance.player.collectHero.UpdateHero(resp.result);
var mo = sm_heroextra_level.GetMoById(int.Parse(hero.typeId), nextGrade);
UserProxy.Instance.player.collectItem.ConsumePacketItem(mo.segID.ToString(), mo.segNum);
callback.Invoke(hero);
}
});
}
///
/// [6301] 升级英雄 消耗经验丹 等来提升经验升级
/// version: 2020.1.15 调试对接
/// 2019.12.10 代码整理按照策划要求修改第一版
///
///
/// 消耗道具(经验丹)Id
/// 消耗数量
///
public void HeroLevelUpCostItem(string heroUid, int costItemId, int costNum, Action callback)
{
Post(CmdCode.hero_levelup, new object[] { heroUid, costItemId, costNum },
resp =>
{
// undone: 扣减相应的 经验丹数量 -王刚 2019年12月10日09:24:21
//UserProxy.Instance.player.collectItem.ConsumePacketItem(costItemId.ToString(), costNum);
//UserProxy.Instance.player.InitFromStore(JObject.FromObject(resp.result["store"]));
UserProxy.Instance.player.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
var hero = UserProxy.Instance.player.collectHero.UpdateHero(JObject.FromObject( resp.result["hero"]));
callback?.Invoke(hero);
});
}
#region 已注释掉内容
///////
/////// [6306] 更改英雄的锁定状态
///////
/////// 玩家UID
/////// 玩家分区ID
/////// 英雄唯一ID
/////// 是否锁定
/////// 成功回调处理
////public void ChangeHeroLockState(string uid, int zoneid, string heroUID, bool isLock, Action callback)
////{
//// Post(CmdCode.hero_changelockstate, uid, zoneid, new object[] { heroUID, isLock },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke();
//// }
//// });
////}
/////////
///////// 获得一个英雄
/////////
///////// 玩家UID
///////// 玩家分区ID
///////// 模板ID
///////// 成功回调处理
//////public void GetHero(string uid, int zoneid, string heroid, Action callback)
//////{
////// Post(CmdCode.cmd_hero_gethero, uid, zoneid, new object[] { heroid },
////// resp =>
////// {
////// if (callback != null)
////// {
////// callback.Invoke(resp.result);
////// }
////// });
//////}
#endregion
///
/// 6321 花费钻石或者金币或者 人民币购买一个 英雄
///
///
///
public void BuyHero(string heroid, string type, int price, int piecesId, int piecesNum, Action callback)
{
Post(CmdCode.cmd_hero_buyHero, new object[] { heroid, type, price, piecesId, piecesNum }, resp => callback?.Invoke(resp.result));
}
#region 已注释内容
///////
/////// [6309]对英雄进行强化升阶
///////
/////// 玩家UID
/////// 玩家分区ID
/////// 突破的英雄UID
/////// 消耗的英雄UID字符组
/////// 消耗金币
/////// 成功回调处理
////public void HeroStrength(string uid, int zoneid, string herouid, string costHeros, int costGold, Action callback)
////{
//// Post(CmdCode.cmd_hero_strength, uid, zoneid, new object[] { herouid, costHeros, costGold },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
///////
/////// [6305 ]对英雄进行升星
///////
/////// 玩家UID
/////// 玩家分区ID
/////// 操作的英雄UID
/////// 消耗的英雄UID字符组合
/////// 消耗金币
/////// 成功回调处理
////public void HeroUpStar(string uid, int zoneid, string herouid, string costHeros, int costGold, Action callback)
////{
//// Post(CmdCode.hero_upstar, uid, zoneid, new object[] { herouid, costHeros, costGold },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
///////
/////// [6305 ]对英雄进行升星
///////
////public void HeroUpStar(string uid, int zoneid, string herouid, string costpieces, int piecesNum, string costIitems, int itemNum, string moneyType, int num, Action callback)
////{
//// Post(CmdCode.hero_upstar, uid, zoneid, new object[] { herouid, costpieces, piecesNum, costIitems, itemNum, moneyType, num },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
#endregion
///
/// 6322 英雄神血升级
///
///
///
///
///
///
///
[Obsolete("升级神血", true)]
public void HeroUpGodBlood(string herouid, string costpieces, int piecesNum, string moneyType, int num, Action callback)
{
Post(CmdCode.cmd_hero_upGodBlood, new object[] { herouid, costpieces, piecesNum, moneyType, num }, resp => callback?.Invoke(resp.result));
}
#region 已注释内容
///////
/////// [6310 ]对英雄进行结算好感度
///////
/////// 玩家UID
/////// 玩家分区ID
/////// 操作的英雄UID
/////// 解锁的好感度
/////// 成功回调处理
////public void HeroOpenFavor(string uid, int zoneid, string herouid, int favorId, Action callback)
////{
//// Post(CmdCode.cmd_hero_openFavor, uid, zoneid, new object[] { herouid, favorId },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
///////
/////// [6311 ]对英雄分解.进而获得晶石
///////
/////// 玩家UID
/////// 玩家分区ID
/////// 分解消耗的英雄id列表
/////// 成功回调处理
////public void HeroSeparate(string uid, int zoneid, string costHeros, Action callback)
////{
//// Post(CmdCode.cmd_hero_separate, uid, zoneid, new object[] { costHeros },
//// resp =>
//// {
//// if (callback != null)
//// {
//// callback.Invoke(resp.result);
//// }
//// });
////}
/////////
///////// 6312 购买玩家可以收集的英雄的数量上限
/////////
///////// 玩家UID
///////// 玩家分区ID
///////// 购买数量
///////// 消耗钻石
///////// 成功回调处理
//////public void BuyHeroMaxCountLimt(string uid, int zoneid, int buyNum, int costCash, Action callback)
//////{
////// Post(CmdCode.cmd_hero_buyCollectHeroLimtCount, uid, zoneid, new object[] { buyNum, costCash },
////// resp =>
////// {
////// if (callback != null)
////// {
////// callback.Invoke(resp.result);
////// }
////// });
//////}
/////////
///////// 6313 更改好友支援的英雄ID
/////////
///////// 玩家UID
///////// 玩家分区ID
///////// 操作的英雄UID
///////// 成功回调处理
//////public void ChangeFriendSupport(string uid, int zoneid, string heroUId, Action callback)
//////{
////// Post(CmdCode.cmd_hero_changefriendsupport, uid, zoneid, new object[] { heroUId },
////// resp =>
////// {
////// if (callback != null)
////// {
////// callback.Invoke(resp.result);
////// }
////// });
//////}
#endregion
///
/// 6314 对英雄的技能进行升级
///
/// 操作的英雄UID
/// 升级的技能ID
/// 升级的技能类型
/// 成功回调处理
public void HeroUpgradeSkillLevel(int heroUId, int mainSkillId, int subskillID, Action callback)
{
Post(CmdCode.cmd_hero_upgradeSkillLevel, new object[] { heroUId, mainSkillId, subskillID }, resp =>
{
var sm = sm_subSkill.GetMoById(sm_subSkill.GetMoById(subskillID).nextLevel_Id); // 扣除金币
UserProxy.Instance.player.ChangeUserAccount(AccountType.gold, -int.Parse(sm.upgradeCost));
var hero = UserProxy.Instance.player.collectHero.UpdateHero(resp.result); // 更新英雄
callback?.Invoke(hero);
});
}
///
/// 6325 英雄 - 一键升级某个子技能
///
/// 英雄实例ID
/// 主技能id
/// 子技能ID
/// 将要升级到的子技能ID
/// 花费金币
///
public void HeroOnekeyUpgradeSkillLevel(int heroUID, int mainSkillId, int subSkillId, int targetSubSkillID, int costGold, Action callback)
{
Post(CmdCode.cmd_hero_onekeyUpgradeSkill, new object[] { heroUID, mainSkillId, subSkillId, targetSubSkillID, costGold }, resp =>
{
UserProxy.Instance.player.ChangeUserAccount(AccountType.gold, -costGold); // 扣除金币
var hero = UserProxy.Instance.player.collectHero.UpdateHero(resp.result); // 更新英雄
callback?.Invoke(hero);
});
}
///
/// 6324 英雄 - 解锁某个子技能
///
/// 英雄实例ID
/// 主机能ID
/// 子技能ID
///
public void HeroUnlockSkill(int heroUID, int mainSkillId, int subSkillId, Action callback)
{
Post(CmdCode.cmd_hero_unlockSkill, new object[] { heroUID, mainSkillId, subSkillId }, resp =>
{
var sm = sm_subSkill.GetMoById(subSkillId); // 扣除金币
UserProxy.Instance.player.ChangeUserAccount(AccountType.gold, -int.Parse(sm.unlockCost));
var hero = UserProxy.Instance.player.collectHero.UpdateHero(resp.result); // 更新英雄
callback?.Invoke(hero);
});
}
///
/// 6315 对英雄的战队配置存储文件
///
/// 队伍配置的字符串文件
/// 成功回调处理
public void SaveHeroTeamConfig(string teamconfig, Action callback)
{
Post(CmdCode.cmd_hero_saveHeroTeamConfig, new object[] { teamconfig }, resp => callback?.Invoke(resp.result));
}
///
/// 6327 言灵升级
///
///
///
///
///
public void YanLingUpgrade(int uid, List itemList, Action callback)
{
List yanlingList = new List();
Dictionary items = new Dictionary();
foreach (ItemVo vo in itemList)
{
if (vo.nMo.subType == (int)EItemSubType.YanLing)
{
yanlingList.Add(vo.uid);
}
else
{
items[vo.typeId] = vo.count;
}
}
Post(CmdCode.cmd_hero_YanlinUpLevel, new object[] { uid, yanlingList, items }, resp =>
{
var p = UserProxy.Instance.player;
p.InitFromStore((JObject)resp.result["store"]);
UserProxy.Instance.player.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
callback?.Invoke(p.collectYanling.items[uid]);
});
}
///
/// 言灵突破
///
///
///
public void YanLingTupo(int uid, Action callback)
{
Post(CmdCode.cmd_hero_StrengthenStar, new object[] { uid }, resp =>
{
//var p = UserProxy.Instance.player;
//p.InitFromStore((JObject)resp.result["store"]);
UserProxy.Instance.player.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
callback?.Invoke();
});
}
///
/// 6326 言灵强化升星---废弃
///
///
///
[Obsolete("请清理调用此方法的旧模块,有问题找-gwang", true)]
public void StrengthenStar(int yanlingUid,List uidList,Action callback, Action faild = null)
{
Post(CmdCode.cmd_hero_StrengthenStar, new object[] { yanlingUid, uidList},
resp =>
{
//var p = UserProxy.Instance.player;
//p.InitFromStore((JObject)resp.result["store"]);
UserYanlingVo vo = UserProxy.Instance.player.collectYanling.items[yanlingUid];
if (callback != null)
{
callback.Invoke(vo);
}
});
}
///
/// 6327 言灵等级升级---废弃
///
///
///
///
///
[Obsolete("请清理调用此方法的旧模块,有问题找-gwang",true)]
public void YanlinUpLevel(int yanlingUid,int type, Action callback, Action faild = null)
{
Post(CmdCode.cmd_hero_YanlinUpLevel, new object[] { yanlingUid, type },
resp =>
{
var p = UserProxy.Instance.player;
//p.InitFromStore((JObject)resp.result["store"]);
p.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
p.baseInfo.resPoint = int.Parse(resp.result["resPoint"].ToString());
UserYanlingVo vo = UserProxy.Instance.player.collectYanling.items[yanlingUid];
if (callback != null)
{
callback.Invoke(vo);
}
});
}
///
/// 突破
///
///
///
public void HuanlingshiTuPo(int id,Action callback)
{
Post(CmdCode.cmd_hero_tupo, new object[] { id },
resp =>
{
var p = UserProxy.Instance.player;
//p.InitFromStore((JObject)resp.result["store"]);
p.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
var vo = UserProxy.Instance.player.collectHero.UpdateHero(JObject.FromObject(resp.result["hero"]));
if (callback != null)
{
callback.Invoke(vo);
}
});
}
///
/// 选择一件添加后的加成的星级经验
///
///
///
public int GetAddStarExp(List uidList)
{
Dictionary items = UserProxy.Instance.player.collectYanling.items;
int addExp = 0;
foreach (int uid in uidList)
{
if (items.ContainsKey(uid))
{
sm_item_yanling mo = sm_item_yanling.GetMoById(int.Parse(items[uid].typeId));
addExp += mo.addStarExp;
}
}
return addExp;
}
///
/// 言灵替换
///
///
///
///
///
public void YanlinReplace(int heroId, int yanlingRank, int heroReplaceId, int yanlingReplaceRank, Action callback)
{
Post(CmdCode.cmd_hero_YanLingReplace, new object[] { heroId, yanlingRank, heroReplaceId, yanlingReplaceRank },
resp =>
{
var p = UserProxy.Instance.player;
p.InitFromStore((JObject)resp.result["store"]);
JObject jhero = JObject.Parse(resp.result["hero"].ToString());
foreach (KeyValuePair kv in jhero)
{
var heroVo = UserProxy.Instance.player.collectHero.UpdateHero(JObject.FromObject(kv.Value));
}
var vo = UserProxy.Instance.player.collectHero.UpdateHero(JObject.FromObject(resp.result["selfhero"]));
callback?.Invoke(vo);
});
}
///
/// 6330 召唤言灵
///
///
///
public void zhaohuanYanLing(int cardId, Action callback)
{
Post(CmdCode.cmd_hero_zhaohuanYanLing, new object[] { cardId },
resp =>
{
var p = UserProxy.Instance.player;
p.InitFromStore((JObject)resp.result["store"]);
p.baseInfo.gold = int.Parse(resp.result["gold"].ToString());
string yanlingId = resp.result["yanlingId"].ToString();
ItemVo vo = new ItemVo();
vo.typeId = yanlingId;
vo.count = 1;
callback?.Invoke(vo);
});
}
#region ' 英雄评价相关 '
///
/// 6316 拉取指定英雄的评论信息
///
/// 英雄ID
/// 成功回调处理,参数:{"ret" => [], 'score' => int}
public void GetDiscuss(string heroModelId, int index, Action callback)
{
Post(CmdCode.cmd_hero_GetDiscuss, new object[] { heroModelId, index }, resp => callback.Invoke(resp.result.ToObject()));
}
///
/// 6317 评论指定英雄
///
/// 英雄ID
/// 评价内容
/// 成功回调处理,参数:{"ret" => { 'uid' => $uid,'name' => $req->userInfo->game->name,'msg' => $content,'ts' => now(),'praise' => 0 }}
public void PosttDiscuss(string heroId, string content, Action callback)
{
Post(CmdCode.cmd_hero_PostDiscuss, new object[] { heroId, content },
resp => callback?.Invoke(resp.result.ToObject()));
}
///
/// 6319 删除对某个英雄的评价
///
/// 英雄ID
/// 成功回调处理,参数:{"ret" => { 'uid' => $uid,'name' => $req->userInfo->game->name,'msg' => $content,'ts' => now(),'praise' => 0 }}
public void DeleteDiscuss(string heroId, Action callback)
{
Post(CmdCode.cmd_hero_DeleteDiscuss, new object[] { heroId }, resp => callback?.Invoke(resp.result.ToObject()));
}
///
/// 6318 给指定评价点赞
///
/// 英雄ID
/// 评价以评论者的uid作为索引
/// 成功回调处理,参数:{"ret" => { 'uid' => $uid,'name' => $req->userInfo->game->name,'msg' => $content,'ts' => now(),'praise' => 0 }}
public void PraiseDiscuss(string heroId, string discuss_uid, Action callback)
{
Post(CmdCode.cmd_hero_PraiseDiscuss, new object[] { heroId, discuss_uid }, resp => callback?.Invoke(resp.result.ToObject()));
}
///
/// 6320 给某个英雄打分
///
/// 英雄ID
/// 评分(0~5)
/// 成功回调处理,参数:{"ret" => { 'uid' => $uid,'name' => $req->userInfo->game->name,'msg' => $content,'ts' => now(),'praise' => 0 }}
public void ScoreIt(string heroId, int score, Action callback)
{
Post(CmdCode.cmd_hero_scoreit, new object[] { heroId, score }, resp => callback?.Invoke(resp.result.ToObject()));
}
#endregion
/////////
///////// 通过消耗英雄碎片 解锁英雄
/////////
/////////
/////////
/////////
/////////
/////////
//////public void UnLockHeroByPieces(string uid, int zoneid, string heroModelId, int piecesId, int piecesNum, Action callback)
//////{
////// Post(CmdCode.cmd_hero_unlockByPieces, uid, zoneid, new object[] { heroModelId, piecesId, piecesNum },
////// resp =>
////// {
////// if (callback != null)
////// {
////// callback.Invoke(resp.result);
////// }
////// });
//////}
///
#endregion
}