m |
(added content) |
||
Line 192: | Line 192: | ||
*# `Callbacks` = Card effects: The `callbacks` trigger specific card effects, such as [[Rapid Fire]] allowing a hero to attack twice, or [[Net Trap]] disabling an enemy ally for several turns. '''These effects override general game rules'''. | *# `Callbacks` = Card effects: The `callbacks` trigger specific card effects, such as [[Rapid Fire]] allowing a hero to attack twice, or [[Net Trap]] disabling an enemy ally for several turns. '''These effects override general game rules'''. | ||
*# '''Effects > General rules''': Once the `callbacks` are executed, the card effects modify or bypass the standard game rules. For example, the rule "one attack per turn" can be changed by the effect of Rapid Fire. | *# '''Effects > General rules''': Once the `callbacks` are executed, the card effects modify or bypass the standard game rules. For example, the rule "one attack per turn" can be changed by the effect of Rapid Fire. | ||
− | *# Thus, `AttachCard()` and its `callbacks` manage these exceptions to the game’s general rules, allowing card-specific effects to take precedence when triggered.<div style="height: 20px;"></div> | + | *# Thus, `AttachCard()` and its `callbacks` manage these exceptions to the game’s general rules, allowing card-specific effects to take precedence when triggered.<br /> |
+ | **As such, the sentence "Card effects take precedence over the game rules" should be understood as: '''Card effects take precedence over the game rules, as well as over any previous effects that have already modified those rules'''.<br /> | ||
+ | *** schema: Game Rules '''<''' Card Effect 1 `(doCallbacks = true)` -> Modified Game Rules '''<''' Card Effect 2 `(doCallbacks = true)` -> Further Modified Game Rules '''<''' Card Effect 3 `(doCallbacks = true)` -> ...<div style="height: 20px;"></div> | ||
* Relation to Traps and Why They Are Not Revealed<div style="height: 10px;"></div> | * Relation to Traps and Why They Are Not Revealed<div style="height: 10px;"></div> | ||
*# The global mechanism for Traps, that they must remain face-down, is integrated into the steps of the '''Seek''' process. This mechanism takes priority over other rules, such as revealing a card that has been '''Seek'''ed.<br /> | *# The global mechanism for Traps, that they must remain face-down, is integrated into the steps of the '''Seek''' process. This mechanism takes priority over other rules, such as revealing a card that has been '''Seek'''ed.<br /> |
|
|
---|---|
|
|
| |
| |
| |
This code is a collection of all the functions involved in the Seek mechanic, though it doesn't exist as a single block in any one file. | |
public override void OnUseAbility() { if (!isPartTwo) { if (!parent.IsDead()) { MoveToCastPosition(); GameModel.QueuePart2(parent); isPartTwo = true; } } else { isPartTwo = false; DoSeek(usedShadowEnergy: true); } // Handles the activation of the seek ability } public override bool CanUseAbility() { if (GameModel.isSimulating) { return false; } if (GameModel.DeckCount() == 0) { return false; } if (GameModel.HandCount() == GameModel.MaxHandSize()) { return false; } return true; // Checks if the seek ability can be used } public void StartTargetingForSeek() { ClearTargets(); MoveToCastPosition(); GameModel.UnhighlightCards(); GameModel.SetGameState(GameState.GameStateType.target); List<ShadowEraCard> abilityTargets = GetAbilityTargets(); for (int i = 0; i < GameModel.DeckCount(); i++) { ShadowEraCard deck = GameModel.GetDeck(i); if (abilityTargets.Contains(deck)) { GameModel.RemoveDeck(deck); i--; } } for (int j = 0; j < abilityTargets.Count; j++) { GameModel.AddDeck(abilityTargets[j]); } GameModel.HighlightCards(GetAbilityTargets()); DeckListDisplay.abilityCard = parent; DeckListDisplay.ShowDeck(GameModel.CurSide()); // Initiates the targeting process for the seek } public override List<ShadowEraCard> GetAbilityTargets() { List<ShadowEraCard> list = new List<ShadowEraCard>(); for (int i = 0; i < GameModel.DeckCount(); i++) { ShadowEraCard deck = GameModel.GetDeck(i); if (IsValidAbilityTarget(deck)) { list.Add(deck); } } return list; // Retrieves valid targets for the seek. } private static bool IsValidAbilityTarget(ShadowEraCard check) { return check.cardType == CardTypeEnum.Ally && check.cardSubType == CardSubTypeEnum.Aldmor; // Check valid targets for ll041's ability example. } public void DoSeek(bool usedShadowEnergy) { DeckListDisplay.CloseDeck(); if (targets.Count > 0 && GameModel.HandCount() < GameModel.MaxHandSize()) { GameModel.RemoveDeck(targets[0]); GameModel.ShowCardForPlayer(targets[0]); GameModel.AddHand(targets[0]); GameModel.OnSeek(targets[0]); } else { GameModel.OnSeek(null); } ShuffleOurDeck(); targets.Clear(); // Executes the seek action } public static void RemoveDeck(ShadowEraCard card) { // Code that handles removing a card from the deck } public static void ShowCardForPlayer(ShadowEraCard card) { if (!isSimulating && Gameplay.Instance != null) { Gameplay.Instance.UpdateHand(forceUpdate: true); Gameplay.Instance.ShowCard(card); Gameplay.Instance.BlockInput(2f); if (card.gameObject != null) { CoroutineManager.Start(_ShowCardForPlayer(card)); } } } public static void AddHand(ShadowEraCard card) { // Code that handles adding a card to the player's hand } public static void OnSeek(ShadowEraCard card) { // Handles additional effects or actions after the card is added to the hand } public void ShuffleOurDeck() { GameModel.ShuffleDeck(); // Shuffles the deck after the seek is completed } |
Alan said: "Card effects take precedence over the game rules."`
|void PlayFaceDown(ShadowEraCard card, bool isSeeked) { if (isSeeked) { // Allow ShowCardForPlayer() to be invoked for Seeked cards ShowCardForPlayer(card); } else { // Keep the card face-down as usual (normal Trap behavior) KeepCardFaceDown(card); } } |