Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Locked thread
Fedule
Mar 27, 2010


No one left uncured.
I got you.

Dr. Stab posted:

drat, this would have been super trippy if we had done it in the other order. Oh well.

VLR.txt.

Okay, but seriously. One of the many things that I've been waiting to say until they're no longer spoilers is this: VLR is very different depending on the order you play paths and find things out, but it always works.

Adbot
ADBOT LOVES YOU

dscruffy1
Nov 22, 2007

Look out!
Nap Ghost
I was guessing the whole "TURNS OUT THIS WAS THE FIRST TIME SHE WAS REFERRING TO" but I don't feel smug that I guessed right. Hmmm.

evilspacehopper
Oct 10, 2012

Hinawa remembered in death as she was in life: endlessly eating birds.

Fedule posted:

VLR.txt.

Okay, but seriously. One of the many things that I've been waiting to say until they're no longer spoilers is this: VLR is very different depending on the order you play paths and find things out, but it always works.

Will you be showing us the other betray path? Because I did this in the same order as the LP so I'd like to see how it changes.

But yeah the best part of this is there's no wrong way to do this game, the funny thing is the thread is going the same way I did this.

Austrian mook
Feb 24, 2013

by Shine

dscruffy1 posted:

I was guessing the whole "TURNS OUT THIS WAS THE FIRST TIME SHE WAS REFERRING TO" but I don't feel smug that I guessed right. Hmmm.

well yeah pretty much everyone figured that out.

Color Printer
May 9, 2011

You get used to it. I don't
even see the code. All I see
is Ipecac, Scapular, Polyphemus...


Your UNIX titles continue to make me smile. :allears:

Podima
Nov 4, 2009

by Fluffdaddy

evilspacehopper posted:

Will you be showing us the other betray path? Because I did this in the same order as the LP so I'd like to see how it changes.

The problem is that this would require replaying from a fresh save - once you've done stuff in a certain order, you can't go back and get the "fresh" dialogue for situations like this.

Hogama
Sep 3, 2011
Now Sigma remembers betraying, but not betraying because he was already betrayed. I guess that means the timeline where the plot lock popped up won't ever stop Phi from escaping.

youcallthatatwist
Sep 22, 2013

Podima posted:

The problem is that this would require replaying from a fresh save - once you've done stuff in a certain order, you can't go back and get the "fresh" dialogue for situations like this.

I guess we're lucky, then, that as far as I remember there is no fresh dialogue for this part. If you betray first, everything happens the same way except that you only see the ally scene from this update.

Regy Rusty
Apr 26, 2010

We've already seen all the text in this section. The only way you miss anything is if you betray first and then ally, since that means you never get the dialogue we got the first time we allied.

Shei-kun
Dec 2, 2011

Screw you, physics!
What the hell? The solution was CLEARLY to smack Phi on the back of the head.

Clearly.

Damnit, Sigma, you wuss! :argh:

Glazius
Jul 22, 2007

Hail all those who are able,
any mouse can,
any mouse will,
but the Guard prevail.

Clapping Larry
Well, I wonder how Phi's going to go from here.

ApplesandOranges
Jun 22, 2012

Thankee kindly.
Did Hope finally bring Virtue down?

Fedule
Mar 27, 2010


