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; }
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; }
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; } }
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; }
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; }
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; }