20 |
20 |
21 |
21 |
22 #import "OverlayViewController.h" |
22 #import "OverlayViewController.h" |
23 #import "InGameMenuViewController.h" |
23 #import "InGameMenuViewController.h" |
24 #import "HelpPageViewController.h" |
24 #import "HelpPageViewController.h" |
25 #import "AmmoMenuViewController.h" |
|
26 #import "CGPointUtils.h" |
25 #import "CGPointUtils.h" |
27 #import "ObjcExports.h" |
26 #import "ObjcExports.h" |
28 |
27 |
29 |
28 |
30 #define HIDING_TIME_DEFAULT [NSDate dateWithTimeIntervalSinceNow:2.7] |
29 #define HIDING_TIME_DEFAULT [NSDate dateWithTimeIntervalSinceNow:2.7] |
31 #define HIDING_TIME_NEVER [NSDate dateWithTimeIntervalSinceNow:10000] |
30 #define HIDING_TIME_NEVER [NSDate dateWithTimeIntervalSinceNow:10000] |
32 #define doDim() [dimTimer setFireDate: (IS_DUALHEAD()) ? HIDING_TIME_NEVER : HIDING_TIME_DEFAULT] |
31 #define doDim() [dimTimer setFireDate:HIDING_TIME_DEFAULT] |
33 #define doNotDim() [dimTimer setFireDate:HIDING_TIME_NEVER] |
32 #define doNotDim() [dimTimer setFireDate:HIDING_TIME_NEVER] |
34 |
33 |
35 |
34 |
36 static OverlayViewController *mainOverlay; |
35 static OverlayViewController *mainOverlay; |
37 |
36 |
38 @implementation OverlayViewController |
37 @implementation OverlayViewController |
39 @synthesize popoverController, popupMenu, helpPage, amvc, initialScreenCount, loadingIndicator, |
38 @synthesize popoverController, popupMenu, helpPage, loadingIndicator, confirmButton, grenadeTimeSegment; |
40 confirmButton, grenadeTimeSegment; |
|
41 |
39 |
42 #pragma mark - |
40 #pragma mark - |
43 #pragma mark rotation |
41 #pragma mark rotation |
44 |
42 |
45 -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { |
43 -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { |
50 #pragma mark View Management |
48 #pragma mark View Management |
51 -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { |
49 -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { |
52 if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { |
50 if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { |
53 isAttacking = NO; |
51 isAttacking = NO; |
54 isPopoverVisible = NO; |
52 isPopoverVisible = NO; |
55 initialScreenCount = (IS_DUALHEAD() ? 2 : 1); |
|
56 loadingIndicator = nil; |
53 loadingIndicator = nil; |
57 mainOverlay = self; |
54 mainOverlay = self; |
58 } |
55 } |
59 return self; |
56 return self; |
60 } |
57 } |
65 |
62 |
66 -(void) viewDidLoad { |
63 -(void) viewDidLoad { |
67 // fill all the screen available as sdlview disables autoresizing |
64 // fill all the screen available as sdlview disables autoresizing |
68 self.view.frame = [[UIScreen mainScreen] safeBounds]; |
65 self.view.frame = [[UIScreen mainScreen] safeBounds]; |
69 // the timer used to dim the overlay |
66 // the timer used to dim the overlay |
70 dimTimer = [[NSTimer alloc] initWithFireDate:(IS_DUALHEAD()) ? HIDING_TIME_NEVER : [NSDate dateWithTimeIntervalSinceNow:6] |
67 dimTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:6] |
71 interval:1000 |
68 interval:1000 |
72 target:self |
69 target:self |
73 selector:@selector(dimOverlay) |
70 selector:@selector(dimOverlay) |
74 userInfo:nil |
71 userInfo:nil |
75 repeats:YES]; |
72 repeats:YES]; |
79 // display the help page, required by the popover on ipad |
76 // display the help page, required by the popover on ipad |
80 [[NSNotificationCenter defaultCenter] addObserver:self |
77 [[NSNotificationCenter defaultCenter] addObserver:self |
81 selector:@selector(showHelp:) |
78 selector:@selector(showHelp:) |
82 name:@"show help ingame" |
79 name:@"show help ingame" |
83 object:nil]; |
80 object:nil]; |
84 |
|
85 if (IS_IPAD()) { |
|
86 [[NSNotificationCenter defaultCenter] addObserver:self |
|
87 selector:@selector(numberOfScreensIncreased) |
|
88 name:UIScreenDidConnectNotification |
|
89 object:nil]; |
|
90 |
|
91 [[NSNotificationCenter defaultCenter] addObserver:self |
|
92 selector:@selector(numberOfScreensDecreased) |
|
93 name:UIScreenDidDisconnectNotification |
|
94 object:nil]; |
|
95 } |
|
96 |
81 |
97 // present the overlay |
82 // present the overlay |
98 self.view.alpha = 0; |
83 self.view.alpha = 0; |
99 [UIView beginAnimations:@"showing overlay" context:NULL]; |
84 [UIView beginAnimations:@"showing overlay" context:NULL]; |
100 [UIView setAnimationDuration:2]; |
85 [UIView setAnimationDuration:2]; |
113 dimTimer = nil; |
98 dimTimer = nil; |
114 mainOverlay = nil; |
99 mainOverlay = nil; |
115 self.helpPage = nil; |
100 self.helpPage = nil; |
116 [self dismissPopover]; |
101 [self dismissPopover]; |
117 self.popoverController = nil; |
102 self.popoverController = nil; |
118 self.amvc = nil; |
|
119 self.loadingIndicator = nil; |
103 self.loadingIndicator = nil; |
120 MSG_DIDUNLOAD(); |
104 MSG_DIDUNLOAD(); |
121 [super viewDidUnload]; |
105 [super viewDidUnload]; |
122 } |
106 } |
123 |
107 |
124 -(void) didReceiveMemoryWarning { |
108 -(void) didReceiveMemoryWarning { |
125 if (self.popupMenu.view.superview == nil) |
109 if (self.popupMenu.view.superview == nil) |
126 self.popupMenu = nil; |
110 self.popupMenu = nil; |
127 if (self.helpPage.view.superview == nil) |
111 if (self.helpPage.view.superview == nil) |
128 self.helpPage = nil; |
112 self.helpPage = nil; |
129 if (self.amvc.view.superview == nil) |
|
130 self.amvc = nil; |
|
131 if (self.loadingIndicator.superview == nil) |
113 if (self.loadingIndicator.superview == nil) |
132 self.loadingIndicator = nil; |
114 self.loadingIndicator = nil; |
133 if (self.confirmButton.superview == nil) |
115 if (self.confirmButton.superview == nil) |
134 self.confirmButton = nil; |
116 self.confirmButton = nil; |
135 if (self.grenadeTimeSegment.superview == nil) |
117 if (self.grenadeTimeSegment.superview == nil) |
144 |
126 |
145 -(void) dealloc { |
127 -(void) dealloc { |
146 releaseAndNil(popupMenu); |
128 releaseAndNil(popupMenu); |
147 releaseAndNil(helpPage); |
129 releaseAndNil(helpPage); |
148 releaseAndNil(popoverController); |
130 releaseAndNil(popoverController); |
149 releaseAndNil(amvc); |
|
150 releaseAndNil(loadingIndicator); |
131 releaseAndNil(loadingIndicator); |
151 releaseAndNil(confirmButton); |
132 releaseAndNil(confirmButton); |
152 releaseAndNil(grenadeTimeSegment); |
133 releaseAndNil(grenadeTimeSegment); |
153 // dimTimer is autoreleased |
134 // dimTimer is autoreleased |
154 [super dealloc]; |
135 [super dealloc]; |
155 } |
|
156 |
|
157 -(void) numberOfScreensIncreased { |
|
158 if (self.initialScreenCount == 1) { |
|
159 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New display detected" |
|
160 message:NSLocalizedString(@"Hedgewars supports multi-monitor configurations, but the screen has to be connected before launching the game.",@"") |
|
161 delegate:nil |
|
162 cancelButtonTitle:@"Ok" |
|
163 otherButtonTitles:nil]; |
|
164 [alert show]; |
|
165 [alert release]; |
|
166 HW_pause(); |
|
167 } |
|
168 } |
|
169 |
|
170 -(void) numberOfScreensDecreased { |
|
171 if (self.initialScreenCount == 2) { |
|
172 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oh noes! Display disconnected" |
|
173 message:NSLocalizedString(@"A monitor has been disconnected while playing and this has ended the match! You need to restart the game if you wish to use the second display again.",@"") |
|
174 delegate:nil |
|
175 cancelButtonTitle:@"Ok" |
|
176 otherButtonTitles:nil]; |
|
177 [alert show]; |
|
178 [alert release]; |
|
179 HW_terminate(NO); |
|
180 } |
|
181 } |
136 } |
182 |
137 |
183 #pragma mark - |
138 #pragma mark - |
184 #pragma mark overlay appearance |
139 #pragma mark overlay appearance |
185 // nice transition for dimming, should be called only by the timer himself |
140 // nice transition for dimming, should be called only by the timer himself |
279 case 6: |
234 case 6: |
280 HW_backjump(); |
235 HW_backjump(); |
281 break; |
236 break; |
282 case 10: |
237 case 10: |
283 [AudioManagerController playClickSound]; |
238 [AudioManagerController playClickSound]; |
284 clearView(); |
|
285 HW_pause(); |
239 HW_pause(); |
286 if (self.amvc.isVisible && IS_DUALHEAD() == NO) { |
|
287 doDim(); |
|
288 [self.amvc disappear]; |
|
289 } |
|
290 clearView(); |
240 clearView(); |
291 [self showPopover]; |
241 [self showPopover]; |
292 break; |
242 break; |
293 case 11: |
243 case 11: |
294 [AudioManagerController playClickSound]; |
244 [AudioManagerController playClickSound]; |
295 clearView(); |
245 clearView(); |
296 |
246 HW_ammoMenu(); |
297 if (IS_DUALHEAD() || [[[NSUserDefaults standardUserDefaults] objectForKey:@"classic_menu"] boolValue] == NO) { |
|
298 if (self.amvc == nil) |
|
299 self.amvc = [[AmmoMenuViewController alloc] init]; |
|
300 |
|
301 if (self.amvc.isVisible) { |
|
302 doDim(); |
|
303 [self.amvc disappear]; |
|
304 } else { |
|
305 if (HW_isAmmoMenuNotAllowed() == NO) { |
|
306 doNotDim(); |
|
307 [self.amvc appearInView:self.view]; |
|
308 } |
|
309 } |
|
310 } else |
|
311 HW_ammoMenu(); |
|
312 break; |
247 break; |
313 default: |
248 default: |
314 DLog(@"Nope"); |
249 DLog(@"Nope"); |
315 break; |
250 break; |
316 } |
251 } |