/* Ability */
INSERT INTO Types (Type, Kind)
VALUES ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'KIND_ABILITY')
;
INSERT INTO Tags (Tag, Vocabulary)
VALUES ('CLASS_CAN_MOVE', 'ABILITY_CLASS')
;
INSERT INTO TypeTags (Type, Tag)
SELECT Units.UnitType, 'CLASS_CAN_MOVE'
FROM Units
WHERE Units.IgnoreMoves != 1
;
INSERT INTO TypeTags (Type, Tag)
VALUES ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'CLASS_CAN_MOVE')
;
INSERT INTO UnitAbilities (UnitAbilityType, Name, Description, Inactive)
VALUES ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'LOC_ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY_NAME', 'LOC_ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY_DESCRIPTION', 1)
;
INSERT INTO UnitAbilityModifiers (UnitAbilityType, ModifierId)
VALUES
('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'MINOR_CIV_KABUL_IGNORE_TERRAIN_COST')
, ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'MINOR_CIV_KABUL_IGNORE_CROSSING_RIVERS_COST')
;
/* Modifiers */
INSERT INTO Modifiers (ModifierId, ModifierType, SubjectRequirementSetId)
VALUES
('MINOR_CIV_KABUL_IGNORE_MOVEMENT_PENALTY_BONUS', 'MODIFIER_PLAYER_UNITS_GRANT_ABILITY', NULL)
, ('MINOR_CIV_KABUL_IGNORE_TERRAIN_COST', 'MODIFIER_PLAYER_UNIT_ADJUST_IGNORE_TERRAIN_COST', 'UNITS_IN_OWNER_TERRITORY')
, ('MINOR_CIV_KABUL_IGNORE_CROSSING_RIVERS_COST', 'MODIFIER_PLAYER_UNIT_ADJUST_IGNORE_RIVERS', 'UNITS_IN_OWNER_TERRITORY')
;
INSERT INTO ModifierArguments (ModifierId, Name, Value)
VALUES
('MINOR_CIV_KABUL_IGNORE_MOVEMENT_PENALTY_BONUS', 'AbilityType', 'ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY')
, ('MINOR_CIV_KABUL_IGNORE_TERRAIN_COST', 'Ignore', 1)
, ('MINOR_CIV_KABUL_IGNORE_TERRAIN_COST', 'Type', 'ALL')
, ('MINOR_CIV_KABUL_IGNORE_CROSSING_RIVERS_COST', 'Ignore', 1)
;
/* Requirements */
INSERT INTO RequirementSets (RequirementSetId, RequirementSetType)
VALUES ('UNITS_IN_OWNER_TERRITORY', 'REQUIREMENTSET_TEST_ALL')
;
INSERT INTO RequirementSetRequirements (RequirementSetId, RequirementId)
VALUES ('UNITS_IN_OWNER_TERRITORY', 'UNIT_IN_OWNER_TERRITORY_REQUIREMENT')
;
/* Update */
UPDATE ModifierArguments
SET Value = 'MINOR_CIV_KABUL_IGNORE_MOVEMENT_PENALTY_BONUS'
WHERE ModifierId = 'MINOR_CIV_KABUL_UNIQUE_INFLUENCE_BONUS'
;
カーブルの宗主国ボーナスのModifierを[A]のModifierに差し替えて
その効果により、OFFの状態でユニットが所有してるアビリティ[D]がONに切り替わり
ユニットに[B][C]の効果が発揮される
都市国家の宗主国ボーナスは
という仕組みになっているので、アタッチする指定modifierを別のものに差し替えている
差し替えたmodifierの「自ユニットに指定アビリティ付与」
ModifierTypeがMODIFIER_PLAYER_UNITS_GRANT_ABILITYという名称なので「付与」としてるが
実際には
"効果OFFの状態でセットされているアビリティを、効果ONに切り替える"ようになっているので
指定アビリティが元々セットされていないユニットには、効力がないようになっている
公式のミス1
自然遺産の「ジャイアンツ・コーズウェー」は隣接することで
「フィオンの槍」のアビリティが効果ONになるのだが
初期バージョンではサカ族弓騎兵にアビリティをセットし忘れていた為、サカ族弓騎兵には効果が無かった
公式のミス2
マオリのUA「マナ」には "乗船したユニットの移動力+2" の効果があるが
これは全文明のユニットに効果OFFのまま "乗船移動力+2" がセットされていて
UAにてマオリのユニットだけ効果をONにしているのだが
GSの初期バージョンでは、アビリティの初期状態を効果OFFにし忘れていた為
マオリがいなかろうが、あらゆる文明が "乗船移動力+2" の効果を最初から得ていた
modifierでアビリティを与えたい時は
対象ユニットへのアビリティセットと、初期状態は効果OFF (Inactive="true") にするのを忘れないように
アビリティにセットした「地形コスト無視modifier」の条件に "自領土内にいるユニット" を設定しているが
これは "移動先が自領土内なら地形コスト無視" になるのでなく
"自領土内に立っている間は地形コスト無視" になるので
領土内から外への移動範囲も地形コストを無視したものが表示されるが

外へ1歩出た時点で自領土内の条件を満たせず、地形コスト無視の効果を失うことになる
なので効果説明としては、「自領土から移動を開始する際、」という表現になる
ユニットとアビリティは間にアビリティクラスを挟んでつながっている
アビリティクラスのCLASS_MELEEに新しいアビリティを追加すると
そのアビリティをは戦士(UNIT_WARRIOR)だけでなく
剣士ほかCLASS_MELEEがセットされている全てのユニットに新アビリティが付与される
新しいユニットにCLASS_MELEEをセットすると
そのユニットは対槍兵ボーナス(ABILITY_ANTI_SPEAR)だけでなく
CLASS_MELEEにセットされている全アビリティが付与される
INSERT INTO Types (Type, Kind)
VALUES ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'KIND_ABILITY')
;
INSERT INTO Tags (Tag, Vocabulary)
VALUES ('CLASS_CAN_MOVE', 'ABILITY_CLASS')
;
INSERT INTO TypeTags (Type, Tag)
VALUES ('ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY', 'CLASS_CAN_MOVE')
;
このサンプルでは、CLASS_CAN_MOVEというアビリティクラスを新規で作り、そこに新アビリティを追加して
INSERT INTO TypeTags (Type, Tag) SELECT Units.UnitType, 'CLASS_CAN_MOVE' FROM Units WHERE Units.IgnoreMoves != 1 ;
各ユニットへアビリティクラスCLASS_CAN_MOVEをセットする際に
INSERT INTOからVALUESでなくSELECTを使って追加している
VALUESではユニット1体ごとにCLASS_CAN_MOVEのセットを記述しないといけないが
SELECT ~ FROM ~ WHEREの記述では
<Units>内のユニットデータからIgnoreMoves="true"になっていないユニットを全部まとめて追加できる