/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ // Filename : OCRC_STO.H // Description : store of crc of objects #include #include #include #include #include #include #include #include #include #include #include CrcStore::CrcStore() : nations(0), units(0), firms(0), towns(0), bullets(0), rebels(0), spies(0), talk_msgs(0) { } void CrcStore::init() { deinit(); } void CrcStore::deinit() { nations.clear(); units.clear(); firms.clear(); towns.clear(); bullets.clear(); rebels.clear(); spies.clear(); talk_msgs.clear(); } void CrcStore::record_nations() { nations.clear(); *(short *)nations.reserve(sizeof(short)) = nation_array.size(); for( short nationRecno = 1; nationRecno <= nation_array.size(); ++nationRecno) { CRC_TYPE checkNum = 0; if( !nation_array.is_deleted(nationRecno) ) checkNum = nation_array[nationRecno]->crc8(); *(CRC_TYPE *)nations.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_units() { units.clear(); *(short *)units.reserve(sizeof(short)) = unit_array.size(); for( short unitRecno = 1; unitRecno <= unit_array.size(); ++unitRecno) { CRC_TYPE checkNum = 0; if( !unit_array.is_deleted(unitRecno) ) checkNum = unit_array[unitRecno]->crc8(); *(CRC_TYPE *)units.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_firms() { firms.clear(); *(short *)firms.reserve(sizeof(short)) = firm_array.size(); for( short firmRecno = 1; firmRecno <= firm_array.size(); ++firmRecno) { CRC_TYPE checkNum = 0; if( !firm_array.is_deleted(firmRecno) ) checkNum = firm_array[firmRecno]->crc8(); *(CRC_TYPE *)firms.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_towns() { towns.clear(); *(short *)towns.reserve(sizeof(short)) = town_array.size(); for( short townRecno = 1; townRecno <= town_array.size(); ++townRecno) { CRC_TYPE checkNum = 0; if( !town_array.is_deleted(townRecno) ) checkNum = town_array[townRecno]->crc8(); *(CRC_TYPE *)towns.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_bullets() { bullets.clear(); *(short *)bullets.reserve(sizeof(short)) = bullet_array.size(); for( short bulletRecno = 1; bulletRecno <= bullet_array.size(); ++bulletRecno) { CRC_TYPE checkNum = 0; if( !bullet_array.is_deleted(bulletRecno) ) checkNum = bullet_array[bulletRecno]->crc8(); *(CRC_TYPE *)bullets.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_rebels() { rebels.clear(); *(short *)rebels.reserve(sizeof(short)) = rebel_array.size(); for( short rebelRecno = 1; rebelRecno <= rebel_array.size(); ++rebelRecno) { CRC_TYPE checkNum = 0; if( !rebel_array.is_deleted(rebelRecno) ) { checkNum = rebel_array[rebelRecno]->crc8(); } *(CRC_TYPE *)rebels.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_spies() { spies.clear(); *(short *)spies.reserve(sizeof(short)) = spy_array.size(); for( short spyRecno = 1; spyRecno <= spy_array.size(); ++spyRecno) { CRC_TYPE checkNum = 0; if( !spy_array.is_deleted(spyRecno) ) { checkNum = spy_array[spyRecno]->crc8(); } *(CRC_TYPE *)spies.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_talk_msgs() { talk_msgs.clear(); *(short *)talk_msgs.reserve(sizeof(short)) = talk_res.talk_msg_count(); for( short talkRecno = 1; talkRecno <= talk_res.talk_msg_count(); ++talkRecno) { CRC_TYPE checkNum = 0; if( !talk_res.is_talk_msg_deleted(talkRecno) ) { checkNum = talk_res.get_talk_msg(talkRecno)->crc8(); } *(CRC_TYPE *)talk_msgs.reserve(sizeof(CRC_TYPE)) = checkNum; } } void CrcStore::record_all() { record_nations(); record_units(); record_firms(); record_towns(); record_bullets(); record_rebels(); record_spies(); record_talk_msgs(); } void CrcStore::send_all() { char *charPtr; charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_NATION, nations.length() ); memcpy(charPtr, nations.queue_buf, nations.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_UNIT, units.length() ); memcpy(charPtr, units.queue_buf, units.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_FIRM, firms.length() ); memcpy(charPtr, firms.queue_buf, firms.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_TOWN, towns.length() ); memcpy(charPtr, towns.queue_buf, towns.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_BULLET, bullets.length() ); memcpy(charPtr, bullets.queue_buf, bullets.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_REBEL, rebels.length() ); memcpy(charPtr, rebels.queue_buf, rebels.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_SPY, spies.length() ); memcpy(charPtr, spies.queue_buf, spies.length() ); charPtr = (char *)remote.new_send_queue_msg(MSG_COMPARE_TALK, talk_msgs.length() ); memcpy(charPtr, talk_msgs.queue_buf, talk_msgs.length() ); } // return 0 if equal // otherwise not equal int CrcStore::compare_remote(DWORD remoteMsgId, char *dataPtr) { VLenQueue *vq = NULL; char *arrayName; switch(remoteMsgId) { case MSG_COMPARE_NATION: vq = &nations; arrayName = "nation_array"; break; case MSG_COMPARE_UNIT: vq = &units; arrayName = "unit_array"; break; case MSG_COMPARE_FIRM: vq = &firms; arrayName = "firm_array"; break; case MSG_COMPARE_TOWN: vq = &towns; arrayName = "town_array"; break; case MSG_COMPARE_BULLET: vq = &bullets; arrayName = "bullet_array"; break; case MSG_COMPARE_REBEL: vq = &rebels; arrayName = "rebel_array"; break; case MSG_COMPARE_SPY: vq = &spies; arrayName = "spy_array"; break; case MSG_COMPARE_TALK: vq = &talk_msgs; arrayName = "talk_res"; break; default: err_here(); return 0; } err_when(vq->length() < sizeof(short)); int rc = memcmp(vq->queue_buf, dataPtr, vq->length() ); if( rc ) { char *p1; char *p2; int diffOffset; // found out where is the first difference for( diffOffset = 0, p1 = vq->queue_buf, p2 = dataPtr; diffOffset < vq->length() && *p1 == *p2; ++diffOffset, ++p1, ++p2); // ###### patch begin Gilbert 23/1 #######// // err.run("%s discrepency, offset : %d", arrayName, diffOffset); crc_error_string = arrayName; crc_error_string += "discrepency, offset : "; crc_error_string += diffOffset; // ###### patch end Gilbert 23/1 #######// diffOffset = 0; // dummy code } return rc; }