public StoryController() { for (int i = 0; i < 50; i++) { var story = new Story { Id = Guid.NewGuid().ToString(), Text = Guid.NewGuid().ToString(), }; Stories.Add(story); } for (var i = 0; i < Stories.Count - 1; i++) { if (i % 10 == 0) { var option1 = new StoryOption { Id = Guid.NewGuid().ToString(), Text = Guid.NewGuid().ToString(), NextId = Stories[(i + 2)].Id }; var option2 = new StoryOption { Id = Guid.NewGuid().ToString(), Text = Guid.NewGuid().ToString(), NextId = Stories[(i + 2)].Id }; Stories[i].AddOption(option1); Stories[i].AddOption(option2); } } }
public void ClickOptionEvent(StoryOption option) { Debug.Log("Dialogue Box Received Option: " + option.ButtonText); foreach (IOptionClickHandler handler in OptionClickListeners) { handler.HandleOptionClick(option); } }
void UpdateCardUI() { StoryOption storyOption = StoryManager.instance.currentStoryOption; cardDialogueText.text = storyOption.dialogue; cardImage.sprite = storyOption.sprite; leftOptionText.text = storyOption.leftOption.action; rightOptionText.text = storyOption.rightOption.action; }
/// <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 void HandleOptionClick(StoryOption option) { Debug.Log("I got the option click event! " + option.ButtonText); GameManager.Instance.PlaySoundClip("2 UI CLICK 1"); //Let's just assume they clicked the first button for now ITransitionDestination target = option.GetTarget(); if (target is StoryScene) { StartNewScene((StoryScene)target); } else if (target is StoryDialogueSequence) { StartNewSequence((StoryDialogueSequence)target); } else if (target is UnitySceneTransition) { GameManager.Instance.LoadNewUnityScene((target as UnitySceneTransition).SceneToLoad); } }
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()); }
/// <summary> /// Sends response to provided number /// </summary> /// <param name="userId"></param> /// <param name="number"></param> public void ReplyToNumber(long userId, int number) { // Try-catch block: if something goes wrong replies with "Index not found" try { // Getting save var save = saves.Get(userId); if (save.Current.Story != null) // IF story already selected { if (save.Current.Episode != null) // IF episode already selected { // Getting story from DB StoryDocument story = stories.GetEpisode(save.Current.Story.Value, save.Current.Episode.Value); // Finding selected option StoryOption selectedOption = story.GetStoryline(save.Current.Storyline) .Elements[save.Current.Position] .Options[number - 1]; if (selectedOption.Storyline == "Ending") // If selected option is ending... { // Add ending to progress save.AddEnding(story.StoryId, story.Episode, selectedOption.Position.Value); // Send messages messageSender.Send(userId, messageBuilder.BuildEnding(story, selectedOption.Position.Value)); var episodes = stories.GetStoryEpisodes(story.StoryId); var progress = save.GetStoryStats(story.StoryId); messageSender.Send(userId, messageBuilder.BuildEpisodeSelectDialog(episodes, progress)); } else // Default case { // Updating save progress if (selectedOption.Storyline != null) { save.Current.Storyline = selectedOption.Storyline; } if (selectedOption.Position != null) { save.Current.Position = selectedOption.Position.Value; } // "Needed" check if (selectedOption.Needed != null && !selectedOption.Needed.All(save.Current.Unlockables.Contains)) { goto IndexNotFound; } // "Unlocks" handling if (!string.IsNullOrEmpty(selectedOption.Unlocks)) { if (!save.Current.Unlockables.Contains(selectedOption.Unlocks)) { save.AddUnlockable(selectedOption.Unlocks); } else { goto IndexNotFound; } } // If selected option contains an achievement if (selectedOption.Achievement != null) { // Add achievement to save stats save.AddAchievement(story.StoryId, story.Episode, selectedOption.Achievement.Value); // Edit response message messageSender.Send(userId, messageBuilder.BuildAchievement(story.Achievements[selectedOption.Achievement.Value])); } // Send created message var storylineElement = story.GetStoryline(save.Current.Storyline).Elements[save.Current.Position]; messageSender.Send(userId, messageBuilder.BuildContent(storylineElement, save.Current.Unlockables)); } } else // From episode selection { // Check that previous episode's canonical ending completed if (number == 0 || save.GetStoryStats(save.Current.Story.Value).Episodes[number - 1].ObtainedEndings.Contains(0)) { // Get episode by provided number StoryDocument story = stories.GetEpisode(save.Current.Story.Value, number); // Update current progress save.Current.Episode = number; save.Current.Storyline = story.Storylines[0].Tag; save.Current.Position = 0; // Send message messageSender.Send(userId, messageBuilder.BuildContent(story.Storylines[0].Elements[0], save.Current.Unlockables)); } else { goto IndexNotFound; } } } else // From story selection { // Find story progress var stats = save.GetStoryStats(number); // Get all story episodes var episodes = stories.GetStoryEpisodes(number); save.Current.Story = number; // Send episode select dialog messageSender.Send(userId, messageBuilder.BuildEpisodeSelectDialog(episodes, stats)); } // Finally update save saves.Update(save); return; } catch (Exception e) { if (e is IndexOutOfRangeException || e is ArgumentOutOfRangeException) { goto IndexNotFound; } else { throw; } } IndexNotFound: // If something went wrong... messageSender.Send(userId, messageBuilder.BuildIndexOutOfRangeMessage()); }
/// <summary> /// 检查是否符合显示条件 /// </summary> /// <param name="Condition"></param> /// <param name="Condition"></param> /// <returns></returns> private bool Check(StoryOption option, string StorySeriesID) { try { if (!string.IsNullOrWhiteSpace(option.Condition) && option.Condition != "[]") { List <StoryStatus> storyStatuses = JsonConvert.DeserializeObject <List <StoryStatus> >(option.Condition); foreach (var status in storyStatuses) { CharacterStatus DBstatus = _context.CharacterStatus.AsNoTracking().Where(a => a.StorySeries == StorySeriesID && a.Name == status.Name && a.UserID == GetUserId()).FirstOrDefault(); if (DBstatus == null) { var schedule = _context.UserSchedule.AsNoTracking().Where(a => a.UserID == GetUserId() && a.StorySeriesID == Guid.Parse(StorySeriesID)).First(); string charactervalue = string.Empty; switch (status.Name) { case ("Healthy"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Healthy.ToString(); break; case ("Sanity"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Sanity.ToString(); break; case ("ActionPoints"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().ActionPoints.ToString(); break; case ("Lucky"): if (status.Value == "100") //选项需要幸运为100时,为隐藏卡片,默认通过但隐藏 { option.hidden = true; return(true); } charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Lucky.ToString(); break; case ("Speed"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Speed.ToString(); break; case ("Strength"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Strength.ToString(); break; case ("Intelligence"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Intelligence.ToString(); break; case ("Experience"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Experience.ToString(); break; case ("Status"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Status.ToString(); break; case ("Moral"): charactervalue = _context.UserCharacter.AsNoTracking().Where(a => a.ID == schedule.CharacterID).First().Moral.ToString(); break; default: CharacterStatus newcharacterStatus = new CharacterStatus() { UserID = GetUserId(), ID = Guid.NewGuid(), StorySeries = StorySeriesID, Name = status.Name, Value = "-1" }; charactervalue = newcharacterStatus.Value; _context.CharacterStatus.Add(newcharacterStatus); _context.SaveChanges(); break; } CharacterStatus characterstatus = new CharacterStatus() { Value = charactervalue }; DBstatus = characterstatus; } if (DBstatus != null) { double dbstatus = Convert.ToDouble(DBstatus.Value); double statues = 0; if (status.Value == "随机数") { statues = getRandom(option.StoryCardID); } else if (status.Value == "困难随机数") { statues = getRandom(option.StoryCardID); dbstatus = dbstatus * 0.3; } else if (status.Value == "惩罚困难随机数") { statues = getRandom(option.StoryCardID) + 5; } else if (status.Value == "惩罚随机数") { statues = getRandom(option.StoryCardID) + 5; dbstatus = dbstatus * 0.3; } else { statues = Convert.ToInt32(status.Value); } bool result = false; switch (Convert.ToInt32(status.Type)) { case (int)enumConditionType.大于: result = dbstatus >= statues ? true : false; break; case (int)enumConditionType.小于: result = dbstatus < statues ? true : false; break; case (int)enumConditionType.等于: result = dbstatus == statues ? true : false; break; case (int)enumConditionType.等于: result = dbstatus != statues ? true : false; break; } return(result); } } return(true); } else { return(true); } } catch (Exception ex) { return(false); } }