Starsector Nihilism Guidance
首页
Github 项目
首页
Github 项目
  • 首页
  • 第一章 基础及舰船相关
    • 小节 MOD结构
    • 小节 基本舰船
    • 小节 航母、战机与相位舰
    • 小节 武器
    • 小节 战术系统
    • 小节 舰船插件
  • 第二章
    • 小节 战役
    • 小节 势力
    • 小节 星系
    • 小节 描述文本
    • 小节 内置装配
  • 第三章
    • 小节 模拟战
    • 小节 舰船风格
    • 小节 模块船
    • 小节 势力争霸
    • 小节 弹体尾迹
    • 小节 音效相关
  • 第四章 等待设计
    • 小节 1
    • 小节 2
    • 小节 3
    • 小节 4
    • 小节 5
    • 小节 6
  • 第五章 核心代码
    • 小节 ModPlugin
    • 小节 Global
    • 小节 CombatEngine 等待设计
    • 小节 CombatEntity 等待设计
    • 小节 5 等待设计
    • 小节 船插 等待设计
    • 小节 战术系统AI 等待设计
    • 小节 开火/命中 等待设计
  • 第六章 进阶 等待设计
    • 小节 BaseEveryFrameCombatPlugin
    • 小节 BaseCombatLayeredRenderingPlugin
    • 小节 EveryFrameWeaponEffectPlugin
    • 小节 AI
    • 小节 动画设计
    • 小节 6
  • 第七章 等待设计
    • 小节 1
    • 小节 2
    • 小节 3
    • 小节 4
    • 小节 5
    • 小节 6
    • 小节 7
  • 第八章 等待设计
    • 小节 1
    • 小节 2
    • 小节 3
    • 小节 4
    • 小节 5
    • 小节 6
  • 第九章 等待设计
    • 小节 1
    • 小节 2
    • 小节 3
    • 小节 4
    • 小节 5
    • 小节 6

制作战术系统与右键战术系统

本节预期阅读时间:~15 分钟。

本节预期操作时间:~15 分钟。

制作战术系统文件

编者认为您应该已经非常熟悉复制、粘贴、修改的操作流程了。在当前阶段,编者建议您先从和原版类似的战术系统入手,先做相对简单的,等拥有一定程度的技术储备之后再做更为自定义化的。

在本例,编者将为此前的工匠-级制作一个叫突击填弹器新的战术系统,它很像加速填弹器,但在开启时还会额外提高一些速度。先将其翻译为英文Assault Feed,然后根据与舰船、武器类似的方式加上前缀名,形成它的战术系统 ID 为GearIn_assaultfeed。

然后将加速填弹器的ammofeed.system从原版专门用于存放战术系统的data/shipsystems文件夹内复制到 MOD 的同路径下,文件名改为GearIn_assaultfeed.system,开始修改:

{
	"id":"ammofeed",
	"type":"STAT_MOD",
	"aiType":"WEAPON_BOOST",
	
	"statsScript":"data.shipsystems.scripts.AmmoFeedStats",
	
	"weaponGlowColor":[255,200,0,155],
	"weaponTypes":[BALLISTIC],
	
	"useSound":"system_ammo_feeder",
	"outOfUsesSound":"gun_out_of_ammo",
}

编者认为您一定会注意到id就是它的战术系统 ID,而下文的statsScript就是对应的效果代码路径。您可能会注意到编者这次没有列出速查表,因为战术系统的许多项目都与type相绑定,而可选项极多,因此不适合以速查表形式列出,更适合直接在需要时从原版的战术系统内复制而来。

修改战术系统最需要注意的就是type和aiType,前者决定了这个战术系统的运作方式,后者决定了它的默认 AI。

AI 行为注意

不同的aiType往往只能应用于它对应的那一种type上,否则将在舰船按下 U 的瞬间报错。

因此在后续进阶环节往往需要自行编写 AI。

进行修改:

{
	"id":"GearIn_assaultfeed",
	"type":"STAT_MOD",
	"aiType":"WEAPON_BOOST",
	
	"statsScript":"data.shipsystems.scripts.GearIn_AssaultFeedStats",
	
	"weaponGlowColor":[255,200,0,155],
	"weaponTypes":[BALLISTIC],
	
	"useSound":"system_ammo_feeder",
	"outOfUsesSound":"gun_out_of_ammo",
}

