aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--autoload/space_vlaze/game.vim21
-rw-r--r--autoload/space_vlaze/missile.vim71
-rw-r--r--autoload/space_vlaze/player.vim6
3 files changed, 97 insertions, 1 deletions
diff --git a/autoload/space_vlaze/game.vim b/autoload/space_vlaze/game.vim
index b5567f8..a1e00b3 100644
--- a/autoload/space_vlaze/game.vim
+++ b/autoload/space_vlaze/game.vim
@@ -70,8 +70,27 @@ function! space_vlaze#game#Board()
endfunction
+function! space_vlaze#game#BoardCell(y, x)
+ return s:board[a:y][a:x]
+endfunction
+
+
function! space_vlaze#game#SetBoardCell(y, x, value)
- let s:board[a:y][a:x] = a:value
+ if space_vlaze#game#IsWithinBoard(a:y, a:x)
+ let s:board[a:y][a:x] = a:value
+ endif
+endfunction
+
+
+function! space_vlaze#game#IsBoardCellEmpty(y, x)
+ if space_vlaze#game#IsWithinBoard(a:y, a:x)
+ return s:board[a:y][a:x] ==# ' '
+ endif
+endfunction
+
+
+function! space_vlaze#game#IsWithinBoard(y, x)
+ return a:y >=# 0 && a:y <# s:BOARD_HEIGHT && a:x >=# 0 && a:x <# s:BOARD_WIDTH
endfunction
diff --git a/autoload/space_vlaze/missile.vim b/autoload/space_vlaze/missile.vim
new file mode 100644
index 0000000..68c4e24
--- /dev/null
+++ b/autoload/space_vlaze/missile.vim
@@ -0,0 +1,71 @@
+" Fires all (4) missiles around an origin corrdinate (should be the player)
+function! space_vlaze#missile#FireAll(y, x)
+ let missiles_firing = 1
+ let i = 1
+ while missiles_firing
+ let missiles_firing = space_vlaze#missile#Move(a:y, a:x + i, 'right')
+
+ sleep 20ms
+
+ let i += 1
+ endwhile
+endfunction
+
+
+" Move a missile starting from a set of coordinates in a specified direction.
+" Clears the missile's previous location.
+"
+" y: Previous Y coordinate of missile
+" x: Previous X coordinate of missile
+" direction: 'left', 'right', 'bottom', or 'top'
+" returns: 1 if the missile was able to move, 0 if it hit a wall or object
+function! space_vlaze#missile#Move(y, x, direction)
+ let y = a:y
+ let x = a:x
+
+ if a:direction ==# 'left'
+ let x -= 1
+ elseif a:direction ==# 'right'
+ let x += 1
+ elseif a:direction ==# 'bottom'
+ let y += 1
+ elseif a:direction ==# 'top'
+ let y -= 1
+ endif
+
+ if space_vlaze#game#IsBoardCellEmpty(y, x)
+ call space_vlaze#missile#ClearMissile(a:y, a:x)
+
+ call space_vlaze#game#SetBoardCell(
+ \ y,
+ \ x,
+ \ space_vlaze#missile#MissileCharacter(a:direction))
+
+ call space_vlaze#game#RenderBoard()
+
+ return 1
+ endif
+
+ return 0
+endfunction
+
+
+function! space_vlaze#missile#ClearMissile(y, x)
+ call space_vlaze#game#SetBoardCell(a:y, a:x, ' ')
+endfunction
+
+
+function! space_vlaze#missile#MissileCharacter(direction)
+ let horizontal = '—'
+ let vertical = '|'
+
+ if a:direction ==# 'left'
+ return horizontal
+ elseif a:direction ==# 'right'
+ return horizontal
+ elseif a:direction ==# 'bottom'
+ return vertical
+ elseif a:direction ==# 'top'
+ return vertical
+ endif
+endfunction
diff --git a/autoload/space_vlaze/player.vim b/autoload/space_vlaze/player.vim
index e03cc24..51b38bb 100644
--- a/autoload/space_vlaze/player.vim
+++ b/autoload/space_vlaze/player.vim
@@ -57,4 +57,10 @@ endfunction
function! space_vlaze#player#FireBlasters()
+ " Fire top, right, bottom, left blasters
+ " A single missile fires in each direction
+ " The missile moves outward from the player to the edge of the board
+ " The missile stops when it hits an enemy or the edge of the board
+
+ call space_vlaze#missile#FireAll(s:PLAYER_Y, s:PLAYER_X)
endfunction