From f198885f31c9c7eb19eb28adce562e39e64d581c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 18 七月 2025 16:23:11 +0800 Subject: [PATCH] 121 【武将】武将系统-服务端(属性计算、战斗力计算;新角色初始给默认装备、默认阵容武将;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/FormulaControl.py | 72 ++++++++++++++++++++++++++++++++++++ 1 files changed, 72 insertions(+), 0 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/FormulaControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/FormulaControl.py index 79568c9..514a9a4 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/FormulaControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/FormulaControl.py @@ -33,6 +33,10 @@ #=============================================================================== #--------------------------------------------------------------------- +import traceback +import random +import math + #--------------------------------------------------------------------- #公式字典名注册 #注册公式字典名方式 'Facl_DistKey_ + KeyName' (前缀名用于区别策划配置txt公式Key) @@ -74,3 +78,71 @@ AllFormulaDist = {} #GameWorld.Log('ClearCompileFormulaDist Sucess AllFormulaDist = %s'%(AllFormulaDist)) return + +def Eval(formulaKey, formula, paramDict, toInt=True, ceil=False, playerID=0): + """ 动态计算 + :param formulaKey: 公式编译缓存key + :param formula: 公式字符串,如 "int(Atk*10 + MaxHP)" + :param paramDict: 参数字典,如 {'Atk': 100, 'MaxHP': 5000} + :param toInt: 是否转为整数 + :param ceil: 是否向上取整 + :return: 计算结果 + """ + compileFormula = GetCompileFormula(formulaKey, formula) + + safe_env = { + '__builtins__': None, + # 基础数学函数 + 'abs': abs, + 'min': min, + 'max': max, + 'pow': pow, + 'round': round, + # 类型转换 + 'int': int, + 'float': float, + 'bool': bool, + # 数学常数 + #'pi': math.pi, + #'e': math.e + } + safe_env.update(paramDict) + try: + # 执行计算 + value = eval(compileFormula, safe_env) + if ceil: + value = math.ceil(value) + if toInt: + value = int(value) + return value + except: + import GameWorld + GameWorld.SendGameErrorEx("FormulaEvalError", "formulaKey:%s, %s, %s" % (formulaKey, paramDict, traceback.format_exc()), playerID) + return 0 + +def test(): + attrParamDict={ + 'lineupHaloPer': 0, 'awakeTalentPer': 0, 'breakLVPer': 0, 'breakLVValue': 0, 'bookValue': 0, 'lineupStarAddPer': 0, 'lvValue': 0, + 'heroSelfValue': 0, 'awakeTalentValue': 0, 'fetterPer': 0, 'lineupBreakLVAddPer': 0, + 'starTalentValue': 30, 'inheritPer': 1, 'equipValue': 269, 'fetterValue': 0, 'lineupLVAddPer': 0, 'heroSelfPer': 0, + 'bookPer': 0, 'starTalentPer': 0, 'lineupHaloValue': 0, 'lineupInitAddPer': 0 + } + + formula = "(lvValue+equipValue+bookValue)*inheritPer+(heroSelfValue+lineupHaloValue+starTalentValue+breakLVValue+awakeTalentValue)+fetterValue" + formula = "(lvValue+equipValue+bookValue)*(1+lineupHaloPer+bookPer+lineupInitAddPer+lineupLVAddPer+lineupBreakLVAddPer+lineupStarAddPer)*(inheritPer+fetterPer+starTalentValue+breakLVValue+awakeTalentValue)+heroSelfValue" + + import time + doCount = 1 + + time1 = time.time() + for _ in xrange(doCount): + value = Eval("aaa", formula, attrParamDict) + print "公式 计算结果: ", value + print "use time %s" % (time.time() - time1) + return + +## 使用示例 +#if __name__ == "__main__": +# test() + + \ No newline at end of file -- Gitblit v1.8.0