Ejemplo n.º 1
0
        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());
            }
        }
Ejemplo n.º 4
0
        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 :(");
        }
Ejemplo n.º 5
0
        /// <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());
            }
        }
Ejemplo n.º 7
0
        /// <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());
            }
        }
Ejemplo n.º 9
0
        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);
            }
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
        /// <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());
        }
Ejemplo n.º 13
0
    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;
    }
Ejemplo n.º 14
0
        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));
            }
        }