转自paul2008me123FIFA22的教程

大家好!本帖继承FIFA22MOD日志,分享一些个人制作FIFA23国家队mod的一些心得和日志,主要目的是为了有兴趣制作相关mod的朋友,包括我自己以后有迹可循,方便查找,快速定位问题少走弯路。
错误日志分为两个部分,第一部分是编辑赛事结构时,compdata文件编辑容易常见的问题,第二部分是编辑存档squad或数据库DB文件时,容易出错的问题

一、新增球队和赛事文件编辑注意事项
1、新增国家队或联赛球队
需要先修改名单,再将leagueteamlink导入到DB(以免俱乐部转会界面产生重复球员bug),涉及修改的名单表格包括:teams、teamplayerlinks、teamstadiumlinks、leagueteamlinks、formations、 players、dcplayernames、teamkits、teamnationlinks、default_mentalities、default_teamsheets、defaultteamdata(仅在DB)、nations(仅在DB,合并世预赛使其分组可见需要修改)、broadcastleague(仅在DB,具体功能不明)。

注意:如果涉及联赛球队修改,比如增加巴甲和中超球队,在编辑leagueteamlinks时,需要将previousyearposition也按顺序改了(否则会导致联赛最后一场闪退),default_mentalities default_teamsheets、defaultteamdata这三个文件主要控制阵容修改和复原,理论上可通过前面的文件自动生成(需进游戏利用编辑模式生成),减小工作量。如需更新冬季转会,还会涉及导入官方最新名单里的fixtures、dcplayernames、playerloans、playerformdiff、previousteam、teamformdiff、ucc、gpucc、version、rivals、player_grudgelove、bannerplayers这几个文件,否则会导致进入球队阵容闪退。

2、新增赛事
目前需要修改的Compdata文件包括advancement、compids、compobj、competition、initteams、schedule、settings、standings、tasks、internationals、preseasontour(仅合并世预赛使其分组可见需要修改)

(1)在修改compobj时,应在友谊赛前增加赛事(以免产生倒数第二个国家队赛事闪退),只需在最右的父子关系代码关联到国家或大洲即可,无需整体平移;
(2)如不得已需要平移,在修改settings时,记住advance_maxteamsstageref、advance_pointskeep、advance_standingskeep、advance_standingsrank、advance_teamcompdependency、schedule_use_dates_comp、standings_checkrank、rule_suspension、schedule_forcecomp这几个关键字需要同时修改;在修改tasks时,除修改第四列外,FillFromCompTable、UpdateTable、FillFromCompTableBackupLeague、FillFromCompTableBackup还需修改第五列,其中FillFromCompTableBackup第六列也要修改。
(3)在修改competition表时,通过修改competitioncolor可定义赛事颜色,通过将iscenterpitchflagenabled改成1、iscenterpitchflagenablestage改成0可实现中圈大型抖动旗帜、将isteampitchflagenabled改成0可取消赛前球队旗帜展示,将introantemidle和introteampotrait改成1可实现开场阵容动画介绍

二、Compdata常见问题
(一)跳出、闪退
情形一:选择经理模式后马上闪退
原因:Compdata文件里部分文件或全部文件格式有误,比如多了空格、多了空行、多了逗号,导致游戏不能读取文件

情形二:经理模式能选择球队但读取界面闪退
原因一:Compobj里ID未连续或ID间逻辑关系、父子关系代码错误,导致游戏不能正确读取完整赛事
原因二:standings.txt文本行数超限
在FIFA里,standing.txt是优先决定能新增多少赛事的关键,例如FIFA22如果standings超过5778行会导致自定义锦标赛无法选择64队分组,如果超过5886行会导致自定义锦标赛无法选择32队分组,如果超过5974行会导致自定义锦标赛无法选择8队分组且造成无法进入生涯模式(因为季前赛同样是8队两组,经理模式可跳过季前赛但球员模式根本无法跳过),如果超过更多可能导致经理模式阿根廷联赛跳出,直至引起更多standing里靠上联赛在读取生涯模式时跳出

情形三:能进经理模式但是模拟到特定日期闪退
原因一:Compobj结构问题
1、欧洲区预选赛和欧洲杯预选赛不能直接分组后不加附加赛,必须在小组分组之后继续设置附加赛setup stage和附加赛group stage(只设置其中一个也会闪退),否则会在7月结束跳到8月时闪退
2、亚洲区预选赛分组后可以像欧洲区预选赛一样同时设置附加赛setup stage和附加赛group stage,这样不会闪退
3、赛事不能放在compobj最后面,赛事放到compobj的最后面,会导致这个赛事在他本应开赛的前一个月跳出
4、国家队赛事不能放在compobj友谊赛ID后面,且不能是最后一个国家队赛事,否则会导致模拟到这个国家队赛事的某一轮跳出。 也就是说只要友谊赛后面这个国家队赛事后面还有国家队赛事,它就不会跳出,因为会跳出的是它后面那个最后的国家队赛事。
原因二:schedule冲突
杯赛赛事schedule设置冲突,会导致其他的联赛在5月或8月闪退,冲突联赛冲突日程后的比赛消失,比如6月开赛的大洲内国家队杯赛如果和同一个大洲的联赛日程有冲突,会导致那个联赛在冲突的日程之后的比赛消失,同时导致选择8月开赛其他联赛闪退,包括8月开赛的其他大洲联赛
原因三:其他文件与Comobj逻辑不匹配
如果Compobj里一项赛事本身结构没问题,但是和他关联的其他重要compdata文件,比如settings、advancement、task和它逻辑不匹配(少设置或多设置、错设置),都会导致这个赛事在赛事前的一个月到最后一轮期间任意时刻跳出。比如世界杯预选赛,task没有设置对晋级规则和排名,会导致这个预选赛不能理解最后怎么晋级,导致在模拟到这个赛事最后一轮时闪退。

情形四:经理模式参加季前赛跳出、生涯(球员)模式开档闪退、自定义锦标赛闪退
原因:standings.txt文本行数超限
在FIFA里,standing.txt行数是优先决定能新增多少赛事的关键,例如FIFA22如果standings超过5778行会导致自定义锦标赛无法选择64队分组,如果超过5886行会导致自定义锦标赛无法选择32队分组,如果超过5974行会导致自定义锦标赛无法选择8队分组且造成无法进入生涯模式(因为季前赛同样是8队两组,经理模式可跳过季前赛但球员模式根本无法跳过),如果超过更多可能导致经理模式涉及shadowtable的联赛(阿根廷、瑞典、挪威、爱尔兰)闪退。解决办法:删除standing里涉及shadowtable的行,同时删除setting里的
standings_use_shadow_table行,并将涉及到的联赛在task里将FillFromLeagueMaxFromCountryShadowed改成FillFromLeagueMaxFromCountry,如:
95,start,FillFromLeagueMaxFromCountryShadowed,100,56,1,3改为
95,start,FillFromLeagueMaxFromCountry,100,56,1,3
这样可节约standings行数

情形五:游戏主界面选择欧冠、南美解放者杯跳出
原因:compobj里欧冠、解放者杯前置ID与游戏默认不符
欧冠、解放者杯不能改变游戏默认的在Compobj的前置ID,比如欧冠在Compobj里的前置ID是108,不能改动,如果改动,经理模式可以玩,但是要玩主界面的欧冠赛事就会闪退。

(二)赛事消失或乱入
原因一:schedule和同一国家或同一大洲内的赛事冲突
赛事schedule设置冲突,会导致游戏选择一个重要值更高的赛事正常比赛,重要值低的赛事冲突日程后的比赛消失,比如6月开赛的大洲内重要值更高的国家队杯赛如果和同一个大洲的重要值更低的联赛日程有冲突,会导致那个联赛在冲突的日程之后的比赛消失

原因二:其他文件与Compobj逻辑不匹配
如果Compobj里这项赛事本身结构没问题,但是和他关联的其他重要compdata文件,比如settings、advancement、task和它逻辑不匹配(少设置或多设置、错设置),会导致与这个赛事关联的其他赛事消失。比如世界杯预选赛和世界杯的task没有设置对晋级规则和排名,会导致预选赛不能理解最后怎么晋级,导致世界杯消失或无法产生。

原因三:compobj友谊赛前国家队赛事数量超限
compobj友谊赛前国家队赛事(包括杯赛和预选赛)不能超过一定数量。
国家队赛事总量不能超过11个(含世界杯990、欧洲杯980、美洲杯970、欧预赛981、世欧预991、南美预992、世亚预993、世非预996、亚洲杯999、非洲杯960、北美预),再增加一个,会导致友谊赛消失。
国家队预选赛数量不能超过4个(含欧预赛981、世欧预991、南美预992、世亚预993),如果再增加一个预选赛,可能会导致增加的那个预选赛和友谊赛赛程重叠(即友谊赛乱入),通过删除setting里schedule_use_dates_comp行,只保留schedule_internationaldependency行,同时去掉9月和10月的友谊赛日程只保留11月和3月的友谊赛日程(友谊赛日期不能变,如果友谊赛日期变了会导致欧冠、英格兰卡拉宝杯等赛事部分日程消失),这样可在解决预选赛与友谊赛的重叠问题的同时实现预选赛和友谊赛同时正常开展(预选赛11月和3月日程分别改到12月和次年1月)。通过这样操作FIFA22友谊赛前国家队赛事可以有世界杯、欧洲区预选赛、欧洲杯预选赛、亚洲区预选赛、非洲区预选赛、南美区预选赛、北美区预选赛、亚洲杯、非洲杯、欧洲杯10个国家队赛事,但是再增加一个就会导致友谊赛消失。

(三)球队消失(赛事存在但是参赛球队全是灰色图标,可以模拟比赛但是比赛结果清一色0:3或3:0)
原因:Compobj里这项赛事本身结构没问题,但是和他关联的advancement球队晋级规则设置有误,导致这个赛事不能理解让哪些球队晋级,导致球队全是灰色图标。

(四)解放者杯巴甲晋级球队不准确问题
原因:task表需要将增加成18队的巴甲重新设置,例如FillFromSpecialTeamsWithNation,1656,1,54,0改成FillFromLeagueMaxFromCountry,1656,7,1,8

三、database或名单编辑常见问题
(一)经理模式新增国家队球员无故减少
原因:DB文件或者名单文件里的teamplayerlinks、leagueteamlinks存在不连续的artificialkey

(二)新增球队黑白鞋问题
原因:DB或者名单里的players文件,存在游戏不支持的shoetypecode

(三)新增球队光头问题
原因:DB或者名单里的players文件,需将headclasscode由0改为1

(四)新增球队教练光头并穿着默认白色训练T恤
原因:没有在DB或者名单里的manager文件里添加新增球队的教练数据,且需要复制原版教练相关头型发型代码

(五)新增球队进入比赛闪退
原因:DB或者名单里的teamplayerlinks文件里,存在相同ID的首发球员

(六)巴西俱乐部开档生涯模式在7月第一天闪退
原因:一般是因为官方更新了legacy里的db文件,需要导出基于官方更新前mod所有的db文件(不只是fifa_ng_db),导入到基于官方更新后的mod db文件里。

(七)球员生涯无法用自创球员开档新增的俱乐部球队
原因1:控制teamnationlink表和manager表大小的fifa_ng_db-meta没有修改增加最大行数
需要打开fifa_ng_db-meta,搜索teamnationlink和manager表,根据增加的球队数量分别将maxinsert的数值适当改大。
原因2:游戏内编辑完阵容后没有点保存阵容
需要点一下保存阵容

(八)增加到一定数量国家队,下一个国家队无法编辑国家队阵容,因为没有球员
原因:控制teamnationlink表和manager表大小的fifa_ng_db-meta没有修改增加最大行数
需要打开fifa_ng_db-meta,搜索teamnationlink和manager表,根据增加的球队数量分别将maxinsert的数值适当改大。

(九)生涯模式进入球队阵容闪退
原因:没有导入官方fixtures、dcplayernames、playerloans、playerformdiff、previousteam、teamformdiff、ucc、gpucc、version、rivals、player_grudgelove、bannerplayers这几个文件,主要是playerloans和previousteam.

(十)俱乐部转会菜单转会球员,出现球员重复
原因:没有将名单的leagueteamlink导入DB,需要导入才行

四、其他心得
(一)广告牌添加
可在DB里的dynamicimages里直接新增(图片命名及ID),再通过修改teamsponsorlink或competitionsponsorlink关联id,并用liveeditor加载新增的图片(图片名称与db的dynamicimages数据一致)

(二)无需改动compobj快速移除/恢复赛事方法
不改compobj,如需移除赛事,则只需将该赛事涉及的除compobj外的其他compdata表格行数全部删除,并将compdata该赛事改为GROUP形式的多余代码,比如若需删除993和992两个赛事,只需将如下代码
36,4,S7,FCE_Final,1
37,5,G1, ,36
38,3,C993,TrophyName_Abbr15_993,1599
39,4,S1,FCE_Setup_Stage,38
40,5,G1, ,39
41,4,S2,FCE_1Group_Stage,38
42,5,G1,FCE_Group_A,41
43,5,G2,FCE_Group_B,41
44,5,G3,FCE_Group_C,41
45,5,G4,FCE_Group_D,41
46,4,S3,FCE_Setup_Stage,38
47,5,G1, ,46
48,4,S4,FCE_2Group_Stage,38
49,5,G1,FCE_Group_A,48
50,5,G2,FCE_Group_B,48
51,4,S5,OSDK_PLAYOFFS_GAMES,38
52,5,G1, ,51
53,5,G2, ,51
54,3,C992,TrophyName_Abbr15_992,1599
55,4,S1,FCE_Group_Stage,54
56,5,G1,FCE_Group_Stage,55
57,1,UEFA,European FA,0

改为:
36,4,S7,FCE_Final,1
37,5,G1, ,36
38,5,G2, ,36
39,5,G3, ,36
40,5,G4, ,36
41,5,G5, ,36
42,5,G6, ,36
43,5,G7, ,36
44,5,G8, ,36
45,5,G9, ,36
46,5,G10, ,36
47,5,G11, ,36
48,5,G12, ,36
49,5,G13, ,36
50,5,G14, ,36
51,5,G15, ,36
52,5,G16, ,36
53,5,G17, ,36
54,5,G18, ,36
55,5,G19, ,36
56,5,G20, ,36
57,1,UEFA,European FA,0

