mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-20 01:43:50 +00:00
Implement generic item rows and circles
This commit is contained in:
parent
59c6d59c00
commit
db1f215327
4 changed files with 101 additions and 11 deletions
|
@ -4397,6 +4397,46 @@ udmf
|
|||
sprite = "SPHRA0";
|
||||
width = 192;
|
||||
}
|
||||
610
|
||||
{
|
||||
title = "Row of Items";
|
||||
sprite = "RINGA0";
|
||||
arg0
|
||||
{
|
||||
title = "Number of items";
|
||||
}
|
||||
arg1
|
||||
{
|
||||
title = "Horizontal spacing";
|
||||
}
|
||||
arg2
|
||||
{
|
||||
title = "Vertical spacing";
|
||||
}
|
||||
stringarg0
|
||||
{
|
||||
title = "Object types";
|
||||
}
|
||||
}
|
||||
611
|
||||
{
|
||||
title = "Circle of Items";
|
||||
sprite = "RINGA0";
|
||||
width = 96;
|
||||
height = 192;
|
||||
arg0
|
||||
{
|
||||
title = "Number of items";
|
||||
}
|
||||
arg1
|
||||
{
|
||||
title = "Radius";
|
||||
}
|
||||
stringarg0
|
||||
{
|
||||
title = "Object types";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
invisible
|
||||
|
|
|
@ -1283,7 +1283,7 @@ void OP_NightsObjectplace(player_t *player)
|
|||
mt = OP_CreateNewMapThing(player, (UINT16)cv_mapthingnum.value, false);
|
||||
mt->angle = angle;
|
||||
|
||||
if (mt->type >= 600 && mt->type <= 609) // Placement patterns
|
||||
if (mt->type >= 600 && mt->type <= 611) // Placement patterns
|
||||
P_SpawnItemPattern(mt, false);
|
||||
else if (mt->type == 1713) // NiGHTS Hoops
|
||||
P_SpawnHoop(mt);
|
||||
|
@ -1414,7 +1414,7 @@ void OP_ObjectplaceMovement(player_t *player)
|
|||
return;
|
||||
|
||||
mt = OP_CreateNewMapThing(player, (UINT16)spawnthing, ceiling);
|
||||
if (mt->type >= 600 && mt->type <= 609) // Placement patterns
|
||||
if (mt->type >= 600 && mt->type <= 611) // Placement patterns
|
||||
P_SpawnItemPattern(mt, false);
|
||||
else if (mt->type == 1713) // NiGHTS Hoops
|
||||
P_SpawnHoop(mt);
|
||||
|
|
56
src/p_mobj.c
56
src/p_mobj.c
|
@ -11877,7 +11877,7 @@ static boolean P_SpawnNonMobjMapThing(mapthing_t *mthing)
|
|||
return true;
|
||||
}
|
||||
else if (mthing->type == 750 // Slope vertex point (formerly chaos spawn)
|
||||
|| (mthing->type >= 600 && mthing->type <= 609) // Special placement patterns
|
||||
|| (mthing->type >= 600 && mthing->type <= 611) // Special placement patterns
|
||||
|| mthing->type == 1713) // Hoops
|
||||
return true; // These are handled elsewhere.
|
||||
else if (mthing->type == mobjinfo[MT_EMERHUNT].doomednum)
|
||||
|
@ -13373,7 +13373,7 @@ void P_SetBonusTime(mobj_t *mobj)
|
|||
P_SetMobjState(mobj, mobj->info->raisestate);
|
||||
}
|
||||
|
||||
static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t* itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime)
|
||||
static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t *itemtypes, UINT8 numitemtypes, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime)
|
||||
{
|
||||
mapthing_t dummything;
|
||||
mobj_t *mobj = NULL;
|
||||
|
@ -13424,7 +13424,7 @@ static void P_SpawnItemRow(mapthing_t *mthing, mobjtype_t* itemtypes, UINT8 numi
|
|||
}
|
||||
}
|
||||
|
||||
static void P_SpawnSingularItemRow(mapthing_t* mthing, mobjtype_t itemtype, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime)
|
||||
static void P_SpawnSingularItemRow(mapthing_t *mthing, mobjtype_t itemtype, INT32 numitems, fixed_t horizontalspacing, fixed_t verticalspacing, INT16 fixedangle, boolean bonustime)
|
||||
{
|
||||
mobjtype_t itemtypes[1] = { itemtype };
|
||||
return P_SpawnItemRow(mthing, itemtypes, 1, numitems, horizontalspacing, verticalspacing, fixedangle, bonustime);
|
||||
|
@ -13488,6 +13488,35 @@ static void P_SpawnItemCircle(mapthing_t *mthing, mobjtype_t *itemtypes, UINT8 n
|
|||
}
|
||||
}
|
||||
|
||||
static void P_ParseItemTypes(char *itemstring, mobjtype_t *itemtypes, UINT8 *numitemtypes)
|
||||
{
|
||||
char *tok;
|
||||
|
||||
*numitemtypes = 0;
|
||||
if (itemstring)
|
||||
{
|
||||
char *stringcopy = Z_Malloc(strlen(itemstring) + 1, PU_LEVEL, NULL);
|
||||
M_Memcpy(stringcopy, itemstring, strlen(itemstring));
|
||||
stringcopy[strlen(itemstring)] = '\0';
|
||||
|
||||
tok = strtok(stringcopy, " ");
|
||||
while (tok && *numitemtypes < 128)
|
||||
{
|
||||
itemtypes[*numitemtypes] = get_number(tok);
|
||||
tok = strtok(NULL, " ");
|
||||
(*numitemtypes)++;
|
||||
}
|
||||
|
||||
Z_Free(stringcopy);
|
||||
}
|
||||
else
|
||||
{
|
||||
//If no types are supplied, default to ring
|
||||
itemtypes[0] = MT_RING;
|
||||
*numitemtypes = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime)
|
||||
{
|
||||
switch (mthing->type)
|
||||
|
@ -13525,6 +13554,27 @@ void P_SpawnItemPattern(mapthing_t *mthing, boolean bonustime)
|
|||
P_SpawnItemCircle(mthing, itemtypes, 2, numitems, size, bonustime);
|
||||
return;
|
||||
}
|
||||
case 610: // Generic item row
|
||||
{
|
||||
mobjtype_t itemtypes[128]; //If you want to have a row with more than 128 different object types, you're crazy.
|
||||
UINT8 numitemtypes;
|
||||
if (!udmf)
|
||||
return;
|
||||
P_ParseItemTypes(mthing->stringargs[0], itemtypes, &numitemtypes);
|
||||
P_SpawnItemRow(mthing, itemtypes, numitemtypes, mthing->args[0], mthing->args[1] << FRACBITS, mthing->args[2] << FRACBITS, mthing->angle, bonustime);
|
||||
return;
|
||||
}
|
||||
case 611: // Generic item circle
|
||||
{
|
||||
mobjtype_t itemtypes[128]; //If you want to have a circle with more than 128 different object types, you're crazy.
|
||||
UINT8 numitemtypes;
|
||||
if (!udmf)
|
||||
return;
|
||||
CONS_Printf("Itemstring: %s\n", mthing->stringargs[0]);
|
||||
P_ParseItemTypes(mthing->stringargs[0], itemtypes, &numitemtypes);
|
||||
P_SpawnItemCircle(mthing, itemtypes, numitemtypes, mthing->args[0], mthing->args[1] << FRACBITS, bonustime);
|
||||
return;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -734,7 +734,7 @@ void P_ReloadRings(void)
|
|||
mt->mobj = NULL;
|
||||
P_SetBonusTime(P_SpawnMapThing(mt));
|
||||
}
|
||||
else if (mt->type >= 600 && mt->type <= 609) // Item patterns
|
||||
else if (mt->type >= 600 && mt->type <= 611) // Item patterns
|
||||
{
|
||||
mt->mobj = NULL;
|
||||
P_SpawnItemPattern(mt, true);
|
||||
|
@ -893,7 +893,7 @@ static void P_SpawnMapThings(boolean spawnemblems)
|
|||
|
||||
mt->mobj = NULL;
|
||||
|
||||
if (mt->type >= 600 && mt->type <= 609) // item patterns
|
||||
if (mt->type >= 600 && mt->type <= 611) // item patterns
|
||||
P_SpawnItemPattern(mt, false);
|
||||
else if (mt->type == 1713) // hoops
|
||||
P_SpawnHoop(mt);
|
||||
|
@ -1701,9 +1701,9 @@ static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val)
|
|||
P_SetLinedefV1(i, atol(val));
|
||||
else if (fastcmp(param, "v2"))
|
||||
P_SetLinedefV2(i, atol(val));
|
||||
else if (strlen(param) == 7 && fastncmp(param, "arg", 3) && fastncmp(param + 4, "str", 3))
|
||||
else if (fastncmp(param, "stringarg", 9) && strlen(param) > 9)
|
||||
{
|
||||
size_t argnum = param[3] - '0';
|
||||
size_t argnum = atol(param + 9);
|
||||
if (argnum >= NUMLINESTRINGARGS)
|
||||
return;
|
||||
lines[i].stringargs[argnum] = Z_Malloc(strlen(val) + 1, PU_LEVEL, NULL);
|
||||
|
@ -1800,9 +1800,9 @@ static void ParseTextmapThingParameter(UINT32 i, char *param, char *val)
|
|||
else if (fastcmp(param, "ambush") && fastcmp("true", val))
|
||||
mapthings[i].options |= MTF_AMBUSH;
|
||||
|
||||
else if (strlen(param) == 7 && fastncmp(param, "arg", 3) && fastncmp(param + 4, "str", 3))
|
||||
else if (fastncmp(param, "stringarg", 9) && strlen(param) > 9)
|
||||
{
|
||||
size_t argnum = param[3] - '0';
|
||||
size_t argnum = atol(param + 9);
|
||||
if (argnum >= NUMMAPTHINGSTRINGARGS)
|
||||
return;
|
||||
mapthings[i].stringargs[argnum] = Z_Malloc(strlen(val) + 1, PU_LEVEL, NULL);
|
||||
|
|
Loading…
Reference in a new issue