Maelstrom: Separated the coordinate system used by the game from that used for display.

https://github.com/libsdl-org/Maelstrom/commit/2faff00c92c73c0b3bdde070235a19f08d007a89

From 2faff00c92c73c0b3bdde070235a19f08d007a89 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 22 Sep 2012 01:28:08 -0700
Subject: [PATCH] Separated the coordinate system used by the game from that
 used for display. This allows us to have the game running at high resolution
 but still be network simulation compatible with games running at other
 resolutions.

---
 Data/UI/continue.xml     |   2 +-
 Data/UI/feature.xml      |   2 +-
 Maelstrom_Data.zip       | Bin 1111704 -> 1111725 bytes
 game/Maelstrom.h         |   4 +++-
 game/Maelstrom_Globals.h |   4 +---
 game/about.cpp           |  19 ++++++++++++++-----
 game/game.cpp            |  26 +++++++++++++++++++++++---
 game/game.h              |   2 ++
 game/init.cpp            |  34 +++++++++++++++++++---------------
 game/main.cpp            |  16 +---------------
 game/make.cpp            |  32 +++++++++++++-------------------
 game/object.cpp          |  13 ++++++-------
 game/object.h            |   3 +++
 game/player.cpp          |  21 ++++++++-------------
 game/shinobi.h           |   4 ++--
 15 files changed, 97 insertions(+), 85 deletions(-)

diff --git a/Data/UI/continue.xml b/Data/UI/continue.xml
index 28571f21..c4920e76 100644
--- a/Data/UI/continue.xml
+++ b/Data/UI/continue.xml
@@ -1,6 +1,6 @@
 <Dialog delegate="ContinuePanel">
 	<Size w="273" h="103"/>
-	<Anchor anchorFrom="TOPLEFT" anchorTo="TOPLEFT" x="183" y="93"/>
+	<Anchor anchorFrom="TOPLEFT" anchorTo="CENTER" x="-137" y="-147"/>
 	<Elements>
 		<Icon name="icon" id="103">
 			<Anchor anchorFrom="TOPLEFT" anchorTo="TOPLEFT" x="19" y="19"/>
diff --git a/Data/UI/feature.xml b/Data/UI/feature.xml
index 2fc13c70..2abe2b86 100644
--- a/Data/UI/feature.xml
+++ b/Data/UI/feature.xml
@@ -1,6 +1,6 @@
 <Dialog>
 	<Size w="273" h="103"/>
-	<Anchor anchorFrom="TOPLEFT" anchorTo="TOPLEFT" x="183" y="93"/>
+	<Anchor anchorFrom="TOPLEFT" anchorTo="CENTER" x="-137" y="-147"/>
 	<Elements>
 		<Icon name="icon" id="103">
 			<Anchor anchorFrom="TOPLEFT" anchorTo="TOPLEFT" x="19" y="19"/>
diff --git a/Maelstrom_Data.zip b/Maelstrom_Data.zip
index 64e0b00aac59df3841ca52c6111f20275e590117..36541a8a30ea4290cd8db3d064476b38a9b170b7 100644
GIT binary patch
delta 14262
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

delta 14216
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

diff --git a/game/Maelstrom.h b/game/Maelstrom.h
index aea32e54..340b9e95 100644
--- a/game/Maelstrom.h
+++ b/game/Maelstrom.h
@@ -27,6 +27,8 @@
 #endif
 #define	VERSION_STRING		VERSION ".N"
 
+#define GAME_WIDTH		640
+#define GAME_HEIGHT		480
 #define SCREEN_WIDTH		640
 #define SCREEN_HEIGHT		480
 
@@ -46,7 +48,7 @@
 #define	MAX_STARS		30
 #define	SHIP_FRAMES		48
 #define	SPRITES_WIDTH		32
-#define SPRITE_PRECISION	4	/* internal <--> screen precision */
+#define	SPRITE_PRECISION	4	/* sprite <--> game precision */
 #define	VEL_FACTOR		4
 #define	VEL_MAX			(8<<SPRITE_PRECISION)
 #define	SCALE_FACTOR		16
