mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'master' of https://git.do.srb2.org/KartKrew/Kart into big-large-map-markers
This commit is contained in:
commit
c1dbbdf801
11 changed files with 346 additions and 586 deletions
236
src/deh_soc.c
236
src/deh_soc.c
|
|
@ -665,242 +665,6 @@ void readlight(MYFILE *f, INT32 num)
|
|||
}
|
||||
#endif // HWRENDER
|
||||
|
||||
static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
|
||||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
char *word, *word2;
|
||||
char *tmp;
|
||||
INT32 value;
|
||||
char *lastline;
|
||||
|
||||
do
|
||||
{
|
||||
lastline = f->curpos;
|
||||
if (myfgets(s, MAXLINELEN, f))
|
||||
{
|
||||
if (s[0] == '\n')
|
||||
break;
|
||||
|
||||
// First remove trailing newline, if there is one
|
||||
tmp = strchr(s, '\n');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
|
||||
tmp = strchr(s, '#');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
if (s == tmp)
|
||||
continue; // Skip comment lines, but don't break.
|
||||
|
||||
// Set / reset word
|
||||
word = s;
|
||||
while ((*word == '\t') || (*word == ' '))
|
||||
word++;
|
||||
|
||||
// Get the part before the " = "
|
||||
tmp = strchr(s, '=');
|
||||
if (tmp)
|
||||
{
|
||||
*(tmp-1) = '\0';
|
||||
// Now get the part after
|
||||
word2 = tmp += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get the part before the " "
|
||||
tmp = strchr(s, ' ');
|
||||
if (tmp)
|
||||
{
|
||||
*tmp = '\0';
|
||||
// Now get the part after
|
||||
tmp++;
|
||||
word2 = tmp;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
strupr(word);
|
||||
value = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "XPIVOT"))
|
||||
sprinfo->pivot[frame].x = value;
|
||||
else if (fastcmp(word, "YPIVOT"))
|
||||
sprinfo->pivot[frame].y = value;
|
||||
else if (fastcmp(word, "ROTAXIS"))
|
||||
sprinfo->pivot[frame].rotaxis = value;
|
||||
else
|
||||
{
|
||||
f->curpos = lastline;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
Z_Free(s);
|
||||
}
|
||||
|
||||
void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
|
||||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
char *word, *word2;
|
||||
char *tmp;
|
||||
#ifdef HWRENDER
|
||||
INT32 value;
|
||||
#endif
|
||||
char *lastline;
|
||||
INT32 skinnumbers[MAXSKINS];
|
||||
INT32 foundskins = 0;
|
||||
|
||||
// allocate a spriteinfo
|
||||
spriteinfo_t *info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
|
||||
info->available = true;
|
||||
|
||||
do
|
||||
{
|
||||
lastline = f->curpos;
|
||||
if (myfgets(s, MAXLINELEN, f))
|
||||
{
|
||||
if (s[0] == '\n')
|
||||
break;
|
||||
|
||||
// First remove trailing newline, if there is one
|
||||
tmp = strchr(s, '\n');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
|
||||
tmp = strchr(s, '#');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
if (s == tmp)
|
||||
continue; // Skip comment lines, but don't break.
|
||||
|
||||
// Set / reset word
|
||||
word = s;
|
||||
while ((*word == '\t') || (*word == ' '))
|
||||
word++;
|
||||
|
||||
// Get the part before the " = "
|
||||
tmp = strchr(s, '=');
|
||||
if (tmp)
|
||||
{
|
||||
*(tmp-1) = '\0';
|
||||
// Now get the part after
|
||||
word2 = tmp += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get the part before the " "
|
||||
tmp = strchr(s, ' ');
|
||||
if (tmp)
|
||||
{
|
||||
*tmp = '\0';
|
||||
// Now get the part after
|
||||
tmp++;
|
||||
word2 = tmp;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
strupr(word);
|
||||
#ifdef HWRENDER
|
||||
value = atoi(word2); // used for numerical settings
|
||||
|
||||
if (fastcmp(word, "LIGHTTYPE"))
|
||||
{
|
||||
if (sprite2)
|
||||
deh_warning("Sprite2 %s: invalid word '%s'", spr2names[num], word);
|
||||
else
|
||||
{
|
||||
INT32 oldvar;
|
||||
for (oldvar = 0; t_lspr[num] != &lspr[oldvar]; oldvar++)
|
||||
;
|
||||
t_lspr[num] = &lspr[value];
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (fastcmp(word, "SKIN"))
|
||||
{
|
||||
INT32 skinnum = -1;
|
||||
if (!sprite2)
|
||||
{
|
||||
deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", spr2names[num], word);
|
||||
continue;
|
||||
}
|
||||
|
||||
// make lowercase
|
||||
strlwr(word2);
|
||||
skinnum = R_SkinAvailable(word2);
|
||||
if (skinnum == -1)
|
||||
{
|
||||
deh_warning("Sprite2 %s: unknown skin %s", spr2names[num], word2);
|
||||
break;
|
||||
}
|
||||
|
||||
skinnumbers[foundskins] = skinnum;
|
||||
foundskins++;
|
||||
}
|
||||
else if (fastcmp(word, "DEFAULT"))
|
||||
{
|
||||
if (!sprite2)
|
||||
{
|
||||
deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", spr2names[num], word);
|
||||
continue;
|
||||
}
|
||||
if (num < (INT32)free_spr2 && num >= (INT32)SPR2_FIRSTFREESLOT)
|
||||
spr2defaults[num] = get_number(word2);
|
||||
else
|
||||
{
|
||||
deh_warning("Sprite2 %s: out of range (%d - %d), ignoring", spr2names[num], SPR2_FIRSTFREESLOT, free_spr2-1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (fastcmp(word, "FRAME"))
|
||||
{
|
||||
UINT8 frame = R_Char2Frame(word2[0]);
|
||||
// frame number too high
|
||||
if (frame >= 64)
|
||||
{
|
||||
if (sprite2)
|
||||
deh_warning("Sprite2 %s: invalid frame %s", spr2names[num], word2);
|
||||
else
|
||||
deh_warning("Sprite %s: invalid frame %s", sprnames[num], word2);
|
||||
break;
|
||||
}
|
||||
|
||||
// read sprite frame and store it in the spriteinfo_t struct
|
||||
readspriteframe(f, info, frame);
|
||||
if (sprite2)
|
||||
{
|
||||
INT32 i;
|
||||
if (!foundskins)
|
||||
{
|
||||
deh_warning("Sprite2 %s: no skins specified", spr2names[num]);
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < foundskins; i++)
|
||||
{
|
||||
size_t skinnum = skinnumbers[i];
|
||||
skin_t *skin = &skins[skinnum];
|
||||
spriteinfo_t *sprinfo = skin->sprinfo;
|
||||
M_Memcpy(&sprinfo[num], info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
else
|
||||
M_Memcpy(&spriteinfo[num], info, sizeof(spriteinfo_t));
|
||||
}
|
||||
else
|
||||
{
|
||||
//deh_warning("Sprite %s: unknown word '%s'", sprnames[num], word);
|
||||
f->curpos = lastline;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (!myfeof(f)); // finish when the line is empty
|
||||
|
||||
Z_Free(s);
|
||||
Z_Free(info);
|
||||
}
|
||||
|
||||
void readsprite2(MYFILE *f, INT32 num)
|
||||
{
|
||||
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
|
||||
|
|
|
|||
|
|
@ -71,7 +71,6 @@ void readcutscene(MYFILE *f, INT32 num);
|
|||
void readlevelheader(MYFILE *f, char * name);
|
||||
void readgametype(MYFILE *f, char *gtname);
|
||||
void readsprite2(MYFILE *f, INT32 num);
|
||||
void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2);
|
||||
#ifdef HWRENDER
|
||||
void readlight(MYFILE *f, INT32 num);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -356,30 +356,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
else if (fastcmp(word, "SPRITE") || fastcmp(word, "SPRITEINFO"))
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_sprite(word2); // find a sprite by name
|
||||
if (i < NUMSPRITES && i > 0)
|
||||
readspriteinfo(f, i, false);
|
||||
else
|
||||
{
|
||||
deh_warning("Sprite number %d out of range (0 - %d)", i, NUMSPRITES-1);
|
||||
ignorelines(f);
|
||||
}
|
||||
}
|
||||
else if (fastcmp(word, "SPRITE2INFO"))
|
||||
{
|
||||
if (i == 0 && word2[0] != '0') // If word2 isn't a number
|
||||
i = get_sprite2(word2); // find a sprite by name
|
||||
if (i < NUMPLAYERSPRITES && i >= 0)
|
||||
readspriteinfo(f, i, true);
|
||||
else
|
||||
{
|
||||
deh_warning("Sprite2 number %d out of range (0 - %d)", i, NUMPLAYERSPRITES-1);
|
||||
ignorelines(f);
|
||||
}
|
||||
}
|
||||
else if (fastcmp(word, "LEVEL"))
|
||||
{
|
||||
size_t len = strlen(word2);
|
||||
|
|
|
|||
187
src/k_hud.c
187
src/k_hud.c
|
|
@ -695,6 +695,40 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny)
|
|||
}
|
||||
}
|
||||
|
||||
static patch_t **K_GetItemPatchTable(INT32 item)
|
||||
{
|
||||
patch_t **kp[1 + NUMKARTITEMS] = {
|
||||
kp_sadface,
|
||||
NULL,
|
||||
kp_sneaker,
|
||||
kp_rocketsneaker,
|
||||
kp_invincibility,
|
||||
kp_banana,
|
||||
kp_eggman,
|
||||
kp_orbinaut,
|
||||
kp_jawz,
|
||||
kp_mine,
|
||||
kp_landmine,
|
||||
kp_ballhog,
|
||||
kp_selfpropelledbomb,
|
||||
kp_grow,
|
||||
kp_shrink,
|
||||
kp_lightningshield,
|
||||
kp_bubbleshield,
|
||||
kp_flameshield,
|
||||
kp_hyudoro,
|
||||
kp_pogospring,
|
||||
kp_superring,
|
||||
kp_kitchensink,
|
||||
kp_droptarget,
|
||||
};
|
||||
|
||||
if (item >= KITEM_SAD && item < NUMKARTITEMS)
|
||||
return kp[item - KITEM_SAD];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//}
|
||||
|
||||
INT32 ITEM_X, ITEM_Y; // Item Window
|
||||
|
|
@ -1096,90 +1130,23 @@ static void K_drawKartItem(void)
|
|||
|
||||
if (stplyr->itemroulette)
|
||||
{
|
||||
const INT32 item = K_GetRollingRouletteItem(stplyr);
|
||||
|
||||
if (stplyr->skincolor)
|
||||
localcolor = stplyr->skincolor;
|
||||
|
||||
switch((stplyr->itemroulette % (16*3)) / 3)
|
||||
switch (item)
|
||||
{
|
||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||
case 0: // Sneaker
|
||||
localpatch = kp_sneaker[offset];
|
||||
//localcolor = SKINCOLOR_RASPBERRY;
|
||||
break;
|
||||
case 1: // Banana
|
||||
localpatch = kp_banana[offset];
|
||||
//localcolor = SKINCOLOR_YELLOW;
|
||||
break;
|
||||
case 2: // Orbinaut
|
||||
localpatch = kp_orbinaut[3+offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 3: // Mine
|
||||
localpatch = kp_mine[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 4: // Grow
|
||||
localpatch = kp_grow[offset];
|
||||
//localcolor = SKINCOLOR_TEAL;
|
||||
break;
|
||||
case 5: // Hyudoro
|
||||
localpatch = kp_hyudoro[offset];
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 6: // Rocket Sneaker
|
||||
localpatch = kp_rocketsneaker[offset];
|
||||
//localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 7: // Jawz
|
||||
localpatch = kp_jawz[offset];
|
||||
//localcolor = SKINCOLOR_JAWZ;
|
||||
break;
|
||||
case 8: // Self-Propelled Bomb
|
||||
localpatch = kp_selfpropelledbomb[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 9: // Shrink
|
||||
localpatch = kp_shrink[offset];
|
||||
//localcolor = SKINCOLOR_ORANGE;
|
||||
break;
|
||||
case 10: // Invincibility
|
||||
case KITEM_INVINCIBILITY:
|
||||
localpatch = localinv;
|
||||
//localcolor = SKINCOLOR_GREY;
|
||||
break;
|
||||
case 11: // Eggman Monitor
|
||||
localpatch = kp_eggman[offset];
|
||||
//localcolor = SKINCOLOR_ROSE;
|
||||
|
||||
case KITEM_ORBINAUT:
|
||||
localpatch = kp_orbinaut[3 + offset];
|
||||
break;
|
||||
case 12: // Ballhog
|
||||
localpatch = kp_ballhog[offset];
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Lightning Shield
|
||||
localpatch = kp_lightningshield[offset];
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
case 14: // Super Ring
|
||||
localpatch = kp_superring[offset];
|
||||
//localcolor = SKINCOLOR_GOLD;
|
||||
break;
|
||||
case 15: // Land Mine
|
||||
localpatch = kp_landmine[offset];
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 16: // Drop Target
|
||||
localpatch = kp_droptarget[offset];
|
||||
//localcolor = SKINCOLOR_LIME;
|
||||
break;
|
||||
/*case 17: // Pogo Spring
|
||||
localpatch = kp_pogospring[offset];
|
||||
localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 18: // Kitchen Sink
|
||||
localpatch = kp_kitchensink[offset];
|
||||
localcolor = SKINCOLOR_STEEL;
|
||||
break;*/
|
||||
|
||||
default:
|
||||
break;
|
||||
localpatch = K_GetItemPatchTable(item)[offset];
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -1240,79 +1207,27 @@ static void K_drawKartItem(void)
|
|||
|
||||
switch(stplyr->itemtype)
|
||||
{
|
||||
case KITEM_SNEAKER:
|
||||
localpatch = kp_sneaker[offset];
|
||||
break;
|
||||
case KITEM_ROCKETSNEAKER:
|
||||
localpatch = kp_rocketsneaker[offset];
|
||||
break;
|
||||
case KITEM_INVINCIBILITY:
|
||||
localpatch = localinv;
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_BANANA:
|
||||
localpatch = kp_banana[offset];
|
||||
break;
|
||||
case KITEM_EGGMAN:
|
||||
localpatch = kp_eggman[offset];
|
||||
break;
|
||||
|
||||
case KITEM_ORBINAUT:
|
||||
localpatch = kp_orbinaut[(offset ? 4 : min(stplyr->itemamount-1, 3))];
|
||||
break;
|
||||
case KITEM_JAWZ:
|
||||
localpatch = kp_jawz[offset];
|
||||
break;
|
||||
case KITEM_MINE:
|
||||
localpatch = kp_mine[offset];
|
||||
break;
|
||||
case KITEM_LANDMINE:
|
||||
localpatch = kp_landmine[offset];
|
||||
break;
|
||||
case KITEM_DROPTARGET:
|
||||
localpatch = kp_droptarget[offset];
|
||||
break;
|
||||
case KITEM_BALLHOG:
|
||||
localpatch = kp_ballhog[offset];
|
||||
break;
|
||||
|
||||
case KITEM_SPB:
|
||||
localpatch = kp_selfpropelledbomb[offset];
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_GROW:
|
||||
localpatch = kp_grow[offset];
|
||||
break;
|
||||
case KITEM_SHRINK:
|
||||
localpatch = kp_shrink[offset];
|
||||
break;
|
||||
case KITEM_LIGHTNINGSHIELD:
|
||||
localpatch = kp_lightningshield[offset];
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_BUBBLESHIELD:
|
||||
localpatch = kp_bubbleshield[offset];
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_FLAMESHIELD:
|
||||
localpatch = kp_flameshield[offset];
|
||||
localbg = kp_itembg[offset+1];
|
||||
break;
|
||||
case KITEM_HYUDORO:
|
||||
localpatch = kp_hyudoro[offset];
|
||||
break;
|
||||
case KITEM_POGOSPRING:
|
||||
localpatch = kp_pogospring[offset];
|
||||
break;
|
||||
case KITEM_SUPERRING:
|
||||
localpatch = kp_superring[offset];
|
||||
break;
|
||||
case KITEM_KITCHENSINK:
|
||||
localpatch = kp_kitchensink[offset];
|
||||
break;
|
||||
case KITEM_SAD:
|
||||
localpatch = kp_sadface[offset];
|
||||
break;
|
||||
/*FALLTHRU*/
|
||||
|
||||
default:
|
||||
localpatch = kp_nodraw; // diagnose underflows
|
||||
localpatch = K_GetItemPatchTable(stplyr->itemtype)[offset];
|
||||
|
||||
if (localpatch == NULL)
|
||||
localpatch = kp_nodraw; // diagnose underflows
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
53
src/k_kart.c
53
src/k_kart.c
|
|
@ -350,7 +350,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] =
|
|||
#define NUMKARTODDS 80
|
||||
|
||||
// Less ugly 2D arrays
|
||||
static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
||||
static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
||||
{
|
||||
//P-Odds 0 1 2 3 4 5 6 7
|
||||
/*Sneaker*/ { 0, 0, 2, 4, 6, 0, 0, 0 }, // Sneaker
|
||||
|
|
@ -383,7 +383,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
|
|||
/*Jawz x2*/ { 0, 0, 1, 2, 1, 0, 0, 0 } // Jawz x2
|
||||
};
|
||||
|
||||
static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] =
|
||||
static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS][2] =
|
||||
{
|
||||
//P-Odds 0 1
|
||||
/*Sneaker*/ { 2, 1 }, // Sneaker
|
||||
|
|
@ -899,6 +899,54 @@ UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8 bestbum
|
|||
return useodds;
|
||||
}
|
||||
|
||||
INT32 K_GetRollingRouletteItem(player_t *player)
|
||||
{
|
||||
static UINT8 translation[NUMKARTITEMS-1];
|
||||
static UINT16 roulette_size;
|
||||
|
||||
static INT16 odds_cached = -1;
|
||||
|
||||
// Race odds have more columns than Battle
|
||||
const UINT8 EMPTYODDS[sizeof K_KartItemOddsRace[0]] = {0};
|
||||
|
||||
if (odds_cached != gametype)
|
||||
{
|
||||
UINT8 *odds_row;
|
||||
size_t odds_row_size;
|
||||
|
||||
UINT8 i;
|
||||
|
||||
roulette_size = 0;
|
||||
|
||||
if (gametype == GT_BATTLE)
|
||||
{
|
||||
odds_row = K_KartItemOddsBattle[0];
|
||||
odds_row_size = sizeof K_KartItemOddsBattle[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
odds_row = K_KartItemOddsRace[0];
|
||||
odds_row_size = sizeof K_KartItemOddsRace[0];
|
||||
}
|
||||
|
||||
for (i = 1; i < NUMKARTITEMS; ++i)
|
||||
{
|
||||
if (memcmp(odds_row, EMPTYODDS, odds_row_size))
|
||||
{
|
||||
translation[roulette_size] = i;
|
||||
roulette_size++;
|
||||
}
|
||||
|
||||
odds_row += odds_row_size;
|
||||
}
|
||||
|
||||
roulette_size *= 3;
|
||||
odds_cached = gametype;
|
||||
}
|
||||
|
||||
return translation[(player->itemroulette % roulette_size) / 3];
|
||||
}
|
||||
|
||||
static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
|
||||
{
|
||||
INT32 i;
|
||||
|
|
@ -5854,7 +5902,6 @@ void K_DoSneaker(player_t *player, INT32 type)
|
|||
if (type != 0)
|
||||
{
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
K_PlayBoostTaunt(player->mo);
|
||||
}
|
||||
|
||||
player->sneakertimer = sneakertime;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8 bestbum
|
|||
fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush);
|
||||
UINT32 K_ScaleItemDistance(UINT32 distance, UINT8 numPlayers, boolean spbrush);
|
||||
INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, UINT32 ourDist, fixed_t mashed, boolean spbrush, boolean bot, boolean rival);
|
||||
INT32 K_GetRollingRouletteItem(player_t *player);
|
||||
INT32 K_GetShieldFromItem(INT32 item);
|
||||
fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against);
|
||||
boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2);
|
||||
|
|
|
|||
|
|
@ -242,6 +242,30 @@ static int lib_spr2namelen(lua_State *L)
|
|||
// SPRITE INFO //
|
||||
/////////////////
|
||||
|
||||
struct PivotFrame {
|
||||
spriteinfo_t *sprinfo;
|
||||
UINT8 frame;
|
||||
};
|
||||
|
||||
static UINT8 GetPivotFrame(lua_State *L, int idx)
|
||||
{
|
||||
const char *field = luaL_checkstring(L, idx);
|
||||
UINT8 frame;
|
||||
|
||||
if (fastcmp("default", field))
|
||||
{
|
||||
frame = SPRINFO_DEFAULT_PIVOT;
|
||||
}
|
||||
else
|
||||
{
|
||||
frame = R_Char2Frame(field[0]);
|
||||
if (frame == 255)
|
||||
luaL_error(L, "invalid frame %s", field);
|
||||
}
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
// spriteinfo[]
|
||||
static int lib_getSpriteInfo(lua_State *L)
|
||||
{
|
||||
|
|
@ -349,24 +373,23 @@ static int PopPivotTable(spriteinfo_t *info, lua_State *L, int stk)
|
|||
while (lua_next(L, stk))
|
||||
{
|
||||
int idx = 0;
|
||||
const char *framestr = NULL;
|
||||
switch (lua_type(L, stk+1))
|
||||
{
|
||||
case LUA_TSTRING:
|
||||
framestr = lua_tostring(L, stk+1);
|
||||
idx = R_Char2Frame(framestr[0]);
|
||||
idx = GetPivotFrame(L, stk+1);
|
||||
break;
|
||||
case LUA_TNUMBER:
|
||||
idx = lua_tonumber(L, stk+1);
|
||||
|
||||
if ((idx < 0) || (idx >= 64))
|
||||
return luaL_error(L, "pivot frame %d out of range (0 - %d)", idx, 63);
|
||||
break;
|
||||
default:
|
||||
TYPEERROR("pivot frame", LUA_TNUMBER, lua_type(L, stk+1));
|
||||
}
|
||||
if ((idx < 0) || (idx >= 64))
|
||||
return luaL_error(L, "pivot frame %d out of range (0 - %d)", idx, 63);
|
||||
// the values in pivot[] are also tables
|
||||
if (PopPivotSubTable(info->pivot, L, stk+2, idx))
|
||||
info->available = true;
|
||||
set_bit_array(info->available, idx);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
|
|
@ -441,7 +464,7 @@ static int spriteinfo_get(lua_State *L)
|
|||
{
|
||||
// bypass LUA_PushUserdata
|
||||
void **userdata = lua_newuserdata(L, sizeof(void *));
|
||||
*userdata = &sprinfo->pivot;
|
||||
*userdata = sprinfo;
|
||||
luaL_getmetatable(L, META_PIVOTLIST);
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
|
|
@ -480,9 +503,8 @@ static int spriteinfo_set(lua_State *L)
|
|||
// pivot[] is userdata
|
||||
else if (lua_isuserdata(L, 1))
|
||||
{
|
||||
spriteframepivot_t *pivot = *((spriteframepivot_t **)luaL_checkudata(L, 1, META_PIVOTLIST));
|
||||
memcpy(&sprinfo->pivot, pivot, sizeof(spriteframepivot_t));
|
||||
sprinfo->available = true; // Just in case?
|
||||
spriteinfo_t *copyinfo = *((spriteinfo_t **)luaL_checkudata(L, 1, META_PIVOTLIST));
|
||||
memcpy(sprinfo, copyinfo, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -505,20 +527,16 @@ static int spriteinfo_num(lua_State *L)
|
|||
// framepivot_t
|
||||
static int pivotlist_get(lua_State *L)
|
||||
{
|
||||
void **userdata;
|
||||
spriteframepivot_t *framepivot = *((spriteframepivot_t **)luaL_checkudata(L, 1, META_PIVOTLIST));
|
||||
const char *field = luaL_checkstring(L, 2);
|
||||
UINT8 frame;
|
||||
struct PivotFrame *container;
|
||||
spriteinfo_t *sprinfo = *((spriteinfo_t **)luaL_checkudata(L, 1, META_PIVOTLIST));
|
||||
UINT8 frame = GetPivotFrame(L, 2);
|
||||
|
||||
I_Assert(framepivot != NULL);
|
||||
|
||||
frame = R_Char2Frame(field[0]);
|
||||
if (frame == 255)
|
||||
luaL_error(L, "invalid frame %s", field);
|
||||
|
||||
// bypass LUA_PushUserdata
|
||||
userdata = lua_newuserdata(L, sizeof(void *));
|
||||
*userdata = &framepivot[frame];
|
||||
container = lua_newuserdata(L, sizeof *container);
|
||||
container->sprinfo = sprinfo;
|
||||
container->frame = frame;
|
||||
luaL_getmetatable(L, META_FRAMEPIVOT);
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
|
|
@ -528,11 +546,9 @@ static int pivotlist_get(lua_State *L)
|
|||
|
||||
static int pivotlist_set(lua_State *L)
|
||||
{
|
||||
// Because I already know it's a spriteframepivot_t anyway
|
||||
spriteframepivot_t *pivotlist = *((spriteframepivot_t **)lua_touserdata(L, 1));
|
||||
//spriteframepivot_t *framepivot = *((spriteframepivot_t **)luaL_checkudata(L, 1, META_FRAMEPIVOT));
|
||||
const char *field = luaL_checkstring(L, 2);
|
||||
spriteinfo_t *sprinfo = *((spriteinfo_t **)luaL_checkudata(L, 1, META_PIVOTLIST));
|
||||
UINT8 frame;
|
||||
int okcool = 0;
|
||||
|
||||
if (!lua_lumploading)
|
||||
return luaL_error(L, "Do not alter spriteframepivot_t from within a hook or coroutine!");
|
||||
|
|
@ -543,20 +559,22 @@ static int pivotlist_set(lua_State *L)
|
|||
|
||||
I_Assert(pivotlist != NULL);
|
||||
|
||||
frame = R_Char2Frame(field[0]);
|
||||
if (frame == 255)
|
||||
luaL_error(L, "invalid frame %s", field);
|
||||
frame = GetPivotFrame(L, 2);
|
||||
|
||||
// pivot[] is a table
|
||||
if (lua_istable(L, 3))
|
||||
return PopPivotSubTable(pivotlist, L, 3, frame);
|
||||
okcool = PopPivotSubTable(sprinfo->pivot, L, 3, frame);
|
||||
// pivot[] is userdata
|
||||
else if (lua_isuserdata(L, 3))
|
||||
{
|
||||
spriteframepivot_t *copypivot = *((spriteframepivot_t **)luaL_checkudata(L, 3, META_FRAMEPIVOT));
|
||||
memcpy(&pivotlist[frame], copypivot, sizeof(spriteframepivot_t));
|
||||
struct PivotFrame *container = luaL_checkudata(L, 3, META_FRAMEPIVOT);
|
||||
memcpy(&sprinfo->pivot[frame], &container->sprinfo->pivot[container->frame], sizeof(spriteframepivot_t));
|
||||
okcool = 1;
|
||||
}
|
||||
|
||||
if (okcool)
|
||||
set_bit_array(sprinfo->available, frame);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -568,7 +586,8 @@ static int pivotlist_num(lua_State *L)
|
|||
|
||||
static int framepivot_get(lua_State *L)
|
||||
{
|
||||
spriteframepivot_t *framepivot = *((spriteframepivot_t **)luaL_checkudata(L, 1, META_FRAMEPIVOT));
|
||||
struct PivotFrame *container = luaL_checkudata(L, 1, META_FRAMEPIVOT);
|
||||
spriteframepivot_t *framepivot = &container->sprinfo->pivot[container->frame];
|
||||
const char *field = luaL_checkstring(L, 2);
|
||||
|
||||
I_Assert(framepivot != NULL);
|
||||
|
|
@ -585,7 +604,9 @@ static int framepivot_get(lua_State *L)
|
|||
|
||||
static int framepivot_set(lua_State *L)
|
||||
{
|
||||
spriteframepivot_t *framepivot = *((spriteframepivot_t **)luaL_checkudata(L, 1, META_FRAMEPIVOT));
|
||||
struct PivotFrame *container = luaL_checkudata(L, 1, META_FRAMEPIVOT);
|
||||
spriteframepivot_t *framepivot = &container->sprinfo->pivot[container->frame];
|
||||
UINT8 *available = container->sprinfo->available;
|
||||
const char *field = luaL_checkstring(L, 2);
|
||||
|
||||
if (!lua_lumploading)
|
||||
|
|
@ -598,9 +619,15 @@ static int framepivot_set(lua_State *L)
|
|||
I_Assert(framepivot != NULL);
|
||||
|
||||
if (fastcmp("x", field))
|
||||
{
|
||||
framepivot->x = luaL_checkinteger(L, 3);
|
||||
set_bit_array(available, container->frame);
|
||||
}
|
||||
else if (fastcmp("y", field))
|
||||
{
|
||||
framepivot->y = luaL_checkinteger(L, 3);
|
||||
set_bit_array(available, container->frame);
|
||||
}
|
||||
else
|
||||
return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field));
|
||||
|
||||
|
|
|
|||
74
src/p_mobj.c
74
src/p_mobj.c
|
|
@ -5997,79 +5997,7 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
{
|
||||
P_SetMobjState(mobj, S_PLAYERARROW_BOX);
|
||||
mobj->tracer->sprite = SPR_ITEM;
|
||||
switch((mobj->target->player->itemroulette % (16*3)) / 3)
|
||||
{
|
||||
// Each case is handled in threes, to give three frames of in-game time to see the item on the roulette
|
||||
case 0: // Sneaker
|
||||
mobj->tracer->frame = KITEM_SNEAKER;
|
||||
//localcolor = SKINCOLOR_RASPBERRY;
|
||||
break;
|
||||
case 1: // Banana
|
||||
mobj->tracer->frame = KITEM_BANANA;
|
||||
//localcolor = SKINCOLOR_YELLOW;
|
||||
break;
|
||||
case 2: // Orbinaut
|
||||
mobj->tracer->frame = KITEM_ORBINAUT;
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 3: // Mine
|
||||
mobj->tracer->frame = KITEM_MINE;
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 4: // Grow
|
||||
mobj->tracer->frame = KITEM_GROW;
|
||||
//localcolor = SKINCOLOR_TEAL;
|
||||
break;
|
||||
case 5: // Hyudoro
|
||||
mobj->tracer->frame = KITEM_HYUDORO;
|
||||
//localcolor = SKINCOLOR_STEEL;
|
||||
break;
|
||||
case 6: // Rocket Sneaker
|
||||
mobj->tracer->frame = KITEM_ROCKETSNEAKER;
|
||||
//localcolor = SKINCOLOR_TANGERINE;
|
||||
break;
|
||||
case 7: // Jawz
|
||||
mobj->tracer->frame = KITEM_JAWZ;
|
||||
//localcolor = SKINCOLOR_JAWZ;
|
||||
break;
|
||||
case 8: // Self-Propelled Bomb
|
||||
mobj->tracer->frame = KITEM_SPB;
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 9: // Shrink
|
||||
mobj->tracer->frame = KITEM_SHRINK;
|
||||
//localcolor = SKINCOLOR_ORANGE;
|
||||
break;
|
||||
case 10: // Invincibility
|
||||
mobj->tracer->frame = KITEM_INVINCIBILITY;
|
||||
//localcolor = SKINCOLOR_GREY;
|
||||
break;
|
||||
case 11: // Eggman Monitor
|
||||
mobj->tracer->frame = KITEM_EGGMAN;
|
||||
//localcolor = SKINCOLOR_ROSE;
|
||||
break;
|
||||
case 12: // Ballhog
|
||||
mobj->tracer->frame = KITEM_BALLHOG;
|
||||
//localcolor = SKINCOLOR_LILAC;
|
||||
break;
|
||||
case 13: // Lightning Shield
|
||||
mobj->tracer->frame = KITEM_LIGHTNINGSHIELD;
|
||||
//localcolor = SKINCOLOR_CYAN;
|
||||
break;
|
||||
case 14: // Super Ring
|
||||
mobj->tracer->frame = KITEM_SUPERRING;
|
||||
//localcolor = SKINCOLOR_GOLD;
|
||||
break;
|
||||
case 15: // Land Mine
|
||||
mobj->tracer->frame = KITEM_LANDMINE;
|
||||
//localcolor = SKINCOLOR_JET;
|
||||
break;
|
||||
case 16: // Drop Target
|
||||
mobj->tracer->frame = KITEM_DROPTARGET;
|
||||
//localcolor = SKINCOLOR_LIME;
|
||||
break;
|
||||
}
|
||||
mobj->tracer->frame |= FF_FULLBRIGHT;
|
||||
mobj->tracer->frame = K_GetRollingRouletteItem(mobj->target->player) | FF_FULLBRIGHT;
|
||||
mobj->tracer->renderflags &= ~RF_DONTDRAW;
|
||||
}
|
||||
else if (mobj->target->player->stealingtimer < 0)
|
||||
|
|
|
|||
|
|
@ -141,11 +141,16 @@ patch_t *Patch_GetRotatedSprite(
|
|||
|
||||
patch = W_CachePatchNum(lump, PU_SPRITE);
|
||||
|
||||
if (sprinfo->available)
|
||||
if (in_bit_array(sprinfo->available, frame))
|
||||
{
|
||||
xpivot = sprinfo->pivot[frame].x;
|
||||
ypivot = sprinfo->pivot[frame].y;
|
||||
}
|
||||
else if (in_bit_array(sprinfo->available, SPRINFO_DEFAULT_PIVOT))
|
||||
{
|
||||
xpivot = sprinfo->pivot[SPRINFO_DEFAULT_PIVOT].x;
|
||||
ypivot = sprinfo->pivot[SPRINFO_DEFAULT_PIVOT].y;
|
||||
}
|
||||
else
|
||||
{
|
||||
xpivot = patch->leftoffset;
|
||||
|
|
|
|||
|
|
@ -1396,12 +1396,79 @@ boolean Picture_PNGDimensions(UINT8 *png, INT32 *width, INT32 *height, INT16 *to
|
|||
#endif
|
||||
#endif
|
||||
|
||||
//
|
||||
// R_ParseSpriteInfoFrame
|
||||
//
|
||||
// Parse a SPRTINFO frame.
|
||||
//
|
||||
static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
|
||||
struct ParseSpriteInfoState {
|
||||
boolean spr2;
|
||||
spriteinfo_t *info;
|
||||
spritenum_t sprnum;
|
||||
playersprite_t spr2num;
|
||||
boolean any;
|
||||
INT32 skinnumbers[MAXSKINS];
|
||||
INT32 foundskins;
|
||||
};
|
||||
|
||||
#define PARSER_FRAME (false)
|
||||
#define PARSER_DEFAULT (true)
|
||||
|
||||
static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser)
|
||||
{
|
||||
char *sprinfoToken;
|
||||
size_t sprinfoTokenLength;
|
||||
|
||||
INT32 skinnum;
|
||||
char *skinName = NULL;
|
||||
|
||||
// Skin name
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
if (sprinfoToken == NULL)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where skin frame should be");
|
||||
}
|
||||
|
||||
if (strcmp(sprinfoToken, "*")==0) // All skins
|
||||
{
|
||||
parser->foundskins = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// copy skin name yada yada
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
M_Memcpy(skinName,sprinfoToken,sprinfoTokenLength*sizeof(char));
|
||||
skinName[sprinfoTokenLength] = '\0';
|
||||
strlwr(skinName);
|
||||
|
||||
skinnum = R_SkinAvailable(skinName);
|
||||
if (skinnum == -1)
|
||||
I_Error("Error parsing SPRTINFO lump: Unknown skin \"%s\"", skinName);
|
||||
|
||||
parser->skinnumbers[parser->foundskins] = skinnum;
|
||||
parser->foundskins++;
|
||||
}
|
||||
|
||||
Z_Free(sprinfoToken);
|
||||
}
|
||||
|
||||
static void copy_to_skin (struct ParseSpriteInfoState *parser, INT32 skinnum)
|
||||
{
|
||||
skin_t *skin = &skins[skinnum];
|
||||
spriteinfo_t *sprinfo = skin->sprinfo;
|
||||
|
||||
if (parser->any)
|
||||
{
|
||||
playersprite_t spr2num;
|
||||
|
||||
for (spr2num = 0; spr2num < NUMPLAYERSPRITES; ++spr2num)
|
||||
{
|
||||
M_Memcpy(&sprinfo[spr2num], parser->info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
M_Memcpy(&sprinfo[parser->spr2num], parser->info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
|
||||
static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean all)
|
||||
{
|
||||
char *sprinfoToken;
|
||||
size_t sprinfoTokenLength;
|
||||
|
|
@ -1411,22 +1478,29 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
|
|||
INT16 frameYPivot = 0;
|
||||
rotaxis_t frameRotAxis = 0;
|
||||
|
||||
// Sprite identifier
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
if (sprinfoToken == NULL)
|
||||
if (all)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite frame should be");
|
||||
}
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
if (sprinfoTokenLength != 1)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Invalid frame \"%s\"",sprinfoToken);
|
||||
frameFrame = SPRINFO_DEFAULT_PIVOT;
|
||||
}
|
||||
else
|
||||
frameChar = sprinfoToken;
|
||||
{
|
||||
// Sprite identifier
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
if (sprinfoToken == NULL)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite frame should be");
|
||||
}
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
if (sprinfoTokenLength != 1)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Invalid frame \"%s\"",sprinfoToken);
|
||||
}
|
||||
else
|
||||
frameChar = sprinfoToken;
|
||||
|
||||
frameFrame = R_Char2Frame(frameChar[0]);
|
||||
Z_Free(sprinfoToken);
|
||||
frameFrame = R_Char2Frame(frameChar[0]);
|
||||
Z_Free(sprinfoToken);
|
||||
}
|
||||
|
||||
// Left Curly Brace
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
|
|
@ -1480,9 +1554,50 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
|
|||
}
|
||||
|
||||
// set fields
|
||||
info->pivot[frameFrame].x = frameXPivot;
|
||||
info->pivot[frameFrame].y = frameYPivot;
|
||||
info->pivot[frameFrame].rotaxis = frameRotAxis;
|
||||
parser->info->pivot[frameFrame].x = frameXPivot;
|
||||
parser->info->pivot[frameFrame].y = frameYPivot;
|
||||
parser->info->pivot[frameFrame].rotaxis = frameRotAxis;
|
||||
|
||||
set_bit_array(parser->info->available, frameFrame);
|
||||
|
||||
if (parser->spr2)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
if (!parser->foundskins)
|
||||
I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition");
|
||||
|
||||
if (parser->foundskins < 0)
|
||||
{
|
||||
for (i = 0; i < numskins; i++)
|
||||
{
|
||||
copy_to_skin(parser, i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < parser->foundskins; i++)
|
||||
{
|
||||
copy_to_skin(parser, parser->skinnumbers[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (parser->any)
|
||||
{
|
||||
spritenum_t sprnum;
|
||||
|
||||
for (sprnum = 0; sprnum < NUMSPRITES; ++sprnum)
|
||||
{
|
||||
M_Memcpy(&spriteinfo[sprnum], parser->info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -1492,15 +1607,19 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info)
|
|||
//
|
||||
static void R_ParseSpriteInfo(boolean spr2)
|
||||
{
|
||||
spriteinfo_t *info;
|
||||
char *sprinfoToken;
|
||||
size_t sprinfoTokenLength;
|
||||
char newSpriteName[5]; // no longer dynamically allocated
|
||||
spritenum_t sprnum = NUMSPRITES;
|
||||
playersprite_t spr2num = NUMPLAYERSPRITES;
|
||||
|
||||
struct ParseSpriteInfoState parser = {
|
||||
.spr2 = spr2,
|
||||
.sprnum = NUMSPRITES,
|
||||
.spr2num = NUMPLAYERSPRITES,
|
||||
.any = false,
|
||||
.foundskins = 0,
|
||||
};
|
||||
|
||||
INT32 i;
|
||||
INT32 skinnumbers[MAXSKINS];
|
||||
INT32 foundskins = 0;
|
||||
|
||||
// Sprite name
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
|
|
@ -1508,21 +1627,32 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite name should be");
|
||||
}
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
if (sprinfoTokenLength != 4)
|
||||
|
||||
if (!strcmp(sprinfoToken, "*")) // All sprites
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long",sprinfoToken);
|
||||
parser.any = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(&newSpriteName, 0, 5);
|
||||
M_Memcpy(newSpriteName, sprinfoToken, sprinfoTokenLength);
|
||||
// ^^ we've confirmed that the token is == 4 characters so it will never overflow a 5 byte char buffer
|
||||
strupr(newSpriteName); // Just do this now so we don't have to worry about it
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
if (sprinfoTokenLength != 4)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long",sprinfoToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(&newSpriteName, 0, 5);
|
||||
M_Memcpy(newSpriteName, sprinfoToken, sprinfoTokenLength);
|
||||
// ^^ we've confirmed that the token is == 4 characters so it will never overflow a 5 byte char buffer
|
||||
strupr(newSpriteName); // Just do this now so we don't have to worry about it
|
||||
}
|
||||
}
|
||||
|
||||
Z_Free(sprinfoToken);
|
||||
|
||||
if (!spr2)
|
||||
if (parser.any)
|
||||
;
|
||||
else if (!spr2)
|
||||
{
|
||||
for (i = 0; i <= NUMSPRITES; i++)
|
||||
{
|
||||
|
|
@ -1530,7 +1660,7 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName);
|
||||
if (!memcmp(newSpriteName,sprnames[i],4))
|
||||
{
|
||||
sprnum = i;
|
||||
parser.sprnum = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -1543,15 +1673,14 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
I_Error("Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"", newSpriteName);
|
||||
if (!memcmp(newSpriteName,spr2names[i],4))
|
||||
{
|
||||
spr2num = i;
|
||||
parser.spr2num = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// allocate a spriteinfo
|
||||
info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
|
||||
info->available = true;
|
||||
parser.info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
|
||||
|
||||
// Left Curly Brace
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
|
|
@ -1571,53 +1700,21 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
{
|
||||
if (stricmp(sprinfoToken, "SKIN")==0)
|
||||
{
|
||||
INT32 skinnum;
|
||||
char *skinName = NULL;
|
||||
if (!spr2)
|
||||
I_Error("Error parsing SPRTINFO lump: \"SKIN\" token found outside of a sprite2 definition");
|
||||
|
||||
Z_Free(sprinfoToken);
|
||||
|
||||
// Skin name
|
||||
sprinfoToken = M_GetToken(NULL);
|
||||
if (sprinfoToken == NULL)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where skin frame should be");
|
||||
}
|
||||
|
||||
// copy skin name yada yada
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL);
|
||||
M_Memcpy(skinName,sprinfoToken,sprinfoTokenLength*sizeof(char));
|
||||
skinName[sprinfoTokenLength] = '\0';
|
||||
strlwr(skinName);
|
||||
Z_Free(sprinfoToken);
|
||||
|
||||
skinnum = R_SkinAvailable(skinName);
|
||||
if (skinnum == -1)
|
||||
I_Error("Error parsing SPRTINFO lump: Unknown skin \"%s\"", skinName);
|
||||
|
||||
skinnumbers[foundskins] = skinnum;
|
||||
foundskins++;
|
||||
R_ParseSpriteInfoSkin(&parser);
|
||||
}
|
||||
else if (stricmp(sprinfoToken, "FRAME")==0)
|
||||
{
|
||||
R_ParseSpriteInfoFrame(info);
|
||||
Z_Free(sprinfoToken);
|
||||
if (spr2)
|
||||
{
|
||||
if (!foundskins)
|
||||
I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition");
|
||||
for (i = 0; i < foundskins; i++)
|
||||
{
|
||||
size_t skinnum = skinnumbers[i];
|
||||
skin_t *skin = &skins[skinnum];
|
||||
spriteinfo_t *sprinfo = skin->sprinfo;
|
||||
M_Memcpy(&sprinfo[spr2num], info, sizeof(spriteinfo_t));
|
||||
}
|
||||
}
|
||||
else
|
||||
M_Memcpy(&spriteinfo[sprnum], info, sizeof(spriteinfo_t));
|
||||
R_ParseSpriteInfoFrame(&parser, PARSER_FRAME);
|
||||
}
|
||||
else if (stricmp(sprinfoToken, "DEFAULT")==0)
|
||||
{
|
||||
Z_Free(sprinfoToken);
|
||||
R_ParseSpriteInfoFrame(&parser, PARSER_DEFAULT);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1636,7 +1733,7 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
I_Error("Error parsing SPRTINFO lump: Expected \"{\" for sprite \"%s\", got \"%s\"",newSpriteName,sprinfoToken);
|
||||
}
|
||||
Z_Free(sprinfoToken);
|
||||
Z_Free(info);
|
||||
Z_Free(parser.info);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -100,8 +100,9 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
spriteframepivot_t pivot[64];
|
||||
boolean available;
|
||||
spriteframepivot_t pivot[64 + 1];
|
||||
#define SPRINFO_DEFAULT_PIVOT (64)
|
||||
UINT8 available[BIT_ARRAY_SIZE(64 + 1)]; // 1 extra for default_pivot
|
||||
} spriteinfo_t;
|
||||
|
||||
// Portable Network Graphics
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue