[Object database query functions
clinton@unknownlamer.org**20080425181631] {
hunk ./src/basic-queries.lisp 1
+(in-package :org.unknownlamer.dnd-tools)
+
+(defgeneric find-player-class (name))
+(defgeneric find-player-level (player-class level))
+
+(defmethod find-player-class ((name symbol))
+  (get-instance-by-value 'player-class 'name name))
+
+(defmethod find-player-level ((player-class-name symbol) level)
+  (find-player-level (find-player-class player-class-name) level))
+
+(defmethod find-player-level ((player-class player-class) (level integer))
+  (find-item level (player-levels player-class) :key #'player-level :test #'=))
+
hunk ./src/spell-queries.lisp 1
+(in-package :org.unknownlamer.dnd-tools)
+
+(defgeneric find-spell-component (name))
+(defgeneric find-spell-school (school subschool))
+(defgeneric find-spell-domain (name))
+(defgeneric find-spell-level (player-class spell-level))
+(defgeneric find-spell-domain-level (domain level))
+
+(defmethod find-spell-component ((name symbol))
+  (get-instance-by-value 'spell-component 'name name))
+
+(defmethod find-spell-school ((school-name symbol) (subschool (eql nil)))
+  (get-instance-by-value 'spell-school 'name school-name))
+
+(defmethod find-spell-school ((school-name symbol) subschool)
+  (find-spell-school (find-spell-school school-name nil) subschool))
+
+(defmethod find-spell-school ((school spell-school) (subschool symbol))
+  (if-bind subschools (spell-school-subschools school)
+      (find-item subschool subschools
+		 :key #'spell-subschool-name)))
+
+(defmethod find-spell-domain ((name symbol))
+  (get-instance-by-value 'spell-domain 'name name))
+
+(defmethod find-spell-level ((player-class-name symbol) spell-level)
+  (find-spell-level (find-player-class player-class-name) spell-level))
+
+(defmethod find-spell-level ((player-class player-class) (spell-level integer))
+  ;; Inefficient; this needs a dedicated index or similar
+  (let ((spell-levels (get-instances-by-value 'spell-level 'level spell-level)))
+    (find player-class spell-levels
+	  :key (lambda (l) (level-class (caster-level l))))))
+
+(defmethod find-spell-domain-level ((domain-name symbol) level)
+  (find-spell-domain-level (find-spell-domain domain-name) level))
+
+(defmethod find-spell-domain-level ((domain spell-domain) (level integer))
+  (find-item level (spell-domain-levels domain) :key #'spell-level))
}