1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
function! space_vlaze#enemy#EnemyCharacter()
return '♤'
endfunction
if !exists('s:MAX_ENEMIES_ON_BOARD')
let s:MAX_ENEMIES_ON_BOARD = 50
endif
if !exists('s:MIN_ENEMIES_ON_BOARD')
let s:MIN_ENEMIES_ON_BOARD = 50
endif
if !exists('s:ENEMY_POINT_BASE')
let s:ENEMY_POINT_BASE = 1
endif
function! space_vlaze#enemy#AddEnemiesToBoard()
let ticks = space_vlaze#game#Ticks()
" At a 50ms refresh rate 100 ticks == 5 seconds
if ticks % 100 ==# 1
let new_enemy_count = ticks / 20
if new_enemy_count <# s:MIN_ENEMIES_ON_BOARD
let new_enemy_count = s:MIN_ENEMIES_ON_BOARD
endif
if new_enemy_count ># s:MAX_ENEMIES_ON_BOARD
let new_enemy_count = s:MAX_ENEMIES_ON_BOARD
endif
let i = 0
while i < new_enemy_count
call space_vlaze#enemy#DropEnemyAtRandomCoordinates()
let i += 1
endwhile
endif
endfunction
function! space_vlaze#enemy#DropEnemyAtRandomCoordinates()
let player_y = space_vlaze#player#PlayerY()
let player_x = space_vlaze#player#PlayerX()
let y = player_y
let x = player_x
" Don't drop enemy at the same coordinates as the player
while player_y ==# y && player_x ==# x
let y = space_vlaze#random#Random(space_vlaze#game#BoardHeight() - 1)
let x = space_vlaze#random#Random(space_vlaze#game#BoardWidth() - 1)
endwhile
call space_vlaze#game#SetBoardCell(y, x, space_vlaze#enemy#EnemyCharacter())
endfunction
function! space_vlaze#enemy#IsEnemyAtCell(y, x)
if space_vlaze#game#IsWithinBoard(a:y, a:x)
return space_vlaze#game#BoardCell(a:y, a:x) ==# space_vlaze#enemy#EnemyCharacter()
endif
endfunction
" Calling this function tells us that coordinates y, x were hit by a missile.
" If an enemy lives at y, x, it needs to disappear and update the score.
function! space_vlaze#enemy#HandleEnemyHitAt(y, x)
if space_vlaze#enemy#IsEnemyAtCell(a:y, a:x)
call space_vlaze#audio#PlayEnemyDefeated()
call space_vlaze#game#ClearBoardCell(a:y, a:x)
call space_vlaze#score#IncrementScore(
\ s:ENEMY_POINT_BASE * space_vlaze#enemy#PointMultiplier())
return 1
endif
endfunction
" Determines whether the player has been hit by an enemy. If so decrements a
" life from player.
"
" Should be used on player and enemy movement.
function! space_vlaze#enemy#HandlePlayerCollision()
if space_vlaze#enemy#IsEnemyAtCell(
\ space_vlaze#player#PlayerY(),
\ space_vlaze#player#PlayerX())
call space_vlaze#life#DecrementLives()
call space_vlaze#audio#PlayPlayerHit()
endif
endfunction
function! space_vlaze#enemy#PointMultiplier()
return 1
endfunction
|