private void RecoverShield(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostUpgrade.State.SpendCharge();

            HostShip.Tokens.AssignToken(typeof(Tokens.DepleteToken), () =>
            {
                if (HostShip.TryRegenShields())
                {
                    Sounds.PlayShipSound("R2D2-Proud");
                    Messages.ShowInfo(HostName + " causes " + HostShip.PilotInfo.PilotName + " to recover 1 shield and gain 1 deplete token");
                }
                Triggers.FinishTrigger();
            });
        }
Exemple #2
0
        private void UseGeniusAbility(object sender, EventArgs e)
        {
            List <GenericUpgrade> timedBombsInstalled = BombsManager.GetTimedBombsInstalled(HostShip);

            DecisionSubPhase.ConfirmDecisionNoCallback();

            if (timedBombsInstalled.Count == 1)
            {
                BombsManager.CurrentBomb = timedBombsInstalled[0] as GenericBomb;
                StartDropBombSubphase();
            }
            else
            {
                AskToSelectTimedBomb(StartDropBombSubphase);
            }
        }
        private void RepairFacedownDamageCard(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostUpgrade.State.SpendCharge();
            HostShip.Tokens.AssignToken(typeof(Tokens.DepleteToken), () =>
            {
                if (HostShip.Damage.DiscardRandomFacedownCard())
                {
                    Sounds.PlayShipSound("R2D2-Proud");
                    Messages.ShowInfoToHuman("Facedown Damage card is discarded");
                }

                Triggers.FinishTrigger();
            });
        }
Exemple #4
0
        private void GainDepleteAndRegenForce(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostShip.Tokens.AssignToken(
                typeof(Tokens.DepleteToken),
                delegate
            {
                if (HostShip.State.Force < HostShip.State.MaxForce)
                {
                    HostShip.State.RestoreForce();
                }
                Triggers.FinishTrigger();
            }
                );
        }
    private void RpcStartSyncDecisionPreparation()
    {
        DecisionSubPhase decisionSubPhase = (Phases.CurrentSubPhase as DecisionSubPhase);

        if (decisionSubPhase != null)
        {
            decisionSubPhase.PrepareDecision(decisionSubPhase.StartIsFinished);
        }
        else
        {
            Console.Write("Waiting to sync decision subphase...", LogTypes.Everything, true, "orange");

            GameManagerScript Game = GameObject.Find("GameManager").GetComponent <GameManagerScript>();
            Game.Wait(0.5f, RpcStartSyncDecisionPreparation);
        }
    }
Exemple #6
0
        private void GainToken(string tokenName)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();
            if (HostShip.State.Charges > 0)
            {
                var tokenType = tokenName == "Focus" ? typeof(FocusToken) : typeof(EvadeToken);

                Messages.ShowInfo(HostName + " gains 1 " + tokenName + " token");
                HostShip.State.Charges--;
                HostShip.Tokens.AssignToken(tokenType, Triggers.FinishTrigger);
            }
            else
            {
                Triggers.FinishTrigger();
            }
        }
        private void SelecScrambledTarget(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            SelectTargetForAbility(
                AssignScrambledCondition,
                FilterAbilityTargets,
                GetAiAbilityPriority,
                HostShip.Owner.PlayerNo,
                true,
                null,
                HostUpgrade.Name,
                "Choose another ship to assign \"Scrambled\" condition to it.\nYou will receive weapons disabled token.",
                HostUpgrade.ImageUrl
                );
        }
Exemple #8
0
        private void UseQuinnJastAbility(object sender, System.EventArgs e)
        {
            GenericUpgrade spentUpgrade = GetHardpointWithSpentCharges();

            if (spentUpgrade != null)
            {
                HostShip.Tokens.AssignToken(typeof(WeaponsDisabledToken), () => {
                    spentUpgrade.State.RestoreCharge();
                    DecisionSubPhase.ConfirmDecision();
                });
            }
            else
            {
                DecisionSubPhase.ConfirmDecision();
            }
        }
        private void SetUndockPosition(GenericShip hostShip, GenericShip dockedShip, Direction direction)
        {
            switch (direction)
            {
                case Direction.Top:
                    SetUndockPositionForward(hostShip, dockedShip);
                    break;
                case Direction.Bottom:
                    SetUndockPositionRear(hostShip, dockedShip);
                    break;
                default:
                    break;
            }

            DecisionSubPhase.ConfirmDecision();            
        }
