Implement generic item rows and circles

This commit is contained in:
MascaraSnake 2021-12-20 21:14:39 +01:00
parent 59c6d59c00
commit db1f215327
4 changed files with 101 additions and 11 deletions

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -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);