同时删除其他与993、992相关的表格行数。这样compobj行数不变,两个赛事被删掉,恢复同理。这样的好处是删除/恢复一个赛事不需进行行数平移。也是充分利用了只有standing控制行数限制,compobj不控制行数限制这一规则。

(三)能够新增多少standing行数生涯模式仍可用,取决于季前赛是否闪退, FIFA22季前赛是8队小组赛加淘汰赛,因此可通过新建自定义锦标赛(赛制设置成季前赛一样:8队小组赛加淘汰赛),如果能够新建成功,则生涯模式季前赛就不会闪退。最简单快速的测试方法就是直接在原版standing后面加行数,其他compdata不动,再进游戏即可测试新建锦标赛

(四)指定一个联赛A第N名参加另一个国际赛事B的方法

1、通过在setting里的A赛事上面加一句advance_teamcompdependency,B代码实现:
如:中超第1-3名参加亚冠,第4-6名参加亚联杯
先在task里设置好中超1-6排名,在task设置好中超亚冠参赛名额(start,FillFromLeagueMaxFromCountry,XXXX,2012,3,3),同时设置好亚联杯中超参赛名额(start,FillFromLeagueMaxFromCountry,XXXX,2012,4,6),再在setting里亚联杯前加一句advance_teamcompdependency,3005(3005是亚冠代码)即可

(五)指定一个国际赛事A第N名参加另一个国际赛事B的方法
1、通过欧冠欧联方法:即在setting里的A赛事上面加一句advance_teamcompdependency,B,同时通过advance关联A的第几名到B(这种方法可以在A的赛程中将第N名参加B,B不必等A结束)
2、直接法(这种方法无需advance_teamcompdependency代码,通用联赛和国际赛事):即通过tasks设置A的排名,再在B的task的setup环节里直接设置参赛队:如:
欧洲杯预选赛和欧洲杯的关系,这里欧洲杯58赛事的前四行分别对应欧洲杯预选赛79赛事的1-4、5-8、9-12、13-16名参赛,如只需其中某一名次参赛,advance和standing在setup以后的后续环节无需设置其他名次即可。但是这种方法必须等A的赛事结束才能关联B
58,start,FillFromCompTable,60,79,4,0
58,start,FillFromCompTable,61,79,4,0
58,start,FillFromCompTable,62,79,4,0
58,start,FillFromCompTable,63,79,4,0
58,end,UpdateTable,58,78,1,1
58,end,UpdateTable,58,78,2,2
79,start,FillWithTeam,81,1,1337,0
79,start,FillWithTeam,81,2,1362,0
79,start,FillWithTeam,81,3,1318,0
79,start,FillWithTeam,81,4,105035,0
79,start,FillWithTeam,81,5,1325,0
79,start,FillWithTeam,81,6,1335,0
79,start,FillWithTeam,82,1,1354,0
79,start,FillWithTeam,82,2,1343,0
79,start,FillWithTeam,82,3,1330,0
79,start,FillWithTeam,82,4,1356,0
79,start,FillWithTeam,82,5,1322,0
79,start,FillWithTeam,82,6,1886,0
79,start,FillWithTeam,82,7,1363,0
79,start,FillWithTeam,82,8,1353,0
79,start,FillWithTeam,82,9,1357,0
79,start,FillWithTeam,82,10,1331,0
79,start,FillWithTeam,83,1,1334,0
79,start,FillWithTeam,83,2,1355,0
79,start,FillWithTeam,83,3,1352,0
79,start,FillWithTeam,83,4,1338,0
79,start,FillWithTeam,83,5,1359,0
79,start,FillWithTeam,83,6,1367,0
79,start,FillWithTeam,83,7,110081,0
79,start,FillWithTeam,83,8,1366,0
79,start,FillWithTeam,83,9,1341,0
79,end,UpdateTable,79,91,1,1
79,end,UpdateTable,79,91,2,2
79,end,UpdateTable,79,86,1,3
79,end,UpdateTable,79,86,2,4
79,end,UpdateTable,79,86,3,5
79,end,UpdateTable,79,86,4,6
79,end,UpdateTable,79,86,5,7
79,end,UpdateTable,79,89,1,8
79,end,UpdateTable,79,89,2,9
79,end,UpdateTable,79,89,3,10
79,end,UpdateTable,79,89,4,11
79,end,UpdateTable,79,89,5,12
79,end,UpdateTable,79,89,6,13
79,end,UpdateTable,79,89,7,14
79,end,UpdateTable,79,89,8,15
79,end,UpdateTable,79,89,9,16