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; }
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; }
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 (); } }
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; } }
//---------- 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; }
void MonoLaser::inflict_damage( SpaceObject* other ) { STACKTRACE; Laser::inflict_damage( other ); dissolve(); }