From 9261ee1a0802ffb7fd40c7cc931b61f0ca901938 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Fri, 6 Apr 2018 10:38:02 -0400 Subject: [PATCH] MOVE TO TOP --- editor/Old_Game.js | 563 ------------------ editor/cursor.png | Bin 3850 -> 0 bytes editor/editor.html | 99 --- editor/editor.js | 209 ------- slides/index.css => index.css | 0 slides/index.html => index.html | 0 {slides/js => js}/chapters/0_Introduction.js | 0 {slides/js => js}/chapters/1_Networks.js | 0 .../js => js}/chapters/2_Simple_Contagion.js | 0 .../js => js}/chapters/3_Complex_Contagion.js | 0 .../chapters/4_Bonding_And_Bridging.js | 0 {slides/js => js}/chapters/5_Sandbox.js | 0 {slides/js => js}/chapters/6_Conclusion.js | 0 {slides/js => js}/chapters/7_Credits.js | 0 {slides/js => js}/lib/Key.js | 0 {slides/js => js}/lib/Mouse.js | 0 {slides/js => js}/lib/Sprite.js | 0 {slides/js => js}/lib/helpers.js | 0 {slides/js => js}/lib/minpubsub.src.js | 0 {slides/js => js}/main.js | 0 {slides/js => js}/sim/Connection.js | 0 {slides/js => js}/sim/ConnectorCutter.js | 0 {slides/js => js}/sim/Peep.js | 0 {slides/js => js}/sim/Simulations.js | 0 {slides/js => js}/sim/_Game.js | 0 {slides/js => js}/slideshow/Boxes.js | 0 {slides/js => js}/slideshow/Navigation.js | 0 {slides/js => js}/slideshow/Pencil.js | 0 {slides/js => js}/slideshow/SandboxUI.js | 0 {slides/js => js}/slideshow/Scratch.js | 0 {slides/js => js}/slideshow/Slideshow.js | 0 puzzle/game/game.html | 49 -- puzzle/game/img/cursor.png | Bin 3850 -> 0 bytes puzzle/game/img/instruction_connect.png | Bin 9430 -> 0 bytes puzzle/game/img/instruction_disconnect.png | Bin 10750 -> 0 bytes puzzle/game/img/testing.png | Bin 4840 -> 0 bytes puzzle/game/img/winner.png | Bin 75637 -> 0 bytes puzzle/game/js/Connection.js | 92 --- puzzle/game/js/Cursor.js | 57 -- puzzle/game/js/Drawing.js | 75 --- puzzle/game/js/Game.js | 287 --------- puzzle/game/js/Mouse.js | 53 -- puzzle/game/js/Peep.js | 221 ------- puzzle/game/js/main.js | 18 - puzzle/img/blue.png | Bin 2236 -> 0 bytes puzzle/img/gray.png | Bin 2075 -> 0 bytes puzzle/img/green.png | Bin 2327 -> 0 bytes puzzle/img/purple.png | Bin 2145 -> 0 bytes puzzle/img/red.png | Bin 2111 -> 0 bytes puzzle/img/yellow.png | Bin 2003 -> 0 bytes puzzle/levels/0_draw_whatever.js | 40 -- puzzle/levels/1a_thresholds.js | 18 - puzzle/levels/1b_majority.js | 48 -- puzzle/levels/2a_sim.js | 33 - puzzle/levels/2b_simple_cascade.js | 33 - puzzle/levels/3a_complex.js | 21 - puzzle/levels/3b_complex_cascade.js | 33 - puzzle/levels/3c_extinguish.js | 22 - puzzle/levels/4a_sweet_spot.js | 22 - puzzle/levels/4b_bridge.js | 22 - puzzle/levels/4c_small_world.js | 22 - puzzle/levels_old/0_draw_whatever.js | 40 -- puzzle/levels_old/1_majority.js | 48 -- puzzle/levels_old/2_simple_contagion.js | 31 - puzzle/levels_old/3_complex_contagion.js | 31 - puzzle/levels_old/4_simple_group.js | 87 --- puzzle/levels_old/5_complex_group.js | 84 --- puzzle/levels_old/6_depolarization.js | 58 -- puzzle/levels_old/7_reintegrate.js | 67 --- puzzle/levels_old/8_complex_filter.js | 124 ---- puzzle/puzzle.css | 46 -- puzzle/puzzle.html | 418 ------------- puzzle/puzzle.js | 29 - {slides/sprites => sprites}/button_large.png | Bin {slides/sprites => sprites}/line.png | Bin {slides/sprites => sprites}/peeps.png | Bin {slides/sprites => sprites}/pencil.png | Bin {slides/sprites => sprites}/scratch.png | Bin .../sprites => sprites}/tutorial_connect.png | Bin .../tutorial_disconnect.png | Bin 80 files changed, 3100 deletions(-) delete mode 100644 editor/Old_Game.js delete mode 100644 editor/cursor.png delete mode 100644 editor/editor.html delete mode 100644 editor/editor.js rename slides/index.css => index.css (100%) rename slides/index.html => index.html (100%) rename {slides/js => js}/chapters/0_Introduction.js (100%) rename {slides/js => js}/chapters/1_Networks.js (100%) rename {slides/js => js}/chapters/2_Simple_Contagion.js (100%) rename {slides/js => js}/chapters/3_Complex_Contagion.js (100%) rename {slides/js => js}/chapters/4_Bonding_And_Bridging.js (100%) rename {slides/js => js}/chapters/5_Sandbox.js (100%) rename {slides/js => js}/chapters/6_Conclusion.js (100%) rename {slides/js => js}/chapters/7_Credits.js (100%) rename {slides/js => js}/lib/Key.js (100%) rename {slides/js => js}/lib/Mouse.js (100%) rename {slides/js => js}/lib/Sprite.js (100%) rename {slides/js => js}/lib/helpers.js (100%) rename {slides/js => js}/lib/minpubsub.src.js (100%) rename {slides/js => js}/main.js (100%) rename {slides/js => js}/sim/Connection.js (100%) rename {slides/js => js}/sim/ConnectorCutter.js (100%) rename {slides/js => js}/sim/Peep.js (100%) rename {slides/js => js}/sim/Simulations.js (100%) rename {slides/js => js}/sim/_Game.js (100%) rename {slides/js => js}/slideshow/Boxes.js (100%) rename {slides/js => js}/slideshow/Navigation.js (100%) rename {slides/js => js}/slideshow/Pencil.js (100%) rename {slides/js => js}/slideshow/SandboxUI.js (100%) rename {slides/js => js}/slideshow/Scratch.js (100%) rename {slides/js => js}/slideshow/Slideshow.js (100%) delete mode 100644 puzzle/game/game.html delete mode 100644 puzzle/game/img/cursor.png delete mode 100644 puzzle/game/img/instruction_connect.png delete mode 100644 puzzle/game/img/instruction_disconnect.png delete mode 100644 puzzle/game/img/testing.png delete mode 100644 puzzle/game/img/winner.png delete mode 100644 puzzle/game/js/Connection.js delete mode 100644 puzzle/game/js/Cursor.js delete mode 100644 puzzle/game/js/Drawing.js delete mode 100644 puzzle/game/js/Game.js delete mode 100644 puzzle/game/js/Mouse.js delete mode 100644 puzzle/game/js/Peep.js delete mode 100644 puzzle/game/js/main.js delete mode 100644 puzzle/img/blue.png delete mode 100644 puzzle/img/gray.png delete mode 100644 puzzle/img/green.png delete mode 100644 puzzle/img/purple.png delete mode 100644 puzzle/img/red.png delete mode 100644 puzzle/img/yellow.png delete mode 100644 puzzle/levels/0_draw_whatever.js delete mode 100644 puzzle/levels/1a_thresholds.js delete mode 100644 puzzle/levels/1b_majority.js delete mode 100644 puzzle/levels/2a_sim.js delete mode 100644 puzzle/levels/2b_simple_cascade.js delete mode 100644 puzzle/levels/3a_complex.js delete mode 100644 puzzle/levels/3b_complex_cascade.js delete mode 100644 puzzle/levels/3c_extinguish.js delete mode 100644 puzzle/levels/4a_sweet_spot.js delete mode 100644 puzzle/levels/4b_bridge.js delete mode 100644 puzzle/levels/4c_small_world.js delete mode 100644 puzzle/levels_old/0_draw_whatever.js delete mode 100644 puzzle/levels_old/1_majority.js delete mode 100644 puzzle/levels_old/2_simple_contagion.js delete mode 100644 puzzle/levels_old/3_complex_contagion.js delete mode 100644 puzzle/levels_old/4_simple_group.js delete mode 100644 puzzle/levels_old/5_complex_group.js delete mode 100644 puzzle/levels_old/6_depolarization.js delete mode 100644 puzzle/levels_old/7_reintegrate.js delete mode 100644 puzzle/levels_old/8_complex_filter.js delete mode 100644 puzzle/puzzle.css delete mode 100644 puzzle/puzzle.html delete mode 100644 puzzle/puzzle.js rename {slides/sprites => sprites}/button_large.png (100%) rename {slides/sprites => sprites}/line.png (100%) rename {slides/sprites => sprites}/peeps.png (100%) rename {slides/sprites => sprites}/pencil.png (100%) rename {slides/sprites => sprites}/scratch.png (100%) rename {slides/sprites => sprites}/tutorial_connect.png (100%) rename {slides/sprites => sprites}/tutorial_disconnect.png (100%) diff --git a/editor/Old_Game.js b/editor/Old_Game.js deleted file mode 100644 index 9eeab52..0000000 --- a/editor/Old_Game.js +++ /dev/null @@ -1,563 +0,0 @@ -Math.TAU = Math.PI*2; - -var canvas = document.getElementById("canvas");// || document.createElement("canvas"); -canvas.style.cursor = "none"; -var ctx = canvas.getContext('2d'); - -var peeps = []; -var connections = []; -var drawing = new Drawing(); -var cursor = new Cursor(); - -var clearNetwork = function(){ - peeps = []; - connections = []; -}; -var loadNetwork = function(data){ - - // Clear! - clearNetwork(); - - // Peeps - data.peeps.forEach(function(p){ - addPeep(p[0], p[1], p[2]); - }); - - // Connections - data.connections.forEach(function(c){ - var from = peeps[c[0]]; - var to = peeps[c[1]]; - addConnection(from, to); - }); - -} -var saveNetwork = function(){ - var data = { - peeps: [], - connections: [] - }; - peeps.forEach(function(peep){ - data.peeps.push([peep.x, peep.y, peep.state]); - }); - connections.forEach(function(c){ - var fromIndex = peeps.indexOf(c.from); - var toIndex = peeps.indexOf(c.to); - data.connections.push([fromIndex, toIndex]); - }); - return data; -} - -var DRAW_STATE = 0; // 0-nothing | 1-connecting | 2-erasing -var DRAW_CONNECT_FROM = null; -var CONNECT_FROM_BUFFER = 15; -var CONNECT_TO_BUFFER = 25; - -function update(){ - - // Mouse logic... - if(Mouse.justPressed && DRAW_STATE===0){ - - // Clicked on a peep? - var peepClicked = _mouseOverPeep(CONNECT_FROM_BUFFER); // buffer of 20px - if(peepClicked){ - DRAW_CONNECT_FROM = peepClicked; - DRAW_STATE = 1; // START CONNECTING - drawing.startConnect(peepClicked); // Drawing logic - }else{ - DRAW_STATE = 2; // START ERASING - } - - } - if(DRAW_STATE==2){ // ERASE - - // Intersect with any connections? - var line = [Mouse.lastX, Mouse.lastY, Mouse.x, Mouse.y]; - for(var i=connections.length-1; i>=0; i--){ // going BACKWARDS coz killing - var c = connections[i]; - if(c.hitTest(line)) connections.splice(i,1); - } - drawing.startErase(); // Drawing logic - - } - if(Mouse.justReleased && DRAW_STATE!==0){ - - // Connecting peeps, and released on a peep? - if(DRAW_STATE==1){ - var peepReleased = _mouseOverPeep(CONNECT_TO_BUFFER); // buffer of 20px - if(peepReleased){ // connect 'em! - addConnection(DRAW_CONNECT_FROM, peepReleased); - DRAW_CONNECT_FROM = null; - } - drawing.endConnect(); // Drawing logic - }else if(DRAW_STATE==2){ - drawing.endErase(); // Drawing logic - } - DRAW_STATE = 0; // back to normal - - } - Mouse.update(); - - // Cursor Logic - if(DRAW_STATE==0){ - var peepHovered = _mouseOverPeep(CONNECT_FROM_BUFFER); // buffer of 20px - if(peepHovered){ - cursor.setMode(Cursor.CONNECT); - }else{ - cursor.setMode(Cursor.NORMAL); - } - } - if(DRAW_STATE==1){ - cursor.setMode(Cursor.CONNECT); - } - if(DRAW_STATE==2){ - cursor.setMode(Cursor.ERASE); - } - - // Update Logic - connections.forEach(function(connection){ - connection.update(ctx); - }); - drawing.update(); - peeps.forEach(function(peep){ - peep.update(); - }); - cursor.update(); - - // Draw Logic - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = "#fff"; - ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.save(); - ctx.scale(2,2); - _preUpdate(); - //ctx.translate(0,100); - - connections.forEach(function(connection){ - connection.draw(ctx); - }); - drawing.draw(ctx); - peeps.forEach(function(peep){ - peep.draw(ctx); - }); - cursor.draw(ctx); - - _onUpdate(); - ctx.restore(); - - // RAF - requestAnimationFrame(update); - -} -function _preUpdate(){ - // TO IMPLEMENT -} -function _onUpdate(){ - // TO IMPLEMENT -} - -function Peep(config){ - - var self = this; - - // Properties - self.x = config.x; - self.y = config.y; - self.state = config.state; - - // Update: - self.numFriends = 0; - self.numInfectedFriends = 0; - self.faceX = 0; - self.faceY = 0; - self.faceBlink = 0; - self.isMajority = false; - var _faceFollow = 0.75+(Math.random()*0.1); - self.update = function(){ - - // Face position! - var faceVector = { - x: (Mouse.x-self.x)/5, - y: (Mouse.y-self.y)/5 - }; - faceVector.mag = Math.sqrt(faceVector.x*faceVector.x + faceVector.y*faceVector.y); - var max_distance = 5; - if(faceVector.mag>max_distance){ - faceVector.x = faceVector.x * (max_distance/faceVector.mag); - faceVector.y = faceVector.y * (max_distance/faceVector.mag); - } - self.faceX = self.faceX*_faceFollow + faceVector.x*(1-_faceFollow); - self.faceY = self.faceY*_faceFollow + faceVector.y*(1-_faceFollow); - - // Blink? - if(!self.faceBlink){ - if(Math.random()<0.002) self.faceBlink=true; - }else{ - if(Math.random()<0.09) self.faceBlink=false; - } - - // Friends connected... or infected - var friends = getConnected(self); - self.numFriends = friends.length; - self.numInfectedFriends = 0; - friends.forEach(function(friend){ - if(friend.state==2) self.numInfectedFriends++; - }); - - }; - - // Draw - var radius = 20; - var bubbleScale = 1; - var bubbleScaleVel = 0; - self.draw = function(ctx){ - - ctx.save(); - ctx.translate(self.x, self.y); - - // Circle - ctx.fillStyle = (self.state==1) ? "#ccc" : "#dd4040"; //"#ffdf00"; - ctx.beginPath(); - ctx.arc(0, 0, radius, 0, Math.TAU, false); - ctx.fill(); - - // Face - ctx.save(); - ctx.translate(self.faceX, self.faceY); - ctx.fillStyle = "rgba(0,0,0,0.5)"; - if(self.faceBlink){ - ctx.beginPath(); - ctx.rect(-14, -1, 8, 2); - ctx.fill(); - ctx.beginPath(); - ctx.rect(6, -1, 8, 2); - ctx.fill(); - }else{ - ctx.beginPath(); - ctx.arc(-10, -1, 3, 0, Math.TAU, false); - ctx.fill(); - ctx.beginPath(); - ctx.arc(10, -1, 3, 0, Math.TAU, false); - ctx.fill(); - } - ctx.beginPath(); - ctx.rect(-7, 4, 14, 2); - ctx.fill(); - ctx.restore(); - - // Say: Infected/Friends - var label = self.numInfectedFriends + "/" + self.numFriends; - ctx.font = '12px sans-serif'; - ctx.fillStyle = "#000"; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fontWeight = "bold"; - ctx.fillText(label, 0, -27); - - ctx.restore(); - - }; - - // Hit Test - self.hitTest = function(x,y,buffer){ - if(buffer===undefined) buffer=0; - var dx = self.x-x; - var dy = self.y-y; - var dist2 = dx*dx+dy*dy; - var r = radius+buffer; - return (dist2= 0 && s <= 1 && t >= 0 && t <= 1); - - }; - -} -function addConnection(from, to){ - - // Don't allow connect if connecting to same... - if(from==to) return; - - // ...or if already exists, in either direction - for(var i=0; i=0; i--){ // backwards index coz we're deleting - var c = connections[i]; - if(c.from==peep || c.to==peep){ // in either direction - connections.splice(i,1); // remove! - } - } -} - -function Drawing(){ - - var self = this; - - // Update! - self.update = function(){ - - // Connection - if(self.connectFrom){ - // Over any peeps? Connect to THAT! Else, connect to Mouse - var peepHovered = _mouseOverPeep(CONNECT_TO_BUFFER); // buffer of 20px - if(peepHovered==self.connectFrom) peepHovered=null; // if same, nah - self.connectTo = peepHovered ? peepHovered : Mouse; - } - - // Erase - if(self.isErasing){ - self.eraseTrail.unshift([Mouse.x,Mouse.y]); // add to start - if(self.eraseTrail.length>10){ - self.eraseTrail.pop(); // remove from end - } - }else{ - self.eraseTrail.pop(); // remove from end - } - - }; - - // Connection! - self.connectFrom = null; - self.connectTo = null; - self.startConnect = function(from){ - self.connectFrom = from; - }; - self.endConnect = function(){ - self.connectFrom = null; - }; - - // Erase! - self.isErasing = false; - self.eraseTrail = []; - self.startErase = function(){ - self.isErasing = true; - }; - self.endErase = function(){ - self.isErasing = false; - }; - - // Draw - self.draw = function(ctx){ - - // Connecting... - if(self.connectFrom){ - ctx.strokeStyle = "#666"; - ctx.lineWidth = 3; - ctx.beginPath(); - ctx.moveTo(self.connectFrom.x, self.connectFrom.y); - ctx.lineTo(self.connectTo.x, self.connectTo.y); - ctx.stroke(); - } - - // Erase - if(self.eraseTrail.length>0){ - ctx.strokeStyle = "#dd4040"; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.moveTo(self.eraseTrail[0][0], self.eraseTrail[0][1]); - for(var i=1; iIWW3^SRs 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 owwC=m?WgXIPsvLkmi67{TepqkT@%=vf$q3~1 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/editor/editor.js b/editor/editor.js deleted file mode 100644 index 06acdbe..0000000 --- a/editor/editor.js +++ /dev/null @@ -1,209 +0,0 @@ -window.onload = function(){ - init(); -} - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData; -if(window.location.hash){ - initData = JSON.parse(window.location.hash.substr(1)); -}else{ - initData = { - "goal": "herp derp", - "contagion": contagionThreshold, - "peeps": [ [200,200], [300,300] ], - "connections": [ [0,1] ] - }; -} - -function init(){ - - // Add peeps! - _loadData(initData); - - // Update - update(); - -} - -// KEYS TO ADD & REMOVE PEEPS -window.addEventListener("keydown", function(event){ - - // "S" for SAVE - if(event.keyCode==83){ - event.cancelBubble = true; - event.stopPropagation(); - event.preventDefault(); - _save(); - } - - // "1" to "2" TO ADD A PEEP - var keybase = 48; - if(event.keyCode>=keybase+1 && event.keyCode<=keybase+2){ - // Am I hovering over a peep (no buffer)? - var peepHovered = _mouseOverPeep(0); - if(peepHovered){ - removePeep(peepHovered); // If so, DELETE IT - }else{ - var state = event.keyCode-keybase; - addPeep(Mouse.x, Mouse.y, state); // If not, ADD ONE - } - } - -}); - -// SPACE TO MOVE PEEPS -var movingPeep = null; -var movingPeepOffset = {x:0,y:0} -function _preUpdate(){ - if(movingPeep){ - movingPeep.x = Mouse.x - movingPeepOffset.x; - movingPeep.y = Mouse.y - movingPeepOffset.y; - } -} -window.addEventListener("keydown", function(event){ - if(event.keyCode==32){ - var peepHovered = _mouseOverPeep(0); - if(peepHovered){ - movingPeep = peepHovered; - movingPeepOffset.x = Mouse.x - movingPeep.x; - movingPeepOffset.y = Mouse.y - movingPeep.y; - } - } -}); -window.addEventListener("keyup", function(event){ - if(event.keyCode==32){ - movingPeep = null; - } -}); - -// BUTTONS: SAVE / LOAD / CLEAR -var dataTextbox = $("#data"); -var _saveData = function(){ - var network = saveNetwork(); - return { - goal: $("#goal").value, - contagion: contagionThreshold, - peeps: network.peeps, - connections: network.connections - } -} -var _save = function(){ - var newData; - if(SIM_IS_RUNNING){ - newData = initData; - }else{ - newData = _saveData(); - } - dataTextbox.value = JSON.stringify(newData); - dataTextbox.select(); - window.location.hash = dataTextbox.value; -}; -$("#buttonSave").onclick = _save; -var _loadData = function(data){ - loadNetwork(data); - $("#goal").value = data.goal; - $("#contagionSlider").value = Math.round(data.contagion*12); - _getThreshold(); -} -$("#buttonLoad").onclick = function(){ - try{ - var data = JSON.parse(dataTextbox.value); - _loadData(data); - dataTextbox.value = "loaded!"; - }catch(e){ - alert("DATA AIN'T PROPER JSON, YO"); - } -}; -$("#buttonClear").onclick = function(){ - clearNetwork(); -}; - -// Editing the Mission Goal statement: DON'T PROPAGATE KEYS -$("#goal").addEventListener("keydown", function(event){ - event.cancelBubble = true; - event.stopPropagation(); -}); - - - -///////////////////////////////////////// -//// RUN THE SIMULATION, YO ///////////// -///////////////////////////////////////// - -var SIM_IS_RUNNING = false; -var SIM_STEP = 0; -var _updateSimRunningUI = function(){ - if(SIM_IS_RUNNING){ - $("#simIsNotRunning").style.display = "none"; - $("#simIsRunning").style.display = "inline"; - document.body.style.background = "#777"; - $("#sim_step").innerHTML = SIM_STEP; - }else{ - $("#simIsNotRunning").style.display = "inline"; - $("#simIsRunning").style.display = "none"; - document.body.style.background = ""; - } -}; -_updateSimRunningUI(); -$("#simStart").onclick = function(){ - SIM_STEP = 0; - SIM_IS_RUNNING = true; - initData = _saveData(); - _updateSimRunningUI(); -}; -$("#simStop").onclick = function(){ - SIM_IS_RUNNING = false; - _loadData(initData); - update(); - _updateSimRunningUI(); -}; - -var contagionThreshold = 0; -var _getThreshold = function(){ - contagionThreshold = $("#contagionSlider").value/12; - $("#contagionLabel").innerHTML = Math.floor(contagionThreshold*100)+"%"; -} -$("#contagionSlider").oninput = _getThreshold; -_getThreshold(); - -function stepSimulation(){ - - // Consider all peeps, and their friends - var toInfect = []; - peeps.forEach(function(peep){ - - // How many infected friends? - if(peep.numFriends==0) return; // No friends? NVM. - var ratioOfInfectedFriends = peep.numInfectedFriends/peep.numFriends; - - // Passed threshold? - if(contagionThreshold==0){ // simple contagion, just ANY friend - if(peep.numInfectedFriends>0) toInfect.push(peep); - }else{ - // greater OR EQUALS (fuzz coz floating point) - if(ratioOfInfectedFriends>=contagionThreshold-0.0001){ - toInfect.push(peep); - } - } - - }); - - // "Infect" the peeps who need to get infected - toInfect.forEach(function(peep){ - peep.state = 2; - }); - -} -$("#simNext").onclick = function(){ - SIM_STEP++; - _updateSimRunningUI(); - stepSimulation(); -}; - -function $(query){ - return document.querySelector(query); -} diff --git a/slides/index.css b/index.css similarity index 100% rename from slides/index.css rename to index.css diff --git a/slides/index.html b/index.html similarity index 100% rename from slides/index.html rename to index.html diff --git a/slides/js/chapters/0_Introduction.js b/js/chapters/0_Introduction.js similarity index 100% rename from slides/js/chapters/0_Introduction.js rename to js/chapters/0_Introduction.js diff --git a/slides/js/chapters/1_Networks.js b/js/chapters/1_Networks.js similarity index 100% rename from slides/js/chapters/1_Networks.js rename to js/chapters/1_Networks.js diff --git a/slides/js/chapters/2_Simple_Contagion.js b/js/chapters/2_Simple_Contagion.js similarity index 100% rename from slides/js/chapters/2_Simple_Contagion.js rename to js/chapters/2_Simple_Contagion.js diff --git a/slides/js/chapters/3_Complex_Contagion.js b/js/chapters/3_Complex_Contagion.js similarity index 100% rename from slides/js/chapters/3_Complex_Contagion.js rename to js/chapters/3_Complex_Contagion.js diff --git a/slides/js/chapters/4_Bonding_And_Bridging.js b/js/chapters/4_Bonding_And_Bridging.js similarity index 100% rename from slides/js/chapters/4_Bonding_And_Bridging.js rename to js/chapters/4_Bonding_And_Bridging.js diff --git a/slides/js/chapters/5_Sandbox.js b/js/chapters/5_Sandbox.js similarity index 100% rename from slides/js/chapters/5_Sandbox.js rename to js/chapters/5_Sandbox.js diff --git a/slides/js/chapters/6_Conclusion.js b/js/chapters/6_Conclusion.js similarity index 100% rename from slides/js/chapters/6_Conclusion.js rename to js/chapters/6_Conclusion.js diff --git a/slides/js/chapters/7_Credits.js b/js/chapters/7_Credits.js similarity index 100% rename from slides/js/chapters/7_Credits.js rename to js/chapters/7_Credits.js diff --git a/slides/js/lib/Key.js b/js/lib/Key.js similarity index 100% rename from slides/js/lib/Key.js rename to js/lib/Key.js diff --git a/slides/js/lib/Mouse.js b/js/lib/Mouse.js similarity index 100% rename from slides/js/lib/Mouse.js rename to js/lib/Mouse.js diff --git a/slides/js/lib/Sprite.js b/js/lib/Sprite.js similarity index 100% rename from slides/js/lib/Sprite.js rename to js/lib/Sprite.js diff --git a/slides/js/lib/helpers.js b/js/lib/helpers.js similarity index 100% rename from slides/js/lib/helpers.js rename to js/lib/helpers.js diff --git a/slides/js/lib/minpubsub.src.js b/js/lib/minpubsub.src.js similarity index 100% rename from slides/js/lib/minpubsub.src.js rename to js/lib/minpubsub.src.js diff --git a/slides/js/main.js b/js/main.js similarity index 100% rename from slides/js/main.js rename to js/main.js diff --git a/slides/js/sim/Connection.js b/js/sim/Connection.js similarity index 100% rename from slides/js/sim/Connection.js rename to js/sim/Connection.js diff --git a/slides/js/sim/ConnectorCutter.js b/js/sim/ConnectorCutter.js similarity index 100% rename from slides/js/sim/ConnectorCutter.js rename to js/sim/ConnectorCutter.js diff --git a/slides/js/sim/Peep.js b/js/sim/Peep.js similarity index 100% rename from slides/js/sim/Peep.js rename to js/sim/Peep.js diff --git a/slides/js/sim/Simulations.js b/js/sim/Simulations.js similarity index 100% rename from slides/js/sim/Simulations.js rename to js/sim/Simulations.js diff --git a/slides/js/sim/_Game.js b/js/sim/_Game.js similarity index 100% rename from slides/js/sim/_Game.js rename to js/sim/_Game.js diff --git a/slides/js/slideshow/Boxes.js b/js/slideshow/Boxes.js similarity index 100% rename from slides/js/slideshow/Boxes.js rename to js/slideshow/Boxes.js diff --git a/slides/js/slideshow/Navigation.js b/js/slideshow/Navigation.js similarity index 100% rename from slides/js/slideshow/Navigation.js rename to js/slideshow/Navigation.js diff --git a/slides/js/slideshow/Pencil.js b/js/slideshow/Pencil.js similarity index 100% rename from slides/js/slideshow/Pencil.js rename to js/slideshow/Pencil.js diff --git a/slides/js/slideshow/SandboxUI.js b/js/slideshow/SandboxUI.js similarity index 100% rename from slides/js/slideshow/SandboxUI.js rename to js/slideshow/SandboxUI.js diff --git a/slides/js/slideshow/Scratch.js b/js/slideshow/Scratch.js similarity index 100% rename from slides/js/slideshow/Scratch.js rename to js/slideshow/Scratch.js diff --git a/slides/js/slideshow/Slideshow.js b/js/slideshow/Slideshow.js similarity index 100% rename from slides/js/slideshow/Slideshow.js rename to js/slideshow/Slideshow.js diff --git a/puzzle/game/game.html b/puzzle/game/game.html deleted file mode 100644 index a14847d..0000000 --- a/puzzle/game/game.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - -
- simulation: - - (not running) -
- -
- - (running! step ) -
- - -
-
- - - - - - - - - - - \ No newline at end of file diff --git a/puzzle/game/img/cursor.png b/puzzle/game/img/cursor.png deleted file mode 100644 index 89c1a6b1baf6859e0f71809af72c392e0905246e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3850 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%0Av_lk0{fl+=Z5OO#22#Bd0!)2;wtHD? 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 O$2D^+v(hW>5C0e7@eynQ diff --git a/puzzle/game/img/instruction_disconnect.png b/puzzle/game/img/instruction_disconnect.png deleted file mode 100644 index 49ab70fa3aa248e4aeed2534364070cbcbb10c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10750 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 diff --git a/puzzle/game/img/testing.png b/puzzle/game/img/testing.png deleted file mode 100644 index 1896cbbcb03892e8c9f9ca1da7b10a755802179a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4840 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%0D6x4jV-Cx110--kz<%w&>;1)zuCX(>sG}9@ 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 0 && s <= 1 && t >= 0 && t <= 1); - - }; - -} -function addConnection(from, to, uncuttable){ - - // Don't allow connect if connecting to same... - if(from==to) return; - - // ...or if already exists, in either direction - for(var i=0; i=0; i--){ // backwards index coz we're deleting - var c = connections[i]; - if(c.from==peep || c.to==peep){ // in either direction - connections.splice(i,1); // remove! - } - } -} -function _makeUncuttable(arrayOfConnections){ - for(var i=0; i10){ - self.eraseTrail.pop(); // remove from end - } - }else{ - self.eraseTrail.pop(); // remove from end - } - - }; - - // Connection! - self.connectFrom = null; - self.connectTo = null; - self.startConnect = function(from){ - self.connectFrom = from; - }; - self.endConnect = function(){ - self.connectFrom = null; - }; - - // Erase! - self.isErasing = false; - self.eraseTrail = []; - self.startErase = function(){ - self.isErasing = true; - }; - self.endErase = function(){ - self.isErasing = false; - }; - - // Draw - self.draw = function(ctx){ - - // Connecting... - if(self.connectFrom){ - ctx.strokeStyle = "#ccc"; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.moveTo(self.connectFrom.x, self.connectFrom.y); - ctx.lineTo(self.connectTo.x, self.connectTo.y); - ctx.stroke(); - } - - // Erase - if(self.eraseTrail.length>0){ - ctx.strokeStyle = "#dd4040"; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.moveTo(self.eraseTrail[0][0], self.eraseTrail[0][1]); - for(var i=1; i=0; i--){ // going BACKWARDS coz killing - var c = connections[i]; - if(c.uncuttable) continue; // don't touch the UNCUTTABLES - if(c.hitTest(line)) connections.splice(i,1); - } - drawing.startErase(); // Drawing logic - - } - if(Mouse.justReleased && DRAW_STATE!==0){ - - // Connecting peeps, and released on a peep? - if(DRAW_STATE==1){ - var peepReleased = _mouseOverPeep(CONNECT_TO_BUFFER); // buffer of 20px - if(peepReleased){ // connect 'em! - addConnection(DRAW_CONNECT_FROM, peepReleased); - DRAW_CONNECT_FROM = null; - } - drawing.endConnect(); // Drawing logic - }else if(DRAW_STATE==2){ - drawing.endErase(); // Drawing logic - } - DRAW_STATE = 0; // back to normal - - } - Mouse.update(); - - // Cursor Logic - if(DRAW_STATE==0){ - var peepHovered = _mouseOverPeep(CONNECT_FROM_BUFFER); // buffer of 20px - if(peepHovered){ - cursor.setMode(Cursor.CONNECT); - }else{ - cursor.setMode(Cursor.NORMAL); - } - } - if(DRAW_STATE==1){ - cursor.setMode(Cursor.CONNECT); - } - if(DRAW_STATE==2){ - cursor.setMode(Cursor.ERASE); - } - - } - - // Update Logic - connections.forEach(function(connection){ - connection.update(ctx); - }); - drawing.update(); - peeps.forEach(function(peep){ - peep.update(); - }); - cursor.update(); - - // Draw Logic - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = SIM_IS_RUNNING ? "#eee" : "#fff"; - ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.save(); - ctx.scale(2,2); - _preUpdate(); - //ctx.translate(0,100); - - connections.forEach(function(connection){ - connection.draw(ctx); - }); - drawing.draw(ctx); - peeps.forEach(function(peep){ - peep.draw(ctx); - }); - cursor.draw(ctx); - - _onUpdate(); - if(YOU_ARE_WINNER){ - ctx.drawImage(winnerImage, 0, 0, 500, 500); - } - ctx.restore(); - - // RAF - requestAnimationFrame(update); - -} -function _preUpdate(){ - // TO IMPLEMENT -} -function _onUpdate(){ - // TO IMPLEMENT -} - -/////////////////////////////////////// -// CONTAGION UI, WHY NOT HMMMM //////// -/////////////////////////////////////// - -function $(query){ - return document.querySelector(query); -} - -function showContagionUI(){ - - // Just display the div - $("#sim_ui").style.display = "block"; - _updateSimRunningUI(); - -} - -var SIM_IS_RUNNING = false; -var SIM_STEP = 0; -var _updateSimRunningUI = function(){ - if(SIM_IS_RUNNING){ - $("#sim_is_not_running").style.display = "none"; - $("#sim_is_running").style.display = "inline"; - //document.body.style.background = "#777"; - $("#sim_step").innerHTML = SIM_STEP; - }else{ - $("#sim_is_not_running").style.display = "inline"; - $("#sim_is_running").style.display = "none"; - //document.body.style.background = ""; - } -}; - - -var _networkBeforeSimulationStarted = null; -function _startSim(){ - SIM_STEP = 0; - SIM_IS_RUNNING = true; - _networkBeforeSimulationStarted = saveNetwork(); - _updateSimRunningUI(); - _startSimulation(); -}; -$("#sim_start").onclick = _startSim; -function _stopSim(){ - SIM_IS_RUNNING = false; - _resetToBeforeSimStarted(); - _updateSimRunningUI(); - _stopSimulation(); -}; -$("#sim_stop").onclick = _stopSim; -function _simNext(){ - SIM_STEP++; - _updateSimRunningUI(); - _stepSimulation(); -}; -$("#sim_next").onclick = _simNext; - -function _resetToBeforeSimStarted(){ - loadNetwork(_networkBeforeSimulationStarted); -} -function _startSimulation(){ - // To Implement -} -function _stopSimulation(){ - // To Implement -} -function _stepSimulation(){ - _infectPeople(); -} - -function _infectPeople(){ - - // Consider all peeps, and their friends - var toInfect = []; - peeps.forEach(function(peep){ - - // How many infected friends? - if(peep.numFriends==0) return; // No friends? NVM. - var ratioOfInfectedFriends = peep.numInfectedFriends/peep.numFriends; - - // Passed threshold? - if(CONTAGION_THRESHOLD==0){ // simple contagion, just ANY friend - if(peep.numInfectedFriends>0) toInfect.push(peep); - }else{ - // greater OR EQUALS (fuzz coz floating point) - if(ratioOfInfectedFriends>=CONTAGION_THRESHOLD-0.0001){ - toInfect.push(peep); - } - } - - }); - - // "Infect" the peeps who need to get infected - toInfect.forEach(function(peep){ - peep.infect(); - }); - -} - diff --git a/puzzle/game/js/Mouse.js b/puzzle/game/js/Mouse.js deleted file mode 100644 index b7e0b73..0000000 --- a/puzzle/game/js/Mouse.js +++ /dev/null @@ -1,53 +0,0 @@ -///////////////////////////// -// MOUSE //////////////////// -///////////////////////////// - -var Mouse = { - x:0, y:0, - pressed:false -}; -Mouse.ondown = function(event){ - cursor.show(); - Mouse.pressed = true; - Mouse.onmove(event); -}; -Mouse.onmove = function(event){ - cursor.show(); - Mouse.x = event.offsetX; - Mouse.y = event.offsetY; -}; -Mouse.onup = function(event){ - Mouse.pressed = false; -}; -Mouse.update = function(){ - - // Just pressed, or just released (one frame ago) - Mouse.justPressed = (!Mouse.lastPressed && Mouse.pressed); - Mouse.justReleased = (Mouse.lastPressed && !Mouse.pressed); - - // The last frame's stuff - Mouse.lastX = Mouse.x; - Mouse.lastY = Mouse.y; - Mouse.lastPressed = Mouse.pressed; - -}; -canvas.addEventListener("mousedown", Mouse.ondown); -canvas.addEventListener("mousemove", Mouse.onmove); -window.addEventListener("mouseup", Mouse.onup); - -// TOUCH. -function _touchWrapper(callback){ - return function(event){ - var _event = {}; - _event.offsetX = event.changedTouches[0].clientX; - _event.offsetY = event.changedTouches[0].clientY; - event.preventDefault(); - callback(_event); - }; -} -canvas.addEventListener("touchstart", _touchWrapper(Mouse.ondown), false); -canvas.addEventListener("touchmove", _touchWrapper(Mouse.onmove), false); -document.body.addEventListener("touchend", function(){ - cursor.hide(); - Mouse.onup(); -}, false); \ No newline at end of file diff --git a/puzzle/game/js/Peep.js b/puzzle/game/js/Peep.js deleted file mode 100644 index 44a1fba..0000000 --- a/puzzle/game/js/Peep.js +++ /dev/null @@ -1,221 +0,0 @@ -var PEEP_STATE_COLORS = { - 1: "#ccc", - 2: "#dd4040" -}; - -function Peep(config){ - - var self = this; - - // Properties - self.x = config.x; - self.y = config.y; - self.state = config.state; - - // Update: - self.numFriends = 0; - self.numInfectedFriends = 0; - self.faceX = 0; - self.faceY = 0; - self.faceBlink = 0; - self.isMajority = false; - var _faceFollow = 0.75+(Math.random()*0.1); - self.update = function(){ - - // Face position! - var faceVector = { - x: (Mouse.x-self.x)/5, - y: (Mouse.y-self.y)/5 - }; - faceVector.mag = Math.sqrt(faceVector.x*faceVector.x + faceVector.y*faceVector.y); - var max_distance = 5; - if(faceVector.mag>max_distance){ - faceVector.x = faceVector.x * (max_distance/faceVector.mag); - faceVector.y = faceVector.y * (max_distance/faceVector.mag); - } - self.faceX = self.faceX*_faceFollow + faceVector.x*(1-_faceFollow); - self.faceY = self.faceY*_faceFollow + faceVector.y*(1-_faceFollow); - - // Blink? - if(!self.faceBlink){ - if(Math.random()<0.002) self.faceBlink=true; - }else{ - if(Math.random()<0.09) self.faceBlink=false; - } - - // Friends connected... or infected - var friends = self.sim.getConnected(self); - self.numFriends = friends.length; - self.numInfectedFriends = 0; - friends.forEach(function(friend){ - if(friend.state==2) self.numInfectedFriends++; - }); - - }; - - // Draw - var radius = 20; - var barWidth = 30; - var barHeight = 10; - self.draw = function(ctx){ - - ctx.save(); - ctx.translate(self.x, self.y); - - // Circle - //ctx.fillStyle = (self.state==1) ? "#ccc" : "#dd4040"; //"#ffdf00"; - var myColor = PEEP_STATE_COLORS[self.state]; - ctx.fillStyle = myColor; - ctx.beginPath(); - ctx.arc(0, 0, radius, 0, Math.TAU, false); - ctx.fill(); - - // INFECT ON NEXT TURN? - /*var infectOnNextTurn = (self.numFriends>0 && self.numInfectedFriends/self.numFriends>=CONTAGION_THRESHOLD); - if(infectOnNextTurn){ - ctx.strokeStyle = PEEP_STATE_COLORS[2]; - ctx.lineWidth = 2; - ctx.stroke(); - }*/ - - // Face - ctx.save(); - ctx.translate(self.faceX, self.faceY); - ctx.fillStyle = "rgba(0,0,0,0.5)"; - if(self.faceBlink){ - ctx.beginPath(); - ctx.rect(-14, -1, 8, 2); - ctx.fill(); - ctx.beginPath(); - ctx.rect(6, -1, 8, 2); - ctx.fill(); - }else{ - ctx.beginPath(); - ctx.arc(-10, -1, 3, 0, Math.TAU, false); - ctx.fill(); - ctx.beginPath(); - ctx.arc(10, -1, 3, 0, Math.TAU, false); - ctx.fill(); - } - ctx.beginPath(); - ctx.rect(-7, 4, 14, 2); - ctx.fill(); - ctx.restore(); - - ////////////////////////////////////////////////////////// - // LABEL FOR INFECTED/FRIENDS, BAR, AND CONTAGION LEVEL // - ////////////////////////////////////////////////////////// - - //if(!_hack_HIDE_BARS && !self._hack_TESTED){ - - ctx.save(); - - // Say: Infected/Friends - ctx.translate(0,-42); - var labelNum = self.numInfectedFriends+"/"+self.numFriends; - var labelPercent = ""; - if(self.numFriends>0){ - labelPercent = Math.round(100*(self.numInfectedFriends/self.numFriends)) + "%"; - } - ctx.font = '12px sans-serif'; - ctx.fillStyle = myColor; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fontWeight = "bold"; - ctx.fillText(labelNum, 0, 0); - - // A nice bar - ctx.translate(0,12); - ctx.lineWidth = 1; - - // the white fill - ctx.fillStyle = "#fff"; - ctx.beginPath(); - ctx.rect(-barWidth/2, -barHeight/2, barWidth, barHeight); - ctx.fill(); - - // The color fills - if(self.numFriends>0){ - ctx.fillStyle = PEEP_STATE_COLORS[2]; // state = 2 infected - ctx.beginPath(); - ctx.rect(-barWidth/2, -barHeight/2, barWidth*(self.numInfectedFriends/self.numFriends), barHeight); - ctx.fill(); - } - - // The outline - ctx.strokeStyle = myColor; - ctx.beginPath(); - if(self.numFriends>0){ - ctx.rect(-barWidth/2, -barHeight/2, barWidth, barHeight); - }else{ - ctx.rect(-barWidth/2, 0, barWidth, 0); - } - ctx.stroke(); - - // a pointer for contagion level - ctx.translate(0, barHeight/2+2); - self._drawThreshold(ctx, CONTAGION_THRESHOLD); - - // Percent - ctx.font = '8px sans-serif'; - ctx.fillStyle = "rgba(0,0,0,0.8)"; - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - ctx.fontWeight = "bold"; - ctx.fillText(labelPercent, 0, -6); - - ctx.restore(); - - } - - ctx.restore(); - - }; - self._drawThreshold = function(ctx, threshold){ - ctx.save(); - ctx.translate(barWidth*threshold - barWidth/2, 0); - - ctx.strokeStyle = "#000"; //PEEP_STATE_COLORS[2]; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.moveTo(0,0); - ctx.lineTo(0,-14); - ctx.stroke(); - - ctx.restore(); - } - - // Hit Test - self.hitTest = function(x,y,buffer){ - if(buffer===undefined) buffer=0; - var dx = self.x-x; - var dy = self.y-y; - var dist2 = dx*dx+dy*dy; - var r = radius+buffer; - return (dist2 z%THX_9ml`Fd+!YM9x}MtB8kCmD!GfwQwyn5Tf=O+4pk+qi$)nkBvwtFm`d!z(vmS9 zSKd&W@uaOcEGqtk0xnfsAr(t)HjdM=<3|(Q={$gW-MPOmU~FOxzUMxN;eM9r{Lb&I z`Eu^L=iKuEJUl!+JUl!+JUl!+JUl!+JUk8tL!PHp{_lK^$^ zAISxP*1#x`L~A7TVk{iVzxVUgcWoDKg0?hdCc8YWG14GT0W@G`-3(p>(_)vuEBF38 zKfGmS-B!>xhFra|(qF4n15J zGvxBz%~MR;V*8H1?Sk{sNH}TL;L(yt*2US?xJFv;@R$SL z?jwKa-!C;|OJ5z2AMMsR_ou%L{boXj5V0*EpemJheD&xq)JARJa+=mesqh4kzr1gU zj6JDrw)EBaE!WcbWQV?5RqUgkkRcj)K%~50>a`lmg{L~pR#7f|ZHJ7#bJnXU>CD;c zXIf}lb3i1QU<;9iD%S%uqp3Dft5tQCZ#GrbYZa?y?8%ls6?KF98clUTB%fo8t@neO z0kH1!8tX4>1)};`dtO%4#B#ZA2oXV6WXOuX7d}an;8XlIt9lL*L6$}I$xuw_bKMXC zP<(!bBQf1&gF4Gvh2rxgB%n`k*_Y84h6Dm(B#!h!l3pQ)2%&HcJ>NR!jIeD2!7zGs z>x&{`LSI`L(iI5dXx|AWjvRxs$Mgu1gh(WgqkRMDPV~B^W>|h`w zMB@p3=j3TT{NfHug(ur{MO&StA}a`lBIrH#CVKn&LFDZJQA^)jCr{(yy*nrs_tJM9 zy?w{Op>OLq(~poL64RRCOM`A?Sw?rF7tvS(n;WHFb6KHq3|)bsP1*J6Q_!90MPysw z&bh2WAc$ZjhOVyN`uws_Xw91VY_HA8ih^i7foMG8wv?BmC<3lhRhVb)e zI=k%bAmD&AF*+pl8yjdLoOg5i&-0PJbE9=xRuBk=4McKYG{VRSsx=S>gySq^W4(mC zcmCyAzG%D$C%*fA@jxcwHP7OPNW2IpS67|Xs+)Lp|8vLkHB}WbVu-|x!Xe^0#9cqE z_?5t-XpC?R`Dk=#X*#=9aC38xtSF|YCq(HA8hPF3ypi*`jJ@_UEx5U{GZc>Dt&=}+ zEMHe3Bpky`3r2DoGK2{W1a}M}A_PMb1Va%w((6X@8{7P9cphXryYwG#_4{6Meqwa^ zgpo+YlR`vN&S-4MLomE=#;_rcdN8wf@~6i);e0e4&KZq1Y{=yJV3A1jc2MnR%FLd1 zQ}ftfD|r#lPmB(mI#bJ(A(P{SMG&UU)X_;uAk(|bEcx1WDZBK~L%&6Vu`n?<^fR;7 zSn}yjVkvD!JqH&qsL@c`ikd7j4$-+MjGUEb02UiEIX+n2>Q6fVRhYqRYBXf|W7_idG#AFs+#;4z zooot&*P4xR%Bp^2C$=nb+F?rGj{03@vDpZxCdchLe%#i5VHamt3#vI}NpoG=4$__~TqbIZRWI!LDoaRI=2vlE6Q zIDVna_HnWc2jFYtqS^?J*wuOOg)3JcU7THw%SyZ6vcm-srY6n}JAS(k;PRzl+vjfO z&?eI@%*Zs=(3I1yVkfTO(gr*`YBmG6jA7)!^3=q8KX(1n$+j@0#q_n6ex~MmXC7so zCz5iFdNAW=i+GW?GGr$++2!FTV+6!0tHv;`TRtUF?!wraw!7sMXk$ZOWG1^jtPv-n zQBwEndqy4-uSra6AB_$z*{jgQ!^6YF!^6YF!^6YF!^6YFX8sRLhB*xet5D?t0000< KMNUMnLSTZw#aJr< diff --git a/puzzle/img/gray.png b/puzzle/img/gray.png deleted file mode 100644 index d45a5bb7b98242d3d501364f09a7cb9f15d2c8ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2075 zcmV+$2;}#PP) z-A>!e7RT3&?ZgRgorG4c+KSQyRH;M|XnMW#2Ael%&J#3`kn;wdC)n9n11#zkZ9@}G^Fh7YaX02KH&zkXk8i2#$a5x+ehr{7;I2;a# za|Oun0B%ClG_~LFXH3(~06+!+)-V0sMC;N|6=Pi8+uQpui#XjPkb>0f^_}T-nj?hd z5keUTRg?js6pcp9uU@@sGw^SlzzCvgnmQN^_7{sqfsqJTQ3ilgHk7`I$Ao3G!2j0wJW}R}5Fs1At;Y9xtU*slL~h`yxoK zR(q%GdJ+81h?{6(jPqW<1b8Y)qtVzI3yUX-#jHw`({UU#mqk|$3I8d<)0($rGlj>n1xdSfL^b6u#92=01!g*l}hC;3*SrxIX*uA zix84$;X6Q-Scu|!lU1wL-s-wua@%iE!5HV<9ILpRAs;_}{NpZ(0RUi{=3%{F-*L;I zYl3K+rjACVL%00hB4U%tq@-z@>V`Ad1nG9Whj0rAeQtmd%5*xNq8q+k5u{eDy#s)p z8@_HU2%*C9@$sLI{Wx{dY&M^FI-M%q(d_tzRy-chIGOiyoFUzAw+LK}bJlyko}=Xi zM;X#+GgQy)58;AXgS{XpCnt`l2ksK@-@pHZro2d7!F)dVWEIdfP0)262qAzF0znW!6sf~y zhSm6VUC#l4<@FNkztAv@9IXuvv)K%Ky&en(0~n9TU>F8qj6s%VP!t7Xu^1?d!ZHL` z<0FLR0N~$N{oDDMW0oP4$pqT%HhlW@3BG;%28+ew;&&KhxPSjXym;{fHa9mR7W4ik z&t`m7&x>lLu4$Uu?RI-KHdfJf9a^mx9336OU@*9{TsRzt&CN~7WHJzqMp=a7dVKMC zJZ5zUn5t7}*?$ZM12{cBz4ng<_|as1{`?ufeEGsEl;7eczR_r8`MFUEqU$=dc49mp z!}sssT`%hvPU15R!}4>Z5`@(bL_!G6=W`g1MwZIclyw8A@zLy0qY}h4O`76Vn5Jpj zKOqDR!(bN6@9-);U<6SV z1s*MS=eEs?r&d$y*=87Vb2qY2-NF)-zO)}bz4`Xb3?*XkKJ(hw100@Er zs;b`DH28&`_yj?)Jl#aqhlIo77EO814@6OHSuIPw4X9G75Lz1+7={75u6tG=#u!4O zkS*J6Hf#AgQ#ZzhkZKUlnfLpBI6Xb}tiE_W4#{NFj%k^uFts2U<0>JkfsA)(SKW`pW=9sIFN!0o!YriC%y-`m@B zWt?#no_}Gd(P-?9$Kyl8FxI`U+XiJ8Z&KIc+c&5_eE9HgKA#r}AwkTRRwxuIY;SM> z<8{Tpex2x{}AC&|Mm>`#FHk;39 zvsr#No8=6{$hna@2%(-J2xUPK%F$@lw`S=&0xQU`G#ZT^(=;=tX|C(Kp1bLAz90za z=gZ3&<7y-lsV0-jKz;X?!{Kl^91e%W;cz${4u?a<{{U+eQL5kVT)+ST002ovPDHLk FV1hR~=IsCg diff --git a/puzzle/img/green.png b/puzzle/img/green.png deleted file mode 100644 index d3e74075a8578ffd9120acb5385205490f856620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2327 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 XXaM%d0<%Mq00000NkvXXu0mjfWKJ%+ diff --git a/puzzle/img/red.png b/puzzle/img/red.png deleted file mode 100644 index 3c32e4675be7a8af98cd0c3561234b1920504be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2111 zcmV-F2*CG=P) zOK%(3703T)=5i=LY*AGGh*MhBV7Y)%peRrV2C|L%4VX_5c9BH` zq-KF4fZ?`g3j;19Rb`1R5RRt|wICb0+_-Ha z4Z;E#X#fi#O30SOj5QF}U}H^?SxZ%`PrQ%T8-`Ahja+WrGO0ksiy%t-;)J;cLK#ez zVQWQ0BS<}yzs`gL0fiv_GNTDbNf%t6U0G=d>H8oCE=WC-yTzaq5vB(n3j<|c2F3zp4ygvxffeW&c%Z=MM$^b0}?OO`w7J$NBb>&Y%x(!s2 zy;e~fhVH3^0O&7MYs~Ap2=T76)CO+*7L8*ZtUH)5aJWL zdh08;oo@W}=Z+_gjshd?)3`K-hJ0m#^t=rVl{Rg z#n=D&vf#wdks$RdYiU2tOONDwA9b{q#07QVQ9S2_iDBnUApLHeNc)pP0Z zNm`IbCNrfctxPgHlFTmW9@(s`w9lI+3VqN?XS`9b-fPZNMz${ z?T@dso0jnveA_>OZPUWjot^%kwJbFHeAX-6#AkQqDvy*PjZDUuqc2_C#%7~{PJ<51kh$K9UPm@6fS1>t$R%K%Jf>{wQRF-Sb?1#aWxUQg;f8;UMVmVv)zbPR6d z8@M0@Kqo?&`U^z^U}(CpG3_Vl_y#Tr02mq}84C6JtcGOB@HwK_eFhibPzVyy1*W1= z99ORhz*!-1B@ziDtZxW1zM&8#s_VEGk7FhpgK@}&PXmw;A-okogEs>f#8rHn+=wDI zQ`gCATF2HCXCy)fzCZaL{Ns5WpYQH`D^n3fNQMl&6+eTk@whMk{fdu5MpMR*bV5+i z=K1)i++o@_UYI>}ZH5LQB6P$>e|>lm$i%0`W5wA&SNeXVSAKDkx#joryU;XD7-2tM zxI!jAEfj9aldWjlR-*ZI+DO;+RJHnK@7f8)G3aMwHCY>HRh>`+FtC#+IuYUy`*bHn9Ij1;Vu_lpjUz$G z<_c?rJDW9W82It|i-Gww9PHsUY0dBc=GW3!aX1r1P=zi3=Oc$T-%lMR)e22N_1~^1XYGuW)iD$Xs>#Gu2AIP56!TMK|`Y7eRDb>P@OW zXl$(FrgZ=w2=ellXjTI}Q7bxg#dYQMWSLOYP-H&c%kmktPK``v-Xd`- zMIj+7S3iAx+l#V1TS!k;t54X*sT)sN*PF@d%LT8>^K@t9T5b7Pe44IkBDA6xE-lLL zc^qA&53FbMe;@hVfrua`CKhLYf8W!auYKA3({)ad`XEnd&lJ2C1Mo?Z*_D;Hu5)@M zCymT4io^?7AO69YyL){nZFTvbkr?O+Eqy%cs~A8) zXM3-$F24hC@x<=MYkEz8<3c+1@czlajDJ5T^5-gqD9wHPIIy3q2=s(is#<-b>%4Fh zx-cfKDPr-(AjJR%_;y%5pTEu~%0t;&!bWNG@|#63Cw%=f(AV`ga(Bj=+ly@5rD3=~ zg@mYR6O+Z%{of7jcMgZ<{mFm*;D^7kZC)C{48KK&QPGm)#ndOCxL&Pw%g_k&ipGtb z^JcHJM9hnRwi?!GO^e1#$?&;K@V|0A0&BAm9t=$@ pP$(1%g+ifFC=?2XLZMJN;{RpV_WmEtrL_P6002ovPDHLkV1k*@_>2Gm diff --git a/puzzle/img/yellow.png b/puzzle/img/yellow.png deleted file mode 100644 index 1e19ac6e6329373c47360a8b10ebbd50a6322f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmV;^2Q2uBP) zO>7&-703T?mJ(&_gIr00W5BhA6b*s`0Tr}YM?_rPx|u!r5=aW|qQ3MH^^{|oV=s-8 zOHWN%OUNY`_9jcP!Jz0(XeIQJqD2Ebb>XBnxsr~AhoUcQgpwXm7V=rX3i357C>6V)HcA|5F^_nIbL?p{$?laSi>TAg4DL&OL6UP zp20Z+Wg~J^2Xj#zn=ZL;eh{l(6dOUjTR)$Z?PeaJyiv!D3Y_H1WO}klKmPTuQQuFY z=Yn{fS1w7}Spi|D*RcSiI5~M@xtGH9Oc3wZ)r@SnivVVO6~i-e5{0RAAHUxV*Tw~@ zZCy*rYNJR*In%xssf&?x-hK0bvae~&&B<69(mir%fOnJ8>WGGukd zIP!DGi>Ql4BI~~Oai|l0=so1#jiq-6Knws#%XYh1+q{+v(`cxIcpHmzL@0)7Gv>@n zZj{0_7@8op&C4kX3N^T+0D-dA&81(3WiK>AB#)G!cUE!qVHCWL#knv{g(66GW9i)p z&n}JxlBrnR3O=6%7UXbJD+IN3Jp-MwJPAskO8kQ(#wqt~V}b8-Sgm={GSKH`yC0KQ9ylm$6_Mk92*2QB<*`z!qC zzu$l#|7RO$v^uEXZ{eF}8{@}^F`XVU+EY~Gn;0F&RH_@F?A|Zmg6OQWBH7vf$G>-R z_uj)NFZMCMt~K!YFYA!FD1W2PWG!}vYz$@QN z`OYm~IW+;(X^5%#Vk5|Fr_(rnV(f*R0HkeYeFAsj*?4 zoqZV-{~SW)t3B-Q?SJS0ZLV7%j$qDmf1d5NSqT)m6>t08Mby$-V-HYl- ziB6}xY!m`;3{K+DLpeT1UB$lo<|268MA@h#1f1B+a8KelJ^|iVv8#N^#87fD=rA>v z?w9(Ir8p)=Mfopx(J{E8HTTBLNT_$&y2@DypdpBmvMfdK$CAJOtBQle^9U21&71%n zwKmLLR`sJSh&#WwQ{7mKbYk~IyDg0hqSF_NsI1yX>#MG#{2(HvEUUKB%<`xNpr^H2 zXWuw!^pGl{nt3xS?);ka6S`W02+=4pAM5F`_4@ZGjrvpG3K4n_ziMY%1M)1oHo|Go zxaU5(t=vxAq2v|aw*3w>mvqDc0tn*HukA4GghhK~oI`xStk&6Kss_mV+ zuzCfA0-#nj78e*?HX#OJ{O2kbGLnS-xr*mtw4TSEU)v$km^~7?3Zo(jIg?@lz5L0e zjm0_1RE%YBVO}B8EQFcx`K71T%eBqRDJhTTsC&ZJ^A~9{bID;Yn3yY`MeobW54m?^ z>7B!OOqtH`>j0O8(}ocUF-8T%Wo9ZniFP>-z2RxZT9C)_))z7ml$JhUd&CkIhq%Jj+>TQ(uvjb> li^XEGSS%Kc#bU8&@qeWi21Zr%(-Z&z002ovPDHLkV1je}$npRH diff --git a/puzzle/levels/0_draw_whatever.js b/puzzle/levels/0_draw_whatever.js deleted file mode 100644 index a919502..0000000 --- a/puzzle/levels/0_draw_whatever.js +++ /dev/null @@ -1,40 +0,0 @@ -_hack_HIDE_BARS = true; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "goal": "herp derp", - "contagion": 0, - "peeps": [ - [27+20,154],[30+20,263],[39+10,444],[73+10,63],[88+10,367], - [125,210], - [125,290], // 6 - [140+10,470],[195+5,128],[215+5,358], - [221,38],[295,450],[332,121], - [375,290], // 13 - [375,210], - [378,397],[429,52],[451,183],[445,459],[461,323] - ], - "connections": [[6,13]] -}; - -// Add peeps! -loadNetwork(initData); - - -var instruction1 = new Image(); -instruction1.src = "img/instruction_connect.png"; -var instruction2 = new Image(); -instruction2.src = "img/instruction_disconnect.png"; -function _preUpdate(){ - ctx.drawImage(instruction1, 0, 0, 500, 500); - ctx.drawImage(instruction2, 0, 0, 500, 500); -} - - - -// Update -update(); \ No newline at end of file diff --git a/puzzle/levels/1a_thresholds.js b/puzzle/levels/1a_thresholds.js deleted file mode 100644 index dc365f4..0000000 --- a/puzzle/levels/1a_thresholds.js +++ /dev/null @@ -1,18 +0,0 @@ -PEEP_STATE_COLORS[2] = "#eebb55"; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0, - "peeps":[[196,200,1],[307,297,2],[199,296,1],[305,199,2]], - "connections":[[3,2],[3,1]] -} - -// Add peeps! -loadNetwork(initData); - -// Update -update(); diff --git a/puzzle/levels/1b_majority.js b/puzzle/levels/1b_majority.js deleted file mode 100644 index 3f45013..0000000 --- a/puzzle/levels/1b_majority.js +++ /dev/null @@ -1,48 +0,0 @@ -PEEP_STATE_COLORS[2] = "#eebb55"; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0.5, - "peeps":[[128,122,2],[239,84,2],[356,131,2],[74,224,1],[95,333,1],[170,401,1],[286,411,1],[376,342,1],[403,236,1]], - "connections":[] -} - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -function _onUpdate(){ - - // WINNER? Only if ALL peeps think drinking is in the majority - var progress = 0; - peeps.forEach(function(peep){ - if(peep.numFriends>0 &&peep.numInfectedFriends/peep.numFriends>=0.5){ - progress++; - } - }); - YOU_ARE_WINNER = (progress==9); - - // Progress... - var label = "FOOLED: "+progress+" out of 9 peeps"; - ctx.font = '14px sans-serif'; - ctx.fillStyle = PEEP_STATE_COLORS[2]; - ctx.textAlign = "center"; - ctx.fillText(label, 250, 465); - - ctx.lineWidth = 1; - ctx.strokeStyle = PEEP_STATE_COLORS[2]; - - ctx.beginPath(); - ctx.rect(160, 470, 180, 10); - ctx.stroke(); - ctx.beginPath(); - ctx.rect(160, 470, 180*(progress/9), 10); - ctx.fill(); - -} \ No newline at end of file diff --git a/puzzle/levels/2a_sim.js b/puzzle/levels/2a_sim.js deleted file mode 100644 index 0d84e98..0000000 --- a/puzzle/levels/2a_sim.js +++ /dev/null @@ -1,33 +0,0 @@ -_hack_HIDE_BARS = true; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0, - "peeps":[[50,263,2],[141,274,1],[204,353,1],[452,264,1],[301,341,1],[364,271,1],[204,195,1],[301,206,1]], - "connections":[[0,1],[1,2],[1,6],[6,7],[7,5],[5,3],[5,4],[4,2]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff EVERYONE is infected! - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - YOU_ARE_WINNER = everyoneIsInfected; - -} \ No newline at end of file diff --git a/puzzle/levels/2b_simple_cascade.js b/puzzle/levels/2b_simple_cascade.js deleted file mode 100644 index 57ec60d..0000000 --- a/puzzle/levels/2b_simple_cascade.js +++ /dev/null @@ -1,33 +0,0 @@ -_hack_HIDE_BARS = true; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0, - "peeps":[[57,72,2],[454,371,1],[418,438,1],[338,408,1],[333,340,1],[406,304,1],[269,116,1],[234,172,1],[305,173,1],[141,88,1],[143,243,1],[82,304,1],[124,366,1],[200,353,1],[215,276,1]], - "connections":[[6,7],[4,1],[5,4],[4,3],[3,1],[1,2],[1,5],[5,2],[3,5],[4,2],[3,2],[8,6],[8,7],[9,0],[14,10],[10,11],[11,12],[12,13],[13,14],[14,11],[10,12],[13,10],[11,13],[12,14]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff EVERYONE is infected! - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - YOU_ARE_WINNER = everyoneIsInfected; - -} \ No newline at end of file diff --git a/puzzle/levels/3a_complex.js b/puzzle/levels/3a_complex.js deleted file mode 100644 index acf2af8..0000000 --- a/puzzle/levels/3a_complex.js +++ /dev/null @@ -1,21 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":0.25, - "peeps":[[147,69,2],[77,117,1],[77,185,1],[140,226,1],[402,140,1],[143,307,2],[95,340,1],[68,389,1],[90,436,1],[151,465,1],[398,391,1]], - "connections":[[0,4],[1,4],[2,4],[3,4],[5,10],[6,10],[7,10],[8,10],[9,10]] -} - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); diff --git a/puzzle/levels/3b_complex_cascade.js b/puzzle/levels/3b_complex_cascade.js deleted file mode 100644 index 777d023..0000000 --- a/puzzle/levels/3b_complex_cascade.js +++ /dev/null @@ -1,33 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":0.25, // DIFFERENT - "peeps":[[57,72,2],[454,371,1],[418,438,1],[338,408,1],[333,340,1],[406,304,1],[269,116,1],[234,172,1],[305,173,1],[141,88,1],[143,243,1],[82,304,1],[124,366,1],[200,353,1],[215,276,1]], - "connections":[[6,7],[4,1],[5,4],[4,3],[3,1],[1,2],[1,5],[5,2],[3,5],[4,2],[3,2],[8,6],[8,7],[9,0],[14,10],[10,11],[11,12],[12,13],[13,14],[14,11],[10,12],[13,10],[11,13],[12,14]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff EVERYONE is infected! - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - YOU_ARE_WINNER = everyoneIsInfected; - -} \ No newline at end of file diff --git a/puzzle/levels/3c_extinguish.js b/puzzle/levels/3c_extinguish.js deleted file mode 100644 index c615e21..0000000 --- a/puzzle/levels/3c_extinguish.js +++ /dev/null @@ -1,22 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":1/4, - "peeps":[[50,263,2],[141,274,1],[204,353,1],[452,264,1],[301,341,1],[364,271,1],[204,195,1],[301,206,1]], - "connections":[[0,1],[1,2],[1,6],[6,7],[7,5],[5,3],[5,4],[4,2]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); diff --git a/puzzle/levels/4a_sweet_spot.js b/puzzle/levels/4a_sweet_spot.js deleted file mode 100644 index 1677592..0000000 --- a/puzzle/levels/4a_sweet_spot.js +++ /dev/null @@ -1,22 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":0.25, - "peeps":[[46,145,1],[91,79,2],[201,146,1],[168,211,1],[75,215,1],[168,79,1],[325,82,2],[402,78,1],[279,144,1],[320,212,1],[406,215,1],[443,143,1],[197,294,2],[150,353,1],[279,292,1],[320,349,1],[283,419,1],[196,420,1]], - "connections":[[1,5],[8,6],[6,7],[7,11],[11,10],[10,9],[9,8],[8,7],[11,6],[8,11],[7,9],[9,6],[10,8],[9,11],[0,4],[3,2],[10,6],[10,7]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); diff --git a/puzzle/levels/4b_bridge.js b/puzzle/levels/4b_bridge.js deleted file mode 100644 index 8ce0639..0000000 --- a/puzzle/levels/4b_bridge.js +++ /dev/null @@ -1,22 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":0.25, - "peeps":[[109,87,2],[186,106,1],[219,177,1],[158,251,1],[73,230,1],[46,152,1],[271,302,1],[316,234,1],[410,229,1],[454,318,1],[401,396,1],[307,388,1]], - "connections":[[11,6],[11,10],[10,9],[9,8],[8,7],[7,6],[6,9],[8,11],[10,7],[7,11],[10,8],[9,11],[6,10],[9,7],[6,8],[3,2],[5,4],[1,0]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); \ No newline at end of file diff --git a/puzzle/levels/4c_small_world.js b/puzzle/levels/4c_small_world.js deleted file mode 100644 index 019388a..0000000 --- a/puzzle/levels/4c_small_world.js +++ /dev/null @@ -1,22 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":0.25, - "peeps":[[190,80,2],[267,70,1],[152,147,1],[316,116,1],[60,300,1],[138,293,1],[40,382,1],[90,449,1],[169,433,1],[194,362,1],[199,206,1],[293,197,1],[346,288,1],[412,311,1],[286,333,1],[433,386,1],[372,437,1],[299,408,1]], - "connections":[[0,1],[2,10],[11,3],[14,17],[13,12],[16,15],[8,9],[5,4],[6,7]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); diff --git a/puzzle/levels_old/0_draw_whatever.js b/puzzle/levels_old/0_draw_whatever.js deleted file mode 100644 index a919502..0000000 --- a/puzzle/levels_old/0_draw_whatever.js +++ /dev/null @@ -1,40 +0,0 @@ -_hack_HIDE_BARS = true; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "goal": "herp derp", - "contagion": 0, - "peeps": [ - [27+20,154],[30+20,263],[39+10,444],[73+10,63],[88+10,367], - [125,210], - [125,290], // 6 - [140+10,470],[195+5,128],[215+5,358], - [221,38],[295,450],[332,121], - [375,290], // 13 - [375,210], - [378,397],[429,52],[451,183],[445,459],[461,323] - ], - "connections": [[6,13]] -}; - -// Add peeps! -loadNetwork(initData); - - -var instruction1 = new Image(); -instruction1.src = "img/instruction_connect.png"; -var instruction2 = new Image(); -instruction2.src = "img/instruction_disconnect.png"; -function _preUpdate(){ - ctx.drawImage(instruction1, 0, 0, 500, 500); - ctx.drawImage(instruction2, 0, 0, 500, 500); -} - - - -// Update -update(); \ No newline at end of file diff --git a/puzzle/levels_old/1_majority.js b/puzzle/levels_old/1_majority.js deleted file mode 100644 index 3f45013..0000000 --- a/puzzle/levels_old/1_majority.js +++ /dev/null @@ -1,48 +0,0 @@ -PEEP_STATE_COLORS[2] = "#eebb55"; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0.5, - "peeps":[[128,122,2],[239,84,2],[356,131,2],[74,224,1],[95,333,1],[170,401,1],[286,411,1],[376,342,1],[403,236,1]], - "connections":[] -} - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -function _onUpdate(){ - - // WINNER? Only if ALL peeps think drinking is in the majority - var progress = 0; - peeps.forEach(function(peep){ - if(peep.numFriends>0 &&peep.numInfectedFriends/peep.numFriends>=0.5){ - progress++; - } - }); - YOU_ARE_WINNER = (progress==9); - - // Progress... - var label = "FOOLED: "+progress+" out of 9 peeps"; - ctx.font = '14px sans-serif'; - ctx.fillStyle = PEEP_STATE_COLORS[2]; - ctx.textAlign = "center"; - ctx.fillText(label, 250, 465); - - ctx.lineWidth = 1; - ctx.strokeStyle = PEEP_STATE_COLORS[2]; - - ctx.beginPath(); - ctx.rect(160, 470, 180, 10); - ctx.stroke(); - ctx.beginPath(); - ctx.rect(160, 470, 180*(progress/9), 10); - ctx.fill(); - -} \ No newline at end of file diff --git a/puzzle/levels_old/2_simple_contagion.js b/puzzle/levels_old/2_simple_contagion.js deleted file mode 100644 index 2f821d5..0000000 --- a/puzzle/levels_old/2_simple_contagion.js +++ /dev/null @@ -1,31 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":0, - "peeps":[[72,85,2],[335,203,1],[417,256,1],[442,344,1],[374,421,1],[272,416,1],[205,330,1],[243,246,1],[111,232,1],[214,112,1]], - "connections":[[8,9],[7,2],[2,6],[6,1],[7,6],[6,5],[5,1],[1,4],[3,1],[2,1],[1,7],[7,3],[7,4],[5,7],[6,3],[6,4],[5,2],[5,3],[5,4],[4,2],[4,3],[3,2]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff EVERYONE is infected! - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - YOU_ARE_WINNER = everyoneIsInfected; - -} \ No newline at end of file diff --git a/puzzle/levels_old/3_complex_contagion.js b/puzzle/levels_old/3_complex_contagion.js deleted file mode 100644 index 3b90da7..0000000 --- a/puzzle/levels_old/3_complex_contagion.js +++ /dev/null @@ -1,31 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":1/3, // DIFFERENT - "peeps":[[72,85,2],[335,203,1],[417,256,1],[442,344,1],[374,421,1],[272,416,1],[205,330,1],[243,246,1],[111,232,1],[214,112,1]], - "connections":[[8,9],[7,2],[2,6],[6,1],[7,6],[6,5],[5,1],[1,4],[3,1],[2,1],[1,7],[7,3],[7,4],[5,7],[6,3],[6,4],[5,2],[5,3],[5,4],[4,2],[4,3],[3,2]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff EVERYONE is infected! - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - YOU_ARE_WINNER = everyoneIsInfected; - -} \ No newline at end of file diff --git a/puzzle/levels_old/4_simple_group.js b/puzzle/levels_old/4_simple_group.js deleted file mode 100644 index ab57b27..0000000 --- a/puzzle/levels_old/4_simple_group.js +++ /dev/null @@ -1,87 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -/*var initData = { - "contagion":0, - "peeps":[[199,165,1],[292,165,1],[146,251,1],[347,251,1],[202,333,1],[297,334,1]], - "connections":[] -}*/ -var initData = { - "contagion":0, - "peeps":[[199,165,1],[292,165,1],[146,251,1],[347,251,1],[202,333,1],[297,334,1]], - "connections":[[4,2],[2,0],[0,1],[1,3],[3,5],[5,4]] -}; -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -///////////////////// -// TEST EVERY PEEP // -///////////////////// - -var PEEP_TO_INFECT = 0; -function _startSimulation(){ - PEEP_TO_INFECT = 0; - var peep = peeps[PEEP_TO_INFECT]; - peep.infect(); - peep._hack_TESTED = true; -} -function _stopSimulation(){ - peeps.forEach(function(peep){ - peep._hack_TESTED = false; - }); -} -function _stepSimulation(){ - - // Everyone infected? - var everyoneIsInfected = _isEveryoneInfected(); - - // If everyone infected, reset! and increment. - if(everyoneIsInfected){ - PEEP_TO_INFECT++; - if(peeps[PEEP_TO_INFECT]){ - SIM_STEP = 0; - _resetToBeforeSimStarted(); - var peep = peeps[PEEP_TO_INFECT]; - peep.infect(); - peep._hack_TESTED = true; - }else{ - YOU_ARE_WINNER = true; - } - }else{ - - // Otherwise, keep on infecting. - _infectPeople(); - - // If didn't infect in single step, you MESSED UP. - everyoneIsInfected = _isEveryoneInfected(); - if(!everyoneIsInfected){ - setTimeout(function(){ - alert("Alas, you did not infect everyone in a SINGLE step!"); - _stopSim(); - },500); - } - - } - - -} - -function _isEveryoneInfected(){ - var everyoneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state!=2) everyoneIsInfected=false; - }); - return everyoneIsInfected; -} \ No newline at end of file diff --git a/puzzle/levels_old/5_complex_group.js b/puzzle/levels_old/5_complex_group.js deleted file mode 100644 index 74ae206..0000000 --- a/puzzle/levels_old/5_complex_group.js +++ /dev/null @@ -1,84 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[2] = "#8b9dc3"; - -var initData = { - "contagion":1/4, - "peeps":[[199,165,1],[292,165,1],[146,251,1],[347,251,1],[202,333,1],[297,334,1]], - "connections":[[4,2],[2,0],[0,1],[1,3],[3,5],[5,4]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -///////////////////// -// TEST EVERY PEEP // -///////////////////// - -var PEEP_TO_INFECT = 0; -var lastCount = 0; -function _startSimulation(){ - PEEP_TO_INFECT = 0; - peeps[PEEP_TO_INFECT].infect(); - peeps[PEEP_TO_INFECT]._hack_TESTED = true; - lastCount = 1; -} -function _stopSimulation(){ - peeps.forEach(function(peep){ - peep._hack_TESTED = false; - }); -} -function _stepSimulation(){ - - _infectPeople(); - - // Did count stay the same? - var countStayedTheSame = (lastCount == _numPeopleInfected()); - lastCount = _numPeopleInfected(); - - // If so, yay, next round - if(countStayedTheSame){ - PEEP_TO_INFECT++; - lastCount = 1; - if(peeps[PEEP_TO_INFECT]){ - SIM_STEP = 0; - _resetToBeforeSimStarted(); - var peep = peeps[PEEP_TO_INFECT]; - peep.infect(); - peep._hack_TESTED = true; - }else{ - YOU_ARE_WINNER = true; - } - }else{ - - // If everyone's infected, FAIL. - var everyoneIsInfected = (_numPeopleInfected()==6); - if(everyoneIsInfected){ - setTimeout(function(){ - alert("Alas, everyone's infected!"); - _stopSim(); - },500); - } - - } - -} - -function _numPeopleInfected(){ - var count = 0; - peeps.forEach(function(peep){ - if(peep.state==2) count++; - }); - return count; -} - diff --git a/puzzle/levels_old/6_depolarization.js b/puzzle/levels_old/6_depolarization.js deleted file mode 100644 index 4ab50bf..0000000 --- a/puzzle/levels_old/6_depolarization.js +++ /dev/null @@ -1,58 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -PEEP_STATE_COLORS[1] = "#BF5FFF"; // purple -PEEP_STATE_COLORS[2] = "#83F52C"; // green -_hack_SHOW_BOTH_STATES = true; - -var initData = { - "contagion":0.75, - "contagion2":0.95, - "peeps":[[162,99,1],[70,183,1],[70,301,1],[141,408,1],[357,100,2],[439,183,2],[432,305,2],[358,408,2]], - "connections":[[0,1],[1,2],[2,3],[7,6],[6,5],[5,4]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -function _onUpdate(){ - - // WINNER? Only if ratio of SAME friends is 3/4<=x<1 - var progress = 0; - peeps.forEach(function(peep){ - var sameFriendCount = 0; - var friends = getConnected(peep); - friends.forEach(function(friend){ - if(friend.state==peep.state) sameFriendCount++; - }); - var sameFriendRatio = sameFriendCount/friends.length; - if(0.75<=sameFriendRatio && sameFriendRatio<=0.95){ - progress++; - } - }); - YOU_ARE_WINNER = (progress==8); - - // Progress... - var label = "SOLVED: "+progress+" out of 8 peeps"; - ctx.font = '14px sans-serif'; - ctx.fillStyle = "#888"; - ctx.textAlign = "center"; - ctx.fillText(label, 250, 465); - - ctx.lineWidth = 1; - ctx.strokeStyle = "#888"; - - ctx.beginPath(); - ctx.rect(160, 470, 180, 10); - ctx.stroke(); - ctx.beginPath(); - ctx.rect(160, 470, 180*(progress/8), 10); - ctx.fill(); - -} \ No newline at end of file diff --git a/puzzle/levels_old/7_reintegrate.js b/puzzle/levels_old/7_reintegrate.js deleted file mode 100644 index eda59b0..0000000 --- a/puzzle/levels_old/7_reintegrate.js +++ /dev/null @@ -1,67 +0,0 @@ -PEEP_STATE_COLORS[2] = "#eebb55"; // yellow -_hack_SHOW_BOTH_STATES = true; -_hack_REINTEGRATION_PUZZLE = true; - -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":1/3, - "peeps":[[237,70,1],[67,125,1],[172,189,1],[315,185,1],[432,119,1],[249,342,2],[160,381,2],[335,396,2]], - "connections":[[5,6],[2,0],[0,1],[0,3],[4,0],[5,7]] -}; -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -function _onUpdate(){ - - // Winner iff NO ONE is infected! - var nooneIsInfected = true; - peeps.forEach(function(peep){ - if(peep.state==2) nooneIsInfected=false; - }); - YOU_ARE_WINNER = nooneIsInfected; - -} - -function _infectPeople(){ - - // Consider all peeps, and their friends - peeps.forEach(function(peep){ - - // How many infected friends? - if(peep.numFriends==0) return; // No friends? NVM. - var ratioOfInfectedFriends = peep.numInfectedFriends/peep.numFriends; - - // If susceptible, if %>=1/3 of friends infected, get infected - // If infected, if %<1/3 of friends not infected, get not infected - peep._NEXT_STATE = peep.state; // default - if(peep.state==1){ - if(ratioOfInfectedFriends>=1/3){ - peep._NEXT_STATE = 2; - } - } - if(peep.state==2){ - if(ratioOfInfectedFriends<=1/3){ - peep._NEXT_STATE = 1; - } - } - - }); - - // "Infect" the peeps who need to get infected - peeps.forEach(function(peep){ - peep.state = peep._NEXT_STATE; - }); - -} \ No newline at end of file diff --git a/puzzle/levels_old/8_complex_filter.js b/puzzle/levels_old/8_complex_filter.js deleted file mode 100644 index d321c93..0000000 --- a/puzzle/levels_old/8_complex_filter.js +++ /dev/null @@ -1,124 +0,0 @@ -canvas.style.width = 500; -canvas.style.height = 500; -canvas.width = parseInt(canvas.style.width)*2; -canvas.height = parseInt(canvas.style.height)*2; - -var initData = { - "contagion":1/4, - "peeps":[[174,87,1],[319,84,1],[195,183,1],[297,178,1],[143,268,1],[60,315,1],[113,404,1],[196,342,1],[299,327,1],[341,250,1],[443,296,1],[378,394,1]], - "connections":[[2,0],[0,1],[1,3],[3,2],[0,3],[2,1]] -} -_makeUncuttable(initData.connections); - -// Add peeps! -loadNetwork(initData); - -// Update -update(); - -// SHOW CONTAGION UI -showContagionUI(); - -///////////////////// -// TEST EVERY PEEP // -///////////////////// - -var _ticker = 0; -var TEST_STAGE = 1; -var TESTS_PASSED = 0; -var infectedLastCount = 1; -function _onUpdate(){ - - if(TEST_STAGE==1){ - PEEP_STATE_COLORS[2] = "#8b9dc3"; // cobalt - } - if(TEST_STAGE==2){ - PEEP_STATE_COLORS[2] = "#dd4040"; // red - } - - if(SIM_IS_RUNNING){ - _ticker++; - if(_ticker>7){ - - // Infect people - _ticker = 0; - _infectPeople(); - var countChanged = (infectedLastCount<_numPeopleInfected()); - infectedLastCount = _numPeopleInfected(); - - // If Test Stage = 1 (25% contagion) it SHOULD infect everyone - // pass only when it does - if(TEST_STAGE==1){ - if(_numPeopleInfected()==peeps.length){ - TESTS_PASSED++; - _nextPeepTest(); - if(TESTS_PASSED==peeps.length){ - alert("Okay... now testing 33% contagion threshold..."); - TEST_STAGE=2; // NEXT STAGE - CONTAGION_THRESHOLD = 1/3; // it's 33% THRESHOLD NOW - TESTS_PASSED = 0; - PEEP_TO_INFECT = 0; - _nextPeepTest(); - } - }else if(!countChanged){ - alert("Alas! You did NOT infect everyone at 25% contagion threshold"); - _stopSim(); - } - } - - // If Test Stage = 2 (33% contagion) it SHOULD NOT infect everyone - // pass only when it stays the same - if(TEST_STAGE==2){ - if(!countChanged){ - TESTS_PASSED++; - _nextPeepTest(); - if(TESTS_PASSED==peeps.length){ - alert("WIN!"); - YOU_ARE_WINNER = true; - _stopSim(); - } - }else if(_numPeopleInfected()==peeps.length){ - alert("Alas! You've infected everyone at 33% contagion threshold"); - _stopSim(); - } - } - - } - } -} - -var PEEP_TO_INFECT = 0; -var _nextPeepTest = function(){ - _resetToBeforeSimStarted(); - if(TEST_STAGE==2) CONTAGION_THRESHOLD=1/3; // hack - var peep = peeps[PEEP_TO_INFECT]; - if(!peep) return false; - peep.infect(); - peep._hack_TESTED = true; - PEEP_TO_INFECT++; - infectedLastCount = 1; - return true; -}; - -// at 25% contagion, it SHOULD infect everyone -// at 33% contagion, it SHOULD NOT infect everyone - -var lastCount = 0; -function _startSimulation(){ - CONTAGION_THRESHOLD = 1/4; - TEST_STAGE = 1; - TESTS_PASSED = 0; - PEEP_TO_INFECT = 0; - _nextPeepTest(); -} -function _stopSimulation(){ - CONTAGION_THRESHOLD = 1/4; -} - -function _numPeopleInfected(){ - var count = 0; - peeps.forEach(function(peep){ - if(peep.state==2) count++; - }); - return count; -} \ No newline at end of file diff --git a/puzzle/puzzle.css b/puzzle/puzzle.css deleted file mode 100644 index b2cac28..0000000 --- a/puzzle/puzzle.css +++ /dev/null @@ -1,46 +0,0 @@ -body{ - margin: 25px; - background: #eee; - - font-family: sans-serif; - font-size: 19px; - font-weight: 100; - line-height: 1.4em; -} - -h2, h3{ - margin-top: 0; -} - -#content{ - width:850px; - height:530px; - position: absolute; - margin: auto; - top:0; left:0; right:0; bottom:0; -} -#content_puzzle{ - display: block; - float: right; - border:none; - /*border: 1px solid #ddd;*/ -} -#content_words{ - width: 325px; - float: left; -} -#next{ - position: absolute; - width: 325px; - left:0; bottom:30px; - text-align: right; - font-size: 15px; -} -.icon{ - height: 1em; - transform: translate(0,3px) scale(1.5, 1.5); -} - -slide{ - display:none; -} \ No newline at end of file diff --git a/puzzle/puzzle.html b/puzzle/puzzle.html deleted file mode 100644 index fba357f..0000000 --- a/puzzle/puzzle.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - -
-
- - -
- - - - - -

THE WISDOM and/or MADNESS of the CROWDS

- Why is it that the same people, in different groups, can be kind, cruel, smart, stupid? - In this explorable explanation, - I'll show how the network of a group itself can shape the people caught in its web. -
-
- - Draw a network of friends! → - When you're done playing around, press "next" ↘ - -
- - An example. On the right, - - represent binge-drinkers, and - - represent non-binge-drinkers. - People look to their network of peers, to get a sense of how many of their friends do something. -

- (the number over their heads show what % of their friends, not counting themselves, - are binge-drinkers. #binge_drinking_friends/#friends) -

- - Play around to get a feel of this! - Connect & disconnect people, and see how that changes their perception - of how many people do X → - -
- - As important as friendships are, networks can fool people. - A 1991 study showed that “virtually all students reported that their friends drank more than they did”. (which, if you think about it, is logically impossible!) - In fact, it's possible to fool everyone that a majority of people do X, even if people who do X are in a minority: -

- - Puzzle! Fool everyone into thinking 50% OR MORE of their - friends are binge-drinkers → - -
- - But of course, networks don't just fool people, they also change people. - "Contagions", like beliefs and behaviors, spread from person to person through a network. -

- On the right, we start with one person - - who believes a rumor. "Fake news", as the cool kids say. - Every day, that person will pass the lie on to their friends. - And they pass it on to their friends. - And so on. -

- - Click START SIM to see the "contagion" spread - (note: for now, a person adopts a contagion if AT LEAST ONE - FRIEND does. we'll see other possibilities later) → - - -
- - Now, we have a bunch of small, separate communities. -

- - Try to infect everyone with the rumor over time! - (Feel free to just hit "start sim" and try out many different networks again and again) - → - - (note: you can't cut the pre-existing connections) -
- - (someting something compounding cascade effect, something something knocking 'em down - like ever-bigger dominos) -

- (something something about spread of madness through crowds, like - 2008 financial crisis or mass speculation or mobs or riots or whatever) -
- - When an idea/behavior just needs a minimum of one friends to spread, - it's called a "simple contagion". - However, some ideas are harder to grasp, some behaviors need more encouragement, - and so these need multiple friends to spread — - these are called "complex contagions". -

- A false rumor may be a simple contagion, - but the complicated truth is - a complex contagion. - (head shows #infected_friends/#friends) -

- On the right, a complex contagion that needs 25% OR MORE friends to spread. - Play around to get a feel for it → - -
- - - Puzzle! Same as before, but now you have to spread a complex idea. - - (a person needs AT LEAST 25% of their friends to adopt the idea, before they do too) - Try "infecting" everyone now! - → - - (again, feel free to hit "start sim" and just try a solution, as many times as you want) - - - So, is that the way to spread more complex ideas/behaviors? - Just add more connections? -

- Well, no. While more connections can never hurt a simple contagion, - they can hurt complex contagions! -

- - Puzzle! Same as before, but now, try to add to the network so it - prevents the spread of a complex contagion! - -
- - (something something about groupthink, how too many connections squashes - complex contagions due to conformity pressure. example: NASA and Challenger explosion) - - - (something something about how if you have too FEW connections, - people are isolated and ideas can't spread - but if you have too MANY connections, - people are pressured by conformity and ideas can't grow.) -

- Top-left: too few connections, complex contagion doesn't spread to everyone. - Top-right: too many connections, complex contagion can't spread to everyone. -

- - Make a small group network that's the sweet spot inbetween, and spreads the complex contagion - - to everyone → - -
- - Within-group friendships are called "bonding social capital". - And you discovered, there's a sweet spot where people are connected enough - to spread a complex idea, but not so much conformity squashes it. - But how do ideas spread between groups? - Between-group friendships are called "bridging social capital", - and, likewise, there's a sweet spot. -

- - Create a group in the top-left (remember your sweet spot?) - and then create a bridge to spread the complex contagion to the other - group → - -
- - FINAL PUZZLE! Now, do both! Create a bunch of bonded communities and - the bridges between them. → - - - (something someting Small World Network, - something something "unity AND diversity", "e pluribus unum", - etc etc) -

- (happy ending or whatever) -
- - - - -
- - - - \ No newline at end of file diff --git a/puzzle/puzzle.js b/puzzle/puzzle.js deleted file mode 100644 index c26f556..0000000 --- a/puzzle/puzzle.js +++ /dev/null @@ -1,29 +0,0 @@ -var currentSlide = 0; - -function loadSlide(index){ - - var slide = $("slides").children[index]; - if(!slide) return; - - if(slide.getAttribute("level")){ - var iframe = $("#content_puzzle"); - iframe.src = "game/game.html?level="+slide.getAttribute("level"); - //iframe.width = slide.getAttribute("width"); - //iframe.height = slide.getAttribute("height"); - } - - var words = $("#content_words"); - words.innerHTML = slide.innerHTML; - -} - -function $(query){ - return document.querySelector(query); -} - -function nextLevel(){ - currentSlide++; - loadSlide(currentSlide); -} - -loadSlide(currentSlide); \ No newline at end of file diff --git a/slides/sprites/button_large.png b/sprites/button_large.png similarity index 100% rename from slides/sprites/button_large.png rename to sprites/button_large.png diff --git a/slides/sprites/line.png b/sprites/line.png similarity index 100% rename from slides/sprites/line.png rename to sprites/line.png diff --git a/slides/sprites/peeps.png b/sprites/peeps.png similarity index 100% rename from slides/sprites/peeps.png rename to sprites/peeps.png diff --git a/slides/sprites/pencil.png b/sprites/pencil.png similarity index 100% rename from slides/sprites/pencil.png rename to sprites/pencil.png diff --git a/slides/sprites/scratch.png b/sprites/scratch.png similarity index 100% rename from slides/sprites/scratch.png rename to sprites/scratch.png diff --git a/slides/sprites/tutorial_connect.png b/sprites/tutorial_connect.png similarity index 100% rename from slides/sprites/tutorial_connect.png rename to sprites/tutorial_connect.png diff --git a/slides/sprites/tutorial_disconnect.png b/sprites/tutorial_disconnect.png similarity index 100% rename from slides/sprites/tutorial_disconnect.png rename to sprites/tutorial_disconnect.png