BOOL ObjectComJump(C4Object *cObj) // by ObjectComUp, ExecCMDFMoveTo, FnJump { // Only if walking if (cObj->GetProcedure()!=DFA_WALK) return FALSE; // Calculate direction & forces FIXED TXDir=Fix0; C4PhysicalInfo *pPhysical=cObj->GetPhysical(); FIXED iPhysicalWalk = ValByPhysical(280, pPhysical->Walk) * itofix(cObj->GetCon(), FullCon); FIXED iPhysicalJump = ValByPhysical(1000, pPhysical->Jump) * itofix(cObj->GetCon(), FullCon); if (cObj->Action.ComDir==COMD_Left || cObj->Action.ComDir==COMD_UpLeft) TXDir=-iPhysicalWalk; else if (cObj->Action.ComDir==COMD_Right || cObj->Action.ComDir==COMD_UpRight) TXDir=+iPhysicalWalk; else { if (cObj->Action.Dir==DIR_Left) TXDir=-iPhysicalWalk; if (cObj->Action.Dir==DIR_Right) TXDir=+iPhysicalWalk; } FIXED x = cObj->fix_x, y = cObj->fix_y; // find bottom-most vertex, correct starting position for simulation int32_t iBtmVtx = cObj->Shape.GetBottomVertex(); if(iBtmVtx != -1) { x += cObj->Shape.GetVertexX(iBtmVtx); y += cObj->Shape.GetVertexY(iBtmVtx); } // Try dive if(cObj->Shape.ContactDensity > C4M_Liquid) if (SimFlightHitsLiquid(x,y,TXDir,-iPhysicalJump)) if (ObjectActionDive(cObj,TXDir,-iPhysicalJump)) return TRUE; // Regular jump return ObjectActionJump(cObj,TXDir,-iPhysicalJump,true); }
bool ObjectComJump(C4Object *cObj) // by ObjectComUp, ExecCMDFMoveTo, FnJump { // Only if walking if (cObj->GetProcedure()!=DFA_WALK) return false; // Calculate direction & forces C4Real TXDir=Fix0; C4PropList *pActionWalk = cObj->GetAction(); C4Real iPhysicalWalk = C4REAL100(pActionWalk->GetPropertyInt(P_Speed)) * itofix(cObj->GetCon(), FullCon); C4Real iPhysicalJump = C4REAL100(cObj->GetPropertyInt(P_JumpSpeed)) * itofix(cObj->GetCon(), FullCon); if (cObj->Action.ComDir==COMD_Left || cObj->Action.ComDir==COMD_UpLeft) TXDir=-iPhysicalWalk; else if (cObj->Action.ComDir==COMD_Right || cObj->Action.ComDir==COMD_UpRight) TXDir=+iPhysicalWalk; C4Real x = cObj->fix_x, y = cObj->fix_y; // find bottom-most vertex, correct starting position for simulation int32_t iBtmVtx = cObj->Shape.GetBottomVertex(); if (iBtmVtx != -1) { x += cObj->Shape.GetVertexX(iBtmVtx); y += cObj->Shape.GetVertexY(iBtmVtx); } // Try dive if (cObj->Shape.ContactDensity > C4M_Liquid) if (SimFlightHitsLiquid(x,y,TXDir,-iPhysicalJump)) if (ObjectActionDive(cObj,TXDir,-iPhysicalJump)) return true; // Regular jump return ObjectActionJump(cObj,TXDir,-iPhysicalJump,true); }