Beispiel #1
0
        public static ExpiringJobOffer GetCurrentOffer(HumanFF human)
        {
            var offers = human.WorkerOffersComponent.Offers;

            // there are accepted offers
            if (offers.Count(o => o.Accepted) > 0)
            {
                return(offers.First(o => o.Accepted));
            }

            // there is pending offer from company
            if (offers.Count(o => o.CompanyId == human.WorkerComponent.companyId) > 0)
            {
                return(offers.First(o => o.CompanyId == human.WorkerComponent.companyId));
            }

            // unemployed
            return(new ExpiringJobOffer
            {
                Accepted = false,
                CompanyId = -1,
                DecisionDate = -1,
                HumanId = human.HumanComponent.Id,
                JobOffer = new JobOffer(Teams.GetSalaryPerRating(human))
            });
        }
Beispiel #2
0
        public static void SetRole(HumanFF human, WorkerRole workerRole)
        {
            if (human.WorkerComponent == null)
            {
                human.WorkerComponent = new WorkerComponent();
            }

            human.WorkerComponent.WorkerRole = workerRole;
        }
Beispiel #3
0
        public static HumanFF SetTrait(HumanFF worker, Trait trait)
        {
            if (!HasTrait(worker, trait))
            {
                worker.HumanSkillsComponent.Traits.Add(trait);
            }

            return(worker);
        }
Beispiel #4
0
        public static void SendJobOffer(HumanFF worker, JobOffer jobOffer, GameEntity company, GameContext gameContext)
        {
            var offer = new ExpiringJobOffer
            {
                JobOffer     = jobOffer,
                CompanyId    = company.company.Id,
                DecisionDate = ScheduleUtils.GetCurrentDate(gameContext) + 30,
                HumanId      = worker.HumanComponent.Id
            };

            AddOrReplaceOffer(company, worker, offer);
        }
        public static void ResetSkills(HumanFF worker, int rating)
        {
            var skills = worker.HumanSkillsComponent;

            var roles = new Dictionary <WorkerRole, int>
            {
                [WorkerRole.CEO] = rating,
            };

            worker.HumanSkillsComponent.Roles = roles;

            //worker.ReplaceHumanSkills(roles , skills.Traits, skills.Expertise);
        }
Beispiel #6
0
        public static WorkerRole GetRole(HumanFF worker)
        {
            //Debug.Log("Get Role of human " + worker.human.Id + " #" + worker.creationIndex);

            if (worker.WorkerComponent != null)
            {
                return(worker.WorkerComponent.WorkerRole);
            }

            var err = "Tries to getRole of entity #" + worker.HumanComponent.Id;

            Debug.LogError(err);

            throw new System.Exception(err);
        }
Beispiel #7
0
        public static void SetJobOffer(HumanFF human, GameEntity company, JobOffer offer, int teamId, GameContext gameContext)
        {
            var o = new ExpiringJobOffer
            {
                Accepted = true,

                JobOffer     = offer,
                CompanyId    = company.company.Id,
                HumanId      = human.HumanComponent.Id,
                DecisionDate = -1
            };

            AddOrReplaceOffer(company, human, o);

            Economy.UpdateSalaries(company, gameContext);
        }
Beispiel #8
0
        public static void AddOrReplaceOffer(GameEntity company, HumanFF human, ExpiringJobOffer o)
        {
            int index = human.WorkerOffersComponent.Offers
                        .FindIndex(o1 => o1.CompanyId == company.company.Id && o1.HumanId == human.HumanComponent.Id);

            if (index == -1)
            {
                human.WorkerOffersComponent.Offers.Add(o);
            }
            else
            {
                human.WorkerOffersComponent.Offers[index] = o;
            }

            //Debug.Log($"Offer to {Humans.GetFullName(human)} ({human.workerOffers.Offers.Count}): {company.company.Name}");
        }