修改statsScript是为了调整代码,因为编者预期的战术系统有不同的效果。在shipsystems文件夹内新建一个叫scripts的文件夹,然后将原版的AmmoFeedStats.java,复制到其中,并改名为GearIn_AssaultFeedStats.java。

注意大小写

大小写很重要。

然后打开文件,准备修改:

package data.shipsystems.scripts;

import com.fs.starfarer.api.combat.MutableShipStatsAPI;
import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;

public class AmmoFeedStats extends BaseShipSystemScript {

	public static final float ROF_BONUS = 1f;
	public static final float FLUX_REDUCTION = 50f;
	
	public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
		
		float mult = 1f + ROF_BONUS * effectLevel;
		stats.getBallisticRoFMult().modifyMult(id, mult);
		stats.getBallisticWeaponFluxCostMod().modifyMult(id, 1f - (FLUX_REDUCTION * 0.01f));
		
//		ShipAPI ship = (ShipAPI)stats.getEntity();
//		ship.blockCommandForOneFrame(ShipCommand.FIRE);
//		ship.setHoldFireOneFrame(true);
	}
	public void unapply(MutableShipStatsAPI stats, String id) {
		stats.getBallisticRoFMult().unmodify(id);
		stats.getBallisticWeaponFluxCostMod().unmodify(id);
	}
	
	public StatusData getStatusData(int index, State state, float effectLevel) {
		float mult = 1f + ROF_BONUS * effectLevel;
		float bonusPercent = (int) ((mult - 1f) * 100f);
		if (index == 0) {
			return new StatusData("ballistic rate of fire +" + (int) bonusPercent + "%", false);
		}
		if (index == 1) {
			return new StatusData("ballistic flux use -" + (int) FLUX_REDUCTION + "%", false);
		}
		return null;
	}
}

简直令人眼花缭乱。但即使以外行的身份,可以做一些简单的解析:

package data.shipsystems.scripts; // package 是当前路径

import com.fs.starfarer.api.combat.MutableShipStatsAPI; // 以 import 为开头的语句是导入,只有导入了对应接口,才能“做一些事”
import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;

public class AmmoFeedStats extends BaseShipSystemScript { // AmmoFeedStats 和之前的文件名文件名相同,这里似乎要把它改成当前的文件名

	public static final float ROF_BONUS = 1f; // 先不用管 public static final 是什么意思,只需要注意到 float 是一种数字的意思就行。这里认为 ROF_BONUS 代表 1。float 数字的结尾往往必须带f。
	public static final float FLUX_REDUCTION = 50f; // 同上,一个叫 FLUX_REDUCTION 的东西代表 50
	
	public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
		
		float mult = 1f + ROF_BONUS * effectLevel; // 似乎是在进行某种不为人知的计算
		stats.getBallisticRoFMult().modifyMult(id, mult); // 进行射速增益
		stats.getBallisticWeaponFluxCostMod().modifyMult(id, 1f - (FLUX_REDUCTION * 0.01f)); // 降低幅能产生
		
        // 诸如这种用 "//" 两个斜杠打头的行叫做 注释,注释 代码不会运行,您可以把它当做笔记
        // 所以下方的三行没有任何作用,可以忽视
//		ShipAPI ship = (ShipAPI)stats.getEntity();
//		ship.blockCommandForOneFrame(ShipCommand.FIRE);
//		ship.setHoldFireOneFrame(true);
	}
	public void unapply(MutableShipStatsAPI stats, String id) {
		stats.getBallisticRoFMult().unmodify(id); // 在战术系统结束后取消增益
		stats.getBallisticWeaponFluxCostMod().unmodify(id);
	}
	
	public StatusData getStatusData(int index, State state, float effectLevel) {
		float mult = 1f + ROF_BONUS * effectLevel;
		float bonusPercent = (int) ((mult - 1f) * 100f);
		if (index == 0) { // 据文字推断,也许是文字提示
			return new StatusData("ballistic rate of fire +" + (int) bonusPercent + "%", false);
		}
		if (index == 1) {
			return new StatusData("ballistic flux use -" + (int) FLUX_REDUCTION + "%", false);
		}
		return null;
	}
}

而刚才提到的加速功能和原版的辅助推进器十分相似。在找到加速填弹器代码相同的位置可以找到辅助推进器的代码文件ManeuveringJetsStats.java,打开检查:

package data.shipsystems.scripts; // 也是路径

