/* Find all important data nodes in * this individual's GEDCOM sub-tree * @n = Individual's first child node */ void GIndiEntry::parseIndiData(GNode * n) { while (n) { // Name if (!_nameNode && n->type() == TYPE_NAME) { parseNames(n); } // Sex else if (!_sexNode && n->type() == TYPE_SEX) { _sexNode = n; } // Birth else if (!_birthDateNode && n->type() == TYPE_BIRTH) { parseBirth(n); } // Death else if (!_deathDateNode && n->type() == TYPE_DEATH) { parseDeath(n); } // Family (Child) else if (n->type() == TYPE_FAMC) { // Check adoption status GNode * m = n->firstChild(); bool isAdoptiveFam = false; // Check other properties under family while (m) { if (m->type() == TYPE_PEDI && m->data() == PROP_ADOPTED) { isAdoptiveFam = true; break; } m = m->next(); } // Prefer natural family in the family tree if (!_famcNode || !isAdoptiveFam) { _famcNode = n; _adopted = isAdoptiveFam; } } // Family (Parent) else if (n->type() == TYPE_FAMS) { // First marriage if (!_famsNode) { _famsNode = n; } // Second marriage else if (!_marriages) { _marriages = new QStringList(); _marriages->append(_famsNode->data()); _marriages->append(n->data()); } // Third, fourth, ... else { _marriages->append(n->data()); } } n = n->next(); } }
static bool parseSexp(Game& game, sexp_t* expression) { sexp_t* sub, *subsub; if( !expression ) return false; expression = expression->list; if( !expression ) return false; if(expression->val != NULL && strcmp(expression->val, "status") == 0) { GameState gs; while(expression->next != NULL) { expression = expression->next; sub = expression->list; if ( !sub ) return false; if(string(sub->val) == "game") { sub = sub->next; if ( !sub ) return false; gs.mapWidth = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.mapHeight = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.waterDamage = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.turnNumber = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.maxUnits = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.playerID = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.gameNumber = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.maxSiege = atoi(sub->val); sub = sub->next; if ( !sub ) return false; gs.oxygenRate = atof(sub->val); sub = sub->next; if ( !sub ) return false; gs.depositionRate = atoi(sub->val); sub = sub->next; } else if(string(sub->val) == "Player") { sub = sub->next; bool flag = true; while(sub && flag) { Player object; flag = parsePlayer(object, sub); gs.players[object.id] = object; sub = sub->next; } if ( !flag ) return false; } else if(string(sub->val) == "Mappable") { sub = sub->next; bool flag = true; while(sub && flag) { Mappable object; flag = parseMappable(object, sub); gs.mappables[object.id] = object; sub = sub->next; } if ( !flag ) return false; } else if(string(sub->val) == "PumpStation") { sub = sub->next; bool flag = true; while(sub && flag) { PumpStation object; flag = parsePumpStation(object, sub); gs.pumpStations[object.id] = object; sub = sub->next; } if ( !flag ) return false; } else if(string(sub->val) == "Unit") { sub = sub->next; bool flag = true; while(sub && flag) { Unit object; flag = parseUnit(object, sub); gs.units[object.id] = object; sub = sub->next; } if ( !flag ) return false; } else if(string(sub->val) == "Tile") { sub = sub->next; bool flag = true; while(sub && flag) { Tile object; flag = parseTile(object, sub); gs.tiles[object.id] = object; sub = sub->next; } if ( !flag ) return false; } else if(string(sub->val) == "UnitType") { sub = sub->next; bool flag = true; while(sub && flag) { UnitType object; flag = parseUnitType(object, sub); gs.unitTypes[object.id] = object; sub = sub->next; } if ( !flag ) return false; } } game.states.push_back(gs); } else if(string(expression->val) == "animations") { std::map< int, std::vector< SmartPointer< Animation > > > animations; while(expression->next) { expression = expression->next; sub = expression->list; if ( !sub ) return false; if(string(ToLower( sub->val ) ) == "dig") { SmartPointer<dig> animation = new dig; if ( !parseDig(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "attack") { SmartPointer<attack> animation = new attack; if ( !parseAttack(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "spawn") { SmartPointer<spawn> animation = new spawn; if ( !parseSpawn(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "death") { SmartPointer<death> animation = new death; if ( !parseDeath(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "move") { SmartPointer<move> animation = new move; if ( !parseMove(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "flow") { SmartPointer<flow> animation = new flow; if ( !parseFlow(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } if(string(ToLower( sub->val ) ) == "fill") { SmartPointer<fill> animation = new fill; if ( !parseFill(*animation, expression) ) return false; animations[ ((AnimOwner*)&*animation)->owner ].push_back( animation ); } } game.states[game.states.size()-1].animations = animations; } else if(string(expression->val) == "ident") { expression = expression->next; if ( !expression ) return false; sub = expression->list; while(sub) { subsub = sub->list; if ( !subsub ) return false; int number = atoi(subsub->val); if(number >= 0) { subsub = subsub->next; if ( !subsub ) return false; subsub = subsub->next; if ( !subsub ) return false; game.players[number] = subsub->val; } sub = sub->next; } } else if(string(expression->val) == "game-winner") { expression = expression->next; if ( !expression ) return false; expression = expression->next; if ( !expression ) return false; expression = expression->next; if ( !expression ) return false; game.winner = atoi(expression->val); expression = expression->next; if( !expression ) return false; game.winReason = expression->val; } return true; }
void ProtocolGame::parseMessage(InputMessage& msg) { try { while(!msg.eof()) { int opt = msg.getU8(); switch(opt) { case Proto::GameServerInitGame: parsePlayerLogin(msg); break; case Proto::GameServerGMActions: parseGMActions(msg); break; case Proto::GameServerLoginError: parseLoginError(msg); break; case Proto::GameServerLoginAdvice: parseFYIMessage(msg); break; case Proto::GameServerLoginWait: parseWaitList(msg); break; case Proto::GameServerPing: parsePing(msg); break; //case Proto::GameServerChallange: case Proto::GameServerDead: parseDeath(msg); break; case Proto::GameServerFullMap: parseMapDescription(msg); break; case Proto::GameServerMapTopRow: parseMoveNorth(msg); break; case Proto::GameServerMapRightRow: parseMoveEast(msg); break; case Proto::GameServerMapBottomRow: parseMoveSouth(msg); break; case Proto::GameServerMapLeftRow: parseMoveWest(msg); break; case Proto::GameServerTileData: parseUpdateTile(msg); break; case Proto::GameServerCreateOnMap: parseTileAddThing(msg); break; case Proto::GameServerChangeOnMap: parseTileTransformThing(msg); break; case Proto::GameServerDeleteOnMap: parseTileRemoveThing(msg); break; case Proto::GameServerMoveCreature: parseCreatureMove(msg); break; case Proto::GameServerOpenContainer: parseOpenContainer(msg); break; case Proto::GameServerCloseContainer: parseCloseContainer(msg); break; case Proto::GameServerCreateContainer: parseContainerAddItem(msg); break; case Proto::GameServerChangeInContainer: parseContainerUpdateItem(msg); break; case Proto::GameServerDeleteInContainer: parseContainerRemoveItem(msg); break; case Proto::GameServerSetInventory: parseAddInventoryItem(msg); break; case Proto::GameServerDeleteInventory: parseRemoveInventoryItem(msg); break; case Proto::GameServerNpcOffer: parseOpenShopWindow(msg); break; case Proto::GameServerPlayerGoods: parsePlayerCash(msg); break; case Proto::GameServerCloseNpcTrade: parseCloseShopWindow(msg); break; case Proto::GameServerOwnOffer: parseSafeTradeRequest(msg); break; case Proto::GameServerCounterOffer: parseSafeTradeRequest(msg); break; case Proto::GameServerCloseTrade: parseSafeTradeClose(msg); break; case Proto::GameServerAmbient: parseWorldLight(msg); break; case Proto::GameServerGraphicalEffect: parseMagicEffect(msg); break; case Proto::GameServerTextEffect: parseAnimatedText(msg); break; case Proto::GameServerMissleEffect: parseDistanceMissile(msg); break; case Proto::GameServerMarkCreature: parseCreatureSquare(msg); break; //case Proto::GameServerTrappers case Proto::GameServerCreatureHealth: parseCreatureHealth(msg); break; case Proto::GameServerCreatureLight: parseCreatureLight(msg); break; case Proto::GameServerCreatureOutfit: parseCreatureOutfit(msg); break; case Proto::GameServerCreatureSpeed: parseCreatureSpeed(msg); break; case Proto::GameServerCreatureSkull: parseCreatureSkulls(msg); break; case Proto::GameServerCreatureParty: parseCreatureShields(msg); break; // case Proto::GameServerCreatureUnpass case Proto::GameServerEditText: parseItemTextWindow(msg); break; case Proto::GameServerEditList: parseHouseTextWindow(msg); break; case Proto::GameServerPlayerData: parsePlayerStats(msg); break; case Proto::GameServerPlayerSkills: parsePlayerSkills(msg); break; case Proto::GameServerPlayerState: parsePlayerIcons(msg); break; case Proto::GameServerClearTarget: parsePlayerCancelAttack(msg); break; //case Proto::GameServerSpellDelay: //case Proto::GameServerSpellGroupDelay: case Proto::GameServerTalk: parseCreatureSpeak(msg); break; case Proto::GameServerChannels: parseChannelList(msg); break; case Proto::GameServerOpenChannel: parseOpenChannel(msg); break; case Proto::GameServerPrivateChannel: parseOpenPrivatePlayerChat(msg); break; case Proto::GameServerRuleViolationChannel: msg.getU16(); break; case Proto::GameServerRuleViolationRemove: msg.getString(); break; case Proto::GameServerRuleViolationCancel: msg.getString(); break; case Proto::GameServerRuleViolationLock: break; case Proto::GameServerOpenOwnChannel: parseCreatePrivateChannel(msg); break; case Proto::GameServerCloseChannel: parseClosePrivateChannel(msg); break; case Proto::GameServerMessage: parseTextMessage(msg); break; case Proto::GameServerSnapBack: parseCancelWalk(msg); break; //case Proto::GameServerWait: case Proto::GameServerTopFloor: parseFloorChangeUp(msg); break; case Proto::GameServerBottomFloor: parseFloorChangeDown(msg); break; case Proto::GameServerOutfit: parseOutfitWindow(msg); break; case Proto::GameServerBuddyData: parseVipState(msg); break; case Proto::GameServerBuddyLogin: parseVipLogin(msg); break; case Proto::GameServerBuddyLogout: parseVipLogout(msg); break; case Proto::GameServerTutorialHint: parseShowTutorial(msg); break; case Proto::GameServerAutomapFlag: parseAddMarker(msg); break; case Proto::GameServerQuestLog: parseQuestList(msg); break; case Proto::GameServerQuestLine: parseQuestPartList(msg); break; //case Proto::GameServerChannelEvent: //case Proto::GameServerObjectInfo: //case Proto::GameServerPlayerInventory: default: Fw::throwException("unknown opt byte ", (int)opt); break; } } } catch(Exception& e) { logTraceError(e.what()); } }