0x0049C7F2
| 110 | |
| 111 | // 0x0049C7F2 |
| 112 | static currency32_t removeTrack(const TrackRemovalArgs& args, const uint8_t flags) |
| 113 | { |
| 114 | setExpenditureType(ExpenditureType::Construction); |
| 115 | setPosition(args.pos + World::Pos3{ 16, 16, 0 }); |
| 116 | |
| 117 | currency32_t totalRemovalCost = 0; |
| 118 | |
| 119 | auto* elTrack = getElTrackAt(args, flags, args.pos, args.index); |
| 120 | if (elTrack == nullptr) |
| 121 | { |
| 122 | return kFailure; |
| 123 | } |
| 124 | |
| 125 | if ((flags & Flags::ghost) == 0 && !sub_431E6A(elTrack->owner(), reinterpret_cast<World::TileElement*>(elTrack))) |
| 126 | { |
| 127 | return kFailure; |
| 128 | } |
| 129 | |
| 130 | if (elTrack->hasSignal()) |
| 131 | { |
| 132 | GameCommands::SignalRemovalArgs srArgs; |
| 133 | srArgs.pos = args.pos; |
| 134 | srArgs.rotation = args.rotation; |
| 135 | srArgs.index = args.index; |
| 136 | srArgs.trackId = args.trackId; |
| 137 | srArgs.trackObjType = args.trackObjectId; |
| 138 | srArgs.flags = 0; |
| 139 | |
| 140 | auto* elSignal = elTrack->next()->as<World::SignalElement>(); |
| 141 | if (elSignal != nullptr) |
| 142 | { |
| 143 | if (elSignal->getLeft().hasSignal()) |
| 144 | { |
| 145 | srArgs.flags |= 1U << 15; |
| 146 | } |
| 147 | if (elSignal->getRight().hasSignal()) |
| 148 | { |
| 149 | srArgs.flags |= 1U << 14; |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | if (auto cost = GameCommands::doCommand(srArgs, flags); cost != kFailure) |
| 154 | { |
| 155 | totalRemovalCost += cost; |
| 156 | } |
| 157 | else |
| 158 | { |
| 159 | return kFailure; |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | // Fetch track element again; signal removal above might have invalidated the pointer. |
| 164 | elTrack = getElTrackAt(args, flags, args.pos, args.index); |
| 165 | |
| 166 | if (elTrack->hasStationElement()) |
| 167 | { |
| 168 | GameCommands::TrainStationRemovalArgs tsArgs; |
| 169 | tsArgs.pos = args.pos; |
no test coverage detected