Beispiel #9
0
        public static void AttachToCompany(HumanFF worker, int companyId, WorkerRole workerRole)
        {
            if (worker.WorkerComponent == null)
            {
                worker.WorkerComponent = new WorkerComponent();
            }

            worker.WorkerComponent.companyId  = companyId;
            worker.WorkerComponent.WorkerRole = workerRole;

            if (worker.HumanCompanyRelationshipComponent == null)
            {
                worker.HumanCompanyRelationshipComponent = new HumanCompanyRelationshipComponent();
            }

            worker.HumanCompanyRelationshipComponent.Adapted = 0;
            worker.HumanCompanyRelationshipComponent.Morale  = 50;
        }
        public static Bonus <int> GetLoyaltyChangeBonus(HumanFF worker, TeamInfo team,
                                                        Dictionary <CorporatePolicy, int> culture, GameEntity company)
        {
            var bonus = new Bonus <int>("Loyalty");

            bonus.Append("Base value", 1);

            var loyaltyBuff = team.ManagerTasks.Count(t => t == ManagerTask.ImproveAtmosphere);

            bonus.AppendAndHideIfZero("Manager focus on atmosphere", loyaltyBuff);

            var role = worker.WorkerComponent.WorkerRole;

            // TODO: if is CEO in own project, morale loss is zero or very low
            bonus.AppendAndHideIfZero("IS FOUNDER", worker.WorkerComponent.WorkerRole == WorkerRole.CEO ? 5 : 0);

            // same role workers
            //ApplyDuplicateWorkersLoyalty(company, team, gameContext, ref bonus, worker, role);

            // salary
            ApplyLowSalaryLoyalty(company, ref bonus, worker);

            // incompetent leader
            //ApplyCEOLoyalty(company, team, gameContext, ref bonus, worker, role);

            // no possibilities to grow
            var rating = Humans.GetRating(worker);
            var max    = 70;

            if (role != WorkerRole.CEO)
            {
                bonus.AppendAndHideIfZero($"Outgrown company (skill >= {max})", rating >= max ? -3 : 0);
            }

            bonus.AppendAndHideIfZero("Too many leaders", Humans.HasTrait(worker, Trait.Leader) && team.TooManyLeaders ? -2 : 0);

            if (team.isManagedBadly)
            {
                bonus.Append("Terrible management", -3);
            }

            // bonus.AppendAndHideIfZero(hu)
            return(bonus);
        }
Beispiel #11
0
        public static float GetPersonalSalaryModifier(HumanFF human)
        {
            float modifier = 0;

            bool isShy    = Humans.HasTrait(human, Trait.Shy);
            bool isGreedy = Humans.HasTrait(human, Trait.Greedy);

            if (isShy)
            {
                modifier -= 0.3f;
            }

            if (isGreedy)
            {
                modifier += 0.3f;
            }

            return(modifier);
        }
Beispiel #12
0
 public static void FireManager(GameContext gameContext, HumanFF worker) => FireManager(Companies.Get(gameContext, worker.WorkerComponent.companyId), gameContext, worker.HumanComponent.Id);
Beispiel #13
0
        public static void SetSkills(HumanFF worker, WorkerRole workerRole)
        {
            switch (workerRole)
            {
            case WorkerRole.CEO:
                SetPrimarySkill(worker, WorkerRole.CEO);

                SetPrimaryTrait(worker, Trait.Ambitious);
                SetPrimaryTrait(worker, Trait.Visionaire);
                //SetPrimaryTrait(worker, TraitType.Will);
                break;

            case WorkerRole.Manager:
                SetPrimarySkill(worker, WorkerRole.Manager);

                SetPrimaryTrait(worker, Trait.Leader);
                SetPrimaryTrait(worker, Trait.Ambitious);
                break;

            case WorkerRole.Marketer:
                SetPrimarySkill(worker, WorkerRole.Marketer);

                SetPrimaryTrait(worker, Trait.Visionaire);
                break;

            case WorkerRole.Programmer:
                SetPrimarySkill(worker, WorkerRole.Programmer);

                SetPrimaryTrait(worker, Trait.Curious);
                break;

            case WorkerRole.ProductManager:
                SetPrimarySkill(worker, WorkerRole.Manager);
                SetPrimarySkill(worker, WorkerRole.CEO);

                SetPrimaryTrait(worker, Trait.Visionaire);
                break;

            case WorkerRole.ProjectManager:
                SetPrimarySkill(worker, WorkerRole.Manager);
                SetPrimarySkill(worker, WorkerRole.CEO);

                SetPrimaryTrait(worker, Trait.Visionaire);
                break;

            case WorkerRole.MarketingDirector:
            case WorkerRole.MarketingLead:
                SetPrimarySkill(worker, WorkerRole.Marketer);
                SetPrimarySkill(worker, WorkerRole.Manager);

                SetPrimaryTrait(worker, Trait.Visionaire);
                break;

            case WorkerRole.TeamLead:
            case WorkerRole.TechDirector:
                SetPrimarySkill(worker, WorkerRole.Programmer);
                SetPrimarySkill(worker, WorkerRole.Manager);

                SetPrimaryTrait(worker, Trait.Visionaire);
                break;
            }
        }
