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