From 1e544f34c1e4144b03b6b8b273034a06a0cbecac Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 30 五月 2019 18:13:30 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py | 2
Tool/配置导表工具/拖动配表到此导出.bat | 10
Tool/配置导表工具/config2.ini | 14
Tool/配置导表工具/示例表行列.xlsx | 0
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py | 17
Tool/配置导表工具/gamecfg_export.py | 513 ++++++++++++++++++++++++++++++++
Tool/配置导表工具/readme.txt | 34 ++
Tool/配置导表工具/示例表列.xlsx | 0
Tool/配置导表工具/TableExportMap.txt | 264 ++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 23 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py | 17
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2
Tool/配置导表工具/示例表行.xlsx | 0
PySysDB/PySysDBPY.h | 9
Tool/配置导表工具/config.ini | 10
15 files changed, 907 insertions(+), 8 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 1b3f7e7..55693eb 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -538,6 +538,15 @@
dict SweepGoodDrop; //扫荡珍稀符印
};
+//地图表格
+
+struct tagChinMap
+{
+ DWORD _MapID; //地图ID
+ BYTE CanRide; //可否骑乘
+ BYTE CanOutPet; //可否召唤宠物
+};
+
//副本总表
struct tagFBFunc
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 2a96f71..782cf3e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -451,6 +451,12 @@
("dict", "SweepGoodDrop", 0),
),
+ "ChinMap":(
+ ("DWORD", "MapID", 1),
+ ("BYTE", "CanRide", 0),
+ ("BYTE", "CanOutPet", 0),
+ ),
+
"FBFunc":(
("DWORD", "DataMapID", 1),
("BYTE", "DayTimes", 0),
@@ -2335,6 +2341,19 @@
def GetSweepRunePoint(self): return self.SweepRunePoint # 扫荡符印精华
def GetSweepYsog(self): return self.SweepYsog # 扫荡魔精
def GetSweepGoodDrop(self): return self.SweepGoodDrop # 扫荡珍稀符印
+
+# 地图表格
+class IPY_ChinMap():
+
+ def __init__(self):
+ self.MapID = 0
+ self.CanRide = 0
+ self.CanOutPet = 0
+ return
+
+ def GetMapID(self): return self.MapID # 地图ID
+ def GetCanRide(self): return self.CanRide # 可否骑乘
+ def GetCanOutPet(self): return self.CanOutPet # 可否召唤宠物
# 副本总表
class IPY_FBFunc():
@@ -4562,6 +4581,8 @@
self.ipyNPCDropItemLen = len(self.ipyNPCDropItemCache)
self.ipyRuneTowerCache = self.__LoadFileData("RuneTower", IPY_RuneTower)
self.ipyRuneTowerLen = len(self.ipyRuneTowerCache)
+ self.ipyChinMapCache = self.__LoadFileData("ChinMap", IPY_ChinMap)
+ self.ipyChinMapLen = len(self.ipyChinMapCache)
self.ipyFBFuncCache = self.__LoadFileData("FBFunc", IPY_FBFunc)
self.ipyFBFuncLen = len(self.ipyFBFuncCache)
self.ipyFBLineCache = self.__LoadFileData("FBLine", IPY_FBLine)
@@ -5024,6 +5045,8 @@
def GetNPCDropItemByIndex(self, index): return self.ipyNPCDropItemCache[index]
def GetRuneTowerCount(self): return self.ipyRuneTowerLen
def GetRuneTowerByIndex(self, index): return self.ipyRuneTowerCache[index]
+ def GetChinMapCount(self): return self.ipyChinMapLen
+ def GetChinMapByIndex(self, index): return self.ipyChinMapCache[index]
def GetFBFuncCount(self): return self.ipyFBFuncLen
def GetFBFuncByIndex(self, index): return self.ipyFBFuncCache[index]
def GetFBLineCount(self): return self.ipyFBLineLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index d07bd51..3a9db86 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -260,6 +260,8 @@
if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
PlayerFB.DoExitCustomScene(curPlayer)
+ PetControl.DoLogic_PetLoadMapOK(curPlayer)
+
msgInfo = ""
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetPlayerID(), 0, 0, "RefreshMainServerRole", msgInfo, len(msgInfo))
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
index 827b656..6b72837 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PetControl.py
@@ -46,6 +46,7 @@
import BaseAttack
import PassiveBuffEffMng
import ChNetSendPack
+import IpyGameDataPY
#---------------------------------------------------------------------
DefPetRebornHPRate = 100 # 宠物死亡复活血量百分比
@@ -460,7 +461,7 @@
# @return BOOL 是否可出战
# @remarks 检查当前指定宠物是否可出战
def CheckPetCanFight(curPlayer, curPetObj):
- if not GameWorld.GetMap().GetMapCanOutPet():
+ if not GetMapCanOutPet(curPlayer):
#Pet_liubo_314885 此地图禁止宠物
PlayerControl.NotifyCode(curPlayer, "Pet_liubo_314885")
return False
@@ -546,7 +547,7 @@
if not rolePet.GetIsBattle():
return
- if not GameWorld.GetMap().GetMapCanOutPet():
+ if not GetMapCanOutPet(curPlayer):
#此地图禁止宠物
return
#召唤宠物出战
@@ -578,7 +579,7 @@
# @remarks
def DoLogic_PetLoadMapOK(curPlayer):
- if GameWorld.GetMap().GetMapCanOutPet():
+ if GetMapCanOutPet(curPlayer):
#此地图宠物可以上
PlayerPet.AutoSummonPet(curPlayer)
return
@@ -591,6 +592,16 @@
PlayerControl.NotifyCode(curPlayer, "Pet_liubo_314885")
return
+def GetMapCanOutPet(curPlayer):
+ ## 检查本地图可否出战宠物,支持前端自定义场景
+ customMapID = PlayerControl.GetCustomMapID(curPlayer)
+ if customMapID:
+ ipyMapData = IpyGameDataPY.GetIpyGameData("ChinMap", customMapID)
+ canOutPet = True if ipyMapData and ipyMapData.GetCanOutPet() else False
+ else:
+ canOutPet = GameWorld.GetMap().GetMapCanOutPet()
+ return canOutPet
+
#---------------------------------------------------------------------
## 刷新宠物信息并通知客户端
# @param rolePet 宠物实例
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
index 693d3c0..172104d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -40,6 +40,7 @@
import FBHelpBattle
import SkillShell
import PyGameData
+import PetControl
import NPCCommon
import time
@@ -510,6 +511,7 @@
PlayerControl.SetCustomMap(curPlayer, mapID, lineID)
GameWorld.Log("玩家开始自定义场景!mapID=%s,lineID=%s" % (mapID, lineID), playerID)
if mapID:
+ PetControl.DoLogic_PetLoadMapOK(curPlayer)
FBLogic.OnEnterCustomScene(curPlayer, mapID, lineID)
#通知进入状态
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index ca5bf25..29b3bfb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -188,11 +188,18 @@
# 未加载成功骑乘会导致模型加载失败报错
if not curPlayer.GetInitOK():
return False
-
- #地图不允许骑马 RideLimit_lhs_0
- if not GameWorld.GetMap().GetMapCanRide():
- PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
- return False
+
+ customMapID = PlayerControl.GetCustomMapID(curPlayer)
+ if customMapID:
+ ipyMapData = IpyGameDataPY.GetIpyGameData("ChinMap", customMapID)
+ if not ipyMapData or not ipyMapData.GetCanRide():
+ PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
+ return False
+ else:
+ #地图不允许骑马 RideLimit_lhs_0
+ if not GameWorld.GetMap().GetMapCanRide():
+ PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
+ return False
#检查玩家状态,只有在空闲状态才能上马
if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull :
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/TableExportMap.txt" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/TableExportMap.txt"
new file mode 100644
index 0000000..5d3895f
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/TableExportMap.txt"
@@ -0,0 +1,264 @@
+配置母表文件名 客户端路径 客户端表名 服务端路径 服务端表名 主键字段组合 表格说明
+示例表行 \Config tagA \db\PyMongoDataServer\PySysDB tagA Lv 示例表行
+示例表列 \Config tagB \db\PyMongoDataServer\PySysDB tagB - 示例表列
+示例表行列 \Config tagC \db\PyMongoDataServer\PySysDB tagC Lv1|Lv2 示例表行列
+B.宝箱怪表 \Config - \db\PyMongoDataServer\PySysDB tagTreasureNPC NPCID 宝箱怪表
+B.宝箱表开启 \Config Chests \db\PyMongoDataServer\PySysDB tagChests ChestsItemID 宝箱表开启
+B.宝箱表产出表 \Config ChestsAward \db\PyMongoDataServer\PySysDB tagChestsAward ChestsItemID|AwardLV 宝箱表产出表
+B.Boss技能提示 \Config bossSkillTips - - id boss信息提示
+C.采集物表 \Config CollectNpc \db\PyMongoDataServer\PySysDB tagCollectNPC NPCID 采集物表
+C.充值表 \Config CTG \db\PyMongoDataServer\PySysDB tagCTG GoodsCode 充值表
+C.充值商品编号表 \Config OrderInfo \db\PyMongoDataServer\PySysDB tagOrderInfo id 充值商品编号表
+C.称号表 \Config Dienstgrad \db\PyMongoDataServer\PySysDB tagDienstgrad ID 称号表
+C.成就表 \Config Success \db\PyMongoDataServer\PySysDB tagSuccess id 成就表
+C.成长型怪物公式参数表 \Config - \db\PyMongoDataServer\PySysDB tagNPCStrengthen - 成长型怪物公式参数表
+D.等级表 \Config PlayerLV \db\PyMongoDataServer\PySysDB tagPlayerLV LV 角色等级相关信息表
+D.等级开启功能 \Config FuncOpenLV \db\PyMongoDataServer\PySysDB tagFuncOpenLV FuncId 功能开启表
+D.地图表格 \Config Map \db\PyMongoDataServer\SysDB tagChinMap MapID 地图表格
+D.地图资源表格 \Config MapResources - - ID 地图资源表格
+D.掉落表 \Config NPCDropItem \db\PyMongoDataServer\PySysDB tagNPCDropItem - NPC掉落表
+D.地图NPC配置表 \Config MapEventPoint \db\PyMongoDataServer\PySysDB tagMapEventPoint Key 地图NPC配置表
+D.地图标试点NPC刷新 - - \db\PyMongoDataServer\PySysDB tagMapRefreshNPC MapID|RefreshNum 地图标试点NPC刷新
+F.富文本信息替换 \Config RichTextMsgReplace - RichTextMsgReplace id 富文本信息替换
+F.符印表 \Config Rune \db\PyMongoDataServer\PySysDB tagRune ID 符印表
+F.副本表 \Config Dungeon \db\PyMongoDataServer\PySysDB tagFBLine ID 副本表
+F.副本总表 \Config DungeonOpenTime \db\PyMongoDataServer\PySysDB tagFBFunc ID 副本总表
+F.副本状态时间表 \Config DungeonStateTime \db\PyMongoDataServer\PySysDB tagFBStateTime ID 副本状态时间表
+F.副本状态时间定制表 \Config DungeonSpecialStateTime \db\PyMongoDataServer\PySysDB tagFBStateTimeCustom ID 副本状态时间定制表
+F.副本状态时间定制表合服 \Config DungeonMixServerStateTime \db\PyMongoDataServer\PySysDB tagFBStateTimeCustomMix ID 副本状态时间定制表合服
+F.副本助战表 \Config DungeonHelpBattle \db\PyMongoDataServer\PySysDB tagFBHelpBattle ID 副本助战表
+F.副本刷怪标识点表 \Config - \db\PyMongoDataServer\PySysDB tagNPCCustomRefresh ID 副本刷怪标识点表
+F.符印塔表 \Config RuneTower - - ID 符印塔表
+F.符印塔塔层表 \Config RuneTowerFloor \db\PyMongoDataServer\PySysDB tagRuneTower ID 符印塔塔层表
+G.GM测试属性表 \Config - \db\PyMongoDataServer\PySysDB tagGMAttr - GM测试属性表
+G.功能配置表格 \Config FuncConfig \db\PyMongoDataServer\PySysDB tagFuncConfig KEY 功能混合配置表
+G.怪物名称颜色 \Config MonsterNameColor - MonsterNameColor ID 怪物名称颜色
+H.合成表 \Config ItemCompound \db\PyMongoDataServer\PySysDB tagItemCompound id 合成表
+H.换装表 \Config ModelRes - ModelRes ID 换装资源表
+H.魂石配置表 \Config AttrFruit \db\PyMongoDataServer\PySysDB tagAttrFruit ID 灵宠魂石坐骑兽魂等配置表
+J.境界表 \Config Realm \db\PyMongoDataServer\PySysDB tagRealm Lv 境界表
+J.技能表 \Config Skill \db\PyMongoDataServer\SysDB tagChinSkill SkillID 技能表
+L.灵宠表 \Config PetInfo \db\PyMongoDataServer\PySysDB tagPetInfo ID 灵宠表
+L.聊天气泡表 \Config ChatBubbleBox \db\PyMongoDataServer\PySysDB tagChatBubbleBox BoxID 聊天气泡表
+Z.装备分解属性表 \Config EquipDeCompose \db\PyMongoDataServer\PySysDB tagEquipDecompose LV 装备分解属性表
+L.灵宠升阶消耗表 \Config PetClassCost \db\PyMongoDataServer\PySysDB tagPetClassCost ID 灵宠升阶消耗表
+N.NPC表 \Config NPC \db\PyMongoDataServer\SysDB tagChinNPC NPCID NPC表
+N.NPC时间掉血表 \Config - \db\PyMongoDataServer\PySysDB tagNPCTimeLostHP NPCID NPC时间掉血表
+Q.区域镜头 \Config AreaCamera - - AreaID 区域镜头
+S.神兵表 \Config GodWeapon \db\PyMongoDataServer\PySysDB tagGodWeapon ID 神兵表
+S.属性条目配置 \Config PlayerProperty - PlayerProperty ID 属性条目配置
+S.随机名字列表 \Config RandomName - RandomName ID 随机名字列表
+W.物品表 \Config Item \db\PyMongoDataServer\SysDB tagChinItem ID 物品信息表
+X.洗练属性 \Config EquipWash \db\PyMongoDataServer\PySysDB tagEquipWash - 装备洗练表
+X.洗练套装属性 \Config EquipWashSpec \db\PyMongoDataServer\PySysDB tagEquipWashSpec - 装备洗练套装特殊属性表
+X.信息提示表 \Config SysInfo - tagSysInfo key 信息提示表
+Y.羽翼精炼材料表 \Config WingRefineExp \db\PyMongoDataServer\PySysDB tagWingRefineExp ID 羽翼精炼材料经验表
+Y.羽翼精炼属性随机 \Config WingRefineAttr \db\PyMongoDataServer\PySysDB tagWingRefineAttr ID 羽翼精炼属性表
+Z.战斗力参数 \Config FightPowerParam \db\PyMongoDataServer\PySysDB tagFightPowerParam LV 战斗力参数等级系数表
+Z.装备评分 \Config EquipGSParam \db\PyMongoDataServer\PySysDB tagEquipGSParam - 装备评分属性系数表
+Z.装备对应积分经验表 \Config PetEatEquip \db\PyMongoDataServer\PySysDB tagPetEatEquip ID 装备积分经验表
+Z.装备强化表 \Config ItemPlus \db\PyMongoDataServer\PySysDB tagItemPlus id 装备强化表
+Z.装备强化等级上限 \Config ItemPlusMax \db\PyMongoDataServer\PySysDB tagItemPlusMax id 装备强化等级上限
+Z.装备全身强化属性 \Config ItemPlusSumAttr \db\PyMongoDataServer\PySysDB tagItemPlusSumAttr countNeed 装备全身强化属性
+Z.坐骑升级消耗表 \Config HorseUp \db\PyMongoDataServer\PySysDB tagHorseUp ID 坐骑升级消耗表
+Z.坐骑表 \Config Horse \db\PyMongoDataServer\PySysDB tagHorse HorseID 坐骑表
+Z.装备套装属性 \Config EquipSuit \db\PyMongoDataServer\PySysDB tagEquipSuitAttr id 装备套装属性
+Z.装备套装材料 \Config EquipSuitCompound - - id 装备套装材料
+Z.各个职业相关配置表 \Config JobSetup - tagJobSetup Job 各个职业相关配置表
+T.特效管理表 \Config Effect - Effect id 特效管理表
+P.屏蔽词 \Config DirtyWord \CoreServerGroup\GameServer\GameServerConfig\DirtyList DirtyList id 屏蔽词
+P.排行榜表 \Config RankList - tagRankList ID 排行榜
+S.世界等级表 - WorldLV \db\PyMongoDataServer\PySysDB tagWorldLV WorldLevel 世界等级表
+X.仙盟表 \Config Family \db\PyMongoDataServer\PySysDB tagFamily familyLV 仙盟表
+X.仙盟科技表 \Config FamilyTech \db\PyMongoDataServer\PySysDB tagFamilyTech teachID 仙盟科技表
+Z.职业名称 \Config OccupationName - JobName ID 职业名称
+X.仙盟Boss表 \Config FairyBoss - tagFairyBoss id 仙盟Boss表
+Y.语言表 \Config Language Language id 语言表
+Y.音效表 \Config Audio Audio ID 音效配置表
+Y.运营活动表 \Config ActionControl \db\PyMongoDataServer\PySysDB tagActionControl ID 运营活动表
+I.Icon表 \Config Icon Icon id 图标配置表
+C.传送点配置 \Config maptransport TransportID 传送点配置表
+C.创角表 \Config CreateRole - CreateRole job 创角表
+Z.战斗伤害数字 \Config DamageNum DamageNum id 战斗伤害数字配置表
+B.表情表 \Config Face - Face name 表情表
+R.日常任务表 \Config DailyQuest \db\PyMongoDataServer\PySysDB tagDailyQuest ID 日常任务表
+R.日常活动表 \Config DailyQuestOpenTime \db\PyMongoDataServer\PySysDB tagDailyAction ID 日常活动表
+R.日常活动定制表 \Config DailyQuestSpecialOpenTime \db\PyMongoDataServer\PySysDB tagDailyActionCustom ID 日常活动定制表
+R.日常活动定制表合服 \Config DailyQuestMixServerStateTime \db\PyMongoDataServer\PySysDB tagDailyActionCustomMix ID 日常活动定制表合服
+R.日常活跃奖励表 \Config DailyLivenessReward \db\PyMongoDataServer\PySysDB tagDailyLivenessReward Liveness 日常活跃奖励表
+P.拍卖物品表 \Config AuctionItem \db\PyMongoDataServer\PySysDB tagAuctionItem ItemID 拍卖物品表
+J.集市表 \Config Market - tagMarket type 集市表
+J.集市查询表 \Config MarketQuery - tagMarketQuery queryType 集市查询表
+Y.邮件模板表 \Config Mail \db\PyMongoDataServer\PySysDB tagPyMail MailType 邮件模板表
+Z.装备全身星数属性 \Config RoleEquipStars \db\PyMongoDataServer\PySysDB tagRoleEquipStars id 装备全身星数属性
+F.法宝表 \Config Treasure \db\PyMongoDataServer\PySysDB tagTreasure ID 法宝表
+J.技能升级 \Config TreasureSkill \db\PyMongoDataServer\PySysDB tagSkillElement ID 技能升级表
+J.界面索引表 \Config WindowSearch - tagWindowSearch ID 界面索引表
+X.修行表 \Config RealmPractice - tagRealmPractice ID 境界修行表
+F.副本目标提示表 \Config DungeonHint - tagDungeonHint ID 副本目标提示表
+Q.签到奖励表 \Config SignIn \db\PyMongoDataServer\PySysDB tagSignAward RewardID 签到奖励表
+Q.累计签到奖励表 \Config ContinueSignIn \db\PyMongoDataServer\PySysDB tagContineSignAward ContineDay 累积签到奖励表
+V.VIP礼包表 \Config VIPAward \db\PyMongoDataServer\PySysDB tagVIPAward VIPLV VIP礼包表
+D.定制物品表 \Config AppointItem \db\PyMongoDataServer\PySysDB tagAppointItem ID 定制物品表
+V.vip特权表 \Config VipPrivilege \db\PyMongoDataServer\PySysDB tagVipPrivilege VIPPrivilege VIP特权表
+V.VIP杀怪加攻击表 \Config VIPKillNPC \db\PyMongoDataServer\PySysDB tagVIPKillNPC KillLV VIP杀怪加攻击表
+S.商城 \Config Store \db\PyMongoDataServer\PySysDB tagStore ID 商城
+S.世界BOSS表 \Config WorldBoss NPCID 世界boss表
+B.Boss之家 \Config BossHome NPCID Boss之家表
+B.Boss信息 \Config BossInfo \db\PyMongoDataServer\PySysDB tagBOSSInfo NPCID Boss刷新信息
+G.个人BOSS \Config PersonalBoss \db\PyMongoDataServer\PySysDB tagPersonalBoss NPCID 个人boss表
+G.古神禁地 \Config ElderGodArea \db\PyMongoDataServer\PySysDB tagElderGodArea NPCID 古神禁地表
+F.法宝铸炼表 \Config TreasureRefine \db\PyMongoDataServer\PySysDB tagTreasureRefine - 法宝铸炼表
+L.炼丹炉等级表 \Config RefineStove \db\PyMongoDataServer\PySysDB tagRefineStove - 炼丹炉等级表
+L.炼丹表 \Config Alchemy \db\PyMongoDataServer\PySysDB tagAlchemy - 炼丹表
+L.炼丹表特殊产出表 \Config AlchemySpec \db\PyMongoDataServer\PySysDB tagAlchemySpec - 炼丹表特殊产出表
+Y.宴会题库表 \Config QuestionBank - tagQuestionBank id 宴会题库表
+X.仙盟活跃表 \Config UnionLiven \db\PyMongoDataServer\PySysDB tagFamilyActivity ID 仙盟活跃表
+B.BOSS秀 \Config ActorShow \db\PyMongoDataServer\PySysDB tagNPCShow - Boss秀
+H.红包表 \Config RedPack \db\PyMongoDataServer\PySysDB tagFamilyRedPack ID 仙盟红包表
+G.功能预告表 \Config FunctionForecast \db\PyMongoDataServer\PySysDB tagFunctionForecast ID 功能预告表
+G.GM命令表 \Config GmCmd - - Id GM命令表
+H.获取途径索引表 \Config GetItemWays - - ID 获取途径索引表
+C.查看玩家功能表 \Config ViewRoleFunc - - id 查看玩家功能战力表
+Y.引导表 \Config Guide ID 功能引导
+W.我要变强表 \Config RoleStronger - - id 我要变强表
+H.获取资源表 \Config RoleResource - - id 获取资源表
+N.NPC自言自语表 \Config NPCDialogue - - ID NPC随机瞎BB
+R.任务列表 \Config TaskList - - ID 任务列表
+F.封魔坛BOSS表 \Config DemonJar \db\PyMongoDataServer\PySysDB tagSealDemon NPCID 封魔坛配置表
+J.剧情对话任务表 \Config StoryMissions - - ID 剧情对话任务表
+J.剧情对话 \Config Dialog - - id 剧情对话表
+F.副本鼓舞表 \Config DungeonInspire \db\PyMongoDataServer\PySysDB tagFbEncourage ID 副本鼓舞表
+F.符印合成表 \Config RuneCompose \db\PyMongoDataServer\PySysDB tagRuneCompound TagItemID 符印合成表
+Z.资源找回表 \Config ResourcesBack \db\PyMongoDataServer\PySysDB tagResourcesBack ID 资源找回表
+C.场景阴影配置 \Config SceneShadow 场景阴影表
+G.怪物刷新点表 \Config MonsterRefreshPoint \db\PyMongoDataServer\PySysDB tagMonsterRefreshPoint NPCID 怪物刷新点表
+T.天气效果表 \Config Weather 天气效果表
+G.规则表 \Config Rule ID 规则表
+G.功能开关表 \Config FuncSwitch ID 功能开关表
+S.神兽表 \Config Dogz \db\PyMongoDataServer\PySysDB tagDogz ID 神兽表
+S.神兽强化表 \Config DogzEquipPlus \db\PyMongoDataServer\PySysDB tagDogzEquipPlus id 神兽强化表
+F.副本组队目标表 \Config TeamTarget 副本组队目标表
+Q.全民冲榜排行奖励表 \Config OSCBillRankAward \db\PyMongoDataServer\PySysDB tagOSCBillRankAward - 全民冲榜排行奖励表
+Q.全民冲榜达成奖励表 \Config OSCBillTagAward \db\PyMongoDataServer\PySysDB tagOSCBillTagAward - 全民冲榜达成奖励表
+Q.七天登陆奖励 \Config InSevenDays \db\PyMongoDataServer\PySysDB tagLoginDayAward RewardID 七天登入奖励
+Q.七天在线奖励 \Config OnlineAward \db\PyMongoDataServer\PySysDB tagOnlineAward RewardID 七天在线奖励
+Q.七天限时特惠表 \Config SpringSale \db\PyMongoDataServer\PySysDB tagSpringSale GiftID 七天限时特惠
+D.等级礼包表 \Config LVAawrd \db\PyMongoDataServer\PySysDB tagLVAward RewardID 等级礼包表
+T.投资表 \Config Invest \db\PyMongoDataServer\PySysDB tagInvest id 投资表
+T.套装特效表 \Config SuitEffect - - ID 套装特效
+L.Loading提示表 \Config LoadingTip 场景切换提示表
+X.仙魔成就表 \Config XMZZAchievement - - ID 仙魔成就表
+X.寻宝产出库表 \Config XBGetItem \db\PyMongoDataServer\PySysDB tagTreasureHouse ID 寻宝产出库表
+K.开服红包成就表 \Config OSRedAchieve - - id 开服红包成就表
+X.仙宝寻主表 \Config TreasureFindHost \db\PyMongoDataServer\PySysDB tagXBXZ ID 仙宝寻主表
+F.法宝升级表 \Config TreasureUp \db\PyMongoDataServer\PySysDB tagTreasureUp ID 法宝升级表
+F.法宝特权表 \Config TreasurePrivilege \db\PyMongoDataServer\PySysDB tagTreasurePrivilege PrivilegeID 法宝特权表
+L.loading界面功能展示 \Config LoadingFunction ID loading界面功能展示表
+D.登录广告表 \Config LoginAd - - id 登录广告表
+S.双倍经验活动表 \Config - \db\PyMongoDataServer\PySysDB tagActExpRate CfgID 双倍经验活动表
+X.消费返利活动表 \Config - \db\PyMongoDataServer\PySysDB tagActCostRebate CfgID 消费返利活动表
+X.消费返利模板表 \Config - \db\PyMongoDataServer\PySysDB tagCostRebateTemplate - 消费返利模板表
+X.限时特惠表 \Config - \db\PyMongoDataServer\PySysDB tagActSpringSale - 限时特惠表
+X.限时礼包表 \Config - \db\PyMongoDataServer\PySysDB tagActFlashGiftbag - 限时礼包表
+X.限时礼包模板表 \Config - \db\PyMongoDataServer\PySysDB tagFlashGiftbag - 限时礼包模板表
+J.极品白拿表 \Config FreeGoods \db\PyMongoDataServer\PySysDB tagFreeGoods ID 极品白拿表
+B.Boss复活 \Config BossReborn - - Id Boss复活
+B.Boss复活模板表 \Config - \db\PyMongoDataServer\PySysDB tagBossReborn - Boss复活模板表
+B.BOSS复活活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActBossReborn CfgID BOSS复活活动时间表
+X.仙界盛典活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActFairyCeremony CfgID 仙界盛典活动时间表
+X.仙界盛典-绝版降临表 \Config UniquenessArrive \db\PyMongoDataServer\PySysDB tagUniquenessArrive ID 绝版降临表
+X.仙界盛典-全民来嗨 \Config AllPeopleParty \db\PyMongoDataServer\PySysDB tagAllPeopleParty ID 全民来嗨
+X.仙界盛典-全民来嗨奖励 \Config AllPeoplePartyAward \db\PyMongoDataServer\PySysDB tagAllPeoplePartyAward ID 全民来嗨奖励
+T.天赋表 \Config Talent \db\PyMongoDataServer\PySysDB tagTalentSkill SkillId 天赋表
+K.空中楼宇 \Config AerialBuilding - - Id 空中楼宇
+K.跨服竞技场段位表 \Config CrossServerArena \db\PyMongoDataServer\PySysDB tagCrossRealmPKDan DanLV 跨服竞技场段位表
+K.跨服竞技场段位奖励表 \Config CrossRealmPKDanAward \db\PyMongoDataServer\PySysDB tagCrossRealmPKDanAward CrossZoneName|SeasonID|DanLV 跨服竞技场段位奖励表
+K.跨服竞技场排名奖励表 \Config CrossRealmPKOrderAward \db\PyMongoDataServer\PySysDB tagCrossRealmPKOrderAward CrossZoneName|SeasonID 跨服竞技场排名奖励表
+K.跨服竞技场赛季表 \Config - \db\PyMongoDataServer\PySysDB tagCrossRealmPKSeason CrossZoneName|ZoneID|SeasonID 跨服竞技场赛季表
+K.跨服分区表竞技场 \Config - \db\PyMongoDataServer\PySysDB tagCrossZonePK CrossZoneName|ZoneID 跨服分区表竞技场
+K.跨服分区表通用 \Config - \db\PyMongoDataServer\PySysDB tagCrossZoneComm CrossZoneName|ZoneID 跨服分区表通用
+K.跨服Boss蓬莱仙境分区地图表 \Config - \db\PyMongoDataServer\PySysDB tagCrossPenglaiZoneMap ZoneID 跨服Boss蓬莱仙境分区地图表
+D.多倍修行点活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActRealmPoint ID 多倍修行点活动时间表
+Z.宗门试炼兑换表 \Config TrialExchange \db\PyMongoDataServer\PySysDB tagTrialExchange id 宗门试炼兑换表
+S.神兽副本 \Config DogzDungeon NPCID 神兽副本表
+Z.宗门试炼奖励表 \Config TrialRewards - - id 宗门试炼奖励表
+P.玩家名屏蔽词 \Config DirtyName \CoreServerGroup\GameServer\GameServerConfig\DirtyList DirtyName id 玩家名屏蔽词
+W.娲皇遗迹副本奖励预览表 \Config WHYJReward - - ID 娲皇遗迹副本奖励预览表
+X.限时抢购表 \Config - \db\PyMongoDataServer\PySysDB tagActFlashSale CfgID 限时抢购表
+X.许愿池活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActWishingWell CfgID 许愿池活动时间表
+X.许愿池库模板表 \Config - \db\PyMongoDataServer\PySysDB tagWishingWell - 许愿池库模板表
+X.小助手功能表 \Config Secretary - - ID 小助手功能表
+L.累计充值活动表 \Config - \db\PyMongoDataServer\PySysDB tagActTotalRecharge CfgID 累计充值活动表
+L.累计充值模板表 \Config - \db\PyMongoDataServer\PySysDB tagTotalRechargeTemplate - 累计充值模板表
+S.守护表 \Config Guard - - id 守护表
+M.魔族法宝副本表 \Config TreasureDungeon \db\PyMongoDataServer\PySysDB tagMagicWeaponFB - 魔族法宝副本表
+B.冰晶矿脉星级奖励表 \Config IceLodeStarAward \db\PyMongoDataServer\PySysDB tagIceLodeStarAward - 冰晶矿脉星级奖励表
+L.Loading图 \Config LoadingBackGround 切图背景图
+R.任务战力表 \Config TaskPower 任务战力表
+S.神兵特效表 \Config GodWeaponEffect \db\PyMongoDataServer\PySysDB tagGodWeaponEffect - 神兵特效表
+F.分包 \Config priorbundle 分包资源
+D.断线提示 \Config KickOutReason 断线提示
+J.进入游戏前的提示 \Config PriorLanguage 进入游戏前的提示
+S.上古战场随机名字 \Config AncientRobotName id 上古战场机器人名字
+J.聚魂属性表 \Config GatherSoulProperty \db\PyMongoDataServer\PySysDB tagGatherSoulAttr AttrType 聚魂属性表
+J.聚魂表 \Config GatherSoul \db\PyMongoDataServer\PySysDB tagGatherSoul ID 聚魂表
+J.聚魂合成表 \Config GatherSoulCompose \db\PyMongoDataServer\PySysDB tagGatherSoulCompound TagItemID 聚魂合成表
+F.法宝王者法宝表 \Config KingTreasure \db\PyMongoDataServer\PySysDB tagMagicWeaponOfKing ID 法宝王者法宝表
+W.王者法宝物品表 \Config KingTreasureItem - - itemId 王者法宝物品表
+K.跨服Boss表 \Config CrossServerBoss NPCID 跨服boss表
+S.时装表 \Config FashionDress \db\PyMongoDataServer\PySysDB tagCoat CoatID 时装表
+S.时装柜升级表 \Config FashionDressCabinet \db\PyMongoDataServer\PySysDB tagCoatChestUp LV 时装柜升级表
+Z.周狂欢表 \Config WeekParty - - Id 周狂欢表
+Z.周狂欢模板表 \Config - \db\PyMongoDataServer\PySysDB tagWeekParty - 周狂欢模板表
+Z.周狂欢时间表 \Config - \db\PyMongoDataServer\PySysDB tagActWeekParty - 周狂欢时间表
+Z.周狂欢积分奖励表 \Config WeekPartyPoint - - Id 周狂欢积分奖励表
+C.场景资源替换 \Config SceneReplace id 场景资源替换表
+D.登录奖励模板表 \Config - \db\PyMongoDataServer\PySysDB tagLoginAward - 登录奖励模板表
+D.登录奖励时间表 \Config - \db\PyMongoDataServer\PySysDB tagActLoginAward - 登录奖励时间表
+Z.诛仙装备套装属性表 \Config - \db\PyMongoDataServer\PySysDB tagZhuXianSuitAttr id 诛仙装备套装属性表
+Z.诛仙BOSS表 \Config JadeDynastyBoss \db\PyMongoDataServer\PySysDB tagZhuXianBoss NPCID 诛仙Boss表
+Z.诛仙塔表 \Config JadeDynastyTower \db\PyMongoDataServer\PySysDB tagZhuXianTower floorId 诛仙塔表
+J.技能帧动画表 \Config SkillFrameAnimation - - skillTypeId 技能帧动画表
+Z.诛仙装备分解表 \Config - \db\PyMongoDataServer\PySysDB tagZhuXianEquipDecompose - 诛仙装备分解表
+J.节日巡礼模板表 \Config - \db\PyMongoDataServer\PySysDB tagFeastWeekParty - 节日巡礼模板表
+J.节日巡礼时间表 \Config - \db\PyMongoDataServer\PySysDB tagActFeastWeekParty - 节日巡礼时间表
+J.节日红包时间表 \Config FestivalRedpack \db\PyMongoDataServer\PySysDB tagActFeastRedPacket - 节日红包时间表
+J.节日红包每日成就表 \Config FestivalRedpackTask \db\PyMongoDataServer\PySysDB tagActFeastRedPacketSucc id 节日红包每日成就表
+X.新仙界盛典活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActNewFairyCeremony CfgID 新仙界盛典活动时间表
+X.新仙界盛典-绝版降临表 \Config NewUniquenessArrive \db\PyMongoDataServer\PySysDB tagNewUniquenessArrive ID 绝版降临表
+X.新仙界盛典-全民来嗨 \Config NewAllPeopleParty \db\PyMongoDataServer\PySysDB tagNewAllPeopleParty ID 全民来嗨
+X.新仙界盛典-全民来嗨奖励 \Config NewAllPeoplePartyAward \db\PyMongoDataServer\PySysDB tagNewAllPeoplePartyAward ID 全民来嗨奖励
+J.节日巡礼表 \Config HolidayHoming - - Id 节日巡礼表
+J.节日巡礼积分奖励表 \Config HolidayHomingPoint - - Id 节日巡礼积分奖励表
+Z.诛仙宝石共鸣属性表 \Config JadeDynastyStoneAttr \db\PyMongoDataServer\PySysDB tagZhuXianStoneAttr id 诛仙宝石共鸣属性表
+J.集字活动表 \Config Character - - Id 集字活动表
+X.幸运鉴宝活动时间表 \Config - \db\PyMongoDataServer\PySysDB tagActLuckyTreasure - 幸运鉴宝活动时间表
+X.幸运鉴宝库模板表 \Config - \db\PyMongoDataServer\PySysDB tagLuckyTreasureTemplate - 幸运鉴宝库模板表
+K.跨服竞技场机器人装备 \Config CrossServerOneVsOneRobot id 跨服竞技场机器人装备
+D.登录奖励表 \Config LoginReward - - Id 登录奖励表
+S.神秘商店表 \Config - \db\PyMongoDataServer\PySysDB tagMysteryShop - 神秘商店表
+P.拍卖行表 \Config Auction - - Id 拍卖行表
+Z.装备位背包索引映射表 \Config EquipPlaceMap \db\PyMongoDataServer\PySysDB tagEquipPlaceIndexMap PackIndex 装备位背包索引映射表
+Z.装备总表 \Config EquipControl - - id 装备总表
+Z.装备传奇属性等级数值表 \Config LegendPropertyValue \db\PyMongoDataServer\PySysDB tagEquipLegendAttrValue ItemType|ItemClassLV|ItemColor|IsSuit|id 装备传奇属性等级数值表
+Z.装备传奇属性类型表 \Config - \db\PyMongoDataServer\PySysDB tagEquipLegendAttrType ItemType 装备传奇属性类型表
+Z.装备传奇属性条数表 \Config - \db\PyMongoDataServer\PySysDB tagEquipLegendAttrCount ItemType|ItemColor|IsSuit 装备传奇属性条数表
+Z.装备传奇属性值库表 \Config LegendProperty \db\PyMongoDataServer\PySysDB tagEquipLegendAttrLib id 装备传奇属性值库表
+Z.装备升星表 \Config EquipStar \db\PyMongoDataServer\PySysDB tagEquipStarUp ID 装备升星表
+Z.装备强化进化表 \Config EquipPlusEvolve \db\PyMongoDataServer\PySysDB tagEquipPlusEvolve ID 装备强化进化表
+P.拍卖行索引表 \Config AuctionIndex - - Id 拍卖行表索引表
+X.仙盟Boss奖励表 \Config - \db\PyMongoDataServer\PySysDB tagFamilyBossAward ID 仙盟Boss奖励表
+Z.装备洗练等级上限 \Config WashLevelMax \db\PyMongoDataServer\PySysDB tagItemWashMax id 装备洗练等级上限
+Q.骑宠Boss奖励表 \Config - \db\PyMongoDataServer\PySysDB tagHorsePetBossAward - 骑宠Boss奖励表
+L.灵根表 \Config ReikiRoot \db\PyMongoDataServer\PySysDB tagRolePoint id 灵根表
+P.缥缈仙域表 \Config HazyRegion \db\PyMongoDataServer\PySysDB tagFairyDomain id 缥缈仙域表
+P.缥缈奇遇表 \Config - \db\PyMongoDataServer\PySysDB tagFairyAdventures ID 缥缈奇遇表
+P.缥缈奇遇对话表 \Config AdventureDialogue - - id 缥缈仙域对话表
+P.缥缈仙域定制奖励表 \Config - \db\PyMongoDataServer\PySysDB tagFairyDomainAppoint ID 缥缈仙域定制奖励表
+L.炼丹数量表 \Config AlchemyCount \db\PyMongoDataServer\PySysDB tagAlchemyResult ID 炼丹数量表
+F.副本Buff表 \Config DungeonUseBuff \db\PyMongoDataServer\PySysDB tagFBBuyBuff ID 副本Buff表
+F.法宝章节任务表 \Config TreasureChapter - - id 法宝章节表
+T.天星塔表 \Config SkyTower \db\PyMongoDataServer\PySysDB tagSkyTower floorId 天星塔表
+R.任务反馈表 \Config TaskFeedback - - taskId 任务反馈表
+R.任务反馈功能表 \Config TaskFeedbackFunc - - id 任务反馈功能表
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config.ini" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config.ini"
new file mode 100644
index 0000000..dcdf669
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config.ini"
@@ -0,0 +1,10 @@
+[config]
+
+; 客户端项目根路径
+ClientRootPath = D:\ProjS1\Assets\ResourcesOut\Refdata
+
+; 服务端项目根路径
+ServerRootPath = D:\Server
+
+; 后端特殊文件编码 {"编码":"文件名|文件名|..."}
+EncodingSpec = {"utf8":"P.屏蔽词|P.玩家名屏蔽词"}
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config2.ini" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config2.ini"
new file mode 100644
index 0000000..a6bb26f
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/config2.ini"
@@ -0,0 +1,14 @@
+[config]
+
+; 客户端项目根路径
+ClientRootPath = E:\Snxxz_Client\Assets\ResourcesOut\Refdata
+ClientRootPath1 = E:\Snxxz_Client2\Assets\ResourcesOut\Refdata
+
+; 服务端项目根路径
+ServerRootPath = E:\snxx_server
+;ServerRootPath1 = X:\SNServer
+ServerRootPath1 = X:\snxx_server
+ServerRootPath2 = Y:\snxx_server
+
+; 后端特殊文件编码 {"编码":"文件名|文件名|..."}
+EncodingSpec = {"utf8":"P.屏蔽词|"}
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/gamecfg_export.py" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/gamecfg_export.py"
new file mode 100644
index 0000000..06e74ea
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/gamecfg_export.py"
@@ -0,0 +1,513 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Code.gamecfg_export
+#
+# @todo:游戏客户端服务端配置文件导出
+# @author hxp
+# @date 2017-07-19
+# @version 1.0
+#
+# 详细描述: 根据策划配置的母表格导出客户端服务端程序使用的配置文件
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2017-07-19 12:00"""
+#-------------------------------------------------------------------------------
+
+import ctypes
+import ConfigParser
+import xlrd
+import sys
+import os
+
+####################################################################################################
+
+STD_INPUT_HANDLE = -10
+STD_OUTPUT_HANDLE = -11
+STD_ERROR_HANDLE = -12
+
+# 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色
+#由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中
+
+# Windows CMD命令行 字体颜色定义 text colors
+FOREGROUND_BLACK = 0x00 # black.
+FOREGROUND_DARKBLUE = 0x01 # dark blue.
+FOREGROUND_DARKGREEN = 0x02 # dark green.
+FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
+FOREGROUND_DARKRED = 0x04 # dark red.
+FOREGROUND_DARKPINK = 0x05 # dark pink.
+FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
+FOREGROUND_DARKWHITE = 0x07 # dark white.
+FOREGROUND_DARKGRAY = 0x08 # dark gray.
+FOREGROUND_BLUE = 0x09 # blue.
+FOREGROUND_GREEN = 0x0a # green.
+FOREGROUND_SKYBLUE = 0x0b # skyblue.
+FOREGROUND_RED = 0x0c # red.
+FOREGROUND_PINK = 0x0d # pink.
+FOREGROUND_YELLOW = 0x0e # yellow.
+FOREGROUND_WHITE = 0x0f # white.
+
+# Windows CMD命令行 背景颜色定义 background colors
+BACKGROUND_BLUE = 0x10 # dark blue.
+BACKGROUND_GREEN = 0x20 # dark green.
+BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
+BACKGROUND_DARKRED = 0x40 # dark red.
+BACKGROUND_DARKPINK = 0x50 # dark pink.
+BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
+BACKGROUND_DARKWHITE = 0x70 # dark white.
+BACKGROUND_DARKGRAY = 0x80 # dark gray.
+BACKGROUND_BLUE = 0x90 # blue.
+BACKGROUND_GREEN = 0xa0 # green.
+BACKGROUND_SKYBLUE = 0xb0 # skyblue.
+BACKGROUND_RED = 0xc0 # red.
+BACKGROUND_PINK = 0xd0 # pink.
+BACKGROUND_YELLOW = 0xe0 # yellow.
+BACKGROUND_WHITE = 0xf0 # white.
+
+# get handle
+std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
+
+def set_cmd_text_color(color, handle=std_out_handle):
+ Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
+ return Bool
+
+#reset white
+def resetColor():
+ set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
+ return
+
+#暗红色
+#dark red
+def printDarkRed(mess):
+ set_cmd_text_color(FOREGROUND_DARKRED)
+ sys.stdout.write(mess)
+ resetColor()
+ return
+
+#红色
+#red
+def printRed(mess, newLine=True):
+ set_cmd_text_color(FOREGROUND_RED)
+ sys.stdout.write(mess)
+ if newLine:
+ sys.stdout.write("\n")
+ resetColor()
+ return
+
+####################################################################################################
+
+cfg = ConfigParser.ConfigParser()
+if os.path.exists("config2.ini"):
+ cfg.read("config2.ini")
+else:
+ cfg.read("config.ini")
+ClientRootPath = cfg.get("config", "ClientRootPath")
+ServerRootPath = cfg.get("config", "ServerRootPath")
+
+print "ClientRootPath: %s" % ClientRootPath
+print "ServerRootPath: %s" % ServerRootPath
+
+ClientRootPathList = [ClientRootPath]
+for i in xrange(1, 6):
+ if not cfg.has_option("config", "ClientRootPath%s" % i):
+ break
+ ClientRootPathEx = cfg.get("config", "ClientRootPath%s" % i)
+ ClientRootPathList.append(ClientRootPathEx)
+
+ServerRootPathList = [ServerRootPath]
+for i in xrange(1, 6):
+ if not cfg.has_option("config", "ServerRootPath%s" % i):
+ break
+ serverRootPathEx = cfg.get("config", "ServerRootPath%s" % i)
+ ServerRootPathList.append(serverRootPathEx)
+if len(ServerRootPathList) > 1:
+ print "ServerRootPathList: %s" % ServerRootPathList
+
+ExportSign = ["C", "G", "S", "M", ""]
+def GetExportSign(value):
+ exportSign = ""
+ upperSign = value.upper().replace(" ", "")
+ for s in upperSign:
+ if s not in ExportSign or s in exportSign:
+ return None
+ exportSign += s
+ return upperSign
+
+Encoding = "gbk"
+EncodingSpec = eval(cfg.get("config", "EncodingSpec"))
+
+def DoExportCfgFile(fileName, exportInfo):
+ encoding = Encoding
+ for e, f in EncodingSpec.items():
+ if fileName in f:
+ encoding = e
+ break
+ sys.setdefaultencoding(encoding)
+ print "----------------------------"
+ filePath = exportInfo[0]
+ clientPath = exportInfo[1]
+ clientFileName = exportInfo[2]
+ serverPath = exportInfo[3]
+ serverFileName = exportInfo[4]
+ pkInfo = exportInfo[5]
+
+ exportContent = __GetFileExportContent(filePath, pkInfo)
+ if not exportContent:
+ return
+ gServerCfg, mServerCfg, serverCfg, clientCfg = exportContent
+
+ if not gServerCfg and not mServerCfg and not serverCfg and not clientCfg:
+ printRed("配置文件无效!%s" % (filePath))
+ return
+
+ print "开始导表: %s" % filePath
+ # unicode中的‘\xa0’字符在转换成gbk编码时会出现问题,gbk无法转换'\xa0'字符
+ # 所以,在转换的时候必需进行一些前置动作 string.replace(u'\xa0', u' ')
+ if gServerCfg:
+ for ServerRootPath in ServerRootPathList:
+ gServerCfgName = ServerRootPath + "\CoreServerGroup\GameServer\PySysDB" + "\%s.txt" % serverFileName
+ fp = open(gServerCfgName, "w")
+ for c in gServerCfg:
+ fp.write("%s\n" % (c.replace(u'\xa0', u' ')))
+ fp.close()
+ print "导出GameServer: %s" % gServerCfgName
+
+ if mServerCfg:
+ for ServerRootPath in ServerRootPathList:
+ mServerCfgName = ServerRootPath + "\db\PyMongoDataServer\PySysDB" + "\%s.txt" % serverFileName
+ fp = open(mServerCfgName, "w")
+ for c in mServerCfg:
+ fp.write("%s\n" % (c.replace(u'\xa0', u' ')))
+ fp.close()
+ print "导出MapServer: %s" % mServerCfgName
+
+ if serverCfg:
+ for ServerRootPath in ServerRootPathList:
+ serverCfgName = ServerRootPath + serverPath + "\%s.txt" % serverFileName
+ fp = open(serverCfgName, "w")
+ for c in serverCfg:
+ fp.write("%s\n" % (c.replace(u'\xa0', u' ')))
+ fp.close()
+ print "导出服务端: %s" % serverCfgName
+
+ if clientCfg:
+ for ClientRootPath in ClientRootPathList:
+ sys.setdefaultencoding("utf8") # 前端默认编码
+ clientCfgName = ClientRootPath + clientPath + "\%s.txt" % clientFileName
+ fp = open(clientCfgName, "w")
+ for c in clientCfg:
+ fp.write("%s\n" % (c.replace(u'\xa0', u' ')))
+ fp.close()
+ print "导出客户端: %s" % clientCfgName
+
+ return True
+
+def __GetFileExportContent(filePath, pkInfo):
+ gServerCfg = []
+ mServerCfg = []
+ serverCfg = []
+ clientCfg = []
+ gServerCfgColList = [] # gameServer服务端配置所需要的列索引列表
+ mServerCfgColList = [] # mapServer服务端配置所需要的列索引列表 - 额外的
+ serverCfgColList = [] # 服务端配置所需要的列索引列表
+ clientCfgColList = [] # 客户端配置所需要的列索引列表
+ gServerCfgRowList = [] # gameServer服务端配置所需要的行索引列表
+ mServerCfgRowList = [] # mapServer服务端配置所需要的行索引列表 - 额外的
+ serverCfgRowList = [] # 服务端配置所需要的行索引列表
+ clientCfgRowList = [] # 客户端配置所需要的行索引列表
+
+ data = xlrd.open_workbook(filePath)
+ table = data.sheet_by_index(0) # 默认只解析第一张工作表
+ nrows = table.nrows # 行数
+ ncols = table.ncols # 列数
+ if not nrows or not ncols:
+ printRed("配置文件无数据!%s" % (filePath))
+ return
+
+ # 找出需要导出的列, SC配置需要做精确匹配
+ firstRowValuesList = table.row_values(0) # 第一行
+ for col, value in enumerate(firstRowValuesList):
+ if not (isinstance(value, unicode) or isinstance(value, str)):
+ continue
+ upperValue = GetExportSign(value)
+ if upperValue == None:
+ continue
+ if "G" in upperValue:
+ gServerCfgColList.append(col)
+ if "M" in upperValue:
+ mServerCfgColList.append(col)
+ if "S" in upperValue:
+ serverCfgColList.append(col)
+ if "C" in upperValue:
+ clientCfgColList.append(col)
+
+ # 找出需要导出的行, SC配置需要做精确匹配
+ firstColValuesList = table.col_values(0) # 第一列
+ for row, value in enumerate(firstColValuesList):
+ if not (isinstance(value, unicode) or isinstance(value, str)):
+ continue
+ upperValue = GetExportSign(value)
+ if upperValue == None:
+ continue
+ if "G" in upperValue:
+ gServerCfgRowList.append(row)
+ if "M" in upperValue:
+ mServerCfgRowList.append(row)
+ if "S" in upperValue:
+ serverCfgRowList.append(row)
+ if "C" in upperValue:
+ clientCfgRowList.append(row)
+
+ # 最多只导一列的,这种表第一列为导出行配置
+ if ncols > 1 and (not gServerCfgColList or gServerCfgColList == [0]) and (not mServerCfgColList or mServerCfgColList == [0]) \
+ and (not serverCfgColList or serverCfgColList == [0]) and (not clientCfgColList or clientCfgColList == [0]):
+ gServerCfgColList = []
+ mServerCfgColList = []
+ serverCfgColList = []
+ clientCfgColList = []
+
+ # 最多只导一行的,这种表第一行为导出列配置
+ if (not gServerCfgRowList or gServerCfgRowList == [0]) and (not mServerCfgRowList or mServerCfgRowList == [0]) \
+ and (not serverCfgRowList or serverCfgRowList == [0]) and (not clientCfgRowList or clientCfgRowList == [0]):
+ gServerCfgRowList = []
+ mServerCfgRowList = []
+ serverCfgRowList = []
+ clientCfgRowList = []
+
+ # 1-第一行为导出SC配置;2-第一列为导出SC配置;3-第一行列均为导出SC配置
+ if (gServerCfgColList or mServerCfgColList or serverCfgColList or clientCfgColList) \
+ and (gServerCfgRowList or mServerCfgRowList or serverCfgRowList or clientCfgRowList):
+ exportType = 3 # 行列导出,首行首列为导出配置
+ elif gServerCfgColList or mServerCfgColList or serverCfgColList or clientCfgColList:
+ exportType = 1 # 按列导出,首行为导出配置
+ elif gServerCfgRowList or mServerCfgRowList or serverCfgRowList or clientCfgRowList:
+ exportType = 2 # 按行导出,首列为导出配置
+ # 当仅首列为SC配置时,导出的列为除了首列外的全部
+ gServerCfgColList = range(1, ncols)
+ mServerCfgColList = range(1, ncols)
+ serverCfgColList = range(1, ncols)
+ clientCfgColList = range(1, ncols)
+ else:
+ printRed('文件导出客户端服务端SC配置错误!仅可以设定%s中的一种或多种组合!' % ExportSign)
+ return
+
+ isFirstRowSC = exportType in [1, 3] # 首行是否SC导出配置
+
+ cfgKeyList = [] # 所有配置数据的主键key列表, 用于判断是否重复key
+ pkFormat = ""
+ pkColList = [] # 主键组合字段列索引
+ pkList = pkInfo.split("|")
+ for i, pk in enumerate(pkList):
+ pkList[i] = pk.upper()
+ # 字段名行
+ fieldRow = 2 if isFirstRowSC else 1
+ fieldRowValuesList = table.row_values(fieldRow) # 字段名行
+ for col, value in enumerate(fieldRowValuesList):
+ if value.upper() in pkList:
+ pkColList.append(col)
+ pkFormat += "%s=%%s, " % value
+
+ # 当行为SC配置时, 服务端特殊行编号1,3行不导; 列为SC配置时,由列直接配上去, 这里就不再做处理
+ serverIgnoreRow = [1, 3] if isFirstRowSC else [] # gameServer通用
+
+ gServerFormat = "%s" + "\t%s"*(len(gServerCfgColList) - 1)
+ mServerFormat = "%s" + "\t%s"*(len(mServerCfgColList) - 1)
+ serverFormat = "%s" + "\t%s"*(len(serverCfgColList) - 1)
+ clientFormat = "%s" + "\t%s"*(len(clientCfgColList) - 1)
+
+ for row in xrange(nrows):
+ # 首行为SC配置时不导
+ if row == 0 and isFirstRowSC:
+ continue
+
+ rowValuesList = table.row_values(row)
+ # 浮点型转为int
+ for i, v in enumerate(rowValuesList):
+ if type(v) != float:
+ continue
+ intV = int(v)
+ if intV == v:
+ rowValuesList[i] = intV
+
+ isAdd = False
+ if (exportType == 1 or row in gServerCfgRowList) and row not in serverIgnoreRow and gServerCfgColList:
+ isAdd = True
+ gServerCfg.append(gServerFormat % tuple([rowValuesList[i] for i in gServerCfgColList]))
+
+ if (exportType == 1 or row in mServerCfgRowList) and row not in serverIgnoreRow and mServerCfgColList:
+ isAdd = True
+ mServerCfg.append(mServerFormat % tuple([rowValuesList[i] for i in mServerCfgColList]))
+
+ if (exportType == 1 or row in serverCfgRowList) and row not in serverIgnoreRow and serverCfgColList:
+ isAdd = True
+ serverCfg.append(serverFormat % tuple([rowValuesList[i] for i in serverCfgColList]))
+
+ if (exportType == 1 or row in clientCfgRowList) and clientCfgColList:
+ isAdd = True
+ # 替换导出到客户端用的公式运算符
+ for col, cfgStr in enumerate(rowValuesList):
+ cfgFormula = __RepalceClientCfgFormula(cfgStr)
+ if cfgFormula is None:
+ printRed("替换公式失败!第%s行,第%s列。" % (row + 1, col + 1))
+ return
+ rowValuesList[col] = cfgFormula
+ clientCfg.append(clientFormat % tuple([rowValuesList[i] for i in clientCfgColList]))
+
+ if isAdd and pkColList:
+ cfgKey = pkFormat % tuple([rowValuesList[pkCol] for pkCol in pkColList])
+ if cfgKey in cfgKeyList:
+ printRed("%s Key重复:%s, 第%s行。" % (filePath, cfgKey, row + 1))
+ return
+ cfgKeyList.append(cfgKey)
+
+ return gServerCfg, mServerCfg, serverCfg, clientCfg
+
+def __RepalceClientCfgFormula(formula):
+ # 替换导出到客户端用的公式, 只做运算符替换即可
+ if type(formula) not in [str, unicode]:
+ return formula
+ if "(" not in formula and ")" not in formula:
+ return formula
+ if u"(" in formula or u")" in formula:
+ printRed("公式中请使用英文括号: %s" % formula)
+ return
+ #print "初始: len=%s, %s" % (len(formula), formula)
+ formula = formula.replace(" ", "")
+ formula = formula.replace("random.random()", "(0;1)")
+ start = 0
+ doCnt = 0
+ while doCnt < 1000:
+ doCnt += 1
+ #print " %s, %s" % (start, formula)
+ right = formula.find(")", start)
+ if right == -1:
+ if "min(" in formula or "max(" in formula or "math.ceil(" in formula or "int(" in formula \
+ or "math.sqrt(" in formula or "pow(" in formula or "random.randint(" in formula:
+ start = 0 # 从头开始
+ continue
+ else:
+ #print "没有可替换的运算符了"
+ break
+
+ f = None
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "min(", 2, "{<[%s!%s]>}")
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "max(", 2, "{<[%s@%s]>}")
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "random.randint(", 2, "{<[%s~%s]>}") # 需在int之前处理
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "int(", 1, "{<[%s#]>}")
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "math.ceil(", 1, "{<[%s$]>}")
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "math.sqrt(", 1, "{<[%s&]>}")
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "pow(", 2, "{<[%s^%s]>}")
+
+ # 都找不到匹配的函数情况下,就是纯粹的()括起来加强运算优先级的,先替换为{<[]>},之后再统一换回去
+ if f == None:
+ f = __DoReplacePyFunc(formula, right, "(", 1, "{<[%s]>}")
+
+ if f != None:
+ formula = f
+ start = right + 1
+ if doCnt >= 1000:
+ printRed("替换公式执行次数异常: %s" % formula)
+ return
+
+ formula = formula.replace("{<[", "(")
+ formula = formula.replace("]>}", ")")
+ #print "替换结果: %s" % formula
+ return formula
+
+def __DoReplacePyFunc(formula, right, funcStr, funcParamCnt, replaceStr):
+ ## 替换py运算函数为客户端可用格式
+ left = formula.rfind(funcStr, 0, right) # 从后往前找出第一个匹配的函数
+ if left == -1:
+ return
+ pyFuncStr = formula[left:right + 1]
+ paramStr = pyFuncStr[len(funcStr):-1]
+ if "(" in paramStr or ")" in paramStr:
+ #print " 函数参数内容里有多余括号不处理: %s, %s" % (pyFuncStr, paramStr)
+ return
+
+ # 没有参数的py函数在开始直接精准替换,如 random.random()
+ if funcParamCnt == 2:
+ commaIndex = paramStr.find(",") # 逗号索引
+ return formula.replace(pyFuncStr, replaceStr % (paramStr[:commaIndex], paramStr[commaIndex + 1:]))
+ elif funcParamCnt == 1:
+ return formula.replace(pyFuncStr, replaceStr % paramStr)
+
+ return
+
+def Main():
+ print 'Number of arguments:', len(sys.argv), 'arguments.'
+ # 元素0为自身模块名,不处理,从元素1开始处理
+ reload(sys)
+ sys.setdefaultencoding(Encoding)
+
+ exportDict = {}
+ for filePath in sys.argv[1:]:
+
+ fileBaseName = os.path.basename(filePath) # 文件名,含扩展名
+ fileExtension = os.path.splitext(filePath)[-1] # 扩展名
+ fileName = fileBaseName.replace(fileExtension, "") # 不含扩展名
+
+ # 只处理excel文件
+ if "xls" not in fileExtension:
+ printRed("不处理该文件,暂时只导excel文件!%s" % filePath)
+ continue
+ exportDict[fileName] = filePath
+
+ clientFileNameList = []
+ serverFileNameList = []
+ exportInfoDict = {}
+ exportMapFile = open("TableExportMap.txt", 'r')
+ for line in exportMapFile.readlines():
+ #if not exportDict:
+ # break
+ exportMapInfo = line.split('\t')
+ fileName = exportMapInfo[0]
+ clientFileName = exportMapInfo[2]
+ serverFileName = exportMapInfo[4]
+
+ if clientFileName in clientFileNameList:
+ printRed("导出前端文件名重复!%s -> %s" % (fileName, clientFileName))
+ return
+ if clientFileName and clientFileName != "-":
+ clientFileNameList.append(clientFileName)
+
+ if serverFileName in serverFileNameList:
+ printRed("导出服务端文件名重复!%s -> %s" % (fileName, serverFileName))
+ return
+ if serverFileName and serverFileName != "-":
+ serverFileNameList.append(serverFileName)
+
+ if fileName not in exportDict:
+ continue
+ filePath = exportDict.pop(fileName)
+ exportInfoDict[fileName] = [filePath] + exportMapInfo[1:]
+ exportMapFile.close()
+
+ if exportDict:
+ for filePath in exportDict.values():
+ printRed("请配置配置表导出路径!%s" % filePath)
+ return
+
+ exportCount = 0
+ for fileName, exportInfo in exportInfoDict.items():
+ if not DoExportCfgFile(fileName, exportInfo):
+ printRed("导表失败! %s" % filePath)
+ break
+ exportCount += 1
+
+ print "----------------------------"
+ print "成功导表数: %s" % exportCount
+ print "----------------------------"
+ return
+
+if __name__ == "__main__":
+ Main()
+
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/readme.txt" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/readme.txt"
new file mode 100644
index 0000000..155c24d
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/readme.txt"
@@ -0,0 +1,34 @@
+------------------------------------------------------------------
+本工具使用python开发,所以如果没有安装python的请先安装python
+已安装python的请安装下python解析excel所需要的工具
+详细安装说明及安装所需要的文件请参考文件夹【excel解析安装】
+------------------------------------------------------------------
+
+【配置导表工具使用说明】
+
+1. 修改 config.ini 中的导出到目标项目根路径配置
+
+2. 新增/修改配置导出表对应客户端服务端路径 TableExportMap.txt
+ 新增导出配置时,只要在此文件增加一行记录即可
+ 目前导出的文件名客户端服务端相同
+ 主键字段组合:
+ 如果需要判断key是否重复,可通过配置主键字段组合,多个字段组成唯一主键的通过“|”号隔开
+ 如果不需要判断key是否重复的,则直接配置“-”即可,不含双引号
+
+3. 拖动母表到 “拖动配表到此导出.bat” 等待导出配置完成即可
+
+4. 建议批处理文件在桌面创建个快捷方式,方便拖动批量导表
+
+注:
+·导出的数据内容只能放在excel第一个数据表中
+·行列均支持配置导出的“g” 或 “s” 或 “m” 或 “c”,如果行列均需要配置sc,则表格的第一个单元格需放空,
+ g或G - 该行或列导出到GameServer
+ s或S - 该行或列导出到MapServer
+ m或M - 该行或列导出到MapServer,原SysDB下的表可配置导出M导出到PySysDB下使用python读表
+ c或C - 该行或列导出到Client
+ 不导出该行列则配置放空
+·代表导出到客户端或者服务端的行列中如果为空,则不会导出该行或列
+ 即策划表可添加一些策划自己用的行或列数据,如一些说明之类的内容
+
+【详细配置可参考 “示例表行.xlsx” 等示例配置】
+------------------------------------------------------------------
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\346\213\226\345\212\250\351\205\215\350\241\250\345\210\260\346\255\244\345\257\274\345\207\272.bat" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\346\213\226\345\212\250\351\205\215\350\241\250\345\210\260\346\255\244\345\257\274\345\207\272.bat"
new file mode 100644
index 0000000..2cc89ba
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\346\213\226\345\212\250\351\205\215\350\241\250\345\210\260\346\255\244\345\257\274\345\207\272.bat"
@@ -0,0 +1,10 @@
+cd %~dp0
+@echo off
+setlocal enabledelayedexpansion
+set str=
+for %%i in (%*) do (set str=!str! %%i)
+::echo !str!
+
+python gamecfg_export.py !str!
+
+pause
\ No newline at end of file
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\345\210\227.xlsx" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\345\210\227.xlsx"
new file mode 100644
index 0000000..5ae1fcc
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\345\210\227.xlsx"
Binary files differ
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214.xlsx" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214.xlsx"
new file mode 100644
index 0000000..1fe9c36
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214.xlsx"
Binary files differ
diff --git "a/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214\345\210\227.xlsx" "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214\345\210\227.xlsx"
new file mode 100644
index 0000000..5cb1e19
--- /dev/null
+++ "b/Tool/\351\205\215\347\275\256\345\257\274\350\241\250\345\267\245\345\205\267/\347\244\272\344\276\213\350\241\250\350\241\214\345\210\227.xlsx"
Binary files differ
--
Gitblit v1.8.0