Beispiel #1
0
BOOL ObjectComGrab(C4Object *cObj, C4Object *pTarget)
	{
	if (!pTarget) return FALSE;
	if (cObj->GetProcedure()!=DFA_WALK) return FALSE;
	if (!ObjectActionPush(cObj,pTarget)) return FALSE;
	cObj->Call(PSF_Grab, &C4AulParSet(C4VObj(pTarget), C4VBool(true)));
	if (pTarget->Status && cObj->Status)
	{
		pTarget->Controller = cObj->Controller;
		pTarget->Call(PSF_Grabbed, &C4AulParSet(C4VObj(cObj), C4VBool(true)));
	}
	return TRUE;
	}
Beispiel #2
0
BOOL ObjectComPut(C4Object *cObj, C4Object *pTarget, C4Object *pThing)
  {
  // No object specified, first from contents
	if (!pThing) pThing = cObj->Contents.GetObject();
	// Nothing to put
	if (!pThing) return FALSE;
	// No target
  if (!pTarget) return FALSE;
  // Grabbing: check C4D_Grab_Put
  if (pTarget!=cObj->Contained)
    if (!(pTarget->Def->GrabPutGet & C4D_Grab_Put)) 
      {
      // Was meant to be a drop anyway
      if (ValidPlr(cObj->Owner))
        if (Game.Players.Get(cObj->Owner)->LastComDownDouble)
          return ObjectComDrop(cObj, pThing);
      // No grab put: fail
      return FALSE;
      }
  // Target no fullcon
  if (!(pTarget->OCF & OCF_FullCon)) return FALSE;
	// Check target collection limit
	if (pTarget->Def->CollectionLimit && (pTarget->Contents.ObjectCount()>=pTarget->Def->CollectionLimit)) return FALSE;
  // Transfer thing
	bool fRejectCollect;
  if (!pThing->Enter(pTarget, TRUE, true, &fRejectCollect)) return FALSE;
	// Put call to object script
  cObj->Call(PSF_Put);
	// Target collection call
  pTarget->Call(PSF_Collection,&C4AulParSet(C4VObj(pThing), C4VBool(TRUE)));
	// Success
  return TRUE;
  }
Beispiel #3
0
void C4Effect::TempRemoveUpperEffects(C4Object *pObj, bool fTempRemoveThis,
                                      C4Effect **ppLastRemovedEffect) {
  if (pObj && !pObj->Status)
    return; // this will be invalid!
  // priority=1: no callbacks
  if (iPriority == 1)
    return;
  // remove from high to low priority
  // recursive implementation...
  C4Effect *pEff = pNext;
  while (pEff)
    if (pEff->IsActive())
      break;
    else
      pEff = pEff->pNext;
  // temp remove active effects with higher priority
  if (pEff)
    pEff->TempRemoveUpperEffects(pObj, true, ppLastRemovedEffect);
  // temp remove this
  if (fTempRemoveThis) {
    FlipActive();
    // temp callbacks only for higher priority effects
    if (pFnStop && iPriority != 1)
      pFnStop->Exec(pCommandTarget,
                    &C4AulParSet(C4VObj(pObj), C4VInt(iNumber),
                                 C4VInt(C4FxCall_Temp), C4VBool(true)));
    if (!*ppLastRemovedEffect)
      *ppLastRemovedEffect = this;
  }
}
Beispiel #4
0
BOOL ObjectComUnGrab(C4Object *cObj)
	{
	// Only if pushing, -> stand
	if (cObj->GetProcedure() == DFA_PUSH)
		{
		C4Object *pTarget = cObj->Action.Target;
		if (ObjectActionStand(cObj))
			{
			if (!cObj->CloseMenu(false)) return FALSE;
			cObj->Call(PSF_Grab, &C4AulParSet(C4VObj(pTarget), C4VBool(false)));
			if (pTarget && pTarget->Status && cObj->Status)
				pTarget->Call(PSF_Grabbed, &C4AulParSet(C4VObj(cObj), C4VBool(false)));
			return TRUE;
			}
		}

	return FALSE;
	}
Beispiel #5
0
static C4ValueArray *FnLayerCreateMatTexMask(C4PropList * _this, const C4Value &mask_spec)
{
	// layer script function: Generate an array 256 bools representing the given mask_spec
	C4MapScriptMatTexMask mat_mask(mask_spec);
	C4ValueArray *result = new C4ValueArray(C4M_MaxTexIndex + 1);
	for (int32_t i=0; i < C4M_MaxTexIndex + 1; ++i)
	{
		result->SetItem(i, C4VBool(mat_mask(uint8_t(i), C4M_MaxTexIndex)));
	}
	return result;
}
Beispiel #6
0
BOOL ObjectActionJump(C4Object *cObj, FIXED xdir, FIXED ydir, bool fByCom)
  {
	// scripted jump?
	assert(cObj);
	C4AulParSet pars(C4VInt(fixtoi(xdir, 100)), C4VInt(fixtoi(ydir, 100)), C4VBool(fByCom));
	if (!!cObj->Call(PSF_OnActionJump, &pars)) return TRUE;
	// hardcoded jump by action
  if (!cObj->SetActionByName("Jump")) return FALSE;
  cObj->xdir=xdir; cObj->ydir=ydir;
  cObj->Mobile=1;
	// unstick from ground, because jump command may be issued in an Action-callback,
	// where attach-values have already been determined for that frame
	cObj->Action.t_attach&=~CNAT_Bottom;
  return TRUE;
  }