├── powermoves ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── powermoves.entitlements └── powermovesApp.swift ├── powermoves.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── tim.xcuserdatad │ │ └── WorkspaceSettings.xcsettings ├── xcuserdata │ └── tim.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── powermoves 1.xcscheme ├── xcshareddata │ └── xcschemes │ │ └── powermoves.xcscheme └── project.pbxproj └── README.md /powermoves/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /powermoves/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /powermoves/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /powermoves/powermoves.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/project.xcworkspace/xcuserdata/tim.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildLocationStyle 6 | CustomLocation 7 | CustomBuildIntermediatesPath 8 | Build/Intermediates.noindex 9 | CustomBuildLocationType 10 | RelativeToWorkspace 11 | CustomBuildProductsPath 12 | Build/Products 13 | DerivedDataLocationStyle 14 | Default 15 | ShowSharedSchemesAutomaticallyEnabled 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/xcuserdata/tim.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | powermoves 1.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 1 13 | 14 | powermoves.xcscheme_^#shared#^_ 15 | 16 | orderHint 17 | 0 18 | 19 | 20 | SuppressBuildableAutocreation 21 | 22 | 225E14EB2ABBC01C003FE071 23 | 24 | primary 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Power Moves 2 | 100 lines of code to add some time pressure to your zoom calls. 3 | 4 | Simply turn it on, and you're at 1% (You'll obviously need to change the settings to hide your actual battery indicator) 5 | 6 | ![Screenshot 2024-12-25 at 1 55 27 PM](https://github.com/user-attachments/assets/0299d369-d498-46cc-911f-163ef5319ad6) 7 | 8 | Alternatively, you can start a countdown from 5% to 1%. 9 | 10 | ![Screenshot 2024-12-25 at 1 55 35 PM](https://github.com/user-attachments/assets/3c27bfff-84e4-49d3-91f9-a26b5fa61dfd) 11 | 12 | ## Some good lines to use 13 | - "I'm at 5%, you'll have to be quick" 14 | - "Down to 3%, make it snappy." 15 | - "At 2%, speak fast or forever hold your peace." 16 | - "4% left, words are a luxury I can’t afford." 17 | - "I’ve got 1%, so this better be good." 18 | - "2% left, the race against time is real." 19 | - "4% here, let’s treat this like an elevator pitch." 20 | - "I’m at 3%, say it like you mean it." 21 | -------------------------------------------------------------------------------- /powermoves/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "scale" : "1x", 11 | "size" : "16x16" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "scale" : "2x", 16 | "size" : "16x16" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "scale" : "1x", 21 | "size" : "32x32" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "scale" : "2x", 26 | "size" : "32x32" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "scale" : "2x", 36 | "size" : "128x128" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "scale" : "1x", 41 | "size" : "256x256" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "scale" : "2x", 46 | "size" : "256x256" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "scale" : "1x", 51 | "size" : "512x512" 52 | }, 53 | { 54 | "idiom" : "mac", 55 | "scale" : "2x", 56 | "size" : "512x512" 57 | } 58 | ], 59 | "info" : { 60 | "author" : "xcode", 61 | "version" : 1 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/xcshareddata/xcschemes/powermoves.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 42 | 44 | 50 | 51 | 52 | 53 | 59 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/xcuserdata/tim.xcuserdatad/xcschemes/powermoves 1.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 42 | 44 | 50 | 51 | 52 | 53 | 59 | 61 | 67 | 68 | 69 | 70 | 72 | 73 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /powermoves/powermovesApp.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | @main 4 | struct PowerMovesApp: App { 5 | @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate 6 | 7 | var body: some Scene { 8 | // No visible WindowGroup to prevent the app window from popping up 9 | Settings { } 10 | } 11 | } 12 | 13 | import UserNotifications 14 | 15 | class AppDelegate: NSObject, NSApplicationDelegate { 16 | var statusItem: NSStatusItem? 17 | var showPercentage = true 18 | var countdownTimer: Timer? 19 | var batteryPercentage = 1 20 | 21 | func applicationDidFinishLaunching(_ notification: Notification) { 22 | let colors: [NSColor] = [.gray] 23 | let colorIndex = 0 24 | 25 | statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) 26 | 27 | if let button = statusItem?.button { 28 | updateStatusBar(button: button, batteryPercentage: batteryPercentage, color: colors[colorIndex]) 29 | } 30 | 31 | // Request notification permissions 32 | requestNotificationPermissions() 33 | 34 | // Add menu 35 | let menu = NSMenu() 36 | menu.addItem(NSMenuItem(title: "Toggle Percentage", action: #selector(togglePercentage), keyEquivalent: "")) 37 | menu.addItem(NSMenuItem(title: "Show Sleep Notification", action: #selector(showSleepNotification), keyEquivalent: "s")) 38 | menu.addItem(NSMenuItem(title: "1 Minute Countdown", action: #selector(start1MinuteCountdown), keyEquivalent: "1")) 39 | menu.addItem(NSMenuItem(title: "2 Minute Countdown", action: #selector(start2MinuteCountdown), keyEquivalent: "2")) 40 | menu.addItem(NSMenuItem(title: "5 Minute Countdown", action: #selector(start5MinuteCountdown), keyEquivalent: "5")) 41 | menu.addItem(NSMenuItem.separator()) 42 | menu.addItem(NSMenuItem(title: "Quit", action: #selector(quitApp), keyEquivalent: "q")) 43 | 44 | statusItem?.menu = menu 45 | } 46 | 47 | func updateStatusBar(button: NSStatusBarButton, batteryPercentage: Int, color: NSColor) { 48 | let configuration = NSImage.SymbolConfiguration(pointSize: 20, weight: .light) 49 | .applying(.init(paletteColors: [color])) 50 | let image = NSImage(systemSymbolName: "battery.0", accessibilityDescription: nil)? 51 | .withSymbolConfiguration(configuration) 52 | 53 | let imageAttachment = NSTextAttachment() 54 | imageAttachment.image = image 55 | 56 | let targetHeight: CGFloat = 15 57 | if let imageSize = image?.size { 58 | let aspectRatio = imageSize.width / imageSize.height 59 | imageAttachment.bounds = CGRect(x: 0, y: -3.5, width: targetHeight * aspectRatio, height: targetHeight) 60 | } 61 | 62 | let imageString = NSAttributedString(attachment: imageAttachment) 63 | 64 | if showPercentage { 65 | let percentageString = "\(batteryPercentage)% " 66 | let attributedString = NSMutableAttributedString(string: percentageString, attributes: [ 67 | .foregroundColor: NSColor.textColor, 68 | .font: NSFont.systemFont(ofSize: 11, weight: .medium), 69 | .baselineOffset: 0 70 | ]) 71 | attributedString.append(imageString) 72 | button.attributedTitle = attributedString 73 | } else { 74 | button.attributedTitle = imageString 75 | } 76 | } 77 | 78 | @objc func togglePercentage() { 79 | showPercentage.toggle() 80 | if let button = statusItem?.button { 81 | updateStatusBar(button: button, batteryPercentage: batteryPercentage, color: .gray) 82 | } 83 | } 84 | 85 | @objc func quitApp() { 86 | NSApplication.shared.terminate(self) 87 | } 88 | 89 | @objc func showSleepNotification() { 90 | let content = UNMutableNotificationContent() 91 | content.title = "Low Battery Warning" 92 | content.body = "Your Mac will sleep soon unless plugged into a power outlet." 93 | content.sound = UNNotificationSound.default 94 | content.userInfo = ["customData": "lowBattery"] 95 | 96 | let request = UNNotificationRequest(identifier: "lowBatteryWarning", content: content, trigger: nil) 97 | UNUserNotificationCenter.current().add(request) 98 | } 99 | 100 | func requestNotificationPermissions() { 101 | UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in 102 | if let error = error { 103 | print("Failed to request notification permissions: \(error)") 104 | } 105 | } 106 | } 107 | 108 | @objc func start1MinuteCountdown() { 109 | startCountdown(duration: 1) 110 | } 111 | 112 | @objc func start2MinuteCountdown() { 113 | startCountdown(duration: 2) 114 | } 115 | 116 | @objc func start5MinuteCountdown() { 117 | startCountdown(duration: 5) 118 | } 119 | 120 | func startCountdown(duration: Int) { 121 | batteryPercentage = 5 // Instantly draw to 5% 122 | if let button = statusItem?.button { 123 | updateStatusBar(button: button, batteryPercentage: batteryPercentage, color: .gray) 124 | } 125 | 126 | countdownTimer?.invalidate() // Stop any existing timer 127 | 128 | let decrementInterval = Double(duration * 60) / 4.0 // Calculate interval for decrementing battery percentage 129 | 130 | countdownTimer = Timer.scheduledTimer(withTimeInterval: decrementInterval, repeats: true) { [weak self] timer in 131 | guard let self = self else { return } 132 | self.batteryPercentage -= 1 133 | 134 | if let button = self.statusItem?.button { 135 | self.updateStatusBar(button: button, batteryPercentage: self.batteryPercentage, color: .gray) 136 | } 137 | 138 | if self.batteryPercentage <= 1 { 139 | timer.invalidate() 140 | self.showSleepNotification() 141 | } 142 | } 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /powermoves.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 225E14F02ABBC01C003FE071 /* powermovesApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225E14EF2ABBC01C003FE071 /* powermovesApp.swift */; }; 11 | 225E14F42ABBC01E003FE071 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 225E14F32ABBC01E003FE071 /* Assets.xcassets */; }; 12 | 225E14F82ABBC01E003FE071 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 225E14F72ABBC01E003FE071 /* Preview Assets.xcassets */; }; 13 | /* End PBXBuildFile section */ 14 | 15 | /* Begin PBXFileReference section */ 16 | 225E14EC2ABBC01C003FE071 /* powermoves.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = powermoves.app; sourceTree = BUILT_PRODUCTS_DIR; }; 17 | 225E14EF2ABBC01C003FE071 /* powermovesApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = powermovesApp.swift; sourceTree = ""; }; 18 | 225E14F32ABBC01E003FE071 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 19 | 225E14F52ABBC01E003FE071 /* powermoves.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = powermoves.entitlements; sourceTree = ""; }; 20 | 225E14F72ABBC01E003FE071 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 21 | /* End PBXFileReference section */ 22 | 23 | /* Begin PBXFrameworksBuildPhase section */ 24 | 225E14E92ABBC01C003FE071 /* Frameworks */ = { 25 | isa = PBXFrameworksBuildPhase; 26 | buildActionMask = 2147483647; 27 | files = ( 28 | ); 29 | runOnlyForDeploymentPostprocessing = 0; 30 | }; 31 | /* End PBXFrameworksBuildPhase section */ 32 | 33 | /* Begin PBXGroup section */ 34 | 225E14E32ABBC01C003FE071 = { 35 | isa = PBXGroup; 36 | children = ( 37 | 225E14EE2ABBC01C003FE071 /* powermoves */, 38 | 225E14ED2ABBC01C003FE071 /* Products */, 39 | ); 40 | sourceTree = ""; 41 | }; 42 | 225E14ED2ABBC01C003FE071 /* Products */ = { 43 | isa = PBXGroup; 44 | children = ( 45 | 225E14EC2ABBC01C003FE071 /* powermoves.app */, 46 | ); 47 | name = Products; 48 | sourceTree = ""; 49 | }; 50 | 225E14EE2ABBC01C003FE071 /* powermoves */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 225E14EF2ABBC01C003FE071 /* powermovesApp.swift */, 54 | 225E14F32ABBC01E003FE071 /* Assets.xcassets */, 55 | 225E14F52ABBC01E003FE071 /* powermoves.entitlements */, 56 | 225E14F62ABBC01E003FE071 /* Preview Content */, 57 | ); 58 | path = powermoves; 59 | sourceTree = ""; 60 | }; 61 | 225E14F62ABBC01E003FE071 /* Preview Content */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | 225E14F72ABBC01E003FE071 /* Preview Assets.xcassets */, 65 | ); 66 | path = "Preview Content"; 67 | sourceTree = ""; 68 | }; 69 | /* End PBXGroup section */ 70 | 71 | /* Begin PBXNativeTarget section */ 72 | 225E14EB2ABBC01C003FE071 /* powermoves */ = { 73 | isa = PBXNativeTarget; 74 | buildConfigurationList = 225E14FB2ABBC01E003FE071 /* Build configuration list for PBXNativeTarget "powermoves" */; 75 | buildPhases = ( 76 | 225E14E82ABBC01C003FE071 /* Sources */, 77 | 225E14E92ABBC01C003FE071 /* Frameworks */, 78 | 225E14EA2ABBC01C003FE071 /* Resources */, 79 | ); 80 | buildRules = ( 81 | ); 82 | dependencies = ( 83 | ); 84 | name = powermoves; 85 | productName = powermoves; 86 | productReference = 225E14EC2ABBC01C003FE071 /* powermoves.app */; 87 | productType = "com.apple.product-type.application"; 88 | }; 89 | /* End PBXNativeTarget section */ 90 | 91 | /* Begin PBXProject section */ 92 | 225E14E42ABBC01C003FE071 /* Project object */ = { 93 | isa = PBXProject; 94 | attributes = { 95 | BuildIndependentTargetsInParallel = 1; 96 | LastSwiftUpdateCheck = 1500; 97 | LastUpgradeCheck = 1500; 98 | TargetAttributes = { 99 | 225E14EB2ABBC01C003FE071 = { 100 | CreatedOnToolsVersion = 15.0; 101 | }; 102 | }; 103 | }; 104 | buildConfigurationList = 225E14E72ABBC01C003FE071 /* Build configuration list for PBXProject "powermoves" */; 105 | compatibilityVersion = "Xcode 14.0"; 106 | developmentRegion = en; 107 | hasScannedForEncodings = 0; 108 | knownRegions = ( 109 | en, 110 | Base, 111 | ); 112 | mainGroup = 225E14E32ABBC01C003FE071; 113 | productRefGroup = 225E14ED2ABBC01C003FE071 /* Products */; 114 | projectDirPath = ""; 115 | projectRoot = ""; 116 | targets = ( 117 | 225E14EB2ABBC01C003FE071 /* powermoves */, 118 | ); 119 | }; 120 | /* End PBXProject section */ 121 | 122 | /* Begin PBXResourcesBuildPhase section */ 123 | 225E14EA2ABBC01C003FE071 /* Resources */ = { 124 | isa = PBXResourcesBuildPhase; 125 | buildActionMask = 2147483647; 126 | files = ( 127 | 225E14F82ABBC01E003FE071 /* Preview Assets.xcassets in Resources */, 128 | 225E14F42ABBC01E003FE071 /* Assets.xcassets in Resources */, 129 | ); 130 | runOnlyForDeploymentPostprocessing = 0; 131 | }; 132 | /* End PBXResourcesBuildPhase section */ 133 | 134 | /* Begin PBXSourcesBuildPhase section */ 135 | 225E14E82ABBC01C003FE071 /* Sources */ = { 136 | isa = PBXSourcesBuildPhase; 137 | buildActionMask = 2147483647; 138 | files = ( 139 | 225E14F02ABBC01C003FE071 /* powermovesApp.swift in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin XCBuildConfiguration section */ 146 | 225E14F92ABBC01E003FE071 /* Debug */ = { 147 | isa = XCBuildConfiguration; 148 | buildSettings = { 149 | ALWAYS_SEARCH_USER_PATHS = NO; 150 | ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = ""; 151 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 152 | CLANG_ANALYZER_NONNULL = YES; 153 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 154 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 155 | CLANG_ENABLE_MODULES = YES; 156 | CLANG_ENABLE_OBJC_ARC = YES; 157 | CLANG_ENABLE_OBJC_WEAK = YES; 158 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 159 | CLANG_WARN_BOOL_CONVERSION = YES; 160 | CLANG_WARN_COMMA = YES; 161 | CLANG_WARN_CONSTANT_CONVERSION = YES; 162 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 163 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 164 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 165 | CLANG_WARN_EMPTY_BODY = YES; 166 | CLANG_WARN_ENUM_CONVERSION = YES; 167 | CLANG_WARN_INFINITE_RECURSION = YES; 168 | CLANG_WARN_INT_CONVERSION = YES; 169 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 170 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 171 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 172 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 173 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 174 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 175 | CLANG_WARN_STRICT_PROTOTYPES = YES; 176 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 177 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 178 | CLANG_WARN_UNREACHABLE_CODE = YES; 179 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 180 | COPY_PHASE_STRIP = NO; 181 | DEBUG_INFORMATION_FORMAT = dwarf; 182 | ENABLE_STRICT_OBJC_MSGSEND = YES; 183 | ENABLE_TESTABILITY = YES; 184 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 185 | GCC_C_LANGUAGE_STANDARD = gnu17; 186 | GCC_DYNAMIC_NO_PIC = NO; 187 | GCC_NO_COMMON_BLOCKS = YES; 188 | GCC_OPTIMIZATION_LEVEL = 0; 189 | GCC_PREPROCESSOR_DEFINITIONS = ( 190 | "DEBUG=1", 191 | "$(inherited)", 192 | ); 193 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 194 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 195 | GCC_WARN_UNDECLARED_SELECTOR = YES; 196 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 197 | GCC_WARN_UNUSED_FUNCTION = YES; 198 | GCC_WARN_UNUSED_VARIABLE = YES; 199 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 200 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 201 | MTL_FAST_MATH = YES; 202 | ONLY_ACTIVE_ARCH = YES; 203 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; 204 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 205 | }; 206 | name = Debug; 207 | }; 208 | 225E14FA2ABBC01E003FE071 /* Release */ = { 209 | isa = XCBuildConfiguration; 210 | buildSettings = { 211 | ALWAYS_SEARCH_USER_PATHS = NO; 212 | ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = ""; 213 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 214 | CLANG_ANALYZER_NONNULL = YES; 215 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 216 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 217 | CLANG_ENABLE_MODULES = YES; 218 | CLANG_ENABLE_OBJC_ARC = YES; 219 | CLANG_ENABLE_OBJC_WEAK = YES; 220 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 221 | CLANG_WARN_BOOL_CONVERSION = YES; 222 | CLANG_WARN_COMMA = YES; 223 | CLANG_WARN_CONSTANT_CONVERSION = YES; 224 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 225 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 226 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 227 | CLANG_WARN_EMPTY_BODY = YES; 228 | CLANG_WARN_ENUM_CONVERSION = YES; 229 | CLANG_WARN_INFINITE_RECURSION = YES; 230 | CLANG_WARN_INT_CONVERSION = YES; 231 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 232 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 233 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 234 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 235 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 236 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 237 | CLANG_WARN_STRICT_PROTOTYPES = YES; 238 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 239 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 240 | CLANG_WARN_UNREACHABLE_CODE = YES; 241 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 242 | COPY_PHASE_STRIP = NO; 243 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 244 | ENABLE_NS_ASSERTIONS = NO; 245 | ENABLE_STRICT_OBJC_MSGSEND = YES; 246 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 247 | GCC_C_LANGUAGE_STANDARD = gnu17; 248 | GCC_NO_COMMON_BLOCKS = YES; 249 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 250 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 251 | GCC_WARN_UNDECLARED_SELECTOR = YES; 252 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 253 | GCC_WARN_UNUSED_FUNCTION = YES; 254 | GCC_WARN_UNUSED_VARIABLE = YES; 255 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES; 256 | MTL_ENABLE_DEBUG_INFO = NO; 257 | MTL_FAST_MATH = YES; 258 | SWIFT_COMPILATION_MODE = wholemodule; 259 | }; 260 | name = Release; 261 | }; 262 | 225E14FC2ABBC01E003FE071 /* Debug */ = { 263 | isa = XCBuildConfiguration; 264 | buildSettings = { 265 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 266 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 267 | CODE_SIGN_ENTITLEMENTS = powermoves/powermoves.entitlements; 268 | CODE_SIGN_STYLE = Automatic; 269 | CURRENT_PROJECT_VERSION = 1; 270 | DEVELOPMENT_ASSET_PATHS = "\"powermoves/Preview Content\""; 271 | DEVELOPMENT_TEAM = 58U9267HY2; 272 | ENABLE_HARDENED_RUNTIME = YES; 273 | ENABLE_PREVIEWS = YES; 274 | GENERATE_INFOPLIST_FILE = YES; 275 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 276 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 277 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 278 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 279 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 280 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 281 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 282 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 283 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 284 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 285 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 286 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 287 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 288 | MACOSX_DEPLOYMENT_TARGET = 13.5; 289 | MARKETING_VERSION = 1.0; 290 | PRODUCT_BUNDLE_IDENTIFIER = tholman.powermoves; 291 | PRODUCT_NAME = "$(TARGET_NAME)"; 292 | SDKROOT = auto; 293 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 294 | SWIFT_EMIT_LOC_STRINGS = YES; 295 | SWIFT_VERSION = 5.0; 296 | TARGETED_DEVICE_FAMILY = "1,2"; 297 | }; 298 | name = Debug; 299 | }; 300 | 225E14FD2ABBC01E003FE071 /* Release */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 304 | "ASSETCATALOG_COMPILER_APPICON_NAME[sdk=*]" = AppIcon; 305 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 306 | CODE_SIGN_ENTITLEMENTS = powermoves/powermoves.entitlements; 307 | CODE_SIGN_STYLE = Automatic; 308 | CURRENT_PROJECT_VERSION = 1; 309 | DEVELOPMENT_ASSET_PATHS = "\"powermoves/Preview Content\""; 310 | DEVELOPMENT_TEAM = 58U9267HY2; 311 | ENABLE_HARDENED_RUNTIME = YES; 312 | ENABLE_PREVIEWS = YES; 313 | GENERATE_INFOPLIST_FILE = YES; 314 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 315 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 316 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 317 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 318 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 319 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 320 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 321 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 322 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 323 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 324 | IPHONEOS_DEPLOYMENT_TARGET = 17.0; 325 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 326 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 327 | MACOSX_DEPLOYMENT_TARGET = 13.5; 328 | MARKETING_VERSION = 1.0; 329 | PRODUCT_BUNDLE_IDENTIFIER = tholman.powermoves; 330 | PRODUCT_NAME = "$(TARGET_NAME)"; 331 | SDKROOT = auto; 332 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 333 | SWIFT_EMIT_LOC_STRINGS = YES; 334 | SWIFT_VERSION = 5.0; 335 | TARGETED_DEVICE_FAMILY = "1,2"; 336 | }; 337 | name = Release; 338 | }; 339 | /* End XCBuildConfiguration section */ 340 | 341 | /* Begin XCConfigurationList section */ 342 | 225E14E72ABBC01C003FE071 /* Build configuration list for PBXProject "powermoves" */ = { 343 | isa = XCConfigurationList; 344 | buildConfigurations = ( 345 | 225E14F92ABBC01E003FE071 /* Debug */, 346 | 225E14FA2ABBC01E003FE071 /* Release */, 347 | ); 348 | defaultConfigurationIsVisible = 0; 349 | defaultConfigurationName = Release; 350 | }; 351 | 225E14FB2ABBC01E003FE071 /* Build configuration list for PBXNativeTarget "powermoves" */ = { 352 | isa = XCConfigurationList; 353 | buildConfigurations = ( 354 | 225E14FC2ABBC01E003FE071 /* Debug */, 355 | 225E14FD2ABBC01E003FE071 /* Release */, 356 | ); 357 | defaultConfigurationIsVisible = 0; 358 | defaultConfigurationName = Release; 359 | }; 360 | /* End XCConfigurationList section */ 361 | }; 362 | rootObject = 225E14E42ABBC01C003FE071 /* Project object */; 363 | } 364 | --------------------------------------------------------------------------------