112 lines
2.0 KiB
Go
112 lines
2.0 KiB
Go
package osuapi
|
|
|
|
// Mods in the game.
|
|
const (
|
|
ModNoFail Mods = 1 << iota
|
|
ModEasy
|
|
ModNoVideo
|
|
ModHidden
|
|
ModHardRock
|
|
ModSuddenDeath
|
|
ModDoubleTime
|
|
ModRelax
|
|
ModHalfTime
|
|
ModNightcore
|
|
ModFlashlight
|
|
ModAutoplay
|
|
ModSpunOut
|
|
ModRelax2
|
|
ModPerfect
|
|
ModKey4
|
|
ModKey5
|
|
ModKey6
|
|
ModKey7
|
|
ModKey8
|
|
ModFadeIn
|
|
ModRandom
|
|
ModLastMod
|
|
ModKey9
|
|
ModKey10
|
|
ModKey1
|
|
ModKey3
|
|
ModKey2
|
|
ModFreeModAllowed = ModNoFail | ModEasy | ModHidden | ModHardRock | ModSuddenDeath | ModFlashlight | ModFadeIn | ModRelax | ModRelax2 | ModSpunOut | ModKeyMod
|
|
ModKeyMod = ModKey4 | ModKey5 | ModKey6 | ModKey7 | ModKey8
|
|
)
|
|
|
|
// Mods is a bitwise enum of mods used in a score.
|
|
//
|
|
// Mods may appear complicated to use for a beginner programmer. Fear not!
|
|
// This is how hard they can get for creation of a mod combination:
|
|
//
|
|
// myModCombination := osuapi.ModHardRock | osuapi.ModDoubleTime | osuapi.ModHidden | osuapi.ModSpunOut
|
|
//
|
|
// As for checking that an existing mod comination is enabled:
|
|
//
|
|
// if modCombination&osuapi.ModHardRock != 0 {
|
|
// // HardRock is enabled
|
|
// }
|
|
//
|
|
// To learn more about bitwise operators, have a look at it on wikipedia:
|
|
// https://en.wikipedia.org/wiki/Bitwise_operation#Bitwise_operators
|
|
type Mods int
|
|
|
|
var modsString = [...]string{
|
|
"NF",
|
|
"EZ",
|
|
"NV",
|
|
"HD",
|
|
"HR",
|
|
"SD",
|
|
"DT",
|
|
"RX",
|
|
"HT",
|
|
"NC",
|
|
"FL",
|
|
"AU", // Auto.
|
|
"SO",
|
|
"AP", // Autopilot.
|
|
"PF",
|
|
"K4",
|
|
"K5",
|
|
"K6",
|
|
"K7",
|
|
"K8",
|
|
"K9",
|
|
"RN", // Random
|
|
"LM", // LastMod. Cinema?
|
|
"K9",
|
|
"K0",
|
|
"K1",
|
|
"K3",
|
|
"K2",
|
|
}
|
|
|
|
// ParseMods parse a string with mods in the format "HDHRDT"
|
|
func ParseMods(mods string) (m Mods) {
|
|
modsSl := make([]string, len(mods)/2)
|
|
for n, modPart := range mods {
|
|
modsSl[n/2] += string(modPart)
|
|
}
|
|
for _, mod := range modsSl {
|
|
for index, availableMod := range modsString {
|
|
if availableMod == mod {
|
|
m |= 1 << uint(index)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (m Mods) String() (s string) {
|
|
for i := 0; i < len(modsString); i++ {
|
|
activated := 1&m == 1
|
|
if activated {
|
|
s += modsString[i]
|
|
}
|
|
m >>= 1
|
|
}
|
|
return
|
|
}
|