Skip to content

Missing zCTouchDamage VOb #101

@lmichaelis

Description

@lmichaelis

ZenKit currently only implement oCTouchDamage but not its base zCTouchDamage on its own. This is an issue, because zCTouchDamage on its own only contains one damage type ("default") and none of the others, which causes parsing to fail if it's just substituted with oCTouchDamage.

  • See zCTouchDamage
  • See oCTouchDamage
  • See

    ZenKit/src/Archive.cc

    Lines 255 to 529 in c3d9975

    std::shared_ptr<Object> ReadArchive::read_object(GameVersion version) {
    ArchiveObject obj;
    if (!this->read_object_begin(obj)) {
    ZKLOGE("ReadArchive", "Expected object, got entry.");
    return nullptr;
    }
    if (obj.class_name == "\xA7") {
    if (!this->read_object_end()) {
    ZKLOGE("ReadArchive", "Invalid reference object: has children");
    this->skip_object(true);
    }
    auto cached = _m_cache.find(obj.index);
    if (cached == _m_cache.end()) {
    ZKLOGW("ReadArchive", "Unresolved reference: %d", obj.index);
    return nullptr;
    }
    return cached->second;
    }
    if (obj.class_name == "%") {
    // This object is marked as "Empty"
    this->skip_object(true);
    return nullptr;
    }
    auto it = OBJECTS.find(obj.class_name);
    auto type = ObjectType::unknown;
    if (it != OBJECTS.end()) {
    type = it->second;
    }
    std::shared_ptr<Object> syn;
    switch (type) {
    case ObjectType::oCNpcTalent:
    syn = std::make_shared<VNpc::Talent>();
    break;
    case ObjectType::zCEventManager:
    syn = std::make_shared<EventManager>();
    break;
    case ObjectType::zCDecal:
    syn = std::make_shared<VisualDecal>();
    break;
    case ObjectType::zCMesh:
    syn = std::make_shared<VisualMesh>();
    break;
    case ObjectType::zCProgMeshProto:
    syn = std::make_shared<VisualMultiResolutionMesh>();
    break;
    case ObjectType::zCParticleFX:
    syn = std::make_shared<VisualParticleEffect>();
    break;
    case ObjectType::zCAICamera:
    syn = std::make_shared<VisualCamera>();
    break;
    case ObjectType::zCModel:
    syn = std::make_shared<VisualModel>();
    break;
    case ObjectType::zCMorphMesh:
    syn = std::make_shared<VisualMorphMesh>();
    break;
    case ObjectType::oCAIHuman:
    syn = std::make_shared<AiHuman>();
    break;
    case ObjectType::oCAIVobMove:
    syn = std::make_shared<AiMove>();
    break;
    case ObjectType::zCSkyControler_Outdoor:
    syn = std::make_shared<SkyController>();
    break;
    case ObjectType::oCCSPlayer:
    syn = std::make_shared<CutscenePlayer>();
    break;
    case ObjectType::zCVobLevelCompo:
    syn = std::make_shared<VLevel>();
    break;
    case ObjectType::zCVobStartpoint:
    syn = std::make_shared<VStartPoint>();
    break;
    case ObjectType::zCVobStair:
    syn = std::make_shared<VStair>();
    break;
    case ObjectType::zCVobSpot:
    syn = std::make_shared<VSpot>();
    break;
    case ObjectType::zCVob:
    syn = std::make_shared<VirtualObject>();
    break;
    case ObjectType::zCVobScreenFX:
    syn = std::make_shared<VScreenEffect>();
    break;
    case ObjectType::zCCSCamera:
    syn = std::make_shared<VCutsceneCamera>();
    break;
    case ObjectType::zCCamTrj_KeyFrame:
    syn = std::make_shared<VCameraTrajectoryFrame>();
    break;
    case ObjectType::zCVobAnimate:
    syn = std::make_shared<VAnimate>();
    break;
    case ObjectType::zCZoneVobFarPlane:
    syn = std::make_shared<VZoneFarPlane>();
    break;
    case ObjectType::zCZoneVobFarPlaneDefault:
    syn = std::make_shared<VZoneFarPlaneDefault>();
    break;
    case ObjectType::zCZoneZFogDefault:
    syn = std::make_shared<VZoneFogDefault>();
    break;
    case ObjectType::zCZoneZFog:
    syn = std::make_shared<VZoneFog>();
    break;
    case ObjectType::zCVobLensFlare:
    syn = std::make_shared<VLensFlare>();
    break;
    case ObjectType::oCItem:
    syn = std::make_shared<VItem>();
    break;
    case ObjectType::zCTrigger:
    syn = std::make_shared<VTrigger>();
    break;
    case ObjectType::oCCSTrigger:
    syn = std::make_shared<VCutsceneTrigger>();
    break;
    case ObjectType::oCMOB:
    syn = std::make_shared<VMovableObject>();
    break;
    case ObjectType::oCMobInter:
    syn = std::make_shared<VInteractiveObject>();
    break;
    case ObjectType::oCMobLadder:
    syn = std::make_shared<VLadder>();
    break;
    case ObjectType::oCMobSwitch:
    syn = std::make_shared<VSwitch>();
    break;
    case ObjectType::oCMobWheel:
    syn = std::make_shared<VWheel>();
    break;
    case ObjectType::oCMobBed:
    syn = std::make_shared<VBed>();
    break;
    case ObjectType::oCMobFire:
    syn = std::make_shared<VFire>();
    break;
    case ObjectType::oCMobContainer:
    syn = std::make_shared<VContainer>();
    break;
    case ObjectType::oCMobDoor:
    syn = std::make_shared<VDoor>();
    break;
    case ObjectType::zCPFXController:
    syn = std::make_shared<VParticleEffectController>();
    break;
    case ObjectType::zCVobLight:
    syn = std::make_shared<VLight>();
    break;
    case ObjectType::zCVobSound:
    syn = std::make_shared<VSound>();
    break;
    case ObjectType::zCVobSoundDaytime:
    syn = std::make_shared<VSoundDaytime>();
    break;
    case ObjectType::oCZoneMusic:
    syn = std::make_shared<VZoneMusic>();
    break;
    case ObjectType::oCZoneMusicDefault:
    syn = std::make_shared<VZoneMusicDefault>();
    break;
    case ObjectType::zCMessageFilter:
    syn = std::make_shared<VMessageFilter>();
    break;
    case ObjectType::zCCodeMaster:
    syn = std::make_shared<VCodeMaster>();
    break;
    case ObjectType::zCTriggerList:
    syn = std::make_shared<VTriggerList>();
    break;
    case ObjectType::oCTriggerScript:
    syn = std::make_shared<VTriggerScript>();
    break;
    case ObjectType::zCMover:
    syn = std::make_shared<VMover>();
    break;
    case ObjectType::oCTriggerChangeLevel:
    syn = std::make_shared<VTriggerChangeLevel>();
    break;
    case ObjectType::zCTriggerWorldStart:
    syn = std::make_shared<VTriggerWorldStart>();
    break;
    case ObjectType::oCTouchDamage:
    syn = std::make_shared<VTouchDamage>();
    break;
    case ObjectType::zCTriggerUntouch:
    syn = std::make_shared<VTriggerUntouch>();
    break;
    case ObjectType::zCEarthquake:
    syn = std::make_shared<VEarthquake>();
    break;
    case ObjectType::zCMoverController:
    syn = std::make_shared<VMoverController>();
    break;
    case ObjectType::oCNpc:
    syn = std::make_shared<VNpc>();
    break;
    case ObjectType::oCWorld:
    syn = std::make_shared<World>();
    break;
    case ObjectType::zCMaterial:
    syn = std::make_shared<Material>();
    break;
    case ObjectType::oCSavegameInfo:
    syn = std::make_shared<SaveMetadata>();
    break;
    case ObjectType::oCCSManager:
    syn = std::make_shared<CutsceneManager>();
    break;
    case ObjectType::zCCSPoolItem:
    syn = std::make_shared<CutscenePoolItem>();
    break;
    case ObjectType::zCCutscene:
    syn = std::make_shared<Cutscene>();
    break;
    case ObjectType::zCCSCutsceneContext:
    syn = std::make_shared<CutsceneContext>();
    break;
    case ObjectType::zCCSBlock:
    syn = std::make_shared<CutsceneBlock>();
    break;
    case ObjectType::zCCSAtomicBlock:
    syn = std::make_shared<CutsceneAtomicBlock>();
    break;
    case ObjectType::zCCSLib:
    syn = std::make_shared<CutsceneLibrary>();
    break;
    case ObjectType::oCMsgConversation:
    syn = std::make_shared<ConversationMessageEvent>();
    break;
    case ObjectType::zCCSProps:
    syn = std::make_shared<CutsceneProps>();
    break;
    #ifdef ZK_FUTURE
    case ObjectType::zCWayNet:
    syn = std::make_shared<WayNet>();
    break;
    case ObjectType::zCWaypoint:
    syn = std::make_shared<WayPoint>();
    break;
    #endif
    default:
    ZKLOGE("ReadArchive", "Unknown object type: %s", obj.class_name.c_str());
    break;
    }
    if (syn != nullptr) {
    // TODO(lmichaelis): The VOb type/id assignment is a hacky workaround! Create separate types!
    if (is_vobject(type)) {
    auto vtype = static_cast<VirtualObjectType>(type);
    reinterpret_cast<VirtualObject*>(syn.get())->type = vtype;
    reinterpret_cast<VirtualObject*>(syn.get())->id = obj.index;
    }
    _m_cache.insert_or_assign(obj.index, syn);
    syn->load(*this, version);
    }
    if (!this->read_object_end()) {
    ZKLOGW("ReadArchive", "Object not fully loaded: %s", obj.class_name.data());
    this->skip_object(true);
    }
    return syn;
    }
  • See

    ZenKit/src/vobs/Misc.cc

    Lines 198 to 228 in c3d9975

    void VTouchDamage::load(ReadArchive& r, GameVersion version) {
    VirtualObject::load(r, version);
    this->damage = r.read_float(); // damage
    this->barrier = r.read_bool(); // Barrier
    this->blunt = r.read_bool(); // Blunt
    this->edge = r.read_bool(); // Edge
    this->fire = r.read_bool(); // Fire
    this->fly = r.read_bool(); // Fly
    this->magic = r.read_bool(); // Magic
    this->point = r.read_bool(); // Point
    this->fall = r.read_bool(); // Fall
    this->repeat_delay_sec = r.read_float(); // damageRepeatDelaySec
    this->volume_scale = r.read_float(); // damageVolDownScale
    this->collision = static_cast<TouchCollisionType>(r.read_enum()); // damageCollType
    }
    void VTouchDamage::save(WriteArchive& w, GameVersion version) const {
    VirtualObject::save(w, version);
    w.write_float("damage", this->damage);
    w.write_bool("Barrier", this->barrier);
    w.write_bool("Blunt", this->blunt);
    w.write_bool("Edge", this->edge);
    w.write_bool("Fire", this->fire);
    w.write_bool("Fly", this->fly);
    w.write_bool("Magic", this->magic);
    w.write_bool("Point", this->point);
    w.write_bool("Fall", this->fall);
    w.write_float("damageRepeatDelaySec", this->repeat_delay_sec);
    w.write_float("damageVolDownScale", this->volume_scale);
    w.write_enum("damageCollType", static_cast<std::uint32_t>(this->collision));
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions