[Initial derived indices support clinton@unknownlamer.org**20080430050027 * Using psets for reverse indices is dumb and creates cycles in the database that make it impossible to migrate * Replace player-levels with level-class index ] { hunk ./dnd-tools.asd 27 - (:file "initialize-database" :depends-on (:core :database :classes)) - (:file "srd-import" :depends-on (:core :classes))))) + (:file "derived-index-functions" :depends-on (:classes)) + (:file "initialize-database" :depends-on (:database :classes + "derived-index-functions")) + (:file "srd-import" :depends-on (:classes))))) hunk ./src/basic-classes.lisp 6 - ((name :initarg :name :accessor player-class-name :index t) - (levels :accessor player-levels :initform nil)) + ((name :initarg :name :accessor player-class-name :index t)) hunk ./src/basic-classes.lisp 13 + +(defgeneric player-class-levels (player-class)) + +(defmethod player-class-levels ((player-class player-class)) + (get-instances-by-value 'player-level 'player-class player-class)) + + hunk ./src/derived-index-functions.lisp 1 - +(in-package :org.unknownlamer.dnd-tools) + +(defun player-level-indexer (player-level) + (level-class player-level)) hunk ./src/initialize-database.lisp 3 +(defun initialize-derived-indices () + (add-class-derived-index 'player-level 'level-class 'player-level-indexer)) + +(defun destroy-derived-indices () + (mapcar (lambda (c) + (remove-class-derived-index (car c) (cdr c))) + '((player-level . level-class)))) + hunk ./src/initialize-database.lisp 16 - (setf (player-levels player-class) - (make-pset - :items (map-range - (lambda (level) - (make-instance 'player-level :level level - :level-class player-class)) - 1 20))))) + (map-range + (lambda (level) + (make-instance 'player-level :level level + :level-class player-class)) + 1 20))) hunk ./src/initialize-database.lisp 25 - (let* ((info (assoc 'cleric *caster-classes*)) - (class (get-instance-by-value - 'player-class 'name (car info))) - (levels (player-levels class))) - (cons class - (mapcar (lambda (level) - (find-item level levels :key #'player-level)) - (cdr info)))))) + (cons (find-player-class 'cleric) + (mapcar (lambda (level) + (find-player-level 'cleric level)) + (cdr (assoc 'cleric *caster-classes*)))))) hunk ./src/initialize-database.lisp 59 - (let* ((class (get-instance-by-value - 'player-class 'name (car caster-info))) - (levels (player-levels class))) - (cons - class - (mapcar (lambda (level) - (if level - (find-item level levels :key #'player-level))) - (cdr caster-info))))) + (cons + (find-player-class (car caster-info)) + (mapcar (lambda (level) + (if level + (find-player-level (car caster-info) + level))) + (cdr caster-info)))) hunk ./src/initialize-database.lisp 99 + #'initialize-derived-indices hunk ./src/queries.lisp 21 - (if-bind player-level (find-item level (player-levels player-class) - :key #'player-level :test #'=) - (values player-level t) - (values nil nil))) + (get-instance-by-value 'player-level 'level-class (cons player-class level))) }