Class: Quake::Sound::Events

Inherits:
Object
  • Object
show all
Defined in:
lib/quake/sound/events.rb

Overview

Maps game events to sound file paths and plays them.

Constant Summary collapse

PICKUP_SOUNDS =

Item pickup sounds

{
  health: "items/health1.wav",
  armor: "items/armor1.wav",
  ammo: "weapons/lock4.wav",
  weapon: "weapons/pkup.wav",
  powerup: "items/protect.wav"
}.freeze
DOOR_SOUNDS =

Door/platform sounds

{
  open: "doors/medtry.wav",
  close: "doors/medclose.wav"
}.freeze
PLAT_SOUNDS =
{
  move: "plats/medplat1.wav",
  stop: "plats/medplat2.wav"
}.freeze
PLAYER_SOUNDS =

Player sounds

{
  jump: "player/plyrjmp8.wav",
  swim1: "misc/water1.wav",
  swim2: "misc/water2.wav",
  land: "player/land.wav",
  land_hurt: "player/land2.wav",
  water_land: "player/h2ojump.wav",
  axe_body_hit: "player/axhit1.wav",
  axe_wall_hit: "player/axhit2.wav",
  water_enter: "player/inh2o.wav",
  water_exit: "misc/outwater.wav",
  lava_enter: "player/inlava.wav",
  slime_enter: "player/slimbrn2.wav",
  burn1: "player/lburn1.wav",
  burn2: "player/lburn2.wav",
  pain1: "player/pain1.wav",
  pain2: "player/pain2.wav",
  pain3: "player/pain3.wav",
  pain4: "player/pain4.wav",
  pain5: "player/pain5.wav",
  pain6: "player/pain6.wav",
  death1: "player/death1.wav",
  death2: "player/death2.wav",
  death3: "player/death3.wav",
  death4: "player/death4.wav",
  death5: "player/death5.wav",
  water_death: "player/h2odeath.wav",
  teledeath: "player/teledth1.wav",
  gib: "player/gib.wav",
  udeath: "player/udeath.wav",
  gasp: "player/gasp1.wav",
  gasp_deep: "player/gasp2.wav",
  drown1: "player/drown1.wav",
  drown2: "player/drown2.wav",
  quad_attack: "items/damage3.wav",
  ring_expiring: "items/inv2.wav",
  pentagram_expiring: "items/protect2.wav",
  biosuit_expiring: "items/suit2.wav",
  quad_expiring: "items/damage2.wav",
  pentagram_protect: "items/protect3.wav",
  ring_idle: ["items/inv3.wav", 0.5]
}.freeze
AMBIENT_SOUNDS =
{
  "light_fluoro" => ["ambience/fl_hum1.wav", 0.5],
  "light_fluorospark" => ["ambience/buzz1.wav", 0.5],
  "light_torch_small_walltorch" => ["ambience/fire1.wav", 0.5],
  "light_flame_large_yellow" => ["ambience/fire1.wav", 0.5],
  "light_flame_small_yellow" => ["ambience/fire1.wav", 0.5],
  "light_flame_small_white" => ["ambience/fire1.wav", 0.5],
  "ambient_suck_wind" => ["ambience/suck1.wav", 1.0],
  "ambient_drone" => ["ambience/drone6.wav", 0.5],
  "ambient_flouro_buzz" => ["ambience/buzz1.wav", 1.0],
  "ambient_drip" => ["ambience/drip1.wav", 0.5],
  "ambient_comp_hum" => ["ambience/comp1.wav", 1.0],
  "ambient_thunder" => ["ambience/thunder1.wav", 0.5],
  "ambient_light_buzz" => ["ambience/fl_hum1.wav", 0.5],
  "ambient_swamp1" => ["ambience/swamp1.wav", 0.5],
  "ambient_swamp2" => ["ambience/swamp2.wav", 0.5],
  "trigger_teleport" => ["ambience/hum1.wav", 0.5]
}.freeze
NOISEMAKER_SOUNDS =
[
  "enforcer/enfire.wav",
  "enforcer/enfstop.wav",
  "enforcer/sight1.wav",
  "enforcer/sight2.wav",
  "enforcer/sight3.wav",
  "enforcer/sight4.wav",
  "enforcer/pain1.wav"
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(mixer) ⇒ Events

Returns a new instance of Events.



100
101
102
# File 'lib/quake/sound/events.rb', line 100

def initialize(mixer)
  @mixer = mixer
end

Instance Method Details

#on_ambient_entity(entity) ⇒ Object



170
171
172
173
174
175
176
177
178
179
# File 'lib/quake/sound/events.rb', line 170

def on_ambient_entity(entity)
  return unless @mixer&.loaded?
  return if entity.classname == "trigger_teleport" && (entity.spawnflags & 2) != 0

  sound = AMBIENT_SOUNDS[entity.classname]
  return unless sound

  path, volume, count = sound
  (count || 1).times { @mixer.play(path, volume: (volume * 128).to_i, loop_count: -1) }
end

#on_door(action) ⇒ Object



111
112
113
114
115
# File 'lib/quake/sound/events.rb', line 111

def on_door(action)
  return unless @mixer&.loaded?
  sound = DOOR_SOUNDS[action]
  @mixer.play(sound) if sound
end

#on_grenade_bounceObject



164
165
166
167
168
# File 'lib/quake/sound/events.rb', line 164

def on_grenade_bounce
  return unless @mixer&.loaded?

  @mixer.play("weapons/bounce.wav")
end

#on_misc_noisemaker(_entity) ⇒ Object



146
147
148
149
150
# File 'lib/quake/sound/events.rb', line 146

def on_misc_noisemaker(_entity)
  return unless @mixer&.loaded?

  NOISEMAKER_SOUNDS.each { |sound| @mixer.play(sound) }
end

#on_pickup(event) ⇒ Object



104
105
106
107
108
109
# File 'lib/quake/sound/events.rb', line 104

def on_pickup(event)
  return unless @mixer&.loaded?
  sound = event[:sound] || PICKUP_SOUNDS[event[:type]]
  @mixer.play(sound) if sound
  event[:extra_sounds]&.each { |extra| @mixer.play(extra) }
end

#on_player(action) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/quake/sound/events.rb', line 117

def on_player(action)
  return unless @mixer&.loaded?
  sound = PLAYER_SOUNDS[action]
  return unless sound

  if sound.is_a?(Array)
    path, volume = sound
    @mixer.play(path, volume: (volume * 128).to_i)
  else
    @mixer.play(sound)
  end
end

#on_teleport_fog(sound) ⇒ Object



158
159
160
161
162
# File 'lib/quake/sound/events.rb', line 158

def on_teleport_fog(sound)
  return unless @mixer&.loaded?

  @mixer.play(sound)
end

#on_trigger(entity) ⇒ Object



135
136
137
138
139
140
# File 'lib/quake/sound/events.rb', line 135

def on_trigger(entity)
  return unless @mixer&.loaded?

  sound = entity.instance_variable_get(:@noise)
  @mixer.play(sound) if sound
end

#on_trigger_push_playerObject



152
153
154
155
156
# File 'lib/quake/sound/events.rb', line 152

def on_trigger_push_player
  return unless @mixer&.loaded?

  @mixer.play("ambience/windfly.wav")
end

#on_trigger_secret(entity) ⇒ Object



142
143
144
# File 'lib/quake/sound/events.rb', line 142

def on_trigger_secret(entity)
  on_trigger(entity)
end

#on_weapon_fire(event) ⇒ Object



130
131
132
133
# File 'lib/quake/sound/events.rb', line 130

def on_weapon_fire(event)
  return unless @mixer&.loaded?
  @mixer.play(event.sound) if event&.sound
end