From 0ff92634df7cd34e8af035ee33f57caa27f6eee5 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Wed, 28 Jun 2017 22:12:32 -0400 Subject: [PATCH] THE WHOLE SANDBOX HELL YEAH --- TODO.md | 4 +- assets/sandbox_hats.png | Bin 0 -> 15985 bytes assets/slider_bg.png | Bin 0 -> 632 bytes assets/slider_knob.png | Bin 0 -> 1710 bytes css/slides.css | 42 +++++++ index.html | 1 + js/core/Slider.js | 113 +++++++++++++++++++ js/sims/PD.js | 3 + js/sims/SandboxUI.js | 241 +++++++++++++++++++++++++++++++++++++++- js/sims/Tournament.js | 55 ++++----- lang/en.html | 26 ++++- 11 files changed, 452 insertions(+), 33 deletions(-) create mode 100644 assets/sandbox_hats.png create mode 100644 assets/slider_bg.png create mode 100644 assets/slider_knob.png create mode 100644 js/core/Slider.js diff --git a/TODO.md b/TODO.md index 001e76a..bcbd8fa 100644 --- a/TODO.md +++ b/TODO.md @@ -13,4 +13,6 @@ MINOR SHTUFF - Word box class less annoying - Refactoring, ugh - Draw: Pavlov, TF2T, Random -- a better handwritten font, with REAL bold & italics??? \ No newline at end of file +- a better handwritten font, with REAL bold & italics??? +- rename Tit For Tat, so it FEELS nicer??? also block peeps who already know the answer... // Copycat Copykitten +- rename all of 'em, really? \ No newline at end of file diff --git a/assets/sandbox_hats.png b/assets/sandbox_hats.png new file mode 100644 index 0000000000000000000000000000000000000000..80a8548717802690ff7a0737edc949fe985b39af GIT binary patch literal 15985 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 literal 0 HcmV?d00001 diff --git a/assets/slider_knob.png b/assets/slider_knob.png new file mode 100644 index 0000000000000000000000000000000000000000..ac22c7b7470d062b02d2deadb9a21c78e6815bdd GIT binary patch literal 1710 zcmV;f22uHmP)NO-GS5Sx_+OCR)gY*=)f?H->1-}KrU6FuIsk|EE3Tw5oye<5z(SZTV_52 zu*1xC(=`7`vY(Tfnm}FGZ{>2iRc2l!qE%nkwK$GFlu1ObXOBmjmP4?KVDq_z>k(u}KUiFwVIypU*?nG_0+yp;#;mw|n*K6?S)bqlk<} zqO`!c_6ikh`erp z{P;2M+_@vtq0~^T)zIm50^>xp@`WMnzaR*d_u#>U%*g|QM~@x}#SzgpBB}<(oe}7N zzo-N?QWOR2>+3=tNgKst5v5W|G<+i{p_~y&L>nSUEtktE6bho9NFD3z>%v)?nX8jx zLcNjJw6wl-7Grp8BLWd^`rofdA}z2~DrNfW8zM85bGh8uktr=O>ifGiAv%(nd2FDR zKt)k9KYUN4X`1L<7>_`S?3D=$g@Wkagf=c4O9`BXx$it{Yim#xB`|JWHjeGPaF!7n zS>v*?l)#9e5>t!l$QqT6r36}*B@><*M20W`F!O~+Tq%K`=i$YR7cxyUfoL`!h4dWQ zY&JukD9uP@;|oX&^gM4Shq7okK2NADY};963iF7)hnUE+tl8ETw z{NF|jGz{a@U@#E6A8a<8a2!Xd12e#dnwhb4pk-OlMXo~6^Q22^(}rO7-5FKUACyFd zs+26tg6p~>p{YYO`}X_&`l!E86zH#Z3`{7V=b=`sWlo~&x}vqz*0}oVi2_a2e9O$M zBAw}WyP1+WlqXU{-S79S<9?f1BMktDhlhWws;U9_Iw~!K+qN&QlGSk>G#U*&d-hDU;2eX&;5*B*CRV8m zuT=7D2U}4$ick~<<#KsyH8!s6qSL6iAa%8jIQg(A?!5Li?Ac@nUJK!X(Kc5ohDLs*6>Ls>z_jX z`@K-h|09>TWm%#xZrfi_^ES*eV%vCU+IwV0!5^+w(M&suB({F~o|&s@6zPwWIx}y_ zwVzgEn~$YQWSm#rc@p3L?y^MsZ_`^u)EW#1t)zBvo7x796GXP++KkbcR%hm&ut`Cd zsc!-5Cz}l-Iyil0Xqxsgm&=7-gfdNObLPyMGv|bV0WC%@WL&nz^Z)<=07*qoM6N<$ Ef*Qy+UjP6A literal 0 HcmV?d00001 diff --git a/css/slides.css b/css/slides.css index d45d1a0..e00a4fe 100644 --- a/css/slides.css +++ b/css/slides.css @@ -74,6 +74,10 @@ body{ .button{ z-index: 0; + -webkit-user-select: none; /* Chrome all / Safari all */ + -moz-user-select: none; /* Firefox all */ + -ms-user-select: none; /* IE 10+ */ + user-select: none; } .button #background{ position: absolute; @@ -177,6 +181,44 @@ body{ .incdec > .incdec_control[arrow=down]{ bottom:-35px; background-position:-40px 0px; } .incdec > .incdec_control[arrow=down]:hover{ background-position:-60px 0px; } +.slider{ + position: absolute; + height: 40px; +} +.slider > div{ + position: absolute; +} +.slider > .slider_bg{ + top:0; + width:100%; height:30px; + background: url(../assets/slider_bg.png); + background-size: auto 100%; +} +.slider > .slider_knob{ + top:0; + width:30px; height:30px; + background: url(../assets/slider_knob.png); + background-size: 100% 100%; +} + +.sandbox_pop{ + position: absolute; +} +.sandbox_pop>div{ + position: absolute; +} +.sandbox_pop_icon{ + width: 40px; + height: 40px; + background: url(../assets/sandbox_hats.png); + background-size: auto 100%; +} +.sandbox_pop_label{ + font-size: 18px; + width: 150px; + top: 8px; + left: 50px; +} /*************************/ /***** SLIDE SELECT ******/ diff --git a/index.html b/index.html index 4c0bc97..558995e 100644 --- a/index.html +++ b/index.html @@ -32,6 +32,7 @@ + diff --git a/js/core/Slider.js b/js/core/Slider.js new file mode 100644 index 0000000..b55a354 --- /dev/null +++ b/js/core/Slider.js @@ -0,0 +1,113 @@ +/************************************** +{ + x:0, y:0, width:433, + min:1, max:25, step:1, + message: "rules/turns" +} +**************************************/ +function Slider(config){ + + var self = this; + self.id = config.id; + + // Create DOM + var dom = document.createElement("div"); + dom.className = "slider"; + dom.style.left = config.x+"px"; + dom.style.top = config.y+"px"; + dom.style.width = config.width+"px"; + self.dom = dom; + + // Background + var bg = document.createElement("div"); + bg.className = "slider_bg"; + dom.appendChild(bg); + + // Knob + var knob = document.createElement("div"); + knob.className = "slider_knob"; + dom.appendChild(knob); + + // Set value + self.value = 0; + var _paramToValue = function(param){ + var value = config.min + (config.max-config.min)*param; + value = Math.round(value/config.step)*config.step; + return value; + }; + var _valueToParam = function(value){ + var param = (value-config.min)/(config.max-config.min); // to (0-1) + return param; + }; + self.setParam = function(param){ + + // Bounds + var value = config.min + (config.max-config.min)*param; + value = Math.round(value/config.step)*config.step; + self.value = value; + + // DOM + knob.style.left = self.value*config.width-15; + + }; + self.setValue = function(value){ + + // Set + self.value = value; + + // DOM with param + var param = _valueToParam(self.value); + knob.style.left = param*(config.width-30); + + }; + if(config.message) subscribe(config.message, self.setValue); + + // Mouse events + var _isDragging = false; + var _offsetX = 0; + var _mouseToParam = function(event){ + + // Mouse to Param to Value + var param = (event.clientX - _offsetX - dom.getBoundingClientRect().left - 8)/(config.width-30); + if(param<0) param=0; + if(param>1) param=1; + var value = _paramToValue(param); + + // Publish these changes! (only if ACTUALLY changed) + if(self.value != value){ + if(config.message) publish(config.message, [value]); + if(config.onchange) config.onchange(value); + } + + }; + dom.addEventListener("mousedown",function(event){ + if(config.onselect) config.onselect(); + _mouseToParam(event); + _isDragging = true; + _offsetX = 0; + },false); + knob.addEventListener("mousedown",function(event){ + _isDragging = true; + if(config.onselect) config.onselect(); + _offsetX = event.clientX - knob.getBoundingClientRect().left; + },false); + window.addEventListener("mousemove",function(event){ + if(_isDragging) _mouseToParam(event); + },false); + window.addEventListener("mouseup",function(){ + _isDragging = false; + },false); + + //////////////////////////////////////// + + // Add... + self.add = function(INSTANT){ + return _add(self, INSTANT); + }; + + // Remove... + self.remove = function(INSTANT){ + return _remove(self, INSTANT); + }; + +} diff --git a/js/sims/PD.js b/js/sims/PD.js index e3e9932..eb1c992 100644 --- a/js/sims/PD.js +++ b/js/sims/PD.js @@ -30,6 +30,9 @@ subscribe("pd/defaultPayoffs", function(){ }); PD.NOISE = 0; +subscribe("rules/noise",function(value){ + PD.NOISE = value; +}); PD.getPayoffs = function(move1, move2){ var payoffs = PD.PAYOFFS; diff --git a/js/sims/SandboxUI.js b/js/sims/SandboxUI.js index 9b79120..e1db2e7 100644 --- a/js/sims/SandboxUI.js +++ b/js/sims/SandboxUI.js @@ -97,6 +97,193 @@ function SandboxUI(config){ // PAGE 0: POPULATION /////////////////// ///////////////////////////////////////// + var page = pages[0]; + + // Labels + page.appendChild(_makeLabel("sandbox_population", {x:0, y:0, w:433})); + + // Create an icon, label, and slider... that all interact with each other. + var _makePopulationControl = function(x, y, peepID, defaultValue){ + + // DOM + var popDOM = document.createElement("div"); + popDOM.className = "sandbox_pop"; + popDOM.style.left = x; + popDOM.style.top = y; + page.appendChild(popDOM); + + // Message + var message = "sandbox/pop/"+peepID; + + // Icon + var popIcon = document.createElement("div"); + popIcon.className = "sandbox_pop_icon"; + popIcon.style.backgroundPosition = (-PEEP_METADATA[peepID].frame*40)+"px 0px"; + popDOM.appendChild(popIcon); + + // Label: Name + var popName = document.createElement("div"); + popName.className = "sandbox_pop_label"; + popName.innerHTML = Words.get("label_short_"+peepID).toUpperCase(); + popName.style.color = PEEP_METADATA[peepID].color; + popDOM.appendChild(popName); + + // Label: Amount + var popAmount = document.createElement("div"); + popAmount.className = "sandbox_pop_label"; + popAmount.style.textAlign = "right"; + popAmount.style.color = PEEP_METADATA[peepID].color; + popDOM.appendChild(popAmount); + subscribe(message, function(value){ + popAmount.innerHTML = value; + }); + + // Slider + (function(peepID){ + var popSlider = new Slider({ + x:0, y:35, width:200, + min:0, max:25, step:1, + message: message, + onselect: function(){ + _anchorPopulation(peepID); + }, + onchange: function(value){ + _adjustPopulation(peepID, value); + } + }); + popDOM.appendChild(popSlider.dom); + })(peepID); + + // Default value! + publish(message, [defaultValue]); + + }; + var xDiff = 220; + var yDiff = 80; + var yOff = 40; + _makePopulationControl( 0, yOff+0, "tft", 5); + _makePopulationControl(xDiff, yOff+0, "all_d", 5); + _makePopulationControl( 0, yOff+yDiff, "all_c", 15); + _makePopulationControl(xDiff, yOff+yDiff, "grudge", 0); + _makePopulationControl( 0, yOff+yDiff*2, "prober", 0); + _makePopulationControl(xDiff, yOff+yDiff*2, "tf2t", 0); + _makePopulationControl( 0, yOff+yDiff*3, "pavlov", 0); + _makePopulationControl(xDiff, yOff+yDiff*3, "random", 0); + + // Adjust the WHOLE population... + /****************************** + + Adjust by SCALING. (and in the edge case of "all zero", scale equally) + Round to integers. (if above or below 25 in total, keep adding/subtracting 1 down the line) + + ******************************/ + var _population; + var _remainder; + var _anchoredIndex; + var _anchorPopulation = function(peepID){ + + // Which index should be anchored? + _anchoredIndex = Tournament.INITIAL_AGENTS.findIndex(function(config){ + return config.strategy==peepID; + }); + var initValue = Tournament.INITIAL_AGENTS[_anchoredIndex].count; + + // SPECIAL CASE: THIS IS ALREADY FULL + if(initValue==25){ + + // Pretend it was 1 for all seven others, 25-7 for this. + _population = []; + for(var i=0; i=0 && diff<0; i--){ + // do NOT adjust anchor. + var conf = Tournament.INITIAL_AGENTS[i]; + if(conf.strategy==peepID) continue; + conf.count--; // REMOVE + diff++; // yay + } + } + // If positive, add one starting from top, skipping anchor. + if(diff>0){ + for(var i=0; i0; i++){ + // do NOT adjust anchor. + var conf = Tournament.INITIAL_AGENTS[i]; + if(conf.strategy==peepID) continue; + conf.count++; // ADD + diff--; // yay + } + } + + // NOW adjust UI + for(var i=0; i

