public void Day19_MonsterMessages_Part1_Ok() { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Data.txt"); Assert.Equal(634, lines.Length); var sut = new MonsterMessage(lines.Take(131).ToArray()); Assert.Equal(131, sut.Rules.Count); var messages = lines.Skip(132).Take(510).ToArray(); Assert.Equal(502, messages.Length); string exp = sut.MakeRegexForRule(0); int count = 0; foreach (var msg in messages) { var rg = Regex.Match(msg, exp); if (rg.Success) { count++; } } Assert.Equal(299, count); }
public void Day19_Example_Part2_NoNewRule_Ok() { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Part2DataExample.txt"); Assert.Equal(47, lines.Length); var sut = new MonsterMessage(lines.Take(31).ToArray()); Assert.Equal(31, sut.Rules.Count); var messages = lines.Skip(32).Take(14).ToArray(); Assert.Equal(14, messages.Length); string exp = sut.MakeRegexForRule(0); int count = 0; foreach (var msg in messages) { var rg = Regex.Match(msg, exp); if (rg.Success) { count++; } } Assert.Equal(3, count); }
public void Day19_MonsterMessages_NewParts_Ok() { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Data.txt"); Assert.Equal(634, lines.Length); var sut = new MonsterMessage(lines.Take(131).ToArray()); Assert.Equal(131, sut.Rules.Count); sut.ReplaceRule("8: 42 | 42 8"); sut.ReplaceRule("11: 42 31 | 42 11 31"); sut.isPart2 = true; string exp42 = sut.MakeRegexForRule(42); Assert.NotEmpty(exp42); string exp31 = sut.MakeRegexForRule(31); Assert.NotEmpty(exp31); string exp8 = sut.MakeRegexForRule(8); Assert.NotEmpty(exp8); string exp11 = sut.MakeRegexForRule(11); Assert.NotEmpty(exp11); }
public void Day19_Example_WithNewRules_Ok() { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Part2DataExample.txt"); Assert.Equal(47, lines.Length); var sut = new MonsterMessage(lines.Take(31).ToArray()); Assert.Equal(31, sut.Rules.Count); sut.ReplaceRule("8: 42 | 42 8"); sut.ReplaceRule("11: 42 31 | 42 11 31"); var messages = lines.Skip(32).Take(15).ToArray(); Assert.Equal(15, messages.Length); sut.isPart2 = true; string exp = sut.MakeRegexForRule(0); int count = 0; foreach (var msg in messages) { var rg = Regex.Match(msg, exp); if (rg.Success) { count++; } } Assert.Equal(12, count); }
public void AddText(DynValue text) { CheckExists(); // Checks if the parameter given is valid if (text == null || (text.Type != DataType.Table && text.Type != DataType.String)) { throw new CYFException("Text.AddText: the text argument must be a non-empty array of strings or a simple string."); } // Converts the text argument into a table if it's a simple string text = text.Type == DataType.String ? DynValue.NewTable(null, new DynValue[1] { text }) : text; if (AllLinesComplete()) { SetText(text); return; } TextMessage[] msgs = new TextMessage[text.Table.Length]; for (int i = 0; i < text.Table.Length; i++) { msgs[i] = new MonsterMessage(text.Table.Get(i + 1).String); } AddToTextQueue(msgs); }
public override bool OnEnter() { mm = CurrCtrl.GetComponent <MonsterMessage>(); mm.bufferCtl = CurrCtrl.GetComponentInChildren <BufferController> (); if (CurrArgs.m_bUsePercent) { mm.my_HealState.AddHp((int)(CurrCtrl.GetComponentInChildren <HealthState> ().FullHp *CurrArgs.m_fValue1)); } else { mm.my_HealState.AddHp((int)(CurrArgs.m_fValue1)); } if (CurrArgs.m_bUsePercent) { CreateProp.createProp.SubBloodView(mm.my_HealState.GrowBlood, mm.monsterBody.transform.position + new Vector3(mm.beiji.PX, mm.beiji.PY, 0), Color.green, Vector3.zero, false, true); } else { CreateProp.createProp.SubBloodView(mm.my_HealState.GrowBlood, mm.monsterBody.transform.position + new Vector3(mm.beiji.PX, mm.beiji.PY, 0), Color.green, Vector3.zero, false, true); } if (CurrArgs.m_iBufferUI == 1) { healBuff = Resources.Load("MonsterResources/MonsterBuffs/MonsterHealBuff") as GameObject; GameObject temp1 = GameObject.Instantiate(healBuff, CurrCtrl.GetComponent <MonsterMessage> ().monsterFoot.transform.position, Quaternion.identity) as GameObject; if (CurrCtrl.transform.rotation.y != 0f) { temp1.transform.rotation = new Quaternion(0f, 180f, 0f, 0f); } temp1.transform.localScale = new Vector3(mm.bufferCtl.buffScale * CurrArgs.m_fValue2, mm.bufferCtl.buffScale * CurrArgs.m_fValue2, 1f); temp1.transform.position = new Vector3(temp1.transform.position.x + mm.bufferCtl.xDis, temp1.transform.position.y + mm.bufferCtl.yDis, temp1.transform.position.z); temp1.transform.SetParent(CurrCtrl.GetComponent <MonsterMessage> ().monsterFoot.transform); GameObject.Destroy(temp1, 3f); } return(true); }
public void Day19_ReadData_Ok() { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Data.txt"); Assert.Equal(634, lines.Length); var sut = new MonsterMessage(lines.Take(131).ToArray()); Assert.Equal(131, sut.Rules.Count); }
public void AddText(DynValue text) { if (AllLinesComplete()) { SetText(text); return; } TextMessage[] msgs = new TextMessage[text.Table.Length]; for (int i = 0; i < text.Table.Length; i++) { msgs[i] = new MonsterMessage(text.Table.Get(i + 1).String); } base.AddToTextQueue(msgs); }
public void Day19_Example_WithNewRulesSingle_Ok(string msg, bool expected) { var lines = DailyDataUtilities.ReadLinesFromFile("Day19Part2DataExample.txt"); Assert.Equal(47, lines.Length); var sut = new MonsterMessage(lines.Take(31).ToArray()); Assert.Equal(31, sut.Rules.Count); sut.ReplaceRule("8: 42 | 42 8"); sut.ReplaceRule("11: 42 31 | 42 11 31"); sut.isPart2 = true; string exp = sut.MakeRegexForRule(0); var rg = Regex.Match(msg, exp); Assert.Equal(expected, rg.Success); }
public void Day19_Example2_OK() { var rules = new string[] { "0: 4 1 5", "1: 2 3 | 3 2", "2: 4 4 | 5 5", "3: 4 5 | 5 4", "4: a", "5: b" }; var msgs = new string[] { "ababbb", "bababa", "abbbab", "aaabbb", "aaaabbb" }; var sut = new MonsterMessage(rules); Assert.Equal(6, sut.Rules.Count); string exp = sut.MakeRegexForRule(0); Assert.NotNull(exp); int count = 0; foreach (var msg in msgs) { var rg = Regex.Match(msg, exp); if (rg.Success) { count++; } } Assert.Equal(2, count); }
public void Day19_Example1_OK(string msg, bool expected) { var rules = new string[] { "0: 1 2", "1: a", "2: 1 3 | 3 1", "3: b" }; var sut = new MonsterMessage(rules); Assert.Equal(4, sut.Rules.Count); string exp = sut.MakeRegexForRule(0); Assert.NotNull(exp); var rg = Regex.Match(msg, exp); Assert.Equal(expected, rg.Success); }
public void SwitchState(UIState state) { //Pre-state if (parentStateCall) { parentStateCall = false; encounter.script.Call("EnteringState", new DynValue[] { DynValue.NewString(state.ToString()), DynValue.NewString(this.state.ToString()) }); parentStateCall = true; if (childStateCalled) { childStateCalled = false; return; } } else { childStateCalled = true; } // TODO Quick and dirty addition to add some humor to the Run away command. // Will be removed without question. if (musicPausedFromRunning) { Camera.main.GetComponent <AudioSource>().UnPause(); musicPausedFromRunning = false; } // END DEBUG // below: actions based on ending a previous state, or actions that affect multiple states if (this.state == UIState.DEFENDING && state != UIState.DEFENDING) { encounter.endWave(); } if (state != UIState.ENEMYDIALOGUE && state != UIState.DEFENDING) { ArenaSizer.instance.Resize(ArenaSizer.UIWidth, ArenaSizer.UIHeight); PlayerController.instance.invulTimer = 0.0f; PlayerController.instance.setControlOverride(true); } if (this.state == UIState.ENEMYSELECT && action == Actions.FIGHT) { foreach (LifeBarController lbc in arenaParent.GetComponentsInChildren <LifeBarController>()) { Destroy(lbc.gameObject); } } if (state == UIState.DEFENDING || state == UIState.ENEMYDIALOGUE) { textmgr.destroyText(); PlayerController.instance.SetPosition(320, 160, false); PlayerController.instance.GetComponent <Image>().enabled = true; fightBtn.overrideSprite = null; actBtn.overrideSprite = null; itemBtn.overrideSprite = null; mercyBtn.overrideSprite = null; textmgr.setPause(true); } if (this.state == UIState.ENEMYDIALOGUE) { TextManager[] textmen = FindObjectsOfType <TextManager>(); foreach (TextManager textman in textmen) { if (textman.gameObject.name.StartsWith("DialogBubble")) // game object name is hardcoded as it won't change { Destroy(textman.gameObject); } } } this.state = state; switch (state) { case UIState.ATTACKING: textmgr.destroyText(); PlayerController.instance.GetComponent <Image>().enabled = false; fightUI.Init(encounter.enabledEnemies[selectedEnemy]); break; case UIState.ACTIONSELECT: PlayerController.instance.setControlOverride(true); PlayerController.instance.GetComponent <Image>().enabled = true; setPlayerOnAction(action); textmgr.setPause(ArenaSizer.instance.isResizeInProgress()); textmgr.setCaller(encounter.script); // probably not necessary due to ActionDialogResult changes textmgr.setText(new RegularMessage(encounter.EncounterText)); break; case UIState.ACTMENU: string[] actions = new string[encounter.enabledEnemies[selectedEnemy].ActCommands.Length]; for (int i = 0; i < actions.Length; i++) { actions[i] = encounter.enabledEnemies[selectedEnemy].ActCommands[i]; } selectedAction = 0; setPlayerOnSelection(selectedAction); textmgr.setText(new SelectMessage(actions, false)); break; case UIState.ITEMMENU: string[] items = getInventoryPage(0); selectedItem = 0; setPlayerOnSelection(0); textmgr.setText(new SelectMessage(items, false)); /*ActionDialogResult(new TextMessage[] { * new TextMessage("Can't open inventory.\nClogged with pasta residue.", true, false), * new TextMessage("Might also be a dog.\nIt's ambiguous.",true,false) * }, UIState.ENEMYDIALOG);*/ break; case UIState.MERCYMENU: selectedMercy = 0; string[] mercyopts = new string[1 + (encounter.CanRun ? 1 : 0)]; mercyopts[0] = "Spare"; foreach (EnemyController enemy in encounter.enabledEnemies) { if (enemy.CanSpare) { mercyopts[0] = "[starcolor:ffff00][color:ffff00]" + mercyopts[0] + "[color:ffffff]"; break; } } if (encounter.CanRun) { mercyopts[1] = "Flee"; } setPlayerOnSelection(0); textmgr.setText(new SelectMessage(mercyopts, true)); break; case UIState.ENEMYSELECT: string[] names = new string[encounter.enabledEnemies.Length]; string[] colorPrefixes = new string[names.Length]; for (int i = 0; i < encounter.enabledEnemies.Length; i++) { names[i] = encounter.enabledEnemies[i].Name; if (encounter.enabledEnemies[i].CanSpare) { colorPrefixes[i] = "[color:ffff00]"; } } textmgr.setText(new SelectMessage(names, true, colorPrefixes)); if (action == Actions.FIGHT) { int maxWidth = (int)initialHealthPos.x; for (int i = 0; i < encounter.enabledEnemies.Length; i++) { int mNameWidth = UnitaleUtil.fontStringWidth(textmgr.Charset, "* " + encounter.enabledEnemies[i].Name) + 50; if (mNameWidth > maxWidth) { maxWidth = mNameWidth; } } for (int i = 0; i < encounter.enabledEnemies.Length; i++) { LifeBarController lifebar = Instantiate(Resources.Load <LifeBarController>("Prefabs/HPBar")); lifebar.transform.SetParent(textmgr.transform); RectTransform lifebarRt = lifebar.GetComponent <RectTransform>(); lifebarRt.anchoredPosition = new Vector2(maxWidth, initialHealthPos.y - i * textmgr.Charset.LineSpacing); lifebarRt.sizeDelta = new Vector2(90, lifebarRt.sizeDelta.y); lifebar.setFillColor(Color.green); float hpFrac = (float)encounter.enabledEnemies[i].HP / (float)encounter.enabledEnemies[i].getMaxHP(); lifebar.setInstant(hpFrac); } } if (selectedEnemy >= encounter.enabledEnemies.Length) { selectedEnemy = 0; } setPlayerOnSelection(selectedEnemy * 2); // single list so skip right row by multiplying x2 break; case UIState.DEFENDING: ArenaSizer.instance.Resize((int)encounter.ArenaSize.x, (int)encounter.ArenaSize.y); PlayerController.instance.setControlOverride(false); encounter.nextWave(); // ActionDialogResult(new TextMessage("This is where you'd\rdefend yourself.\nBut the code was spaghetti.", true, false), UIState.ACTIONSELECT); break; case UIState.DIALOGRESULT: PlayerController.instance.GetComponent <Image>().enabled = false; break; case UIState.ENEMYDIALOGUE: PlayerController.instance.GetComponent <Image>().enabled = true; ArenaSizer.instance.Resize(155, 130); encounter.CallOnSelfOrChildren("EnemyDialogueStarting"); monDialogues = new TextManager[encounter.enabledEnemies.Length]; for (int i = 0; i < encounter.enabledEnemies.Length; i++) { string[] msgs = encounter.enabledEnemies[i].GetDefenseDialog(); if (msgs == null) { UserDebugger.warn("Entered ENEMYDIALOGUE, but no current/random dialogue was set for " + encounter.enabledEnemies[i].Name); SwitchState(UIState.DEFENDING); break; } GameObject speechBub = Instantiate(SpriteFontRegistry.BUBBLE_OBJECT); RectTransform enemyRt = encounter.enabledEnemies[i].GetComponent <RectTransform>(); TextManager sbTextMan = speechBub.GetComponent <TextManager>(); monDialogues[i] = sbTextMan; sbTextMan.setCaller(encounter.enabledEnemies[i].script); Image speechBubImg = speechBub.GetComponent <Image>(); SpriteUtil.SwapSpriteFromFile(speechBubImg, encounter.enabledEnemies[i].DialogBubble); Sprite speechBubSpr = speechBubImg.sprite; // TODO improve position setting/remove hardcoding of position setting speechBub.transform.SetParent(encounter.enabledEnemies[i].transform); speechBub.GetComponent <RectTransform>().anchoredPosition = encounter.enabledEnemies[i].DialogBubblePosition; sbTextMan.setOffset(speechBubSpr.border.x, -speechBubSpr.border.w); sbTextMan.setFont(SpriteFontRegistry.Get(SpriteFontRegistry.UI_MONSTERTEXT_NAME)); sbTextMan.setEffect(new RotatingEffect(sbTextMan)); MonsterMessage[] monMsgs = new MonsterMessage[msgs.Length]; for (int j = 0; j < monMsgs.Length; j++) { monMsgs[j] = new MonsterMessage(msgs[j]); } sbTextMan.setTextQueue(monMsgs); speechBub.GetComponent <Image>().enabled = true; } break; case UIState.DONE: StaticInits.Reset(); Application.LoadLevel("ModSelect"); break; } }
// Use this for initialization void Start() { m_BufferMgr = new BufferMgr(transform.parent.parent.transform); monsterMessage = transform.parent.parent.GetComponent <MonsterMessage>(); buffScale = 1f; }