diff --git a/game/Maelstrom_Globals.h b/game/Maelstrom_Globals.h
index 73da05ed..8c19d78b 100644
--- a/game/Maelstrom_Globals.h
+++ b/game/Maelstrom_Globals.h
@@ -100,9 +100,7 @@ extern Bool	gRunning;
 // in init.cpp : 
 extern char    *gReplayFile;
 extern Sint32	gLastHigh;
-extern Rect	gScrnRect;
-extern SDL_Rect	gClipRect;
-extern int	gStatusLine;
+extern SDL_Rect gScrnRect;
 extern MPoint	gShotOrigins[SHIP_FRAMES];
 extern MPoint	gThrustOrigins[SHIP_FRAMES];
 extern MPoint	gVelocityTable[SHIP_FRAMES];
diff --git a/game/about.cpp b/game/about.cpp
index 229218a0..663509ac 100644
--- a/game/about.cpp
+++ b/game/about.cpp
@@ -28,10 +28,14 @@
 void
 AboutPanelDelegate::OnShow()
 {
+	int centerX, centerY;
 	int x, y, off;
 
-	x = (80) * SCALE_FACTOR;
-	y = (136) * SCALE_FACTOR;
+	centerX = screen->Width() / 2;
+	centerY = screen->Height() / 2;
+
+	x = (centerX - 240) * SCALE_FACTOR;
+	y = (centerY - 104) * SCALE_FACTOR;
 	off = 39 * SCALE_FACTOR;
 
 	objects[numsprites++] = 
@@ -51,8 +55,8 @@ AboutPanelDelegate::OnShow()
 	y += off;
 
 	/* -- Now for the second column */
-	x = (340) * SCALE_FACTOR;
-	y = (136) * SCALE_FACTOR;
+	x = (centerX + 20) * SCALE_FACTOR;
+	y = (centerY - 104) * SCALE_FACTOR;
 	off = 39 * SCALE_FACTOR;
 
 	objects[numsprites++] = 
@@ -93,6 +97,11 @@ AboutPanelDelegate::OnDraw()
 
 	for ( i=0; i<numsprites; ++i ) {
 		objects[i]->Move(0);
-		objects[i]->BlitSprite();
+
+		int x, y;
+		objects[i]->GetPos(&x, &y);
+		x >>= SPRITE_PRECISION;
+		y >>= SPRITE_PRECISION;
+		screen->QueueBlit(x, y, objects[i]->GetSprite());
 	}
 }
diff --git a/game/game.cpp b/game/game.cpp
index edee104d..da9eb859 100644
--- a/game/game.cpp
+++ b/game/game.cpp
@@ -419,8 +419,10 @@ GamePanelDelegate::OnDraw()
 
 	/* -- Draw the star field */
 	for ( i=0; i<MAX_STARS; ++i ) {
-		screen->DrawPoint(gTheStars[i]->xCoord, 
-			gTheStars[i]->yCoord, gTheStars[i]->color);
+		int x = (gTheStars[i]->xCoord << SPRITE_PRECISION);
+		int y = (gTheStars[i]->yCoord << SPRITE_PRECISION);
+		GetRenderCoordinates(x, y);
+		screen->DrawPoint(x, y, gTheStars[i]->color);
 	}
 
 	/* -- Blit all the sprites */
@@ -964,7 +966,7 @@ GamePanelDelegate::NextWave()
 	for (i = 0; i < NewRoids; i++) {
 		int	randval;
 	
-		x = FastRandom(SCREEN_WIDTH) * SCALE_FACTOR;
+		x = FastRandom(GAME_WIDTH) * SCALE_FACTOR;
 		y = 0;
 	
 		randval = FastRandom(10);
@@ -991,3 +993,21 @@ GamePanelDelegate::GameOver()
 
 	QuitPlayerControls();
 }
