From 3b7b3bcb2a10e103b33af0f03d019418d4044502 Mon Sep 17 00:00:00 2001 From: soul2 <1052986332@qq.com> Date: Tue, 13 Sep 2022 19:39:31 +0800 Subject: [PATCH] =?UTF-8?q?SoGradientTextTagToUnit=20SoGradientSetFadeTime?= =?UTF-8?q?=20=E7=BC=96=E5=86=99=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jass/So/Pigeon/GradientTextTag.j | 207 +++++++++++++++++++++++++++++++ jass/So/SoBase.j | 66 ++++++++++ jass/So/SoPigeon.cfg | 3 + jass/So/SoPigeon.j | 18 +++ jass/So/SoSimplify.cfg | 1 + jass/So/SoSimplify.j | 44 +++++++ jass/SoBase.cfg | 3 + jass/SoBase.j | 10 ++ share/mpq/config | 1 + share/mpq/so/action.txt | 73 +++++++++++ share/mpq/so/call.txt | 10 ++ share/mpq/so/define.txt | 18 +++ share/mpq/so/event.txt | 1 + 13 files changed, 455 insertions(+) create mode 100644 jass/So/Pigeon/GradientTextTag.j create mode 100644 jass/So/SoBase.j create mode 100644 jass/So/SoPigeon.cfg create mode 100644 jass/So/SoPigeon.j create mode 100644 jass/So/SoSimplify.cfg create mode 100644 jass/So/SoSimplify.j create mode 100644 jass/SoBase.cfg create mode 100644 jass/SoBase.j create mode 100644 share/mpq/so/action.txt create mode 100644 share/mpq/so/call.txt create mode 100644 share/mpq/so/define.txt create mode 100644 share/mpq/so/event.txt diff --git a/jass/So/Pigeon/GradientTextTag.j b/jass/So/Pigeon/GradientTextTag.j new file mode 100644 index 0000000..0202cbb --- /dev/null +++ b/jass/So/Pigeon/GradientTextTag.j @@ -0,0 +1,207 @@ +/* 渐变漂浮文字 2.0 +* 参数:文字, 单位, z轴偏移, 初始大小, 目标大小, 变化模式, 变化间隔, 变化频率, 颜色值R, G, B, 透明度, 速度, 方向, 消失时间 +*/ + + +globals + // 模式:没有变化 + // 该模式下漂浮文字大小为初始大小 + constant integer gradient_type_none = 0 + // 模式:变大 + constant integer gradient_type_toBigger = 1 + // 模式:变小 + constant integer gradient_type_toSmaller = 2 + // 模式:先变大再变小 + constant integer gradient_type_toBiggerAndSmaller = 3 + + // 变化频率 10Hz + constant real gradient_frequency_10Hz = 0.1 + // 变化频率 20Hz + constant real gradient_frequency_20Hz = 0.05 + // 变化频率 25Hz + constant real gradient_frequency_25Hz = 0.04 + // 变化频率 33Hz + constant real gradient_frequency_33Hz = 0.03 + // 变化频率 50Hz + constant real gradient_frequency_50Hz = 0.02 + // 变化频率 100Hz + constant real gradient_frequency_100Hz = 0.01 + + // 漂浮文字淡化时间(秒) + real gradient_fade_time = 1 + + // 用于返回的全局变量 + private timer gradient_temp_timer + private texttag gradient_temp_texttag +endglobals + +/* 使漂浮文字在到达目标时间后消失 */ +private function ClearedTime takes texttag tt, real time returns nothing + call SetTextTagPermanent(tt, false) + call SetTextTagFadepoint(tt, (time - gradient_fade_time)) + call SetTextTagLifespan(tt, time) +endfunction + +/* 新建计时器存入 相关数据 */ +private function InitGradientData takes texttag tt, string text, real beginSize, real targetSize, integer modeType, real intervals, real frequently, real speed, real angle, real clearedTime returns timer + local integer hid + set gradient_temp_timer = CreateTimer() + set hid = GetHandleId(gradient_temp_timer) + call SaveTextTagHandle(data, hid, 0, tt) + call SaveReal(data, hid, 1, beginSize) + call SaveReal(data, hid, 2, targetSize) + call SaveReal(data, hid, 3, intervals) + call SaveReal(data, hid, 4, frequently) + call SaveInteger(data, hid, 5, modeType) + call SaveStr(data, hid, 6, text) + call SaveReal(data, hid, 7, beginSize) + call SaveReal(data, hid, 8, speed) + call SaveReal(data, hid, 9, angle) + call SaveReal(data, hid, 10, clearedTime) + return gradient_temp_timer +endfunction + +/* 合法性校验 +* 变大模式下 目标大小须>初始大小 +* 变小模式下 目标大小须<初始大小 +* 先变大再变小模式下, 目标大小须>初始大小 +*/ +private function GradientCheckSize takes integer modeType, real beginSize, real targetSize returns boolean + if modeType == gradient_type_none then + return true + elseif modeType == gradient_type_toBigger or modeType == gradient_type_toBiggerAndSmaller then + return targetSize > beginSize + elseif modeType == gradient_type_toSmaller then + return beginSize > targetSize + endif + return false +endfunction + +private function GradientRunBiggerToSmallerActions takes nothing returns nothing + // 读取数据 + local timer t = GetExpiredTimer() + local integer hid = GetHandleId(t) + local texttag tt = LoadTextTagHandle(data, hid, 0) + local real nowSize = LoadReal(data, hid, 1) + local real targetSize = LoadReal(data, hid, 2) + local real intervals = LoadReal(data, hid, 3) + local real frequently = LoadReal(data, hid, 4) + local integer modeType = LoadInteger(data, hid, 5) + local string text = LoadStr(data, hid, 6) + local real beginSize = LoadReal(data, hid, 7) + local real speed = LoadReal(data, hid, 8) + local real angle = LoadReal(data, hid, 9) + local real clearedTime = LoadReal(data, hid, 10) + // 变化大小 + call SetTextTagTextBJ(tt, text, (nowSize - intervals)) + set nowSize = nowSize - intervals + // 如果大小超过了目标值则停止 + if nowSize <= targetSize then + call SetTextTagTextBJ(tt, text, targetSize) + call ClearedTime(gradient_temp_texttag, clearedTime) + call SetTextTagVelocityBJ(gradient_temp_texttag, speed, angle) + call FlushChildHashtable(data, hid) + call DestroyTimer(t) + else + call SaveReal(data, hid, 1, nowSize) + endif + set tt = null + set t = null +endfunction + +private function GradientTimerRunActions takes nothing returns nothing + // 读取数据 + local timer t = GetExpiredTimer() + local integer hid = GetHandleId(t) + local texttag tt = LoadTextTagHandle(data, hid, 0) + local real nowSize = LoadReal(data, hid, 1) + local real targetSize = LoadReal(data, hid, 2) + local real intervals = LoadReal(data, hid, 3) + local real frequently = LoadReal(data, hid, 4) + local integer modeType = LoadInteger(data, hid, 5) + local string text = LoadStr(data, hid, 6) + local real beginSize = LoadReal(data, hid, 7) + local real speed = LoadReal(data, hid, 8) + local real angle = LoadReal(data, hid, 9) + local real clearedTime = LoadReal(data, hid, 10) + // 变化大小 + if modeType == gradient_type_toBiggerAndSmaller or modeType== gradient_type_toBigger then + call SetTextTagTextBJ(tt, text, (nowSize + intervals)) + set nowSize = nowSize + intervals + elseif modeType == gradient_type_toSmaller then + call SetTextTagTextBJ(tt, text, (nowSize - intervals)) + set nowSize = nowSize - intervals + endif + // 如果大小超过了目标值则停止 + if modeType == gradient_type_toBiggerAndSmaller or modeType== gradient_type_toBigger then + if nowSize >= targetSize then + call SetTextTagTextBJ(tt, text, targetSize) + call ClearedTime(gradient_temp_texttag, clearedTime) + call SetTextTagVelocityBJ(gradient_temp_texttag, speed, angle) + call FlushChildHashtable(data, hid) + call DestroyTimer(t) + // 如果是先变大再变小则再运行一次变小 + if modeType == gradient_type_toBiggerAndSmaller then + set t = InitGradientData(tt, text, targetSize, beginSize, gradient_type_toSmaller, intervals, frequently, speed, angle, clearedTime) + call TimerStart(t, frequently, true, function GradientRunBiggerToSmallerActions) + endif + else + call SaveReal(data, hid, 1, nowSize) + endif + elseif modeType == gradient_type_toSmaller then + if nowSize <= targetSize then + call SetTextTagTextBJ(tt, text, targetSize) + call ClearedTime(gradient_temp_texttag, clearedTime) + call SetTextTagVelocityBJ(gradient_temp_texttag, speed, angle) + call FlushChildHashtable(data, hid) + call DestroyTimer(t) + else + call SaveReal(data, hid, 1, nowSize) + endif + endif + set tt = null + set t = null +endfunction + +function SoGradientRun takes texttag tt, string text, real beginSize, real targetSize, integer modeType, real intervals, real frequently, real speed, real angle, real clearedTime returns texttag + local timer t + set gradient_temp_texttag = tt + // 没有变化模式下,直接设置消失时间和速率 + if modeType == gradient_type_none then + call ClearedTime(gradient_temp_texttag, clearedTime) + call SetTextTagVelocityBJ(gradient_temp_texttag, speed, angle) + else + // 合法性校验 + if GradientCheckSize(modeType, beginSize, targetSize) then + set t = InitGradientData(gradient_temp_texttag, text, beginSize, targetSize, modeType, intervals, frequently, speed, angle, clearedTime) + call TimerStart(t, frequently, true, function GradientTimerRunActions) + set t = null + else + // 合法性校验不通过时,按没有变化模式处理 + call ClearedTime(gradient_temp_texttag, clearedTime) + call SetTextTagVelocityBJ(gradient_temp_texttag, speed, angle) + endif + endif + return gradient_temp_texttag +endfunction + +// & 新建渐变漂浮文字到单位头顶 +function SoGradientTextTagToUnit takes string text, unit whichUnit, real offset, real beginSize, real targetSize, integer modeType, real intervals, real frequently, real colorR, real colorG, real colorB, real transparency, real speed, real angle, real clearedTime returns texttag + // 生成漂浮文字 + set gradient_temp_texttag = CreateTextTagUnitBJ(text, whichUnit, offset, beginSize, colorR, colorG, colorB, transparency) + call SoGradientRun(gradient_temp_texttag, text, beginSize, targetSize, modeType, intervals, frequently, speed, angle, clearedTime) + return gradient_temp_texttag +endfunction + +/* &设置渐变漂浮文字的淡化时间 +* 这项设置是全局的,如果输入的值不合法将不修改淡化时间 +* 返回:设置是否成功 +*/ +function SoGradientSetFadeTime takes real time returns boolean + if time >= 0 then + set gradient_fade_time = time + return true + else + return false + endif +endfunction \ No newline at end of file diff --git a/jass/So/SoBase.j b/jass/So/SoBase.j new file mode 100644 index 0000000..8ef9db2 --- /dev/null +++ b/jass/So/SoBase.j @@ -0,0 +1,66 @@ +#ifndef SoBasePatchLIncluded +#define SoBasePatchLIncluded + +globals + private constant integer Itemtype_So_RenHe = 0 //物品分类 - 任何 + private constant integer Itemtype_So_YongJiu = 1 //物品分类 - 永久 + private constant integer Itemtype_So_KeChong = 2 //物品分类 - 可充 + private constant integer Itemtype_So_NengLiangTiSheng = 3 //物品分类 - 能量提升 + private constant integer Itemtype_So_RenZao = 4 //物品分类 - 人造 + private constant integer Itemtype_So_KeGouMai = 5 //物品分类 - 可购买 + private constant integer Itemtype_So_ZhanYi = 6 //物品分类 - 战役 + private constant integer Itemtype_So_HunZa = 7 //物品分类 - 混杂 + private itemtype ITEM_TYPE_CBACK = ConvertItemType(8) + private integer ITEM_TYPE_VBACK = 0 +endglobals + +/* 物品分类 按编表 转换为整数 +编表一般用于选择框等场景 +*/ +function SoGetItemTypeForVal takes integer nve returns itemtype + if (nve == Itemtype_SouL_RenHe) then + set ITEM_TYPE_CBACK = ITEM_TYPE_ANY + elseif (nve == Itemtype_SouL_YongJiu) then + set ITEM_TYPE_CBACK = ITEM_TYPE_PERMANENT + elseif (nve == Itemtype_SouL_KeChong) then + set ITEM_TYPE_CBACK = ITEM_TYPE_CHARGED + elseif (nve == Itemtype_SouL_NengLiangTiSheng) then + set ITEM_TYPE_CBACK = ITEM_TYPE_POWERUP + elseif (nve == Itemtype_SouL_RenZao) then + set ITEM_TYPE_CBACK = ITEM_TYPE_ARTIFACT + elseif (nve == Itemtype_SouL_KeGouMai) then + set ITEM_TYPE_CBACK = ITEM_TYPE_PURCHASABLE + elseif (nve == Itemtype_SouL_ZhanYi) then + set ITEM_TYPE_CBACK = ITEM_TYPE_CAMPAIGN + elseif (nve == Itemtype_SouL_HunZa) then + set ITEM_TYPE_CBACK = ITEM_TYPE_MISCELLANEOUS + endif + return ITEM_TYPE_CBACK +endfunction +/* 反转换 */ +function SoGetValForItemType takes itemtype nve returns integer + if (nve == ITEM_TYPE_ANY) then + set ITEM_TYPE_VBACK = Itemtype_SouL_RenHe + elseif (nve == ITEM_TYPE_PERMANENT) then + set ITEM_TYPE_VBACK = Itemtype_SouL_YongJiu + elseif (nve == ITEM_TYPE_CHARGED) then + set ITEM_TYPE_VBACK = Itemtype_SouL_KeChong + elseif (nve == ITEM_TYPE_POWERUP) then + set ITEM_TYPE_VBACK = Itemtype_SouL_NengLiangTiSheng + elseif (nve == ITEM_TYPE_ARTIFACT) then + set ITEM_TYPE_VBACK = Itemtype_SouL_RenZao + elseif (nve == ITEM_TYPE_PURCHASABLE) then + set ITEM_TYPE_VBACK = Itemtype_SouL_KeGouMai + elseif (nve == ITEM_TYPE_CAMPAIGN) then + set ITEM_TYPE_VBACK = Itemtype_SouL_ZhanYi + elseif (nve == ITEM_TYPE_MISCELLANEOUS) then + set ITEM_TYPE_VBACK = Itemtype_SouL_HunZa + endif + return ITEM_TYPE_VBACK +endfunction + +private function SoSetup takes nothing returns nothing + /* 处理一些初始化设置 */ +endfunction + +#endif //SoBasePatchLIncluded diff --git a/jass/So/SoPigeon.cfg b/jass/So/SoPigeon.cfg new file mode 100644 index 0000000..0caa095 --- /dev/null +++ b/jass/So/SoPigeon.cfg @@ -0,0 +1,3 @@ +[SoPigeon] +SoGradientTextTagToUnit +SoGradientSetFadeTime diff --git a/jass/So/SoPigeon.j b/jass/So/SoPigeon.j new file mode 100644 index 0000000..8ef7f1f --- /dev/null +++ b/jass/So/SoPigeon.j @@ -0,0 +1,18 @@ +#ifndef SoPigeonIncluded +#define SoPigeonIncluded + +library SoPigeon initializer SoPigeonSetup needs SoBase + + globals + private hashtable data = InitHashtable() + endglobals + + #include "Pigeon/GradientTextTag.j" + + function SoPigeonSetup takes nothing returns nothing + + endfunction + +endlibrary + +#endif //SoPigeonIncluded diff --git a/jass/So/SoSimplify.cfg b/jass/So/SoSimplify.cfg new file mode 100644 index 0000000..8a82294 --- /dev/null +++ b/jass/So/SoSimplify.cfg @@ -0,0 +1 @@ +[SoSimplify] \ No newline at end of file diff --git a/jass/So/SoSimplify.j b/jass/So/SoSimplify.j new file mode 100644 index 0000000..b092236 --- /dev/null +++ b/jass/So/SoSimplify.j @@ -0,0 +1,44 @@ +#ifndef SoSimplifyIncluded +#define SoSimplifyIncluded + +library SoSimplify needs SoBase initializer SimplifySetup + + // 坐标间距 + /* + 求 (x1, y1) 到 (x2, y2) 的距离 + */ + function SoSpacing takes real x1, real y1, real x2, real y2 returns real + local real fx = x2 - x1 + local real fy = y2 - y1 + return SquareRoot(fx * fx + fy * fy) + endfunction + + // 坐标间方向 + /* 参数: x1, y1, x2, y2 + 求 (x1, y1) 到 (x2, y2) 的方向 + */ + function SoC2A takes real x1, real y1, real x2, real y2 returns real + return bj_RADTODEG * Atan2(y2 - y1, x2 - x1) + endfunction + + /* 取绝对值 */ + private function SRabs takes real a returns real + if (a<0) then + return -a + else + return a + endif + endfunction + + //三点所在的矩形面积 + function SoGetRectAera takes real xa,real ya,real xb,real yb,real xc,real yc returns real + return SRabs( xa*yb - xa*yc + xb*yc - xb*ya + xc*ya - xc*yb ) + endfunction + + function SoSimplifySetup takes nothing returns nothing + // 初始化一些设置 + endfunction + +endlibrary + +#endif //SoSimplifyIncluded \ No newline at end of file diff --git a/jass/SoBase.cfg b/jass/SoBase.cfg new file mode 100644 index 0000000..c86ec7b --- /dev/null +++ b/jass/SoBase.cfg @@ -0,0 +1,3 @@ +[SoBase] +SoGetItemTypeForVal +SoGetValForItemType diff --git a/jass/SoBase.j b/jass/SoBase.j new file mode 100644 index 0000000..f73c125 --- /dev/null +++ b/jass/SoBase.j @@ -0,0 +1,10 @@ +#ifndef SoBaseLIncluded +#define SoBaseLIncluded + + library SoBase initializer SoSetup + + #include "So/SoBase.j" + + endlibrary + +#endif //SoBaseLIncluded diff --git a/share/mpq/config b/share/mpq/config index 9b27d77..6b6a454 100644 --- a/share/mpq/config +++ b/share/mpq/config @@ -4,3 +4,4 @@ dzapi2 dzapi bzapi ydtrigger +so \ No newline at end of file diff --git a/share/mpq/so/action.txt b/share/mpq/so/action.txt new file mode 100644 index 0000000..706a2b1 --- /dev/null +++ b/share/mpq/so/action.txt @@ -0,0 +1,73 @@ +[SoGradientTextTagToUnit] +title = "创建渐变漂浮文字2.0(指定单位) [SoUI]" +description = "创建渐变漂浮文字: ${文字} 在 ${单位}的头顶, Z轴偏移 ${Z},字体大小: ${Size}, 目标大小: ${TargetSize}, 变化模式: ${模式},变化间隔: ${大小}, 变化频率 ${频率}, 颜色值:(${Red}%, ${Green}%, ${Blue}%) ,透明度: ${Transparency}% , 漂浮文字速度为 ${Speed}, 方向是 ${角度} 度, 在 ${时间} 秒后消失." +comment = "渐变之后才开始计算消失时间, 消失前1秒会开始淡化.颜色格式为(红,绿,蓝).若目标大小设置错误将导致无法渐变.每个渐变漂浮文字都需要创建一个计时器." +category = TC_TEXTTAG +[[.args]] +type = StringExt +[[.args]] +type = unit +default = "GetTriggerUnit" +[[.args]] +type = real +default = "0" +[[.args]] +type = real +default = "12" +min = 1 +[[.args]] +type = real +default = "18" +[[.args]] +type = GradiendTypeOpi +default = "GradiendTypeOpiC" +[[.args]] +type = real +default = "0.6" +min = 0 +[[.args]] +type = GradiendFrequencyOpi +default = "GradiendFrequencyOpiE" +min = 1 +[[.args]] +type = real +default = "100" +min = 0 +max = 100 +[[.args]] +type = real +default = "100" +min = 0 +max = 100 +[[.args]] +type = real +default = "100" +min = 0 +max = 100 +[[.args]] +type = real +default = "0" +min = 0 +max = 100 +[[.args]] +type = real +default = "64" +[[.args]] +type = real +default = "90" +min = 0 +max = 360 +[[.args]] +type = real +default = "5" +min = 0 + +[SoGradientSetFadeTime] +title = "设置淡化时间 [SoUI]" +description = "设置渐变漂浮文字的淡化时间为 ${time}." +comment = "这项设置是全局的, 如果输入的值不合法将不修改淡化时间." +category = TC_TEXTTAG +[[.args]] +type = real +default = "1" +min = 0 \ No newline at end of file diff --git a/share/mpq/so/call.txt b/share/mpq/so/call.txt new file mode 100644 index 0000000..8d8f12f --- /dev/null +++ b/share/mpq/so/call.txt @@ -0,0 +1,10 @@ +[SoGradientSetFadeTime] +title = "设置淡化时间 [SoUI]" +description = "成功设置渐变漂浮文字的淡化时间为 ${time}." +comment = "这项设置是全局的, 如果输入的值不合法将不修改淡化时间." +category = TC_TEXTTAG +returns = boolean +[[.args]] +type = real +default = "1" +min = 0 \ No newline at end of file diff --git a/share/mpq/so/define.txt b/share/mpq/so/define.txt new file mode 100644 index 0000000..1bb8655 --- /dev/null +++ b/share/mpq/so/define.txt @@ -0,0 +1,18 @@ +[TriggerCategories] +TC_PIGEON=Pigeon,ReplaceableTextures\CommandButtons\BTNRejuvenation.blp + +[TriggerTypes] +GradiendTypeOpi=0,0,0,变化模式,real +GradiendFrequencyOpi=0,0,0,变化频率,real + +[TriggerParams] +GradiendTypeOpiA=0,GradiendTypeOpi,gradient_type_none,没有 +GradiendTypeOpiB=0,GradiendTypeOpi,gradient_type_toBigger,变小 +GradiendTypeOpiC=0,GradiendTypeOpi,gradient_type_toSmaller,变大 +GradiendTypeOpiD=0,GradiendTypeOpi,gradient_type_toBiggerAndSmaller,先变大后变小 +GradiendFrequencyOpiA=0,GradiendFrequencyOpi,gradient_frequency_10Hz,10Hz +GradiendFrequencyOpiB=0,GradiendFrequencyOpi,gradient_frequency_20Hz,20Hz +GradiendFrequencyOpiC=0,GradiendFrequencyOpi,gradient_frequency_25Hz,25Hz +GradiendFrequencyOpiD=0,GradiendFrequencyOpi,gradient_frequency_33Hz,33Hz +GradiendFrequencyOpiE=0,GradiendFrequencyOpi,gradient_frequency_50Hz,50Hz +GradiendFrequencyOpiF=0,GradiendFrequencyOpi,gradient_frequency_100Hz,100Hz \ No newline at end of file diff --git a/share/mpq/so/event.txt b/share/mpq/so/event.txt new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/share/mpq/so/event.txt @@ -0,0 +1 @@ + \ No newline at end of file