Strip all Phase references, TODO/FUTURE roadmap notes, and internal planning comments from the codebase. Run Prettier for consistent formatting across all Java files.
293 lines
6.4 KiB
Java
293 lines
6.4 KiB
Java
package com.tiedup.remake.util;
|
|
|
|
import com.tiedup.remake.core.ModConfig;
|
|
|
|
/**
|
|
* GagMaterial DNA - Defines the "sound" and behavior of different gag materials.
|
|
*
|
|
*/
|
|
public enum GagMaterial {
|
|
// Original materials
|
|
CLOTH(
|
|
new String[] { "m", "h", "f", "p" },
|
|
new String[] { "ph", "ff", "mm" },
|
|
0.4f,
|
|
15.0,
|
|
"mm",
|
|
"ah", // dominant consonant, vowel
|
|
0.3f,
|
|
0.5f,
|
|
0.9f,
|
|
0.3f,
|
|
0.6f // plosive, fricative, nasal, liquid, vowel bleed
|
|
),
|
|
BALL(
|
|
new String[] { "b", "h", "m", "p" },
|
|
new String[] { "oo", "uu", "mm", "ou" },
|
|
0.2f,
|
|
10.0,
|
|
"mm",
|
|
"uu",
|
|
0.1f,
|
|
0.2f,
|
|
0.9f,
|
|
0.1f,
|
|
0.4f
|
|
),
|
|
TAPE(
|
|
new String[] { "m", "n" },
|
|
new String[] { "mm", "nn", "mnm" },
|
|
0.05f,
|
|
5.0,
|
|
"mm",
|
|
"mm",
|
|
0.0f,
|
|
0.1f,
|
|
0.8f,
|
|
0.0f,
|
|
0.1f
|
|
),
|
|
STUFFED(
|
|
new String[] { "m" },
|
|
new String[] { "mm" },
|
|
0.0f,
|
|
3.0,
|
|
"mm",
|
|
"mm",
|
|
0.0f,
|
|
0.0f,
|
|
0.5f,
|
|
0.0f,
|
|
0.0f
|
|
),
|
|
|
|
PANEL(
|
|
new String[] { "m", "n" },
|
|
new String[] { "mm", "nn" },
|
|
0.05f,
|
|
4.0,
|
|
"mm",
|
|
"mm",
|
|
0.0f,
|
|
0.1f,
|
|
0.7f,
|
|
0.0f,
|
|
0.1f
|
|
),
|
|
LATEX(
|
|
new String[] { "m", "h" },
|
|
new String[] { "mm", "uu" },
|
|
0.1f,
|
|
6.0,
|
|
"mm",
|
|
"uu",
|
|
0.05f,
|
|
0.15f,
|
|
0.8f,
|
|
0.05f,
|
|
0.2f
|
|
),
|
|
RING(
|
|
new String[] { "a", "h", "l" },
|
|
new String[] { "aa", "ah", "la" },
|
|
0.5f,
|
|
12.0,
|
|
"h",
|
|
"ah",
|
|
0.7f,
|
|
0.8f,
|
|
0.95f,
|
|
0.8f,
|
|
0.9f // Very open, most sounds pass
|
|
),
|
|
BITE(
|
|
new String[] { "h", "g", "n" },
|
|
new String[] { "eh", "ah", "ng" },
|
|
0.3f,
|
|
10.0,
|
|
"gh",
|
|
"eh",
|
|
0.4f,
|
|
0.6f,
|
|
0.9f,
|
|
0.5f,
|
|
0.7f
|
|
),
|
|
SPONGE(
|
|
new String[] { "m" },
|
|
new String[] { "mm" },
|
|
0.0f,
|
|
2.0,
|
|
"mm",
|
|
"mm",
|
|
0.0f,
|
|
0.0f,
|
|
0.3f,
|
|
0.0f,
|
|
0.0f // Absorbs almost everything
|
|
),
|
|
BAGUETTE(
|
|
new String[] { "b", "m", "f" },
|
|
new String[] { "om", "am", "um" },
|
|
0.25f,
|
|
8.0,
|
|
"mm",
|
|
"om",
|
|
0.2f,
|
|
0.3f,
|
|
0.8f,
|
|
0.2f,
|
|
0.5f
|
|
);
|
|
|
|
public final String[] consonants;
|
|
public final String[] vowels;
|
|
private final float defaultComprehension;
|
|
private final double defaultTalkRange;
|
|
|
|
private final String dominantConsonant;
|
|
private final String dominantVowel;
|
|
private final float plosiveBleed; // b,d,g,k,p,t - require lip/tongue
|
|
private final float fricativeBleed; // f,h,s,v,z - air-based
|
|
private final float nasalBleed; // m,n - through nose
|
|
private final float liquidBleed; // l,r - tongue-dependent
|
|
private final float vowelBleed; // a,e,i,o,u,y - mouth shape
|
|
|
|
GagMaterial(
|
|
String[] c,
|
|
String[] v,
|
|
float comp,
|
|
double range,
|
|
String domCons,
|
|
String domVowel,
|
|
float plosive,
|
|
float fricative,
|
|
float nasal,
|
|
float liquid,
|
|
float vowel
|
|
) {
|
|
this.consonants = c;
|
|
this.vowels = v;
|
|
this.defaultComprehension = comp;
|
|
this.defaultTalkRange = range;
|
|
this.dominantConsonant = domCons;
|
|
this.dominantVowel = domVowel;
|
|
this.plosiveBleed = plosive;
|
|
this.fricativeBleed = fricative;
|
|
this.nasalBleed = nasal;
|
|
this.liquidBleed = liquid;
|
|
this.vowelBleed = vowel;
|
|
}
|
|
|
|
public float getComprehension() {
|
|
String key = this.name().toLowerCase();
|
|
if (
|
|
ModConfig.SERVER != null &&
|
|
ModConfig.SERVER.gagComprehension.containsKey(key)
|
|
) {
|
|
return ModConfig.SERVER.gagComprehension
|
|
.get(key)
|
|
.get()
|
|
.floatValue();
|
|
}
|
|
return defaultComprehension;
|
|
}
|
|
|
|
public double getTalkRange() {
|
|
String key = this.name().toLowerCase();
|
|
if (
|
|
ModConfig.SERVER != null &&
|
|
ModConfig.SERVER.gagRange.containsKey(key)
|
|
) {
|
|
return ModConfig.SERVER.gagRange.get(key).get();
|
|
}
|
|
return defaultTalkRange;
|
|
}
|
|
|
|
/**
|
|
* Get the dominant consonant sound for this material.
|
|
* Used when a consonant is completely blocked.
|
|
*/
|
|
public String getDominantConsonant() {
|
|
return dominantConsonant;
|
|
}
|
|
|
|
/**
|
|
* Get the dominant vowel sound for this material.
|
|
* Used when a vowel is completely blocked.
|
|
*/
|
|
public String getDominantVowel() {
|
|
return dominantVowel;
|
|
}
|
|
|
|
/**
|
|
* Get bleed-through rate for plosive consonants (b,d,g,k,p,t).
|
|
*/
|
|
public float getPlosiveBleed() {
|
|
return plosiveBleed;
|
|
}
|
|
|
|
/**
|
|
* Get bleed-through rate for fricative consonants (f,h,s,v,z).
|
|
*/
|
|
public float getFricativeBleed() {
|
|
return fricativeBleed;
|
|
}
|
|
|
|
/**
|
|
* Get bleed-through rate for nasal consonants (m,n).
|
|
*/
|
|
public float getNasalBleed() {
|
|
return nasalBleed;
|
|
}
|
|
|
|
/**
|
|
* Get bleed-through rate for liquid consonants (l,r).
|
|
*/
|
|
public float getLiquidBleed() {
|
|
return liquidBleed;
|
|
}
|
|
|
|
/**
|
|
* Get bleed-through rate for vowels.
|
|
*/
|
|
public float getVowelBleed() {
|
|
return vowelBleed;
|
|
}
|
|
|
|
/**
|
|
* Calculate the effective bleed rate for a specific character.
|
|
*/
|
|
public float getBleedRateFor(char c) {
|
|
char lower = Character.toLowerCase(c);
|
|
|
|
// Vowels
|
|
if ("aeiouy".indexOf(lower) >= 0) {
|
|
return vowelBleed;
|
|
}
|
|
|
|
// Nasals - almost always pass
|
|
if (lower == 'm' || lower == 'n') {
|
|
return nasalBleed;
|
|
}
|
|
|
|
// Plosives - blocked by most gags
|
|
if ("bdgkpt".indexOf(lower) >= 0) {
|
|
return plosiveBleed;
|
|
}
|
|
|
|
// Fricatives - air-based
|
|
if ("fhsvz".indexOf(lower) >= 0) {
|
|
return fricativeBleed;
|
|
}
|
|
|
|
// Liquids - tongue-dependent
|
|
if (lower == 'l' || lower == 'r') {
|
|
return liquidBleed;
|
|
}
|
|
|
|
// Default to average of consonant bleeds
|
|
return (plosiveBleed + fricativeBleed + nasalBleed + liquidBleed) / 4f;
|
|
}
|
|
}
|