+
+/* ----------------------------------------------------------------- */
+/* -- Convert from sprite coordinates to render coordinates */
+
+void GetRenderCoordinates(int &x, int &y)
+{
+	x = gScrnRect.x + (int)(((float)x * gScrnRect.w) / (GAME_WIDTH << SPRITE_PRECISION));
+	y = gScrnRect.y + (int)(((float)y * gScrnRect.h) / (GAME_HEIGHT << SPRITE_PRECISION));
+}
+
+/* ----------------------------------------------------------------- */
+/* -- Render a sprite on the screen */
+
+void RenderSprite(int x, int y, SDL_Texture *sprite)
+{
+	GetRenderCoordinates(x, y);
+	screen->QueueBlit(x, y, sprite);
+}
diff --git a/game/game.h b/game/game.h
index a6575b3f..596128f6 100644
--- a/game/game.h
+++ b/game/game.h
@@ -72,5 +72,7 @@ class GamePanelDelegate : public UIPanelDelegate
 
 extern void NewGame(void);
 extern void ContinueGame(void);
+extern void GetRenderCoordinates(int &x, int &y);
+extern void RenderSprite(int x, int y, SDL_Texture *sprite);
 
 #endif // _game_h
diff --git a/game/init.cpp b/game/init.cpp
index 4814e79a..cf95d79e 100644
--- a/game/init.cpp
+++ b/game/init.cpp
@@ -29,6 +29,7 @@
 #include "Maelstrom_Globals.h"
 #include "load.h"
 #include "init.h"
+#include "game.h"
 #include "player.h"
 #include "colortable.h"
 #include "fastrand.h"
@@ -51,8 +52,7 @@ char   *gReplayFile;
 Sint32	gLastHigh;
 Uint32	gLastDrawn;
 int     gNumSprites;
-Rect	gScrnRect;
-SDL_Rect gClipRect;
+SDL_Rect gScrnRect;
 int	gStatusLine;
 MPoint	gShotOrigins[SHIP_FRAMES];
 MPoint	gThrustOrigins[SHIP_FRAMES];
@@ -113,8 +113,11 @@ static void DrawLoadBar(int stage)
 
 void SetStar(int which)
 {
-	gTheStars[which]->xCoord = gClipRect.x+FastRandom(gClipRect.w);
-	gTheStars[which]->yCoord = gClipRect.y+FastRandom(gClipRect.h);
+	int x = FastRandom(GAME_WIDTH - 2*SPRITES_WIDTH) + SPRITES_WIDTH;
+	int y = FastRandom(GAME_HEIGHT - 2*SPRITES_WIDTH) + SPRITES_WIDTH;
+
+	gTheStars[which]->xCoord = x;
+	gTheStars[which]->yCoord = y;
 	gTheStars[which]->color = gStarColors[FastRandom(20)];
 }	/* -- SetStar */
 
@@ -766,17 +769,18 @@ int DoInitializations(Uint32 window_flags, Uint32 render_flags)
 	ui = new MaelstromUI(screen, prefs);
 
 	/* -- We want to access the FULL screen! */
-	int startX = (screen->Width() - SCREEN_WIDTH) / 2;
-	int startY = (screen->Height() - SCREEN_HEIGHT) / 2;
-	SetRect(&gScrnRect, startX, startY, startX+SCREEN_WIDTH, startY+SCREEN_HEIGHT);
-	gStatusLine = (gScrnRect.bottom - gScrnRect.top - STATUS_HEIGHT);
-	gScrnRect.bottom -= STATUS_HEIGHT;
-
-	gClipRect.x = gScrnRect.left+SPRITES_WIDTH;
-	gClipRect.y = gScrnRect.top+SPRITES_WIDTH;
-	gClipRect.w = gScrnRect.right-gScrnRect.left-2*SPRITES_WIDTH;
-	gClipRect.h = gScrnRect.bottom-gScrnRect.top-2*SPRITES_WIDTH+STATUS_HEIGHT;
-	screen->ClipBlit(&gClipRect);
+	gScrnRect.x = 0;
+	gScrnRect.y = 0;
+	gScrnRect.w = screen->Width();
+	gScrnRect.h = screen->Height();
+
+	SDL_Rect clipRect;
+	clipRect.x = (SPRITES_WIDTH << SPRITE_PRECISION);
+	clipRect.y = (SPRITES_WIDTH << SPRITE_PRECISION);
+	GetRenderCoordinates(clipRect.x, clipRect.y);
+	clipRect.w = gScrnRect.w - clipRect.x*2;
+	clipRect.h = gScrnRect.h - clipRect.y*2;
+	screen->ClipBlit(&clipRect);
 
 	/* -- Throw up our intro screen */
 	screen->FadeOut();
