diff --git a/README-macOS.md b/README-macOS.md index e3c71fd6a..c707d8910 100644 --- a/README-macOS.md +++ b/README-macOS.md @@ -1,7 +1,7 @@ # FinalBurn Neo for macOS ## Download -[Version 1.0](https://github.com/fbn-mac/FBNeo/releases/tag/macos-v1.0) is the +[Version 1.02](https://github.com/fbn-mac/FBNeo/releases/tag/macos-v1.02) is the latest stable release. [View all releases](https://github.com/fbn-mac/FBNeo/releases). ## Compatibility @@ -10,11 +10,15 @@ likely that it may run on earlier versions (perhaps as low as Mountain Lion). If can build and run successfully on an earlier version of macOS (OS X?), let me know. ## Use -Launch any set by dropping it on the app's icon or in the window. You can also -use `File/Open` and `File/Open Recent`. ROMs can reside anywhere, though if you -load a game that requires files from a parent set or BIOS (e.g. Neo-Geo), -the files are expected to be in the same directory. Supported archives -are `zip` and `7z`. +Drop a set into the Launcher window to import it, double-click to start it. +Supported archive formats are `zip` and `7z`. + +You can also use `File/Open` and `File/Open Recent` to load ROMs directly. +Files can reside anywhere, though when loading a game that requires a parent set +or BIOS (e.g. Neo-Geo), the files are expected to be in the same directory. + +If a game refuses to start, check the Log Viewer (Window/Log Viewer) +for diagnostic information. ## Input Currently supported input devices are keyboard (using standard FinalBurn layout) diff --git a/projectfiles/xcode/Emulator.xcodeproj/project.pbxproj b/projectfiles/xcode/Emulator.xcodeproj/project.pbxproj index 5888a867f..689c96598 100644 --- a/projectfiles/xcode/Emulator.xcodeproj/project.pbxproj +++ b/projectfiles/xcode/Emulator.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ FE0A7EA12394B87B001E6997 /* FBRomSetStatusAsNSImage.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7E9F2394B87B001E6997 /* FBRomSetStatusAsNSImage.m */; }; FE0A7EA42394ED91001E6997 /* FBDropFileScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7EA32394ED91001E6997 /* FBDropFileScrollView.m */; }; FE0A7EA7239501FF001E6997 /* FBImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7EA5239501FF001E6997 /* FBImporter.m */; }; + FE0A7EAA239B8A7E001E6997 /* About.xib in Resources */ = {isa = PBXBuildFile; fileRef = FE0A7EA8239B8A7E001E6997 /* About.xib */; }; + FE0A7EAD239B8B4F001E6997 /* FBAboutController.m in Sources */ = {isa = PBXBuildFile; fileRef = FE0A7EAB239B8B4E001E6997 /* FBAboutController.m */; }; FE1B1092235615940065200C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FE1B1091235615940065200C /* AppDelegate.m */; }; FE1B1094235615950065200C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FE1B1093235615950065200C /* Assets.xcassets */; }; FE1B1097235615950065200C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FE1B1095235615950065200C /* MainMenu.xib */; }; @@ -1053,6 +1055,9 @@ FE0A7EA32394ED91001E6997 /* FBDropFileScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBDropFileScrollView.m; sourceTree = ""; }; FE0A7EA5239501FF001E6997 /* FBImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBImporter.m; sourceTree = ""; }; FE0A7EA6239501FF001E6997 /* FBImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBImporter.h; sourceTree = ""; }; + FE0A7EA9239B8A7E001E6997 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/About.xib; sourceTree = ""; }; + FE0A7EAB239B8B4E001E6997 /* FBAboutController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBAboutController.m; sourceTree = ""; }; + FE0A7EAC239B8B4F001E6997 /* FBAboutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBAboutController.h; sourceTree = ""; }; FE1B108D235615940065200C /* FinalBurn Neo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FinalBurn Neo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FE1B1090235615940065200C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; FE1B1091235615940065200C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -4666,6 +4671,8 @@ FE2BC6AF23615BBC00B9D150 /* Controllers */ = { isa = PBXGroup; children = ( + FE0A7EAC239B8B4F001E6997 /* FBAboutController.h */, + FE0A7EAB239B8B4E001E6997 /* FBAboutController.m */, FEF4EE7F23635500004E0DCE /* FBEmulatorController.h */, FEF4EE8023635500004E0DCE /* FBEmulatorController.m */, FE0A7E9623938CE6001E6997 /* FBLauncherController.h */, @@ -4688,6 +4695,7 @@ FE1B1095235615950065200C /* MainMenu.xib */, FE2BC6C92362CFC000B9D150 /* Preferences.xib */, FE0A7E9823938E9F001E6997 /* Launcher.xib */, + FE0A7EA8239B8A7E001E6997 /* About.xib */, ); name = Nibs; sourceTree = ""; @@ -4849,6 +4857,7 @@ FE0A7E9A23938E9F001E6997 /* Launcher.xib in Resources */, FE2BC6BB2362B4E200B9D150 /* dsa_pub.pem in Resources */, FEF4EE892363720B004E0DCE /* Defaults.plist in Resources */, + FE0A7EAA239B8A7E001E6997 /* About.xib in Resources */, FE2BC6CB2362CFC100B9D150 /* Preferences.xib in Resources */, FE1B241023561A750065200C /* license.txt in Resources */, FEF4EE8423635521004E0DCE /* Emulator.xib in Resources */, @@ -5584,6 +5593,7 @@ FE1B26DB23561A780065200C /* d_beaminv.cpp in Sources */, FE1B259F23561A760065200C /* timeplt_snd.cpp in Sources */, FE1B26F723561A780065200C /* d_hvyunit.cpp in Sources */, + FE0A7EAD239B8B4F001E6997 /* FBAboutController.m in Sources */, FE1B276023561A780065200C /* d_bombjack.cpp in Sources */, FE1B263F23561A770065200C /* cps_scr.cpp in Sources */, FE1B25DD23561A760065200C /* d_nemesis.cpp in Sources */, @@ -5984,6 +5994,14 @@ name = Launcher.xib; sourceTree = ""; }; + FE0A7EA8239B8A7E001E6997 /* About.xib */ = { + isa = PBXVariantGroup; + children = ( + FE0A7EA9239B8A7E001E6997 /* Base */, + ); + name = About.xib; + sourceTree = ""; + }; FE1B1095235615950065200C /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/projectfiles/xcode/Emulator/AppDelegate.h b/projectfiles/xcode/Emulator/AppDelegate.h index a3317a03c..d8615f6d9 100644 --- a/projectfiles/xcode/Emulator/AppDelegate.h +++ b/projectfiles/xcode/Emulator/AppDelegate.h @@ -36,5 +36,6 @@ - (IBAction) displayLogViewer:(id) sender; - (IBAction) displayPreferences:(id) sender; - (IBAction) displayLauncher:(id) sender; +- (IBAction) displayAbout:(id) sender; @end diff --git a/projectfiles/xcode/Emulator/AppDelegate.m b/projectfiles/xcode/Emulator/AppDelegate.m index 3e7e090a7..d3ddcff69 100644 --- a/projectfiles/xcode/Emulator/AppDelegate.m +++ b/projectfiles/xcode/Emulator/AppDelegate.m @@ -14,6 +14,7 @@ #import "FBLogViewerController.h" #import "FBPreferencesController.h" #import "FBLauncherController.h" +#import "FBAboutController.h" @interface AppDelegate () @@ -29,6 +30,7 @@ static AppDelegate *sharedInstance = nil; FBPreferencesController *prefs; FBEmulatorController *emulator; FBLauncherController *launcher; + FBAboutController *about; IOPMAssertionID sleepAssertId; } @@ -143,6 +145,13 @@ static AppDelegate *sharedInstance = nil; [launcher showWindow:self]; } +- (void) displayAbout:(id) sender +{ + if (!about) + about = [FBAboutController new]; + [about showWindow:self]; +} + #pragma mark - Public - (void) loadPath:(NSString *) path diff --git a/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/Contents.json b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/Contents.json new file mode 100644 index 000000000..855c4beee --- /dev/null +++ b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LargeAppIcon_256.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LargeAppIcon_512.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_256.png b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_256.png new file mode 100644 index 000000000..ebd9ad783 Binary files /dev/null and b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_256.png differ diff --git a/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_512.png b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_512.png new file mode 100644 index 000000000..445426079 Binary files /dev/null and b/projectfiles/xcode/Emulator/Assets.xcassets/AppIconLarge.imageset/LargeAppIcon_512.png differ diff --git a/projectfiles/xcode/Emulator/Base.lproj/About.xib b/projectfiles/xcode/Emulator/Base.lproj/About.xib new file mode 100644 index 000000000..3d67acdc9 --- /dev/null +++ b/projectfiles/xcode/Emulator/Base.lproj/About.xib @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ⓒ 2019 Akop Karapetyan
© 2004-2019 Team FB Neo
© 2001 Dave

