/// <summary> /// Force to close all block-type tag /// </summary> /// <param name="selector"></param> /// <param name="adjuster"></param> /// <param name="judge"></param> /// <param name="pBattle"></param> private static void ForceCloseAllBlockTag(PSelector selector, PGameValuesAdjuster adjuster, PJudge judge, PBattle battle) { if (null != selector) { selector = null; } if (null != adjuster) { adjuster = null; } if (null != judge) { judge = null; } if (null != battle) { battle = null; } }
public static GalgameScript KsScriptToGalgameScript(List <KsScriptLine> ksScript) { if (null == ksScript || ksScript.Count == 0) { return(null); } //if (null == GalgameScriptTags) GalgameScriptTags = Enum.GetNames(typeof(GalgameKsScriptTag)); GalgameScript galgameScript = new GalgameScript(); List <GalgameAction> galgameActions = new List <GalgameAction>(); GalgameAction galgameAction = null; PSelector nowSelector = null; PSelectorOption nowSelectorOption = null; PGameValuesAdjuster nowAdjuster = null; PJudge nowJudge = null; PBattle nowBattle = null; List <GameValues> groupStack = new List <GameValues>(); bool isWrappedByActionTag = false; foreach (KsScriptLine ksScriptLine in ksScript) { /** * TODO: * 2. 调研转换效果 transform */ GalgameKsScriptTag tag = ksScriptLine.tag; // if no such tag, just skip if (!Enum.IsDefined(typeof(GalgameKsScriptTag), tag)) { continue; } string tagNameT = Enum.GetName(typeof(GalgameKsScriptTag), GalgameKsScriptTag.BG); // value of tag string tagName = Enum.GetName(typeof(GalgameKsScriptTag), tag); int tagValue = (int)tag; int tagType = Mathf.FloorToInt(tagValue / 100); // properties on tag List <KsScriptLineProperty> props = ksScriptLine.props; GalgameKsScriptTagProperty ksTagProperty = new GalgameKsScriptTagProperty(); // if is a empty tag if (props.Count == 0) { switch (tag) { case GalgameKsScriptTag.SELECT: nowSelector = null; continue; case GalgameKsScriptTag.OPTION: nowSelector.Options.Add(nowSelectorOption); nowSelectorOption = null; continue; case GalgameKsScriptTag.ACTION: isWrappedByActionTag = false; break; case GalgameKsScriptTag.ADJUSTER: nowAdjuster = null; continue; case GalgameKsScriptTag.JUDGE: nowJudge = null; continue; case GalgameKsScriptTag.BATTLE: nowBattle = null; continue; case GalgameKsScriptTag.GROUP: if (groupStack.Count > 0) { if (null != nowJudge) { nowJudge.MeetGameValues.Add(groupStack.Last()); } groupStack.Remove(groupStack.Last()); } continue; } } ; // Global property tags switch (tagType) { case 0: switch (tag) { case GalgameKsScriptTag.STYLE: foreach (KsScriptLineProperty prop in props) { string propName = prop.name.ToLower(); string propValue = prop.value.Trim(); // Set properties switch (propName) { case "width": DefaultScriptProperty.width = Convert.ToSingle(propValue); break; case "height": DefaultScriptProperty.height = Convert.ToSingle(propValue); break; case "top": DefaultScriptProperty.top = Convert.ToSingle(propValue); break; case "left": DefaultScriptProperty.left = Convert.ToSingle(propValue); break; case "visible": DefaultScriptProperty.visible = Convert.ToBoolean(propValue); break; case "layer": DefaultScriptProperty.layer = (Layer)Enum.Parse(typeof(Layer), propValue.ToUpper()); break; case "method": DefaultScriptProperty.method = propValue; break; case "canskip": DefaultScriptProperty.canskip = Convert.ToBoolean(propValue); break; case "time": DefaultScriptProperty.time = Convert.ToInt32(propValue); break; case "linespacing": DefaultScriptProperty.linespacing = Convert.ToSingle(propValue); break; case "align": DefaultScriptProperty.align = (Align)Enum.Parse(typeof(Align), propValue.ToUpper()); break; case "fcolor": DefaultScriptProperty.fcolor = propValue; break; case "fsize": DefaultScriptProperty.fsize = Convert.ToSingle(propValue); break; case "fstyle": DefaultScriptProperty.fstyle = (FontStyle)Enum.Parse(typeof(FontStyle), propValue); break; case "ffamily": DefaultScriptProperty.ffamily = propValue; break; } } break; case GalgameKsScriptTag.TRAN: break; case GalgameKsScriptTag.POS: break; case GalgameKsScriptTag.EFFECT: break; default: break; } break; default: foreach (KsScriptLineProperty prop in props) { string propName = prop.name.ToLower(); string propValue = prop.value.Trim(); // Set properties switch (propName) { case "id": ksTagProperty.id = propValue; break; case "nextactionid": ksTagProperty.next_action_id = propValue; break; case "previousactionid": ksTagProperty.previous_action_id = propValue; break; case "tag": ksTagProperty.tag = propValue; break; case "name": ksTagProperty.name = propValue; break; case "value": ksTagProperty.value = propValue; break; case "width": ksTagProperty.width = Convert.ToSingle(propValue); break; case "height": ksTagProperty.height = Convert.ToSingle(propValue); break; case "top": ksTagProperty.top = Convert.ToSingle(propValue); break; case "left": ksTagProperty.left = Convert.ToSingle(propValue); break; case "visible": ksTagProperty.visible = Convert.ToBoolean(propValue); break; case "layer": ksTagProperty.layer = (Layer)Enum.Parse(typeof(Layer), propValue.ToUpper()); if (GalgameKsScriptTag.BG == tag) { ksTagProperty.bg_layer = ksTagProperty.layer; } if (GalgameKsScriptTag.FG == tag) { ksTagProperty.fg_layer = ksTagProperty.layer; } break; case "method": ksTagProperty.method = propValue; break; case "canskip": ksTagProperty.canskip = Convert.ToBoolean(propValue); break; case "time": ksTagProperty.time = Convert.ToInt32(propValue); break; case "linespacing": ksTagProperty.linespacing = Convert.ToSingle(propValue); break; case "align": ksTagProperty.align = (Align)Enum.Parse(typeof(Align), propValue.ToUpper()); break; case "fcolor": ksTagProperty.fcolor = propValue; break; case "fsize": ksTagProperty.fsize = Convert.ToSingle(propValue); break; case "fstyle": ksTagProperty.fstyle = (FontStyle)Enum.Parse(typeof(FontStyle), propValue); break; case "ffamily": ksTagProperty.ffamily = propValue; break; case "src": if (GalgameKsScriptTag.BG == tag) { ksTagProperty.bgsrc = propValue; } if (GalgameKsScriptTag.FG == tag) { ksTagProperty.fgsrc = propValue; } if (GalgameKsScriptTag.BGM == tag) { ksTagProperty.bgmsrc = propValue; } if (GalgameKsScriptTag.VIDEO == tag) { ksTagProperty.videosrc = propValue; } // tagName = null; break; case "volume": ksTagProperty.volume = Convert.ToSingle(propValue); break; case "loop": ksTagProperty.loop = Convert.ToBoolean(propValue); break; case "action": ksTagProperty.action = propValue; break; case "actor": ksTagProperty.actor = propValue; break; case "voice": ksTagProperty.voice = propValue; break; case "line": ksTagProperty.line = propValue; break; case "anim": ksTagProperty.anim = propValue; break; case "type": if (GalgameKsScriptTag.SELECT == tag) { ksTagProperty.selector_type = propValue; } // if ("SELECT".Equals(tagName)) ksTagProperty.selector_type = propValue; break; case "text": if (GalgameKsScriptTag.SELECT == tag) { ksTagProperty.selector_text = propValue; } if (GalgameKsScriptTag.OPTION == tag) { ksTagProperty.option_text = propValue; } // if ("SELECT".Equals(tagName)) ksTagProperty.selector_text = propValue; // if ("OPTION".Equals(tagName)) ksTagProperty.option_text = propValue; break; case "bg": if (GalgameKsScriptTag.SELECT == tag) { ksTagProperty.selector_bg = propValue; } if (GalgameKsScriptTag.OPTION == tag) { ksTagProperty.option_bg = propValue; } if (GalgameKsScriptTag.LINE == tag) { ksTagProperty.line_bg = propValue; } // if ("SELECT".Equals(tagName)) ksTagProperty.selector_bg = propValue; // if ("OPTION".Equals(tagName)) ksTagProperty.option_bg = propValue; // if ("LINE".Equals(tagName)) ksTagProperty.line_bg = propValue; break; case "bgm": if (GalgameKsScriptTag.SELECT == tag) { ksTagProperty.selector_bgm = propValue; } if (GalgameKsScriptTag.OPTION == tag) { ksTagProperty.option_bgm = propValue; } if (GalgameKsScriptTag.LINE == tag) { ksTagProperty.line_bgm = propValue; } //if ("SELECT".Equals(tagName)) ksTagProperty.selector_bgm = propValue; //if ("OPTION".Equals(tagName)) ksTagProperty.option_bgm = propValue; //if ("LINE".Equals(tagName)) ksTagProperty.line_bgm = propValue; break; } } if (tagType == 1) { if (GalgameKsScriptTag.CHS.Equals(tag)) { if (null != ksTagProperty.bgmsrc) { galgameScript.Bgm = (AudioClip)Resources.Load("Audio/" + ksTagProperty.bgmsrc, typeof(AudioClip)); } if (null != ksTagProperty.bgsrc) { galgameScript.Bg = (Sprite)Resources.Load("Sprite/" + ksTagProperty.bgsrc, typeof(Sprite)); } if (null != ksTagProperty.name) { galgameScript.ChapterName = ksTagProperty.name; } if (null != ksTagProperty.value) { galgameScript.ChapterAbstract = ksTagProperty.value; } } continue; } // if (null == galgameAction) galgameAction = new GalgameAction(); if (BLOCK_TYPE_TAGS.Contains(tag)) { ForceCloseAllBlockTag(nowSelector, nowAdjuster, nowJudge, nowBattle); // If these block-type elements are not wrapped by [action] tag, generate a new action autoly if (!isWrappedByActionTag) { galgameAction = new GalgameAction(); } } switch (tag) { case GalgameKsScriptTag.ACTION: if (props.Count > 0) { isWrappedByActionTag = true; galgameAction = new GalgameAction(); } break; case GalgameKsScriptTag.SELECT: if (!string.IsNullOrEmpty(ksTagProperty.selector_type)) { nowSelector = new PSelector() { Id = ksTagProperty.id, Type = (SelectorType)Enum.Parse(typeof(SelectorType), ksTagProperty.selector_type.ToUpper()) }; nowSelector.IsSelected = false; nowSelector.SelectedItem = -1; nowSelector.Options = new List <PSelectorOption>(); galgameAction.Selector = nowSelector; } break; case GalgameKsScriptTag.ADJUSTER: nowAdjuster = new PGameValuesAdjuster() { Id = ksTagProperty.id }; nowAdjuster.DeltaGameValues = new GameValues() { RoleAbility = new RoleAbility(), RoleStatus = new RoleStatus() }; galgameAction.GameValuesAdjuster = nowAdjuster; break; case GalgameKsScriptTag.JUDGE: if (!string.IsNullOrEmpty(ksTagProperty.next_action_id)) { nowJudge = new PJudge() { Id = ksTagProperty.id, NextActionId = ksTagProperty.next_action_id }; nowJudge.MeetGameValues = new List <GameValues>(); galgameAction.Judge = nowJudge; } break; case GalgameKsScriptTag.BATTLE: nowBattle = new PBattle() { Id = ksTagProperty.id }; galgameAction.Battle = nowBattle; break; case GalgameKsScriptTag.GROUP: groupStack.Add(new GameValues() { RoleAbility = new RoleAbility(), RoleStatus = new RoleStatus() }); break; } if (null != nowSelector && GalgameKsScriptTag.OPTION.Equals(tag)) { nowSelectorOption = new PSelectorOption(); nowSelectorOption.Actions = new List <GalgamePlainAction>(); nowSelectorOption.DeltaGameValues = new GameValues(); nowSelectorOption.Bg = (Sprite)Resources.Load("Sprite/" + ksTagProperty.option_bg, typeof(Sprite)); nowSelectorOption.Bgm = (AudioClip)Resources.Load("Audio/" + ksTagProperty.option_bgm, typeof(AudioClip)); nowSelectorOption.Text = new PText() { text = ksTagProperty.option_text.Trim(), ffamily = ksTagProperty.ffamily, fcolor = ksTagProperty.fcolor, fsize = ksTagProperty.fsize, linespacing = ksTagProperty.linespacing, align = ksTagProperty.align, fstyle = ksTagProperty.fstyle }; } if (GalgameKsScriptTag.PAIR == tag) { if (null != nowSelectorOption && !string.IsNullOrEmpty(ksTagProperty.name) && !string.IsNullOrEmpty(ksTagProperty.value)) { EntityUtil.SetDeepValue(nowSelectorOption.DeltaGameValues, ksTagProperty.name, ksTagProperty.value); } if (null != nowAdjuster && !string.IsNullOrEmpty(ksTagProperty.name) && !string.IsNullOrEmpty(ksTagProperty.value)) { EntityUtil.SetDeepValue(nowAdjuster.DeltaGameValues, ksTagProperty.name, ksTagProperty.value); } if (null != nowJudge && !string.IsNullOrEmpty(ksTagProperty.name) && !string.IsNullOrEmpty(ksTagProperty.value)) { EntityUtil.SetDeepValue(groupStack.Last(), ksTagProperty.name, ksTagProperty.value); } } if (null != galgameAction) { if (null != ksTagProperty.line) { galgameAction.Lines.Add(new GalgameScriptLine() { text = ksTagProperty.line, ffamily = ksTagProperty.ffamily, fcolor = ksTagProperty.fcolor, fsize = ksTagProperty.fsize, linespacing = ksTagProperty.linespacing, align = ksTagProperty.align, fstyle = ksTagProperty.fstyle }); if (null == galgameAction.Line) { galgameAction.Line = galgameAction.Lines[0]; } } if (!string.IsNullOrEmpty(ksTagProperty.id) && GalgameKsScriptTag.ACTION == tag) { galgameAction.Id = ksTagProperty.id.Trim(); } if (!string.IsNullOrEmpty(ksTagProperty.previous_action_id) && GalgameKsScriptTag.ACTION == tag) { galgameAction.PreviousActionId = ksTagProperty.previous_action_id.Trim(); } if (!string.IsNullOrEmpty(ksTagProperty.next_action_id) && GalgameKsScriptTag.ACTION == tag) { galgameAction.NextActionId = ksTagProperty.next_action_id.Trim(); } if (null != ksTagProperty.videosrc) { galgameAction.Video = (VideoClip)Resources.Load("Video/" + ksTagProperty.videosrc, typeof(VideoClip)); } if (null != ksTagProperty.bgmsrc) { galgameAction.Bgm = (AudioClip)Resources.Load("Audio/" + ksTagProperty.bgmsrc, typeof(AudioClip)); } if (null != ksTagProperty.voice) { galgameAction.Voice = (AudioClip)Resources.Load("Audio/" + ksTagProperty.voice, typeof(AudioClip)); } if (null != ksTagProperty.bgsrc) { galgameAction.Background = (Sprite)Resources.Load("Sprite/" + ksTagProperty.bgsrc, typeof(Sprite)); } // A BG and BGM set int line property have a higher priority than set in tag [bg] and [bgm] if (null != ksTagProperty.line_bg) { galgameAction.Background = (Sprite)Resources.Load("Sprite/" + ksTagProperty.line_bg, typeof(Sprite)); } if (null != ksTagProperty.line_bgm) { galgameAction.Bgm = (AudioClip)Resources.Load("Audio/" + ksTagProperty.line_bgm, typeof(AudioClip)); } if (null != ksTagProperty.actor) { galgameAction.Actor = (Actor)Enum.Parse(typeof(Actor), ksTagProperty.actor); } if (null != ksTagProperty.anim) { galgameAction.ActorAnimation = ksTagProperty.anim; } galgameAction.BgLayer = ksTagProperty.bg_layer; galgameAction.FgLayer = ksTagProperty.fg_layer; if (null != nowSelector && null != nowSelectorOption) { if (galgameAction.Actor != Actor.NULL) { nowSelectorOption.Actions.Add(new GalgamePlainAction() { Actor = galgameAction.Actor, ActorAnimation = galgameAction.ActorAnimation, Background = galgameAction.Background, Bgm = galgameAction.Bgm, Line = galgameAction.Line, Video = galgameAction.Video, Voice = galgameAction.Voice, Input = galgameAction.Input }); } } else if (null != galgameAction && !NOT_ACTION_TAGS.Contains(tag) && !isWrappedByActionTag) { galgameActions.Add(galgameAction); galgameAction = null; } } break; } } if (null != galgameActions) { galgameScript.GalgameActions = galgameActions; } return(galgameScript); }