Beispiel #14
0
        public static long GetSalaryPerRating(HumanFF human, long rating)
        {
            float modifier = GetPersonalSalaryModifier(human);

            return(GetSalaryPerRating(rating, modifier));
        }
        private static GameEntity CreateCompany(
            GameContext context,
            string name,
            CompanyType companyType,
            Dictionary <int, BlockOfShares> founders,
            HumanFF CEO)
        {
            var company = context.CreateEntity();

            int id = GenerateCompanyId(context);

            company.AddCompany(id, name, companyType);
            company.isAlive = true;

            var culture = GetRandomCorporateCulture();

            company.AddCorporateCulture(culture);


            SetIndependence(company, true);
            company.AddPartnerships(new List <int>());

            company.AddCompanyResourceHistory(new List <ResourceTransaction>());
            company.AddCompanyResource(new TeamResource());
            Companies.SetResources(company, new TeamResource(0, Teams.GetPromotionCost(TeamRank.SmallTeam), 0, 0, 10000), "Initial capital");

            // investments
            company.AddShareholders(founders);
            company.AddInvestmentProposals(new List <InvestmentProposal>());
            company.AddInvestmentRounds(InvestmentRound.Preseed);
            company.AddCompanyGoal(new List <InvestmentGoal>()); // new InvestmentGoalGrowCost(1000000)
            company.AddCompletedGoals(new List <InvestorGoalType>());

            // Branding?
            company.AddBranding(0);

            // teams
            company.AddWorkerOffers(new List <ExpiringJobOffer>());
            company.AddTeam(
                100, 50,
                new Dictionary <int, WorkerRole>(),
                new Dictionary <WorkerRole, int> {
                [WorkerRole.Programmer] = 0
            },
                new List <TeamInfo>(),
                0
                );

            // add team for CEO
            Teams.AddTeam(company, context, TeamType.CrossfunctionalTeam);
            company.team.Teams[0].Workers        = Teams.GetMaxTeamSize(TeamRank.Solo);
            company.team.Teams[0].HiringProgress = 100;


            // CEO
            int CeoID = CEO.HumanComponent.Id;

            CEO.HumanSkillsComponent.Traits.RemoveAll(t => t == Trait.Greedy);

            company.AddCEO(0, CeoID);
            company.AddEmployee(new Dictionary <int, WorkerRole>());

            company.AddTeamEfficiency(new TeamEfficiency());

            Teams.AttachToCompany(company, context, CEO, WorkerRole.CEO, 0);

            Teams.SetJobOffer(CEO, company, new JobOffer(0), 0, context);

            // uniqueness

            company.AddCompanyStrategies(RandomEnum <CompanySettingGrowthType> .GenerateValue(), RandomEnum <CompanySettingAttitudeToWorkers> .GenerateValue(), RandomEnum <CompanySettingControlDesire> .GenerateValue());


            company.AddCompanyFocus(new List <NicheType>(), new List <IndustryType>());

            company.AddMetricsHistory(new List <MetricsInfo>());
            //e.AddCooldowns(new List<Cooldown>());

            return(company);
        }
        private static void ApplyLowSalaryLoyalty(GameEntity company, ref Bonus <int> bonus, HumanFF worker)
        {
            bool isFounder = worker.hasShareholder; // &&

            // company.shareholders.Shareholders.ContainsKey(worker.shareholder.Id);

            if (isFounder)
            {
                return;
            }

            var salary = Humans.GetSalary(worker);

            var expectedSalary = (double)GetSalaryPerRating(worker);

            bool isGreedy = Humans.HasTrait(worker, Trait.Greedy);
            bool isShy    = Humans.HasTrait(worker, Trait.Shy);

            float multiplier = 0.8f;

            if (isGreedy)
            {
                multiplier = 0.9f;
            }
            else if (isShy)
            {
                multiplier = 0.5f;
            }

            // multiply on 4 cause period = week
            if (salary * 4 < expectedSalary * multiplier)
            {
                bonus.Append("Low salary", -5);
            }
        }
 public static int GetLoyaltyChangeForManager(HumanFF worker, TeamInfo team,
                                              Dictionary <CorporatePolicy, int> culture, GameEntity company)
 {
     return(GetLoyaltyChangeBonus(worker, team, culture, company).Sum());
 }
        static void SetPrimaryTrait(HumanFF worker, Trait traitType)
        {
            int level = UnityEngine.Random.Range(70, 90);

            SetTrait(worker, traitType);
        }
        static void SetPrimarySkill(HumanFF worker, WorkerRole role)
        {
            int level = UnityEngine.Random.Range(65, 85);

            SetSkill(worker, role, level);
        }
