Skip to content

0x34 — character_expression

Resolves a character option object and calls CExpressionControl::BlinkControll and/or CExpressionControl::MouthControll.

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

At a glance

Opcode0x34 (52)
HandlerCRadiScript::Command_34
SignatureCRadiScript::Command_34(int,SCR_DATA*,unsigned int,unsigned int)
Translation unitr_script_run2.cpp
Address— debug build; click for all 3
Handler size0x1DC (476 bytes)
Engine namecharacter_expression
FamilyCharacters
Command size4 + extra_words * 4 bytes

Handler behaviour

Resolves a character option object and calls CExpressionControl::BlinkControll and/or CExpressionControl::MouthControll.

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   |  0x34          |
+----------------+----------------+----------------+----------------+

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

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

FieldRoleMeaning
argderivedRaw handler argument byte from the command header. It is printed only when it differs from the value the named fields already imply, so seeing it means the command uses an unusual argument encoding.
blinkinputBlink control byte passed to CExpressionControl::BlinkControll.
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.
expressioninputExpression selector byte passed to the expression control object.
mouthinputMouth control byte passed to CExpressionControl::MouthControll.
mouth_arg0inputArgument 0 passed to the engine call for mouth.
mouth_arg1inputArgument 1 passed to the engine call for mouth.
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:

  • CCharacterManager::GetCharacterClass2(int,unsigned int,const CCharacter*,unsigned int)
  • CCharacterManager::GetCharacterOptionClass(const CCharacter*)
  • CExpressionControl::BlinkControll(unsigned char,float)
  • CExpressionControl::MouthControll(unsigned char,unsigned char,unsigned char)
  • CRadiScript::GetCharacterID(unsigned int&,unsigned int&,unsigned int*,SCR_DATA*,unsigned int)

Bit masks

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

0x00FF 0x0001