├── README.md ├── autoload └── flappyvird.vim ├── data └── screenshot.png └── plugin └── flappyvird.vim /README.md: -------------------------------------------------------------------------------- 1 | # flappyvird-vim 2 | 3 | ![](https://raw.githubusercontent.com/mattn/flappyvird-vim/master/data/screenshot.png) 4 | 5 | ## Usage 6 | 7 | :FlappyVird 8 | 9 | * space : Jump 10 | * q or ESC : Exit 11 | * p : Pause 12 | * r : Retry 13 | 14 | ## License 15 | 16 | MIT 17 | 18 | ## Author 19 | 20 | Yasuhiro Matsumoto (a.k.a mattn) 21 | -------------------------------------------------------------------------------- /autoload/flappyvird.vim: -------------------------------------------------------------------------------- 1 | scriptencoding utf-8 2 | 3 | let s:CURSOR_OFF = 0 4 | let s:CURSOR_ON = 1 5 | 6 | let s:STATE_LOOP = 1 7 | let s:STATE_DIE = 2 8 | let s:STATE_FINISH = 3 9 | 10 | let s:t_ve = &t_ve 11 | 12 | let s:top_score = 0 13 | 14 | let s:seed = 0 15 | function! s:srand(seed) abort 16 | let s:seed = a:seed 17 | endfunction 18 | 19 | function! s:rand() abort 20 | let s:seed = s:seed * 214013 + 2531011 21 | return (s:seed < 0 ? s:seed - 0x80000000 : s:seed) / 0x10000 % 0x8000 22 | endfunction 23 | 24 | function! s:toggle_cursor(f) abort 25 | let &t_ve = a:f ? s:t_ve : '' 26 | endfunction 27 | 28 | function! s:stage_init() abort 29 | " open new buffer 30 | silent edit `='==FlappyVird=='` 31 | silent normal! gg0 32 | silent only! 33 | setlocal buftype=nowrite 34 | setlocal noswapfile 35 | setlocal bufhidden=wipe 36 | setlocal buftype=nofile 37 | setlocal nonumber 38 | setlocal nolist 39 | setlocal nowrap 40 | setlocal nocursorline 41 | setlocal nocursorcolumn 42 | syn match FlappyVirdGreen1 '\~' 43 | hi FlappyVirdGreen1 ctermfg=black ctermbg=green guifg=black guibg=green 44 | syn match FlappyVirdGreen2 '\^' 45 | hi FlappyVirdGreen2 ctermfg=yellow ctermbg=yellow guifg=yellow guibg=yellow 46 | syn match FlappyVirdBar '*' 47 | hi FlappyVirdBar ctermfg=magenta ctermbg=magenta guifg=magenta guibg=magenta 48 | call s:toggle_cursor(s:CURSOR_OFF) 49 | redraw 50 | endfunction 51 | 52 | function! s:stage_wipeout() abort 53 | call s:toggle_cursor(s:CURSOR_ON) 54 | bdelete 55 | endfunction 56 | 57 | function! s:loop() 58 | call s:stage_init() 59 | 60 | " clear whole screen 61 | let ww = winwidth('.') " window width 62 | let wh = winheight('.') " window height 63 | let sh = 20 " stage height 64 | 65 | " fill screen 66 | for i in range(1, wh) 67 | call setline(i, repeat(' ', ww + 10)) 68 | endfor 69 | 70 | " draw ground 71 | call setline(sh+1, repeat("~", ww)) 72 | let state = s:STATE_LOOP 73 | 74 | let rate = 100 75 | let jx = 20 " x offset 76 | let jy = 1600 " y offset 77 | let ry = jy / rate " real y 78 | 79 | let dy = 40 " diff y 80 | let sl = 0 " stage level 81 | let sc = 0 " score 82 | let st = 100 " stage timer 83 | let cf = get(g:, 'flappyvird_face', '(; @_@)') " character face 84 | let cw = len(cf) " character width 85 | let cb = getline(ry)[jx :jx+cw-1] " character background 86 | 87 | let ss = 20 " sleep! sleep! 88 | let rt = reltime() 89 | 90 | call s:srand(localtime()) 91 | 92 | call setline(sh + 2, printf(" SCORE: %10d", 0)) 93 | call setline(sh + 3, printf(" TOP SCORE: %6d", s:top_score)) 94 | 95 | let pause = 0 96 | let retry = 0 97 | while 1 98 | let c = getchar(0) 99 | if c == 27 || c == 113 " esc or q to quit 100 | " quit loop 101 | break 102 | elseif c == 112 " p to pause 103 | let pause = !pause 104 | endif 105 | 106 | if pause 107 | continue 108 | endif 109 | if state == s:STATE_FINISH 110 | if c == 114 " r to retry 111 | let retry = 1 112 | break 113 | endif 114 | " do nothing 115 | continue 116 | endif 117 | 118 | " erase character 119 | if ry > 0 120 | let l = getline(ry) 121 | let l = l[:jx] . cb . l[jx+cw+1:] 122 | call setline(ry, l) 123 | endif 124 | 125 | " calculate next position 126 | let jy -= dy 127 | let dy -= 1 128 | let ry = jy / rate 129 | 130 | if state == s:STATE_LOOP 131 | " move left screen 132 | for i in range(1, sh) 133 | call setline(i, getline(i)[1:] . ' ') 134 | endfor 135 | 136 | " move ground 137 | let l = getline(sh + 1) 138 | let l = l[1:] . (s:rand() < 2000 ? '^' : '~') 139 | call setline(sh + 1, l) 140 | 141 | if getline(sh)[jx-2: jx-1] == '* ' 142 | let sc += 1 143 | call setline(sh + 2, printf(" SCORE: %10d", sc)) 144 | if sc > s:top_score 145 | let s:top_score = sc 146 | call setline(sh + 3, printf(" TOP SCORE: %6d", s:top_score)) 147 | endif 148 | endif 149 | endif 150 | 151 | " redraw character 152 | if ry > 0 153 | let l = getline(ry) 154 | let cb = l[jx+1 :jx+cw] 155 | let l = l[:jx] . cf . l[jx+cw+1:] 156 | call setline(ry, l) 157 | endif 158 | 159 | redraw 160 | 161 | " calculate diff times to sleep 162 | let dt = str2float(reltimestr(reltime(rt))) * 1000.0 163 | let ds = float2nr(ss - dt) 164 | if ds > 0 165 | exe 'sleep' ds . 'ms' 166 | endif 167 | let rt = reltime() 168 | 169 | if state == s:STATE_DIE 170 | if ry >= sh 171 | let state = s:STATE_FINISH 172 | endif 173 | continue 174 | endif 175 | 176 | " if contains non-space characters, or overrun, it's hit! 177 | if cb =~ '\S' || ry < 1 || ry >= sh 178 | let state = s:STATE_DIE 179 | let dy = 0 180 | let cf = get(g:, 'flappyvird_face', '(; x_x)') " character face 181 | continue 182 | endif 183 | 184 | if c == 32 " space key 185 | let dy = 40 186 | endif 187 | 188 | if st == 0 189 | " draw bar 190 | let bw = 4 + s:rand() % (7 - sl / 5) 191 | let bb = 1 + s:rand() % (sh - bw - 3) 192 | for i in range(1, sh) 193 | let l = getline(i) 194 | let of = i >= bb && i <= bb + bw 195 | call setline(i, l[:ww] . repeat(of ? ' ' : '*', 3)) 196 | endfor 197 | 198 | " set next bar timer 199 | let st = (60 - sl) + s:rand() % 20 200 | let sl += 1 201 | else 202 | let st -= 1 203 | endif 204 | endwhile 205 | 206 | call s:stage_wipeout() 207 | return retry 208 | endfunction 209 | 210 | function! flappyvird#start() abort 211 | while s:loop() 212 | endwhile 213 | endfunction 214 | 215 | " vim:set et: 216 | -------------------------------------------------------------------------------- /data/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattn/flappyvird-vim/af9beef22b79811f793c39b4bec702b07627ec82/data/screenshot.png -------------------------------------------------------------------------------- /plugin/flappyvird.vim: -------------------------------------------------------------------------------- 1 | command! -nargs=0 FlappyVird call flappyvird#start() 2 | --------------------------------------------------------------------------------