Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URL's added here will be added as <link>s in order, and before the CSS in the editor. If you link to another Pen, it will include the CSS from that Pen. If the preprocessor matches, it will attempt to combine them before processing.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                <div align="center" id="container"></div>
              
            
!

CSS

              
                body
  background-image: radial-gradient(#000, #111)
  
.gameInfo
  background-color: #121212
  padding: 10px
  margin: 10px 0
  border: 1px solid #222
  border-radius: 5px
  width: 930px

  >div
    display: inline-block
    background-color: #222
    padding: 0 5px
    margin-right: 5px

    span
      font-family: 'Trirong'
      color: #fff
      font-weight: 400

      &:first-child
        font-weight: 700
        margin-right: 5px

.gameMessage
  color: #fff
  padding: 15px
  background-color: #222
  width: 150px
  border: 1px solid #000
  margin-left: -750px
  margin-top: -505px
  position: relative
  font-family: 'Trirong'
  color: #fff

.gameWall
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEmSURBVGiB7Zg7roQwDEVvPhB+6dgQ+98KFSBQBPF71fQOEnhG8qmvI58i0pXNNE1/YNK2LXLOSClxR4oIIcA5h+M42DN+WRZ2uK5rpJSwruud/ViEEFCyk31sk5dQAWlUQBoVkEYFpPHDMLDDzjmEEB5b5lMlSnbyfd8j58wKExGstWyJqqpAROz3rbUgIjRNw8o75+D3fX+s24zj+Gh3ijH+/h9QAWlUQBoVkEYFpPFd1xX1m+u62NXgje7k930vGmjbFud5svJEBGMMW8I5B2st+30A8Hd6yjzPxTMcYowIIRS9//N/QAWkUQFpVEAaFZDGxxjZ4c/dpmSmhFt3oWEYQESssDEGRPRdd6Ft2/QuJIkKSKMC0qiANCogjX/ybvPGXegfzntpqRw8atYAAAAASUVORK5CYII=')

.gameEnter
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHfSURBVGiB7ZhNbsIwEIXf2GMSliCxgB1H4AYgzsZpuAVH4AhIHIAFikJwpgtUCZPYVWmb2FG/5YyQ3sM/bxzabrdSFAWeISLs93vM53PEgLUWm80G1lqnnuc5uK5rlGXpNJRSEJEuNX5JVVWoqsqpMTNUT3p+jX8DfaOUStcDEQ1gBeq67lvD24hI+ivAvsblcsF4PO5Si5fXAHvGa0BEEMv2CulgpRRGo5FTJKLoDBhjQEROXWv9MGCMcRpEhOl0itls1qVOL9ZaMHO7gfv9juv16jRinIWKomjMQsAQkrhvAT8lfQPJz0KpG2DfXX86nfD61OyLYJCFfhRTkPkIjhKxZEFIh9fAcrnEYrH4E0HfJTjMEVHrKBEbzM3/Win1OMSvgmM0QEQNXSICFhHcbjenEePV2vZdyBgzgCTuW8BPSd4A+/b78XjE+XzuWE47viAjogEksa+ZQhKLiH8FVqtVEkmc/CFO3gBrrZHnuVNsi+2+ybIMWmunxsyPM5DCLAS062RrbePlFeN3obIsG7OQUmoAZ8DXOBwOmEwmXWrx8taTEgg/5bok+KR8PdmfpDBKBGeh9XodVRLvdrtGnYigYtkm75L8LfRvoG+YiJBlmVOMcRYyxjS+lmit8QFhKNDN/iysQAAAAABJRU5ErkJggg==')

.gameExit
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI8SURBVGiB7Zk9jvIwEIbfGdtJCkQDFNtzBC6AuCwSh6Cm4gjcgAYhFP9uQbMhtvlACzif9ilnhDSvzfx4QqvVKlwuF/yEiLDZbPD19YUScM5huVzCOdexN00D6b1H27YdBzMjhPDOGO9ijIExpmOTUoI/FM+v8Sfg0zDzcDUQEWTKaYyB1vqd8SS5rT4/kd77qGMIAkII6RvQWhcvAEBawHa7xXg8fklAj5L6lwAZAc45WGtfEtCj5JqqZGZUVdUxElFxApRSIKKOXQhxFaCU6jiICIvFApPJ5J1xJvHeY71exwVYa3E+nzsOZkbbtsUksfcel8ulNwsBmRwoqYw+lcR/An6RrIDULDQEAUSUFlBSJ84KSDn3+z2apnllXP9MtpGlHKU1shRJAdZaCCFeEtCjPCVgPp9jNBq9JKBHCSFgt9tFfZKIoqNESVUohAAp+2fNzNckvp0xiAha656wTxFCABH14gwhQIYQeifNzMXdQGwvpJQaRid+KomNMcOuQlprlLJyufsii3E4HIoRkCK7F7LWFi8AyOyFrLW9slUa2b3QbDaLNo9PcTqdovZsEuceEqWQLaODECCE6M39RARrbXal927quu71JSnl9QZis1BshfFpYnFK5xxuP/Ixc3EltG3b3qEycz6Jh0BSwPF4LCoHptNp1D6IN3EOmZo4jTHFCEhNBNlZqKqq4hL5FiK6vshiaK2LvwHgTicupRc8LaCUUvp/CyAi1HXd+4G1tigBSqleURFC4BslUV/gZ2gTTAAAAABJRU5ErkJggg==')

.gamePlayer
  background-image: url('data:image/png;base64,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')

.gameLifeKit
  background-image: url('data:image/png;base64,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')

.gameEnemy
  background-image: url('data:image/png;base64,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')

.gameBoss
  background-image: url('data:image/png;base64,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')

.gameDarkCell
  background-image: none
  background-color: #000

.gameToggleDark
  width: 960px
  background-color: #000
  color: #fff
  font-family: 'Trirong'
  border: 1px solid #222
  font-weight: 700
  letter-spacing: 5px
  font-size: 20px

.gameRoom
  background-color: #fff

.gameCorridor
  @extend .gameRoom

.gameNull
  background-color: #f00

.gameChooseWeaponBtn
  button
    background-image: none
    border: 2px solid #111
    font-family: 'Trirong'
    font-size: 14px
    font-weight: 700

  button:first-child
    float: left
    background-color: #0a0

  button:last-child
    float: right
    background-color: #a00

.gameWeaponInfo
  >div
    width: 32px
    height: 32px
    background-size: 32px

  >span
    text-transform: capitalize
    font-family: 'Trirong'

  >span:last-child
    display: block

.gameWeapon
  display: inline-block
  color: #fff
  text-transform: capitalize

  div
    width: 32px
    height: 32px
    background-size: 32px
    margin-right: 3px
    float: left
    margin-top: -2px
    padding: 0

.gameArea
  @extend .gameWall
  width: 960px
  height: 480px
  overflow: hidden
  background-size: 48px 48px

.gameAreaRow
  display: block
  white-space: nowrap

.gameAreaCell
  display: inline-block
  width: 48px
  height: 48px
  background-size: 100%
  margin: -2px 0

.gameTitle
  color: white
  font-family: 'Trirong'
  text-align: center
  margin: -15px auto
  
  h2
    margin-bottom: -30px

.gameOver
  width: 960px
  height: 480px
  background-color: rgba(0,0,0,0.9)
  position: absolute

  span
    color: #fff
    font-family: 'Trirong'
    font-size: 90px
    position: relative
    top: 28%

.axeWeapon
  background-image: url('data:image/png;base64,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')

.swordWeapon
  background-image: url('data:image/png;base64,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')

.hammerWeapon
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAHNgAABzYBcbJLagAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA+NSURBVGiB7Vl7sF5Vdf+ttfc+5/u++91HbhLyIAlJSEIh4WUoJCpPURB1plpifQy2WpVaxQdqrXWmuana6WOoSqejIq0448g0qFWstk4pjSVCrYIIBgwECHncJPfmvr77feexz95r9Y97bx7cENDi9I+yZs4fZ58z6/x+67X3Wgd4UV6U/99CL6QyVRDu2MS460nG4uKo7sGa4sqVgk13CBH0JCqcc+69InIgxvh1APG5vvm/JqBbNxnc81OLFQUPt3rN/CzQGFU8B8B4XagvZ0WdFZlRzE8Fg6OC3t6IzZsC0YAco2rOkv6ue6+7YOGCMqh+42eHJp8e6VwGYPevhYC+e71D1yF72HXZeY3SoKwZIDAoMhIl+PpR3UmuHU/apUaQpnEcHelDVwA6AVgeaGDbkrMW9/zwfS9b2tdw1ACAIkpx07Y9k48fap8OYPIFI6BbNxncd1+ChV22lVvH7cI2k8QgVAYkDBIukTCiHNVtWFN4gbLkyqLWxYZWAVoPZ976+DldXfVvX79hcT0xlABAFRW7R3N40fD57YO3tcvyXS8IAR1YmwwDyfyCHWqZA6wtJr0j50xqg/FRDCAMSQhGqYpKzpAikiJ4RcKigSOMjamGcPHtQxfZtPb3112woMsQMQBkleDJkQxVnEqVHYeyzl2/GG4+Gyb7vIADhJtXJaOjZTq/tA4sCXJ1pYuODCyp2E6lNiFlAFyFkkmVEgAhABpJnSOBqkA1QiVetfXgyxrN5k1vOnd+FxMRAEyWAU+N5ojTmUEEtIpQnAzbcxJQgDCwPB3bL2k/cwKWpCBKagpHFRypOqC0HIwNRg1BWUQZBCJMlxFRjSVEE4oWGt/wzQOXumb35mvXzW/QdAyM5xV2jxXQ6RrlDMm/Pz4++tO94xefDN9zhpDevCrFKFKUSBGRloqUqEoq4oQ0OBJ2RGJDFEuqxgIcwEwKAoMgUCUoIAJA3vrd1uUhaX7w2nPmNWY+PpZVeHqshE5XWFFUd/xs+O6DE9nrAeQnw3dSD+jA2gR5SFDGKfAJUoo+pcBJAiQxUgINLqo6JraAGq8whMiqoGOquCpIrvve+Cvr3X1vv/qM/vrMg8OdCnsnpqKECNgz5v2Pdo9suXpF42tvXLRYrvmXXSc18LN6QLduMnh6Zw2jvgaWWumlRtanpJQGTylRTKLEhJgdgjiBOqgaUjWAciTwUWWQN30/e+0pfX2/dfmqvtrM8nCnwv7xAgrAGpZtT4y1FtnwB33d9tDgWOkPZpTXXbbz/kFkv7wHHvmxmyi6E8eUMFHCVCUUOAkRadSQOpJEhFKL6DwksaJWSG1UWJAyBAQBCYDXf6fzpnNWLtiw/tTmEfCHJksMtvy0FTnc+dDwY28+0/5Jq+RwqFPVuqxyTx10sOXWANXDeJZd2ZzQ+gOXWWR5GmKZGoSUIClFSolDqqqpIUmjUgqVFFFSQNIomiqQimgKIIFo0olau/rbxQ1Xrlu8dt2CRm3KGcCBVomDkx4AYSwP4f6nh77+wQtqn5/MxeaBDBmoCKmPoqKGbOp0Mg+tX8IDuy242zYBW0p0BLjAZcKRkyghIaVEVFKBpKKSUtSEoE5UHVStCsyjo6H7Pffo9b974dLm3C6bAoAqsGe8wGhWwTD0wf3t4pL51adecV7j4MFO7AFR5Yz4VBETZ6SpFHKJpozS9WyBws9cUAUDXRaUW1BlQdFWEpyDsUGjI2UXSRISSSRKStBUSVOF1mLQuorWv7u7XPGhH/GNf/jypb0z4EUVT4zkGM0qWEOybdfYoU+uDx87s5/ak4U0STlxDJuSMYlhlzg1TadmXmLlK1ctPaB64nyd7YEtay3y3GQmtYaiJYgllDZWcI7VRlVHok5EElJNlDQhkTSIpgpJPvezat1/T3S95vqXLrAzu2sZBE+NFsirCCjknl8M77zztemXfjgYeic9xaionIHGqDExiKVqrBPM4p60/bFX9zzV1QXglvUWuL96bgITEwa9vYay0kDFQNUQjIEJJipboWhFxCnUCdSpaqKiKUTSd91dXdUzd+55bz6/z82o6/iIJ0dyRFF0KomtseHt//y62l3b91enFBUkCrxl0ggEE9mQUdMg0NUrew69/LTasBhjUKQGB0YMgFkEjgshVRBMPwMVEwmDlIMVA1EDURNFLEQtkVoQrEIdRXUjeex69ffC29aevvjcK1YdBT+WB+w6nCGKYvdYHldi6Ls3bXA/3r7fLyyi1kThLMEwYFTUEsF0W8g7z+7dt2GJy1NSBiKDKgbmzgr3E3mAwCUDka/95oELBif1vD+/rO/uy05NQhQ1BuCgaggwNFXz7U+GwryP/kjf+Y6LltV66zYBpirNoUmPA60ShgkPDbaqD6xuf2ddvz38k6E4v4ioRAEmiKgaIhjDREu7qLh6VX0wsSQKZQ9hAjEQGChYFfTMhuh4Vlsu44cnc3vqzcOfXXzpW25720c/9f4bH+jeet9+3wswx6gMKEOUBTBf+nm15hMPmPe+52VLGzPgowBPjeQ40CphmfS+XSOdvz63/a+ndXF8eFT7fZQECgOIUVVmAicMrF9gxq85vXbYihJB2RkleOFaVEKqhCwQMDArkY9beOuq/p4fFPV7bvzQjaetXrOmFwAmxkazT27+0/GvX+7ft7wHJCE2FNL4/X/rvNYnfa96w7q5CdGUnjIInhzNUVQCJugju4dGv7DRPzBUkhzKIV64DOBSiYsAlFDOiSi7ZFmytzc1LbImY5jcMGXGIFNKc3Emq4nPRhOT9591fofeeMdxG9qxHqj/IKvdu2XLluUz4AGgd05/4xObB/quvdvcdLgjyURQe8U3suuXLV5w5W+fPTedAd8qIh4bzlBUgrISmRgafPqWjfnOPW00DmWaeoUBQMwATZfEuqN45TI33JNSAI6un0j6AeCR4VnPj+SAtfZDH/v4x1c2Gl31Z740Z+68xgc+/EenXP0XfzagPu9+x4YlvQu7k2MOZB77xj1Aiv0TpVxYP/yT3zlPxx8dN00v0EqgRJAIqCoUBDklpeL8hfawsxRZoMqACpQcHY1x9oqiDiQA6kaxYv6sgcARAsy8LkmSeqvVQowRvb29x724dPmKrne/6+3L6ju+xw1HUzsrgL1jBUayCoYIPx1sVzecPvn9c+awf2hM+qKqF4EoU1DlAFBkIC7pRnvNHDdKhMgKESa1IBEmhUQFjAI0ddlSkRg9PALMy++YReBICMUYt05OTnoA6HQ6aLfbs9x4yrz59bqdAl9FxeNDHYxkFSyTbn9idOKvzsu/uqqXxx8dJ+cFPiqVICpV2auiMkTVmf12bPUcO6GEqKAYAWFCVIZAIdZA1JLAkcCQ1pQFJem8+alg8+yRzLEEvnX77bcfnrlvtVrodDrHvdx32pmolq2HD4qdwx10KgEBsm3n0J6vXaG3dgLiEy2YMsJHcKHgPIBLBZWGuXzJAju0sEltAlfMVDEjMFNQogiiaIhiFUgscYSyKFhQZwGswIyecKZ0XBl98MEHb2hNTJQz9xMTE8jz4xuiBRtfj3jabyIK4EXjj58avn/rq5IvPzYek6ECVEYKATRdaaYqTmIou2iRO9CdUqZEnoi8gioFVaoUoBQYHNRwsIYDYoxqOMJwzDIjSIsIWxOcQI47TqvqowcODP7eRRdd1D+zVpYlkiSBtVPpQszoOe0sdC9ZJXdsf7TatGD8WxORXVGBoygBJAoSEEUiCnMSyi5cZIedoZJgPBOXSuSJyVui0louidmTsjekXg1XkdizildVL0Z829iqni/xW7btnkVi1va8c+eON+/bt88fQwpjY2OI8fh+Yt6yNfyRj3yYbt3b85ailBBAPoLLAPYKLoVQLO2m0ZcssgcNm4zZ5GSoUKaSmEo2VCqzD6BKiSu1XAWlYEkqVQ6qJtTEhi5NQz96AzZve34NjQgGf/HIw0svvviSc40xPEOiLEvU63UQHS3FtXrDrl69xvzdP/3n/A2n0I6p5p2EiMLZ89zIij7bMswVEVVE5InZA+SZqCRiz0ylJVMy2BvSMjG2hGHPUK+q3napRyUejjxdPnxCAic8IP3j+85972c/8zf3AzjishACxsbGoHp8Hq1cfUbtVW982+lfftSvF6GCyeQvPdXtW95nRo3hjMAZiHNiyomosMw5WS5UqWQyJZi9sno1xnuWSoOtlG2l7CqUtQqxGbB5x6xT6EkJXD6wLVxaH7nmK7fddvhYi5dlicnJ2WPKK155VS2be8YlHlRG1Xwol6hKOYEyYsqt4YyZc2LOlbhg4oKdKQAuFVoaMqWKeivWq1OfqnqxsUIaKjRjdbKJ9gkJAMCtP2+N6dM/v/TOO++cZOYjCtrtNrLs+CGBiKgvixiEysmIascYJ0M5BWLOyZpMwbko56yckzG5qilYtGDWgo0pBFpasqUyylTFZyatuqTpMVFUGHh265+UABH03nev35U+ds95n/vsZ/aKyJEYnJiYgPf+CPhbvvB5v9Tv+4cqUhGFipaX6j/2hGbmubRkMmtN5pzJ2NmMjcnZIDfW5sq2UNJSp8GriM8k9Y2ESwTy2LjRE076P+HEU4kZ2bJttzxyw6rOojBx2ye+dvdZa874jRXN7m4DTIWTszb87c2f89Vj99788iXJDoXGSiEaERUa2XBxapM7IKoAVIbgmcgTjIcVbw17js6zQ6mkXlDzDUMlLHscTj398V3hZPiA5zmd1oG1CbKQnv/Vva9YePbFX7nmNa+pE4G+9MVb8rmTT3zy/EXJnjopKxmTsDIpyFnI61Y3Dq6aYwoIqSoJQKIUo3NTZRIag7KtUlWPet0DmLoW1Uq6fnb/+ysTAAD94no3fKBIv/9Qu/svtw9eacCN686e88ATo9k8sKaWDTtSwwxqWKMXLk4OX77cTTqeGq9XBqrK4iJHuBg0cEyNVDBJBRcrFI0KgTxaztMtzw/8L0UAmB549exyOJQkk8G67m5vx8Y4+fR/DS8byajHOeUakV6zqjF0xZKkgwRTNjWkChYoCcCSJjHklYmiIXTZ2lS1mSgqbNzon9mwvKAEgOnGf8tah7ZxMG0LTmyHSvvDvdJ4eqhsbFiZ5Gf3m1hEpRqAAkDNkBaBVJWlbl1E4iNKFyE+IDYDmrHCwI7quRL2BSFwLJFd71+VrJrba1BvG+SlmSxrpjsVarcjN5tAxwt1JaztNtBsGgGcAB1BlkY0mhEoAjbvOGmd/7UROJYItlxmMLLPwBYM089oxukmfFoaVtE2ijgqCDXB3CURA9vir2LxX7uogqYvVh1gHQDPrP1fY3tRXpQTyP8AowDL8ea2EVEAAAAASUVORK5CYII=')

.bowWeapon
  background-image: url('data:image/png;base64,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')

.cestusWeapon
  background-image: url('data:image/png;base64,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')

.bludgeonWeapon
  background-image: url('data:image/png;base64,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')

              
            
!

JS

              
                'use strict';

const rand = (min, max) => (
  Math.floor ((Math.random () * (max - (min - 1)) + min))
);

/*
 * ___  __  ___  _____     ___  _____ _____  ___
 * || \/ | ||=|| ||_//    ||=|| ||_// ||==  ||=||
 * ||    | || || ||       || || || \\ ||___ || ||
*/
class Map {
  constructor (maxRooms, roomSizeMin, roomSizeMax) {
    this.rooms = [];
    this.gridMap = null;
    this.gridInfo = null;

    /* Init all Rooms requested */
    for ( let j = 0; j < maxRooms; j++ ) {
      this.rooms.push ({
        id: j,
        width: rand (roomSizeMin, roomSizeMax),
        height: rand (roomSizeMin, roomSizeMax),
        maxLinks: rand (1, 4),
        linkedTo: [],
        corridorBuild: false,
        fakeCoord: null,
        gridCoord: null
      });
    }

    /* Link Rooms */
    this.doLinks ();

    /* Generate Map */
    this.doGridMap ();

    /* Find the Start and the End Room */
    let startRoom = { dist: null, roomId: null }
    let endRoom = { dist: null, roomId: null }
    for ( let j = 0; j < this.rooms.length; j++ ) {
      let currRoom = this.rooms[j];

      let currRoomCenter = {
        x: currRoom.gridCoord.startX + Math.floor (currRoom.width / 2),
        y: currRoom.gridCoord.startY + Math.floor (currRoom.height / 2)
      };

      let currRoomDist = Math.sqrt (
        Math.pow (currRoomCenter.x, 2) + Math.pow (currRoomCenter.y, 2)
      );

      if ( startRoom.dist === null || currRoomDist < startRoom.dist ) {
        startRoom.dist = currRoomDist;
        startRoom.roomId = j;
      }

      if ( endRoom.dist === null || currRoomDist > endRoom.dist ) {
        endRoom.dist = currRoomDist;
        endRoom.roomId = j;
      }
    }

    this.startRoom = this.rooms[startRoom.roomId];
    this.endRoom = this.rooms[endRoom.roomId];
  }

  doLinks () {
    /* For each Room find the rooms can be linked to it,
     * for each link set the link between it and the current Room */
    for ( let j = 0; j < this.rooms.length; j++ ) {
      let currRoom = this.rooms[j];
      let remainLinks = currRoom.maxLinks - currRoom.linkedTo.length;
      let currRoomLinks = Math.min (remainLinks, currRoom.maxLinks);

      for ( let k = 0; k < currRoomLinks; k++ ) {
        let foundIdx = this.findLinkeableRoom (currRoom);

        if ( foundIdx === false )
             break;

        this.rooms[j].linkedTo.push (foundIdx);
        this.rooms[foundIdx].linkedTo.push (currRoom.id);
      }
    }

    /* Remove all rooms that cannot be linked */
    for ( let j = this.rooms.length - 1; j > -1; j-- )
      if ( this.rooms[j].linkedTo.length < 1 )
        this.rooms.splice (j, 1);
  }

  findLinkeableRoom (currRoom) {
    let firstRoomLinkeable = false;

    /* Try to find a random Room that can be linked at the same
     * time save the first Room linkeable if the random search fail. */
    for ( let j = 0; j < this.rooms.length; j++ ) {
      let randRoom = rand (0, this.rooms.length - 1);

      if ( this.rooms[j].linkedTo.length < this.rooms[j].maxLinks
        && currRoom.linkedTo.indexOf (this.rooms[j].id) == -1
        && this.rooms[j].id != currRoom.id && firstRoomLinkeable === false )
        firstRoomLinkeable = this.rooms[j].id;

      if ( this.rooms[randRoom].linkedTo.length < this.rooms[randRoom].maxLinks
        && currRoom.linkedTo.indexOf (this.rooms[randRoom].id) == -1
        && this.rooms[randRoom].id != currRoom.id )
        return this.rooms[randRoom].id;
    }

    return firstRoomLinkeable;
  }

  findRoomIdx (roomIndex) {
    for ( let j = 0; j < this.rooms.length; j++ )
      if ( this.rooms[j].id == roomIndex )
        return j;

    return false;
  }

  doGridMap () {
    let maxLinkFound = { links: 0, roomIdx: -1 };

    /* Find the Room that have more links than others, to have better chance
     * to take more Rooms as possible */
    for ( let j = 0; j < this.rooms.length; j++ )
      if ( this.rooms[j].linkedTo.length > maxLinkFound.links )
        maxLinkFound = {
          links: this.rooms[j].linkedTo.length,
          roomIdx: j
        };

    this.rooms[maxLinkFound.roomIdx].fakeCoord = { startX: 0, startY: 0 };
    this.generateFakeCoord (this.rooms[maxLinkFound.roomIdx]);

    /* Remove all Room that cannot be placed on the grid because
     * are lonely islands respect to the inital Room
     */
    for ( let j = this.rooms.length - 1; j > -1; j-- )
      if ( this.rooms[j].fakeCoord === null )
        this.rooms.splice (j, 1);

    /* Generate real coordinate */
    let translateCoord = { x: 0, y: 0 };
    for ( let j = 0; j < this.rooms.length; j++ ) {
      if ( this.rooms[j].fakeCoord.startX < translateCoord.x )
        translateCoord.x = this.rooms[j].fakeCoord.startX;

      if ( this.rooms[j].fakeCoord.startY < translateCoord.y )
        translateCoord.y = this.rooms[j].fakeCoord.startY;
    }

    this.gridInfo = { width: 0, height: 0 };
    for ( let j = 0; j < this.rooms.length; j++ ) {
      this.rooms[j].gridCoord = {
        startX: this.rooms[j].fakeCoord.startX + Math.abs (translateCoord.x) + 1,
        startY: this.rooms[j].fakeCoord.startY + Math.abs (translateCoord.y) + 1,
        endX: 0,
        endY: 0
      };

      let endCoord = {
        endX: this.rooms[j].gridCoord.startX + this.rooms[j].width,
        endY: this.rooms[j].gridCoord.startY + this.rooms[j].height
      };

      this.rooms[j].gridCoord.endX = endCoord.endX;
      this.rooms[j].gridCoord.endY = endCoord.endY;

      if ( endCoord.endX > this.gridInfo.width )
        this.gridInfo.width = endCoord.endX;

      if ( endCoord.endY > this.gridInfo.height )
        this.gridInfo.height = endCoord.endY;
    }

    /* Generate grid */
    this.gridMap = Array (this.gridInfo.height + 1).fill().map(
      () => Array (this.gridInfo.width + 1).fill ('W')
    );

    /* Put first the cooridors to make them go in the bottom layer */
    this.doCorridors (this.rooms[0]);

    for ( let j = 0; j < this.rooms.length; j++ ) {
      let Room = this.rooms[j];
      for ( let y = Room.gridCoord.startY; y < Room.gridCoord.endY; y++ )
        for ( let x = Room.gridCoord.startX; x < Room.gridCoord.endX; x++ )
          this.gridMap[y][x] = 'R';
    }
  }

  generateFakeCoord (currRoom) {
    /* Flag to check if all links of the current Room are already placed */
    let checkComplete = true;

    for ( let j = 0; j < currRoom.linkedTo.length; j++ ) {
      let currLinkedRoom = this.rooms[this.findRoomIdx (currRoom.linkedTo[j])];

      if ( currLinkedRoom.fakeCoord !== null )
        continue;
      else checkComplete = false;

      let roomDistance = {
        width: currLinkedRoom.width + rand (1, currRoom.height),
        height: currLinkedRoom.height + rand (1, currRoom.width)
      }

      /* Respectively: 0 Nord, 1 East, 3 West, 2 Sud */
      switch (j) {
        case 0:
          this.rooms[this.findRoomIdx (currRoom.linkedTo[j])].fakeCoord = {
            startX: rand (0, Math.abs (currRoom.width - currLinkedRoom.width)),
            startY: currRoom.fakeCoord.startY - roomDistance.height
          };
          break;
        case 1:
          this.rooms[this.findRoomIdx (currRoom.linkedTo[j])].fakeCoord = {
            startX: currRoom.fakeCoord.startX + roomDistance.width,
            startY: rand (0, Math.abs (currRoom.height - currLinkedRoom.height))
          };
          break;
        case 2:
          this.rooms[this.findRoomIdx (currRoom.linkedTo[j])].fakeCoord = {
            startX: currRoom.fakeCoord.startX - roomDistance.width,
            startY: rand (0, Math.abs (currRoom.height - currLinkedRoom.height))
          };
          break;
        case 3:
          this.rooms[this.findRoomIdx (currRoom.linkedTo[j])].fakeCoord = {
            startX: rand (0, Math.abs (currRoom.width - currLinkedRoom.width)),
            startY: currRoom.fakeCoord.startY + roomDistance.height
          };
          break;
      }
    }

    if ( checkComplete === true )
      return;

    /* Recursively do the same thing for each link of the current Room */
    for ( let j = 0; j < currRoom.linkedTo.length; j++ )
      this.generateFakeCoord (
        this.rooms[this.findRoomIdx (currRoom.linkedTo[j])]
      );
  }

  doCorridors (currRoom) {
    if ( currRoom.corridorBuild === true )
      return;

    let currRoomCenter = {
      x: currRoom.gridCoord.startX + Math.floor (currRoom.width / 2),
      y: currRoom.gridCoord.startY + Math.floor (currRoom.height / 2)
    };

    for ( let j = 0; j < currRoom.linkedTo.length; j++ ) {
      let currLinkRoom = this.rooms[this.findRoomIdx (currRoom.linkedTo[j])];

      let currLinkRoomCenter = {
        x: currLinkRoom.gridCoord.startX + Math.floor (currLinkRoom.width / 2),
        y: currLinkRoom.gridCoord.startY + Math.floor (currLinkRoom.height / 2)
      };

      let corridorPath = {
        startX: Math.min (currRoomCenter.x, currLinkRoomCenter.x),
        startY: Math.min (currRoomCenter.y, currLinkRoomCenter.y),
        endX: Math.max (currRoomCenter.x, currLinkRoomCenter.x),
        endY: Math.max (currRoomCenter.y, currLinkRoomCenter.y) + 1
      };

      for ( let x = corridorPath.startX; x < corridorPath.endX; x++ )
        this.gridMap[currRoomCenter.y][x] = 'C';

      for ( let y = corridorPath.startY; y < corridorPath.endY; y++ )
        this.gridMap[y][currRoomCenter.x] = 'C';
    }

    this.rooms[this.findRoomIdx (currRoom.id)].corridorBuild = true;
    for ( let j = 0; j < currRoom.linkedTo.length; j++ ) {
      let currLinkRoom = this.rooms[this.findRoomIdx (currRoom.linkedTo[j])];
      this.doCorridors (currLinkRoom);
    }
  }
}

class MapInitializer {
  constructor (Map, level, levelMax) {
    this.map = Map;
    this.level = level;
    this.enterPoint = null;
    this.exitPoint = null;
    this.playerCoord = null;
    this.enemies = null;
    this.lifeKit = null;
    this.weapons = null;
    this.boss = null;
    this.usedCoord = [];

    if ( level > 1 )
      this.placeEnterPoint ();

    if ( level < levelMax )
         this.placeExitPoint ();
    else this.placeBoss ();

    this.placeEnemies ();
    this.placeLifeKit ();
    this.placeWeapons ();
  }

  placeEnterPoint () {
    this.enterPoint = {
      x: rand (this.map.startRoom.gridCoord.startX,
               this.map.startRoom.gridCoord.endX - 1),
      y: rand (this.map.startRoom.gridCoord.startY,
               this.map.startRoom.gridCoord.endY - 2)
    };
  }

  placeExitPoint () {
    this.exitPoint = {
      x: rand (this.map.endRoom.gridCoord.startX,
               this.map.endRoom.gridCoord.endX - 1),
      y: rand (this.map.endRoom.gridCoord.startY,
               this.map.endRoom.gridCoord.endY - 1)
    };
  }

  findFreeRandomCoord () {
    for ( let j = 0; j < this.map.rooms.length; j++ ) {
      let currRoom = this.map.rooms[rand(0, this.map.rooms.length - 1)];
      let randomTry = currRoom.width + currRoom.height;

      for ( let k = 0; k < randomTry; k++ ) {
        let currentCoord = {
          x: rand (currRoom.gridCoord.startX, currRoom.gridCoord.endX - 1),
          y: rand (currRoom.gridCoord.startY, currRoom.gridCoord.endY - 1)
        };

        if ( this.map.gridMap[currentCoord.y][currentCoord.x] != 'R' )
          continue;

        let chkCoord = 0;
        for ( ; chkCoord < this.usedCoord.length; chkCoord++ ) {
          if ( this.usedCoord[chkCoord].x == currentCoord.x
            && this.usedCoord[chkCoord].y == currentCoord.y ) {
            chkCoord = -1;
            break;
          }
        }

        if ( chkCoord != -1 ) {
          this.usedCoord.push (currentCoord);
          return currentCoord;
        }
      }
    }

    return false;
  }

  placeEnemies () {
    let enemyId = 0;

    this.enemies = Array (
      rand (Math.floor (this.map.rooms.length / 2), this.map.rooms.length)
    ).fill ().map (
      () => ({
        life: 20 + rand (30, 45) * this.level,
        damage: 5 + rand (1, 5) * this.level,
        id: enemyId++,
        coord: this.findFreeRandomCoord ()
      })
    );
  }

  placeLifeKit () {
    let lifeKitId = 0;

    this.lifeKit = Array (rand (5, 9)).fill ().map (
      () => ({
        life: 20 + rand (10, 20) * this.level,
        id: lifeKitId++,
        coord: this.findFreeRandomCoord ()
      })
    );
  }

  randomWeaponsName () {
    let switchVCS = [
      [ 'a', 'e', 'i', 'o' ],
      [
        'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's',
        't', 'v', 'w', 'x', 'y', 'z'
      ],
      [
      	'bl', 'br', 'ch', 'cl', 'cr', 'dr', 'fl', 'fr', 'gh', 'gl', 'gn', 'gr',
        'gw', 'pl', 'pn', 'pr', 'ps', 'qu', 'sb', 'sc', 'sf', 'sm', 'sp', 'st',
        'tl', 'tr', 'wr'
      ],
      [
        'bb', 'bh', 'bs', 'bt', 'cc', 'ct', 'dd', 'dl', 'ff', 'fg', 'gg', 'lb',
        'lc', 'ld', 'lf', 'lg', 'lm', 'ln', 'lp', 'ls', 'lt', 'lv', 'lw', 'lz',
        'mb', 'ml', 'mm', 'mn', 'mp', 'nc', 'nd', 'nf', 'ng', 'nj', 'nn', 'nt',
        'nv', 'nx', 'nz', 'pp', 'pt', 'rb', 'rc', 'rd', 'rf', 'rg', 'rj', 'rl',
        'rm', 'rn', 'rp', 'rr', 'rs', 'rt', 'rv', 'rw', 'rz', 'ss', 'tm', 'tt',
        'vl', 'vr', 'vv', 'wl', 'xx', 'zl', 'zm', 'zr', 'zz'
      ],
      [ 'cqu', 'lqu', 'nqu', 'rqu', 'squ' ]
    ];

    let namePart = rand (4, 6);
    let baseName = '';
    let referS = null;
    let j = rand (0, 1);

    if ( j % 2 ) {
    	referS = switchVCS[rand (1, 2)];
      baseName += referS[rand (0, referS.length - 1)];
    }
    else baseName += switchVCS[0][rand (0, switchVCS[0].length - 1)];

    for ( j++; j < namePart; j++ ) {
      if ( j % 2 ) {
        if ( j == (namePart - 1) )
          referS = switchVCS[1];
        else referS = switchVCS[rand (1, 4)]

        baseName += referS[rand (0, referS.length - 1)];
      }
      else baseName += switchVCS[0][rand (0, switchVCS[0].length - 1)];
    }

    return baseName;
  }

  placeWeapons () {
    let weaponTypes = [
      { type: 'sword',    multipl: 1.4 },
      { type: 'bludgeon', multipl: 1.3 },
      { type: 'bow',      multipl: 1.1 },
      { type: 'cestus',   multipl: 1.0 },
      { type: 'axe',      multipl: 1.5 },
      { type: 'hammer',   multipl: 1.2 }
    ];

    let weapons = rand (3, 6);
    this.weapons = [];

    for ( let j = 0; j < weapons; j++ ) {
      let currWeapon = weaponTypes[rand(0, weaponTypes.length - 1)];

      this.weapons.push ({
        id: j,
        name: this.randomWeaponsName () + ' ' + currWeapon.type,
        type: currWeapon.type,
        damage: Math.round (5 + rand (3, 8) * this.level * currWeapon.multipl),
        coord: this.findFreeRandomCoord ()
      });
    }
  }

  placeBoss () {
    this.boss = {
      life: rand (90, 140) * this.level,
      damage: rand (30, 45) * this.level,
      coord: {
        x: rand (this.map.endRoom.gridCoord.startX,
                 this.map.endRoom.gridCoord.endX),
        y: rand (this.map.endRoom.gridCoord.startY,
                 this.map.endRoom.gridCoord.endY - 1)
      }
    };
  }

  updateBossLife (bossLife) {
    this.boss.life = bossLife;
  }

  updateEnemyLife (enemyInfo) {
    for ( let j = 0; j < this.enemies.length; j++ ) {
      if ( this.enemies[j].id == enemyInfo.id ) {
        this.enemies[j].life = enemyInfo.life;
        break;
      }
    }
  }

  removeElement (elem) {
    switch (elem.id) {
      case 'L': this.lifeKit.splice (elem.idx, 1); break;
      case 'E': this.enemies.splice (elem.idx, 1); break;
      case 'w': this.weapons.splice (elem.idx, 1); break;
    }
  }

  getElementAt (coordX, coordY) {
    if ( coordX < 0 || coordY < 0 || coordY >= this.map.gridMap.length
      || coordX >= this.map.gridMap[0].length )
      return { id: 'X' };

    if ( this.enterPoint !== null )
      if ( this.enterPoint.x == coordX && this.enterPoint.y == coordY )
          return { id: 'I', elem: this.enterPoint };

    if ( this.exitPoint !== null )
      if ( this.exitPoint.x == coordX && this.exitPoint.y == coordY )
          return { id: 'O', elem: this.exitPoint };

    /* Check LifeKit */
    for ( let j = 0; j < this.lifeKit.length; j++ ) {
      if ( this.lifeKit[j].coord.x == coordX
        && this.lifeKit[j].coord.y == coordY )
          return { id: 'L', elem: this.lifeKit[j], idx: j };
    }

    /* Check Enemies */
    for ( let j = 0; j < this.enemies.length; j++ ) {
      if ( this.enemies[j].coord.x == coordX
        && this.enemies[j].coord.y == coordY )
        return { id: 'E', elem: this.enemies[j], idx: j };
    }

    /* Check Weapons */
    for ( let j = 0; j < this.weapons.length; j++ ) {
      if ( this.weapons[j].coord.x == coordX
        && this.weapons[j].coord.y == coordY )
        return { id: 'w', elem: this.weapons[j], idx: j };
    }

    if ( this.boss !== null )
      if ( this.boss.coord.x == coordX && this.boss.coord.y == coordY )
          return { id: 'B', elem: this.boss };

    return { id: this.map.gridMap[coordY][coordX] };
  }
}

/*
 * __ __  __ __ _____     ___  _____ _____  ___
 * || ||\\|| ||  ||      ||=|| ||_// ||==  ||=||
 * || || \|| ||  ||      || || || \\ ||___ || ||
*/
const initGame = () => {
  let maxLevel = rand (5, 10);

  let initialState = {
    gameMaps: [],
    currLevel: 0,
    playerInfo: {
      life: 100,
      damage: 10,
      exp: 0,
      level: 1,
      weapon: null,
      coord: null
    },
    message: null,
    gameOver: false,
    gameWin: false
  };

  for ( let j = 0; j < maxLevel; j++ )
    initialState.gameMaps.push (
      new MapInitializer (new Map (rand (20, 30), 4, 7), j + 1, maxLevel)
    );

  do {
    initialState.playerInfo.coord = {
      x: rand (initialState.gameMaps[0].map.startRoom.gridCoord.startX,
               initialState.gameMaps[0].map.startRoom.gridCoord.endX - 1),
      y: rand (initialState.gameMaps[0].map.startRoom.gridCoord.startY,
               initialState.gameMaps[0].map.startRoom.gridCoord.endY - 1)
    };
  } while ( initialState.gameMaps[0].getElementAt (
    initialState.playerInfo.coord.x, initialState.playerInfo.coord.y
  ).id != 'R' );

  return initialState;
}

/*
 * _____ _____ _____ __ __ _  _     ___  _____ _____  ___
 * ||_// ||==  ||  ) || || \\//    ||=|| ||_// ||==  ||=||
 * || \\ ||___ ||_// \\_// //\\    || || || \\ ||___ || ||
*/
const gameReducer = (state, action) => {
  if ( state === undefined ) {
    return initGame ();
  }

  let newState = state;
  let currentMapSettings = state.gameMaps[state.currLevel];
  let playerInfo = Object.assign ({}, state.playerInfo);
  let playerDamage = playerInfo.damage + rand (3, 6) * playerInfo.level;

  switch (action.type) {
    case 'MOVE':
      let targetElem = currentMapSettings.getElementAt (
        state.playerInfo.coord.x + action.relCoord.x,
        state.playerInfo.coord.y + action.relCoord.y
      );
      switch (targetElem.id) {
        case 'I':
          let prevMapSettings = state.gameMaps[state.currLevel - 1];
          let prevPlayerCoord = null;

          do {
            prevPlayerCoord = {
              x: rand (prevMapSettings.map.endRoom.gridCoord.startX,
                       prevMapSettings.map.endRoom.gridCoord.endX - 1),
              y: rand (prevMapSettings.map.endRoom.gridCoord.startY,
                       prevMapSettings.map.endRoom.gridCoord.endY - 1)
            };
          } while (  prevMapSettings.getElementAt (
            prevPlayerCoord.x, prevPlayerCoord.y
          ).id != 'R' );

          newState = Object.assign ({}, state, {
            currLevel: state.currLevel - 1,
            playerInfo: Object.assign ({}, state.playerInfo, {
              coord: prevPlayerCoord
            })
          });
          break;
        case 'O':
          let nextMapSettings = state.gameMaps[state.currLevel + 1];
          let nextPlayerCoord = null;

          do {
            nextPlayerCoord = {
              x: rand (nextMapSettings.map.startRoom.gridCoord.startX,
                       nextMapSettings.map.startRoom.gridCoord.endX - 1),
              y: rand (nextMapSettings.map.startRoom.gridCoord.startY,
                       nextMapSettings.map.startRoom.gridCoord.endY - 1)
            };
          } while (  nextMapSettings.getElementAt (
            nextPlayerCoord.x, nextPlayerCoord.y
          ).id != 'R' );

          newState = Object.assign ({}, state, {
            currLevel: state.currLevel + 1,
            playerInfo: Object.assign ({}, state.playerInfo, {
              coord: nextPlayerCoord
            })
          });
          break;
        case 'L':
          currentMapSettings.removeElement (targetElem);
          newState = Object.assign ({}, state, {
            playerInfo: Object.assign ({}, state.playerInfo, {
              coord: {
                x: state.playerInfo.coord.x + action.relCoord.x,
                y: state.playerInfo.coord.y + action.relCoord.y
              },
              life: state.playerInfo.life + targetElem.elem.life
            }),
            message: {
              type: 'INFO',
              desc: '+' + targetElem.elem.life + ' Life Points!',
              timeout: 2500
            }
          });
          break;
        case 'E':
          let enemyInfo = Object.assign ({}, targetElem.elem);

          enemyInfo.life -= playerDamage;
          playerInfo.life -= enemyInfo.damage;

          if ( playerInfo.life <= 0 ) {
            playerInfo.life = 0;
            newState = Object.assign ({}, state, {
              playerInfo: playerInfo,
              gameOver: true
            });
            break;
          }

          let messageDesc = 'Fight!';
          if ( enemyInfo.life <= 0 ) {
            currentMapSettings.removeElement (currentMapSettings.getElementAt (
                enemyInfo.coord.x, enemyInfo.coord.y
            ));

            playerInfo.exp += enemyInfo.damage;
            if ( Math.sqrt (playerInfo.exp) > 3 * playerInfo.level ) {
              playerInfo.level++;
              messageDesc = 'Level UP!';
            }
            messageDesc += ' Enemy Defeated!';
          }
          else currentMapSettings.updateEnemyLife (enemyInfo);

          newState = Object.assign ({}, state, {
            playerInfo: playerInfo,
            message: {
              type: 'INFO',
              desc: messageDesc,
              timeout: 2500
            }
          });

          break;
        case 'w':
          newState = Object.assign ({}, state, {
            message: {
              type: 'CHOOSE_WEAPON',
              action: 'CHANGE_WEAPON',
              elem: targetElem.elem
            }
          });
          break;
        case 'B':
          let bossInfo = Object.assign ({}, targetElem.elem);

          bossInfo.life -= playerDamage;
          playerInfo.life -= bossInfo.damage;
console.log (bossInfo);
          if ( playerInfo.life <= 0 ) {
            playerInfo.life = 0;
            newState = Object.assign ({}, state, {
              playerInfo: playerInfo,
              gameOver: true
            });
            break;
          }

          if ( bossInfo.life <= 0 ) {
            newState = Object.assign ({}, state, {
              gameWin: true
            });
            break;
          }

          currentMapSettings.updateBossLife (bossInfo.life);
          newState = Object.assign ({}, state, {
            playerInfo: playerInfo,
            message: {
              type: 'INFO',
              desc: 'Boss Fight!',
              timeout: 2500
            }
          });
          break;
        case 'W':
          newState = Object.assign ({}, state, {
            message: {
              type: 'INFO',
              desc: 'Bump!',
              timeout: 1000
            }
          });
          break;
        case 'R':
        case 'C':
          newState = Object.assign ({}, state, {
            playerInfo: Object.assign ({}, state.playerInfo, {
              coord: {
                x: state.playerInfo.coord.x + action.relCoord.x,
                y: state.playerInfo.coord.y + action.relCoord.y
              }
            }),
            message: null
          });
          break;
      }
      break;
    case 'CHANGE_WEAPON':
      let newWeapon = action.elem;
      let oldDmg = 0;
      if ( state.playerInfo.weapon !== null )
        oldDmg = state.playerInfo.weapon.damage;

      currentMapSettings.removeElement (
        currentMapSettings.getElementAt (newWeapon.coord.x, newWeapon.coord.y)
      );
      newState = Object.assign ({}, state, {
        playerInfo: Object.assign ({}, state.playerInfo, {
          coord: {
            x: newWeapon.coord.x,
            y: newWeapon.coord.y
          },
          damage: state.playerInfo.damage + newWeapon.damage - oldDmg,
          weapon: newWeapon
        }),
        message: {
          type: 'INFO',
          desc: 'New Weapon!',
          timeout: 2500
        }
      });
      break;
  }

  return newState;
}

let ReduxStore = Redux.createStore (gameReducer, initGame ());

/*
 * _____ _____  ___   ____ _____     ___  _____ _____  ___
 * ||_// ||==  ||=|| ((     ||      ||=|| ||_// ||==  ||=||
 * || \\ ||___ || ||  \\__  ||      || || || \\ ||___ || ||
*/
const ReactGameMessage = React.createClass ({
  getInitialState () {
    return { message: null, timeout: null }
  },
  componentDidMount () {
    switch (this.props.message.type) {
      case 'INFO':
        this.setState ({
          message: this.props.message,
          timeout: setTimeout (function () {
            this.setState ({ message: null });
          }.bind (this), this.props.message.timeout)
        });
        break;
      case 'CHOOSE_WEAPON':
        this.setState ({ message: this.props.message });
        break;
    }
  },
  render () {
    if ( this.state.message === null )
      return <div></div>;

    switch (this.state.message.type) {
      case 'INFO':
        return <div className="gameMessage">{this.state.message.desc}</div>;
      case 'CHOOSE_WEAPON':
        return (
          <div className="gameMessage">
            <span>Would you like a new Weapon?</span>
            <div className="gameChooseWeaponBtn">
              <button onClick={this.dispatchChangeWeapon}>Yes</button>
              <button onClick={this.closeInfo}>No</button>
            </div>
            <div className="gameWeaponInfo">
              <div className={this.state.message.elem.type + 'Weapon'}></div>
              <span>{this.state.message.elem.name}</span>
              <span><b>Damage:</b> +{this.state.message.elem.damage}</span>
            </div>
          </div>
        );
    }
  },
  componentWillUnmount () {
    if ( this.state.timeout )
      clearTimeout (this.state.timeout);
  },
  dispatchChangeWeapon () {
    this.props.store.dispatch ({
      type: 'CHANGE_WEAPON',
      elem: this.state.message.elem
    });
  },
  closeInfo () {
    this.setState ({ message: null });
  }
});

const ReactGameArea = React.createClass ({
  getInitialState () {
    return { inputLock: false, darkCell: true };
  },
  componentDidMount () {
    this.centerView ();
    document.onkeydown = this.handleKeyPressed;
  },
  render () {
    let state = this.props.store.getState ();
    let currentMapSettings = state.gameMaps[state.currLevel];

    let mapInfo = {
      height: currentMapSettings.map.gridMap.length,
      width: currentMapSettings.map.gridMap[0].length
    };

    let finalMap = [];
    for ( let coordY = 0; coordY < mapInfo.height; coordY++ ) {
      let mapRow = [];

      for ( let coordX = 0; coordX < mapInfo.width; coordX++ ) {
        let cellType = this.findCellType ({
          x: coordX,
          y: coordY,
          mapSettings: currentMapSettings,
          playerInfo: state.playerInfo
        }) + " gameAreaCell";

        mapRow.push (<div key={coordX} className={cellType}></div>);
      }

      finalMap.push (<div key={coordY} className="gameAreaRow">{mapRow}</div>);
    }

    let gameOver = <div></div>;
    if ( state.gameOver === true ) {
      document.onkeydown = null;
      gameOver = <div className="gameOver"><span>Game Over</span></div>;
    }

    let gameWin = <div></div>;
    if ( state.gameWin === true ) {
      document.onkeydown = null;
      gameWin = <div className="gameOver"><span>You Win!</span></div>;
    }

    let weaponData
    if ( state.playerInfo.weapon ) {
      weaponData = (
        <div className="gameWeapon">
          <div className={state.playerInfo.weapon.type + 'Weapon'}></div>
          <span>
            {state.playerInfo.weapon.name}
            <b>( +{state.playerInfo.weapon.damage} )</b>
          </span>
        </div>
      );
    }
    else weaponData = 'none';

    let gameMessage = "";
    if ( state.message )
      gameMessage = <ReactGameMessage store={this.props.store}
                      key={Math.random ()} message={state.message} />;

    return (
      <div>
        <div className="gameTitle">
          <h2>React Roguelike</h2>
          <h4>Kill the Boss in map {state.gameMaps.length - 1}</h4>
        </div>
        <div className="gameInfo">
          <div>
            <span>Life:</span>
            <span>{state.playerInfo.life}</span>
          </div>
          <div>
            <span>Damage:</span>
            <span>
              {state.playerInfo.damage} 
               {' +'} [{state.playerInfo.level * 3}, {state.playerInfo.level * 6}]
            </span>
          </div>
          <div>
            <span>Weapon:</span>
            <span>{weaponData}</span>
          </div>
          <div>
            <span>EXP:</span>
            <span>{state.playerInfo.exp}</span>
          </div>
          <div>
            <span>Level:</span>
            <span>{state.playerInfo.level}</span>
          </div>
          <div>
            <span>Map:</span>
            <span>{state.currLevel}</span>
          </div>
        </div>
        <div className="gameArea">
          {gameWin}
          {gameOver}
          {finalMap}
        </div>
        <button className="gameToggleDark" onClick={this.toggleDark}>
          Toggle Darkness
        </button>
        {gameMessage}
      </div>
    );
  },
  toggleDark () {
    this.setState ({ darkCell: !this.state.darkCell });
  },
  findCellType (requestObject) {
    let pointDist = Math.sqrt (
      Math.pow (requestObject.x - requestObject.playerInfo.coord.x, 2) +
      Math.pow (requestObject.y - requestObject.playerInfo.coord.y, 2)
    );

    let foundElement = requestObject.mapSettings.getElementAt (
      requestObject.x, requestObject.y
    );

    if ( pointDist > 2 + (0.5 * requestObject.playerInfo.level)
      && this.state.darkCell === true )
        return "gameDarkCell";

    /* Check Player */
    if ( requestObject.playerInfo.coord.x == requestObject.x
      && requestObject.playerInfo.coord.y == requestObject.y )
      return "gameRoom gamePlayer";

    switch (foundElement.id) {
      case 'I': return "gameRoom gameEnter";
      case 'O': return "gameRoom gameExit";
      case 'L': return "gameRoom gameLifeKit";
      case 'E': return "gameRoom gameEnemy";
      case 'w': return "gameRoom " + foundElement.elem.type + "Weapon";
      case 'B': return "gameRoom gameBoss";
      case 'W': return "gameWall";
      case 'R': return "gameRoom";
      case 'C': return "gameCorridor";
    }

    return this.state.darkCell ? "gameDarkCell" : "gameWall";
  },
  centerView () {
    let playerInfo = this.props.store.getState ().playerInfo;

    var container = document.getElementsByClassName ('gameArea')[0];
    var player = document.getElementsByClassName ('gamePlayer')[0];

    container.scrollTop = player.offsetTop - 384;
    container.scrollLeft = player.offsetLeft - 480;
  },
  handleKeyPressed () {
    if ( this.state.inputLock === true )
         return;

    this.setState ({ inputLock: true });
    setTimeout (function () {
        this.setState ({ inputLock: false });
    }.bind (this), 100);

    let storeDispatch = this.props.store.dispatch;

    switch (window.event.keyCode) {
      case 38:
      case 87:
        storeDispatch ({
          type: 'MOVE',
          relCoord: { x: 0, y: -1 }
        });
        break;
      case 40:
      case 83:
        storeDispatch ({
          type: 'MOVE',
          relCoord: { x: 0, y: +1 }
        });
        break;
      case 37:
      case 65:
        storeDispatch ({
          type: 'MOVE',
          relCoord: { x: -1, y: 0 }
        });
        break;
      case 39:
      case 68:
        storeDispatch ({
          type: 'MOVE',
          relCoord: { x: +1, y: 0 }
        });
        break;
      default:
        console.log (window.event.keyCode);
        break;
    }

    this.centerView ();
  }
});

ReduxStore.subscribe (() => {
  ReactDOM.render (<ReactGameArea store={ReduxStore} />,
    document.getElementById ('container'));
});

ReduxStore.dispatch ({ type: 'INIT' });

              
            
!
999px

Console