SpecialMove

GoW2 에서 SpecialMove 방식에 대해 설명한다.

함수

Pawn (GearPawn)

  • DoSpecialMove( … )
    • SpecialMove 를 수행한다.
    • caller 가 Client 인 경우 복제되지 않고 local 에서 SM 을 수행한다.
    • caller 가 Server 인 경우 복제가 된다. 이때 주체가 아닌 (bNetOwner==FALSE) 대상에게만 복제된다는 사실에 주의하자.
  • EndSpecialMove( … )
    • SpecialMove 를 종료한다.
    • 내부적으로 DoSpecialMove 를 이용하기 때문에 복제규칙은 DoSpecialMove 와 같다.
  • LocalEndSpecialMove( … )
    • (반드시) LocallyControlled 한 녀석의 SM 을 종료하기 위한 함수
    • caller 가 LocallyControlled 한 녀석에 대해서 복제가 고려되어 있는 함수
    • caller 가 Client 인 경우 local 에서 SM 을 수행하고 Server 로 함수복제를 통해 다른 Client 들에게 알린다.
    • caller 가 Server 인 경우 local 에서 SM 을 수행하고 그로인해 자동으로 다른 Client 들에게 복제된다.
  • ServerEndSpecialMove( … )
    • (반드시) Server 에서 SM 을 종료하기 위한 함수
    • caller 가 Server 인 녀석에 대해서 복제가 고려되어 있는 함수
    • caller 가 Client 일 수는 없다!!
    • caller 가 Server 인 경우 local 에서 SM 을 수행하고 그로인해 자동으로 다른 Client 들에게 복제된다.

PlayerController (GearPC)

  • DoSpecialMove( … )
    • SpecialMove 를 수행한다.
    • 모든 상황에 대한 복제가 고려되어 있는 함수
    • 이것을 엔트리 함수로 호출하면 보통 문제없이 복제된다.
  • EndSpecialMove()
    • SpecialMove 를 종료한다.
    • 모든 상황에 대한 복제가 고려되어 있는 함수
    • 이것을 엔트리 함수로 호출하면 보통 문제없이 복제된다.
  • ClientToServerDoSpecialMove( … )
    • Server 함수
    • Server 에 있는 자신의 Pawn 에게 SpecialMove 를 수행하도록 한다. (이 과정에서 자신이 아닌 다른 Client 들에게 복제하라는 의도도 포함되어 있다.)
    • caller 가 Client 인 경우 그 Client 는 local 에서 SM 을 별도로 수행해야 한다.
    • caller 가 Server 인 경우는 없어야 한다. 한가지 예외가 있는데 caller 가 Server 함수이고 그 함수의 caller 가 Client 인 경우이다. 이 때에는 주인인 Client 를 제외하고 나머지에게 복제하려는 의도로 사용된다. (무언가 오류를 바로잡기 위해.. GearPlayerController:RoadieServerMove 를 참조. 여기에서만 사용된다.)
  • ServerToClientDoSpecialMove( … )
    • Client 함수
    • Client 에 있는 Pawn 에게 SpecialMove 를 수행하도록 한다.
    • 어떠한 복제도 고려되어 있지 않고 오로지 Client 에게 시뮬레이션하기 위한 함수이다.
  • ServerDicateSpecialMove( … )
    • (반드시) Server 에서 SM 을 시작하기 위한 함수
    • caller 가 Server 인 녀석에 대해서 복제가 고려되어 있는 함수
    • caller 가 Client 일 수는 없다!!
    • caller 가 Server 인 경우 local 에서 SM 을 수행하고 그로인해 자동으로 다른 Client 들에게 복제된다.
    • Pawn.ServerEndSpecialMove 와 시나리오가 비슷하다.

정책

SpecialMove 사이의 연결

SM 에서 다른 SM 으로 연결하는 방식은 크게 두가지가 있다. 편의상 기존 SM 을 OldSM, 새로운 SM 을 NewSM 이라 칭하겠다.

  • 첫째는 OldSM 의 진행도중 NewSM 으로 Override 하는 방식 (override)
  • 둘째는 OldSM 을 모두 끝마친 후 바로 NewSM 을 수행하는 방식 (pending)

이 두가지 방식을 정의하는 것은 GearSpecialMove 클래스의 CanOverrideMoveWith, CanOverrideSpecialMove, CanChainMove 함수를 구현함으로써 가능하다.

  • CanOverrideMoveWith 는 OldSM 에서 정의하며, 파라메터로 들어오는 NewSM 로 대체 (override) 해도 괜찮은지를 정의한다.
  • CanOverrideSpecialMove 는 NewSM 에서 정의하며, 파라메터로 들어오는 OldSM 을 이것으로 대체 (override) 해도 괜찮은지를 정의한다.
  • CanChainMove 는 OldSM 에서 정의하며, 파라메터로 들어오는 NewSM 을 이어서 수행 (pending) 할지를 정의한다.

:!: 그리고 override 를 우선적으로 검사하고 만족하지 못할 경우에 pending 을 검사한다.

이에 관한 로직은 GearPawn::DoSpecialMove 에서 참조할 수 있다.