0x004704AB
| 157 | |
| 158 | // 0x004704AB |
| 159 | void insertOrder(VehicleHead* head, uint16_t orderOffset, const Order* order) |
| 160 | { |
| 161 | assert(order->getType() != OrderType::End && orderOffset < head->sizeOfOrderTable); |
| 162 | auto insOrderLength = kOrderSizes[enumValue(order->getType())]; |
| 163 | |
| 164 | // Shift current order to compensate for the new order. |
| 165 | // For empty order tables, let current order point to the first order. |
| 166 | if (head->sizeOfOrderTable > 1 && head->currentOrder >= orderOffset) |
| 167 | { |
| 168 | head->currentOrder += insOrderLength; |
| 169 | } |
| 170 | |
| 171 | head->sizeOfOrderTable += insOrderLength; |
| 172 | |
| 173 | // Shift existing orders to make room for the new one |
| 174 | shiftOrdersRight(head->orderTableOffset + orderOffset, insOrderLength); |
| 175 | // Bookkeeping: change order table size |
| 176 | orderTableLength() += insOrderLength; |
| 177 | |
| 178 | // Calculate destination offset and copy data |
| 179 | auto rawOrder = order->getRaw(); |
| 180 | auto dest = reinterpret_cast<uint8_t*>(orders() + head->orderTableOffset + orderOffset); |
| 181 | std::memcpy(dest, &rawOrder, insOrderLength); |
| 182 | |
| 183 | // Recalculate order offsets for other vehicles |
| 184 | reoffsetVehicleOrderTables(head->orderTableOffset + 1, insOrderLength); |
| 185 | } |
| 186 | |
| 187 | // 0x004705C0 |
| 188 | void deleteOrder(VehicleHead* head, uint16_t orderOffset) |
no test coverage detected