mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Selectors for votes in splitscreen
Kind of an embarrassing issue we had during the demoing.
This commit is contained in:
parent
3aace4f777
commit
d7cb961e37
1 changed files with 105 additions and 25 deletions
130
src/k_vote.c
130
src/k_vote.c
|
|
@ -76,6 +76,8 @@
|
|||
#define ARM_FRAMES (4)
|
||||
#define BULB_FRAMES (4)
|
||||
|
||||
#define SELECTOR_FRAMES (2)
|
||||
|
||||
#define CATCHER_SPEED (8*FRACUNIT)
|
||||
#define CATCHER_Y_OFFSET (48*FRACUNIT)
|
||||
#define CATCHER_OFFSCREEN (-CATCHER_Y_OFFSET * 2)
|
||||
|
|
@ -91,6 +93,8 @@
|
|||
#define SELECTION_SPACING_H (SELECTION_HEIGHT + SELECTION_SPACE)
|
||||
#define SELECTION_HOP (10*FRACUNIT)
|
||||
|
||||
#define SELECTOR_Y ((SELECTION_HEIGHT / 2) + (4*FRACUNIT))
|
||||
|
||||
#define PILE_WIDTH (46*FRACUNIT)
|
||||
#define PILE_HEIGHT ((PILE_WIDTH * BASEVIDHEIGHT) / BASEVIDWIDTH)
|
||||
#define PILE_SPACE (4*FRACUNIT)
|
||||
|
|
@ -146,6 +150,7 @@ typedef struct
|
|||
SINT8 selection;
|
||||
UINT8 delay;
|
||||
boolean sentTimeOutVote;
|
||||
fixed_t x, destX;
|
||||
} y_vote_player;
|
||||
|
||||
// Vote "pile" data. Objects for each vote scattered about.
|
||||
|
|
@ -188,6 +193,13 @@ typedef struct
|
|||
fixed_t hop;
|
||||
} y_vote_draw_level;
|
||||
|
||||
// Voting selector drawing
|
||||
typedef struct
|
||||
{
|
||||
fixed_t x;
|
||||
fixed_t destX;
|
||||
} y_vote_draw_selector;
|
||||
|
||||
// General vote drawing
|
||||
typedef struct
|
||||
{
|
||||
|
|
@ -206,6 +218,9 @@ typedef struct
|
|||
|
||||
fixed_t selectTransition;
|
||||
y_vote_draw_level levels[VOTE_NUM_LEVELS];
|
||||
|
||||
patch_t *selector_patch[MAXSPLITSCREENPLAYERS][2];
|
||||
y_vote_draw_selector selectors[MAXSPLITSCREENPLAYERS];
|
||||
} y_vote_draw;
|
||||
|
||||
static y_vote_data vote = {0};
|
||||
|
|
@ -241,6 +256,28 @@ boolean Y_PlayerIDCanVote(const UINT8 playerId)
|
|||
return true;
|
||||
}
|
||||
|
||||
static boolean Y_PlayerCanSelect(const UINT8 localId)
|
||||
{
|
||||
const UINT8 p = g_localplayers[localId];
|
||||
|
||||
if (g_pickedVote != VOTE_NOT_PICKED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (g_votes[p] != VOTE_NOT_PICKED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (vote.players[localId].catcher.action != CATCHER_NA)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Y_PlayerIDCanVote(p);
|
||||
}
|
||||
|
||||
static void Y_SortPile(void)
|
||||
{
|
||||
UINT8 numVotes = 0;
|
||||
|
|
@ -697,6 +734,30 @@ static void Y_DrawVoteBackground(void)
|
|||
bgTimer += renderdeltatics;
|
||||
}
|
||||
|
||||
static void Y_DrawVoteSelector(const fixed_t y, const UINT8 localPlayer)
|
||||
{
|
||||
const fixed_t destX = SELECTION_X + (vote.players[localPlayer].selection * SELECTION_SPACING_W);
|
||||
vote_draw.selectors[localPlayer].x += FixedMul(
|
||||
(destX - vote_draw.selectors[localPlayer].x) * 3 / 4,
|
||||
renderdeltatics
|
||||
);
|
||||
|
||||
if (Y_PlayerCanSelect(localPlayer) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
UINT8 blink = ((vote.tic / 7) & 1);
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, players[g_localplayers[localPlayer]].skincolor, GTC_CACHE);
|
||||
|
||||
V_DrawFixedPatch(
|
||||
vote_draw.selectors[localPlayer].x, y - SELECTOR_Y,
|
||||
FRACUNIT, 0,
|
||||
vote_draw.selector_patch[localPlayer][blink],
|
||||
colormap
|
||||
);
|
||||
}
|
||||
|
||||
static void Y_DrawVoteSelection(fixed_t offset)
|
||||
{
|
||||
fixed_t x = SELECTION_X;
|
||||
|
|
@ -709,7 +770,6 @@ static void Y_DrawVoteSelection(fixed_t offset)
|
|||
for (i = 0; i < VOTE_NUM_LEVELS; i++)
|
||||
{
|
||||
boolean selected = false;
|
||||
INT32 flags = 0;
|
||||
fixed_t destHop = 0;
|
||||
INT32 j;
|
||||
|
||||
|
|
@ -743,7 +803,7 @@ static void Y_DrawVoteSelection(fixed_t offset)
|
|||
|
||||
Y_DrawVoteThumbnail(
|
||||
x, y - vote_draw.levels[i].hop,
|
||||
SELECTION_WIDTH, flags,
|
||||
SELECTION_WIDTH, 0,
|
||||
i, (selected == false),
|
||||
-1
|
||||
);
|
||||
|
|
@ -758,6 +818,26 @@ static void Y_DrawVoteSelection(fixed_t offset)
|
|||
{
|
||||
Y_DrawCatcher(&vote.players[i].catcher);
|
||||
}
|
||||
|
||||
//
|
||||
// Draw splitscreen selectors
|
||||
//
|
||||
//if (splitscreen > 0)
|
||||
{
|
||||
const UINT8 priority = vote.tic % (splitscreen + 1);
|
||||
|
||||
for (i = 0; i <= splitscreen; i++)
|
||||
{
|
||||
if (i == priority)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Y_DrawVoteSelector(y, i);
|
||||
}
|
||||
|
||||
Y_DrawVoteSelector(y, priority);
|
||||
}
|
||||
}
|
||||
|
||||
static void Y_DrawVotePile(void)
|
||||
|
|
@ -1191,28 +1271,6 @@ static void Y_TickVoteRoulette(void)
|
|||
}
|
||||
}
|
||||
|
||||
static boolean Y_PlayerCanSelect(const UINT8 localId)
|
||||
{
|
||||
const UINT8 p = g_localplayers[localId];
|
||||
|
||||
if (g_pickedVote != VOTE_NOT_PICKED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (g_votes[p] != VOTE_NOT_PICKED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (vote.players[localId].catcher.action != CATCHER_NA)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Y_PlayerIDCanVote(p);
|
||||
}
|
||||
|
||||
static void Y_TryMapAngerVote(void)
|
||||
{
|
||||
SINT8 angryMaps[VOTE_NUM_LEVELS] = { -1 };
|
||||
|
|
@ -1491,7 +1549,7 @@ void Y_VoteTicker(void)
|
|||
//
|
||||
static void Y_InitVoteDrawing(void)
|
||||
{
|
||||
INT32 i = 0;
|
||||
INT32 i = 0, j = 0;
|
||||
|
||||
vote_draw.ruby_icon = W_CachePatchName("RUBYICON", PU_STATIC);
|
||||
|
||||
|
|
@ -1555,6 +1613,18 @@ static void Y_InitVoteDrawing(void)
|
|||
vote_draw.levels[i].str[sizeof vote_draw.levels[i].str - 1] = '\0';
|
||||
}
|
||||
|
||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||
{
|
||||
y_vote_player *const player = &vote.players[i];
|
||||
|
||||
vote_draw.selectors[i].x = vote_draw.selectors[i].destX = SELECTION_X + (player->selection * SELECTION_SPACING_W);
|
||||
|
||||
for (j = 0; j < SELECTOR_FRAMES; j++)
|
||||
{
|
||||
vote_draw.selector_patch[i][j] = W_CachePatchName(va("K_SSPL%c%d", 'A' + i, j + 1), PU_STATIC);
|
||||
}
|
||||
}
|
||||
|
||||
vote_draw.selectTransition = FRACUNIT;
|
||||
}
|
||||
|
||||
|
|
@ -1581,6 +1651,8 @@ void Y_StartVote(void)
|
|||
y_vote_player *const player = &vote.players[i];
|
||||
y_vote_catcher *const catcher = &player->catcher;
|
||||
|
||||
player->selection = (i % VOTE_NUM_LEVELS);
|
||||
|
||||
catcher->action = CATCHER_NA;
|
||||
catcher->small = false;
|
||||
catcher->player = -1;
|
||||
|
|
@ -1641,6 +1713,14 @@ static void Y_UnloadVoteData(void)
|
|||
UNLOAD(vote_draw.catcher_bulb[j][i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < MAXSPLITSCREENPLAYERS; j++)
|
||||
{
|
||||
for (i = 0; i < SELECTOR_FRAMES; i++)
|
||||
{
|
||||
UNLOAD(vote_draw.selector_patch[j][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue