void HelloWorld::MoveScoreAdd(float dt) { addBestScore(); //addSilver(); if (testnum>=15) { addGold(); } else if (testnum>=10) { addSilver(); } if(m_bnew) { addNew(); } if (testnum>=10) { m_emitter = CCParticleFlower::createWithTotalParticles(10); m_emitter->retain(); m_pScore->addChild(m_emitter); m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage("stars.png") ); m_emitter->setPosition(ccp(49/mfac,51/mfac)); } }
//强化按钮 void EquipUpgradeLayer::upgradeBtn_OnTouch(Ref* sender, Widget::TouchEventType type) { if (type!=Widget::TouchEventType::ENDED) return; SoundBLL::getInstance()->playEffect(kButtonSound); auto btn=(ui::Button*)sender; btn->setTouchEnabled(false); int equipId=btn->getTag(); auto equip=&(equiplocalBll->modelData[equipId]); //读取玩家金币数据 auto pbb = PlayerBLL::create(); auto gold = pbb->getPlayerGold(); if (gold<equip->UpPrice) { PopTipsLayer::addTipLayer(this, "金币不足!"); btn->setTouchEnabled(true); return; } pbb->addGold(-equip->UpPrice); //升级装备 equiplocalBll->upEquip(equipId); //本地英雄数据 HeroBase *h2 = GameObjectFactory::getHero(currSelectHeroID-1); auto mod = h2->getHeroModel(); //更新英雄属性 equiplocalBll->updateHeroAttribute(mod->HeroID-1); //重新取本地数据 h2 = GameObjectFactory::getHero(currSelectHeroID-1); mod = h2->getHeroModel(); //更新显示属性 updateInfo(mod); equip=&(equiplocalBll->modelData[equipId]); auto att = equiplocalBll->getEquipChineseName(equipId); std::string strDes=StringUtils::format("Lv.%d \n%s",equip->CurrLv,att.c_str()); std::string strName=StringUtils::format("%s",equip->WeaponName); t_backpackDes->setString(strDes); t_wearitemname->setString(strName); s_wearborder->setVisible(false); auto effect=Armature::create("anxt_ui"); effect->setPosition(btn->getPosition() - Vec2(292, 0)); auto parent=btn->getParent(); parent->addChild(effect); effect->getAnimation()->play("ui_1"); auto func=[&](){ //刷新装备物品 showWearpack(); }; effect->runAction(Sequence::create(DelayTime::create(0.5),CallFunc::create(func),RemoveSelf::create(), NULL)); if (updateCalllback) { updateCalllback(this); } }
void Money::addCoin(int amount, int coinType) { // add the appropriate type of coin switch(coinType) { case COPPER: addCopper(amount); break; case SILVER: addSilver(amount); break; case GOLD: addGold(amount); break; case PLATINUM: addPlatinum(amount); } }
/** * This function is called when there definitely is a piece of loot dropping * base_level represents the average quality of this loot * calls addLoot() */ void LootManager::determineLoot(int base_level, Point pos) { int level = lootLevel(base_level); ItemStack loot; if (level > 0 && loot_table_count[level] > 0) { // coin flip whether the treasure is cash or items if (rand() % 2 == 0) { int roll = rand() % loot_table_count[level]; loot.item = loot_table[level][roll]; loot.quantity = rand() % items->items[loot.item].rand_loot + 1; addLoot( loot, pos); } else { // gold range is level to 3x level addGold(rand() % (level * 2) + level, pos); } } }
void EquipLayer::sellCallback(Ref* sender) { auto pop=(PopConfirmLayer*)sender; pop->removeFromParentAndCleanup(true); auto eq = &equiplocalBll->modelData[currSelectBackpackID]; auto price = eq->CurrPrice; equiplocalBll->deleEquip(currSelectBackpackID); auto pb=PlayerBLL::create(); pb->addGold(price); setBackpackDataView(false); showBackpack(); currSelectBackpackID=-1; if (updateCalllback) { updateCalllback(this); } }
///////////////////////////////////////////////////////////////////////////// // add a new item to the tree ///////////////////////////////////////////////////////////////////////////// void CUndoDialog::addItem(int iAction, CUndo *pUndo) { switch(iAction) { case UNDO_SETTLE_PLACE: addPlacement(TRUE); break; case UNDO_THIRD_ROAD_PLACE: case UNDO_ROAD_PLACE: addPlacement(FALSE); break; case UNDO_SHIP_PLACE: addPlacement(FALSE, TRUE); break; case UNDO_FIRST_ROLL: addRoll(TRUE, ((CUndoOne *) pUndo)->m_iOne); break; case UNDO_ROLL: addRoll(FALSE, ((CUndoOne *) pUndo)->m_iOne); break; case UNDO_ACTION_START: addActionStart(); break; case UNDO_ACTION: addAction(); break; case UNDO_ROAD: addRoad(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_SHIP: addShip(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_CITY: addCity(); break; case UNDO_MOVE_SHIP: addMoveShip(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_SETTLEMENT: addSettle(); break; case UNDO_BUY_DEVCARD: addDevcard(); break; case UNDO_ROBBER_PLACE: addRobber(); break; case UNDO_PIRATE_PLACE: addPirate(); break; case UNDO_PLAY_VICTORY: addVictory(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_PLAY_MONOPOLY: addMonopoly((CUndoMonopoly *) pUndo); break; case UNDO_PLAY_ROAD: addRoadBuild(); break; case UNDO_PLAY_YEAR: addYearPlenty(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_PLAY_SOLDIER: addSoldier(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_TRADE: addTrade((CUndoTrade *) pUndo); break; case UNDO_STEAL: addSteal(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_LOSECARDS: addLoseCards((CUndoTrade *) pUndo); break; case UNDO_ACTION_END: endTurn(); break; case UNDO_WIN: addWin(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_WASTE: addWaste(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_GOLD: addGold((CUndoGold *) pUndo); break; case UNDO_CHITLESS: addChitless(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_VOLCANO: addVolcano(); break; case UNDO_TRADE_JUNGLE: addJungle((CUndoTrade *) pUndo); break; case UNDO_SPECIAL_BUILD: addSpecialBuild(((CUndoOne *) pUndo)->m_iOne); break; case UNDO_SPECIAL_BUILD_END: addSpecialBuildEnd(); break; default: break; } }
/** * As map events occur, some might have a component named "loot" * Loot is created at component x,y */ void LootManager::checkMapForLoot() { Point p; Event_Component *ec; ItemStack loot; while (!map->loot.empty()) { ec = &map->loot.front(); p.x = ec->x; p.y = ec->y; if (ec->s == "random") { determineLoot(ec->z, p); } else if (ec->s == "id") { loot.item = ec->z; loot.quantity = 1; addLoot(loot, p); } else if (ec->s == "currency") { addGold(ec->z, p); } map->loot.pop(); } }
void LabDialog::upCallback(Ref* sender, Widget::TouchEventType type) { if(type == Widget::TouchEventType::ENDED) { auto ui = (Widget*)this->getChildByName("UI"); auto btn = (Button*)sender; string name = btn->getName(); // 人类士兵1 if (name == "UpFighterButton") { // 检测容量 if (fighter["LabLevelRequire"].asInt() > labLevel) { auto notice = Notice::create("提升研究所等级,可继续进阶士兵"); this->getParent()->addChild(notice, 999); } // 检测金币数 else if(gold < fighter["GoldRequire"].asInt()) { auto notice = Notice::create("金币不足"); this->getParent()->addChild(notice, 999); } // 跟新数据 else { // 金币数量 gold -= fighter["GoldRequire"].asInt(); auto lbgold = (Text*)Helper::seekWidgetByName(ui, "GoldCount"); lbgold->setString(GM()->getIntToStr(gold)); // hudLayer的金币数量,更新数据库 auto homeScene = (HomeScene*)this->getParent(); auto hudLayer = homeScene->_hudLayer; hudLayer->addGold(-fighter["GoldRequire"].asInt()); // 士兵数量 DM()->updateSoilderLevel(SOILDER_TYPE_FIGHTER); auto level = (Text*)Helper::seekWidgetByName(ui, "FighterLevel"); auto goldRequire = (Text*)Helper::seekWidgetByName(ui, "FighterGoldRequire"); level->setString(fighter["Level"].asString()); goldRequire->setString(fighter["GoldRequire"].asString()); auto image = (ImageView*)Helper::seekWidgetByName(ui, "FighterLevelImage"); image->stopAllActions(); image->setScale(1.0f); auto scaleUp = ScaleTo::create(0.1f, 2.0f); auto scaleDown = ScaleTo::create(0.1f, 1.0f); image->runAction(Sequence::create(scaleUp, scaleDown, nullptr)); } } // 精灵弓箭手2 else if(name == "UpBowmanButton") { // 检测容量 if (bowman["LabLevelRequire"].asInt() > labLevel) { auto notice = Notice::create("提升研究所等级,可继续进阶士兵"); this->getParent()->addChild(notice, 999); } // 检测金币数 else if(gold < bowman["GoldRequire"].asInt()) { auto notice = Notice::create("金币不足"); this->getParent()->addChild(notice, 999); } // 跟新数据 else { // 金币数量 gold -= bowman["GoldRequire"].asInt(); auto lbgold = (Text*)Helper::seekWidgetByName(ui, "GoldCount"); lbgold->setString(GM()->getIntToStr(gold)); // hudLayer的金币数量,更新数据库 auto homeScene = (HomeScene*)this->getParent(); auto hudLayer = homeScene->_hudLayer; hudLayer->addGold(-bowman["GoldRequire"].asInt()); // 士兵数量 DM()->updateSoilderLevel(SOILDER_TYPE_BOWMAN); auto level = (Text*)Helper::seekWidgetByName(ui, "BowmanLevel"); auto goldRequire = (Text*)Helper::seekWidgetByName(ui, "BowmanGoldRequire"); level->setString(bowman["Level"].asString()); goldRequire->setString(bowman["GoldRequire"].asString()); auto image = (ImageView*)Helper::seekWidgetByName(ui, "BowmanLevelImage"); image->stopAllActions(); image->setScale(1.0f); auto scaleUp = ScaleTo::create(0.15f, 2); auto scaleDown = ScaleTo::create(0.15f, 1.0); image->runAction(Sequence::create(scaleUp, scaleDown, nullptr)); } } // 矮人炮手3 else if(name == "UpGunnerButton") { // 检测容量 if (gunner["LabLevelRequire"].asInt() > labLevel) { auto notice = Notice::create("提升研究所等级,可继续进阶士兵"); this->getParent()->addChild(notice, 999); } // 检测金币数 else if(gold < gunner["GoldRequire"].asInt()) { auto notice = Notice::create("金币不足"); this->getParent()->addChild(notice, 999); } // 跟新数据 else { // 金币数量 gold -= gunner["GoldRequire"].asInt(); auto lbgold = (Text*)Helper::seekWidgetByName(ui, "GoldCount"); lbgold->setString(GM()->getIntToStr(gold)); // hudLayer的金币数量,更新数据库 auto homeScene = (HomeScene*)this->getParent(); auto hudLayer = homeScene->_hudLayer; hudLayer->addGold(-gunner["GoldRequire"].asInt()); // 士兵数量 DM()->updateSoilderLevel(SOILDER_TYPE_GUNNER); auto level = (Text*)Helper::seekWidgetByName(ui, "GunnerLevel"); auto goldRequire = (Text*)Helper::seekWidgetByName(ui, "GunnerGoldRequire"); level->setString(gunner["Level"].asString()); goldRequire->setString(gunner["GoldRequire"].asString()); auto image = (ImageView*)Helper::seekWidgetByName(ui, "GunnerLevelImage"); image->stopAllActions(); image->setScale(1.0f); auto scaleUp = ScaleTo::create(0.25f, 1.5); auto scaleDown = ScaleTo::create(0.25f, 1.0); image->runAction(Sequence::create(scaleUp, scaleDown, nullptr)); } } // 兽人肉盾4 else if(name == "UpMeatShieldButton") { // 检测容量 if (meat["LabLevelRequire"].asInt() > labLevel) { auto notice = Notice::create("提升研究所等级,可继续进阶士兵"); this->getParent()->addChild(notice, 999); } // 检测金币数 else if(gold < meat["GoldRequire"].asInt()) { auto notice = Notice::create("金币不足"); this->getParent()->addChild(notice, 999); } // 跟新数据 else { // 金币数量 gold -= meat["GoldRequire"].asInt(); auto lbgold = (Text*)Helper::seekWidgetByName(ui, "GoldCount"); lbgold->setString(GM()->getIntToStr(gold)); // hudLayer的金币数量,更新数据库 auto homeScene = (HomeScene*)this->getParent(); auto hudLayer = homeScene->_hudLayer; hudLayer->addGold(-meat["GoldRequire"].asInt()); // 士兵数量 DM()->updateSoilderLevel(SOILDER_TYPE_MEAT); auto level = (Text*)Helper::seekWidgetByName(ui, "MeatShieldLevel"); auto goldRequire = (Text*)Helper::seekWidgetByName(ui, "MeatShieldGoldRequire"); level->setString(meat["Level"].asString()); goldRequire->setString(meat["GoldRequire"].asString()); auto image = (ImageView*)Helper::seekWidgetByName(ui, "MeatShieldLevelImage"); image->stopAllActions(); image->setScale(1.0f); auto scaleUp = ScaleTo::create(0.25f, 1.5); auto scaleDown = ScaleTo::create(0.25f, 1.0); image->runAction(Sequence::create(scaleUp, scaleDown, nullptr)); } } } }
//打开物品 int CharData::openSlotItm(int slot, int nums, json_spirit::Object& robj) { boost::shared_ptr<iItem> itm = m_bag.getItem(slot); if (!itm.get()) { return HC_ERROR; } if (itm->getType() != iItem_type_gem) { return HC_ERROR; } int use_num = itm->getCount(); if (nums > 0 && itm->getCount() > nums) { use_num = nums; } Gem* pg = dynamic_cast<Gem*>(itm.get()); robj.push_back( Pair("use", pg->getUsage()) ); switch (pg->getUsage()) { //变身卡 case ITEM_USAGE_CHANGE_CARD: { m_change_spic = itm->getSubtype() - 499; m_change_spic_time = time(NULL) + 7200; m_bag.removeItem(slot); itm->Clear(); itm->Save(); //robj.push_back( Pair("refresh", 1) ); setExtraData(char_data_type_normal, char_data_change_spic, m_change_spic); setExtraData(char_data_type_normal, char_data_change_spic_time, m_change_spic_time); return HC_SUCCESS; } //兑换货币 case ITEM_USAGE_SILVER_CARD: { int total = pg->getValue() * use_num; addSilver(total); //银币统计 add_statistics_of_silver_get(m_id,m_ip_address,total,silver_get_by_treasure, m_union_id, m_server_id); json_spirit::Object obj; obj.push_back( Pair("type", item_type_silver) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strSilver) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_GOLD_CARD: { int total = pg->getValue() * use_num; addGold(total); //金币获得统计 add_statistics_of_gold_get(m_id,m_ip_address,total,gold_get_treasure, m_union_id, m_server_id); json_spirit::Object obj; obj.push_back( Pair("type", item_type_gold) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strGold) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_YUSHI_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_yushi, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_yushi) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_yushi); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } case ITEM_USAGE_PRESTIGE_CARD: { int total = pg->getValue() * use_num; addPrestige(total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_prestige) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", 0) ); obj.push_back( Pair("fac", 0) ); obj.push_back( Pair("name", strPrestige) ); robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } case ITEM_USAGE_SUPPLY_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_supply, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_supply) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_supply); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); NotifyCharData(); return HC_SUCCESS; } case ITEM_USAGE_GONGXUN_CARD: { int total = pg->getValue() * use_num; addTreasure(treasure_type_gongxun, total); json_spirit::Object obj; obj.push_back( Pair("type", item_type_treasure) ); obj.push_back( Pair("count", total) ); obj.push_back( Pair("id", treasure_type_gongxun) ); obj.push_back( Pair("fac", 0) ); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(treasure_type_gongxun); if (tr.get()) { obj.push_back( Pair("quality", tr->quality) ); obj.push_back( Pair("spic", tr->spic) ); obj.push_back( Pair("name", tr->name) ); } robj.push_back( Pair("get", obj) ); if (itm->getCount() > use_num) { itm->addCount(-use_num); } else { m_bag.removeItem(slot); itm->Clear(); } itm->Save(); return HC_SUCCESS; } //卷轴 case ITEM_USAGE_EQUIPMENT_SCROLL: { equipment_scroll* sp = Singleton<equipment_scroll_mgr>::Instance().getScroll(pg->getValue()); if (!sp) { return HC_ERROR; } json_spirit::Object eq = sp->m_eqobj; bool canMake = true; json_spirit::Array mlist; json_spirit::Object o; o.push_back( Pair("name", sp->m_equipment_src->name) ); o.push_back( Pair("type", iItem_type_equipment) ); o.push_back( Pair("id", sp->m_equipment_src->baseid) ); o.push_back( Pair("spic", sp->m_equipment_src->baseid) ); o.push_back( Pair("quality", sp->m_equipment_src->quality) ); o.push_back( Pair("need", 1) ); if (sp->m_equipment_src->m_place.get()) { bool can_sweep = false; o.push_back( Pair("info", sp->m_equipment_src->m_place->info) ); if (sp->m_equipment_src->m_place->type == 1) { can_sweep = m_tempo.check_stronghold_can_sweep(sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->stageId,sp->m_equipment_src->m_place->pos); boost::shared_ptr<StrongholdData> bstronghold = GeneralDataMgr::getInstance()->GetStrongholdData(sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->stageId,sp->m_equipment_src->m_place->pos); if (bstronghold.get()) { o.push_back( Pair("open_level", bstronghold->m_level) ); } o.push_back( Pair("can_sweep", can_sweep) ); } else if (sp->m_equipment_src->m_place->type == 2) { can_sweep = eliteCombatMgr::getInstance()->check_stronghold_can_attack(m_id,sp->m_equipment_src->m_place->mapId,sp->m_equipment_src->m_place->pos); o.push_back( Pair("can_sweep", can_sweep) ); } } EquipmentData* src_eq = m_bag.getDefaultEquip(sp->m_src_equipment, 999); if (src_eq) { robj.push_back( Pair("eid", src_eq->id) ); o.push_back( Pair("num", 1) ); int nextqLevel = src_eq->qLevel; int nextAdd = src_eq->addValue; int nextAdd2 = src_eq->addValue2; upgradeValue(sp->m_equipment->up_quality, src_eq->type, nextqLevel, nextAdd, nextAdd2); eq.push_back( Pair("level", nextqLevel) ); eq.push_back( Pair("addNums", sp->m_equipment->baseValue + nextAdd) ); if (nextAdd2 > 0) { eq.push_back( Pair("addNums2", sp->m_equipment->baseValue2 + nextAdd2) ); } } else { eq.push_back( Pair("level", 0) ); eq.push_back( Pair("addNums", sp->m_equipment->baseValue) ); if (sp->m_equipment->baseValue2 > 0) { eq.push_back( Pair("addNums2", sp->m_equipment->baseValue2) ); } o.push_back( Pair("num", 0) ); canMake = false; } mlist.push_back(o); robj.push_back( Pair("eq", eq) ); //检查材料是否足够 canMake &= checkMaterial(sp, *this, m_bag, mlist); robj.push_back( Pair("mlist", mlist) ); robj.push_back( Pair("canMake", canMake) ); return HC_SUCCESS; } //VIP经验卡 case ITEM_USAGE_VIP_EXP_80: case ITEM_USAGE_VIP_EXP: { if (m_vip < 0 || m_vip >= 12) { return HC_ERROR; } if (pg->getValue() <= 0) { return HC_ERROR; } int add = 0; int count = use_num; if (count >= itm->getCount()) { count = itm->getCount(); } else if (count <= 0) { count = 1; } int old_recharge = m_total_recharge + m_vip_exp; //上限限制 if (pg->getUsage() == ITEM_USAGE_VIP_EXP_80) { //只能升级到80% int max_vip = iVIP_recharge[m_vip] * 4 / 5; if (old_recharge >= max_vip) { return HC_ERROR_USE_VIP_CARD; } int canAdd = max_vip - old_recharge; int maxUsed = canAdd / pg->getValue(); if (canAdd % pg->getValue() != 0) { ++maxUsed; } if (count > maxUsed) { count = maxUsed; } add = pg->getValue() * count; if (add > canAdd) { add = canAdd; } } else if (pg->getUsage() == ITEM_USAGE_VIP_EXP) { add = pg->getValue() * count; } if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } m_vip_exp += add; InsertSaveDb("update char_data set exp=" + LEX_CAST_STR(m_vip_exp) + " where cid=" + LEX_CAST_STR(m_id)); if (pg->getUsage() == ITEM_USAGE_VIP_EXP) { updateVip(); } //通知客户端,充值条变化 robj.push_back( Pair("rechargeFrom", old_recharge) ); robj.push_back( Pair("rechargeAdd", add) ); return HC_SUCCESS; } //限时增益 case ITEM_USAGE_BUFF_BINGLI: case ITEM_USAGE_BUFF_WUGONG: case ITEM_USAGE_BUFF_WUFANG: case ITEM_USAGE_BUFF_CEGONG: case ITEM_USAGE_BUFF_CEFANG: { if (pg->getValue() <= 0) { return HC_ERROR; } if (itm->getInvalidTime() <= time(NULL)) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); return HC_ERROR; } int count = 1; if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } m_Buffs.addBuff(pg->getUsage()-ITEM_USAGE_BUFF_BINGLI+1,pg->getValue(),7200); #ifdef QQ_PLAT treasure_cost_tencent(this,(int)itm->getSubtype(),1); #endif return HC_SUCCESS; } //开启宝箱 case ITEM_USAGE_BOX: { if (pg->getValue() <= 0) { return HC_ERROR; } int count = use_num; if (count >= itm->getCount()) { count = itm->getCount(); } else if (count <= 0) { count = 1; } //开启宝箱需要银币 int need_silver = count * pg->getValue(); if (silver() < need_silver) { if (count > 1) { count = silver() / pg->getValue(); need_silver = count * pg->getValue(); robj.push_back( Pair("msg", getErrMsg(HC_ERROR_NOT_ENOUGH_SILVER)) ); } else { std::string msg = strBoxSilverNotEnoughMsg; str_replace(msg, "$S", LEX_CAST_STR(pg->getValue())); robj.push_back( Pair("msg", msg) ); return HC_ERROR; } } //开启宝箱需要位置 if (count > 0 && (m_bag.size()-m_bag.getUsed()) < count) return HC_ERROR_NOT_ENOUGH_BAG_SIZE; if (itm->getCount() == count) { m_bag.removeItem(slot); itm->Clear(); itm->Save(); } else { itm->addCount(-count); itm->Save(); } if (count == 1) { addSilver(-need_silver); add_statistics_of_silver_cost(m_id,m_ip_address,need_silver,silver_cost_for_open_box, m_union_id, m_server_id); //给奖励! std::list<Item> getItems; int notify = lootMgr::getInstance()->getBoxLoots(itm->getSubtype(), getItems, 0); if (notify > 0) { std::string msg = strBoxGetMsg; str_replace(msg, "$W", MakeCharNameLink(m_name)); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(itm->getSubtype()); if (tr.get()) { std::string name = tr->name; addColor(name, tr->quality); str_replace(msg, "$B", name); } Item& item = *(getItems.begin()); if (item.type == item_type_treasure) { tr = GeneralDataMgr::getInstance()->GetBaseTreasure(item.id); if (tr.get()) { std::string name = MakeTreasureLink(tr->name, item.id); addColor(name, tr->quality); str_replace(msg, "$R", name); } } json_spirit::mObject mobj; mobj["cmd"] = "broadCastMsg"; mobj["msg"] = msg; boost::shared_ptr<splsTimer> tmsg; tmsg.reset(new splsTimer(4, 1, mobj,1)); splsTimerMgr::getInstance()->addTimer(tmsg); } //随机列表 std::list<Item> items_list; lootMgr::getInstance()->getBoxLootsInfo(itm->getSubtype(),items_list); json_spirit::Array alist; for (std::list<Item>::iterator it = items_list.begin(); it != items_list.end(); ++it) { Item& item = *it; json_spirit::Object obj; if ((*(getItems.begin())).id == item.id && (*(getItems.begin())).type == item.type && (*(getItems.begin())).nums == item.nums && (*(getItems.begin())).fac == item.fac) { obj.push_back( Pair("get", 1) ); } item.toObj(obj); alist.push_back(obj); } robj.push_back( Pair("list", alist) ); giveLoots(this, getItems, m_area, m_level, 0, NULL, &robj, true, give_box_loot); } else { addSilver(-need_silver); add_statistics_of_silver_cost(m_id,m_ip_address,need_silver,silver_cost_for_open_box, m_union_id, m_server_id); //给奖励! std::list<Item> getAllItems; for (int i = 0; i < count; ++i) { std::list<Item> getItems; int notify = lootMgr::getInstance()->getBoxLoots(itm->getSubtype(), getItems, 0); Item& item = *(getItems.begin()); if (notify > 0) { std::string msg = strBoxGetMsg; str_replace(msg, "$W", MakeCharNameLink(m_name)); boost::shared_ptr<baseTreasure> tr = GeneralDataMgr::getInstance()->GetBaseTreasure(itm->getSubtype()); if (tr.get()) { std::string name = tr->name; addColor(name, tr->quality); str_replace(msg, "$B", name); } if (item.type == item_type_treasure) { tr = GeneralDataMgr::getInstance()->GetBaseTreasure(item.id); if (tr.get()) { std::string name = MakeTreasureLink(tr->name, item.id); addColor(name, tr->quality); str_replace(msg, "$R", name); } } GeneralDataMgr::getInstance()->broadCastSysMsg(msg, -1); } getAllItems.push_back(item); } giveLoots(this, getAllItems, m_area, m_level, 0, NULL, &robj, true, give_box_loot); } #ifdef QQ_PLAT //treasure_cost_tencent(this,(int)itm->getSubtype(),1); #endif NotifyCharData(); return HC_SUCCESS; } } return HC_ERROR;//未知类型 }
//升级装备 int CharData::upgradeEquipment(int eid, bool cost_gold, json_spirit::Object& robj) { if (cost_gold && gold() < 50) { return HC_ERROR_NOT_ENOUGH_GOLD; } //cout<<"upgradeEquipment(), eid "<<eid<<endl; equipment_scroll* sp = NULL; EquipmentData* src_eq = m_bag.getEquipById(eid); if (!src_eq) { src_eq = m_generals.getEquipById(eid); } if (src_eq) { //cout<<"find scroll by src_id "<<src_eq->baseid<<endl; sp = Singleton<equipment_scroll_mgr>::Instance().getScrollBySrcId(src_eq->baseid); if (!sp) { //cout<<"not find"<<endl; return HC_ERROR; } } else { //cout<<"wrong eid"<<endl; return HC_ERROR; } Bag* pbag = src_eq->getContainer(); //武将身上,判断等级是否够 if (pbag != &m_bag && pbag && pbag->gd.get() && pbag->gd->m_level < sp->m_equipment->needLevel) { return HC_ERROR_NOT_ENOUGH_GENERAL_LEVEL; } if (m_bag.getGemCount(sp->m_gem_id) <= 0) { //cout<<"no scroll,gem id: "<<sp->m_gem_id<<endl; return HC_ERROR; } //扣材料 bool success = trySubMaterial(sp, m_bag); if (!success) { //cout<<"trySubMaterial() return false"<<endl; return HC_ERROR; } //扣卷轴 int err_code = 0; m_bag.addGem(sp->m_gem_id, -1, err_code); if (cost_gold) { if (addGold(-iUpgradeEquiptmentKeepLevelGold) < 0) { return HC_ERROR_NOT_ENOUGH_GOLD; } //金币消耗统计 add_statistics_of_gold_cost(m_id, m_ip_address, iUpgradeEquiptmentKeepLevelGold, gold_cost_for_upgrade_equipment, m_union_id, m_server_id); #ifdef QQ_PLAT gold_cost_tencent(this,iUpgradeEquiptmentKeepLevelGold,gold_cost_for_upgrade_equipment); #endif NotifyCharData(); //act统计 act_to_tencent(this,act_new_equipt_make_special,src_eq->qLevel,src_eq->quality); } //升级装备 src_eq->upgrade(cost_gold); if (src_eq->getContainer() != &m_bag) { m_weapon_attack_change = true; if (pbag->gd.get()) { pbag->gd->updateEquipmentEffect(); } } json_spirit::Object eq; src_eq->toObj(eq); robj.push_back( Pair("equipVO", eq) ); updateEnhanceCost(); updateEnhanceCDList(); if (src_eq->baseEq.get()) { std::string link_name = strEquipLink; str_replace(link_name, "$G", LEX_CAST_STR(src_eq->id)); str_replace(link_name, "$C", LEX_CAST_STR(m_id)); str_replace(link_name, "$N", src_eq->baseEq->name); addColor(link_name, src_eq->quality); //广播升级装备信息 std::string notify_msg = strEquiptMakeInfo; str_replace(notify_msg, "$N", MakeCharNameLink(m_name)); str_replace(notify_msg, "$G", link_name); GeneralDataMgr::getInstance()->broadCastSysMsg(notify_msg, -1); } //七日目标 Singleton<seven_Goals_mgr>::Instance().updateGoals(*this,queryCreateDays(),goals_type_equipt,src_eq->baseid); m_trunk_tasks.updateTask(task_equipment_make, src_eq->baseid); //act统计 act_to_tencent(this,act_new_equipt_make,src_eq->type); return HC_SUCCESS; }
bool UserCharacter::handleMessage(const Telegram& msg) { int damage = 0; //first see if the current goal accepts the message if (getBrain()->handleMessage(msg)) return true; //handle any messages not handles by the goals switch (msg.msg) { case MSG_TAKE_THAT_MF: //just return if already dead or spawning if (isDead()) return true; else { damage = dereferenceToType<int>(msg.extra_info); //the extra info field of the telegram carries the amount of damage // 아직 유저가 죽는것 안함. // reduceHealth(dereferenceToType<int>(msg.extra_info)); AbstCharacter* attacker = (AbstCharacter*)EntityMgr.getEntityFromID(msg.sender); getSensoryMemory()->updateWithDamageSource(attacker, damage); //if this bot is now dead let the shooter know if (isDead()) { int worth = getWorth(); Dispatcher.dispatchMsg( SEND_MSG_IMMEDIATELY, getId(), msg.sender, MSG_YOU_GOT_ME, (void*)&worth); // 내 가치를 죽인애한테 gold로 준다. } } return true; case MSG_YOU_GOT_ME: // 내가 누굴 죽였다고 메시지를 받음 setScore(getScore() + 1); // gold 추가 addGold(dereferenceToType<int>(msg.extra_info)); //the bot this bot has just killed should be removed as the target _target_system->clearTarget(); return true; case MSG_GUN_SHOT_SOUND: //add the source of this sound to the bot's percepts getSensoryMemory()->updateWithSoundSource((AbstCharacter*)msg.extra_info); return true; case MSG_USER_HAS_REMOVED_BOT: { AbstCharacter* pRemovedBot = (AbstCharacter*)msg.extra_info; getSensoryMemory()->removeBotFromMemory(pRemovedBot); //if the removed bot is the target, make sure the target is cleared if (pRemovedBot == getTargetSys()->getTarget()) { getTargetSys()->clearTarget(); } return true; } default: return false; } }