Skip to content

0x30 — character_move_position

Resolves a character, decodes a position with CRadiScript::GetPosisionCode30_38, then either calls CCharacter::SetCharaPosition or CCharacterMove::MovePosition.

proven— handler traced, and exercised by at least one shipped script.

At a glance

Opcode0x30 (48)
HandlerCRadiScript::Command_30
SignatureCRadiScript::Command_30(int,SCR_DATA*,unsigned int,unsigned int)
Translation unitr_script_run2.cpp
Address— debug build; click for all 3
Handler size0x2D0 (720 bytes)
Engine namecharacter_move_position
FamilyCharacters
Command size4 + extra_words * 4 bytes

Handler behaviour

Resolves a character, decodes a position with CRadiScript::GetPosisionCode30_38, then either calls CCharacter::SetCharaPosition or CCharacterMove::MovePosition.

Encoding

The command header is one 32-bit word, as described in §3 Instruction encoding:

 31            24 23            16 15             8 7              0
+----------------+----------------+----------------+----------------+
|  flags         |  argument byte |  extra words   |  0x30          |
+----------------+----------------+----------------+----------------+

Bits 8–15 give the number of 32-bit operand words that follow. Bits 16–23 are handed to the handler as a bitfield; on character commands bit 0 normally says whether a character selector word is present. Bit 31 is the keep-going bit.

Operand fields

16 documented fields. input fields are read from the command's operand words; derived fields are computed from other fields rather than stored separately.

FieldRoleMeaning
actionderivedWhich action this command performs, read from its mode or control bits. Each name is one branch of the handler, so changing it changes what the line does.
characterinputThe packed 32-bit character selector word. Its low half is the character id and byte 2 is a secondary class/variant input; see character_number and character_variant.
coordinputCoordinate/path selector bits from the argument byte; the handler branches on them.
durationinputHuman-readable rendering of the command's duration word. Edit the underlying duration_word when it is listed as an input.
duration_as_speedderivedControl bit the decoder reads as duration-means-speed; preserved exactly.
explicit_charderived1 when the command carries its own character selector word, 0 when it acts on the script's current character. It corresponds to bit 0 of the handler argument and decides whether a character= word is present.
inline_vecinputThree-component vector (x, y, z) for inline.
modeinputHandler path selector taken from the argument byte. The meaning is specific to each command.
move_flag1derivedEnable bit 1 for move.
offset_vecinputThree-component vector (x, y, z) for offset.
sourcederivedWhere the command reads its operand from.
standinputStand-position operand, resolved through GetAbstractionStandPosNumber.
targetinputWhat the command acts on or moves towards.
target_nameinputName operand for target.
terrain_yderivedControl bit the decoder reads as snap-y-to-terrain; preserved exactly.
yieldderivedPause the script here for one game frame; the next command runs on the following update. Lines without it keep running immediately.

Engine calls

Engine functions this handler was observed calling:

  • CCharacter::SetCharaPosition(const CVector&)
  • CCharacterManager::GetCharacterClass2(int,unsigned int,const CCharacter*,unsigned int)
  • CCharacterManager::GetCharacterMoveClass(const CCharacter*)
  • CCharacterManager::InhibitionCharacter(CCharacter*)
  • CCharacterMove::MovePosition(unsigned short,const CVector*,const CVector*,float,float)
  • CRadiScript::GetCharacterID(unsigned int&,unsigned int&,unsigned int*,SCR_DATA*,unsigned int)
  • CRadiScript::GetPosisionCode30_38(int,int,int,int,CVector&,unsigned int*,SCR_DATA*)

Bit masks

Masks the handler applies to its argument byte or operand words:

0x0001 0x0003 0x0007 0xFFFF 0x0004