Exemple #10
0
        private void SelectDamageCard(GenericDamageCard damageCard)
        {
            Messages.ShowInfo("Kylo Ren selected  " + damageCard.Name);

            AssignedDamageCard          = damageCard;
            AssignedDamageCard.IsFaceup = true;
            DamageDeck opponentDamageDeck = DamageDecks.GetDamageDeck(TargetShip.Owner.PlayerNo);

            opponentDamageDeck.RemoveFromDamageDeck(damageCard);
            opponentDamageDeck.ReShuffleDeck();
            AssignConditions(TargetShip);

            SpendExtra();

            DecisionSubPhase.ConfirmDecision();
        }
Exemple #11
0
        private void FlipThisCard(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostShip.TogglePeg(false);

            PlayLandingAnimation();

            HostShip.GetModelCenterTransform().localPosition -= new Vector3(0, 2, 0);
            HostShip.GetModelTransform().localPosition       += new Vector3(0, 2, 0);
            HostShip.IsLandedModel = true;

            (HostUpgrade as GenericDualUpgrade).Flip();

            Triggers.FinishTrigger();
        }
        private void ChangeManeuver(object sender, System.EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostUpgrade.State.SpendCharge();

            HostShip.Maneuvers.Add($"{HostShip.RevealedManeuver.Speed}.L.R", MovementComplexity.Complex);
            HostShip.Maneuvers.Add($"{HostShip.RevealedManeuver.Speed}.R.R", MovementComplexity.Complex);

            HostShip.OnMovementFinish += RemoveAddedManeuvers;

            HostShip.Owner.ChangeManeuver(
                ShipMovementScript.SendAssignManeuverCommand,
                Triggers.FinishTrigger,
                IsSameSegnorsLoop
                );
        }
Exemple #13
0
        private void AskToChangeManeuver(object sender, EventArgs e)
        {
            var subphase = Phases.StartTemporarySubPhaseNew <IG88DDecisionSubphase>("IG88D", Triggers.FinishTrigger);

            subphase.InfoText = "You may use anither template of the same speed and direction";

            subphase.AddDecision("Turn", delegate { ChangeBearing(ManeuverBearing.SegnorsLoopUsingTurnTemplate); });
            subphase.AddDecision("Straight", delegate { ChangeBearing(ManeuverBearing.KoiogranTurn); });
            subphase.AddDecision("No changes", delegate { DecisionSubPhase.ConfirmDecision(); });

            subphase.DefaultDecisionName = "No changes";

            subphase.DecisionOwner  = HostShip.Owner;
            subphase.ShowSkipButton = true;

            subphase.Start();
        }
Exemple #14
0
        private void AddCriticalResult(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            Combat.DiceRollAttack.AddDice(DieSide.Crit);

            Messages.ShowInfoToHuman(HostShip.PilotInfo.PilotName + ": Critical hit result was added");

            HostShip.State.SpendForce(
                2,
                delegate
            {
                Triggers.FinishTrigger();
                Phases.CurrentSubPhase.Resume();
            }
                );
        }
Exemple #15
0
        private void UseQuinnJastAbility(object sender, System.EventArgs e)
        {
            //Simply flip the first discarded missile or torpedo, since the M3-A can never equip more than one (per the current rules at least).
            //Needs to be updated for HotAC if this ability will be used on a ship with multiple missile/torpedo slots
            var discardedUpgrade = GetDiscardedMissilesOrTorpedoes().FirstOrDefault();

            if (discardedUpgrade != null)
            {
                HostShip.Tokens.AssignToken(typeof(WeaponsDisabledToken), () => {
                    discardedUpgrade.FlipFaceup(DecisionSubPhase.ConfirmDecision);
                });
            }
            else
            {
                DecisionSubPhase.ConfirmDecision();
            }
        }
