前面章節總算是把 XS 屬性函式的第二部分——屬性篇解析了個透透徹徹,春風得意馬蹄疾,我們順理成章進入XS 屬性函式最後の篇章——模式篇的講解。模式篇作為屬性函式壓軸登場的部分,重要性自然不言而喻。從本章節開始的四個篇章將是模式任我行的部分,讓我們開始模式王國的繽紛璀璨之旅吧。
模式篇共有四個篇章,分為青龍、白虎、朱雀、玄武四個子篇章。本篇為讀者娓娓道來的是青龍篇——單位統計&運算方式。
☆※本節の紹介※☆

☆※模式簡介小述※☆ 所謂模式,即是指 XS 屬性函式 xsEffectAmount 函式中的第一引數。具體引數指代的傳送門詳見此篇,這裡不重複介紹。
模式大致分為四個大類,分別是屬性運算、資源運算、升級繼承和科技研究。
☆※屬性運算模式※☆ 屬性運算大致分為三種運算,分別是屬性設定、屬性加減和屬性數乘,一般而言均可使用浮點數
-- 屬性設定 (模式 0) --
模式 0:屬性設定 功能介紹:修改單位的各項屬性為設定值(以設定值覆蓋原值) 栗子1:設定P1騎射手的生命值為 80 xsEffectAmount(0,39,0,80,1); 栗子2:設定P2騎士的騎兵甲為 6 xsEffectAmount(0,38,8,8*256+6,2); ** 設定單位護甲 / 攻擊 = 護甲型別 / 攻擊型別 * 256 + 設定值 ** 設定單位護甲 / 攻擊的上限範圍為 0 ~ 255-- 屬性加減 (模式 4) --
模式 4:屬性加減 功能介紹:在單位各項屬性的基礎上增加 / 減少設定值 栗子1:設定P1所有步兵的移速增加 0.5 xsEffectAmount(4,906,5,0.5,1); 栗子2:設定P2火炮對建築攻擊加成減少 50 xsEffectAmount(4,36,9,-11*256-50,2); ** 增減單位護甲 / 攻擊 = 護甲型別 / 攻擊型別 * 256 + 設定值 ** 增減單位護甲 / 攻擊單次最多增減 ±255,超過 255 需分多次作加減運算-- 屬性數乘 (模式 5) --
模式 5:屬性數乘 功能介紹:在單位各項屬性的基礎上乘以設定值 栗子1:設定P1所有步射手的攻擊間隔減少 30% xsEffectAmount(5,900,10,0.3,1); 栗子2:設定P2精銳甲冑騎兵的騎兵甲減少 33% xsEffectAmount(5,553,8,8*256+0.33*100,2); ** 數乘單位護甲 / 攻擊 = 護甲型別 / 攻擊型別 * 256 + 設定倍數值 * 100 ** 數乘單位護甲 / 攻擊單次最多 2.55 倍,超過 2.55 倍需分多次作數乘運算
☆※啟用/禁用單位 (模式 2)※☆函式書寫の語法規則:xsEffectAmount(2,要啟用/禁用的單位,啟用/禁用標誌位,0,作用玩家);
啟用/禁用標誌位(第三引數)引數取值:
0:禁用
1:啟用
模式 2:啟用/禁用單位 功能介紹:啟用/禁用單位,使之能夠被訓練/建造或禁止被訓練/建造 栗子1:設定P1禁止訓練民兵系 xsEffectAmount(2,74,0,0,1); 栗子2:設定P2啟用建造城樓(預設位置) xsEffectAmount(2,1665,1,0,2); 栗子3:設定P3啟用訓練東方劍士(訓練位置兵營2號位) void eastern() { xsEffectAmount(2,93,0,0,3); xsEffectAmount(2,894,1,0,3); xsEffectAmount(0,894,42,12,3); xsEffectAmount(0,894,43,2,3); }注意事項:
1. 模式 2 不能使用種屬,啟用/禁用的單位必須為實際單位的 ID
2. 如果新自定義單位的訓練位置和按鈕上有原有單位佔用,請先禁用原有單位後再行啟用新自定義單位
3. 啟用新自定義單位必須要同時設定好單位的訓練位置(屬性ID 42)以及訓練按鈕(屬性ID 43),否則會出現單位已啟用但無法正常訓練/建造的情況
4. 禁用升級鏈最底端單位的單位 ID 可禁用單位的整條生產線
☆※單位統計函式※☆--- xsGetObjectCount()函式 ---
— — 返回目前場上某單位ID 的數量(不含佇列中或正在訓練/建造中的該單位ID 的數量) — — int xsGetObjectCount(int playerNumber, int unit_id); // 函式引數1範圍0~8 代表P1-P8 (0為蓋亞) // 函式引數2代表單位 ID,可以統計同種屬所有單位的數量兩者函式の區別:
xsGetObjectCount()函式僅能統計當前時刻地圖上存在的所有該玩家單位ID 的數量,但不能統計在佇列中等候訓練/建造或正在訓練/建造中的同單位ID 的數量
xsGetObjectCountTotal()函式既能統計當前時刻地圖上存在的所有該玩家單位ID 的數量,也能統計在佇列中等候訓練/建造或正在訓練/建造中的同單位ID 的數量,輸出結果為兩部分相加之總和
栗子1:統計P1民兵系的數量(含已佇列&正在訓練中),若數量大於10則P1民兵系單位生命值*2 void count_militia(){ int a= xsGetObjectCountTotal(1,74); if(a>10){ xsEffectAmount(5,74,0,2,1); } } 栗子2:統計P2騎兵單位的場上數量,若數量小於等於5則P2騎兵單位近戰攻擊力-2 void count_militia(){ int b= xsGetObjectCountTotal(2,912); if(b<=5){ xsEffectAmount(4,912,9,-1026,2); } }--- xsGetObjectCountTotal()函式 ---
— — 返回目前場上某單位ID 的數量(含佇列中以及正在訓練/建造中的該單位ID 的數量) — — int xsGetObjectCountTotal(int playerNumber, int unit_id); // 函式引數1範圍0~8 代表P1-P8 (0為蓋亞) // 函式引數2代表單位 ID,可以統計同種屬所有單位的數量
☆※單位統計函式 VS 觸發條件->"擁有物體"※☆在實際效果中,單位統計函式中的xsGetObjectCount()函式在使用≥作為判定條件時與觸發條件中的"擁有物體≥"(擁有物體)等價;xsGetObjectCount()函式在使用≤作為判定條件時與觸發條件中的"擁有物體≤"(擁有少量物體)中不指定區域時等價。
相比而言,單位統計函式在使用上會更加靈活,搭配其他模型能做出許多不同複雜的效果,但美中不足是隻能統計全域性範圍內單位ID 的數量而不能統計指定區域範圍內單位ID 的數量。而觸發條件中的"區域內的物體≥"以及"擁有物體≥"和"擁有物體≤"配合使用既能統計全域性範圍內單位ID 的數量,也能統計指定區域範圍內單位ID 的數量,但無法與其他系統及功能聯動,用法比較侷限單一。綜上所述,兩者各有千秋,互有優劣,各位場景設計者在實際使用過程中可以按照自身需求兩者結合使用。
☆※冰の小結※☆本節主要內容是圍繞單位屬性運算的模式0,2,4,5的介紹與使用以及單位統計函式應用的相關知識.。下一節我們將聚焦資源計算與單位費用型別增刪,解決資源和單位方面的相關問題,精彩永不停歇!
欲知後事如何,請聽下回分解
私の心はいつも氷氷です
Cly080603/18/2023