import com.fs.starfarer.api.Global; // 一些 import
import com.fs.starfarer.api.combat.MutableShipStatsAPI;
import com.fs.starfarer.api.combat.ShipAPI;
import com.fs.starfarer.api.combat.ShipEngineControllerAPI.ShipEngineAPI;
import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;
import com.fs.starfarer.api.plugins.ShipSystemStatsScript;

public class ManeuveringJetsStats extends BaseShipSystemScript { // 也和文件名相同

	public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
		if (state == ShipSystemStatsScript.State.OUT) { // 一些意义不明的判断
			stats.getMaxSpeed().unmodify(id); // to slow down ship to its regular top speed while powering drive down
			stats.getMaxTurnRate().unmodify(id);
		} else {
			stats.getMaxSpeed().modifyFlat(id, 50f); // 似乎是加成,比如加 50 速
			stats.getAcceleration().modifyPercent(id, 200f * effectLevel); // 似乎是机动性加成
			stats.getDeceleration().modifyPercent(id, 200f * effectLevel);
			stats.getTurnAcceleration().modifyFlat(id, 30f * effectLevel);
			stats.getTurnAcceleration().modifyPercent(id, 200f * effectLevel);
			stats.getMaxTurnRate().modifyFlat(id, 15f);
			stats.getMaxTurnRate().modifyPercent(id, 100f);
		}
		
		if (stats.getEntity() instanceof ShipAPI && false) { // 未知语句
			ShipAPI ship = (ShipAPI) stats.getEntity();
			String key = ship.getId() + "_" + id;
			Object test = Global.getCombatEngine().getCustomData().get(key);
			if (state == State.IN) {
				if (test == null && effectLevel > 0.2f) {
					Global.getCombatEngine().getCustomData().put(key, new Object());
					ship.getEngineController().getExtendLengthFraction().advance(1f);
					for (ShipEngineAPI engine : ship.getEngineController().getShipEngines()) {
						if (engine.isSystemActivated()) {
							ship.getEngineController().setFlameLevel(engine.getEngineSlot(), 1f);
						}
					}
				}
			} else {
				Global.getCombatEngine().getCustomData().remove(key);
			}
		}
	}
	public void unapply(MutableShipStatsAPI stats, String id) {
		stats.getMaxSpeed().unmodify(id); // 似乎是取消速度加成和机动性加成
		stats.getMaxTurnRate().unmodify(id); // 可以稍加推断,之前加成的项目都要在这里取消
		stats.getTurnAcceleration().unmodify(id);
		stats.getAcceleration().unmodify(id);
		stats.getDeceleration().unmodify(id);
	}
	
	public StatusData getStatusData(int index, State state, float effectLevel) {
		if (index == 0) { // 这里文字显然是启动时左下角的描述,那么 getStatusData 一定是用来控制文字描述的
			return new StatusData("improved maneuverability", false);
		} else if (index == 1) {
			return new StatusData("+50 top speed", false);
		}
		return null;
	}
}

虽然猜测很粗糙,但也八九不离十了。接下来要做的事情就是大胆地把需要的部分拼在一起,所以进行修改:

package data.shipsystems.scripts;

import com.fs.starfarer.api.combat.MutableShipStatsAPI;
import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;

import com.fs.starfarer.api.Global; // 为避免少导了什么东西,import 应该同时包括这两者的
import com.fs.starfarer.api.combat.ShipAPI;
import com.fs.starfarer.api.combat.ShipEngineControllerAPI.ShipEngineAPI;
import com.fs.starfarer.api.plugins.ShipSystemStatsScript;

public class GearIn_AssaultFeedStats extends BaseShipSystemScript {

	public static final float ROF_BONUS = 1f;
	public static final float FLUX_REDUCTION = 50f;
	
	public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
		
		float mult = 1f + ROF_BONUS * effectLevel;
		stats.getBallisticRoFMult().modifyMult(id, mult);
		stats.getBallisticWeaponFluxCostMod().modifyMult(id, 1f - (FLUX_REDUCTION * 0.01f));
		
