public ActionResult SubmitTutorialAnswers(NegotiationTutorialModel model)
        {
            if (model == null || model.TutorialId == null)
            {
                return(RedirectToAction("Negotiation"));
            }

            if (!model.Questions.Select(x => x.Answer).SequenceEqual(NegotiationManager.TutorialModels[model.TutorialId].Questions.Select(x => x.ActualAnswer)))
            {
                ModelState.AddModelError("Wrong answer", "One or more answers was wrong.");
                return(View("NegotiationTutorial", NegotiationManager.TutorialModels[model.TutorialId]));
            }

            NegotiationTutorialModel temp;

            NegotiationManager.TutorialModels.TryRemove(model.TutorialId, out temp);

            NegotiationEngine engine = NegotiationManager.OnGoingNegotiations[model.TutorialId];

            NegotiationViewModel newModel = new NegotiationViewModel
            {
                Id            = model.TutorialId,
                AiSide        = engine.AiConfig.Side,
                HumanConfig   = engine.HumanConfig,
                RemainingTime = TimeSpan.FromSeconds(engine.Domain.NumberOfRounds * engine.Domain.RoundLength.TotalSeconds),
                Domain        = engine.Domain,
                Actions       = new List <NegotiationActionModel>()
            };

            engine.BeginNegotiation();

            return(RedirectToAction("Negotiation", new { negotiationId = model.TutorialId }));
        }
        private NegotiationTutorialModel CreateTutorialModel(string id)
        {
            NegotiationEngine engine = NegotiationManager.OnGoingNegotiations[id];

            SideConfig config = engine.HumanConfig;

            NegotiationSideDescription desc = engine.Domain.OwnerVariantDict[config.Side][config.Variant];

            int optoutend = engine.Domain.CalculateOptoutScore(config, NegotiationManager.TotalRounds);

            return(new NegotiationTutorialModel
            {
                TutorialId = id,
                Questions = new List <QuestionModel>
                {
                    new QuestionModel
                    {
                        Question = "Whose side are you playing in the negotiation?",
                        Options = engine.Domain.OwnerVariantDict.Keys.ToList(),
                        ActualAnswer = config.Side
                    },
                    new QuestionModel
                    {
                        Question = "If the same agreement was reached in round 3 or in round 6, which of the following is correct?",
                        Options = new List <string>
                        {
                            "They have the same score.",
                            "Round 3 will have a higher score.",
                            "Round 6 will have a higher score"
                        },
                        ActualAnswer = "Round 3 will have a higher score."
                    },
                    new QuestionModel
                    {
                        Question = "What is your score if no agreement had been reached by the end of the last round?",
                        Options = new List <string>
                        {
                            "0",
                            "No score - you have lost the negotiation",
                            optoutend.ToString()
                        },
                        ActualAnswer = optoutend.ToString()
                    },
                    new QuestionModel
                    {
                        Question = "What is the meaning of \"opting out\"?",
                        Options = new List <string>
                        {
                            "It means that the other side won the negotiation.",
                            "It means you get a predetermined amount of points minus the time decrease."
                        },
                        ActualAnswer = "It means you get a predetermined amount of points minus the time decrease."
                    }
                }
            });
        }
        private string CreateNewNegotiation(PreNegotiationQuestionnaireViewModel model)
        {
            string            id     = this.Request.UserHostAddress + ";" + DateTime.Now.ToUniversalTime().ToString(CultureInfo.InvariantCulture);
            NegotiationEngine engine =
                new NegotiationEngine(
                    id,
                    NegotiationManager.Domain,
                    model,
                    NegotiationManager.GetHumanConfig(),
                    NegotiationManager.GetAiConfig());

            NegotiationManager.SaveNewNegotiation(engine, model);
            NegotiationManager.OnGoingNegotiations.TryAdd(id, engine);

            return(id);
        }
        private static void SaveAction(NegotiationEngine engine, SideConfig side, NegotiationActionType type, String value = "")
        {
            NegotiationContainer cont = new NegotiationContainer();

            var game = cont.GameSet.Find(engine.NegotiationId);
            var user = game.Users.First(x => x.Type == side.Type);

            cont.NegotiationActionSet.Add(new NegotiationAction()
            {
                GameId = engine.NegotiationId,
                Type = type,
                User = user,
                RemainingTime = engine.Status.RemainingTime,
                UserId = user.Id,
                Value = value
            });
            cont.SaveChanges();
        }
 internal static void SaveUserOptionChange(NegotiationEngine engine, string topic, string option)
 {
     SaveAction(engine, engine.HumanConfig, NegotiationActionType.MakeChange, String.Format("{{\"{0}\":\"{1}\"}}",topic,option));
 }
 internal static void SaveTimeout(NegotiationEngine engine)
 {
     SaveAction(engine, engine.HumanConfig, NegotiationActionType.Timeout);
 }
 internal static void SaveOptOut(NegotiationEngine engine, SideConfig side)
 {
     SaveAction(engine, side, NegotiationActionType.Optout);
 }
 internal static void SaveOfferRejected(NegotiationEngine engine, SideConfig side)
 {
     SaveAction(engine, side, NegotiationActionType.RejectOffer);
 }
 internal static void SaveNewOffer(NegotiationEngine engine, SideConfig side, string negotiationOffer)
 {
     SaveAction(engine, side, NegotiationActionType.MakeOffer, negotiationOffer);
 }
        internal static void SaveNewNegotiation(NegotiationEngine engine, PreNegotiationQuestionnaireViewModel model)
        {
            NegotiationContainer cont = new NegotiationContainer();

            #region Human User
            UserRole humanRole = new UserRole()
            {
                Description = engine.HumanConfig.Side,
                Variant = engine.HumanConfig.Variant
            };

            UserData humanData = new UserData()
            {
                AgeRange = model.AgeRange,
                Country = model.BirthCountry,
                DegreeField = model.DegreeField,
                Education = model.Education,
                Gender = model.Gender,
                StudentId = model.ID,
                Name = model.Name,
                University = model.University
            };

            User humanUser = new User()
            {
                Id = engine.NegotiationId,
                Type = UserType.Human,
                UserData = humanData,
                UserRole = humanRole,
                GameId = engine.NegotiationId
            };

            #endregion

            #region Ai User

            UserRole aiRole = new UserRole()
            {
                Description = engine.AiConfig.Side,
                Variant = engine.AiConfig.Variant
            };

            User aiUser = new User()
            {
                Id = engine.StrategyName + "|" + DateTime.Now,
                Type = UserType.Agent,
                StrategyId = engine.AiConfig.StrategyId,
                UserRole = aiRole,
                GameId = engine.NegotiationId,
            };

            #endregion

            cont.GameSet.Add(new Game()
                {
                    Id = engine.NegotiationId,
                    GameDomainId = GameDomain.Id,
                    StartTime = DateTime.Now
                });

            cont.UserDataSet.Add(humanData);
            cont.UserRoleSet.Add(humanRole);
            cont.UserRoleSet.Add(aiRole);
            cont.UserSet.Add(humanUser);
            cont.UserSet.Add(aiUser);

            try
            {
                cont.SaveChanges();
            }
            catch (Exception)
            {
                throw;
            }
        }
 internal static void SaveAgreementSigned(NegotiationEngine engine, SideConfig side)
 {
     SaveAction(engine, side, NegotiationActionType.Sign);
 }
        private string CreateNewNegotiation(PreNegotiationQuestionnaireViewModel model)
        {
            string id = this.Request.UserHostAddress + ";" + DateTime.Now.ToUniversalTime().ToString(CultureInfo.InvariantCulture);
            NegotiationEngine engine =
                new NegotiationEngine(
                    id,
                    NegotiationManager.Domain,
                    model,
                    NegotiationManager.GetHumanConfig(),
                    NegotiationManager.GetAiConfig());

            NegotiationManager.SaveNewNegotiation(engine, model);
            NegotiationManager.OnGoingNegotiations.TryAdd(id, engine);

            return id;
        }