======= 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