diff --git a/game/main.cpp b/game/main.cpp
index 5e82b6ce..9e46465c 100644
--- a/game/main.cpp
+++ b/game/main.cpp
@@ -577,21 +577,7 @@ MainPanelDelegate::OnTick()
 
 void Message(const char *message)
 {
-// FIXME: This totally doesn't work anymore, but that may not matter if we're cutting network support.
-	int x, y;
-	SDL_Texture *textimage;
-	if (!message) {
-		return;
-	}
-
-	/* This was taken from the DrawMainScreen function */
-	x = (SCREEN_WIDTH - 512) / 2;
-	y = 25;
-	textimage = fontserv->TextImage(message, fonts[NEWYORK_14], STYLE_BOLD, 0xCC, 0xCC, 0xCC);
-	if ( textimage ) {
-		screen->QueueBlit(x, y-screen->GetImageHeight(textimage)+2, textimage, NOCLIP);
-		fontserv->FreeText(textimage);
-	}
+	// FIXME: This totally doesn't work anymore
 }
 
 void DelayFrame(void)
diff --git a/game/make.cpp b/game/make.cpp
index d20abb82..9bab3c2d 100644
--- a/game/make.cpp
+++ b/game/make.cpp
@@ -22,6 +22,7 @@
 
 #include "Maelstrom_Globals.h"
 #include "make.h"
+#include "game.h"
 #include "netplay.h"
 #include "object.h"
 #include "player.h"
@@ -36,8 +37,7 @@ void MakeEnemy(void)
 {
 	int  newsprite, x, y;
 
-	y = FastRandom(gScrnRect.bottom-gScrnRect.top-SPRITES_WIDTH)
-							 + SPRITES_WIDTH;
+	y = FastRandom(GAME_HEIGHT - SPRITES_WIDTH) + SPRITES_WIDTH;
 	y *= SCALE_FACTOR;
 	x = 0;
 
@@ -63,8 +63,7 @@ void MakePrize(void)
 		cap = 1;
 	
 	for (index = 0; index < cap; index++) {
-		x = FastRandom(gScrnRect.right - gScrnRect.left -
-						SPRITES_WIDTH) + SPRITES_WIDTH;
+		x = FastRandom(GAME_WIDTH - SPRITES_WIDTH) + SPRITES_WIDTH;
 		y = 0;
 	
 		x *= SCALE_FACTOR;
@@ -101,9 +100,8 @@ void MakeMultiplier(void)
 {
 	int	newsprite, x, y;
 
-	x = FastRandom(gClipRect.w - SPRITES_WIDTH) + SPRITES_WIDTH;
-	y = FastRandom(gClipRect.h - SPRITES_WIDTH - STATUS_HEIGHT) 
-							+ SPRITES_WIDTH;
+	x = FastRandom(GAME_WIDTH - 3*SPRITES_WIDTH) + SPRITES_WIDTH;
+	y = FastRandom(GAME_HEIGHT - 3*SPRITES_WIDTH) + SPRITES_WIDTH;
 
 	x *= SCALE_FACTOR;
 	y *= SCALE_FACTOR;
@@ -126,9 +124,8 @@ void MakeNova(void)
 	if ( min_bad_distance )
 		--min_bad_distance;
 
-	x = FastRandom(gClipRect.w - SPRITES_WIDTH) + SPRITES_WIDTH;
-	y = FastRandom(gClipRect.h - SPRITES_WIDTH - STATUS_HEIGHT) 
-							+

(Patch may be truncated, please check the link at the top of this post.)