Home > notes > Flick functions

Adding flick functions

There are two parts to each function:

  • A declaration of the function in world\global\flick\flick_functions.gas
  • The code for the function in world\global\flick\commands\fc_xxx.skrit or world\global\flick\conditions\fc_xxx.skrit according to type.

There could also be a dsdll to implement the lower-level stuff, but I'll restrict this note to things that already have engine support.

In my Siegelet's story I needed a character (Grendeline) to join the party. She had to be implemented as a pet, in order to avoid a lot of work preventing her from using equippable items, and that caused conversation problems. The only way I found to resolve the problem was to add a JoinParty function that I could call from a flick.

In fubi.log I found the basic engine call I needed to make. There was a RSAddMemberNow function for the Party object, which I could locate if I passed in the party owner, which would be a flick role. This would be fairly easy.

Declaration in flick_functions.gas

// **JoinParty** [inRole]
// Adds the current role to the party of inRole.  
// Made specifically for the case of Grendeline.
[t:flick_command,n:JoinParty]
{
  server_only		= true;
  is_latent		= false;
  can_wait		= false;
  require_this	= true;
  skrit_addr		= world/global/flick/commands/fc_role;
  init_func		= RoleJoinParty$;
  [args*] { type = role; name = "inRole"; doc = "Party host"; }
}

Function code in fc_role.skrit

// ****************************************************
// *** Role Join Party
// ****************************************************
bool RoleJoinParty$( flickcontext ctx$ )
{
  goid thisGoid$ = ctx$.GetThisRoleGoid();
  Goid inTarget$	= ctx$.GetRoleGoid("inRole");
  if( !thisGoid$.IsValid() )
  {
    report.errorf("CONTENT ERROR: Role[%s] does not
      have a valid Goid!\n", ctx$.GetThisRoleName() );
    return false;
  }
  if( !inTarget$.IsValid )
  {
    report.errorf("Cannot have role[%s] join target[%s] 
	   because the target role is invalid.\n",
       ctx$.GetThisRoleName(), ctx$.GetRoleName("inRole") );
    return false; // we are done
  }
  inTarget$.Go.Parent.GetParty().RSAddMemberNow( thisGoid$.Go );
  return false; // finished
}

The function is invoked with one parameter - the role owning the party. In my case there would only be the "hero", but I believe this code will work with an existing party member as "owner".

Lara 3