		if (state == ShipSystemStatsScript.State.OUT) { 
			stats.getMaxSpeed().unmodify(id); // to slow down ship to its regular top speed while powering drive down
			stats.getMaxTurnRate().unmodify(id);
		} else {
			stats.getMaxSpeed().modifyFlat(id, 50f); 
			stats.getAcceleration().modifyPercent(id, 200f * effectLevel);
			stats.getDeceleration().modifyPercent(id, 200f * effectLevel);
			stats.getTurnAcceleration().modifyFlat(id, 30f * effectLevel);
			stats.getTurnAcceleration().modifyPercent(id, 200f * effectLevel);
			stats.getMaxTurnRate().modifyFlat(id, 15f);
			stats.getMaxTurnRate().modifyPercent(id, 100f);
		}
	}
	public void unapply(MutableShipStatsAPI stats, String id) {
		stats.getBallisticRoFMult().unmodify(id);
		stats.getBallisticWeaponFluxCostMod().unmodify(id);
        
        stats.getMaxSpeed().unmodify(id);
		stats.getMaxTurnRate().unmodify(id);
		stats.getTurnAcceleration().unmodify(id);
		stats.getAcceleration().unmodify(id);
		stats.getDeceleration().unmodify(id);
	}
	
	public StatusData getStatusData(int index, State state, float effectLevel) {
		float mult = 1f + ROF_BONUS * effectLevel;
		float bonusPercent = (int) ((mult - 1f) * 100f);
		if (index == 0) {
			return new StatusData("ballistic rate of fire +" + (int) bonusPercent + "%", false);
		}
		if (index == 1) {
			return new StatusData("ballistic flux use -" + (int) FLUX_REDUCTION + "%", false);
		}
        
        if (index == 2) { // 依葫芦画瓢,上面是 0 和 1 那么这里就改成 2 和 3
			return new StatusData("improved maneuverability", false);
		} else if (index == 3) {
			return new StatusData("+50 top speed", false);
		}
		return null;
	}
}

这就做好了。在不清楚原理的初学者阶段,建议保持最小触动原则。

制作战术系统数据

战术系统数据储存在data/shipsystems文件夹内的ship_systems.csv里,框架已经提供了这个文件。

编者相信您此时已经开始打开原版的ship_systems.csv并且把加速填弹器的那一行复制过来并调整了id和name,毕竟您应该已经对这两个项目产生条件反射了:

name,id,flux/second,f/s (base rate),f/s (base cap),flux/use,f/u (base rate),f/u (base cap),cr/u,max uses,regen,charge up,active,down,cooldown,toggle,noDissipation,noHardDissipation,hardFlux,noFiring,noTurning,noStrafing,noAccel,noShield,noVent,isPhaseCloak,tags,icon
,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Burn Drive,burndrive,1,,,,,,,,,2,5,1,10,TRUE,,,,,TRUE,TRUE,TRUE,TRUE,,,,graphics/icons/hullsys/burn_drive.png
,,,,,,,,,,,,,,,,,,,,,,,,,,,
突击填弹器,GearIn_assaultfeed,,,,,,,,,,1,5,1,10,,,,,,,,,,,,,graphics/icons/hullsys/ammo_feeder.png

实用战术系统数据速查表

英文实际意义
name战术系统的名称
id战术系统 ID
flux/second战术系统每秒产生的幅能数量
f/s (base rate)战术系统每秒产生的幅能数量与舰船基础耗散速率的比率,与flux/second可共同作用
f/s (base cap)战术系统每秒产生的幅能数量与舰船基础幅能容量的比率,与flux/second、f/s (base rate)可共同作用
flux/use战术系统每次启动产生的幅能数量
f/u (base rate)战术系统每次启动产生的幅能数量与舰船基础耗散速率的比率,与flux/use可共同作用
f/u (base cap)战术系统每次启动产生的幅能数量与舰船基础耗散速率的比率,与flux/use、f/u (base rate)可共同作用
cr/u战术系统每次启动所消耗的 CR
max uses战术系统充能次数,不填为无限
regen在max uses有限的情况下启动,充能次数的恢复速率,单位是 次/秒,不填则为不可恢复
charge up前摇时长。战术系统前摇时往往也有效果,从无到渐强
active全功率激活时长
down后摇时长。战术系统后摇时往往也有效果,从全到渐弱
cooldown冷却时长。
toggle设为 TRUE 时,战术系统将变为开关式的。默认为 FALSE
noDissipation设为 TRUE 时,战术系统启动时无法耗散幅能。默认为 FALSE
noHardDissipation设为 TRUE 时,战术系统启动时无法耗散硬幅能。默认为 FALSE
hardFlux设为 TRUE 时,战术系统产生的幅能为硬幅能,否则为软幅能。默认为 FALSE
noFiring设为 TRUE 时,战术系统启动时无法开火。默认为 FALSE
noTurning设为 TRUE 时,战术系统启动时无法转向。默认为 FALSE
noStrafing设为 TRUE 时,战术系统启动时无法左右平移。默认为 FALSE
noAccel设为 TRUE 时,战术系统启动时无法向前加速。默认为 FALSE
noShield设为 TRUE 时,战术系统启动时无法启动护盾或右键战术系统。默认为 FALSE
noVent设为 TRUE 时,战术系统启动时无法按 V 排散。默认为 FALSE
isPhaseCloak设为 TRUE 时,战术系统被认为是一种相位,虽然实际上未必有相位效果。默认为 FALSE
tags进阶内容,可随意编纂,原版范畴内仅restricted和uses_damper_ai
icon战术系统的图标贴图路径