Beispiel #20
0
 public static bool IsEmployed(HumanFF worker)
 {
     return(worker.WorkerComponent != null && worker.WorkerComponent.companyId != -1);
     //return worker.hasWorker && worker.worker.companyId != -1;
 }
Beispiel #21
0
 public static void TransferWorker(GameEntity company, HumanFF worker, WorkerRole role, int fromId, int toId, GameContext gameContext)
 {
     AttachHumanToTeam(company, gameContext, worker, role, toId);
     DetachHumanFromTeam(company.team.Teams[fromId], worker.HumanComponent.Id);
 }
Beispiel #22
0
        // actions
        public static HumanFF SetSkill(HumanFF worker, WorkerRole workerRole, int level)
        {
            worker.HumanSkillsComponent.Roles[workerRole] = level;

            return(worker);
        }
 public static TeamInfo GetTeamOf(HumanFF human, GameContext gameContext)
 {
     return(GetTeamOf(human, Companies.Get(gameContext, human.WorkerComponent.companyId)));
 }
Beispiel #24
0
 public static long GetSalaryPerRating(HumanFF human) => GetSalaryPerRating(human, Humans.GetRating(human));
Beispiel #25
0
 public static string GetFullName(HumanFF human)
 {
     return($"{human.HumanComponent.Name} {human.HumanComponent.Surname}");
 }
 public static TeamInfo GetTeamOf(HumanFF human, GameEntity company)
 {
     return(company.team.Teams.Find(t => t.Managers.Any(h => h.HumanComponent.Id == human.HumanComponent.Id)));
 }
Beispiel #27
0
 public static long GetSalary(HumanFF human)
 {
     return(GetCurrentOffer(human).JobOffer.Salary);
 }
        public static Bonus <float> GetOpinionAboutOffer(HumanFF worker, ExpiringJobOffer newOffer)
        {
            bool willNeedToLeaveCompany = worker.WorkerComponent.companyId != newOffer.CompanyId;

            var bonus = new Bonus <float>("Opinion about offer");

            // scenarios
            // 1 - unemployed
            // 2 - employed, same company
            // 3 - employed, recruiting
            // 4 - !founder

            if (!Humans.IsEmployed(worker))
            {
                return(bonus.Append("Salary", newOffer.JobOffer.Salary > GetSalaryPerRating(worker) ? 1 : -1));
            }

            int loyaltyBonus         = (worker.HumanCompanyRelationshipComponent.Morale - 50) / 10;
            int desireToLeaveCompany = 0;

            if (willNeedToLeaveCompany)
            {
                // it's not easy to recruit worker from other company
                desireToLeaveCompany -= 5;

                // and if your worker loves stability...
                if (Humans.HasTrait(worker, Trait.Loyal))
                {
                    desireToLeaveCompany -= 5;
                }

                // but if your worker loves new challenges...
                if (Humans.HasTrait(worker, Trait.NewChallenges))
                {
                    desireToLeaveCompany += 10;
                }

                if (desireToLeaveCompany > 0)
                {
                    bonus.AppendAndHideIfZero("Wants to leave company", desireToLeaveCompany);
                }
                else
                {
                    bonus.AppendAndHideIfZero("Wants to stay in company", desireToLeaveCompany);
                }

                bonus.Append("Loyalty to company", -loyaltyBonus);
            }
            else
            {
                // prolongation of contract
                bonus.Append("Loyalty to company", loyaltyBonus);
            }

            long newSalary = newOffer.JobOffer.Salary;

            long salary;

            salary = (long)Mathf.Max(Humans.GetCurrentOffer(worker).JobOffer.Salary, 1);

            float salaryRatio;

            salaryRatio = (newSalary - salary) * 1f / salary;
            salaryRatio = Mathf.Clamp(salaryRatio, -5, 5);

            bonus.Append("Salary", salaryRatio);


            return(bonus);
        }
Beispiel #29
0
 public static bool HasTrait(HumanFF worker, Trait trait)
 {
     return(worker.HumanSkillsComponent.Traits.Contains(trait));
 }
        public static int GetLoyaltyChangeForManager(HumanFF worker, TeamInfo team, GameEntity company)
        {
            var culture = Companies.GetActualCorporateCulture(company);

            return(GetLoyaltyChangeForManager(worker, team, culture, company));
        }