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(); }); }
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(); }); }
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); } }
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 ); }
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(); }
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(); }
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 ); }
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(); }
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(); } ); }
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(); } }
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(); } }
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(); } ); } ); }
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); } ); }
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(); }
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); } ); }
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(); }
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 ); } ); }
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(); } }
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(); } }
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 ); }
// 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(); }
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(); } ); }
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(); } }
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(); }
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(); } }