战术系统实装

编者认为突击填弹器的效果非常强力,可以让它的前摇和持续时间缩短一些,来提供机会操作手感,让它变得不那么无聊。

打开ship_data.csv,进行修改:

name,id,designation,tech/manufacturer,system id,fleet pts,hitpoints,armor rating,max flux,8/6/5/4%,flux dissipation,ordnance points,fighter bays,max speed,acceleration,deceleration,max turn rate,turn acceleration,mass,shield type,defense id,shield arc,shield upkeep,shield efficiency,phase cost,phase upkeep,min crew,max crew,cargo,fuel,fuel/ly,range,max burn,base value,cr %/day,CR to deploy,peak CR sec,CR loss/sec,supplies/rec,supplies/mo,c/s,c/f,f/s,f/f,crew/s,crew/f,hints,tags,rarity,breakProb,minPieces,maxPieces,travel drive,number
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Lasher,lasher,Frigate,Low Tech,ammofeed,5,1750,300,2100,1750,140,55,,120,110,90,60,90,200,FRONT,,210,0.4,1,,,25,50,40,25,1,25,10,9000,8,10,240,0.25,4,4,,,,,,,,"lowtech_bp, merc",,0.4,2,2,,204
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Hammerhead,hammerhead,Destroyer,Midline,ammofeed,10,5000,500,4200,4167,250,95,,90,60,40,30,60,400,FRONT,,300,0.4,0.8,,,50,100,100,60,2,30,9,40000,5,12,360,0.25,10,10,,,,,,,,"midline_bp, merc",,0.5,2,3,,300
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Eagle,eagle,Cruiser,Midline,maneuveringjets,14,8000,1000,11000,12000,600,155,,50,30,20,15,20,1200,FRONT,,270,0.4,0.8,,,150,250,150,100,3,33,8,120000,3,12,480,0.25,22,22,,,,,,,,"rare_bp, merc",,0.5,2,3,,401
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Conquest,conquest,Battlecruiser,Midline,maneuveringjets,24,12000,1200,20000,30000,1200,315,,45,20,15,6,4,2500,OMNI,,90,0.4,1.4,,,400,500,300,300,10,30,8,300000,3,15,600,0.25,40,40,,,,,,,,"rare_bp, merc",,0.5,2,4,,503
,,,,,,,,,,,,,,,,,,,,,,,,,,,,

炉渣,GearIn_slag,,未知,flarelauncher_fighter,,750,100,200,,100,0,,180,400,350,90,180,30,NONE,,0,0,0,,,1,1,,,,,,,,,,,,,,,,,,,,,,0,,,,104

锻件,GearIn_forging,相位护卫舰,未知,ammofeed,6,2000,350,1200,2000,100,35,,90,120,90,45,90,200,PHASE,phasecloak,90,,,0.075,0.075,4,10,10,20,1,20,9,26000,10,20,180,0.25,6,6,,,,,,,PHASE,base_bp,,0.5,2,2,,228

工匠,GearIn_artizan,驱逐舰,未知,GearIn_assaultfeed,10,5000,500,3800,4167,200,95,,80,60,40,30,60,400,FRONT,,300,0.4,0.8,,,50,100,100,60,2,30,9,40000,5,12,360,0.25,10,10,,,,,,,,"midline_bp, merc",,0.5,2,3,,300
看炉人,GearIn_furnaceman,轻型航母,未知,targetingfeed,11,4500,400,3000,2813,225,75,2,75,50,30,25,25,450,FRONT,,300,0.4,0.8,,,90,150,40,40,2,20,9,52000,5,15,360,0.25,13,13,,,,,,,CARRIER,"midline_bp, merc",,0.5,2,3,,318

