diff --git a/assets/conclusion/summary.png b/assets/conclusion/summary.png new file mode 100644 index 0000000..33f28f4 Binary files /dev/null and b/assets/conclusion/summary.png differ diff --git a/assets/conclusion/truce.jpg b/assets/conclusion/truce.jpg new file mode 100644 index 0000000..27ed55d Binary files /dev/null and b/assets/conclusion/truce.jpg differ diff --git a/assets/sounds/evil_laugh.mp3 b/assets/sounds/evil_laugh.mp3 new file mode 100644 index 0000000..744ae4c Binary files /dev/null and b/assets/sounds/evil_laugh.mp3 differ diff --git a/assets/splash/splash_peep.json b/assets/splash/splash_peep.json index ef419d3..1d8844d 100644 --- a/assets/splash/splash_peep.json +++ b/assets/splash/splash_peep.json @@ -7,13 +7,21 @@ "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":302,"h":402}, "sourceSize": {"w":302,"h":402} +}, +"splash_peep0001": +{ + "frame": {"x":10,"y":422,"w":302,"h":402}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":302,"h":402}, + "sourceSize": {"w":302,"h":402} }}, "meta": { "app": "Adobe Animate", "version": "15.2.0.66", "image": "splash_peep.png", "format": "RGBA8888", - "size": {"w":512,"h":512}, + "size": {"w":512,"h":1024}, "scale": "1" } } diff --git a/assets/splash/splash_peep.png b/assets/splash/splash_peep.png index fbe3e5b..57b395b 100644 Binary files a/assets/splash/splash_peep.png and b/assets/splash/splash_peep.png differ diff --git a/index.html b/index.html index ada7e92..a95836e 100644 --- a/index.html +++ b/index.html @@ -97,11 +97,14 @@ window.onload = function(){ slideSelect.dom.style.display = "block"; // [FOR DEBUGGING] - //publish("slideshow/next"); - publish("slideshow/scratch", ["noise"]); + publish("slideshow/next"); + //publish("slideshow/scratch", ["conclusion"]); }); + // DEBUGGING + //Howler.mute(true); + // LOAD REAL THINGS Loader.loadAssets( Loader.manifest, diff --git a/js/sims/Iterated.js b/js/sims/Iterated.js index 98ba9a2..878719f 100644 --- a/js/sims/Iterated.js +++ b/js/sims/Iterated.js @@ -8,6 +8,7 @@ Loader.addToManifest(Loader.manifest,{ // SFX coin_insert: "assets/sounds/coin_insert.mp3", coin_get: "assets/sounds/coin_get.mp3", + evil_laugh: "assets/sounds/evil_laugh.mp3", }); @@ -202,6 +203,8 @@ function Iterated(config){ self.remove = function(){ app.destroy(); unlisten(self); + self.playerA.kill(); + self.playerB.kill(); _remove(self); }; @@ -457,6 +460,14 @@ function IteratedPeep(config){ if(self.payoff==PD.PAYOFFS.P) self.face.gotoAndStop(7); // Punishment Face if(self.payoff==PD.PAYOFFS.T) self.face.gotoAndStop(10); // Temptation Face! + // EVIL LAUGH + if(self.payoff==PD.PAYOFFS.T){ + setTimeout(function(){ + var stereo = (config.opponent) ? 0.9 : -0.9; + Loader.sounds.evil_laugh.stereo(stereo).volume(1).play(); + },100); + } + if(self.payoff==PD.PAYOFFS.T){ _isHopping = true; } @@ -584,6 +595,16 @@ function IteratedPeep(config){ self.animationDeferred.resolve(); }; + // KILL + self.kill = function(){ + // Remove ALL tweens + Tween.removeTweens(self.animated); + Tween.removeTweens(self.coin); + for(var i=0;i0){ for(var i=0; i0; i++){ // do NOT adjust anchor. var conf = Tournament.INITIAL_AGENTS[i]; if(conf.strategy==peepID) continue; if(conf.count==0) continue; // DO NOT ADD IF ZERO + everyoneWasZero = false; + conf.count++; // ADD + diff--; // yay + } + } + // ...edge case. fine w/e + if(everyoneElseWasZero){ + for(var i=0; i0; i++){ + // do NOT adjust anchor. + var conf = Tournament.INITIAL_AGENTS[i]; + if(conf.strategy==peepID) continue; + // if(conf.count==0) continue; // DO NOT ADD IF ZERO + // everyoneWasZero = false; conf.count++; // ADD diff--; // yay } @@ -302,12 +316,12 @@ function SandboxUI(config){ page.appendChild(_makeLabel("sandbox_payoffs", {x:0, y:0, w:433})); // PAYOFFS - var payoffsUI = new PayoffsUI({x:64, y:47, slideshow:self}); + var payoffsUI = new PayoffsUI({x:84, y:41, scale:0.9, slideshow:self}); page.appendChild(payoffsUI.dom); // Reset var resetPayoffs = new Button({ - x:320, y:300, text_id:"sandbox_reset_payoffs", size:"short", + x:240, y:300, text_id:"sandbox_reset_payoffs", message:"pd/defaultPayoffs" }); page.appendChild(resetPayoffs.dom); diff --git a/js/sims/Splash.js b/js/sims/Splash.js index fad9e95..1cd4b64 100644 --- a/js/sims/Splash.js +++ b/js/sims/Splash.js @@ -35,7 +35,7 @@ function Splash(config){ // PEEPS var peeps = []; self.addPeep = function(x, y){ - var peep = new SplashPeep({ x:x, y:y, app:app }); + var peep = new SplashPeep({ x:x, y:y, app:app, blush:config.blush }); peeps.push(peep); peepsContainer.addChild(peep.graphics); }; @@ -121,6 +121,7 @@ function SplashPeep(config){ // Graphics! var g = _makeMovieClip("splash_peep", {scale:0.3}); self.graphics = g; + if(config.blush) g.gotoAndStop(1); if(Math.random()<0.5) g.scale.x*=-1; // Flip? // Them variables... diff --git a/js/slides/1_Slides_OneOff.js b/js/slides/1_Slides_OneOff.js index 5cc056b..2f377e2 100644 --- a/js/slides/1_Slides_OneOff.js +++ b/js/slides/1_Slides_OneOff.js @@ -79,6 +79,9 @@ SLIDES.push({ _hide(o.btnCheat); _fadeIn(o.btnCheat, 150+1200); _hide(o.btnCooperate); _fadeIn(o.btnCooperate, 150+1200); + }, + onend: function(self){ + self.remove("btmWords"); } },{ @@ -92,19 +95,21 @@ SLIDES.push({ // Text var t = o.topWords; - var b = o.btmWords; if(_.answer=="COOPERATE"){ t.setText(Words.get("oneoff_2_cooperated")+"
"+Words.get("oneoff_2_top")); }else{ t.setText(Words.get("oneoff_2_cheated")+"
"+Words.get("oneoff_2_top")); } - b.setTextID("oneoff_2_btm"); + self.add({ + id:"btmWords", type:"TextBox", text_id:"oneoff_2_btm", + x:130, y:392, width:700, height:100, align:"center" + }); // Replace button self.remove("btnCheat"); self.remove("btnCooperate"); self.add({ - id:"btnNext", type:"Button", x:304, y:466, size:"long", + id:"btnNext", type:"Button", x:304, y:481, size:"long", text_id:"oneoff_button_next", message:"slideshow/next" }); diff --git a/js/slides/3_Slides_Tournament.js b/js/slides/3_Slides_Tournament.js index aacd042..1d7838a 100644 --- a/js/slides/3_Slides_Tournament.js +++ b/js/slides/3_Slides_Tournament.js @@ -84,6 +84,12 @@ SLIDES.push({ var o = self.objects; + // Words to the side + self.add({ + id:"text_extra", type:"TextBox", + x:510, y:230, width:450, height:500 + }); + var showTournament = function(num){ var words = ""; @@ -124,13 +130,17 @@ SLIDES.push({ match_header = match_header.replace(/\[B\]/g, ""+scoreB+""); words += match_header+"


"; - // Extra info - words += Words.get("tournament_"+(num+1)); - // PUT IN THE WORDS o.text.setText(words); _hide(o.text); _fadeIn(o.text, 100); + // Extra info + o.text_extra.setTextID("tournament_"+(num+1)); + _hide(o.text_extra); _fadeIn(o.text_extra, 100+250); + + // FADE IN BUTTON + _hide(o.button); _fadeIn(o.button, 100+500); + // FINAL MATCH? if(_matchNumber==9){ _switchButton(); @@ -138,10 +148,6 @@ SLIDES.push({ }; - // MATCH NUMBER! - _matchNumber = 0; - showTournament(_matchNumber); - // "Next Match" Button self.add({ id:"button", type:"Button", @@ -158,10 +164,14 @@ SLIDES.push({ publish("slideshow/next"); }; }; - _hide(o.button); _fadeIn(o.button, 100+500); + + // MATCH NUMBER! + _matchNumber = 0; + showTournament(_matchNumber); }, onend: function(self){ + self.remove("text_extra"); self.remove("button"); } }); diff --git a/js/slides/5_Slides_Distrust.js b/js/slides/5_Slides_Distrust.js index d8b6180..522886e 100644 --- a/js/slides/5_Slides_Distrust.js +++ b/js/slides/5_Slides_Distrust.js @@ -286,104 +286,14 @@ SLIDES.push({ // Worse... self.add({ id:"next", type:"Button", - x:0, y:410, size:"long", + x:0, y:450, size:"long", text_id:"distrust_5_btn", - message: "slideshow/next" + message: "slideshow/scratch" }); _hide(o.next); _fadeIn(o.next, 400); }, onend: function(self){ - self.remove("text"); - self.remove("next"); - } -}); - -// Play with BOTH -SLIDES.push({ - onstart: function(self){ - - var o = self.objects; - _.misc = {}; - - // TOURNAMENT - Tournament.resetGlobalVariables(); - Tournament.INITIAL_AGENTS = [ - {strategy:"all_c", count:23}, - {strategy:"all_d", count:1}, - {strategy:"tft", count:1} - ]; - PD.PAYOFFS.P = -4; - PD.PAYOFFS.S = -1; - PD.PAYOFFS.R = 1; - PD.PAYOFFS.T = 3; - o.tournament.reset(); - - // Words - self.add({ - id:"text", type:"TextBox", - x:0, y:0, width:450, height:500, - text_id:"distrust_6" - }); - _hide(o.text); _fadeIn(o.text, 100); - listen(_.misc, "payoffs/onchange", function(value){ - o.tournament.reset(); - }); - - // SLIDER - // HAX - COPY PASTE CODE WHATEVER - var x = 0; - var y = 95; - self.add({ - id:"roundsLabel", type:"TextBox", - x:0, y:y, width:450, size:25, noSelect:true - }); - self.add({ - id:"roundsSlider", type:"Slider", - x:0, y:y+30, width:450, - min:1, max:20, step:1, - message: "rules/turns" - }); - var _updateLabel = function(value){ - var words = (value==1) ? Words.get("sandbox_rules_1_single") : Words.get("sandbox_rules_1"); // plural? - words = words.replace(/\[N\]/g, value+""); // replace [N] with the number value - o.roundsLabel.setText(""+words+""); - }; - listen(_.misc, "rules/turns", function(value){ - _updateLabel(value); - o.tournament.reset(); - }); - o.roundsSlider.setValue(10); - _updateLabel(10); - _hide(o.roundsLabel); _fadeIn(o.roundsLabel, 300); - _hide(o.roundsSlider); _fadeIn(o.roundsSlider, 300); - - // PAYOFFS - self.add({ - id:"payoffs", type:"PayoffsUI", - x:105, y:170, scale:0.8, slideshow:self - }); - _hide(o.payoffs); _fadeIn(o.payoffs, 300); - - // Words - self.add({ - id:"text2", type:"TextBox", - x:0, y:410, width:450, height:500, - text_id:"distrust_6_end" - }); - _hide(o.text2); _fadeIn(o.text2, 500); - - // FINALLY. - self.add({ - id:"next", type:"Button", - x:0, y:475, size:"long", - text_id:"distrust_6_btn", - message: "slideshow/scratch" - }); - _hide(o.next); _fadeIn(o.next, 700); - - }, - onend: function(self){ unlisten(_); unlisten(_.misc); self.clear(); diff --git a/js/slides/6_Slides_Noise.js b/js/slides/6_Slides_Noise.js index 8505be3..4732af1 100644 --- a/js/slides/6_Slides_Noise.js +++ b/js/slides/6_Slides_Noise.js @@ -153,7 +153,9 @@ SLIDES.push({ // Tournament: simpleton wins SLIDES.push({ + //id:"noise",// [FOR DEBUGGING] + onstart: function(self){ var o = self.objects; @@ -214,7 +216,8 @@ SLIDES.push({ var o = self.objects; // Words - o.text.setTextID("noise_evo_2"); + var words = Words.get("noise_evo_2").replace(/\[CHAR\]/g, ""+Words.get("label_"+_.answer)+""); + o.text.setText(words); _hide(o.text); _fadeIn(o.text, 100); ///////////////////////////////////////// @@ -260,13 +263,35 @@ SLIDES.push({ if(step=="reproduce"){ reproduceSteps++; if(reproduceSteps==6){ - publish("slideshow/next"); + + // WORDS + var words = (_.answer=="pavlov") ? Words.get("noise_evo_2_2_correct") : Words.get("noise_evo_2_2_incorrect"); + words += " "; + words += Words.get("noise_evo_2_2"); + self.add({ + id:"text_next", type:"TextBox", + x:510, y:160, width:450, + text: words + }); + _hide(o.text_next); _fadeIn(o.text_next, 100); + + // BUTTON + self.add({ + id:"btn_next", type:"Button", x:510, y:366, + text_id:"noise_evo_2_2_btn", size:"long", + message:"slideshow/next" + }); + _hide(o.btn_next); _fadeIn(o.btn_next, 300); + + } } }); }, onend: function(self){ + self.remove("text_next"); + self.remove("btn_next"); unlisten(_.misc); } }); @@ -340,7 +365,8 @@ SLIDES.push({ o.playButton.setText("label_start"); // Words - o.text.setTextID("noise_evo_4"); + var words = Words.get("noise_evo_4").replace(/\[CHAR\]/g, ""+Words.get("label_"+_.answer)+""); + o.text.setText(words); _hide(o.text); _fadeIn(o.text, 100); ///////////////////////////////////////// @@ -353,13 +379,34 @@ SLIDES.push({ if(step=="reproduce"){ reproduceSteps++; if(reproduceSteps==8){ - publish("slideshow/next"); + + // WORDS + var words = (_.answer=="tf2t") ? Words.get("noise_evo_4_2_correct") : Words.get("noise_evo_4_2_incorrect"); + words += " "; + words += Words.get("noise_evo_4_2"); + self.add({ + id:"text_next", type:"TextBox", + x:510, y:116, width:450, + text: words + }); + _hide(o.text_next); _fadeIn(o.text_next, 100); + + // BUTTON + self.add({ + id:"btn_next", type:"Button", x:510, y:446, + text_id:"noise_evo_4_2_btn", size:"long", + message:"slideshow/next" + }); + _hide(o.btn_next); _fadeIn(o.btn_next, 300); + } } }); }, onend: function(self){ + self.remove("text_next"); + self.remove("btn_next"); unlisten(_.misc); } }); @@ -368,6 +415,7 @@ SLIDES.push({ onstart: function(self){ var o = self.objects; + _.misc = {}; // Words o.text.setTextID("noise_evo_5"); @@ -378,7 +426,7 @@ SLIDES.push({ // Slider! var x = 510; - var y = 100; + var y = 200; self.add({ id:"noiseLabel", type:"TextBox", x:x, y:y, width:450, noSelect:true @@ -389,12 +437,11 @@ SLIDES.push({ min:0.00, max:0.50, step:0.01, message: "rules/noise" }); - _.misc = {}; var _updateLabel = function(value){ value = Math.round(value*100); var words = Words.get("sandbox_rules_3"); words = words.replace(/\[N\]/g, value+""); // replace [N] with the number value - o.noiseLabel.setText(words); + o.noiseLabel.setText(""+words+""); }; listen(_.misc, "rules/noise", function(value){ _updateLabel(value); @@ -402,22 +449,30 @@ SLIDES.push({ }); o.noiseSlider.setValue(0.05); _updateLabel(0.05); + _hide(o.noiseLabel); _fadeIn(o.noiseLabel, 300); + _hide(o.noiseSlider); _fadeIn(o.noiseSlider, 300); // Continue whenever you want to... - var x = 510; - var y = 300; - self.add({ - id:"continueLabel", type:"TextBox", - x:x, y:y+5, width:200, height:50, - align:"right", color:"#aaa", size:17, - text_id:"noise_evo_6_continue" - }); - self.add({ - id:"continueButton", type:"Button", - x:x+215, y:y, size:"short", - text_id:"label_continue", - message: "slideshow/next" + listen(_.misc, "tournament/autoplay/start",function(){ + if(_showContinue) _showContinue(); }); + var _showContinue = function(){ + _showContinue = null; + self.add({ + id:"continueLabel", type:"TextBox", + x:565, y:405, width:400, + align:"right", color:"#aaa", size:17, + text_id:"noise_evo_5_continue" + }); + self.add({ + id:"continueButton", type:"Button", + x:855, y:440, size:"short", + text_id:"label_continue", + message: "slideshow/next" + }); + _hide(o.continueLabel); _fadeIn(o.continueLabel, 100); + _hide(o.continueButton); _fadeIn(o.continueButton, 100); + }; }, onend: function(self){ @@ -426,6 +481,7 @@ SLIDES.push({ self.remove("noiseSlider"); self.remove("continueLabel"); self.remove("continueButton"); + self.remove("text"); } }); @@ -435,7 +491,11 @@ SLIDES.push({ var o = self.objects; // Words - o.text.setTextID("noise_evo_6"); + self.add({ + id:"text", type:"TextBox", + x:510, y:10, width:450, height:500, + text_id:"noise_evo_6" + }); _hide(o.text); _fadeIn(o.text, 100); // Next button @@ -444,6 +504,7 @@ SLIDES.push({ text_id:"noise_evo_6_btn", size:"long", message:"slideshow/scratch" }); + _hide(o.button); _fadeIn(o.button, 500); }, onend: function(self){ diff --git a/js/slides/8_Slides_Conclusion.js b/js/slides/8_Slides_Conclusion.js index c524188..92094a5 100644 --- a/js/slides/8_Slides_Conclusion.js +++ b/js/slides/8_Slides_Conclusion.js @@ -1,6 +1,63 @@ SLIDES.push({ id: "conclusion", onstart: function(self){ + + // WORDS + self.add({ + id:"text1", type:"TextBox", + x:3, y:6, width:800, + text_id:"conclusion_0" + }); + self.add({ + id:"text2", type:"TextBox", + x:176, y:65-10, width:760, size:30, color:"#4089DD", + text_id:"conclusion_1_a" + }); + self.add({ + id:"text3", type:"TextBox", + x:176, y:115-10, width:760, + text_id:"conclusion_1_a2" + }); + self.add({ + id:"text4", type:"TextBox", + x:176, y:192-10, width:760, size:30, color:"#efc701", + text_id:"conclusion_2_a" + }); + self.add({ + id:"text5", type:"TextBox", + x:176, y:242-10, width:760, + text_id:"conclusion_2_a2" + }); + self.add({ + id:"text6", type:"TextBox", + x:176, y:316-10, width:760, size:30, color:"#DD4040", + text_id:"conclusion_3_a" + }); + self.add({ + id:"text7", type:"TextBox", + x:176, y:366-10, width:760, + text_id:"conclusion_3_a2" + }); + self.add({ + id:"text8", type:"TextBox", + x:94, y:440, width:500, align:"right", + text_id:"conclusion_4" + }); + + // IMAGE + self.add({ + id:"img", type:"ImageBox", + src: "assets/conclusion/summary.png", + x:10, y:60, width:140, height:350 + }); + + // Button + self.add({ + id:"button", type:"Button", x:615, y:481, + text_id:"conclusion_btn", size:"long", + message:"slideshow/scratch" + }); + }, onend: function(self){ self.clear(); @@ -11,24 +68,25 @@ SLIDES.push({ onstart: function(self){ // Splash in background - self.add({ id:"splash", type:"Splash" }); + self.add({ id:"splash", type:"Splash", blush:true }); // Circular Wordbox self.add({ id:"text", type:"TextBox", - x:160, y:10, width:640, height:500, align:"center", size:19, - text_id:"conclusion" + x:160, y:10, width:640, height:500, align:"center", + text_id:"outro_1" }); // Button self.add({ id:"button", type:"Button", x:385, y:466, - text_id:"conclusion_button", fontSize:16, upperCase:false, - message:"slideshow/scratch" + text_id:"outro_1_btn", + message:"slideshow/next" }); }, onend: function(self){ + self.remove("text"); self.remove("button"); } }); @@ -39,16 +97,37 @@ SLIDES.push({ var o = self.objects; // Text - o.text.setTextID("conclusion_2"); + self.add({ + id:"text", type:"TextBox", + x:160, y:30, width:640, height:500, align:"center", size:22, + text_id:"outro_2" + }); + _hide(o.text); _fadeIn(o.text, 100); + + // Photo + self.add({ + id:"img", type:"ImageBox", + src: "assets/conclusion/truce.jpg", + x:228, y:90, width:500, + }); + _hide(o.img); _fadeIn(o.img, 200); + + // Text 2 + self.add({ + id:"text2", type:"TextBox", + x:228, y:402, width:500, + align:"center", color:"#aaa", size:14, + text_id:"outro_2_credits" + }); + _hide(o.text2); _fadeIn(o.text2, 200); // Button self.add({ - id:"button", type:"Button", x:385, y:466, - text_id:"conclusion_button", fontSize:16, upperCase:false, + id:"button", type:"Button", x:427, y:466, + text_id:"outro_2_btn", size:"short", message:"slideshow/scratch" }); - - // Fade In & Out + _hide(o.button); _fadeIn(o.button, 2000); }, onend: function(self){ diff --git a/js/slides/9_Slides_Credits.js b/js/slides/9_Slides_Credits.js index 75805d9..4ea8746 100644 --- a/js/slides/9_Slides_Credits.js +++ b/js/slides/9_Slides_Credits.js @@ -2,5 +2,12 @@ SLIDES.push({ id: "credits", onstart: function(self){ self.add({ id:"bg", type:"Background", color:"#222" }); + + // Circular Wordbox + self.add({ + id:"text", type:"TextBox", + x:160, y:70, width:640, height:500, align:"center", + text_id:"credits_beta", color:"#fff" + }); } }); \ No newline at end of file diff --git a/lang/en.html b/lang/en.html index 08bc33c..f5c88ba 100644 --- a/lang/en.html +++ b/lang/en.html @@ -8,7 +8,7 @@ EVOLUTION
OF TRUST

-playing time: 30 min • by nicky case, july 2017 +playing time: 20 min • by nicky case, july 2017

@@ -22,32 +22,30 @@ PLAY → - - - - +

During World War I, peace broke out.

It was Christmas 1914 on the Western Front.
-Despite strict orders not to chill out with the enemy, British
+Despite strict orders not to chillax with the enemy, British
and German soldiers left their trenches, crossed No Man's Land,
-and gathered together to bury their dead, to exchange gifts, to sing. +and gathered to bury their dead, exchange gifts, and play games.

Meanwhile: it's 2017, the West has been at peace for decades, and
-we're less trusting than ever. Fewer and fewer people say they trust their
-governments, their media, or even each other. So here's our puzzle: +by golly, we suck at trust. Over the years, +fewer and fewer people say they trust their +institutions, or even each other. So here's our puzzle:

-Why & when do friends become enemies?
-or: Why & when do enemies become friends?
+Why, even in peacetime, do friends become enemies?
+And why, even in wartime, do enemies become friends?


-I think game theory can help explain our epidemic of distrust –
+I think game theory can help explain our epidemic of distrust –
and how we can fix it! So, to understand all this...

@@ -120,7 +118,7 @@ Wow, that's mean... and also the correct answer!

-Sure, seems like the right thing to do... OR IS IT?? +Sure, seems like the right thing to do... OR IS IT??

@@ -130,30 +128,30 @@ But if you cheat & they cooperate, you gain three coins at their cost of one

-And that's the dilemma of trust. -You'd both be better off trusting each other, but trust leaves you vulnerable. -But what happens if we can... +And that's our dilemma. +Trust is nice, but it can let others take advantage of you -- or shoot you as you come unarmed out of a trench. +Sometimes, distrust is rational! +But now, what happens if we play this game...

-...play more than once? → +...more than once? →

- -

-Now, let's play for real.
-You'll be playing against 5 different opponents, each with their own "personality". +Now, let's play for real. +You'll be playing against 5 different opponents, each with their own game "strategy". With each opponent, you'll play anywhere between 3 to 7 rounds. +(You won't know in advance when the last round is) Can you trust them? Or rather... can they trust you?

-Choose your first, real move: +Pick your first, real move. Choose wisely.

@@ -240,8 +238,8 @@ Each character will now play against every other character: that's 10 paired matches, and 10 rounds per match.

Who do you think will get the highest total score? -Think carefully about it, and then
-PLACE YOUR BETS: +Think carefully about it... and then +PLACE YOUR BETS:

@@ -268,34 +266,41 @@ next match →

-  -

-

Oh, by the way...

+

+...You may be skeptical about that Christmas Truce story about the World War I trenches. +Surely that was just a fluke? +

-[trench live & let live stuff] +Yes, the truce was dramatic, but it was neither unique, nor unusual.

-[trench live & let live stuff] +Not every trench joined in the peace, but it was pretty widespread. +Many front-lines came up with the idea independently, and again: despite strict orders.

-[trench live & let live stuff] +And in fact, even before Christmas, several front-lines already had +established an unofficial, secret peace.

-[trench live & let live stuff] +They called it: the "live and let live" system. +Basically, you don't shoot me, I don't shoot you. And this worked, in a lot of places!

-[trench live & let live stuff] +You may still be skeptical. Most soldiers don't spontaneously form peace with the enemy. +What's so special about trench warfare?

-[trench live & let live stuff] +Well, here's what's unique about the trenches: +unlike almost every other form of war, +you have to face the same specific soliders every day.

-[trench live & let live stuff] +It's a repeated game. And that makes all the difference.

-Anyway -- and the winner is... +Anyway. And the winner is...

@@ -309,7 +314,7 @@ Anyway -- and the winner is... Congrats, you placed your bet on the right horse.

-(Sorry, [CHAR].) +(Apologies to your bet, [CHAR].)

Copycat goes by many names. @@ -399,7 +404,7 @@ and their numbers increased by 5.

Alas, Copycat did not win – but at least they didn't do as bad -as Always Cooperate, who got eaten up by Always Cheat, +as Always Cooperate. They got eaten up by Always Cheat, whose numbers have now increased by 5.

@@ -424,7 +429,6 @@ who are nice, but not naive.

-

By simply copying the other player's moves, @@ -478,9 +482,6 @@ start the evolution process! stop the evolution process

- - -

(Note: occasionally, a few Grudgers may stick around, because when all players except Grudger & Copycat @@ -497,7 +498,7 @@ However...

-Look around. There are jerks in the world. +Look around. The world's full of total jerkwads.

If Copycat is the strategy in this repeated game of trust that's so powerful -- that even soldiers in World War I trenches independently "evolved" a similar strategy, called "live and let live" -- @@ -544,7 +545,7 @@ once you're done playing around, click:

-As you saw, when people play below some number of rounds, +As you saw, if you don't play enough rounds, (here: 5 or less) ALWAYS CHEAT dominates.

In 1985, when Americans were asked how many close friends they had, @@ -581,31 +582,21 @@ once you're done, click:

-The same thing happens: Always Cheat dominates. -So even if the reward for getting a "win-win" is still more -than the punishment for a "lose-lose"... -if the reward for mutual trust is too low, distrust evolves. +The same thing happens: +with a lower "win-win" reward, Always Cheat takes over. +Game theory has two powerful ideas about this:

-I think, as a culture, we're losing the value of finding "win-wins". -We're more interested in "win-lose", because viciousness gets views, conflict gets clicks. -It's live and let die. -Maybe I'm just overthinking things, maybe I'm just old and shaking my fist at a cloud... -but don't you feel it? That we've forgotten something?... +"Zero-sum game". This is the sadly common belief that a gain for "us" +must come at a loss to "them", and vice versa. +

+"Non-zero-sum game". This when people realize that by working together, +you can create a win-win! (or at least, avoid a lose-lose) +Without the non-zero-sum game, trust cannot evolve. +

+Speaking of which, +let's now look at our third & final barrier to the evolution of trust...

-...whatevs i dunno → -

- -

-Aaaaanyway, now you can change both rules! -(click start to see how, with weird payoffs, the sim -"swings" between Cheats & Cooperates...) -

-

-Once you're done experimenting with this, -let's look at our final barrier to trust... -

-

Misteaks Mistakes. →

@@ -615,7 +606,7 @@ let's look at our final barrier to trust...

As cool as Copycat is, it has a huge, fatal weakness I haven't mentioned yet. -To understand it, let's say two Copycats are playing against each other: +To understand the problem, let's say two Copycats are playing against each other:

Being "nice" players, both their first moves will be: @@ -638,7 +629,7 @@ But if the other person doesn't think it was an accident...

-OH NO AGAIN +OH NO TIMES TWO
The other player, being a Copycat, had to retaliate...

@@ -659,7 +650,7 @@ Tragic. But now, are there other types of players who can...

-Let's meet some new faces! +Let's meet some new faces! (or, new hats, anyway)

@@ -689,38 +680,104 @@ Alright, let's see how well these peeps do when they... ...play in a tournament →

- -

-Noise Evolution, place your bets. -At 5% noise +Let's start with a dozen +Always Cooperates, +versus our old winner, the fair Copycat, +and our three new characters: +the forgiving Copykitten, +the dull Simpleton, and +the silly Random. +

+Let's say, in each round of a match, players have a 5% chance of making a mistake. +Who do you think will come out on top? +Think carefully, then PLACE YOUR BETS:

+

-Try it, controls to the left +Alright, you bet [CHAR] wins. Let's find out! +Use the controls to your left to start the sim in quick mode, +or go through it step-by-step. +

+

+You were correct -- +

+

+Your bet was close, but no cigar --

-Simpleton wins, but let's try... +Simpleton wins! +This is because Simpleton is actually capable of +exploiting Always Cooperate. They both start cooperating, +but if Simpleton makes a mistake and cheats, +since Always Cooperate never retaliates, +it'll keep cheating them.

+

+Now let's try... +

+

-...different scenario, place your bets again. +...the same thing as before, except instead of half-Always Cooperate, +it's half-Always Cheat. It's a much less forgiving, +more hostile environment. +

+Who do you think will win now? Think, then PLACE YOUR BETS:

+

-Try it, controls to the left, again +You bet on [CHAR]. Again, go through the simulation... +

+

+You were right on the money -- +

+

+Good guess, but someone else took the prize --

-Ooh, surprising... but is that true if there's a LOT of noise? +Copykitten wins this time! +That's surprising that with an even meaner starting population, +Copykitten, +a more forgiving version of Copycat, +was the most successful! (note: Copykitten is so forgiving +it doesn't even entirely wipe out Copycat. it shares room) +

+In this case, a bit of "miscommunication" (5% chance of mistake each round) could lead +to more forgiveness. But is this true for all levels...

+

+...of miscommunication? +

+

-GIVE A SLIDER FOR NOISE. +Use the slider below to change the amount of "miscommunication", then hit START. +At 5%, Copykitten wins. +What happens at 0%? Or 20%? Or 50%? (it only goes up to 50%, +because at that point, every move is a coin flip)

+

+When you're done playing around, click: +

+

-Explain nonlinear barrier, and real life. Also sandbox. -

-

-Explain nonlinear barrier, and real life. Also sandbox. +The results turn out something like this:
+At 0%, the fair Copycat wins! +At 1% to 10%, the forgiving Copykitten wins! +At 10% to 49%: the unfair, unforgiving Always Cheat wins. +At 50%, nobody wins ever. +

+This is why "miscommunication" is such an interesting barrier to trust: +a little bit of it leads to forgiveness, +but too much and it leads to widespread distrust! +I think our modern media technology, +as much as it's helped us increase communication... +has increased our miscommunication much more. +

+At last, let's experiment with all the numbers, the knobs and sliders. +Let's play...

-Teaser for sandbox +...in the Sandbox Mode!

@@ -767,7 +824,7 @@ During each round, there's a [N]% chance a player makes a mistake: ...and once you're done playing around, let's recap:

-what we learnt today → +what we learnt today! →

@@ -776,46 +833,73 @@ what we learnt today → -

- -TRUST: -- repeated interaction: -- win-win: -- dealing with mistakes: forgive, and try to be clear and honest yourself - -DISTRUST: -- loss of social capital -- win-lose, use versus them, zero-sum -- gleefully punishing even small mistakes - -But above all, there's also... +

+Game theory has shown us the three things we need for the evolution of trust: +

+

+1. REPEAT INTERACTIONS +

+

+Trust keeps a relationship going, +but you need the knowledge of possible future repeat interactions before trust can evolve. +

+

+2. POSSIBLE WIN-WINS +

+

+You must be playing a non-zero-sum game, +a game where it's at least possible that both players can be better off -- a win-win. +

+

+3. LOW MISCOMMUNICATION +

+

+The level of miscommunication can't be too high. +And when there's a little bit of miscommunication, it pays to be more forgiving. +

+

+Of course, real-world trust is affected by a lot more than this. +there's reputation, moral values, contracts, cultural markers, etc, etc. +And let's not forget...

-...the bigger lesson → +...the biggest lesson. →

-

-Don't hate the player, hate the game. -
-Game theory lesson. -
-Short term: game changes players. But don't be cynical -
-Long term: players change game, from the bottom up -- evolution. -
-So if we wanna cure our epidemic of distrust, -and rebuild a trusting & trustworthy civic society, it's up to all of us. -Let's all learn and act to find win-wins, -to create repeated interactions, -(and...) +

+If there's one big takeaway
+from all of game theory, it's this: +

+What the game is, defines what the players do.
+Our problem today isn't just that people are losing trust,
+it's that our environment acts against the evolution of trust. +

+That may seem cynical or naive -- that we're "merely" products of our environment -- +but as game theory reminds us, we are each others' environment. +In the short run, the game defines the players. But in the long run, +it's us players who define the game. +

+So, do what you can to create the conditions necessary to evolve trust. +Build relationships. Find win-wins. Communicate clearly. +Maybe then, we can stop firing at each other, get out of our own trenches, +cross No Man's Land to come together...

-

+

+and all learn... +

+ +

...to live and let live. -

-

+

+"A Christmas Truce between Opposing Trenches" +Illustrated by AC Michael. +Published in The Illustrated London News, January 9, 1915. +

+ +

<3

@@ -823,6 +907,25 @@ to create repeated interactions, +

+END OF BETA! Please let me know what you think! +Because I'm launching this in a few days, I'm looking first and foremost +for low-level feedback: +Specific parts which are unclear, confusing, or boring. +Bad or problematic phrasing of words. +Typos and grammatical errors. +Opportunities to add more jokes. +And so on. +

+But if you have "high-level" feedback, I'd love to hear that too! +I won't be able to put them in this time, but for my next project(s), +I want to know how I can design stuff like this better. +

+Thank you so much! +

+<3,
+~ Nicky Case +