public void NextStory() { StoryCard story = (StoryCard)this.storyDeck.Draw(); this.Controller.Message(this, "Story " + story.ToString() + " drawn"); this.Log("Story " + story.ToString() + " drawn"); this.currentStory = story; this.controller.UpdateStory(this); try{ story.Run(); this.controller.UpdatePlayers(this); } catch (NotImplementedException) { this.Controller.EndStory(this); this.Log("Feature not implemented"); } catch (Exception e) { this.Log(e.Message); this.Log(e.StackTrace); } // Make sure AIs send their end turn responses. foreach (Player player in this.players) { if (player.Behaviour != null && !(player.Behaviour is HumanPlayer)) { this.RoundEndResponse(player); } } }
/// <summary> /// 递归添加树元素 /// </summary> /// <param name="storyCard"></param> /// <param name="level"></param> private void CreateTree(StoryCard storyCard, Guid fatherStoryCardId, int level) { StoryCardTree storyCardTree = new StoryCardTree() { FatherStoryCardId = new List <Guid>(), Level = level, StoryCard = storyCard }; storyCardTree.FatherStoryCardId.Add(fatherStoryCardId); storyCardTrees.Add(storyCardTree); foreach (var option in storyCard.StoryOptions) { StoryCardTree storyCardT = storyCardTrees.FirstOrDefault(a => a.StoryCard.ID == option.NextStoryCardID); if (storyCardT == null) { StoryCard ChildStoryCard = storyCards.Where(a => a.ID == option.NextStoryCardID).FirstOrDefault(); if (ChildStoryCard != null) { CreateTree(ChildStoryCard, storyCard.ID, level + 1); } } else { storyCardT.FatherStoryCardId.Add(storyCard.ID); } } }
public IActionResult FlowChart(string id) { if (isCreator(Guid.Parse(id)) || isReviewer()) { #region 故事卡树 List <StoryCardTree> StoryCardTrees = new List <StoryCardTree>(); var obj = _context.StoryCard.AsNoTracking().Where(a => a.StorySeriesID == Guid.Parse(id)).Include(a => a.StoryOptions).ToList().OrderBy(a => a.IsHead); if (obj.Count() == 0) { return(RedirectToAction(nameof(Index), new { id })); } foreach (var temp in obj) { StoryCard storyCard = new StoryCard() { ID = temp.ID, Title = temp.Title, StorySeriesID = temp.StorySeriesID, StoryName = temp.StoryName, Text = temp.Text, BackgroundIMG = temp.BackgroundIMG, IsHead = temp.IsHead, StoryOptions = temp.StoryOptions, }; storyCards.Add(storyCard); } StoryCard FirstStoryCard = storyCards.Where(a => a.IsHead == true).FirstOrDefault(); if (FirstStoryCard != null) { CreateTree(FirstStoryCard, Guid.Empty, 0); } var tree = storyCardTrees.OrderBy(a => a.Level).GroupBy(a => a.Level).ToList(); List <StoryCardTrees> Trees = new List <StoryCardTrees>(); foreach (var i in tree) { StoryCardTrees cardTrees = new StoryCardTrees() { StoryCard = storyCardTrees.Where(a => a.Level == i.Key).ToList(), Level = i.Key }; Trees.Add(cardTrees); } ViewBag.StoryCardTree = Trees; #endregion #region 故事状态 ViewBag.StoryStatus = _context.StoryStatus.AsNoTracking().Where(a => a.StorySeries == id).ToList(); #endregion #region 故事道具 ViewBag.StoryItems = _context.Item.AsNoTracking().Where(a => a.StorySeriesID == Guid.Parse(id)).ToList(); #endregion return(View()); } else { return(NotFound()); } }
public void GetCardGetsValidCard(int id, CardType cardType = CardType.System) { StoryCard testStoryCard = database.GetStoryCardById(id); Assert.NotNull(testStoryCard, "StoryCard returned was null."); Assert.AreEqual(testStoryCard.ID, id, "Bad ID returned... somehow...?"); Assert.AreEqual(testStoryCard.Type, cardType, "Bad/Wrong StoryCard type :("); }
/// <summary> /// Queries the database for a specific StoryCard. /// Returns a StoryCard made from the data in the Database. /// </summary> /// <param name="id">The ID unique identifier of the StoryCard.</param> /// <returns></returns> public StoryCard GetStoryCardById(int id) { MySqlCommand command = new MySqlCommand("SELECT * FROM StoryCard WHERE idCard = @idVal", conn); command.Parameters.AddWithValue("idVal", id); StoryCard retStoryCard = null; // Create new SqlDataReader object and read data from the command. using (reader = command.ExecuteReader()) { reader.Read(); if (reader.HasRows) { int cardID = (int)reader[0]; string ssmlContent = (string)reader[1]; CardType cardType = (CardType)Enum.Parse(typeof(CardType), (string)reader[2]); int nextCardId = (int)reader[3]; string cardConten = (string)reader[5]; int eventId; CardEvent cardEvent = null; try { eventId = (int)reader[4]; cardEvent = GetCardEventById(eventId); } catch (Exception ex) { if (ex is InvalidCastException || ex is GameDatabaseException) { eventId = 0; cardEvent = null; } else { throw ex; } } //Close the reader. We don't need it anymore. Allows for another operation to be run. reader.Close(); // create the new StoryCard retStoryCard = new StoryCard(cardID, ssmlContent, cardType, nextCardId, cardEvent); } else { reader.Close(); throw new GameDatabaseException("Statement did not return any rowns."); } if (retStoryCard == null) { Console.WriteLine("WARNING: Null Value for Return StoryCard. Searched by ID= " + id); } return(retStoryCard); } }
/// <summary> /// 根据故事卡片Id返回 /// </summary> /// <param name="id">故事卡片</param> /// <returns></returns> public IActionResult Index(string id) { try { var Creatorschedule = _context.CreatorSchedule.FirstOrDefault(a => a.UserID == GetUserId() && a.StorySeriesID == Guid.Parse(id)); if (Creatorschedule != null) { Guid lastStoryCardID = Creatorschedule.StoryCardID; ViewBag.LastCard = _context.StoryCard.AsNoTracking().Include(a => a.StoryOptions).FirstOrDefault(a => a.ID == lastStoryCardID); } else { StoryCard card = new StoryCard() { ID = Guid.NewGuid(), StorySeriesID = Guid.Parse(id), StoryName = _context.StorySeries.AsNoTracking().Where(a => a.ID == Guid.Parse(id)).First().SeriesName, Title = string.Empty, Text = string.Empty, IsHead = true }; CreatorSchedule creatorSchedule = new CreatorSchedule() { ID = Guid.NewGuid(), UserID = GetUserId(), StorySeriesID = Guid.Parse(id), StoryCardID = card.ID }; _context.CreatorSchedule.Add(creatorSchedule); _context.StoryCard.Add(card); ViewBag.LastCard = card; } _context.SaveChanges(); //List<StoryCard> storyCards = _context.StoryCard.AsNoTracking().Where(a => a.StorySeriesID == Guid.Parse(id)).Include(a => a.StoryOptions).ToList(); //return View(storyCards); return(View()); } catch { return(NotFound()); } }
/// <summary> /// Returns the first Character creation card and sets up the player. /// </summary> /// <param name="player">The player object.</param> /// <returns></returns> private SpeechletResponse getCharacterCreationResponse(Player player) { StoryCard createCharacterCard = _database.GetStoryCardById(StoryCard.PLAYER_CREATE_NAME); SimpleCard cardContent = new SimpleCard(); cardContent.Content = createCharacterCard.CardContent; SsmlOutputSpeech speech = new SsmlOutputSpeech(); speech.Ssml = createCharacterCard.SsmlContent; SpeechletResponse response = new SpeechletResponse(); response.Card = cardContent; response.OutputSpeech = speech; response.ShouldEndSession = false; return(response); }
/// <summary> /// 移动到下一卡片,若id无则新建 /// </summary> /// <returns>Id 选项ID</returns> public IActionResult NextCard(Guid Id) { Guid nextCardId; try { StoryOption storyOption = _context.StoryOption.FirstOrDefault(a => a.ID == Id); StoryCard storyCard = _context.StoryCard.FirstOrDefault(a => a.ID == storyOption.StoryCardID); if (string.IsNullOrEmpty(storyOption.NextStoryCardID.ToString()) || storyOption.NextStoryCardID == Guid.Empty) { StoryCard NewStoryCard = new StoryCard() { ID = Guid.NewGuid(), StorySeriesID = storyCard.StorySeriesID, StoryName = _context.StorySeries.AsNoTracking().Where(a => a.ID == storyCard.StorySeriesID).First().SeriesName, Title = string.Empty, Text = string.Empty }; _context.StoryCard.Add(NewStoryCard); nextCardId = NewStoryCard.ID; storyOption.NextStoryCardID = NewStoryCard.ID; } else if (isReviewer()) { return(RedirectToAction(nameof(ReviewIndex), new { seriesID = storyCard.StorySeriesID, cardID = storyOption.NextStoryCardID })); } else { nextCardId = storyOption.NextStoryCardID; } CreatorSchedule schedule = _context.CreatorSchedule.FirstOrDefault(a => a.UserID == GetUserId() && a.StorySeriesID == storyCard.StorySeriesID); schedule.StoryCardID = nextCardId; _context.SaveChanges(); return(RedirectToAction(nameof(Index), new { id = schedule.StorySeriesID })); } catch (Exception ex) { return(NotFound()); } }
public QuestMatch(Logger logger = null, GameController controller = null) { this.id = nextId++; this.players = new List <Player>(); this.roundEnded = new List <Player>(); this.currentPlayer = 0; this.storyDeck = new StoryDeck(this); this.adventureDeck = new AdventureDeck(this); this.discardPile = new DiscardPile(this); this.currentStory = null; this.logger = logger; this.Log("Creating new Quest match"); if (controller != null) { this.controller = controller; } else { this.controller = new GameController(new NullQuestMessageHandler(), this); } }
/// <summary> /// A method used to construct a speechlet response. /// Uses the Player object to get the next card in que. /// Will also change the current card positon of the /// player once it sends the response. /// </summary> /// <param name="player">The player object.</param> /// <returns>SpeechletResponse</returns> private SpeechletResponse getNextStoryCard(Player player) { // get card and set the next card to the player. StoryCard currentStoryCard = _database.GetStoryCardById(player.NextCardID); player.NextCardID = currentStoryCard.NextCardId; // Create the Simple storyCard content. SimpleCard card = new SimpleCard(); card.Content = currentStoryCard.CardContent; SsmlOutputSpeech speech = new SsmlOutputSpeech(); speech.Ssml = currentStoryCard.SsmlContent; SpeechletResponse response = new SpeechletResponse(); response.OutputSpeech = speech; response.Card = card; response.ShouldEndSession = false; return(response); }
/// <summary> /// 故事状态 /// </summary> /// <param name="userid"></param> /// <param name="storycard"></param> /// <param name="obj"></param> private void storystatu(Guid userid, StoryCard storycard, Istatus obj) { CharacterStatus status = _context.CharacterStatus.Where(a => a.StorySeries == storycard.StorySeriesID.ToString() && a.Name == obj.Name && a.UserID == userid).FirstOrDefault(); if (status != null) { status.Value = ExeCharacterEffect(float.Parse(status.Value), obj.Value, obj.Type).ToString(); _context.CharacterStatus.Update(status); } else { CharacterStatus NewcharacterStatus = new CharacterStatus() { UserID = userid, ID = Guid.NewGuid(), StorySeries = storycard.StorySeriesID.ToString(), Name = obj.Name, Value = ExeCharacterEffect(0, obj.Value, obj.Type).ToString() }; _context.CharacterStatus.Add(NewcharacterStatus); } }
public async Task <IActionResult> Save(string json, IFormFile file) { if (!string.IsNullOrEmpty(json)) { string IMG = string.Empty; //图片上传 if (file != null) { using (var ms = new MemoryStream()) { switch (file.ContentType) { case "image/png": IMG = "data:image/png;base64,"; break; case "image/jpeg": IMG = "data:image/jpeg;base64,"; break; default: ModelState.AddModelError("File", "只支持png、jpeg格式"); break; } if (IMG != string.Empty) { file.CopyTo(ms); var fileBytes = ms.ToArray(); IMG += Convert.ToBase64String(fileBytes); if (IMG.Length > 2097152) { IMG = string.Empty; ModelState.AddModelError("File", "图片请保持在2MB以内."); } } } } StoryCard card = JsonConvert.DeserializeObject <StoryCard>(json); StoryCard storyCard = _context.StoryCard.Include(a => a.StoryOptions).FirstOrDefault(a => a.ID == card.ID); storyCard.Title = card.Title; storyCard.IMG = IMG; storyCard.Text = replaceText(card.Text); storyCard.BackgroundIMG = card.BackgroundIMG; _context.StoryOption.RemoveRange(storyCard.StoryOptions); foreach (var obj in card.StoryOptions) { StoryOption option = new StoryOption() { ID = obj.ID, StoryCardID = obj.StoryCardID, Text = obj.Text, NextStoryCardID = obj.NextStoryCardID, Condition = obj.Condition, Effect = obj.Effect }; storyCard.StoryOptions.Add(option); } await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index), new { id = card.StorySeriesID.ToString() })); } return(NotFound()); }
IEnumerator IFetchStories() { byte[] data; UnityWebRequest sList = UnityWebRequest.Get(storyListURL); UnityWebRequestAsyncOperation ao_get = sList.SendWebRequest(); //get names while (!sList.downloadHandler.isDone) { if (sList.isNetworkError || sList.isHttpError) { Debug.LogError(sList.error); yield break; } yield return(null); } data = sList.downloadHandler.data; string listing_json = Encoding.UTF8.GetString(data, 0, data.Length); JSONObject storyNames = new JSONObject(Encoding.UTF8.GetString(data, 0, data.Length)); //get details for (int i = 0; i < storyNames.list.Count; i++) { //TODO: check version, load instead of request if version matches //if there's a version mismatch, clear the story save data string name = storyNames.list[i].str.Split('.')[0]; string path = detailURL + name; //Debug.Log(path); sList.Dispose(); sList = UnityWebRequest.Get(detailURL + name); ao_get = sList.SendWebRequest(); while (!sList.downloadHandler.isDone) { if (sList.isNetworkError || sList.isHttpError) { Debug.LogError(sList.error); break; } yield return(null); } StoryCard card = Instantiate(cardPrefab); card.transform.SetParent(scrollRect.content, false); card.storyName.text = name; card.storyName.rectTransform.sizeDelta = new Vector2(card.rectTransform.sizeDelta.x, card.storyName.preferredHeight); //instantiate story listings if (sList.downloadHandler.isDone) { data = sList.downloadHandler.data; JSONObject details = new JSONObject(Encoding.UTF8.GetString(data, 0, data.Length)); //Debug.Log(details.str); card.details.text = details.str; } card.details.rectTransform.sizeDelta = new Vector2(card.details.rectTransform.sizeDelta.x, card.details.preferredHeight); //get story content //Debug.Log(storyURL + name); sList.Dispose(); sList = UnityWebRequest.Get(storyURL + name + ".ink.json"); ao_get = sList.SendWebRequest(); while (!sList.downloadHandler.isDone) { if (sList.isNetworkError || sList.isHttpError) { Debug.LogError(sList.error); break; } yield return(null); } if (sList.downloadHandler.isDone) { data = sList.downloadHandler.data; string content = Encoding.UTF8.GetString(data, 0, data.Length); card.storyContent = new TextAsset(content); //Debug.Log(content); } else { card.playButton.interactable = false; } //save data to be loaded later card.Fold(); } sList.Dispose(); if (cards.Count > 0) { StoryManager.instance.inkJSONAsset = cards[0].storyContent; StoryManager.instance.story = new Ink.Runtime.Story(cards[0].storyContent.text); } scrollRect.gameObject.SetActive(false); canvasGroup.alpha = 1; canvasGroup.interactable = true; PanelSwap.instance.enabled = true; welcomeShowList.interactable = true; }
public async Task <JsonResult> NextCard(Guid optionID) { Guid userid = GetUserId(); try { //校验操作 - 查看该选项是否在故事卡片内并可以选择 var opti = _context.StoryOption.AsNoTracking().Where(a => a.ID == optionID).First(); var storycard = _context.StoryCard.Include(a => a.StoryOptions).AsNoTracking().Where(a => a.ID == opti.StoryCardID).First(); var Schedule = _context.UserSchedule.Where(a => a.UserID == GetUserId() && a.StoryCardID == storycard.ID).First(); if (Check(opti, storycard.StorySeriesID.ToString())) { JsonResult result = Json(string.Empty); //执行操作效果 #region if (!string.IsNullOrWhiteSpace(opti.Effect)) { List <Istatus> storyStatuses = JsonConvert.DeserializeObject <List <Istatus> >(opti.Effect); //人物属性 UserSchedule schedule = _context.UserSchedule.AsNoTracking().Where(a => a.UserID == GetUserId() && a.StorySeriesID == Schedule.StorySeriesID).First(); UserCharacter character = _context.UserCharacter.Where(a => a.ID == schedule.CharacterID).FirstOrDefault(); foreach (var obj in storyStatuses) { //操作 if (Convert.ToInt32(obj.Type) == (int)enumEffectType.结束处理) { return(result = Json(GameOver(Schedule.StorySeriesID))); } switch (obj.Name) { case ("MaxHealthy"): character.MaxHealthy = ExeCharacterEffect(character.MaxHealthy, obj.Value, obj.Type); break; case ("MaxSanity"): character.MaxSanity = ExeCharacterEffect(character.MaxSanity, obj.Value, obj.Type); break; case ("Healthy"): character.Healthy = ExeCharacterEffect(character.Healthy, obj.Value, obj.Type); if (character.Healthy > character.MaxHealthy) { character.Healthy = character.MaxHealthy; } break; case ("Sanity"): character.Sanity = ExeCharacterEffect(character.Sanity, obj.Value, obj.Type); if (character.Sanity > character.MaxSanity) { character.Sanity = character.MaxSanity; } break; case ("ActionPoints"): character.ActionPoints = ExeCharacterEffect(character.ActionPoints, obj.Value, obj.Type); break; case ("Lucky"): character.Lucky = ExeCharacterEffect(character.Lucky, obj.Value, obj.Type); break; case ("Speed"): character.Speed = ExeCharacterEffect(character.Speed, obj.Value, obj.Type); break; case ("Strength"): character.Strength = ExeCharacterEffect(character.Strength, obj.Value, obj.Type); break; case ("Intelligence"): character.Intelligence = ExeCharacterEffect(character.Intelligence, obj.Value, obj.Type); break; case ("Experience"): character.Experience = ExeCharacterEffect(character.Experience, obj.Value, obj.Type); break; case ("Status"): character.Status = ExeCharacterEffect(character.Status, obj.Value, obj.Type); break; case ("Moral"): character.Moral = ExeCharacterEffect(character.Moral, obj.Value, obj.Type); break; default: //道具 //TODO //故事状态 storystatu(userid, storycard, obj); break; } } _context.SaveChanges(); } #endregion //下一页构建 #region var Nextstorycard = _context.StoryCard.Include(a => a.StoryOptions).AsNoTracking().Where(a => a.ID == opti.NextStoryCardID).FirstOrDefault(); if (Nextstorycard != null) { StoryCard resultCard = new StoryCard() { ID = Nextstorycard.ID, StorySeriesID = Nextstorycard.StorySeriesID, StoryName = Nextstorycard.StoryName, Title = Nextstorycard.Title, Text = Nextstorycard.Text, IMG = Nextstorycard.IMG, BackgroundIMG = Nextstorycard.BackgroundIMG, IsHead = Nextstorycard.IsHead, StoryOptions = new List <StoryOption>() }; //去除不显示的选项 foreach (var option in Nextstorycard.StoryOptions) { if (Check(option, storycard.StorySeriesID.ToString())) { resultCard.StoryOptions.Add(option); } } result = Json(resultCard); //保存进度 Schedule.StoryCardID = Nextstorycard.ID; await _context.SaveChangesAsync(); #endregion } return(result); } else { return(Json(false)); } } catch (Exception ex) { return(Json(ex)); } }