如果您在这个过程中没有忘了保存或打错字或填错东西或看错格子...

那您就可以在游戏中使用您自己的战术系统了。

制作非相位右键战术系统

编者建议您目前阶段只设计防御型右键战术系统,因为您现在可能并没有编写 AI 的能力,而原版当前支持非相位右键战术系统的 AI 只有阻尼力场。强行设计其它类型的右键战术系统会导致它在游戏内难以被 AI 理解,强行套用其它 AI 更是会直接让游戏报错。

在本例,编者将设计一种抵抗力场,大致上是阻尼力场的调整版,让它更倾向于抵抗高爆伤害,战术系统 ID 为GearIn_resistfield。将原版的damper.system复制并修改文件名为GearIn_resistfield.system,内容调整为如下:

{
	"id":"GearIn_resistfield",
	"type":"STAT_MOD",
	"aiType":"DAMPER_FIELD",
	
	"statsScript":"data.shipsystems.scripts.GearIn_ResistFieldStats",
	
	"jitterUnderColor":[255,165,90,155],
	"jitterUnderCopies":25,
	"jitterUnderMinRange":0,
	"jitterUnderRange":7,
	"jitterUnderRangeRadiusFraction":0,
	
	"jitterColor":[255,165,90,55],
	"jitterCopies":2,
	"jitterMinRange":0,
	"jitterRange":5,
	"jitterRangeRadiusFraction":0,
	
	#"weaponGlowColor":[255,165,90,0],
	#"weaponTypes":[ENERGY, BALLISTIC, MISSILE],
	
	#"engineGlowColor":[255,90,255,255],
	
	"soundFilterType":"LOWPASS",
	"soundFilterGain":0.75,
	"soundFilterGainHF":0.25,

	"fadeActivationSoundOnChargedown":true,
	"useSound":"system_damper",
	"loopSound":"system_damper_loop",
	"deactivateSound":"system_damper_off",
	"outOfUsesSound":"gun_out_of_ammo",
	
	"aiHints":{
	}
}

然后是scripts文件夹里的GearIn_ResistFieldStats.java:

package data.shipsystems.scripts;

import com.fs.starfarer.api.combat.MutableShipStatsAPI;
import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;

public class GearIn_ResistFieldStats extends BaseShipSystemScript {

	public static final float HE_REDUCTION = 75f;
	public static final float EMP_REDUCTION = 75f;
	public static final float OTHER_REDUCTION = 50f;
	
	public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {

		stats.getHighExplosiveDamageTakenMult().modifyMult(id, 1f - HE_REDUCTION * 0.01f * effectLevel);
		stats.getKineticDamageTakenMult().modifyMult(id, 1f - OTHER_REDUCTION * 0.01f * effectLevel);
		stats.getEnergyDamageTakenMult().modifyMult(id, 1f - OTHER_REDUCTION * 0.01f * effectLevel);
		stats.getEmpDamageTakenMult().modifyMult(id, 1f - EMP_REDUCTION * 0.01f * effectLevel);

	}
	public void unapply(MutableShipStatsAPI stats, String id) {

		stats.getHighExplosiveDamageTakenMult().unmodify(id);
		stats.getKineticDamageTakenMult().unmodify(id);
		stats.getEnergyDamageTakenMult().unmodify(id);
		stats.getEmpDamageTakenMult().unmodify(id);
	}
	
	public StatusData getStatusData(int index, State state, float effectLevel) {
		if (index == 0) {
			return new StatusData("reduce damage taken", false);
		}
		return null;
	}
}

以及在ship_systems.csv里加上从阻尼力场抄过来小修小改的一行:

name,id,flux/second,f/s (base rate),f/s (base cap),flux/use,f/u (base rate),f/u (base cap),cr/u,max uses,regen,charge up,active,down,cooldown,toggle,noDissipation,noHardDissipation,hardFlux,noFiring,noTurning,noStrafing,noAccel,noShield,noVent,isPhaseCloak,tags,icon
,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Burn Drive,burndrive,1,,,,,,,,,2,5,1,10,TRUE,,,,,TRUE,TRUE,TRUE,TRUE,,,,graphics/icons/hullsys/burn_drive.png
,,,,,,,,,,,,,,,,,,,,,,,,,,,
突击填弹器,GearIn_assaultfeed,,,,,,,,,,0.5,3,1,10,,,,,,,,,,,,,graphics/icons/hullsys/ammo_feeder.png
抵抗力场,GearIn_resistfield,1,,,,,,,2,0.05,0.25,3,0.25,0,,,,,TRUE,,,,TRUE,TRUE,,uses_damper_ai,graphics/icons/hullsys/damper_field.png

