Files

318 lines
33 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""原作模块文档编排;由build_outgame.py传入已校验的原表数据。"""
import re
# 每张原表对应一个可阅读的子功能,描述只采用原表字段可支持的关系。
NOTES = '''tutorial|新手引导步骤|引导类型和漏斗标识区分步骤;等待时长、遮罩和触摸推进字段描述交互,unlockContentKey记录该步关联的功能开放键。
newbieguide|引导目标与奖励|clearStage区分进度条件,moveTab/customTab/moveOpenView描述跳转目标,rewardID/rewardCount记录奖励。
modesortingorder|模式入口排序|按bannerName识别模式入口,以sortingOrder配置显示顺序。
localpush|通知内容|MailType和MailValue区分通知场景,TitleKeys/TextKeys保存可选标题及正文文本键。
communitydata|社区入口|以language区分语言版本,标题、图标与url共同描述社区入口。
permanentkeyremoveschedule|持久标记清理排期|removeDate给出计划日期,targetKeyList列出此次清理涉及的持久标记。
item|道具与资源定义|每种道具以Id/StringId识别。ERewardType和refStringId说明内容类型与引用;isStackable、selectCount和useRandom分别描述堆叠、选择数量及随机使用标记。
itemgroup|道具包内容|itemIds、itemCounts和weights按位置记录道具、数量与权重;sameItem作为独立配置保留,不能省略权重为0的项。
itemsource|资源获取途径|itemID/itemGroup指向目标资源,跳转字段和unlockKey描述获取入口与开放条件。
lobbyticket|局外资源带入映射|ELobbyAsset与EAsset构成大厅资源到使用资源的映射,defaultValue与boostValue是两种效果档。
outgamereward|局外事件奖励|when区分触发场景,itemID、itemCount和prob保存奖励候选及对应数量、概率参数。
equipment|装备身份与槽位|slotNum决定装备槽位,equipType/tagType描述类型与标签,baseStatus和skill/skillValue/extraValue描述属性与技能。isSpecial和isMaterial分别标识特殊装备及材料。
equipmentdata|品质星级与合成要求|level是品质星级阶段索引,与强化等级分开。各阶段由grade/starCount标识,maxUpgradeLevel规定强化上限;合成要求分指定材料等级数量和同品质任意装备数量两类字段。
equipmentdefaultstatdata|装备基础与强化属性|按level和baseStatus读取基础值及强化增量;specialBaseValue/specialUpgradeValue单列特殊装备数值,不与普通值混用。
equipmentugradelevel|装备逐级强化消耗|每个level分别给出needMaterial和needGold。135行逐级成本全部保留,累计成本需先明确起止等级与消费行的对应关系。
equipmenttype|装备类型修正|每种类型记录slotNum及两组correctionStatus/correctionValue,用于区分该类型的属性修正配置。
equipskill|装备技能类型|EEquipSkill是技能枚举,skillDesc和feedbackDesKey是描述引用。具体效果参数需与装备目录中的技能字段共同阅读。
mainequipmentscore|主装备评分档|按level配置score;这里只给出评分档,不把score当作最终战力公式。
slotupgrade|槽位升级|同一slotNum下按level排列。原注释明确needCount描述到下一级的需求,needItemID和needGold列出资源;specialKey/specialValue与upgradeValue分别保存特殊和常规效果。
slotupgradekey|槽位特殊属性|status与mainStatSlot描述属性和主属性槽的对应关系,文字及图标字段负责效果展示。
bonusstatus|永久属性成长|每项EMonoStatus独立配置isPercent、upgradeValue和maxLevel,不同属性不能共用同一个升级增量。
relic|遗物属性与技能|slotNum标识槽位,baseStatus/statusValue/isPercent配置属性,skill/skillValue/extraValue配置技能;isMaterial区分材料条目。
relicdata|遗物品质星级与合成|grade/starCount/level构成成长档,材料需求分materialLevel/materialCount与sameGradeAnyRelicCount。原注释限制带星级材料的使用。
pet|宠物解锁与成长|品质、启用与重复转化字段描述获取状态;needPiece和needGold分别保存成长消耗数组,冷却、伤害及附加属性各有基础与增量字段。needPiece首项在原注释中标为未使用。
petskill|宠物等级技能|petId关联宠物,isUse与skillUnlockLevel描述启用和开放等级;EPetSkill与skillValue/subValues/extraValues共同定义技能参数。
petgrowthdata|宠物成长活动入口|petId标识目标宠物,useItemId/useItemCount描述活动消费,seasonStartDay/seasonDay/seasonEndDay保留活动时间配置。
petgrowthevent|宠物成长事件|eventId/eventKey组织事件,类型、权重、品质和事件参数构成候选;选择结果文本、选择概率及奖励经验分别配置。
petgrowthlevel|宠物成长等级奖励|按eventKey/level记录needXp、repeatMaxCount和奖励,不同成长活动不合并经验需求。
mount|坐骑解锁与基础属性|unlockPiece、unlockDia和unlockProductId记录解锁相关成本;refundItemId/refundItemCount记录溢出返还;基础和成长属性与passiveSkill单列。
mountlevel|坐骑升级材料与收益|level区分成长档,exp原注释指坐骑粉末;isOwnEffect区分持有效果,四个品质值字段按品质读取。
mountawaken|坐骑觉醒|按grade/level配置piece,isOwnEffect区分效果类别;两组属性及三个被动技能等级描述本档效果。
mountskilldesc|坐骑技能等级描述|group和level组织技能文案,value0/value1/value2保存描述使用的等级参数。
mountskilleffectgroup|坐骑技能触发与叠加|group及等级范围标识技能,activeEvent/activeEventValue记录触发条件,skillEffect/target及技能参数记录效果,duration/prob/stackLimit分别描述持续、概率与层数上限。
mounteventcount|坐骑活动累计奖励|season/index定位奖励档,needCount是累计数量需求,rewardId/rewardCount为对应奖励。
mounteventseasonitem|坐骑活动材料回收|seasonStringId区分赛季,两套资源文字和图标分别对应抽取与兑换资源;两个ExchangeGoldValue字段保存兑换金币值。
destinystat|命运词条候选|每行记录启用、品质、属性或特殊效果及addValue。normalWeight与rareWeight是分开的权重组,不能相加后当作唯一池。
collection|收藏组合条件|equipmentIds、equipmentLevels和equipmentGrades共同描述组合要求,EMonoStatus/value给出收益。并列数组保留原顺序。
skin|皮肤及套装加成|EEquipmentSlot区分外观槽位,additionalStatus/additionalValue描述单件属性;套装名、maxSetCount及setAdditionalValueList描述协同配置。
profile|头像|type与unlockKey记录类别和开放键,isEnabled及order记录启用和展示顺序。
profileframe|头像框|unlockKey关联解锁标记,frameName定位展示资源,isEnabled/order分别控制配置启用和展示顺序。
prefixtitle|称号前缀|order、titleKey、colorHex记录称号的展示顺序、文案与颜色。
outgametile|地块收集与养成|refNewTileId连接局内地块;grade、needPiece和unlockStage描述获取成长条件;defaultEquip与skillUnlockLevel/ETileSkill描述默认装备及技能开放。
outgametileskill|地块技能|refNewTileId标识作用地块,ETileSkill/skillValue配置技能类型及数值,标题和描述键用于展示。
outgametileresearch|地块研究阶段|totalUpgradeCount对应researchLevel,weaponPlusLevel与EMonoWeapon保存该研究阶段的武器成长配置。
outgametileresearchexp|地块成长研究收益|按EMonoTileGrade和level区分reward;与研究阶段表分开保存,不能把reward直接当researchLevel。
outgametileresearchstatus|研究属性节点|needResearchLevel是研究阶段要求,index是节点序号,EMonoStatus/value与needCost给出收益及消耗。
outgametileafkconfig|地块包挂机与里程|afkTime按分钟定义每包时间,maxPackCount为累计容量,startAddPack为初始包;包列表、权重与里程数组分开配置,needMileage与里程奖励描述累计奖励档。
afkconfig|巡逻计时与快速巡逻|checkTime、maxAfkTime和quickAfkTime单位为分钟。普通巡逻倍数权重、快速巡逻体力次数与广告次数分别配置。
afkreward|巡逻进度奖励|lastClearStage区分奖励档,goldPerHour给金币产率;其他奖励由rewards、amountPerCheckTime、maxAmount和dropPercent描述。
gachatype|抽卡操作与成本|按type/buttonNum区分按钮,gachaCount为抽数;isFree/isAD与ADcooldown描述免费广告档,needItemID/needCount与替代资源字段描述消费。
gacha|抽卡候选奖励|同type下记录候选奖励、品质、权重、特殊标记和数量;rewardType必须与rewardID一起解释,-1按原注释指特定类型中的全池。
gachaceildata|抽卡保底|type关联抽卡池,ceilCount是保底次数,isResetBeforeCeil标记提前获得时的重置配置,ceilRewardString明确对应奖励行。
shopproductlist|商品与持续发放|价格、消费类型、购买次数、重置周期和平台商品标识分开保存;ItemId/ItemValue是商品内容,dailyItemId/dailyItemValue/dailyObtainDay描述每日发放内容。
dailyshoplist|每日商店候选与售价|Prob是候选权重参数,ItemID/ItemValue描述内容,ECostType/buyPrice描述消费,Sale保存折扣标记或值。
relaypackagedata|接力礼包顺序|relayPackageId分组,order定义档位顺序;isFree与freeItemId/freeItemCount区分免费档,productKey连接商品。
d3package|分组礼包内容|groupKey/index组织礼包档,各组itemID0至2与itemCount0至2记录礼包内的三组奖励位置。
pigbank|存钱罐|每档有startValue/endValue以及winUpValue/loseUpValue;purchaseAvailableMinutes和cooldownMinutes分别给出购买窗口与冷却分钟数。
dailypurchasereward|购买积分奖励|needPoint为积分门槛,rewardID/rewardCount给对应档奖励。
groupbmshop|活动商品分组|ERefType/groupKey/targetStringId表示分组引用,shopProductStringId连接具体商品。
groupexchangeshop|分组兑换|ECoolTimeType/exchangeCount描述次数配置,exchangeItemId/exchangeItemCount与rewardId/rewardCount分别描述兑换投入和产出。
promotioninfo|促销入口排期|起止时间和clearStage描述展示条件,位置及排序控制入口布局,跳转字段描述目标功能。
triggerinfo|商品触发条件|TriggerType、GoalString/GoalValue等字段保存触发条件;起止时间、持续时间、重开次数和重开间隔分别配置,ProductKey连接商品,IsUse标记配置使用。
interstitialexeptionregion|插屏展示例外配置|showDay与exeptionRegions记录展示日序和区域例外原值,原字段拼写保留。
questdata|任务条件定义|questType/questKey定义事件类型,useSubValue/subValue细化目标;ERewardType和跳转字段保留任务对象与前往入口的信息。
groupquestlist|任务组目标与奖励|groupKey组织任务,questDataStringId连接条件定义;goalCount设目标,isCanCountWhenLock保留锁定时计数标记,领取类型及奖励独立配置。
achievement|成就链|prerequisiteId是前置成就;原注释说明前置未完成时不显示。goalCount为目标,isPerGameReset指每次局内开始重置进度,isHidden与奖励字段分别记录隐藏和收益。
attendance|逐日签到与补签|EAttendanceType和day确定签到档;EAttendanceRecovery/price是补签相关配置,itemId/itemCount为当日奖励。
attendanceconfig|签到排期|EAttendanceType与签到表关联,普通排期和prod排期字段分开保存,eventDay记录活动天数。
comebackconfig|回归资格与福利|comebackTime为距上次登录的分钟门槛,buffTime为加成分钟数;奖励加成与玩法加速分别有次数字段,questKey连接回归任务。
newbiebuffconfig|新人加速与奖励|buffTime按分钟记录持续时长,additionalSpeed/rewardBuffPercent记录额外加速及奖励百分数,两类使用次数分开记录。
passdata|通行证经验规则|passID区分通行证,日周挑战任务数、每日经验、普通高级游玩经验上限、重掷次数与每层经验分别配置。
passquestlist|通行证任务|usePassID连接通行证,questDataStringId连接条件;goalCount、unlockDay、xpCount与奖励字段描述目标、开放和收益。
passrewarddata|通行证等级奖励|passID、season和level标识奖励档,needXP与repeatCount记录经验和重复配置;普通、高级、高级Plus各保留完整奖励ID、数量和键。
passseasondata|通行证赛季与关联活动|clearStage、赛季起止、游玩结束与购买阻止时间记录不同阶段;商品、兑换、任务、抽卡及排行引用连接赛季内容。
stageinfo|关卡入口及模式|stage/EPlayMode/isEnabled定义关卡目录,标题、场景和Boss字段描述关卡内容;局内衔接字段完整保留。
stagerewardinfo|关卡结算奖励|EPlayMode、stage、loop、diceGauge与isClear共同区分奖励条件,rewardID/rewardCount给出奖励。
loopreward|层数奖励|Type和Loop定位奖励档,itemID/itemCount记录收益,isSack是独立奖励标记。
starchallenge|星级挑战条件参数|challengeText连接挑战描述,value是条件参数;没有正文时不根据数值猜测挑战语义。
starchallengereward|星数奖励档|starCount定位累计星数档,三组rewardID/value保留对应奖励,-1奖励ID作为原始哨兵保存。
dayoftheweekdungeon|曜日副本奖励|day与difficulty共同确定奖励档,对应itemId/itemCount。
dayoftheweekdungeonconfig|曜日副本难度推荐|difficultyPreferStage保存难度与推荐进度的配置数组。
weekdungeonboard|曜日副本层数属性|按EDayOfWeekDifficulty和loop组织怪物组及战斗属性,为入口难度与奖励提供对应玩法配置。
idledungeon|探索区域内容|graphID定位区域,宝藏数量和百分数、敌群数量及战斗属性共同描述探索内容。
idledungeonconfig|探索门票与背包|ticketChargeTime原注释为秒,maxTicket/startTicket是门票上限和初始量,maxInvSize是不含已装备物的背包容量。
idledungeondrop|探索掉落权重|currentDropItemCount区分已掉落数量档,各品质及失败权重数组独立保存,不直接相加推定掉落保护算法。
idledungeonequipmentsalvage|探索装备分解|level下每种品质单列回收奖励ID和数量,salvage字段与salvage_count字段按品质配对。
idledungeonequipmentstatus|探索装备等级属性|按level/type读取不同品质的value,不与永久装备的属性表混用。
idledungeonplayerdefaultstat|探索角色基础属性|EMonoStatus对应value,形成此模式单独的角色基础数值。
idledungeonstageinfo|探索章节与奖励|stage/chapter及stageConcept组织章节,rewardId/rewardCount描述对应奖励。
infiniteconfig|无限入场与收益限制|playAssetId/playAssetCount是入场消耗,excludeReward排除指定奖励,maxGold按难度配置;shopIncrease原注释为每层商店价格增加百分数,最终价格舍去小数。
infiniteseason|无限赛季Boss|season标识赛季,bossObj/bossID/bossProfile描述Boss与展示。
infiniteboard|无限难度层数属性|EInfinityDifficulty和loop区分配置,怪物组与属性随难度层数分别保存。
infinitemodefevertiles|无限特殊地块权重|ETileEvent标识地块事件,isEnabled控制配置启用,weight保存候选权重。
raidconfig|讨伐门票与入场|初始票、票上限和恢复秒数分开配置,playAssetId/playAssetCount描述每次入场投入,targetSeason指定适用赛季。
raidtier|讨伐档位展示|visualText与两个图标字段描述档位展示,对应奖励表的tierId。
raidreward|讨伐分数段奖励|tierId和season区分档位赛季,minScore/maxScore是分数段,rewardId/rewardCount为对应收益。
raidhighscorereward|讨伐最高分奖励|以tierId/season/highScore定位最高分目标,与普通分数段奖励分别保留。
raidseasonpetlist|讨伐赛季试用阵容|season、deckIndex、petId和trialLevel描述每套阵容的宠物及试用等级。
raidseasonpreset|讨伐赛季预设|season区分预设,bonus和overrideAugmentIdList保存增益及覆盖的强化项,presetTitleKey为名称引用。
raidboard|讨伐击杀计分与属性|bossKillCount对应killScore及后续战斗属性配置。
raidaugmentoverride|讨伐强化覆盖|itemType/itemID/fixedKey标识覆盖对象,count、overrideValue及overrideExtraValue记录替换参数。
battlepotion|竞技药水成长|重量、冷却、主效果和额外效果各有基础与增量字段;needPiece和needCost保留升级投入,isBuff/isPercent区分效果类别和数值标记。
battleplayerdefaultstat|竞技角色基础属性|以EMonoStatus读取value,形成竞技模式独立基础属性。
potionbattleconfig|竞技赛季与门票|targetSeason决定适用赛季,searchMmrRange/searchRange记录匹配范围参数,门票上限、恢复秒数及商品顺序另列。
potionbattlebonus|竞技加成条件|EPotionBattleBonus/value描述效果,mmrBonus、disapplyTier和bonusKey保存关联条件,isPercent标记百分比属性。
potionbattlebonuskey|竞技加成名称|StringId连接加成键,titleKey为展示名称引用。
rankbasedata|段位赛季关联|gameMode与followingPassId关联模式及通行证,mmrKey选择评分键,resetSeasonAdjustTier保存赛季调整量。
rankmmradjust|竞技积分修正参数|cpGap及关联键描述战力差档,baseWinMMR/baseLoseMMR给基础变化,gapCorrection/extraCorrection/finalCorrection是分开的修正字段。
ranktier|段位阶梯与奖励|gameMode和tier定位段位,minMMR/maxMMR/stepMMR配置评分档,properCp、stepPassXP保存对应战力与通行证经验参数。
rankingdata|排行榜赛季配置|isSeasonRanking/isAutoSeason描述周期类型,不同环境下的赛季、分组天数和键分别记录。
rankingreferencedata|玩法与排行榜关联|RankKey连接排行,ERefType/referenceKey描述来源玩法或活动引用。
rankingrewarddata|名次区间奖励|rankingDataKey定位榜单,minRank/maxRank确定名次范围,rewardId/rewardCount数组按位置记录奖励。
seasonevent|活动开放与兑换期|活动起止和兑换结束分开配置;签到类型、转盘键、商品组、兑换组和小游戏键连接具体内容,firstRewardId/firstRewardCount给初次奖励。
seasoneventroulette|活动转盘候选|seasonEventStringId关联活动,reward/rewardValues描述奖励,tier/weight保存档位与权重。
seasonquestlist|活动任务|活动键和questDataStringId分别关联活动及条件,unlockDay、goalCount、relativePassID、xpAmount及奖励描述开放目标与收益。
superballschedule|超级球排期与奖池|按赛季及group区分活动,起止日期原注释使用UTC零点,countingTime为统计分钟数;初始奖池、参与人数增量范围和名次分配比例分别配置。
seasoneventminigamedata|小游戏资源与活动入口|gamePackIndex定位玩法包,初始资源、游玩资源和消费量分别记录;兑换资源、排行榜及商品兑换组连接活动外围。
bubbleshooterminigame|泡泡小游戏关卡模板|templateKey分组,isUse标记模板使用,rowOrder与bubbles描述关卡行序和布局。
cardunpackingeventgame|拆卡包成本与奖励|packIndex区分包档,cost记录消耗,spriteTier描述展示档,rewardCount/prob保存奖励数量和概率参数。
clawcraneminigame|抓娃娃奖励配置|goodProb/Prob保存概率参数,capsuleTier和grade区分胶囊品质,rewardType/rewardValue记录奖励,minSize/maxSize保留尺寸范围。
dicebeteventgame|骰子投注档|setNumber、rewardCount和gap记录每档骰子目标、收益数量和间隔参数,胜负语义不从字段名补造。
dicemachine|骰子机器奖励组合|diceValues定义骰子组合,itemKey与rewardKey/rewardValue关联资源和奖励,value保存附加配置。
herobodyminigame|拼形小游戏模板|shapeName、ColumnSort和shapeRow记录形状及列行布局,imageName为图形资源引用。
plinko|弹珠落点奖励|ratio保存奖励权重参数,itemID/itemCount记录落点收益。
plinkoad|弹珠广告增益|maxADPerDay和buffSecond记录每日次数与持续秒数,values数组描述该增益不同档参数。
plinkolevel|弹珠容量与恢复|maxBallCount和chargeSecond记录球容量与恢复秒数,adKey连接广告增益,level保存原等级索引。
roulettedata|通用转盘奖励池|rouletteKey分组,itemID/itemCount给奖励,tier和weight描述档位及候选权重。
spitoeventdailyreward|刮奖活动日奖励|day定义奖励日序,rewardID/rewardCount给对应道具及数量。
spitoeventreward|刮奖候选奖励|itemIDList与itemCountList为并列奖励数组,percent为概率字段原值。
deoksun|NPC好感档|likePoint定位档位,slotRarity记录槽位品质配置,goldUP/diaUP分别记录金币收益与钻石获得概率字段,对话、服饰及折扣随档保存。
deoksunattendance|NPC签到轮次|groupKey/round及startDay/day组织签到轮次与日序,itemID/itemCount为奖励。
deokjashop|特殊养成商店|每项保存启用、品质、权重、基础增益、成长增量和等级上限;两个金币字段原注释标为不使用,不能据其推定售价。
'''
def organize(ctx):
out, modules, tables = ctx['OUT'], ctx['MODULES'], ctx['TABLES']
write, mdtable, csvwrite = ctx['write'], ctx['table'], ctx['csvwrite']
notes={line.split('|')[0]:line.split('|')[1:] for line in NOTES.strip().splitlines()}
assert set(notes)==set(ctx['owner']), (set(ctx['owner'])-set(notes),set(notes)-set(ctx['owner']))
zh=dict(ctx['FIELD_ZH'])
zh.update(dict(x.split('=',1) for x in '''order=展示顺序
index=档位或节点序号
baseStatus=基础属性类型
skill=技能引用
skillValue=技能数值
extraValue=额外参数
slotNum=槽位编号
type=类型或分组
groupKey=分组键
petId=宠物ID
level=等级或阶段索引
exp=成长消耗字段
needXp=所需经验
rewardXp=奖励经验
repeatMaxCount=重复次数上限
targetSeason=适用赛季
itemCounts=道具数量数组
itemIds=道具ID数组
rewardID1=奖励1道具ID
rewardID2=奖励2道具ID
rewardID3=奖励3道具ID
value1=参数1
value2=参数2
value3=参数3
ItemId=商品道具ID
ItemValue=商品道具数量
buyPrice=购买价格
probabilityWeight=候选权重
ECoolTimeType=周期类型枚举
EClaimType=领取类型枚举
EQuestGroup=任务分组枚举
dailyQuestCount=每日任务数量
weeklyQuestCount=每周任务数量
challengeQuestCount=挑战任务数量
dailyQuestRerollCount=每日任务重掷次数
normalRewardID=普通轨奖励ID
normalRewardCount=普通轨奖励数量
premiumRewardID=高级轨奖励ID
premiumRewardCount=高级轨奖励数量
premiumPlusRewardID=高级Plus轨奖励ID
premiumPlusRewardCount=高级Plus轨奖励数量
piece=碎片需求
isOwnEffect=持有效果标记
RareValue=稀有品质数值
EpicValue=史诗品质数值
LegendValue=传说品质数值
MythValue=神话品质数值
baseWeight=基础重量
plusWeight=重量增量
plusValue=数值增量
maxInvSize=背包容量
maxTicket=门票上限
startTicket=初始门票
maxBallCount=弹珠容量
chargeSecond=恢复秒数
maxADPerDay=每日广告次数
buffSecond=增益持续秒数
starCount=星数
startValue=起始值
endValue=目标值
winUpValue=胜利增加值
loseUpValue=失败增加值
purchaseAvailableMinutes=购买窗口分钟数
cooldownMinutes=冷却分钟数
likePoint=好感档
goldUP=金币收益参数
diaUP=钻石获得概率参数
ingameDiscount=局内折扣参数
isResetBeforeCeil=保底前命中重置标记
clearStage=通关阶段条件
loop=层数
Loop=层数
stage=阶段
chapter=章节
score=评分
highScore=最高分门槛
killScore=击杀分数
bossKillCount=Boss击杀数量
stepMMR=MMR步长
baseWinMMR=胜利基础MMR
baseLoseMMR=失败基础MMR
resetSeasonAdjustTier=赛季段位调整量
countingTime=统计分钟数
startReward=初始奖池
RewardPercent=名次分配百分数
rewardPerParticipant=每参与者增加奖励范围
playItemUseCount=每次游玩消耗
maxGold=金币上限数组
shopIncrease=每层商店涨价百分数
maxUpgradeLevel=强化等级上限
conditionType=成就条件类型
prerequisiteId=前置成就键
isPerGameReset=每局开始重置进度
'''.strip().splitlines()))
# 读者数值视图不展示美术路径与文案;其他字段全部保存并按6列拆分。
display=re.compile(r'icon|prefab|sprite|animation|animKey|title|desc|text|feedback|sound|sfx|color|image|banner|url',re.I)
allcatalog=[]; expected=0; delivered=0
categories=[('01-大厅与基础资源',['01','02']),('02-长期养成',['03','04','05','06','07','08','09','10','11','26']),('03-资源获取与商业化',['12','13','14']),('04-目标与周期成长',['15','16','17']),('05-挑战与竞技',['18','19','20','21','22','23']),('06-活动与小游戏',['24','25'])]
related={'01':'02 18','02':'12 13 14','03':'04 09 13','04':'02 03','05':'02 13','06':'13 21','07':'13 24','08':'02 18','09':'03','10':'03 14','11':'02 18','12':'02 18','13':'02 03 05 06 07','14':'02 17 24','15':'16 17 24','16':'02 15','17':'14 15 23','18':'01 02 03 11','19':'02 18','20':'02 18 23','21':'02 06 23','22':'02 17 23','23':'17 21 22 24','24':'14 15 23 25','25':'02 23 24','26':'02 14'}
nav='# 原作局外功能分类导航\n\n按功能查找模块,再依次阅读设计、规则和数值。所有数值保持原作配置原值。\n\n'
for group, ids in categories:
nav+='## '+group+'\n\n'+mdtable(['模块','功能设计','规则','数值'],[(m['name'],f"[设计](./{m['folder']}/01-模块设计文档.md)",f"[规则](./{m['folder']}/02-规则说明.md)",f"[数值](./{m['folder']}/03-数值说明.md)") for m in modules if m['id'] in ids])+'\n'
write(out/'01-功能分类导航.md',nav)
for m in modules:
d=out/m['folder']; tc=[]; rule_sections=[]; value_sections=[]
for t in m['tables']:
title,desc=notes[t]
headers,types,comments,records=tables[t]
expected+=len(records)
visible=[h for h in headers if h not in ('Id','StringId') and not display.search(h)]
# 无参数的展示表仍提供所有行的主键及原CSV入口。
groups=[visible[i:i+6] for i in range(0,len(visible),6)] or [[]]
src=f'../03-表格/{t}.csv'
detail=f'# {title}:原作数值明细\n\n{desc}\n\n源表:`{t}`,共{len(records)}条记录。[完整CSV]({src}) · [原始表](../03-表格/原始表/{t}.csv) · [模块数值说明](../03-数值说明.md)。\n\n保留全部配置记录,包括停用项;数值视图略去文案与美术资源字段,完整字段见CSV。空单元格代表原表空值,-1和0均按原值保留。每张表中的“等级”只适用于该表自己的成长阶段。\n\n'
fieldrows=[]
for h in visible:
i=headers.index(h)
label=zh.get(h,'枚举原名' if h.startswith('E') else '原字段名,含义见功能规则及原注释')
fieldrows.append((h,label,types[i],comments[i] if i<len(comments) else ''))
detail+='## 字段说明\n\n'+mdtable(['字段','含义','原类型','原注释'],fieldrows)+'\n'
for part,cols in enumerate(groups,1):
detail+=f'## 数值组{part}\n\n'
for start in range(0,len(records),120):
batch=records[start:start+120]
detail+=f'### 记录{start+1}—{start+len(batch)}\n\n'
labels=['Id','StringId']+[f'{zh.get(h,h)}({h})' if h in zh else h for h in cols]
detail+=mdtable(labels,[(r['Id'],r['StringId'],*[r[h] for h in cols]) for _,r in batch])+'\n'
write(d/'04-数值明细'/(t+'.md'),detail)
delivered+=len(records)
link=f'./04-数值明细/{t}.md'
tc.append((title,len(records),f'[数值明细]({link})',f'[CSV](./03-表格/{t}.csv)'))
allcatalog.append(dict(模块=m['folder'],子功能=title,原表=t,记录数=len(records),设计文档=f"{m['folder']}/01-模块设计文档.md",规则文档=f"{m['folder']}/02-规则说明.md",数值文档=f"{m['folder']}/04-数值明细/{t}.md"))
rule_sections.append(f'### {title}\n\n{desc}\n\n对应原表:`{t}`,{len(records)}条。[完整数值]({link})。\n')
numeric=[]
for i,h in enumerate(headers):
if types[i] not in ('int','float','double','long') or h=='Id': continue
values=[]
for _,r in records:
try: values.append(float(r[h]))
except ValueError: pass
if values:
fmt=lambda v: str(int(v)) if v.is_integer() else str(v)
numeric.append((zh.get(h,h),h,len(values),fmt(min(values)),fmt(max(values))))
if numeric:
value_sections.append(f'### {title}\n\n原表记录{len(records)}条。以下为全配置数值范围,包含停用与历史档,不等同于可达上限。[逐档数值]({link})。\n\n'+mdtable(['参数','原字段','有效数值数','最小值','最大值'],numeric)+'\n')
# 将规则按子功能组织,保留先前已核对的具体规则与补充项。
p=d/'02-规则说明.md'; content=p.read_text(encoding='utf-8')
begin=content.index('## 表级规则及原值')
end=content.index('## 关联全局配置',begin)
content=content[:begin]+'## 子功能规则\n\n'+'\n'.join(rule_sections)+'\n'+content[end:]
write(p,content)
p=d/'01-模块设计文档.md'; content=p.read_text(encoding='utf-8')
pos=content.index('## 功能构成与规则关系')
functional='## 子功能构成\n\n'+mdtable(['子功能','设计内容'],[(notes[t][0],notes[t][1]) for t in m['tables']])+'\n'
content=content[:pos]+functional+content[pos:]
linked=[x for x in modules if x['id'] in related[m['id']].split()]
content+='\n## 相关功能模块\n\n'+mdtable(['模块','关联内容'],[(f"[{x['name']}](../{x['folder']}/01-模块设计文档.md)",x['role']) for x in linked])+'\n'
content=content.replace('[规则说明](./02-规则说明.md) ·','[规则说明](./02-规则说明.md) · [数值说明](./03-数值说明.md) ·')
write(p,content)
numericdoc=f"# {m['name']}:数值说明\n\n本模块按{len(m['tables'])}项子功能整理数值。成长等级、消费资源、奖励数量、权重和周期分别保留,点击数值明细可阅读全部配置档。\n\n## 数值目录\n\n"+mdtable(['子功能','记录数','可读文档','配置表'],tc)
numericdoc+='\n## 数值读取约定\n\n- 等级、星级、品质和节点序号是不同维度,不互相替代。\n- 数组明细使用零基索引;索引不是默认的玩家等级。\n- 只有原注释或类型能确定单位时才写出单位;权重不直接改成百分比。\n- 奖励ID与奖励类型一起阅读,消耗和奖励中的空值、0、-1保持原样。\n\n[数组逐项明细](./03-表格/数组逐项明细.csv) · [关联全局配置](./03-表格/关联全局配置.csv)\n\n## 主要数值范围\n\n'+'\n'.join(value_sections)
if m['id']=='13': numericdoc+='\n## 奖励池条件概率\n\n[条件概率推导](./03-表格/条件概率推导.csv)使用同type池的原权重归一化,仅在该池所有记录均参与且按权重抽取时成立,未加入保底。\n'
numericdoc+='\n[模块设计](./01-模块设计文档.md) · [规则说明](./02-规则说明.md) · [功能分类](../01-功能分类导航.md)\n'
write(d/'03-数值说明.md',numericdoc)
write(d/'README.md',f"# {m['folder']}\n\n{m['role']}\n\n1. [模块设计](./01-模块设计文档.md):功能定位、步骤和子功能。\n2. [规则说明](./02-规则说明.md):条件、成长、投入产出及模块关联。\n3. [数值说明](./03-数值说明.md):完整数值目录、范围和逐档明细。\n\n"+mdtable(['子功能','记录数','数值文档','CSV'],tc)+'\n[返回分类导航](../01-功能分类导航.md)\n')
csvwrite(out/'02-功能文档索引.csv',allcatalog)
overview=(out/'00-局外系统模块总纲.md').read_text(encoding='utf-8')
overview=overview.replace('## 模块总纲','[按六大功能分类阅读](./01-功能分类导航.md) · [子功能文档索引](./02-功能文档索引.csv)\n\n## 模块总纲',1)
overview=overview.replace('每个模块含 `01-模块设计文档.md`、`02-规则说明.md`、`03-表格/`。','每个模块含 `01-模块设计文档.md`、`02-规则说明.md`、`03-数值说明.md`、`03-表格/`和`04-数值明细/`。')
write(out/'00-局外系统模块总纲.md',overview)
write(out/'README.md','# HEROLL 2.0.1 原作局外系统\n\n[模块总纲](./00-局外系统模块总纲.md) · [六大功能分类](./01-功能分类导航.md) · [子功能文档索引](./02-功能文档索引.csv)\n\n26个模块按“设计 → 规则 → 数值”阅读。132项表级子功能均有中文规则解读和可读数值明细,保留完整原CSV。\n\n具体公式或条件没有足够原作资料时,在对应规则末尾简短标明。\n')
assert expected==delivered
return dict(设计文档=len(modules),规则文档=len(modules),数值说明=len(modules),数值明细=len(allcatalog),数值明细覆盖源记录=delivered)