-Start the simulation with this distribution of players: +Start off with this distribution of players:

@@ -45,6 +45,9 @@ In each round of a one-on-one game, there's a [N]% chance a player makes a mista

Tit For Tat

+

+copycat +

I Cooperate on the first round. Then, I just do whatever you did the last round. @@ -55,6 +58,9 @@ but if you Cooperate, I'll forgive you immediately!

Always Cheat

+

+sinner +

Ain't I a stinker?

@@ -62,6 +68,9 @@ Ain't I a stinker?

Always Cooperate

+

+saint +

💖 💖 💖

@@ -69,6 +78,9 @@ Always Cooperate

Grudger

+

+grudger +

I'll always Cooperate... until you Cheat me even once. Then, I'll always Cheat you back. NO FORGIVENESS. @@ -77,6 +89,9 @@ Then, I'll always Cheat you back. NO FORGIVENESS.

Prober

+

+detective +

First: I analyze you. I start: Cooperate, Cheat, Cooperate, Cooperate. @@ -88,6 +103,9 @@ My dear Watson: elementary.

Tit For Two Tats

+

+copykitten +

I Cooperate on the first round. After that, if you Cheat me... well, I'll forgive you once. @@ -98,6 +116,9 @@ However, if you Cheat me twice in a row, then I'll Cheat back.

Pavlov's Dog

+

+pavlov +

I Cooperate on the first round. After that, if you Cooperated in the previous round, @@ -109,6 +130,9 @@ I'll do the opposite of what I did last time (even if it was a mistake).

Lol So Random

+

+random +

monkey tacos! robot ninja bacon pirate! i randomly play Cheat or Cooperate coz lol i'm so random