package game // SCORE_MAX is the highest allowed score (7 digits, 9,999,999). // Any additions beyond this value are clamped. const SCORE_MAX Score = 9999999 // Score is a running total of points earned. // It’s a distinct type (over uint32) to prevent mixing raw integers with scores. type Score uint32 // Lines adds points for clearing a number of lines at once. // // The formula used is: s = L^2 * 100 (where L is the number of lines cleared) // That yields the following values: // // L=0 => 0 // L=1 => 100 // L=2 => 400 // L=3 => 900 // L=4 => 1600 // // Note: `lines` is a byte (0..255). Even at 255 the delta (255^2*100=6,502,500) // fits comfortably in uint32 and is then clamped against SCORE_MAX on add. func (s *Score) Lines(lines byte) { L := uint32(lines) s.Add(L * L * 100) } // Add increases the score by num and clamps the result to SCORE_MAX. // No effect if the score is already at SCORE_MAX func (s *Score) Add(num uint32) { *s = min(*s+Score(num), SCORE_MAX) }