summaryrefslogtreecommitdiff
path: root/hiscore.bmx
blob: 99f436ef1da40d893379bbc3105d7e19b5ad20c5 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
' Vectoroids
'
' Copyright 2005 Ian Cowburn
'
' $Id$
'
Strict
Import "types.bmx"

Type THiscore

	Const NUM:Int=5
	Field score:THiscoreEnt[]
	Field col:Int[]
	Field coli:Int[]
	
	Function Load:THiscore()
		Local o:THiscore=New THiscore

		o.score=New THiscoreEnt[NUM]
		o.col=New Int[NUM]
		o.coli=New Int[NUM]
		
		For Local f:Int=0 Until NUM
			o.col[f]=254-f*20
			o.coli[f]=1
		Next
		
		Local s:TStream=ReadStream("vectoroids.hiscore")
		
		If s=Null
			For Local f:Int=0 Until NUM
				o.score[f]=THiscoreEnt.Create("SV",10000-f*2000)
			Next
		Else
			s=LittleEndianStream(s)
			
			For Local f:Int=0 Until NUM
				Local sc:Int=s.ReadInt()
				Local n:String=s.ReadLine()
				o.score[f]=THiscoreEnt.Create(n,sc)
			Next

			s.Close()
		EndIf
		
		Return o
	End Function
	
	Method Save()
		Local s:TStream=WriteStream("vectoroids.hiscore")
		
		If s=Null
			Return
		EndIf
		
		s=LittleEndianStream(s)
		
		For Local sc:THiscoreEnt=EachIn score
			s.WriteInt(sc.score)
			s.WriteLine(sc.name)
		Next

		s.Close()
	End Method
	
	Method Display(y:Int)
		GameGFX.font.Centre("ALL TIME HIGH SCORES",y)
		y:+20
		
		For Local f:Int=0 Until NUM
			GameGFX.font.Draw(score[f].name,300,y,col[f],col[f],col[f])
			Local l:Int=GameGFX.font.TextWidth(score[f].score)
			GameGFX.font.Draw(score[f].score,500-l,y,col[f],col[f],col[f])
			y:+10
			col[f]:+coli[f]
			
			If col[f]=255 Or col[f]=150
				coli[f]=-coli[f]
			EndIf
		Next
	End Method
	
	Method Check(sc:Int)
		If sc<score[NUM-1].score
			Return
		EndIf
		
		Local done:Int=False
		Local a:String="abcdefghijklmnopqrstuvwxyz{}"
		Local cur:Int=0
		Local nm:String=""
		Local last:Int=0
		Local del:Int=0
		Local tx:Int=GraphicsWidth()/2-GameGFX.font.TextWidth("___")
		Local press:Int=False
		
		While Not done
			Cls
			
			GameGFX.font.Centre("enter your name for",0)
			GameGFX.font.Centre("the hall of fame",20)
			
			SetScale(2,2)
			GameGFX.font.Draw("___",tx,300)
			GameGFX.font.Draw(nm+a[cur..cur+1],tx,300)
			SetScale(1,1)

			If del
				del:-1
			EndIf
			
			If KeyDown(GameConfig.kleft)
				If last<>GameConfig.kleft Or del=0
					If last=GameConfig.kleft
						del=5
					Else
						del=20
					EndIf
					last=GameConfig.kleft
					cur:-1
					If cur<0
						cur:+a.length						
					EndIf
				EndIf
				press=True
			ElseIf KeyDown(GameConfig.kright)
				If last<>GameConfig.kright Or del=0
					If last=GameConfig.kright
						del=5
					Else
						del=20
					EndIf
					last=GameConfig.kright
					cur:+1
					If cur=a.length
						cur=0
					EndIf
				EndIf
				press=True
			Else
				press=False
				last=0
				del=0
			EndIf

			If KeyHit(GameConfig.khyper)
				Local c:String=a[cur..cur+1]
				
				If c="{"
					If nm.length>1
						nm=nm[0..nm.length-1]
					ElseIf nm.length=1
						nm=""
					EndIf
				Else If c="}"
					done=True
				Else
					nm:+c
					If nm.length=3
						done=True
					EndIf
				EndIf
			EndIf
			
			Flip
		Wend
		
		score[NUM-1]=THiscoreEnt.Create(nm.ToUpper(),sc)
		score.Sort()
		Save()
	End Method
End Type

Type THiscoreEnt
	Field	score:Int
	Field	name:String
	
	Function Create:THiscoreEnt(name:String, score:Int)
		Local o:THiscoreEnt=New THiscoreEnt
		o.score=score
		o.name=name
		Return o
	End Function
	
	Method Compare(o:Object)
		Local os:THiscoreEnt=THiscoreEnt(o)
		
		If os
			Return os.score-score
		Else
			Return 0
		EndIf
	End Method
End Type