Add railtype and signals variables for signal vertical clearance

This commit is contained in:
Jonathan G Rennison
2023-04-04 20:29:22 +01:00
parent 0370f2e3f1
commit e02585f68e
14 changed files with 181 additions and 38 deletions

View File

@@ -37,6 +37,7 @@
case A2VRI_RAILTYPE_SIGNAL_RESTRICTION_INFO: return 0;
case A2VRI_RAILTYPE_SIGNAL_CONTEXT: return this->signal_context;
case A2VRI_RAILTYPE_SIGNAL_SIDE: return GetNewSignalsSideVariable();
case A2VRI_RAILTYPE_SIGNAL_VERTICAL_CLEARANCE: return 0xFF;
}
}
@@ -62,6 +63,8 @@
return GetNewSignalsSignalContext(this->signal_context, this->tile);
case A2VRI_RAILTYPE_SIGNAL_SIDE:
return GetNewSignalsSideVariable();
case A2VRI_RAILTYPE_SIGNAL_VERTICAL_CLEARANCE:
return GetNewSignalsVerticalClearanceInfo(this->tile, this->z);
}
DEBUG(grf, 1, "Unhandled rail type tile variable 0x%X", variable);
@@ -89,10 +92,12 @@ uint32 RailTypeResolverObject::GetDebugID() const
* @param param1 Extra parameter (first parameter of the callback, except railtypes do not have callbacks).
* @param param2 Extra parameter (second parameter of the callback, except railtypes do not have callbacks).
* @param signal_context Signal context.
* @param z Signal pixel z.
* @param prog Routing restriction program.
*/
RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2, CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog)
: ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, rti, tile, context, signal_context, prog)
RailTypeResolverObject::RailTypeResolverObject(const RailtypeInfo *rti, TileIndex tile, TileContext context, RailTypeSpriteGroup rtsg, uint32 param1, uint32 param2,
CustomSignalSpriteContext signal_context, const TraceRestrictProgram *prog, uint z)
: ResolverObject(rti != nullptr ? rti->grffile[rtsg] : nullptr, CBID_NO_CALLBACK, param1, param2), railtype_scope(*this, rti, tile, context, signal_context, prog, z)
{
this->root_spritegroup = rti != nullptr ? rti->group[rtsg] : nullptr;
}
@@ -135,7 +140,8 @@ inline uint8 RemapAspect(uint8 aspect, uint8 extra_aspects, uint8 style)
return aspect + 1;
}
static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, CustomSignalSpriteContext context, const TraceRestrictProgram *prog)
static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect,
CustomSignalSpriteContext context, const TraceRestrictProgram *prog, uint z)
{
if (rti->group[RTSG_SIGNALS] == nullptr) return { 0, PAL_NONE };
if (type == SIGTYPE_PROG && !HasBit(rti->ctrl_flags, RTCF_PROGSIG)) return { 0, PAL_NONE };
@@ -144,7 +150,7 @@ static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIn
uint32 param1 = (context == CSSC_GUI) ? 0x10 : 0x00;
uint32 param2 = (type << 16) | (var << 8) | RemapAspect(aspect, rti->signal_extra_aspects, 0);
if ((prog != nullptr) && HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG)) SetBit(param2, 24);
RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2, context, prog);
RailTypeResolverObject object(rti, tile, TCX_NORMAL, RTSG_SIGNALS, param1, param2, context, prog, z);
const SpriteGroup *group = object.Resolve();
if (group == nullptr || group->GetNumResults() == 0) return { 0, PAL_NONE };
@@ -163,12 +169,13 @@ static PalSpriteID GetRailTypeCustomSignalSprite(const RailtypeInfo *rti, TileIn
* @param gui Is the sprite being used on the map or in the GUI?
* @return The sprite to draw.
*/
CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect, CustomSignalSpriteContext context, uint8 style, const TraceRestrictProgram *prog)
CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, uint8 aspect,
CustomSignalSpriteContext context, uint8 style, const TraceRestrictProgram *prog, uint z)
{
if (_settings_client.gui.show_all_signal_default && style == 0) return { { 0, PAL_NONE }, false };
if (style == 0) {
PalSpriteID spr = GetRailTypeCustomSignalSprite(rti, tile, type, var, aspect, context, prog);
PalSpriteID spr = GetRailTypeCustomSignalSprite(rti, tile, type, var, aspect, context, prog, z);
if (spr.sprite != 0) return { spr, HasBit(rti->ctrl_flags, RTCF_RESTRICTEDSIG) };
}
@@ -182,7 +189,7 @@ CustomSignalSpriteResult GetCustomSignalSprite(const RailtypeInfo *rti, TileInde
uint32 param1 = (context == CSSC_GUI) ? 0x10 : 0x00;
uint32 param2 = (type << 16) | (var << 8) | RemapAspect(aspect, grf->new_signal_extra_aspects, style);
if ((prog != nullptr) && HasBit(grf->new_signal_ctrl_flags, NSCF_RESTRICTEDSIG)) SetBit(param2, 24);
NewSignalsResolverObject object(grf, tile, TCX_NORMAL, param1, param2, context, style, prog);
NewSignalsResolverObject object(grf, tile, TCX_NORMAL, param1, param2, context, style, prog, z);
const SpriteGroup *group = object.Resolve();
if (group != nullptr && group->GetNumResults() != 0) {