daily pastebin goal
76%
SHARE
TWEET

CMPartEgg.cpp

kevryan May 16th, 2016 22 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "CMPartEgg.h"
  2. #include "contraptions/managers/CMLevelManager.h"
  3. #include "cmcocos/util/CCOldTypes.h"
  4.  
  5. NS_CC_BEGIN
  6.  
  7. static CMPartAttractsInfo sDogAttractsInfo(
  8.    FLOAT_TO_INT32(0),FLOAT_TO_INT32(230), 0,0,
  9.    0,0, 0,0,
  10.    ATTRACTS_PRIORITY_ONE,ATTRACTS_PRIORITY_ONE,
  11.    ATTRACTS_CANT_LOOK_BEHIND,ATTRACTS_SHOULDNT_RUN,ATTRACTS_EDIBLE);
  12.  
  13. CMPartEgg::CMPartEgg(int id, CMLevel *level, int type, TmPointInt32 pos, int partProcessFlags, int partActionFlags, int state, int rot)
  14.  : CMPart(id,level,type,pos,partProcessFlags,partActionFlags,state,rot),
  15.    mCpEggBody(NULL),
  16.    mShouldCrack(false),
  17.    mCracked(false)
  18. {
  19.     for (int i = 0; i < MAX_EGG_SPRITES;i++)
  20.         mEggSprites[i] = NULL;
  21. }
  22.  
  23. void CMPartEgg::onCreation(bool fromLoad)
  24. {
  25.     // Hide broken egg art
  26.     static_cast<CMPartArtSpriteRect*>(getArtById(11))->setVisible(false);
  27.  
  28.     mCpEggBody = getBodyById(0)->mCpBody;
  29.  
  30.     CMPartArtSpriteRect *partArt;
  31.     for (int i=0;i<11;i++)
  32.     {
  33.         partArt = static_cast<CMPartArtSpriteRect*>(getArtById(i));
  34.         mEggSprites[i] = partArt->mSprite;
  35.         mEggSprites[i]->setVisible(false);
  36.     }
  37.  
  38.     mEggSprites[mState]->setVisible(true);
  39.     mLevel->addArtToList(getArtById(mState));
  40.  
  41.     CMPart::onCreation(fromLoad);
  42.    
  43.     mSoundResource = getSoundResource("EggBreak");
  44. }
  45.  
  46. void CMPartEgg::setVisible(bool visible)
  47. {
  48.     if (mCracked)
  49.         return;
  50.  
  51.     for (int i=0;i<MAX_EGG_SPRITES;i++)
  52.     {
  53.         if (mEggSprites[i])
  54.             mEggSprites[i]->setVisible(false);
  55.     }
  56.  
  57.     if (mState >= 0 && mState < MAX_EGG_SPRITES && mEggSprites[mState])
  58.         mEggSprites[mState]->setVisible(visible);
  59. }
  60.  
  61.  
  62. void CMPartEgg::setInitialState(int state, bool alwaysUpdate)
  63. {
  64.     if (state != mState)
  65.     {
  66.         mEggSprites[mState]->setVisible(false);
  67.         mLevel->removeArtFromList(getArtById(mState));
  68.  
  69.         mState = state;
  70.         mEggSprites[mState]->setVisible(true);
  71.         mLevel->addArtToList(getArtById(mState));
  72.  
  73.         CMPart::setInitialState(state,true);
  74.     }
  75. }
  76.  
  77. void CMPartEgg::postPhysicsUpdate(int time, int levelFrame)
  78. {
  79.     // Do nothing if egg is cracked or destroyed
  80.     if (mCracked || mInactivated || mMakeInactive)
  81.         return;
  82.  
  83.     if (mShouldCrack)
  84.         crackEgg();
  85.  
  86.     CMPart::postPhysicsUpdate(time,levelFrame);
  87. }
  88.  
  89. void CMPartEgg::crackEgg()
  90. {
  91.     mGoalState = 1;
  92.     mCracked = true;
  93.  
  94.     // Hide intact egg and show broken egg
  95.     mEggSprites[mState]->setVisible(false);
  96.     mLevel->removeArtFromList(getArtById(mState));
  97.     static_cast<CMPartArtSpriteRect*>(getArtById(11))->setVisible(true);
  98.     mLevel->addArtToList(getArtById(11));
  99.  
  100.     // Delete the intact egg shapes
  101.     CMPartShape *handleShape = getShapeById(0);
  102.     deleteShape(handleShape);
  103.     handleShape = getShapeById(1);
  104.     deleteShape(handleShape);
  105.  
  106.     // Infinity moment of interia so Egg can't rotate
  107.     mCpEggBody->a = 0;
  108.     mCpEggBody->w = 0;
  109.     cpBodySetMoment(mCpEggBody, INT32_INFINITY);
  110.  
  111.     // Shape for egg to be detected to be eaten
  112.     new CMPartShapeCircle(3,this,CC_TO_TMPOINTINT32(0,2.5f),getBodyById(0), SP_SENSOR,SP_SFX_SILENT, FLOAT_TO_INT32(11.0f), COL_GROUP_DEFAULT,COL_TYPE_SENSOR_BEGIN_SEPARATE,COL_LAYER_DOG);
  113.  
  114.     playSound(INT32_TO_FLOAT(mPos.x), INT32_TO_FLOAT(mPos.y), mSoundResource, 0, 0);
  115. }
  116.  
  117. void CMPartEgg::message(int messageType, CMPart *otherPart)
  118. {
  119.     // Energy bursts will crack the egg
  120.     if (messageType == PART_MSG_HIT_ENERGY_BURST)
  121.         mShouldCrack = true;
  122.     else
  123.         CMPart::message(messageType,otherPart);
  124. }
  125.  
  126. void CMPartEgg::postHandleCollision(CMPart *otherPart, cpArbiter *arb, bool isB)
  127. {
  128.     // Only process on first contact
  129.     if (mCracked || mShouldCrack || otherPart->mNitroSafe || !cpArbiterIsFirstContact(arb))
  130.         return;
  131.  
  132.     // Get a couple of collision shapes that we will be using
  133.     cpShape *otherShape;
  134.     cpShape *myShape;
  135.     if (isB)
  136.         cpArbiterGetShapes(arb, &otherShape, &myShape);
  137.     else
  138.         cpArbiterGetShapes(arb, &myShape, &otherShape);
  139.  
  140.     // Egg won't break if bouncing off trampoline bouncy material
  141.     if (otherShape->shapeProperty == SP_NORMAL_TRAMPOLINE || otherShape->shapeProperty == SP_MECHANICAL_TRAMPOLINE)
  142.         return;
  143.  
  144.     // Also want to get egg body and other part's body
  145.     cpBody *otherCpBody;
  146.     cpBody *myCpBody;
  147.     if (isB)
  148.         cpArbiterGetBodies(arb,&otherCpBody,&myCpBody);
  149.     else
  150.         cpArbiterGetBodies(arb,&myCpBody,&otherCpBody);
  151.  
  152.     // Mass of the other body
  153.     int oMass = otherCpBody->m;
  154.  
  155.     // Protecting from overflow by shifting down by 4
  156.     //  -- to keep everything running the same, adjusting the checks below to ((val * val) / 256 ) * 65536 which is (val * val) << 8
  157.     cpVect64 tiVect = cpArbiterTotalImpulse(arb);
  158.     tiVect.x = INT64_SHIFT_DOWN_BY(tiVect.x,4);
  159.     tiVect.y = INT64_SHIFT_DOWN_BY(tiVect.y,4);
  160.     tmInt64 totImp = INT64_SHIFT_DOWN(tiVect.x * (tmInt64)tiVect.x + tiVect.y * (tmInt64)tiVect.y);
  161.  
  162.     // Mass inverse value of zero mean infinite mass
  163.     if (otherCpBody->m_inv == 0)
  164.     {
  165.         // Hit a static object so only Egg velocity/impulse into shape matters
  166.         if (totImp > ((500LL*500LL)<<8))
  167.             mShouldCrack = true;
  168.     }
  169.     else if (oMass > FLOAT_TO_INT32(1.5f))
  170.     {
  171.         // Different masses require different impulses to crack egg
  172.         if (oMass > FLOAT_TO_INT32(80.0f))
  173.             mShouldCrack = (totImp > ((1400LL*1400LL)<<8));
  174.         else if (oMass > FLOAT_TO_INT32(40.0f))
  175.             mShouldCrack = (totImp > ((2800LL*2800LL)<<8));
  176.         else if (oMass > FLOAT_TO_INT32(20.0f))
  177.             mShouldCrack = (totImp > ((2200LL*2200LL)<<8));
  178.         else if (oMass > FLOAT_TO_INT32(6.0f))
  179.             mShouldCrack = (totImp > ((1800LL*1800LL)<<8));
  180.         else if (oMass > FLOAT_TO_INT32(4.0f))
  181.             mShouldCrack = (totImp > ((1400LL*1400LL)<<8));
  182.         else
  183.             mShouldCrack = (totImp > ((740LL*740LL)<<8));
  184.     }
  185. }
  186.  
  187. int CMPartEgg::sensorBeginHandleCollision(CMPart *otherPart, cpArbiter *arb)
  188. {
  189.    // Dog wants to eat egg
  190.    if (otherPart->mType == PART_DOG)
  191.       otherPart->tryToEat(this);
  192.  
  193.    return 0;
  194. }
  195.  
  196. void CMPartEgg::processExplosion(TmPointInt32 explosionSource, int maxDistSquared, int impulseAtSource, int impulseAtEdge)
  197. {
  198.     if (!mShouldCrack)
  199.     {
  200.         // See if explosion is close enough to crack egg
  201.         int deltaX = mBodies->mCpBody->p.x - explosionSource.x;
  202.         int deltaY = mBodies->mCpBody->p.y - explosionSource.y;
  203.         tmInt64 distSquared = INT64_SHIFT_DOWN(deltaX * (tmInt64)deltaX + deltaY * (tmInt64)deltaY);
  204.         mShouldCrack = (distSquared < maxDistSquared/2);
  205.     }
  206. }
  207.  
  208. void CMPartEgg::flipGroup(int flags, TmPointInt32 centerPos)
  209. {
  210.     mRot = 0 - mRot;
  211.  
  212.     CMPart::flipGroup(flags,centerPos);
  213. }
  214.  
  215. int CMPartEgg::eaten()
  216. {
  217.     if (mCracked && !mInactivated && !mMakeInactive)
  218.     {
  219.         mMakeInactive = true;
  220.  
  221.         // Return how long it takes to eat
  222.         return FLOAT_TO_INT32(1.4f);
  223.     }
  224.  
  225.     return 0;
  226. }
  227.  
  228. CMPartAttractsInfo *CMPartEgg::getAttractsInfo(CMPart *part)
  229. {
  230.     // Only dogs are attracted to broken eggs right now
  231.     if (mCracked && (part->mType == PART_DOG || part->mType == PART_SCAREDY_DOG))
  232.         return &sDogAttractsInfo;
  233.  
  234.     return NULL;
  235. }
  236.  
  237. NS_CC_END
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top