@@ -305,33 +305,39 @@ private void updateStateLocked(GameContext gameContext) {
305
305
* The ghost speed is slower than outside, but I do not know the exact value.
306
306
*/
307
307
private void updateStateLeavingHouse (GameContext gameContext ) {
308
- if (gameContext .optGameLevel ().isPresent ()) {
309
- GameLevel level = gameContext .gameLevel ();
310
- House house = level .house ().orElse (null );
311
- if (house == null ) {
312
- Logger .error ("No ghost house in level? WTF!" );
313
- return ;
314
- }
315
- float speedInsideHouse = gameContext .game ().actorSpeedControl ().ghostSpeedInsideHouse (gameContext , level , this );
316
- Vector2f houseEntryPosition = house .entryPosition ();
317
- Vector2f position = position ();
318
- if (position .y () <= houseEntryPosition .y ()) {
319
- // has raised and is outside house
320
- setPosition (houseEntryPosition );
321
- setMoveDir (LEFT );
322
- setWishDir (LEFT );
323
- newTileEntered = false ; // force moving left until new tile is entered
324
- if (level .pac ().powerTimer ().isRunning () && !level .victims ().contains (this )) {
325
- setState (GhostState .FRIGHTENED );
326
- } else {
327
- setState (GhostState .HUNTING_PAC );
328
- }
329
- return ;
308
+ Optional <GameLevel > optGameLevel = gameContext .optGameLevel ();
309
+ if (optGameLevel .isEmpty ()) {
310
+ Logger .error ("No game level? WTF!" );
311
+ return ;
312
+ }
313
+ Optional <House > optHouse = optGameLevel .flatMap (GameLevel ::house );
314
+ if (optHouse .isEmpty ()) {
315
+ Logger .error ("No house? WTF!" );
316
+ return ;
317
+ }
318
+ GameLevel gameLevel = optGameLevel .get ();
319
+ House house = optHouse .get ();
320
+
321
+ Vector2f position = position ();
322
+ Vector2f houseEntryPosition = house .entryPosition ();
323
+ if (position .y () <= houseEntryPosition .y ()) {
324
+ // is outside house at entry
325
+ setY (houseEntryPosition .y ());
326
+ setMoveDir (LEFT );
327
+ setWishDir (LEFT );
328
+ newTileEntered = false ; // don't change direction until new tile is entered
329
+ if (gameLevel .pac ().powerTimer ().isRunning () && !gameLevel .victims ().contains (this )) {
330
+ setState (GhostState .FRIGHTENED );
331
+ } else {
332
+ setState (GhostState .HUNTING_PAC );
330
333
}
331
- // move inside house
334
+ }
335
+ else {
336
+ // still inside house
337
+ float speed = gameContext .game ().actorSpeedControl ().ghostSpeedInsideHouse (gameContext , gameLevel , this );
332
338
float centerX = position .x () + HTS ;
333
339
float houseCenterX = house .center ().x ();
334
- if (differsAtMost (0.5f * speedInsideHouse , centerX , houseCenterX )) {
340
+ if (differsAtMost (0.5f * speed , centerX , houseCenterX )) {
335
341
// align horizontally and raise
336
342
setX (houseCenterX - HTS );
337
343
setMoveDir (UP );
@@ -341,9 +347,9 @@ private void updateStateLeavingHouse(GameContext gameContext) {
341
347
setMoveDir (centerX < houseCenterX ? RIGHT : LEFT );
342
348
setWishDir (centerX < houseCenterX ? RIGHT : LEFT );
343
349
}
344
- setSpeed (speedInsideHouse );
350
+ setSpeed (speed );
345
351
move ();
346
- if (level .pac ().powerTimer ().isRunning () && !level .victims ().contains (this )) {
352
+ if (gameLevel .pac ().powerTimer ().isRunning () && !gameLevel .victims ().contains (this )) {
347
353
updateFrightenedAnimation (gameContext );
348
354
} else {
349
355
selectAnimation (ANIM_GHOST_NORMAL );
0 commit comments