HitResponse
UnstableTile::collision(GameObject& other, const CollisionHit& )
{
  if(state == STATE_NORMAL) {
    Player* player = dynamic_cast<Player*> (&other);
    if(player != NULL &&
       player->get_bbox().get_bottom() < get_bbox().get_top() + SHIFT_DELTA) {
      dissolve ();
    }

    if (dynamic_cast<Explosion*> (&other)) {
      dissolve ();
    }
  }
  return FORCE_MOVE;
}
Exemple #2
0
void MonoLaser::calculate()
{
	STACKTRACE;
	angle = trajectory_angle( endpoint );
	length = distance( endpoint );
	frame -= frame_time;		 /* we do not want to dissolve */
	Laser::calculate();
	if ( state == 0 ) dissolve();
	if ( laser ) if ( !laser->exists() ) laser = NULL;
}
Exemple #3
0
void UnstableTile::shake (void)
{
  if (state != STATE_NORMAL)
    return;

  if (sprite->has_action ("shake")) {
    state = STATE_SHAKE;
    this->set_action ("shake", /* loops = */ 1);
  }
  else {
    dissolve ();
  }
}
Exemple #4
0
void
UnstableTile::update(float elapsed_time)
{
  switch (state)
  {
    case STATE_NORMAL:
      break;

    case STATE_SHAKE:
      if (sprite->animation_done())
        dissolve ();
      break;

    case STATE_DISSOLVE:
      if (sprite->animation_done()) {
        /* dissolving is done. Set to non-solid. */
        set_group (COLGROUP_DISABLED);
        fall_down ();
      }
      break;

    case STATE_SLOWFALL:
      if (slowfall_timer >= elapsed_time)
	slowfall_timer -= elapsed_time;
      else /* Switch to normal falling procedure */
	fall_down ();
      movement = physic.get_movement (elapsed_time);
      break;

    case STATE_FALL:
      if (sprite->animation_done())
        remove_me ();
      else
        movement = physic.get_movement (elapsed_time);
      break;
  }
}
Exemple #5
0
//---------- iterate!!
f64 CellModel::iterate(void) {
  Cell* cell;
  
  /////// TODO: incorporate threading engine. debugging single-threaded version first...
	
  for (u32 i=0; i<numCellsToProcess; i++) {
    cell = cells[cellsToProcess[i]];
    switch(cell->state) {
              case eStateWet:
        diffuse(cell);
        break;
      case eStateVoid:
        // void cells: dissolve (FIXME?)
        dissolve(cell);
        break;
      case eStateEx:
      case eStateDrug:
        // drug or excipient: 
        dissolve(cell);
        break;
      case eStateDissDrug:
      case eStateDissEx:
        continueDissolve(cell);
        break;
      case eStateBound:
        diffuse(cell);
        cell->concentration[0] *= boundDiff; // exponential decay
        cell->concentration[1] *= boundDiff;
        // denormal and saturate low
        if(cell->concentration[0] < 0.000000000001) cell->concentration[0] = 0.0;
        if(cell->concentration[1] < 0.000000000001) cell->concentration[1] = 0.0;
        break;
      case eStatePoly:
        // shouldn't get here!
        // polymer cells: no change
        break;        
      default:
        break;
    }
  }
  
  ///// TODO: synchronize udpate threads here
	
  // update the cell data
  // FIXME: memcpy() in this function is eating 20% of CPU time.
  // should be able to just swap pointers
  // (why doesn't this work?)
  /*
   Cell** cellsTmp = cells;
   cells = cellsUpdate;
   cellsUpdate = cellsTmp;
   */
  
  for(u32 i=0; i<numCellsToProcess; i++) {
    *(cells[cellsToProcess[i]]) = *(cellsUpdate[cellsToProcess[i]]);
  }
	
  ///// TODO: synchronize copy threads here
	
  calcDrugMass();
  
  return drugMassTotal - drugMass;
  //  return drugMass;
}
Exemple #6
0
void MonoLaser::inflict_damage( SpaceObject* other )
{
	STACKTRACE;
	Laser::inflict_damage( other );
	dissolve();
}