Skip to content
This repository has been archived by the owner on Jan 26, 2025. It is now read-only.

Commit

Permalink
new preferences array system
Browse files Browse the repository at this point in the history
  • Loading branch information
MaybeMaru committed Dec 1, 2023
1 parent 85838a7 commit 49fbeb7
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 40 deletions.
7 changes: 4 additions & 3 deletions example_mods/TemplateScript.hx
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ getBlendMode(blendModeName:String);

/*
Returns the preference variable
@param prefName --> Identifier name of the preference EX: 'ghost-tap'
@param prefName --> Identifier name of the preference EX: 'downscroll'
*/
getPref(prefName:String);

Expand All @@ -180,9 +180,10 @@ getPref(prefName:String);
'botplay' => Botplay Mode
'practice' => Practice Mode
'downscroll' => Downscroll
'ghost-tap' => Ghost Tapping
'deghost-tap' => Deghostify
'ghost-tap-style' => Ghost Tapping ("on", "off", "dad turn")
'stack-rating' => Stack Ratings
'use-const-speed' => Use constant speed
'const-speed' => Constant speed
// UI
'framerate' => Framerate
Expand Down
50 changes: 37 additions & 13 deletions source/funkin/Preferences.hx
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
package funkin;

typedef ArrayPref = {array:Array<String>, value:String};

