1
2(kern-mk-sound 'sound-damage         "damage.wav")
3(kern-mk-sound 'sound-walking        "walk.wav")
4;(kern-mk-sound 'sound-splashing      "rowing.wav")
5(kern-mk-sound 'sound-splashing      "water2.wav")
6(kern-mk-sound 'sound-squishing      "walk.wav") ;; fixme
7(kern-mk-sound 'sound-moongate-enter "enter_moongate.wav")
8(kern-mk-sound 'sound-cannon-fire    "cannon.wav")
9(kern-mk-sound 'sound-clock          "ticktock.wav")
10(kern-mk-sound 'sound-clock-chime    "gong.wav")
11(kern-mk-sound 'sound-river          "river.wav")
12(kern-mk-sound 'sound-wind          "wind_1a.wav")
13(kern-mk-sound 'sound-missile          "swish.wav")
14(kern-mk-sound 'sound-explode          "boom.wav")
15(kern-mk-sound 'sound-lightning        "lightning.wav")
16(kern-mk-sound 'sound-fireblast       "fireblast.wav")
17
18;; Aliases
19(define sound-ship-move sound-splashing)
20
21;; ambient sound 'object'
22
23(define ambience-ifc
24    (ifc '()
25         (method 'exec
26                 (lambda (ksound)
27                   (kern-sound-play-ambient (eval (gob ksound)) (kern-obj-get-location ksound))
28                   ))
29         (method 'on-entry
30                 (lambda (ksound)
31                   (kern-sound-play-ambient (eval (gob ksound)) (kern-obj-get-location ksound))
32                   ))
33         ))
34
35(mk-obj-type 't_ambience nil
36             '()
37             layer-mechanism ambience-ifc)
38
39(define (mk-ambient-sound soundtag)
40  (let ((ksound (kern-mk-obj t_ambience 1)))
41    (bind ksound soundtag)
42    ksound))
43
44;;==========================================================================
45;; music
46
47(define default-music "music/ballad.ogg")
48
49(define (music-list . entries)
50	(if (null? entries)
51		(list default-music)
52		entries
53	)
54)
55
56(load "music/music.scm")
57
58(println ml-battle-music)
59
60(define music (list nil nil))
61
62(define (music-play-track file)
63	(set-car! music file)
64	(kern-music-play file)
65)
66
67(define (music-handler filelist)
68	(set-car! (cdr music) filelist)
69	(if (or (null? (car music))
70				(not (in-text-list? (car music) filelist)))
71		(music-play-track (random-select (cadr music)))
72	))
73
74(define (music-cue filelist)
75	(set-car! (cdr music) filelist)
76	)
77
78(define (music-cue-ref listref)
79	(let ((cuelist (safe-eval listref)))
80		(if (not (null? cuelist))
81			(music-cue cuelist))
82	))
83
84(define (music-fake-current)
85	(if (not (null? (cadr music)))
86			(set-car! music (car (cadr music)))
87		))
88
89(music-handler (list default-music))
90
91(define (music-change-handler player)
92	(if (not (null? (cadr music)))
93			(music-play-track (random-select (cadr music)))
94		)
95	)
96
97(kern-add-hook 'music_change_hook 'music-change-handler)
98
99;;combo play + cue, with sensible eval and null behaviour
100(define (music-set-pair immediate therafter)
101	(let* ((imm (safe-eval immediate))
102			(ther (safe-eval therafter))
103			(cuelist (if (null? imm)
104								nil
105								ther))
106			(playlist (if (null? imm)
107								ther
108								imm))
109			)
110		(if (not (null? playlist))
111			(music-handler playlist))
112		(if (not (null? cuelist))
113			(music-cue cuelist))
114	))
115
116
117;;==================================================================================
118;; interactive music handler
119
120(mk-obj-type 't_sounddata nil nil layer-none nil)
121
122;; use kern-set-combat-state-listener to call this
123;; do it on system startup too (kern-set-gamestart-hook)
124(define (music-on-combat-change player)
125  (let ((playerloc (player-member-loc)))
126    (if (notnull? playerloc)
127        (let ((dataslist (kplace-get-objects-of-type playerloc t_sounddata)))
128          (if (notnull? dataslist)
129              (let* ((sounddata (gob (car dataslist)))
130                     (oldstate (car sounddata))
131                     (newstate (null? (all-hostiles (car (kern-party-get-members player)))))
132                     )
133                (set-car! sounddata newstate)
134                (if newstate
135                    (if oldstate
136                        (music-set-pair nil (list-ref sounddata 1))
137                        (music-set-pair (list-ref sounddata 4) (list-ref sounddata 1))
138                        )
139                    (if oldstate
140                        (music-set-pair (list-ref sounddata 2) (list-ref sounddata 3))
141                        (music-set-pair nil (list-ref sounddata 3))
142                        )
143                    )
144                ))
145          ))))
146
147;; use place entry hooks to call this
148(define (music-on-combat-entry playerloc player)
149	(let ((dataslist (kplace-get-objects-of-type playerloc t_sounddata)))
150		(if (not (null? dataslist))
151			(let ((sounddata (gob (car dataslist)))
152					(newstate (null? (all-hostiles (car (kern-party-get-members player)))))
153					)
154				(set-car! sounddata newstate)
155				(if newstate
156					(music-set-pair nil (list-ref sounddata 1))
157					(music-set-pair (list-ref sounddata 2) (list-ref sounddata 3))
158				)
159				(music-fake-current)
160			))
161	))
162
163;; use this to make data object
164(define (mk-sounddata normal engagement combat victory)
165	(bind (kern-obj-set-visible (kern-mk-obj t_sounddata 1) #f)
166		(list #t normal engagement combat victory)
167	))
168
169;;normal combat music entries
170(define (mk-basic-musicdata noncombatml)
171	(mk-sounddata noncombatml 'ml-battle-intro 'ml-battle-music 'ml-battle-over))
172
173;;world music entries dont use combat stuff
174(define (mk-world-musicdata noncombatml)
175	(mk-sounddata noncombatml nil noncombatml nil))
176
177;; do-it-all method- adds an object and the hook to a place
178(define (mk-place-music place noncombatml)
179	(kern-obj-put-at (mk-basic-musicdata noncombatml) (list place 0 0))
180	(kern-place-add-on-entry-hook place 'music-on-combat-entry))
181
182