attempting to slightly optimize defpart (#2587)

This commit is contained in:
ManDude
2023-04-29 22:28:07 +01:00
committed by GitHub
parent 5e987cc0e2
commit bc30e00b2f
4 changed files with 152 additions and 140 deletions
@@ -359,7 +359,10 @@
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
(let ((last-field-id -1))
(let ((last-field-id -1)
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
@@ -377,27 +380,27 @@
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
(vel? (and #f (cadddr field)))
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
(param-count (length params)))
(param-count (length params))
(param0 (and (>= param-count 1) (first params)))
(param1 (and (>= param-count 2) (second params)))
(param2 (and (>= param-count 3) (third params))))
(when (>= last-field-id field-id)
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
@@ -406,55 +409,55 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:pntr (the-as pointer ,(cadr (member (string->symbol ":data") params))))
)
((and (= 1 param-count) (param-symbol? (first params)))
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
:sym ,(first params))
:sym ,param0)
)
((and (= 1 param-count) (param-float? (first params)))
((and (= 1 param-count) (param-float? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef 0.0
:random-multf 1.0)
)
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
((and (= 2 param-count) (param-float? param0) (param-float? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
:random-multf 1.0)
)
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-range ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-range ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 1 param-count) (param-int? (first params)))
((and (= 1 param-count) (param-int? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:initial-value ,param0
:random-range 0
:random-mult 1)
)
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
((and (= 2 param-count) (param-int? param0) (param-int? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:initial-value ,param0
:random-range ,param1
:random-mult 1)
)
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:random-mult ,(third params))
:initial-value ,param0
:random-range ,param1
:random-mult ,param2)
)
(#t
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
@@ -225,7 +225,10 @@
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
(let ((last-field-id -1))
(let ((last-field-id -1)
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
@@ -243,28 +246,28 @@
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
(vel? (and #f (cadddr field)))
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
(store? (member (string->symbol ":store") params))
(param-count (if store? (1- (length params)) (length params))))
(param-count (if store? (1- (length params)) (length params)))
(param0 (and (>= param-count 1) (first params)))
(param1 (and (>= param-count 2) (second params)))
(param2 (and (>= param-count 3) (third params))))
(when (>= last-field-id field-id)
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
@@ -273,55 +276,55 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:object ,(cadr (member (string->symbol ":data") params)))
)
((and (= 1 param-count) (param-symbol? (first params)))
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
:sym ,(first params))
:sym ,param0)
)
((and (= 1 param-count) (param-float? (first params)))
((and (= 1 param-count) (param-float? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef 0.0
:random-multf 1.0)
)
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
((and (= 2 param-count) (param-float? param0) (param-float? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
:random-multf 1.0)
)
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-range ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-range ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 1 param-count) (param-int? (first params)))
((and (= 1 param-count) (param-int? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:initial-value ,param0
:random-range 0
:random-mult 1)
)
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
((and (= 2 param-count) (param-int? param0) (param-int? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:initial-value ,param0
:random-range ,param1
:random-mult 1)
)
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:random-mult ,(third params))
:initial-value ,param0
:random-range ,param1
:random-mult ,param2)
)
(#t
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
+38 -35
View File
@@ -730,7 +730,10 @@
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
(let ((last-field-id -1))
(let ((last-field-id -1)
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
@@ -748,27 +751,27 @@
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
(vel? (and #f (cadddr field)))
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
(param-count (length params)))
(param-count (length params))
(param0 (and (>= param-count 1) (first params)))
(param1 (and (>= param-count 2) (second params)))
(param2 (and (>= param-count 3) (third params))))
(when (>= last-field-id field-id)
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
@@ -777,55 +780,55 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:pntr (the-as pointer ,(cadr (member (string->symbol ":data") params))))
)
((and (= 1 param-count) (param-symbol? (first params)))
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
:sym ,(first params))
:sym ,param0)
)
((and (= 1 param-count) (param-float? (first params)))
((and (= 1 param-count) (param-float? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef 0.0
:random-multf 1.0)
)
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
((and (= 2 param-count) (param-float? param0) (param-float? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
:random-multf 1.0)
)
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-range ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-range ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 1 param-count) (param-int? (first params)))
((and (= 1 param-count) (param-int? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:initial-value ,param0
:random-range 0
:random-mult 1)
)
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
((and (= 2 param-count) (param-int? param0) (param-int? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:initial-value ,param0
:random-range ,param1
:random-mult 1)
)
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:random-mult ,(third params))
:initial-value ,param0
:random-range ,param1
:random-mult ,param2)
)
(#t
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))
+38 -35
View File
@@ -1074,7 +1074,10 @@
(defmacro defpart (id &key (init-specs ()))
"define a new sparticle-launcher"
(let ((last-field-id -1))
(let ((last-field-id -1)
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p))))))
`(set! (-> *part-id-table* ,id)
(new 'static 'sparticle-launcher
:init-specs (new 'static 'inline-array sp-field-init-spec ,(1+ (length init-specs))
@@ -1092,28 +1095,28 @@
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
(vel? (and #f (cadddr field)))
(param-float? (lambda (p) (or (float? p) (and (pair? p) (eq? 'meters (car p))) (and (pair? p) (eq? 'degrees (car p))))))
(param-int? (lambda (p) (or (integer? p) (and (pair? p) (eq? 'seconds (car p))))))
(param-symbol? (lambda (p) (and (pair? p) (eq? 'quote (car p)))))
(store? (member (string->symbol ":store") params))
(param-count (if store? (1- (length params)) (length params))))
(param-count (if store? (1- (length params)) (length params)))
(param0 (and (>= param-count 1) (first params)))
(param1 (and (>= param-count 2) (second params)))
(param2 (and (>= param-count 3) (third params))))
(when (>= last-field-id field-id)
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@(car params)) :random-mult 1)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,(car params) :flags (sp-flag int))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,(car params) :flags (sp-flag launcher))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,(car params) :flags (sp-flag object))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":copy"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
@@ -1122,55 +1125,55 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? (car params)) (eq? (symbol->string (car params)) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:object ,(cadr (member (string->symbol ":data") params)))
)
((and (= 1 param-count) (param-symbol? (first params)))
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
:sym ,(first params))
:sym ,param0)
)
((and (= 1 param-count) (param-float? (first params)))
((and (= 1 param-count) (param-float? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef 0.0
:random-multf 1.0)
)
((and (= 2 param-count) (param-float? (first params)) (param-float? (second params)))
((and (= 2 param-count) (param-float? param0) (param-float? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(if vel? `(/ ,(second params) 60.0) (second params))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,(if vel? `(/ ,param1 60.0) param1)
:random-multf 1.0)
)
((and (= 3 param-count) (param-float? (first params)) (param-float? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-float? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag ,(if store? 'float-store 'float))
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-rangef ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-rangef ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 3 param-count) (param-float? (first params)) (param-int? (second params)) (param-float? (third params)))
((and (= 3 param-count) (param-float? param0) (param-int? param1) (param-float? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag float-int-rand)
:initial-valuef ,(if vel? `(/ ,(first params) 60.0) (first params))
:random-range ,(second params)
:random-multf ,(if vel? `(/ ,(third params) 60.0) (third params)))
:initial-valuef ,(if vel? `(/ ,param0 60.0) param0)
:random-range ,param1
:random-multf ,(if vel? `(/ ,param2 60.0) param2))
)
((and (= 1 param-count) (param-int? (first params)))
((and (= 1 param-count) (param-int? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:initial-value ,param0
:random-range 0
:random-mult 1)
)
((and (= 2 param-count) (param-int? (first params)) (param-int? (second params)))
((and (= 2 param-count) (param-int? param0) (param-int? param1))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:initial-value ,param0
:random-range ,param1
:random-mult 1)
)
((and (= 3 param-count) (param-int? (first params)) (param-int? (second params)) (param-int? (third params)))
((and (= 3 param-count) (param-int? param0) (param-int? param1) (param-int? param2))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag int)
:initial-value ,(first params)
:random-range ,(second params)
:random-mult ,(third params))
:initial-value ,param0
:random-range ,param1
:random-mult ,param2)
)
(#t
`(new 'static 'sp-field-init-spec :field (sp-field-id spt-end))