找回密码
 初始化身份识别芯片
查看: 2929|回复: 7

【进阶教程】派蒙手把手教你:在生涯模式内添加一个能够派发任务的NPC

  [复制链接]

战列舰长

发表于 2023-6-3 13:15:50 | 显示全部楼层 |阅读模式
本帖最后由 P.A.I.M.O.N 于 2023-6-23 22:22 编辑

想必各位Modder都很想在生涯模式内,在栩栩如生的星区世界内为自己的MOD增加NPC吧,现在就由我,万能的应急食品派蒙,来为各位星区旅行者介绍使MOD更加多彩的方法吧!
1、新建一个人物
首先,我们在某处新建一个人物,如果此人物需要星区生成时就存在,那么可以在ModPlugin文件onNewGameAfterEconomyLoad函数下面添加如下代码:
  1. @Override
  2. public void onNewGameAfterEconomyLoad() {//只有等经济系统初始化完毕后,游戏中的市场才会出现,在onNewGame函数里写市场相关代码会报错
  3.     ImportantPeopleAPI ip = Global.getSector().getImportantPeople();
  4.     //此处以X入侵的League of Watchmen为例
  5.     MarketAPI market_low = Global.getSector().getEconomy().getMarket("watchmen_chaldea_market");
  6.     //事先删除整个market里的所有人物,只留一个我们新建的marx
  7.     if (market_low != null) {
  8.         for (PersonAPI p : market_low.getPeopleCopy()) {
  9.             market_low.removePerson(p);
  10.             ip.removePerson(p);
  11.             market_low.getCommDirectory().removePerson(p);
  12.         }
  13.         PersonAPI marx = market_low.getFaction().createRandomPerson();//使用这个函数,可以创建一个该阵营的随机人物

  14.         marx.setId("marx");//人物id,游戏中可以唯一找到它的识别名
  15.         marx.setPostId(Ranks.POST_ADMINISTRATOR);//设置该人物的职位
  16.         marx.setRankId(Ranks.SPACE_COMMANDER);//设置该人物的军衔
  17.         marx.setGender(FullName.Gender.MALE);//设置性别
  18.         marx.getName().setFirst("Friedrich");//众所周知,西方人的名字是由两部分组成
  19.         marx.getName().setLast("Marx");

  20.         //marx.setFaction("watchmen");//设置阵营,但是由于之前我们创建时候就设置了,所以这里注释掉
  21.         //marx.addTag(Tags.CONTACT_MILITARY);//为人物增加tag,例如贸易,军方,影响人物能够派发的联络人任务

  22.         marx.setPortraitSprite("graphics/xinvade/portraits/Marx.png");//设置人物的大头照
  23.         marx.setImportanceAndVoice(PersonImportance.HIGH, StarSystemGenerator.random);//设置人物的重要性,至于Voice是角色打招呼的语气,例如voice = faithful就会说“卢德保佑你”之类,可在rules中自定义

  24.         ip.addPerson(marx);//只有加入ImportantPeople,该人物才能被rules和missionHub识别
  25.         ip.getData(marx).getLocation().setMarket(market_low);//将人物传送到指定market里
  26.         ip.checkOutPerson(marx, "permanent_staff");//"这个的意思是把人物以'永久成员(permanent_staff)'的理由签发出去,如此一来就不会成为某些随机任务的目标。“————感谢议长订正
  27.         marx.getStats().setSkillLevel(Skills.INDUSTRIAL_PLANNING, 1);//设置人物的技能,这里给他加了1级的工业规划

  28.         market_low.setAdmin(marx);//市场管理员设置为他
  29.         market_low.getCommDirectory().addPerson(marx, 0);//将其加入通讯录中
  30.         market_low.addPerson(marx);//将该person加入市场的人物列表,使某些按市场寻人的方法可以找到
  31.     }
  32. }
复制代码
这样,一个崭新的人物就生成完成了。
2、为人物添加MissionHub
当建立新的联络人后,MissionHub会自动添加在联络人身上,可以用如下代码将NPC设置为潜在联络人。玩家自定义的人物如果没有走这个流程,就无法接取联络人任务。
  1. ContactIntel.addPotentialContact(marx, market_low, dialog.getTextPanel());
复制代码
当然,也可以直接为人物添加MissionHub(类似学院任务的塞巴斯蒂安)
  1. //这里是设置该人物拥有多少个额外任务上限,若不填,则每次只能刷出一个任务,若填1,则每次最多能刷出2个人物,填2则最多刷出3个。
  2. marx.getMemoryWithoutUpdate().set(BaseMissionHub.NUM_BONUS_MISSIONS, 1);
  3. //为人物添加MissionHub
  4. 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中设置任务流程
此处以本人MODX入侵的替守望者联盟导师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作为交换。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?初始化身份识别芯片

×

评分

参与人数 2星币 +14 收起 理由
homejerry99 + 5 好鵺
ZeroXenon + 9 233

查看全部评分

势力巨擘

见习机师

发表于 2023-6-3 13:58:14 | 显示全部楼层
好!

战列舰长

我要发动我的技能无效你无效我无效你无效我的技能

发表于 2023-6-3 14:22:03 | 显示全部楼层
6666

巡洋大副

发表于 2023-6-3 15:00:13 | 显示全部楼层
666

势力巨擘

发表于 2023-6-3 17:09:55 | 显示全部楼层

势力巨擘

发表于 2023-6-3 17:29:01 | 显示全部楼层
你攻势爷爷来喽

势力巨擘

发表于 2023-6-3 20:39:34 | 显示全部楼层

星域军阀

发表于 2023-6-3 22:58:24 | 显示全部楼层
太牛辣~~

本版积分规则

Archiver|手机版|小黑屋|远行星号中文论坛

GMT+8, 2024-11-21 18:31

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio

快速回复 返回顶部 返回列表