GBA-8-19/CGame/Extensions/Input+Display.swift
bluesea 66c5202be8 s
2024-06-14 18:12:40 +08:00

157 lines
7.6 KiB
Swift

//
// Input+Display.swift
// Hthik
//
// Created by Hthik on 8/15/17.
// Copyright © 2017 Hthik. All rights reserved.
//
import DeltaCore
extension Input
{
// With the default GameControllerInputMapping files, multiple controller inputs may map to the same game input.
// This is because each controller input maps to a unique standard input, but then multiple standard inputs may map to same game input.
// To ensure we only show the most "important" controller input for a game input, we define general "display priorities" for each input.
//
// For example, MFiGameController.down and MFiGameController.leftThumbstickDown both map to a "down" game input.
// However, .down has a higher priority than .leftThumbstickDown, so we show .down instead of .leftThumbstickDown.
var displayPriority: Int {
switch self.type
{
case .game: break
case .controller(.standard): break
case .controller(.mfi):
let input = MFiGameController.Input(input: self)!
switch input
{
case .leftThumbstickUp: return 750
case .leftThumbstickDown: return 750
case .leftThumbstickLeft: return 750
case .leftThumbstickRight: return 750
case .leftShoulder: return 750
case .leftTrigger: return 500
case .rightShoulder: return 750
case .rightTrigger: return 500
default: break
}
case .controller(.keyboard):
let input = KeyboardGameController.Input(input: self)!
if input == .escape
{
// The iPad Smart Keyboard doesn't have an escape key, so return lower priority
// to ensure it only appears if there is no other key mapped to the same input.
return 100
}
// We prefer to display keys with special characters (e.g. arrow keys, shift) over regular keys.
// If the input's localizedName == it's string value, we can assume it's a normal key, and return a lower priority.
// Otherwise, it has a special display character, and so we return a higher priority.
if input.localizedName == input.stringValue.uppercased()
{
return 500
}
else
{
return 1000
}
default: break
}
return 1000
}
var localizedName: String {
switch self.type
{
case .game: break
case .controller(.standard):
let input = StandardGameControllerInput(input: self)!
switch input
{
case .menu: return NSLocalizedString("Menu", comment: "")
case .up: return NSLocalizedString("Up", comment: "")
case .down: return NSLocalizedString("Down", comment: "")
case .left: return NSLocalizedString("Left", comment: "")
case .right: return NSLocalizedString("Right", comment: "")
case .leftThumbstickUp: return NSLocalizedString("L🕹↑", comment: "")
case .leftThumbstickDown: return NSLocalizedString("L🕹↓", comment: "")
case .leftThumbstickLeft: return NSLocalizedString("L🕹←", comment: "")
case .leftThumbstickRight: return NSLocalizedString("L🕹→", comment: "")
case .rightThumbstickUp: return NSLocalizedString("R🕹↑", comment: "")
case .rightThumbstickDown: return NSLocalizedString("R🕹↓", comment: "")
case .rightThumbstickLeft: return NSLocalizedString("R🕹←", comment: "")
case .rightThumbstickRight: return NSLocalizedString("R🕹→", comment: "")
case .a: return NSLocalizedString("A", comment: "")
case .b: return NSLocalizedString("B", comment: "")
case .x: return NSLocalizedString("X", comment: "")
case .y: return NSLocalizedString("Y", comment: "")
case .start: return NSLocalizedString("Start", comment: "Start button")
case .select: return NSLocalizedString("Select", comment: "Select button")
case .l1: return NSLocalizedString("L1", comment: "")
case .l2: return NSLocalizedString("L2", comment: "")
case .l3: return NSLocalizedString("L3", comment: "")
case .r1: return NSLocalizedString("R1", comment: "")
case .r2: return NSLocalizedString("R2", comment: "")
case .r3: return NSLocalizedString("R3", comment: "")
}
case .controller(.mfi):
let input = MFiGameController.Input(input: self)!
switch input
{
case .menu: return NSLocalizedString("Menu", comment: "")
case .up: return NSLocalizedString("Up", comment: "")
case .down: return NSLocalizedString("Down", comment: "")
case .left: return NSLocalizedString("Left", comment: "")
case .right: return NSLocalizedString("Right", comment: "")
case .leftThumbstickUp: return NSLocalizedString("L🕹↑", comment: "")
case .leftThumbstickDown: return NSLocalizedString("L🕹↓", comment: "")
case .leftThumbstickLeft: return NSLocalizedString("L🕹←", comment: "")
case .leftThumbstickRight: return NSLocalizedString("L🕹→", comment: "")
case .rightThumbstickUp: return NSLocalizedString("R🕹↑", comment: "")
case .rightThumbstickDown: return NSLocalizedString("R🕹↓", comment: "")
case .rightThumbstickLeft: return NSLocalizedString("R🕹←", comment: "")
case .rightThumbstickRight: return NSLocalizedString("R🕹→", comment: "")
case .a: return NSLocalizedString("A", comment: "")
case .b: return NSLocalizedString("B", comment: "")
case .x: return NSLocalizedString("X", comment: "")
case .y: return NSLocalizedString("Y", comment: "")
case .leftShoulder: return NSLocalizedString("L1", comment: "")
case .leftTrigger: return NSLocalizedString("L2", comment: "")
case .rightShoulder: return NSLocalizedString("R1", comment: "")
case .rightTrigger: return NSLocalizedString("R2", comment: "")
case .start: return NSLocalizedString("Start", comment: "")
case .select: return NSLocalizedString("Select", comment: "")
}
case .controller(.keyboard):
let input = KeyboardGameController.Input(input: self)!
switch input
{
case .up: return NSLocalizedString("", comment: "")
case .down: return NSLocalizedString("", comment: "")
case .left: return NSLocalizedString("", comment: "")
case .right: return NSLocalizedString("", comment: "")
case .escape: return NSLocalizedString("", comment: "")
case .shift: return NSLocalizedString("", comment: "")
case .command: return NSLocalizedString("", comment: "")
case .option: return NSLocalizedString("", comment: "")
case .control: return NSLocalizedString("Ctrl", comment: "")
case .capsLock: return NSLocalizedString("", comment: "")
case .space: return NSLocalizedString("Space", comment: "")
case .return: return NSLocalizedString("\u{FE0E}", comment: "")
case .tab: return NSLocalizedString("", comment: "")
default: return input.stringValue.uppercased()
}
default: break
}
return ""
}
}