기차 시간표에 급유 정거장을 고정하지 않는 방법

매번 들를 필요 없는 정거장
2023년 12월 15일의 Factorio 개발 기록 #389는 열차 시간표의 인터럽트를 소개합니다. 기존의 고정 순환 경로에서는 연료가 충분해도 급유 정거장을 경유하거나, 여러 하역 지점에 급유 시설을 반복 배치해야 했습니다. 연료가 부족할 때만 따로 들른다는 규칙을 시간표에 표현하기 어려웠던 것입니다.
인터럽트는 조건과 임시 목적지·대기 조건의 묶음입니다. 발표 당시 설명에 따르면 열차가 현재 정거장을 떠나려 할 때 조건을 검사하고, 충족하면 임시 정거장을 시간표에 넣습니다. 달리는 도중 임의의 순간에 급정지시키는 CPU 인터럽트와 같은 의미로 이해하면 안 됩니다.
기존 임시 정거장을 재사용합니다
원문은 수동으로 열차를 특정 위치에 보낼 때 쓰던 임시 정거장 개념을 활용했다고 설명합니다. 임시 정거장은 열차가 떠나면 시간표에서 제거되는 일회성 명령입니다. 조건 판단을 기존 경로 처리 방식에 연결해 우회 방문을 표현한 셈입니다.
같은 방식은 화물 종류에 따른 하역 목적지 선택이나 목적지가 가득 찼을 때 대기소로 이동하는 데도 적용됩니다. 다만 이런 규칙을 넣었다고 철도 전체의 교착이나 공급 부족이 자동 해결되는 것은 아닙니다. 정거장 수용량과 경로 연결은 여전히 별도로 설계해야 합니다.
공유 규칙은 수정 범위가 넓습니다
개발진은 같은 이름의 인터럽트를 여러 시간표에서 공유하도록 바꿨다고 설명합니다. 연료 종류를 바꿀 때 열차마다 규칙을 수정하는 수고를 줄이기 위해서입니다. 한 번의 수정이 여러 열차에 영향을 준다는 점은 편의와 함께 검토해야 할 조건입니다.
현재 공식 LuaSchedule에는 add_interrupt, change_interrupt, get_interrupts 등의 메서드가 공개돼 있습니다. add_interrupt는 같은 이름이 이미 있으면 새로 추가하지 않는다고 명시합니다. 따라서 호출 횟수와 실제 규칙 개수를 같은 것으로 가정하지 말고 조회 결과를 확인해야 합니다. 공개 API를 확인한 것이지 내부 스케줄러 코드 전체를 검증한 것은 아닙니다.
급유 규칙부터 작게 시험하기
아직 수행하지 않은 실험으로, 적재·하역을 반복하는 열차와 급유 정거장 하나를 구성해 보는 절차를 제안합니다. 먼저 연료가 충분할 때와 부족할 때를 나누고, 출발 시점에 임시 정거장이 추가되는지 관찰합니다. 급유 후에는 임시 항목이 사라지고 원래 운반 흐름으로 이어지는지 확인합니다.
이어 급유소가 꽉 찼거나 경로가 끊긴 경우, 여러 인터럽트 조건이 함께 맞는 경우를 시험할 수 있습니다. 우선순위나 재진입 동작은 임의로 추측하지 말고 사용 버전의 규칙과 실제 로그를 비교해야 합니다. 같은 이름의 규칙을 공유하는 열차를 추가한 뒤 수정 영향 범위도 점검할 만합니다.
기록할 값은 총 운행 시간, 급유 경유 횟수, 대기 시간, 임시 정거장 목록입니다. 고정 경유 방식보다 항상 빠르다는 결론을 미리 정하기보다, 불필요한 방문이 줄어드는 조건과 새로 생기는 대기를 구분해 살펴보는 실험이 좋습니다.
미로


댓글
이 글에 대한 생각을 남겨 주세요.