/** * Recalc derived stats from base stats + effect bonuses */ void StatBlock::applyEffects() { // preserve hp/mp states prev_maxhp = get(STAT_HP_MAX); prev_maxmp = get(STAT_MP_MAX); pres_hp = hp; pres_mp = mp; // calculate primary stats // refresh the character menu if there has been a change for (size_t i = 0; i < primary.size(); ++i) { if (get_primary(i) != primary[i] + effects.bonus_primary[i]) refresh_stats = true; primary_additional[i] = effects.bonus_primary[i]; } calcBase(); for (size_t i=0; i<STAT_COUNT + DAMAGE_TYPES_COUNT; i++) { current[i] = base[i] + effects.bonus[i]; } for (unsigned i=0; i<effects.bonus_resist.size(); i++) { vulnerable[i] = vulnerable_base[i] - effects.bonus_resist[i]; } current[STAT_HP_MAX] += (current[STAT_HP_MAX] * current[STAT_HP_PERCENT]) / 100; current[STAT_MP_MAX] += (current[STAT_MP_MAX] * current[STAT_MP_PERCENT]) / 100; if (hp > get(STAT_HP_MAX)) hp = get(STAT_HP_MAX); if (mp > get(STAT_MP_MAX)) mp = get(STAT_MP_MAX); speed = speed_default; }
void Ship::build() { Collider* c = m_body->getCollider(); while (c) { Brick* brick = (Brick*)c->getUserData(); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0], brick->pos[1] + 0.1, brick->pos[2]), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), studCallback, brick); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0], brick->pos[1] - 0.1, brick->pos[2]), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), studCallback, brick); c = c->getNext(); } c = m_body->getCollider(); while (c) { Brick* brick = (Brick*)c->getUserData(); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0] - 0.1, brick->pos[1], brick->pos[2]), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), blockCallback, brick); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0] + 0.1, brick->pos[1], brick->pos[2]), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), blockCallback, brick); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0], brick->pos[1], brick->pos[2] + 0.1), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), blockCallback, brick); m_body->queryShape(g_brickShape, transformTransform(Transform(vec3(brick->pos[0], brick->pos[1], brick->pos[2] - 0.1), Quaternion(vec3(0, 0, 0), 1)), m_body->getTransform()), blockCallback, brick); c = c->getNext(); } calcBase(); }
void Ship::update(float dt) { for (int i = 0; i < m_impulses.size(); ++i) { BodyDescription descr; descr.transform = m_body->getTransform(); descr.type = BodyType::Dynamic; descr.linearMomentum = m_body->getLinearMomentum(); descr.angularMomentum = m_body->getAngularMomentum(); ////// //descr.linearMomentum = vec3(0, 0, 0); //descr.angularMomentum = vec3(0, 0, 0); Ship* newShip = createShip(m_world, m_entities, descr, vec3(0,0,1)); setShip(m_impulses[i].brick, newShip, g_tick++); newShip->getBody()->applyImpulse(m_impulses[i].impulse); newShip->getBody()->applyAngularImpulse(m_impulses[i].angular); newShip->calcBase(); } calcBase(); m_impulses.clear(); }
void BlockSet::calc( float dt ) { //1こで落ちることはなくなったの2個ある場合のみ if( baseBlock_ && !baseBlock_->isLocked() && subBlock_ && !subBlock_->isLocked() ){ canControl_ = true; } if( baseBlock_ && !baseBlock_->isLocked() && subBlock_ && !subBlock_->isLocked() ){ //下のものを先に更新 if( baseBlock_->getPosition().y > subBlock_->getPosition().y ){ calcBase( dt ); calcSub( dt ); } else { calcSub( dt ); calcBase( dt ); } } else { calcBase( dt ); calcSub( dt ); } }
/** * Recalc derived stats from base stats + effect bonuses */ void StatBlock::applyEffects() { // preserve hp/mp states // max HP and MP can't drop below 1 prev_maxhp = std::max(get(Stats::HP_MAX), 1); prev_maxmp = std::max(get(Stats::MP_MAX), 1); prev_hp = hp; prev_mp = mp; // calculate primary stats // refresh the character menu if there has been a change for (size_t i = 0; i < primary.size(); ++i) { if (get_primary(i) != primary[i] + effects.bonus_primary[i]) refresh_stats = true; primary_additional[i] = effects.bonus_primary[i]; } calcBase(); for (size_t i=0; i<Stats::COUNT + eset->damage_types.count; i++) { current[i] = base[i] + effects.bonus[i]; } for (unsigned i=0; i<effects.bonus_resist.size(); i++) { vulnerable[i] = vulnerable_base[i] - effects.bonus_resist[i]; } current[Stats::HP_MAX] += (current[Stats::HP_MAX] * current[Stats::HP_PERCENT]) / 100; current[Stats::MP_MAX] += (current[Stats::MP_MAX] * current[Stats::MP_PERCENT]) / 100; // max HP and MP can't drop below 1 current[Stats::HP_MAX] = std::max(get(Stats::HP_MAX), 1); current[Stats::MP_MAX] = std::max(get(Stats::MP_MAX), 1); if (hp > get(Stats::HP_MAX)) hp = get(Stats::HP_MAX); if (mp > get(Stats::MP_MAX)) mp = get(Stats::MP_MAX); speed = speed_default; }
/** * Recalc derived stats from base stats + effect bonuses */ void StatBlock::applyEffects() { // preserve hp/mp states prev_maxhp = get(STAT_HP_MAX); prev_maxmp = get(STAT_MP_MAX); pres_hp = hp; pres_mp = mp; // calculate primary stats // refresh the character menu if there has been a change if (get_physical() != physical_character + effects.bonus_physical || get_mental() != mental_character + effects.bonus_mental || get_offense() != offense_character + effects.bonus_offense || get_defense() != defense_character + effects.bonus_defense) refresh_stats = true; offense_additional = effects.bonus_offense; defense_additional = effects.bonus_defense; physical_additional = effects.bonus_physical; mental_additional = effects.bonus_mental; calcBase(); for (int i=0; i<STAT_COUNT; i++) { current[i] = base[i] + effects.bonus[i]; } for (unsigned i=0; i<effects.bonus_resist.size(); i++) { vulnerable[i] = vulnerable_base[i] - effects.bonus_resist[i]; } current[STAT_HP_MAX] += (current[STAT_HP_MAX] * current[STAT_HP_PERCENT]) / 100; current[STAT_MP_MAX] += (current[STAT_MP_MAX] * current[STAT_MP_PERCENT]) / 100; if (hp > get(STAT_HP_MAX)) hp = get(STAT_HP_MAX); if (mp > get(STAT_MP_MAX)) mp = get(STAT_MP_MAX); speed = speed_default; }