Exemple #16
0
        private void StartInitialDocking(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            List <GenericShip> dockableShips = GetDockableShips();

            if (dockableShips.Count == 1)
            {
                Rules.Docking.Dock(HostShip, dockableShips.First());
                Triggers.FinishTrigger();
            }
            else
            {
                // Ask what ships to dock
                Triggers.FinishTrigger();
            }
        }
Exemple #17
0
        private void TransferFocusToken(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostShip.Tokens.RemoveToken(
                typeof(FocusToken),
                delegate {
                TargetShip.Tokens.AssignToken(
                    typeof(FocusToken),
                    delegate {
                    Messages.ShowInfo(HostUpgrade.UpgradeInfo.Name + ": Focus Token is reassigned to " + TargetShip.PilotInfo.PilotName);
                    Triggers.FinishTrigger();
                }
                    );
            }
                );
        }
Exemple #18
0
        private void UseDaceBonearmAbility(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            Messages.ShowInfo("Ability of Dace Bonearm is used");

            for (int i = 0; i < 3; i++)
            {
                //Empty delegate is safe here - Sandrem
                HostShip.RemoveCharge(delegate { });
            }

            IonizedShip.Tokens.AssignToken(
                typeof(IonToken),
                delegate { IonizedShip.Tokens.AssignToken(typeof(IonToken), Triggers.FinishTrigger); }
                );
        }
Exemple #19
0
        private void AskToRotate(object sender, EventArgs e)
        {
            DalanOberosStarviperDecisionSubphase subphase = Phases.StartTemporarySubPhaseNew <DalanOberosStarviperDecisionSubphase>("Rotate the ship?", Triggers.FinishTrigger);

            subphase.DecisionOwner = HostShip.Owner;

            subphase.DescriptionShort = "Dalan Oberos";
            subphase.DescriptionLong  = "Do you want to gain a Stress Token to rotate the ship?";
            subphase.ImageSource      = HostShip;

            subphase.AddDecision("90 Counterclockwise", Rotate90Counterclockwise);
            subphase.AddDecision("90 Clockwise", Rotate90Clockwise);
            subphase.AddDecision("No", delegate { DecisionSubPhase.ConfirmDecision(); });

            subphase.DefaultDecisionName = "No";

            subphase.Start();
        }
Exemple #20
0
        private void UseBazeMalbusAbility(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            var additionalFocusTokens = (enemyShipsWithinRange > UpgradesList.SecondEdition.BazeMalbus.MaximumAdditionalFocusTokens ?
                                         UpgradesList.SecondEdition.BazeMalbus.MaximumAdditionalFocusTokens : enemyShipsWithinRange);

            if (enemyShipsWithinRange > 0)
            {
                Messages.ShowInfo(HostUpgrade.UpgradeInfo.Name + ": Gained additional " + additionalFocusTokens + " Focus token(s)");
            }

            HostShip.Tokens.AssignTokens(
                () => new FocusToken(HostShip),
                additionalFocusTokens,
                delegate { HostShip.Tokens.AssignToken(typeof(StressToken), Triggers.FinishTrigger); }
                );
        }
Exemple #21
0
        private void DoRecoverCharge()
        {
            Action Callback = Phases.CurrentSubPhase.CallBack;

            DecisionSubPhase.ConfirmDecisionNoCallback();

            HostUpgrade.State.SpendCharge();

            GenericUpgrade astromech = HostShip.UpgradeBar.GetUpgradesAll().FirstOrDefault(n => n.HasType(UpgradeType.Astromech));

            if (astromech != null && astromech.State.Charges < astromech.State.MaxCharges & !astromech.UpgradeInfo.CannotBeRecharged)
            {
                Messages.ShowInfo("Spare Parts Canisters: Charge of " + astromech.UpgradeInfo.Name + " is restored");
                astromech.State.RestoreCharge();
            }

            Callback();
        }
