作者 主题: [宏]4E实用宏  (阅读 3126 次)

副标题: 加/减血,先攻,技能

离线 AlbertNi

  • Sleeper, Lord of Helpless, The Brainless
  • 版主
  • *
  • 帖子数: 7260
  • 苹果币: 2
[宏]4E实用宏
« 于: 2010-03-07, 周日 05:53:46 »
最近重新整理了一下战役用的宏,顺便把技能宏也修正到能用的程度了……
不定期更新
顺便说明,以下宏我都在b63下实战测试过,应该也能向上兼容之后的一些MT版本。但是之前的版本因为考虑到脚本函数等的支持程度不保证有效,请自行测试。

因为宏比较多,说明一下通用的格式:
--------------------------------------------
名称@位置(宏属性设置)
说明
代码: [选择]
代码
  • 参数:需要的变量/参数。
  • 返回:返回的变量,多个变量默认使用json array
  • 属性:需要的战役属性(property)
  • 依赖:需要调用的其他宏
--------------------------------------------
顺便一提,macro.args是在宏被调用时接收到的参数,在参数一项中省略(因为我通常会先将本地变量根据参数进行赋值),除非特别说明


Change Health@campaign(自动执行,针对选中目标)
改变血量的宏,扣血时优先从临时生命中扣除,补血从0点开始补(即采用4E算法),补血不会超过最大生命值。没有任何文字输出。在我的战役中只是作为底层宏让其他宏调用。
代码: [选择]
[H:Change=macro.args][H:OldHP=HP][H:OldTemp=TempHP]
[H:TempHP = if(Change<=0, TempHP+Change, TempHP)]
[H:HP=if(TempHP<0, HP+TempHP, HP)]
[H:HP=if(Change>0, min(max(Change,(HP+Change)), MaxHP), HP)]
[H:TempHP=max(0, TempHP)]
  • 参数:Change:变化的血量,正为加血,负为伤血。
  • 返回:无
  • 属性:HP(当前血量), MaxHP(最大血量),TempHP(当前临时生命值)
  • 依赖:无
Set Health Bar@campaign(自动执行,针对选中目标)
设置血条的长度. 半血以上, 半血到0, 0点血到负半血分别采用不同的血条(我的战役中是颜色不同), 以便迅速反映伤血状况
代码: [选择]
[H:Monster=macro.args]
[H:HPLength=(HP/MaxHP)]
[H: setBarVisible("Health",0)]
[H: setBarVisible("BloodiedHP",0)]
[H: setBarVisible("DyingHP",0)]
[H:B = if(HP<=Bloodied, 1, 0)][H: B=if(HP<=0&&Monster==0, 2, B)]
[H,SWITCH(B):
case 0: bar.Health=HPLength;
case 1: bar.BloodiedHP=HPLength;
case 2: bar.DyingHP=1+HP/Bloodied]
  • 参数:Monster:非0值表示是怪物, 不启用负血的血条(因为怪物0血就死)
  • 返回:无
  • 属性:HP(当前血量), MaxHP(最大血量), Bloodied(半血值); bar:Health(半血以上的血条),BloodiedHP(半血以后的血条),DyingHP(濒死时的血条)
  • 依赖:无
