인터럽트가 우선순위랑은 약간 다르긴한데 그냥 찰떡같이 알아먹으셈
+
그냥 인터럽트로 다 수정함
대충 끼어들기, 조건부 실행 그런뜻인데 잘 모르겠으면 나무위키 가서 읽어봐라
https://www.factorio.com/blog/post/fff-389
FFF #389 - 열차 제어 개선 사항
게시자 Kovarex, Klonan
2023-12-15
안녕하세요,
기차는 저희가 게임에서 가장 좋아하는 부분 중 하나입니다. 철도를 개선한 방법에 대해서는 이미(FFF-377, 378) 말씀드렸으니, 이번에는 철도 위를 달리는 기차를 제어하는 방법을 개선한 방법에 대해 말씀드릴 차례입니다.
열차 스케줄 인터럽트
열차를 제어하는 방식은 현재 매우 정적입니다. 방문해야 할 정거장 목록이 있고 기차는 그 정거장을 하나씩 통과하기만 하면 됩니다. 유일하게 동적인 부분은 각 정거장에서의 대기 시간입니다.
현재 상황에 따라 동적으로 다른 곳으로 갈 수 있는 방법은 없습니다.
이 제한으로 인한 가장 명백한 성가신 점은 열차에 연료를 보급하는 방법의 문제입니다. 1.1에서는 모든 일정에 기관차에 연료를 공급하는 정류장이 있는지 확인해야 합니다. 예를 들어, 메인 기지에 있는 철광석 하차장에는 연료를 넣을 수 있는 투입기가 있습니다. 하지만 노선이 다양할수록 더 많은 연료 보급 정류장이 필요합니다.
지루하고 반복적이며 연료 종류를 바꾸고 싶을 때는 더욱 짜증나죠. 대안으로 전용 주유소를 마련하여 모든 일정에 한번씩 주유를 하는 방법이 있지만, 이 방법은 매우 시간적으로 낭비인 것 같습니다.
우리가 열차에 바라는 실제 로직은 매우 간단합니다:
"할 일을 하다가 연료가 부족할 때만 전용 주유소로 가라"
이러한 로직이 매우 자연스럽게 느껴지기 때문에 저희는 이러한 종류의 로직을 매우 쉽게 구현할 수 있는 새로운 기능을 게임에 구현했으며, 이를 스케줄 인터럽트라고 부릅니다.
인터럽트는 매우 간단합니다. 인터럽트를 트리거할 조건 목록과 스케줄에 추가할 대상 역 목록 + 대기 조건을 지정하면 됩니다. 열차가 현재 역을 떠나고자 할 때마다 모든 인터럽트를 하나씩 확인하여 인터럽트 조건을 평가합니다. 조건이 충족되면 인터럽트가 활성화되고 대상 역이 현재 스케줄에 임시 정차역으로 붙여넣어집니다.
사용 가능한 조건은 대부분 대기 조건에서 익숙한 세트(화물 가득/비어 있음, 회로 상태, 품목/유체 수 등)이며, 인터럽트에만 적용되는 몇 가지 특수 조건이 추가되었습니다.
열차를 어딘가로 수동으로 보내는 데만 사용되던 임시 정거장 개념을 이미 구현한 것이 매우 편리했습니다.
모르는 분들을 위해 설명하자면, 임시 역은 열차가 임시 역을 떠나면 해당 항목이 스케줄에서 삭제되는 일회성 주문과 같은 개념입니다.
원래 제작 동기는 주유소였지만, 작동 방식은 훨씬 더 광범위하게 적용될 수 있습니다.
일반 열차
인터럽트에는 화물 조건이 있을 수 있으므로 각 화물 유형에 대해 어디로 배송해야 하는지 알려주는 인터럽트를 만들 수 있습니다.
예를 들어, 철광석이 있으면 철광석 하차역으로, 구리 광석이 있으면 구리 광석 하차역으로 이동하는 식입니다.
즉, 이러한 종류의 인터럽트가 있는 열차는 이제 어떤 화물을 던져도 처리할 수 있으므로 철 또는 구리 또는 인터럽트로 지원하는 모든 화물을 픽업해야 하는지는 중요하지 않습니다. 이러면 각각의 공급 스테이션을 구분할 이유가 없으며, 열차 정차 제한을 사용하는 한 모든 공급 스테이션의 이름을 동일하게 지정하고 하나의 스케줄을 사용하여 모든 것을 관리할 수 있습니다.
이 시스템의 가장 큰 장점 중 하나는 모든 열차가 가능한 모든 노선에서 공유되기 때문에 "구리 열차가 부족해", "순환 열차가 부족해" 등의 고민을 할 필요가 없다는 것입니다. 열차만 있으면 충분하거나 부족하지 않은 열차만 있으면 됩니다.
창고 문제
이 모든 것이 매우 좋지만 새로운 문제가 발생했는데, 바로 모든 하역 스테이션의 공간 여부에 따라 열차 가용성의 변동이 발생한다는 것입니다. 이로 인해 일부 리소스나 생산량이 부족할 때 시스템에서 열차가 초과될 수 있으며, 이를 처리할 방법이 필요합니다.
그래서 "목적지 가득 찼음"이라는 특수 인터럽트 조건을 추가하여 모든 아이템 입력이 채워진 경우 현재 역을 막지 않고 기차를 창고로 보내도록 인터럽트할 수 있게 했습니다.
일부 스크린샷에서 창고 스테이션이 줄지어 있는 것을 발견하신 분들도 계실 텐데요, 이것이 바로 그것입니다.
인터럽트는 글로벌
처음에는 인터럽트가 각 스케줄마다 달랐지만, 결국 서로 다른 스케줄 간에 동일한 인터럽트를 공유할 수 있는 것이 정말 좋은 아이디어라는 것을 깨달았습니다. 예를 들어 연료를 석탄에서 로켓 연료로 업그레이드하려면 각 스케줄마다 인터럽트를 업데이트해야 하는데, 이는 매우 번거로울 뿐만 아니라 일부 열차가 업데이트되지 않는 경우가 종종 발생했습니다.
그래서 인터럽트가 전체 맵으로 공유(이름으로 식별)되고, 인터럽트를 편집하면 해당 인터럽트가 있는 모든 열차에 대해 변경되도록 만들었습니다. 덕분에 훨씬 더 편리하고 오류 발생률이 낮아졌습니다.
인터럽트의 인터럽트
일반적으로 인터럽트가 활성화되면 해당 인터럽트가 완료될 때까지 다른 인터럽트가 간섭할 수 없습니다. 하지만 일부 특정 경우에는 이러한 제한이 너무 심하기 때문에 "인터럽트 중"이라는 또 다른 특수 인터럽트 조건을 추가했습니다. 이렇게 하면 다른 인터럽트가 진행 중인 동안 인터럽트가 트리거되어 원래 인터럽트를 지우고 새 인터럽트 대상으로 대체할 수 있습니다.
이 기능이 꼭 필요한 매우 구체적인 사례가 있지만, 아직 공개하지 않은 행성에 대한 것이므로 나중에 더 자세히 설명하겠습니다...
예약 업그레이드
모든 고급 인터럽트 스케줄 시스템은 열차 정류장 예약 제한에 크게 의존합니다. 이는 시스템의 모든 열차가 한 정거장으로 가는 것을 방지하는 기능입니다.
하지만 이 시스템에는 교통 체증이나 교착 상태를 유발할 수 있는 작은 문제가 하나 있었는데, 이 문제는 일반 스케줄에서 훨씬 더 중요해졌습니다.
문제는 열차가 역을 떠나기로 결정하면 열차 예약이 즉시 해제되면서도 물리적으로 정거장을 막는다는 점입니다. 이렇게 하면 다른 열차가 정거장을 향해 출발할 수 있지만, 본선을 막지 않고 대기할 공간이 충분하지 않을 수 있습니다.
그래서 이 문제를 수정하여 열차가 정차역이 있는 블록을 떠날 때만 예약을 포기하도록 했습니다. 다른 분들도 1.1에서 이 문제가 발생했는지 알고 싶습니다.
기차 그룹
열차 그룹이 부족하고 여러 일정을 한꺼번에 편집할 수 없다는 점이 불편했지만, 인터럽트 이전에는 기존 일정을 업데이트하거나 조정할 일이 많지 않았기 때문에 그다지 중요하지 않았습니다.
하지만 인터럽트와 더 일반적인 열차의 경우, 기존 열차의 스케줄/인터럽트를 항상 업데이트해야 하므로 당연히 이 작업을 수행해야 했습니다. 이 접근 방식은 2.0 업데이트의 다른 그룹화 변경 사항(물류 그룹 및 인터럽트)에서 수행한 작업과 유사합니다.
따라서 그룹 구성원 중 한 명의 스케줄이 변경되면 전체 그룹이 업데이트됩니다. 중요한 점은 임시 정거장은 개별 열차의 상태의 일부이므로 무시된다는 점입니다(따라서 열차를 탈취하여 어딘가로 이동해도 아무 문제가 발생하지 않습니다).
열차 개요에만 그룹을 표시하는 것이 합리적입니다.
이제 새 기차를 배치하고 원하는 그룹으로 설정하기만 하면 됩니다. 한 종류의 기차가 너무 많으면 기존 기차를 찾아서 복사하여 붙여넣을 필요 없이 기차의 그룹을 재할당하여 철제 기차에서 구리 기차로 바꿀 수 있습니다.
새 인터럽트를 추가하면(새 항목 유형을 처리하기 위해) 그룹의 모든 항목에 추가되며 불필요한 기차/일정을 수정할 필요없이 모든 것이 '그냥 작동'합니다.
목적지에 따른 자동 색상 지정
이것은 이전 FFF에서 놀림과 지적을 받았던 또 다른 문제입니다. 저희는 기차가 운반하는 물건에 따라 색을 입히는 것을 좋아하지만, 일반 시스템에서는 어떤 기차든 무엇이든 운반할 수 있기 때문에 정적인 색으로는 효과를 낼 수 없습니다.
처음에는 어떻게든 스케줄 GUI에 색상을 추가하고 싶었지만, 모든 스테이션 항목에 또 다른 UI 요소를 추가해야 하는 번거로움이 있었습니다(이미 그렇게 간단하지 않은 GUI에서). 하지만 훨씬 더 자연스러운 접근 방식이 가능하다는 것을 깨달았습니다.
그래서 기관차 색상 위젯에 간단한 확인란(기본적으로 켜짐)을 추가하여 목적지에 따라 색상을 변경할 수 있도록 했습니다.
결론
우리는 '물류 열차'와 같은 것을 만들어 달라는 요청을 여러 번 받았습니다. 스케줄 인터럽트는 보다 일반적인 시스템을 제공하며, 물류 열차는 이를 통해 구축할 수 있는 것 중 하나에 불과합니다. 예를 들어, 정류장에서 회로 조건과 인터럽트를 사용하여 열차를 어디로 보낼지 결정하도록 하는 시스템을 구축할 수 있습니다.
또한 정상적인 스케줄을 유지하면서 주유나 간단한 작업을 위해 인터럽트를 사용할 수 있기 때문에 더 쉽게 접근할 수 있습니다.
저희는 이 기능을 꽤 오랫동안 사용해 왔으며, 이제와서는 이 기능 없이는 플레이할 수 없어요.
이 기능은 2.0 기본 게임 업데이트를 통해 누구나 사용할 수 있는 핵심 엔진 기능입니다.
그리고 앞으로 더...
여기서 멈추지 않고 2.0을 위해 준비된 열차 관련 개선 사항이 더 있지만 다음 기회로 미루겠습니다...
언제나 그렇듯이 평소 자주 이용하는 장소에서 여러분의 의견을 알려주세요.
드디어 기차에 필요한 것들이 추가되었네
번역추
Ltn이제 필요없겠구나 - dc App
먼가 그냥 ltn쓰는게 훨씬 편해보인다... 이걸로 ltn이 업그레이드 되는 건 기대할만하겟지만
Ltn고장나서 우탐모 접었는데 정말 좋다..... 싸이버씬 제작자 오열 ㅜㅜ
오!!! 좋아 자동 연료 공급 기차역!!
인터럽트를 가로채기로 번역해도 좋을듯
그냥 생각해보니 우선순위는 영 아닌거같고 가로채기도 어색해서 인터럽트 그대로 수정했슴
몰?몰,,,,루,,
제네릭이 번역하기 참 어려운 단어야…
캬
열차는 로직만 잘 짜면 그냥 큰 물류로봇 된다는거네. 적당히 깔아두기만 하면 연료도 알아서 채우고 목적지도 알아서 정하고 부족한거 있으면 거기로가고
인터럽트 중에 인터럽트를 해야 하는 매우 구체적인 사례라는 게 대체 뭘까? 특정 행성과 연관이 있는 건가?
진짜 도대체 무슨 기믹을 넣으려는 건지 짐작도안됨
인터럽트 잘 쓰면 기존 ltn 사이버신을 대체하는게 불가능하진 않겟지만 너무 복잡해보임. 설정할게 상당히 많을거같음. ltn 사이버신은 알아서 해주는 ‘요청역중에 요청임계 넘어서는곳을 고르고 여러 동일품목 공급역중에 공급 임계를 넘어서고 그중에 우선순위 높은거에서 요청’ 이런거 로직 짤라면 손 엄청가게생겼음. 이거로만 봐서는 아무래도 모드는 계속 쓸듯..
근데 인터럽트 수행중에 인터럽트를 꼭 해야만 하는 행성이 있다고..? 상상도 안가고 궁금하긴 한데 약간 우려되는건 일반적인 유저들한텐 너무 어려운거 아닌가 싶은 ㅋㅋ
어우 얘네 개발하는거보면 진짜 감탄만 나오네
ltn 안쓰는데 저 기능은 화실히 편리해보임 요청임계기준으로 부족한 역에 아이템 가져오는 건 기존 시스템으로도 충분히 써왔지만 다대다 운송시스템도 한종류의 아이템만 설정가능 했고 ltn의 복잡함을 줄이고 연료 자동 채우기는 개꿀인듯
연료역 하나 땜에 모드 쓰고 그거에 맞는 설정 배우는거 킹받았는데 개꿀이네
모드 안쓰고 다중하차 할 생각하니 개꼴리네
이 시스템은 바닐라에서도 적용 되겠죠? - dc App
적혀있잖아
시발섹스으으으으으으