Exemple #22
0
 private void TransferToken(Type tokenType, GenericShip fromShip, GenericShip toShip)
 {
     HostShip.State.SpendForce(
         1,
         delegate
     {
         fromShip.Tokens.TransferToken(
             tokenType,
             toShip,
             () => {
             DecisionSubPhase.ConfirmDecisionNoCallback();
             SelectShipSubPhase.FinishSelection();
         },
             HostShip.Owner
             );
     }
         );
 }
Exemple #23
0
        protected override void AssignConditionToAttacker(object sender, System.EventArgs e)
        {
            Sounds.PlayShipSound("Ill-Show-You-The-Dark-Side");
            HostShip.State.Force--;

            if (AssignedDamageCard == null)
            {
                // If condition is not in play - select card to assign
                ShowPilotCrits();
            }
            else
            {
                // If condition is in play - reassing only
                RemoveConditions(ShipWithCondition);
                AssignConditions(Combat.Attacker);
                DecisionSubPhase.ConfirmDecision();
            }
        }
Exemple #24
0
        private void SelectAbilityTarget()
        {
            SelectShipSubPhase.FinishSelectionNoCallback();

            HostShip.State.Force--;

            var tokenTypes = TargetShip.Tokens
                             .GetAllTokens().Where(t => t.TokenColor == Tokens.TokenColors.Green)
                             .Select(t => new { Name = t.Name, Type = t.GetType() })
                             .Distinct().ToList();

            if (tokenTypes.Count > 0)
            {
                var decisionSubPhase = Phases.StartTemporarySubPhaseNew <DecisionSubPhase>(
                    Name,
                    Triggers.FinishTrigger
                    );

                decisionSubPhase.InfoText = "Remove token to prevent 1 damage from Darth Vader?";

                decisionSubPhase.AddDecision(
                    "No",
                    delegate {
                    DecisionSubPhase.ConfirmDecisionNoCallback();
                    AssignDamage();
                }
                    );

                tokenTypes.ForEach(token =>
                {
                    decisionSubPhase.AddDecision(token.Name, delegate { RemoveGreenToken(token.Type); });
                    decisionSubPhase.AddTooltip(token.Name, HostUpgrade.ImageUrl);
                });

                decisionSubPhase.DefaultDecisionName = decisionSubPhase.GetDecisions().First(d => d.Name != "No").Name;
                decisionSubPhase.RequiredPlayer      = TargetShip.Owner.PlayerNo;

                decisionSubPhase.Start();
            }
            else
            {
                AssignDamage();
            }
        }
Exemple #25
0
        private void AskUseChewbaccaAbility(object sender, System.EventArgs e)
        {
            GenericShip previousShip = Selection.ActiveShip;

            Selection.ActiveShip = sender as GenericShip;

            AskToUseAbility(
                descriptionShort: HostShip.PilotInfo.PilotName,
                IsShouldUseAbility,
                UseAbility,
                delegate
            {
                Selection.ActiveShip = previousShip;
                DecisionSubPhase.ConfirmDecision();
            },
                descriptionLong: "Do you want to spend 1 Charge to be dealt the faceup damage card as facedown instead?",
                imageHolder: HostShip
                );
        }
Exemple #26
0
        // END OF COMBAT B: FREE BONUS ATTACK

        private void ConfirmExtraAttackFree(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            LoseCharges(2);

            if (IsAbilityUsed)
            {
                return;
            }

            if (HostShip.IsCannotAttackSecondTime)
            {
                return;
            }

            // Not a post-combat attack check, free attack instead
            DoFreeAttack();
        }
Exemple #27
0
        private void UseAbility(object sender, EventArgs e)
        {
            DecisionSubPhase.ConfirmDecisionNoCallback();

            if (HostShip.TryRegenShields())
            {
                Messages.ShowInfo(HostShip.PilotInfo.PilotName + " used ability of R2-D2, 1 shield is restored");
                Sounds.PlayShipSound("R2D2-Proud");
            }

            Phases.StartTemporarySubPhaseOld(
                "R2-D2: Check expose of damage card",
                typeof(R2D2CheckSubPhase),
                delegate {
                Phases.FinishSubPhase(typeof(R2D2CheckSubPhase));
                Triggers.FinishTrigger();
            }
                );
        }
