// // RPGResultsLogic.cpp // OzgGameRPG // // Created by ozg on 14-4-13. // // #include "RPGResultsLogic.h" //执行操作后player的数据更新 #define PLAYER_UPDATE "update player set %s = %i where id = %i" //更新player的各个状态值 #define PLAYER_UPDATE_STATUS "update player set attack = %f, defense = %f, speed = %f, skill_attack = %f, skill_defense = %f, %s = %i where id = %i" //获取一个已有道具的总数 #define EXISTING_ITEMS_TOTAL "select total from items_existing where id = %i" //丢弃一个道具 #define ITEMS_DISCARD "delete from items_existing where id = %i" //扣减一个道具 #define ITEMS_DEDUCTIONS "update items_existing set total = total - 1 where id = %i" //查询一个现有道具的数量 #define ITEMS_GET "select * from items_existing where id = %i" //查询一个技能的明细 #define SKILL_DETAIL_QUERY "select * from skill where id = %i" //查询一条player数据 #define PLAYER_SINGLE_QUERY "select * from player where id = %i" //查询一条items数据 #define ITEMS_SINGLE_QUERY "select * from items where id = %i" //是否已存在该道具 #define EXIST_ITEMS "select count(id) from items_existing where id = %i" //增加一个已有道具 #define ADD_EXISTING_ITEMS "insert into items_existing (id, total) values(%i, 1)" //更新一个已有道具的数量 #define UPDATE_EXISTING_ITEMS "update items_existing set total = total + 1 where id = %i" void RPGResultsLogic::discardItems(CppSQLite3DB *db, int itemsId) { db->execDML(CCString::createWithFormat(ITEMS_DISCARD, itemsId)->getCString()); } void RPGResultsLogic::deductionsItems(CppSQLite3DB *db, int itemsId) { CCString *sql = NULL; CppSQLite3Query query = db->execQuery(CCString::createWithFormat(ITEMS_GET, itemsId)->getCString()); while(!query.eof()) { if(query.getIntField("total") <= 1) sql = CCString::createWithFormat(ITEMS_DISCARD, itemsId); else sql = CCString::createWithFormat(ITEMS_DEDUCTIONS, itemsId); query.nextRow(); } query.finalize(); if(sql) db->execDML(sql->getCString()); } bool RPGResultsLogic::useItems(CppSQLite3DB* db, int playerId, int itemsId) { /* 6 草药 7 党参 8 复活药 */ string field; string maxField; if(itemsId == 7) { field = "mp"; //党参加mp maxField = "max_mp"; } else { field = "hp"; maxField = "max_hp"; } //道具的效果值 int results = 0; CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, playerId)->getCString()); while(!query.eof()) { if(query.getIntField("hp") <= 0 && itemsId != 8) return false; //死亡状态下不能直接恢复hp的道具 else if(query.getIntField("hp") <= 0 && itemsId == 8) results = 1; //复活后是1HP else if(query.getIntField("hp") > 0 && itemsId == 8) return false; //活着的时候不能使用复活药 else { //恢复HP或MP results = RPGComputingResults::itemCure(itemsId); results += query.getIntField(field.c_str()); //超过最大值的处理 if(results > query.getIntField(maxField.c_str())) results = query.getIntField(maxField.c_str()); } query.nextRow(); } query.finalize(); //使用道具 { CCString *sql = CCString::createWithFormat(PLAYER_UPDATE, field.c_str(), results, playerId); db->execDML(sql->getCString()); CCLog("%s", sql->getCString()); } //扣减道具数 RPGResultsLogic::deductionsItems(db, itemsId); CCLog("对player%d 使用了一个道具%d", playerId, itemsId); return true; } int RPGResultsLogic::battleUseItems(CCArray* existingItems, RPGBaseRole *targetData, int itemsId) { /* 6 草药 7 党参 8 复活药 */ //道具的效果值 int results = 0; if(dynamic_cast(targetData) != NULL) { if(((RPGPlayer*)targetData)->m_status == kRPGDataStatusDeath && itemsId != 8) return 0; //死亡状态下不能直接恢复hp的道具 else if(((RPGPlayer*)targetData)->m_status == kRPGDataStatusDeath && itemsId == 8) results = 1; //复活后是1HP else if(((RPGPlayer*)targetData)->m_status != kRPGDataStatusDeath && itemsId == 8) return 0; //活着的时候不能使用复活药 else { //恢复HP或MP results = RPGComputingResults::itemCure(itemsId); if(itemsId == 7) CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "mp"); } } else if(dynamic_cast(targetData) != NULL) { //以下的复活部分是不会触发的 if(((RPGMonster*)targetData)->m_status == kRPGDataStatusDeath && itemsId != 8) return 0; //死亡状态下不能直接恢复hp的道具 else if(((RPGMonster*)targetData)->m_status == kRPGDataStatusDeath && itemsId == 8) results = 1; //复活后是1HP else if(((RPGMonster*)targetData)->m_status != kRPGDataStatusDeath && itemsId == 8) return 0; //活着的时候不能使用复活药 else { //恢复HP或MP results = RPGComputingResults::itemCure(itemsId); if(itemsId == 7) CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "mp"); } } //扣减一个已有道具,没有了就在已有existingItems中删除 CCArray* noneExistingItems = CCArray::create(); for (int i = 0; i < existingItems->count(); i++) { RPGExistingItems *itemsData = (RPGExistingItems*)existingItems->objectAtIndex(i); itemsData->m_total--; if(itemsData->m_total <= 0) noneExistingItems->addObject(itemsData); //该道具用完了之后就加入删除列表 } //删除用完了的道具 existingItems->removeObjectsInArray(noneExistingItems); return results; } bool RPGResultsLogic::useSkillCure(CppSQLite3DB *db, int srcPlayerId, int targetPlayerId, int srcSkillId) { RPGPlayer *srcPlayerData; RPGSkill *srcSkillData; RPGPlayer *targetPlayerData; //查询使用技能的player CppSQLite3Query srcPlayerQuery = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, srcPlayerId)->getCString()); while(!srcPlayerQuery.eof()) { srcPlayerData = RPGPlayer::create(); srcPlayerData->m_dataId = srcPlayerQuery.getIntField("id"); srcPlayerData->m_maxMP = srcPlayerQuery.getIntField("max_mp"); srcPlayerData->m_MP = srcPlayerQuery.getIntField("mp"); srcPlayerData->m_skillAttack = srcPlayerQuery.getFloatField("skill_attack"); srcPlayerQuery.nextRow(); } srcPlayerQuery.finalize(); //查询使用的技能 CppSQLite3Query srcSkillQuery = db->execQuery(CCString::createWithFormat(SKILL_DETAIL_QUERY, srcSkillId)->getCString()); while(!srcSkillQuery.eof()) { srcSkillData = RPGSkill::create(); srcSkillData->m_dataId = srcSkillQuery.getIntField("id"); srcSkillData->m_MP = srcSkillQuery.getIntField("mp"); srcSkillData->m_name = srcSkillQuery.getStringField("name_cns"); srcSkillData->m_skillAttack = srcSkillQuery.getFloatField("skill_attack"); srcSkillData->m_attr = srcSkillQuery.getFloatField("attr"); srcSkillQuery.nextRow(); } srcSkillQuery.finalize(); //查询目标player CppSQLite3Query targetPlayerQuery = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, targetPlayerId)->getCString()); while(!targetPlayerQuery.eof()) { targetPlayerData = RPGPlayer::create(); targetPlayerData->m_dataId = targetPlayerQuery.getIntField("id"); targetPlayerData->m_maxHP = targetPlayerQuery.getIntField("max_hp"); targetPlayerData->m_HP = targetPlayerQuery.getIntField("hp"); targetPlayerQuery.nextRow(); } targetPlayerQuery.finalize(); //执行逻辑 if(srcPlayerData && srcSkillData && targetPlayerData) { //计算player时候技能后的效果值 int targetResults = RPGComputingResults::skillCureResults(srcPlayerData->m_skillAttack, srcSkillData->m_skillAttack); targetPlayerData->m_HP += targetResults; CCLog("player %i 回复了 %i HP", targetPlayerId, targetResults); //超过HP最大值 if(targetPlayerData->m_HP > targetPlayerData->m_maxHP) targetPlayerData->m_HP = targetPlayerData->m_maxHP; db->execDML(CCString::createWithFormat(PLAYER_UPDATE, "hp", targetPlayerData->m_HP, targetPlayerData->m_dataId)->getCString()); //扣减使用者的MP srcPlayerData->m_MP -= srcSkillData->m_MP; if(srcPlayerData->m_MP < 0) srcPlayerData->m_MP = 0; CCLog("player %i 消耗了 %i MP", srcPlayerId, srcSkillData->m_MP); db->execDML(CCString::createWithFormat(PLAYER_UPDATE, "mp", srcPlayerData->m_MP, srcPlayerData->m_dataId)->getCString()); } return true; } void RPGResultsLogic::removeEquip(CppSQLite3DB *db, int playerId, int type) { //武器 CCString *playerSql = NULL; CCString *itemsExistingSql = NULL; int itemsId; string itemField; if(type == 1) itemField = "items_id_arms"; else if(type == 2) itemField = "items_id_armor"; else return; { CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_SINGLE_QUERY, playerId)->getCString()); while(!query.eof()) { itemsId = query.getIntField(itemField.c_str()); query.nextRow(); } query.finalize(); } float attack; float defense; float speed; float skillAttack; float skillDefense; { //player将装备卸下后各个值发生变化 CppSQLite3Query query = db->execQuery(CCString::createWithFormat(ITEMS_SINGLE_QUERY, itemsId)->getCString()); while(!query.eof()) { attack = query.getFloatField("attack"); defense = query.getFloatField("defense"); speed = query.getFloatField("speed"); skillAttack = query.getFloatField("skill_attack"); skillDefense = query.getFloatField("skill_defense"); query.nextRow(); } query.finalize(); } //各个值的处理 { CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_SINGLE_QUERY, playerId)->getCString()); while(!query.eof()) { attack = query.getFloatField("attack") - attack; defense = query.getFloatField("defense") - defense; speed = query.getFloatField("speed") - speed; skillAttack = query.getFloatField("skill_attack") - skillAttack; skillDefense = query.getFloatField("skill_defense") - skillDefense; //最小值的处理 if(attack < 0) attack = 0; if(defense < 0) defense = 0; if(speed < 0) speed = 0; if(skillAttack < 0) skillAttack = 0; if(skillDefense < 0) skillDefense = 0; query.nextRow(); } query.finalize(); } int equipId = 0; playerSql = CCString::createWithFormat(PLAYER_UPDATE_STATUS, attack, defense, speed, skillAttack, skillDefense, itemField.c_str(), equipId, playerId); { //将卸下的装备放回已有道具处 CppSQLite3Query query = db->execQuery(CCString::createWithFormat(EXIST_ITEMS, itemsId)->getCString()); while(!query.eof()) { if(query.getIntField(0) <= 0) itemsExistingSql = CCString::createWithFormat(ADD_EXISTING_ITEMS, itemsId); else itemsExistingSql = CCString::createWithFormat(UPDATE_EXISTING_ITEMS, itemsId); query.nextRow(); } query.finalize(); } if(playerSql) db->execDML(playerSql->getCString()); if(itemsExistingSql) db->execDML(itemsExistingSql->getCString()); } void RPGResultsLogic::equip(CppSQLite3DB *db, int playerId, int itemsId) { CCString *playerSql = NULL; CCString *itemsExistingSql = NULL; int type; float attack; float defense; float speed; float skillAttack; float skillDefense; { //查询该装备的类型和效果值 CppSQLite3Query query = db->execQuery(CCString::createWithFormat(ITEMS_SINGLE_QUERY, itemsId)->getCString()); while(!query.eof()) { attack = query.getFloatField("attack"); defense = query.getFloatField("defense"); speed = query.getFloatField("speed"); skillAttack = query.getFloatField("skill_attack"); skillDefense = query.getFloatField("skill_defense"); type = query.getIntField("type"); query.nextRow(); } query.finalize(); } string itemField; if(type == 1) itemField = "items_id_arms"; else if(type == 2) itemField = "items_id_armor"; else return; //如果已装备了则先卸掉此装备 { CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_SINGLE_QUERY, playerId)->getCString()); while(!query.eof()) { if(query.getIntField(itemField.c_str()) != 0) RPGResultsLogic::removeEquip(db, playerId, type); query.nextRow(); } query.finalize(); } //各个值的处理 { CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_SINGLE_QUERY, playerId)->getCString()); while(!query.eof()) { attack = query.getFloatField("attack") + attack; defense = query.getFloatField("defense") + defense; speed = query.getFloatField("speed") + speed; skillAttack = query.getFloatField("skill_attack") + skillAttack; skillDefense = query.getFloatField("skill_defense") + skillDefense; //最大值的处理 if(attack > MAX_STATUS2) attack = MAX_STATUS2; if(defense > MAX_STATUS2) defense = MAX_STATUS2; if(speed > MAX_STATUS2) speed = MAX_STATUS2; if(skillAttack > MAX_STATUS2) skillAttack = MAX_STATUS2; if(skillDefense > MAX_STATUS2) skillDefense = MAX_STATUS2; query.nextRow(); } query.finalize(); } //player装备了之后各个值发生变化 playerSql = CCString::createWithFormat(PLAYER_UPDATE_STATUS, attack, defense, speed, skillAttack, skillDefense, itemField.c_str(), itemsId, playerId); { //扣减装备了的道具 CppSQLite3Query query = db->execQuery(CCString::createWithFormat(EXISTING_ITEMS_TOTAL, itemsId)->getCString()); while(!query.eof()) { if(query.getIntField(0) <= 1) itemsExistingSql = CCString::createWithFormat(ITEMS_DISCARD, itemsId); else itemsExistingSql = CCString::createWithFormat(ITEMS_DEDUCTIONS, itemsId); query.nextRow(); } query.finalize(); } if(playerSql) db->execDML(playerSql->getCString()); if(itemsExistingSql) db->execDML(itemsExistingSql->getCString()); }