[
  {
    "path": "README.md",
    "content": "# 2048.vim\n> 2048 in vim\n\n[![](https://spacevim.org/img/build-with-SpaceVim.svg)](https://spacevim.org)\n\n## Install\n\nthis plugin is based of SpaceVim's API, you need to install SpaceVim.\n\n1. load the game layer:\n\n```viml\ncall SpaceVim#layers#load('games')   \n```\n\n2. and run the game by pressing `<Space> g 2`.\n\n## screenshot\n\n![2017-05-04-00 29 59](https://cloud.githubusercontent.com/assets/13142418/25671079/66354112-3061-11e7-9e16-676bf891ee1a.png)\n"
  },
  {
    "path": "autoload/vim2048/logic.vim",
    "content": "let s:score = 0\n\nfunction! vim2048#logic#up() abort\n    let data = s:merge_up(s:split_list(vim2048#ui#get_data()))\n    call vim2048#ui#update(data, s:score)\n    let s:score = 0\nendfunction\nfunction! vim2048#logic#down() abort\n    let data = s:merge_down(s:split_list(vim2048#ui#get_data()))\n    call vim2048#ui#update(data, s:score)\n    let s:score = 0\nendfunction\nfunction! vim2048#logic#right() abort\n    let data = s:merge_right(s:split_list(vim2048#ui#get_data()))\n    call vim2048#ui#update(data, s:score)\n    let s:score = 0\nendfunction\nfunction! vim2048#logic#left() abort\n    let data = s:merge_left(s:split_list(vim2048#ui#get_data()))\n    call vim2048#ui#update(data, s:score)\n    let s:score = 0\nendfunction\n\n\nfunction! s:split_list(data) abort\n    return [\n                \\ [\n                \\ a:data[0], a:data[1], a:data[2], a:data[3]\n                \\ ],\n                \\ [\n                \\ a:data[4], a:data[5], a:data[6], a:data[7]\n                \\ ],\n                \\ [\n                \\ a:data[8], a:data[9], a:data[10], a:data[11]\n                \\ ],\n                \\ [\n                \\ a:data[12], a:data[13], a:data[14], a:data[15]\n                \\ ]\n                \\ ]\nendfunction\n\n\" a list with 4 items\nfunction! s:merge(l) abort\n    let l = filter(a:l, '!empty(v:val)')\n    if len(l) == 0\n        return ['','','','']\n    elseif len(l) == 1\n        return [l[0],'','','']\n    elseif len(l) == 2\n        if l[0] == l[1]\n            let s:score += l[0] * 2\n            return [l[0] * 2, '','','']\n        else\n            return [l[0], l[1],'','']\n        endif\n    elseif len(l) == 3\n        if l[0] == l[1]\n            let s:score += l[0] * 2\n            return [l[0] * 2, l[2],'','']\n        elseif l[1] == l[2]\n            let s:score += l[1] * 2\n            return [l[0], l[1] * 2,'','']\n        else\n            return [l[0], l[1], l[2],'']\n        endif\n    else\n        if l[0] == l[1]\n            if l[2] == l[3]\n            let s:score += l[0] * 2 + l[2] * 2\n                return [l[0] * 2, l[2] * 2,'','']\n            else\n            let s:score += l[0] * 2\n                return [l[0] * 2, l[2], l[3],'']\n            endif\n        elseif l[1] == l[2]\n            let s:score += l[1] * 2\n            return [l[0], l[1] * 2, l[3],'']\n        else\n            if l[2] == l[3]\n            let s:score += l[2] * 2\n                return [l[0], l[1], l[2] * 2,'']\n            else\n                return [l[0], l[1], l[2], l[3]]\n            endif\n        endif\n    endif\nendfunction\n\nfunction! s:merge_up(data) abort\n    let l0 = s:merge([a:data[0][0], a:data[1][0], a:data[2][0], a:data[3][0]])\n    let l1 = s:merge([a:data[0][1], a:data[1][1], a:data[2][1], a:data[3][1]])\n    let l2 = s:merge([a:data[0][2], a:data[1][2], a:data[2][2], a:data[3][2]])\n    let l3 = s:merge([a:data[0][3], a:data[1][3], a:data[2][3], a:data[3][3]])\n    return [\n                \\ l0[0],l1[0],l2[0],l3[0],\n                \\ l0[1],l1[1],l2[1],l3[1],\n                \\ l0[2],l1[2],l2[2],l3[2],\n                \\ l0[3],l1[3],l2[2],l3[3],\n                \\ ]\nendfunction\n\nfunction! s:merge_down(data) abort\n    let l0 = s:merge([a:data[3][0], a:data[2][0], a:data[1][0], a:data[0][0]])\n    let l1 = s:merge([a:data[3][1], a:data[2][1], a:data[1][1], a:data[0][1]])\n    let l2 = s:merge([a:data[3][2], a:data[2][2], a:data[1][2], a:data[0][2]])\n    let l3 = s:merge([a:data[3][3], a:data[2][3], a:data[1][3], a:data[0][3]])\n    return [\n                \\ l0[3],l1[3],l2[3],l3[3],\n                \\ l0[2],l1[2],l2[2],l3[2],\n                \\ l0[1],l1[1],l2[1],l3[1],\n                \\ l0[0],l1[0],l2[0],l3[0],\n                \\ ]\nendfunction\n\nfunction! s:merge_right(data) abort\n    let l0 = s:merge([a:data[0][3], a:data[0][2], a:data[0][1], a:data[0][0]])\n    let l1 = s:merge([a:data[1][3], a:data[1][2], a:data[1][1], a:data[1][0]])\n    let l2 = s:merge([a:data[2][3], a:data[2][2], a:data[2][1], a:data[2][0]])\n    let l3 = s:merge([a:data[3][3], a:data[3][2], a:data[3][1], a:data[3][0]])\n    return [\n                \\ l0[3],l0[2],l0[1],l0[0],\n                \\ l1[3],l1[2],l1[1],l1[0],\n                \\ l2[3],l2[2],l2[1],l2[0],\n                \\ l2[3],l3[2],l3[1],l3[0],\n                \\ ]\nendfunction\n\nfunction! s:merge_left(data) abort\n    let l0 = s:merge(a:data[0])\n    let l1 = s:merge(a:data[1])\n    let l2 = s:merge(a:data[2])\n    let l3 = s:merge(a:data[3])\n    return l0 + l1 + l2 + l3\nendfunction\n"
  },
  {
    "path": "autoload/vim2048/ui.vim",
    "content": "let s:drawer = SpaceVim#api#import('unicode#box')\nlet s:number = SpaceVim#api#import('data#number')\n\nlet s:score = ['score', 0, 'max score', 0]\n\nfunction! vim2048#ui#redraw(...) abort\n    if a:0 == 1\n        call s:init()\n    else\n        call vim2048#ui#random_add_two() \n    endif\n    let score = s:drawer.drawing_box(s:score, 1, 4, 10)\n    let box = s:drawer.drawing_box(s:data,4,4,6)\n    setl modifiable\n    call setline(1, score)\n    call setline(5, box)\n    setl nomodifiable\n\nendfunction\n\nfunction! s:init() abort\n    let s:data = map(range(16), '\"\"')\n    let s:score[1] = 0\n    let n = s:number.random(0, 16)\n    let s:data[n] = 2\n    let m = s:number.random(0, 16)\n    while m == n\n        let m = s:number.random(0, 16)\n    endwhile\n    let s:data[m] = 2\nendfunction\n\nfunction! vim2048#ui#update(data, score) abort\n    let s:data = a:data\n    let s:score[1] += a:score\n    let s:score[3] = max([s:score[1], s:score[3]])\n    call vim2048#ui#redraw()\nendfunction\n\nfunction! vim2048#ui#get_data() abort\n    return s:data\nendfunction\n\nfunction! vim2048#ui#random_add_two() abort\n    let indexs = []\n    let idx = 0\n    for a in s:data\n        if empty(a)\n            call add(indexs, idx)\n        endif\n        let idx += 1\n    endfor\n    if len(indexs) > 0\n        let s:data[s:number.random(0, len(indexs))] = 2\n    endif\nendfunction\n"
  },
  {
    "path": "ftplugin/SPVim2048.vim",
    "content": "if exists('g:_SPVim2048_ftplugin')\n  finish\nelse\n  let g:_SPVim2048_ftplugin = 1\nendif\nfunction! SPVim2048#statusline(...)\n    if &ft ==# 'SPVim2048'\n        call airline#extensions#apply_left_override('Vim2048', '')\n        \" Alternatively, set the various w:airline_section variables\n        \"let w:airline_section_a = 'SpaceVimPluginManager'\n        \"let w:airline_section_b = ''\n        \"let w:airline_section_c = ''\n        \"let w:airline_render_left = 1\n        \"let w:airline_render_right = 0\n    endif\nendfunction\ntry\n    call airline#add_statusline_func('SPVim2048#statusline')\ncatch\nendtry\n"
  },
  {
    "path": "plugin/vim2048.vim",
    "content": "function! vim2048#start() abort\n    tabnew\n    call setline(1,['','','','',''])  \n    setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline nomodifiable nospell nocursorline\n    set filetype=SPVim2048\n    call vim2048#ui#redraw(1)\n    call s:defmappings()\nendfunction\n\n\nfunction! s:defmappings() abort\n    nnoremap <silent> <buffer> h :call vim2048#logic#left()<cr>\n    nnoremap <silent> <buffer> j :call vim2048#logic#down()<cr>\n    nnoremap <silent> <buffer> k :call vim2048#logic#up()<cr>\n    nnoremap <silent> <buffer> l :call vim2048#logic#right()<cr>\n    nnoremap <silent> <buffer> <Left> :call vim2048#logic#left()<cr>\n    nnoremap <silent> <buffer> <Down> :call vim2048#logic#down()<cr>\n    nnoremap <silent> <buffer> <Up> :call vim2048#logic#up()<cr>\n    nnoremap <silent> <buffer> <Right> :call vim2048#logic#right()<cr>\nendfunction\n"
  },
  {
    "path": "syntax/SPVim2048.vim",
    "content": "syntax clear\nhi ColNumberSplit   gui=bold guifg=Grey ctermfg=DarkGreen\nhi ColNumber2\t\tgui=bold guibg=DarkGreen ctermfg=DarkGreen\nhi ColNumber4\t\tgui=bold guibg=DarkBlue ctermfg=DarkBlue\nhi ColNumber8\t\tgui=bold guibg=DarkCyan ctermfg=DarkCyan\nhi ColNumber16\t\tgui=bold guibg=DarkRed ctermfg=DarkRed\nhi ColNumber32\t    gui=bold guibg=DarkMagenta ctermfg=DarkMagenta\nhi ColNumber64\t\tgui=bold guibg=Red ctermfg=Red\nhi ColNumber128\t\tgui=bold guibg=Blue ctermfg=Blue\nhi ColNumber256\t\tgui=bold guibg=Magenta ctermfg=Magenta\nhi ColNumber512\t\tgui=bold guibg=White ctermfg=White\nhi ColNumber1024\tgui=bold guibg=Green ctermfg=Green\nhi ColNumber2048    gui=bold guibg=Yellow ctermfg=Yellow guifg=Black\n\" │ 2 │ 4 │ 8 │ 16 │ 32 │ 64 │ 256 │ 512 │ 1024 │ 2048 │\nsyn match NumberSplit '│'\nsyn match NumberSplit '╭'\nsyn match NumberSplit '─'\nsyn match NumberSplit '╰'\nsyn match NumberSplit '┬'\nsyn match NumberSplit '┴'\nsyn match NumberSplit '╮'\nsyn match NumberSplit '╯'\nsyn match NumberSplit '┼'\nsyn match NumberSplit '├'\nsyn match NumberSplit '┤'\n\nhi link NumberSplit ColNumberSplit\n\nsyn match Number2 '\\s\\+2\\s\\+'\nhi link Number2 ColNumber2\n\nsyn match Number4 '\\s\\+4\\s\\+'\nhi link Number4 ColNumber4\n\nsyn match Number8 '\\s\\+8\\s\\+'\nhi link Number8 ColNumber8\n\nsyn match Number16 '\\s\\+16\\s\\+'\nhi link Number16 ColNumber16\n\nsyn match Number32 '\\s\\+32\\s\\+'\nhi link Number32 ColNumber32\n\nsyn match Number64 '\\s\\+64\\s\\+'\nhi link Number64 ColNumber64\n\nsyn match Number128 '\\s\\+128\\s\\+'\nhi link Number128 ColNumber128\n\nsyn match Number256 '\\s\\+256\\s\\+'\nhi link Number256 ColNumber256\n\nsyn match Number512 '\\s\\+512\\s\\+'\nhi link Number512 ColNumber512\n\nsyn match Number1024 '\\s\\+1024\\s\\+'\nhi link Number1024 ColNumber1024\n\nsyn match Number2048 '\\s\\+2048\\s\\+'\nhi link Number2048 ColNumber2048\n"
  }
]