"""原作模块文档编排;由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