本文介绍能力写法与magicNumber的使用
power需要继承AbstractPower,其构造方法无参
静态方法规范图片路径
public static String makePowerPath(String id, int size) {
if (size == 84) {
return getImgPath() + "powers/" + id + "_84.png";
} else {
return size == 32 ? getImgPath() + "powers/" + id + "_32.png" : "ERROR!";
}
}
写个抽象类
public abstract class AbstractModPower extends AbstractPower {
protected String[] descriptions;
public AbstractModPower(String id, AbstractCreature owner, int amount, PowerType type){
this.ID = id;
this.owner = owner;
this.amount = amount;
this.type = type;
this.name = CardCrawlGame.languagePack.getPowerStrings(id).NAME;
this.descriptions = CardCrawlGame.languagePack.getPowerStrings(id).DESCRIPTIONS;
this.region128 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 84)), 0, 0, 84, 84);
this.region48 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 32)), 0, 0, 32, 32);
this.updateDescription();
}
public AbstractModPower(String id, AbstractCreature owner, PowerType type){
this.ID = id;
this.owner = owner;
this.type = type;
this.name = CardCrawlGame.languagePack.getPowerStrings(id).NAME;
this.descriptions = CardCrawlGame.languagePack.getPowerStrings(id).DESCRIPTIONS;
this.region128 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 84)), 0, 0, 84, 84);
this.region48 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 32)), 0, 0, 32, 32);
this.updateDescription();
}
public AbstractModPower(String id,AbstractCreature owner){
this.ID = id;
this.owner = owner;
this.type = PowerType.BUFF;
this.name = CardCrawlGame.languagePack.getPowerStrings(id).NAME;
this.descriptions = CardCrawlGame.languagePack.getPowerStrings(id).DESCRIPTIONS;
this.region128 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 84)), 0, 0, 84, 84);
this.region48 = new TextureAtlas.AtlasRegion(ImageMaster.loadImage(ModInfo.makePowerPath(id.split(":")[1], 32)), 0, 0, 32, 32);
this.updateDescription();
}
}
region128 region48是能力的不同分辨率的配图
写能力后记得配上32×32、84×84分辨率的p_name_32.png、p_name_84.png的图片
现在我们来写一张效果为“你的下1张攻击牌伤害翻倍”的1费能力牌(升级后次数+1)
可以先写本地化
{
"Mod:DoubleDamagePower": {
"NAME" : "双倍!",
"DESCRIPTIONS" : [
"你的下 #b%d 张攻击牌将造成双倍伤害"
]
}
}
这下看懂了
public class DoubleDamagePower extends AbstractModPower {
public static final String ID = "Mod:DoubleDamagePower";
public DoubleDamagePower(AbstractPlayer p, int amount){
super(ID,p,amount,PowerType.BUFF);
}
@Override
public float atDamageGive(float damage, DamageInfo.DamageType type, AbstractCard card) {
if(card != null && card.type == AbstractCard.CardType.ATTACK){
addToTop(new ReducePowerAction(this.owner,this.owner,this,1));
updateDescription();
return type == DamageInfo.DamageType.NORMAL ? damage * 2.0F : damage;
}
return damage;
}
public void updateDescription(){
this.description = String.format(this.descriptions[0],this.amount);
}
}
造成伤害时,如果来源牌为攻击牌,伤害类型为normal,将伤害翻倍,然后减少一点能力层数
游戏内要显示出“下x张攻击牌”,便可以在层数减少时使用字符串format动态更新能力文本
最后就可以把卡牌写出来了
public class DoubleDamage extends AbstractModCard {
public static final String ID = "Mod:DoubleDamage";
public DoubleDamage(){
super(ID,1,CardType.POWER,CardRarity.UNCOMMON,CardTarget.SELF);
this.magicNumber = 1;
}
@Override
public void use(AbstractPlayer p, AbstractMonster m) {
addToBot(new ApplyPowerAction(p,p,new DoubleDamagePower(p,this.magicNumber)));
}
@Override
public void upgrade() {
if(!this.upgraded){
upgradeName();
upgradeMagicNumber(1);
}
}
}
本地化
{
"Mod:DoubleDamage":{
"NAME" :"双倍!",
"DESCRIPTION": "你的下 !M! 张攻击牌将造成双倍伤害"
}
}
由于升级后需要改变获取能力的层数,并且在卡牌文本中展示,就需要使用到magicNumber,与本地化中 !M! 对应
实际上原版有一个叫"Double Damage"的能力,其他地方也有重名的可能,所以写自己的mod的时候使用 mod名:id 的id格式可以避免冲突