You may freely use, modify, and distribute both the FB Neo source code and binary, however restrictions apply to the FB Neo original material.

See License below for more information. + + + + Ⓒ 2014-2019 Akop Karapetyan © 2004-2018 Team FB Alpha © 2001 Dave For FBA license information, see "FinalBurn Alpha License" below. For license information on FinalBurn X and its components, see "FinalBurn X License" below. + + + + + + + + + + + + + + diff --git a/projectfiles/xcode/Emulator/Base.lproj/MainMenu.xib b/projectfiles/xcode/Emulator/Base.lproj/MainMenu.xib index 9c334966e..a87a107f4 100644 --- a/projectfiles/xcode/Emulator/Base.lproj/MainMenu.xib +++ b/projectfiles/xcode/Emulator/Base.lproj/MainMenu.xib @@ -24,7 +24,7 @@ - + diff --git a/projectfiles/xcode/Emulator/Controllers/FBAboutController.h b/projectfiles/xcode/Emulator/Controllers/FBAboutController.h new file mode 100644 index 000000000..cf1f815bf --- /dev/null +++ b/projectfiles/xcode/Emulator/Controllers/FBAboutController.h @@ -0,0 +1,23 @@ +// +// FBAboutController.h +// Emulator +// +// Created by Akop Karapetyan on 12/06/19. +// Copyright © 2019 Akop Karapetyan. All rights reserved. +// + +#import + +@interface FBWhitePanelView : NSView + +@end + +@interface FBAboutController : NSWindowController +{ + IBOutlet NSTextField *versionNumberField; + IBOutlet NSTextField *appNameField; +} + +- (IBAction) openLicense:(id) sender; + +@end diff --git a/projectfiles/xcode/Emulator/Controllers/FBAboutController.m b/projectfiles/xcode/Emulator/Controllers/FBAboutController.m new file mode 100644 index 000000000..bd98bce2b --- /dev/null +++ b/projectfiles/xcode/Emulator/Controllers/FBAboutController.m @@ -0,0 +1,65 @@ +// +// FBAboutController.m +// Emulator +// +// Created by Akop Karapetyan on 12/06/19. +// Copyright © 2019 Akop Karapetyan. All rights reserved. +// + +#import "FBAboutController.h" + +#pragma mark - FBWhitePanelView + +@implementation FBWhitePanelView + +- (void) drawRect:(NSRect) dirtyRect +{ + [NSColor.whiteColor setFill]; + NSRectFill(dirtyRect); +} + +@end + +#pragma mark - FBAboutController + +@interface FBAboutController () + +@end + +@implementation FBAboutController + +- (id) init +{ + if (self = [super initWithWindowNibName:@"About"]) { + } + + return self; +} + +- (void) awakeFromNib +{ + NSDictionary *infoDict = NSBundle.mainBundle.infoDictionary; + NSMutableAttributedString *appName = appNameField.attributedStringValue.mutableCopy; + [appName beginEditing]; + [appName replaceCharactersInRange:NSMakeRange(0, appName.length) + withString:infoDict[@"CFBundleName"]]; + [appName applyFontTraits:NSBoldFontMask + range:NSMakeRange(appName.length - 3, 3)]; + [appName endEditing]; + + appNameField.attributedStringValue = appName; + versionNumberField.stringValue = [NSString stringWithFormat:NSLocalizedString(@"Version %@", nil), + infoDict[@"CFBundleShortVersionString"]]; +} + +#pragma mark - Actions + +- (void) openLicense:(id) sender +{ + NSString *documentPath = [NSBundle.mainBundle pathForResource:@"license" + ofType:@"txt"]; + [NSWorkspace.sharedWorkspace openURL:[NSURL fileURLWithPath:documentPath]]; +} + + +@end diff --git a/projectfiles/xcode/Emulator/Controllers/FBLauncherController.m b/projectfiles/xcode/Emulator/Controllers/FBLauncherController.m index af15f49e5..8bf86c35e 100644 --- a/projectfiles/xcode/Emulator/Controllers/FBLauncherController.m +++ b/projectfiles/xcode/Emulator/Controllers/FBLauncherController.m @@ -252,7 +252,8 @@ [romSetTreeController rearrangeObjects]; // Restore selection - romSetTreeController.selectionIndexPaths = selection; + if (selection) + romSetTreeController.selectionIndexPaths = selection; } - (NSString *) setCachePath