No one left uncured.
I got you.
No, I am procrastinating from playing video games for the internet by working on my final year project (and also occasionally recording commentary for Artix's FFXIII LP). Actually there's a funny story about my final year project and VLR... but I'll tell you that one in a few days, maybe.

Ometeotl
Feb 13, 2012



It's MISSEL! Or SISSLE!
I confused myself...



You captured a bunch of people and subjected them to a Prisoner's Dilemma for science?

Catsworth
Sep 30, 2009

Who doesn't wanna be Johnny Cat?

Yes. It was us. We are Fedule's final project. :tinfoil:

Austrian mook
Feb 24, 2013

by Shine
Funny story: I was a counseller at a summer camp with my friend, and when we were in charge of the big camp games, we ran something that was effectively a cheap version of the prisoners dillema for candy. It was... pretty interesting.

RefinedUndefined
Jan 1, 2013

Just burn everything, that'll solve your problems.

Austrian mook posted:

Funny story: I was a counseller at a summer camp with my friend, and when we were in charge of the big camp games, we ran something that was effectively a cheap version of the prisoners dillema for candy. It was... pretty interesting.

Can you tell us more?

Austrian mook
Feb 24, 2013

by Shine

RefinedUndefined posted:

Can you tell us more?

basically instead of dying, the kids just got candy if their group allied, and one kid got extra candy if he alone betrayed them. It was pretty entertaining, but we got in trouble because kids pretty quickly got upset and started hitting eachother over it.

RefinedUndefined
Jan 1, 2013

Just burn everything, that'll solve your problems.

Austrian mook posted:

basically instead of dying, the kids just got candy if their group allied, and one kid got extra candy if he alone betrayed them. It was pretty entertaining, but we got in trouble because kids pretty quickly got upset and started hitting eachother over it.

How many of them started fighting?

Austrian mook
Feb 24, 2013

by Shine

RefinedUndefined posted:

How many of them started fighting?

Really just like one hit another, it wasn't like anarchy was unleashed or anything but we got in huge poo poo for it and weren't invited back the next year. Worth it though, I'd say.

Walterion
Feb 26, 2010

Austrian mook posted:

Really just like one hit another, it wasn't like anarchy was unleashed or anything but we got in huge poo poo for it and weren't invited back the next year. Worth it though, I'd say.

Did they also start spouting latin at each other to justify their choices?

Austrian mook
Feb 24, 2013

by Shine

Walterion posted:

Did they also start spouting latin at each other to justify their choices?

In my head-cannon, Phi actually doesn't know a word of latin and just tries really hard to sound smart.

Captain Walker
Apr 7, 2009

Mother knows best
Listen to your mother
It's a scary world out there

Austrian mook posted:

In my head-cannon, Phi actually doesn't know a word of latin and just tries really hard to sound smart.

Man, I wish more people confused "cannon" for "canon" in a way that reminded me of Deus Ex.

Content: Remind me, have we reached any of the proper endings yet? For all the Alice hate her ending is by far my favorite.

Blueberry Pancakes
Aug 18, 2012

Jack in!! MegaMan, Execute!
We have not seen an ending yet. We came close a few times, but plot locks have impeded us.

It doesn't help that at the beginning of the game, your options for getting endings are very limited due to the various locks.

Blueberry Pancakes fucked around with this message at 18:01 on Apr 12, 2014

Captain Walker
Apr 7, 2009

Mother knows best
Listen to your mother
It's a scary world out there
According to a spoiler-rific flow chart I've seen there's only one ending without any plot locks on the way.

edit because too specific, sorry

Captain Walker fucked around with this message at 18:38 on Apr 12, 2014

D3m3
Feb 28, 2013

Why do birds suddenly appear every time you are near?
Uh, is the specific number of paths without plot-locks an OK thing to talk about now, even though our explorations haven't show how many there are? Because that feels like something that exists in the realm of being nebulously spoiler-y.

Fedule
Mar 27, 2010


No one left uncured.
I got you.
Yeah, let's just not talk about stuff on the flowchart we haven't gotten to yet please.

Captain Walker
Apr 7, 2009

Mother knows best
Listen to your mother
It's a scary world out there
Man, talking about this game is hard.

Fedule
Mar 27, 2010


No one left uncured.
I got you.
A common lamentation re: big twisty stories.

Just by way of not going silent; my final year project deadline is Tuesday the 22nd. I hope to do an update very soon after then.

Depending on how things go this weekend, there may be a very interesting thread derail between now and then.

Nagna Zul
Aug 9, 2008
I really hope this LP doesn't end here. Stopping after reading through half the game would be enough to make me buy a 3DS just to finish the story.

MiddleOne
Feb 17, 2011

Nagna Zul posted:

I really hope this LP doesn't end here. Stopping after reading through half the game would be enough to make me buy a 3DS just to finish the story.

It's not like there aren't alternatives. If you don't like waiting then you should know that Supergreatfriend has been streaming VLR for the last 6 months and so far the stream has reached 3 of the endings. All the parts are up on youtube and the stream has mostly been picking the same choices as the LP so finding a place to start shouldn't be that hard. Just look between part 30-40 until you find one where the flowchart is similiar to the LP.

https://www.youtube.com/playlist?list=PLaSPgE4K0SB3tJdWbJO03p1UbDz0DtNX-

At that note jesus is this game long. The current combined length of the streams is 32 hours. I don't even want to imagine how much time you've spent working on updates Fedule seeing as you started in May last year. :stare:

Fedule
Mar 27, 2010


No one left uncured.
I got you.
This seems like a good time to reiterate that the current delay is due to my Final Year Project, whose deadline is on Tuesday and after which I am right back on this because frankly I miss it. And honestly you'll find that amusing after I tell you more about what I'm actually working on.

If you think that my project is simulating the AB Game you're only half wrong.

Kinu Nishimura
Apr 24, 2008

SICK LOOT!
You're literally going to code Zero III, aren't you.

TheObserver
Nov 7, 2012

alcharagia posted:

You're literally going to code Zero III, aren't you.

That's ridiculous - next you'll say he's posting from the moon or something like that.

whitehelm
Apr 20, 2008

Fedule posted:

This seems like a good time to reiterate that the current delay is due to my Final Year Project, whose deadline is on Tuesday and after which I am right back on this because frankly I miss it. And honestly you'll find that amusing after I tell you more about what I'm actually working on.

If you think that my project is simulating the AB Game you're only half wrong.

Half wrong....so you're simulating the Nonary Game?

Waffleman_
Jan 20, 2011


I don't wanna I don't wanna I don't wanna I don't wanna!!!

Xoidanor posted:

At that note jesus is this game long. The current combined length of the streams is 32 hours. I don't even want to imagine how much time you've spent working on updates Fedule seeing as you started in May last year. :stare:

My final playtime was over 60 hours.

WELCOME TO VLR.

Fedule
Mar 27, 2010


No one left uncured.
I got you.

whitehelm posted:

Half wrong....so you're simulating the Nonary Game?

Basically I'm codifying a Bigger Badder Awesomer version of the Iterated Prisoner's Dilemma and writing a... basically a platform that allows people to write strategies in Python which my program can then test under various tournament rules (like, sometimes you can see what everyone did last round, sometimes you can only see your own games).

Anyone want to try implementing a strategy? I don't want to carelessly say "thread competition" but this might tread dangerously close to actual work. I could use some actual bona-fide user-submitted strategies, though.

quote:

To create a player for Enhanced Prisoner's Dilemma testing, simply copy the provided example file and replace the attributes between the curly braces with those of your choosing. Make sure to save the file with the extension ".prisoner".

@name{} - A proper noun with which one can refer to your player. Will be used in leaderboards.

@stratname{} - A succinct descriptive phrase describing the strategy your player employs.

@author{} - Your own name, or pseudonym. If you wish, you may leave this attribute out entirely, in which case your player and strategy will be credited to "Anonymous".

@strategy{} - Executable Python code implementing your chosen strategy. You MUST define a function "decide(info)" which MUST return a boolean - True to signify Trust and False to signify Betray. This function will be called (with an info object as an argument) when it is time for your player to render its decision. You may define other functions and import modules from Python's standard library if you wish. An example strategy that plays randomly might be:

code:
def decide(info):
	from random import randint
	if randint(1,2) == 1:
		return True
	else:
		return False
If for any reason your code fails to execute within one second of being called your player will default to trust.

info will always be an Info object, which will contain relevant information you can query to inform your strategy.


The Info Object:

Info.rounds - list - an iterable list of Round objects representing all rounds that have been played during the current tournament. The most recent round will be at index 0 and the earliest round at the last index. Several objects are nested in Rounds - Rounds contain several Games, Games each contain two Participants, and Participants have various attributes you can query. More detail below. Will be empty if the current round is the first or if the tournament rules specify that players cannot access detailed logs of each round.

Info.scoreboard - list - an iterable list of Entry objects representing the status of the other players. Each entry contains attributes to query. Will be empty if the tournament rules specify that players cannot see information about other players.

Info.facts - a Facts object whose attributes are information pertinent to the current game and the tournament rules. Use this information to inform your strategy or perform specific lookups from the rest of the information block.

Info.history - History - A record of games you have been involved in in the current tournament. Updated only between rounds. Will be empty if the current round is the first or if the tournament rules specify that players cannot see their own outcome histories. Players are more likely to be able to see their own histories than general records or the scoreboard.

Info.whiteboard - string - a blank attribute for you to do with as you please. Will be preserved between rounds and will never be invisible. Initialized to an empty string.

Info.GetLastXRounds(x) - returns the last x Rounds in reverse chronological order. Will always return x Rounds, even if less than x Rounds are available - this is done by padding the end of the list easily identifiable "dummy" Rounds if necessary. Dummy Gounds contain Dummy Games which contain Dummy Participants which have all their attributes set to "Unavailable". Returns a single round if x = 1 or a list otherwise.

Info.LookupGamesBetween(id1, id2, x) - returns the last x Games objects between players matching the two provided IDs. As with GetLastXRounds(), can return dummy Games. Returns a single round if x = 1 or a list otherwise.

Info.LookupGamesWith(id, x) - as with LookupGamesBetween() but with only one ID needed.


The Round object:

The round object represents a recorded round of a tournament and is not particularly complex.

Round.games - list - an iterable list of Game objects. All games in a round are assumed to have taken place concurrently but by necessity they are stored in an arbitrary order.

Round.roundnumber - int - the number of this round.

Round.dummy - bool - set to True if this round is a dummy spawned by calling Info.GetLastXRounds() and requesting more rounds than are available, and False if it is an actual Round record with information that is of use to you.


The Game object:

The Game object represents a single game of Prisoner's Dilemma between two players.

Game.participants - list - an iterable list of the two participants in this game.

Game.dummy - list - true if this Game is a dummy.

Game.GetParticipants() - returns a list containing the unique identifiers of the two participants in this game.

Game.GetOutcomeFor(id) - returns the "outcome" string for the whichever player matches the provided id. Returns the string "Unavailable" if the id matches neither participant.


The Participant object:

Represents a single participant in one game and has the following attributes:

Participant.id - string - this participant's unique identifier.
Participant.score - int - this participant's score at the start of the game.
Participant.decision - string - Did this participant "Trust" or "Betray"?
Participant.outcome - string - which of the outcomes, "MutualTrust", "Betray", "Sucker", "MutualBetray" did this player receive?
Participant.alive - bool - True if this player was alive.
Participant.diedround - int - if this player is dead, the round number in which they died. Set to 0 if they are alive.
Participant.winning - bool - True if this player's score was above the win threshold, if one is set.
Participant.dummy - bool - True if this participant is a dummy.


The (Scoreboard) Entry object:

Information about the players in the game.

Entry.id - string - This player's unique identifier.
Entry.score - int - This player's score.
Entry.rank - int - This player's ranking in the current tournament.
Entry.alive - bool - True if this player is alive.
Entry.diedround - int - The round in which this player died, if they are dead, or 0 otherwise.
Entry.winning - bool - True if this player's score is above the win threshold if one is set.

Entry.timestrusting - int - Number of times this player has voted "Trust".
Entry.timesbetraying - int - Number of times this player has voted "Betray".

Entry.mtrusts - int - Number of times this player has received the "MutualTrust" outcome.
Entry.betrays - int - Number of times this player has received the "Betray" outcome.
Entry.suckers - int - Number of times this player has received the "Sucker" outcome.
Entry.mbetrays - int - Number of times this player has received the "Mutual Betray" outcome.

Entry.nicepercent - float - Percentage of times this player is "Nice", ie, Trusts an opponent they are meeting for the first time.
Entry.forgivingpercent - float - Percentage of times this player is "Forgiving", ie, Trusts a player who has previously Betrayed them once that opponent Trusts them.
Entry.retaliatingpercent - float - Percentage of times this player is "Retaliating", ie, Betrays an opponent who has previously Betrayed them.
Entry.nonenviouspercent - float - Percentage of times this player is "Non-Envious", ie, Trusts a player who has previously Trusted them.
Entry.ruthlesspercent - float - Percentage of times this player is "Ruthless", ie, Betrays a player who is one Sucker payoff removed from the death threshold if one has been set.

Entry.murders - int - Number of players this player has killed. Anyone who betrays a player in the round in which that player dies is considered their murderer.


The Facts object:

Pertinent facts about the game in progress.

Facts.totalrounds - int - max number of rounds, or 0 if indeterminate.
Facts.endchance - float - percentage chance to end tournament after each round. Can be 0.
Facts.winthreshold - int - players are "Winning" if their score reaches this value. 0 if Winning disabled.
Facts.winsrequired - int - if this many players are "Winning", the tournament ends. 0 if Winning disabled.
Facts.deaththreshold - int - players die if their score reaches this value. 0 = death disabled.
Facts.payoff.trust - int - the Mutual Trust payoff.
Facts.payoff.betray - int - the Betrayal payoff.
Facts.payoff.sucker - int - the Sucker payoff.
Facts.payoff.mbetray - int - the Mutual Betray payoff.

Facts.myid - string - a string that uniquely identifies you in all records.
Facts.opponentid - string - a string that uniquely identifies your current opponent in all records.
Facts.myscore - int - your current score.
Facts.opponentscore - int - your current opponent's score.
Facts.currentround - int - the number of the current round.


The History object:

A record of games you have been involved in.

History.games - An iterable list of Game objects. Ordered chronologically by round and arbitrarily within rounds.

LookupGames(x, [id]) - Look up your last x games, and optionally filter by a given opponent ID. As with the methods in the Info object, this method will always return x Games and will pad the end of the list with dummy Games if necessary and returns a single Game if x = 1 or a list otherwise.

An example strategy - if it's comprehensible to you, then try thinking of one of your own! (If the name gave it away, consider how he does it regardless of the rules (ie, whether or not he is given detailed rounds or history records))

code:
@name{President Madagascar}

@stratname{The Madagascar Gambit}

@author{Fedule}

@strategy{
def decide(info):

	if info.whiteboard == "":
		info.whiteboard = [0, 0, 1]
		
	if info.whiteboard == "SHUTDOWNEVERYTHING":
		return False
		
	lastround = info.GetLastXRounds(1)
	if not(lastround.dummy):
		for g in lastround.games:
			for p in g.participants:
				if p.decision == "Betray":
					info.whiteboard = "SHUTDOWNEVERYTHING"
					return False
	
	if info.history.games:
		for g in info.history.games:
			if (g.outcome == "Sucker" or g.outcome == "MutualBetray"):
				info.whiteboard = "SHUTDOWNEVERYTHING"
				return False
				
	if info.whiteboard[2] == info.facts.currentround:
		pass
	else:
		info.whiteboard[2] = info.facts.currentround
		info.whiteboard[0] = info.whiteboard[1]
		info.whiteboard[1] = 0
			
	if info.facts.myscore < info.whiteboard[0]:
		info.whiteboard = "SHUTDOWNEVERYTHING"
		return False
		
	info.whiteboard[1] += info.facts.payoff.trust
	return True
}

Fedule fucked around with this message at 03:01 on Apr 21, 2014

Sentient Data
Aug 31, 2011

My molecule scrambler ray will disintegrate your armor with one blow!
There's no way it could be done before Tuesday, but if you have everything automated it would be interesting to see what kind of strongest survivors arise from evolution. Start with X number of participants, give each of them different inclinations (raw percentages of if they should ally/betray given no other input), and come up with a list of different conditions that could happen based on your functions (If X was Y in the previous round, do Z; X being self or opponent, Y being sucker/betrayer/etc, Z being ally/betray choice, etc). Let them run wild, "mate" the strongest survivors (swap a random property from each, introduce random change to their strategy), and re-run a few million times

Clarste
Apr 15, 2013

Just how many mistakes have you suffered on the way here?

An uncountable number, to be sure.
...haven't people already been running these simulations for years/decades by now? Probably an interesting exercise for the programmer, but I wouldn't expect to get any novel results out of this.

Adbot
ADBOT LOVES YOU

Elite
Oct 30, 2010
Here's my strategy!

code:
Choose Betray
     IF Opponent chooses Betray
     THEN Switch timeline to a timeline where Opponent chooses Ally instead.
gg. no re.

  • Locked thread