Programmable pre-signals: Fix MP desync with programming new signals
If signal was never evaluated on the server, inserting instructions would fail on the server, such that the signal programs differed between client and server.
This commit is contained in:
@@ -530,7 +530,9 @@ SignalProgram *GetSignalProgram(SignalReference ref)
|
|||||||
if (!pr) {
|
if (!pr) {
|
||||||
pr = new SignalProgram(ref.tile, ref.track);
|
pr = new SignalProgram(ref.tile, ref.track);
|
||||||
_signal_programs[ref] = pr;
|
_signal_programs[ref] = pr;
|
||||||
} else assert(pr->tile == ref.tile && pr->track == ref.track);
|
} else {
|
||||||
|
assert(pr->tile == ref.tile && pr->track == ref.track);
|
||||||
|
}
|
||||||
return pr;
|
return pr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -558,7 +560,8 @@ void FreeSignalPrograms()
|
|||||||
|
|
||||||
SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green)
|
SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green)
|
||||||
{
|
{
|
||||||
SignalProgram *program = GetSignalProgram(ref);
|
SignalProgram *program = GetExistingSignalProgram(ref);
|
||||||
|
if (!program) return SIGNAL_STATE_RED;
|
||||||
SignalVM vm;
|
SignalVM vm;
|
||||||
vm.program = program;
|
vm.program = program;
|
||||||
vm.num_exits = num_exits;
|
vm.num_exits = num_exits;
|
||||||
@@ -575,7 +578,8 @@ SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green
|
|||||||
|
|
||||||
void RemoveProgramDependencies(SignalReference dependency_target, SignalReference signal_to_update)
|
void RemoveProgramDependencies(SignalReference dependency_target, SignalReference signal_to_update)
|
||||||
{
|
{
|
||||||
SignalProgram *prog = GetSignalProgram(signal_to_update);
|
SignalProgram *prog = GetExistingSignalProgram(signal_to_update);
|
||||||
|
if (!prog) return;
|
||||||
for (SignalInstruction *insn : prog->instructions) {
|
for (SignalInstruction *insn : prog->instructions) {
|
||||||
if (insn->Opcode() == PSO_IF) {
|
if (insn->Opcode() == PSO_IF) {
|
||||||
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
||||||
@@ -595,7 +599,8 @@ void RemoveProgramDependencies(SignalReference dependency_target, SignalReferenc
|
|||||||
|
|
||||||
void RemoveProgramSlotDependencies(TraceRestrictSlotID slot_being_removed, SignalReference signal_to_update)
|
void RemoveProgramSlotDependencies(TraceRestrictSlotID slot_being_removed, SignalReference signal_to_update)
|
||||||
{
|
{
|
||||||
SignalProgram *prog = GetSignalProgram(signal_to_update);
|
SignalProgram *prog = GetExistingSignalProgram(signal_to_update);
|
||||||
|
if (!prog) return;
|
||||||
for (SignalInstruction *insn : prog->instructions) {
|
for (SignalInstruction *insn : prog->instructions) {
|
||||||
if (insn->Opcode() == PSO_IF) {
|
if (insn->Opcode() == PSO_IF) {
|
||||||
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
||||||
@@ -615,7 +620,8 @@ void RemoveProgramSlotDependencies(TraceRestrictSlotID slot_being_removed, Signa
|
|||||||
|
|
||||||
void RemoveProgramCounterDependencies(TraceRestrictCounterID ctr_being_removed, SignalReference signal_to_update)
|
void RemoveProgramCounterDependencies(TraceRestrictCounterID ctr_being_removed, SignalReference signal_to_update)
|
||||||
{
|
{
|
||||||
SignalProgram *prog = GetSignalProgram(signal_to_update);
|
SignalProgram *prog = GetExistingSignalProgram(signal_to_update);
|
||||||
|
if (!prog) return;
|
||||||
for (SignalInstruction *insn : prog->instructions) {
|
for (SignalInstruction *insn : prog->instructions) {
|
||||||
if (insn->Opcode() == PSO_IF) {
|
if (insn->Opcode() == PSO_IF) {
|
||||||
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
SignalIf* ifi = static_cast<SignalIf*>(insn);
|
||||||
@@ -669,7 +675,7 @@ CommandCost CmdInsertSignalInstruction(TileIndex tile, DoCommandFlag flags, uint
|
|||||||
if (!IsTileOwner(tile, _current_company))
|
if (!IsTileOwner(tile, _current_company))
|
||||||
return_cmd_error(STR_ERROR_AREA_IS_OWNED_BY_ANOTHER);
|
return_cmd_error(STR_ERROR_AREA_IS_OWNED_BY_ANOTHER);
|
||||||
|
|
||||||
SignalProgram *prog = GetExistingSignalProgram(SignalReference(tile, track));
|
SignalProgram *prog = GetSignalProgram(SignalReference(tile, track));
|
||||||
if (!prog)
|
if (!prog)
|
||||||
return_cmd_error(STR_ERR_PROGSIG_NOT_THERE);
|
return_cmd_error(STR_ERR_PROGSIG_NOT_THERE);
|
||||||
if (instruction_id >= prog->instructions.size())
|
if (instruction_id >= prog->instructions.size())
|
||||||
|
Reference in New Issue
Block a user