| 1 | module main |
| 2 | |
| 3 | struct Abc { |
| 4 | pub mut: |
| 5 | x int |
| 6 | y int |
| 7 | angle int |
| 8 | } |
| 9 | |
| 10 | fn s_adjustsoundparams(listener &Abc, source &Abc, vol &int, sep &int) int { |
| 11 | approx_dist := 0 |
| 12 | adx := 0 |
| 13 | ady := 0 |
| 14 | angle := 0 |
| 15 | adx = C.abs(listener.x - source.x) |
| 16 | ady = C.abs(listener.y - source.y) |
| 17 | approx_dist = adx + ady - ((if adx < ady { adx } else { ady }) >> 1) |
| 18 | if gamemap != 8 && approx_dist > (1200 * (1 << 16)) { |
| 19 | return 0 |
| 20 | } |
| 21 | angle = r_pointtoangle2(listener.x, listener.y, source.x, source.y) |
| 22 | if angle > listener.angle { |
| 23 | angle = angle - listener.angle |
| 24 | } else { |
| 25 | angle = angle + (4294967295 - listener.angle) |
| 26 | } |
| 27 | angle >>= 19 |
| 28 | *sep = 128 - (fixedmul((96 * (1 << 16)), finesine[angle]) >> 16) |
| 29 | if approx_dist < (200 * (1 << 16)) { |
| 30 | *vol = snd_SfxVolume |
| 31 | } else if gamemap == 8 { |
| 32 | if approx_dist > (1200 * (1 << 16)) { |
| 33 | approx_dist = (1200 * (1 << 16)) |
| 34 | } |
| 35 | *vol = 15 + ((snd_SfxVolume - 15) * (((1200 * (1 << 16)) - |
| 36 | approx_dist) >> 16)) / (((1200 * (1 << 16)) - (200 * (1 << 16))) >> 16) |
| 37 | } else { |
| 38 | *vol = (snd_SfxVolume * (((1200 * (1 << 16)) - approx_dist) >> 16)) / (((1200 * (1 << 16)) - (200 * (1 << 16))) >> 16) |
| 39 | } |
| 40 | return *vol > 0 |
| 41 | } |
| 42 | |