dmaster_SOURCES = \
src/generators.cpp \
src/main.cpp \
- src/mods.cpp \
+ src/modules.cpp \
src/paths.cpp
dmaster_CPPFLAGS = \
@GUILE_CFLAGS@ \
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master generators town)
- #:use-module (dungeon-master geom voronoi)
- #:use-module (dungeon-master geom point)
- #:export (generate))
-
-(define (random-bool)
- (= (random 2) 1))
-
-(define pi 3.141592654)
-(define relax-steps 3)
-
-(define (generate patches)
- "City generator from https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/towngenerator/building/Model.hx"
- (set! *random-state* (random-state-from-platform))
- (when (= patches -1) (set! patches 15))
- (build-patches patches))
-
-(define (build-patches n-patches)
- (define* (get-points n seed #:optional (l '()))
- (cond ((>= n 0)
- (let* ((a (+ seed (* (sqrt n) 5)))
- (r (if (= n 0)
- 0
- (+ 10 (* n (+ 2 (random:exp))))))
- (point (make-point
- (* (cos a) r)
- (* (sin a) r))))
- (get-points (- n 1) seed (cons point l))))
- (else
- l)))
-
- (define (relax voronoi n step)
- "Relaxing central wards"
- (cond ((> step 0)
- (let* ((voronoi-points (voronoi-mesh-points voronoi))
- (n-points (length voronoi-points))
- (to-relax (cons (list-ref voronoi-points (- n-points n-patches))
- (list-tail voronoi-points (- n-points 3)))))
- (relax (voronoi-mesh-relax voronoi to-relax) n (- step 1))))
- (else
- voronoi)))
-
- (let* ((sa (* (random:exp) 2 pi))
- (points (get-points (* 8 n-patches) sa))
- (voronoi (relax (make-voronoi-mesh points) n-patches relax-steps)))
- "end"))
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master geom)
- #:use-module (dungeon-master geom point)
- #:export (angle-sign))
-
-
-(define (angle-sign center a b)
- "Return the sign of (- (atan (- a center))
- (atan (- b center)))"
- (let ((x1 (- (point-x a) (point-x center)))
- (y1 (- (point-y a) (point-y center)))
- (x2 (- (point-x b) (point-x center)))
- (y2 (- (point-y b) (point-y center))))
- (cond ((and (>= x1 0) (< x2 0))
- 1)
- ((and (>= x2 0) (< x1 0))
- -1)
- ((and (= x1 0) (= x2 0))
- (if (> y2 y1) 1 -1))
- (else
- (if (> (- (* x2 y1) (* x1 y2)) 0) 1 -1)))))
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master geom bowyer-watson)
- #:use-module (ice-9 receive)
- #:use-module (srfi srfi-1)
- #:use-module (srfi srfi-9)
- #:use-module (dungeon-master geom point)
- #:use-module (dungeon-master geom triangle)
- #:export (bowyer-watson))
-
-"
-Compute the Delaunay triangulation using Bowyer–Watson algorithm
-https://en.wikipedia.org/wiki/Bowyer-Watson_algorithm
-"
-
-(define (bowyer-watson vertices)
- (receive (minx miny maxx maxy)
- (calculate-limits vertices)
- (let ((c1 (make-point minx miny))
- (c2 (make-point minx maxy))
- (c3 (make-point maxx miny))
- (c4 (make-point maxx maxy)))
- (let ((frame (list c1 c2 c3 c4)))
- (receive (points triangles)
- (calculate-triangulation
- (list c4 c3 c2 c1)
- (list (make-triangle c1 c2 c3)
- (make-triangle c2 c3 c4))
- vertices)
- (values triangles points frame))))))
-
-(define (calculate-limits vertices)
- (let ((xs (map (lambda (p) (point-x p)) vertices))
- (ys (map (lambda (p) (point-y p)) vertices)))
- (let ((minx (apply min (cons (expt 10 10) xs)))
- (miny (apply min (cons (expt 10 10) ys)))
- (maxx (apply max (cons (- (expt 10 9)) xs)))
- (maxy (apply max (cons (- (expt 10 9)) ys))))
- (let ((dx (* (- maxx minx) 0.5))
- (dy (* (- maxy miny) 0.5)))
- (values (- minx (/ dx 2))
- (- miny (/ dy 2))
- (+ maxx (/ dx 2))
- (+ maxy (/ dy 2)))))))
-
-(define (calculate-triangulation points triangles vertices)
- (cond ((null? vertices)
- (values points triangles))
- (else
- (let ((vertice (car vertices)))
- (receive (to-split to-keep)
- (triangles-contains-point triangles vertice)
- (cond ((null? to-split)
- (calculate-triangulation points triangles (cdr vertices)))
- (else
- (calculate-triangulation
- (cons vertice points)
- (concatenate
- (list (calculate-new-triangles to-split vertice)
- to-keep))
- (cdr vertices)))))))))
-
-(define (calculate-new-triangles to-split p1)
- (receive (a b)
- (calculate-new-edges to-split)
- (let loop ((p2-list a)
- (p3-list b)
- (triangles '()))
- (cond ((null? p2-list)
- triangles)
- (else
- (let ((p2 (car p2-list))
- (p3 (car p3-list)))
- (loop (cdr p2-list)
- (cdr p3-list)
- (cons (make-triangle p1 p2 p3) triangles))))))))
-
-(define* (calculate-new-edges triangles #:optional (original-t triangles) (a '()) (b '()))
- (cond ((null? triangles)
- (values a b))
- (else
- (let* ((triangle (car triangles))
- (common-edge (triangles-has-common-edge triangle original-t)))
- (let ((points (triangle-points triangle)))
- (let ((p1 (car points))
- (p2 (cadr points))
- (p3 (caddr points))
- (e1 (car common-edge))
- (e2 (cadr common-edge))
- (e3 (caddr common-edge)))
- (cond (e1
- (set! a (cons p1 a))
- (set! b (cons p2 b))))
- (cond (e2
- (set! a (cons p2 a))
- (set! b (cons p3 b))))
- (cond (e3
- (set! a (cons p3 a))
- (set! b (cons p1 b))))
- (calculate-new-edges (cdr triangles) original-t a b)))))))
-
-(define* (triangles-has-common-edge triangle triangles #:optional (e1 #t) (e2 #t) (e3 #t))
- (cond ((not (or e1 e2 e3))
- (list e1 e2 e3))
- ((null? triangles)
- (list e1 e2 e3))
- (else
- (let ((t (car triangles)))
- (cond ((equal? t triangle)
- (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3))
- (else
- (let ((points (triangle-points triangle)))
- (let ((p1 (car points))
- (p2 (cadr points))
- (p3 (caddr points)))
- (when (and e1 (triangle-has-edge t p2 p1))
- (set! e1 #f))
- (when (and e2 (triangle-has-edge t p3 p2))
- (set! e2 #f))
- (when (and e3 (triangle-has-edge t p1 p3))
- (set! e3 #f))))
- (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3)))))))
-
-(define (triangles-contains-point triangles point)
- (partition
- (lambda (triangle)
- (< (points-distance point (triangle-center triangle))
- (triangle-radius triangle)))
- triangles))
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master geom point)
- #:use-module (srfi srfi-9)
- #:export (make-point
- point?
- point-x
- point-y
- points-distance
- sum-points
- scale-point))
-
-(define-record-type <point>
- (make-point x y)
- point?
- (x point-x)
- (y point-y))
-
-(define (points-distance p1 p2)
- (abs
- (sqrt (+ (expt (- (point-x p1) (point-x p2)) 2)
- (expt (- (point-y p1) (point-y p2)) 2)))))
-
-(define (sum-points . points-to-sum)
- (let loop ((points points-to-sum)
- (x 0)
- (y 0))
- (cond ((null? points)
- (make-point x y))
- (else
- (loop (cdr points)
- (+ x (point-x (car points)))
- (+ y (point-y (car points))))))))
-
-(define (scale-point point scale)
- (make-point
- (* (point-x point) scale)
- (* (point-y point) scale)))
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master geom triangle)
- #:use-module (ice-9 receive)
- #:use-module (srfi srfi-9)
- #:use-module (dungeon-master geom point)
- #:export (make-triangle
- triangle?
- triangle-points
- triangle-center
- triangle-radius
- triangle-has-edge))
-
-(define-record-type <triangle>
- (make-raw-triangle points center radius)
- triangle?
- (points triangle-points)
- (center triangle-center)
- (radius triangle-radius))
-
-(define (make-triangle p1 p2 p3)
- (let ((center (circumcenter p1 p2 p3)))
- (make-raw-triangle
- (list p1 p2 p3)
- center
- (points-distance center p1))))
-
-(define (circumcenter p1 p2 p3)
- (receive (a b c)
- (perpendicular-line-from-points p1 p2)
- (receive (e f g)
- (perpendicular-line-from-points p2 p3)
- (let ((determinant (- (* a f) (* e b))))
- (make-point
- (/ (- (* f c) (* b g)) determinant)
- (/ (- (* a g) (* e c)) determinant))))))
-
-(define (perpendicular-line-from-points p1 p2)
- (let ((x1 (point-x p1))
- (y1 (point-y p1))
- (x2 (point-x p2))
- (y2 (point-y p2)))
- (let* ((a (- y2 y1))
- (b (- x1 x2))
- (c (+ (* a x1) (* b y2))))
- (let ((mid-x (/ (+ x1 x2) 2))
- (mid-y (/ (+ y1 y2) 2)))
- (values (- b)
- a
- (+ (* (- b) mid-x) (* a mid-y)))))))
-
-(define (triangle-has-edge triangle a b)
- (let ((points (triangle-points triangle)))
- (let ((p1 (car points))
- (p2 (cadr points))
- (p3 (caddr points)))
- (or (and (equal? p1 a) (equal? p2 b))
- (and (equal? p1 b) (equal? p2 a))
- (and (equal? p2 a) (equal? p3 b))
- (and (equal? p2 b) (equal? p3 a))
- (and (equal? p3 a) (equal? p1 b))
- (and (equal? p3 b) (equal? p1 a))))))
+++ /dev/null
-;;; Dungeon Master --- RPG Adventure Generator
-;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-;;;
-;;; Dungeon Master is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; Dungeon Master is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;;; General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-
-
-(define-module (dungeon-master geom voronoi)
- #:use-module (ice-9 receive)
- #:use-module (rnrs sorting)
- #:use-module (srfi srfi-1)
- #:use-module (srfi srfi-9)
- #:use-module (dungeon-master geom)
- #:use-module (dungeon-master geom point)
- #:use-module (dungeon-master geom triangle)
- #:use-module (dungeon-master geom bowyer-watson)
- #:export (make-voronoi-mesh
- voronoi-mesh?
- voronoi-mesh-triangles
- voronoi-mesh-points
- voronoi-mesh-frame
- voronoi-mesh-regions
- voronoi-mesh-relax))
-
-"https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/geom/Voronoi.hx"
-
-;;; Voronoi mesh region
-
-(define-record-type <voronoi-region>
- (make-raw-voronoi-region seed vertices)
- voronoi-region?
- (seed voronoi-region-seed)
- (vertices voronoi-region-vertices))
-
-(define (make-voronoi-region seed vertices)
- (define (compare-angles triangle1 triangle2)
- (let ((c1 (triangle-center triangle1))
- (c2 (triangle-center triangle2)))
- (> (angle-sign seed c1 c2) 0)))
- (make-raw-voronoi-region seed (list-sort compare-angles vertices)))
-
-(define (voronoi-region-center region)
- (let* ((vertices (voronoi-region-vertices region))
- (centers (map (lambda (v) (triangle-center v)) vertices)))
- (scale-point
- (apply sum-points centers)
- (/ 1 (length vertices)))))
-
-
-;;; Voronoi mesh
-
-(define-record-type <voronoi-mesh>
- (make-raw-voronoi-mesh triangles points frame regions)
- voronoi-mesh?
- (triangles voronoi-mesh-triangles)
- (points voronoi-mesh-points)
- (frame voronoi-mesh-frame)
- (regions voronoi-mesh-regions))
-
-(define (make-voronoi-mesh vertices)
- ;; Delaunay triangulation
- (receive (triangles points frame)
- (bowyer-watson vertices)
- (make-raw-voronoi-mesh
- triangles
- points
- frame
- (make-regions points triangles))))
-
-(define (partitioning voronoi)
- (define (is-real-triangle triangle)
- ;; real triangle points cannot be frame points
- (let ((frame (voronoi-mesh-frame voronoi)))
- (let check-points ((points (triangle-points triangle)))
- (cond ((null? points)
- #t) ; triangle is real
- (else
- (and (not (member (car points) frame))
- (check-points (cdr points))))))))
-
- (define (is-real-region region)
- ;; real region points cannot be frame points
- (let check-vertices ((vertices (voronoi-region-vertices region)))
- (cond ((null? vertices)
- #t) ; region is real
- (else
- (and (is-real-triangle (car vertices))
- (check-vertices (cdr vertices)))))))
-
- (let* ((points (voronoi-mesh-points voronoi))
- (regions (voronoi-mesh-regions voronoi))
- ;; we need the regions in the same order as points are
- (ordered-regions
- (map-in-order
- (lambda (p)
- (assoc-ref regions p))
- points))
- ;; only real regions without frame points
- (filtered-regions
- (filter (lambda (r) (is-real-region r))
- ordered-regions)))
- filtered-regions))
-
-(define* (voronoi-mesh-relax voronoi #:optional (points-to-relax '()))
- (let ((regions
- (map
- (lambda (r) (cons (voronoi-region-seed r) (voronoi-region-center r)))
- (partitioning voronoi)))
- (points
- (filter
- (lambda (p) (not (member p (voronoi-mesh-frame voronoi))))
- (voronoi-mesh-points voronoi)))
- (to-relax
- (if (null? points-to-relax)
- (voronoi-mesh-points voronoi)
- points-to-relax)))
- (make-voronoi-mesh
- (map
- (lambda (point)
- (let ((center (assoc-ref regions point)))
- (if (and center (member point to-relax))
- center
- point)))
- points))))
-
-(define (make-regions points triangles)
- (map-in-order
- (lambda (p)
- (let ((vertices
- (filter
- (lambda (tr) (member p (triangle-points tr)))
- triangles)))
- (cons p (make-voronoi-region p vertices))))
- points))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(use-modules (dungeon-master)
+ (dungeon-master generators terrain))
+
+(register-scene-generator "Basic city" 'urban city-generator)
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2020 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master dialogue)
+ #:use-module (ice-9 optargs)
+ #:export (run-dialogue))
+
+
+(define* (run-dialogue dialogue #:optional initial-scene)
+ (let ((scene (if initial-scene
+ (assoc-ref dialogue initial-scene)
+ (cdar dialogue))))
+ (let-keywords scene #t (text)
+ (display text)
+ (newline))))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master generators terrain)
+ #:export (city-generator))
+
+(define (city-generator x)
+ (format #t "***~%~a~%***~%" x))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master generators town)
+ #:use-module (dungeon-master geom voronoi)
+ #:use-module (dungeon-master geom point)
+ #:export (generate))
+
+(define (random-bool)
+ (= (random 2) 1))
+
+(define pi 3.141592654)
+(define relax-steps 3)
+
+(define (generate patches)
+ "City generator from https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/towngenerator/building/Model.hx"
+ (set! *random-state* (random-state-from-platform))
+ (when (= patches -1) (set! patches 15))
+ (build-patches patches))
+
+(define (build-patches n-patches)
+ (define* (get-points n seed #:optional (l '()))
+ (cond ((>= n 0)
+ (let* ((a (+ seed (* (sqrt n) 5)))
+ (r (if (= n 0)
+ 0
+ (+ 10 (* n (+ 2 (random:exp))))))
+ (point (make-point
+ (* (cos a) r)
+ (* (sin a) r))))
+ (get-points (- n 1) seed (cons point l))))
+ (else
+ l)))
+
+ (define (relax voronoi n step)
+ "Relaxing central wards"
+ (cond ((> step 0)
+ (let* ((voronoi-points (voronoi-mesh-points voronoi))
+ (n-points (length voronoi-points))
+ (to-relax (cons (list-ref voronoi-points (- n-points n-patches))
+ (list-tail voronoi-points (- n-points 3)))))
+ (relax (voronoi-mesh-relax voronoi to-relax) n (- step 1))))
+ (else
+ voronoi)))
+
+ (let* ((sa (* (random:exp) 2 pi))
+ (points (get-points (* 8 n-patches) sa))
+ (voronoi (relax (make-voronoi-mesh points) n-patches relax-steps)))
+ "end"))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master geom)
+ #:use-module (dungeon-master geom point)
+ #:export (angle-sign))
+
+
+(define (angle-sign center a b)
+ "Return the sign of (- (atan (- a center))
+ (atan (- b center)))"
+ (let ((x1 (- (point-x a) (point-x center)))
+ (y1 (- (point-y a) (point-y center)))
+ (x2 (- (point-x b) (point-x center)))
+ (y2 (- (point-y b) (point-y center))))
+ (cond ((and (>= x1 0) (< x2 0))
+ 1)
+ ((and (>= x2 0) (< x1 0))
+ -1)
+ ((and (= x1 0) (= x2 0))
+ (if (> y2 y1) 1 -1))
+ (else
+ (if (> (- (* x2 y1) (* x1 y2)) 0) 1 -1)))))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master geom bowyer-watson)
+ #:use-module (ice-9 receive)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
+ #:use-module (dungeon-master geom point)
+ #:use-module (dungeon-master geom triangle)
+ #:export (bowyer-watson))
+
+"
+Compute the Delaunay triangulation using Bowyer–Watson algorithm
+https://en.wikipedia.org/wiki/Bowyer-Watson_algorithm
+"
+
+(define (bowyer-watson vertices)
+ (receive (minx miny maxx maxy)
+ (calculate-limits vertices)
+ (let ((c1 (make-point minx miny))
+ (c2 (make-point minx maxy))
+ (c3 (make-point maxx miny))
+ (c4 (make-point maxx maxy)))
+ (let ((frame (list c1 c2 c3 c4)))
+ (receive (points triangles)
+ (calculate-triangulation
+ (list c4 c3 c2 c1)
+ (list (make-triangle c1 c2 c3)
+ (make-triangle c2 c3 c4))
+ vertices)
+ (values triangles points frame))))))
+
+(define (calculate-limits vertices)
+ (let ((xs (map (lambda (p) (point-x p)) vertices))
+ (ys (map (lambda (p) (point-y p)) vertices)))
+ (let ((minx (apply min (cons (expt 10 10) xs)))
+ (miny (apply min (cons (expt 10 10) ys)))
+ (maxx (apply max (cons (- (expt 10 9)) xs)))
+ (maxy (apply max (cons (- (expt 10 9)) ys))))
+ (let ((dx (* (- maxx minx) 0.5))
+ (dy (* (- maxy miny) 0.5)))
+ (values (- minx (/ dx 2))
+ (- miny (/ dy 2))
+ (+ maxx (/ dx 2))
+ (+ maxy (/ dy 2)))))))
+
+(define (calculate-triangulation points triangles vertices)
+ (cond ((null? vertices)
+ (values points triangles))
+ (else
+ (let ((vertice (car vertices)))
+ (receive (to-split to-keep)
+ (triangles-contains-point triangles vertice)
+ (cond ((null? to-split)
+ (calculate-triangulation points triangles (cdr vertices)))
+ (else
+ (calculate-triangulation
+ (cons vertice points)
+ (concatenate
+ (list (calculate-new-triangles to-split vertice)
+ to-keep))
+ (cdr vertices)))))))))
+
+(define (calculate-new-triangles to-split p1)
+ (receive (a b)
+ (calculate-new-edges to-split)
+ (let loop ((p2-list a)
+ (p3-list b)
+ (triangles '()))
+ (cond ((null? p2-list)
+ triangles)
+ (else
+ (let ((p2 (car p2-list))
+ (p3 (car p3-list)))
+ (loop (cdr p2-list)
+ (cdr p3-list)
+ (cons (make-triangle p1 p2 p3) triangles))))))))
+
+(define* (calculate-new-edges triangles #:optional (original-t triangles) (a '()) (b '()))
+ (cond ((null? triangles)
+ (values a b))
+ (else
+ (let* ((triangle (car triangles))
+ (common-edge (triangles-has-common-edge triangle original-t)))
+ (let ((points (triangle-points triangle)))
+ (let ((p1 (car points))
+ (p2 (cadr points))
+ (p3 (caddr points))
+ (e1 (car common-edge))
+ (e2 (cadr common-edge))
+ (e3 (caddr common-edge)))
+ (cond (e1
+ (set! a (cons p1 a))
+ (set! b (cons p2 b))))
+ (cond (e2
+ (set! a (cons p2 a))
+ (set! b (cons p3 b))))
+ (cond (e3
+ (set! a (cons p3 a))
+ (set! b (cons p1 b))))
+ (calculate-new-edges (cdr triangles) original-t a b)))))))
+
+(define* (triangles-has-common-edge triangle triangles #:optional (e1 #t) (e2 #t) (e3 #t))
+ (cond ((not (or e1 e2 e3))
+ (list e1 e2 e3))
+ ((null? triangles)
+ (list e1 e2 e3))
+ (else
+ (let ((t (car triangles)))
+ (cond ((equal? t triangle)
+ (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3))
+ (else
+ (let ((points (triangle-points triangle)))
+ (let ((p1 (car points))
+ (p2 (cadr points))
+ (p3 (caddr points)))
+ (when (and e1 (triangle-has-edge t p2 p1))
+ (set! e1 #f))
+ (when (and e2 (triangle-has-edge t p3 p2))
+ (set! e2 #f))
+ (when (and e3 (triangle-has-edge t p1 p3))
+ (set! e3 #f))))
+ (triangles-has-common-edge triangle (cdr triangles) e1 e2 e3)))))))
+
+(define (triangles-contains-point triangles point)
+ (partition
+ (lambda (triangle)
+ (< (points-distance point (triangle-center triangle))
+ (triangle-radius triangle)))
+ triangles))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master geom point)
+ #:use-module (srfi srfi-9)
+ #:export (make-point
+ point?
+ point-x
+ point-y
+ points-distance
+ sum-points
+ scale-point))
+
+(define-record-type <point>
+ (make-point x y)
+ point?
+ (x point-x)
+ (y point-y))
+
+(define (points-distance p1 p2)
+ (abs
+ (sqrt (+ (expt (- (point-x p1) (point-x p2)) 2)
+ (expt (- (point-y p1) (point-y p2)) 2)))))
+
+(define (sum-points . points-to-sum)
+ (let loop ((points points-to-sum)
+ (x 0)
+ (y 0))
+ (cond ((null? points)
+ (make-point x y))
+ (else
+ (loop (cdr points)
+ (+ x (point-x (car points)))
+ (+ y (point-y (car points))))))))
+
+(define (scale-point point scale)
+ (make-point
+ (* (point-x point) scale)
+ (* (point-y point) scale)))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master geom triangle)
+ #:use-module (ice-9 receive)
+ #:use-module (srfi srfi-9)
+ #:use-module (dungeon-master geom point)
+ #:export (make-triangle
+ triangle?
+ triangle-points
+ triangle-center
+ triangle-radius
+ triangle-has-edge))
+
+(define-record-type <triangle>
+ (make-raw-triangle points center radius)
+ triangle?
+ (points triangle-points)
+ (center triangle-center)
+ (radius triangle-radius))
+
+(define (make-triangle p1 p2 p3)
+ (let ((center (circumcenter p1 p2 p3)))
+ (make-raw-triangle
+ (list p1 p2 p3)
+ center
+ (points-distance center p1))))
+
+(define (circumcenter p1 p2 p3)
+ (receive (a b c)
+ (perpendicular-line-from-points p1 p2)
+ (receive (e f g)
+ (perpendicular-line-from-points p2 p3)
+ (let ((determinant (- (* a f) (* e b))))
+ (make-point
+ (/ (- (* f c) (* b g)) determinant)
+ (/ (- (* a g) (* e c)) determinant))))))
+
+(define (perpendicular-line-from-points p1 p2)
+ (let ((x1 (point-x p1))
+ (y1 (point-y p1))
+ (x2 (point-x p2))
+ (y2 (point-y p2)))
+ (let* ((a (- y2 y1))
+ (b (- x1 x2))
+ (c (+ (* a x1) (* b y2))))
+ (let ((mid-x (/ (+ x1 x2) 2))
+ (mid-y (/ (+ y1 y2) 2)))
+ (values (- b)
+ a
+ (+ (* (- b) mid-x) (* a mid-y)))))))
+
+(define (triangle-has-edge triangle a b)
+ (let ((points (triangle-points triangle)))
+ (let ((p1 (car points))
+ (p2 (cadr points))
+ (p3 (caddr points)))
+ (or (and (equal? p1 a) (equal? p2 b))
+ (and (equal? p1 b) (equal? p2 a))
+ (and (equal? p2 a) (equal? p3 b))
+ (and (equal? p2 b) (equal? p3 a))
+ (and (equal? p3 a) (equal? p1 b))
+ (and (equal? p3 b) (equal? p1 a))))))
--- /dev/null
+;;; Dungeon Master --- RPG Adventure Generator
+;;; Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; Dungeon Master is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Dungeon Master is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (dungeon-master geom voronoi)
+ #:use-module (ice-9 receive)
+ #:use-module (rnrs sorting)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-9)
+ #:use-module (dungeon-master geom)
+ #:use-module (dungeon-master geom point)
+ #:use-module (dungeon-master geom triangle)
+ #:use-module (dungeon-master geom bowyer-watson)
+ #:export (make-voronoi-mesh
+ voronoi-mesh?
+ voronoi-mesh-triangles
+ voronoi-mesh-points
+ voronoi-mesh-frame
+ voronoi-mesh-regions
+ voronoi-mesh-relax))
+
+"https://github.com/watabou/TownGeneratorOS/blob/master/Source/com/watabou/geom/Voronoi.hx"
+
+;;; Voronoi mesh region
+
+(define-record-type <voronoi-region>
+ (make-raw-voronoi-region seed vertices)
+ voronoi-region?
+ (seed voronoi-region-seed)
+ (vertices voronoi-region-vertices))
+
+(define (make-voronoi-region seed vertices)
+ (define (compare-angles triangle1 triangle2)
+ (let ((c1 (triangle-center triangle1))
+ (c2 (triangle-center triangle2)))
+ (> (angle-sign seed c1 c2) 0)))
+ (make-raw-voronoi-region seed (list-sort compare-angles vertices)))
+
+(define (voronoi-region-center region)
+ (let* ((vertices (voronoi-region-vertices region))
+ (centers (map (lambda (v) (triangle-center v)) vertices)))
+ (scale-point
+ (apply sum-points centers)
+ (/ 1 (length vertices)))))
+
+
+;;; Voronoi mesh
+
+(define-record-type <voronoi-mesh>
+ (make-raw-voronoi-mesh triangles points frame regions)
+ voronoi-mesh?
+ (triangles voronoi-mesh-triangles)
+ (points voronoi-mesh-points)
+ (frame voronoi-mesh-frame)
+ (regions voronoi-mesh-regions))
+
+(define (make-voronoi-mesh vertices)
+ ;; Delaunay triangulation
+ (receive (triangles points frame)
+ (bowyer-watson vertices)
+ (make-raw-voronoi-mesh
+ triangles
+ points
+ frame
+ (make-regions points triangles))))
+
+(define (partitioning voronoi)
+ (define (is-real-triangle triangle)
+ ;; real triangle points cannot be frame points
+ (let ((frame (voronoi-mesh-frame voronoi)))
+ (let check-points ((points (triangle-points triangle)))
+ (cond ((null? points)
+ #t) ; triangle is real
+ (else
+ (and (not (member (car points) frame))
+ (check-points (cdr points))))))))
+
+ (define (is-real-region region)
+ ;; real region points cannot be frame points
+ (let check-vertices ((vertices (voronoi-region-vertices region)))
+ (cond ((null? vertices)
+ #t) ; region is real
+ (else
+ (and (is-real-triangle (car vertices))
+ (check-vertices (cdr vertices)))))))
+
+ (let* ((points (voronoi-mesh-points voronoi))
+ (regions (voronoi-mesh-regions voronoi))
+ ;; we need the regions in the same order as points are
+ (ordered-regions
+ (map-in-order
+ (lambda (p)
+ (assoc-ref regions p))
+ points))
+ ;; only real regions without frame points
+ (filtered-regions
+ (filter (lambda (r) (is-real-region r))
+ ordered-regions)))
+ filtered-regions))
+
+(define* (voronoi-mesh-relax voronoi #:optional (points-to-relax '()))
+ (let ((regions
+ (map
+ (lambda (r) (cons (voronoi-region-seed r) (voronoi-region-center r)))
+ (partitioning voronoi)))
+ (points
+ (filter
+ (lambda (p) (not (member p (voronoi-mesh-frame voronoi))))
+ (voronoi-mesh-points voronoi)))
+ (to-relax
+ (if (null? points-to-relax)
+ (voronoi-mesh-points voronoi)
+ points-to-relax)))
+ (make-voronoi-mesh
+ (map
+ (lambda (point)
+ (let ((center (assoc-ref regions point)))
+ (if (and center (member point to-relax))
+ center
+ point)))
+ points))))
+
+(define (make-regions points triangles)
+ (map-in-order
+ (lambda (p)
+ (let ((vertices
+ (filter
+ (lambda (tr) (member p (triangle-points tr)))
+ triangles)))
+ (cons p (make-voronoi-region p vertices))))
+ points))
*/
#include <irrlicht/irrlicht.h>
-#include "mods.h"
+#include "modules.h"
using namespace irr;
using namespace core;
int
main ()
{
- load_dmaster_mods ();
+ load_dmaster_modules ();
IrrlichtDevice* device =
createDevice (video::EDT_OPENGL, core::dimension2d<u32> (640, 480));
+++ /dev/null
-/* Dungeon Master --- RPG Adventure Generator
- Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-
- Dungeon Master is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- Dungeon Master is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <dirent.h>
-#include <libguile.h>
-#include "generators.h"
-#include "mods.h"
-#include "paths.h"
-
-SCM
-register_scene_generator (SCM name,
- SCM type,
- SCM proc)
-{
- SceneGenerator* generator =
- register_generator (scm_to_utf8_string (name),
- scm_to_utf8_string (scm_symbol_to_string (type)),
- proc);
- printf ("Register: %s (%s)\n", generator->name, generator->type);
- scm_call_1 (generator->proc, scm_from_int (-1));
- return SCM_UNSPECIFIED;
-}
-
-void
-init_dungeon_master_module (void *unused)
-{
- scm_c_define_gsubr ("register-scene-generator", 3, 0, 0, (scm_t_subr) register_scene_generator);
- scm_c_export ("register-scene-generator", NULL);
-}
-
-void
-scm_init_dungeon_master_module ()
-{
- scm_c_define_module ("dungeon-master", init_dungeon_master_module, NULL);
-}
-
-void
-add_to_load_path (std::string path)
-{
- // Add path to %load-path variable, needed for mods structured like modules
- std::string exp = "(add-to-load-path \"" + path + "\")";
- scm_c_eval_string (exp.c_str ());
-}
-
-void
-load_dmaster_mods ()
-{
- scm_init_guile ();
- scm_init_dungeon_master_module ();
-
- std::set<std::string> paths = get_dmaster_paths ();
- DIR* mods_dir;
- struct dirent* mod;
- std::string
- mods_path,
- mod_main;
-
- for (const std::string &path : paths)
- {
- mods_path = path + PATH_DELIM + "mods";
- add_to_load_path (mods_path);
- mods_dir = opendir (mods_path.c_str ());
- if (mods_dir != NULL)
- {
- while (mod = readdir (mods_dir))
- {
- if (strstr (mod->d_name, ".scm") != NULL) {
- mod_main = mods_path + PATH_DELIM + mod->d_name;
- scm_primitive_load (scm_from_locale_string (mod_main.c_str ()));
- }
- }
- }
- closedir (mods_dir);
- }
-}
+++ /dev/null
-/* Dungeon Master --- RPG Adventure Generator
- Copyright © 2019 Javier Sancho <jsf@jsancho.org>
-
- Dungeon Master is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- Dungeon Master is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-void
-load_dmaster_mods ();
--- /dev/null
+/* Dungeon Master --- RPG Adventure Generator
+ Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+
+ Dungeon Master is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ Dungeon Master is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <dirent.h>
+#include <libguile.h>
+#include "generators.h"
+#include "modules.h"
+#include "paths.h"
+
+SCM
+register_scene_generator (SCM name,
+ SCM type,
+ SCM proc)
+{
+ SceneGenerator* generator =
+ register_generator (scm_to_utf8_string (name),
+ scm_to_utf8_string (scm_symbol_to_string (type)),
+ proc);
+ printf ("Register: %s (%s)\n", generator->name, generator->type);
+ scm_call_1 (generator->proc, scm_from_int (-1));
+ return SCM_UNSPECIFIED;
+}
+
+void
+init_dungeon_master_module (void *unused)
+{
+ scm_c_define_gsubr ("register-scene-generator", 3, 0, 0, (scm_t_subr) register_scene_generator);
+ scm_c_export ("register-scene-generator", NULL);
+}
+
+void
+scm_init_dungeon_master_module ()
+{
+ scm_c_define_module ("dungeon-master", init_dungeon_master_module, NULL);
+}
+
+void
+add_to_load_path (std::string path)
+{
+ // Add path to %load-path variable, needed for modules loading
+ std::string exp = "(add-to-load-path \"" + path + "\")";
+ scm_c_eval_string (exp.c_str ());
+}
+
+void
+load_dmaster_modules ()
+{
+ scm_init_guile ();
+ scm_init_dungeon_master_module ();
+
+ std::set<std::string> paths = get_dmaster_paths ();
+ DIR* modules_dir;
+ struct dirent* module;
+ std::string
+ modules_path,
+ module_main;
+
+ for (const std::string &path : paths)
+ {
+ modules_path = path + PATH_DELIM + "modules";
+ add_to_load_path (modules_path);
+ modules_dir = opendir (modules_path.c_str ());
+ if (modules_dir != NULL)
+ {
+ while (module = readdir (modules_dir))
+ {
+ if (strstr (module->d_name, ".scm") != NULL) {
+ module_main = modules_path + PATH_DELIM + module->d_name;
+ scm_primitive_load (scm_from_locale_string (module_main.c_str ()));
+ }
+ }
+ }
+ closedir (modules_dir);
+ }
+}
--- /dev/null
+/* Dungeon Master --- RPG Adventure Generator
+ Copyright © 2019 Javier Sancho <jsf@jsancho.org>
+
+ Dungeon Master is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ Dungeon Master is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Dungeon Master. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+void
+load_dmaster_modules ();