Exemple #28
0
        private void AskAbility(object sender, EventArgs e)
        {
            var isFriendlyInRange = FilterByTargetType(TargetShip, new List <TargetTypes>()
            {
                TargetTypes.OtherFriendly, TargetTypes.This
            }) && FilterTargetsByRange(TargetShip, 0, 3);

            if (isFriendlyInRange && HostShip.State.Force > 0)
            {
                if (TargetShip.State.MaxForce > 0 && TargetShip.State.Force < TargetShip.State.MaxForce)
                {
                    DecisionSubPhase phase = (DecisionSubPhase)Phases.StartTemporarySubPhaseNew(
                        Name,
                        typeof(DecisionSubPhase),
                        SelectShipSubPhase.FinishSelection
                        );

                    phase.DescriptionShort = "Spend 1 force to let " + TargetShip.PilotInfo.PilotName + " gain 1 focus or recover 1 force?";
                    phase.RequiredPlayer   = HostShip.Owner.PlayerNo;
                    phase.ShowSkipButton   = true;

                    phase.AddDecision("Focus", GainFocus);
                    phase.AddDecision("Force", RecoverForce);

                    phase.DefaultDecisionName = "Focus";
                    phase.Start();
                }
                else
                {
                    AskToUseAbility(
                        HostShip.PilotInfo.PilotName,
                        ShouldUseAbility,
                        GainFocus,
                        descriptionLong: "Spend 1 force to let " + TargetShip.PilotInfo.PilotName + " gain 1 focus token?",
                        imageHolder: HostShip
                        );
                }
            }
            else
            {
                Triggers.FinishTrigger();
            }
        }
Exemple #29
0
        private void UseColonelJendonAbility(object sender, EventArgs e)
        {
            Phases.Events.OnEndPhaseStart_NoTriggers += RestoreTargetLockRestrictions;

            savedTargetLockRestrictions = new Dictionary <GenericShip, int[]>();
            foreach (var kv in HostShip.Owner.Ships)
            {
                GenericShip curship = kv.Value;

                int[] targetlockRange = new int[2];
                targetlockRange[0] = curship.TargetLockMinRange;
                targetlockRange[1] = curship.TargetLockMaxRange;

                savedTargetLockRestrictions.Add(curship, targetlockRange);
                curship.SetTargetLockRange(4, int.MaxValue);
            }

            DecisionSubPhase.ConfirmDecision();
        }
Exemple #30
0
        private void AskToSelectToken(object sender, EventArgs e)
        {
            var ownTokens = HostShip.Tokens.GetAllTokens().Where(n => n.GetType() != typeof(BlueTargetLockToken))
                            .Distinct(new TokenComparer())
                            .ToList();

            if (ownTokens.Any())
            {
                TokenSelectionSubphase subphase = (TokenSelectionSubphase)Phases.StartTemporarySubPhaseNew(
                    Name,
                    typeof(TokenSelectionSubphase),
                    Triggers.FinishTrigger
                    );

                subphase.DescriptionShort = HostShip.PilotInfo.PilotName;
                subphase.DescriptionLong  = "Select token to transfer";
                subphase.ImageSource      = HostShip;

                ownTokens.ForEach(token =>
                {
                    subphase.AddDecision(
                        (token is RedTargetLockToken) ? token.Name + " \"" + (token as RedTargetLockToken).Letter + "\"" : token.Name,
                        delegate {
                        SelectedToken = token;
                        DecisionSubPhase.ConfirmDecisionNoCallback();
                        AskToSelectShipToTransferToken();
                    }
                        );
                });

                subphase.RequiredPlayer = HostShip.Owner.PlayerNo;
                subphase.ShowSkipButton = false;

                subphase.DefaultDecisionName = subphase.GetDecisions().First().Name;

                subphase.Start();
            }
            else
            {
                Messages.ShowError("No tokens to transfer");
                Triggers.FinishTrigger();
            }
        }