本帖最后由 P.A.I.M.O.N 于 2023-6-23 22:22 编辑
想必各位Modder都很想在生涯模式内,在栩栩如生的星区世界内为自己的MOD增加NPC吧,现在就由我,万能的应急食品派蒙,来为各位星区旅行者介绍使MOD更加多彩的方法吧! 1、新建一个人物首先,我们在某处新建一个人物,如果此人物需要星区生成时就存在,那么可以在ModPlugin文件的onNewGameAfterEconomyLoad函数下面添加如下代码: - @Override
- public void onNewGameAfterEconomyLoad() {//只有等经济系统初始化完毕后,游戏中的市场才会出现,在onNewGame函数里写市场相关代码会报错
- ImportantPeopleAPI ip = Global.getSector().getImportantPeople();
- //此处以X入侵的League of Watchmen为例
- MarketAPI market_low = Global.getSector().getEconomy().getMarket("watchmen_chaldea_market");
- //事先删除整个market里的所有人物,只留一个我们新建的marx
- if (market_low != null) {
- for (PersonAPI p : market_low.getPeopleCopy()) {
- market_low.removePerson(p);
- ip.removePerson(p);
- market_low.getCommDirectory().removePerson(p);
- }
- PersonAPI marx = market_low.getFaction().createRandomPerson();//使用这个函数,可以创建一个该阵营的随机人物
- marx.setId("marx");//人物id,游戏中可以唯一找到它的识别名
- marx.setPostId(Ranks.POST_ADMINISTRATOR);//设置该人物的职位
- marx.setRankId(Ranks.SPACE_COMMANDER);//设置该人物的军衔
- marx.setGender(FullName.Gender.MALE);//设置性别
- marx.getName().setFirst("Friedrich");//众所周知,西方人的名字是由两部分组成
- marx.getName().setLast("Marx");
- //marx.setFaction("watchmen");//设置阵营,但是由于之前我们创建时候就设置了,所以这里注释掉
- //marx.addTag(Tags.CONTACT_MILITARY);//为人物增加tag,例如贸易,军方,影响人物能够派发的联络人任务
- marx.setPortraitSprite("graphics/xinvade/portraits/Marx.png");//设置人物的大头照
- marx.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);//设置人物的重要性,至于Voice是角色打招呼的语气,例如voice = faithful就会说“卢德保佑你”之类,可在rules中自定义
- ip.addPerson(marx);//只有加入ImportantPeople,该人物才能被rules和missionHub识别
- ip.getData(marx).getLocation().setMarket(market_low);//将人物传送到指定market里
- ip.checkOutPerson(marx, "permanent_staff");//"这个的意思是把人物以'永久成员(permanent_staff)'的理由签发出去,如此一来就不会成为某些随机任务的目标。“————感谢议长订正
- marx.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);//设置人物的技能,这里给他加了1级的工业规划
- market_low.setAdmin(marx);//市场管理员设置为他
- market_low.getCommDirectory().addPerson(marx, 0);//将其加入通讯录中
- market_low.addPerson(marx);//将该person加入市场的人物列表,使某些按市场寻人的方法可以找到
- }
- }
复制代码这样,一个崭新的人物就生成完成了。 2、为人物添加MissionHub
当建立新的联络人后,MissionHub会自动添加在联络人身上,可以用如下代码将NPC设置为潜在联络人。玩家自定义的人物如果没有走这个流程,就无法接取联络人任务。
- ContactIntel.addPotentialContact(marx, market_low, dialog.getTextPanel());
复制代码当然,也可以直接为人物添加MissionHub(类似学院任务的塞巴斯蒂安): - //这里是设置该人物拥有多少个额外任务上限,若不填,则每次只能刷出一个任务,若填1,则每次最多能刷出2个人物,填2则最多刷出3个。
- marx.getMemoryWithoutUpdate().set(BaseMissionHub.NUM_BONUS_MISSIONS, 1);
- //为人物添加MissionHub
- BaseMissionHub.set(marx, new BaseMissionHub(marx));
复制代码
3、在person_mission文件夹中设置任务MissionHub会使联络人每隔一段时间便刷出一次person_mission列表中存在的任务。以下是person_mission中每一列参数所代表的含义 Mission id | 任务的ID,需要唯一 | Person id | 只有当MissionHub持有者的id为person id时,才会派发此任务 | Tags All | 当该人物有且仅有此tag(之前在文件里定义的marx.addTag中的tag)时,可以刷出此任务 | Tags Any | 当该人物拥有此tag时,可以刷出此任务 | Tags NotAny | 当该人物不拥有此tag时,可以刷出该人物 | Tags | 这里的tag可以给任务增加一些其他限制,例如priority会使任务在满足要求时优先刷出来,non_repeatable可以使任务只刷出一次 | Freq | 任务刷出的可能性,随机数权重 | Min/max timeout | 任务可能在min至max个时间单位后被其他任务顶替掉 | Min/max rep | 在与联络人最低min,最高max的关系之间可能接到该任务 | Importance | 联络人的重要性高于此数值之后,才会接到该任务 | ReqMissionAny | 填任务id,在完成任意此列表任务中的某一个,则该任务可接 | ReqMissionAll | 在完成任意此列表任务中的全部任务后,该任务可接 | ReqMissionNone | 在未完成任意此列表任务中的全部任务前,该任务可接 | Icon | 任务图标 | Plugin | 该任务的脚本文件,填地址路径 | 4、在rules中设置任务流程
此处以本人MOD,X入侵的替守望者联盟导师Marx回收信标的任务为例
5、Intel文件配置
【进阶教程】派蒙手把手教你之第二弹:详解Intel - Mod制作讨论 - 远行星号中文论坛 (fossic.org)
本来写上面这篇帖子时想重新解释一下rules,但是我想,大概,看了intel之后就能有更深的理解了吧……
6、疑难解答
Q:你的教程有错误/我按照你的步骤,没有成功达到我的需求
A:你可以在本贴留言/私信我/去论坛Modder交流群at我提问,这个疑难解答就是为了补充各种情况下的对策而准备的。
至于任何错误,欢迎各位高手斧正,尤其是我也不知道的部分敬请开君金口替我补充完整。但还请嘴下留情。
Q:rules和intel的配置太复杂了,有没有什么现成的参考?
A:原版rules.csv文件存在于Starsector\starsector-core\data\campaign文件夹中,至于intel可以解压Starsector\starsector-core\starfarer.api.zip,在com\fs\starfarer\api\impl\campaign\missions中找到原版的相关例子,也可以以我的MOD或议长的仙山作为参考。
Q:我有的问题实在解决不了,可以帮我写码吗?
A:我的MOD现在急需更多图像素材,但因为囊中羞涩无可奈何,如果可以帮我提供素材或其他支援的话,我可以以代替写码与改BUG作为交换。
|