diff --git a/ProfontLicense.txt b/ProfontLicense.txt new file mode 100644 index 0000000..dcc3f12 --- /dev/null +++ b/ProfontLicense.txt @@ -0,0 +1,22 @@ +ProFont +MIT License + +Copyright (c) 2014 Carl Osterwald, Stephen C. Gilardi, Andrew Welch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/ZillaSlab-Regular.ttf b/ZillaSlab-Regular.ttf new file mode 100644 index 0000000..65c5152 Binary files /dev/null and b/ZillaSlab-Regular.ttf differ diff --git a/ZillaSlabLicense.txt b/ZillaSlabLicense.txt new file mode 100644 index 0000000..af9d668 --- /dev/null +++ b/ZillaSlabLicense.txt @@ -0,0 +1,93 @@ +Copyright 2017, The Mozilla Foundation + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/game.js b/game.js index b20d484..4570206 100644 --- a/game.js +++ b/game.js @@ -96,9 +96,14 @@ const STARTUP = 8; const INFO = 9; const ONE_TEST = -1; +const BLANK_TEST = -2; const NORMAL_TEST = 0; const EVEN_LENGTH_TEST = 1; //Only generate even length tapes. +const NONE = 0; +const BINARY = 1; +const STRING = 2; + var ISTESTING = false; var MOUSEOVERTIME = -1 @@ -262,8 +267,10 @@ var CREDITS=">CREDITS\n\n" +"\n" +">Music is from an excerpt from the Shostakovich - Symphony No.9 Performance\n" +"\n" -+"All graphics were designed by myself\n" ++"All graphics were designed by myself.\n" +">(@sigonasr2) Joshua Sigona - Creator of The Great Conversion\n" ++"\n" ++"Font licenses are included in attached License files." var MENU = { @@ -288,6 +295,7 @@ function goHome() { GRID_X=20 GRID_Y=20 ITEM_SELECTED=undefined + endARound() for (var button of MENU.buttons) { if (button.submenu_buttons) { button.lastselected=button.default @@ -445,7 +453,7 @@ var STAGE1 = { accept:(tape)=>true} var STAGE2 = { name:"Blue Blue", - objective:"Accept only Blue Bots", + objective:"Accept only bots that have all B markers.", level:createGrid(5,5,4,2), start:{x:0,y:2}, accept:(tape)=>{ @@ -462,7 +470,7 @@ var STAGE2 = { } var STAGE3 = { name:"Balance", - objective:"Accept bots with the same number of red and blue.", + objective:"Accept bots with an equal number of R and B markers in total.", level:createGrid(15,15,14,14), start:{x:0,y:0}, accept:(tape)=>{ @@ -491,11 +499,11 @@ var TUTORIAL1 = { accept:(tape)=>{ return true; }, - generator:ONE_TEST + //display:BINARY } var TUTORIAL2 = { name:"Branches", - objective:"We have to make sure we are sending robots that meet our needs! Use the branch to filter out robots that start with a red signal. Send only those to the exit!", + objective:"We have to make sure we are sending robots that meet our needs! Use the branch to filter out robots that start with a R signal. Send only those to the exit!", level:createGrid(5,5,4,2), start:{x:0,y:2}, locked:[WRITER_BUILD_BUTTON], @@ -506,11 +514,13 @@ var TUTORIAL2 = { } else { return false; } - } + }, + //generator:BLANK_TEST, + //display:STRING } var TUTORIAL3 = { name:"Writers", - objective:"CONVERSION! It's time to convert robots to what they should be. Add 3 blue signals to every bot that comes through. We shall convert them all!", + objective:"CONVERSION! It's time to convert robots to what they should be. Add 3 B signals to every bot that comes through. We shall convert them all!", level:createGrid(5,5,4,2), start:{x:0,y:2}, tutorial:true, @@ -520,7 +530,7 @@ var TUTORIAL3 = { } var TUTORIAL4 = { name:"More Colors", - objective:"You may be required to use different colors, either for your purposes or mine. For this robot cycle, convert all blue and red signals to yellow signals.", + objective:"You may be required to use different colors, either for your purposes or mine. For this robot cycle, convert all B and R signals to Y signals.", level:createGrid(5,5,4,2), start:{x:0,y:2}, accept:(tape)=>{ @@ -558,7 +568,7 @@ var HARDMENU={ } var gameGrid = [] -var completedStages = {"Blue Blue":{data:[],complete:false}} //Example completed structure. +var completedStages = undefined //Example completed structure. function setCookie(cname, cvalue, exdays) { var d = new Date(); @@ -676,6 +686,9 @@ function generateBotQueue() { case ONE_TEST:{ tests = ["RRR"] }break; + case BLANK_TEST:{ + tests = [""] + }break; default:{ for (var i=0;i0) { var mask = remainingVal&1 if (mask===1) { - tape="B"+tape + tape=BLUE+tape } else { - tape="R"+tape + tape=RED+tape } remainingVal=remainingVal>>>1 } @@ -1673,49 +1686,138 @@ function RenderGameInfo(ctx) { } } +var DARKCOLORS = [PURPLE,GRAY,BLACK] + +function drawTape(color,ctx,x,y,ySpacing,first=false,last=false,firstInRow=false) { + ctx.font="bold 12px 'Profont','Courier New', serif" + + if (first) { + ctx.fillStyle="rgb(222, 210, 158)" + ctx.fillRect(x-8,y-8,16,16) + } + + if (DARKCOLORS.includes(color)) { + ctx.fillStyle="rgb(210,210,210)" + } else { + ctx.fillStyle="black" + } + ctx.textAlign = "center" + switch (color) { + case RED:{ + drawImage(x,y,ID_DOT_R,ctx,0) + }break; + case BLUE:{ + drawImage(x,y,ID_DOT_B,ctx,0) + }break; + case GREEN:{ + drawImage(x,y,ID_DOT_G,ctx,0) + }break; + case YELLOW:{ + drawImage(x,y,ID_DOT_Y,ctx,0) + }break; + case PURPLE:{ + drawImage(x,y,ID_DOT_P,ctx,0) + }break; + case PINK:{ + drawImage(x,y,ID_DOT_PI,ctx,0) + }break; + case BLACK:{ + drawImage(x,y,ID_DOT_BL,ctx,0) + }break; + case GRAY:{ + drawImage(x,y,ID_DOT_GR,ctx,0) + }break; + } + + if (last) { + ctx.strokeStyle="white" + ctx.lineWidth=1 + ctx.beginPath() + ctx.moveTo(x-16,y) + ctx.lineTo(x-8,y) + ctx.moveTo(x-12,y-4) + ctx.lineTo(x-8,y) + ctx.moveTo(x-12,y+4) + ctx.lineTo(x-8,y) + ctx.stroke() + } + + if (firstInRow) { + ctx.strokeStyle="white" + ctx.lineWidth=1 + ctx.beginPath() + ctx.moveTo(x,y) + ctx.lineTo(x,y-6) + ctx.lineTo(x-112,y-6) + ctx.lineTo(x-112,y-ySpacing) + ctx.stroke() + } + + ctx.fillText(color,x,y+4) +} + function RenderTape(x,y,width,ctx,tape) { - var xOffset=0 + var xOffset=width-24 var yOffset=0 var ySpacingMult=1 var ySpacing=12 if (tape.length>5*5) { ySpacingMult=(ySpacing*5)/(Math.ceil(tape.length/5)*ySpacing) } - for (var i=0;iwidth-24) { - xOffset=0; + } + xOffset=width-24 + yOffset=0 + for (var i=0;i=0;i--) { + if (tape[i]===RED) { + numb=numb<<1; + numb=numb|0 + } else + if (tape[i]===BLUE) { + numb=numb<<1; + numb=numb|1 + } + } + return numb + } + + if (gameStage.display!==undefined) { + switch (gameStage.display) { + case BINARY:{ + ctx.fillStyle="white" + ctx.fillText(interpretBinary(tape),x+xOffset+16,y+yOffset+16+4) + }break; + case STRING:{ + ctx.fillStyle="white" + var splitString=tape.split(YELLOW) + var finalString="\"" + for (var i=0;i