class Preferences {
public static var prefsArray:Array<String>;
public static var preferences:Map<String, Dynamic>;
public static var prefsLabels:Map<String, String>;

public static var arrayPrefs:Map<String, ArrayPref> = [];

inline public static function setupPrefs():Void {
public static function setupPrefs():Void {
prefsArray = [];
preferences = SaveData.getSave('preferences');
prefsLabels = new Map<String, String>();

// Miscellaneous
addPref('naughty', 'naughtyness', true);
//addPref('cache-songs', 'preload songs', true);

// Gameplay
addPref('botplay', 'botplay mode', false);
addPref('practice', 'practice mode', false);
addPref('downscroll', 'downscroll', false);
addPref('ghost-tap', 'ghost tapping', false);
addPref('deghost-tap', 'deghostify', false);
addPref('ghost-tap-style', 'ghost tapping', {array:["dad turn", "off", "on"], value: "off"});

addPref('stack-rating', 'stack ratings', false);
addPref('use-const-speed', 'use constant speed', false);
addPref('const-speed', 'constant speed', 1.0);

//addPref('shit-off', 'shit mil offset', 127);
//addPref('bad-off', 'bad mil offset', 106);
//addPref('good-off', 'good mil offset', 43);

// UI
addPref('framerate', 'framerate', 60);
addPref('fps-counter', 'fps counter', true);
addPref('vanilla-ui', 'vanilla ui', false);
addPref('flashing-light', 'flashing lights', true);
addPref('camera-zoom', 'camera zooms', true);

// Performance
addPref('antialiasing', 'antialiasing', true);
#if !hl
addPref('clear-gpu', 'clear gpu cache', false);
Expand All @@ -43,17 +43,19 @@ class Preferences {

SaveData.flushData();
effectPrefs();
fixOldPrefs();
}

inline public static function addPref(id:String, label:String, defaultValue:Dynamic):Void {
id = id.toLowerCase().trim();
prefsArray.push(id);

prefsLabels.set(id, label);
if (defaultValue.array != null) arrayPrefs.set(id, defaultValue);
if (!preferences.exists(id)) preferences.set(id, defaultValue);
}

inline public static function effectPrefs():Void {
public static function effectPrefs():Void {
FlxG.drawFramerate = FlxG.updateFramerate = getPref('framerate');
FlxSprite.defaultAntialiasing = getPref('antialiasing');

Expand All @@ -62,17 +64,39 @@ class Preferences {
}
}

private static function fixOldPrefs() {
if (preferences.exists("ghost-tap")) {
if (preferences.get("deghost-tap")) {
setPref("ghost-tap-style", "dad turn");
preferences.remove("deghost-tap");
}
else setPref("ghost-tap-style", preferences.get("ghost-tap") ? "on" : "off");
preferences.remove("ghost-tap");
}
SaveData.flushData();
}

inline public static function getPref(pref:String):Dynamic {
return cast preferences.get(pref.toLowerCase().trim());
final pref:Dynamic = cast preferences.get(pref.toLowerCase().trim());
return pref?.value ?? pref;
}

inline public static function setPref(pref:String, value:Dynamic):Void {
preferences.set(pref.toLowerCase().trim(), value);
final _id = pref.toLowerCase().trim();

if (arrayPrefs.exists(_id)) {
final _arrPref = arrayPrefs.get(_id);
_arrPref.value = value;
preferences.set(_id, _arrPref);
}
else {
preferences.set(_id, value);
}

SaveData.flushData();
}

inline public static function getLabel(pref:String):String {
var prefLabel:String = prefsLabels.get(pref.toLowerCase().trim());
return prefLabel;
return prefsLabels.get(pref.toLowerCase().trim());
}
}
2 changes: 1 addition & 1 deletion source/funkin/objects/NotesGroup.hx
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ class NotesGroup extends FlxGroup

if (controlArray.contains(true)) {
forEachArray(removeList, function (badNote) removeNote(badNote));
final onGhost = isPlayState ? PlayState.instance.ghostTapEnabled : getPref('ghost-tap');
final onGhost = isPlayState ? PlayState.instance.ghostTapEnabled : true;

possibleNotes.sort(CoolUtil.sortByStrumTime);
if (possibleNotes.length > 0) {
Expand Down
40 changes: 40 additions & 0 deletions source/funkin/objects/alphabet/Alphabet.hx
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,44 @@ class Alphabet extends FlxTypedSpriteGroup<AlphabetCharacter> {
inline public function splitText(text:String):Array<String> {
return text.split("");
}

override function findMaxXHelper()
{
var value = Math.NEGATIVE_INFINITY;
for (member in _sprites)
{
if (member == null || !member.alive)
continue;

var maxX:Float;
if (member.flixelType == SPRITEGROUP)
maxX = (cast member:FlxSpriteGroup).findMaxX();
else
maxX = member.x + member.width;

if (maxX > value)
value = maxX;
}
return value;
}

override function findMinXHelper()
{
var value = Math.POSITIVE_INFINITY;
for (member in _sprites)
{
if (member == null || !member.alive)
continue;

var minX:Float;
if (member.flixelType == SPRITEGROUP)
minX = (cast member:FlxSpriteGroup).findMinX();
else
minX = member.x;

if (minX < value)
value = minX;
}
return value;
}
}
4 changes: 2 additions & 2 deletions source/funkin/states/PlayState.hx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ class PlayState extends MusicBeatState {

inPractice = getPref('practice');
validScore = !(getPref('botplay') || inPractice);
ghostTapEnabled = getPref('ghost-tap');
ghostTapEnabled = getPref('ghost-tap-style') == "on";

SkinUtil.initSkinData();
NoteUtil.initTypes();
Expand Down Expand Up @@ -740,7 +740,7 @@ class PlayState extends MusicBeatState {
camHUD.zoom += 0.03;
}

if (getPref('deghost-tap') && curSectionData != null)
if (getPref('ghost-tap-style') == "dad turn" && curSectionData != null)
ghostTapEnabled = !curSectionData.mustHitSection;

ModdingUtil.addCall('sectionHit', [curSection]);
Expand Down
8 changes: 6 additions & 2 deletions source/funkin/states/options/PreferencesState.hx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class PreferencesState extends MusicBeatState {
final pref:String = prefsArray[i];
final prefLabel = Preferences.getLabel(pref);
final prefSetting:SettingItem = new SettingItem(pref, prefLabel);
prefSetting.targetY = (i + (prefsArray.length/10))*125;
prefSetting.targetY = (i + (prefsArray.length * 0.1))*125;
prefSetting.y = prefSetting.targetY;
prefSetting.ID = i;
prefItems.add(prefSetting);
Expand Down Expand Up @@ -62,7 +62,7 @@ class PreferencesState extends MusicBeatState {
item.setValue(!item.prefValue);
}

case NUMB:
case NUMBER:
var mult:Float = (FlxG.keys.pressed.SHIFT) ? 5 : 1;
switch(item.itemPref) {
case 'const-speed': mult *= 0.1;
Expand All @@ -74,6 +74,10 @@ class PreferencesState extends MusicBeatState {
}

case ARRAY:
if (leftP || rightP) {
if (leftP) item.setValue(item.array[FlxMath.wrap(item.getArrIndex()-1, 0, item.array.length - 1)]);
if (rightP) item.setValue(item.array[FlxMath.wrap(item.getArrIndex()+1, 0, item.array.length - 1)]);
}
}
break;
}
Expand Down
25 changes: 15 additions & 10 deletions source/funkin/states/options/items/SettingItem.hx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package funkin.states.options.items;

enum SettingType {
BOOL;
NUMB;
NUMBER;
ARRAY;
}

Expand All @@ -13,6 +13,7 @@ class SettingItem extends FlxSpriteGroup {

private var checkboxSpr:FunkinSprite; //Bool
public var numSetSpr:Alphabet; //Number
public var array:Array<String>;
//private var arraySetSpr:Alphabet; //Array

public var stringID:String = '';
Expand All @@ -29,11 +30,12 @@ class SettingItem extends FlxSpriteGroup {
itemPref = prefName;
prefValue = usePrefs ? Preferences.getPref(itemPref) : daValue;

var varType = Type.typeof(prefValue);
switch (varType) {
switch (Type.typeof(prefValue)) {
default: settingType = BOOL;
case TInt | TFloat: settingType = NUMB;
case TClass(Array): settingType = ARRAY;
case TInt | TFloat: settingType = NUMBER;
case TClass(String):
settingType = ARRAY;
array = Preferences.arrayPrefs.get(itemPref).array.copy();
}

settingTxt = new Alphabet(20, 100, description);
Expand All @@ -52,15 +54,19 @@ class SettingItem extends FlxSpriteGroup {
checkboxSpr.playAnim(prefValue ? 'staticOpen' : 'staticClose');
settingTxt.x += checkboxSpr.width * checkboxSpr.scale.x;

case NUMB:
case NUMBER | ARRAY:
numSetSpr = new Alphabet(20, 100,'< $prefValue >');
add(numSetSpr);
settingTxt.x += numSetSpr.x + numSetSpr.width;

case ARRAY:
//case ARRAY:
}
}

inline public function getArrIndex() {
return array.indexOf(prefValue);
}

function applyAntiGroup(_members:Array<Dynamic>, anti:Bool = true) {
for (i in _members) {
final _type = Type.typeof(i);
Expand All @@ -78,7 +84,7 @@ class SettingItem extends FlxSpriteGroup {
prefValue = newValue;

//hardcoded limits
if (settingType == NUMB) {
if (settingType == NUMBER) {
switch (itemPref) {
case 'framerate': prefValue = Std.int(FlxMath.bound(prefValue, 60, 240));
case 'const-speed': prefValue = FlxMath.roundDecimal(FlxMath.bound(prefValue, 0.1, 10.0), 1);
Expand All @@ -97,15 +103,14 @@ class SettingItem extends FlxSpriteGroup {

switch (settingType) {
case BOOL: checkboxSpr.playAnim(prefValue ? 'open' : 'close');
case NUMB:
case NUMBER | ARRAY:
var prefStr = Std.string(prefValue);
switch (itemPref) {
case "const-speed": if (prefStr.length <= 1) prefStr += ".0";
}

numSetSpr.text = "< " + prefStr + " >";
settingTxt.x = 20 + numSetSpr.x + numSetSpr.width;
case ARRAY:
}
}

Expand Down
8 changes: 4 additions & 4 deletions source/funkin/substates/PauseSubState.hx
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ class PauseSubState extends MusicBeatSubstate {
pauseMusic.looped = true;
pauseLength = Std.int(pauseMusic.length * 0.5);

bg = new FlxSprite().makeGraphic(1,1, FlxColor.BLACK);
bg = new FlxSprite().makeGraphic(1, 1, FlxColor.BLACK);
bg.scrollFactor.set();
bg.antialiasing = false;
bg.scale.set(1280,720);
bg.scale.set(FlxG.width, FlxG.height);
bg.updateHitbox();
add(bg);

Expand Down Expand Up @@ -132,10 +132,10 @@ class PauseSubState extends MusicBeatSubstate {
super.destroy();
}

function changeSelection(change:Int = 0):Void {
inline function changeSelection(change:Int = 0):Void {
curSelected = FlxMath.wrap(curSelected + change, 0, menuItems.length - 1);
for (i in 0...grpMenuShit.members.length) {
var item = grpMenuShit.members[i];
final item = grpMenuShit.members[i];
item.targetY = i - curSelected;
item.alpha = (item.targetY == 0) ? 1 : 0.6;
}
Expand Down
10 changes: 5 additions & 5 deletions source/funkin/util/backend/SaveData.hx
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ class SaveData
initSave = true;

// Setup save bases
var controlSave:Map<String, Map<String, Array<String>>> = new Map<String, Map<String, Array<String>>>();
final controlSave:Map<String, Map<String, Array<String>>> = new Map<String, Map<String, Array<String>>>();
controlSave['keyboardBinds'] = new Map<String, Array<String>>();
controlSave['gamepadBinds'] = new Map<String, Array<String>>();
var prefsSave:Map<String, Dynamic> = new Map<String, Dynamic>();
var scoresSave:Map<String, Int> = new Map<String, Int>();
var weekUnlockSave:Map<String, Bool> = new Map<String, Bool>();
var activeModsSave:Map<String, Bool> = new Map<String, Bool>();
final prefsSave:Map<String, Dynamic> = new Map<String, Dynamic>();
final scoresSave:Map<String, Int> = new Map<String, Int>();
final weekUnlockSave:Map<String, Bool> = new Map<String, Bool>();
final activeModsSave:Map<String, Bool> = new Map<String, Bool>();

// Add save bases
saves['controls'] = controlSave;
Expand Down

0 comments on commit 49fbeb7

Please sign in to comment.