void read_from(ReadSource in, RgbColor& color) { in.shift(2); read(in, color.red); in.shift(3); read(in, color.green); in.shift(3); read(in, color.blue); in.shift(1); }
void read_from(ReadSource in, Level::Player& level_player) { read(in, level_player.playerType); read(in, level_player.playerRace); read(in, level_player.nameResID); read(in, level_player.nameStrNum); in.shift(4); read(in, level_player.earningPower); read(in, level_player.netRaceFlags); in.shift(2); }
void read_from(ReadSource in, argumentType::PlaySound& argument) { read(in, argument.priority); in.shift(1); read(in, argument.persistence); read(in, argument.absolute); in.shift(1); read(in, argument.volumeMinimum); read(in, argument.volumeRange); read(in, argument.idMinimum); read(in, argument.idRange); }
void PixMap::read_direct_image(ReadSource in, unique_ptr<RasterImage>& image) const { if (pixel_type != RGB_DIRECT) { throw Exception("image is not direct"); } if (pack_type != 4) { throw Exception(format("unsupported pack_type {0}", pack_type)); } image.reset(new RasterImage(bounds)); if (row_bytes == 0) { return; } size_t bytes_read = 0; for (int y = 0; y < bounds.height(); ++y) { Bytes bytes; if (row_bytes <= 250) { bytes.resize(read<uint8_t>(in)); bytes_read += 1; } else { bytes.resize(read<uint16_t>(in)); bytes_read += 2; } in.shift(bytes.data(), bytes.size()); bytes_read += bytes.size(); BytesSlice remainder(bytes); Bytes components; while (!remainder.empty()) { uint8_t header = read<uint8_t>(remainder); if (header >= 0x80) { components.push(0x101 - header, read<uint8_t>(remainder)); } else { size_t size = header + 1; components.push(size, '\0'); uint8_t* data = components.data() + components.size() - size; remainder.shift(data, size); } } const int16_t w = bounds.width(); const BytesSlice red = components.slice((cmp_count - 3) * w, w); const BytesSlice green = components.slice((cmp_count - 2) * w, w); const BytesSlice blue = components.slice((cmp_count - 1) * w); for (int x = 0; x < w; ++x) { image->set(x, y, AlphaColor(red.at(x), green.at(x), blue.at(x))); } } if ((bytes_read % 2) != 0) { in.shift(1); } }
void read_from(ReadSource in, Race& race) { read(in, race.id); read(in, race.apparentColor); in.shift(1); read(in, race.illegalColors); read(in, race.advantage); }
void read_from(ReadSource in, Level& level) { read(in, level.netRaceFlags); read(in, level.playerNum); read(in, level.player, kMaxPlayerNum); read(in, level.scoreStringResID); read(in, level.initialFirst); read(in, level.prologueID); read(in, level.initialNum); read(in, level.songID); read(in, level.conditionFirst); read(in, level.epilogueID); read(in, level.conditionNum); read(in, level.starMapH); read(in, level.briefPointFirst); read(in, level.starMapV); read(in, level.briefPointNum); level.parTime = game_ticks(secs(read<int16_t>(in))); in.shift(2); read(in, level.parKills); read(in, level.levelNameStrNum); read(in, level.parKillRatio); read(in, level.parLosses); int16_t start_time = read<int16_t>(in); level.startTime = secs(start_time & kLevel_StartTimeMask); level.is_training = start_time & kLevel_IsTraining_Bit; }
void read_from(ReadSource in, scenarioInfoType& scenario_info) { scenario_info.warpInFlareID = Handle<BaseObject>(read<int32_t>(in)); scenario_info.warpOutFlareID = Handle<BaseObject>(read<int32_t>(in)); scenario_info.playerBodyID = Handle<BaseObject>(read<int32_t>(in)); scenario_info.energyBlobID = Handle<BaseObject>(read<int32_t>(in)); read_pstr(in, scenario_info.downloadURLString); read_pstr(in, scenario_info.titleString); read_pstr(in, scenario_info.authorNameString); read_pstr(in, scenario_info.authorURLString); read(in, scenario_info.version); in.shift(12); }
void BitMap::read_image( ReadSource in, AlphaColor on, AlphaColor off, unique_ptr<RasterImage>& image) const { image.reset(new RasterImage(bounds)); if (row_bytes == 0) { return; } Bytes bytes(row_bytes, '\0'); for (int y = 0; y < bounds.height(); ++y) { in.shift(bytes.data(), bytes.size()); BitsSlice bits(bytes); for (int x = 0; x < bounds.width(); ++x) { uint8_t value; bits.shift(&value, 1); image->set(x + bounds.left, y + bounds.top, value ? on : off); } } }
void read_from(ReadSource in, Level::InitialObject& level_initial) { level_initial.type = Handle<BaseObject>(read<int32_t>(in)); level_initial.owner = Handle<Admiral>(read<int32_t>(in)); in.shift(4); level_initial.realObject = Handle<SpaceObject>(-1); read(in, level_initial.realObjectID); read(in, level_initial.location); read(in, level_initial.earning); read(in, level_initial.distanceRange); read(in, level_initial.rotationMinimum); read(in, level_initial.rotationRange); read(in, level_initial.spriteIDOverride); read(in, level_initial.canBuild, kMaxTypeBaseCanBuild); read(in, level_initial.initialDestination); read(in, level_initial.nameResID); read(in, level_initial.nameStrNum); read(in, level_initial.attributes); }
void read_from(ReadSource in, Level::Condition& level_condition) { uint8_t section[12]; read(in, level_condition.condition); in.shift(1); read(in, section, 12); read(in, level_condition.subjectObject); read(in, level_condition.directObject); read_action(in, level_condition); read(in, level_condition.flags); read(in, level_condition.direction); BytesSlice sub(section, 12); switch (level_condition.condition) { case kCounterCondition: case kCounterGreaterCondition: case kCounterNotCondition: read(sub, level_condition.conditionArgument.counter); break; case kDestructionCondition: case kOwnerCondition: case kNoShipsLeftCondition: case kZoomLevelCondition: read(sub, level_condition.conditionArgument.longValue); break; case kVelocityLessThanEqualToCondition: read(sub, level_condition.conditionArgument.fixedValue); case kTimeCondition: level_condition.conditionArgument.timeValue = ticks(read<int32_t>(sub)); break; case kProximityCondition: case kDistanceGreaterCondition: read(sub, level_condition.conditionArgument.unsignedLongValue); break; case kCurrentMessageCondition: case kCurrentComputerCondition: read(sub, level_condition.conditionArgument.location); break; } }
void read_from(ReadSource in, Level::BriefPoint& brief_point) { uint8_t section[8]; read(in, brief_point.briefPointKind); in.shift(1); read(in, section, 8); read(in, brief_point.range); read(in, brief_point.titleResID); read(in, brief_point.titleNum); read(in, brief_point.contentResID); BytesSlice sub(section, 8); switch (brief_point.briefPointKind) { case kNoPointKind: case kBriefFreestandingKind: break; case kBriefObjectKind: read(sub, brief_point.briefPointData.objectBriefType); break; case kBriefAbsoluteKind: read(sub, brief_point.briefPointData.absoluteBriefType); break; } }
void read_from(ReadSource in, objectActionType& action) { uint8_t section[24]; read(in, action.verb); read(in, action.reflexive); read(in, action.inclusiveFilter); read(in, action.exclusiveFilter); read(in, action.owner); read(in, action.delay); read(in, action.initialSubjectOverride); read(in, action.initialDirectOverride); in.shift(4); read(in, section, 24); BytesSlice sub(BytesSlice(section, 24)); switch (action.verb) { case kNoAction: case kSetDestination: case kActivateSpecial: case kActivatePulse: case kActivateBeam: case kNilTarget: break; case kCreateObject: case kCreateObjectSetDest: read(sub, action.argument.createObject); break; case kPlaySound: read(sub, action.argument.playSound); break; case kAlter: read(sub, action.argument.alterObject); break; case kMakeSparks: read(sub, action.argument.makeSparks); break; case kReleaseEnergy: read(sub, action.argument.releaseEnergy); break; case kLandAt: read(sub, action.argument.landAt); break; case kEnterWarp: read(sub, action.argument.enterWarp); break; case kDisplayMessage: read(sub, action.argument.displayMessage); break; case kChangeScore: read(sub, action.argument.changeScore); break; case kDeclareWinner: read(sub, action.argument.declareWinner); break; case kDie: read(sub, action.argument.killObject); break; case kColorFlash: read(sub, action.argument.colorFlash); break; case kDisableKeys: case kEnableKeys: read(sub, action.argument.keys); break; case kSetZoom: read(sub, action.argument.zoom); break; case kComputerSelect: read(sub, action.argument.computerSelect); break; case kAssumeInitialObject: read(sub, action.argument.assumeInitial); break; } }
void read_from(ReadSource in, baseObjectType& object) { uint8_t section[32]; read(in, object.attributes); if ((object.attributes & kIsSelfAnimated) && (object.attributes & kShapeFromDirection)) { object.attributes ^= kShapeFromDirection; } read(in, object.baseClass); read(in, object.baseRace); read(in, object.price); read(in, object.offenseValue); read(in, object.destinationClass); read(in, object.maxVelocity); read(in, object.warpSpeed); read(in, object.warpOutDistance); read(in, object.initialVelocity); read(in, object.initialVelocityRange); read(in, object.mass); read(in, object.maxThrust); read(in, object.health); read(in, object.damage); read(in, object.energy); read(in, object.initialAge); read(in, object.initialAgeRange); read(in, object.naturalScale); read(in, object.pixLayer); read(in, object.pixResID); read(in, object.tinySize); read(in, object.shieldColor); in.shift(1); read(in, object.initialDirection); read(in, object.initialDirectionRange); read(in, object.pulse); read(in, object.beam); read(in, object.special); read(in, object.pulsePositionNum); read(in, object.beamPositionNum); read(in, object.specialPositionNum); read(in, object.pulsePosition, kMaxWeaponPosition); read(in, object.beamPosition, kMaxWeaponPosition); read(in, object.specialPosition, kMaxWeaponPosition); read(in, object.friendDefecit); read(in, object.dangerThreshold); read(in, object.specialDirection); read(in, object.arriveActionDistance); read(in, object.destroyAction); read(in, object.destroyActionNum); read(in, object.expireAction); read(in, object.expireActionNum); read(in, object.createAction); read(in, object.createActionNum); read(in, object.collideAction); read(in, object.collideActionNum); read(in, object.activateAction); read(in, object.activateActionNum); read(in, object.arriveAction); read(in, object.arriveActionNum); read(in, section, 32); read(in, object.buildFlags); read(in, object.orderFlags); read(in, object.buildRatio); read(in, object.buildTime); read(in, object.skillNum); read(in, object.skillDen); read(in, object.skillNumAdj); read(in, object.skillDenAdj); read(in, object.pictPortraitResID); in.shift(6); read(in, object.internalFlags); BytesSlice sub(BytesSlice(section, 32)); if (object.attributes & kShapeFromDirection) { read(sub, object.frame.rotation); } else if (object.attributes & kIsSelfAnimated) { read(sub, object.frame.animation); } else if (object.attributes & kIsBeam) { read(sub, object.frame.beam); } else { read(sub, object.frame.weapon); } }