@@ -288,7 +288,8 @@ void cFodder::Camera_Speed_Calculate()
288288
289289 // loc_11B9C
290290 // Calculate maximum right position of camera
291- Data0 = mMapLoaded ->getWidthPixels () - getCameraWidth ();
291+ const int32 originXPixels = (int32)getMapVisibleOriginX () << 4 ;
292+ Data0 = originXPixels + getMapVisibleWidthPixels () - getCameraWidth ();
292293 Data0 = (Data0 << 16 ) | (Data0 >> 16 );
293294
294295 int32 Data4 = mCameraX + mCamera_Speed_X ;
@@ -298,7 +299,8 @@ void cFodder::Camera_Speed_Calculate()
298299 mCamera_Speed_X = Data0;
299300 }
300301 // loc_11BE8
301- Data0 = mMapLoaded ->getHeightPixels () - getCameraHeight ();
302+ const int32 originYPixels = (int32)getMapVisibleOriginY () << 4 ;
303+ Data0 = originYPixels + getMapVisibleHeightPixels () - getCameraHeight ();
302304 Data0 = (Data0 << 16 ) | (Data0 >> 16 );
303305
304306 Data4 = mCameraY + mCamera_Speed_Y ;
@@ -353,23 +355,30 @@ void cFodder::Camera_SetTargetToStartPosition()
353355 int16 Data0 = mCameraX >> 16 ;
354356 int16 Data4 = mCameraY >> 16 ;
355357
358+ const int16 originXPixels = (int16)getMapVisibleOriginX () << 4 ;
359+ const int16 originYPixels = (int16)getMapVisibleOriginY () << 4 ;
360+
356361 int16 Data8 = mCamera_StartPosition_X ;
357362 Data8 -= (getCameraWidth () / 2 ) - 8 ;
358- if (Data8 < 0 )
359- Data8 = 0 ;
363+ if (Data8 < originXPixels )
364+ Data8 = originXPixels ;
360365
361- int16 Data10 = mMapLoaded -> getWidthPixels ();
366+ int16 Data10 = originXPixels + (int16) getMapVisibleWidthPixels ();
362367 Data10 -= (getCameraWidth () / 2 ) - 8 ;
368+ if (Data10 < originXPixels)
369+ Data10 = originXPixels;
363370 if (Data8 >= Data10)
364371 Data8 = Data10;
365372
366373 int16 DataC = mCamera_StartPosition_Y ;
367374 DataC -= (getCameraHeight () - 8 ) / 2 ;
368- if (DataC < 0 )
369- DataC = 0 ;
375+ if (DataC < originYPixels )
376+ DataC = originYPixels ;
370377
371- Data10 = mMapLoaded -> getHeightPixels ();
378+ Data10 = originYPixels + (int16) getMapVisibleHeightPixels ();
372379 Data10 -= (getCameraHeight () - 8 ) / 2 ;
380+ if (Data10 < originYPixels)
381+ Data10 = originYPixels;
373382 if (DataC >= Data10)
374383 DataC = Data10;
375384
@@ -465,21 +474,31 @@ void cFodder::Camera_Pan_ComputeSpeed()
465474
466475 Data4 >>= 4 ;
467476
468- int16 Data8 = mMapLoaded ->getWidth ();
469- Data8 -= (getCameraWidth () >> 4 ) + 1 ;
477+ int16 MinTileX = getMapVisibleOriginX ();
478+ int16 MinTileY = getMapVisibleOriginY ();
479+
480+ int16 Data8 = getMapVisibleOriginX () + getMapVisibleWidth ();
481+ const int16 cameraTiles = (getCameraWidth () >> 4 );
482+ const int16 rightPadding = isAmigaMapBounds () ? 0 : 1 ;
483+ Data8 -= cameraTiles + rightPadding;
470484
471- if (Data8 < 0 )
472- Data8 = 0 ;
485+ if (Data8 < MinTileX )
486+ Data8 = MinTileX ;
473487
474- if (Data0 >= Data8)
488+ if (Data0 < MinTileX)
489+ Data0 = MinTileX;
490+ if (Data0 > Data8)
475491 Data0 = Data8;
476492
477- Data8 = mMapLoaded ->getHeight ();
478- Data8 -= (getCameraHeight () + 32 ) >> 4 ;
479- if (Data8 < 0 )
480- Data8 = 0 ;
493+ Data8 = getMapVisibleOriginY () + getMapVisibleHeight ();
494+ const int16 yPadPixels = isAmigaMapBounds () ? 16 : 32 ;
495+ Data8 -= (getCameraHeight () + yPadPixels) >> 4 ;
496+ if (Data8 < MinTileY)
497+ Data8 = MinTileY;
481498
482- if (Data4 >= Data8)
499+ if (Data4 < MinTileY)
500+ Data4 = MinTileY;
501+ if (Data4 > Data8)
483502 Data4 = Data8;
484503
485504 Data8 = mCameraX >> 16 ;
@@ -554,15 +573,13 @@ void cFodder::Camera_TileSpeedX_Set()
554573 mCamera_TileSpeed_Overflow = 0 ;
555574
556575 int32 dword_39F5A = mCameraX ;
576+ const int32 minCameraX = ((int32)getMapVisibleOriginX () << 4 ) << 16 ;
557577
558578 mCameraX += mCamera_Speed_X ;
559- if (mCameraX < 0 )
579+ if (mCameraX < minCameraX )
560580 {
561- mCamera_Speed_X = dword_39F5A;
562- if (mCamera_Speed_X )
563- mCamera_Speed_X = -mCamera_Speed_X ;
564-
565- mCameraX = 0 ;
581+ mCamera_Speed_X = 0 ;
582+ mCameraX = minCameraX;
566583 }
567584 // loc_12147
568585 mCamera_TileSpeedX += mCamera_Speed_X ;
@@ -596,16 +613,13 @@ void cFodder::Camera_TileSpeedY_Set()
596613{
597614
598615 int32 dword_39F5A = mCameraY ;
616+ const int32 minCameraY = ((int32)getMapVisibleOriginY () << 4 ) << 16 ;
599617
600618 mCameraY += mCamera_Speed_Y ;
601- if (mCameraY < 0 )
619+ if (mCameraY < minCameraY )
602620 {
603- mCamera_Speed_Y = dword_39F5A;
604-
605- if (mCamera_Speed_Y )
606- mCamera_Speed_Y = -mCamera_Speed_Y ;
607-
608- mCameraY = 0 ;
621+ mCamera_Speed_Y = 0 ;
622+ mCameraY = minCameraY;
609623 }
610624
611625 // loc_121F2
0 commit comments