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));
	}
}
예제 #2
0
//强化按钮
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);
    }
}
예제 #3
0
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);
	}
}
예제 #4
0
/**
 * 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);
		}
	}
}
예제 #5
0
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);
    }
}
예제 #6
0
/////////////////////////////////////////////////////////////////////////////
// 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;
	}
}
예제 #7
0
/**
 * 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();
	}
}
예제 #8
0
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));
            }
        }
    }
}
예제 #9
0
//打开物品
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;//未知类型
}
예제 #10
0
//升级装备
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;
}
예제 #11
0
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;
	}
}