Hurt/Heal@campaign(自动执行,针对选中目标)
最常用的伤血/补血宏,有文字输出并自动改变血条,半血/濒死时有文字提醒。因为实战中往往伤血比补血多,因此默认输入的数值是伤血的数值,换言之若要补血就输入负值。
代码: [选择]
[h: Damage = DamageTaken][h: OldHP = HP][h: OldTemp = TempHP]
[MACRO("Change Health@campaign"):-Damage]
{if (Damage>=0, "Damage Taken:", "HP Healed:")}
{if (Damage>=0, Damage, -Damage)}
{if (Damage>=0&&OldTemp>0, "("+min(OldTemp, Damage)+"/"+Damage+" to Temp HP)", "")}<br>
Current HP: {HP}/{MaxHP}, {round(HP/MaxHP*100)}% left <font color="red">{if(OldHP>Bloodied&&HP<=Bloodied&&HP>0, "(Now Bloodied)", "")}{if(OldHP>0&&HP<=0&&HP>-Bloodied, "(Now Dying!)", "")}{if(OldHP>-Bloodied&&HP<=-Bloodied, "(Dead)", "")}</font><br>
{if (TempHP!=0||OldTemp!=0, "Current Temporary HP: "+TempHP, "")}
[MACRO("Set Health Bar@campaign"):0]
  • 参数:Damage/DamageTaken:受到的伤害,负值为补血。
  • 返回:无
  • 属性:继承HP, MaxHP, TempHP,Bloodied;bar:Health,BloodiedHP,DyingHP
  • 依赖:Change Health@campaign,Set Health Bar@campaign
Spend HS@campaign(自动执行,针对选中目标)
较常用的花费HS的宏,会扣除HS并相应加HS的血。若没有HS则无效。
代码: [选择]
{if(SurgeRemaining>0, "HP Healed: "+SurgeValue, "No Healing Surge")}<br>
[MACRO("Change Health@campaign"):if(SurgeRemaining>0, SurgeValue, 0)]
Current HP: {HP}/{MaxHP}, {round(HP/MaxHP*100)}% left<br>
HS Remaining: {SurgeRemaining=max(SurgeRemaining-1,0)}
[MACRO("Set Health Bar@campaign"):0]
  • 参数:无
  • 返回:无
  • 属性:SurgeRemaining(当前剩余的HS数量),SurgeValue(每个HS补的血量)。继承HP, MaxHP, TempHP,Bloodied;bar:Health,BloodiedHP,DyingHP
  • 依赖:Change Health@campaign,Set Health Bar@campaign
Initiative@campaign(自动执行,针对选中目标)
投先攻骰并把token加入先攻表。同样先攻的根据加值高低排列。注意先攻表需要sort以后才会按照先攻顺序排列。我一般会把遭遇中所有的token都选中然后点一下这个宏,这样就把所有人的先攻都投好了。
代码: [选择]
[H: addToInitiative()]
[H: Initiative=1d20+InitBonus*1.01][H:token.init=Initiative]
Initiative Rolled: [round(Initiative)]
  • 参数:无
  • 返回:无
  • 属性:InitBonus(token的先攻加值)
  • 依赖:无
Skill@campaign(自动执行,针对选中目标)
显而易见的投技能宏(技能列表为4E)
代码: [选择]
[H: skillList = json.fromList("Acrobatics, Arcana, Athletics, Bluff, Diplomacy, Dungeoneering, Endurance, Heal, History, Insight, Intimidate, Nature, Perception, Religion, Stealth, Streetwise, Thievery")]
[H: abList = json.fromList("Dex, Int, Str, Cha, Cha, Wis, Con, Wis, Int, Wis, Cha, Wis, Wis, Int, Dex, Cha, Dex")]
[h:abort(input("skillUsed|Acrobatics,Arcana,Athletics,Bluff,Diplomacy,Dungeoneering,Endurance,Heal,History,Insight,Intimidate,Nature,Perception,Religion,Stealth,Streetwise,Thievery|Skill|LIST", "ACP|0|Armor Check Penalty", "misc|0|Misc. Bonus"))]
[h:skill=json.get(skillList, skillUsed)][h:ab=json.get(abList, skillUsed)]
{skill} Check: [1d20+LevelBonus+eval(skill)+eval(ab+"Bonus")-ACP+misc]
  • 参数:skillUsed(使用的技能,从列表中选定),ACP(盔甲检定罚值),misc(杂项加值)
  • 返回:无
  • 属性:Acrobatics, Arcana, Athletics, Bluff, Diplomacy, Dungeoneering, Endurance, Heal, History, Insight, Intimidate, Nature, Perception, Religion, Stealth, Streetwise, Thievery(各项技能的加值,其中不包含属性加值等,4E的标准情况就是+0或者+5), StrBonus, ConBonus, DexBonus, IntBonus, WisBonus, ChaBonus(属性调整值),LevelBonus(等级的一半)
  • 依赖:无
