package org.open2jam;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import org.lwjgl.opengl.DisplayMode;
import org.open2jam.parsers.Event;
/**
* This class will store game options such as hi-speed and autoplay.
* @author SilverHx
*/
public class GameOptions {
/*
* "Hi-Speed"=>0, "xR-Speed"=>1, "W-Speed"=>2, "Regul-Speed"=>3
*/
public enum SpeedType {
HiSpeed, xRSpeed, WSpeed, RegulSpeed;
@Override
public String toString() {
return super.toString().replace("Speed", "-Speed:");
}
}
/**
* Judgment type
*/
public enum JudgmentType {
BeatJudgment, TimeJudgment;
}
/*
* "None"=>0, "Hidden"=>1, "Sudden"=>2, "Dark"=>3
*/
public enum VisibilityMod {
None, Hidden, Sudden, Dark;
}
/*
* "None"=>0, "Mirror"=>1, "Shuffle"=>2, "Random"=>3
*/
public enum ChannelMod {
None, Mirror, Shuffle, Random;
}
// fields
private double speedMultiplier = 1.0;
private SpeedType speedType = SpeedType.HiSpeed;
private VisibilityMod visibilityModifier = VisibilityMod.None;
private ChannelMod channelModifier = ChannelMod.None;
private JudgmentType judgmentType = JudgmentType.BeatJudgment;
float keyVolume = 1.0f;
float bgmVolume = 1.0f;
float masterVolume = 1.0f;
private boolean autoplay = false;
private ArrayList<Boolean> autoplayChannels = generateDefaultAutoplayChannels();
private boolean autosound = false;
// display options
private boolean displayFullscreen = false;
private boolean displayVsync = true;
private int displayWidth = 0;
private int displayHeight = 0;
private int displayBitsPerPixel = 0;
private int displayFrequency = 0;
// sound options
private int bufferSize = 512;
// VLC lib path
private String vlc = "";
// display lag and audio latency
private double displayLag = 0;
private double audioLatency = 0;
//public constructor. give default options
public GameOptions() {
}
private ArrayList<Boolean> generateDefaultAutoplayChannels() {
ArrayList<Boolean> out = new ArrayList<Boolean>();
for(Event.Channel c : Event.Channel.values())
{
if(c.toString().startsWith("NOTE_"))
out.add(c.isAutoplay());
}
return out;
}
/**
* Gets the visibility modifier
* @return the modifier
*/
public VisibilityMod getVisibilityModifier() {
return visibilityModifier;
}
/**
* Sets visibility option value.
* @param new visibility option value
*/
public void setVisibilityModifier(VisibilityMod mod) {
visibilityModifier = mod;
}
/**
* Gets hi-speed value.
* @return hi-speed
*/
public double getSpeedMultiplier() {
return speedMultiplier;
}
/**
* Sets hi-speed value.
* @param new hi-speed value
*/
public void setSpeedMultiplier(double hispeed) {
this.speedMultiplier = hispeed;
}
/**
* get the speed type
* @return
*/
public SpeedType getSpeedType() {
return speedType;
}
/**
* set the speed type
* @param mod
*/
public void setSpeedType(SpeedType mod) {
this.speedType = mod;
}
/**
* Gets channelModifier option value.
* @return a channel modifier
*/
public ChannelMod getChannelModifier() {
return channelModifier;
}
/**
* Sets channelModifier option value.
* @param new channelModifier option value
*/
public void setChannelModifier(ChannelMod mod) {
channelModifier = mod;
}
/**
* Gets key volume in range [0, 1].
* @return key volume
*/
public float getKeyVolume() {
return keyVolume;
}
/**
* Sets key volume in range [0, 1].
* @param new key volume
*/
public void setKeyVolume(float vol) {
keyVolume = (float) clamp(vol, 0, 1);
}
/**
* Gets BGM volume in range [0, 1].
* @return BGM volume
*/
public float getBGMVolume() {
return bgmVolume;
}
/**
* Sets BGM volume in range [0, 1].
* @param new BGM volume
*/
public void setBGMVolume(float vol) {
bgmVolume = (float) clamp(vol, 0, 1);
}
/**
* Gets master volume in range [0, 1].
* @return master volume
*/
public float getMasterVolume() {
return masterVolume;
}
/**
* Sets master volume in range [0, 1].
* @param new master volume
*/
public void setMasterVolume(float vol) {
masterVolume = (float) clamp(vol, 0, 1);
}
/**
* Gets autoplay option value.
* @return true if autoplay option is enabled, false otherwise
*/
public boolean isAutoplay() {
return autoplay;
}
/**
* Sets autoplay option value.
* @param new autoplay option value
*/
public void setAutoplay(boolean autoplay) {
this.autoplay = autoplay;
}
/**
* Gets autosound option value.
* @return true if autosound option is enabled, false otherwise
*/
public boolean isAutosound() {
return autosound;
}
/**
* Sets autosound option value.
* @param new autosound option value
*/
public void setAutosound(boolean autosound) {
this.autosound = autosound;
}
public void setDisplay(DisplayMode dm) {
this.displayWidth = dm.getWidth();
this.displayHeight = dm.getHeight();
this.displayBitsPerPixel = dm.getBitsPerPixel();
this.displayFrequency = dm.getFrequency();
}
public boolean isDisplaySaved(DisplayMode dm)
{
return dm.getWidth() == displayWidth && dm.getHeight() == displayHeight &&
dm.getBitsPerPixel() == displayBitsPerPixel && dm.getFrequency() == displayFrequency;
}
private double clamp(double value, double min, double max) {
return Math.min(Math.max(value, min), max);
}
public double getAudioLatency() {
return audioLatency;
}
public void setAudioLatency(double audioLatency) {
this.audioLatency = audioLatency;
}
public ArrayList<Boolean> getAutoplayChannels() {
return autoplayChannels;
}
public void setAutoplayChannels(List<Boolean> autoplayChannels) {
this.autoplayChannels = new ArrayList<Boolean>(autoplayChannels);
}
public int getDisplayBitsPerPixel() {
return displayBitsPerPixel;
}
public void setDisplayBitsPerPixel(int displayBitsPerPixel) {
this.displayBitsPerPixel = displayBitsPerPixel;
}
public int getDisplayFrequency() {
return displayFrequency;
}
public void setDisplayFrequency(int displayFrequency) {
this.displayFrequency = displayFrequency;
}
public boolean isDisplayFullscreen() {
return displayFullscreen;
}
public void setDisplayFullscreen(boolean displayFullscreen) {
this.displayFullscreen = displayFullscreen;
}
public int getDisplayHeight() {
return displayHeight;
}
public void setDisplayHeight(int displayHeight) {
this.displayHeight = displayHeight;
}
public double getDisplayLag() {
return displayLag;
}
public void setDisplayLag(double displayLag) {
this.displayLag = displayLag;
}
public boolean isDisplayVsync() {
return displayVsync;
}
public void setDisplayVsync(boolean displayVsync) {
this.displayVsync = displayVsync;
}
public int getDisplayWidth() {
return displayWidth;
}
public void setDisplayWidth(int displayWidth) {
this.displayWidth = displayWidth;
}
public String getVLCLibraryPath() {
return vlc;
}
public void setVLCLibraryPath(String vlc) {
this.vlc = vlc;
}
public JudgmentType getJudgmentType() {
return judgmentType;
}
public void setJudgmentType(JudgmentType judgmentType) {
this.judgmentType = judgmentType;
}
public int getBufferSize() {
return bufferSize;
}
public void setBufferSize(int bufferSize) {
this.bufferSize = bufferSize;
}
private boolean hasteMode;
public static final String PROP_HASTEMODE = "hasteMode";
/**
* Get the value of hasteMode
*
* @return the value of hasteMode
*/
public boolean isHasteMode() {
return hasteMode;
}
/**
* Set the value of hasteMode
*
* @param hasteMode new value of hasteMode
*/
public void setHasteMode(boolean hasteMode) {
boolean oldHasteMode = this.hasteMode;
this.hasteMode = hasteMode;
propertyChangeSupport.firePropertyChange(PROP_HASTEMODE, oldHasteMode, hasteMode);
}
private boolean hasteModeNormalizeSpeed = true;
public static final String PROP_HASTEMODENORMALIZESPEED = "hasteModeNormalizeSpeed";
/**
* Get the value of hasteModeNormalizeSpeed
*
* @return the value of hasteModeNormalizeSpeed
*/
public boolean isHasteModeNormalizeSpeed() {
return hasteModeNormalizeSpeed;
}
/**
* Set the value of hasteModeNormalizeSpeed
*
* @param hasteModeNormalizeSpeed new value of hasteModeNormalizeSpeed
*/
public void setHasteModeNormalizeSpeed(boolean hasteModeNormalizeSpeed) {
boolean oldHasteModeNormalizeSpeed = this.hasteModeNormalizeSpeed;
this.hasteModeNormalizeSpeed = hasteModeNormalizeSpeed;
propertyChangeSupport.firePropertyChange(PROP_HASTEMODENORMALIZESPEED, oldHasteModeNormalizeSpeed, hasteModeNormalizeSpeed);
}
private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
/**
* Add PropertyChangeListener.
*
* @param listener
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
/**
* Remove PropertyChangeListener.
*
* @param listener
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
}