/** * Enemies that drop loot raise a "loot_drop" flag to notify this loot * manager to create loot based on that creature's level and position. */ void LootManager::checkEnemiesForLoot() { for (unsigned i=0; i < enemiesDroppingLoot.size(); ++i) { Enemy *e = enemiesDroppingLoot[i]; if (e->stats.quest_loot_id != 0) { // quest loot std::vector<EventComponent> quest_loot_table; EventComponent ec; ec.type = EventComponent::LOOT; ec.c = e->stats.quest_loot_id; ec.a = ec.b = 1; ec.z = 0; quest_loot_table.push_back(ec); checkLoot(quest_loot_table, &e->stats.pos, NULL); } if (!e->stats.loot_table.empty()) { unsigned drops; if (e->stats.loot_count.y != 0) { drops = Math::randBetween(e->stats.loot_count.x, e->stats.loot_count.y); } else { drops = Math::randBetween(1, eset->loot.drop_max); } for (unsigned j=0; j<drops; ++j) { checkLoot(e->stats.loot_table, &e->stats.pos, NULL); } e->stats.loot_table.clear(); } } enemiesDroppingLoot.clear(); }
/** * Enemies that drop loot raise a "loot_drop" flag to notify this loot * manager to create loot based on that creature's level and position. */ void LootManager::checkEnemiesForLoot() { for (unsigned i=0; i < enemiesDroppingLoot.size(); ++i) { Enemy *e = enemiesDroppingLoot[i]; if (e->stats.quest_loot_id != 0) { // quest loot Event_Component ec; ec.type = "loot"; ec.c = e->stats.quest_loot_id; ec.a = ec.b = 1; ec.z = 0; e->stats.loot_table.push_back(ec); } if (!e->stats.loot_table.empty()) { unsigned drops; if (e->stats.loot_count.y != 0) { drops = (rand() % e->stats.loot_count.y) + e->stats.loot_count.x; } else { drops = (rand() % drop_max) + 1; } for (unsigned j=0; j<drops; ++j) { checkLoot(e->stats.loot_table, &e->stats.pos); } e->stats.loot_table.clear(); } } enemiesDroppingLoot.clear(); }
/** * As map events occur, some might have a component named "loot" */ void LootManager::checkMapForLoot() { if (!mapr->loot.empty()) { unsigned drops; if (mapr->loot_count.y != 0) { drops = Math::randBetween(mapr->loot_count.x, mapr->loot_count.y); } else { drops = Math::randBetween(1, eset->loot.drop_max); } for (unsigned i=0; i<drops; ++i) { checkLoot(mapr->loot, NULL, NULL); } mapr->loot.clear(); mapr->loot_count.x = 0; mapr->loot_count.y = 0; } }
/** * As map events occur, some might have a component named "loot" */ void LootManager::checkMapForLoot() { if (!mapr->loot.empty()) { unsigned drops; if (mapr->loot_count.y != 0) { drops = (rand() % mapr->loot_count.y) + mapr->loot_count.x; } else { drops = (rand() % drop_max) + 1; } for (unsigned i=0; i<drops; ++i) { checkLoot(mapr->loot); } mapr->loot.clear(); mapr->loot_count.x = 0; mapr->loot_count.y = 0; } }
/** * Process all actions for a single frame * This includes some message passing between child object */ void GameStatePlay::logic() { if (inpt->window_resized) refreshWidgets(); checkCutscene(); // check menus first (top layer gets mouse click priority) menu->logic(); if (!isPaused()) { // these actions only occur when the game isn't paused if (pc->stats.alive) checkLoot(); checkEnemyFocus(); if (pc->stats.alive) { mapr->checkHotspots(); mapr->checkNearestEvent(); checkNPCInteraction(); } checkTitle(); menu->act->checkAction(action_queue); pc->logic(action_queue, restrictPowerUse(), npc_id != -1); // Transform powers change the actionbar layout, // so we need to prevent accidental clicks if a new power is placed under the slot we clicked on. // It's a bit hacky, but it works if (pc->isTransforming()) { menu->act->resetSlots(); } // transfer hero data to enemies, for AI use if (pc->stats.get(STAT_STEALTH) > 100) enemies->hero_stealth = 100; else enemies->hero_stealth = pc->stats.get(STAT_STEALTH); enemies->logic(); hazards->logic(); loot->logic(); enemies->checkEnemiesforXP(); npcs->logic(); snd->logic(pc->stats.pos); comb->logic(mapr->cam); } // close menus when the player dies, but still allow them to be reopened if (pc->close_menus) { pc->close_menus = false; menu->closeAll(); } // these actions occur whether the game is paused or not. checkTeleport(); checkLootDrop(); checkLog(); checkBook(); checkEquipmentChange(); checkUsedItems(); checkStash(); checkSaveEvent(); checkNotifications(); checkCancel(); mapr->logic(); mapr->enemies_cleared = enemies->isCleared(); quests->logic(); pc->checkTransform(); // change hero powers on transformation if (pc->setPowers) { pc->setPowers = false; if (!pc->stats.humanoid && menu->pow->visible) menu->closeRight(); // save ActionBar state and lock slots from removing/replacing power for (int i=0; i<ACTIONBAR_MAX ; i++) { menu->act->hotkeys_temp[i] = menu->act->hotkeys[i]; menu->act->hotkeys[i] = 0; } int count = ACTIONBAR_MAIN; // put creature powers on action bar // TODO What if creature has more powers than the size of the action bar? for (size_t i=0; i<pc->charmed_stats->powers_ai.size(); i++) { if (pc->charmed_stats->powers_ai[i].id != 0 && powers->powers[pc->charmed_stats->powers_ai[i].id].beacon != true) { menu->act->hotkeys[count] = pc->charmed_stats->powers_ai[i].id; menu->act->locked[count] = true; count++; } if (count == ACTIONBAR_MAX) count = 0; } if (pc->stats.manual_untransform && pc->untransform_power > 0) { menu->act->hotkeys[count] = pc->untransform_power; menu->act->locked[count] = true; } else if (pc->stats.manual_untransform && pc->untransform_power == 0) logError("GameStatePlay: Untransform power not found, you can't untransform manually"); menu->act->updated = true; // reapply equipment if the transformation allows it if (pc->stats.transform_with_equipment) menu->inv->applyEquipment(menu->inv->inventory[EQUIPMENT].storage); } // revert hero powers if (pc->revertPowers) { pc->revertPowers = false; // restore ActionBar state for (int i=0; i<ACTIONBAR_MAX; i++) { menu->act->hotkeys[i] = menu->act->hotkeys_temp[i]; menu->act->locked[i] = false; } menu->act->updated = true; // also reapply equipment here, to account items that give bonuses to base stats menu->inv->applyEquipment(menu->inv->inventory[EQUIPMENT].storage); } // when the hero (re)spawns, reapply equipment & passive effects if (pc->respawn) { pc->stats.alive = true; pc->stats.corpse = false; pc->stats.cur_state = AVATAR_STANCE; menu->inv->applyEquipment(menu->inv->inventory[EQUIPMENT].storage); menu->inv->changed_equipment = true; checkEquipmentChange(); powers->activatePassives(&pc->stats); pc->stats.logic(); pc->stats.recalc(); pc->respawn = false; } // use a normal mouse cursor is menus are open if (menu->menus_open) { curs->setCursor(CURSOR_NORMAL); } // update the action bar as it may have been changed by items if (menu->act->updated) { menu->act->updated = false; // set all hotkeys to their base powers for (unsigned i = 0; i < menu->act->slots_count; i++) { menu->act->hotkeys_mod[i] = menu->act->hotkeys[i]; } updateActionBar(); } // reload music if changed in the pause menu if (menu->exit->reload_music) { mapr->loadMusic(); menu->exit->reload_music = false; } }
void Player::update(float dt) { if(mStunnedCounter > 0.0f) mStunnedCounter -= dt; else mStunned = false; // Update the animation mAnimation->animate(dt); // Update the head rotation updateHead(); // Update the weapon if(mWeapon != NULL) { mWeapon->updatePosition(getPosition()); mWeapon->incrementCooldownCounter(dt); } /* Update the velocity */ // Strafing sideways if(gDInput->keyDown(DIK_A) && !mStunned && getVelocity().x > -mMaxVelocity) { // Left getBody()->ApplyForce(Vector(-mAcceleration, 0), getPosition()); setFacingDirection(LEFT); if(mWeapon != NULL) mWeapon->setFlipped(true); // If the player is on the ground, continue the animation if(!mInAir) mAnimation->resume(); } else if(gDInput->keyDown(DIK_D) && !mStunned && getVelocity().x < mMaxVelocity) { // Right getBody()->ApplyForce(Vector(mAcceleration, 0), getPosition()); setFacingDirection(RIGHT); if(mWeapon != NULL) mWeapon->setFlipped(false); // If the player is on the ground, continue the animation if(!mInAir) mAnimation->resume(); } // If A or D is released set the frame to 0 if the player not is in the air if(gDInput->keyReleased(DIK_A) || gDInput->keyReleased(DIK_D)) { mAnimation->pause(); if(!mInAir) mAnimation->setFrame(0); } // Jump if the player is on the ground if(gDInput->keyDown(DIK_SPACE) && !mInAir) { setVelocity(getVelocity() + Vector(0, -500)); getBody()->Move(0, -1); // Move it out of collision (:HACK:) mAnimation->setFrame(7); // Set the jumping frame mAnimation->pause(); // Pause the animation mInAir = true; // The player is now in the air } // Shooting with the left mouse button if(gDInput->mouseButtonDown(0)) { if(mWeapon != NULL) { if(mWeapon->isReady()) { mWeapon->attack(); mWeapon->setCooldownCounter(0.0f); mWeapon->setAttacking(true); } } } // Drop the equipped weapon if the drop button was pressed if(gDInput->keyPressed(DIK_G)) dropWeapon(); // Loot if(gDInput->keyPressed(DIK_E)) checkLoot(); }