--------------------------------------------
5月22日更新,一些简单但是实用的宏
Set Init@campaign(自动执行,针对选中目标)
和先攻宏不同,这个宏直接设定某个(或某几个)token的先攻值并更新先攻表,适合固定先攻的怪物如提亚马特等,也可用于延迟等行动的先攻调整
代码: [选择]
[H: Initiative = NewInit+InitBonus*0.01][H:token.init=Initiative]
Set Initiative: [round(Initiative)]
  • 参数:NewInit(要设定的先攻值)
  • 返回:无
  • 属性:InitBonus(token的先攻加值)
  • 依赖:无
Init Bonus@campaign(自动执行,针对选中目标)
常和先攻宏配合使用,对先攻值加值进行调整。之所以采用单独的宏而非给先攻宏添加调整值参数,一是因为先攻调整用到得很少,每个token都要确认参数比较麻烦;二是考虑到先攻骰一般都要对大量token同时执行,要盯住那些有调整的token在对话框出现时临时修改也很费心费力。还不如单独做成宏,在投完先攻以后,对需要调整的单位再进行加值。
代码: [选择]
Init Bonus: {InitiativeBonus=Bonus}<br>
[H: Initiative = Initiative+InitiativeBonus*1.01]
Initiative: [token.init = Initiative]
  • 参数:InitiativeBonus(要设定的额外先攻加值)
  • 返回:无
  • 属性:无
  • 依赖:无
« 上次编辑: 2010-05-22, 周六 22:53:48 由 AlbertNi »
突然之间不知道放神马签名好了……
哦对了,我也是新人了!

离线 AlbertNi

  • Sleeper, Lord of Helpless, The Brainless
  • 版主
  • *
  • 帖子数: 7260
  • 苹果币: 2
[宏]4E实用宏
« 回帖 #1 于: 2010-03-07, 周日 06:35:44 »
请各位朋友帮忙调试,发现问题(不管是说明文档的问题还是宏本身的执行问题)或者需求某些功能都请跟贴回报,我会尽快修正/回复/更新。


5月22日:
心血来潮更新了前面的一些错漏,并添加了两个先攻骰相关的宏。
« 上次编辑: 2010-05-22, 周六 22:49:58 由 AlbertNi »
突然之间不知道放神马签名好了……
哦对了,我也是新人了!

离线 Bugtype

  • Peasant
  • 帖子数: 8
  • 苹果币: 0
Re: [宏]4E实用宏
« 回帖 #2 于: 2019-04-10, 周三 23:58:46 »
基础攻击骰

由于并不会像楼主那样发格式,所以直接发出来好了。

其实就是根据楼主所发的技能鉴定宏改造的

[h: skillList = json.fromList("Str,Con,Dex,Int,Wis,Cha")]
[h:abort(input("skillUsed|Str,Con,Dex,Int,Wis,Cha|Skill|LIST","misc|0|Misc. Bonus"))]
[h:targetList = json.fromList("AC,Tough,Reflex,Will")]
[h:abort(input("targetUsed|AC,Tough,Reflex,Will|Defense|LIST"))]
[h:skill=json.get(skillList , skillUsed)]
[h:target=json.get(targetList, targetUsed)]
[h:gongjizhi=roll(1,20)+eval(skill)+misc]
[h:duibizhi=getProperty(eval("target"), getSelected())]
[r: if(gongjizhi > duibizhi, " Congratulations! You hit the target!", "Sorry, you didn't hit the target.")]


参数:misc:擅长、地形等加/减值;gongjizhi:角色的攻击骰;duibizhi:目标的防御。
返回:
属性:
依赖:

离线 Bugtype

  • Peasant
  • 帖子数: 8
  • 苹果币: 0
