summaryrefslogtreecommitdiff
path: root/lisparuga/stats.scm
diff options
context:
space:
mode:
Diffstat (limited to 'lisparuga/stats.scm')
-rw-r--r--lisparuga/stats.scm45
1 files changed, 44 insertions, 1 deletions
diff --git a/lisparuga/stats.scm b/lisparuga/stats.scm
index 3abcdef..8d159ec 100644
--- a/lisparuga/stats.scm
+++ b/lisparuga/stats.scm
@@ -16,6 +16,8 @@
(define-module (lisparuga stats)
#:use-module (sly records)
+ #:use-module (lisparuga enemies)
+ #:use-module (lisparuga player)
#:use-module (lisparuga utils)
#:export (make-stats
stats?
@@ -23,7 +25,10 @@
stats-lives
stats-chain
stats-chain-type
- stats-chain-progress))
+ stats-chain-progress
+ decrement-life
+ add-to-score
+ add-to-chain))
(define-record-type* <stats>
%make-stats make-stats
@@ -33,3 +38,41 @@
(chain stats-chain 0)
(chain-type stats-chain-type #f)
(chain-progress stats-chain-progress 0))
+
+(define (decrement-life stats)
+ (make-stats #:inherit stats
+ #:lives (max 0 (1- (stats-lives stats)))))
+
+(define max-chain-multiplier 10)
+
+(define (add-to-score enemy stats)
+ ;; TODO: Award different points for different types of enemies.
+ (make-stats #:inherit stats
+ #:score (+ (stats-score stats)
+ 1000 ; base kill points
+ ;; Chain multiplier.
+ (* 255
+ (min (stats-chain stats)
+ max-chain-multiplier)))))
+
+(define (add-to-chain enemy stats)
+ (let* ((enemy-polarity (enemy-polarity enemy))
+ (chain-polarity (stats-chain-type stats))
+ (progress (stats-chain-progress stats)))
+ (cond
+ ((or (zero? progress) (= progress 3))
+ (make-stats #:inherit stats
+ #:chain-type enemy-polarity
+ #:chain-progress 1))
+ ((not (eq? enemy-polarity chain-polarity))
+ (make-stats #:inherit stats
+ #:chain-type #f
+ #:chain-progress 0
+ #:chain 0))
+ ((= progress 1)
+ (make-stats #:inherit stats
+ #:chain-progress 2))
+ ((= progress 2)
+ (make-stats #:inherit stats
+ #:chain-progress 3
+ #:chain (1+ (stats-chain stats)))))))