318 lines
33 KiB
Python
318 lines
33 KiB
Python
"""原作模块文档编排;由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)
|