aboutsummaryrefslogtreecommitdiffstats
path: root/autoload/space_vlaze/enemy.vim
blob: f0e6f7a215f34af691181b2bd8cb37b268fb0164 (plain)
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