You could make a struct
struct tableStruct
{
int pin,
int value,
unsigned long interval,
};
tableStruct table[] =
{
{ relaylock, HIGH, 0 },
{ relayindicators, HIGH, 0 },
{ relaybeep, HIGH, 0 },
{ relaywindowup, HIGH, 150 },
...
};
With variables to control everything:
bool enable;
int index;
unsigned long previousMillis;
unsigned long interval;
With a millis() timer in the loop()
unsigned long currentMillis = millis();
if( enable)
{
if( currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
digitalWrite( table[index].pin, table[index].value);
interval = table[index].interval;
index++;
if( index >= sizeof(table) / sizeof(tableStruct))
{
enable = false;
}
}
}
Starting the table can be done with:
enable = true;
index = 0;
previousMillis = millis();
When a few items in the struct have a interval of zero, they will be executed one by one every time the loop() runs. That will work, even with a interval of zero.