Merge branch 'tracerestrict-sx' into jgrpp

# Conflicts:
#	src/group_cmd.cpp
#	src/group_gui.cpp
#	src/lang/english.txt
#	src/saveload/extended_ver_sl.cpp
#	src/tracerestrict.cpp
#	src/tracerestrict.h
#	src/tracerestrict_gui.cpp
This commit is contained in:
Jonathan G Rennison
2016-04-05 20:12:09 +01:00
7 changed files with 168 additions and 30 deletions

View File

@@ -18,6 +18,7 @@
#include "window_func.h"
#include "order_base.h"
#include "cargotype.h"
#include "group.h"
#include "pathfinder/yapf/yapf_cache.h"
#include <vector>
@@ -343,6 +344,11 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp
break;
}
case TRIT_COND_TRAIN_GROUP: {
result = TestBinaryConditionCommon(item, GroupIsInGroup(v->group_id, GetTraceRestrictValue(item)));
break;
}
case TRIT_COND_TRAIN_OWNER: {
result = TestBinaryConditionCommon(item, v->owner == condvalue);
break;
@@ -484,6 +490,7 @@ CommandCost TraceRestrictProgram::Validate(const std::vector<TraceRestrictItem>
case TRIT_COND_CARGO:
case TRIT_COND_ENTRY_DIRECTION:
case TRIT_COND_PBS_ENTRY_SIGNAL:
case TRIT_COND_TRAIN_GROUP:
case TRIT_COND_TRAIN_OWNER:
break;
@@ -583,6 +590,11 @@ void SetTraceRestrictValueDefault(TraceRestrictItem &item, TraceRestrictValueTyp
SetTraceRestrictAuxField(item, TRPPAF_PRESET);
break;
case TRVT_GROUP_INDEX:
SetTraceRestrictValue(item, INVALID_GROUP);
SetTraceRestrictAuxField(item, 0);
break;
case TRVT_OWNER:
SetTraceRestrictValue(item, INVALID_OWNER);
SetTraceRestrictAuxField(item, 0);
@@ -1122,6 +1134,28 @@ void TraceRestrictRemoveDestinationID(TraceRestrictOrderCondAuxField type, uint1
InvalidateWindowClassesData(WC_TRACE_RESTRICT);
}
/**
* This is called when a group is about to be deleted
* Scan program pool and change any references to it to the invalid group ID, to avoid dangling references
*/
void TraceRestrictRemoveGroupID(GroupID index)
{
TraceRestrictProgram *prog;
FOR_ALL_TRACE_RESTRICT_PROGRAMS(prog) {
for (size_t i = 0; i < prog->items.size(); i++) {
TraceRestrictItem &item = prog->items[i]; // note this is a reference,
if (GetTraceRestrictType(item) == TRIT_COND_TRAIN_GROUP && GetTraceRestrictValue(item) == index) {
SetTraceRestrictValueDefault(item, TRVT_GROUP_INDEX); // this updates the instruction in-place
}
if (IsTraceRestrictDoubleItem(item)) i++;
}
}
// update windows
InvalidateWindowClassesData(WC_TRACE_RESTRICT);
}
/**
* This is called when a company is about to be deleted or taken over
* Scan program pool and change any references to it to the new company ID, to avoid dangling references