======= Unions And Strikes Game Mechanics ======= The Game Mechanics section of the manual details the internal formula used in the game's calculations. This section of the manual uses pseudo-code and may not be 100% the same as the code in the game. The Game Mechanics part of the manual is mainly designed to be a reference for the frequently asked question, "Why do I get this rating when I do X, Y, Z?!" Usually, this answer involves many different variables, which this section of the manual demonstrates. **The game mechanics section of the manual shows [[https://idioms.thefreedictionary.com/seeing+how+the+sausage+gets+made|how the sausage gets made]]. So you really may want to avoid this portion of the manual if you enjoy the game.** ====== Variables ====== ^ Name ^ Description ^ ^ Name ^ Description ^ | **factoryWageDifficultyAddition** | This variable adjusts the wages demanded by factory employees. | | **City_Average_Wage** | This is the average pay in the city for all jobs. The game generates the value from the city's per capita income. | | **Factory_Wage** | The amount you're paying factory employees | | **Branch_Wage** | The amount you're paying branch employees | | **Engineering_Wage** | The amount you're paying engineering employees | | **Marketing_Wage** | The amount you're paying marketing employees | | **Admin_Wage** | The amount you're paying administration employees | | **total_furloughed** | This is the number of employees you have removed from work. This normally occurs when you adjust factory lines. Some furloughed workers will quit on their own. The rest are laid off automatically after 6 months unless you need them again. | | **total_employees** | This is the total number of employees you have | | **Department_Direct_Benefits** | Current Direct Benefits Slider position for the selected department | | **Department_Defined_Benefits** | Current Defined Benefits Slider position for the selected department | | **Department_Pension_Fees** | Current Defined Benefits Fee Slider position for the selected department | | **Employee_Moral** | This is the morale value of the employee. | | **StockMarket_GrowthRate** | This is the static growth value of the stock market as defined in the turnevents.xml file. | | **valueBP** | The current value of the Direct Benefits Slider | | **valuePA** | The current value of the Defined Benefits Slider | | **Last_5_Years_Income** | Total revenues over the last 5 years | | **Last_5_Years_Expenses** | Total expenses over the last 5 years | | **AdministrationSkill** | Administrative Skills | | **DCWant** | This is the Direct Benefits slider position that the Unions want. | | **DBWant** | This is the Defined Benefits slider position that the Unions want. | | **DBFeeSlider** | This is the Defined Benefits Fee slider position that the Unions want. | | **DCSlider** | This is the current Direct Benefits slider position. | | **DBSlider** | This is the Defined Benefits slider position. | | **CurrentWages** | This is the current wages for the department. | | **RequestedWage** | These are the wages the department requests. | ====== Employee Morale ====== ===== From Wages ===== ==== Factory ==== if( Factory_Wage < City_Average_Wage * (0.5211 + factoryWageDifficultyAddition) ) Morale = Morale - (5 * (1-(Factory_Wage/(City_Average_Wage * (0.5211 + factoryWageDifficultyAddition )))) else Morale = Morale + (3 * (1-(1+((City_Average_Wage * (0.5211 + factoryWageDifficultyAddition ))/Factory_Wage))) ==== Branches ==== if( Branch_Wage < City_Average_Wage * 1.25 ) Morale = Morale - (5 * (1-(Branch_Wage/(City_Average_Wage * 1.25 )))) else Morale = Morale + (3 * (1-(1+((City_Average_Wage * 1.25 )/Branch_Wage)))) ==== Engineering ==== if( Engineering_Wage < City_Average_Wage * 2 ) Morale = Morale - (5 * (1-(Engineering_Wage/(City_Average_Wage * 2)))) else Morale = Morale + (3 * (1-(1+((City_Average_Wage * 2)/Engineering_Wage)))) ==== Marketing ==== if( Marketing_Wage < City_Average_Wage * 1.3 ) Morale = Morale - (5 * (1-(Marketing_Wage/(City_Average_Wage * 1.3)))) else Morale = Morale + (3 * (1-(1+((City_Average_Wage * 1.3)/Marketing_Wage)))) ==== Administration ==== if( Admin_Wage < City_Average_Wage * 2.5 ) Morale = Morale - (5 * (1-(Admin_Wage/(City_Average_Wage * 2.5)))) else Morale = Morale + (3 * (1-(1+((City_Average_Wage * 2.5)/Admin_Wage)))) ===== From Furloughed ===== Factory morale only. furloughRatio = total_furloughed/total_employees laidOffRatio = (furloughed * 0.1)/total_employees if(furloughRatio>1) furloughRatio = 1 if(laidOffRatio>1) laidOffRatio = 1 Morale = Morale - ((0.075 * furloughRatio ) + ( 0.1 * laidOffRatio) ) ===== Benefits ===== ==== From Fees ==== AvgDepartmentDirectBenefits = Average Department Direct Benefits Percentage At All Companies AvgDepartmentDefinedBenefits = Average Department Defined Benefits Percentage At All Companies AvgDepartmentDirectBenefits = AvgDepartmentDirectBenefits * 0.9 + 0.0001 AvgDepartmentDefinedBenefits = AvgDepartmentDefinedBenefits * 0.9 + 0.0001 Department_Morale_Change = Department_Direct_Benefits/AvgDepartmentDirectBenefits + Department_Defined_Benefits/AvgDepartmentDefinedBenefits - Department_Pension_Fees * 1.5 if(Department_Morale_Change > 2) Department_Morale_Change = 2 else if(Department_Morale_Change < 2) Department_Morale_Change = -2 Department_Morale = Department_Morale - Department_Morale_Change ==== Underpaying Agreement ==== If(Department_Direct_Benefits < Agreed_Direct_Benefits OR Department_Defined_Benefits < Agreed_Defined_Benefits) { Department_Morale = Department_Morale - 2 } ==== New Agreement ==== Department_Morale = Department_Morale = 100 ===== From Events ===== ==== Fire Strikers ==== Department_Morale = Department_Morale * 0.8 ==== Major Strike ==== Department_Morale = Department_Morale * 0.5 ====== Striking ====== ===== To Strike ===== if(Random Number Between (0.0 AND 1.0) > (1-(0.5-(Employee_Moral/100.0))) Strike = true else if(StockMarket_GrowthRate > 1.02 AND Random Number Between (0 and 120) < 2) Strike = true ===== Wage Demand ===== //Branches ModValue = 1.25 //Factories ModValue = 0.5211 + factoryWageDifficultyAddition; //Marketing ModValue = 1.3; //Engineering ModValue = 2 //Admin ModValue = 2.5 if(stockmarketRates > 1.02 ) RequestedWage = (City_Average_Wage * ModValue * 1.2) * (Random Number Between (0 AND 0.13) + 1.05) + 10; else RequestedWage = (City_Average_Wage * ModValue) * (Random Number Between ( 0 AND 0.13)+1.05)+10; if(CurrentWages > RequestedWage) { RequestedWage = CurrentWages * 1.05 + 5; } ===== Strike Type ===== if(Benefits_Enabled AND Random Number Between (0 to 10) = 0) { //Generate Benefits Demand Here... See next segments } else if (Random Number Between (0 to 1) = 0) { No strike } else { Continue With Wage Strike } ===== Benefits Demand ===== The game may also generate benefit demands outside of the strike system. ==== Direct Benefits ==== if(Year < 2021) { yearAdj = 0.0095*((year-1899)/5); minimumRequest = 0.009*((year-1900)); } else { yearAdj = 0.0095*((121)/5); minimumRequest = 0.009*((120)); } if((year < 1975 AND Random Number Between (0 AND 99) < 6) OR (year > 1974 AND year < 1995 AND Random Number Between (0 AND 99) < 20) OR (year > 1994 AND Random Number Between (0 AND 99) < 30)) { requestAmount = valueBP + Random Number Between (0 AND 0.03) + yearAdj if(requestAmount > 2) requestAmount = 2; if(requestAmount < minimumRequest) requestAmount = minimumRequest; } ==== Defined Benefits ==== if( (year > 1918 AND year < 1995 AND Random Number Between (0 AND 99) < 60) OR (year > 1994 AND Random Number Between (0 AND 99) < 16)) { requestAmount = valuePA + Random Number Between (0 AND 0.03) + yearAdj if(requestAmount > 2) requestAmount = 2; if(requestAmount < minimumRequest) requestAmount = minimumRequest; } ====== Union Negotiations ====== negotiations = Last_5_Years_Income / (Last_5_Years_Expenses * 1.1) if(negotiations < 0.85) { negotiations = 0.85 } else if(negotiations > 1) negotiations = 1; if(AdministrationSkill > 0) { negotiations = negotiations - (0.2 * (AdministrationSkill/100.0)) } if(negotiations < 1) { if(negotiations < 0.65) { negotiations = 0.65; } DCWant = DCWant * negotiations; DBWant = DBWant * negotiations; } DBWant = DBWant + (DBFeeSlider*(1.0-(0.2 * (AdministrationSkill/100.0)))); if(DCSlider >= DCWant AND DBSlider >= DBWant) { The Union Approves! } ====== When To Stop Striking ====== if(CurrentWages > RequestedWage) Stop Striking if Successful Benefits Negotiation Stop Striking