@@ -13,11 +13,19 @@ void dRoleManager_SelectRoles(RoleManager* __this, MethodInfo* method) {
1313 auto roleRates = RoleRates (options, (int )allPlayers.size ());
1414
1515 AssignPreChosenRoles (roleRates, assignedPlayers);
16- AssignRoles (roleRates, roleRates.ShapeshifterChance , RoleTypes__Enum::Shapeshifter, allPlayers, assignedPlayers);
17- AssignRoles (roleRates, 100 , RoleTypes__Enum::Impostor, allPlayers, assignedPlayers);
18- AssignRoles (roleRates, roleRates.ScientistChance , RoleTypes__Enum::Scientist, allPlayers, assignedPlayers);
19- AssignRoles (roleRates, roleRates.EngineerChance , RoleTypes__Enum::Engineer, allPlayers, assignedPlayers);
20- AssignRoles (roleRates, 100 , RoleTypes__Enum::Crewmate, allPlayers, assignedPlayers);
16+
17+ if (options.GetGameMode () != GameModes__Enum::HideNSeek) {
18+ AssignRoles (roleRates, roleRates.ShapeshifterChance , RoleTypes__Enum::Shapeshifter, allPlayers, assignedPlayers);
19+ AssignRoles (roleRates, 100 , RoleTypes__Enum::Impostor, allPlayers, assignedPlayers);
20+ AssignRoles (roleRates, roleRates.ScientistChance , RoleTypes__Enum::Scientist, allPlayers, assignedPlayers);
21+ AssignRoles (roleRates, roleRates.EngineerChance , RoleTypes__Enum::Engineer, allPlayers, assignedPlayers);
22+ AssignRoles (roleRates, 100 , RoleTypes__Enum::Crewmate, allPlayers, assignedPlayers);
23+ } // Assign normal roles
24+ else {
25+ AssignRoles (roleRates, 100 , RoleTypes__Enum::Impostor, allPlayers, assignedPlayers);
26+ AssignRoles (roleRates, 100 , RoleTypes__Enum::Engineer, allPlayers, assignedPlayers);
27+ AssignRoles (roleRates, 100 , RoleTypes__Enum::Crewmate, allPlayers, assignedPlayers); // In case we do not assign everyone.
28+ }// Assign hidenseek roles
2129}
2230
2331/* void dRoleManager_AssignRolesForTeam(List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method) {
@@ -47,12 +55,29 @@ void AssignPreChosenRoles(RoleRates& roleRates, std::vector<uint8_t>& assignedPl
4755
4856void AssignRoles (RoleRates& roleRates, int roleChance, RoleTypes__Enum role, il2cpp::List<List_1_PlayerControl_>& allPlayers, std::vector<uint8_t >& assignedPlayers)
4957{
58+ GameOptions options;
5059 auto roleCount = roleRates.GetRoleCount (role);
60+ auto playerAmount = allPlayers.size ();
61+ auto maxImposterAmount = GetMaxImposterAmount ((int )playerAmount);
62+
63+ // if (role == RoleTypes__Enum::Shapeshifter || role == RoleTypes__Enum::Impostor) {
64+ // if (State.shapeshifters_amount + State.impostors_amount >= maxImposterAmount)
65+ // return; //Skip assigns when pre assigned enough imps.
66+ // }
67+
68+ if (options.GetGameMode () == GameModes__Enum::HideNSeek) {
69+ if (role == RoleTypes__Enum::Impostor)
70+ roleCount = 1 ; // Sometime the game would accidently make imp amount > 1.
71+ if (role == RoleTypes__Enum::Engineer)
72+ roleCount = playerAmount - 1 ; // For unknown reason Game simply set engineer amount in hidenseek to 0.
73+ }
74+
75+ if (role == RoleTypes__Enum::Shapeshifter && roleCount >= maxImposterAmount)
76+ roleCount = maxImposterAmount; // In previous version, aum would assign more imps than MaxImposterAmount based on shapeshifter amount.
77+
5178 if (roleCount < 1 )
5279 return ;
5380
54- auto playerAmount = allPlayers.size ();
55-
5681 for (auto i = 0 ; i < roleCount; i++)
5782 {
5883 if (assignedPlayers.size () >= playerAmount)
0 commit comments