Compare commits
11 Commits
testing
...
80fe2caff3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80fe2caff3 | ||
|
|
2df86c9c76 | ||
|
|
5fa90f9e84 | ||
|
|
658709ebce | ||
|
|
d5c79c0770 | ||
|
|
24f9a126d4 | ||
|
|
c316d4e570 | ||
|
|
e66655d75f | ||
|
|
c5406d5089 | ||
|
|
b5b472eebe | ||
|
|
9f03de15b8 |
117
__init__.py
117
__init__.py
@@ -32,6 +32,7 @@ except ImportError:
|
|||||||
import math
|
import math
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
|
import wx
|
||||||
|
|
||||||
localConfig = configparser.ConfigParser()
|
localConfig = configparser.ConfigParser()
|
||||||
globalConfig = configparser.ConfigParser()
|
globalConfig = configparser.ConfigParser()
|
||||||
@@ -116,6 +117,18 @@ def read_config(readGlobal = False):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_input(prompt = "Enter text:", text = ""):
|
||||||
|
app = wx.App(False)
|
||||||
|
dialog = wx.TextEntryDialog(None, prompt, "Input", text)
|
||||||
|
dialog.SetValue(text)
|
||||||
|
if dialog.ShowModal() == wx.ID_OK:
|
||||||
|
userInput = dialog.GetValue()
|
||||||
|
else:
|
||||||
|
userInput = None
|
||||||
|
dialog.Destroy()
|
||||||
|
return userInput
|
||||||
|
|
||||||
def speak(text, interupt=True):
|
def speak(text, interupt=True):
|
||||||
if speechProvider == "speechd":
|
if speechProvider == "speechd":
|
||||||
if interupt: spd.cancel()
|
if interupt: spd.cancel()
|
||||||
@@ -297,15 +310,29 @@ def calculate_volume_and_pan(player_pos, obj_pos):
|
|||||||
left = right = 1
|
left = right = 1
|
||||||
return volume, left, right
|
return volume, left, right
|
||||||
|
|
||||||
def obj_play(sounds, soundName, player_pos, obj_pos):
|
def obj_play(sounds, soundName, player_pos, obj_pos, loop=True):
|
||||||
|
"""Play a sound with positional audio.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sounds: Dictionary of sound objects
|
||||||
|
soundName: Name of sound to play
|
||||||
|
player_pos: Player's position for audio panning
|
||||||
|
obj_pos: Object's position for audio panning
|
||||||
|
loop: Whether to loop the sound (default True)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The sound channel object, or None if out of range
|
||||||
|
"""
|
||||||
volume, left, right = calculate_volume_and_pan(player_pos, obj_pos)
|
volume, left, right = calculate_volume_and_pan(player_pos, obj_pos)
|
||||||
if volume == 0:
|
if volume == 0:
|
||||||
return None # Don't play if out of range
|
return None # Don't play if out of range
|
||||||
# Play the sound on a new channel
|
# Play the sound on a new channel
|
||||||
x = sounds[soundName].play(-1)
|
x = sounds[soundName].play(-1 if loop else 0) # -1 for loop, 0 for once
|
||||||
# Apply the volume and pan
|
# Apply the volume and pan
|
||||||
x.set_volume(volume * left, volume * right)
|
if x:
|
||||||
|
x.set_volume(volume * left, volume * right)
|
||||||
return x
|
return x
|
||||||
|
|
||||||
def obj_update(x, player_pos, obj_pos):
|
def obj_update(x, player_pos, obj_pos):
|
||||||
if x is None:
|
if x is None:
|
||||||
return None
|
return None
|
||||||
@@ -356,6 +383,80 @@ def play_random(sounds, soundName, pause = False, interrupt = False):
|
|||||||
if pause == True:
|
if pause == True:
|
||||||
time.sleep(sounds[randomKey].get_length())
|
time.sleep(sounds[randomKey].get_length())
|
||||||
|
|
||||||
|
def play_random_positional(sounds, soundName, playerX, objectX):
|
||||||
|
"""Play a random sound with positional audio.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sounds: Dictionary of sound objects
|
||||||
|
soundName: Base name of sound (e.g. 'falling_skull' will match 'falling_skull1', 'falling_skull2', etc.)
|
||||||
|
playerX: Player's x position for audio panning
|
||||||
|
objectX: Object's x position for audio panning
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The sound channel object for updating position
|
||||||
|
"""
|
||||||
|
keys = [k for k in sounds.keys() if k.startswith(soundName)]
|
||||||
|
if not keys:
|
||||||
|
return None
|
||||||
|
|
||||||
|
randomKey = random.choice(keys)
|
||||||
|
volume, left, right = calculate_volume_and_pan(playerX, objectX)
|
||||||
|
if volume == 0:
|
||||||
|
return None
|
||||||
|
|
||||||
|
channel = sounds[randomKey].play()
|
||||||
|
if channel:
|
||||||
|
channel.set_volume(volume * left, volume * right)
|
||||||
|
return channel
|
||||||
|
|
||||||
|
def play_random_falling(sounds, soundName, playerX, objectX, startY, currentY=0, maxY=20, existingChannel=None):
|
||||||
|
"""Play or update a random sound with positional audio that increases in volume as it 'falls'.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sounds: Dictionary of sound objects
|
||||||
|
soundName: Base name of sound (e.g. 'falling_skull' will match 'falling_skull1', 'falling_skull2', etc.)
|
||||||
|
playerX: Player's x position for audio panning
|
||||||
|
objectX: Object's x position for audio panning
|
||||||
|
startY: Starting Y position (0-20, higher = quieter start)
|
||||||
|
currentY: Current Y position (0 = ground level)
|
||||||
|
maxY: Maximum Y value (default 20)
|
||||||
|
existingChannel: Existing sound channel to update instead of creating new one (default None)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The sound channel object for updating position/volume, or None if sound should stop
|
||||||
|
"""
|
||||||
|
# Calculate horizontal positioning
|
||||||
|
volume, left, right = calculate_volume_and_pan(playerX, objectX)
|
||||||
|
|
||||||
|
# Calculate vertical fall volume multiplier (0 at maxY, 1 at y=0)
|
||||||
|
fallMultiplier = 1 - (currentY / maxY)
|
||||||
|
|
||||||
|
# Adjust final volumes
|
||||||
|
finalVolume = volume * fallMultiplier
|
||||||
|
finalLeft = left * finalVolume
|
||||||
|
finalRight = right * finalVolume
|
||||||
|
|
||||||
|
if existingChannel is not None:
|
||||||
|
if volume == 0: # Out of audible range
|
||||||
|
existingChannel.stop()
|
||||||
|
return None
|
||||||
|
existingChannel.set_volume(finalLeft, finalRight)
|
||||||
|
return existingChannel
|
||||||
|
else: # Need to create new channel
|
||||||
|
if volume == 0: # Don't start if out of range
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Find matching sound files
|
||||||
|
keys = [k for k in sounds.keys() if k.startswith(soundName)]
|
||||||
|
if not keys:
|
||||||
|
return None
|
||||||
|
|
||||||
|
randomKey = random.choice(keys)
|
||||||
|
channel = sounds[randomKey].play()
|
||||||
|
if channel:
|
||||||
|
channel.set_volume(finalLeft, finalRight)
|
||||||
|
return channel
|
||||||
|
|
||||||
def instructions():
|
def instructions():
|
||||||
# Read in the instructions file
|
# Read in the instructions file
|
||||||
try:
|
try:
|
||||||
@@ -406,6 +507,16 @@ def display_text(text):
|
|||||||
event = pygame.event.clear()
|
event = pygame.event.clear()
|
||||||
time.sleep(0.001)
|
time.sleep(0.001)
|
||||||
|
|
||||||
|
def messagebox(text):
|
||||||
|
speak(text + "\nPress any key to repeat or enter to continue.")
|
||||||
|
while True:
|
||||||
|
event = pygame.event.wait()
|
||||||
|
if event.type == pygame.KEYDOWN:
|
||||||
|
if event.key == pygame.K_ESCAPE or event.key == pygame.K_RETURN:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
speak(text + "\nPress any key to repeat or enter to continue.")
|
||||||
|
|
||||||
def learn_sounds(sounds):
|
def learn_sounds(sounds):
|
||||||
loop = True
|
loop = True
|
||||||
pygame.mixer.music.pause()
|
pygame.mixer.music.pause()
|
||||||
|
|||||||
Reference in New Issue
Block a user