Re: [宏]4E实用宏
« 回帖 #3 于: 2019-04-11, 周四 00:06:44 »
在楼上的基础攻击骰上发展的平砍(集成攻击骰)


[h: skillList = json.fromList("Str,Con,Dex,Int,Wis,Cha")]
[h:abort(input("skillUsed|Str,Con,Dex,Int,Wis,Cha|Skill|LIST","Gongji.Bonus|0|Gongji.Bonus"))]
[H:targetList = json.fromList("AC,Tough,Reflex,Will")]
[h:abort(input("targetUsed|AC,Tough,Reflex,Will|Defense|LIST"))]
[h:skill=json.get(skillList , skillUsed)]
[h:target=json.get(targetList, targetUsed)]
[h:jifang=roll(1,20) + eval(skill) + levelbonus]
[h:difang=getProperty(eval("target"), getSelected())]
[h:duibizhi=max(jifang,difang)]
[r,if (duibizhi==jifang),
code:
{
[h:damageDice="roll(Damage.DiceTime,Damage.DiceSize)+Damage.Bonus"]
[MACRO("getDamage@Lib:combat"):damageDice]
[h:damageProperties=macro.return]
[h:varsFromStrProp(damageProperties)]
};
{
并未击中目标!
}]

参数:Gongji.Bonus:擅长、地形等加/减值;jifang:角色的攻击骰;difang:目标的防御;duibizhi:角色的攻击骰和目标的防御对比的最大值;Damage.DiceTime:掷伤害骰的次数;Damage.DiceSize:掷伤害骰的面数;Damage.Bonus:伤害骰的所有加/减值。
返回:
属性:Str,Con,Dex,Int,Wis,Cha,力体敏智感魅     AC,Tough,Reflex,Will,AC、强韧、反射、意志(英文肯定都不对,但是就这么设定即可)
依赖:getDamage@Lib:combat(下一楼贴出宏代码)
« 上次编辑: 2019-04-11, 周四 00:16:12 由 Bugtype »

离线 Bugtype

  • Peasant
  • 帖子数: 8
  • 苹果币: 0
getDamage@Lib:combat 宏代码
« 回帖 #4 于: 2019-04-11, 周四 00:10:38 »
建立一个叫做Lib:combat的Token;在Lib:combat中建立一个可信宏(不可被玩家编辑的宏),起名字叫getDamage,然后输入代码如下:


[h:returnData = ""]
[h:damageRoll = eval(macro.args)]
[h:damageType = "piercing"]
[h:temphp = getProperty("temphp",getSelected())]
[h:kansheida = max(damageRoll,temphp)]
[r,if (kansheida == damageRoll),
code:
{
[h: Property = "HP"]
[h: PropertyTHP = "TempHP"]
[h: Value = getProperty("HP",getSelected())+(TempHP-damageRoll)]
[h: ValueTHP = 0]
[h: ID = getSelected()]
[h: setProperty(Property, Value, ID)]
[h: setProperty(PropertyTHP, ValueTHP, ID)]
};
{
[h: PropertyTHP = "TempHP"]
[h: Value = getProperty("TempHP",getSelected())-damageRoll)]
[h: ID = getSelected()]
[h: setProperty(PropertyTHP, Value, ID)]
}]
攻击造成了 [r:damageRoll] 点伤害!
目标HP: [R:getProperty("HP", getSelected())]/[R:getProperty("maxHP", getSelected())]
|| 目标临时HP:[R:getProperty("TempHP", getSelected())] 。
[h:returnData=setStrProp(returnData,"damType", damageType)]
[h:returnData=setStrProp(returnData,"damage", damageRoll)]
[h:macro.return=returnData]

该宏可识别目标是否有临时HP。

如有临时HP,便先扣临时HP;如没有临时HP,则直接扣HP。

如果临时HP不够扣,则扣光临时HP后,会继续扣除HP。

需求属性:HP(当前血量),TempHP(当前临时生命值)
« 上次编辑: 2019-04-11, 周四 00:12:57 由 Bugtype »