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)) }); }
public static void SetRole(HumanFF human, WorkerRole workerRole) { if (human.WorkerComponent == null) { human.WorkerComponent = new WorkerComponent(); } human.WorkerComponent.WorkerRole = workerRole; }
public static HumanFF SetTrait(HumanFF worker, Trait trait) { if (!HasTrait(worker, trait)) { worker.HumanSkillsComponent.Traits.Add(trait); } return(worker); }
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); }
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); }
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); }
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}"); }
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); }
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); }
public static void FireManager(GameContext gameContext, HumanFF worker) => FireManager(Companies.Get(gameContext, worker.WorkerComponent.companyId), gameContext, worker.HumanComponent.Id);
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; } }
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); }
public static bool IsEmployed(HumanFF worker) { return(worker.WorkerComponent != null && worker.WorkerComponent.companyId != -1); //return worker.hasWorker && worker.worker.companyId != -1; }
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); }
// 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))); }
public static long GetSalaryPerRating(HumanFF human) => GetSalaryPerRating(human, Humans.GetRating(human));
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))); }
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); }
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)); }