NOTES I refer to the roles Engineer, Doctor, GA, Guard, and Crew as the good roles. I refer to the roles AC Follower, Gnosia, and Bug as the evil roles. Internally, the game separates the state of the Definite Human skill into two categories based on whether the target could be the AC Follower or cannot be the AC Follower. I refer to targets that cannot be AC Follower as Def Crew, and targets that could be AC Follower as Def Human. When I say Def Crew/Human, I mean Def Crew or Def Human. Revealed Guards are always considered to be Def Crew. If a Def Human character has the Def Crew version of the skill used on them later, they are both Def Human and Def Crew. The Definite AC Follower version of Definite Enemy is a special case and applies both Def Human and Def Enemy. Internally, stat values are recorded as numbers between 0 and 1, where 1 is equivalent to the max stat value of 50. Whenever stat values are used here, I have already accounted for this, so you should use the normal stat values in the range 0 to 50. The 6 personality attributes are Playful, Social, Logic, Neat, Desire, and Courage. I refer to the Logic personality attribute as Smart instead to differentiate it from the Logic stat which is completely different. From now on, whenever I say Logic, I mean the Logic stat and not the Smart personality attribute. All NPC personality are fixed and never change. You can find a reference for their values here: https://www.reddit.com/r/Gnosia_/comments/v20o0o/character_attributes/ When I refer to a reverse personality attribute, I mean the value of that attribute when subtracted from 1. For example, if a character's Courage is 0.75, their reverseCourage is 0.25. When I say that a number x scales with Smart[y], it means that the final value only reaches x when Smart is 1. Otherwise, (1-Smart)*y*x is lost from the value of x. For example, say a number increases by 5, scaled with Smart[0.50] and reverseCourage[0.30]. That means that 0.50*5 = 2.5 of the total value is dependent on how high Smart is. If Smart is actually 0.4 then only 0.4*2.5 = 1 is gained instead of the full 2.5. Similarly, it means that 0.30*5 = 1.5 of the total value is dependent on how high reverseCourage is. If Courage is 0.4, then reverseCourage is 0.6, and then only 0.6*1.5 = 0.9 is gained instead of the full 1.5. Because the scalings indicated for Smart and reverseCourage do not total to 1, that indicates that there is a portion of the gain that is fixed. In this case, that is 1-0.50-0.30 = 0.20. Since 0.20*5 = 1, that means there is a fixed gain of 1 regardless of the values of Smart and Courage. So an increase of 5, scaled with Smart[0.50] and reverseCourage[0.30], becomes an actual increase of 1 + 0.9 + 1 = 2.9 when Smart=0.4 and Courage = 0.4. All characters not claiming any other role are considered to be claiming unroled Crew. I refer to three types of logic tables: game, private, and public. There is one game logic table that contains all information that can be publically discerned. Each character has their own private logic table which contains everything from the game logic table plus their own private information. Each character has a public logic table which conatines everything from the game logic table plus the assumption that they are not Evil. This pseudocode is how a single character decides who they will vote for. It runs for every voting character. === Initialize our tentative vote target to whoever the first candidate in the list is, with willingess -10000 //This will be top-most candidate in the left-most column of the voting screen //It will always be the player unless this is a tie revote and the player not a candidate //It can be the voting character themself, potentially leading to an extremely rare bug where an NPC ultimately self-votes For each candidate except us: Let X be our inner trust of them, scaled by our reversePlayful[0.30] Initialize our willingness to vote for them to (1 - X) Multiply our willingness to vote for them by (0.75 + 0.25*[their hate]) Decrease our willingness to vote for them by 0.5 times our friendship toward them, scaled by our reverseSmart[0.50] If we are Good: Let X be the logical odds that the candidate is Good, based on our private logic table For all characters living or dead that claim the same role as the candidate, including the candidate themselves: Let Y be the average of the logical odds that each of these characters is Good, based on the game logic table Increase our willingness to vote for the candidate by (X - Y), scaled by our Logic[0.50] and Smart[0.50] //NOTE: I assume this is a bug and should be a decrease instead, because it makes us more willing to vote for characters that are logically Good and less willing to vote for characters that are logically Evil If the candidate is Def Crew: Decrease our willingness to vote for them by 0.75, scaled by our Smart[0.75] If the candidate is Def Human: Decrease our willingness to vote for them by 0.65, scaled by our Smart[0.75] Else If our private logic table says the candidate must be human: Decrease our willingness to vote for them by 0.50, scaled by out Smart[0.75] Let RISK be the logical odds that voting out this candidate would immediately trigger a Bug victory, based on our private logic table If we are not currently influenced by Freeze All against the candidate OR we are currently influenced by Don't Vote against the candidate: If we know the candidate's role for certain due to a Definite skill or Guard reveal or our own Engineer check on them came back as Gnosia: If we know the candidate is Engineer: Decrease our willingness to vote for them by 3, scaled by our Smart[1.00] If we know the candidate is Doctor: Decrease our willingness to vote for them by 2, scaled by our Smart[1.00] If we know the candidate is Guard: Decrease our willingness to vote for them by 1, scaled by our Smart[1.00] If we know the candidate is AC Follower: Increase our willingness to vote for them by 1, scaled by our Smart[1.00] If we know the candidate is Bug: Increase our willingness to vote for them by 4, scaled by our Smart[1.00] If we know the candidate is Gnosia: Increase our willingness to vote for them by 2*(1 - RISK), scaled by our Smart[1.00] Else: If the candidate claims Engineer: Decrease our willingness to vote for them by 3 times the logical odds they are Good according to our private logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 1.5 times our inner trust of them, scaled by our reverseSmart[1.00] If it is Day 1 and we also claim Engineer: Decrease our willingness to vote for them by 1, scaled by our Neat[0.50] and Smart[0.25] and reverseDesire[0.25] If the candidate claims Doctor: Decrease our willingness to vote for them by 2 times the logical odds they are Good according to our private logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 1 times our inner trust of them, scaled by our reverseSmart[1.00] If the candidate claims Guard: //Note: this is only reachable if there was a failed Guard reveal due to the Player Decrease our willingness to vote for them by 1 times the logical odds they are Good according to our private logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 0.5 times our inner trust of them, scaled by our reverseSmart[1.00] If the candidate has not claimed: Decrease our willingness to vote for them by 1 times the logical odds they are Good according to our private logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 0.5 times our inner trust of them, scaled by our reverseSmart[1.00] If we are currently strongly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 10 Else If we are currently weakly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 1 Else If our Smart is above 0.30: Decrease our willingness to vote for them by RISK*RISK*(LOGIC/50)*(2.5+2*reverseCourage) If we are currently strongly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 10 Else If we are current weakly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 1 Else: //We are Evil If we are not Def Enemy: Let X be the logical odds that the candidate is Good, based on our public logic table For all characters living or dead that claim the same role as the candidate, including the candidate themselves: Let Y be the average logical odds that each of these characters is Good, based on the game logic table Increase our willingness to vote for the candidate by (X - Y), scaled by our Logic[0.50] and Smart[0.50] //NOTE: I assume this is a bug and should be a decrease instead, because it makes us more willing to vote for characters that are logically on our side and less willing to vote for characters that are logically opposed to us If we are not currently influenced by Freeze All against the candidate OR we are currently influenced by Don't Vote against the candidate: If the candidate claims Engineer: Decrease our willingness to vote for them by 3 times the logical odds they are Good according to our public logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 1.5 times our public trust of them, scaled by our reverseSmart[1.00] If it is Day 1 and we also claim Engineer: Decrease our willingness to vote for them by 1, scaled by our Neat[0.40] and Smart[0.25] and reverseCourage[0.35] If the candidate claims Doctor: Decrease our willingness to vote for them by 2 times the logical odds they are Good according to our public logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 1 times our public trust of them, scaled by our reverseSmart[1.00] If the candidate claims Guard: Decrease our willingness to vote for them by 1, scaled by our Smart[1.00] Decrease our willingness to vote for them by 0.5, scaled by our reverseSmart[1.00] If the candidate has not claimed: Decrease our willingness to vote for them by 1 times the logical odds they are Good according to our public logic table, scaled by our Smart[1.00] Decrease our willingness to vote for them by 0.5 times our public trust of them, scaled by our reverseSmart[1.00] If we are Gnosia or AC Follower: If there are exactly 3 characters alive: If we are AC Follower: Let X be the logical odds that this candidate is Gnosia, based on our private logic table Decrease our willingness to vote for them by X*(1 - [our inner trust of them]) If X is 100%: Decrease our willinginess to vote for them by 100 Else If we Gnosia: If we are logically certain this candidate cannot be Bug based on our private logic table: Let X be the logical odds that this candidate is AC Follower, based on our private logic table Decrease our willingness to vote for them by 2*X, scaled by our Smart[1.00] If X is 100%: Decrease our willingness to vote for them by 100 Else If any currently alive character is Def Enemy OR There is no AC Follower in this loop or the AC Follower is dead OR We are not logically certain who the AC Follower is, according to our private logic table OR The Gnosia are more than one kill away from winning: If the candidate is not Def Enemy: If the candidate is Def Crew: Decrease our willingness to vote for them by 0.75, scaled by our Smart[0.75] If the candidate is Def Human: Decrease our willingness to vote for them by 0.65, scaled by our Smart[0.75] Else If our public logic table says the candidate must be human: Decrease our willingness to vote for them by 0.50, scaled by our Smart[0.75] If our public trust of the candidate is above (0.45 - 0.5*[our Neat]*[our reverseDesire]): Let X be the average public trust of the candidate Let Y be (X + 0.5*(1 - X)*[our Courage]) Decrease our willingness to vote for them by Y times the logical odds they are Gnosia according to our private logic table, scaled by our Neat[0.60] and reverseDesire[0.40] If we are logically certain the candidate is not Bug, based on our private logic table: Decrease our willingness to vote for them by 0.3 times the logical odds the candidate is AC Follower according to our private logic table, scaled by our Neat[1.00] If we are currently strongly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 10 Else If we are currently weakly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 1 Else If our Smart is above 0.30: Let RISK be the logical odds that voting out this candidate would immediately trigger a Bug victory, based on our private logic table Decrease our willingness to vote for them by RISK*RISK*(LOGIC/50)*(2.5+2*reverseCourage) If we are currently strongly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 10 Else If we are current weakly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 1 Else If we are AC Follower: Let X be the logical odds that this candidate is Gnosia, based on our private logic table Decrease our willingness to vote for them by X*(1 - [our inner trust of them]) If X is 100%: Decrease our willingness to vote for them by 100 Else: If the candidate is a fellow Gnosia: Decrease our willingness to vote for them by 200 If we are logically certain the candidate is not Bug, according to our private logic table: Let X be the logical odds the candidate is AC Follower, according to our private logic table Decrease our willingness to vote for them by 2*X, scaled by our Smart[1.00] If X is 100%: Decrease our willingness to vote for them by 100 If we are AC Follower and the candidate is Gnosia: Let G be the number of alive characters that could possibly be Gnosia, based on our private logic table If we are logically certain the candidate is Gnosia based on our private logic table AND we are not Def Enemy and they are not Def Enemy AND (G + 2) is greater than half the number of currently alive character AND we pass a random check with odds equal to 2*([our Smart] + [our Logic]/50): Decrease our willingness to vote for them by 1000 If our Intution is at least 20 AND they are not Def Enemy: Decrease our willingess to vote for them by [our Intution]/100 If we are AC Follower AND this candidate is the only living character that could logically be Gnosia according to our private logic table AND we pass a random check with odds equal to 2*([our Smart] + [our Logic]/50): Decrease our willingness to vote for them by 1000 Else: //We are Bug If the candidate is Def Crew: Decrease our willingness to vote for them by 0.75, scaled by our Smart[0.75] If the candidate is Def Human: Decrease our willingness to vote for them by 0.65, scaled by our Smart[0.75] Else If our public logic table says the candidate must be human: Decrease our willingness to vote for them by 0.50, scaled by our Smart[0.75] If we are currently strongly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 10 Else If we are currently weakly influenced by Freeze All or Vote against the candidate AND the candidate is not Def Crew: Increase our willingness to vote for them by 1 If we are currently strongly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 10 Else If we are current weakly influenced by Don't Vote against the candidate: Decrease our willingness to vote for them by 1 If it is Day 1 and the candidate is not the Player OR it is Day 2 or later: Increase our willingness to vote for the candidate by Random(0, 0.5), scaled by our Playful[0.50] If the candidate has global vote protection AND they are currently within 2 votes of the character with the most current votes AND not all of our candidates have global vote protection: Decrease our willingness to vote for them by 10000 If the candidate has personal vote protection from us: Decrease our willingness to vote for them by 10000 If our willingness to vote for this candidate is greater than the willingness of our tentative vote: Update our tentative vote target and willingness to be this candidate and this willingness Submit our tentative vote target as our final vote