public GameObject defeatEffect; //撃墜時のエフェクト private void Update() { //戦闘中 if (BattleVal.status == STATUS.BATTLE) { bool critflag = false; bool dodgeflag = false; int damage = 0; switch (bstate) { case BATTLE_STATUS.SETVECT: //キャラの向きの調整 Vector3 r0 = new Vector3(); //攻撃元 Vector3 r1 = new Vector3(); //攻撃先 Mapclass.TranslateMapCoordToPosition(ref r0, BattleVal.selectX, BattleVal.selectY); Mapclass.TranslateMapCoordToPosition(ref r1, attackedpos[0], attackedpos[1]); //攻撃対象の登録 Unitdata temp = BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])]; damage = Calc_Damage(BattleVal.selectedUnit, temp); float dex = Calc_Dexterity(BattleVal.selectedUnit, temp); float rate = Calc_CriticalRate(BattleVal.selectedUnit, temp); //当たった場合 if (Is_Hit(dex)) { //クリティカル発生かどうか if (Is_Hit(rate)) { damage = (int)(damage * 1.5f); critflag = true; } temp.hp -= damage; //ダメージ処理 string damagetext = string.Format("{0}", damage); int count = 1; //ダメージテキストの中心座標 Vector3 damage_center = Camera.main.WorldToScreenPoint(r1); //テキストの登録 foreach (char a in damagetext) { int num = (int)char.GetNumericValue(a); //数を取得 damagenum.Add(Instantiate(damagetextprefab, r1, Quaternion.identity)); damagenum[count - 1].text = a.ToString(); //サイズ取得 damagenum[count - 1].rectTransform.sizeDelta = new Vector2(damagenum[count - 1].preferredWidth, damagenum[count - 1].preferredHeight); damagenum[count - 1].rectTransform.sizeDelta = new Vector2(damagenum[count - 1].preferredWidth, damagenum[count - 1].preferredHeight); damagenum[count - 1].transform.SetParent(canvas.transform, false); damagenum[count - 1].transform.localPosition = damage_center - new Vector3(canvas.GetComponent <RectTransform>().sizeDelta.x / 2, canvas.GetComponent <RectTransform>().sizeDelta.y / 2, 0); //1桁当たりの文字ブロック Vector3 numsize = damagenum[count - 1].GetComponent <RectTransform>().sizeDelta *damagenum[count - 1].GetComponent <RectTransform>().localScale; numsize.y = 0; numsize.z = 0; damagenum[count - 1].transform.localPosition += (count - 1) * numsize; damagenum[count - 1].transform.localPosition += new Vector3(0, 30, 0); damagenum[count - 1].gameObject.SetActive(false); damagenum[count - 1].color = new Vector4(1, 0, 0, 1); count++; } //クリティカルの場合、そのテキストを表示 if (critflag) { damagenum.Add(Instantiate(damagetextprefab, r1, Quaternion.identity)); damagenum[count - 1].text = "Critical!"; //サイズ取得 damagenum[count - 1].rectTransform.sizeDelta = new Vector2(damagenum[count - 1].preferredWidth, damagenum[count - 1].preferredHeight); damagenum[count - 1].rectTransform.sizeDelta = new Vector2(damagenum[count - 1].preferredWidth, damagenum[count - 1].preferredHeight); damagenum[count - 1].transform.SetParent(canvas.transform, false); damagenum[count - 1].transform.localPosition = damage_center - new Vector3(canvas.GetComponent <RectTransform>().sizeDelta.x / 2, canvas.GetComponent <RectTransform>().sizeDelta.y / 2, 0); damagenum[count - 1].transform.localPosition += new Vector3(0, 100, 0); damagenum[count - 1].gameObject.SetActive(false); damagenum[count - 1].color = new Color(1.0f, 1.0f, 0); count++; } } else { dodgeflag = true; //ダメージテキストの中心座標 Vector3 damage_center = Camera.main.WorldToScreenPoint(r1); //テキストの登録 damagenum.Add(Instantiate(damagetextprefab, r1, Quaternion.identity)); damagenum[0].text = "DODGE!"; //サイズ取得 damagenum[0].rectTransform.sizeDelta = new Vector2(damagenum[0].preferredWidth, damagenum[0].preferredHeight); damagenum[0].rectTransform.sizeDelta = new Vector2(damagenum[0].preferredWidth, damagenum[0].preferredHeight); damagenum[0].transform.SetParent(canvas.transform, false); damagenum[0].transform.localPosition = damage_center - new Vector3(canvas.GetComponent <RectTransform>().sizeDelta.x / 2, canvas.GetComponent <RectTransform>().sizeDelta.y / 2, 0); damagenum[0].transform.localPosition += new Vector3(0, 30, 0); damagenum[0].gameObject.SetActive(false); damagenum[0].color = new Vector4(1, 1, 1, 1); } //initialize nowtime = -1; //キャラ向きの調整(お互いに向き合う) float tempy = r1.y; r1.y = r0.y; BattleVal.selectedUnit.gobj.transform.LookAt(r1); r0.y = tempy; temp.gobj.transform.LookAt(r0); //行動スタックのクリア(1手戻し不可能に) BattleVal.actions.Clear(); //state undate if (critflag) { bstate = BATTLE_STATUS.EFFECT; //クリティカル攻撃・構えモーション BattleVal.selectedUnit.gobj.GetComponent <Animator>().Play("CriticalPre"); } else { bstate = BATTLE_STATUS.BATTLE; //攻撃モーション開始 BattleVal.selectedUnit.gobj.GetComponent <Animator>().Play("Attack"); } attackedAnimator = temp.gobj.GetComponent <Animator>(); attackedanimstate = "Damage"; if (dodgeflag) { attackedanimstate = "Dodge"; } break; //クリティカル攻撃の演出 case BATTLE_STATUS.EFFECT: //クリティカル攻撃・構えモーションが終了し、音声はなり終わったか? if (BattleVal.selectedUnit.gobj.GetComponent <Animator>().GetCurrentAnimatorStateInfo(0).normalizedTime >= 1 && !BattleVal.selectedUnit.gobj.GetComponent <CharaAnimation>().voiceSource.isPlaying && !BattleVal.selectedUnit.gobj.GetComponent <CharaAnimation>().seSource.isPlaying) { //クリティカル攻撃モーションへ BattleVal.selectedUnit.gobj.GetComponent <Animator>().Play("CriticalAttack"); bstate = BATTLE_STATUS.BATTLE; } break; case BATTLE_STATUS.BATTLE: //バトルのアニメーション //ヒット判定で効果音+被ダメージアニメーション if (BattleVal.selectedUnit.gobj.GetComponent <CharaAnimation>().isHit) { attackedAnimator.Play(attackedanimstate); if (attackedanimstate == "Dodge") { Operation.setSE(seDodge); } else { Operation.setSE(seHitN); Vector3 effectpos = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref effectpos, attackedpos[0], attackedpos[1]); hitEffect = Instantiate(BattleVal.selectedUnit.attackeffect, effectpos, BattleVal.selectedUnit.attackeffect.transform.rotation); } //テキスト表示 foreach (Text a in damagenum) { a.gameObject.SetActive(true); } } //攻撃者の攻撃モーションが終わったか? if (!BattleVal.selectedUnit.gobj.GetComponent <Animator>().GetCurrentAnimatorStateInfo(0).IsTag("Attack")) { //ダメージテキストの表示 if (nowtime == -1) { nowtime = 0; } else if (nowtime >= battle_time - Time.deltaTime) { bstate = BATTLE_STATUS.AFTERBATTLE; //ダメージ数値のテキストを消す処理 foreach (Text a in damagenum) { Destroy(a.gameObject); } damagenum.Clear(); //攻撃可能フラグをオフに BattleVal.selectedUnit.atackable = false; } else { //ダメージ数値のテキストを消す処理 //damagetext.color -= new Color(0,0,0,Time.deltaTime); foreach (Text a in damagenum) { a.color -= new Color(0, 0, 0, Time.deltaTime); a.transform.position += new Vector3(0, 1, 0); } nowtime += Time.deltaTime; } } break; //戦闘後処理 case BATTLE_STATUS.AFTERBATTLE: //ヒットエフェクトの消去 Destroy(hitEffect); //獲得経験値 int getexp = 10; //基本値 //撃墜処理 if (BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])].hp <= 0) { Vector3 effectpos = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref effectpos, attackedpos[0], attackedpos[1]); Unitdata unit = BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])]; //撃墜エフェクト StartCoroutine(UnitDefeat.DefeatHandle(unit, defeatEffect, effectpos)); //撃墜ボーナス getexp += BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])].status.needexp; //ユニットデータを消去 ////BattleVal.unitlistから消去 for (int i = 0; i < BattleVal.unitlist.Count; i++) { if (BattleVal.unitlist[i].x == unit.x && BattleVal.unitlist[i].y == unit.y) { BattleVal.unitlist.RemoveAt(i); break; } } ////BattleVal.id2indexから消去 BattleVal.id2index.Remove(string.Format("{0},{1}", unit.x, unit.y)); ////mapdataからユニット情報の削除 BattleVal.mapdata[(int)MapdataList.MAPUNIT][unit.y][unit.x] = 0; } //ユニットセレクトに戻る bstate = BATTLE_STATUS.SETVECT; if (BattleVal.selectedUnit.team == 0) { //経験値を獲得するキャラの場合 if (BattleVal.selectedUnit.status.needexp != 0 && BattleVal.selectedUnit.status.level < 99 && BattleVal.selectedUnit.status.level >= 1) { Operation.AddGetExp(BattleVal.selectedUnit, getexp); BattleVal.status = STATUS.GETEXP; } else { BattleVal.status = STATUS.PLAYER_UNIT_SELECT; } } else { BattleVal.status = STATUS.ENEMY_UNIT_SELECT; } break; } } }
//Update private void Update() { //戦闘中 if (BattleVal.status == STATUS.USESKILL) { int damage = 0; switch (bstate) { case BATTLE_STATUS.SETVECT: //キャラの向き調整;攻撃元が発動場所を向く Vector3 r0 = new Vector3(); //攻撃元 Vector3 rSkill = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref r0, BattleVal.selectX, BattleVal.selectY); Mapclass.TranslateMapCoordToPosition(ref rSkill, skillpos[0], skillpos[1]); rSkill.y = r0.y; BattleVal.selectedUnit.gobj.transform.LookAt(rSkill); /* * //攻撃対象 * foreach (int[] attackedpos in attackedposlist) * { * Vector3 r1 = new Vector3(); //攻撃先 * Mapclass.TranslateMapCoordToPosition(ref r1, attackedpos[0], attackedpos[1]); * Unitdata temp = BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])]; * damage = Calc_Damage(BattleVal.selectedUnit, temp); * * temp.hp -= damage; //ダメージ処理 * * string damagetext = string.Format("{0}", (int)Mathf.Abs(damage)); * int count = 1; * //ダメージテキストの中心座標 * Vector3 damage_center = Camera.main.WorldToScreenPoint(r1); * * //テキストの登録 * List<Text> damagenumtmp = new List<Text>(); * foreach (char a in damagetext) * { * int num = (int)char.GetNumericValue(a); //数を取得 * * damagenumtmp.Add(Instantiate(damagetextprefab, r1, Quaternion.identity)); * damagenumtmp[count - 1].text = a.ToString(); * //サイズ取得 * damagenumtmp[count - 1].rectTransform.sizeDelta = * new Vector2(damagenumtmp[count - 1].preferredWidth, damagenumtmp[count - 1].preferredHeight); * damagenumtmp[count - 1].rectTransform.sizeDelta = * new Vector2(damagenumtmp[count - 1].preferredWidth, damagenumtmp[count - 1].preferredHeight); * damagenumtmp[count - 1].transform.SetParent(canvas.transform, false); * damagenumtmp[count - 1].transform.localPosition = damage_center - new Vector3(canvas.GetComponent<RectTransform>().sizeDelta.x / 2, canvas.GetComponent<RectTransform>().sizeDelta.y / 2, 0); * * //1桁当たりの文字ブロック * Vector3 numsize = damagenumtmp[count - 1].GetComponent<RectTransform>().sizeDelta * damagenumtmp[count - 1].GetComponent<RectTransform>().localScale; * numsize.y = 0; * numsize.z = 0; * * damagenumtmp[count - 1].transform.localPosition += (count - 1) * numsize; * damagenumtmp[count - 1].transform.localPosition += new Vector3(0, 30, 0); * damagenumtmp[count - 1].color = new Vector4(1, 0, 0, 1); * if (damage < 0) damagenumtmp[count - 1].color = new Vector4(0.7f,1,0.7f,1); * damagenumtmp[count - 1].gameObject.SetActive(false); * count++; * * } * damagenum.Add(damagenumtmp); * * //アニメーション設定 * attackedAnimator.Add(temp.gobj.GetComponent<Animator>()); * if(damage > 0) * attackedanimstate.Add(hitAnimName); //共通モーションだと思うが、一部キャラで回復・ダメージが混ざる将来性も加味する * else * attackedanimstate.Add(healAnimName); //暫定 Healモーションも作る * attackedCharaAnimation.Add(temp.gobj.GetComponent<CharaAnimation>()); * } */ nowtime = -1; //initialize //スキルの消費 selectedskill.Consume(1); //行動スタックのクリア(1手戻し不可能に) BattleVal.actions.Clear(); //カットイン演出の場合 if (selectedskill.is_cutscene) { gobjCutin = Instantiate(selectedskill.prefab_cutin); bstate = BATTLE_STATUS.CUTIN; } else { //通常スキルの場合 //スキル使用モーション再生 BattleVal.selectedUnit.gobj.GetComponent <Animator>().Play(selectedskill.animname); //state update bstate = BATTLE_STATUS.EFFECT; skilltext.text = selectedskill.skillname; skillnamePanel.SetActive(true); } break; case BATTLE_STATUS.CUTIN: if (gobjCutin.GetComponent <CutinChecker>().cutinFinish) { Destroy(gobjCutin); //スキル使用モーション再生 BattleVal.selectedUnit.gobj.GetComponent <Animator>().Play(selectedskill.animname); //state update bstate = BATTLE_STATUS.EFFECT; skilltext.text = selectedskill.skillname; skillnamePanel.SetActive(true); } break; case BATTLE_STATUS.EFFECT: //スキル使用モーションが終了し、音声はなり終わったか? /* * if (BattleVal.selectedUnit.gobj.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).normalizedTime >= 1 * && !BattleVal.selectedUnit.gobj.GetComponent<CharaAnimation>().voiceSource.isPlaying * && !BattleVal.selectedUnit.gobj.GetComponent<CharaAnimation>().seSource.isPlaying) */ if (!BattleVal.selectedUnit.gobj.GetComponent <Animator>().GetCurrentAnimatorStateInfo(0).shortNameHash.Equals(Animator.StringToHash(selectedskill.animname)) && !BattleVal.selectedUnit.gobj.GetComponent <CharaAnimation>().voiceSource.isPlaying && !BattleVal.selectedUnit.gobj.GetComponent <CharaAnimation>().seSource.isPlaying) { Vector3 effectcampoint = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref effectcampoint, skillpos[0], skillpos[1]); CameraAngle.CameraPoint(effectcampoint); //エフェクト再生へ Vector3 reffect = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref reffect, skillpos[0], skillpos[1]); hitEffect = Instantiate(selectedskill.skillefect, reffect, selectedskill.skillefect.transform.rotation); bstate = BATTLE_STATUS.BATTLE; } break; case BATTLE_STATUS.BATTLE: //バトルのアニメーション //エフェクトの再生が終了したか? if (hitEffect == null) { //被弾モーション再生 if (nowtime == -1) { //攻撃対象 foreach (int[] attackedpos in attackedposlist) { Vector3 r1 = new Vector3(); //攻撃先 Mapclass.TranslateMapCoordToPosition(ref r1, attackedpos[0], attackedpos[1]); Unitdata temp = BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])]; damage = Calc_Damage(BattleVal.selectedUnit, temp); temp.hp -= damage; //ダメージ処理 string damagetext = string.Format("{0}", (int)Mathf.Abs(damage)); int count = 1; //ダメージテキストの中心座標 Vector3 damage_center = Camera.main.WorldToScreenPoint(r1); //テキストの登録 List <Text> damagenumtmp = new List <Text>(); foreach (char a in damagetext) { int num = (int)char.GetNumericValue(a); //数を取得 damagenumtmp.Add(Instantiate(damagetextprefab, r1, Quaternion.identity)); damagenumtmp[count - 1].text = a.ToString(); //サイズ取得 damagenumtmp[count - 1].rectTransform.sizeDelta = new Vector2(damagenumtmp[count - 1].preferredWidth, damagenumtmp[count - 1].preferredHeight); damagenumtmp[count - 1].rectTransform.sizeDelta = new Vector2(damagenumtmp[count - 1].preferredWidth, damagenumtmp[count - 1].preferredHeight); damagenumtmp[count - 1].transform.SetParent(canvas.transform, false); damagenumtmp[count - 1].transform.localPosition = damage_center - new Vector3(canvas.GetComponent <RectTransform>().sizeDelta.x / 2, canvas.GetComponent <RectTransform>().sizeDelta.y / 2, 0); //1桁当たりの文字ブロック Vector3 numsize = damagenumtmp[count - 1].GetComponent <RectTransform>().sizeDelta *damagenumtmp[count - 1].GetComponent <RectTransform>().localScale; numsize.y = 0; numsize.z = 0; damagenumtmp[count - 1].transform.localPosition += (count - 1) * numsize; damagenumtmp[count - 1].transform.localPosition += new Vector3(0, 30, 0); damagenumtmp[count - 1].color = new Vector4(1, 0, 0, 1); if (damage < 0) { damagenumtmp[count - 1].color = new Vector4(0.7f, 1, 0.7f, 1); } damagenumtmp[count - 1].gameObject.SetActive(false); count++; } damagenum.Add(damagenumtmp); //アニメーション設定 attackedAnimator.Add(temp.gobj.GetComponent <Animator>()); if (damage > 0) { attackedanimstate.Add(hitAnimName); //共通モーションだと思うが、一部キャラで回復・ダメージが混ざる将来性も加味する } else { attackedanimstate.Add(healAnimName); //暫定 Healモーションも作る } attackedCharaAnimation.Add(temp.gobj.GetComponent <CharaAnimation>()); } for (int i = 0; i < attackedAnimator.Count; i++) { //Count不一致するかも? attackedAnimator[i].Play(attackedanimstate[i]); if (attackedanimstate[i] == hitAnimName) { attackedCharaAnimation[i].seSource.clip = seDamage; } else { attackedCharaAnimation[i].seSource.clip = seHeal; } attackedCharaAnimation[i].seSource.Play(); } //テキスト表示 foreach (List <Text> damagenumtmp in damagenum) { foreach (Text a in damagenumtmp) { a.gameObject.SetActive(true); } //CameraAngle.CameraPoint(BattleVal.selectedUnit.gobj.transform.position); } nowtime = 0; } else if (nowtime >= battle_time - Time.deltaTime) { //戦闘後処理 bstate = BATTLE_STATUS.AFTERBATTLE; //ダメージ数値のテキストを消す処理 foreach (List <Text> damagenumtmp in damagenum) { foreach (Text a in damagenumtmp) { Destroy(a.gameObject); } } //戦闘用のダメージ表示などの判定が終了した後に、カメラの位置の移動 CameraAngle.CameraPoint(BattleVal.selectedUnit.gobj.transform.position); //アニメーション関連の初期化 attackedAnimator.Clear(); attackedanimstate.Clear(); attackedCharaAnimation.Clear(); damagenum.Clear(); skillnamePanel.SetActive(false); //攻撃可能フラグをオフに BattleVal.selectedUnit.atackable = false; } else { //ダメージ数値のテキストを消す処理 //damagetext.color -= new Color(0,0,0,Time.deltaTime); foreach (List <Text> damagenumtmp in damagenum) { foreach (Text a in damagenumtmp) { a.color -= new Color(0, 0, 0, Time.deltaTime); a.transform.position += new Vector3(0, 1, 0); } } nowtime += Time.deltaTime; } } break; //戦闘後処理 case BATTLE_STATUS.AFTERBATTLE: //獲得経験値 int getexp = 10; //基本値 //撃墜処理 foreach (int[] attackedpos in attackedposlist) { Unitdata temp = BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])]; //撃墜処理 if (temp.hp <= 0) { Vector3 defeatpos = new Vector3(); Mapclass.TranslateMapCoordToPosition(ref defeatpos, attackedpos[0], attackedpos[1]); StartCoroutine(UnitDefeat.DefeatHandle(temp, defeatEffect, defeatpos)); //撃墜ボーナス getexp += BattleVal.id2index[string.Format("{0},{1}", attackedpos[0], attackedpos[1])].status.needexp; //ユニットデータを消去 ////BattleVal.unitlistから消去 for (int i = 0; i < BattleVal.unitlist.Count; i++) { if (BattleVal.unitlist[i].x == temp.x && BattleVal.unitlist[i].y == temp.y) { BattleVal.unitlist.RemoveAt(i); break; } } ////BattleVal.id2indexから消去 BattleVal.id2index.Remove(string.Format("{0},{1}", temp.x, temp.y)); ////mapdataからユニット情報の削除 BattleVal.mapdata[(int)MapdataList.MAPUNIT][temp.y][temp.x] = 0; } if (temp.hp > temp.status.maxhp) { temp.hp = temp.status.maxhp; } } //必殺技の場合、獲得経験値が1.5倍ボーナス if (selectedskill.is_cutscene) { getexp = (int)((float)getexp * 1.5f); } //ユニットセレクトに戻る bstate = BATTLE_STATUS.SETVECT; if (BattleVal.selectedUnit.team == 0) { //経験値を獲得するキャラの場合 if (BattleVal.selectedUnit.status.needexp != 0 && BattleVal.selectedUnit.status.level < 99 && BattleVal.selectedUnit.status.level >= 1) { Operation.AddGetExp(BattleVal.selectedUnit, getexp); BattleVal.status = STATUS.GETEXP; } else { BattleVal.status = STATUS.PLAYER_UNIT_SELECT; } } else { BattleVal.status = STATUS.ENEMY_UNIT_SELECT; } break; } } else { } }
internal void tryStartNewBattle(int fleetid, int levelid, bool autostart, List<int> backshiplist) { if (isInBattle()) { MessageBox.Show("已有舰队在战斗中"); return; } battel_status = BATTLE_STATUS.PREPARE; battle_fleetid = fleetid; battle_levelid = levelid; battle_node_counter = 0; bcounter = 5; this.all_battle_ships.Clear(); this.all_backupships.Clear(); UserFleet uf = GameData.instance.GetFleetOfId(fleetid); if(uf == null) { MessageBox.Show("战斗开启参数错误,错误的舰队"); return; } foreach(int sidbattle in uf.ships) { all_battle_ships.Add(sidbattle); } foreach (int i in backshiplist) { all_backupships.Add(i); } initing = true; autostart_battle = autostart; autobattlecheck.Checked = autostart_battle; initing = false; z.log("[准备开始战斗] " + (autostart ? "并开始自动执行此战斗" : "")); }
private bool auto_battle() { if(!isInBattle()) { if (autostart_battle == true) { try { //if (this.bigbrokenhaiyaosuozi.Checked == true) //{ // log("[警告-警告-警告] 大破进击开关已经打开,请立即停止作死....请立即停止作死....",Color.Red); //} var uinfo = GameData.instance.UserInfo; //黑暗炼钢 if(darkforge.Checked == true ) { UserFleet ff = GameData.instance.GetFleetOfId(1); if(ff == null || GameData.instance.IsFleetInExplore(ff.id) || GameData.instance.IsFleetInRepair(ff.id) ) { initing = true; darkforge.Checked = false; autostart_battle = false; autobattlecheck.Checked = false; initing = false; log("[黑暗炼钢不支持非1号舰队] 请让1号舰队舰娘待机..."); return false; } if(GameData.instance.UserInfo.detailInfo.shipNum > darkforgetotalshipnum.Value) { initing = true; darkforge.Checked = false; autostart_battle = false; autobattlecheck.Checked = false; initing = false; log("[黑暗炼钢] 已经炼制太多少女,超过提督设定负荷极限 " +darkforgetotalshipnum.Value + "停止炼钢..."); return false; } } if(darkforge.Checked == true) { List<UserShip> forgelist = new List<UserShip>(); bool need_new_forger = false; //检查舰队 UserFleet forgefleet = GameData.instance.GetFleetOfId(1); UserShip flagship = forgefleet.GetUserShips().First(); if(flagship.ship.type != ShipType.Destroyer || flagship.level >5 || flagship.ship.star >2 || forgefleet.ships.Length >1 || flagship.battleProps.oil ==0 || flagship.battleProps.ammo == 0 || flagship.BrokenType == ShipBrokenType.bigBorken || flagship.IsLocked == true ) { need_new_forger = true; } //更新预备队 if (need_new_forger == true) { foreach (var dfs in GameData.instance.UserShips) { if (dfs.IsLocked == false && dfs.level == 1 && dfs.ship.star < 3 && dfs.ship.type == ShipType.Destroyer && dfs.BrokenType == ShipBrokenType.noBroken && dfs.battleProps.oil == dfs.battlePropsMax.oil && dfs.battleProps.ammo == dfs.battlePropsMax.ammo && dfs.fleetId == 0 && dfs.IsInRepair == false ) { forgelist.Add(dfs); } } if(forgelist.Count == 0) { initing = true; darkforge.Checked = false; autostart_battle = false; autobattlecheck.Checked = false; initing = false; log("[黑暗炼钢] 缺少祭品,无法炼钢 =>" + forgelist.Count + "枚"); return false; } log("[黑暗炼钢] 预备熔炼少女 =>" + forgelist.Count + "枚"); if (forgefleet.ships.Length >1) { for (int i = 0; i < forgefleet.ships.Length - 1;i++ ) { log("[黑暗炼钢]" + "移出其他舰队成员"); ServerRequestManager.instance.ChangeFleetShip(forgefleet.id, 0, 0); } } UserShip forger = forgelist.First(); log("[黑暗炼钢]抛弃钢渣少女 => " + tools.helper.getstartstring(flagship.ship.star) + tools.helper.getshiptype(flagship.ship.type) + " " + flagship.ship.title + " Lv." + flagship.level + " HP: " + flagship.battleProps.hp + "/" + flagship.battlePropsMax.hp + " 油:" + flagship.battleProps.oil + " 弹:" + flagship.battleProps.ammo); var ret =ServerRequestManager.instance.ChangeFleetShip(forgefleet.id, forger.id, 0); if(ret!= null && ret.responseData != null && ret.responseData.eid == 0) { log("[黑暗炼钢] 计划熔炼少女 => " + tools.helper.getstartstring(forger.ship.star) + tools.helper.getshiptype(forger.ship.type) + " " + forger.ship.title + " Lv." + forger.level + "HP: " + forger.battleProps.hp + "/" +forger.battlePropsMax.hp + " 油:" + forger.battleProps.oil + " 弹:" + forger.battleProps.ammo); } else { initing = true; darkforge.Checked = false; autostart_battle = false; autobattlecheck.Checked = false; initing = false; log("[黑暗炼钢] 更换祭品失败,无法炼钢 " ); return false; } } //开始炼钢 PVELevel lv = PVEConfigs.instance.GetLevel(101); UserFleet uf = GameData.instance.GetFleetOfId(1); if (lv != null && uf != null && tools.helper.isFleetCanBattle(uf, battlechangetypecombo.SelectedIndex)) { battle_fleetid = uf.id; battle_levelid = lv.id; battle_node_counter = 0; battel_status = BATTLE_STATUS.PREPARE; bcounter = 5; var forger = uf.GetUserShips().First(); log("[黑暗炼钢] 开始熔炼少女 => " +tools.helper.getstartstring(forger.ship.star)+ tools.helper.getshiptype(forger.ship.type) + " " + forger.ship.title + " Lv." + forger.level + " HP: " + forger.battleProps.hp + "/" + forger.battlePropsMax.hp + " 油:"+ forger.battleProps.oil + " 弹:"+ forger.battleProps.ammo); } else { initing = true; darkforge.Checked = false; autostart_battle = false; autobattlecheck.Checked = false; initing = false; log("[黑暗炼钢] 炼钢参数错误,无法炼钢 "); return false; } } else { //普通 if (uinfo.oil < 1000 || uinfo.ammo < 1000 || uinfo.steel < 1000 || uinfo.aluminium < 200) { log("[自动战斗] 油弹钢铝资源过低,休息30分钟..."); battle_counter += 3600; return false; } PVELevel lv = PVEConfigs.instance.GetLevel(battle_levelid); UserFleet uf = GameData.instance.GetFleetOfId(battle_fleetid); if(tryFillBackupShips(uf) == true) { return true; } if (lv != null && uf != null && tools.helper.isFleetCanBattle(uf , battlechangetypecombo.SelectedIndex)) { battle_fleetid = uf.id; battle_levelid = lv.id; battle_node_counter = 0; battel_status = BATTLE_STATUS.PREPARE; bcounter = 5; } } } catch (System.Exception ex) { return true; } } return false; } switch(battel_status) { case BATTLE_STATUS.PREPARE: if(darkforge.Checked == true) { setBattleStatus(BATTLE_STATUS.SUPPLY); log("[黑暗炼钢] 炼钢少女不许吃喝...."); } else if( supplyfleetbeforebattel_check.Checked == false) { setBattleStatus(BATTLE_STATUS.SUPPLY); log("[自动战斗] 黑心提督不许软萌少女吃喝... ≡≡[。。]≡"); } else { ServerRequestManager.instance.trySupplyFleet(battle_fleetid); } break; case BATTLE_STATUS.SUPPLY: var startret = ServerRequestManager.instance.StartPVELevel(battle_levelid, battle_fleetid, battle_formation); if (startret != null && startret.responseData != null && startret.responseData.eid == 0) { var blevel =PVEConfigs.instance.GetLevel(battle_levelid); this.currentlevel = blevel; this.currentNode = PVEConfigs.instance.GetNode(this.currentlevel.initNodeId); this.currentNodeStatus = new Dictionary<string,int>(); this.passedNodes = new List<PVENode>(); this.passedNodes.Add(this.currentNode); this.pveLevelEnd = false; this.battle_retry_counter = 10; } break; case BATTLE_STATUS.STARTED: if(CanBattle()) { var ret =ServerRequestManager.instance.GetNextPVELevelNode(); if(ret != null && ret.responseData != null && ret.responseData.eid ==0) { GetNextNodeResponse r = (ret.responseData as GetNextNodeResponse); if(r.node == 0) { log("[自动战斗] 关卡结束,返回港口...."); setBattleStatus(BATTLE_STATUS.FINISHED); refreshUIData(); return true; } this.currentNode = PVEConfigs.instance.GetNode(r.node); this.currentNodeStatus = r.nodeStatus; this.passedNodes.Add(currentNode); //战斗路点控制 if(battle_route.Text!=null && battle_route.Text != "") { char[] shcedule_route = battle_route.Text.ToArray(); if(this.passedNodes.Count <= shcedule_route.Length +1) { string cur_schedule_route_point = shcedule_route[this.passedNodes.Count - 2].ToString().ToUpper(); if (currentNode.flag.ToUpper() != cur_schedule_route_point) { string sroute = ""; foreach(var nnn in this.passedNodes) { sroute += nnn.flag + " => "; } log("[自动战斗-路径控制] 前进路径 " + sroute + "不符合设定路径" + battle_route.Text + "回港重来...."); ServerRequestManager.instance.NotifyPVEBackHome(); break; } } } if (this.passedNodes.Count > 2) { this.delay_counter += this.secondnodedelaymulti.Value; } else { this.delay_counter += this.battleresultdelayinput.Value; } } else if ( battle_retry_counter >0) { battle_retry_counter--; if (this.passedNodes.Count > 2) { this.delay_counter += this.secondnodedelaymulti.Value/2; } else { this.delay_counter += this.battleresultdelayinput.Value; } log("[自动战斗] 提督你肝少女们太快了...服务器响应失败...重试ing... 剩余次数 x " + battle_retry_counter); } else { ServerRequestManager.instance.NotifyPVEBackHome(); log("[自动战斗] 服务器娘已经肝倒....回港重来... "); } }else{ ServerRequestManager.instance.NotifyPVEBackHome(); setBattleStatus(BATTLE_STATUS.FINISHED); log("[舰队有大破需要修理或者修理中] 停止自动战斗...."); } break; case BATTLE_STATUS.VISIT_NODE: if (currentNode.IsBattleNode == true) { var spyret = ServerRequestManager.instance.SearchPVELevelNode(currentNode.id); if (spyret != null && spyret.responseData != null && spyret.responseData.eid == 0) { SearchEnemyResponse r = (spyret.responseData as SearchEnemyResponse); //避战控制 if (avoidbattletext.Text != null && avoidbattletext.Text != "") { char[] shcedule_avoid = avoidbattletext.Text.ToArray(); if (this.passedNodes.Count <= shcedule_avoid.Length + 1) { string cur_schedule_avoid_point = shcedule_avoid[this.passedNodes.Count - 2].ToString(); if (cur_schedule_avoid_point == "1" && r.enemyVO.canSkip == 1) { log("[自动战斗-自动回避] 尝试回避 @ " + currentlevel.title + "#" + currentNode.flag); var skipret = ServerRequestManager.instance.SkipPVELevelNode(currentNode.id); if (skipret != null && skipret.responseData != null && skipret.responseData.eid == 0) { var sret = skipret.responseData as SkipWarResponse; if(sret.isSuccess == 1) { //避战成功,下一个点 log("[自动战斗-自动回避] 回避成功 @ " + currentlevel.title + "#" + currentNode.flag); setBattleStatus(BATTLE_STATUS.STARTED); return true; } else { log("[自动战斗-自动回避] 回避失败 @ " + currentlevel.title + "#" + currentNode.flag); } } } } } //战斗 敌人 舰队组成 控制 if (searchenemycase.Text != null && searchenemycase.Text != "") { char[] enemycase = searchenemycase.Text.ToArray(); if (this.passedNodes.Count <= enemycase.Length + 1) { string cur_enemycase_point = enemycase[this.passedNodes.Count - 2].ToString().ToUpper(); if (judge_enemy_case(r.enemyVO.enemyShips, cur_enemycase_point) == dofightinstedofback.Checked) { string sroute = ""; foreach (var nnn in this.passedNodes) { sroute += nnn.flag + " => "; } log("[自动战斗-索敌控制] " + (dofightinstedofback.Checked? "不符合设定索敌条件, 回港重来....":"符合设定 避开 索敌条件, 回港重来....") ); ServerRequestManager.instance.NotifyPVEBackHome(); } } } } else { ServerRequestManager.instance.NotifyPVEBackHome(); log("[自动战斗]索敌错误,回港重来..."); } } else { log("[自动战斗-索敌控制] 资源点不索敌...."); setBattleStatus(BATTLE_STATUS.SPY_NODE); } break; case BATTLE_STATUS.SPY_NODE: UserFleet buf = GameData.instance.GetFleetOfId(battle_fleetid); UserShip[] nowshipstatus = new UserShip[buf.ships.Length]; for(int iii =0;iii < buf.ships.Length;iii++) { nowshipstatus[iii] = GameData.instance.GetShipById(buf.ships[iii]); } CurrentWarParameters.shipsbeforebattle = nowshipstatus; int nodeformation = -1; if (formation_control.Text != null && formation_control.Text != "") { char[] formation_controlpoint = formation_control.Text.ToArray(); if (this.passedNodes.Count <= formation_controlpoint.Length + 1) { string formation_control_point = formation_controlpoint[this.passedNodes.Count - 2].ToString(); if (formation_control_point != "") { nodeformation = int.Parse(formation_control_point); if (nodeformation < 1 || nodeformation > 5) { nodeformation = -1; } } } } log("[自动战斗] 舰队阵型:" + tools.helper.getformationstring(((nodeformation == -1 ? battle_formation : (FleetFormation)nodeformation)))); var firstbattl = ServerRequestManager.instance.DealPVELevelNode(currentNode.id,battle_fleetid, nodeformation == -1 ? battle_formation:((FleetFormation)nodeformation)); if (firstbattl!= null && firstbattl.responseData!= null && firstbattl.responseData.eid==0) { var respone = (firstbattl.responseData as GetDealNodeResponse); if (respone.pveLevelEnd != null && respone.pveLevelEnd == 1) { this.pveLevelEnd = true; } if (currentNode.IsBattleNode == true) { if (respone.warReport != null) { dealnode_enemyclearornot = respone.warReport.canDoNightWar == 0; } bool extranightwarswitch =false; if(night_war_control.Text!=null && night_war_control.Text != "") { char[] night_war_controlpoint = night_war_control.Text.ToArray(); if (this.passedNodes.Count <= night_war_controlpoint.Length + 1) { string night_war_control_point = night_war_controlpoint[this.passedNodes.Count - 2].ToString(); if (night_war_control_point == "1") { extranightwarswitch = true; } } } CurrentWarParameters.daybattleresult = respone; if (detailbattlelog.Checked == true) { z.log( tools.helper.getDetailDayWarresultstring(respone, battle_fleetid)); } if (dealnode_enemyclearornot) { log("[日战胜利!!]少女战利品回收中.. "); } else { log((this.nightwarcheck.Checked||extranightwarswitch) == true ? "[日战失利!!]提督判定大群少女继续夜战..... " : "[日战失利] 提督决定不参与夜战活动.."); } } else { if (this.currentNode.nodeType == PVENodeType.addItem) { if(currentNode.gain != null) foreach (var gkv in currentNode.gain) { log("[自动战斗] 在关卡"+currentlevel.title + " "+currentNode.flag + "点 遇到好心人,获得 " + tools.helper.getresourcetype(gkv.Key)+ " x " + gkv.Value); } } else if (this.currentNode.nodeType == PVENodeType.loseItem) { if(currentNode.loss != null) foreach (var gkv in currentNode.loss) { log("[自动战斗] 在关卡"+currentlevel.title + " "+currentNode.flag + "点 遇到坏蛋,丢失 " + tools.helper.getresourcetype(gkv.Key)+ " x " + gkv.Value); } } else if (this.currentNode.nodeType == PVENodeType.empty) { log("[自动战斗] 在关卡"+currentlevel.title + " "+currentNode.flag + "点 什么也没有发生............真的"); } setBattleStatus(BATTLE_STATUS.STARTED); } } else if (battle_retry_counter >0) { battle_retry_counter--; if (this.passedNodes.Count > 2) { this.delay_counter += this.secondnodedelaymulti.Value; } else { this.delay_counter += this.battleresultdelayinput.Value; } log("[自动战斗] 提督你肝少女们太快了...服务器响应失败...重试ing... 剩余次数 x " + battle_retry_counter); } else { ServerRequestManager.instance.NotifyPVEBackHome(); log("[自动战斗] 服务器娘已经肝倒....回港重来... "); } this.delay_counter += this.battleresultdelayinput.Value; break; case BATTLE_STATUS.NODE_BATTLE: //夜战额外控制 bool dobattleextranightwarswitch =false; if(night_war_control.Text!=null && night_war_control.Text != "") { char[] dobattlenight_war_controlpoint = night_war_control.Text.ToArray(); if (this.passedNodes.Count <= dobattlenight_war_controlpoint.Length + 1) { string dobattlenight_war_control_point = dobattlenight_war_controlpoint[this.passedNodes.Count - 2].ToString(); if (dobattlenight_war_control_point == "1") { dobattleextranightwarswitch = true; } } } var battleret = ServerRequestManager.instance.GetPVEBattleResult( (!dealnode_enemyclearornot) && (battle_do_nightwar==1 ||dobattleextranightwarswitch) , battle_fleetid); if (battleret != null && battleret.responseData != null && battleret.responseData.eid == 0) { z.instance.setBattleStatus(BATTLE_STATUS.BATTLE_RESULT); var battleResult = battleret.responseData as GetBattleResultResponse; if (detailbattlelog.Checked == true) { z.log(tools.helper.getDetailNightWarresultstring(battleResult, battle_fleetid)); } z.log("[少女卖肉报酬入手]..." + tools.helper.getwarresultstring(battleResult, battle_fleetid)); tools.reporter.reportGotShip(battleResult, battle_fleetid, currentlevel.title, currentNode.flag); //开关开了,5场 s ss 不掉船就停止捞船 if(stopbattlewhennodrop_check.Checked == true) { WarResultLevel wrl = (WarResultLevel)battleResult.warResult.resultLevel; if(battleResult.newShipVO!= null && battleResult.newShipVO.Length >0) { nodropcounter = 0; } else if (wrl == WarResultLevel.s || wrl == WarResultLevel.ss) { nodropcounter++; log("[自动战斗] S/SS胜无掉落...计数: " + nodropcounter + " , 5次后停止自动战斗"); } if(nodropcounter >=5 && autobattlecheck.Checked == true) { initing = true; autostart_battle = false; autobattlecheck.Checked = autostart_battle; initing = false; } } } else if (battle_retry_counter >0) { battle_retry_counter--; log("[自动战斗] 提督你肝少女们太快了...服务器响应失败...重试ing... 剩余次数 x " + battle_retry_counter); this.delay_counter += this.battleresultdelayinput.Value; } else { ServerRequestManager.instance.NotifyPVEBackHome(); log("[自动战斗] 服务器娘已经肝倒....回港重来... "); } if ((!dealnode_enemyclearornot) && (battle_do_nightwar == 1 || dobattleextranightwarswitch)) { this.delay_counter += this.battleresultdelayinput.Value; } break; case BATTLE_STATUS.BATTLE_RESULT: //todo think logic battle_node_counter++; if(this.pveLevelEnd == true) { log("[自动战斗] 关卡结束,返回港口...."); setBattleStatus(BATTLE_STATUS.FINISHED); refreshUIData(); return true; } if (battle_node_counter >= this.battlenodenuminput.Value) { ServerRequestManager.instance.NotifyPVEBackHome(); } else { setBattleStatus(BATTLE_STATUS.STARTED); } refreshUIData(); break; default: return false; break; } return true; }
public void setBattleStatus(BATTLE_STATUS s) { battel_status = s; }