public async Task PlayAsync(BattleView view, List <Unit> targets) { PlaySound(); await PlayInternalAsync(view, targets); view.framePool.DisposeAll(); }
public static void Summon(this Unit unit, Vector2Int position) { if (BattleManager.GetUnit(position) == null) { unit.OnPosition.after.RemoveListener(BattleView.MoveObject); unit.Position = position; // FieldManager.GetTile(position).SetUnit(unit); FieldManager.GetTile(position).OnTile(unit); BattleManager.instance.AllUnits.Add(unit); unit.ActionRate = 0; if (unit.Alliance == UnitAlliance.Party) { GameManager.AddPartyUnit(unit); } BattleView.MakeUnitObject(unit); // 유닛 소환시 DownStair Button 활성화 검사 // Model.Tiles.DownStair.CheckPartyDownStair(); } else { Debug.LogWarning("이미 위치에 유닛이 존재합니다."); } }
public PlayerController(tunbasedbattlerContext dbContext) { playerService = new PlayerService(dbContext); playerView = new PlayerView(); battleView = new BattleView(); player = new PlayerViewModel(); }
public ReplayClient(string path, string name) : base(name) { Battle = PBEBattle.LoadReplay(path); BattleView = new BattleView(this); ShowAllPokemon(); StartPacketThread(); }
private void OnPacketReceived(object sender, IPBEPacket packet) { Debug.WriteLine($"Packet received (\"{packet.GetType().Name}\")"); switch (packet) { case PBEMatchCancelledPacket _: { BattleView.AddMessage("Match cancelled!", messageBox: false); break; } case PBEPlayerJoinedPacket pjp: { int id = pjp.BattleId; if (pjp.IsMe) { BattleId = id; if (id < 2) { Team = Battle.Teams[id]; ShowRawValues0 = id == 0; ShowRawValues1 = id == 1; } } else { BattleView.AddMessage(string.Format("{0} joined the game.", pjp.TrainerName), messageBox: false); } if (id < 2) { Battle.Teams[id].TrainerName = pjp.TrainerName; } Send(new PBEResponsePacket()); break; } case PBEPartyRequestPacket _: { Send(new PBEPartyResponsePacket(_teamShell)); break; } case PBEActionsRequestPacket _: case PBESwitchInRequestPacket _: case PBEWinnerPacket _: { Battle.Events.Add(packet); StartPacketThread(); Send(new PBEResponsePacket()); break; } default: { Battle.Events.Add(packet); Send(new PBEResponsePacket()); break; } } }
public override void UseEffect(Character caster, Character target, BattleView view) { var character = receiver == Receiver.Caster ? caster : target; character.AddBuff(new BuffInfo(SubStat.PhysicalDamage, turnCounts, damageChangeFlat, damageChangePercentage, damageIncPerLifeLost)); character.AddBuff(new BuffInfo(SubStat.PhysicalDamage, turnCounts, damageChangeFlat, damageChangePercentage, damageIncPerLifeLost)); }
private IEnumerator OpenRoutine() { var textbox = MapOverlayUI.Instance().textbox; if (encounterKey != null && encounterKey.Length > 0) { var party = IndexDatabase.Instance().Parties.GetData(encounterKey); yield return(BattleView.SpawnBattleRoutine(party)); } else if (itemKey != null && itemKey.Length > 0) { if (isCollectable) { var collectable = IndexDatabase.Instance().Collectables.GetData(itemKey); Global.Instance().Audio.PlaySFX(sfxKey); Global.Instance().Data.Collectables.AddItem(collectable); Global.Instance().Data.SetSwitch(SwitchName, true); UpdateSprite(); if (collectable.chestName != null && collectable.chestName.Length > 0) { yield return(textbox.SpeakRoutine("Retrieved " + UIUtils.GlyphifyString(collectable.chestName) + ".")); } else { yield return(textbox.SpeakRoutine("Retrieved a " + UIUtils.GlyphifyString(collectable.displayName) + ".")); } } else { var item = new CombatItem(IndexDatabase.Instance().CombatItems.GetData(itemKey)); if (Global.Instance().Data.Inventory.IsFull()) { yield return(textbox.SpeakRoutine("No room for more items.")); } else { Global.Instance().Audio.PlaySFX(sfxKey); Global.Instance().Data.Inventory.Add(item); Global.Instance().Data.SetSwitch(SwitchName, true); UpdateSprite(); if (isKey) { yield return(textbox.SpeakRoutine("Retrieved the " + item.Name + ".")); } else { yield return(textbox.SpeakRoutine("Retrieved a " + item.Name + ".")); } } } yield return(textbox.DisableRoutine()); } else { yield return(textbox.SpeakRoutine("Empty.")); yield return(textbox.DisableRoutine()); } }
public void UseSkill(Character caster, BattleView view) { foreach (var skill in SkillEffects) { skill.effect.UseEffect(caster, view); } RemainingCooldown = cooldown; }
public void CheckForEncounterOnStep() { var steps = Global.Instance().Data.GetVariable(StepsSinceEncounterVariable); Global.Instance().Data.IncrementVariable(StepsSinceEncounterVariable); // valid? maybe we're not on the right terrain if (steps <= 0) { return; } // have to go at least half the average steps if (steps < AverageStepsToEncounter / 2) { return; } // after that you're equally likely to see an encounter each step if (Random.Range(0, AverageStepsToEncounter / 2) > 0) { return; } // okay, you should see something var encounters = GetEncounters(); if (encounters == null) { return; } var totalWeight = encounters.Aggregate(0, (acc, data) => acc + data.weight); var roll = Random.Range(0, totalWeight); EncounterSetMemberData encounter = null; foreach (var possible in encounters) { if (roll < possible.weight) { encounter = possible; break; } else { roll -= possible.weight; } } var party = new Party(encounter.encounter); Global.Instance().Data.SetVariable(StepsSinceEncounterVariable, 0); Global.Instance().Maps.Avatar.PauseInput(); Global.Instance().StartCoroutine(CoUtils.RunWithCallback(BattleView.SpawnBattleRoutine(party), () => { Global.Instance().Maps.Avatar.UnpauseInput(); })); }
private IEnumerator RenderRoutine(BattleView view, List <Unit> targets) { var routines = new List <IEnumerator>(); foreach (var step in data.steps) { routines.Add(RenderStepRoutine(step, view, targets, new Vector2(0, 0))); } yield return(CoUtils.RunParallel(routines.ToArray(), view)); }
public ActionsBuilder(BattleView bv, PBETrainer trainer, Action <PBETurnAction[]> onActionsReady) { _bv = bv; bv.Actions.ActionsBuilder = this; _onActionsReady = onActionsReady; _pkmn = trainer.ActiveBattlersOrdered.ToArray(); _actions = new PBETurnAction[_pkmn.Length]; _standBy = new PBEBattlePokemon?[_pkmn.Length]; ActionsLoop(); }
public override void UseEffect(Character caster, Character target, BattleView view) { if (attackMode == AttackMode.Target) { Debug.LogWarning("use other UseEffect(Character, Character, Character)"); return; } view.ForceAttack(target, damagePercentage, damageType, attackMode); }
public static void UnSummon(this Obtainable obtainable) { if (obtainable.Position == null) { return; } FieldManager.GetTile((Vector2Int)obtainable.Position).SetObtainable(null); BattleView.DestroyObtainableObject(obtainable); BattleManager.instance.AllObtainables.Remove(obtainable); }
public override void OnSceneLoaded(Scene scene, LoadSceneMode loadMode) { base.OnSceneLoaded(scene, loadMode); Debug.Log("战斗场景加载完成"); if (battleView == null) { battleView = new BattleView(); battleView.Show(); GamePublisher.Publish(EventType.battle_music_open); } }
public SwitchesBuilder(BattleView bv, byte amount, Action <PBESwitchIn[]> onSwitchesReady) { _bv = bv; bv.Actions.SwitchesBuilder = this; _onSwitchesReady = onSwitchesReady; SwitchesRequired = amount; _switches = new PBESwitchIn[amount]; _standBy = new PBEBattlePokemon[amount]; _positionStandBy = new PBEFieldPosition[amount]; SwitchesLoop(); }
private IEnumerator RenderStripRoutine(BattleView view, List <Unit> targets, Vector2 offset) { var routines = new List <IEnumerator>(); foreach (var step in data.anim.steps) { routines.Add(RenderStepRoutine(step, view, targets, offset, step != data.anim.steps[data.anim.steps.Length - 1])); } yield return(CoUtils.RunParallel(routines.ToArray(), view)); finished += 1; }
public override void HandleNotification(INotification notification) { BattleView uview = ViewComponent as BattleView; switch (notification.Name) { case BATTLE_CAT_GROUP_INFO: Debug.Log("init battle view "); uview.ShowCurrentCatGroup(notification.Body); break; } }
public void UseSkill(Character caster, Character[] targets, BattleView view) { foreach (var target in targets) { foreach (var skill in SkillEffects) { skill.effect.UseEffect(caster, target, view); } } RemainingCooldown = cooldown; caster.CurrentMana -= manaCost; }
protected override async Task PlayInternalAsync(BattleView view, List <Unit> targets) { var routines = new List <IEnumerator>(); var duration = (float)data.count / data.concurrent; for (var i = 0; i < data.count; i += 1) { float start = i * duration / data.count; routines.Add(RenderStripRoutine(view, targets, start)); } await CoUtils.RunParallel(routines.ToArray(), view); }
public override void UseEffect(Character caster, Character target, BattleView view) { float amount = UnityEngine.Random.Range(damageMin, damageMax + 1); amount = amount + amount * (caster.Sub.MagicDamage / 100f); var appliedDamage = target.ApplyDamage(caster, type, amount, ignoreResistance); if (lifeSteal != 0) { caster.ApplyHeal((int)(appliedDamage * lifeSteal)); } }
public override void UseEffect(Character caster, Character target, BattleView view) { switch (receiver) { case Receiver.Target: target.ApplyHeal(target.MaxLife * valuePercentage + valueFlat); break; case Receiver.Caster: caster.ApplyHeal(caster.MaxLife * valuePercentage + valueFlat); break; } }
public SinglePlayerClient(PBEBattle b, string name) : base(name) { Battle = b; Trainer = b.Trainers[0]; BattleView = new BattleView(this); b.OnNewEvent += SinglePlayerBattle_OnNewEvent; b.OnStateChanged += SinglePlayerBattle_OnStateChanged; ShowAllPokemon(); new Thread(b.Begin) { Name = ThreadName }.Start(); }
public void OnInit(int index) { itemImage = transform.Find("MaskImage/ItemImage").GetComponent <Image>(); itemImageMask = transform.Find("MaskImage/ItemImageMask").GetComponent <Image>(); unitItemButton = transform.Find("Background").GetComponent <Button>(); squadNameText = transform.Find("SquadNameText").GetComponent <Text>(); emberCost = transform.Find("EmberCostText").GetComponent <Text>(); countDownTimerText = transform.Find("TimerText").GetComponent <Text>(); battleView = transform.root.GetComponentInChildren <BattleView>(); unitItemButton.onClick.AddListener(OnUnitItemClicked); buttonIndex = index; }
public SinglePlayerClient(PBEBattleFormat battleFormat, PBESettings settings, IReadOnlyList <PBETrainerInfo> ti0, IReadOnlyList <PBETrainerInfo> ti1, string name) : base(name) { var b = new PBEBattle(battleFormat, settings, ti0, ti1, battleTerrain: PBERandom.RandomBattleTerrain()); Battle = b; Trainer = b.Trainers[0]; BattleView = new BattleView(this); b.OnNewEvent += SinglePlayerBattle_OnNewEvent; b.OnStateChanged += SinglePlayerBattle_OnStateChanged; new Thread(b.Begin) { Name = "Battle Thread" }.Start(); }
public override void Init(IModule module) { base.Init(module); BattleView viewScript = (BattleView)InstantiateView <BattleView>("Battle/Prefabs/BattleView"); RegisterView(viewScript); controller = new BattleController(); controller.view = viewScript; RegisterController(controller); HideBackBtn(); }
public void OnTimer() { if (done) { return; } if (GameController.Instance.battleEventLoaded == false) { return; } done = true; GameController.Instance.ProcessBattleText(this); // Scroll To End BattleView.ScrollTo(BattleLogData[BattleLogData.Count - 1], ScrollToPosition.End, false); }
public SinglePlayerClient(PBEBattle b, string name) : base(name) { Battle = b; Trainer = b.Trainers[0]; BattleView = new BattleView(this); b.OnNewEvent += SinglePlayerBattle_OnNewEvent; b.OnStateChanged += SinglePlayerBattle_OnStateChanged; _ais = new PBEDDAI[b.Trainers.Count - 1]; for (int i = 0; i < _ais.Length; i++) { _ais[i] = new PBEDDAI(b.Trainers[i + 1]); } ShowAllPokemon(); CreateBattleThread(b.Begin); }
public override void UseEffect(Character caster, Character target, BattleView view) { switch (conditionType) { case ConditionType.Marker: if (!caster.GetAppliedMarkers().ContainsKey(conditionMarker)) { return; } break; case ConditionType.Life: if (!(caster.CurrentLife <= caster.MaxLife * conditionValue)) { return; } break; case ConditionType.Status: if (!caster.GetAppliedStatuses().ContainsKey(conditionStatus)) { return; } break; } var amount = 0f; if (caster.GetType() == typeof(Hero)) { var hero = caster as Hero; amount = UnityEngine.Random.Range(hero.MinPhysicalDamage, hero.MaxPhysicalDamage + 1); } else { var monster = target as Monster; amount = UnityEngine.Random.Range(monster.minPhysicalDamage, monster.maxPhysicalDamage + 1); } amount = (int)(amount * damagePercentage); var appliedDamage = target.ApplyDamage(caster, type, amount, ignoreResistance); if (lifeSteal != 0) { caster.ApplyHeal(appliedDamage); } }
private IEnumerator RenderStripRoutine(BattleView view, List <Unit> targets, float timeOffset) { yield return(CoUtils.Wait(timeOffset)); var routines = new List <IEnumerator>(); var span = data.span / data.granularity; var offset = new Vector2( data.granularity * Random.Range(0, span + 1) - data.span / 2, data.granularity * Random.Range(0, span + 1) - data.span / 2); foreach (var step in data.anim.steps) { routines.Add(RenderStepRoutine(step, view, targets, offset)); } yield return(CoUtils.RunParallel(routines.ToArray(), view)); }
public void InitComponent() { //MessageDispatcher.AddObserver( ToggleSelect, MessageType.SelectObjectInBattle ); MessageDispatcher.AddObserver(SelectFeedback, MessageType.BattleUIOperationFeedBack); type = (BattleUIControlType)DataManager.GetInstance().unitOperationChoose; itemImage = transform.Find("ItemImage").GetComponent <Image>(); selectionOverlay = transform.Find("ItemImage/SelectionOverlay").gameObject; unitHealth = transform.Find("Item_HP").GetComponent <Image>(); clickButton = transform.Find("OnClickButton").GetComponent <Button>(); unitNameText = transform.Find("UnitName").GetComponent <Text>(); unitHealth.gameObject.SetActive(false); selectionOverlay.SetActive(false); battleView = transform.root.GetComponentInChildren <BattleView>(); shakeCark = gameObject.AddComponent <ShakeCard>(); clickButton.AddListener(OnClickButton); }
public IEnumerator PlayEffects(List<BattleActionResult.EffectOnTarget> effectsOnTarget, BattleView battleView) { for (int i = 0; i < effectsOnTarget.Count; ++i) { var effectOnTarget = effectsOnTarget[i]; if (effectOnTarget.isEmptyEffect) { continue; } var unit = battleView.GetBattleUnit(effectOnTarget.target); if (i != effectsOnTarget.Count - 1) { StartCoroutine(PlayEffectOnTarget(unit, effectOnTarget)); } else { yield return StartCoroutine(PlayEffectOnTarget(unit, effectOnTarget)); } } }
public virtual IEnumerator PlaySkillSequence(BattleUnitController actor, BattleView battleView, BattleActionResult actionResult) { Vector3 targetPosition = new Vector3(); BattleUnitController targetedUnit = null; TileController targetedTile = null; if (actionResult.targetCharacter != null) { targetedUnit = battleView.GetBattleUnit(actionResult.targetCharacter); targetPosition = targetedUnit.transform.position; } else { targetedTile = battleView.GetTileAtMapPosition(actionResult.targetPosition); targetPosition = targetedTile.transform.position; } var actorOrigPosition = actor.transform.position; yield return StartCoroutine(actor.MoveToAttackPosition(targetedUnit, targetPosition)); StartCoroutine(actor.AnimateAttack()); for (int i = 0; i < actionResult.allSkillEffectResult.Count; ++i) { var delay = this.GetDelayedKeyFrames(i); yield return StartCoroutine(this.WaitForFrames(delay)); var skillEffectResult = actionResult.allSkillEffectResult[i]; yield return this.PlayEffects(skillEffectResult.effectsOnTarget, battleView); } yield return StartCoroutine(actor.ReturnToPosition(actorOrigPosition)); Destroy(this.gameObject); }
//試行回数のチェック public static int TrialCheck(this CounterItem item, BattleView view) { //有効ではない場合 if (!item.Enabled) return 0; //全マップモードの場合 if (item.AllMap) return 1; //個別マップモードの場合 else { if (item.AreaNo != view.AreaID) return 0; if (item.MapNo != view.MapID) return 0; return 1; } }
//チェックしてカウント public static void CheckAndCount(this CounterItem item, BattleView view) { if (item.AutoReset.IsAutoResetActivated(item.LastUpdated)) item.Reset(); item.Value += Check(item, view); item.LastUpdated = DateTime.Now; }
//条件を満たしたかのチェック public static int Check(this CounterItem item, BattleView view) { if (!item.Enabled) return 0; if (!item.AllMap) { if (item.AreaNo != view.AreaID) return 0; if (item.MapNo != view.MapID) return 0; } switch (item.Mode) { case CounterMode.None: return 0; case CounterMode.BossWin: bool iswin = view.WinRank == "S" || view.WinRank == "A" || view.WinRank == "B"; if (iswin && (view.BossFlag == 2)) return 1; else return 0; case CounterMode.BossRankS: if ((view.WinRank == "S") && (view.BossFlag == 2)) return 1; else return 0; case CounterMode.Boss: if (view.BossFlag == 2) return 1; else return 0; case CounterMode.RankS: if (view.WinRank == "S") return 1; else return 0; case CounterMode.DestroyCarrier: //空母リスト var query = from p in APIMaster.MstShips where p.Value.IsCarrier select p.Value.api_id; int cnt = 0; for (int i = 0; i < view.EnemyShipID.Length; i++) { if (view.IsEnemySank == null) continue;//NULLチェック if (!view.IsEnemySank[i]) continue;//沈んでない場合 if (query.Contains(view.EnemyShipID[i])) cnt++;//沈んでいてかつ空母の場合 } return cnt; case CounterMode.DestroySupplyShip: var querysupp = from p in APIMaster.MstShips where p.Value.IsSupplier select p.Value.api_id; int cntsup = 0; for (int i = 0; i < view.EnemyShipID.Length; i++) { if (view.IsEnemySank == null) continue;//NULLチェック if (!view.IsEnemySank[i]) continue;//沈んでない場合 if (querysupp.Contains(view.EnemyShipID[i])) cntsup++; } return cntsup; case CounterMode.Lose: if (view.WinRank == "C" || view.WinRank == "D" || view.WinRank == "E") return 1; else return 0; case CounterMode.BossLose: if (view.BossFlag != 2) return 0; if (view.WinRank == "C" || view.WinRank == "D" || view.WinRank == "E") return 1; else return 0; case CounterMode.BossOverA: if (view.BossFlag != 2) return 0; if (view.WinRank == "S" || view.WinRank == "A") return 1; else return 0; default: throw new ArgumentException(); } }