注意抵抗力场/阻尼力场的tags不为空,而是uses_damper_ai。

因为实在没有什么新的载体,所以编者打算直接让工匠-级驱逐舰搭载它。将护盾替换为PHASE,并按前文的解释填上右键防御系统的 ID:

name,id,designation,tech/manufacturer,system id,fleet pts,hitpoints,armor rating,max flux,8/6/5/4%,flux dissipation,ordnance points,fighter bays,max speed,acceleration,deceleration,max turn rate,turn acceleration,mass,shield type,defense id,shield arc,shield upkeep,shield efficiency,phase cost,phase upkeep,min crew,max crew,cargo,fuel,fuel/ly,range,max burn,base value,cr %/day,CR to deploy,peak CR sec,CR loss/sec,supplies/rec,supplies/mo,c/s,c/f,f/s,f/f,crew/s,crew/f,hints,tags,rarity,breakProb,minPieces,maxPieces,travel drive,number
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Lasher,lasher,Frigate,Low Tech,ammofeed,5,1750,300,2100,1750,140,55,,120,110,90,60,90,200,FRONT,,210,0.4,1,,,25,50,40,25,1,25,10,9000,8,10,240,0.25,4,4,,,,,,,,"lowtech_bp, merc",,0.4,2,2,,204
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Hammerhead,hammerhead,Destroyer,Midline,ammofeed,10,5000,500,4200,4167,250,95,,90,60,40,30,60,400,FRONT,,300,0.4,0.8,,,50,100,100,60,2,30,9,40000,5,12,360,0.25,10,10,,,,,,,,"midline_bp, merc",,0.5,2,3,,300
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Eagle,eagle,Cruiser,Midline,maneuveringjets,14,8000,1000,11000,12000,600,155,,50,30,20,15,20,1200,FRONT,,270,0.4,0.8,,,150,250,150,100,3,33,8,120000,3,12,480,0.25,22,22,,,,,,,,"rare_bp, merc",,0.5,2,3,,401
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#Conquest,conquest,Battlecruiser,Midline,maneuveringjets,24,12000,1200,20000,30000,1200,315,,45,20,15,6,4,2500,OMNI,,90,0.4,1.4,,,400,500,300,300,10,30,8,300000,3,15,600,0.25,40,40,,,,,,,,"rare_bp, merc",,0.5,2,4,,503
,,,,,,,,,,,,,,,,,,,,,,,,,,,,

炉渣,GearIn_slag,,未知,flarelauncher_fighter,,750,100,200,,100,0,,180,400,350,90,180,30,NONE,,0,0,0,,,1,1,,,,,,,,,,,,,,,,,,,,,,0,,,,104

锻件,GearIn_forging,相位护卫舰,未知,ammofeed,6,2000,350,1200,2000,100,35,,90,120,90,45,90,200,PHASE,phasecloak,90,,,0.075,0.075,4,10,10,20,1,20,9,26000,10,20,180,0.25,6,6,,,,,,,PHASE,base_bp,,0.5,2,2,,228

工匠,GearIn_artizan,驱逐舰,未知,GearIn_assaultfeed,10,5000,500,3800,4167,200,95,,80,60,40,30,60,400,PHASE,GearIn_resistfield,,,,0.1,0,50,100,100,60,2,30,9,40000,5,12,360,0.25,10,10,,,,,,,,"midline_bp, merc",,0.5,2,3,,300
看炉人,GearIn_furnaceman,轻型航母,未知,targetingfeed,11,4500,400,3000,2813,225,75,2,75,50,30,25,25,450,FRONT,,300,0.4,0.8,,,90,150,40,40,2,20,9,52000,5,15,360,0.25,13,13,,,,,,,CARRIER,"midline_bp, merc",,0.5,2,3,,318

制作相位右键战术系统?

相位右键战术系统和非相位右键战术系统并没有本质差别,无非是带相位的要将isPhased设为 True 且它的代码文件里把舰船设为相位状态而已。如果您需要了解更多能对舰船执行的操作,还请等待后文。

Edit this page
Last Updated:
Contributors: 1847905557
Prev
小节 武器
Next
小节 舰船插件