diff --git a/Backup/code.md b/Backup/code.md
new file mode 100644
index 0000000..28bb64b
--- /dev/null
+++ b/Backup/code.md
@@ -0,0 +1,1503 @@
+
+
+# CORE
+
+# Page 1
+
+
+## **[core]组**
+> [!TIP] core组-第一类-通用代码组
+
+> [!NOTE] 重要提示文本以下的代码为`通用代码`,多半是必要的代码,如果不包括这些,可能在`绝大多数情况下导致错误`。
+
+### name
+#### name-代码简介
+代码:name 中文释义:名字 类型:字符型 隶属于:通用代码组
+#### name-要点指示
+
+> [!NOTE] name代码的要点指示:
+
+
+#### **JDSALing**
+定义单位原始名称,可以是中文。
+游戏使用它区分其它单位。
+如果没有在[displayText或者语言文件设置显示名称],
+那么它也将作为单位的显示名称。
+具体描述文件位置(内部):
+1.assets/translationsStrings_zh.properties
+格式:units.单位名称.name=写单位显示的名称
+units.单位名称.description= [[填单位显示的描述]]
+#### **tobby3600**
+
+ini文件的单独定义(外部-推荐):
+2.displayText: 单位的标题
+ displayDescription: -单位的描述
+
+
+
+特别提醒:`displayText支持本地化`,例如如果要写一个`多语言的单位描述`,可以通过以下例子:
+
+#### name-演示例子
+
+```ini
+演示例子
+[core]
+name: Ling
+displayText: English Title Text
+displayText_zh:中文标题
+
+displayDescription: -English Description
+displayDescription_zh:-中文描述
+
+```
+
+### price
+#### price-代码简介
+代码:price 中文释义:价格 类型:整数 隶属于:通用代码组
+#### price-要点指示
+price代码要点指示:
+定义单位的价格,显示在单位信息中,建造时也以此价格为准。
+
+#### **tobby3600**
+默认情况下,price只需要填写一个整数,此时使用的是游戏内自带的资金credit;
+想要更改资源类型,可以使用 `price:资源1=数值1,资源2=数值2,...` 的格式(前提是此资源要在使用的单位进行定义)。
+
+
+#### price-演示例子
+```ini
+[core]
+price:120,石油=80,铁=60
+```
+
+### radius
+#### radius-代码简介
+代码:radius 中文释义:半径 类型:整数 隶属于:通用代码组
+#### radius-要点指示
+radius代码要点指示:
+半径定义单位的`实际碰撞体积和显示范围`,在未设置`选择框大小`时,半径决定是单位选择框的大小。
+半径的单位是像素(px)。
+#### radius-演示例子
+```ini
+[core]
+radius:20
+```
+
+### mass
+#### mass-代码简介
+代码:mass 中文释义:质量 类型:整数 隶属于:通用代码组
+#### mass-要点指示
+mass代码要点指示:
+质量决定单位在各种碰撞时的效果。`质量越大,其他单位越难推动`。
+#### mass-演示例子
+```ini
+[core]
+mass:2000
+```
+
+### maxHp
+#### maxHp-代码简介
+代码:maxHp 中文释义:最大生命值 类型:整数 隶属于:通用代码组
+#### maxHp-要点指示
+
+:::codegroup
+ **tobby3600**
+最大生命值定义单位在不修改它时最多能够有多少血量,单位默认生成时即是这个血量。
+maxHp可以通过单位参考.maxHp()来获取,也可以通过[action]setUnitStatus进行修改。
+:::
+
+#### maxHp-演示例子
+```ini
+[core]
+maxHp:600
+```
+
+### altNames
+#### altNames-代码简介
+代码:altNames 中文释义:别名 类型:字符型 隶属于:通用代码组
+#### altNames-要点指示
+
+altNames代码要点指示:
+
+#### **JDSALing**
+主要在启用多个自定义Mod进行优先级定义
+以逗号分隔的名称列表。像名称一样,但优先级较低,对于启用多个自定义mod有用。
+
+
+#### altNames-演示例子:
+```ini
+[core]
+altNames:ling,tobby3600,coldmint
+```
+### class
+#### class-代码简介
+
+代码:class 中文释义:类 类型:字符型 隶属于:通用代码组
+
+> [!ATTENTION] 无实际用处,可以删除。
+Luke:保留供将来使用,默认情况下必须为CustomUnitMetadata。由于该代码无实际用途,可以忽略该代码
+该代码后面什么都可以输,但没有实际用途。或许在未来会有用。
+
+#### class-演示例子:
+```ini
+[core]
+class:CustomUnitMetadata
+```
+
+### strictLevel
+#### strictLevel-代码简介
+
+代码:strictLevel 中文释义:严格级别 类型:数字固定型 隶属于:通用代码组
+
+> [!TIP] 建议添加到"all-units.template"以应用于所有单位,进行统一查错。
+默认值为0,忽略代码重复。设为1时如果当前单位内有重复代码,则报错。
+
+#### strictLevel-演示例子:
+```all-units.template & ini
+[core]
+strictLevel:1
+```
+
+### techLevel
+#### techLevel-代码简介:
+代码:techLevel 中文释义:科技等级 类型:数字固定型 隶属于:通用代码组
+
+> [!TIP] 早期是用于在builtFrom的代码,并结合科技等级使用。如果工厂的等级低于单位的目标科技等级,则会在工厂里面隐藏该单位。
自铁锈1.09后出现overrideAndReplace后,该方法则不建议使用。有关于新策略,请参考overrideAndReplace代码文档指南。
+设置单位的科技等级,共有3个级别,1级GUI显示为绿色,2、3级显示为黄色。超过3报错。
+
+#### techLevel-演示例子:
+```ini
+[core]
+techLevel:2
+```
+
+### buildSpeed
+#### buildSpeed-代码简介
+
+代码:buildSpeed 中文释义:建造速度 类型:浮点/秒型 隶属于:通用代码组
+
+> [!TIP] 建造此单位需要的时间,填秒。
+以前的计算方式为:此处所填时间=1÷(60x你需要的秒)如果定义了工厂速率则需要乘以建造乘数。
+
+#### buildSpeed-演示例子:
+```ini
+[core]
+buildSpeed:30s
+#或者:
+## 下方可能有误差
+buildSpeed:0.0006
+```
+
+### isBio
+#### isBio-代码简介
+
+
+代码:isBio 中文释义:是生物 类型:布尔型 隶属于:通用代码组
+
+> [!TIP] 若设置成true,则会在单位死亡时产生血迹,
+图像在drawable/blood_mark.png,hideScorchMark:true时可以隐藏)非生物则为黑色爆炸效果。
+#### isBio-演示例子:
+```ini
+[core]
+isBio:true
+```
+
+### isBug
+#### isBug-代码简介
+
+代码:isBug 中文释义:是虫子 类型:布尔型 隶属于:通用代码组
+
+> [!TIP] 若设置成true,则会认定为虫子,用于沙盒中的单独分类。
+#### isBug-演示例子:
+```ini
+[core]
+isBug:true
+```
+
+### isBuilder
+#### isBuilder-代码简介
+
+代码:isBuilder 中文释义:是建造者 类型:布尔型 隶属于:通用代码组
+
+> [!TIP] 若设置成true,则会需要此单位建造建筑物,则通常需要此代码。
+并且默认设为[ai] useAsBuilder。
+#### isBuilder-演示例子:
+```ini
+[core]
+isBuilder:true
+```
+
+### streamingCost
+#### streamingCost-代码简介
+
+代码:streamingCost 中文释义:流式资金 类型:整数型 隶属于:通用代码组
+
+> [!TIP] 和价格一样,但在建造时逐渐消耗资金,如果在构建过程中资源耗尽,
+建造或生产队列将暂停。就像是红警中那样。铁锈默认是预先扣除资金。
+若使用该代码,则玩家的每秒资金将会根据流式资金的算法进行扣减。
+#### streamingCost-演示例子:
+```ini
+[core]
+streamingCost:1145
+```
+
+### switchPriceWithStreamingCost
+
+#### switchPriceWithStreamingCost-代码简介
+
+代码:switchPriceWithStreamingCost 中文释义:流式资金模式全局切换 类型:布尔型 隶属于:通用代码组
+
+> [!TIP] 快捷设置为默认资金消耗方式或为流式建造方式。
+建议使用模板快速将一个模组为所有单位切换流资源。
+例如all-units.template.
+#### switchPriceWithStreamingCost-演示例子:
+```ini,all-units.template
+[core]
+switchPriceWithStreamingCost:true
+```
+
+以下的代码为`单位统计代码组`,非必须存在的代码,请根据情况自行使用
+
+### selfRegenRate
+#### selfRegenRate-代码简介
+
+代码:selfRegenRate 中文释义:生命恢复速度 类型:浮点型 隶属于:单位统计代码组
+
+> [!TIP] 此数值决定每帧增加血量。游戏内默认速度下,一秒为60逻辑帧,而你看到的FPS帧数为渲染帧,所以电脑上几百帧和手机上60帧和省电模式下30帧并不影响计算。所以不要写太大。可以写负值用于自毁。
+#### selfRegenRate-演示例子:
+```ini
+[core]
+maxHp:500
+selfRegenRate:0.5
+```
+
+### maxShield
+#### maxShield-代码简介
+
+代码:maxShield 中文释义:护盾值 类型:整型 隶属于:单位统计代码组
+
+> [!TIP] 单位最大护盾值,默认生成时即为此值。如果设置了startShieldAtZero:true,则初始为0.
+#### maxShield-演示例子:
+```ini
+[core]
+maxShield:3000
+```
+
+### startShieldAtZero
+#### startShieldAtZero-代码简介
+
+代码:startShieldAtZero 中文释义:护盾初始值为0 类型:布尔型 隶属于:单位统计代码组
+
+> [!TIP] 如果为true,则单位护盾值从0开始增加。
+#### startShieldAtZero-演示例子:
+```ini
+[core]
+maxShield:3000
+startShieldAtZero:true
+```
+
+### shieldRegen
+#### shieldRegen-代码简介
+
+代码:shieldRegen 中文释义:护盾恢复速度 类型:浮点型 隶属于:单位统计代码组
+
+> [!TIP] 此数值决定每帧增加护盾值,游戏内一秒为60帧,所以不要写太大。可以写负值。
+#### shieldRegen-演示例子:
+```ini
+[core]
+maxShield:3000
+shieldRegen:0.5
+```
+
+### energyMax
+#### energyMax-代码简介
+
+代码:energyMax 中文释义:能量值 类型:浮点型 隶属于:单位统计代码组
+
+> [!TIP] 默认值为0。可以用作炮塔,激光防御和行动的弹药的能量。
+#### energyMax-演示例子:
+```ini
+[core]
+energyMax:5
+```
+
+### energyRegen
+#### energyRegen-代码简介
+
+代码:energyRegen 中文释义:能量恢复速度 类型:浮点型 隶属于:单位统计代码组
+
+> [!TIP] 能量每帧恢复速度,游戏内一秒为60帧,所以不要写太大。可以写负值。
+#### energyRegen-演示例子:
+```ini
+[core]
+energyRegen:0.4
+```
+
+### energyRegenWhenRecharging
+
+#### energyRegenWhenRecharging-代码简介
+
+代码:energyRegenWhenRecharging
+ 中文释义:充能时能量恢复速度 类型:浮点型 隶属于:单位统计代码组
+
+> [!TIP] 能量恢复是持续的,如果你设置了energyNeedsToRechargeToFull,那么攻击时按energyRegen恢复,耗尽时的灰条按此处设定值恢复。
+#### energyRegenWhenRecharging-演示例子:
+```ini
+[core]
+energyMax:1
+energyRegenWhenRecharging:0.4
+```
+
+### energyNeedsToRechargeToFull
+
+#### energyNeedsToRechargeToFull-代码简介
+
+代码:energyNeedsToRechargeToFull
+ 中文释义:能量需要充满 类型:布尔型 隶属于:单位统计代码组
+
+> [!TIP] 如果能量耗尽,则需要完全充能才能进行攻击。
+#### energyRegenWhenRecharging-演示例子:
+```ini
+[core]
+energyMax:4
+energyNeedsToRechargeToFull:true
+```
+
+### armour
+#### armour-代码简介
+
+代码:armour
+ 中文释义:装甲 类型:整型 隶属于:单位统计代码组
+
+> [!TIP] 抵消敌方攻击所造成的伤害。
+#### armour-演示例子:
+```ini
+[core]
+armour:40
+#如果受到40以上的常规攻击,则进行抵消,反之返回1伤害点。
+#例如45伤害,40护甲,那么将获得5点伤害。
+```
+
+### armourMinDamageToKeep
+#### armourMinDamageToKeep-代码简介
+
+代码:armour
+ 中文释义:装甲最低伤害 类型:整型 隶属于:单位统计代码组
+
+> [!TIP] 至少造成多少点伤害,默认为1.防止护甲太高完全打不动。
+#### armourMinDamageToKeep-演示例子:
+```ini
+[core]
+armour:40
+armourMinDamageToKeep:2
+#如果受到40以下的常规攻击,则进行最低伤害判定
+```
+
+### borrowResourcesWhileAlive
+#### borrowResourcesWhileAlive-代码简介
+
+代码:armour
+ 中文释义:资源活着时借用 类型:Price型 隶属于:单位统计代码组
+
+> [!TIP] 创建时获取这些资源,删除或销毁时将其返回。例如用于电力逻辑,负数供电和正数耗电。
+#### borrowResourcesWhileAlive-演示例子:
+```ini
+[core]
+borrowResourcesWhileAlive:5000
+#单位活着的时候给予5000金币,死亡扣除5000金币
+#一个小型贷款系统,
+```
+
+
+
+
+#### **动动脑考考你**
+如果这里要通过这个代码做一个小的贷款系统,并经过一段时间让单位死亡。
+只需要4行代码即可实现,试试看。
+
+提示:dieOnZeroEnergy:true---(无能量时死亡|如果能量值为零,该单位死亡)
+#### **显示答案-#1**
+```txt
+#参考答案为:
+[core]
+borrowResourcesWhileAlive:5000
+energyMax:1
+energyRegen:-0.4
+dieOnZeroEnergy:true
+#原理是通过能量为0单位死亡并通过这个代码还钱,
+是很简陋的贷款思路,当然,在后续会有更加高级的思路。
+```
+
+
+
+### generation_resources
+#### generation_resources-代码简介
+
+代码:generation_resources
+ 中文释义:资源获取 类型:Price型 隶属于:单位统计代码组
+
+> [!TIP] 单位定时获得的资源,可自定义资源。
+#### generation_resources-演示例子:
+```ini
+[core]
+generation_resources:10
+#or
+generation_resources:credit=10
+#常规产出10Credit/1s游戏资金
+-----------我是分界线----------
+#自定义资源写法
+[core]
+generation_resources:金属=5
+```
+
+### generation_active
+#### generation_active-代码简介
+
+代码:generation_active
+ 中文释义:资源获取条件 类型:逻辑布尔型 隶属于:单位统计代码组
+
+> [!TIP] 获取资源条件。可用于受损时无法产出。
+#### generation_active-演示例子:
+```ini
+[core]
+#1.14写法
+generation_resources:金属=5
+generation_active: if not self.hp(lessThan=100)
+#1.15写法
+[core]
+generation_resources:金属=5
+generation_active: if not self.hp<100
+#效果:单位低于1000血量可以产出资源
+```
+
+### generation_credits
+#### generation_credits-代码简介
+
+代码:generation_credits
+ 中文释义:资金获取 类型:整型 隶属于:单位统计代码组
+
+> [!TIP] 生成资源,仅用于默认的资金,也就是铁锈默认的金钱。
+#### generation_credits-演示例子:
+```ini
+[core]
+generation_credits=5
+```
+
+### generation_delay
+
+> [!ATTENTION] 此代码为老旧代码,作者Luke不推荐使用。
+
+> [!ATTENTION] 警告:请勿使用40以外的数值,否则会有视觉Bug。例如使用30,资金生成3,实际就为6,但是一旦这类单位多了,游戏的资金显示会出问题。
+
+#### generation_delay-代码简介
+
+代码:generation_delay
+ 中文释义:资金获取时间 类型:整型 隶属于:单位统计代码组
+
+> [!TIP] 多久帧添加添加一次资源(generation_credits指定数值)。默认值为40,一秒为60帧。
+#### generation_delay-演示例子:
+```ini
+[core]
+generation_delay=40
+```
+
+> [!NOTE] Core组-第二类-UI和图形代码
+
+### showInEditor
+#### showInEditor-代码简介
+
+代码:showInEditor
+ 中文释义:沙盒中可见 类型:布尔型 隶属于:UI和图形代码组
+
+> [!TIP] 设置为false可在沙箱编辑器中隐藏单位。(默认为true)
+
+#### showInEditor-演示例子:
+```ini
+[core]
+showInEditor:false
+```
+
+### displayText_{LANG}
+#### displayText_{LANG}-代码简介
+
+代码:displayText_{LANG}
+ 中文释义:界面显示文本多语言 类型:字符型 隶属于:UI和图形代码组
+
+> [!TIP] 为单位名称添加多语言支持。此方法并不方便,不如设置游戏内部语言文件,建议催Luke改。有关常见语言代码,请参考下表
+
+| 语言代码 | 所属国家/地区| 语言代码 | 所属国家/地区
+|:--------:|:-----------:|:--------:|:-----------:
+| zh | (中文通用) | en(可忽略) | (英语通用)
+| zh-cn | (简体) | ru | (俄语)
+| zh-tw | (台湾) | ja | (日语)
+| zh-hk | 中文(香港) | es-ES | (西班牙)
+| de | (德语) | fr-FR | 法语(法国)
+
+>[!NOTE] 其它自查(此列表并不全),不过你应该不会闲着支持这么多语言。另外英文的语言代码`en`可以忽略,因为英文在软件里为默认语言,故而无需加`en`,当然加了也没事。
+
+如果你不想进行多语言化,你应该直接`displayText:坦克`,而不是`displayText_zh:坦克`,如果你写了`displayText_zh:坦克`,
你必须再声明一个`displayText:Tank`,否则,游戏会找不到`默认语言缺省值`,将会导致`mod报错而无法运行`。所有可以使用多语言的都有这个检查,还请各位Moder留意。(若有特别的代码,将会在它里面特别提示)
+
+#### displayText_{LANG}-演示例子:
+```ini
+[core]
+#English
+displayText:Tank
+#Chinese
+displayText_zh:坦克
+```
+
+### displayDescription_{LANG}
+#### displayDescription-代码简介
+
+代码:displayDescription_{LANG}
+ 中文释义:界面显示描述 类型:字符型 隶属于:UI和图形代码组
+
+> [!TIP] 单位显示给玩家的单位描述,可以使用多语言,具体使用方法参考在`displayText`的演示说明,这里不再过多讨论。
+
+#### displayDescription-演示例子:
+```ini
+[core]
+displayText:坦克
+displayDescription:只能对地,弱输出,只能在地上行走。
+```
+
+### displayLocaleKey
+#### displayLocaleKey-代码简介
+
+代码:displayLocaleKey
+ 中文释义:界面显示内部调用 类型:字符型 隶属于:UI和图形代码组
+
+> [!TIP] 调用内部语言文件的单位名称和说明的翻译文件。用处不大,通常是在`替换原版单位的同时直接调用它的原始描述`。该代码例子需要会拆包,如果你是初学者,该代码了解即可。
+
+#### displayLocaleKey-演示例子:
+```ini
+[core]
+displayLocaleKey: units.mechArtillery
+```
+
+### displayRadius
+#### displayRadius-代码简介
+
+代码:displayRadius 中文释义:单位选择时显示圆圈 类型:整形 隶属于:UI和图形代码组
+
+> [!TIP] 修改选择单位时显示的绿色圆圈,不更改实际碰撞(radius)和可选择范围。
+
+#### displayRadius-演示例子:
+```ini
+[core]
+displayRadius:25
+```
+
+### uiTargetRadius
+#### uiTargetRadius-代码简介
+
+代码:uiTargetRadius 中文释义:为目标时半径 类型:整形 隶属于:UI和图形代码组
+
+> [!TIP] 修改选择单位时显示的绿色圆圈,不更改实际碰撞(radius)和可选择范围。
+
+#### uiTargetRadius-演示例子:
+```ini
+[core]
+uiTargetRadius:25
+```
+
+### shieldRenderRadius
+#### shieldRenderRadius-代码简介
+
+代码:shieldRenderRadius 中文释义:单位护盾显示半径 类型:整形 隶属于:UI和图形代码组
+
+> [!TIP] 护盾绘制半径,默认值比半径大一点。可以设置在单位上显示更大或更小的护盾圈。
+
+#### shieldRenderRadius-演示例子:
+```ini
+[core]
+shieldRenderRadius:20
+```
+
+### shieldDisplayOnlyDeflection
+#### shieldDisplayOnlyDeflection-代码简介
+
+代码:shieldDisplayOnlyDeflection 中文释义:护盾只在受攻击时显示 类型:布尔型 隶属于:UI和图形代码组
+
+> [!TIP] 隐藏护盾,只在受到攻击时显示。
+
+#### shieldDisplayOnlyDeflection-演示例子:
+```ini
+[core]
+shieldDisplayOnlyDeflection:true
+```
+
+### shieldDeflectionDisplayRate
+#### shieldDeflectionDisplayRate-代码简介
+
+代码:shieldDeflectionDisplayRate 中文释义:护盾消失速度 类型:浮点型 隶属于:UI和图形代码组
+
+> [!TIP] 默认值为4。数值越大消失越快。
+
+#### shieldDeflectionDisplayRate-演示例子:
+```ini
+[core]
+shieldDeflectionDisplayRate:3
+```
+
+### showOnMinimap
+#### showOnMinimap-代码简介
+
+代码:shieldDeflectionDisplayRate 中文释义:显示在小地图上 类型:布尔型 隶属于:UI和图形代码组
+
+> [!TIP] 默认为true。如果为false,则在小地图上不显示此单位。
+
+#### showOnMinimap-演示例子:
+```ini
+[core]
+showOnMinimap:true
+```
+
+### showOnMinimapToEnemies
+#### showOnMinimapToEnemies-代码简介
+
+代码:showOnMinimapToEnemies 中文释义:显示于敌人小地图 类型:布尔型 隶属于:UI和图形代码组
+
+> [!TIP] 是否在敌人小地图上显示。
+
+#### showOnMinimapToEnemies-演示例子:
+```ini
+[core]
+showOnMinimapToEnemies:true
+```
+
+### showActionsWithMixedSelectionIfOtherUnitsHaveTag
+#### showActionsWithMixedSelectionIfOtherUnitsHaveTag-代码简介
+
+代码:showActionsWithMixedSelectionIfOtherUnitsHaveTag 中文释义:混合所选单位所显示的行为 类型:标签型 隶属于:UI和图形代码组
+
+> [!TIP] 如果选择的单位都包含此处使用的标签,则合并“行为(action)”。比如你的步兵通过部署转化成另一个单位,在混合时可以当作同一个单位处理,不再是默认的谁都无法执行操作。例子如红警的盟军大兵在混合选中后依旧可执行部署或解除。
+
+#### showActionsWithMixedSelectionIfOtherUnitsHaveTag-演示例子:
+```ini
+[core]
+showActionsWithMixedSelectionIfOtherUnitsHaveTag:tag_联系
+```
+
+> [!NOTE] core组-第三类-构建代码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## **[canBuild_Name]组**
+
+## **[graphics]组**
+
+### image
+#### image-代码简介
+代码:image 中文释义:主体图像 类型:文件(图像文件) 隶属于:通用代码组
+#### image-要点指示
+image代码要点指示:
+
+#### **tobby3600**
+主体图像定义单位的图像。
+在不进行额外修改的情况下,主体图像会显示在单位、单位列表、单位信息处。
+#### **JDSALing**
+填写的值可以包含路径,若只包含文件名,则会在和当前ini相同文件夹内寻找图片文件。
+可以通过`ROOT:路径\文件`的形式来访问在模组目录下的任何文件。
+#### **tobby3600**
+上述方法还可以在路径中添加`..`来访问外部文件
+
+
+#### image-演示例子
+```ini
+[graphics]
+image:main.png
+```
+
+### image_wreak
+#### image_wreak-代码简介
+代码:image_wreak 中文释义:死亡图像 类型:文件(图像文件) 隶属于:通用代码组
+#### image_wreak-要点指示
+image_wreak代码要点指示:
+
+#### **tobby3600**
+死亡图像定义单位死亡后产生的图像。
+文件定义方式与image相同。
+#### **JDSALing**
+填写`NONE`可以让单位死亡后不产生死亡图像。
+
+
+#### image_wreak-演示例子
+```ini
+[graphics]
+image_wreak:dead.png
+或者
+image_wreak:NONE
+```
+
+### imageScale
+#### imageScale-代码简介
+代码:imageScale 中文释义:图像缩放比例 类型:文件(图像文件) 隶属于:通用代码组
+#### imageScale-要点指示
+imageScale代码要点指示:
+
+#### **tobby3600**
+填写后,铁锈会将图像大小乘以缩放比例。
+默认值为1。
+
+
+#### imageScale-演示例子
+```ini
+[graphics]
+imageScale:1.2
+```
+
+## **折叠第1页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+
+
+# Page 2
+
+# **[attack]组**
+
+# **[turret_Name]组**
+
+# **[projectile_Name]组**
+## **折叠第2页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+# Page 3
+
+# **[movement]组**
+
+# **[ai]组**
+
+# **[leg_#]/[arm_#]集合组**
+## **折叠第3页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+# Page 4
+
+# **[attachment_Name]组**
+
+# **[effect_Name]组**
+
+# **[animation_Name]组**
+## **折叠第4页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+# Page 5
+
+# **[action_Name]/[hiddenAction_Name]集合组**
+
+### text
+#### text-代码简介
+代码:text 中文释义:显示文本 类型:字符串 隶属于:行为代码组
+支持%动态显示,其内容为该action的名称
+
+### buildSpeed
+#### buildSpeed-代码简介
+代码:buildSpeed 中文释义:建造速度 类型:s/帧 隶属于:行为代码组
+执行此动作所需要的时间。使用秒作为单位更好。例子:buildSpeed:0.3s
+
+### alsoTriggerAction
+#### alsoTriggerAction-代码简介
+代码:alsoTriggerAction 中文释义:也执行动作 类型:action refs 隶属于:行为代码组
+执行完此动作后执行其他动作,忽略行动的buildSpeed,直接执行。
+
+### requireConditional
+#### requireConditional-代码简介
+代码:requireConditional 中文释义:需要条件 类型:LogicBoolean 隶属于:行为代码组
+如果结果为false,则不执行该action。
+
+### alsoTriggerActionRepeat
+#### alsoTriggerActionRepeat-代码简介
+代码:alsoTriggerActionRepeat 中文释义:循环次数 类型:number 隶属于:行为代码组
+重复alsoTriggerAction调用x次,每次重复时改变索引(+1),索引可在被调用的action使用 用于创建循环或处理数组 动态数字
+#### alsoTriggerActionRepeat-演示例子
+```ini
+[hiddenAction_A]
+alsoTriggerAction:B
+alsoTriggerActionRepeat:10
+[hiddenAction_B]
+showMessageToAllPlayers:%{index}
+```
+B会被执行10次,打印结果为0~9
+
+### setUnitMemory
+#### setUnitMemory-代码简介
+代码:setUnitMemory 中文释义:设置单位内存 隶属于:行为代码组
+设置单位的memory的值。
+#### setUnitMemory-演示例子
+```ini
+[core]
+@memory str:string
+[hiddenAction_setMemory]
+setUnitMemory:str="hello shishanyue"
+```
+
+### alsoQueueAction
+#### alsoQueueAction-代码简介
+代码:alsoQueueAction 中文释义:也添加进队列 类型:action refs 隶属于:行为代码组
+将另一个动作添加到序列中。不忽略行动的buildSpeed
+
+### removeAllQueuedItemsWithoutRefund
+#### removeAllQueuedItemsWithoutRefund-代码简介
+代码:removeAllQueuedItemsWithoutRefund 中文释义:取消所有仍在序列中等待执行的行为 类型:Boolean 隶属于:行为代码组
+removeAllQueuedItemsWithoutRefund:true
+
+### alsoTriggerOrQueueActionWithTarget
+#### alsoTriggerOrQueueActionWithTarget-代码简介
+代码:alsoTriggerOrQueueActionWithTarget 中文释义:更改其他触发动作的目标 类型:unit ref 隶属于:行为代码组
+具体实例可以看(十山月打广告()https://www.bilibili.com/video/BV17v4y1r7dV/
+
+### autoTriggerOnEvent
+#### autoTriggerOnEvent-代码简介
+代码:autoTriggerOnEvent 中文释义:自动触发事件 类型:字符串 隶属于:行为代码组
+满足此条件则自动触发。
+
+|参数表 |参数表 |
+| -------- | ------------ |
+|创建 |created |
+|完成且激活 |completeAndActive |
+|销毁 |destroyed |
+|杀死任何单位 |killedAnyUnit |
+|队列中单位完成 |queuedUnitFinished |
+|队列添加项目 |queueItemAdded |
+|队列项目取消 |queueItemCancelled |
+|传送 |teleported |
+|接触目标成功(eventSource=碰到的目标) |touchTargetSuccess |
+|玩家指定路径 |newWaypointGivenByPlayer |
+|队列项目取消 |queueItemCancelled |
+|运输新单位(eventSource=被运输的单位) |transportingNewUnit |
+|卸载或移除单位 |transportUnloadedOrRemovedUnit |
+|队伍变更 |teamChanged |
+|收到伤害(eventSource=造成伤害的单位) |tookDamage |
+|杀死任意单位 |killedAnyUnit |
+|运输卸下或搬走的单位(eventSource=被卸载的单位) | transportUnloadedOrRemovedUnit |
+|有新单位被建造时(eventSource=被建造的新单位) |queuedUnitFinished |
+|有单位进入运输槽(eventSource=被运输的单位) |enteredTransport |
+|有单位离开运输槽(eventSource=被运输的单位) |leftTransport |
+|附属被移除 |attachmentRemoved |
+
+
+### resetCustomTimer
+#### resetCustomTimer-代码简介
+代码:resetCustomTimer 中文释义:重置自定义计时器 类型:Boolean 隶属于:行为代码组
+重置自定义计时器,与self.customTimer() resetCustomTimer:true
+
+### teleportTo
+#### teleportTo-代码简介
+代码:teleportTo 中文释义:传送到 类型:unit ref 隶属于:行为代码组
+传送到指定单位。teleportTo:self.customTarget1
+
+### fireTurretXAtGround
+#### fireTurretXAtGround-代码简介
+代码:fireTurretXAtGround 中文释义:指定攻击地面炮塔 类型:字符串 隶属于:行为代码组
+使用此炮塔攻击玩家所指定的地面。
+
+### fireTurretXAtGround_withProjectile
+#### fireTurretXAtGround_withProjectile-代码简介
+代码:fireTurretXAtGround_withProjectile 中文释义:指定攻击地面抛射体 类型:字符串 隶属于:行为代码组
+设定使用的抛射体,如果不设置则为炮塔默认的抛射体。
+
+### fireTurretXAtGround_withTarget
+#### fireTurretXAtGround_withTarget-代码简介
+代码:fireTurretXAtGround_withTarget 中文释义:指定攻击目标 类型:unit ref/marker 隶属于:行为代码组
+炮塔瞄准指示的单位或标记的位置发射
+
+### fireTurretXAtGround_withOffset
+#### fireTurretXAtGround_withOffset-代码简介
+代码:fireTurretXAtGround_withTarget 中文释义:指定攻击地面坐标 类型:point 隶属于:行为代码组
+攻击指定坐标所在地面,不需要手动选择
+
+### fireTurretXAtGround_count
+#### fireTurretXAtGround_count-代码简介
+代码:fireTurretXAtGround_withTarget 中文释义:指定攻击地面数量 类型:number 隶属于:行为代码组
+设置发射的抛射体数量,默认为1。fireTurretXAtGround_count:10
+
+### fireTurretXAtGround_onlyOverPassableTileOf
+#### fireTurretXAtGround_onlyOverPassableTileOf-代码简介
+代码:fireTurretXAtGround_withTarget 中文释义:指定攻击地面类型 类型:enum 隶属于:行为代码组
+设置手动选择的地面需要满足这种运动方式。列表:无,陆地,建筑,空军,水。两栖,跨悬崖,跨悬崖和度水。
+NONE LAND BUILDING AIR WATER HOVER OVER_CLIFF OVER_CLIFF_WATER
+
+
+#### fireTurret-演示例子
+手动选择攻击点:
+```ini
+[hiddenAction_fire]
+fireTurretXAtGround:1
+fireTurretXAtGround_onlyOverPassableTileOf:LAND
+#只能点击地面
+[turret_1]
+projectile:1
+
+[projectile_1]
+```
+指定攻击点:
+```ini
+[hiddenAction_fire]
+fireTurretXAtGround:1
+fireTurretXAtGround_onlyOverPassableTileOf:LAND
+#只能点击地面
+fireTurretXAtGround_withOffset: 0,0
+#填的是相对坐标
+fireTurretXAtGround_withProjectile:2
+#使用抛射体2
+fireTurretXAtGround_withTarget:self.parent
+#攻击parent
+[turret_1]
+projectile:1
+.............
+.............
+[projectile_1]
+.............
+.............
+[projectile_2]
+```
+fireTurretXAtGround_withTarget同时只能有一个fireTurretXAtGround_withOffset。如果俩的没有则是手动选择攻击点。
+
+当使用fireTurretXAtGround_withProjectile重新指定抛射体后,使用的不再是fireTurretXAtGround的炮塔的抛射体。
+
+fireTurretX中的"X"是可以替换成数字。
+```ini
+[hiddenAction_fire]
+fireTurret1AtGround:1
+fireTurret1AtGround_onlyOverPassableTileOf:LAND
+fireTurret1AtGround_withOffset: 0,0
+
+fireTurret1AtGround:2
+fireTurret1AtGround_onlyOverPassableTileOf:LAND
+fireTurret1AtGround_withOffset: 0,0
+[turret_1]
+projectile:1
+[turret_2]
+projectile:2
+[projectile_1]
+[projectile_2]
+```
+### description
+#### description-代码简介
+
+代码:description 中文释义:显示文本介绍 类型:字符串 隶属于:行为代码组
+
+支持%动态显示,其内容为点击action后显示的文本
+
+### Message
+#### Message-代码简介
+
+代码:sendMessageTo 中文释义:接收message的对象 类型:unit 隶属于:行为代码组
+
+将message发送给该对象
+
+代码:sendMessageWithTags 中文释义:message附带的tag 类型:tagList 隶属于:行为代码组
+
+与[core]的tags类似,以逗号分割每个tag,在接受单位中使用autoTriggerOnEvent:newMessage(withTag=xxx)接收
+
+代码:sendMessageWithData 中文释义:message附带的数据 类型:variableList 隶属于:行为代码组
+
+发送的数据名不是memory,但数据可以是memory
+
+#### Message-演示例子
+A单位:
+```ini
+[core]
+@memory num:number
+
+[hiddenAction_发送]
+sendMessageTo:self.customTarget1
+sendMessageWithTags:tag1,tag2
+sendMessageWithData:data1="abc",data2=1,hp=self.hp,memory1=memory.num
+```
+> [!TIP] data1 data2这些都不用提前声明。A单位的self.customTarget1为B单位,data1为字符串,data2为数字1,hp为A单位的血量,memory1的值为num这个memory的值
+B单位:
+```ini
+[hiddenAction_接受1]
+#能够触发
+autoTriggerOnEvent:newMessage(withTag="tag1")
+showMessageToAllPlayers:%{eventSource}+eventData("data1",type="string")
+#eventSource为发送该message的单位,即A单位(unit)。
+#使用eventData("name",type="")获取该message附带的数据,name为该数据的名称(如data2,memory1)这里需要""括起来。
+#type类型由A单位发送时决定
+[hiddenAction_接受2]
+#不能够触发,因为A单位发送的message没有附带tag3
+autoTriggerOnEvent:newMessage(withTag="tag3")
+showMessageToAllPlayers:ababab
+```
+|type类型如下 |存储的值类型 |
+| -------- | ------------ |
+|string |字符串 |
+|number |整数 |
+|float |浮点数 |
+|boolean |布尔 |
+|unit[] |单位数组 |
+|float[] |浮点数组 |
+|number[] |整数数组 |
+
+
+# **[spawn unit] 刷兵序列组**
+
+# **[placementRule_Name] 放置规则组**
+## **折叠第5页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+# Page 6
+
+# **[LogicBoolean] 逻辑序列组**
+> [!ATTENTION] 由于这个组的特殊性,格式不标准,请勿参考这个组的写法。
+
+### 前置知识
+
+#### 布尔值
+布尔值表达“真(true)”或“假(false)”的一个状态。在铁锈中,布尔值(`boolean`)被运用于逻辑判断。
+
+#### 数据类型
+数据类型指数据的种类,在铁锈中,不同的数据有不同的类型,不同的数据类型之间通常不能直接进行运算。
+
+|常见数据类型英文 |存储的值类型 |
+| -------- | ------------ |
+| string | 字符串 |
+| number | 整数 |
+| float | 浮点数(小数) |
+| boolean | 布尔值 |
+| unit | 单位 |
+
+
+#### 算数优先级
+与数学中计算符一样,铁锈中算数运算符有优先级区别。`%`和`*`和`/`的优先级大于`+`和`-`。
+
+### 比较运算符
+
+#### 如果
+代码:if 中文释义:如果
+`if`是大部分逻辑运算的开头(select等不需要if),用于在支持逻辑的键引入逻辑判断。
+
+
+
+
+```ini
+[action]
+autoTrigger:if self.maxHp() > memory.emx_hp
+```
+
+#### 小于
+代码:< 中文释义:小于
+小于用于在逻辑布尔值中比较两个数的大小,格式为`数据a < 数据b`,若`a
+
+
+
+```ini
+[action]
+autoTrigger:if memory.a < memory.b
+```
+
+#### 大于
+代码:> 中文释义:大于
+同上,格式为`数据a > 数据b`,若`a>b`则整个式子的值为`true`,否则为`false`。
+
+#### 小于等于
+代码:<= 中文释义:小于等于
+同上,若`a<=b`则整个式子的值为`true`,否则为`false`。
+
+#### 大于等于
+代码:>= 中文释义:大于等于
+同上,若`a>=b`则整个式子的值为`true`,否则为`false`。
+
+#### 等于
+代码:== 中文释义:等于
+> [!TIP] 请注意,铁锈中等于的符号为==,=在铁锈中用于赋值或参数。
+>
+同上,若`a=b`则整个式子的值为`true`,否则为`false`。
+
+#### 不等于
+代码:!= 中文释义:不等于
+同上,若`a!=b`则整个式子的值为`true`,否则为`false`。
+
+### 逻辑运算符
+
+#### 且
+代码:and 中文释义:且
+> [!TIP] and用于连接两个逻辑判断,只有在这两个逻辑判断的值都为true时,and的值才为true。
+
+
+
+
+
+
+```ini
+[action]
+autoTrigger:if memory.a < memory.b and memory.a > memory.c
+# 在这个例子中,只有a小于b且a大于c时,自动触发才会被触发
+```
+
+#### 或
+代码:or 中文释义:或
+> [!TIP] or用于连接两个逻辑判断,只要这两个逻辑判断的值有一个为true时,or的值就为true。
+
+#### 非
+代码:not 中文释义:非
+> [!TIP] not用于将某个逻辑判断的值取反,即`true`变`false`,`false`变`true`。
+
+> [!NOTE] 多个逻辑运算符同时使用时,优先级为`not>and>or`,同时支持使用括号改变运算优先级。
+
推荐在不确定优先级时打括号。
+
+
+
+```ini
+[action]
+autoTrigger:if (memory.a < memory.b or memory.a > memory.c) and not memory.a < memory.d
+```
+
+
+
+#### **动动脑考考你**
+#### 考考你,在上述这个例子中,满足什么条件才会触发?
+#### **显示答案-#2**
+#### 答案:a必须满足小于b和大于c中的一个,且a必须小于c,自动触发才会被触发。
+
+
+
+
+### 算数运算符
+
+#### 加
+代码:+ 中文释义:加
+
+加用于将两个逻辑值相加,得到结果,格式为`数据a + 数据b`。
+
+> [!NOTE] 不同数据类型通常不能直接进行算数运算,但在部分情况下,number和float类型可以混用(建议所有数值全部使用float来避免混淆)。
+
+
+
+```ini
+[action]
+autoTrigger:if (memory.a + memory.c) < memory.b
+```
+
+#### 减
+代码:- 中文释义:减
+
+减用于将两个逻辑值相减,得到结果,格式为`数据a - 数据b`。
+
+> [!NOTE] 对于不满足交换律的运算符,需要注意运算优先级是否正确。由于铁锈本身bug,在数学上正确的优先级不一定在铁锈中正确,因此可能出现减法顺序混乱等问题。
+
为了避免可能的问题,请尽量在任何不满足交换律的运算符两边打上括号。
+
+#### 乘
+代码:* 中文释义:乘
+
+乘用于将两个逻辑值相乘,得到结果,格式为`数据a * 数据b`。
+
+#### 除
+代码:/ 中文释义:除
+
+除用于将两个逻辑值相除,得到结果,格式为`数据a / 数据b`。
+
+#### 求余
+代码:% 中文释义:求余(取模)
+
+求余用于获取两个逻辑值中,第一个除第二个的余数,格式为`数据a % 数据b`。
+例如`7%3=1(7除3余1)`
+
+### 单位统计
+
+#### 通用统计关键字
+单位统计中部分通用的关键字:
+1. `greaterThan` 大于
+2. `lessThan` 小于
+3. `empty` 空
+4. `full` 满
+5. `equalTo` 等于
+
+#### 内置参数
+单位统计中部分内置参数返回代码(由于过于简单不单独列出):
+1. `self.hp()` 生命值
+2. `self.maxHp()` 最大生命值
+3. `self.energy()` 能量
+4. `self.shield()` 护盾
+5. `self.kills()` 击杀数
+6. `self.maxEnergy()` 最大能量
+7. `self.maxShield()` 最大护盾
+8. `self.height()/self.x()` 高度
+9. `self.ammo()` 弹药
+10. `self.isAmmoEmpty()` 弹药为空(快捷方式:`self.ammo(empty=true)`)
+11. `self.ammoIncludingQueued()` 包括队列中的弹药
+12. `self.energyIncludingQueued()` 包括队列中的能量
+13. `self.isEnergyFull()` 能量满(快捷方式:`self.energy(full=true)`)
+14. `self.isEnergyEmpty()` 能量空(快捷方式:`self.energy(empty=true)`)
+15. `self.isEnergyRecharing()` 能量充能中
+16. `self.playerName()` 玩家名称
+17. `self.teamName()` 队伍名称
+18. `self.x(),self.y()` x,y坐标
+19. `self.dir()` 方向
+20. `self.priceCredits()` 金钱价格
+21. `self.speed()` 当前速度
+22. `self.maxMoveSpeed()` 最大速度
+23. `self.id()` 单位id(每个单位的序号)
+24. `self.builtAmount()` 建造数量
+25. `self.complate()` 自身建造完成
+26. `self.teamDefeatedTech()` 队伍失败
+27. `self.teamWipedOut()` 队伍全部死亡
+28. `self.teamVictory()` 队伍获胜
+29. `self.queueSize()` 自身队列大小
+30. `self.transportingCount()` 运输数量
+31. `self.isAttacking()` 在攻击
+32. `self.isOnNeutralTeam()` 是中立队伍
+33. `self.isControlledByAI()` 是AI控制
+34. `self.isInMap()` 在地图内
+35. `game.mapWidth()` 地图宽度
+36. `game.mapHeight()` 地图高度
+
+#### self.hasResources()
+代码:self.hasResources() 中文释义:有资源 返回类型:boolean
+
+`self.hasResources()` 用于检测自身某资源是否大于等于某数值,格式为`self.hasResources(资源名=数值)`
+
+
+
+```ini
+self.hasResources(hp=10,energy=5)
+```
+
+#### self.resource()
+代码:self.resource() 中文释义:资源 返回类型:float
+
+与`self.hasResources()`不同,`self.resource()`直接返回某个资源的数值。格式为`self.resource(type="资源名")`。
+
+> [!NOTE] 引用资源时,请确保这个资源在这个单位定义过,否则会报错。
+
+#### self.resource.RESOURCE_TYPE
+代码:self.resource.RESOURCE_TYPE 中文释义:资源 返回类型:float
+
+`self.resource.RESOURCE_TYPE`是`self.resource()`的快捷方式。格式为`self.resource.资源名称`,引用更加方便。
+
+#### self.isResourceLargerThan()
+代码:self.isResourceLargerThan() 中文释义:资源是否大于 返回类型:boolean
+
+> [!ATTENTION] 此代码为老旧解决方案,不推荐使用。
+
+`self.isResourceLargerThan()`用于比较两种资源的大小。格式为`self.isResourceLargerThan(source=资源A,compareTarget=资源B,byMoreThan=大于资源B数量,multiplyTargetBy=资源B倍数)`
+
+#### self.numberOfQueuedWaypoints()
+代码:self.numberOfQueuedWaypoints() 中文释义:队列中路径点数量 返回类型:float
+
+`self.numberOfQueuedWaypoints()`用于返回队列中路径点的数量。格式为`self.numberOfQueuedWaypoints(type="路径点类型")`。
+
+### 单位计时
+
+#### self.hasTakenDemage()
+代码:self.hasTakenDemage() 中文释义:受到伤害 返回类型:bool
+
+> [!NOTE] 单位计时部分能返回到最小时间精度为0.1秒。
+
+`self.hasTakenDemage()`用于获取指定时间内是否收到伤害。使用`self.hasTakenDemage(withInSecounds=多少秒内,laterThanSecounds=多少秒后)`格式时,返回bool类型。
+
+#### self.timeAlive()
+代码:self.timeAlive() 中文释义:存活时间 返回类型:float/bool
+
+`self.timeAlive()`用于获取单位存活时间。使用`self.timeAlive(withInSecounds=多少秒内,laterThanSecounds=多少秒后)`格式时,返回bool类型(是否符合此范围);使用`self.timeAlive()`格式时,返回float类型。(更推荐使用后者)
+
+#### self.lastConverted()
+代码:self.lastConverted() 中文释义:最后转换时间 返回类型:float/bool
+
+`self.timeAlive()`用于获取单位上次转换后的时间。使用`self.lastConverted(withInSecounds=多少秒内,laterThanSecounds=多少秒后)`格式时,返回bool类型(是否符合此范围);使用`self.lastConverted()`格式时,返回float类型。
+
+#### self.customTimer()
+代码:self.customTimer() 中文释义:自定义计时器 返回类型:float/bool
+
+`self.timeAlive()`用于获取自定义计时器的时间。使用`self.customTimer(withInSecounds=多少秒内,laterThanSecounds=多少秒后)`格式时,返回bool类型(是否符合此范围);使用`self.customTimer()`格式时,返回float类型。
+
+
+
+```ini
+[action]
+autoTrigger:if self.customTimer() >= 10
+resetCustomTimer:true
+showMessageToPlayers:10秒过去了
+```
+
+### 杂项
+
+#### thisActionIndex/index()
+代码:thisActionIndex/index() 中文释义:索引 返回类型:float(number)
+
+`thisActionIndex/index()`是`alsoTriggerActionRepeat`中当前的索引。例如`alsoTriggerActionRepeat:10`,那么index在10次循环中分别为1-10。
+
+#### self.hasFlag()
+代码:self.hasFlag() 中文释义:有标志 返回类型:boolean
+
+`self.hasFlag()`用于获取自身是否有标志,格式为`self.hasFlag(id=数字)`。
+
+> [!NOTE] 不同于标签(tag),标志(flag)是内置的一些布尔值,无需定义即可直接使用。
+> 标签的添加方法为[action]addResource:flag=1,3-7,13,且只支持0-31,标签的移除方法与之相反。
+
+#### self.tags()
+代码:self.tags() 中文释义:有标签 返回类型:boolean
+
+`self.tags()`用于检测自身是否有某个标签,格式为`self.tags(includes="标签")`。
+
+#### self.globalTeamTags/self.hasGlobalTeamTags()
+代码:self.globalTeamTags/self.hasGlobalTeamTags() 中文释义:有全局标签 返回类型:boolean
+
+`self.globalTeamTags/self.hasGlobalTeamTags()`用于检测队伍内是否有某个全局标签,格式为`self.globalTeamTags/self.hasGlobalTeamTags(includes="标签")`
+
+#### self.numberOfConnections()
+代码:self.numberOfConnections() 中文释义:连接数 返回类型:float
+
+隐藏代码,用途不明。
+
+#### self.numberOfAttachedUnits()
+代码:self.numberOfAttachedUnits() 中文释义:有附属物 返回类型:int/bool
+
+`self.numberOfAttachedUnits()`用于获取自身附属物数量,可以通过`self.numberOfAttachedUnits(withTag="标签")`格式来限制附属物标签。
+
+#### self.hasActiveWaypoint()
+代码:self.hasActiveWaypoint() 中文释义:有活动的路径点 返回类型:bool
+
+`self.hasActiveWaypoint()`用于获取自身有无活动的路径点,格式为`self.hasActiveWaypoint(type="路径点类型")`。
+
+> [!NOTE] 路径点类型可以是move, attackMove, guard, loadInto, loadUp, attack, reclaim, repair, touchTarget, build, follow, setPassiveTarget。
+
+#### self.transportingUnitWithTags()
+代码:self.transportingUnitWithTags() 中文释义:运输单位中有此标签 返回类型:bool
+
+`self.transportingUnitWithTags()`用于检测自身运输的单位中是否有含有特定标签的单位,格式为`self.transportingUnitWithTags(includes="标签")`。
+
+#### self.hasParent()
+代码:self.hasParent() 中文释义:有父单位 返回类型:bool
+
+`self.hasParent()`用于检测自身是否有父单位,且可以通过`self.hasParent(hasTag="标签")`来筛选父单位标签。
+通常情况下,附属和被运输单位会有父单位。
+
+#### self.numberOfUnitsInTeam()
+代码:self.numberOfUnitsInTeam() 中文释义:队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInTeam()`(可省略`self.`)用于检测自身队伍符合条件的单位数量,格式为`self.numberOfUnitsInTeam(withTag="标签",withinRange=此距离内,incompleteBuildings=包含不完整建筑,factoryQueue=包含工厂队列)`
+
+
+
+```ini
+self.numberOfUnitsInTeam(withTag="air",withInRange=500,factoryQueue=true)
+#有air标签,500范围内,包含工厂队列中的单位
+```
+
+#### self.numberOfUnitsInAllyNotOwnTeam()
+代码:self.numberOfUnitsInAllyNotOwnTeam() 中文释义:盟友队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInAllyNotOwnTeam()`与`self.numberOfUnitsInTeam()`用法完全相同,区别仅在于前者的查询范围是盟友中。
+
+#### self.numberOfUnitsInEnemyTeam()
+代码:self.numberOfUnitsInEnemyTeam() 中文释义:敌方队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInEnemyTeam()`与`self.numberOfUnitsInTeam()`用法完全相同,区别仅在于前者的查询范围是敌方中。
+
+#### self.numberOfUnitsInNeutralTeam()
+代码:self.numberOfUnitsInNeutralTeam() 中文释义:中立队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInNeutralTeam()`与`self.numberOfUnitsInTeam()`用法完全相同,区别仅在于前者的查询范围是中立中。
+
+#### self.numberOfUnitsInAggressiveTeam()
+代码:self.numberOfUnitsInAggressiveTeam() 中文释义:敌对中立队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInAggressiveTeam()`与`self.numberOfUnitsInTeam()`用法完全相同,区别仅在于前者的查询范围是敌对中立中。
+
+#### self.numberOfUnitsInAllyTeam()
+代码:self.numberOfUnitsInAllyTeam() 中文释义:所有队伍中此单位数量 返回类型:float
+
+`self.numberOfUnitsInAllyTeam()`与`self.numberOfUnitsInTeam()`用法完全相同,区别仅在于前者的查询范围是所有中。
+
+#### self.hasUnitInTeam()
+代码:self.hasUnitInTeam() 中文释义:队伍中有单位 返回类型:bool
+
+`self.hasUnitInTeam()`与`self.numberOfUnitsInTeam()`格式完全相同,区别在于前者仅查询队伍中有无符合条件的单位,并返回`boolean`类型。
+
+#### self.noUnitInTeam()
+代码:self.noUnitInTeam() 中文释义:队伍中无单位 返回类型:bool
+
+`self.noUnitInTeam()`与`self.numberOfUnitsInTeam()`格式完全相同,区别在于前者仅查询队伍中是否无符合条件的单位,并返回`boolean`类型。
+
+#### self.readUnitMemory()
+代码:self.readUnitMemory() 中文释义:读取单位内存 返回类型:跟随memory类型
+
+`self.readUnitMemory()`用于获取指定单位内存,格式为`self.readUnitMemory("内存名",type="类型",index=下标(仅当类型是数组时可选填写))`。
+
+> [!NOTE] 在跨单位读取数组时,如果下标使用了逻辑,无论逻辑值都会返回第零项,为游戏bug,解决方法可以参考
https://www.bilibili.com/video/BV17v4y1r7dV (感谢十山月)
+
+
+
+```ini
+if parent.readUnitMemory("boostTarget", type="unit") == self
+#如果 父单位内存boostTarget的值等于自己
+```
+
+
+
+
+# **[Prices/Resources] 价格/资源序列组**
+
+# **[global_resource_Name] 全局资源组**
+## **折叠第6页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+# Page 7
+
+
+# **[resource_Name] 局部资源组**
+
+# **[template_Name] 模板组**
+
+# **[comment_Name] 注解组**
+
+## **折叠第7页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
+
+# Page 8
+
+
+# **[decal_Name] 贴花组**
+
+# **[Dex-Code] 源码Dex扩展组**
+
+# **[hidden-code] 隐藏代码扩展组**
+
+## **折叠第8页**
+该页已被折叠,点击其他选项卡可以再次展开。
+
\ No newline at end of file
diff --git a/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js b/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js
index 672e168..d67d84c 100644
--- a/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js
+++ b/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js
@@ -1,25 +1,25 @@
-// node_modules/vitepress/dist/client/theme-default/index.js
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/fonts.css";
+// node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/index.js
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/fonts.css";
-// node_modules/vitepress/dist/client/theme-default/without-fonts.js
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/vars.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/base.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/utils.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css";
-import "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
-import VPBadge from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
-import Layout from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/Layout.vue";
-import { default as default2 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue";
-import { default as default3 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
-import { default as default4 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
-import { default as default5 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
-import { default as default6 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue";
-import { default as default7 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
-import { default as default8 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
-import { default as default9 } from "D:/repot/RW-API-Code/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
+// node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/without-fonts.js
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/vars.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/base.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/utils.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/components/custom-block.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/components/vp-code.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/components/vp-doc.css";
+import "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
+import VPBadge from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPBadge.vue";
+import Layout from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/Layout.vue";
+import { default as default2 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPHomeHero.vue";
+import { default as default3 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
+import { default as default4 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
+import { default as default5 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
+import { default as default6 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPTeamPage.vue";
+import { default as default7 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
+import { default as default8 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
+import { default as default9 } from "D:/RTS-Code-V4-Html/node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
var theme = {
Layout,
enhanceApp: ({ app }) => {
diff --git a/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js.map b/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js.map
index d16b534..4ae4f85 100644
--- a/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js.map
+++ b/rustedwarfareapicode/.vitepress/cache/deps/@theme_index.js.map
@@ -1,6 +1,6 @@
{
"version": 3,
- "sources": ["../../../../node_modules/vitepress/dist/client/theme-default/index.js", "../../../../node_modules/vitepress/dist/client/theme-default/without-fonts.js"],
+ "sources": ["../../../../node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/index.js", "../../../../node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/without-fonts.js"],
"sourcesContent": ["import './styles/fonts.css';\nexport * from './without-fonts';\nexport { default as default } from './without-fonts';\n", "import './styles/vars.css';\nimport './styles/base.css';\nimport './styles/utils.css';\nimport './styles/components/custom-block.css';\nimport './styles/components/vp-code.css';\nimport './styles/components/vp-code-group.css';\nimport './styles/components/vp-doc.css';\nimport './styles/components/vp-sponsor.css';\nimport VPBadge from './components/VPBadge.vue';\nimport Layout from './Layout.vue';\n// Note: if we add more optional components here, i.e. components that are not\n// used in the theme by default unless the user imports them, make sure to update\n// the `lazyDefaultThemeComponentsRE` regex in src/node/build/bundle.ts.\nexport { default as VPHomeHero } from './components/VPHomeHero.vue';\nexport { default as VPHomeFeatures } from './components/VPHomeFeatures.vue';\nexport { default as VPHomeSponsors } from './components/VPHomeSponsors.vue';\nexport { default as VPDocAsideSponsors } from './components/VPDocAsideSponsors.vue';\nexport { default as VPTeamPage } from './components/VPTeamPage.vue';\nexport { default as VPTeamPageTitle } from './components/VPTeamPageTitle.vue';\nexport { default as VPTeamPageSection } from './components/VPTeamPageSection.vue';\nexport { default as VPTeamMembers } from './components/VPTeamMembers.vue';\nconst theme = {\n Layout,\n enhanceApp: ({ app }) => {\n app.component('Badge', VPBadge);\n }\n};\nexport default theme;\n"],
"mappings": ";AAAA,OAAO;;;ACAP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO,aAAa;AACpB,OAAO,YAAY;AAInB,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAqC;AAC9C,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAkC;AAC3C,SAAoB,WAAXA,gBAAoC;AAC7C,SAAoB,WAAXA,gBAAgC;AACzC,IAAM,QAAQ;AAAA,EACV;AAAA,EACA,YAAY,CAAC,EAAE,IAAI,MAAM;AACrB,QAAI,UAAU,SAAS,OAAO;AAAA,EAClC;AACJ;AACA,IAAO,wBAAQ;",
"names": ["default"]
diff --git a/rustedwarfareapicode/.vitepress/cache/deps/_metadata.json b/rustedwarfareapicode/.vitepress/cache/deps/_metadata.json
index c42e05f..3b20f7d 100644
--- a/rustedwarfareapicode/.vitepress/cache/deps/_metadata.json
+++ b/rustedwarfareapicode/.vitepress/cache/deps/_metadata.json
@@ -1,17 +1,17 @@
{
- "hash": "24d4623a",
- "browserHash": "3e7593e9",
+ "hash": "cfff58c0",
+ "browserHash": "db198c51",
"optimized": {
"vue": {
- "src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
+ "src": "../../../../node_modules/_vue@3.2.47@vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
- "fileHash": "41b04b45",
+ "fileHash": "bdf893bb",
"needsInterop": false
},
"@theme/index": {
- "src": "../../../../node_modules/vitepress/dist/client/theme-default/index.js",
+ "src": "../../../../node_modules/_vitepress@1.0.0-alpha.65@vitepress/dist/client/theme-default/index.js",
"file": "@theme_index.js",
- "fileHash": "d55c8c52",
+ "fileHash": "ea36232e",
"needsInterop": false
}
},
diff --git a/rustedwarfareapicode/.vitepress/cache/deps/vue.js b/rustedwarfareapicode/.vitepress/cache/deps/vue.js
index 1708501..03090f6 100644
--- a/rustedwarfareapicode/.vitepress/cache/deps/vue.js
+++ b/rustedwarfareapicode/.vitepress/cache/deps/vue.js
@@ -1,4 +1,4 @@
-// node_modules/@vue/shared/dist/shared.esm-bundler.js
+// node_modules/_@vue_shared@3.2.47@@vue/shared/dist/shared.esm-bundler.js
function makeMap(str, expectsLowerCase) {
const map2 = /* @__PURE__ */ Object.create(null);
const list = str.split(",");
@@ -242,7 +242,7 @@ var getGlobalThis = () => {
return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
};
-// node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js
+// node_modules/_@vue_reactivity@3.2.47@@vue/reactivity/dist/reactivity.esm-bundler.js
function warn(msg, ...args) {
console.warn(`[Vue warn] ${msg}`, ...args);
}
@@ -1349,7 +1349,7 @@ var _a;
var tick = Promise.resolve();
_a = "__v_isReadonly";
-// node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js
+// node_modules/_@vue_runtime-core@3.2.47@@vue/runtime-core/dist/runtime-core.esm-bundler.js
var stack = [];
function pushWarningContext(vnode) {
stack.push(vnode);
@@ -7934,7 +7934,7 @@ var ssrUtils = _ssrUtils;
var resolveFilter = null;
var compatUtils = null;
-// node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js
+// node_modules/_@vue_runtime-dom@3.2.47@@vue/runtime-dom/dist/runtime-dom.esm-bundler.js
var svgNS = "http://www.w3.org/2000/svg";
var doc = typeof document !== "undefined" ? document : null;
var templateContainer = doc && doc.createElement("template");
@@ -9348,7 +9348,7 @@ var initDirectivesForSSR = () => {
}
};
-// node_modules/vue/dist/vue.runtime.esm-bundler.js
+// node_modules/_vue@3.2.47@vue/dist/vue.runtime.esm-bundler.js
function initDev() {
{
initCustomFormatter();
diff --git a/rustedwarfareapicode/.vitepress/cache/deps/vue.js.map b/rustedwarfareapicode/.vitepress/cache/deps/vue.js.map
index d688283..3a2dab9 100644
--- a/rustedwarfareapicode/.vitepress/cache/deps/vue.js.map
+++ b/rustedwarfareapicode/.vitepress/cache/deps/vue.js.map
@@ -1,6 +1,6 @@
{
"version": 3,
- "sources": ["../../../../node_modules/@vue/shared/dist/shared.esm-bundler.js", "../../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js", "../../../../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js", "../../../../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js", "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js"],
+ "sources": ["../../../../node_modules/_@vue_shared@3.2.47@@vue/shared/dist/shared.esm-bundler.js", "../../../../node_modules/_@vue_reactivity@3.2.47@@vue/reactivity/dist/reactivity.esm-bundler.js", "../../../../node_modules/_@vue_runtime-core@3.2.47@@vue/runtime-core/dist/runtime-core.esm-bundler.js", "../../../../node_modules/_@vue_runtime-dom@3.2.47@@vue/runtime-dom/dist/runtime-dom.esm-bundler.js", "../../../../node_modules/_vue@3.2.47@vue/dist/vue.runtime.esm-bundler.js"],
"sourcesContent": ["/**\n * Make a map and return a function for checking if a key\n * is in that map.\n * IMPORTANT: all calls of this function must be prefixed with\n * \\/\\*#\\_\\_PURE\\_\\_\\*\\/\n * So that rollup can tree-shake them if necessary.\n */\nfunction makeMap(str, expectsLowerCase) {\n const map = Object.create(null);\n const list = str.split(',');\n for (let i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val];\n}\n\n/**\n * dev only flag -> name mapping\n */\nconst PatchFlagNames = {\n [1 /* PatchFlags.TEXT */]: `TEXT`,\n [2 /* PatchFlags.CLASS */]: `CLASS`,\n [4 /* PatchFlags.STYLE */]: `STYLE`,\n [8 /* PatchFlags.PROPS */]: `PROPS`,\n [16 /* PatchFlags.FULL_PROPS */]: `FULL_PROPS`,\n [32 /* PatchFlags.HYDRATE_EVENTS */]: `HYDRATE_EVENTS`,\n [64 /* PatchFlags.STABLE_FRAGMENT */]: `STABLE_FRAGMENT`,\n [128 /* PatchFlags.KEYED_FRAGMENT */]: `KEYED_FRAGMENT`,\n [256 /* PatchFlags.UNKEYED_FRAGMENT */]: `UNKEYED_FRAGMENT`,\n [512 /* PatchFlags.NEED_PATCH */]: `NEED_PATCH`,\n [1024 /* PatchFlags.DYNAMIC_SLOTS */]: `DYNAMIC_SLOTS`,\n [2048 /* PatchFlags.DEV_ROOT_FRAGMENT */]: `DEV_ROOT_FRAGMENT`,\n [-1 /* PatchFlags.HOISTED */]: `HOISTED`,\n [-2 /* PatchFlags.BAIL */]: `BAIL`\n};\n\n/**\n * Dev only\n */\nconst slotFlagsText = {\n [1 /* SlotFlags.STABLE */]: 'STABLE',\n [2 /* SlotFlags.DYNAMIC */]: 'DYNAMIC',\n [3 /* SlotFlags.FORWARDED */]: 'FORWARDED'\n};\n\nconst GLOBALS_WHITE_LISTED = 'Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,' +\n 'decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,' +\n 'Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt';\nconst isGloballyWhitelisted = /*#__PURE__*/ makeMap(GLOBALS_WHITE_LISTED);\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n // Split the content into individual lines but capture the newline sequence\n // that separated each line. This is important because the actual sequence is\n // needed to properly take into account the full line length for offset\n // comparison\n let lines = source.split(/(\\r?\\n)/);\n // Separate the lines and newline sequences into separate arrays for easier referencing\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count +=\n lines[i].length +\n ((newlineSequences[i] && newlineSequences[i].length) || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(`${line}${' '.repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);\n const lineLength = lines[j].length;\n const newLineSeqLength = (newlineSequences[j] && newlineSequences[j].length) || 0;\n if (j === i) {\n // push underline\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(1, end > count ? lineLength - pad : end - start);\n res.push(` | ` + ' '.repeat(pad) + '^'.repeat(length));\n }\n else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + '^'.repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join('\\n');\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item)\n ? parseStringStyle(item)\n : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n }\n else if (isString(value)) {\n return value;\n }\n else if (isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*.*?\\*\\//gs;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText\n .replace(styleCommentRE, '')\n .split(listDelimiterRE)\n .forEach(item => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n let ret = '';\n if (!styles || isString(styles)) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === 'number') {\n // only render valid values\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = '';\n if (isString(value)) {\n res = value;\n }\n else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + ' ';\n }\n }\n }\n else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + ' ';\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\n// These tag configs are shared between compiler-dom and runtime-dom, so they\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element\nconst HTML_TAGS = 'html,body,base,head,link,meta,style,title,address,article,aside,footer,' +\n 'header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,' +\n 'figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,' +\n 'data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,' +\n 'time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,' +\n 'canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,' +\n 'th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,' +\n 'option,output,progress,select,textarea,details,dialog,menu,' +\n 'summary,template,blockquote,iframe,tfoot';\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Element\nconst SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' +\n 'defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,' +\n 'feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,' +\n 'feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,' +\n 'feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,' +\n 'fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,' +\n 'foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,' +\n 'mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,' +\n 'polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,' +\n 'text,textPath,title,tspan,unknown,use,view';\nconst VOID_TAGS = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isHTMLTag = /*#__PURE__*/ makeMap(HTML_TAGS);\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isSVGTag = /*#__PURE__*/ makeMap(SVG_TAGS);\n/**\n * Compiler only.\n * Do NOT use in runtime code paths unless behind `(process.env.NODE_ENV !== 'production')` flag.\n */\nconst isVoidTag = /*#__PURE__*/ makeMap(VOID_TAGS);\n\n/**\n * On the client we only need to offer special cases for boolean attributes that\n * have different names from their corresponding dom properties:\n * - itemscope -> N/A\n * - allowfullscreen -> allowFullscreen\n * - formnovalidate -> formNoValidate\n * - ismap -> isMap\n * - nomodule -> noModule\n * - novalidate -> noValidate\n * - readonly -> readOnly\n */\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs);\n/**\n * The full list is needed during SSR to produce the correct initial markup.\n */\nconst isBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs +\n `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` +\n `loop,open,required,reversed,scoped,seamless,` +\n `checked,muted,multiple,selected`);\n/**\n * Boolean attributes should be included if the value is truthy or ''.\n * e.g. `