예제 #1
0
파일: color.cpp 프로젝트: sfiera/antares
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);
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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);
    }
}
예제 #5
0
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);
}
예제 #6
0
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;
}
예제 #7
0
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);
}
예제 #8
0
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);
        }
    }
}
예제 #9
0
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);
}
예제 #10
0
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;
    }
}
예제 #11
0
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;
    }
}
예제 #12
0
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;
    }
}
예제 #13
0
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);
    }
}