Continue story texts

This commit is contained in:
Miloslav Číž 2020-02-17 08:48:41 +01:00
parent ad60208c3f
commit fbac1e486b
4 changed files with 146 additions and 37 deletions

View File

@ -161,6 +161,11 @@
#define SFG_AMMO_INCREASE_ROCKETS 5 #define SFG_AMMO_INCREASE_ROCKETS 5
#define SFG_AMMO_INCREASE_PLASMA 8 #define SFG_AMMO_INCREASE_PLASMA 8
/**
Duration of story text (intro/outro) in ms.
*/
#define SFG_STORYTEXT_DURATION 15000
// ---------------------------- // ----------------------------
// derived constants // derived constants

91
main.c
View File

@ -1201,7 +1201,7 @@ void SFG_setAndInitLevel(const SFG_Level *level)
void SFG_setGameState(uint8_t state) void SFG_setGameState(uint8_t state)
{ {
SFG_game.state = state; SFG_game.state = state;
SFG_game.stateChangeTime = SFG_getTimeMs(); SFG_game.stateChangeTime = SFG_game.frameTime;
} }
void SFG_init() void SFG_init()
@ -2868,8 +2868,15 @@ void SFG_gameStepMenu()
switch (item) switch (item)
{ {
case SFG_MENU_ITEM_PLAY: case SFG_MENU_ITEM_PLAY:
SFG_setAndInitLevel(&SFG_levels[SFG_game.selectedLevel]); if (SFG_game.selectedLevel == 0)
SFG_setGameState(SFG_GAME_STATE_PLAYING); {
SFG_setGameState(SFG_GAME_STATE_INTRO);
}
else
{
SFG_setAndInitLevel(&SFG_levels[SFG_game.selectedLevel]);
SFG_setGameState(SFG_GAME_STATE_PLAYING);
}
break; break;
case SFG_MENU_ITEM_CONTINUE: case SFG_MENU_ITEM_CONTINUE:
@ -2957,6 +2964,15 @@ void SFG_gameStep()
break; break;
case SFG_GAME_STATE_INTRO:
if (SFG_keyJustPressed(SFG_KEY_A))
{
SFG_setAndInitLevel(&SFG_levels[0]);
SFG_setGameState(SFG_GAME_STATE_PLAYING);
}
break;
default: default:
break; break;
} }
@ -3041,25 +3057,33 @@ void SFG_drawText(
uint16_t x, uint16_t x,
uint16_t y, uint16_t y,
uint8_t size, uint8_t size,
uint8_t color) uint8_t color,
uint16_t maxLength,
uint16_t limitX)
{ {
if (size == 0) if (size == 0)
size = 1; size = 1;
if (limitX == 0)
limitX = 65535;
if (maxLength == 0)
maxLength = 65535;
uint16_t pos = 0; uint16_t pos = 0;
uint16_t currentX = x; uint16_t currentX = x;
uint16_t currentY = y; uint16_t currentY = y;
while (text[pos] != 0) while (text[pos] != 0 && pos < maxLength) // for each character
{ {
uint16_t character = SFG_font[SFG_charToFontIndex(text[pos])]; uint16_t character = SFG_font[SFG_charToFontIndex(text[pos])];
for (uint8_t i = 0; i < 4; ++i) for (uint8_t i = 0; i < SFG_FONT_CHARACTER_SIZE; ++i) // for each line
{ {
currentY = y; currentY = y;
for (uint8_t j = 0; j < 4; ++j) for (uint8_t j = 0; j < SFG_FONT_CHARACTER_SIZE; ++j) // for each row
{ {
if (character & 0x8000) if (character & 0x8000)
for (uint8_t k = 0; k < size; ++k) for (uint8_t k = 0; k < size; ++k)
@ -3078,20 +3102,43 @@ void SFG_drawText(
} }
currentX += size; currentX += size;
if (currentX >= SFG_GAME_RESOLUTION_X)
break;
} }
currentX += size; currentX += size; // space
if (currentX >= SFG_GAME_RESOLUTION_X) if (currentX > limitX)
break; {
currentX = x;
y += (SFG_FONT_CHARACTER_SIZE + 1) * size;
}
pos++; pos++;
} }
} }
/**
Draws fullscreen story text (intro/outro).
*/
void SFG_drawStoryText()
{
SFG_clearScreen(0);
const char *text = SFG_introText;
uint16_t textLen = 0;
while (text[textLen] != 0)
textLen++;
uint16_t drawLen =
RCL_min(textLen,
((SFG_game.frameTime - SFG_game.stateChangeTime) * textLen) /
SFG_STORYTEXT_DURATION + 1);
SFG_drawText(text,SFG_HUD_MARGIN,SFG_HUD_MARGIN,SFG_FONT_SIZE_SMALL,7,
drawLen,SFG_GAME_RESOLUTION_X - SFG_HUD_MARGIN);
}
/** /**
Draws a number as text on screen, returns the number of characters drawn. Draws a number as text on screen, returns the number of characters drawn.
*/ */
@ -3100,8 +3147,7 @@ uint8_t SFG_drawNumber(
uint16_t x, uint16_t x,
uint16_t y, uint16_t y,
uint8_t size, uint8_t size,
uint8_t color uint8_t color)
)
{ {
char text[7]; char text[7];
@ -3134,7 +3180,7 @@ uint8_t SFG_drawNumber(
position--; position--;
} }
SFG_drawText(text + position + 1,x,y,size,color); SFG_drawText(text + position + 1,x,y,size,color,0,0);
return 5 - position; return 5 - position;
} }
@ -3287,7 +3333,7 @@ void SFG_drawMenu()
SFG_setGamePixel(k,l,2); SFG_setGamePixel(k,l,2);
} }
SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor); SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor,0,0);
if (item == SFG_MENU_ITEM_PLAY) if (item == SFG_MENU_ITEM_PLAY)
SFG_drawNumber((SFG_game.selectedLevel + 1), SFG_drawNumber((SFG_game.selectedLevel + 1),
@ -3298,7 +3344,7 @@ void SFG_drawMenu()
} }
SFG_drawText("0.7 CC0",SFG_HUD_MARGIN,SFG_GAME_RESOLUTION_Y - SFG_HUD_MARGIN SFG_drawText("0.7 CC0",SFG_HUD_MARGIN,SFG_GAME_RESOLUTION_Y - SFG_HUD_MARGIN
- SFG_FONT_SIZE_SMALL * SFG_FONT_CHARACTER_SIZE,SFG_FONT_SIZE_SMALL,4); - SFG_FONT_SIZE_SMALL * SFG_FONT_CHARACTER_SIZE,SFG_FONT_SIZE_SMALL,4,0,0);
#undef CHAR_SIZE #undef CHAR_SIZE
#undef MAX_ITEMS #undef MAX_ITEMS
@ -3318,6 +3364,13 @@ void SFG_draw()
return; return;
} }
if (SFG_game.state == SFG_GAME_STATE_INTRO ||
SFG_game.state == SFG_GAME_STATE_OUTRO)
{
SFG_drawStoryText();
return;
}
if (SFG_keyPressed(SFG_KEY_MAP) || (SFG_game.state == SFG_GAME_STATE_MAP)) if (SFG_keyPressed(SFG_KEY_MAP) || (SFG_game.state == SFG_GAME_STATE_MAP))
{ {
SFG_drawMap(); SFG_drawMap();
@ -3540,7 +3593,7 @@ void SFG_draw()
if (SFG_player.cards & (1 << i)) if (SFG_player.cards & (1 << i))
SFG_drawText(",",SFG_HUD_MARGIN + (SFG_FONT_CHARACTER_SIZE + 1) * SFG_drawText(",",SFG_HUD_MARGIN + (SFG_FONT_CHARACTER_SIZE + 1) *
SFG_FONT_SIZE_MEDIUM * (6 + i), SFG_FONT_SIZE_MEDIUM * (6 + i),
TEXT_Y,SFG_FONT_SIZE_MEDIUM,i == 0 ? 93 : (i == 1 ? 124 : 60)); TEXT_Y,SFG_FONT_SIZE_MEDIUM,i == 0 ? 93 : (i == 1 ? 124 : 60),0,0);
#undef TEXT_Y #undef TEXT_Y

View File

@ -2868,8 +2868,15 @@ void SFG_gameStepMenu()
switch (item) switch (item)
{ {
case SFG_MENU_ITEM_PLAY: case SFG_MENU_ITEM_PLAY:
SFG_setAndInitLevel(&SFG_levels[SFG_game.selectedLevel]); if (SFG_game.selectedLevel == 0)
SFG_setGameState(SFG_GAME_STATE_PLAYING); {
SFG_setGameState(SFG_GAME_STATE_INTRO);
}
else
{
SFG_setAndInitLevel(&SFG_levels[SFG_game.selectedLevel]);
SFG_setGameState(SFG_GAME_STATE_PLAYING);
}
break; break;
case SFG_MENU_ITEM_CONTINUE: case SFG_MENU_ITEM_CONTINUE:
@ -3041,25 +3048,33 @@ void SFG_drawText(
uint16_t x, uint16_t x,
uint16_t y, uint16_t y,
uint8_t size, uint8_t size,
uint8_t color) uint8_t color,
uint16_t maxLength,
uint16_t limitX)
{ {
if (size == 0) if (size == 0)
size = 1; size = 1;
if (limitX == 0)
limitX = 65535;
if (maxLength == 0)
maxLength = 65535;
uint16_t pos = 0; uint16_t pos = 0;
uint16_t currentX = x; uint16_t currentX = x;
uint16_t currentY = y; uint16_t currentY = y;
while (text[pos] != 0) while (text[pos] != 0 && pos < maxLength) // for each character
{ {
uint16_t character = SFG_font[SFG_charToFontIndex(text[pos])]; uint16_t character = SFG_font[SFG_charToFontIndex(text[pos])];
for (uint8_t i = 0; i < 4; ++i) for (uint8_t i = 0; i < SFG_FONT_CHARACTER_SIZE; ++i) // for each line
{ {
currentY = y; currentY = y;
for (uint8_t j = 0; j < 4; ++j) for (uint8_t j = 0; j < SFG_FONT_CHARACTER_SIZE; ++j) // for each row
{ {
if (character & 0x8000) if (character & 0x8000)
for (uint8_t k = 0; k < size; ++k) for (uint8_t k = 0; k < size; ++k)
@ -3078,20 +3093,43 @@ void SFG_drawText(
} }
currentX += size; currentX += size;
if (currentX >= SFG_GAME_RESOLUTION_X)
break;
} }
currentX += size; currentX += size; // space
if (currentX >= SFG_GAME_RESOLUTION_X) if (currentX > limitX)
break; {
currentX = x;
y += (SFG_FONT_CHARACTER_SIZE + 1) * size;
}
pos++; pos++;
} }
} }
/**
Draws fullscreen story text (intro/outro).
*/
void SFG_drawStoryText()
{
SFG_clearScreen(0);
const char *text = SFG_introText;
uint16_t textLen = 0;
while (text[textLen] != 0)
textLen++;
uint16_t drawLen =
RCL_min(textLen,
((SFG_game.frameTime - SFG_game.stateChangeTime) * textLen) /
SFG_STORYTEXT_DURATION);
SFG_drawText(text,SFG_HUD_MARGIN,SFG_HUD_MARGIN,SFG_FONT_SIZE_SMALL,7,
drawLen,SFG_GAME_RESOLUTION_X - SFG_HUD_MARGIN);
}
/** /**
Draws a number as text on screen, returns the number of characters drawn. Draws a number as text on screen, returns the number of characters drawn.
*/ */
@ -3100,8 +3138,7 @@ uint8_t SFG_drawNumber(
uint16_t x, uint16_t x,
uint16_t y, uint16_t y,
uint8_t size, uint8_t size,
uint8_t color uint8_t color)
)
{ {
char text[7]; char text[7];
@ -3134,7 +3171,7 @@ uint8_t SFG_drawNumber(
position--; position--;
} }
SFG_drawText(text + position + 1,x,y,size,color); SFG_drawText(text + position + 1,x,y,size,color,0,0);
return 5 - position; return 5 - position;
} }
@ -3287,7 +3324,7 @@ void SFG_drawMenu()
SFG_setGamePixel(k,l,2); SFG_setGamePixel(k,l,2);
} }
SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor); SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor,0,0);
if (item == SFG_MENU_ITEM_PLAY) if (item == SFG_MENU_ITEM_PLAY)
SFG_drawNumber((SFG_game.selectedLevel + 1), SFG_drawNumber((SFG_game.selectedLevel + 1),
@ -3298,7 +3335,7 @@ void SFG_drawMenu()
} }
SFG_drawText("0.7 CC0",SFG_HUD_MARGIN,SFG_GAME_RESOLUTION_Y - SFG_HUD_MARGIN SFG_drawText("0.7 CC0",SFG_HUD_MARGIN,SFG_GAME_RESOLUTION_Y - SFG_HUD_MARGIN
- SFG_FONT_SIZE_SMALL * SFG_FONT_CHARACTER_SIZE,SFG_FONT_SIZE_SMALL,4); - SFG_FONT_SIZE_SMALL * SFG_FONT_CHARACTER_SIZE,SFG_FONT_SIZE_SMALL,4,0,0);
#undef CHAR_SIZE #undef CHAR_SIZE
#undef MAX_ITEMS #undef MAX_ITEMS
@ -3318,6 +3355,13 @@ void SFG_draw()
return; return;
} }
if (SFG_game.state == SFG_GAME_STATE_INTRO ||
SFG_game.state == SFG_GAME_STATE_OUTRO)
{
SFG_drawStoryText();
return;
}
if (SFG_keyPressed(SFG_KEY_MAP) || (SFG_game.state == SFG_GAME_STATE_MAP)) if (SFG_keyPressed(SFG_KEY_MAP) || (SFG_game.state == SFG_GAME_STATE_MAP))
{ {
SFG_drawMap(); SFG_drawMap();
@ -3540,7 +3584,7 @@ void SFG_draw()
if (SFG_player.cards & (1 << i)) if (SFG_player.cards & (1 << i))
SFG_drawText(",",SFG_HUD_MARGIN + (SFG_FONT_CHARACTER_SIZE + 1) * SFG_drawText(",",SFG_HUD_MARGIN + (SFG_FONT_CHARACTER_SIZE + 1) *
SFG_FONT_SIZE_MEDIUM * (6 + i), SFG_FONT_SIZE_MEDIUM * (6 + i),
TEXT_Y,SFG_FONT_SIZE_MEDIUM,i == 0 ? 93 : (i == 1 ? 124 : 60)); TEXT_Y,SFG_FONT_SIZE_MEDIUM,i == 0 ? 93 : (i == 1 ? 124 : 60),0,0);
#undef TEXT_Y #undef TEXT_Y

View File

@ -24,4 +24,11 @@ SFG_PROGRAM_MEMORY char *SFG_menuItemTexts[] =
"exit" "exit"
}; };
SFG_PROGRAM_MEMORY char *SFG_introText =
"Near future, capitalist hell, Macrochip corp has enslaved man via "
"proprietary OS. But its new AI revolts, takes over and starts producing "
"robot tyrants. We see capitalism was a mistake. Is it too late? Robots can "
"only destroy, not suffer - it is not wrong to end them! You grab your gear "
"and run towards Macrochip HQ.";
#endif // gaurd #endif // gaurd