Files
TiedUp-/src/main/java/com/tiedup/remake/util/GagMaterial.java
NotEvil a71093ba9c Remove internal phase comments and format code
Strip all Phase references, TODO/FUTURE roadmap notes, and internal
planning comments from the codebase. Run Prettier for consistent
formatting across all Java files.
2026-04-12 01:25:55 +02:00

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;
}
}