Estou desenvolvendo um sistema de suprimentos semelhante no meu próprio jogo, então também estive pensando em como resolver o problema do bloqueio de suprimentos e o favoritismo. Para ilustrar o problema, criarei um exemplo simples:
Se você possui uma lista: [produtor1, consumidor1, consumidor2, consumidor3] e atualiza em ordem, iniciando no fornecimento = 0, obterá o seguinte:
producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer1 wants 3 mass. Success, you now have 4 mass
consumer2 wants 3 mass. Success, you now have 1 mass
consumer3 wants 3 mass. Fail
etc...
O consumidor1 recebe toda a diversão, enquanto os consumidores 2 e 3 passam fome até que o consumidor 1 seja satisfeito. Dependendo do seu jogo, isso pode não ser desejável. Eu sei no meu jogo, não é. Quando eu chegar lá, vou criar uma fila na qual os consumidores que foram alimentados em um tick irão para o final da fila para o próximo tick, que eu acredito que é o que Roy T. está fazendo. O exemplo acima ficaria assim:
producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass. <-- Move to end of queue
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer2 wants 3 mass. Success, you now have 4 mass <-- Note the order change
consumer3 wants 3 mass. Success, you now have 1 mass
consumer1 wants 3 mass. Fail
etc...
Dessa forma, todos receberão sua parte justa dos recursos.
Também planejo implementar uma fila adicional para ser usada como fila prioritária, para que o usuário possa selecionar determinadas estruturas para ter prioridade de recurso. A fila de prioridade sempre será atendida antes da fila padrão. Certifique-se de que todos os produtores sejam atualizados primeiro e, em seguida, consuma todos os recursos depois, caso contrário, a fila será interrompida quando você produzir recursos no meio de um tick e alguns consumidores já tiverem passado fome.
Para recapitular: atualize os produtores e, em seguida, a fila de prioridade, movendo os consumidores alimentados para o final da fila de prioridade e atualize a fila padrão, movendo os consumidores alimentados para o final da fila padrão.