private void DoScript() { if (!sceneStartFadeStart) { sceneStartFadeStart = true; } if (scriptAPI.__isMainDo) { scriptAPI.__isMainDo = false; { if (scriptAPI.__clearText) { for (var i = 0; i < textSprites.Length; i++) { if (textSprites[i] != null) { layer.Del(textSprites[i]); textSprites[i].Dispose(); textSprites[i] = null; } } textLineNum = 0; targetTextSpriteIndex = 0; scriptAPI.__clearText = false; } if (scriptAPI.__talkText != null) { lock (scriptAPI._lock__talkText) { var t = scriptAPI.__talkText; var t2 = t.Split('\n'); foreach (var t3 in t2) { //if (t3 == "") continue; var x = 100 + 5; var y = 600 + 55 + 50 * textLineNum; var font = new Font(Config.MainConfig.MainFontPath, 20, new Color(1, 1, 1, 1), new Font.FontFrame[] { new Font.FontFrame(2, new Color(1, 0, 0, 0)), }, 0); var ts = new TextSprite(t3, font, new Vector2D(x, y), TextSprite.Type.Separation, null, 0, 100); layer.Add(ts, 200); textSprites[textLineNum] = ts; ts.OnShowEnd += () => { targetTextSpriteIndex++; if (textSprites.Count() <= targetTextSpriteIndex) { ImageSpriteWaitEnterIcon.IsDraw = true; } else if (textSprites[targetTextSpriteIndex] == null) { ImageSpriteWaitEnterIcon.IsDraw = true; } }; ImageSpriteWaitEnterIcon.IsDraw = false; textLineNum++; } scriptAPI.__talkText = null; } } if (scriptAPI.__talkCharacterImagePath != null) { if (ImageSpriteTalkCharacter != null) { layer.Del(ImageSpriteTalkCharacter); ImageSpriteTalkCharacter.Dispose(); } var texture = TextureResourceManager.Instance.GetTexture(scriptAPI.__talkCharacterImagePath); var w = texture.Size.X;// 1300;//1024; var h = (int)((double)texture.Size.Y / (double)texture.Size.X * w); var sprite = new ImageSprite( texture, new Rect( new Vector2D(characterPosition.X, characterPosition.Y), new Vector2D(w, h)), new Color(1, 1, 1, 1) ); layer.Add(sprite, 100); ImageSpriteTalkCharacter = sprite; ImageSpriteTalkCharacter.Color.A = 0; fadeTimerTime = 0; slideTimerTime = 0; scriptAPI.__talkCharacterImagePath = null; } if (scriptAPI.__talkCharacterViewName != null) { if (CharacterViewNameTextSprite != null) { layer.Del(CharacterViewNameTextSprite); CharacterViewNameTextSprite.Dispose(); } var x = 100 + 5; var y = 600; var font = new Font(Config.MainConfig.MainFontPath, 20, new Color(1, 1, 1, 1), new Font.FontFrame[] { new Font.FontFrame(2, new Color(1, 0, 0, 0)), }, 0); var ts = new TextSprite(scriptAPI.__talkCharacterViewName, font, new Vector2D(x, y)); layer.Add(ts, 200); CharacterViewNameTextSprite = ts; scriptAPI.__talkCharacterViewName = null; } if (scriptAPI._nextBattleScript != null) { WindowManager.nextScene = new Scene.BattleScene(scriptAPI._nextBattleScript); scriptAPI._nextBattleScript = null; } if (scriptAPI._nextTalkScript != null) { WindowManager.nextScene = new Scene.TalkScene(scriptAPI._nextTalkScript); scriptAPI._nextTalkScript = null; } if (scriptAPI._nextTitle != null) { WindowManager.nextScene = new Scene.TitleScene(); scriptAPI._nextTitle = null; } if (scriptAPI.__choiseText != null) { if (choice != null) { layer.Del(choice); } // todo : Choiceのなかで文字のDisposeがいるはず choice = new UI.Talk.Choice(scriptAPI.__choiseText); layer.Add(choice, 200); scriptAPI.__choiseText = null; } if (scriptAPI.__backGroundImagePath != null) { // todo : 背景のリソースをクリーンにする処理が見当たらない if (ImageSpriteBackGround != null) { layer.Del(ImageSpriteBackGround); ImageSpriteBackGround.Dispose(); } var texture = TextureResourceManager.Instance.GetTexture(scriptAPI.__backGroundImagePath); var w = 1600; var h = (int)((double)texture.Size.Y / (double)texture.Size.X * w); var sprite = new ImageSprite(texture, new Rect(new Vector2D(0, 0), new Vector2D(w, h)), new Color(1, 1, 1, 1)); layer.Add(sprite, 10); ImageSpriteBackGround = sprite; scriptAPI.__backGroundImagePath = null; } if (scriptAPI.__bgmPath != null) { var bgm = new Emugen.Sound.SoundPlayer(scriptAPI.__bgmPath, 0.20f, true, Emugen.Sound.SoundPlayer.SoundType.BGM); scriptAPI.__bgmPath = null; } if (scriptAPI.__playSE != null) { var se = new Emugen.Sound.SoundPlayer(scriptAPI.__playSE, scriptAPI.__playSEVolume, false, Emugen.Sound.SoundPlayer.SoundType.SE); scriptAPI.__playSE = null; } } } }
List <Data.Character> retrayPlayerCaracters; // リトライ時の記録・再現用 public BattleScene(string scriptPath) { scriptAPI = new ScriptAPI(); script = new Emugen.Script.Script <ScriptAPI>(scriptPath, scriptAPI); script.Run(); var data = Data.DataCreater.Instance; if (scriptAPI.__bgmPath != null) { var bgm = new Emugen.Sound.SoundPlayer(scriptAPI.__bgmPath, 0.20f, true, Emugen.Sound.SoundPlayer.SoundType.BGM); } SetupPlayers(); SetupEnemys(); { PlayerCards = new UI.PlayerCard.PlayerCards(); layer.Add(PlayerCards, 30); } { EnemyCards = new UI.EnemyCard.EnemyCards(); layer.Add(EnemyCards, 20); } { var bmp = new System.Drawing.Bitmap(scriptAPI.__backGroundImagePath); var texture = new Texture(bmp); var w = 1600; var h = (int)((double)bmp.Height / (double)bmp.Width * w); var sprite = new ImageSprite(texture, new Rect(new Vector2D(0, 0), new Vector2D(w, h)), new Color(1, 1, 1, 1)); layer.Add(sprite, 10); } { var skillCards = new UI.SkillCard.SkillCards(); layer.Add(skillCards, 40); SkillCards = skillCards; } { var sprite = new PlaneSprite(new Rect(new Vector2D(20, 100), new Vector2D(200, 1)), new Color(0.5, 1, 1, 1)); layer.Add(sprite, 10); } { foreach (var chara in data.playerCharacters) { PlayerCards.Add(chara); } PlayerCards.SetupCardPos(); } SetupEnemysCard(); { PlayerCards.OnSelected += (selectCards) => { switch (uiStep) { case UIStep.None: { var i = (List <UI.PlayerCard.PlayerCard>)selectCards; if (i[0].character.HP.Now == 0) { // 戦闘不能 } else { SkillCards.SetStep(UI.SkillCard.SkillCards.Step.ShowPlayerCharacterSkills, i[0].character); var soundPlayer = new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UISelect01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); uiStep = UIStep.SkillSelect; SelectPlayerCard = selectCards[0]; } } break; case UIStep.SkillSelect: break; case UIStep.SkillTargetSelect: if (!isInputEventNowFrame) { isInputEventNowFrame = true; new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UISelect01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); uiStep = UIStep.None; EnemyCards.uITargetSelectType = UI.EnemyCard.EnemyCards.UITargetSelectType.None; PlayerCards.uITargetSelectType = UI.PlayerCard.PlayerCards.UITargetSelectType.None; var i = (List <UI.PlayerCard.PlayerCard>)selectCards; //var i = (List<FafTk.UI.EnemyCard.EnemyCard>)selectCards; var targetCharacters = new List <Data.Character>(); foreach (var j in i) { targetCharacters.Add(j.character); } SelectPlayerCard.character.Action(SelectSkillCard.actionSkill, targetCharacters); } break; } }; } { SkillCards.OnSelected += (selectCard) => { switch (uiStep) { case UIStep.None: break; case UIStep.SkillSelect: if (!isInputEventNowFrame) { isInputEventNowFrame = true; var soundPlayer = new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UISelect01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); uiStep = UIStep.SkillTargetSelect; SelectSkillCard = selectCard; if (SelectSkillCard.actionSkill.Main.TargetWord.IndexOf("横列") == 0) { var command = SelectSkillCard.actionSkill.Main.TargetWord.Split(' '); EnemyCards.uITargetSelectType = UI.EnemyCard.EnemyCards.UITargetSelectType.LineHorizontal; EnemyCards.uITargetSelectTypePalams = new int[] { int.Parse(command[1]), int.Parse(command[2]), int.Parse(command[3]) }; PlayerCards.uITargetSelectType = UI.PlayerCard.PlayerCards.UITargetSelectType.LineHorizontal; PlayerCards.uITargetSelectTypePalams = new int[] { int.Parse(command[1]), int.Parse(command[2]), int.Parse(command[3]) }; } else { var command = SelectSkillCard.actionSkill.Main.TargetWord.Split(' '); EnemyCards.uITargetSelectType = UI.EnemyCard.EnemyCards.UITargetSelectType.One; EnemyCards.uITargetSelectTypePalams = new int[] { int.Parse(command[1]) }; PlayerCards.uITargetSelectType = UI.PlayerCard.PlayerCards.UITargetSelectType.One; PlayerCards.uITargetSelectTypePalams = new int[] { int.Parse(command[1]) }; } } break; case UIStep.SkillTargetSelect: break; } }; SkillCards.OnClose += () => { switch (uiStep) { case UIStep.None: break; case UIStep.SkillSelect: if (!isInputEventNowFrame) { isInputEventNowFrame = true; var soundPlayer = new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UICancel01, 0.15f, false, Emugen.Sound.SoundPlayer.SoundType.SE); uiStep = UIStep.None; EnemyCards.uITargetSelectType = UI.EnemyCard.EnemyCards.UITargetSelectType.None; PlayerCards.uITargetSelectType = UI.PlayerCard.PlayerCards.UITargetSelectType.None; } break; case UIStep.SkillTargetSelect: break; } }; } { EnemyCards.OnSelected += (selectCards) => { switch (uiStep) { case UIStep.None: break; case UIStep.SkillSelect: break; case UIStep.SkillTargetSelect: if (!isInputEventNowFrame) { isInputEventNowFrame = true; uiStep = UIStep.None; EnemyCards.uITargetSelectType = UI.EnemyCard.EnemyCards.UITargetSelectType.None; PlayerCards.uITargetSelectType = UI.PlayerCard.PlayerCards.UITargetSelectType.None; //var result = false; var targetCharacters = new List <Character>(); var i = (List <UI.EnemyCard.EnemyCard>)selectCards; foreach (var j in i) { targetCharacters.Add(j.character); } var result = SelectPlayerCard.character.Action(SelectSkillCard.actionSkill, targetCharacters); if (result) { new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UISelect01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); } else { new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UICancel01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); } } break; } }; } }
public void Update() { if (HP.Now == 0) { return; } elementTimer++; if (elementTimer >= elementTimerMax) { elementTimer = 0; var elements = ElementLing.NextElements(); if (elements != null) { if (true) { var soundPlayer = new Emugen.Sound.SoundPlayer("data/se/システム音4(1秒).mp3", 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); } foreach (var element in elements) { Elements.Add(element); if (playerCard != null) { playerCard.AddElement(element); } if (enemyCard != null) { enemyCard.AddElement(element); } } var elementOver = Elements.Count - 5; if (elementOver > 0) { for (var i = 0; i < elementOver; i++) { Elements.RemoveAt(0); if (playerCard != null) { playerCard.RemoveElement(0); } if (enemyCard != null) { enemyCard.RemoveElement(0); } } } } } // 敵である場合のAI処理 if (enemyCard != null) { if ((Elements.Count > 0) && (!DataCreater.Instance.IsPlayerCharacterAllDead())) { ActionSkill targetAction = null; foreach (var action in Actions) { if (Element.IsUsable(Elements, action.Cost)) { targetAction = action; } } if (targetAction != null) { if (targetAction.Main.TargetWord.IndexOf("横列") == 0) { // 範囲攻撃 var targetCharacters = new List <Character>(); foreach (var i in DataCreater.Instance.playerCharacters) { targetCharacters.Add(i); } Action(targetAction, targetCharacters); } else { // todo : パーティメンバーの前半を優先する… var j = random.Next(DataCreater.Instance.playerCharacters.Count); var targetCharacter = DataCreater.Instance.playerCharacters[j]; while (targetCharacter.HP.Now <= 0) { j = random.Next(DataCreater.Instance.playerCharacters.Count); targetCharacter = DataCreater.Instance.playerCharacters[j]; } var targetCharacters = new List <Character>(); targetCharacters.Add(targetCharacter); Action(targetAction, targetCharacters); } } } } }
public override void Update() { isInputEventNowFrame = false; //uiStep switch (uiStep) { case UIStep.None: break; case UIStep.SkillSelect: break; case UIStep.SkillTargetSelect: { if ((InputCore.Instance.GetKeyEventType(InputCore.KeyEventCode.MouseRightButton) == InputCore.KeyEventType.Up)) { if (!isInputEventNowFrame) { isInputEventNowFrame = true; uiStep = UIStep.None; new Emugen.Sound.SoundPlayer(MainConfig.SoundEffect.UICancel01, 0.10f, false, Emugen.Sound.SoundPlayer.SoundType.SE); } } } break; } if (battleStep == BattleStep.Main) { Data.DataCreater.Instance.Update(); // 行動シンボルの増加を戦闘中のみに限定するためのif文 } SkillCards.Update(); PlayerCards.Update(); EnemyCards.Update(); switch (battleStep) { case BattleStep.Main: if (actionTimer == 0) { Action action = null; Data.Character character = null; foreach (var i in DataCreater.Instance.playerCharacters) { if (i.ActionStock != null) { action = i.ActionStock; character = i; } } foreach (var i in DataCreater.Instance.enemyCharacters) { if (i.ActionStock != null) { action = i.ActionStock; character = i; } } if (action != null) { action(); character.ActionStock = null; } actionTimer = actionTimerMax; } else { actionTimer--; } if (EnemyCards.Count == 0) { battleStep = BattleStep.End; var bgm = new Emugen.Sound.SoundPlayer(Config.MainConfig.BattleScene.BGMStageClear, 0.20f, true, Emugen.Sound.SoundPlayer.SoundType.BGM); } else if (DataCreater.Instance.IsPlayerCharacterAllDead()) { battleStep = BattleStep.LostClickWait; var choice = new UI.Talk.Choice(new string[] { "もう一度戦う", "タイトルに戻る" }); layer.Add(choice, 200); LostClickWaitChoice = choice; var bgm = new Emugen.Sound.SoundPlayer(Config.MainConfig.BattleScene.BGMGameOver, 0.20f, true, Emugen.Sound.SoundPlayer.SoundType.BGM); } else { var data = Data.DataCreater.Instance; var tmp = new List <Data.Character>(); foreach (var i in data.enemyCharacters.Where(x => x.HP.Now <= 0)) { tmp.Add(i); } foreach (var i in tmp) { EnemyCards.Del(i.enemyCard); data.enemyCharacters.Remove(i); } } break; case BattleStep.LostClickWait: { LostClickWaitChoice.Update(); var input = Emugen.Input.InputCore.Instance; if ((input.GetKeyEventType(Emugen.Input.InputCore.KeyEventCode.MouseLeftButton) == Emugen.Input.InputCore.KeyEventType.Up)) { var tmp = LostClickWaitChoice.GetChoiseText(); switch (tmp) { case "もう一度戦う": { var data = Data.DataCreater.Instance; var i = 0; foreach (var v in retrayPlayerCaracters) { var chara = data.playerCharacters[i]; chara.HP.Now = v.HP.Now; chara.elementTimer = v.elementTimer; chara.ElementLing.pos = v.ElementLing.pos; chara.Elements.Clear(); foreach (var element in v.Elements) { chara.Elements.Add(new Element(element.Name)); } i++; } WindowManager.nextScene = new Scene.BattleScene(this.script.Path); } break; case "タイトルに戻る": { WindowManager.nextScene = new Scene.TitleScene(); } break; } } } break; case BattleStep.End: { var input = Emugen.Input.InputCore.Instance; if ((input.GetKeyEventType(Emugen.Input.InputCore.KeyEventCode.MouseLeftButton) == Emugen.Input.InputCore.KeyEventType.Up)) { WindowManager.nextScene = new Scene.TalkScene(scriptAPI.__nextTalkScriptPath); } } break; } }
public void Update() { switch (step) { case Step.None: { var mouse = Emugen.Input.InputCore.Instance.mousePosition; //if (((position.X <= mouse.X) && (mouse.X < (position.X + size.X))) && // ((position.Y <= mouse.Y) && (mouse.Y < (position.Y + size.Y)))) if (mySprites.mouseOn.Rect.IsHit(mouse)) { if (!isMouseOn) { isMouseOn = true; mySprites.mouseOn.IsDraw = true; } } else { if (isMouseOn) { isMouseOn = false; mySprites.mouseOn.IsDraw = false; } } if (damageTimer != -1) { damageTimer++; if (damageTimerMax < damageTimer) { damageTimer = -1; } SetPosition(position); // Todo : 毎アップデート時に呼び出さないといけない? } { var val = (double)character.HP.Now / (double)character.HP.Max; mySprites.hpBar.Rect.Size.X = HPBarFrameWidth * val; } } break; case Step.Lost: { { var val = (double)character.HP.Now / (double)character.HP.Max; mySprites.hpBar.Rect.Size.X = HPBarFrameWidth * val; } mySprites.mouseOn.IsDraw = false; stepTimer++; if (damageTimer != -1) { damageTimer++; if (damageTimerMax < damageTimer) { damageTimer = -1; } SetPosition(position); // Todo : 毎アップデート時に呼び出さないといけない? } var soundTime = 10.0; var EndWaitTime = 15.0; if (stepTimer >= 10) { var v = 1.0 - (stepTimer - soundTime) / EndWaitTime; mySprites.face.Color.A = v; mySprites.shadow.Color.A = v; mySprites.hpBarFrame.Color.A = v; mySprites.hpBar.Color.A = v; } if (stepTimer == soundTime) { var s = new Emugen.Sound.SoundPlayer(Config.MainConfig.BattleScene.SoundEffectCharacterKO, 0.6f, false, Emugen.Sound.SoundPlayer.SoundType.SE); } else if (stepTimer >= (soundTime + EndWaitTime)) { isLost = true; } } break; } if (actionEffectUpdate != null) { SetPosition(position); } if (mouseOnTarget.IsDraw) { var max = 30.0; mouseOnTarget.Color.A = Math.Sin((double)mouseOnTargetFadeTimer * 360 / max * Math.PI / 180) * 0.5 + 0.5; mouseOnTargetFadeTimer++; if (mouseOnTargetFadeTimer > max) { mouseOnTargetFadeTimer = 0; } } autoDisposer.Update(); }