Modifierサンプル

宗主国ボーナス:領土内から地形コスト無視移動

性能

都市国家カーブルの宗主国ボーナスを
「自領土から移動を開始する際、地形・川による移動ペナルティを受けない。」
に変更

sql

/* 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'
;

構成ツリー

  • [A] プレイヤーのユニットにアビリティを付与する
    • 付与するアビリティの種類:[D] ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY
  • [D] ABILITY_KABUL_IGNORE_MOVEMENT_PENALTY
    • Modifierセット:[B]
    • Modifierセット:[C]

  • [B] ユニットの地形コスト無効化の調整する
    • 無効化:有効
    • 無効化する地形の種類:全て
    • 調整するユニットに条件をつける
      • 以下の全ての条件を満たすユニット
        • 自領土内にいるユニット
  • [C] ユニットの渡河コスト無効化の調整する
    • 無効化:有効
    • 調整するユニットに条件をつける
      • 以下の全ての条件を満たすユニット
        • 自領土内にいるユニット

カーブルの宗主国ボーナスのModifierを[A]のModifierに差し替えて
その効果により、OFFの状態でユニットが所有してるアビリティ[D]がONに切り替わり
ユニットに[B][C]の効果が発揮される

構成表

解説

宗主国ボーナス

都市国家の宗主国ボーナスは

  • 都市国家の指導者UAが
  • 全プレイヤーを対象に
  • (自分の)宗主国を条件として
  • 指定modifierをATTACH(取り付ける)

という仕組みになっているので、アタッチする指定modifierを別のものに差し替えている

アビリティの付与

差し替えたmodifierの「自ユニットに指定アビリティ付与」
ModifierTypeMODIFIER_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"になっていないユニットを全部まとめて追加できる