Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
 public void ClickOptionEvent(StoryOption option)
 {
     Debug.Log("Dialogue Box Received Option: " + option.ButtonText);
     foreach (IOptionClickHandler handler in OptionClickListeners)
     {
         handler.HandleOptionClick(option);
     }
 }
Esempio n. 3
0
    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());
        }
Esempio n. 7
0
        /// <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());
        }
Esempio n. 8
0
        /// <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);
            }
        }