mirror of
https://github.com/DaanVandenBosch/phantasmal-world.git
synced 2025-04-07 16:58:26 +08:00
1 line
533 KiB
Plaintext
1 line
533 KiB
Plaintext
{"version":3,"sources":["ui/ErrorBoundary.tsx","domain/NpcType.ts","domain/ObjectType.ts","enums.ts","domain/index.ts","Loadable.ts","stores/ApplicationStore.ts","stores/ServerMap.ts","stores/HuntMethodStore.ts","stores/ItemStore.ts","stores/ItemDropStore.ts","stores/HuntOptimizerStore.ts","ui/hunt-optimizer/WantedItemsComponent.tsx","ui/dataTable.tsx","ui/time.ts","ui/hunt-optimizer/OptimizationResultComponent.tsx","ui/hunt-optimizer/OptimizerComponent.tsx","ui/hunt-optimizer/MethodsComponent.tsx","ui/hunt-optimizer/HuntOptimizerComponent.tsx","bin-data/ArrayBufferCursor.ts","bin-data/loading/binaryAssets.ts","bin-data/parsing/geometry.ts","bin-data/loading/areas.ts","bin-data/parsing/ninja/nj.ts","bin-data/parsing/ninja/xj.ts","bin-data/parsing/ninja/index.ts","bin-data/loading/entities.ts","bin-data/compression/prs/compress.ts","bin-data/compression/prs/decompress.ts","bin-data/parsing/dat.ts","bin-data/parsing/bin.ts","bin-data/parsing/qst.ts","stores/AreaStore.ts","bin-data/parsing/quest.ts","rendering/entities.ts","rendering/models.ts","stores/QuestEditorStore.ts","ui/quest-editor/EntityInfoComponent.tsx","ui/quest-editor/QuestInfoComponent.tsx","rendering/Renderer.ts","ui/quest-editor/RendererComponent.tsx","ui/quest-editor/QuestEditorComponent.tsx","ui/ApplicationComponent.tsx","index.tsx"],"names":["ErrorBoundary","_React$Component","_getPrototypeOf2","_this","Object","classCallCheck","this","_len","arguments","length","args","Array","_key","possibleConstructorReturn","getPrototypeOf","call","apply","concat","state","hasError","inherits","createClass","key","value","react_default","a","createElement","className","es_alert","type","message","props","children","_error","React","Component","withErrorBoundary","ErrorBoundary_ErrorBoundary","NpcType","id","code","name","simpleName","ultimateName","episode","enemy","rareType","Number","isInteger","Error","map","byEpAndName","set","checkEpisode","get","undefined","Map","Unknown","FemaleFat","FemaleMacho","FemaleTall","MaleDwarf","MaleFat","MaleMacho","MaleOld","BlueSoldier","RedSoldier","Principal","Tekker","GuildLady","Scientist","Nurse","Irene","ItemShop","Nurse2","Hildebear","Hildeblue","RagRappy","AlRappy","Monest","Mothmant","SavageWolf","BarbarousWolf","Booma","Gobooma","Gigobooma","Dragon","GrassAssassin","PoisonLily","NarLily","NanoDragon","EvilShark","PalShark","GuilShark","PofuillySlime","PouillySlime","PanArms","Migium","Hidoom","DeRolLe","Dubchic","Gilchic","Garanz","SinowBeat","SinowGold","Canadine","Canane","Dubswitch","VolOpt","Delsaber","ChaosSorcerer","DarkGunner","DeathGunner","ChaosBringer","DarkBelra","Dimenian","LaDimenian","SoDimenian","Bulclaw","Bulk","Claw","DarkFalz","Hildebear2","Hildeblue2","RagRappy2","LoveRappy","StRappy","HalloRappy","EggRappy","Monest2","Mothmant2","PoisonLily2","NarLily2","GrassAssassin2","Dimenian2","LaDimenian2","SoDimenian2","DarkBelra2","BarbaRay","SavageWolf2","BarbarousWolf2","PanArms2","Migium2","Hidoom2","Dubchic2","Gilchic2","Garanz2","Dubswitch2","Delsaber2","ChaosSorcerer2","GolDragon","SinowBerill","SinowSpigell","Merillia","Meriltas","Mericarol","Mericus","Merikle","UlGibbon","ZolGibbon","Gibbles","Gee","GiGue","GalGryphon","Deldepth","Delbiter","Dolmolm","Dolmdarl","Morfos","Recobox","Recon","Epsilon","SinowZoa","SinowZele","IllGill","DelLily","OlgaFlow","SandRappy","DelRappy","Astark","SatelliteLizard","Yowie","MerissaA","MerissaAA","Girtablulu","Zu","Pazuzu","Boota","ZeBoota","BaBoota","Dorphon","DorphonEclair","Goran","PyroGoran","GoranDetonator","SaintMilion","Shambertin","Kondrieu","EnemyNpcTypes","filter","ObjectType","psoId","PlayerSet","Particle","Teleporter","Warp","LightCollision","Item","EnvSound","FogCollision","EventCollision","CharaCollision","ElementalTrap","StatusTrap","HealTrap","LargeElementalTrap","ObjRoomID","Sensor","UnknownItem16","Lensflare","ScriptCollision","HealRing","MapCollision","ScriptCollisionA","ItemLight","RadarCollision","FogCollisionSW","BossTeleporter","ImageBoard","QuestWarp","Epilogue","UnknownItem29","UnknownItem30","UnknownItem31","BoxDetectObject","SymbolChatObject","TouchPlateObject","TargetableObject","EffectObject","CountDownObject","UnknownItem38","UnknownItem39","UnknownItem40","UnknownItem41","MenuActivation","TelepipeLocation","BGMCollision","MainRagolTeleporter","LobbyTeleporter","PrincipalWarp","ShopDoor","HuntersGuildDoor","TeleporterDoor","MedicalCenterDoor","Elevator","EasterEgg","ValentinesHeart","ChristmasTree","ChristmasWreath","HalloweenPumpkin","TwentyFirstCentury","Sonic","WelcomeBoard","Firework","LobbyScreenDoor","MainRagolTeleporterBattleInNextArea","LabTeleporterDoor","Pioneer2InvisibleTouchplate","ForestDoor","ForestSwitch","LaserFence","LaserSquareFence","ForestLaserFenceSwitch","LightRays","BlueButterfly","Probe","RandomTypeBox1","ForestWeatherStation","Battery","ForestConsole","BlackSlidingDoor","RicoMessagePod","EnergyBarrier","ForestRisingBridge","SwitchNoneDoor","EnemyBoxGrey","FixedTypeBox","EnemyBoxBrown","EmptyTypeBox","LaserFenseEx","LaserSquareFenceEx","FloorPanel1","Caves4ButtonDoor","CavesNormalDoor","CavesSmashingPillar","CavesSign1","CavesSign2","CavesSign3","HexagalTank","BrownPlatform","WarningLightObject","Rainbow","FloatingJelifish","FloatingDragonfly","CavesSwitchDoor","RobotRechargeStation","CavesCakeShop","Caves1SmallRedRock","Caves1MediumRedRock","Caves1LargeRedRock","Caves2SmallRock1","Caves2MediumRock1","Caves2LargeRock1","Caves2SmallRock2","Caves2MediumRock2","Caves2LargeRock2","Caves3SmallRock","Caves3MediumRock","Caves3LargeRock","FloorPanel2","DestructableRockCaves1","DestructableRockCaves2","DestructableRockCaves3","MinesDoor","FloorPanel3","MinesSwitchDoor","LargeCryoTube","ComputerLikeCalus","GreenScreenOpeningAndClosing","FloatingRobot","FloatingBlueLight","SelfDestructingObject1","SelfDestructingObject2","SelfDestructingObject3","SparkMachine","MinesLargeFlashingCrate","RuinsSeal","RuinsTeleporter","RuinsWarpSiteToSite","RuinsSwitch","FloorPanel4","Ruins1Door","Ruins3Door","Ruins2Door","Ruins11ButtonDoor","Ruins21ButtonDoor","Ruins31ButtonDoor","Ruins4ButtonDoor","Ruins2ButtonDoor","RuinsSensor","RuinsFenceSwitch","RuinsLaserFence4x2","RuinsLaserFence6x2","RuinsLaserFence4x4","RuinsLaserFence6x4","RuinsPoisonBlob","RuinsPilarTrap","PopupTrapNoTech","RuinsCrystal","Monument","RuinsRock1","RuinsRock2","RuinsRock3","RuinsRock4","RuinsRock5","RuinsRock6","RuinsRock7","Poison","FixedBoxTypeRuins","RandomBoxTypeRuins","EnemyTypeBoxYellow","EnemyTypeBoxBlue","EmptyTypeBoxBlue","DestructableRock","PopupTrapsTechs","FlyingWhiteBird","Tower","FloatingRocks","FloatingSoul","Butterfly","LobbyGameMenu","LobbyWarpObject","Lobby1EventObjectDefaultTree","UnknownItem387","UnknownItem388","UnknownItem389","LobbyEventObjectStaticPumpkin","LobbyEventObject3ChristmasWindows","LobbyEventObjectRedAndWhiteCurtain","UnknownItem393","UnknownItem394","LobbyFishTank","LobbyEventObjectButterflies","UnknownItem400","GreyWallLow","SpaceshipDoor","GreyWallHigh","TempleNormalDoor","BreakableWallWallButUnbreakable","BrokenCilinderAndRubble","ThreeBrokenWallPiecesOnFloor","HighBrickCilinder","LyingCilinder","BrickConeWithFlatTop","BreakableTempleWall","TempleMapDetect","SmallBrownBrickRisingBridge","LongRisingBridgeWithPinkHighEdges","FourSwitchTempleDoor","FourButtonSpaceshipDoor","ItemBoxCca","TeleporterEp2","CCADoor","SpecialBoxCCA","BigCCADoor","BigCCADoorSwitch","LittleRock","Little3StoneWall","Medium3StoneWall","SpiderPlant","CCAAreaTeleporter","UnknownItem523","WhiteBird","OrangeBird","Saw","LaserDetect","UnknownItem529","UnknownItem530","Seagull","Fish","SeabedDoorWithBlueEdges","SeabedDoorAlwaysOpenNonTriggerable","LittleCryotube","WideGlassWallBreakable","BlueFloatingRobot","RedFloatingRobot","Dolphin","CaptureTrap","VRLink","UnknownItem576","WarpInBarbaRayRoom","UnknownItem672","GeeNest","LabComputerConsole","LabComputerConsoleGreenScreen","ChairYelllowPillow","OrangeWallWithHoleInMiddle","GreyWallWithHoleInMiddle","LongTable","GBAStation","TalkLinkToSupport","InstaWarp","LabInvisibleObject","LabGlassWindowDoor","UnknownItem700","LabCelingWarp","Ep4LightSource","Cacti","BigBrownRock","BreakableBrownRock","UnknownItem832","UnknownItem833","PoisonPlant","UnknownItem897","UnknownItem898","OozingDesertPlant","UnknownItem901","BigBlackRocks","UnknownItem903","UnknownItem904","UnknownItem905","UnknownItem906","FallingRock","DesertPlantHasCollision","DesertFixedTypeBoxBreakableCrystals","UnknownItem910","BeeHive","UnknownItem912","Heat","TopOfSaintMillionEgg","UnknownItem961","enumValues","e","values","numberValues","v","Server","EnumMap","enum_","initialValue","keys","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","err","return","Episode","SectionId","Difficulty","SectionIds","LoadableState","Difficulties","Vec3","x","y","z","Section","_class","position","yAxisRotation","initializerDefineProperty","_descriptor","_descriptor2","Math","sin","cos","applyDecoratedDescriptor","prototype","observable","configurable","enumerable","writable","initializer","computed","getOwnPropertyDescriptor","Quest","_class3","shortDescription","longDescription","questNo","areaVariants","objects","npcs","datUnknowns","binData","_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_descriptor8","_descriptor9","_descriptor10","datUnkowns","QuestEntity","_class5","areaId","sectionId","rotation","_descriptor11","_sectionId","_descriptor12","_descriptor13","_descriptor14","object3d","section","_this$position","relX","relY","relZ","sinYAxisRotation","cosYAxisRotation","sectPos","rotZ","QuestObject","_class7","_QuestEntity","dat","_descriptor15","assertThisInitialized","QuestNpc","_class9","_QuestEntity2","_this2","_descriptor16","Area","order","AreaVariant","_class11","area","_descriptor17","EnemyDrop","item","anythingRate","rareRate","rate","HuntMethod","time","quest","enemies","enemyCounts","npc","SimpleQuest","SimpleNpc","applicationStore","Ephinea","Loadable","Loadable_class","load","Loadable_descriptor","Loadable_descriptor2","Loadable_descriptor3","_load","Loadable_descriptor4","_value","loadValue","_loadValue","asyncToGenerator","regenerator_default","mark","_callee","wrap","_context","prev","isLoading","abrupt","_promise","_state","Initializing","sent","Nominal","t0","stop","Uninitialized","defer","Reloading","Promise","resolve","ServerMap","ServerMap_class","_EnumMap","currentServer","huntMethodStore","server","fetch","process","toLowerCase","response","text","data","rows","split","line","npcTypeByIndex","slice","i","byNameAndEpisode","parseInt","row","questName","parseFloat","flatMap","cell","cellI","amount","push","console","error","loadHuntMethods","itemStore","itemMap","dedupItem","json","_ref","_this3","loadItems","EnemyDropTable","difficulty","npcType","drop","itemDropStore","loadEnemyDrops","drops","dropDto","setDrop","dropRate","finish","WantedItem","HuntOptimizerStore_class","HuntOptimizerStore_descriptor","HuntOptimizerStore_descriptor2","OptimizationResult","methodName","methodTime","runs","itemCounts","totalTime","huntOptimizerStore","HuntOptimizerStore","HuntOptimizerStore_descriptor3","HuntOptimizerStore_descriptor4","initialize","loadFromLocalStorage","autorun","storeInLocalStorage","_callee2","wantedItemsJson","items","wi","wantedItems","_loop","_context2","localStorage","getItem","current","promise","JSON","parse","_ref3","itemName","find","replace","setItem","stringify","_ref4","optimize","_callee3","methods","dropTable","constraints","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_iterator2","_step2","wanted","variables","variableDetails","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_method2","counts","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","_count","rareCount","countsList","panArmsCount","panArms2Count","splitCounts","_counts","splitPanArms","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","diff","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_iterator7","_step7","_sectionId2","variable","addVariable","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","_ref14","_ref13","count","result","_context3","results","splice","enemyDrops","min","Set","w","method","t1","delete","entries","slicedToArray","getDrop","has","t2","t3","t4","t5","solver","Solve","opType","runInAction","feasible","_i","_Object$entries","_ref8","_ref7","variableName","runsOrOther","details","_i2","_Object$entries2","_ref11","_ref10","expectedValue","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","array","WantedItemsComponent","observer","WantedItemsComponent_class","addWanted","removeWanted","findIndex","tableRemoveCellRenderer","rowData","es_button","icon","onClick","es_select","showSearch","placeholder","optionFilterProp","style","width","filterOption","onChange","Option","marginLeft","es","_ref2","height","headerHeight","rowHeight","rowCount","rowGetter","index","label","dataKey","cellRenderer","WantedItemsComponent_WantedAmountCell","wantedItem","flexGrow","cellDataGetter","_ref5","WantedAmountCell","wantedAmountChanged","input_number","max","size","DataTable","columnWidth","columns","title","columnIndex","rowIndex","column","classes","footer","footerValue","footerTooltip","record","cellValue","tooltip","join","fixedRowCount","columnCount","fixedColumnCount","classNameTopLeftGrid","classNameTopRightGrid","hoursToString","hours","h","floor","m","round","toString","padStart","OptimizationResultComponent","_class2","dataTable_DataTable","totalRuns","toFixed","r","add","totalCount","reduce","acc","OptimizationResultComponent_class","OptimizerComponent","WantedItemsComponent_WantedItemsComponent","OptimizationResultComponent_OptimizationResultComponent","MethodsComponent","MethodsComponent_temp","MethodsComponent_class2","MethodsComponent_class","TabPane","tabs","ASCII_DECODER","TextDecoder","UTF_16BE_DECODER","UTF_16LE_DECODER","ASCII_ENCODER","TextEncoder","UTF_16BE_ENCODER","UTF_16LE_ENCODER","ArrayBufferCursor","bufferOrCapacity","littleEndian","_size","buffer","dv","uint8Array","utf16Decoder","utf16Encoder","ArrayBuffer","byteLength","DataView","Uint8Array","ensureCapacity","offset","seekStart","getUint8","getUint16","getUint32","getInt16","getInt32","getFloat32","n","maxByteLength","nullTerminated","dropRemaining","string_length","indexOfU8","decode","stringLength","indexOfU16","setUint8","setUint16","setUint32","setInt32","setFloat32","other","str","encode","byte","writeU8","maxPos","minNewSize","capacity","newSize","newBuffer","url","npcTypeToUrl","getAsset","objectType","objectTypeToUrl","bufferCache","then","arrayBuffer","areaBaseNames","getAreaAsset","areaVariant","episodeBaseNames","_episodeBaseNames$are","baseName","variants","variant","String","areaVersionToBaseUrl","reject","parseCRel","object","Object3D","materials","MeshBasicMaterial","color","transparent","opacity","MeshLambertMaterial","side","DoubleSide","wireframeMaterials","wireframe","mainBlockOffset","mainOffsetTableOffset","blockGeometry","Geometry","blockTrailerOffset","vertexCount","vertexTableOffset","vertexTableEnd","triangleCount","triangleTableOffset","triangleTableEnd","j","vertices","Vector3","v1","v2","v3","flags","colorIndex","faces","Face3","mesh","Mesh","renderOrder","wireframeMesh","parseNRel","sections","sectionCount","sectionTableOffset","sectionX","sectionY","sectionZ","sectionRotation","PI","indexListsList","positionListsList","normalListsList","simpleGeometryOffsetTableOffset","simpleGeometryOffsetCount","geometryOffset","vertexInfoTableOffset","vertexInfoCount","triangleStripTableOffset","triangleStripCount","geomIndexLists","k","triangleStripIndexTableOffset","triangleStripIndexCount","triangleStripIndices","l","warn","vertexSize","geomPositions","geomNormals","nX","nY","nZ","rotatedX","rotatedZ","_loop2","positions","normals","forEach","objectIndices","geometry","BufferGeometry","addAttribute","BufferAttribute","Float32Array","setIndex","Uint16Array","setDrawMode","TriangleStripDrawMode","userData","toConsumableArray","sort","b","sectionsCache","renderGeometryCache","collisionGeometryCache","getAreaSections","getAreaSectionsAndRenderGeometry","getAreaCollisionGeometry","areaVersion","getAreaCollisionData","getAreaRenderData","catch","parseChunks","cursor","cachedChunkOffsets","wideEndChunks","chunks","loop","chunkTypeId","u8","chunkStartPosition","chunkType","chunkSubType","storeIndex","u16","parseChunkVertex","parseChunkTriangleStrip","vertex","f32","seek","normal","options","userOffsetAndStripCount","userFlagsSize","stripCount","_options","_options2","parseTextureCoords","parseColor","parseNormal","parseTextureCoordsHires","strips","windingFlagAndIndexCount","i16","clockwiseWinding","indexCount","abs","indices","parseTriangleStripList","triangleStripListOffset","indexOffset","indexListOffset","u32","stripIndices","u16Array","clockwise","c","pa","pb","pc","na","nb","nc","clone","sub","cross","negate","dot","parseNj","parseNinja","parseXj","format","bytesLeft","iffTypeId","stringAscii","iffChunkSize","parseNjcm","take","context","parseSiblingObjects","parentMatrix","evalFlags","noTranslate","noRotate","noScale","hidden","breakChildTrace","zxyRotationOrder","modelOffset","posX","posY","posZ","rotationX","i32","rotationY","rotationZ","scaleX","scaleY","scaleZ","childOffset","siblingOffset","Euler","matrix","Matrix4","compose","Quaternion","setFromEuler","premultiply","vlistOffset","plistOffset","normalMatrix","Matrix3","getNormalMatrix","chunk","chunkVertices","construct","applyMatrix4","applyMatrix3","parseNjModel","vertexInfoListOffset","triangleStripListAOffset","triangleStripACount","triangleStripListBOffset","triangleStripBCount","vertexListOffset","parseXjModel","parseModel","createBufferGeometry","npcCache","objectCache","getNpcGeometry","_x","_getNpcData","getNpcData","endsWith","getObjectGeometry","_x2","_getObjectData","getObjectData","compress","src","ctx","Context","hashTable","HashTable","setBit","copyLiteral","put","hash","_ctx$findLongestMatch","findLongestMatch","_ctx$findLongestMatch2","mlen","_ctx$findLongestMatch3","_ctx$findLongestMatch4","offset2","mlen2","writeLiteral","addIntermediates","writeEof","dst","MAX_WINDOW","WINDOW_MASK","HASH_SIZE","flagBitsLeft","flagOffset","bit","pos","writeFinalFlags","s2","uint8ArrayView","len","s1","lazy","entry","hashToOffset","longestLength","longestMatch","matchLength","entry2","setPrev","fill","maskedOffsetToPrev","prevOffset","decompress","readFlagBit","copyU8","readU8","readU16","offsetCopy","bufSize","buf","writeCursor","OBJECT_SIZE","NPC_SIZE","parseBin","objectCodeOffset","functionOffsetTableOffset","questNumber","language","stringUtf16","functionOffsetCount","functionOffsets","instructions","mainOpcode","opcode","opsize","list","F8opcodeList","F9opcodeList","opcodeList","_list$opcode","mnemonic","mask","opargs","parseInstructionArguments","toUpperCase","parseObjectCode","oldPos","outer","charAt","parseQst","version","versionA","versionB","headers","fileName","fileName2","parseHeaders","files","expectedSizes","startPosition","chunkNo","file","expectedSize","chunkNos","chunkPosition","from","actualSize","ceil","parseFiles","header","name2","writeQst","params","totalSize","f","writeU16","writeStringAscii","writeU32","dotPos","lastIndexOf","writeFileHeaders","writeFileChunk","writeFileChunks","writeU8Array","_area$areaVariants","varis","_","areaStore","AreaStore","areas","variantId","parseQuest","qst","datFile","binFile","objs","unknowns","entityType","entitiesSize","objectCount","typeId","unknown1","u8Array","unknown2","unknown3","unknown","bytesRead","npcCount","skin","unknown4","parseDat","prs","bin","func0Ops","operations","funcOffset","funcFound","funcOps","operation","getFuncOperations","bbMaps","op","bbMap","getVariant","getAreaVariants","setEpisode","getEpisode","objData","_objData$position","rot","fromPsoId","npcData","_npcData$position","regular","getNpcType","parseNpcData","writeQuestQst","groupedObjs","groupBy","obj","objAreaIds","areaObjs","writeF32","writeI32","groupedNpcs","npcAreaIds","areaNpcs","writeDat","sectionPosition","typeData","npcTypeToDatData","extStart","baseFileName","OBJECT_COLOR","NPC_COLOR","createObjectMesh","createMesh","createNpcMesh","entity","_entity$position","createModelMesh","questEditorStore","setModel","action","model","resetModelAndQuestState","currentModel","setQuest","currentQuest","currentArea","setSelectedEntity","selectedEntity","setCurrentAreaId","loadFile","reader","FileReader","addEventListener","loadend","readAsArrayBuffer","_geometry","o","setSectionOnVisibleQuestEntity","delegateYield","_section$position","secX","secY","secZ","rotX","s","saveCurrentQuestToFile","document","href","URL","createObjectURL","Blob","download","body","appendChild","click","revokeObjectURL","removeChild","EntityInfoComponent","EntityInfoComponent_class","colSpan","EntityInfoComponent_CoordRow","positionType","coord","CoordRow","changed","posType","precision","QuestInfoComponent","npcCounts","val","extraCanadines","npcCountRows","extra","renderer","OrbitControls","OrbitControlsCreator","THREE","Renderer","WebGLRenderer","antialias","camera","controls","raycaster","Raycaster","scene","Scene","questEntitiesLoaded","collisionGeometry","renderGeometry","objGeometry","npcGeometry","hoveredData","selectedData","renderLoop","update","addLoadedEntities","render","requestAnimationFrame","onMouseDown","oldSelectedData","pickEntity","pointerPosToDeviceCoords","material","getColor","manipulating","enabled","onMouseUp","onMouseMove","pointerPos","buttons","shiftKey","setFromCamera","ray","negativeWorldDir","getWorldDirection","plane","Plane","setFromNormalAndCoplanarPoint","normalize","grabOffset","intersectionPoint","intersectPlane","yDelta","dragY","dragAdjust","_this$pickTerrain","pickTerrain","intersection","point","oldData","domElement","PerspectiveCamera","mouseButtons","ORBIT","MOUSE","RIGHT","PAN","LEFT","background","Color","HemisphereLight","setSize","aspect","updateProjectionMatrix","clear","updateGeometry","remove","setQuestAndArea","resetCamera","getAreaRenderGeometry","reset","lookAt","loaded","coords","Vector2","getSize","offsetX","offsetY","_this$raycaster$inter","intersectObjects","nearestObject","_this$raycaster$inter3","nearestNpc","distance","Infinity","_this$raycaster$inter5","terrain","origin","terrains","face","setY","renderTerrains","rt","isNpc","RendererComponent","modifyDom","div","clientWidth","clientHeight","onResize","wrapperDiv","parentNode","overflow","ref","window","removeEventListener","QuestEditorComponent","QuestEditorComponent_class","saveDialogOpen","saveDialogFilename","saveAsClicked","filename","setState","saveDialogFilenameChanged","saveDialogAffirmed","saveDialogCancelled","QuestEditorComponent_Toolbar","onSaveAsClicked","QuestInfoComponent_QuestInfoComponent","RendererComponent_RendererComponent","EntityInfoComponent_EntityInfoComponent","QuestEditorComponent_SaveAsForm","isOpen","onFilenameChange","onOk","onCancel","Toolbar","setFilename","info","originFileObj","upload","accept","showUploadList","SaveAsForm","nameChanged","currentTarget","modal","Fragment","visible","es_form","layout","input","autoFocus","maxLength","QuestEditor","HuntOptimizer","tab","OptimizerComponent_OptimizerComponent","MethodsComponent_MethodsComponent","ApplicationComponent","ApplicationComponent_class","tool","menuClicked","toolComponent","menu","selectedKeys","mode","ReactDOM","ApplicationComponent_ApplicationComponent","getElementById"],"mappings":"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CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,OCz9Bf,SAASY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","file":"static/js/main.08895bb3.chunk.js","sourcesContent":["import { Alert } from 'antd';\r\nimport React from 'react';\r\nimport './ErrorBoundary.css';\r\n\r\nexport class ErrorBoundary extends React.Component {\r\n state = {\r\n hasError: false\r\n };\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return (\r\n <div className=\"ErrorBoundary-error\">\r\n <div>\r\n <Alert type=\"error\" message=\"Something went wrong.\" />\r\n </div>\r\n </div>\r\n );\r\n } else {\r\n return this.props.children;\r\n }\r\n }\r\n\r\n static getDerivedStateFromError(_error: any) {\r\n return { hasError: true };\r\n }\r\n}\r\n\r\nexport function withErrorBoundary(Component: React.ComponentType) {\r\n return () => <ErrorBoundary><Component /></ErrorBoundary>;\r\n}\r\n","import { Episode, checkEpisode } from \".\";\r\n\r\nexport class NpcType {\r\n readonly id: number;\r\n readonly code: string;\r\n /**\r\n * Unique name. E.g. a Delsaber would have (Ep. II) appended to its name.\r\n */\r\n readonly name: string;\r\n /**\r\n * Name used in the game.\r\n * Might conflict with other NPC names (e.g. Delsaber from ep. I and ep. II).\r\n */\r\n readonly simpleName: string;\r\n readonly ultimateName: string;\r\n readonly episode?: number;\r\n readonly enemy: boolean;\r\n rareType?: NpcType;\r\n\r\n constructor(\r\n id: number,\r\n code: string,\r\n name: string,\r\n simpleName: string,\r\n ultimateName: string,\r\n episode: number | undefined,\r\n enemy: boolean\r\n ) {\r\n if (!Number.isInteger(id) || id < 1)\r\n throw new Error(`Expected id to be an integer greater than or equal to 1, got ${id}.`);\r\n if (!code) throw new Error('code is required.');\r\n if (!name) throw new Error('name is required.');\r\n if (!simpleName) throw new Error('simpleName is required.');\r\n if (!ultimateName) throw new Error('ultimateName is required.');\r\n if (episode != null && episode !== 1 && episode !== 2 && episode !== 4)\r\n throw new Error(`episode should be undefined, 1, 2 or 4, got ${episode}.`);\r\n if (typeof enemy !== 'boolean') throw new Error('enemy is required.');\r\n\r\n this.id = id;\r\n this.code = code;\r\n this.simpleName = simpleName;\r\n this.ultimateName = ultimateName;\r\n this.name = name;\r\n this.episode = episode;\r\n this.enemy = enemy;\r\n\r\n if (episode) {\r\n const map = NpcType.byEpAndName[episode];\r\n\r\n if (map) {\r\n map.set(simpleName, this);\r\n map.set(ultimateName, this);\r\n }\r\n }\r\n }\r\n\r\n private static byEpAndName = [\r\n undefined, new Map<string, NpcType>(), new Map<string, NpcType>(), undefined, new Map<string, NpcType>()\r\n ];\r\n\r\n /**\r\n * Uniquely identifies an NPC. Tries to match on simpleName and ultimateName.\r\n */\r\n static byNameAndEpisode(name: string, episode: Episode): NpcType | undefined {\r\n checkEpisode(episode);\r\n return this.byEpAndName[episode]!.get(name);\r\n }\r\n\r\n //\r\n // Unknown NPCs\r\n //\r\n\r\n static Unknown: NpcType;\r\n\r\n //\r\n // Friendly NPCs\r\n //\r\n\r\n static FemaleFat: NpcType;\r\n static FemaleMacho: NpcType;\r\n static FemaleTall: NpcType;\r\n static MaleDwarf: NpcType;\r\n static MaleFat: NpcType;\r\n static MaleMacho: NpcType;\r\n static MaleOld: NpcType;\r\n static BlueSoldier: NpcType;\r\n static RedSoldier: NpcType;\r\n static Principal: NpcType;\r\n static Tekker: NpcType;\r\n static GuildLady: NpcType;\r\n static Scientist: NpcType;\r\n static Nurse: NpcType;\r\n static Irene: NpcType;\r\n static ItemShop: NpcType;\r\n static Nurse2: NpcType;\r\n\r\n //\r\n // Enemy NPCs\r\n //\r\n\r\n // Episode I Forest\r\n\r\n static Hildebear: NpcType;\r\n static Hildeblue: NpcType;\r\n static RagRappy: NpcType;\r\n static AlRappy: NpcType;\r\n static Monest: NpcType;\r\n static Mothmant: NpcType;\r\n static SavageWolf: NpcType;\r\n static BarbarousWolf: NpcType;\r\n static Booma: NpcType;\r\n static Gobooma: NpcType;\r\n static Gigobooma: NpcType;\r\n static Dragon: NpcType;\r\n\r\n // Episode I Caves\r\n\r\n static GrassAssassin: NpcType;\r\n static PoisonLily: NpcType;\r\n static NarLily: NpcType;\r\n static NanoDragon: NpcType;\r\n static EvilShark: NpcType;\r\n static PalShark: NpcType;\r\n static GuilShark: NpcType;\r\n static PofuillySlime: NpcType;\r\n static PouillySlime: NpcType;\r\n static PanArms: NpcType;\r\n static Migium: NpcType;\r\n static Hidoom: NpcType;\r\n static DeRolLe: NpcType;\r\n\r\n // Episode I Mines\r\n\r\n static Dubchic: NpcType;\r\n static Gilchic: NpcType;\r\n static Garanz: NpcType;\r\n static SinowBeat: NpcType;\r\n static SinowGold: NpcType;\r\n static Canadine: NpcType;\r\n static Canane: NpcType;\r\n static Dubswitch: NpcType;\r\n static VolOpt: NpcType;\r\n\r\n // Episode I Ruins\r\n\r\n static Delsaber: NpcType;\r\n static ChaosSorcerer: NpcType;\r\n static DarkGunner: NpcType;\r\n static DeathGunner: NpcType;\r\n static ChaosBringer: NpcType;\r\n static DarkBelra: NpcType;\r\n static Dimenian: NpcType;\r\n static LaDimenian: NpcType;\r\n static SoDimenian: NpcType;\r\n static Bulclaw: NpcType;\r\n static Bulk: NpcType;\r\n static Claw: NpcType;\r\n static DarkFalz: NpcType;\r\n\r\n // Episode II VR Temple\r\n\r\n static Hildebear2: NpcType;\r\n static Hildeblue2: NpcType;\r\n static RagRappy2: NpcType;\r\n static LoveRappy: NpcType;\r\n static StRappy: NpcType;\r\n static HalloRappy: NpcType;\r\n static EggRappy: NpcType;\r\n static Monest2: NpcType;\r\n static Mothmant2: NpcType;\r\n static PoisonLily2: NpcType;\r\n static NarLily2: NpcType;\r\n static GrassAssassin2: NpcType;\r\n static Dimenian2: NpcType;\r\n static LaDimenian2: NpcType;\r\n static SoDimenian2: NpcType;\r\n static DarkBelra2: NpcType;\r\n static BarbaRay: NpcType;\r\n\r\n // Episode II VR Spaceship\r\n\r\n static SavageWolf2: NpcType;\r\n static BarbarousWolf2: NpcType;\r\n static PanArms2: NpcType;\r\n static Migium2: NpcType;\r\n static Hidoom2: NpcType;\r\n static Dubchic2: NpcType;\r\n static Gilchic2: NpcType;\r\n static Garanz2: NpcType;\r\n static Dubswitch2: NpcType;\r\n static Delsaber2: NpcType;\r\n static ChaosSorcerer2: NpcType;\r\n static GolDragon: NpcType;\r\n\r\n // Episode II Central Control Area\r\n\r\n static SinowBerill: NpcType;\r\n static SinowSpigell: NpcType;\r\n static Merillia: NpcType;\r\n static Meriltas: NpcType;\r\n static Mericarol: NpcType;\r\n static Mericus: NpcType;\r\n static Merikle: NpcType;\r\n static UlGibbon: NpcType;\r\n static ZolGibbon: NpcType;\r\n static Gibbles: NpcType;\r\n static Gee: NpcType;\r\n static GiGue: NpcType;\r\n static GalGryphon: NpcType;\r\n\r\n // Episode II Seabed\r\n\r\n static Deldepth: NpcType;\r\n static Delbiter: NpcType;\r\n static Dolmolm: NpcType;\r\n static Dolmdarl: NpcType;\r\n static Morfos: NpcType;\r\n static Recobox: NpcType;\r\n static Recon: NpcType;\r\n static Epsilon: NpcType;\r\n static SinowZoa: NpcType;\r\n static SinowZele: NpcType;\r\n static IllGill: NpcType;\r\n static DelLily: NpcType;\r\n static OlgaFlow: NpcType;\r\n\r\n // Episode IV\r\n\r\n static SandRappy: NpcType;\r\n static DelRappy: NpcType;\r\n static Astark: NpcType;\r\n static SatelliteLizard: NpcType;\r\n static Yowie: NpcType;\r\n static MerissaA: NpcType;\r\n static MerissaAA: NpcType;\r\n static Girtablulu: NpcType;\r\n static Zu: NpcType;\r\n static Pazuzu: NpcType;\r\n static Boota: NpcType;\r\n static ZeBoota: NpcType;\r\n static BaBoota: NpcType;\r\n static Dorphon: NpcType;\r\n static DorphonEclair: NpcType;\r\n static Goran: NpcType;\r\n static PyroGoran: NpcType;\r\n static GoranDetonator: NpcType;\r\n static SaintMilion: NpcType;\r\n static Shambertin: NpcType;\r\n static Kondrieu: NpcType;\r\n}\r\n\r\n(function () {\r\n let id = 1;\r\n\r\n //\r\n // Unknown NPCs\r\n //\r\n\r\n NpcType.Unknown = new NpcType(id++, 'Unknown', 'Unknown', 'Unknown', 'Unknown', undefined, false);\r\n\r\n //\r\n // Friendly NPCs\r\n //\r\n\r\n NpcType.FemaleFat = new NpcType(id++, 'FemaleFat', 'Female Fat', 'Female Fat', 'Female Fat', undefined, false);\r\n NpcType.FemaleMacho = new NpcType(id++, 'FemaleMacho', 'Female Macho', 'Female Macho', 'Female Macho', undefined, false);\r\n NpcType.FemaleTall = new NpcType(id++, 'FemaleTall', 'Female Tall', 'Female Tall', 'Female Tall', undefined, false);\r\n NpcType.MaleDwarf = new NpcType(id++, 'MaleDwarf', 'Male Dwarf', 'Male Dwarf', 'Male Dwarf', undefined, false);\r\n NpcType.MaleFat = new NpcType(id++, 'MaleFat', 'Male Fat', 'Male Fat', 'Male Fat', undefined, false);\r\n NpcType.MaleMacho = new NpcType(id++, 'MaleMacho', 'Male Macho', 'Male Macho', 'Male Macho', undefined, false);\r\n NpcType.MaleOld = new NpcType(id++, 'MaleOld', 'Male Old', 'Male Old', 'Male Old', undefined, false);\r\n NpcType.BlueSoldier = new NpcType(id++, 'BlueSoldier', 'Blue Soldier', 'Blue Soldier', 'Blue Soldier', undefined, false);\r\n NpcType.RedSoldier = new NpcType(id++, 'RedSoldier', 'Red Soldier', 'Red Soldier', 'Red Soldier', undefined, false);\r\n NpcType.Principal = new NpcType(id++, 'Principal', 'Principal', 'Principal', 'Principal', undefined, false);\r\n NpcType.Tekker = new NpcType(id++, 'Tekker', 'Tekker', 'Tekker', 'Tekker', undefined, false);\r\n NpcType.GuildLady = new NpcType(id++, 'GuildLady', 'Guild Lady', 'Guild Lady', 'Guild Lady', undefined, false);\r\n NpcType.Scientist = new NpcType(id++, 'Scientist', 'Scientist', 'Scientist', 'Scientist', undefined, false);\r\n NpcType.Nurse = new NpcType(id++, 'Nurse', 'Nurse', 'Nurse', 'Nurse', undefined, false);\r\n NpcType.Irene = new NpcType(id++, 'Irene', 'Irene', 'Irene', 'Irene', undefined, false);\r\n NpcType.ItemShop = new NpcType(id++, 'ItemShop', 'Item Shop', 'Item Shop', 'Item Shop', undefined, false);\r\n NpcType.Nurse2 = new NpcType(id++, 'Nurse2', 'Nurse (Ep. II)', 'Nurse', 'Nurse', 2, false);\r\n\r\n //\r\n // Enemy NPCs\r\n //\r\n\r\n // Episode I Forest\r\n\r\n NpcType.Hildebear = new NpcType(id++, 'Hildebear', 'Hildebear', 'Hildebear', 'Hildelt', 1, true);\r\n NpcType.Hildeblue = new NpcType(id++, 'Hildeblue', 'Hildeblue', 'Hildeblue', 'Hildetorr', 1, true);\r\n NpcType.Hildebear.rareType = NpcType.Hildeblue;\r\n NpcType.RagRappy = new NpcType(id++, 'RagRappy', 'Rag Rappy', 'Rag Rappy', 'El Rappy', 1, true);\r\n NpcType.AlRappy = new NpcType(id++, 'AlRappy', 'Al Rappy', 'Al Rappy', 'Pal Rappy', 1, true);\r\n NpcType.RagRappy.rareType = NpcType.AlRappy;\r\n NpcType.Monest = new NpcType(id++, 'Monest', 'Monest', 'Monest', 'Mothvist', 1, true);\r\n NpcType.Mothmant = new NpcType(id++, 'Mothmant', 'Mothmant', 'Mothmant', 'Mothvert', 1, true);\r\n NpcType.SavageWolf = new NpcType(id++, 'SavageWolf', 'Savage Wolf', 'Savage Wolf', 'Gulgus', 1, true);\r\n NpcType.BarbarousWolf = new NpcType(id++, 'BarbarousWolf', 'Barbarous Wolf', 'Barbarous Wolf', 'Gulgus-Gue', 1, true);\r\n NpcType.Booma = new NpcType(id++, 'Booma', 'Booma', 'Booma', 'Bartle', 1, true);\r\n NpcType.Gobooma = new NpcType(id++, 'Gobooma', 'Gobooma', 'Gobooma', 'Barble', 1, true);\r\n NpcType.Gigobooma = new NpcType(id++, 'Gigobooma', 'Gigobooma', 'Gigobooma', 'Tollaw', 1, true);\r\n NpcType.Dragon = new NpcType(id++, 'Dragon', 'Dragon', 'Dragon', 'Sil Dragon', 1, true);\r\n\r\n // Episode I Caves\r\n\r\n NpcType.GrassAssassin = new NpcType(id++, 'GrassAssassin', 'Grass Assassin', 'Grass Assassin', 'Crimson Assassin', 1, true);\r\n NpcType.PoisonLily = new NpcType(id++, 'PoisonLily', 'Poison Lily', 'Poison Lily', 'Ob Lily', 1, true);\r\n NpcType.NarLily = new NpcType(id++, 'NarLily', 'Nar Lily', 'Nar Lily', 'Mil Lily', 1, true);\r\n NpcType.PoisonLily.rareType = NpcType.NarLily;\r\n NpcType.NanoDragon = new NpcType(id++, 'NanoDragon', 'Nano Dragon', 'Nano Dragon', 'Nano Dragon', 1, true);\r\n NpcType.EvilShark = new NpcType(id++, 'EvilShark', 'Evil Shark', 'Evil Shark', 'Vulmer', 1, true);\r\n NpcType.PalShark = new NpcType(id++, 'PalShark', 'Pal Shark', 'Pal Shark', 'Govulmer', 1, true);\r\n NpcType.GuilShark = new NpcType(id++, 'GuilShark', 'Guil Shark', 'Guil Shark', 'Melqueek', 1, true);\r\n NpcType.PofuillySlime = new NpcType(id++, 'PofuillySlime', 'Pofuilly Slime', 'Pofuilly Slime', 'Pofuilly Slime', 1, true);\r\n NpcType.PouillySlime = new NpcType(id++, 'PouillySlime', 'Pouilly Slime', 'Pouilly Slime', 'Pouilly Slime', 1, true);\r\n NpcType.PofuillySlime.rareType = NpcType.PouillySlime;\r\n NpcType.PanArms = new NpcType(id++, 'PanArms', 'Pan Arms', 'Pan Arms', 'Pan Arms', 1, true);\r\n NpcType.Migium = new NpcType(id++, 'Migium', 'Migium', 'Migium', 'Migium', 1, true);\r\n NpcType.Hidoom = new NpcType(id++, 'Hidoom', 'Hidoom', 'Hidoom', 'Hidoom', 1, true);\r\n NpcType.DeRolLe = new NpcType(id++, 'DeRolLe', 'De Rol Le', 'De Rol Le', 'Dal Ra Lie', 1, true);\r\n\r\n // Episode I Mines\r\n\r\n NpcType.Dubchic = new NpcType(id++, 'Dubchic', 'Dubchic', 'Dubchic', 'Dubchich', 1, true);\r\n NpcType.Gilchic = new NpcType(id++, 'Gilchic', 'Gilchic', 'Gilchic', 'Gilchich', 1, true);\r\n NpcType.Garanz = new NpcType(id++, 'Garanz', 'Garanz', 'Garanz', 'Baranz', 1, true);\r\n NpcType.SinowBeat = new NpcType(id++, 'SinowBeat', 'Sinow Beat', 'Sinow Beat', 'Sinow Blue', 1, true);\r\n NpcType.SinowGold = new NpcType(id++, 'SinowGold', 'Sinow Gold', 'Sinow Gold', 'Sinow Red', 1, true);\r\n NpcType.Canadine = new NpcType(id++, 'Canadine', 'Canadine', 'Canadine', 'Canabin', 1, true);\r\n NpcType.Canane = new NpcType(id++, 'Canane', 'Canane', 'Canane', 'Canune', 1, true);\r\n NpcType.Dubswitch = new NpcType(id++, 'Dubswitch', 'Dubswitch', 'Dubswitch', 'Dubswitch', 1, true);\r\n NpcType.VolOpt = new NpcType(id++, 'VolOpt', 'Vol Opt', 'Vol Opt', 'Vol Opt ver.2', 1, true);\r\n\r\n // Episode I Ruins\r\n\r\n NpcType.Delsaber = new NpcType(id++, 'Delsaber', 'Delsaber', 'Delsaber', 'Delsaber', 1, true);\r\n NpcType.ChaosSorcerer = new NpcType(id++, 'ChaosSorcerer', 'Chaos Sorcerer', 'Chaos Sorcerer', 'Gran Sorcerer', 1, true);\r\n NpcType.DarkGunner = new NpcType(id++, 'DarkGunner', 'Dark Gunner', 'Dark Gunner', 'Dark Gunner', 1, true);\r\n NpcType.DeathGunner = new NpcType(id++, 'DeathGunner', 'Death Gunner', 'Death Gunner', 'Death Gunner', 1, true);\r\n NpcType.ChaosBringer = new NpcType(id++, 'ChaosBringer', 'Chaos Bringer', 'Chaos Bringer', 'Dark Bringer', 1, true);\r\n NpcType.DarkBelra = new NpcType(id++, 'DarkBelra', 'Dark Belra', 'Dark Belra', 'Indi Belra', 1, true);\r\n NpcType.Dimenian = new NpcType(id++, 'Dimenian', 'Dimenian', 'Dimenian', 'Arlan', 1, true);\r\n NpcType.LaDimenian = new NpcType(id++, 'LaDimenian', 'La Dimenian', 'La Dimenian', 'Merlan', 1, true);\r\n NpcType.SoDimenian = new NpcType(id++, 'SoDimenian', 'So Dimenian', 'So Dimenian', 'Del-D', 1, true);\r\n NpcType.Bulclaw = new NpcType(id++, 'Bulclaw', 'Bulclaw', 'Bulclaw', 'Bulclaw', 1, true);\r\n NpcType.Bulk = new NpcType(id++, 'Bulk', 'Bulk', 'Bulk', 'Bulk', 1, true);\r\n NpcType.Claw = new NpcType(id++, 'Claw', 'Claw', 'Claw', 'Claw', 1, true);\r\n NpcType.DarkFalz = new NpcType(id++, 'DarkFalz', 'Dark Falz', 'Dark Falz', 'Dark Falz', 1, true);\r\n\r\n // Episode II VR Temple\r\n\r\n NpcType.Hildebear2 = new NpcType(id++, 'Hildebear2', 'Hildebear (Ep. II)', 'Hildebear', 'Hildelt', 2, true);\r\n NpcType.Hildeblue2 = new NpcType(id++, 'Hildeblue2', 'Hildeblue (Ep. II)', 'Hildeblue', 'Hildetorr', 2, true);\r\n NpcType.Hildebear2.rareType = NpcType.Hildeblue2;\r\n NpcType.RagRappy2 = new NpcType(id++, 'RagRappy2', 'Rag Rappy (Ep. II)', 'Rag Rappy', 'El Rappy', 2, true);\r\n NpcType.LoveRappy = new NpcType(id++, 'LoveRappy', 'Love Rappy', 'Love Rappy', 'Love Rappy', 2, true);\r\n NpcType.RagRappy2.rareType = NpcType.LoveRappy;\r\n NpcType.StRappy = new NpcType(id++, 'StRappy', 'St. Rappy', 'St. Rappy', 'St. Rappy', 2, true);\r\n NpcType.HalloRappy = new NpcType(id++, 'HalloRappy', 'Hallo Rappy', 'Hallo Rappy', 'Hallo Rappy', 2, true);\r\n NpcType.EggRappy = new NpcType(id++, 'EggRappy', 'Egg Rappy', 'Egg Rappy', 'Egg Rappy', 2, true);\r\n NpcType.Monest2 = new NpcType(id++, 'Monest2', 'Monest (Ep. II)', 'Monest', 'Mothvist', 2, true);\r\n NpcType.Mothmant2 = new NpcType(id++, 'Mothmant2', 'Mothmant', 'Mothmant', 'Mothvert', 2, true);\r\n NpcType.PoisonLily2 = new NpcType(id++, 'PoisonLily2', 'Poison Lily (Ep. II)', 'Poison Lily', 'Ob Lily', 2, true);\r\n NpcType.NarLily2 = new NpcType(id++, 'NarLily2', 'Nar Lily (Ep. II)', 'Nar Lily', 'Mil Lily', 2, true);\r\n NpcType.PoisonLily2.rareType = NpcType.NarLily2;\r\n NpcType.GrassAssassin2 = new NpcType(id++, 'GrassAssassin2', 'Grass Assassin (Ep. II)', 'Grass Assassin', 'Crimson Assassin', 2, true);\r\n NpcType.Dimenian2 = new NpcType(id++, 'Dimenian2', 'Dimenian (Ep. II)', 'Dimenian', 'Arlan', 2, true);\r\n NpcType.LaDimenian2 = new NpcType(id++, 'LaDimenian2', 'La Dimenian (Ep. II)', 'La Dimenian', 'Merlan', 2, true);\r\n NpcType.SoDimenian2 = new NpcType(id++, 'SoDimenian2', 'So Dimenian (Ep. II)', 'So Dimenian', 'Del-D', 2, true);\r\n NpcType.DarkBelra2 = new NpcType(id++, 'DarkBelra2', 'Dark Belra (Ep. II)', 'Dark Belra', 'Indi Belra', 2, true);\r\n NpcType.BarbaRay = new NpcType(id++, 'BarbaRay', 'Barba Ray', 'Barba Ray', 'Barba Ray', 2, true);\r\n\r\n // Episode II VR Spaceship\r\n\r\n NpcType.SavageWolf2 = new NpcType(id++, 'SavageWolf2', 'Savage Wolf (Ep. II)', 'Savage Wolf', 'Gulgus', 2, true);\r\n NpcType.BarbarousWolf2 = new NpcType(id++, 'BarbarousWolf2', 'Barbarous Wolf (Ep. II)', 'Barbarous Wolf', 'Gulgus-Gue', 2, true);\r\n NpcType.PanArms2 = new NpcType(id++, 'PanArms2', 'Pan Arms (Ep. II)', 'Pan Arms', 'Pan Arms', 2, true);\r\n NpcType.Migium2 = new NpcType(id++, 'Migium2', 'Migium (Ep. II)', 'Migium', 'Migium', 2, true);\r\n NpcType.Hidoom2 = new NpcType(id++, 'Hidoom2', 'Hidoom (Ep. II)', 'Hidoom', 'Hidoom', 2, true);\r\n NpcType.Dubchic2 = new NpcType(id++, 'Dubchic2', 'Dubchic (Ep. II)', 'Dubchic', 'Dubchich', 2, true);\r\n NpcType.Gilchic2 = new NpcType(id++, 'Gilchic2', 'Gilchic (Ep. II)', 'Gilchic', 'Gilchich', 2, true);\r\n NpcType.Garanz2 = new NpcType(id++, 'Garanz2', 'Garanz (Ep. II)', 'Garanz', 'Baranz', 2, true);\r\n NpcType.Dubswitch2 = new NpcType(id++, 'Dubswitch2', 'Dubswitch (Ep. II)', 'Dubswitch', 'Dubswitch', 2, true);\r\n NpcType.Delsaber2 = new NpcType(id++, 'Delsaber2', 'Delsaber (Ep. II)', 'Delsaber', 'Delsaber', 2, true);\r\n NpcType.ChaosSorcerer2 = new NpcType(id++, 'ChaosSorcerer2', 'Chaos Sorcerer (Ep. II)', 'Chaos Sorcerer', 'Gran Sorcerer', 2, true);\r\n NpcType.GolDragon = new NpcType(id++, 'GolDragon', 'Gol Dragon', 'Gol Dragon', 'Gol Dragon', 2, true);\r\n\r\n // Episode II Central Control Area\r\n\r\n NpcType.SinowBerill = new NpcType(id++, 'SinowBerill', 'Sinow Berill', 'Sinow Berill', 'Sinow Berill', 2, true);\r\n NpcType.SinowSpigell = new NpcType(id++, 'SinowSpigell', 'Sinow Spigell', 'Sinow Spigell', 'Sinow Spigell', 2, true);\r\n NpcType.Merillia = new NpcType(id++, 'Merillia', 'Merillia', 'Merillia', 'Merillia', 2, true);\r\n NpcType.Meriltas = new NpcType(id++, 'Meriltas', 'Meriltas', 'Meriltas', 'Meriltas', 2, true);\r\n NpcType.Mericarol = new NpcType(id++, 'Mericarol', 'Mericarol', 'Mericarol', 'Mericarol', 2, true);\r\n NpcType.Mericus = new NpcType(id++, 'Mericus', 'Mericus', 'Mericus', 'Mericus', 2, true);\r\n NpcType.Merikle = new NpcType(id++, 'Merikle', 'Merikle', 'Merikle', 'Merikle', 2, true);\r\n NpcType.UlGibbon = new NpcType(id++, 'UlGibbon', 'Ul Gibbon', 'Ul Gibbon', 'Ul Gibbon', 2, true);\r\n NpcType.ZolGibbon = new NpcType(id++, 'ZolGibbon', 'Zol Gibbon', 'Zol Gibbon', 'Zol Gibbon', 2, true);\r\n NpcType.Gibbles = new NpcType(id++, 'Gibbles', 'Gibbles', 'Gibbles', 'Gibbles', 2, true);\r\n NpcType.Gee = new NpcType(id++, 'Gee', 'Gee', 'Gee', 'Gee', 2, true);\r\n NpcType.GiGue = new NpcType(id++, 'GiGue', 'Gi Gue', 'Gi Gue', 'Gi Gue', 2, true);\r\n NpcType.GalGryphon = new NpcType(id++, 'GalGryphon', 'Gal Gryphon', 'Gal Gryphon', 'Gal Gryphon', 2, true);\r\n\r\n // Episode II Seabed\r\n\r\n NpcType.Deldepth = new NpcType(id++, 'Deldepth', 'Deldepth', 'Deldepth', 'Deldepth', 2, true);\r\n NpcType.Delbiter = new NpcType(id++, 'Delbiter', 'Delbiter', 'Delbiter', 'Delbiter', 2, true);\r\n NpcType.Dolmolm = new NpcType(id++, 'Dolmolm', 'Dolmolm', 'Dolmolm', 'Dolmolm', 2, true);\r\n NpcType.Dolmdarl = new NpcType(id++, 'Dolmdarl', 'Dolmdarl', 'Dolmdarl', 'Dolmdarl', 2, true);\r\n NpcType.Morfos = new NpcType(id++, 'Morfos', 'Morfos', 'Morfos', 'Morfos', 2, true);\r\n NpcType.Recobox = new NpcType(id++, 'Recobox', 'Recobox', 'Recobox', 'Recobox', 2, true);\r\n NpcType.Recon = new NpcType(id++, 'Recon', 'Recon', 'Recon', 'Recon', 2, true);\r\n NpcType.Epsilon = new NpcType(id++, 'Epsilon', 'Epsilon', 'Epsilon', 'Epsilon', 2, true);\r\n NpcType.SinowZoa = new NpcType(id++, 'SinowZoa', 'Sinow Zoa', 'Sinow Zoa', 'Sinow Zoa', 2, true);\r\n NpcType.SinowZele = new NpcType(id++, 'SinowZele', 'Sinow Zele', 'Sinow Zele', 'Sinow Zele', 2, true);\r\n NpcType.IllGill = new NpcType(id++, 'IllGill', 'Ill Gill', 'Ill Gill', 'Ill Gill', 2, true);\r\n NpcType.DelLily = new NpcType(id++, 'DelLily', 'Del Lily', 'Del Lily', 'Del Lily', 2, true);\r\n NpcType.OlgaFlow = new NpcType(id++, 'OlgaFlow', 'Olga Flow', 'Olga Flow', 'Olga Flow', 2, true);\r\n\r\n // Episode IV\r\n\r\n NpcType.SandRappy = new NpcType(id++, 'SandRappy', 'Sand Rappy', 'Sand Rappy', 'Sand Rappy', 4, true);\r\n NpcType.DelRappy = new NpcType(id++, 'DelRappy', 'Del Rappy', 'Del Rappy', 'Del Rappy', 4, true);\r\n NpcType.SandRappy.rareType = NpcType.DelRappy;\r\n NpcType.Astark = new NpcType(id++, 'Astark', 'Astark', 'Astark', 'Astark', 4, true);\r\n NpcType.SatelliteLizard = new NpcType(id++, 'SatelliteLizard', 'Satellite Lizard', 'Satellite Lizard', 'Satellite Lizard', 4, true);\r\n NpcType.Yowie = new NpcType(id++, 'Yowie', 'Yowie', 'Yowie', 'Yowie', 4, true);\r\n NpcType.MerissaA = new NpcType(id++, 'MerissaA', 'Merissa A', 'Merissa A', 'Merissa A', 4, true);\r\n NpcType.MerissaAA = new NpcType(id++, 'MerissaAA', 'Merissa AA', 'Merissa AA', 'Merissa AA', 4, true);\r\n NpcType.MerissaA.rareType = NpcType.MerissaAA;\r\n NpcType.Girtablulu = new NpcType(id++, 'Girtablulu', 'Girtablulu', 'Girtablulu', 'Girtablulu', 4, true);\r\n NpcType.Zu = new NpcType(id++, 'Zu', 'Zu', 'Zu', 'Zu', 4, true);\r\n NpcType.Pazuzu = new NpcType(id++, 'Pazuzu', 'Pazuzu', 'Pazuzu', 'Pazuzu', 4, true);\r\n NpcType.Zu.rareType = NpcType.Pazuzu;\r\n NpcType.Boota = new NpcType(id++, 'Boota', 'Boota', 'Boota', 'Boota', 4, true);\r\n NpcType.ZeBoota = new NpcType(id++, 'ZeBoota', 'Ze Boota', 'Ze Boota', 'Ze Boota', 4, true);\r\n NpcType.BaBoota = new NpcType(id++, 'BaBoota', 'Ba Boota', 'Ba Boota', 'Ba Boota', 4, true);\r\n NpcType.Dorphon = new NpcType(id++, 'Dorphon', 'Dorphon', 'Dorphon', 'Dorphon', 4, true);\r\n NpcType.DorphonEclair = new NpcType(id++, 'DorphonEclair', 'Dorphon Eclair', 'Dorphon Eclair', 'Dorphon Eclair', 4, true);\r\n NpcType.Dorphon.rareType = NpcType.DorphonEclair;\r\n NpcType.Goran = new NpcType(id++, 'Goran', 'Goran', 'Goran', 'Goran', 4, true);\r\n NpcType.PyroGoran = new NpcType(id++, 'PyroGoran', 'Pyro Goran', 'Pyro Goran', 'Pyro Goran', 4, true);\r\n NpcType.GoranDetonator = new NpcType(id++, 'GoranDetonator', 'Goran Detonator', 'Goran Detonator', 'Goran Detonator', 4, true);\r\n NpcType.SaintMilion = new NpcType(id++, 'SaintMilion', 'Saint-Milion', 'Saint-Milion', 'Saint-Milion', 4, true);\r\n NpcType.Shambertin = new NpcType(id++, 'Shambertin', 'Shambertin', 'Shambertin', 'Shambertin', 4, true);\r\n NpcType.Kondrieu = new NpcType(id++, 'Kondrieu', 'Kondrieu', 'Kondrieu', 'Kondrieu', 4, true);\r\n NpcType.SaintMilion.rareType = NpcType.Kondrieu;\r\n NpcType.Shambertin.rareType = NpcType.Kondrieu;\r\n}());\r\n\r\nexport const NpcTypes: Array<NpcType> = [\r\n\r\n //\r\n // Unknown NPCs\r\n //\r\n\r\n NpcType.Unknown,\r\n\r\n //\r\n // Friendly NPCs\r\n //\r\n\r\n NpcType.FemaleFat,\r\n NpcType.FemaleMacho,\r\n NpcType.FemaleTall,\r\n NpcType.MaleDwarf,\r\n NpcType.MaleFat,\r\n NpcType.MaleMacho,\r\n NpcType.MaleOld,\r\n NpcType.BlueSoldier,\r\n NpcType.RedSoldier,\r\n NpcType.Principal,\r\n NpcType.Tekker,\r\n NpcType.GuildLady,\r\n NpcType.Scientist,\r\n NpcType.Nurse,\r\n NpcType.Irene,\r\n NpcType.ItemShop,\r\n NpcType.Nurse2,\r\n\r\n //\r\n // Enemy NPCs\r\n //\r\n\r\n // Episode I Forest\r\n\r\n NpcType.Hildebear,\r\n NpcType.Hildeblue,\r\n NpcType.RagRappy,\r\n NpcType.AlRappy,\r\n NpcType.Monest,\r\n NpcType.Mothmant,\r\n NpcType.SavageWolf,\r\n NpcType.BarbarousWolf,\r\n NpcType.Booma,\r\n NpcType.Gobooma,\r\n NpcType.Gigobooma,\r\n NpcType.Dragon,\r\n\r\n // Episode I Caves\r\n\r\n NpcType.GrassAssassin,\r\n NpcType.PoisonLily,\r\n NpcType.NarLily,\r\n NpcType.NanoDragon,\r\n NpcType.EvilShark,\r\n NpcType.PalShark,\r\n NpcType.GuilShark,\r\n NpcType.PofuillySlime,\r\n NpcType.PouillySlime,\r\n NpcType.PanArms,\r\n NpcType.Migium,\r\n NpcType.Hidoom,\r\n NpcType.DeRolLe,\r\n\r\n // Episode I Mines\r\n\r\n NpcType.Dubchic,\r\n NpcType.Gilchic,\r\n NpcType.Garanz,\r\n NpcType.SinowBeat,\r\n NpcType.SinowGold,\r\n NpcType.Canadine,\r\n NpcType.Canane,\r\n NpcType.Dubswitch,\r\n NpcType.VolOpt,\r\n\r\n // Episode I Ruins\r\n\r\n NpcType.Delsaber,\r\n NpcType.ChaosSorcerer,\r\n NpcType.DarkGunner,\r\n NpcType.DeathGunner,\r\n NpcType.ChaosBringer,\r\n NpcType.DarkBelra,\r\n NpcType.Dimenian,\r\n NpcType.LaDimenian,\r\n NpcType.SoDimenian,\r\n NpcType.Bulclaw,\r\n NpcType.Bulk,\r\n NpcType.Claw,\r\n NpcType.DarkFalz,\r\n\r\n // Episode II VR Temple\r\n\r\n NpcType.Hildebear2,\r\n NpcType.Hildeblue2,\r\n NpcType.RagRappy2,\r\n NpcType.LoveRappy,\r\n NpcType.StRappy,\r\n NpcType.HalloRappy,\r\n NpcType.EggRappy,\r\n NpcType.Monest2,\r\n NpcType.Mothmant2,\r\n NpcType.PoisonLily2,\r\n NpcType.NarLily2,\r\n NpcType.GrassAssassin2,\r\n NpcType.Dimenian2,\r\n NpcType.LaDimenian2,\r\n NpcType.SoDimenian2,\r\n NpcType.DarkBelra2,\r\n NpcType.BarbaRay,\r\n\r\n // Episode II VR Spaceship\r\n\r\n NpcType.SavageWolf2,\r\n NpcType.BarbarousWolf2,\r\n NpcType.PanArms2,\r\n NpcType.Migium2,\r\n NpcType.Hidoom2,\r\n NpcType.Dubchic2,\r\n NpcType.Gilchic2,\r\n NpcType.Garanz2,\r\n NpcType.Dubswitch2,\r\n NpcType.Delsaber2,\r\n NpcType.ChaosSorcerer2,\r\n NpcType.GolDragon,\r\n\r\n // Episode II Central Control Area\r\n\r\n NpcType.SinowBerill,\r\n NpcType.SinowSpigell,\r\n NpcType.Merillia,\r\n NpcType.Meriltas,\r\n NpcType.Mericarol,\r\n NpcType.Mericus,\r\n NpcType.Merikle,\r\n NpcType.UlGibbon,\r\n NpcType.ZolGibbon,\r\n NpcType.Gibbles,\r\n NpcType.Gee,\r\n NpcType.GiGue,\r\n NpcType.GalGryphon,\r\n\r\n // Episode II Seabed\r\n\r\n NpcType.Deldepth,\r\n NpcType.Delbiter,\r\n NpcType.Dolmolm,\r\n NpcType.Dolmdarl,\r\n NpcType.Morfos,\r\n NpcType.Recobox,\r\n NpcType.Recon,\r\n NpcType.Epsilon,\r\n NpcType.SinowZoa,\r\n NpcType.SinowZele,\r\n NpcType.IllGill,\r\n NpcType.DelLily,\r\n NpcType.OlgaFlow,\r\n\r\n // Episode IV\r\n\r\n NpcType.SandRappy,\r\n NpcType.DelRappy,\r\n NpcType.Astark,\r\n NpcType.SatelliteLizard,\r\n NpcType.Yowie,\r\n NpcType.MerissaA,\r\n NpcType.MerissaAA,\r\n NpcType.Girtablulu,\r\n NpcType.Zu,\r\n NpcType.Pazuzu,\r\n NpcType.Boota,\r\n NpcType.ZeBoota,\r\n NpcType.BaBoota,\r\n NpcType.Dorphon,\r\n NpcType.DorphonEclair,\r\n NpcType.Goran,\r\n NpcType.PyroGoran,\r\n NpcType.GoranDetonator,\r\n NpcType.SaintMilion,\r\n NpcType.Shambertin,\r\n NpcType.Kondrieu,\r\n];\r\n\r\nexport const EnemyNpcTypes = NpcTypes.filter(type => type.enemy);\r\n","export class ObjectType {\r\n id: number;\r\n psoId?: number;\r\n name: string;\r\n\r\n constructor(id: number, psoId: number | undefined, name: string) {\r\n if (!Number.isInteger(id) || id < 1)\r\n throw new Error(`Expected id to be an integer greater than or equal to 1, got ${id}.`);\r\n if (psoId != null && (!Number.isInteger(psoId) || psoId < 0))\r\n throw new Error(`Expected psoId to be null or an integer greater than or equal to 0, got ${psoId}.`);\r\n if (!name) throw new Error('name is required.');\r\n\r\n this.id = id;\r\n this.psoId = psoId;\r\n this.name = name;\r\n }\r\n\r\n static Unknown: ObjectType;\r\n static PlayerSet: ObjectType;\r\n static Particle: ObjectType;\r\n static Teleporter: ObjectType;\r\n static Warp: ObjectType;\r\n static LightCollision: ObjectType;\r\n static Item: ObjectType;\r\n static EnvSound: ObjectType;\r\n static FogCollision: ObjectType;\r\n static EventCollision: ObjectType;\r\n static CharaCollision: ObjectType;\r\n static ElementalTrap: ObjectType;\r\n static StatusTrap: ObjectType;\r\n static HealTrap: ObjectType;\r\n static LargeElementalTrap: ObjectType;\r\n static ObjRoomID: ObjectType;\r\n static Sensor: ObjectType;\r\n static UnknownItem16: ObjectType;\r\n static Lensflare: ObjectType;\r\n static ScriptCollision: ObjectType;\r\n static HealRing: ObjectType;\r\n static MapCollision: ObjectType;\r\n static ScriptCollisionA: ObjectType;\r\n static ItemLight: ObjectType;\r\n static RadarCollision: ObjectType;\r\n static FogCollisionSW: ObjectType;\r\n static BossTeleporter: ObjectType;\r\n static ImageBoard: ObjectType;\r\n static QuestWarp: ObjectType;\r\n static Epilogue: ObjectType;\r\n static UnknownItem29: ObjectType;\r\n static UnknownItem30: ObjectType;\r\n static UnknownItem31: ObjectType;\r\n static BoxDetectObject: ObjectType;\r\n static SymbolChatObject: ObjectType;\r\n static TouchPlateObject: ObjectType;\r\n static TargetableObject: ObjectType;\r\n static EffectObject: ObjectType;\r\n static CountDownObject: ObjectType;\r\n static UnknownItem38: ObjectType;\r\n static UnknownItem39: ObjectType;\r\n static UnknownItem40: ObjectType;\r\n static UnknownItem41: ObjectType;\r\n static MenuActivation: ObjectType;\r\n static TelepipeLocation: ObjectType;\r\n static BGMCollision: ObjectType;\r\n static MainRagolTeleporter: ObjectType;\r\n static LobbyTeleporter: ObjectType;\r\n static PrincipalWarp: ObjectType;\r\n static ShopDoor: ObjectType;\r\n static HuntersGuildDoor: ObjectType;\r\n static TeleporterDoor: ObjectType;\r\n static MedicalCenterDoor: ObjectType;\r\n static Elevator: ObjectType;\r\n static EasterEgg: ObjectType;\r\n static ValentinesHeart: ObjectType;\r\n static ChristmasTree: ObjectType;\r\n static ChristmasWreath: ObjectType;\r\n static HalloweenPumpkin: ObjectType;\r\n static TwentyFirstCentury: ObjectType;\r\n static Sonic: ObjectType;\r\n static WelcomeBoard: ObjectType;\r\n static Firework: ObjectType;\r\n static LobbyScreenDoor: ObjectType;\r\n static MainRagolTeleporterBattleInNextArea: ObjectType;\r\n static LabTeleporterDoor: ObjectType;\r\n static Pioneer2InvisibleTouchplate: ObjectType;\r\n static ForestDoor: ObjectType;\r\n static ForestSwitch: ObjectType;\r\n static LaserFence: ObjectType;\r\n static LaserSquareFence: ObjectType;\r\n static ForestLaserFenceSwitch: ObjectType;\r\n static LightRays: ObjectType;\r\n static BlueButterfly: ObjectType;\r\n static Probe: ObjectType;\r\n static RandomTypeBox1: ObjectType;\r\n static ForestWeatherStation: ObjectType;\r\n static Battery: ObjectType;\r\n static ForestConsole: ObjectType;\r\n static BlackSlidingDoor: ObjectType;\r\n static RicoMessagePod: ObjectType;\r\n static EnergyBarrier: ObjectType;\r\n static ForestRisingBridge: ObjectType;\r\n static SwitchNoneDoor: ObjectType;\r\n static EnemyBoxGrey: ObjectType;\r\n static FixedTypeBox: ObjectType;\r\n static EnemyBoxBrown: ObjectType;\r\n static EmptyTypeBox: ObjectType;\r\n static LaserFenseEx: ObjectType;\r\n static LaserSquareFenceEx: ObjectType;\r\n static FloorPanel1: ObjectType;\r\n static Caves4ButtonDoor: ObjectType;\r\n static CavesNormalDoor: ObjectType;\r\n static CavesSmashingPillar: ObjectType;\r\n static CavesSign1: ObjectType;\r\n static CavesSign2: ObjectType;\r\n static CavesSign3: ObjectType;\r\n static HexagalTank: ObjectType;\r\n static BrownPlatform: ObjectType;\r\n static WarningLightObject: ObjectType;\r\n static Rainbow: ObjectType;\r\n static FloatingJelifish: ObjectType;\r\n static FloatingDragonfly: ObjectType;\r\n static CavesSwitchDoor: ObjectType;\r\n static RobotRechargeStation: ObjectType;\r\n static CavesCakeShop: ObjectType;\r\n static Caves1SmallRedRock: ObjectType;\r\n static Caves1MediumRedRock: ObjectType;\r\n static Caves1LargeRedRock: ObjectType;\r\n static Caves2SmallRock1: ObjectType;\r\n static Caves2MediumRock1: ObjectType;\r\n static Caves2LargeRock1: ObjectType;\r\n static Caves2SmallRock2: ObjectType;\r\n static Caves2MediumRock2: ObjectType;\r\n static Caves2LargeRock2: ObjectType;\r\n static Caves3SmallRock: ObjectType;\r\n static Caves3MediumRock: ObjectType;\r\n static Caves3LargeRock: ObjectType;\r\n static FloorPanel2: ObjectType;\r\n static DestructableRockCaves1: ObjectType;\r\n static DestructableRockCaves2: ObjectType;\r\n static DestructableRockCaves3: ObjectType;\r\n static MinesDoor: ObjectType;\r\n static FloorPanel3: ObjectType;\r\n static MinesSwitchDoor: ObjectType;\r\n static LargeCryoTube: ObjectType;\r\n static ComputerLikeCalus: ObjectType;\r\n static GreenScreenOpeningAndClosing: ObjectType;\r\n static FloatingRobot: ObjectType;\r\n static FloatingBlueLight: ObjectType;\r\n static SelfDestructingObject1: ObjectType;\r\n static SelfDestructingObject2: ObjectType;\r\n static SelfDestructingObject3: ObjectType;\r\n static SparkMachine: ObjectType;\r\n static MinesLargeFlashingCrate: ObjectType;\r\n static RuinsSeal: ObjectType;\r\n static RuinsTeleporter: ObjectType;\r\n static RuinsWarpSiteToSite: ObjectType;\r\n static RuinsSwitch: ObjectType;\r\n static FloorPanel4: ObjectType;\r\n static Ruins1Door: ObjectType;\r\n static Ruins3Door: ObjectType;\r\n static Ruins2Door: ObjectType;\r\n static Ruins11ButtonDoor: ObjectType;\r\n static Ruins21ButtonDoor: ObjectType;\r\n static Ruins31ButtonDoor: ObjectType;\r\n static Ruins4ButtonDoor: ObjectType;\r\n static Ruins2ButtonDoor: ObjectType;\r\n static RuinsSensor: ObjectType;\r\n static RuinsFenceSwitch: ObjectType;\r\n static RuinsLaserFence4x2: ObjectType;\r\n static RuinsLaserFence6x2: ObjectType;\r\n static RuinsLaserFence4x4: ObjectType;\r\n static RuinsLaserFence6x4: ObjectType;\r\n static RuinsPoisonBlob: ObjectType;\r\n static RuinsPilarTrap: ObjectType;\r\n static PopupTrapNoTech: ObjectType;\r\n static RuinsCrystal: ObjectType;\r\n static Monument: ObjectType;\r\n static RuinsRock1: ObjectType;\r\n static RuinsRock2: ObjectType;\r\n static RuinsRock3: ObjectType;\r\n static RuinsRock4: ObjectType;\r\n static RuinsRock5: ObjectType;\r\n static RuinsRock6: ObjectType;\r\n static RuinsRock7: ObjectType;\r\n static Poison: ObjectType;\r\n static FixedBoxTypeRuins: ObjectType;\r\n static RandomBoxTypeRuins: ObjectType;\r\n static EnemyTypeBoxYellow: ObjectType;\r\n static EnemyTypeBoxBlue: ObjectType;\r\n static EmptyTypeBoxBlue: ObjectType;\r\n static DestructableRock: ObjectType;\r\n static PopupTrapsTechs: ObjectType;\r\n static FlyingWhiteBird: ObjectType;\r\n static Tower: ObjectType;\r\n static FloatingRocks: ObjectType;\r\n static FloatingSoul: ObjectType;\r\n static Butterfly: ObjectType;\r\n static LobbyGameMenu: ObjectType;\r\n static LobbyWarpObject: ObjectType;\r\n static Lobby1EventObjectDefaultTree: ObjectType;\r\n static UnknownItem387: ObjectType;\r\n static UnknownItem388: ObjectType;\r\n static UnknownItem389: ObjectType;\r\n static LobbyEventObjectStaticPumpkin: ObjectType;\r\n static LobbyEventObject3ChristmasWindows: ObjectType;\r\n static LobbyEventObjectRedAndWhiteCurtain: ObjectType;\r\n static UnknownItem393: ObjectType;\r\n static UnknownItem394: ObjectType;\r\n static LobbyFishTank: ObjectType;\r\n static LobbyEventObjectButterflies: ObjectType;\r\n static UnknownItem400: ObjectType;\r\n static GreyWallLow: ObjectType;\r\n static SpaceshipDoor: ObjectType;\r\n static GreyWallHigh: ObjectType;\r\n static TempleNormalDoor: ObjectType;\r\n static BreakableWallWallButUnbreakable: ObjectType;\r\n static BrokenCilinderAndRubble: ObjectType;\r\n static ThreeBrokenWallPiecesOnFloor: ObjectType;\r\n static HighBrickCilinder: ObjectType;\r\n static LyingCilinder: ObjectType;\r\n static BrickConeWithFlatTop: ObjectType;\r\n static BreakableTempleWall: ObjectType;\r\n static TempleMapDetect: ObjectType;\r\n static SmallBrownBrickRisingBridge: ObjectType;\r\n static LongRisingBridgeWithPinkHighEdges: ObjectType;\r\n static FourSwitchTempleDoor: ObjectType;\r\n static FourButtonSpaceshipDoor: ObjectType;\r\n static ItemBoxCca: ObjectType;\r\n static TeleporterEp2: ObjectType;\r\n static CCADoor: ObjectType;\r\n static SpecialBoxCCA: ObjectType;\r\n static BigCCADoor: ObjectType;\r\n static BigCCADoorSwitch: ObjectType;\r\n static LittleRock: ObjectType;\r\n static Little3StoneWall: ObjectType;\r\n static Medium3StoneWall: ObjectType;\r\n static SpiderPlant: ObjectType;\r\n static CCAAreaTeleporter: ObjectType;\r\n static UnknownItem523: ObjectType;\r\n static WhiteBird: ObjectType;\r\n static OrangeBird: ObjectType;\r\n static Saw: ObjectType;\r\n static LaserDetect: ObjectType;\r\n static UnknownItem529: ObjectType;\r\n static UnknownItem530: ObjectType;\r\n static Seagull: ObjectType;\r\n static Fish: ObjectType;\r\n static SeabedDoorWithBlueEdges: ObjectType;\r\n static SeabedDoorAlwaysOpenNonTriggerable: ObjectType;\r\n static LittleCryotube: ObjectType;\r\n static WideGlassWallBreakable: ObjectType;\r\n static BlueFloatingRobot: ObjectType;\r\n static RedFloatingRobot: ObjectType;\r\n static Dolphin: ObjectType;\r\n static CaptureTrap: ObjectType;\r\n static VRLink: ObjectType;\r\n static UnknownItem576: ObjectType;\r\n static WarpInBarbaRayRoom: ObjectType;\r\n static UnknownItem672: ObjectType;\r\n static GeeNest: ObjectType;\r\n static LabComputerConsole: ObjectType;\r\n static LabComputerConsoleGreenScreen: ObjectType;\r\n static ChairYelllowPillow: ObjectType;\r\n static OrangeWallWithHoleInMiddle: ObjectType;\r\n static GreyWallWithHoleInMiddle: ObjectType;\r\n static LongTable: ObjectType;\r\n static GBAStation: ObjectType;\r\n static TalkLinkToSupport: ObjectType;\r\n static InstaWarp: ObjectType;\r\n static LabInvisibleObject: ObjectType;\r\n static LabGlassWindowDoor: ObjectType;\r\n static UnknownItem700: ObjectType;\r\n static LabCelingWarp: ObjectType;\r\n static Ep4LightSource: ObjectType;\r\n static Cacti: ObjectType;\r\n static BigBrownRock: ObjectType;\r\n static BreakableBrownRock: ObjectType;\r\n static UnknownItem832: ObjectType;\r\n static UnknownItem833: ObjectType;\r\n static PoisonPlant: ObjectType;\r\n static UnknownItem897: ObjectType;\r\n static UnknownItem898: ObjectType;\r\n static OozingDesertPlant: ObjectType;\r\n static UnknownItem901: ObjectType;\r\n static BigBlackRocks: ObjectType;\r\n static UnknownItem903: ObjectType;\r\n static UnknownItem904: ObjectType;\r\n static UnknownItem905: ObjectType;\r\n static UnknownItem906: ObjectType;\r\n static FallingRock: ObjectType;\r\n static DesertPlantHasCollision: ObjectType;\r\n static DesertFixedTypeBoxBreakableCrystals: ObjectType;\r\n static UnknownItem910: ObjectType;\r\n static BeeHive: ObjectType;\r\n static UnknownItem912: ObjectType;\r\n static Heat: ObjectType;\r\n static TopOfSaintMillionEgg: ObjectType;\r\n static UnknownItem961: ObjectType;\r\n\r\n static fromPsoId(psoId: number): ObjectType {\r\n switch (psoId) {\r\n default: return ObjectType.Unknown;\r\n\r\n case 0: return ObjectType.PlayerSet;\r\n case 1: return ObjectType.Particle;\r\n case 2: return ObjectType.Teleporter;\r\n case 3: return ObjectType.Warp;\r\n case 4: return ObjectType.LightCollision;\r\n case 5: return ObjectType.Item;\r\n case 6: return ObjectType.EnvSound;\r\n case 7: return ObjectType.FogCollision;\r\n case 8: return ObjectType.EventCollision;\r\n case 9: return ObjectType.CharaCollision;\r\n case 10: return ObjectType.ElementalTrap;\r\n case 11: return ObjectType.StatusTrap;\r\n case 12: return ObjectType.HealTrap;\r\n case 13: return ObjectType.LargeElementalTrap;\r\n case 14: return ObjectType.ObjRoomID;\r\n case 15: return ObjectType.Sensor;\r\n case 16: return ObjectType.UnknownItem16;\r\n case 17: return ObjectType.Lensflare;\r\n case 18: return ObjectType.ScriptCollision;\r\n case 19: return ObjectType.HealRing;\r\n case 20: return ObjectType.MapCollision;\r\n case 21: return ObjectType.ScriptCollisionA;\r\n case 22: return ObjectType.ItemLight;\r\n case 23: return ObjectType.RadarCollision;\r\n case 24: return ObjectType.FogCollisionSW;\r\n case 25: return ObjectType.BossTeleporter;\r\n case 26: return ObjectType.ImageBoard;\r\n case 27: return ObjectType.QuestWarp;\r\n case 28: return ObjectType.Epilogue;\r\n case 29: return ObjectType.UnknownItem29;\r\n case 30: return ObjectType.UnknownItem30;\r\n case 31: return ObjectType.UnknownItem31;\r\n case 32: return ObjectType.BoxDetectObject;\r\n case 33: return ObjectType.SymbolChatObject;\r\n case 34: return ObjectType.TouchPlateObject;\r\n case 35: return ObjectType.TargetableObject;\r\n case 36: return ObjectType.EffectObject;\r\n case 37: return ObjectType.CountDownObject;\r\n case 38: return ObjectType.UnknownItem38;\r\n case 39: return ObjectType.UnknownItem39;\r\n case 40: return ObjectType.UnknownItem40;\r\n case 41: return ObjectType.UnknownItem41;\r\n case 64: return ObjectType.MenuActivation;\r\n case 65: return ObjectType.TelepipeLocation;\r\n case 66: return ObjectType.BGMCollision;\r\n case 67: return ObjectType.MainRagolTeleporter;\r\n case 68: return ObjectType.LobbyTeleporter;\r\n case 69: return ObjectType.PrincipalWarp;\r\n case 70: return ObjectType.ShopDoor;\r\n case 71: return ObjectType.HuntersGuildDoor;\r\n case 72: return ObjectType.TeleporterDoor;\r\n case 73: return ObjectType.MedicalCenterDoor;\r\n case 74: return ObjectType.Elevator;\r\n case 75: return ObjectType.EasterEgg;\r\n case 76: return ObjectType.ValentinesHeart;\r\n case 77: return ObjectType.ChristmasTree;\r\n case 78: return ObjectType.ChristmasWreath;\r\n case 79: return ObjectType.HalloweenPumpkin;\r\n case 80: return ObjectType.TwentyFirstCentury;\r\n case 81: return ObjectType.Sonic;\r\n case 82: return ObjectType.WelcomeBoard;\r\n case 83: return ObjectType.Firework;\r\n case 84: return ObjectType.LobbyScreenDoor;\r\n case 85: return ObjectType.MainRagolTeleporterBattleInNextArea;\r\n case 86: return ObjectType.LabTeleporterDoor;\r\n case 87: return ObjectType.Pioneer2InvisibleTouchplate;\r\n case 128: return ObjectType.ForestDoor;\r\n case 129: return ObjectType.ForestSwitch;\r\n case 130: return ObjectType.LaserFence;\r\n case 131: return ObjectType.LaserSquareFence;\r\n case 132: return ObjectType.ForestLaserFenceSwitch;\r\n case 133: return ObjectType.LightRays;\r\n case 134: return ObjectType.BlueButterfly;\r\n case 135: return ObjectType.Probe;\r\n case 136: return ObjectType.RandomTypeBox1;\r\n case 137: return ObjectType.ForestWeatherStation;\r\n case 138: return ObjectType.Battery;\r\n case 139: return ObjectType.ForestConsole;\r\n case 140: return ObjectType.BlackSlidingDoor;\r\n case 141: return ObjectType.RicoMessagePod;\r\n case 142: return ObjectType.EnergyBarrier;\r\n case 143: return ObjectType.ForestRisingBridge;\r\n case 144: return ObjectType.SwitchNoneDoor;\r\n case 145: return ObjectType.EnemyBoxGrey;\r\n case 146: return ObjectType.FixedTypeBox;\r\n case 147: return ObjectType.EnemyBoxBrown;\r\n case 149: return ObjectType.EmptyTypeBox;\r\n case 150: return ObjectType.LaserFenseEx;\r\n case 151: return ObjectType.LaserSquareFenceEx;\r\n case 192: return ObjectType.FloorPanel1;\r\n case 193: return ObjectType.Caves4ButtonDoor;\r\n case 194: return ObjectType.CavesNormalDoor;\r\n case 195: return ObjectType.CavesSmashingPillar;\r\n case 196: return ObjectType.CavesSign1;\r\n case 197: return ObjectType.CavesSign2;\r\n case 198: return ObjectType.CavesSign3;\r\n case 199: return ObjectType.HexagalTank;\r\n case 200: return ObjectType.BrownPlatform;\r\n case 201: return ObjectType.WarningLightObject;\r\n case 203: return ObjectType.Rainbow;\r\n case 204: return ObjectType.FloatingJelifish;\r\n case 205: return ObjectType.FloatingDragonfly;\r\n case 206: return ObjectType.CavesSwitchDoor;\r\n case 207: return ObjectType.RobotRechargeStation;\r\n case 208: return ObjectType.CavesCakeShop;\r\n case 209: return ObjectType.Caves1SmallRedRock;\r\n case 210: return ObjectType.Caves1MediumRedRock;\r\n case 211: return ObjectType.Caves1LargeRedRock;\r\n case 212: return ObjectType.Caves2SmallRock1;\r\n case 213: return ObjectType.Caves2MediumRock1;\r\n case 214: return ObjectType.Caves2LargeRock1;\r\n case 215: return ObjectType.Caves2SmallRock2;\r\n case 216: return ObjectType.Caves2MediumRock2;\r\n case 217: return ObjectType.Caves2LargeRock2;\r\n case 218: return ObjectType.Caves3SmallRock;\r\n case 219: return ObjectType.Caves3MediumRock;\r\n case 220: return ObjectType.Caves3LargeRock;\r\n case 222: return ObjectType.FloorPanel2;\r\n case 223: return ObjectType.DestructableRockCaves1;\r\n case 224: return ObjectType.DestructableRockCaves2;\r\n case 225: return ObjectType.DestructableRockCaves3;\r\n case 256: return ObjectType.MinesDoor;\r\n case 257: return ObjectType.FloorPanel3;\r\n case 258: return ObjectType.MinesSwitchDoor;\r\n case 259: return ObjectType.LargeCryoTube;\r\n case 260: return ObjectType.ComputerLikeCalus;\r\n case 261: return ObjectType.GreenScreenOpeningAndClosing;\r\n case 262: return ObjectType.FloatingRobot;\r\n case 263: return ObjectType.FloatingBlueLight;\r\n case 264: return ObjectType.SelfDestructingObject1;\r\n case 265: return ObjectType.SelfDestructingObject2;\r\n case 266: return ObjectType.SelfDestructingObject3;\r\n case 267: return ObjectType.SparkMachine;\r\n case 268: return ObjectType.MinesLargeFlashingCrate;\r\n case 304: return ObjectType.RuinsSeal;\r\n case 320: return ObjectType.RuinsTeleporter;\r\n case 321: return ObjectType.RuinsWarpSiteToSite;\r\n case 322: return ObjectType.RuinsSwitch;\r\n case 323: return ObjectType.FloorPanel4;\r\n case 324: return ObjectType.Ruins1Door;\r\n case 325: return ObjectType.Ruins3Door;\r\n case 326: return ObjectType.Ruins2Door;\r\n case 327: return ObjectType.Ruins11ButtonDoor;\r\n case 328: return ObjectType.Ruins21ButtonDoor;\r\n case 329: return ObjectType.Ruins31ButtonDoor;\r\n case 330: return ObjectType.Ruins4ButtonDoor;\r\n case 331: return ObjectType.Ruins2ButtonDoor;\r\n case 332: return ObjectType.RuinsSensor;\r\n case 333: return ObjectType.RuinsFenceSwitch;\r\n case 334: return ObjectType.RuinsLaserFence4x2;\r\n case 335: return ObjectType.RuinsLaserFence6x2;\r\n case 336: return ObjectType.RuinsLaserFence4x4;\r\n case 337: return ObjectType.RuinsLaserFence6x4;\r\n case 338: return ObjectType.RuinsPoisonBlob;\r\n case 339: return ObjectType.RuinsPilarTrap;\r\n case 340: return ObjectType.PopupTrapNoTech;\r\n case 341: return ObjectType.RuinsCrystal;\r\n case 342: return ObjectType.Monument;\r\n case 345: return ObjectType.RuinsRock1;\r\n case 346: return ObjectType.RuinsRock2;\r\n case 347: return ObjectType.RuinsRock3;\r\n case 348: return ObjectType.RuinsRock4;\r\n case 349: return ObjectType.RuinsRock5;\r\n case 350: return ObjectType.RuinsRock6;\r\n case 351: return ObjectType.RuinsRock7;\r\n case 352: return ObjectType.Poison;\r\n case 353: return ObjectType.FixedBoxTypeRuins;\r\n case 354: return ObjectType.RandomBoxTypeRuins;\r\n case 355: return ObjectType.EnemyTypeBoxYellow;\r\n case 356: return ObjectType.EnemyTypeBoxBlue;\r\n case 357: return ObjectType.EmptyTypeBoxBlue;\r\n case 358: return ObjectType.DestructableRock;\r\n case 359: return ObjectType.PopupTrapsTechs;\r\n case 368: return ObjectType.FlyingWhiteBird;\r\n case 369: return ObjectType.Tower;\r\n case 370: return ObjectType.FloatingRocks;\r\n case 371: return ObjectType.FloatingSoul;\r\n case 372: return ObjectType.Butterfly;\r\n case 384: return ObjectType.LobbyGameMenu;\r\n case 385: return ObjectType.LobbyWarpObject;\r\n case 386: return ObjectType.Lobby1EventObjectDefaultTree;\r\n case 387: return ObjectType.UnknownItem387;\r\n case 388: return ObjectType.UnknownItem388;\r\n case 389: return ObjectType.UnknownItem389;\r\n case 390: return ObjectType.LobbyEventObjectStaticPumpkin;\r\n case 391: return ObjectType.LobbyEventObject3ChristmasWindows;\r\n case 392: return ObjectType.LobbyEventObjectRedAndWhiteCurtain;\r\n case 393: return ObjectType.UnknownItem393;\r\n case 394: return ObjectType.UnknownItem394;\r\n case 395: return ObjectType.LobbyFishTank;\r\n case 396: return ObjectType.LobbyEventObjectButterflies;\r\n case 400: return ObjectType.UnknownItem400;\r\n case 401: return ObjectType.GreyWallLow;\r\n case 402: return ObjectType.SpaceshipDoor;\r\n case 403: return ObjectType.GreyWallHigh;\r\n case 416: return ObjectType.TempleNormalDoor;\r\n case 417: return ObjectType.BreakableWallWallButUnbreakable;\r\n case 418: return ObjectType.BrokenCilinderAndRubble;\r\n case 419: return ObjectType.ThreeBrokenWallPiecesOnFloor;\r\n case 420: return ObjectType.HighBrickCilinder;\r\n case 421: return ObjectType.LyingCilinder;\r\n case 422: return ObjectType.BrickConeWithFlatTop;\r\n case 423: return ObjectType.BreakableTempleWall;\r\n case 424: return ObjectType.TempleMapDetect;\r\n case 425: return ObjectType.SmallBrownBrickRisingBridge;\r\n case 426: return ObjectType.LongRisingBridgeWithPinkHighEdges;\r\n case 427: return ObjectType.FourSwitchTempleDoor;\r\n case 448: return ObjectType.FourButtonSpaceshipDoor;\r\n case 512: return ObjectType.ItemBoxCca;\r\n case 513: return ObjectType.TeleporterEp2;\r\n case 514: return ObjectType.CCADoor;\r\n case 515: return ObjectType.SpecialBoxCCA;\r\n case 516: return ObjectType.BigCCADoor;\r\n case 517: return ObjectType.BigCCADoorSwitch;\r\n case 518: return ObjectType.LittleRock;\r\n case 519: return ObjectType.Little3StoneWall;\r\n case 520: return ObjectType.Medium3StoneWall;\r\n case 521: return ObjectType.SpiderPlant;\r\n case 522: return ObjectType.CCAAreaTeleporter;\r\n case 523: return ObjectType.UnknownItem523;\r\n case 524: return ObjectType.WhiteBird;\r\n case 525: return ObjectType.OrangeBird;\r\n case 527: return ObjectType.Saw;\r\n case 528: return ObjectType.LaserDetect;\r\n case 529: return ObjectType.UnknownItem529;\r\n case 530: return ObjectType.UnknownItem530;\r\n case 531: return ObjectType.Seagull;\r\n case 544: return ObjectType.Fish;\r\n case 545: return ObjectType.SeabedDoorWithBlueEdges;\r\n case 546: return ObjectType.SeabedDoorAlwaysOpenNonTriggerable;\r\n case 547: return ObjectType.LittleCryotube;\r\n case 548: return ObjectType.WideGlassWallBreakable;\r\n case 549: return ObjectType.BlueFloatingRobot;\r\n case 550: return ObjectType.RedFloatingRobot;\r\n case 551: return ObjectType.Dolphin;\r\n case 552: return ObjectType.CaptureTrap;\r\n case 553: return ObjectType.VRLink;\r\n case 576: return ObjectType.UnknownItem576;\r\n case 640: return ObjectType.WarpInBarbaRayRoom;\r\n case 672: return ObjectType.UnknownItem672;\r\n case 688: return ObjectType.GeeNest;\r\n case 689: return ObjectType.LabComputerConsole;\r\n case 690: return ObjectType.LabComputerConsoleGreenScreen;\r\n case 691: return ObjectType.ChairYelllowPillow;\r\n case 692: return ObjectType.OrangeWallWithHoleInMiddle;\r\n case 693: return ObjectType.GreyWallWithHoleInMiddle;\r\n case 694: return ObjectType.LongTable;\r\n case 695: return ObjectType.GBAStation;\r\n case 696: return ObjectType.TalkLinkToSupport;\r\n case 697: return ObjectType.InstaWarp;\r\n case 698: return ObjectType.LabInvisibleObject;\r\n case 699: return ObjectType.LabGlassWindowDoor;\r\n case 700: return ObjectType.UnknownItem700;\r\n case 701: return ObjectType.LabCelingWarp;\r\n case 768: return ObjectType.Ep4LightSource;\r\n case 769: return ObjectType.Cacti;\r\n case 770: return ObjectType.BigBrownRock;\r\n case 771: return ObjectType.BreakableBrownRock;\r\n case 832: return ObjectType.UnknownItem832;\r\n case 833: return ObjectType.UnknownItem833;\r\n case 896: return ObjectType.PoisonPlant;\r\n case 897: return ObjectType.UnknownItem897;\r\n case 898: return ObjectType.UnknownItem898;\r\n case 899: return ObjectType.OozingDesertPlant;\r\n case 901: return ObjectType.UnknownItem901;\r\n case 902: return ObjectType.BigBlackRocks;\r\n case 903: return ObjectType.UnknownItem903;\r\n case 904: return ObjectType.UnknownItem904;\r\n case 905: return ObjectType.UnknownItem905;\r\n case 906: return ObjectType.UnknownItem906;\r\n case 907: return ObjectType.FallingRock;\r\n case 908: return ObjectType.DesertPlantHasCollision;\r\n case 909: return ObjectType.DesertFixedTypeBoxBreakableCrystals;\r\n case 910: return ObjectType.UnknownItem910;\r\n case 911: return ObjectType.BeeHive;\r\n case 912: return ObjectType.UnknownItem912;\r\n case 913: return ObjectType.Heat;\r\n case 960: return ObjectType.TopOfSaintMillionEgg;\r\n case 961: return ObjectType.UnknownItem961;\r\n }\r\n }\r\n}\r\n\r\n(function () {\r\n let id = 1;\r\n\r\n ObjectType.Unknown = new ObjectType(id++, undefined, 'Unknown');\r\n\r\n ObjectType.PlayerSet = new ObjectType(id++, 0, 'Player Set');\r\n ObjectType.Particle = new ObjectType(id++, 1, 'Particle');\r\n ObjectType.Teleporter = new ObjectType(id++, 2, 'Teleporter');\r\n ObjectType.Warp = new ObjectType(id++, 3, 'Warp');\r\n ObjectType.LightCollision = new ObjectType(id++, 4, 'Light Collision');\r\n ObjectType.Item = new ObjectType(id++, 5, 'Item');\r\n ObjectType.EnvSound = new ObjectType(id++, 6, 'Env Sound');\r\n ObjectType.FogCollision = new ObjectType(id++, 7, 'Fog Collision');\r\n ObjectType.EventCollision = new ObjectType(id++, 8, 'Event Collision');\r\n ObjectType.CharaCollision = new ObjectType(id++, 9, 'Chara Collision');\r\n ObjectType.ElementalTrap = new ObjectType(id++, 10, 'Elemental Trap');\r\n ObjectType.StatusTrap = new ObjectType(id++, 11, 'Status Trap');\r\n ObjectType.HealTrap = new ObjectType(id++, 12, 'Heal Trap');\r\n ObjectType.LargeElementalTrap = new ObjectType(id++, 13, 'Large Elemental Trap');\r\n ObjectType.ObjRoomID = new ObjectType(id++, 14, 'Obj Room ID');\r\n ObjectType.Sensor = new ObjectType(id++, 15, 'Sensor');\r\n ObjectType.UnknownItem16 = new ObjectType(id++, 16, 'Unknown Item (16)');\r\n ObjectType.Lensflare = new ObjectType(id++, 17, 'Lensflare');\r\n ObjectType.ScriptCollision = new ObjectType(id++, 18, 'Script Collision');\r\n ObjectType.HealRing = new ObjectType(id++, 19, 'Heal Ring');\r\n ObjectType.MapCollision = new ObjectType(id++, 20, 'Map Collision');\r\n ObjectType.ScriptCollisionA = new ObjectType(id++, 21, 'Script Collision A');\r\n ObjectType.ItemLight = new ObjectType(id++, 22, 'Item Light');\r\n ObjectType.RadarCollision = new ObjectType(id++, 23, 'Radar Collision');\r\n ObjectType.FogCollisionSW = new ObjectType(id++, 24, 'Fog Collision SW');\r\n ObjectType.BossTeleporter = new ObjectType(id++, 25, 'Boss Teleporter');\r\n ObjectType.ImageBoard = new ObjectType(id++, 26, 'Image Board');\r\n ObjectType.QuestWarp = new ObjectType(id++, 27, 'Quest Warp');\r\n ObjectType.Epilogue = new ObjectType(id++, 28, 'Epilogue');\r\n ObjectType.UnknownItem29 = new ObjectType(id++, 29, 'Unknown Item (29)');\r\n ObjectType.UnknownItem30 = new ObjectType(id++, 30, 'Unknown Item (30)');\r\n ObjectType.UnknownItem31 = new ObjectType(id++, 31, 'Unknown Item (31)');\r\n ObjectType.BoxDetectObject = new ObjectType(id++, 32, 'Box Detect Object');\r\n ObjectType.SymbolChatObject = new ObjectType(id++, 33, 'Symbol Chat Object');\r\n ObjectType.TouchPlateObject = new ObjectType(id++, 34, 'Touch plate Object');\r\n ObjectType.TargetableObject = new ObjectType(id++, 35, 'Targetable Object');\r\n ObjectType.EffectObject = new ObjectType(id++, 36, 'Effect object');\r\n ObjectType.CountDownObject = new ObjectType(id++, 37, 'Count Down Object');\r\n ObjectType.UnknownItem38 = new ObjectType(id++, 38, 'Unknown Item (38)');\r\n ObjectType.UnknownItem39 = new ObjectType(id++, 39, 'Unknown Item (39)');\r\n ObjectType.UnknownItem40 = new ObjectType(id++, 40, 'Unknown Item (40)');\r\n ObjectType.UnknownItem41 = new ObjectType(id++, 41, 'Unknown Item (41)');\r\n ObjectType.MenuActivation = new ObjectType(id++, 64, 'Menu activation');\r\n ObjectType.TelepipeLocation = new ObjectType(id++, 65, 'Telepipe Location');\r\n ObjectType.BGMCollision = new ObjectType(id++, 66, 'BGM Collision');\r\n ObjectType.MainRagolTeleporter = new ObjectType(id++, 67, 'Main Ragol Teleporter');\r\n ObjectType.LobbyTeleporter = new ObjectType(id++, 68, 'Lobby Teleporter');\r\n ObjectType.PrincipalWarp = new ObjectType(id++, 69, 'Principal warp');\r\n ObjectType.ShopDoor = new ObjectType(id++, 70, 'Shop Door');\r\n ObjectType.HuntersGuildDoor = new ObjectType(id++, 71, 'Hunter\\'s Guild Door');\r\n ObjectType.TeleporterDoor = new ObjectType(id++, 72, 'Teleporter Door');\r\n ObjectType.MedicalCenterDoor = new ObjectType(id++, 73, 'Medical Center Door');\r\n ObjectType.Elevator = new ObjectType(id++, 74, 'Elevator');\r\n ObjectType.EasterEgg = new ObjectType(id++, 75, 'Easter Egg');\r\n ObjectType.ValentinesHeart = new ObjectType(id++, 76, 'Valentines Heart');\r\n ObjectType.ChristmasTree = new ObjectType(id++, 77, 'Christmas Tree');\r\n ObjectType.ChristmasWreath = new ObjectType(id++, 78, 'Christmas Wreath');\r\n ObjectType.HalloweenPumpkin = new ObjectType(id++, 79, 'Halloween Pumpkin');\r\n ObjectType.TwentyFirstCentury = new ObjectType(id++, 80, '21st Century');\r\n ObjectType.Sonic = new ObjectType(id++, 81, 'Sonic');\r\n ObjectType.WelcomeBoard = new ObjectType(id++, 82, 'Welcome Board');\r\n ObjectType.Firework = new ObjectType(id++, 83, 'Firework');\r\n ObjectType.LobbyScreenDoor = new ObjectType(id++, 84, 'Lobby Screen Door');\r\n ObjectType.MainRagolTeleporterBattleInNextArea = new ObjectType(id++, 85, 'Main Ragol Teleporter (Battle in next area?)');\r\n ObjectType.LabTeleporterDoor = new ObjectType(id++, 86, 'Lab Teleporter Door');\r\n ObjectType.Pioneer2InvisibleTouchplate = new ObjectType(id++, 87, 'Pioneer 2 Invisible Touchplate');\r\n ObjectType.ForestDoor = new ObjectType(id++, 128, 'Forest Door');\r\n ObjectType.ForestSwitch = new ObjectType(id++, 129, 'Forest Switch');\r\n ObjectType.LaserFence = new ObjectType(id++, 130, 'Laser Fence');\r\n ObjectType.LaserSquareFence = new ObjectType(id++, 131, 'Laser Square Fence');\r\n ObjectType.ForestLaserFenceSwitch = new ObjectType(id++, 132, 'Forest Laser Fence Switch');\r\n ObjectType.LightRays = new ObjectType(id++, 133, 'Light rays');\r\n ObjectType.BlueButterfly = new ObjectType(id++, 134, 'Blue Butterfly');\r\n ObjectType.Probe = new ObjectType(id++, 135, 'Probe');\r\n ObjectType.RandomTypeBox1 = new ObjectType(id++, 136, 'Random Type Box 1');\r\n ObjectType.ForestWeatherStation = new ObjectType(id++, 137, 'Forest Weather Station');\r\n ObjectType.Battery = new ObjectType(id++, 138, 'Battery');\r\n ObjectType.ForestConsole = new ObjectType(id++, 139, 'Forest Console');\r\n ObjectType.BlackSlidingDoor = new ObjectType(id++, 140, 'Black Sliding Door');\r\n ObjectType.RicoMessagePod = new ObjectType(id++, 141, 'Rico Message Pod');\r\n ObjectType.EnergyBarrier = new ObjectType(id++, 142, 'Energy Barrier');\r\n ObjectType.ForestRisingBridge = new ObjectType(id++, 143, 'Forest Rising Bridge');\r\n ObjectType.SwitchNoneDoor = new ObjectType(id++, 144, 'Switch (none door)');\r\n ObjectType.EnemyBoxGrey = new ObjectType(id++, 145, 'Enemy Box (Grey)');\r\n ObjectType.FixedTypeBox = new ObjectType(id++, 146, 'Fixed Type Box');\r\n ObjectType.EnemyBoxBrown = new ObjectType(id++, 147, 'Enemy Box (Brown)');\r\n ObjectType.EmptyTypeBox = new ObjectType(id++, 149, 'Empty Type Box');\r\n ObjectType.LaserFenseEx = new ObjectType(id++, 150, 'Laser Fense Ex');\r\n ObjectType.LaserSquareFenceEx = new ObjectType(id++, 151, 'Laser Square Fence Ex');\r\n ObjectType.FloorPanel1 = new ObjectType(id++, 192, 'Floor Panel 1');\r\n ObjectType.Caves4ButtonDoor = new ObjectType(id++, 193, 'Caves 4 Button door');\r\n ObjectType.CavesNormalDoor = new ObjectType(id++, 194, 'Caves Normal door');\r\n ObjectType.CavesSmashingPillar = new ObjectType(id++, 195, 'Caves Smashing Pillar');\r\n ObjectType.CavesSign1 = new ObjectType(id++, 196, 'Caves Sign 1');\r\n ObjectType.CavesSign2 = new ObjectType(id++, 197, 'Caves Sign 2');\r\n ObjectType.CavesSign3 = new ObjectType(id++, 198, 'Caves Sign 3');\r\n ObjectType.HexagalTank = new ObjectType(id++, 199, 'Hexagal Tank');\r\n ObjectType.BrownPlatform = new ObjectType(id++, 200, 'Brown Platform');\r\n ObjectType.WarningLightObject = new ObjectType(id++, 201, 'Warning Light Object');\r\n ObjectType.Rainbow = new ObjectType(id++, 203, 'Rainbow');\r\n ObjectType.FloatingJelifish = new ObjectType(id++, 204, 'Floating Jelifish');\r\n ObjectType.FloatingDragonfly = new ObjectType(id++, 205, 'Floating Dragonfly');\r\n ObjectType.CavesSwitchDoor = new ObjectType(id++, 206, 'Caves Switch Door');\r\n ObjectType.RobotRechargeStation = new ObjectType(id++, 207, 'Robot Recharge Station');\r\n ObjectType.CavesCakeShop = new ObjectType(id++, 208, 'Caves Cake Shop');\r\n ObjectType.Caves1SmallRedRock = new ObjectType(id++, 209, 'Caves 1 Small Red Rock');\r\n ObjectType.Caves1MediumRedRock = new ObjectType(id++, 210, 'Caves 1 Medium Red Rock');\r\n ObjectType.Caves1LargeRedRock = new ObjectType(id++, 211, 'Caves 1 Large Red Rock');\r\n ObjectType.Caves2SmallRock1 = new ObjectType(id++, 212, 'Caves 2 Small Rock 1');\r\n ObjectType.Caves2MediumRock1 = new ObjectType(id++, 213, 'Caves 2 Medium Rock 1');\r\n ObjectType.Caves2LargeRock1 = new ObjectType(id++, 214, 'Caves 2 Large Rock 1');\r\n ObjectType.Caves2SmallRock2 = new ObjectType(id++, 215, 'Caves 2 Small Rock 2');\r\n ObjectType.Caves2MediumRock2 = new ObjectType(id++, 216, 'Caves 2 Medium Rock 2');\r\n ObjectType.Caves2LargeRock2 = new ObjectType(id++, 217, 'Caves 2 Large Rock 2');\r\n ObjectType.Caves3SmallRock = new ObjectType(id++, 218, 'Caves 3 Small Rock');\r\n ObjectType.Caves3MediumRock = new ObjectType(id++, 219, 'Caves 3 Medium Rock');\r\n ObjectType.Caves3LargeRock = new ObjectType(id++, 220, 'Caves 3 Large Rock');\r\n ObjectType.FloorPanel2 = new ObjectType(id++, 222, 'Floor Panel 2');\r\n ObjectType.DestructableRockCaves1 = new ObjectType(id++, 223, 'Destructable Rock (Caves 1)');\r\n ObjectType.DestructableRockCaves2 = new ObjectType(id++, 224, 'Destructable Rock (Caves 2)');\r\n ObjectType.DestructableRockCaves3 = new ObjectType(id++, 225, 'Destructable Rock (Caves 3)');\r\n ObjectType.MinesDoor = new ObjectType(id++, 256, 'Mines Door');\r\n ObjectType.FloorPanel3 = new ObjectType(id++, 257, 'Floor Panel 3');\r\n ObjectType.MinesSwitchDoor = new ObjectType(id++, 258, 'Mines Switch Door');\r\n ObjectType.LargeCryoTube = new ObjectType(id++, 259, 'Large Cryo-Tube');\r\n ObjectType.ComputerLikeCalus = new ObjectType(id++, 260, 'Computer (like calus)');\r\n ObjectType.GreenScreenOpeningAndClosing = new ObjectType(id++, 261, 'Green Screen opening and closing');\r\n ObjectType.FloatingRobot = new ObjectType(id++, 262, 'Floating Robot');\r\n ObjectType.FloatingBlueLight = new ObjectType(id++, 263, 'Floating Blue Light');\r\n ObjectType.SelfDestructingObject1 = new ObjectType(id++, 264, 'Self Destructing Object 1');\r\n ObjectType.SelfDestructingObject2 = new ObjectType(id++, 265, 'Self Destructing Object 2');\r\n ObjectType.SelfDestructingObject3 = new ObjectType(id++, 266, 'Self Destructing Object 3');\r\n ObjectType.SparkMachine = new ObjectType(id++, 267, 'Spark Machine');\r\n ObjectType.MinesLargeFlashingCrate = new ObjectType(id++, 268, 'Mines Large Flashing Crate');\r\n ObjectType.RuinsSeal = new ObjectType(id++, 304, 'Ruins Seal');\r\n ObjectType.RuinsTeleporter = new ObjectType(id++, 320, 'Ruins Teleporter');\r\n ObjectType.RuinsWarpSiteToSite = new ObjectType(id++, 321, 'Ruins Warp (Site to site)');\r\n ObjectType.RuinsSwitch = new ObjectType(id++, 322, 'Ruins Switch');\r\n ObjectType.FloorPanel4 = new ObjectType(id++, 323, 'Floor Panel 4');\r\n ObjectType.Ruins1Door = new ObjectType(id++, 324, 'Ruins 1 Door');\r\n ObjectType.Ruins3Door = new ObjectType(id++, 325, 'Ruins 3 Door');\r\n ObjectType.Ruins2Door = new ObjectType(id++, 326, 'Ruins 2 Door');\r\n ObjectType.Ruins11ButtonDoor = new ObjectType(id++, 327, 'Ruins 1-1 Button Door');\r\n ObjectType.Ruins21ButtonDoor = new ObjectType(id++, 328, 'Ruins 2-1 Button Door');\r\n ObjectType.Ruins31ButtonDoor = new ObjectType(id++, 329, 'Ruins 3-1 Button Door');\r\n ObjectType.Ruins4ButtonDoor = new ObjectType(id++, 330, 'Ruins 4-Button Door');\r\n ObjectType.Ruins2ButtonDoor = new ObjectType(id++, 331, 'Ruins 2-Button Door');\r\n ObjectType.RuinsSensor = new ObjectType(id++, 332, 'Ruins Sensor');\r\n ObjectType.RuinsFenceSwitch = new ObjectType(id++, 333, 'Ruins Fence Switch');\r\n ObjectType.RuinsLaserFence4x2 = new ObjectType(id++, 334, 'Ruins Laser Fence 4x2');\r\n ObjectType.RuinsLaserFence6x2 = new ObjectType(id++, 335, 'Ruins Laser Fence 6x2');\r\n ObjectType.RuinsLaserFence4x4 = new ObjectType(id++, 336, 'Ruins Laser Fence 4x4');\r\n ObjectType.RuinsLaserFence6x4 = new ObjectType(id++, 337, 'Ruins Laser Fence 6x4');\r\n ObjectType.RuinsPoisonBlob = new ObjectType(id++, 338, 'Ruins poison Blob');\r\n ObjectType.RuinsPilarTrap = new ObjectType(id++, 339, 'Ruins Pilar Trap');\r\n ObjectType.PopupTrapNoTech = new ObjectType(id++, 340, 'Popup Trap (No Tech)');\r\n ObjectType.RuinsCrystal = new ObjectType(id++, 341, 'Ruins Crystal');\r\n ObjectType.Monument = new ObjectType(id++, 342, 'Monument');\r\n ObjectType.RuinsRock1 = new ObjectType(id++, 345, 'Ruins Rock 1');\r\n ObjectType.RuinsRock2 = new ObjectType(id++, 346, 'Ruins Rock 2');\r\n ObjectType.RuinsRock3 = new ObjectType(id++, 347, 'Ruins Rock 3');\r\n ObjectType.RuinsRock4 = new ObjectType(id++, 348, 'Ruins Rock 4');\r\n ObjectType.RuinsRock5 = new ObjectType(id++, 349, 'Ruins Rock 5');\r\n ObjectType.RuinsRock6 = new ObjectType(id++, 350, 'Ruins Rock 6');\r\n ObjectType.RuinsRock7 = new ObjectType(id++, 351, 'Ruins Rock 7');\r\n ObjectType.Poison = new ObjectType(id++, 352, 'Poison');\r\n ObjectType.FixedBoxTypeRuins = new ObjectType(id++, 353, 'Fixed Box Type (Ruins)');\r\n ObjectType.RandomBoxTypeRuins = new ObjectType(id++, 354, 'Random Box Type (Ruins)');\r\n ObjectType.EnemyTypeBoxYellow = new ObjectType(id++, 355, 'Enemy Type Box (Yellow)');\r\n ObjectType.EnemyTypeBoxBlue = new ObjectType(id++, 356, 'Enemy Type Box (Blue)');\r\n ObjectType.EmptyTypeBoxBlue = new ObjectType(id++, 357, 'Empty Type Box (Blue)');\r\n ObjectType.DestructableRock = new ObjectType(id++, 358, 'Destructable Rock');\r\n ObjectType.PopupTrapsTechs = new ObjectType(id++, 359, 'Popup Traps (techs)');\r\n ObjectType.FlyingWhiteBird = new ObjectType(id++, 368, 'Flying White Bird');\r\n ObjectType.Tower = new ObjectType(id++, 369, 'Tower');\r\n ObjectType.FloatingRocks = new ObjectType(id++, 370, 'Floating Rocks');\r\n ObjectType.FloatingSoul = new ObjectType(id++, 371, 'Floating Soul');\r\n ObjectType.Butterfly = new ObjectType(id++, 372, 'Butterfly');\r\n ObjectType.LobbyGameMenu = new ObjectType(id++, 384, 'Lobby Game menu');\r\n ObjectType.LobbyWarpObject = new ObjectType(id++, 385, 'Lobby Warp Object');\r\n ObjectType.Lobby1EventObjectDefaultTree = new ObjectType(id++, 386, 'Lobby 1 Event Object (Default Tree)');\r\n ObjectType.UnknownItem387 = new ObjectType(id++, 387, 'Unknown Item (387)');\r\n ObjectType.UnknownItem388 = new ObjectType(id++, 388, 'Unknown Item (388)');\r\n ObjectType.UnknownItem389 = new ObjectType(id++, 389, 'Unknown Item (389)');\r\n ObjectType.LobbyEventObjectStaticPumpkin = new ObjectType(id++, 390, 'Lobby Event Object (Static Pumpkin)');\r\n ObjectType.LobbyEventObject3ChristmasWindows = new ObjectType(id++, 391, 'Lobby Event Object (3 Christmas Windows)');\r\n ObjectType.LobbyEventObjectRedAndWhiteCurtain = new ObjectType(id++, 392, 'Lobby Event Object (Red and White Curtain)');\r\n ObjectType.UnknownItem393 = new ObjectType(id++, 393, 'Unknown Item (393)');\r\n ObjectType.UnknownItem394 = new ObjectType(id++, 394, 'Unknown Item (394)');\r\n ObjectType.LobbyFishTank = new ObjectType(id++, 395, 'Lobby Fish Tank');\r\n ObjectType.LobbyEventObjectButterflies = new ObjectType(id++, 396, 'Lobby Event Object (Butterflies)');\r\n ObjectType.UnknownItem400 = new ObjectType(id++, 400, 'Unknown Item (400)');\r\n ObjectType.GreyWallLow = new ObjectType(id++, 401, 'grey wall low');\r\n ObjectType.SpaceshipDoor = new ObjectType(id++, 402, 'Spaceship Door');\r\n ObjectType.GreyWallHigh = new ObjectType(id++, 403, 'grey wall high');\r\n ObjectType.TempleNormalDoor = new ObjectType(id++, 416, 'Temple Normal Door');\r\n ObjectType.BreakableWallWallButUnbreakable = new ObjectType(id++, 417, '\"breakable wall wall, but unbreakable\"');\r\n ObjectType.BrokenCilinderAndRubble = new ObjectType(id++, 418, 'Broken cilinder and rubble');\r\n ObjectType.ThreeBrokenWallPiecesOnFloor = new ObjectType(id++, 419, '3 broken wall pieces on floor');\r\n ObjectType.HighBrickCilinder = new ObjectType(id++, 420, 'high brick cilinder');\r\n ObjectType.LyingCilinder = new ObjectType(id++, 421, 'lying cilinder');\r\n ObjectType.BrickConeWithFlatTop = new ObjectType(id++, 422, 'brick cone with flat top');\r\n ObjectType.BreakableTempleWall = new ObjectType(id++, 423, 'breakable temple wall');\r\n ObjectType.TempleMapDetect = new ObjectType(id++, 424, 'Temple Map Detect');\r\n ObjectType.SmallBrownBrickRisingBridge = new ObjectType(id++, 425, 'small brown brick rising bridge');\r\n ObjectType.LongRisingBridgeWithPinkHighEdges = new ObjectType(id++, 426, 'long rising bridge (with pink high edges)');\r\n ObjectType.FourSwitchTempleDoor = new ObjectType(id++, 427, '4 switch temple door');\r\n ObjectType.FourButtonSpaceshipDoor = new ObjectType(id++, 448, '4 button spaceship door');\r\n ObjectType.ItemBoxCca = new ObjectType(id++, 512, 'item box cca');\r\n ObjectType.TeleporterEp2 = new ObjectType(id++, 513, 'Teleporter (Ep 2)');\r\n ObjectType.CCADoor = new ObjectType(id++, 514, 'CCA Door');\r\n ObjectType.SpecialBoxCCA = new ObjectType(id++, 515, 'Special Box CCA');\r\n ObjectType.BigCCADoor = new ObjectType(id++, 516, 'Big CCA Door');\r\n ObjectType.BigCCADoorSwitch = new ObjectType(id++, 517, 'Big CCA Door Switch');\r\n ObjectType.LittleRock = new ObjectType(id++, 518, 'Little Rock');\r\n ObjectType.Little3StoneWall = new ObjectType(id++, 519, 'Little 3 Stone Wall');\r\n ObjectType.Medium3StoneWall = new ObjectType(id++, 520, 'Medium 3 stone wall');\r\n ObjectType.SpiderPlant = new ObjectType(id++, 521, 'Spider Plant');\r\n ObjectType.CCAAreaTeleporter = new ObjectType(id++, 522, 'CCA Area Teleporter');\r\n ObjectType.UnknownItem523 = new ObjectType(id++, 523, 'Unknown Item (523)');\r\n ObjectType.WhiteBird = new ObjectType(id++, 524, 'White Bird');\r\n ObjectType.OrangeBird = new ObjectType(id++, 525, 'Orange Bird');\r\n ObjectType.Saw = new ObjectType(id++, 527, 'Saw');\r\n ObjectType.LaserDetect = new ObjectType(id++, 528, 'Laser Detect');\r\n ObjectType.UnknownItem529 = new ObjectType(id++, 529, 'Unknown Item (529)');\r\n ObjectType.UnknownItem530 = new ObjectType(id++, 530, 'Unknown Item (530)');\r\n ObjectType.Seagull = new ObjectType(id++, 531, 'Seagull');\r\n ObjectType.Fish = new ObjectType(id++, 544, 'Fish');\r\n ObjectType.SeabedDoorWithBlueEdges = new ObjectType(id++, 545, 'Seabed Door (with blue edges)');\r\n ObjectType.SeabedDoorAlwaysOpenNonTriggerable = new ObjectType(id++, 546, 'Seabed door (always open, non-triggerable)');\r\n ObjectType.LittleCryotube = new ObjectType(id++, 547, 'Little Cryotube');\r\n ObjectType.WideGlassWallBreakable = new ObjectType(id++, 548, 'Wide Glass Wall (breakable)');\r\n ObjectType.BlueFloatingRobot = new ObjectType(id++, 549, 'Blue floating robot');\r\n ObjectType.RedFloatingRobot = new ObjectType(id++, 550, 'Red floating robot');\r\n ObjectType.Dolphin = new ObjectType(id++, 551, 'Dolphin');\r\n ObjectType.CaptureTrap = new ObjectType(id++, 552, 'Capture Trap');\r\n ObjectType.VRLink = new ObjectType(id++, 553, 'VR link');\r\n ObjectType.UnknownItem576 = new ObjectType(id++, 576, 'Unknown Item (576)');\r\n ObjectType.WarpInBarbaRayRoom = new ObjectType(id++, 640, 'Warp in Barba Ray Room');\r\n ObjectType.UnknownItem672 = new ObjectType(id++, 672, 'Unknown Item (672)');\r\n ObjectType.GeeNest = new ObjectType(id++, 688, 'Gee Nest');\r\n ObjectType.LabComputerConsole = new ObjectType(id++, 689, 'Lab Computer Console');\r\n ObjectType.LabComputerConsoleGreenScreen = new ObjectType(id++, 690, 'Lab Computer Console (Green Screen)');\r\n ObjectType.ChairYelllowPillow = new ObjectType(id++, 691, 'Chair, Yelllow Pillow');\r\n ObjectType.OrangeWallWithHoleInMiddle = new ObjectType(id++, 692, 'orange wall with hole in middle');\r\n ObjectType.GreyWallWithHoleInMiddle = new ObjectType(id++, 693, 'grey wall with hole in middle');\r\n ObjectType.LongTable = new ObjectType(id++, 694, 'long table');\r\n ObjectType.GBAStation = new ObjectType(id++, 695, 'GBA Station');\r\n ObjectType.TalkLinkToSupport = new ObjectType(id++, 696, 'Talk (link to support)');\r\n ObjectType.InstaWarp = new ObjectType(id++, 697, 'insta-warp');\r\n ObjectType.LabInvisibleObject = new ObjectType(id++, 698, 'Lab Invisible Object');\r\n ObjectType.LabGlassWindowDoor = new ObjectType(id++, 699, 'Lab Glass window Door');\r\n ObjectType.UnknownItem700 = new ObjectType(id++, 700, 'Unknown Item (700)');\r\n ObjectType.LabCelingWarp = new ObjectType(id++, 701, 'Lab Celing Warp');\r\n ObjectType.Ep4LightSource = new ObjectType(id++, 768, 'Ep4 Light Source');\r\n ObjectType.Cacti = new ObjectType(id++, 769, 'cacti');\r\n ObjectType.BigBrownRock = new ObjectType(id++, 770, 'Big Brown Rock');\r\n ObjectType.BreakableBrownRock = new ObjectType(id++, 771, 'Breakable Brown Rock');\r\n ObjectType.UnknownItem832 = new ObjectType(id++, 832, 'Unknown Item (832)');\r\n ObjectType.UnknownItem833 = new ObjectType(id++, 833, 'Unknown Item (833)');\r\n ObjectType.PoisonPlant = new ObjectType(id++, 896, 'Poison Plant');\r\n ObjectType.UnknownItem897 = new ObjectType(id++, 897, 'Unknown Item (897)');\r\n ObjectType.UnknownItem898 = new ObjectType(id++, 898, 'Unknown Item (898)');\r\n ObjectType.OozingDesertPlant = new ObjectType(id++, 899, 'Oozing Desert Plant');\r\n ObjectType.UnknownItem901 = new ObjectType(id++, 901, 'Unknown Item (901)');\r\n ObjectType.BigBlackRocks = new ObjectType(id++, 902, 'big black rocks');\r\n ObjectType.UnknownItem903 = new ObjectType(id++, 903, 'Unknown Item (903)');\r\n ObjectType.UnknownItem904 = new ObjectType(id++, 904, 'Unknown Item (904)');\r\n ObjectType.UnknownItem905 = new ObjectType(id++, 905, 'Unknown Item (905)');\r\n ObjectType.UnknownItem906 = new ObjectType(id++, 906, 'Unknown Item (906)');\r\n ObjectType.FallingRock = new ObjectType(id++, 907, 'Falling Rock');\r\n ObjectType.DesertPlantHasCollision = new ObjectType(id++, 908, 'Desert Plant (has collision)');\r\n ObjectType.DesertFixedTypeBoxBreakableCrystals = new ObjectType(id++, 909, 'Desert Fixed Type Box (Breakable Crystals)');\r\n ObjectType.UnknownItem910 = new ObjectType(id++, 910, 'Unknown Item (910)');\r\n ObjectType.BeeHive = new ObjectType(id++, 911, 'Bee Hive');\r\n ObjectType.UnknownItem912 = new ObjectType(id++, 912, 'Unknown Item (912)');\r\n ObjectType.Heat = new ObjectType(id++, 913, 'Heat');\r\n ObjectType.TopOfSaintMillionEgg = new ObjectType(id++, 960, 'Top of saint million egg');\r\n ObjectType.UnknownItem961 = new ObjectType(id++, 961, 'Unknown Item (961)');\r\n}());\r\n","export function enumValues<E>(e: any): E[] {\r\n const values = Object.values(e);\r\n const numberValues = values.filter(v => typeof v === 'number');\r\n\r\n if (numberValues.length) {\r\n return numberValues as any as E[];\r\n } else {\r\n return values as any as E[];\r\n }\r\n}\r\n\r\nexport function enumNames(e: any): string[] {\r\n return Object.keys(e).filter(k => typeof (e as any)[k] === 'string');\r\n}\r\n\r\n/**\r\n * Map with a guaranteed value per enum key.\r\n */\r\nexport class EnumMap<K, V> {\r\n private keys: K[];\r\n private values = new Map<K, V>();\r\n\r\n constructor(enum_: any, initialValue: (key: K) => V) {\r\n this.keys = enumValues(enum_);\r\n\r\n for (const key of this.keys) {\r\n this.values.set(key, initialValue(key));\r\n }\r\n }\r\n\r\n get(key: K): V {\r\n return this.values.get(key)!;\r\n }\r\n}\r\n","import { computed, observable } from 'mobx';\r\nimport { Object3D } from 'three';\r\nimport { ArrayBufferCursor } from '../bin-data/ArrayBufferCursor';\r\nimport { DatNpc, DatObject, DatUnknown } from '../bin-data/parsing/dat';\r\nimport { NpcType } from './NpcType';\r\nimport { ObjectType } from './ObjectType';\r\nimport { enumValues } from '../enums';\r\n\r\nexport { NpcType } from './NpcType';\r\nexport { ObjectType } from './ObjectType';\r\n\r\nexport const RARE_ENEMY_PROB = 1 / 512;\r\nexport const KONDRIEU_PROB = 1 / 512;\r\n\r\nexport enum Server {\r\n Ephinea = 'Ephinea'\r\n}\r\n\r\nexport const Servers: Server[] = enumValues(Server);\r\n\r\nexport enum Episode {\r\n I = 1,\r\n II = 2,\r\n IV = 4\r\n}\r\n\r\nexport function checkEpisode(episode: Episode) {\r\n if (!Episode[episode]) {\r\n throw new Error(`Invalid episode ${episode}.`);\r\n }\r\n}\r\n\r\nexport enum SectionId {\r\n Viridia = 'Viridia',\r\n Greenill = 'Greenill',\r\n Skyly = 'Skyly',\r\n Bluefull = 'Bluefull',\r\n Purplenum = 'Purplenum',\r\n Pinkal = 'Pinkal',\r\n Redria = 'Redria',\r\n Oran = 'Oran',\r\n Yellowboze = 'Yellowboze',\r\n Whitill = 'Whitill',\r\n}\r\n\r\nexport const SectionIds: SectionId[] = enumValues(SectionId);\r\n\r\nexport enum Difficulty {\r\n Normal = 'Normal',\r\n Hard = 'Hard',\r\n VHard = 'VHard',\r\n Ultimate = 'Ultimate'\r\n}\r\n\r\nexport const Difficulties: Difficulty[] = enumValues(Difficulty);\r\n\r\nexport class Vec3 {\r\n x: number;\r\n y: number;\r\n z: number;\r\n\r\n constructor(x?: number, y?: number, z?: number) {\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n this.z = z || 0;\r\n }\r\n\r\n add(v: Vec3): Vec3 {\r\n this.x += v.x;\r\n this.y += v.y;\r\n this.z += v.z;\r\n return this;\r\n }\r\n\r\n clone(x?: number, y?: number, z?: number) {\r\n return new Vec3(\r\n typeof x === 'number' ? x : this.x,\r\n typeof y === 'number' ? y : this.y,\r\n typeof z === 'number' ? z : this.z);\r\n }\r\n};\r\n\r\nexport class Section {\r\n id: number;\r\n @observable position: Vec3;\r\n @observable yAxisRotation: number;\r\n\r\n @computed get sinYAxisRotation(): number {\r\n return Math.sin(this.yAxisRotation);\r\n }\r\n\r\n @computed get cosYAxisRotation(): number {\r\n return Math.cos(this.yAxisRotation);\r\n }\r\n\r\n constructor(\r\n id: number,\r\n position: Vec3,\r\n yAxisRotation: number\r\n ) {\r\n if (!Number.isInteger(id) || id < -1)\r\n throw new Error(`Expected id to be an integer greater than or equal to -1, got ${id}.`);\r\n if (!position) throw new Error('position is required.');\r\n if (typeof yAxisRotation !== 'number') throw new Error('yAxisRotation is required.');\r\n\r\n this.id = id;\r\n this.position = position;\r\n this.yAxisRotation = yAxisRotation;\r\n }\r\n}\r\n\r\nexport class Quest {\r\n @observable name: string;\r\n @observable shortDescription: string;\r\n @observable longDescription: string;\r\n @observable questNo?: number;\r\n @observable episode: Episode;\r\n @observable areaVariants: AreaVariant[];\r\n @observable objects: QuestObject[];\r\n @observable npcs: QuestNpc[];\r\n /**\r\n * (Partial) raw DAT data that can't be parsed yet by Phantasmal.\r\n */\r\n datUnkowns: DatUnknown[];\r\n /**\r\n * (Partial) raw BIN data that can't be parsed yet by Phantasmal.\r\n */\r\n binData: ArrayBufferCursor;\r\n\r\n constructor(\r\n name: string,\r\n shortDescription: string,\r\n longDescription: string,\r\n questNo: number | undefined,\r\n episode: Episode,\r\n areaVariants: AreaVariant[],\r\n objects: QuestObject[],\r\n npcs: QuestNpc[],\r\n datUnknowns: DatUnknown[],\r\n binData: ArrayBufferCursor\r\n ) {\r\n if (questNo != null && (!Number.isInteger(questNo) || questNo < 0)) throw new Error('questNo should be null or a non-negative integer.');\r\n checkEpisode(episode);\r\n if (!objects || !(objects instanceof Array)) throw new Error('objs is required.');\r\n if (!npcs || !(npcs instanceof Array)) throw new Error('npcs is required.');\r\n\r\n this.name = name;\r\n this.shortDescription = shortDescription;\r\n this.longDescription = longDescription;\r\n this.questNo = questNo;\r\n this.episode = episode;\r\n this.areaVariants = areaVariants;\r\n this.objects = objects;\r\n this.npcs = npcs;\r\n this.datUnkowns = datUnknowns;\r\n this.binData = binData;\r\n }\r\n}\r\n\r\n/**\r\n * Abstract class from which QuestNpc and QuestObject derive.\r\n */\r\nexport class QuestEntity {\r\n @observable areaId: number;\r\n\r\n private _sectionId: number;\r\n\r\n @computed get sectionId(): number {\r\n return this.section ? this.section.id : this._sectionId;\r\n }\r\n\r\n @observable section?: Section;\r\n\r\n /**\r\n * World position\r\n */\r\n @observable position: Vec3;\r\n\r\n @observable rotation: Vec3;\r\n\r\n /**\r\n * Section-relative position\r\n */\r\n @computed get sectionPosition(): Vec3 {\r\n let { x, y, z } = this.position;\r\n\r\n if (this.section) {\r\n const relX = x - this.section.position.x;\r\n const relY = y - this.section.position.y;\r\n const relZ = z - this.section.position.z;\r\n const sin = -this.section.sinYAxisRotation;\r\n const cos = this.section.cosYAxisRotation;\r\n const rotX = cos * relX + sin * relZ;\r\n const rotZ = -sin * relX + cos * relZ;\r\n x = rotX;\r\n y = relY;\r\n z = rotZ;\r\n }\r\n\r\n return new Vec3(x, y, z);\r\n }\r\n\r\n set sectionPosition(sectPos: Vec3) {\r\n let { x: relX, y: relY, z: relZ } = sectPos;\r\n\r\n if (this.section) {\r\n const sin = -this.section.sinYAxisRotation;\r\n const cos = this.section.cosYAxisRotation;\r\n const rotX = cos * relX - sin * relZ;\r\n const rotZ = sin * relX + cos * relZ;\r\n const x = rotX + this.section.position.x;\r\n const y = relY + this.section.position.y;\r\n const z = rotZ + this.section.position.z;\r\n this.position = new Vec3(x, y, z);\r\n }\r\n }\r\n\r\n object3d?: Object3D;\r\n\r\n constructor(\r\n areaId: number,\r\n sectionId: number,\r\n position: Vec3,\r\n rotation: Vec3\r\n ) {\r\n if (Object.getPrototypeOf(this) === Object.getPrototypeOf(QuestEntity))\r\n throw new Error('Abstract class should not be instantiated directly.');\r\n if (!Number.isInteger(areaId) || areaId < 0)\r\n throw new Error(`Expected areaId to be a non-negative integer, got ${areaId}.`);\r\n if (!Number.isInteger(sectionId) || sectionId < 0)\r\n throw new Error(`Expected sectionId to be a non-negative integer, got ${sectionId}.`);\r\n if (!position) throw new Error('position is required.');\r\n if (!rotation) throw new Error('rotation is required.');\r\n\r\n this.areaId = areaId;\r\n this._sectionId = sectionId;\r\n this.position = position;\r\n this.rotation = rotation;\r\n }\r\n}\r\n\r\nexport class QuestObject extends QuestEntity {\r\n @observable type: ObjectType;\r\n /**\r\n * The raw data from a DAT file.\r\n */\r\n dat: DatObject;\r\n\r\n constructor(\r\n areaId: number,\r\n sectionId: number,\r\n position: Vec3,\r\n rotation: Vec3,\r\n type: ObjectType,\r\n dat: DatObject\r\n ) {\r\n super(areaId, sectionId, position, rotation);\r\n\r\n if (!type) throw new Error('type is required.');\r\n\r\n this.type = type;\r\n this.dat = dat;\r\n }\r\n}\r\n\r\nexport class QuestNpc extends QuestEntity {\r\n @observable type: NpcType;\r\n /**\r\n * The raw data from a DAT file.\r\n */\r\n dat: DatNpc;\r\n\r\n constructor(\r\n areaId: number,\r\n sectionId: number,\r\n position: Vec3,\r\n rotation: Vec3,\r\n type: NpcType,\r\n dat: DatNpc\r\n ) {\r\n super(areaId, sectionId, position, rotation);\r\n\r\n if (!type) throw new Error('type is required.');\r\n\r\n this.type = type;\r\n this.dat = dat;\r\n }\r\n}\r\n\r\nexport class Area {\r\n id: number;\r\n name: string;\r\n order: number;\r\n areaVariants: AreaVariant[];\r\n\r\n constructor(id: number, name: string, order: number, areaVariants: AreaVariant[]) {\r\n if (!Number.isInteger(id) || id < 0)\r\n throw new Error(`Expected id to be a non-negative integer, got ${id}.`);\r\n if (!name) throw new Error('name is required.');\r\n if (!areaVariants) throw new Error('areaVariants is required.');\r\n\r\n this.id = id;\r\n this.name = name;\r\n this.order = order;\r\n this.areaVariants = areaVariants;\r\n }\r\n}\r\n\r\nexport class AreaVariant {\r\n @observable sections: Section[] = [];\r\n\r\n constructor(public id: number, public area: Area) {\r\n if (!Number.isInteger(id) || id < 0)\r\n throw new Error(`Expected id to be a non-negative integer, got ${id}.`);\r\n }\r\n}\r\n\r\nexport class Item {\r\n constructor(public name: string) { }\r\n}\r\n\r\ntype ItemDrop = {\r\n item: Item,\r\n anythingRate: number,\r\n rareRate: number\r\n}\r\n\r\nexport class EnemyDrop implements ItemDrop {\r\n rate: number;\r\n\r\n constructor(\r\n public item: Item,\r\n public anythingRate: number,\r\n public rareRate: number\r\n ) {\r\n this.rate = anythingRate * rareRate;\r\n }\r\n}\r\n\r\nexport class HuntMethod {\r\n readonly npcs: Array<SimpleNpc>;\r\n readonly enemies: Array<SimpleNpc>;\r\n readonly enemyCounts: Map<NpcType, number>;\r\n\r\n constructor(\r\n /**\r\n * The time it takes to complete the quest in hours.\r\n */\r\n public readonly time: number,\r\n public readonly name: string,\r\n public readonly quest: SimpleQuest\r\n ) {\r\n if (time <= 0) throw new Error('time must be greater than zero.');\r\n\r\n this.npcs = this.quest.npcs;\r\n this.enemies = this.npcs.filter(npc => npc.type.enemy);\r\n this.enemyCounts = new Map();\r\n\r\n for (const npc of this.enemies) {\r\n this.enemyCounts.set(npc.type, (this.enemyCounts.get(npc.type) || 0) + 1);\r\n }\r\n }\r\n}\r\n\r\nexport class SimpleQuest {\r\n constructor(\r\n public readonly name: string,\r\n public readonly npcs: SimpleNpc[]\r\n ) {\r\n if (!name) throw new Error('name is required.');\r\n if (!npcs) throw new Error('npcs is required.');\r\n }\r\n}\r\n\r\nexport class SimpleNpc {\r\n constructor(\r\n public type: NpcType\r\n ) {\r\n if (!type) throw new Error('type is required.');\r\n }\r\n}\r\n","import { observable, computed } from \"mobx\";\r\nimport { defer } from \"lodash\";\r\n\r\nexport enum LoadableState {\r\n /**\r\n * No attempt has been made to load data.\r\n */\r\n Uninitialized,\r\n\r\n /**\r\n * The first data load is underway.\r\n */\r\n Initializing,\r\n\r\n /**\r\n * Data was loaded at least once. The most recent load was successful.\r\n */\r\n Nominal,\r\n\r\n /**\r\n * Data was loaded at least once. The most recent load failed.\r\n */\r\n Error,\r\n\r\n /**\r\n * Data was loaded at least once. Another data load is underway.\r\n */\r\n Reloading,\r\n}\r\n\r\n/**\r\n * Represents a value that can be loaded asynchronously.\r\n * [state]{@link Loadable#state} represents the current state of this Loadable's value.\r\n */\r\nexport class Loadable<T> {\r\n @observable private _value: T;\r\n @observable private _promise: Promise<T> = new Promise(resolve => resolve(this._value));\r\n @observable private _state = LoadableState.Uninitialized;\r\n private _load?: () => Promise<T>;\r\n @observable private _error?: Error;\r\n\r\n constructor(initialValue: T, load?: () => Promise<T>) {\r\n this._value = initialValue;\r\n this._load = load;\r\n }\r\n\r\n /**\r\n * When this Loadable is uninitialized, a load will be triggered.\r\n * Will return the initial value until a load has succeeded.\r\n */\r\n @computed get value(): T {\r\n // Load value on first use and return initial placeholder value.\r\n if (this._state === LoadableState.Uninitialized) {\r\n // Defer loading value to avoid side effects in computed value.\r\n defer(() => this.loadValue());\r\n }\r\n\r\n return this._value;\r\n }\r\n\r\n /**\r\n * This property returns valid data as soon as possible.\r\n * If the Loadable is uninitialized a data load will be triggered, otherwise the current value will be returned.\r\n */\r\n get promise(): Promise<T> {\r\n // Load value on first use.\r\n if (this._state === LoadableState.Uninitialized) {\r\n return this.loadValue();\r\n } else {\r\n return this._promise;\r\n }\r\n }\r\n\r\n @computed get state(): LoadableState {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * @returns true if the initial data load has happened. It may or may not have succeeded.\r\n * Check [error]{@link Loadable#error} to know whether an error occurred.\r\n */\r\n @computed get isInitialized(): boolean {\r\n return this._state !== LoadableState.Uninitialized;\r\n }\r\n\r\n /**\r\n * @returns true if a data load is underway. This may be the initializing load or a later load.\r\n */\r\n @computed get isLoading(): boolean {\r\n switch (this._state) {\r\n case LoadableState.Initializing:\r\n case LoadableState.Reloading:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * @returns an {@link Error} if an error occurred during the most recent data load.\r\n */\r\n @computed get error(): Error | undefined {\r\n return this._error;\r\n }\r\n\r\n /**\r\n * Load the data. Initializes the Loadable if it is uninitialized.\r\n */\r\n load(): Promise<T> {\r\n return this.loadValue();\r\n }\r\n\r\n private async loadValue(): Promise<T> {\r\n if (this.isLoading) return this._promise;\r\n\r\n this._state = LoadableState.Initializing;\r\n\r\n try {\r\n if (this._load) {\r\n this._promise = this._load();\r\n this._value = await this._promise;\r\n }\r\n\r\n this._state = LoadableState.Nominal;\r\n this._error = undefined;\r\n return this._value;\r\n } catch (e) {\r\n this._state = LoadableState.Error;\r\n this._error = e;\r\n throw e;\r\n }\r\n }\r\n}\r\n","import { observable } from \"mobx\";\r\nimport { Server } from \"../domain\";\r\n\r\nclass ApplicationStore {\r\n @observable currentServer: Server = Server.Ephinea;\r\n}\r\n\r\nexport const applicationStore = new ApplicationStore();\r\n","import { computed } from \"mobx\";\r\nimport { Server } from \"../domain\";\r\nimport { applicationStore } from \"./ApplicationStore\";\r\nimport { EnumMap } from \"../enums\";\r\n\r\nexport class ServerMap<V> extends EnumMap<Server, V> {\r\n constructor(initialValue: (server: Server) => V) {\r\n super(Server, initialValue)\r\n }\r\n\r\n /**\r\n * @returns the value for the current server as set in {@link applicationStore}.\r\n */\r\n @computed get current(): V {\r\n return this.get(applicationStore.currentServer);\r\n }\r\n}\r\n","import { observable } from \"mobx\";\r\nimport { HuntMethod, NpcType, Server, SimpleNpc, SimpleQuest } from \"../domain\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\n\r\nclass HuntMethodStore {\r\n @observable methods: ServerMap<Loadable<Array<HuntMethod>>> = new ServerMap(server =>\r\n new Loadable([], () => this.loadHuntMethods(server))\r\n );\r\n\r\n private async loadHuntMethods(server: Server): Promise<HuntMethod[]> {\r\n const response = await fetch(\r\n `${process.env.PUBLIC_URL}/quests.${Server[server].toLowerCase()}.tsv`\r\n );\r\n const data = await response.text();\r\n const rows = data.split('\\n').map(line => line.split('\\t'));\r\n\r\n const npcTypeByIndex = rows[0].slice(2, -2).map((episode, i) => {\r\n const enemy = rows[1][i + 2];\r\n return NpcType.byNameAndEpisode(enemy, parseInt(episode, 10))!;\r\n });\r\n\r\n return rows.slice(2).map(row => {\r\n const questName = row[0];\r\n const time = parseFloat(row[1]);\r\n\r\n const npcs = row.slice(2, -2).flatMap((cell, cellI) => {\r\n const amount = parseInt(cell, 10);\r\n const type = npcTypeByIndex[cellI];\r\n const enemies = [];\r\n\r\n if (type) {\r\n for (let i = 0; i < amount; i++) {\r\n enemies.push(new SimpleNpc(type));\r\n }\r\n } else {\r\n console.error(`Couldn't get type for cellI ${cellI}.`);\r\n }\r\n\r\n return enemies;\r\n });\r\n\r\n return new HuntMethod(\r\n time,\r\n questName,\r\n new SimpleQuest(\r\n questName,\r\n npcs\r\n )\r\n );\r\n });\r\n }\r\n}\r\n\r\nexport const huntMethodStore = new HuntMethodStore();\r\n","import { observable } from \"mobx\";\r\nimport { Item, Server } from \"../domain\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport { ItemDto } from \"../dto\";\r\n\r\nclass ItemStore {\r\n private itemMap = new Map<string, Item>();\r\n\r\n @observable items: ServerMap<Loadable<Array<Item>>> = new ServerMap(server =>\r\n new Loadable([], () => this.loadItems(server))\r\n );\r\n\r\n dedupItem = (name: string): Item => {\r\n let item = this.itemMap.get(name);\r\n\r\n if (!item) {\r\n this.itemMap.set(name, item = new Item(name));\r\n }\r\n\r\n return item;\r\n }\r\n\r\n private async loadItems(server: Server): Promise<Item[]> {\r\n const response = await fetch(\r\n `${process.env.PUBLIC_URL}/items.${Server[server].toLowerCase()}.json`\r\n );\r\n const data: Array<ItemDto> = await response.json();\r\n return data.map(({ name }) => this.dedupItem(name));\r\n }\r\n}\r\n\r\nexport const itemStore = new ItemStore();\r\n","import { observable } from \"mobx\";\r\nimport { Difficulty, EnemyDrop, NpcType, SectionId, Server } from \"../domain\";\r\nimport { EnumMap } from \"../enums\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { itemStore } from \"./ItemStore\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport { EnemyDropDto } from \"../dto\";\r\n\r\nclass EnemyDropTable {\r\n private map: EnumMap<Difficulty, EnumMap<SectionId, Map<NpcType, EnemyDrop>>> =\r\n new EnumMap(Difficulty, () => new EnumMap(SectionId, () => new Map()));\r\n\r\n getDrop(difficulty: Difficulty, sectionId: SectionId, npcType: NpcType): EnemyDrop | undefined {\r\n return this.map.get(difficulty).get(sectionId).get(npcType);\r\n }\r\n\r\n setDrop(difficulty: Difficulty, sectionId: SectionId, npcType: NpcType, drop: EnemyDrop) {\r\n this.map.get(difficulty).get(sectionId).set(npcType, drop);\r\n }\r\n}\r\n\r\nclass ItemDropStore {\r\n @observable enemyDrops: ServerMap<Loadable<EnemyDropTable>> = new ServerMap(server =>\r\n new Loadable(new EnemyDropTable(), () => this.loadEnemyDrops(server))\r\n );\r\n\r\n private loadEnemyDrops = async (server: Server): Promise<EnemyDropTable> => {\r\n const response = await fetch(\r\n `${process.env.PUBLIC_URL}/enemyDrops.${Server[server].toLowerCase()}.json`\r\n );\r\n const data: Array<EnemyDropDto> = await response.json();\r\n\r\n const drops = new EnemyDropTable();\r\n\r\n for (const dropDto of data) {\r\n const npcType = NpcType.byNameAndEpisode(dropDto.enemy, dropDto.episode);\r\n\r\n if (!npcType) {\r\n console.error(`Couldn't determine NpcType of episode ${dropDto.episode} ${dropDto.enemy}.`);\r\n continue;\r\n }\r\n\r\n drops.setDrop(dropDto.difficulty, dropDto.sectionId, npcType, new EnemyDrop(\r\n itemStore.dedupItem(dropDto.item),\r\n dropDto.dropRate,\r\n dropDto.rareRate\r\n ));\r\n }\r\n\r\n return drops;\r\n }\r\n}\r\n\r\nexport const itemDropStore = new ItemDropStore();\r\n","import solver from 'javascript-lp-solver';\r\nimport { autorun, IObservableArray, observable, runInAction } from \"mobx\";\r\nimport { Difficulties, Difficulty, HuntMethod, Item, KONDRIEU_PROB, NpcType, RARE_ENEMY_PROB, SectionId, SectionIds } from \"../domain\";\r\nimport { applicationStore } from './ApplicationStore';\r\nimport { huntMethodStore } from \"./HuntMethodStore\";\r\nimport { itemDropStore } from './ItemDropStore';\r\nimport { itemStore } from './ItemStore';\r\n\r\nexport class WantedItem {\r\n @observable readonly item: Item;\r\n @observable amount: number;\r\n\r\n constructor(item: Item, amount: number) {\r\n this.item = item;\r\n this.amount = amount;\r\n }\r\n}\r\n\r\nexport class OptimizationResult {\r\n public readonly totalTime: number;\r\n\r\n constructor(\r\n public readonly difficulty: Difficulty,\r\n public readonly sectionId: SectionId,\r\n public readonly methodName: string,\r\n public readonly methodTime: number,\r\n public readonly runs: number,\r\n public readonly itemCounts: Map<Item, number>\r\n ) {\r\n this.totalTime = runs * methodTime;\r\n }\r\n}\r\n\r\n// TODO: Prefer methods that don't split pan arms over methods that do.\r\n// For some reason this doesn't actually seem to be a problem, should probably investigate.\r\n// TODO: group similar methods (e.g. same difficulty, same quest and similar ID).\r\n// This way people can choose their preferred section ID.\r\n// TODO: order of items in results table should match order in wanted table.\r\n// TODO: boxes.\r\nclass HuntOptimizerStore {\r\n @observable readonly wantedItems: IObservableArray<WantedItem> = observable.array();\r\n @observable readonly results: IObservableArray<OptimizationResult> = observable.array();\r\n\r\n constructor() {\r\n this.initialize();\r\n }\r\n\r\n initialize = async () => {\r\n try {\r\n await this.loadFromLocalStorage();\r\n autorun(this.storeInLocalStorage);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n loadFromLocalStorage = async () => {\r\n const wantedItemsJson = localStorage.getItem(\r\n `HuntOptimizerStore.wantedItems.${applicationStore.currentServer}`\r\n );\r\n\r\n if (wantedItemsJson) {\r\n const items = await itemStore.items.current.promise;\r\n const wi = JSON.parse(wantedItemsJson);\r\n\r\n const wantedItems: WantedItem[] = [];\r\n\r\n for (const { itemName, amount } of wi) {\r\n const item = items.find(item => item.name === itemName);\r\n\r\n if (item) {\r\n wantedItems.push(new WantedItem(item, amount));\r\n }\r\n }\r\n\r\n this.wantedItems.replace(wantedItems);\r\n }\r\n }\r\n\r\n storeInLocalStorage = () => {\r\n try {\r\n localStorage.setItem(\r\n `HuntOptimizerStore.wantedItems.${applicationStore.currentServer}`,\r\n JSON.stringify(\r\n this.wantedItems.map(({ item, amount }) => ({ itemName: item.name, amount }))\r\n )\r\n );\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n optimize = async () => {\r\n if (!this.wantedItems.length) {\r\n this.results.splice(0);\r\n return;\r\n }\r\n\r\n const methods = await huntMethodStore.methods.current.promise;\r\n const dropTable = await itemDropStore.enemyDrops.current.promise;\r\n\r\n // Add a constraint per wanted item.\r\n const constraints: { [itemName: string]: { min: number } } = {};\r\n\r\n for (const wanted of this.wantedItems) {\r\n constraints[wanted.item.name] = { min: wanted.amount };\r\n }\r\n\r\n // Add a variable to the LP model per method per difficulty per section ID.\r\n // When a method with pan arms is encountered, two variables are added. One for the method\r\n // with migiums and hidooms and one with pan arms.\r\n // Each variable has a time property to minimize and a property per item with the number\r\n // of enemies that drop the item multiplied by the corresponding drop rate as its value.\r\n type Variable = {\r\n time: number,\r\n [itemName: string]: number,\r\n }\r\n const variables: { [methodName: string]: Variable } = {};\r\n\r\n type VariableDetails = {\r\n method: HuntMethod,\r\n difficulty: Difficulty,\r\n sectionId: SectionId,\r\n splitPanArms: boolean,\r\n }\r\n const variableDetails: Map<string, VariableDetails> = new Map();\r\n\r\n const wantedItems = new Set(this.wantedItems.filter(w => w.amount > 0).map(w => w.item));\r\n\r\n for (const method of methods) {\r\n // Counts include rare enemies, so they are fractional.\r\n const counts = new Map<NpcType, number>();\r\n\r\n for (const enemy of method.enemies) {\r\n const count = counts.get(enemy.type);\r\n\r\n if (enemy.type.rareType == null) {\r\n counts.set(enemy.type, (count || 0) + 1);\r\n } else {\r\n let rate, rareRate;\r\n\r\n if (enemy.type.rareType === NpcType.Kondrieu) {\r\n rate = 1 - KONDRIEU_PROB;\r\n rareRate = KONDRIEU_PROB;\r\n } else {\r\n rate = 1 - RARE_ENEMY_PROB;\r\n rareRate = RARE_ENEMY_PROB;\r\n }\r\n\r\n counts.set(enemy.type, (count || 0) + rate);\r\n\r\n const rareCount = counts.get(enemy.type.rareType);\r\n counts.set(enemy.type.rareType, (rareCount || 0) + rareRate);\r\n }\r\n }\r\n\r\n // Create a secondary counts map if there are any pan arms that can be split into\r\n // migiums and hidooms.\r\n const countsList: Array<Map<NpcType, number>> = [counts];\r\n const panArmsCount = counts.get(NpcType.PanArms);\r\n const panArms2Count = counts.get(NpcType.PanArms2);\r\n\r\n if (panArmsCount || panArms2Count) {\r\n const splitCounts = new Map(counts);\r\n\r\n if (panArmsCount) {\r\n splitCounts.delete(NpcType.PanArms);\r\n splitCounts.set(NpcType.Migium, panArmsCount);\r\n splitCounts.set(NpcType.Hidoom, panArmsCount);\r\n }\r\n\r\n if (panArms2Count) {\r\n splitCounts.delete(NpcType.PanArms2);\r\n splitCounts.set(NpcType.Migium2, panArms2Count);\r\n splitCounts.set(NpcType.Hidoom2, panArms2Count);\r\n }\r\n\r\n countsList.push(splitCounts);\r\n }\r\n\r\n for (let i = 0; i < countsList.length; i++) {\r\n const counts = countsList[i];\r\n const splitPanArms = i === 1;\r\n\r\n for (const diff of Difficulties) {\r\n for (const sectionId of SectionIds) {\r\n const variable: Variable = {\r\n time: method.time\r\n };\r\n let addVariable = false;\r\n\r\n for (const [npcType, count] of counts.entries()) {\r\n const drop = dropTable.getDrop(diff, sectionId, npcType);\r\n\r\n if (drop && wantedItems.has(drop.item)) {\r\n const value = variable[drop.item.name] || 0;\r\n variable[drop.item.name] = value + count * drop.rate;\r\n addVariable = true;\r\n }\r\n }\r\n\r\n if (addVariable) {\r\n let name = `${diff}\\t${sectionId}\\t${method.name}`;\r\n\r\n if (splitPanArms) {\r\n name += ' (Split Pan Arms)';\r\n }\r\n\r\n variables[name] = variable;\r\n variableDetails.set(name, {\r\n method,\r\n difficulty: diff,\r\n sectionId,\r\n splitPanArms\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const result: {\r\n feasible: boolean,\r\n bounded: boolean,\r\n result: number,\r\n [method: string]: number | boolean\r\n } = solver.Solve({\r\n optimize: 'time',\r\n opType: 'min',\r\n constraints,\r\n variables\r\n });\r\n\r\n runInAction(() => {\r\n this.results.splice(0);\r\n\r\n if (!result.feasible) {\r\n return;\r\n }\r\n\r\n for (const [variableName, runsOrOther] of Object.entries(result)) {\r\n const details = variableDetails.get(variableName);\r\n\r\n if (details) {\r\n const { method, difficulty, sectionId, splitPanArms } = details;\r\n const runs = runsOrOther as number;\r\n const variable = variables[variableName];\r\n\r\n const items = new Map<Item, number>();\r\n\r\n for (const [itemName, expectedValue] of Object.entries(variable)) {\r\n for (const item of wantedItems) {\r\n if (itemName === item.name) {\r\n items.set(item, runs * expectedValue);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.results.push(new OptimizationResult(\r\n difficulty,\r\n sectionId,\r\n method.name + (splitPanArms ? ' (Split Pan Arms)' : ''),\r\n method.time,\r\n runs,\r\n items\r\n ));\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport const huntOptimizerStore = new HuntOptimizerStore();\r\n","import { Button, InputNumber, Select } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport React from \"react\";\r\nimport { AutoSizer, Column, Table, TableCellRenderer } from \"react-virtualized\";\r\nimport { huntOptimizerStore, WantedItem } from \"../../stores/HuntOptimizerStore\";\r\nimport { itemStore } from \"../../stores/ItemStore\";\r\nimport './WantedItemsComponent.css';\r\n\r\n@observer\r\nexport class WantedItemsComponent extends React.Component {\r\n render() {\r\n // Make sure render is called on updates.\r\n huntOptimizerStore.wantedItems.slice(0, 0);\r\n\r\n return (\r\n <section className=\"ho-WantedItemsComponent\">\r\n <h3>Wanted Items</h3>\r\n <div>\r\n <Select\r\n value={undefined}\r\n showSearch\r\n placeholder=\"Add an item\"\r\n optionFilterProp=\"children\"\r\n style={{ width: 200 }}\r\n filterOption\r\n onChange={this.addWanted}\r\n >\r\n {itemStore.items.current.value.map(item => (\r\n <Select.Option key={item.name}>\r\n {item.name}\r\n </Select.Option>\r\n ))}\r\n </Select>\r\n <Button\r\n onClick={huntOptimizerStore.optimize}\r\n style={{ marginLeft: 10 }}\r\n >\r\n Optimize\r\n </Button>\r\n </div>\r\n <div className=\"ho-WantedItemsComponent-table\">\r\n <AutoSizer>\r\n {({ width, height }) => (\r\n <Table\r\n width={width}\r\n height={height}\r\n headerHeight={30}\r\n rowHeight={30}\r\n rowCount={huntOptimizerStore.wantedItems.length}\r\n rowGetter={({ index }) => huntOptimizerStore.wantedItems[index]}\r\n >\r\n <Column\r\n label=\"Amount\"\r\n dataKey=\"amount\"\r\n width={70}\r\n cellRenderer={({ rowData }) =>\r\n <WantedAmountCell wantedItem={rowData} />\r\n }\r\n />\r\n <Column\r\n label=\"Item\"\r\n dataKey=\"item\"\r\n width={150}\r\n flexGrow={1}\r\n cellDataGetter={({ rowData }) => rowData.item.name}\r\n />\r\n <Column\r\n dataKey=\"remove\"\r\n width={30}\r\n cellRenderer={this.tableRemoveCellRenderer}\r\n />\r\n </Table>\r\n )}\r\n </AutoSizer>\r\n </div>\r\n </section>\r\n );\r\n }\r\n\r\n private addWanted = (itemName: string) => {\r\n let added = huntOptimizerStore.wantedItems.find(w => w.item.name === itemName);\r\n\r\n if (!added) {\r\n const item = itemStore.items.current.value.find(i => i.name === itemName)!;\r\n huntOptimizerStore.wantedItems.push(new WantedItem(item, 1));\r\n }\r\n }\r\n\r\n private removeWanted = (wanted: WantedItem) => () => {\r\n const i = huntOptimizerStore.wantedItems.findIndex(w => w === wanted);\r\n\r\n if (i !== -1) {\r\n huntOptimizerStore.wantedItems.splice(i, 1);\r\n }\r\n }\r\n\r\n private tableRemoveCellRenderer: TableCellRenderer = ({ rowData }) => {\r\n return <Button type=\"link\" icon=\"delete\" onClick={this.removeWanted(rowData)} />;\r\n }\r\n}\r\n\r\n@observer\r\nclass WantedAmountCell extends React.Component<{ wantedItem: WantedItem }> {\r\n render() {\r\n const wanted = this.props.wantedItem;\r\n\r\n return (\r\n <InputNumber\r\n min={0}\r\n max={10}\r\n value={wanted.amount}\r\n onChange={this.wantedAmountChanged}\r\n size=\"small\"\r\n style={{ width: '100%' }}\r\n />\r\n );\r\n }\r\n\r\n private wantedAmountChanged = (value?: number) => {\r\n if (value != null && value >= 0) {\r\n this.props.wantedItem.amount = value;\r\n }\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Index, MultiGrid, GridCellRenderer } from \"react-virtualized\";\r\nimport \"./dataTable.less\";\r\n\r\nexport type Column<T> = {\r\n name: string,\r\n width: number,\r\n cellValue: (record: T) => string,\r\n tooltip?: (record: T) => string,\r\n footerValue?: string,\r\n footerTooltip?: string,\r\n className?: string,\r\n}\r\n\r\n/**\r\n * A table with a fixed header. Optionally has fixed columns and a footer.\r\n * TODO: no-content message.\r\n */\r\nexport class DataTable<T> extends React.Component<{\r\n width: number,\r\n height: number,\r\n rowCount: number,\r\n columns: Array<Column<T>>,\r\n fixedColumnCount?: number,\r\n record: (index: Index) => T,\r\n footer?: boolean,\r\n}> {\r\n render() {\r\n return (\r\n <div className=\"DataTable\">\r\n <MultiGrid\r\n width={this.props.width}\r\n height={this.props.height}\r\n rowHeight={26}\r\n rowCount={this.props.rowCount + 1 + (this.props.footer ? 1 : 0)}\r\n fixedRowCount={1}\r\n columnWidth={this.columnWidth}\r\n columnCount={this.props.columns.length}\r\n fixedColumnCount={this.props.fixedColumnCount}\r\n cellRenderer={this.cellRenderer}\r\n classNameTopLeftGrid=\"DataTable-header\"\r\n classNameTopRightGrid=\"DataTable-header\"\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private columnWidth = ({ index }: Index): number => {\r\n return this.props.columns[index].width;\r\n }\r\n\r\n private cellRenderer: GridCellRenderer = ({ columnIndex, rowIndex, style }) => {\r\n const column = this.props.columns[columnIndex];\r\n let text: string;\r\n let title: string | undefined;\r\n const classes = ['DataTable-cell'];\r\n\r\n if (columnIndex === this.props.columns.length - 1) {\r\n classes.push('last-in-row');\r\n }\r\n\r\n if (rowIndex === 0) {\r\n // Header row\r\n text = title = column.name;\r\n } else {\r\n // Record or footer row\r\n if (column.className) {\r\n classes.push(column.className);\r\n }\r\n\r\n if (this.props.footer && rowIndex === 1 + this.props.rowCount) {\r\n // Footer row\r\n classes.push('footer-cell');\r\n text = column.footerValue == null ? '' : column.footerValue;\r\n title = column.footerTooltip == null ? '' : column.footerTooltip;\r\n } else {\r\n // Record row\r\n const result = this.props.record({ index: rowIndex - 1 });\r\n\r\n text = column.cellValue(result);\r\n\r\n if (column.tooltip) {\r\n title = column.tooltip(result);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n className={classes.join(' ')}\r\n key={`${columnIndex}, ${rowIndex}`}\r\n style={style}\r\n title={title}\r\n >\r\n <span>{text}</span>\r\n </div>\r\n );\r\n }\r\n}\r\n","/**\r\n * @param hours can be fractional.\r\n * @returns a string of the shape ##:##.\r\n */\r\nexport function hoursToString(hours: number): string {\r\n const h = Math.floor(hours);\r\n const m = Math.round(60 * (hours - h));\r\n return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;\r\n}\r\n","import { computed } from \"mobx\";\r\nimport { observer } from \"mobx-react\";\r\nimport React from \"react\";\r\nimport { AutoSizer, Index } from \"react-virtualized\";\r\nimport { Item } from \"../../domain\";\r\nimport { huntOptimizerStore, OptimizationResult } from \"../../stores/HuntOptimizerStore\";\r\nimport { Column, DataTable } from \"../dataTable\";\r\nimport \"./OptimizationResultComponent.less\";\r\nimport { hoursToString } from \"../time\";\r\n\r\n@observer\r\nexport class OptimizationResultComponent extends React.Component {\r\n @computed private get columns(): Column<OptimizationResult>[] {\r\n // Standard columns.\r\n const results = huntOptimizerStore.results;\r\n let totalRuns = 0;\r\n let totalTime = 0;\r\n\r\n for (const result of results) {\r\n totalRuns += result.runs;\r\n totalTime += result.totalTime;\r\n }\r\n\r\n const columns: Column<OptimizationResult>[] = [\r\n {\r\n name: 'Difficulty',\r\n width: 75,\r\n cellValue: (result) => result.difficulty,\r\n footerValue: 'Totals:',\r\n },\r\n {\r\n name: 'Method',\r\n width: 200,\r\n cellValue: (result) => result.methodName,\r\n tooltip: (result) => result.methodName,\r\n },\r\n {\r\n name: 'Section ID',\r\n width: 80,\r\n cellValue: (result) => result.sectionId,\r\n },\r\n {\r\n name: 'Time/Run',\r\n width: 80,\r\n cellValue: (result) => hoursToString(result.methodTime),\r\n className: 'number',\r\n },\r\n {\r\n name: 'Runs',\r\n width: 60,\r\n cellValue: (result) => result.runs.toFixed(1),\r\n tooltip: (result) => result.runs.toString(),\r\n footerValue: totalRuns.toFixed(1),\r\n footerTooltip: totalRuns.toString(),\r\n className: 'number',\r\n },\r\n {\r\n name: 'Total Hours',\r\n width: 90,\r\n cellValue: (result) => result.totalTime.toFixed(1),\r\n tooltip: (result) => result.totalTime.toString(),\r\n footerValue: totalTime.toFixed(1),\r\n footerTooltip: totalTime.toString(),\r\n className: 'number',\r\n },\r\n ];\r\n\r\n // Add one column per item.\r\n const items = new Set<Item>();\r\n\r\n for (const r of results) {\r\n for (const i of r.itemCounts.keys()) {\r\n items.add(i);\r\n }\r\n }\r\n\r\n for (const item of items) {\r\n const totalCount = results.reduce(\r\n (acc, r) => acc + (r.itemCounts.get(item) || 0),\r\n 0\r\n );\r\n\r\n columns.push({\r\n name: item.name,\r\n width: 80,\r\n cellValue: (result) => {\r\n const count = result.itemCounts.get(item);\r\n return count ? count.toFixed(2) : '';\r\n },\r\n tooltip: (result) => {\r\n const count = result.itemCounts.get(item);\r\n return count ? count.toString() : '';\r\n },\r\n className: 'number',\r\n footerValue: totalCount.toFixed(2),\r\n footerTooltip: totalCount.toString()\r\n });\r\n }\r\n\r\n return columns;\r\n }\r\n\r\n render() {\r\n // Make sure render is called when result changes.\r\n huntOptimizerStore.results.slice(0, 0);\r\n\r\n return (\r\n <section className=\"ho-OptimizationResultComponent\">\r\n <h3>Optimization Result</h3>\r\n <div className=\"ho-OptimizationResultComponent-table\">\r\n <AutoSizer>\r\n {({ width, height }) =>\r\n <DataTable\r\n width={width}\r\n height={height}\r\n rowCount={huntOptimizerStore.results.length}\r\n columns={this.columns}\r\n fixedColumnCount={3}\r\n record={this.record}\r\n footer={huntOptimizerStore.results.length > 0}\r\n />\r\n }\r\n </AutoSizer>\r\n </div>\r\n </section>\r\n );\r\n }\r\n\r\n private record = ({ index }: Index): OptimizationResult => {\r\n return huntOptimizerStore.results[index];\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { WantedItemsComponent } from \"./WantedItemsComponent\";\r\nimport { OptimizationResultComponent } from \"./OptimizationResultComponent\";\r\nimport \"./OptimizerComponent.css\";\r\n\r\nexport function OptimizerComponent() {\r\n return (\r\n <section className=\"ho-OptimizerComponent\">\r\n <WantedItemsComponent />\r\n <OptimizationResultComponent />\r\n </section>\r\n );\r\n}\r\n","import { observer } from \"mobx-react\";\r\nimport React from \"react\";\r\nimport { AutoSizer, Index } from \"react-virtualized\";\r\nimport { HuntMethod } from \"../../domain\";\r\nimport { EnemyNpcTypes } from \"../../domain/NpcType\";\r\nimport { huntMethodStore } from \"../../stores/HuntMethodStore\";\r\nimport \"./MethodsComponent.css\";\r\nimport { DataTable, Column } from \"../dataTable\";\r\nimport { hoursToString } from \"../time\";\r\n\r\n@observer\r\nexport class MethodsComponent extends React.Component {\r\n static columns: Array<Column<HuntMethod>> = (() => {\r\n // Standard columns.\r\n const columns: Column<HuntMethod>[] = [\r\n {\r\n name: 'Method',\r\n width: 250,\r\n cellValue: (method) => method.name,\r\n },\r\n {\r\n name: 'Time',\r\n width: 50,\r\n cellValue: (method) => hoursToString(method.time),\r\n className: 'number',\r\n },\r\n ];\r\n\r\n // One column per enemy type.\r\n for (const enemy of EnemyNpcTypes) {\r\n columns.push({\r\n name: enemy.name,\r\n width: 75,\r\n cellValue: (method) => {\r\n const count = method.enemyCounts.get(enemy);\r\n return count == null ? '' : count.toString();\r\n },\r\n className: 'number',\r\n });\r\n }\r\n\r\n return columns;\r\n })();\r\n\r\n render() {\r\n const methods = huntMethodStore.methods.current.value;\r\n\r\n return (\r\n <section className=\"ho-MethodsComponent\">\r\n <AutoSizer>\r\n {({ width, height }) => (\r\n <DataTable<HuntMethod>\r\n width={width}\r\n height={height}\r\n rowCount={methods.length}\r\n columns={MethodsComponent.columns}\r\n fixedColumnCount={2}\r\n record={this.record}\r\n />\r\n )}\r\n </AutoSizer>\r\n </section>\r\n );\r\n }\r\n\r\n private record = ({ index }: Index) => {\r\n return huntMethodStore.methods.current.value[index];\r\n }\r\n}","import { Tabs } from \"antd\";\r\nimport React from \"react\";\r\nimport './HuntOptimizerComponent.css';\r\nimport { OptimizerComponent } from \"./OptimizerComponent\";\r\nimport { MethodsComponent } from \"./MethodsComponent\";\r\n\r\nconst TabPane = Tabs.TabPane;\r\n\r\nexport function HuntOptimizerComponent() {\r\n return (\r\n <section className=\"ho-HuntOptimizerComponent\">\r\n <Tabs type=\"card\">\r\n <TabPane tab=\"Optimize\" key=\"optimize\">\r\n <OptimizerComponent />\r\n </TabPane>\r\n <TabPane tab=\"Methods\" key=\"methods\">\r\n <MethodsComponent />\r\n </TabPane>\r\n </Tabs>\r\n </section>\r\n );\r\n}\r\n","// TODO: remove dependency on text-encoding because it is no longer maintained.\r\nimport { TextDecoder, TextEncoder } from 'text-encoding';\r\n\r\nconst ASCII_DECODER = new TextDecoder('ascii');\r\nconst UTF_16BE_DECODER = new TextDecoder('utf-16be');\r\nconst UTF_16LE_DECODER = new TextDecoder('utf-16le');\r\n\r\nconst ASCII_ENCODER = new TextEncoder('ascii');\r\nconst UTF_16BE_ENCODER = new TextEncoder('utf-16be');\r\nconst UTF_16LE_ENCODER = new TextEncoder('utf-16le');\r\n\r\n/**\r\n * A cursor for reading and writing binary data.\r\n * Uses an ArrayBuffer internally. This buffer is reallocated if and only if a write beyond the current capacity happens.\r\n */\r\nexport class ArrayBufferCursor {\r\n private _size: number = 0;\r\n\r\n /**\r\n * The cursor's size. This value will always be non-negative and equal to or smaller than the cursor's capacity.\r\n */\r\n get size(): number {\r\n return this._size;\r\n }\r\n\r\n set size(size: number) {\r\n if (size < 0) {\r\n throw new Error('Size should be non-negative.')\r\n }\r\n\r\n this.ensureCapacity(size);\r\n this._size = size;\r\n }\r\n\r\n /**\r\n * The position from where bytes will be read or written.\r\n */\r\n position: number;\r\n\r\n /**\r\n * Byte order mode.\r\n */\r\n littleEndian: boolean;\r\n\r\n /**\r\n * The amount of bytes left to read from the current position onward.\r\n */\r\n get bytesLeft(): number {\r\n return this.size - this.position;\r\n }\r\n\r\n /**\r\n * The size of the underlying buffer. This value will always be equal to or greater than the cursor's size.\r\n */\r\n get capacity(): number {\r\n return this.buffer.byteLength;\r\n }\r\n\r\n buffer: ArrayBuffer;\r\n\r\n private dv: DataView;\r\n private uint8Array: Uint8Array;\r\n private utf16Decoder: TextDecoder;\r\n private utf16Encoder: TextEncoder;\r\n\r\n /**\r\n * @param bufferOrCapacity - If an ArrayBuffer is given, writes to the cursor will be reflected in this array buffer and vice versa until a cursor write that requires allocating a new internal buffer happens\r\n * @param littleEndian - Decides in which byte order multi-byte integers and floats will be interpreted\r\n */\r\n constructor(bufferOrCapacity: ArrayBuffer | number, littleEndian?: boolean) {\r\n if (typeof bufferOrCapacity === 'number') {\r\n this.buffer = new ArrayBuffer(bufferOrCapacity);\r\n this.size = 0;\r\n } else if (bufferOrCapacity instanceof ArrayBuffer) {\r\n this.buffer = bufferOrCapacity;\r\n this.size = this.buffer.byteLength;\r\n } else {\r\n throw new Error('buffer_or_capacity should be an ArrayBuffer or a number.');\r\n }\r\n\r\n this.littleEndian = !!littleEndian;\r\n this.position = 0;\r\n this.dv = new DataView(this.buffer);\r\n this.uint8Array = new Uint8Array(this.buffer, 0, this.size);\r\n this.utf16Decoder = littleEndian ? UTF_16LE_DECODER : UTF_16BE_DECODER;\r\n this.utf16Encoder = littleEndian ? UTF_16LE_ENCODER : UTF_16BE_ENCODER;\r\n }\r\n\r\n /**\r\n * Seek forward or backward by a number of bytes.\r\n * \r\n * @param offset - if positive, seeks forward by offset bytes, otherwise seeks backward by -offset bytes.\r\n */\r\n seek(offset: number) {\r\n return this.seekStart(this.position + offset);\r\n }\r\n\r\n /**\r\n * Seek forward from the start of the cursor by a number of bytes.\r\n * \r\n * @param offset - greater or equal to 0 and smaller than size\r\n */\r\n seekStart(offset: number) {\r\n if (offset < 0 || offset > this.size) {\r\n throw new Error(`Offset ${offset} is out of bounds.`);\r\n }\r\n\r\n this.position = offset;\r\n return this;\r\n }\r\n\r\n /**\r\n * Seek backward from the end of the cursor by a number of bytes.\r\n * \r\n * @param offset - greater or equal to 0 and smaller than size\r\n */\r\n seekEnd(offset: number) {\r\n if (offset < 0 || offset > this.size) {\r\n throw new Error(`Offset ${offset} is out of bounds.`);\r\n }\r\n\r\n this.position = this.size - offset;\r\n return this;\r\n }\r\n\r\n /**\r\n * Reads an unsigned 8-bit integer and increments position by 1.\r\n */\r\n u8() {\r\n return this.dv.getUint8(this.position++);\r\n }\r\n\r\n /**\r\n * Reads an unsigned 16-bit integer and increments position by 2.\r\n */\r\n u16() {\r\n const r = this.dv.getUint16(this.position, this.littleEndian);\r\n this.position += 2;\r\n return r;\r\n }\r\n\r\n /**\r\n * Reads an unsigned 32-bit integer and increments position by 4.\r\n */\r\n u32() {\r\n const r = this.dv.getUint32(this.position, this.littleEndian);\r\n this.position += 4;\r\n return r;\r\n }\r\n\r\n /**\r\n * Reads a signed 16-bit integer and increments position by 2.\r\n */\r\n i16() {\r\n const r = this.dv.getInt16(this.position, this.littleEndian);\r\n this.position += 2;\r\n return r;\r\n }\r\n\r\n /**\r\n * Reads a signed 32-bit integer and increments position by 4.\r\n */\r\n i32() {\r\n const r = this.dv.getInt32(this.position, this.littleEndian);\r\n this.position += 4;\r\n return r;\r\n }\r\n\r\n /**\r\n * Reads a 32-bit floating point number and increments position by 4.\r\n */\r\n f32() {\r\n const r = this.dv.getFloat32(this.position, this.littleEndian);\r\n this.position += 4;\r\n return r;\r\n }\r\n\r\n /**\r\n * Reads n unsigned 8-bit integers and increments position by n.\r\n */\r\n u8Array(n: number): number[] {\r\n const array = [];\r\n for (let i = 0; i < n; ++i) array.push(this.dv.getUint8(this.position++));\r\n return array;\r\n }\r\n\r\n /**\r\n * Reads n unsigned 16-bit integers and increments position by 2n.\r\n */\r\n u16Array(n: number): number[] {\r\n const array = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n array.push(this.dv.getUint16(this.position, this.littleEndian));\r\n this.position += 2;\r\n }\r\n\r\n return array;\r\n }\r\n\r\n /**\r\n * Consumes a variable number of bytes.\r\n * \r\n * @param size - the amount bytes to consume.\r\n * @returns a new cursor containing size bytes.\r\n */\r\n take(size: number): ArrayBufferCursor {\r\n if (size < 0 || size > this.size - this.position) {\r\n throw new Error(`Size ${size} out of bounds.`);\r\n }\r\n\r\n this.position += size;\r\n return new ArrayBufferCursor(\r\n this.buffer.slice(this.position - size, this.position), this.littleEndian);\r\n }\r\n\r\n /**\r\n * Consumes up to maxByteLength bytes.\r\n */\r\n stringAscii(maxByteLength: number, nullTerminated: boolean, dropRemaining: boolean) {\r\n const string_length = nullTerminated\r\n ? this.indexOfU8(0, maxByteLength) - this.position\r\n : maxByteLength;\r\n\r\n const r = ASCII_DECODER.decode(\r\n new DataView(this.buffer, this.position, string_length));\r\n this.position += dropRemaining\r\n ? maxByteLength\r\n : Math.min(string_length + 1, maxByteLength);\r\n return r;\r\n }\r\n\r\n /**\r\n * Consumes up to maxByteLength bytes.\r\n */\r\n stringUtf16(maxByteLength: number, nullTerminated: boolean, dropRemaining: boolean) {\r\n const stringLength = nullTerminated\r\n ? this.indexOfU16(0, maxByteLength) - this.position\r\n : Math.floor(maxByteLength / 2) * 2;\r\n\r\n const r = this.utf16Decoder.decode(\r\n new DataView(this.buffer, this.position, stringLength));\r\n this.position += dropRemaining\r\n ? maxByteLength\r\n : Math.min(stringLength + 2, maxByteLength);\r\n return r;\r\n }\r\n\r\n /**\r\n * Writes an unsigned 8-bit integer and increments position by 1. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeU8(value: number) {\r\n this.ensureCapacity(this.position + 1);\r\n\r\n this.dv.setUint8(this.position++, value);\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes an unsigned 16-bit integer and increments position by 2. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeU16(value: number) {\r\n this.ensureCapacity(this.position + 2);\r\n\r\n this.dv.setUint16(this.position, value, this.littleEndian);\r\n this.position += 2;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes an unsigned 32-bit integer and increments position by 4. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeU32(value: number) {\r\n this.ensureCapacity(this.position + 4);\r\n\r\n this.dv.setUint32(this.position, value, this.littleEndian);\r\n this.position += 4;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes a signed 32-bit integer and increments position by 4. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeI32(value: number) {\r\n this.ensureCapacity(this.position + 4);\r\n\r\n this.dv.setInt32(this.position, value, this.littleEndian);\r\n this.position += 4;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes a 32-bit floating point number and increments position by 4. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeF32(value: number) {\r\n this.ensureCapacity(this.position + 4);\r\n\r\n this.dv.setFloat32(this.position, value, this.littleEndian);\r\n this.position += 4;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes an array of unsigned 8-bit integers and increments position by the array's length. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeU8Array(array: number[]) {\r\n this.ensureCapacity(this.position + array.length);\r\n\r\n new Uint8Array(this.buffer, this.position).set(new Uint8Array(array));\r\n this.position += array.length;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Writes the contents of other and increments position by the size of other. If necessary, grows the cursor and reallocates the underlying buffer.\r\n */\r\n writeCursor(other: ArrayBufferCursor) {\r\n this.ensureCapacity(this.position + other.size);\r\n\r\n new Uint8Array(this.buffer, this.position).set(new Uint8Array(other.buffer));\r\n this.position += other.size;\r\n\r\n if (this.position > this.size) {\r\n this.size = this.position;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n writeStringAscii(str: string, byteLength: number) {\r\n let i = 0;\r\n\r\n for (const byte of ASCII_ENCODER.encode(str)) {\r\n if (i < byteLength) {\r\n this.writeU8(byte);\r\n ++i;\r\n }\r\n }\r\n\r\n while (i < byteLength) {\r\n this.writeU8(0);\r\n ++i;\r\n }\r\n }\r\n\r\n /**\r\n * @returns a Uint8Array that remains a write-through view of the underlying array buffer until the buffer is reallocated.\r\n */\r\n uint8ArrayView(): Uint8Array {\r\n return this.uint8Array;\r\n }\r\n\r\n private indexOfU8(value: number, maxByteLength: number) {\r\n const maxPos = Math.min(this.position + maxByteLength, this.size);\r\n\r\n for (let i = this.position; i < maxPos; ++i) {\r\n if (this.dv.getUint8(i) === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return this.position + maxByteLength;\r\n }\r\n\r\n private indexOfU16(value: number, maxByteLength: number) {\r\n const maxPos = Math.min(this.position + maxByteLength, this.size);\r\n\r\n for (let i = this.position; i < maxPos; i += 2) {\r\n if (this.dv.getUint16(i, this.littleEndian) === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return this.position + maxByteLength;\r\n }\r\n\r\n /**\r\n * Increases buffer size if necessary.\r\n */\r\n private ensureCapacity(minNewSize: number) {\r\n if (minNewSize > this.capacity) {\r\n let newSize = this.capacity || minNewSize;\r\n\r\n do {\r\n newSize *= 2;\r\n } while (newSize < minNewSize);\r\n\r\n const newBuffer = new ArrayBuffer(newSize);\r\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this.size));\r\n this.buffer = newBuffer;\r\n this.dv = new DataView(this.buffer);\r\n this.uint8Array = new Uint8Array(this.buffer, 0, minNewSize);\r\n }\r\n }\r\n}\r\n","import { NpcType, ObjectType } from '../../domain';\r\n\r\nexport function getAreaRenderData(\r\n episode: number,\r\n areaId: number,\r\n areaVersion: number\r\n): Promise<ArrayBuffer> {\r\n return getAreaAsset(episode, areaId, areaVersion, 'render');\r\n}\r\n\r\nexport function getAreaCollisionData(\r\n episode: number,\r\n areaId: number,\r\n areaVersion: number\r\n): Promise<ArrayBuffer> {\r\n return getAreaAsset(episode, areaId, areaVersion, 'collision');\r\n}\r\n\r\nexport async function getNpcData(npcType: NpcType): Promise<{ url: string, data: ArrayBuffer }> {\r\n const url = npcTypeToUrl(npcType);\r\n const data = await getAsset(url);\r\n return ({ url, data });\r\n}\r\n\r\nexport async function getObjectData(objectType: ObjectType): Promise<{ url: string, data: ArrayBuffer }> {\r\n const url = objectTypeToUrl(objectType);\r\n const data = await getAsset(url);\r\n return ({ url, data });\r\n}\r\n\r\n/**\r\n * Cache for the binary data.\r\n */\r\nconst bufferCache: Map<string, Promise<ArrayBuffer>> = new Map();\r\n\r\nfunction getAsset(url: string): Promise<ArrayBuffer> {\r\n const promise = bufferCache.get(url);\r\n\r\n if (promise) {\r\n return promise;\r\n } else {\r\n const baseUrl = process.env.PUBLIC_URL;\r\n const promise = fetch(baseUrl + url).then(r => r.arrayBuffer());\r\n bufferCache.set(url, promise);\r\n return promise;\r\n }\r\n}\r\n\r\nconst areaBaseNames = [\r\n [\r\n ['city00_00', 1],\r\n ['forest01', 1],\r\n ['forest02', 1],\r\n ['cave01_', 6],\r\n ['cave02_', 5],\r\n ['cave03_', 6],\r\n ['machine01_', 6],\r\n ['machine02_', 6],\r\n ['ancient01_', 5],\r\n ['ancient02_', 5],\r\n ['ancient03_', 5],\r\n ['boss01', 1],\r\n ['boss02', 1],\r\n ['boss03', 1],\r\n ['darkfalz00', 1]\r\n ],\r\n [\r\n ['labo00_00', 1],\r\n ['ruins01_', 3],\r\n ['ruins02_', 3],\r\n ['space01_', 3],\r\n ['space02_', 3],\r\n ['jungle01_00', 1],\r\n ['jungle02_00', 1],\r\n ['jungle03_00', 1],\r\n ['jungle04_', 3],\r\n ['jungle05_00', 1],\r\n ['seabed01_', 3],\r\n ['seabed02_', 3],\r\n ['boss05', 1],\r\n ['boss06', 1],\r\n ['boss07', 1],\r\n ['boss08', 1],\r\n ['jungle06_00', 1],\r\n ['jungle07_', 5]\r\n ],\r\n [\r\n // Don't remove this empty array, see usage of areaBaseNames in areaVersionToBaseUrl.\r\n ],\r\n [\r\n ['city02_00', 1],\r\n ['wilds01_00', 1],\r\n ['wilds01_01', 1],\r\n ['wilds01_02', 1],\r\n ['wilds01_03', 1],\r\n ['crater01_00', 1],\r\n ['desert01_', 3],\r\n ['desert02_', 3],\r\n ['desert03_', 3],\r\n ['boss09_00', 1]\r\n ]\r\n];\r\n\r\nfunction areaVersionToBaseUrl(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number\r\n): string {\r\n const episodeBaseNames = areaBaseNames[episode - 1];\r\n\r\n if (0 <= areaId && areaId < episodeBaseNames.length) {\r\n const [baseName, variants] = episodeBaseNames[areaId];\r\n\r\n if (0 <= areaVariant && areaVariant < variants) {\r\n let variant: string;\r\n\r\n if (variants === 1) {\r\n variant = '';\r\n } else {\r\n variant = String(areaVariant);\r\n while (variant.length < 2) variant = '0' + variant;\r\n }\r\n\r\n return `/maps/map_${baseName}${variant}`;\r\n } else {\r\n throw new Error(`Unknown variant ${areaVariant} of area ${areaId} in episode ${episode}.`);\r\n }\r\n } else {\r\n throw new Error(`Unknown episode ${episode} area ${areaId}.`);\r\n }\r\n}\r\n\r\ntype AreaAssetType = 'render' | 'collision';\r\n\r\nfunction getAreaAsset(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number,\r\n type: AreaAssetType\r\n): Promise<ArrayBuffer> {\r\n try {\r\n const baseUrl = areaVersionToBaseUrl(episode, areaId, areaVariant);\r\n const suffix = type === 'render' ? 'n.rel' : 'c.rel';\r\n return getAsset(baseUrl + suffix);\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\nfunction npcTypeToUrl(npcType: NpcType): string {\r\n switch (npcType) {\r\n // The dubswitch model in in XJ format.\r\n case NpcType.Dubswitch: return `/npcs/${npcType.code}.xj`;\r\n\r\n // Episode II VR Temple\r\n\r\n case NpcType.Hildebear2: return npcTypeToUrl(NpcType.Hildebear);\r\n case NpcType.Hildeblue2: return npcTypeToUrl(NpcType.Hildeblue);\r\n case NpcType.RagRappy2: return npcTypeToUrl(NpcType.RagRappy);\r\n case NpcType.Monest2: return npcTypeToUrl(NpcType.Monest);\r\n case NpcType.PoisonLily2: return npcTypeToUrl(NpcType.PoisonLily);\r\n case NpcType.NarLily2: return npcTypeToUrl(NpcType.NarLily);\r\n case NpcType.GrassAssassin2: return npcTypeToUrl(NpcType.GrassAssassin);\r\n case NpcType.Dimenian2: return npcTypeToUrl(NpcType.Dimenian);\r\n case NpcType.LaDimenian2: return npcTypeToUrl(NpcType.LaDimenian);\r\n case NpcType.SoDimenian2: return npcTypeToUrl(NpcType.SoDimenian);\r\n case NpcType.DarkBelra2: return npcTypeToUrl(NpcType.DarkBelra);\r\n\r\n // Episode II VR Spaceship\r\n\r\n case NpcType.SavageWolf2: return npcTypeToUrl(NpcType.SavageWolf);\r\n case NpcType.BarbarousWolf2: return npcTypeToUrl(NpcType.BarbarousWolf);\r\n case NpcType.PanArms2: return npcTypeToUrl(NpcType.PanArms);\r\n case NpcType.Dubchic2: return npcTypeToUrl(NpcType.Dubchic);\r\n case NpcType.Gilchic2: return npcTypeToUrl(NpcType.Gilchic);\r\n case NpcType.Garanz2: return npcTypeToUrl(NpcType.Garanz);\r\n case NpcType.Dubswitch2: return npcTypeToUrl(NpcType.Dubswitch);\r\n case NpcType.Delsaber2: return npcTypeToUrl(NpcType.Delsaber);\r\n case NpcType.ChaosSorcerer2: return npcTypeToUrl(NpcType.ChaosSorcerer);\r\n\r\n default: return `/npcs/${npcType.code}.nj`;\r\n }\r\n}\r\n\r\nfunction objectTypeToUrl(objectType: ObjectType): string {\r\n switch (objectType) {\r\n case ObjectType.EasterEgg:\r\n case ObjectType.ChristmasTree:\r\n case ObjectType.ChristmasWreath:\r\n case ObjectType.TwentyFirstCentury:\r\n case ObjectType.Sonic:\r\n case ObjectType.WelcomeBoard:\r\n case ObjectType.FloatingJelifish:\r\n case ObjectType.RuinsSeal:\r\n case ObjectType.Dolphin:\r\n case ObjectType.Cacti:\r\n case ObjectType.BigBrownRock:\r\n case ObjectType.PoisonPlant:\r\n case ObjectType.BigBlackRocks:\r\n case ObjectType.FallingRock:\r\n case ObjectType.DesertFixedTypeBoxBreakableCrystals:\r\n case ObjectType.BeeHive:\r\n return `/objects/${String(objectType.psoId)}.nj`;\r\n\r\n default:\r\n return `/objects/${String(objectType.psoId)}.xj`;\r\n }\r\n}\r\n","import {\r\n BufferAttribute,\r\n BufferGeometry,\r\n DoubleSide,\r\n Face3,\r\n Geometry,\r\n Mesh,\r\n MeshBasicMaterial,\r\n MeshLambertMaterial,\r\n Object3D,\r\n TriangleStripDrawMode,\r\n Vector3\r\n} from 'three';\r\nimport { Vec3, Section } from '../../domain';\r\n\r\nexport function parseCRel(arrayBuffer: ArrayBuffer): Object3D {\r\n const dv = new DataView(arrayBuffer);\r\n\r\n const object = new Object3D();\r\n const materials = [\r\n // Wall\r\n new MeshBasicMaterial({\r\n color: 0x80C0D0,\r\n transparent: true,\r\n opacity: 0.25\r\n }),\r\n // Ground\r\n new MeshLambertMaterial({\r\n color: 0x50D0D0,\r\n side: DoubleSide\r\n }),\r\n // Vegetation\r\n new MeshLambertMaterial({\r\n color: 0x50B070,\r\n side: DoubleSide\r\n }),\r\n // Section transition zone\r\n new MeshLambertMaterial({\r\n color: 0x604080,\r\n side: DoubleSide\r\n })\r\n ];\r\n const wireframeMaterials = [\r\n // Wall\r\n new MeshBasicMaterial({\r\n color: 0x90D0E0,\r\n wireframe: true,\r\n transparent: true,\r\n opacity: 0.3,\r\n }),\r\n // Ground\r\n new MeshBasicMaterial({\r\n color: 0x60F0F0,\r\n wireframe: true\r\n }),\r\n // Vegetation\r\n new MeshBasicMaterial({\r\n color: 0x60C080,\r\n wireframe: true\r\n }),\r\n // Section transition zone\r\n new MeshBasicMaterial({\r\n color: 0x705090,\r\n wireframe: true\r\n })\r\n ];\r\n\r\n const mainBlockOffset = dv.getUint32(dv.byteLength - 16, true);\r\n const mainOffsetTableOffset = dv.getUint32(mainBlockOffset, true);\r\n\r\n for (\r\n let i = mainOffsetTableOffset;\r\n i === mainOffsetTableOffset || dv.getUint32(i) !== 0;\r\n i += 24\r\n ) {\r\n const blockGeometry = new Geometry();\r\n\r\n const blockTrailerOffset = dv.getUint32(i, true);\r\n const vertexCount = dv.getUint32(blockTrailerOffset, true);\r\n const vertexTableOffset = dv.getUint32(blockTrailerOffset + 4, true);\r\n const vertexTableEnd = vertexTableOffset + 12 * vertexCount;\r\n const triangleCount = dv.getUint32(blockTrailerOffset + 8, true);\r\n const triangleTableOffset = dv.getUint32(blockTrailerOffset + 12, true);\r\n const triangleTableEnd = triangleTableOffset + 36 * triangleCount;\r\n\r\n for (let j = vertexTableOffset; j < vertexTableEnd; j += 12) {\r\n const x = dv.getFloat32(j, true);\r\n const y = dv.getFloat32(j + 4, true);\r\n const z = dv.getFloat32(j + 8, true);\r\n\r\n blockGeometry.vertices.push(new Vector3(x, y, z));\r\n }\r\n\r\n for (let j = triangleTableOffset; j < triangleTableEnd; j += 36) {\r\n const v1 = dv.getUint16(j, true);\r\n const v2 = dv.getUint16(j + 2, true);\r\n const v3 = dv.getUint16(j + 4, true);\r\n const flags = dv.getUint16(j + 6, true);\r\n const n = new Vector3(\r\n dv.getFloat32(j + 8, true),\r\n dv.getFloat32(j + 12, true),\r\n dv.getFloat32(j + 16, true)\r\n );\r\n const isSectionTransition = flags & 0b1000000;\r\n const isVegetation = flags & 0b10000;\r\n const isGround = flags & 0b1;\r\n const colorIndex = isSectionTransition ? 3 : (isVegetation ? 2 : (isGround ? 1 : 0));\r\n\r\n blockGeometry.faces.push(new Face3(v1, v2, v3, n, undefined, colorIndex));\r\n }\r\n\r\n const mesh = new Mesh(blockGeometry, materials);\r\n mesh.renderOrder = 1;\r\n object.add(mesh);\r\n\r\n const wireframeMesh = new Mesh(blockGeometry, wireframeMaterials);\r\n wireframeMesh.renderOrder = 2;\r\n object.add(wireframeMesh);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function parseNRel(\r\n arrayBuffer: ArrayBuffer\r\n): { sections: Section[], object3d: Object3D } {\r\n const dv = new DataView(arrayBuffer);\r\n const sections = new Map();\r\n\r\n const object = new Object3D();\r\n\r\n const mainBlockOffset = dv.getUint32(dv.byteLength - 16, true);\r\n const sectionCount = dv.getUint32(mainBlockOffset + 8, true);\r\n const sectionTableOffset = dv.getUint32(mainBlockOffset + 16, true);\r\n // const textureNameOffset = dv.getUint32(mainBlockOffset + 20, true);\r\n\r\n for (\r\n let i = sectionTableOffset;\r\n i < sectionTableOffset + sectionCount * 52;\r\n i += 52\r\n ) {\r\n const sectionId = dv.getInt32(i, true);\r\n const sectionX = dv.getFloat32(i + 4, true);\r\n const sectionY = dv.getFloat32(i + 8, true);\r\n const sectionZ = dv.getFloat32(i + 12, true);\r\n const sectionRotation = dv.getInt32(i + 20, true) / 0xFFFF * 2 * Math.PI;\r\n const section = new Section(\r\n sectionId,\r\n new Vec3(sectionX, sectionY, sectionZ),\r\n sectionRotation\r\n );\r\n sections.set(sectionId, section);\r\n\r\n const indexListsList = [];\r\n const positionListsList = [];\r\n const normalListsList = [];\r\n\r\n const simpleGeometryOffsetTableOffset = dv.getUint32(i + 32, true);\r\n // const complexGeometryOffsetTableOffset = dv.getUint32(i + 36, true);\r\n const simpleGeometryOffsetCount = dv.getUint32(i + 40, true);\r\n // const complexGeometryOffsetCount = dv.getUint32(i + 44, true);\r\n\r\n // console.log(`section id: ${sectionId}, section rotation: ${sectionRotation}, simple vertices: ${simpleGeometryOffsetCount}, complex vertices: ${complexGeometryOffsetCount}`);\r\n\r\n for (\r\n let j = simpleGeometryOffsetTableOffset;\r\n j < simpleGeometryOffsetTableOffset + simpleGeometryOffsetCount * 16;\r\n j += 16\r\n ) {\r\n let offset = dv.getUint32(j, true);\r\n const flags = dv.getUint32(j + 12, true);\r\n\r\n if (flags & 0b100) {\r\n offset = dv.getUint32(offset, true);\r\n }\r\n\r\n const geometryOffset = dv.getUint32(offset + 4, true);\r\n\r\n if (geometryOffset > 0) {\r\n const vertexInfoTableOffset = dv.getUint32(geometryOffset + 4, true);\r\n const vertexInfoCount = dv.getUint32(geometryOffset + 8, true);\r\n const triangleStripTableOffset = dv.getUint32(geometryOffset + 12, true);\r\n const triangleStripCount = dv.getUint32(geometryOffset + 16, true);\r\n // const transparentObjectTableOffset = dv.getUint32(blockOffset + 20, true);\r\n // const transparentObjectCount = dv.getUint32(blockOffset + 24, true);\r\n\r\n // console.log(`block offset: ${blockOffset}, vertex info count: ${vertexInfoCount}, object table offset ${objectTableOffset}, object count: ${objectCount}, transparent object count: ${transparentObjectCount}`);\r\n\r\n const geomIndexLists = [];\r\n\r\n for (\r\n let k = triangleStripTableOffset;\r\n k < triangleStripTableOffset + triangleStripCount * 20;\r\n k += 20\r\n ) {\r\n // const flagAndTextureIdOffset = dv.getUint32(k, true);\r\n // const dataType = dv.getUint32(k + 4, true);\r\n const triangleStripIndexTableOffset = dv.getUint32(k + 8, true);\r\n const triangleStripIndexCount = dv.getUint32(k + 12, true);\r\n\r\n const triangleStripIndices = [];\r\n\r\n for (\r\n let l = triangleStripIndexTableOffset;\r\n l < triangleStripIndexTableOffset + triangleStripIndexCount * 2;\r\n l += 2\r\n ) {\r\n triangleStripIndices.push(dv.getUint16(l, true));\r\n }\r\n\r\n geomIndexLists.push(triangleStripIndices);\r\n\r\n // TODO: Read texture info.\r\n }\r\n\r\n // TODO: Do the previous for the transparent index table.\r\n\r\n // Assume vertexInfoCount == 1. TODO: Does that make sense?\r\n if (vertexInfoCount > 1) {\r\n console.warn(`Vertex info count of ${vertexInfoCount} was larger than expected.`);\r\n }\r\n\r\n // const vertexType = dv.getUint32(vertexInfoTableOffset, true);\r\n const vertexTableOffset = dv.getUint32(vertexInfoTableOffset + 4, true);\r\n const vertexSize = dv.getUint32(vertexInfoTableOffset + 8, true);\r\n const vertexCount = dv.getUint32(vertexInfoTableOffset + 12, true);\r\n\r\n // console.log(`vertex type: ${vertexType}, vertex size: ${vertexSize}, vertex count: ${vertexCount}`);\r\n\r\n const geomPositions = [];\r\n const geomNormals = [];\r\n\r\n for (\r\n let k = vertexTableOffset;\r\n k < vertexTableOffset + vertexCount * vertexSize;\r\n k += vertexSize\r\n ) {\r\n let nX, nY, nZ;\r\n\r\n switch (vertexSize) {\r\n case 16:\r\n case 24:\r\n // TODO: are these values sensible?\r\n nX = 0;\r\n nY = 1;\r\n nZ = 0;\r\n break;\r\n case 28:\r\n case 36:\r\n nX = dv.getFloat32(k + 12, true);\r\n nY = dv.getFloat32(k + 16, true);\r\n nZ = dv.getFloat32(k + 20, true);\r\n // TODO: color, texture coords.\r\n break;\r\n default:\r\n console.error(`Unexpected vertex size of ${vertexSize}.`);\r\n continue;\r\n }\r\n\r\n const x = dv.getFloat32(k, true);\r\n const y = dv.getFloat32(k + 4, true);\r\n const z = dv.getFloat32(k + 8, true);\r\n const rotatedX = section.cosYAxisRotation * x + section.sinYAxisRotation * z;\r\n const rotatedZ = -section.sinYAxisRotation * x + section.cosYAxisRotation * z;\r\n\r\n geomPositions.push(sectionX + rotatedX);\r\n geomPositions.push(sectionY + y);\r\n geomPositions.push(sectionZ + rotatedZ);\r\n geomNormals.push(nX);\r\n geomNormals.push(nY);\r\n geomNormals.push(nZ);\r\n }\r\n\r\n indexListsList.push(geomIndexLists);\r\n positionListsList.push(geomPositions);\r\n normalListsList.push(geomNormals);\r\n } else {\r\n // console.error(`Block offset at ${offset + 4} was ${blockOffset}.`);\r\n }\r\n }\r\n\r\n // function vEqual(v, w) {\r\n // return v[0] === w[0] && v[1] === w[1] && v[2] === w[2];\r\n // }\r\n\r\n for (let i = 0; i < positionListsList.length; ++i) {\r\n const positions = positionListsList[i];\r\n const normals = normalListsList[i];\r\n const geomIndexLists = indexListsList[i];\r\n // const indices = [];\r\n\r\n geomIndexLists.forEach(objectIndices => {\r\n // for (let j = 2; j < objectIndices.length; ++j) {\r\n // const a = objectIndices[j - 2];\r\n // const b = objectIndices[j - 1];\r\n // const c = objectIndices[j];\r\n\r\n // if (a !== b && a !== c && b !== c) {\r\n // const ap = positions.slice(3 * a, 3 * a + 3);\r\n // const bp = positions.slice(3 * b, 3 * b + 3);\r\n // const cp = positions.slice(3 * c, 3 * c + 3);\r\n\r\n // if (!vEqual(ap, bp) && !vEqual(ap, cp) && !vEqual(bp, cp)) {\r\n // if (j % 2 === 0) {\r\n // indices.push(a);\r\n // indices.push(b);\r\n // indices.push(c);\r\n // } else {\r\n // indices.push(b);\r\n // indices.push(a);\r\n // indices.push(c);\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n const geometry = new BufferGeometry();\r\n geometry.addAttribute(\r\n 'position', new BufferAttribute(new Float32Array(positions), 3));\r\n geometry.addAttribute(\r\n 'normal', new BufferAttribute(new Float32Array(normals), 3));\r\n geometry.setIndex(new BufferAttribute(new Uint16Array(objectIndices), 1));\r\n\r\n const mesh = new Mesh(\r\n geometry,\r\n new MeshLambertMaterial({\r\n color: 0x44aaff,\r\n // transparent: true,\r\n opacity: 0.25,\r\n side: DoubleSide\r\n })\r\n );\r\n mesh.setDrawMode(TriangleStripDrawMode);\r\n mesh.userData.section = section;\r\n object.add(mesh);\r\n });\r\n\r\n // const geometry = new BufferGeometry();\r\n // geometry.addAttribute(\r\n // 'position', new BufferAttribute(new Float32Array(positions), 3));\r\n // geometry.addAttribute(\r\n // 'normal', new BufferAttribute(new Float32Array(normals), 3));\r\n // geometry.setIndex(new BufferAttribute(new Uint16Array(indices), 1));\r\n\r\n // const mesh = new Mesh(\r\n // geometry,\r\n // new MeshLambertMaterial({\r\n // color: 0x44aaff,\r\n // transparent: true,\r\n // opacity: 0.25,\r\n // side: DoubleSide\r\n // })\r\n // );\r\n // object.add(mesh);\r\n\r\n // const wireframeMesh = new Mesh(\r\n // geometry,\r\n // new MeshBasicMaterial({\r\n // color: 0x88ccff,\r\n // wireframe: true,\r\n // transparent: true,\r\n // opacity: 0.75,\r\n // })\r\n // );\r\n // wireframeMesh.setDrawMode(THREE.TriangleStripDrawMode);\r\n // object.add(wireframeMesh);\r\n }\r\n }\r\n\r\n return {\r\n sections: [...sections.values()].sort((a, b) => a.id - b.id),\r\n object3d: object\r\n };\r\n}\r\n","import { Object3D } from 'three';\r\nimport { Section } from '../../domain';\r\nimport { getAreaRenderData, getAreaCollisionData } from './binaryAssets';\r\nimport { parseCRel, parseNRel } from '../parsing/geometry';\r\n\r\n//\r\n// Caches\r\n//\r\nconst sectionsCache: Map<string, Promise<Section[]>> = new Map();\r\nconst renderGeometryCache: Map<string, Promise<Object3D>> = new Map();\r\nconst collisionGeometryCache: Map<string, Promise<Object3D>> = new Map();\r\n\r\nexport function getAreaSections(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number\r\n): Promise<Section[]> {\r\n const sections = sectionsCache.get(`${episode}-${areaId}-${areaVariant}`);\r\n\r\n if (sections) {\r\n return sections;\r\n } else {\r\n return getAreaSectionsAndRenderGeometry(\r\n episode, areaId, areaVariant).then(({sections}) => sections);\r\n }\r\n}\r\n\r\nexport function getAreaRenderGeometry(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number\r\n): Promise<Object3D> {\r\n const object3d = renderGeometryCache.get(`${episode}-${areaId}-${areaVariant}`);\r\n\r\n if (object3d) {\r\n return object3d;\r\n } else {\r\n return getAreaSectionsAndRenderGeometry(\r\n episode, areaId, areaVariant).then(({object3d}) => object3d);\r\n }\r\n}\r\n\r\nexport function getAreaCollisionGeometry(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number\r\n): Promise<Object3D> {\r\n const object3d = collisionGeometryCache.get(`${episode}-${areaId}-${areaVariant}`);\r\n\r\n if (object3d) {\r\n return object3d;\r\n } else {\r\n const object3d = getAreaCollisionData(\r\n episode, areaId, areaVariant).then(parseCRel);\r\n collisionGeometryCache.set(`${areaId}-${areaVariant}`, object3d);\r\n return object3d;\r\n }\r\n}\r\n\r\nfunction getAreaSectionsAndRenderGeometry(\r\n episode: number,\r\n areaId: number,\r\n areaVariant: number\r\n): Promise<{ sections: Section[], object3d: Object3D }> {\r\n const promise = getAreaRenderData(\r\n episode, areaId, areaVariant).then(parseNRel);\r\n\r\n const sections = new Promise<Section[]>((resolve, reject) => {\r\n promise.then(({sections}) => resolve(sections)).catch(reject);\r\n });\r\n const object3d = new Promise<Object3D>((resolve, reject) => {\r\n promise.then(({object3d}) => resolve(object3d)).catch(reject);\r\n });\r\n\r\n sectionsCache.set(`${episode}-${areaId}-${areaVariant}`, sections);\r\n renderGeometryCache.set(`${episode}-${areaId}-${areaVariant}`, object3d);\r\n\r\n return promise;\r\n}\r\n","import { Matrix3, Matrix4, Vector3 } from 'three';\r\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\n\r\n// TODO:\r\n// - deal with multiple NJCM chunks\r\n// - deal with other types of chunks\r\n// - textures\r\n// - colors\r\n// - bump maps\r\n// - animation\r\n// - deal with vertex information contained in triangle strips\r\n\r\nexport interface NjContext {\r\n format: 'nj';\r\n positions: number[];\r\n normals: number[];\r\n cachedChunkOffsets: number[];\r\n vertices: { position: Vector3, normal: Vector3 }[];\r\n}\r\n\r\ninterface Node {\r\n vertices: { position: Vector3, normal: Vector3 }[];\r\n indices: number[];\r\n parent?: Node;\r\n children: Node[];\r\n}\r\n\r\ninterface ChunkVertex {\r\n index: number;\r\n position: [number, number, number];\r\n normal?: [number, number, number];\r\n}\r\n\r\ninterface ChunkTriangleStrip {\r\n clockwiseWinding: boolean;\r\n indices: number[];\r\n}\r\n\r\nexport function parseNjModel(cursor: ArrayBufferCursor, matrix: Matrix4, context: NjContext): void {\r\n const { positions, normals, cachedChunkOffsets, vertices } = context;\r\n\r\n const vlistOffset = cursor.u32(); // Vertex list\r\n const plistOffset = cursor.u32(); // Triangle strip index list\r\n\r\n const normalMatrix = new Matrix3().getNormalMatrix(matrix);\r\n\r\n if (vlistOffset) {\r\n cursor.seekStart(vlistOffset);\r\n\r\n for (const chunk of parseChunks(cursor, cachedChunkOffsets, true)) {\r\n if (chunk.chunkType === 'VERTEX') {\r\n const chunkVertices: ChunkVertex[] = chunk.data;\r\n\r\n for (const vertex of chunkVertices) {\r\n const position = new Vector3(...vertex.position).applyMatrix4(matrix);\r\n const normal = vertex.normal ? new Vector3(...vertex.normal).applyMatrix3(normalMatrix) : new Vector3(0, 1, 0);\r\n vertices[vertex.index] = { position, normal };\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (plistOffset) {\r\n cursor.seekStart(plistOffset);\r\n\r\n for (const chunk of parseChunks(cursor, cachedChunkOffsets, false)) {\r\n if (chunk.chunkType === 'STRIP') {\r\n for (const { clockwiseWinding, indices: stripIndices } of chunk.data) {\r\n for (let j = 2; j < stripIndices.length; ++j) {\r\n const a = vertices[stripIndices[j - 2]];\r\n const b = vertices[stripIndices[j - 1]];\r\n const c = vertices[stripIndices[j]];\r\n\r\n if (a && b && c) {\r\n if (j % 2 === (clockwiseWinding ? 1 : 0)) {\r\n positions.splice(positions.length, 0, a.position.x, a.position.y, a.position.z);\r\n positions.splice(positions.length, 0, b.position.x, b.position.y, b.position.z);\r\n positions.splice(positions.length, 0, c.position.x, c.position.y, c.position.z);\r\n normals.splice(normals.length, 0, a.normal.x, a.normal.y, a.normal.z);\r\n normals.splice(normals.length, 0, b.normal.x, b.normal.y, b.normal.z);\r\n normals.splice(normals.length, 0, c.normal.x, c.normal.y, c.normal.z);\r\n } else {\r\n positions.splice(positions.length, 0, b.position.x, b.position.y, b.position.z);\r\n positions.splice(positions.length, 0, a.position.x, a.position.y, a.position.z);\r\n positions.splice(positions.length, 0, c.position.x, c.position.y, c.position.z);\r\n normals.splice(normals.length, 0, b.normal.x, b.normal.y, b.normal.z);\r\n normals.splice(normals.length, 0, a.normal.x, a.normal.y, a.normal.z);\r\n normals.splice(normals.length, 0, c.normal.x, c.normal.y, c.normal.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction parseChunks(cursor: ArrayBufferCursor, cachedChunkOffsets: number[], wideEndChunks: boolean): Array<{\r\n chunkType: string,\r\n chunkSubType: string | null,\r\n chunkTypeId: number,\r\n data: any\r\n}> {\r\n const chunks = [];\r\n let loop = true;\r\n\r\n while (loop) {\r\n const chunkTypeId = cursor.u8();\r\n const flags = cursor.u8();\r\n const chunkStartPosition = cursor.position;\r\n let chunkType = 'UNKOWN';\r\n let chunkSubType = null;\r\n let data = null;\r\n let size = 0;\r\n\r\n if (chunkTypeId === 0) {\r\n chunkType = 'NULL';\r\n } else if (1 <= chunkTypeId && chunkTypeId <= 5) {\r\n chunkType = 'BITS';\r\n\r\n if (chunkTypeId === 4) {\r\n chunkSubType = 'CACHE_POLYGON_LIST';\r\n data = {\r\n storeIndex: flags,\r\n offset: cursor.position\r\n };\r\n cachedChunkOffsets[data.storeIndex] = data.offset;\r\n loop = false;\r\n } else if (chunkTypeId === 5) {\r\n chunkSubType = 'DRAW_POLYGON_LIST';\r\n data = {\r\n storeIndex: flags\r\n };\r\n cursor.seekStart(cachedChunkOffsets[data.storeIndex]);\r\n chunks.splice(chunks.length, 0, ...parseChunks(cursor, cachedChunkOffsets, wideEndChunks));\r\n }\r\n } else if (8 <= chunkTypeId && chunkTypeId <= 9) {\r\n chunkType = 'TINY';\r\n size = 2;\r\n } else if (17 <= chunkTypeId && chunkTypeId <= 31) {\r\n chunkType = 'MATERIAL';\r\n size = 2 + 2 * cursor.u16();\r\n } else if (32 <= chunkTypeId && chunkTypeId <= 50) {\r\n chunkType = 'VERTEX';\r\n size = 2 + 4 * cursor.u16();\r\n data = parseChunkVertex(cursor, chunkTypeId, flags);\r\n } else if (56 <= chunkTypeId && chunkTypeId <= 58) {\r\n chunkType = 'VOLUME';\r\n size = 2 + 2 * cursor.u16();\r\n } else if (64 <= chunkTypeId && chunkTypeId <= 75) {\r\n chunkType = 'STRIP';\r\n size = 2 + 2 * cursor.u16();\r\n data = parseChunkTriangleStrip(cursor, chunkTypeId);\r\n } else if (chunkTypeId === 255) {\r\n chunkType = 'END';\r\n size = wideEndChunks ? 2 : 0;\r\n loop = false;\r\n } else {\r\n // Ignore unknown chunks.\r\n console.warn(`Unknown chunk type: ${chunkTypeId}.`);\r\n size = 2 + 2 * cursor.u16();\r\n }\r\n\r\n cursor.seekStart(chunkStartPosition + size);\r\n\r\n chunks.push({\r\n chunkType,\r\n chunkSubType,\r\n chunkTypeId,\r\n data\r\n });\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\nfunction parseChunkVertex(cursor: ArrayBufferCursor, chunkTypeId: number, flags: number): ChunkVertex[] {\r\n // There are apparently 4 different sets of vertices, ignore all but set 0.\r\n if ((flags & 0b11) !== 0) {\r\n return [];\r\n }\r\n\r\n const index = cursor.u16();\r\n const vertexCount = cursor.u16();\r\n\r\n const vertices: ChunkVertex[] = [];\r\n\r\n for (let i = 0; i < vertexCount; ++i) {\r\n const vertex: ChunkVertex = {\r\n index: index + i,\r\n position: [\r\n cursor.f32(), // x\r\n cursor.f32(), // y\r\n cursor.f32(), // z\r\n ]\r\n };\r\n\r\n if (chunkTypeId === 32) {\r\n cursor.seek(4); // Always 1.0\r\n } else if (chunkTypeId === 33) {\r\n cursor.seek(4); // Always 1.0\r\n vertex.normal = [\r\n cursor.f32(), // x\r\n cursor.f32(), // y\r\n cursor.f32(), // z\r\n ];\r\n cursor.seek(4); // Always 0.0\r\n } else if (35 <= chunkTypeId && chunkTypeId <= 40) {\r\n if (chunkTypeId === 37) {\r\n // Ninja flags\r\n vertex.index = index + cursor.u16();\r\n cursor.seek(2);\r\n } else {\r\n // Skip user flags and material information.\r\n cursor.seek(4);\r\n }\r\n } else if (41 <= chunkTypeId && chunkTypeId <= 47) {\r\n vertex.normal = [\r\n cursor.f32(), // x\r\n cursor.f32(), // y\r\n cursor.f32(), // z\r\n ];\r\n\r\n if (chunkTypeId >= 42) {\r\n if (chunkTypeId === 44) {\r\n // Ninja flags\r\n vertex.index = index + cursor.u16();\r\n cursor.seek(2);\r\n } else {\r\n // Skip user flags and material information.\r\n cursor.seek(4);\r\n }\r\n }\r\n } else if (chunkTypeId >= 48) {\r\n // Skip 32-bit vertex normal in format: reserved(2)|x(10)|y(10)|z(10)\r\n cursor.seek(4);\r\n\r\n if (chunkTypeId >= 49) {\r\n // Skip user flags and material information.\r\n cursor.seek(4);\r\n }\r\n }\r\n\r\n vertices.push(vertex);\r\n }\r\n\r\n return vertices;\r\n}\r\n\r\nfunction parseChunkTriangleStrip(cursor: ArrayBufferCursor, chunkTypeId: number): ChunkTriangleStrip[] {\r\n const userOffsetAndStripCount = cursor.u16();\r\n const userFlagsSize = userOffsetAndStripCount >>> 14;\r\n const stripCount = userOffsetAndStripCount & 0x3FFF;\r\n let options;\r\n\r\n switch (chunkTypeId) {\r\n case 64: options = [false, false, false, false]; break;\r\n case 65: options = [true, false, false, false]; break;\r\n case 66: options = [true, false, false, false]; break;\r\n case 67: options = [false, false, true, false]; break;\r\n case 68: options = [true, false, true, false]; break;\r\n case 69: options = [true, false, true, false]; break;\r\n case 70: options = [false, true, false, false]; break;\r\n case 71: options = [true, true, false, false]; break;\r\n case 72: options = [true, true, false, false]; break;\r\n case 73: options = [false, false, false, false]; break;\r\n case 74: options = [true, false, false, true]; break;\r\n case 75: options = [true, false, false, true]; break;\r\n default: throw new Error(`Unexpected chunk type ID: ${chunkTypeId}.`);\r\n }\r\n\r\n const [\r\n parseTextureCoords,\r\n parseColor,\r\n parseNormal,\r\n parseTextureCoordsHires\r\n ] = options;\r\n\r\n const strips = [];\r\n\r\n for (let i = 0; i < stripCount; ++i) {\r\n const windingFlagAndIndexCount = cursor.i16();\r\n const clockwiseWinding = windingFlagAndIndexCount < 1;\r\n const indexCount = Math.abs(windingFlagAndIndexCount);\r\n\r\n const indices = [];\r\n\r\n for (let j = 0; j < indexCount; ++j) {\r\n indices.push(cursor.u16());\r\n\r\n if (parseTextureCoords) {\r\n cursor.seek(4);\r\n }\r\n\r\n if (parseColor) {\r\n cursor.seek(4);\r\n }\r\n\r\n if (parseNormal) {\r\n cursor.seek(6);\r\n }\r\n\r\n if (parseTextureCoordsHires) {\r\n cursor.seek(8);\r\n }\r\n\r\n if (j >= 2) {\r\n cursor.seek(2 * userFlagsSize);\r\n }\r\n }\r\n\r\n strips.push({ clockwiseWinding, indices });\r\n }\r\n\r\n return strips;\r\n}\r\n","import { Matrix3, Matrix4, Vector3 } from 'three';\r\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\n\r\n// TODO:\r\n// - textures\r\n// - colors\r\n// - bump maps\r\n// - animation\r\n\r\nexport interface XjContext {\r\n format: 'xj';\r\n positions: number[];\r\n normals: number[];\r\n indices: number[];\r\n}\r\n\r\nexport function parseXjModel(cursor: ArrayBufferCursor, matrix: Matrix4, context: XjContext): void {\r\n const { positions, normals, indices } = context;\r\n\r\n cursor.seek(4); // Flags according to QEdit, seemingly always 0.\r\n const vertexInfoListOffset = cursor.u32();\r\n cursor.seek(4); // Seems to be the vertexInfoCount, always 1.\r\n const triangleStripListAOffset = cursor.u32();\r\n const triangleStripACount = cursor.u32();\r\n const triangleStripListBOffset = cursor.u32();\r\n const triangleStripBCount = cursor.u32();\r\n cursor.seek(16); // Bounding sphere position and radius in floats.\r\n\r\n const normalMatrix = new Matrix3().getNormalMatrix(matrix);\r\n const indexOffset = positions.length / 3;\r\n\r\n if (vertexInfoListOffset) {\r\n cursor.seekStart(vertexInfoListOffset);\r\n cursor.seek(4); // Possibly the vertex type.\r\n const vertexListOffset = cursor.u32();\r\n const vertexSize = cursor.u32();\r\n const vertexCount = cursor.u32();\r\n\r\n for (let i = 0; i < vertexCount; ++i) {\r\n cursor.seekStart(vertexListOffset + i * vertexSize);\r\n const position = new Vector3(\r\n cursor.f32(),\r\n cursor.f32(),\r\n cursor.f32()\r\n ).applyMatrix4(matrix);\r\n let normal;\r\n\r\n if (vertexSize === 28 || vertexSize === 32 || vertexSize === 36) {\r\n normal = new Vector3(\r\n cursor.f32(),\r\n cursor.f32(),\r\n cursor.f32()\r\n ).applyMatrix3(normalMatrix);\r\n } else {\r\n normal = new Vector3(0, 1, 0);\r\n }\r\n\r\n positions.push(position.x);\r\n positions.push(position.y);\r\n positions.push(position.z);\r\n normals.push(normal.x);\r\n normals.push(normal.y);\r\n normals.push(normal.z);\r\n }\r\n }\r\n\r\n if (triangleStripListAOffset) {\r\n parseTriangleStripList(\r\n cursor,\r\n triangleStripListAOffset,\r\n triangleStripACount,\r\n positions,\r\n normals,\r\n indices,\r\n indexOffset\r\n );\r\n }\r\n\r\n if (triangleStripListBOffset) {\r\n parseTriangleStripList(\r\n cursor,\r\n triangleStripListBOffset,\r\n triangleStripBCount,\r\n positions,\r\n normals,\r\n indices,\r\n indexOffset\r\n );\r\n }\r\n}\r\n\r\nfunction parseTriangleStripList(\r\n cursor: ArrayBufferCursor,\r\n triangleStripListOffset: number,\r\n triangleStripCount: number,\r\n positions: number[],\r\n normals: number[],\r\n indices: number[],\r\n indexOffset: number\r\n): void {\r\n for (let i = 0; i < triangleStripCount; ++i) {\r\n cursor.seekStart(triangleStripListOffset + i * 20);\r\n cursor.seek(8); // Skip material information.\r\n const indexListOffset = cursor.u32();\r\n const indexCount = cursor.u32();\r\n // Ignoring 4 bytes.\r\n\r\n cursor.seekStart(indexListOffset);\r\n const stripIndices = cursor.u16Array(indexCount);\r\n let clockwise = true;\r\n\r\n for (let j = 2; j < stripIndices.length; ++j) {\r\n const a = indexOffset + stripIndices[j - 2];\r\n const b = indexOffset + stripIndices[j - 1];\r\n const c = indexOffset + stripIndices[j];\r\n const pa = new Vector3(positions[3 * a], positions[3 * a + 1], positions[3 * a + 2]);\r\n const pb = new Vector3(positions[3 * b], positions[3 * b + 1], positions[3 * b + 2]);\r\n const pc = new Vector3(positions[3 * c], positions[3 * c + 1], positions[3 * c + 2]);\r\n const na = new Vector3(normals[3 * a], normals[3 * a + 1], normals[3 * a + 2]);\r\n const nb = new Vector3(normals[3 * a], normals[3 * a + 1], normals[3 * a + 2]);\r\n const nc = new Vector3(normals[3 * a], normals[3 * a + 1], normals[3 * a + 2]);\r\n\r\n // Calculate a surface normal and reverse the vertex winding if at least 2 of the vertex normals point in the opposite direction.\r\n // This hack fixes the winding for most models.\r\n const normal = pb.clone().sub(pa).cross(pc.clone().sub(pa));\r\n\r\n if (clockwise) {\r\n normal.negate();\r\n }\r\n\r\n const oppositeCount =\r\n (normal.dot(na) < 0 ? 1 : 0) +\r\n (normal.dot(nb) < 0 ? 1 : 0) +\r\n (normal.dot(nc) < 0 ? 1 : 0);\r\n\r\n if (oppositeCount >= 2) {\r\n clockwise = !clockwise;\r\n }\r\n\r\n if (clockwise) {\r\n indices.push(b);\r\n indices.push(a);\r\n indices.push(c);\r\n } else {\r\n indices.push(a);\r\n indices.push(b);\r\n indices.push(c);\r\n }\r\n\r\n clockwise = !clockwise;\r\n\r\n // The following switch statement fixes model 180.xj (zanba).\r\n // switch (j) {\r\n // case 17:\r\n // case 52:\r\n // case 70:\r\n // case 92:\r\n // case 97:\r\n // case 126:\r\n // case 140:\r\n // case 148:\r\n // case 187:\r\n // case 200:\r\n // console.warn(`swapping winding at: ${j}, (${a}, ${b}, ${c})`);\r\n // break;\r\n // default:\r\n // ccw = !ccw;\r\n // break;\r\n // }\r\n }\r\n }\r\n}\r\n","import {\r\n BufferAttribute,\r\n BufferGeometry,\r\n Euler,\r\n Matrix4,\r\n Quaternion,\r\n Vector3\r\n} from 'three';\r\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\nimport { parseNjModel, NjContext } from './nj';\r\nimport { parseXjModel, XjContext } from './xj';\r\n\r\n// TODO:\r\n// - deal with multiple NJCM chunks\r\n// - deal with other types of chunks\r\n\r\nexport function parseNj(cursor: ArrayBufferCursor): BufferGeometry | undefined {\r\n return parseNinja(cursor, 'nj');\r\n}\r\n\r\nexport function parseXj(cursor: ArrayBufferCursor): BufferGeometry | undefined {\r\n return parseNinja(cursor, 'xj');\r\n}\r\n\r\ntype Format = 'nj' | 'xj';\r\ntype Context = NjContext | XjContext;\r\n\r\nfunction parseNinja(cursor: ArrayBufferCursor, format: Format): BufferGeometry | undefined {\r\n while (cursor.bytesLeft) {\r\n // Ninja uses a little endian variant of the IFF format.\r\n // IFF files contain chunks preceded by an 8-byte header.\r\n // The header consists of 4 ASCII characters for the \"Type ID\" and a 32-bit integer specifying the chunk size.\r\n const iffTypeId = cursor.stringAscii(4, false, false);\r\n const iffChunkSize = cursor.u32();\r\n\r\n if (iffTypeId === 'NJCM') {\r\n return parseNjcm(cursor.take(iffChunkSize), format);\r\n } else {\r\n cursor.seek(iffChunkSize);\r\n }\r\n }\r\n}\r\n\r\nfunction parseNjcm(cursor: ArrayBufferCursor, format: Format): BufferGeometry | undefined {\r\n if (cursor.bytesLeft) {\r\n let context: Context;\r\n\r\n if (format === 'nj') {\r\n context = {\r\n format,\r\n positions: [],\r\n normals: [],\r\n cachedChunkOffsets: [],\r\n vertices: []\r\n };\r\n } else {\r\n context = {\r\n format,\r\n positions: [],\r\n normals: [],\r\n indices: []\r\n };\r\n }\r\n\r\n parseSiblingObjects(cursor, new Matrix4(), context);\r\n return createBufferGeometry(context);\r\n }\r\n}\r\n\r\nfunction parseSiblingObjects(\r\n cursor: ArrayBufferCursor,\r\n parentMatrix: Matrix4,\r\n context: Context\r\n): void {\r\n const evalFlags = cursor.u32();\r\n const noTranslate = (evalFlags & 0b1) !== 0;\r\n const noRotate = (evalFlags & 0b10) !== 0;\r\n const noScale = (evalFlags & 0b100) !== 0;\r\n const hidden = (evalFlags & 0b1000) !== 0;\r\n const breakChildTrace = (evalFlags & 0b10000) !== 0;\r\n const zxyRotationOrder = (evalFlags & 0b100000) !== 0;\r\n\r\n const modelOffset = cursor.u32();\r\n const posX = cursor.f32();\r\n const posY = cursor.f32();\r\n const posZ = cursor.f32();\r\n const rotationX = cursor.i32() * (2 * Math.PI / 0xFFFF);\r\n const rotationY = cursor.i32() * (2 * Math.PI / 0xFFFF);\r\n const rotationZ = cursor.i32() * (2 * Math.PI / 0xFFFF);\r\n const scaleX = cursor.f32();\r\n const scaleY = cursor.f32();\r\n const scaleZ = cursor.f32();\r\n const childOffset = cursor.u32();\r\n const siblingOffset = cursor.u32();\r\n\r\n const rotation = new Euler(rotationX, rotationY, rotationZ, zxyRotationOrder ? 'ZXY' : 'ZYX');\r\n const matrix = new Matrix4()\r\n .compose(\r\n noTranslate ? new Vector3() : new Vector3(posX, posY, posZ),\r\n noRotate ? new Quaternion(0, 0, 0, 1) : new Quaternion().setFromEuler(rotation),\r\n noScale ? new Vector3(1, 1, 1) : new Vector3(scaleX, scaleY, scaleZ)\r\n )\r\n .premultiply(parentMatrix);\r\n\r\n if (modelOffset && !hidden) {\r\n cursor.seekStart(modelOffset);\r\n parseModel(cursor, matrix, context);\r\n }\r\n\r\n if (childOffset && !breakChildTrace) {\r\n cursor.seekStart(childOffset);\r\n parseSiblingObjects(cursor, matrix, context);\r\n }\r\n\r\n if (siblingOffset) {\r\n cursor.seekStart(siblingOffset);\r\n parseSiblingObjects(cursor, parentMatrix, context);\r\n }\r\n}\r\n\r\nfunction createBufferGeometry(context: Context): BufferGeometry {\r\n const geometry = new BufferGeometry();\r\n geometry.addAttribute('position', new BufferAttribute(new Float32Array(context.positions), 3));\r\n geometry.addAttribute('normal', new BufferAttribute(new Float32Array(context.normals), 3));\r\n\r\n if ('indices' in context) {\r\n geometry.setIndex(new BufferAttribute(new Uint16Array(context.indices), 1));\r\n }\r\n\r\n return geometry;\r\n}\r\n\r\nfunction parseModel(cursor: ArrayBufferCursor, matrix: Matrix4, context: Context): void {\r\n if (context.format === 'nj') {\r\n parseNjModel(cursor, matrix, context);\r\n } else {\r\n parseXjModel(cursor, matrix, context);\r\n }\r\n}\r\n","import { BufferGeometry } from 'three';\r\nimport { NpcType, ObjectType } from '../../domain';\r\nimport { getNpcData, getObjectData } from './binaryAssets';\r\nimport { ArrayBufferCursor } from '../ArrayBufferCursor';\r\nimport { parseNj, parseXj } from '../parsing/ninja';\r\n\r\nconst npcCache: Map<string, Promise<BufferGeometry>> = new Map();\r\nconst objectCache: Map<string, Promise<BufferGeometry>> = new Map();\r\n\r\nexport function getNpcGeometry(npcType: NpcType): Promise<BufferGeometry> {\r\n let geometry = npcCache.get(String(npcType.id));\r\n\r\n if (geometry) {\r\n return geometry;\r\n } else {\r\n geometry = getNpcData(npcType).then(({ url, data }) => {\r\n const cursor = new ArrayBufferCursor(data, true);\r\n const object3d = url.endsWith('.nj') ? parseNj(cursor) : parseXj(cursor);\r\n\r\n if (object3d) {\r\n return object3d;\r\n } else {\r\n throw new Error('File could not be parsed into a BufferGeometry.');\r\n }\r\n });\r\n\r\n npcCache.set(String(npcType.id), geometry);\r\n return geometry;\r\n }\r\n}\r\n\r\nexport function getObjectGeometry(objectType: ObjectType): Promise<BufferGeometry> {\r\n let geometry = objectCache.get(String(objectType.id));\r\n\r\n if (geometry) {\r\n return geometry;\r\n } else {\r\n geometry = getObjectData(objectType).then(({ url, data }) => {\r\n const cursor = new ArrayBufferCursor(data, true);\r\n const object3d = url.endsWith('.nj') ? parseNj(cursor) : parseXj(cursor);\r\n\r\n if (object3d) {\r\n return object3d;\r\n } else {\r\n throw new Error('File could not be parsed into a BufferGeometry.');\r\n }\r\n });\r\n\r\n objectCache.set(String(objectType.id), geometry);\r\n return geometry;\r\n }\r\n}\r\n","/**\r\n * This code is based on the Sylverant PRS compression code written by Lawrence Sebald.\r\n */\r\n\r\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\n\r\nexport function compress(src: ArrayBufferCursor): ArrayBufferCursor {\r\n const ctx = new Context(src);\r\n const hashTable = new HashTable();\r\n\r\n if (ctx.src.size <= 3) {\r\n // Make a literal copy of the input.\r\n while (ctx.src.bytesLeft) {\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n }\r\n } else {\r\n // Add the first two \"strings\" to the hash table.\r\n hashTable.put(hashTable.hash(ctx.src), 0);\r\n ctx.src.seek(1);\r\n hashTable.put(hashTable.hash(ctx.src), 1);\r\n ctx.src.seek(-1);\r\n\r\n // Copy the first two bytes as literals.\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n\r\n while (ctx.src.bytesLeft > 1) {\r\n let [offset, mlen] = ctx.findLongestMatch(hashTable, false);\r\n\r\n if (mlen > 0) {\r\n ctx.src.seek(1);\r\n const [offset2, mlen2] = ctx.findLongestMatch(hashTable, true);\r\n ctx.src.seek(-1);\r\n\r\n // Did the \"lazy match\" produce something more compressed?\r\n if (mlen2 > mlen) {\r\n let copyLiteral = true;\r\n // Check if it is a good idea to switch from a short match to a long one.\r\n if (mlen >= 2 && mlen <= 5 && offset2 < offset) {\r\n if (offset >= -256 && offset2 < -256) {\r\n if (mlen2 - mlen < 3) {\r\n copyLiteral = false;\r\n }\r\n }\r\n }\r\n\r\n if (copyLiteral) {\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n continue;\r\n }\r\n }\r\n\r\n // What kind of match did we find?\r\n if (mlen >= 2 && mlen <= 5 && offset >= -256) {\r\n // Short match.\r\n ctx.setBit(0);\r\n ctx.setBit(0);\r\n ctx.setBit((mlen - 2) & 0x02);\r\n ctx.setBit((mlen - 2) & 0x01);\r\n ctx.writeLiteral(offset & 0xFF);\r\n ctx.addIntermediates(hashTable, mlen);\r\n continue;\r\n } else if (mlen >= 3 && mlen <= 9) {\r\n // Long match, short length.\r\n ctx.setBit(0);\r\n ctx.setBit(1);\r\n ctx.writeLiteral(((offset & 0x1F) << 3) | ((mlen - 2) & 0x07));\r\n ctx.writeLiteral(offset >> 5);\r\n ctx.addIntermediates(hashTable, mlen);\r\n continue;\r\n } else if (mlen > 9) {\r\n // Long match, long length.\r\n if (mlen > 256) {\r\n mlen = 256;\r\n }\r\n\r\n ctx.setBit(0);\r\n ctx.setBit(1);\r\n ctx.writeLiteral((offset & 0x1F) << 3);\r\n ctx.writeLiteral(offset >> 5);\r\n ctx.writeLiteral(mlen - 1);\r\n ctx.addIntermediates(hashTable, mlen);\r\n continue;\r\n }\r\n }\r\n\r\n // If we get here, we didn't find a suitable match, so just we just make a literal copy.\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n }\r\n\r\n // If there's a left over byte at the end, make a literal copy.\r\n if (ctx.src.bytesLeft) {\r\n ctx.setBit(1);\r\n ctx.copyLiteral();\r\n }\r\n }\r\n\r\n ctx.writeEof();\r\n\r\n return ctx.dst.seekStart(0);\r\n}\r\n\r\nconst MAX_WINDOW = 0x2000;\r\nconst WINDOW_MASK = MAX_WINDOW - 1;\r\nconst HASH_SIZE = 1 << 8;\r\n\r\nclass Context {\r\n src: ArrayBufferCursor;\r\n dst: ArrayBufferCursor;\r\n flags: number;\r\n flagBitsLeft: number;\r\n flagOffset: number;\r\n\r\n constructor(cursor: ArrayBufferCursor) {\r\n this.src = cursor;\r\n this.dst = new ArrayBufferCursor(cursor.size, cursor.littleEndian);\r\n this.flags = 0;\r\n this.flagBitsLeft = 0;\r\n this.flagOffset = 0;\r\n }\r\n\r\n setBit(bit: number): void {\r\n if (!this.flagBitsLeft--) {\r\n // Write out the flags to their position in the file, and store the next flags byte position.\r\n const pos = this.dst.position;\r\n this.dst\r\n .seekStart(this.flagOffset)\r\n .writeU8(this.flags)\r\n .seekStart(pos)\r\n .writeU8(0); // Placeholder for the next flags byte.\r\n this.flagOffset = pos;\r\n this.flagBitsLeft = 7;\r\n }\r\n\r\n this.flags >>>= 1;\r\n\r\n if (bit) {\r\n this.flags |= 0x80;\r\n }\r\n }\r\n\r\n copyLiteral(): void {\r\n this.dst.writeU8(this.src.u8());\r\n }\r\n\r\n writeLiteral(value: number): void {\r\n this.dst.writeU8(value);\r\n }\r\n\r\n writeFinalFlags(): void {\r\n this.flags >>>= this.flagBitsLeft;\r\n const pos = this.dst.position;\r\n this.dst\r\n .seekStart(this.flagOffset)\r\n .writeU8(this.flags)\r\n .seekStart(pos);\r\n }\r\n\r\n writeEof(): void {\r\n this.setBit(0);\r\n this.setBit(1);\r\n\r\n this.writeFinalFlags();\r\n\r\n this.writeLiteral(0);\r\n this.writeLiteral(0);\r\n }\r\n\r\n matchLength(s2: number): number {\r\n const array = this.src.uint8ArrayView();\r\n let len = 0;\r\n let s1 = this.src.position;\r\n\r\n while (s1 < array.byteLength && array[s1] === array[s2]) {\r\n ++len;\r\n ++s1;\r\n ++s2;\r\n }\r\n\r\n return len;\r\n }\r\n\r\n findLongestMatch(hashTable: HashTable, lazy: boolean): [number, number] {\r\n if (!this.src.bytesLeft) {\r\n return [0, 0];\r\n }\r\n\r\n // Figure out where we're looking.\r\n const hash = hashTable.hash(this.src);\r\n\r\n // If there is nothing in the table at that point, bail out now.\r\n let entry = hashTable.get(hash);\r\n\r\n if (entry === null) {\r\n if (!lazy) {\r\n hashTable.put(hash, this.src.position);\r\n }\r\n\r\n return [0, 0];\r\n }\r\n\r\n // If we'd go outside the window, truncate the hash chain now. \r\n if (this.src.position - entry > MAX_WINDOW) {\r\n hashTable.hashToOffset[hash] = null;\r\n\r\n if (!lazy) {\r\n hashTable.put(hash, this.src.position);\r\n }\r\n\r\n return [0, 0];\r\n }\r\n\r\n // Ok, we have something in the hash table that matches the hash value.\r\n // Follow the chain to see if we have an actual string match, and find the longest match.\r\n let longestLength = 0;\r\n let longestMatch = 0;\r\n\r\n while (entry != null) {\r\n const mlen = this.matchLength(entry);\r\n\r\n if (mlen > longestLength || mlen >= 256) {\r\n longestLength = mlen;\r\n longestMatch = entry;\r\n }\r\n\r\n // Follow the chain, making sure not to exceed a difference of MAX_WINDOW.\r\n let entry2 = hashTable.prev(entry);\r\n\r\n if (entry2 !== null) {\r\n // If we'd go outside the window, truncate the hash chain now.\r\n if (this.src.position - entry2 > MAX_WINDOW) {\r\n hashTable.setPrev(entry, null);\r\n entry2 = null;\r\n }\r\n }\r\n\r\n entry = entry2;\r\n }\r\n\r\n // Add our current string to the hash.\r\n if (!lazy) {\r\n hashTable.put(hash, this.src.position);\r\n }\r\n\r\n // Did we find a match?\r\n const offset = longestLength > 0 ? longestMatch - this.src.position : 0;\r\n return [offset, longestLength];\r\n }\r\n\r\n addIntermediates(hashTable: HashTable, len: number): void {\r\n this.src.seek(1);\r\n\r\n for (let i = 1; i < len; ++i) {\r\n const hash = hashTable.hash(this.src);\r\n hashTable.put(hash, this.src.position);\r\n this.src.seek(1);\r\n }\r\n }\r\n}\r\n\r\nclass HashTable {\r\n hashToOffset: Array<number | null> = new Array(HASH_SIZE).fill(null);\r\n maskedOffsetToPrev: Array<number | null> = new Array(MAX_WINDOW).fill(null);\r\n\r\n hash(cursor: ArrayBufferCursor): number {\r\n let hash = cursor.u8();\r\n\r\n if (cursor.bytesLeft) {\r\n hash ^= cursor.u8();\r\n cursor.seek(-1);\r\n }\r\n\r\n cursor.seek(-1);\r\n return hash;\r\n }\r\n\r\n get(hash: number): number | null {\r\n return this.hashToOffset[hash];\r\n }\r\n\r\n put(hash: number, offset: number): void {\r\n this.setPrev(offset, this.hashToOffset[hash]);\r\n this.hashToOffset[hash] = offset;\r\n }\r\n\r\n prev(offset: number): number | null {\r\n return this.maskedOffsetToPrev[offset & WINDOW_MASK];\r\n }\r\n\r\n setPrev(offset: number, prevOffset: number | null): void {\r\n this.maskedOffsetToPrev[offset & WINDOW_MASK] = prevOffset;\r\n }\r\n}\r\n","/**\r\n * This code is based on the Sylverant PRS decompression code written by Lawrence Sebald.\r\n */\r\n\r\n/*eslint no-use-before-define: \"off\"*/\r\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\n\r\nexport function decompress(cursor: ArrayBufferCursor) {\r\n const ctx = new Context(cursor);\r\n\r\n while (true) {\r\n if (ctx.readFlagBit() === 1) {\r\n // Single byte copy.\r\n ctx.copyU8();\r\n } else {\r\n // Multi byte copy.\r\n let length;\r\n let offset;\r\n\r\n if (ctx.readFlagBit() === 0) {\r\n // Short copy.\r\n length = ctx.readFlagBit() << 1;\r\n length |= ctx.readFlagBit();\r\n length += 2;\r\n\r\n offset = ctx.readU8() - 256;\r\n } else {\r\n // Long copy or end of file.\r\n offset = ctx.readU16();\r\n\r\n // Two zero bytes implies that this is the end of the file.\r\n if (offset === 0) {\r\n break;\r\n }\r\n\r\n // Do we need to read a length byte, or is it encoded in what we already have?\r\n length = offset & 0b111;\r\n offset >>>= 3;\r\n\r\n if (length === 0) {\r\n length = ctx.readU8();\r\n length += 1;\r\n } else {\r\n length += 2;\r\n }\r\n\r\n offset -= 8192;\r\n }\r\n\r\n ctx.offsetCopy(offset, length);\r\n }\r\n }\r\n\r\n return ctx.dst.seekStart(0);\r\n}\r\n\r\nclass Context {\r\n src: ArrayBufferCursor;\r\n dst: ArrayBufferCursor;\r\n flags: number;\r\n flagBitsLeft: number;\r\n\r\n constructor(cursor: ArrayBufferCursor) {\r\n this.src = cursor;\r\n this.dst = new ArrayBufferCursor(4 * cursor.size, cursor.littleEndian);\r\n this.flags = 0;\r\n this.flagBitsLeft = 0;\r\n }\r\n\r\n readFlagBit() {\r\n // Fetch a new flag byte when the previous byte has been processed.\r\n if (this.flagBitsLeft === 0) {\r\n this.flags = this.readU8();\r\n this.flagBitsLeft = 8;\r\n }\r\n\r\n let bit = this.flags & 1;\r\n this.flags >>>= 1;\r\n this.flagBitsLeft -= 1;\r\n return bit;\r\n }\r\n\r\n copyU8() {\r\n this.dst.writeU8(this.readU8());\r\n }\r\n\r\n readU8() {\r\n return this.src.u8();\r\n }\r\n\r\n readU16() {\r\n return this.src.u16();\r\n }\r\n\r\n offsetCopy(offset: number, length: number) {\r\n if (offset < -8192 || offset > 0) {\r\n console.error(`offset was ${offset}, should be between -8192 and 0.`);\r\n }\r\n\r\n if (length < 1 || length > 256) {\r\n console.error(`length was ${length}, should be between 1 and 256.`);\r\n }\r\n\r\n // The length can be larger than -offset, in that case we copy -offset bytes size/-offset times.\r\n const bufSize = Math.min(-offset, length);\r\n\r\n this.dst.seek(offset);\r\n const buf = this.dst.take(bufSize);\r\n this.dst.seek(-offset - bufSize);\r\n\r\n for (let i = 0; i < Math.floor(length / bufSize); ++i) {\r\n this.dst.writeCursor(buf);\r\n }\r\n\r\n this.dst.writeCursor(buf.take(length % bufSize));\r\n }\r\n}\r\n","import { groupBy } from 'lodash';\r\nimport { ArrayBufferCursor } from '../ArrayBufferCursor';\r\n\r\nconst OBJECT_SIZE = 68;\r\nconst NPC_SIZE = 72;\r\n\r\nexport interface DatFile {\r\n objs: DatObject[];\r\n npcs: DatNpc[];\r\n unknowns: DatUnknown[];\r\n}\r\n\r\ninterface DatEntity {\r\n typeId: number;\r\n sectionId: number;\r\n position: { x: number, y: number, z: number };\r\n rotation: { x: number, y: number, z: number };\r\n areaId: number;\r\n unknown: number[][];\r\n}\r\n\r\nexport interface DatObject extends DatEntity {\r\n}\r\n\r\nexport interface DatNpc extends DatEntity {\r\n skin: number;\r\n}\r\n\r\nexport interface DatUnknown {\r\n entityType: number;\r\n totalSize: number;\r\n areaId: number;\r\n entitiesSize: number;\r\n data: number[];\r\n}\r\n\r\nexport function parseDat(cursor: ArrayBufferCursor): DatFile {\r\n const objs: DatObject[] = [];\r\n const npcs: DatNpc[] = [];\r\n const unknowns: DatUnknown[] = [];\r\n\r\n while (cursor.bytesLeft) {\r\n const entityType = cursor.u32();\r\n const totalSize = cursor.u32();\r\n const areaId = cursor.u32();\r\n const entitiesSize = cursor.u32();\r\n\r\n if (entityType === 0) {\r\n break;\r\n } else {\r\n if (entitiesSize !== totalSize - 16) {\r\n throw Error(`Malformed DAT file. Expected an entities size of ${totalSize - 16}, got ${entitiesSize}.`);\r\n }\r\n\r\n if (entityType === 1) { // Objects\r\n const objectCount = Math.floor(entitiesSize / OBJECT_SIZE);\r\n const startPosition = cursor.position;\r\n\r\n for (let i = 0; i < objectCount; ++i) {\r\n const typeId = cursor.u16();\r\n const unknown1 = cursor.u8Array(10);\r\n const sectionId = cursor.u16();\r\n const unknown2 = cursor.u8Array(2);\r\n const x = cursor.f32();\r\n const y = cursor.f32();\r\n const z = cursor.f32();\r\n const rotationX = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n const rotationY = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n const rotationZ = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n // The next 3 floats seem to be scale values.\r\n const unknown3 = cursor.u8Array(28);\r\n\r\n objs.push({\r\n typeId,\r\n sectionId,\r\n position: { x, y, z },\r\n rotation: { x: rotationX, y: rotationY, z: rotationZ },\r\n areaId,\r\n unknown: [unknown1, unknown2, unknown3]\r\n });\r\n }\r\n\r\n const bytesRead = cursor.position - startPosition;\r\n\r\n if (bytesRead !== entitiesSize) {\r\n console.warn(`Read ${bytesRead} bytes instead of expected ${entitiesSize} for entity type ${entityType} (Object).`);\r\n cursor.seek(entitiesSize - bytesRead);\r\n }\r\n } else if (entityType === 2) { // NPCs\r\n const npcCount = Math.floor(entitiesSize / NPC_SIZE);\r\n const startPosition = cursor.position;\r\n\r\n for (let i = 0; i < npcCount; ++i) {\r\n const typeId = cursor.u16();\r\n const unknown1 = cursor.u8Array(10);\r\n const sectionId = cursor.u16();\r\n const unknown2 = cursor.u8Array(6);\r\n const x = cursor.f32();\r\n const y = cursor.f32();\r\n const z = cursor.f32();\r\n const rotationX = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n const rotationY = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n const rotationZ = cursor.i32() / 0xFFFF * 2 * Math.PI;\r\n const unknown3 = cursor.u8Array(20);\r\n const skin = cursor.u32();\r\n const unknown4 = cursor.u8Array(4);\r\n\r\n npcs.push({\r\n typeId,\r\n sectionId,\r\n position: { x, y, z },\r\n rotation: { x: rotationX, y: rotationY, z: rotationZ },\r\n skin,\r\n areaId,\r\n unknown: [unknown1, unknown2, unknown3, unknown4]\r\n });\r\n }\r\n\r\n const bytesRead = cursor.position - startPosition;\r\n\r\n if (bytesRead !== entitiesSize) {\r\n console.warn(`Read ${bytesRead} bytes instead of expected ${entitiesSize} for entity type ${entityType} (NPC).`);\r\n cursor.seek(entitiesSize - bytesRead);\r\n }\r\n } else {\r\n // There are also waves (type 3) and unknown entity types 4 and 5.\r\n unknowns.push({\r\n entityType,\r\n totalSize,\r\n areaId,\r\n entitiesSize,\r\n data: cursor.u8Array(entitiesSize)\r\n });\r\n }\r\n }\r\n }\r\n\r\n return { objs, npcs, unknowns };\r\n}\r\n\r\nexport function writeDat({ objs, npcs, unknowns }: DatFile): ArrayBufferCursor {\r\n const cursor = new ArrayBufferCursor(\r\n objs.length * OBJECT_SIZE + npcs.length * NPC_SIZE + unknowns.length * 1000, true);\r\n\r\n const groupedObjs = groupBy(objs, obj => obj.areaId);\r\n const objAreaIds = Object.keys(groupedObjs)\r\n .map(key => parseInt(key, 10))\r\n .sort((a, b) => a - b);\r\n\r\n for (const areaId of objAreaIds) {\r\n const areaObjs = groupedObjs[areaId];\r\n const entitiesSize = areaObjs.length * OBJECT_SIZE;\r\n cursor.writeU32(1); // Entity type\r\n cursor.writeU32(entitiesSize + 16);\r\n cursor.writeU32(areaId);\r\n cursor.writeU32(entitiesSize);\r\n\r\n for (const obj of areaObjs) {\r\n cursor.writeU16(obj.typeId);\r\n cursor.writeU8Array(obj.unknown[0]);\r\n cursor.writeU16(obj.sectionId);\r\n cursor.writeU8Array(obj.unknown[1]);\r\n cursor.writeF32(obj.position.x);\r\n cursor.writeF32(obj.position.y);\r\n cursor.writeF32(obj.position.z);\r\n cursor.writeI32(Math.round(obj.rotation.x / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeI32(Math.round(obj.rotation.y / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeI32(Math.round(obj.rotation.z / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeU8Array(obj.unknown[2]);\r\n }\r\n }\r\n\r\n const groupedNpcs = groupBy(npcs, npc => npc.areaId);\r\n const npcAreaIds = Object.keys(groupedNpcs)\r\n .map(key => parseInt(key, 10))\r\n .sort((a, b) => a - b);\r\n\r\n for (const areaId of npcAreaIds) {\r\n const areaNpcs = groupedNpcs[areaId];\r\n const entitiesSize = areaNpcs.length * NPC_SIZE;\r\n cursor.writeU32(2); // Entity type\r\n cursor.writeU32(entitiesSize + 16);\r\n cursor.writeU32(areaId);\r\n cursor.writeU32(entitiesSize);\r\n\r\n for (const npc of areaNpcs) {\r\n cursor.writeU16(npc.typeId);\r\n cursor.writeU8Array(npc.unknown[0]);\r\n cursor.writeU16(npc.sectionId);\r\n cursor.writeU8Array(npc.unknown[1]);\r\n cursor.writeF32(npc.position.x);\r\n cursor.writeF32(npc.position.y);\r\n cursor.writeF32(npc.position.z);\r\n cursor.writeI32(Math.round(npc.rotation.x / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeI32(Math.round(npc.rotation.y / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeI32(Math.round(npc.rotation.z / (2 * Math.PI) * 0xFFFF));\r\n cursor.writeU8Array(npc.unknown[2]);\r\n cursor.writeU32(npc.skin);\r\n cursor.writeU8Array(npc.unknown[3]);\r\n }\r\n }\r\n\r\n for (const unknown of unknowns) {\r\n cursor.writeU32(unknown.entityType);\r\n cursor.writeU32(unknown.totalSize);\r\n cursor.writeU32(unknown.areaId);\r\n cursor.writeU32(unknown.entitiesSize);\r\n cursor.writeU8Array(unknown.data);\r\n }\r\n\r\n // Final header.\r\n cursor.writeU32(0);\r\n cursor.writeU32(0);\r\n cursor.writeU32(0);\r\n cursor.writeU32(0);\r\n\r\n cursor.seekStart(0);\r\n\r\n return cursor;\r\n}\r\n","import { ArrayBufferCursor } from '../ArrayBufferCursor';\r\n\r\nexport interface BinFile {\r\n questNumber: number;\r\n language: number;\r\n questName: string;\r\n shortDescription: string;\r\n longDescription: string;\r\n functionOffsets: number[];\r\n instructions: Instruction[];\r\n data: ArrayBufferCursor;\r\n}\r\n\r\nexport function parseBin(cursor: ArrayBufferCursor): BinFile {\r\n const objectCodeOffset = cursor.u32();\r\n const functionOffsetTableOffset = cursor.u32(); // Relative offsets\r\n const size = cursor.u32();\r\n cursor.seek(4); // Always seems to be 0xFFFFFFFF\r\n const questNumber = cursor.u32();\r\n const language = cursor.u32();\r\n const questName = cursor.stringUtf16(64, true, true);\r\n const shortDescription = cursor.stringUtf16(256, true, true);\r\n const longDescription = cursor.stringUtf16(576, true, true);\r\n\r\n if (size !== cursor.size) {\r\n console.warn(`Value ${size} in bin size field does not match actual size ${cursor.size}.`);\r\n }\r\n\r\n const functionOffsetCount = Math.floor(\r\n (cursor.size - functionOffsetTableOffset) / 4);\r\n\r\n cursor.seekStart(functionOffsetTableOffset);\r\n const functionOffsets = [];\r\n\r\n for (let i = 0; i < functionOffsetCount; ++i) {\r\n functionOffsets.push(cursor.i32());\r\n }\r\n\r\n const instructions = parseObjectCode(\r\n cursor.seekStart(objectCodeOffset).take(functionOffsetTableOffset - objectCodeOffset)\r\n );\r\n\r\n return {\r\n questNumber,\r\n language,\r\n questName,\r\n shortDescription,\r\n longDescription,\r\n functionOffsets,\r\n instructions,\r\n data: cursor.seekStart(0).take(cursor.size)\r\n };\r\n}\r\n\r\nexport function writeBin({ data }: { data: ArrayBufferCursor }): ArrayBufferCursor {\r\n return data.seekStart(0);\r\n}\r\n\r\nexport interface Instruction {\r\n opcode: number;\r\n mnemonic: string;\r\n args: any[];\r\n size: number;\r\n}\r\n\r\nfunction parseObjectCode(cursor: ArrayBufferCursor): Instruction[] {\r\n const instructions = [];\r\n\r\n while (cursor.bytesLeft) {\r\n const mainOpcode = cursor.u8();\r\n let opcode;\r\n let opsize;\r\n let list;\r\n\r\n switch (mainOpcode) {\r\n case 0xF8:\r\n opcode = cursor.u8();\r\n opsize = 2;\r\n list = F8opcodeList;\r\n break;\r\n case 0xF9:\r\n opcode = cursor.u8();\r\n opsize = 2;\r\n list = F9opcodeList;\r\n break;\r\n default:\r\n opcode = mainOpcode;\r\n opsize = 1;\r\n list = opcodeList;\r\n break;\r\n }\r\n\r\n const [, mnemonic, mask] = list[opcode];\r\n const opargs = parseInstructionArguments(cursor, mask);\r\n\r\n if (!opargs) {\r\n console.error(`Parameters unknown for opcode 0x${opcode.toString(16).toUpperCase()}.`);\r\n break;\r\n }\r\n\r\n instructions.push({\r\n opcode,\r\n mnemonic,\r\n args: opargs.args,\r\n size: opsize + opargs.size\r\n });\r\n }\r\n\r\n return instructions;\r\n}\r\n\r\nfunction parseInstructionArguments(cursor: ArrayBufferCursor, mask: string | null) {\r\n if (mask == null) {\r\n return;\r\n }\r\n\r\n const oldPos = cursor.position;\r\n const args = [];\r\n let size = 0;\r\n\r\n outer:\r\n for (let i = 0; i < mask.length; ++i) {\r\n switch (mask.charAt(i)) {\r\n // Pushes something on the stack\r\n case 'p':\r\n break;\r\n // Pops the stack (no increments)\r\n case 'a':\r\n break outer;\r\n\r\n // Unsigned integers\r\n case 'B':\r\n args.push(cursor.u8());\r\n size += 1;\r\n break;\r\n case 'W':\r\n args.push(cursor.u16());\r\n size += 2;\r\n break;\r\n case 'L':\r\n args.push(cursor.u32());\r\n size += 4;\r\n break;\r\n\r\n // Signed integers\r\n case 'I':\r\n args.push(cursor.i32());\r\n size += 4;\r\n break;\r\n\r\n // Floats\r\n case 'f':\r\n case 'F':\r\n args.push(cursor.f32());\r\n size += 4;\r\n break;\r\n\r\n // Registers?\r\n case 'R':\r\n case 'r':\r\n size += 1;\r\n break;\r\n\r\n // Pointers to unsigned integers?\r\n case 'b':\r\n args.push(cursor.u8());\r\n size += 1;\r\n break;\r\n case 'w':\r\n args.push(cursor.u16());\r\n size += 2;\r\n break;\r\n case 'l':\r\n args.push(cursor.u32());\r\n size += 4;\r\n break;\r\n\r\n // Pointers to signed integers?\r\n case 'i':\r\n args.push(cursor.i32());\r\n size += 4;\r\n break;\r\n\r\n // Variably sized data (e.g. strings)?\r\n case 'j':\r\n case 'J':\r\n size += 1 + cursor.seek(size).u8() * 2;\r\n break;\r\n case 't':\r\n case 'T':\r\n size += 1 + cursor.seek(size).u8();\r\n break;\r\n case 's':\r\n case 'S':\r\n while (cursor.u16()) {\r\n size += 2;\r\n }\r\n size += 2;\r\n break;\r\n\r\n default:\r\n throw new Error(`Unknown mask part ${mask.charAt(i)}.`);\r\n }\r\n }\r\n\r\n cursor.seekStart(oldPos + size);\r\n return { args, size };\r\n}\r\n\r\nconst opcodeList: Array<[number, string, string | null]> = [\r\n [0x00, 'nop', ''],\r\n [0x01, 'ret', ''],\r\n [0x02, 'sync', ''],\r\n [0x03, 'exit', 'aL'],\r\n [0x04, 'thread', 'W'],\r\n [0x05, 'va_start', ''],\r\n [0x06, 'va_end', ''],\r\n [0x07, 'va_call', 'W'],\r\n [0x08, 'let', 'RR'],\r\n [0x09, 'leti', 'RI'],\r\n [0x0A, 'unknown', null],\r\n [0x0B, 'unknown', null],\r\n [0x0C, 'unknown', null],\r\n [0x0D, 'unknown', null],\r\n [0x0E, 'unknown', null],\r\n [0x0F, 'unknown', null],\r\n [0x10, 'set', 'R'],\r\n [0x11, 'clear', 'R'],\r\n [0x12, 'rev', 'R'],\r\n [0x13, 'gset', 'w'],\r\n [0x14, 'gclear', 'w'],\r\n [0x15, 'grev', 'w'],\r\n [0x16, 'glet', 'w'],\r\n [0x17, 'gget', 'wR'],\r\n [0x18, 'add', 'RR'],\r\n [0x19, 'addi', 'RI'],\r\n [0x1A, 'sub', 'RR'],\r\n [0x1B, 'subi', 'RI'],\r\n [0x1C, 'mul', 'RR'],\r\n [0x1D, 'muli', 'RI'],\r\n [0x1E, 'div', 'RR'],\r\n [0x1F, 'divi', 'RI'],\r\n [0x20, 'and', 'RR'],\r\n [0x21, 'andi', 'RI'],\r\n [0x22, 'or', 'RR'],\r\n [0x23, 'ori', 'RI'],\r\n [0x24, 'xor', 'RR'],\r\n [0x25, 'xori', 'RI'],\r\n [0x26, 'mod', 'RR'],\r\n [0x27, 'modi', 'RI'],\r\n [0x28, 'jmp', 'W'],\r\n [0x29, 'call', 'W'],\r\n [0x2A, 'jmp_on', 'Wt'],\r\n [0x2B, 'jmp_off', 'Wt'],\r\n [0x2C, 'jmp_=', 'RRW'],\r\n [0x2D, 'jmpi_=', 'RIW'],\r\n [0x2E, 'jmp_!=', 'RRW'],\r\n [0x2F, 'jmpi_!=', 'RIW'],\r\n [0x30, 'ujmp_>', 'RRW'],\r\n [0x31, 'ujmpi_>', 'RLW'],\r\n [0x32, 'jmp_>', 'RRW'],\r\n [0x33, 'jmpi_>', 'RIW'],\r\n [0x34, 'ujmp_<', 'RRW'],\r\n [0x35, 'ujmpi_<', 'RLW'],\r\n [0x36, 'jmp_<', 'RRW'],\r\n [0x37, 'jmpi_<', 'RIW'],\r\n [0x38, 'ujmp_>=', 'RRW'],\r\n [0x39, 'ujmpi_>=', 'RLW'],\r\n [0x3A, 'jmp_>=', 'RRW'],\r\n [0x3B, 'jmpi_>=', 'RIW'],\r\n [0x3C, 'ujmp_<=', 'RRW'],\r\n [0x3D, 'ujmpi_<=', 'RLW'],\r\n [0x3E, 'jmp_<=', 'RRW'],\r\n [0x3F, 'jmpi_<=', 'RIW'],\r\n [0x40, 'switch_jmp', 'Rj'],\r\n [0x41, 'switch_call', 'Rj'],\r\n [0x42, 'stack_push', 'R'],\r\n [0x43, 'stack_pop', 'R'],\r\n [0x44, 'stack_pushm', 'RL'],\r\n [0x45, 'stack_popm', 'RL'],\r\n [0x46, 'unknown', null],\r\n [0x47, 'unknown', null],\r\n [0x48, 'arg_pushr', 'pR'],\r\n [0x49, 'arg_pushl', 'pI'],\r\n [0x4A, 'arg_pushb', 'pB'],\r\n [0x4B, 'arg_pushw', 'pW'],\r\n [0x4C, 'unknown', null],\r\n [0x4D, 'unknown', null],\r\n [0x4E, 'arg_pushs', 'ps'],\r\n [0x4F, 'unknown4F', 'RR'],\r\n [0x50, 'message', 'aLs'],\r\n [0x51, 'list', 'aRs'],\r\n [0x52, 'fadein', ''],\r\n [0x53, 'fadeout', ''],\r\n [0x54, 'se', 'aL'],\r\n [0x55, 'bgm', 'aL'],\r\n [0x56, 'unknown', null],\r\n [0x57, 'unknown', null],\r\n [0x58, 'enable', 'aL'],\r\n [0x59, 'disable', 'aL'],\r\n [0x5A, 'window_msg', 'as'],\r\n [0x5B, 'add_msg', 'as'],\r\n [0x5C, 'mesend', ''],\r\n [0x5D, 'gettime', 'R'],\r\n [0x5E, 'winend', ''],\r\n [0x5F, 'unknown', null],\r\n //[ 0x60, 'npc_crt_V1', null ],\r\n [0x60, 'npc_crt_V3', 'R'],\r\n [0x61, 'npc_stop', 'aR'],\r\n [0x62, 'npc_play', 'aL'],\r\n [0x63, 'npc_kill', 'aR'],\r\n [0x64, 'npc_nont', ''],\r\n [0x65, 'npc_talk', ''],\r\n //[ 0x66, 'npc_crp_V1', null ],\r\n [0x66, 'npc_crp_V3', 'R'],\r\n [0x67, 'unknown', null],\r\n [0x68, 'create_pipe', 'aL'],\r\n //[ 0x69, 'p_hpstat_V1', null ],\r\n [0x69, 'p_hpstat_V3', 'aRL'],\r\n //[ 0x6A, 'p_dead_V1', null ],\r\n [0x6A, 'p_dead_V3', 'aRL'],\r\n [0x6B, 'p_disablewarp', ''],\r\n [0x6C, 'p_enablewarp', ''],\r\n //[ 0x6D, 'p_move_V1', null ],\r\n [0x6D, 'p_move_V3', 'R'],\r\n [0x6E, 'p_look', 'aL'],\r\n [0x6F, 'unknown', null],\r\n [0x70, 'p_action_disable', ''],\r\n [0x71, 'p_action_enable', ''],\r\n [0x72, 'disable_movement1', 'aR'],\r\n [0x73, 'enable_movement1', 'aR'],\r\n [0x74, 'p_noncol', ''],\r\n [0x75, 'p_col', ''],\r\n [0x76, 'p_setpos', 'aRR'],\r\n [0x77, 'p_return_guild', ''],\r\n [0x78, 'p_talk_guild', 'aL'],\r\n //[ 0x79, 'npc_talk_pl_V1', null ],\r\n [0x79, 'npc_talk_pl_V3', 'R'],\r\n [0x7A, 'npc_talk_kill', 'aL'],\r\n //[ 0x7B, 'npc_crtpk_V1', null ],\r\n [0x7B, 'npc_crtpk_V3', 'R'],\r\n //[ 0x7C, 'npc_crppk_V1', null ],\r\n [0x7C, 'npc_crppk_V3', 'R'],\r\n //[ 0x7D, 'npc_crptalk_v1', null ],\r\n [0x7D, 'npc_crptalk_v3', 'R'],\r\n [0x7E, 'p_look_at_V1', 'aLL'],\r\n //[ 0x7F, 'npc_crp_id_V1', null ],\r\n [0x7F, 'npc_crp_id_V3', 'R'],\r\n [0x80, 'cam_quake', ''],\r\n [0x81, 'cam_adj', ''],\r\n [0x82, 'cam_zmin', ''],\r\n [0x83, 'cam_zmout', ''],\r\n //[ 0x84, 'cam_pan_V1', null ],\r\n [0x84, 'cam_pan_V3', 'R'],\r\n [0x85, 'game_lev_super', ''],\r\n [0x86, 'game_lev_reset', ''],\r\n //[ 0x87, 'pos_pipe_V1', null ],\r\n [0x87, 'pos_pipe_V3', 'R'],\r\n [0x88, 'if_zone_clear', 'RR'],\r\n [0x89, 'chk_ene_num', 'R'],\r\n [0x8A, 'unhide_obj', 'R'],\r\n [0x8B, 'unhide_ene', 'R'],\r\n [0x8C, 'at_coords_call', 'R'],\r\n [0x8D, 'at_coords_talk', 'R'],\r\n [0x8E, 'col_npcin', 'R'],\r\n [0x8F, 'col_npcinr', 'R'],\r\n [0x90, 'switch_on', 'aL'],\r\n [0x91, 'switch_off', 'aL'],\r\n [0x92, 'playbgm_epi', 'aL'],\r\n [0x93, 'set_mainwarp', 'aL'],\r\n [0x94, 'set_obj_param', 'RR'],\r\n [0x95, 'set_floor_handler', 'aLW'],\r\n [0x96, 'clr_floor_handler', 'aL'],\r\n [0x97, 'col_plinaw', 'R'],\r\n [0x98, 'hud_hide', ''],\r\n [0x99, 'hud_show', ''],\r\n [0x9A, 'cine_enable', ''],\r\n [0x9B, 'cine_disable', ''],\r\n [0x9C, 'unknown', null],\r\n [0x9D, 'unknown', null],\r\n [0x9E, 'unknown', null],\r\n [0x9F, 'unknown', null],\r\n [0xA0, 'unknown', null],\r\n [0xA1, 'set_qt_failure', 'W'],\r\n [0xA2, 'set_qt_success', 'W'],\r\n [0xA3, 'clr_qt_failure', ''],\r\n [0xA4, 'clr_qt_success', ''],\r\n [0xA5, 'set_qt_cancel', 'W'],\r\n [0xA6, 'clr_qt_cancel', ''],\r\n [0xA7, 'unknown', null],\r\n //[ 0xA8, 'pl_walk_V1', null ],\r\n [0xA8, 'pl_walk_V3', 'R'],\r\n [0xA9, 'unknown', null],\r\n [0xAA, 'unknown', null],\r\n [0xAB, 'unknown', null],\r\n [0xAC, 'unknown', null],\r\n [0xAD, 'unknown', null],\r\n [0xAE, 'unknown', null],\r\n [0xAF, 'unknown', null],\r\n [0xB0, 'pl_add_meseta', 'aLL'],\r\n [0xB1, 'thread_stg', 'W'],\r\n [0xB2, 'del_obj_param', 'R'],\r\n [0xB3, 'item_create', 'RR'],\r\n [0xB4, 'item_create2', 'RR'],\r\n [0xB5, 'item_delete', 'RR'],\r\n [0xB6, 'item_delete2', 'RR'],\r\n [0xB7, 'item_check', 'RR'],\r\n [0xB8, 'setevt', 'aL'],\r\n [0xB9, 'get_difflvl', 'R'],\r\n [0xBA, 'set_qt_exit', 'W'],\r\n [0xBB, 'clr_qt_exit', ''],\r\n [0xBC, 'unknown', null],\r\n [0xBD, 'unknown', null],\r\n [0xBE, 'unknown', null],\r\n [0xBF, 'unknown', null],\r\n //[ 0xC0, 'particle_V1', null ],\r\n [0xC0, 'particle_V3', 'R'],\r\n [0xC1, 'npc_text', 'aLs'],\r\n [0xC2, 'npc_chkwarp', ''],\r\n [0xC3, 'pl_pkoff', ''],\r\n [0xC4, 'map_designate', 'R'],\r\n [0xC5, 'masterkey_on', ''],\r\n [0xC6, 'masterkey_off', ''],\r\n [0xC7, 'window_time', ''],\r\n [0xC8, 'winend_time', ''],\r\n [0xC9, 'winset_time', 'R'],\r\n [0xCA, 'getmtime', 'R'],\r\n [0xCB, 'set_quest_board_handler', 'aLWs'],\r\n [0xCC, 'clear_quest_board_handler', 'aL'],\r\n //[ 0xCD, 'particle_id_V1', null ],\r\n [0xCD, 'particle_id_V3', 'R'],\r\n //[ 0xCE, 'npc_crptalk_id_V1', null ],\r\n [0xCE, 'npc_crptalk_id_V3', 'R'],\r\n [0xCF, 'npc_lang_clean', ''],\r\n [0xD0, 'pl_pkon', ''],\r\n [0xD1, 'pl_chk_item2', 'RR'],\r\n [0xD2, 'enable_mainmenu', ''],\r\n [0xD3, 'disable_mainmenu', ''],\r\n [0xD4, 'start_battlebgm', ''],\r\n [0xD5, 'end_battlebgm', ''],\r\n [0xD6, 'disp_msg_qb', 'as'],\r\n [0xD7, 'close_msg_qb', ''],\r\n //[ 0xD8, 'set_eventflag_v1', null ],\r\n [0xD8, 'set_eventflag_v3', 'aLL'],\r\n [0xD9, 'sync_leti', null],\r\n [0xDA, 'set_returnhunter', ''],\r\n [0xDB, 'set_returncity', ''],\r\n [0xDC, 'load_pvr', ''],\r\n [0xDD, 'load_midi', ''],\r\n [0xDE, 'unknown', null],\r\n //[ 0xDF, 'npc_param_V1', null ],\r\n [0xDF, 'npc_param_V3', 'aRL'],\r\n [0xE0, 'pad_dragon', ''],\r\n [0xE1, 'clear_mainwarp', 'aL'],\r\n //[ 0xE2, 'pcam_param_V1', null ],\r\n [0xE2, 'pcam_param_V3', 'R'],\r\n //[ 0xE3, 'start_setevt_v1', null ],\r\n [0xE3, 'start_setevt_v3', 'aRL'],\r\n [0xE4, 'warp_on', ''],\r\n [0xE5, 'warp_off', ''],\r\n [0xE6, 'get_slotnumber', 'R'],\r\n [0xE7, 'get_servernumber', 'R'],\r\n [0xE8, 'set_eventflag2', 'aLR'],\r\n [0xE9, 'res', 'RR'],\r\n [0xEA, 'unknownEA', 'RL'],\r\n [0xEB, 'enable_bgmctrl', 'aL'],\r\n [0xEC, 'sw_send', 'R'],\r\n [0xED, 'create_bgmctrl', ''],\r\n [0xEE, 'pl_add_meseta2', 'aL'],\r\n //[ 0xEF, 'sync_let', null ],\r\n [0xEF, 'sync_register', 'aRL'],\r\n [0xF0, 'send_regwork', null],\r\n //[ 0xF1, 'leti_fixed_camera_V1', null ],\r\n [0xF1, 'leti_fixed_camera_V3', 'R'],\r\n [0xF2, 'default_camera_pos1', ''],\r\n [0xF3, 'unknown', null],\r\n [0xF4, 'unknown', null],\r\n [0xF5, 'unknown', null],\r\n [0xF6, 'unknown', null],\r\n [0xF7, 'unknown', null],\r\n [0xF8, 'unknownF8', 'R'],\r\n [0xF9, 'unknown', null],\r\n [0xFA, 'get_gc_number', 'R'],\r\n [0xFB, 'unknownFB', 'W'],\r\n [0xFC, 'unknown', null],\r\n [0xFD, 'unknown', null],\r\n [0xFE, 'unknown', null],\r\n [0xFF, 'unknownFF', ''],\r\n];\r\n\r\nconst F8opcodeList: Array<[number, string, string | null]> = [\r\n [0x00, 'unknown', null],\r\n [0x01, 'set_chat_callback?', 'aRs'],\r\n [0x02, 'unknown', null],\r\n [0x03, 'unknown', null],\r\n [0x04, 'unknown', null],\r\n [0x05, 'unknown', null],\r\n [0x06, 'unknown', null],\r\n [0x07, 'unknown', null],\r\n [0x08, 'get_difficulty_level2', 'R'],\r\n [0x09, 'get_number_of_player1', 'R'],\r\n [0x0A, 'get_coord_of_player', 'RR'],\r\n [0x0B, 'unknownF80B', ''],\r\n [0x0C, 'unknownF80C', ''],\r\n [0x0D, 'map_designate_ex', 'R'],\r\n [0x0E, 'unknownF80E', 'aL'],\r\n [0x0F, 'unknownF80F', 'aL'],\r\n [0x10, 'ba_initial_floor', 'aL'],\r\n [0x11, 'set_ba_rules', ''],\r\n [0x12, 'unknownF812', 'aL'],\r\n [0x13, 'unknownF813', 'aL'],\r\n [0x14, 'unknownF814', 'aL'],\r\n [0x15, 'unknownF815', 'aL'],\r\n [0x16, 'unknownF816', 'aL'],\r\n [0x17, 'unknownF817', 'aL'],\r\n [0x18, 'unknownF818', 'aL'],\r\n [0x19, 'unknownF819', 'aL'],\r\n [0x1A, 'unknownF81A', 'aL'],\r\n [0x1B, 'unknownF81B', 'aL'],\r\n [0x1C, 'ba_disp_msg', 'as'],\r\n [0x1D, 'death_lvl_up', 'aL'],\r\n [0x1E, 'death_tech_lvl_up', 'aL'],\r\n [0x1F, 'unknown', null],\r\n [0x20, 'cmode_stage', 'aL'],\r\n [0x21, 'unknown', null],\r\n [0x22, 'unknown', null],\r\n [0x23, 'unknownF823', 'aL'],\r\n [0x24, 'unknownF824', 'aL'],\r\n [0x25, 'exp_multiplication', 'R'],\r\n [0x26, 'exp_division?', 'R'],\r\n [0x27, 'get_user_is_dead?', 'R'],\r\n [0x28, 'go_floor', 'RR'],\r\n [0x29, 'unknown', null],\r\n [0x2A, 'unknown', null],\r\n [0x2B, 'unlock_door2', 'aLL'],\r\n [0x2C, 'lock_door2', 'aLL'],\r\n [0x2D, 'if_switch_not_pressed', 'R'],\r\n [0x2E, 'if_switch_pressed', 'R'],\r\n [0x2F, 'unknownF82F', 'aLL'],\r\n [0x30, 'control_dragon', 'R'],\r\n [0x31, 'release_dragon', ''],\r\n [0x32, 'unknown', null],\r\n [0x33, 'unknown', null],\r\n [0x34, 'unknown', null],\r\n [0x35, 'unknown', null],\r\n [0x36, 'unknown', null],\r\n [0x37, 'unknown', null],\r\n [0x38, 'shrink', 'R'],\r\n [0x39, 'unshrink', 'R'],\r\n [0x3A, 'unknown', null],\r\n [0x3B, 'unknown', null],\r\n [0x3C, 'display_clock2?', 'R'],\r\n [0x3D, 'unknownF83D', 'aL'],\r\n [0x3E, 'delete_area_title?', 'aL'],\r\n [0x3F, 'unknown', null],\r\n [0x40, 'load_npc_data', ''],\r\n [0x41, 'get_npc_data', 'W'],\r\n [0x42, 'unknown', null],\r\n [0x43, 'unknown', null],\r\n [0x44, 'unknown', null],\r\n [0x45, 'unknown', null],\r\n [0x46, 'unknown', null],\r\n [0x47, 'unknown', null],\r\n [0x48, 'give_damage_score', 'R'],\r\n [0x49, 'take_damage_score', 'R'],\r\n [0x4A, 'unk_score_F84A', 'R'],\r\n [0x4B, 'unk_score_F84B', 'R'],\r\n [0x4C, 'kill_score', 'R'],\r\n [0x4D, 'death_score', 'R'],\r\n [0x4E, 'unk_score_F84E', 'R'],\r\n [0x4F, 'enemy_death_score', 'R'],\r\n [0x50, 'meseta_score', 'R'],\r\n [0x51, 'unknownF851', 'R'],\r\n [0x52, 'unknownF852', 'aL'],\r\n [0x53, 'reverse_warps', ''],\r\n [0x54, 'unreverse_warps', ''],\r\n [0x55, 'set_ult_map', ''],\r\n [0x56, 'unset_ult_map', ''],\r\n [0x57, 'set_area_title', 'as'],\r\n [0x58, 'unknownF858', ''],\r\n [0x59, 'unknown', null],\r\n [0x5A, 'equip_item', 'R'],\r\n [0x5B, 'unequip_item', 'aLL'],\r\n [0x5C, 'unknown', null],\r\n [0x5D, 'unknown', null],\r\n [0x5E, 'unknownF85E', 'aL'],\r\n [0x5F, 'unknownF85F', 'aL'],\r\n [0x60, 'unknownF860', ''],\r\n [0x61, 'unknownF861', 'aL'],\r\n [0x62, 'unknown', null],\r\n [0x63, 'unknown', null],\r\n [0x64, 'cmode_rank', 'aLs'],\r\n [0x65, 'award_item_name?', ''],\r\n [0x66, 'award_item_select?', ''],\r\n [0x67, 'award_item_give_to?', 'R'],\r\n [0x68, 'unknownF868', 'RR'],\r\n [0x69, 'unknownF869', 'RR'],\r\n [0x6A, 'item_create_cmode', 'RR'],\r\n [0x6B, 'unknownF86B', 'R'],\r\n [0x6C, 'award_item_ok?', 'R'],\r\n [0x6D, 'unknownF86D', ''],\r\n [0x6E, 'unknownF86E', ''],\r\n [0x6F, 'ba_set_lives', 'aL'],\r\n [0x70, 'ba_set_tech_lvl', 'aL'],\r\n [0x71, 'ba_set_lvl', 'aL'],\r\n [0x72, 'ba_set_time_limit', 'aL'],\r\n [0x73, 'boss_is_dead?', 'R'],\r\n [0x74, 'unknown', null],\r\n [0x75, 'unknown', null],\r\n [0x76, 'unknown', null],\r\n [0x77, 'enable_techs', 'R'],\r\n [0x78, 'disable_techs', 'R'],\r\n [0x79, 'get_gender', 'RR'],\r\n [0x7A, 'get_chara_class', 'RR'],\r\n [0x7B, 'take_slot_meseta', 'RR'],\r\n [0x7C, 'unknown', null],\r\n [0x7D, 'unknown', null],\r\n [0x7E, 'unknown', null],\r\n [0x7F, 'read_guildcard_flag', 'RR'],\r\n [0x80, 'unknownF880', 'R'],\r\n [0x81, 'get_pl_name?', 'R'],\r\n [0x82, 'unknown', null],\r\n [0x83, 'unknownF883', 'RR'],\r\n [0x84, 'unknown', null],\r\n [0x85, 'unknown', null],\r\n [0x86, 'unknown', null],\r\n [0x87, 'unknown', null],\r\n [0x88, 'ba_close_msg', ''],\r\n [0x89, 'unknown', null],\r\n [0x8A, 'get_player_status', 'RR'],\r\n [0x8B, 'send_mail', 'aRs'],\r\n [0x8C, 'online_check', 'R'],\r\n [0x8D, 'chl_set_timerecord?', 'R'],\r\n [0x8E, 'chl_get_timerecord?', 'R'],\r\n [0x8F, 'unknownF88F', 'R'],\r\n [0x90, 'unknownF890', ''],\r\n [0x91, 'load_enemy_data', 'aL'],\r\n [0x92, 'get_physical_data', 'W'],\r\n [0x93, 'get_attack_data', 'W'],\r\n [0x94, 'get_resist_data', 'W'],\r\n [0x95, 'get_movement_data', 'W'],\r\n [0x96, 'unknown', null],\r\n [0x97, 'unknown', null],\r\n [0x98, 'shift_left', 'RR'],\r\n [0x99, 'shift_right', 'RR'],\r\n [0x9A, 'get_random', 'RR'],\r\n [0x9B, 'reset_map', ''],\r\n [0x9C, 'disp_chl_retry_menu', 'R'],\r\n [0x9D, 'chl_reverser?', ''],\r\n [0x9E, 'unknownF89E', 'aL'],\r\n [0x9F, 'unknownF89F', 'R'],\r\n [0xA0, 'unknownF8A0', ''],\r\n [0xA1, 'unknownF8A1', ''],\r\n [0xA2, 'unknown', null],\r\n [0xA3, 'unknown', null],\r\n [0xA4, 'unknown', null],\r\n [0xA5, 'unknown', null],\r\n [0xA6, 'unknown', null],\r\n [0xA7, 'unknown', null],\r\n [0xA8, 'unknownF8A8', 'aL'],\r\n [0xA9, 'unknownF8A9', 'R'],\r\n [0xAA, 'unknown', null],\r\n [0xAB, 'unknown', null],\r\n [0xAC, 'unknown', null],\r\n [0xAD, 'get_number_of_player2', 'R'],\r\n [0xAE, 'unknown', null],\r\n [0xAF, 'unknown', null],\r\n [0xB0, 'unknown', null],\r\n [0xB1, 'unknown', null],\r\n [0xB2, 'unknown', null],\r\n [0xB3, 'unknown', null],\r\n [0xB4, 'unknown', null],\r\n [0xB5, 'unknown', null],\r\n [0xB6, 'unknown', null],\r\n [0xB7, 'unknown', null],\r\n [0xB8, 'unknownF8B8', ''],\r\n [0xB9, 'chl_recovery?', ''],\r\n [0xBA, 'unknown', null],\r\n [0xBB, 'unknown', null],\r\n [0xBC, 'set_episode', 'L'],\r\n [0xBD, 'unknown', null],\r\n [0xBE, 'unknown', null],\r\n [0xBF, 'unknown', null],\r\n [0xC0, 'file_dl_req', 'aLs'],\r\n [0xC1, 'get_dl_status', 'R'],\r\n [0xC2, 'gba_unknown4?', ''],\r\n [0xC3, 'get_gba_state?', 'R'],\r\n [0xC4, 'unknownF8C4', 'R'],\r\n [0xC5, 'unknownF8C5', 'R'],\r\n [0xC6, 'QEXIT', ''],\r\n [0xC7, 'use_animation', 'RR'],\r\n [0xC8, 'stop_animation', 'R'],\r\n [0xC9, 'run_to_coord', 'RR'],\r\n [0xCA, 'set_slot_invincible', 'RR'],\r\n [0xCB, 'unknownF8CB', 'R'],\r\n [0xCC, 'set_slot_poison', 'R'],\r\n [0xCD, 'set_slot_paralyze', 'R'],\r\n [0xCE, 'set_slot_shock', 'R'],\r\n [0xCF, 'set_slot_freeze', 'R'],\r\n [0xD0, 'set_slot_slow', 'R'],\r\n [0xD1, 'set_slot_confuse', 'R'],\r\n [0xD2, 'set_slot_shifta', 'R'],\r\n [0xD3, 'set_slot_deband', 'R'],\r\n [0xD4, 'set_slot_jellen', 'R'],\r\n [0xD5, 'set_slot_zalure', 'R'],\r\n [0xD6, 'fleti_fixed_camera', 'aR'],\r\n [0xD7, 'fleti_locked_camera', 'aLR'],\r\n [0xD8, 'default_camera_pos2', ''],\r\n [0xD9, 'set_motion_blur', ''],\r\n [0xDA, 'set_screen_b&w', ''],\r\n [0xDB, 'unknownF8DB', 'aLLLLRW'],\r\n [0xDC, 'NPC_action_string', 'RRW'],\r\n [0xDD, 'get_pad_cond', 'RR'],\r\n [0xDE, 'get_button_cond', 'RR'],\r\n [0xDF, 'freeze_enemies', ''],\r\n [0xE0, 'unfreeze_enemies', ''],\r\n [0xE1, 'freeze_everything', ''],\r\n [0xE2, 'unfreeze_everything', ''],\r\n [0xE3, 'restore_hp', 'R'],\r\n [0xE4, 'restore_tp', 'R'],\r\n [0xE5, 'close_chat_bubble', 'R'],\r\n [0xE6, 'unknownF8E6', 'RR'],\r\n [0xE7, 'unknownF8E7', 'RR'],\r\n [0xE8, 'unknownF8E8', 'RR'],\r\n [0xE9, 'unknownF8E9', 'RR'],\r\n [0xEA, 'unknownF8EA', 'RR'],\r\n [0xEB, 'unknownF8EB', 'RR'],\r\n [0xEC, 'unknownF8EC', 'RR'],\r\n [0xED, 'animation_check', 'RR'],\r\n [0xEE, 'call_image_data', 'aLW'],\r\n [0xEF, 'unknownF8EF', ''],\r\n [0xF0, 'turn_off_bgm_p2', ''],\r\n [0xF1, 'turn_on_bgm_p2', ''],\r\n [0xF2, 'load_unk_data', 'aLLLLRW'],\r\n [0xF3, 'particle2', 'aRLf'],\r\n [0xF4, 'unknown', null],\r\n [0xF5, 'unknown', null],\r\n [0xF6, 'unknown', null],\r\n [0xF7, 'unknown', null],\r\n [0xF8, 'unknown', null],\r\n [0xF9, 'unknown', null],\r\n [0xFA, 'unknown', null],\r\n [0xFB, 'unknown', null],\r\n [0xFC, 'unknown', null],\r\n [0xFD, 'unknown', null],\r\n [0xFE, 'unknown', null],\r\n [0xFF, 'unknown', null],\r\n];\r\n\r\nconst F9opcodeList: Array<[number, string, string | null]> = [\r\n [0x00, 'unknown', null],\r\n [0x01, 'dec2float', 'RR'],\r\n [0x02, 'float2dec', 'RR'],\r\n [0x03, 'flet', 'RR'],\r\n [0x04, 'fleti', 'RF'],\r\n [0x05, 'unknown', null],\r\n [0x06, 'unknown', null],\r\n [0x07, 'unknown', null],\r\n [0x08, 'fadd', 'RR'],\r\n [0x09, 'faddi', 'RF'],\r\n [0x0A, 'fsub', 'RR'],\r\n [0x0B, 'fsubi', 'RF'],\r\n [0x0C, 'fmul', 'RR'],\r\n [0x0D, 'fmuli', 'RF'],\r\n [0x0E, 'fdiv', 'RR'],\r\n [0x0F, 'fdivi', 'RF'],\r\n [0x10, 'get_unknown_count?', 'aLR'],\r\n [0x11, 'get_stackable_item_count', 'RR'],\r\n [0x12, 'freeze_and_hide_equip', ''],\r\n [0x13, 'thaw_and_show_equip', ''],\r\n [0x14, 'set_paletteX_callback', 'aRW'],\r\n [0x15, 'activate_paletteX', 'aR'],\r\n [0x16, 'enable_paletteX', 'aR'],\r\n [0x17, 'restore_paletteX', 'aL'],\r\n [0x18, 'disable_paletteX', 'aL'],\r\n [0x19, 'get_paletteX_activated', 'aLR'],\r\n [0x1A, 'get_unknown_paletteX_status?', 'aLR'],\r\n [0x1B, 'disable_movement2', 'aR'],\r\n [0x1C, 'enable_movement2', 'aR'],\r\n [0x1D, 'get_time_played', 'R'],\r\n [0x1E, 'get_guildcard_total', 'R'],\r\n [0x1F, 'get_slot_meseta', 'R'],\r\n [0x20, 'get_player_level', 'aLR'],\r\n [0x21, 'get_Section_ID', 'aLR'],\r\n [0x22, 'get_player_hp', 'aRR'],\r\n [0x23, 'get_floor_number', 'aRR'],\r\n [0x24, 'get_coord_player_detect', 'RR'],\r\n [0x25, 'read_global_flag', 'abR'],\r\n [0x26, 'write_global_flag', 'abR'],\r\n [0x27, 'unknownF927', 'RR'],\r\n [0x28, 'floor_player_detect', 'R'],\r\n [0x29, 'read_disk_file?', 'as'],\r\n [0x2A, 'open_pack_select', ''],\r\n [0x2B, 'item_select', 'R'],\r\n [0x2C, 'get_item_id', 'R'],\r\n [0x2D, 'color_change', 'aRRRRR'],\r\n [0x2E, 'send_statistic?', 'aLLLLLLLL'],\r\n [0x2F, 'unknownF92F', 'aLL'],\r\n [0x30, 'chat_box', 'aLLLLLs'],\r\n [0x31, 'chat_bubble', 'aLs'],\r\n [0x32, 'unknown', null],\r\n [0x33, 'unknownF933', 'R'],\r\n [0x34, 'scroll_text', 'aLLLLLfRs'],\r\n [0x35, 'gba_unknown1', ''],\r\n [0x36, 'gba_unknown2', ''],\r\n [0x37, 'gba_unknown3', ''],\r\n [0x38, 'add_damage_to?', 'aLL'],\r\n [0x39, 'item_delete2', 'aL'],\r\n [0x3A, 'get_item_info', 'aLR'],\r\n [0x3B, 'item_packing1', 'aL'],\r\n [0x3C, 'item_packing2', 'aLL'],\r\n [0x3D, 'get_lang_setting?', 'aR'],\r\n [0x3E, 'prepare_statistic?', 'aLWW'],\r\n [0x3F, 'keyword_detect', ''],\r\n [0x40, 'Keyword', 'aRLs'],\r\n [0x41, 'get_guildcard_num', 'aLR'],\r\n [0x42, 'unknown', null],\r\n [0x43, 'unknown', null],\r\n [0x44, 'get_wrap_status', 'aLR'],\r\n [0x45, 'initial_floor', 'aL'],\r\n [0x46, 'sin', 'aRL'],\r\n [0x47, 'cos', 'aRL'],\r\n [0x48, 'unknown', null],\r\n [0x49, 'unknown', null],\r\n [0x4A, 'boss_is_dead2?', 'R'],\r\n [0x4B, 'unknownF94B', 'R'],\r\n [0x4C, 'unknownF94C', 'R'],\r\n [0x4D, 'is_there_cardbattle', 'R'],\r\n [0x4E, 'unknown', null],\r\n [0x4F, 'unknown', null],\r\n [0x50, 'BB_p2_menu', 'aL'],\r\n [0x51, 'BB_Map_Designate', 'BWBB'],\r\n [0x52, 'BB_get_number_in_pack', 'R'],\r\n [0x53, 'BB_swap_item', 'aLLLLLLWW'],\r\n [0x54, 'BB_check_wrap', 'aRR'],\r\n [0x55, 'BB_exchange_PD_item', 'aRRRWW'],\r\n [0x56, 'BB_exchange_PD_srank', 'aRRRRRWW'],\r\n [0x57, 'BB_exchange_PD_special', 'aRRRRRLWW'],\r\n [0x58, 'BB_exchange_PD_percent', 'aRRRRRLWW'],\r\n [0x59, 'unknownF959', 'aL'],\r\n [0x5A, 'unknown', null],\r\n [0x5B, 'unknown', null],\r\n [0x5C, 'BB_exchange_SLT', 'aLRWW'],\r\n [0x5D, 'BB_exchange_PC', ''],\r\n [0x5E, 'BB_box_create_BP', 'aLff'],\r\n [0x5F, 'BB_exchange_PT', 'aRRLWW'],\r\n [0x60, 'unknownF960', 'aL'],\r\n [0x61, 'unknownF961', ''],\r\n [0x62, 'unknown', null],\r\n [0x63, 'unknown', null],\r\n [0x64, 'unknown', null],\r\n [0x65, 'unknown', null],\r\n [0x66, 'unknown', null],\r\n [0x67, 'unknown', null],\r\n [0x68, 'unknown', null],\r\n [0x69, 'unknown', null],\r\n [0x6A, 'unknown', null],\r\n [0x6B, 'unknown', null],\r\n [0x6C, 'unknown', null],\r\n [0x6D, 'unknown', null],\r\n [0x6E, 'unknown', null],\r\n [0x6F, 'unknown', null],\r\n [0x70, 'unknown', null],\r\n [0x71, 'unknown', null],\r\n [0x72, 'unknown', null],\r\n [0x73, 'unknown', null],\r\n [0x74, 'unknown', null],\r\n [0x75, 'unknown', null],\r\n [0x76, 'unknown', null],\r\n [0x77, 'unknown', null],\r\n [0x78, 'unknown', null],\r\n [0x79, 'unknown', null],\r\n [0x7A, 'unknown', null],\r\n [0x7B, 'unknown', null],\r\n [0x7C, 'unknown', null],\r\n [0x7D, 'unknown', null],\r\n [0x7E, 'unknown', null],\r\n [0x7F, 'unknown', null],\r\n [0x80, 'unknown', null],\r\n [0x81, 'unknown', null],\r\n [0x82, 'unknown', null],\r\n [0x83, 'unknown', null],\r\n [0x84, 'unknown', null],\r\n [0x85, 'unknown', null],\r\n [0x86, 'unknown', null],\r\n [0x87, 'unknown', null],\r\n [0x88, 'unknown', null],\r\n [0x89, 'unknown', null],\r\n [0x8A, 'unknown', null],\r\n [0x8B, 'unknown', null],\r\n [0x8C, 'unknown', null],\r\n [0x8D, 'unknown', null],\r\n [0x8E, 'unknown', null],\r\n [0x8F, 'unknown', null],\r\n [0x90, 'unknown', null],\r\n [0x91, 'unknown', null],\r\n [0x92, 'unknown', null],\r\n [0x93, 'unknown', null],\r\n [0x94, 'unknown', null],\r\n [0x95, 'unknown', null],\r\n [0x96, 'unknown', null],\r\n [0x97, 'unknown', null],\r\n [0x98, 'unknown', null],\r\n [0x99, 'unknown', null],\r\n [0x9A, 'unknown', null],\r\n [0x9B, 'unknown', null],\r\n [0x9C, 'unknown', null],\r\n [0x9D, 'unknown', null],\r\n [0x9E, 'unknown', null],\r\n [0x9F, 'unknown', null],\r\n [0xA0, 'unknown', null],\r\n [0xA1, 'unknown', null],\r\n [0xA2, 'unknown', null],\r\n [0xA3, 'unknown', null],\r\n [0xA4, 'unknown', null],\r\n [0xA5, 'unknown', null],\r\n [0xA6, 'unknown', null],\r\n [0xA7, 'unknown', null],\r\n [0xA8, 'unknown', null],\r\n [0xA9, 'unknown', null],\r\n [0xAA, 'unknown', null],\r\n [0xAB, 'unknown', null],\r\n [0xAC, 'unknown', null],\r\n [0xAD, 'unknown', null],\r\n [0xAE, 'unknown', null],\r\n [0xAF, 'unknown', null],\r\n [0xB0, 'unknown', null],\r\n [0xB1, 'unknown', null],\r\n [0xB2, 'unknown', null],\r\n [0xB3, 'unknown', null],\r\n [0xB4, 'unknown', null],\r\n [0xB5, 'unknown', null],\r\n [0xB6, 'unknown', null],\r\n [0xB7, 'unknown', null],\r\n [0xB8, 'unknown', null],\r\n [0xB9, 'unknown', null],\r\n [0xBA, 'unknown', null],\r\n [0xBB, 'unknown', null],\r\n [0xBC, 'unknown', null],\r\n [0xBD, 'unknown', null],\r\n [0xBE, 'unknown', null],\r\n [0xBF, 'unknown', null],\r\n [0xC0, 'unknown', null],\r\n [0xC1, 'unknown', null],\r\n [0xC2, 'unknown', null],\r\n [0xC3, 'unknown', null],\r\n [0xC4, 'unknown', null],\r\n [0xC5, 'unknown', null],\r\n [0xC6, 'unknown', null],\r\n [0xC7, 'unknown', null],\r\n [0xC8, 'unknown', null],\r\n [0xC9, 'unknown', null],\r\n [0xCA, 'unknown', null],\r\n [0xCB, 'unknown', null],\r\n [0xCC, 'unknown', null],\r\n [0xCD, 'unknown', null],\r\n [0xCE, 'unknown', null],\r\n [0xCF, 'unknown', null],\r\n [0xD0, 'unknown', null],\r\n [0xD1, 'unknown', null],\r\n [0xD2, 'unknown', null],\r\n [0xD3, 'unknown', null],\r\n [0xD4, 'unknown', null],\r\n [0xD5, 'unknown', null],\r\n [0xD6, 'unknown', null],\r\n [0xD7, 'unknown', null],\r\n [0xD8, 'unknown', null],\r\n [0xD9, 'unknown', null],\r\n [0xDA, 'unknown', null],\r\n [0xDB, 'unknown', null],\r\n [0xDC, 'unknown', null],\r\n [0xDD, 'unknown', null],\r\n [0xDE, 'unknown', null],\r\n [0xDF, 'unknown', null],\r\n [0xE0, 'unknown', null],\r\n [0xE1, 'unknown', null],\r\n [0xE2, 'unknown', null],\r\n [0xE3, 'unknown', null],\r\n [0xE4, 'unknown', null],\r\n [0xE5, 'unknown', null],\r\n [0xE6, 'unknown', null],\r\n [0xE7, 'unknown', null],\r\n [0xE8, 'unknown', null],\r\n [0xE9, 'unknown', null],\r\n [0xEA, 'unknown', null],\r\n [0xEB, 'unknown', null],\r\n [0xEC, 'unknown', null],\r\n [0xED, 'unknown', null],\r\n [0xEE, 'unknown', null],\r\n [0xEF, 'unknown', null],\r\n [0xF0, 'unknown', null],\r\n [0xF1, 'unknown', null],\r\n [0xF2, 'unknown', null],\r\n [0xF3, 'unknown', null],\r\n [0xF4, 'unknown', null],\r\n [0xF5, 'unknown', null],\r\n [0xF6, 'unknown', null],\r\n [0xF7, 'unknown', null],\r\n [0xF8, 'unknown', null],\r\n [0xF9, 'unknown', null],\r\n [0xFA, 'unknown', null],\r\n [0xFB, 'unknown', null],\r\n [0xFC, 'unknown', null],\r\n [0xFD, 'unknown', null],\r\n [0xFE, 'unknown', null],\r\n [0xFF, 'unknown', null],\r\n];","import { ArrayBufferCursor } from '../ArrayBufferCursor';\r\n\r\ninterface QstContainedFile {\r\n name: string;\r\n name2?: string; // Unsure what this is\r\n questNo?: number;\r\n expectedSize?: number;\r\n data: ArrayBufferCursor;\r\n chunkNos: Set<number>;\r\n}\r\n\r\ninterface ParseQstResult {\r\n version: string;\r\n files: QstContainedFile[];\r\n}\r\n\r\n/**\r\n * Low level parsing function for .qst files.\r\n * Can only read the Blue Burst format.\r\n */\r\nexport function parseQst(cursor: ArrayBufferCursor): ParseQstResult | undefined {\r\n // A .qst file contains two 88-byte headers that describe the embedded .dat and .bin files.\r\n let version = 'PC';\r\n\r\n // Detect version.\r\n const versionA = cursor.u8();\r\n cursor.seek(1);\r\n const versionB = cursor.u8();\r\n\r\n if (versionA === 0x44) {\r\n version = 'Dreamcast/GameCube';\r\n } else if (versionA === 0x58) {\r\n if (versionB === 0x44) {\r\n version = 'Blue Burst';\r\n }\r\n } else if (versionA === 0xA6) {\r\n version = 'Dreamcast download';\r\n }\r\n\r\n if (version === 'Blue Burst') {\r\n // Read headers and contained files.\r\n cursor.seekStart(0);\r\n\r\n const headers = parseHeaders(cursor);\r\n\r\n const files = parseFiles(\r\n cursor, new Map(headers.map(h => [h.fileName, h.size])));\r\n\r\n for (const file of files) {\r\n const header = headers.find(h => h.fileName === file.name);\r\n\r\n if (header) {\r\n file.questNo = header.questNo;\r\n file.name2 = header.fileName2;\r\n }\r\n }\r\n\r\n return {\r\n version,\r\n files\r\n };\r\n } else {\r\n console.error(`Can't parse ${version} QST files.`);\r\n }\r\n}\r\n\r\ninterface SimpleQstContainedFile {\r\n name: string;\r\n name2?: string;\r\n questNo?: number;\r\n data: ArrayBufferCursor;\r\n}\r\n\r\ninterface WriteQstParams {\r\n version?: string;\r\n files: SimpleQstContainedFile[];\r\n}\r\n\r\n/**\r\n * Always writes in Blue Burst format.\r\n */\r\nexport function writeQst(params: WriteQstParams): ArrayBufferCursor {\r\n const files = params.files;\r\n const totalSize = files\r\n .map(f => 88 + Math.ceil(f.data.size / 1024) * 1056)\r\n .reduce((a, b) => a + b);\r\n const cursor = new ArrayBufferCursor(totalSize, true);\r\n\r\n writeFileHeaders(cursor, files);\r\n writeFileChunks(cursor, files);\r\n\r\n if (cursor.size !== totalSize) {\r\n throw new Error(`Expected a final file size of ${totalSize}, but got ${cursor.size}.`);\r\n }\r\n\r\n return cursor.seekStart(0);\r\n}\r\n\r\ninterface QstHeader {\r\n questNo: number;\r\n fileName: string;\r\n fileName2: string;\r\n size: number;\r\n}\r\n\r\n/**\r\n * TODO: Read all headers instead of just the first 2.\r\n */\r\nfunction parseHeaders(cursor: ArrayBufferCursor): QstHeader[] {\r\n const headers = [];\r\n\r\n for (let i = 0; i < 2; ++i) {\r\n cursor.seek(4);\r\n const questNo = cursor.u16();\r\n cursor.seek(38);\r\n const fileName = cursor.stringAscii(16, true, true);\r\n const size = cursor.u32();\r\n // Not sure what this is:\r\n const fileName2 = cursor.stringAscii(24, true, true);\r\n\r\n headers.push({\r\n questNo,\r\n fileName,\r\n fileName2,\r\n size\r\n });\r\n }\r\n\r\n return headers;\r\n}\r\n\r\nfunction parseFiles(cursor: ArrayBufferCursor, expectedSizes: Map<string, number>): QstContainedFile[] {\r\n // Files are interleaved in 1056 byte chunks.\r\n // Each chunk has a 24 byte header, 1024 byte data segment and an 8 byte trailer.\r\n const files = new Map<string, QstContainedFile>();\r\n\r\n while (cursor.bytesLeft) {\r\n const startPosition = cursor.position;\r\n\r\n // Read meta data.\r\n const chunkNo = cursor.seek(4).u8();\r\n const fileName = cursor.seek(3).stringAscii(16, true, true);\r\n\r\n let file = files.get(fileName);\r\n\r\n if (!file) {\r\n const expectedSize = expectedSizes.get(fileName);\r\n files.set(fileName, file = {\r\n name: fileName,\r\n expectedSize,\r\n data: new ArrayBufferCursor(expectedSize || (10 * 1024), true),\r\n chunkNos: new Set()\r\n });\r\n }\r\n\r\n if (file.chunkNos.has(chunkNo)) {\r\n console.warn(`File chunk number ${chunkNo} of file ${fileName} was already encountered, overwriting previous chunk.`);\r\n } else {\r\n file.chunkNos.add(chunkNo);\r\n }\r\n\r\n // Read file data.\r\n let size = cursor.seek(1024).u32();\r\n cursor.seek(-1028);\r\n\r\n if (size > 1024) {\r\n console.warn(`Data segment size of ${size} is larger than expected maximum size, reading just 1024 bytes.`);\r\n size = 1024;\r\n }\r\n\r\n const data = cursor.take(size);\r\n const chunkPosition = chunkNo * 1024;\r\n file.data.size = Math.max(chunkPosition + size, file.data.size);\r\n file.data.seekStart(chunkPosition).writeCursor(data);\r\n\r\n // Skip the padding and the trailer.\r\n cursor.seek(1032 - data.size);\r\n\r\n if (cursor.position !== startPosition + 1056) {\r\n throw new Error(`Read ${cursor.position - startPosition} file chunk message bytes instead of expected 1056.`);\r\n }\r\n }\r\n\r\n for (const file of files.values()) {\r\n // Clean up file properties.\r\n file.data.seekStart(0);\r\n file.chunkNos = new Set(Array.from(file.chunkNos.values()).sort((a, b) => a - b));\r\n\r\n // Check whether the expected size was correct.\r\n if (file.expectedSize != null && file.data.size !== file.expectedSize) {\r\n console.warn(`File ${file.name} has an actual size of ${file.data.size} instead of the expected size ${file.expectedSize}.`);\r\n }\r\n\r\n // Detect missing file chunks.\r\n const actualSize = Math.max(file.data.size, file.expectedSize || 0);\r\n\r\n for (let chunkNo = 0; chunkNo < Math.ceil(actualSize / 1024); ++chunkNo) {\r\n if (!file.chunkNos.has(chunkNo)) {\r\n console.warn(`File ${file.name} is missing chunk ${chunkNo}.`);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(files.values());\r\n}\r\n\r\nfunction writeFileHeaders(cursor: ArrayBufferCursor, files: SimpleQstContainedFile[]): void {\r\n for (const file of files) {\r\n if (file.name.length > 16) {\r\n throw Error(`File ${file.name} has a name longer than 16 characters.`);\r\n }\r\n\r\n cursor.writeU16(88); // Header size.\r\n cursor.writeU16(0x44); // Magic number.\r\n cursor.writeU16(file.questNo || 0);\r\n\r\n for (let i = 0; i < 38; ++i) {\r\n cursor.writeU8(0);\r\n }\r\n\r\n cursor.writeStringAscii(file.name, 16);\r\n cursor.writeU32(file.data.size);\r\n\r\n let fileName2: string;\r\n\r\n if (file.name2 == null) {\r\n // Not sure this makes sense.\r\n const dotPos = file.name.lastIndexOf('.');\r\n fileName2 = dotPos === -1\r\n ? file.name + '_j'\r\n : file.name.slice(0, dotPos) + '_j' + file.name.slice(dotPos);\r\n } else {\r\n fileName2 = file.name2;\r\n }\r\n\r\n if (fileName2.length > 24) {\r\n throw Error(`File ${file.name} has a fileName2 length (${fileName2}) longer than 24 characters.`);\r\n }\r\n\r\n cursor.writeStringAscii(fileName2, 24);\r\n }\r\n}\r\n\r\nfunction writeFileChunks(cursor: ArrayBufferCursor, files: SimpleQstContainedFile[]): void {\r\n // Files are interleaved in 1056 byte chunks.\r\n // Each chunk has a 24 byte header, 1024 byte data segment and an 8 byte trailer.\r\n files = files.slice();\r\n const chunkNos = new Array(files.length).fill(0);\r\n\r\n while (files.length) {\r\n let i = 0;\r\n\r\n while (i < files.length) {\r\n if (!writeFileChunk(cursor, files[i].data, chunkNos[i]++, files[i].name)) {\r\n // Remove if there are no more chunks to write.\r\n files.splice(i, 1);\r\n chunkNos.splice(i, 1);\r\n } else {\r\n ++i;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @returns true if there are bytes left to write in data, false otherwise.\r\n */\r\nfunction writeFileChunk(\r\n cursor: ArrayBufferCursor,\r\n data: ArrayBufferCursor,\r\n chunkNo: number,\r\n name: string\r\n): boolean {\r\n cursor.writeU8Array([28, 4, 19, 0]);\r\n cursor.writeU8(chunkNo);\r\n cursor.writeU8Array([0, 0, 0]);\r\n cursor.writeStringAscii(name, 16);\r\n\r\n const size = Math.min(1024, data.bytesLeft);\r\n cursor.writeCursor(data.take(size));\r\n\r\n // Padding.\r\n for (let i = size; i < 1024; ++i) {\r\n cursor.writeU8(0);\r\n }\r\n\r\n cursor.writeU32(size);\r\n cursor.writeU32(0);\r\n\r\n return !!data.bytesLeft;\r\n}\r\n","import { Area, AreaVariant } from '../domain';\r\n\r\nfunction area(id: number, name: string, order: number, variants: number) {\r\n const area = new Area(id, name, order, []);\r\n const varis = Array(variants).fill(null).map((_, i) => new AreaVariant(i, area));\r\n area.areaVariants.splice(0, 0, ...varis);\r\n return area;\r\n}\r\n\r\nclass AreaStore {\r\n areas: Area[][];\r\n\r\n constructor() {\r\n // The IDs match the PSO IDs for areas.\r\n this.areas = [];\r\n let order = 0;\r\n this.areas[1] = [\r\n area(0, 'Pioneer II', order++, 1),\r\n area(1, 'Forest 1', order++, 1),\r\n area(2, 'Forest 2', order++, 1),\r\n area(11, 'Under the Dome', order++, 1),\r\n area(3, 'Cave 1', order++, 6),\r\n area(4, 'Cave 2', order++, 5),\r\n area(5, 'Cave 3', order++, 6),\r\n area(12, 'Underground Channel', order++, 1),\r\n area(6, 'Mine 1', order++, 6),\r\n area(7, 'Mine 2', order++, 6),\r\n area(13, 'Monitor Room', order++, 1),\r\n area(8, 'Ruins 1', order++, 5),\r\n area(9, 'Ruins 2', order++, 5),\r\n area(10, 'Ruins 3', order++, 5),\r\n area(14, 'Dark Falz', order++, 1)\r\n ];\r\n order = 0;\r\n this.areas[2] = [\r\n area(0, 'Lab', order++, 1),\r\n area(1, 'VR Temple Alpha', order++, 3),\r\n area(2, 'VR Temple Beta', order++, 3),\r\n area(14, 'VR Temple Final', order++, 1),\r\n area(3, 'VR Spaceship Alpha', order++, 3),\r\n area(4, 'VR Spaceship Beta', order++, 3),\r\n area(15, 'VR Spaceship Final', order++, 1),\r\n area(5, 'Central Control Area', order++, 1),\r\n area(6, 'Jungle Area East', order++, 1),\r\n area(7, 'Jungle Area North', order++, 1),\r\n area(8, 'Mountain Area', order++, 3),\r\n area(9, 'Seaside Area', order++, 1),\r\n area(12, 'Cliffs of Gal Da Val', order++, 1),\r\n area(10, 'Seabed Upper Levels', order++, 3),\r\n area(11, 'Seabed Lower Levels', order++, 3),\r\n area(13, 'Test Subject Disposal Area', order++, 1),\r\n area(16, 'Seaside Area at Night', order++, 1),\r\n area(17, 'Control Tower', order++, 5)\r\n ];\r\n order = 0;\r\n this.areas[4] = [\r\n area(0, 'Pioneer II (Ep. IV)', order++, 1),\r\n area(1, 'Crater Route 1', order++, 1),\r\n area(2, 'Crater Route 2', order++, 1),\r\n area(3, 'Crater Route 3', order++, 1),\r\n area(4, 'Crater Route 4', order++, 1),\r\n area(5, 'Crater Interior', order++, 1),\r\n area(6, 'Subterranean Desert 1', order++, 3),\r\n area(7, 'Subterranean Desert 2', order++, 3),\r\n area(8, 'Subterranean Desert 3', order++, 3),\r\n area(9, 'Meteor Impact Site', order++, 1)\r\n ];\r\n }\r\n\r\n getVariant(episode: number, areaId: number, variantId: number) {\r\n if (episode !== 1 && episode !== 2 && episode !== 4)\r\n throw new Error(`Expected episode to be 1, 2 or 4, got ${episode}.`);\r\n\r\n const area = this.areas[episode].find(a => a.id === areaId);\r\n if (!area)\r\n throw new Error(`Area id ${areaId} for episode ${episode} is invalid.`);\r\n\r\n const areaVariant = area.areaVariants[variantId];\r\n if (!areaVariant)\r\n throw new Error(`Area variant id ${variantId} for area ${areaId} of episode ${episode} is invalid.`);\r\n\r\n return areaVariant;\r\n }\r\n}\r\n\r\nexport const areaStore = new AreaStore();\r\n","import { ArrayBufferCursor } from '../ArrayBufferCursor';\r\nimport * as prs from '../compression/prs';\r\nimport { parseDat, writeDat, DatObject, DatNpc } from './dat';\r\nimport { parseBin, writeBin, Instruction } from './bin';\r\nimport { parseQst, writeQst } from './qst';\r\nimport {\r\n Vec3,\r\n AreaVariant,\r\n QuestNpc,\r\n QuestObject,\r\n Quest,\r\n ObjectType,\r\n NpcType\r\n} from '../../domain';\r\nimport { areaStore } from '../../stores/AreaStore';\r\n\r\n/**\r\n * High level parsing function that delegates to lower level parsing functions.\r\n * \r\n * Always delegates to parseQst at the moment.\r\n */\r\nexport function parseQuest(cursor: ArrayBufferCursor): Quest | undefined {\r\n const qst = parseQst(cursor);\r\n\r\n if (!qst) {\r\n return;\r\n }\r\n\r\n let datFile = null;\r\n let binFile = null;\r\n\r\n for (const file of qst.files) {\r\n if (file.name.endsWith('.dat')) {\r\n datFile = file;\r\n } else if (file.name.endsWith('.bin')) {\r\n binFile = file;\r\n }\r\n }\r\n\r\n // TODO: deal with missing/multiple DAT or BIN file.\r\n\r\n if (!datFile) {\r\n console.error('File contains no DAT file.');\r\n return;\r\n }\r\n\r\n if (!binFile) {\r\n console.error('File contains no BIN file.');\r\n return;\r\n }\r\n\r\n const dat = parseDat(prs.decompress(datFile.data));\r\n const bin = parseBin(prs.decompress(binFile.data));\r\n let episode = 1;\r\n let areaVariants: AreaVariant[] = [];\r\n\r\n if (bin.functionOffsets.length) {\r\n const func0Ops = getFuncOperations(bin.instructions, bin.functionOffsets[0]);\r\n\r\n if (func0Ops) {\r\n episode = getEpisode(func0Ops);\r\n areaVariants = getAreaVariants(episode, func0Ops);\r\n } else {\r\n console.warn(`Function 0 offset ${bin.functionOffsets[0]} is invalid.`);\r\n }\r\n } else {\r\n console.warn('File contains no functions.');\r\n }\r\n\r\n return new Quest(\r\n bin.questName,\r\n bin.shortDescription,\r\n bin.longDescription,\r\n datFile.questNo,\r\n episode,\r\n areaVariants,\r\n parseObjData(dat.objs),\r\n parseNpcData(episode, dat.npcs),\r\n dat.unknowns,\r\n bin.data\r\n );\r\n}\r\n\r\nexport function writeQuestQst(quest: Quest, fileName: string): ArrayBufferCursor {\r\n const dat = writeDat({\r\n objs: objectsToDatData(quest.objects),\r\n npcs: npcsToDatData(quest.npcs),\r\n unknowns: quest.datUnkowns\r\n });\r\n const bin = writeBin({ data: quest.binData });\r\n const extStart = fileName.lastIndexOf('.');\r\n const baseFileName = extStart === -1 ? fileName : fileName.slice(0, extStart);\r\n\r\n return writeQst({\r\n files: [\r\n {\r\n name: baseFileName + '.dat',\r\n questNo: quest.questNo,\r\n data: prs.compress(dat)\r\n },\r\n {\r\n name: baseFileName + '.bin',\r\n questNo: quest.questNo,\r\n data: prs.compress(bin)\r\n }\r\n ]\r\n });\r\n}\r\n\r\n/**\r\n * Defaults to episode I.\r\n */\r\nfunction getEpisode(func0Ops: Instruction[]): number {\r\n const setEpisode = func0Ops.find(op => op.mnemonic === 'set_episode');\r\n\r\n if (setEpisode) {\r\n switch (setEpisode.args[0]) {\r\n default:\r\n case 0: return 1;\r\n case 1: return 2;\r\n case 2: return 4;\r\n }\r\n } else {\r\n console.warn('Function 0 has no set_episode instruction.');\r\n return 1;\r\n }\r\n}\r\n\r\nfunction getAreaVariants(episode: number, func0Ops: Instruction[]): AreaVariant[] {\r\n const areaVariants = new Map();\r\n const bbMaps = func0Ops.filter(op => op.mnemonic === 'BB_Map_Designate');\r\n\r\n for (const bbMap of bbMaps) {\r\n const areaId = bbMap.args[0];\r\n const variantId = bbMap.args[2];\r\n areaVariants.set(areaId, variantId);\r\n }\r\n\r\n // Sort by area order and then variant id.\r\n return (\r\n Array.from(areaVariants)\r\n .map(([areaId, variantId]) =>\r\n areaStore.getVariant(episode, areaId, variantId))\r\n .sort((a, b) => a.area.order - b.area.order || a.id - b.id)\r\n );\r\n}\r\n\r\nfunction getFuncOperations(operations: Instruction[], funcOffset: number) {\r\n let position = 0;\r\n let funcFound = false;\r\n const funcOps: Instruction[] = [];\r\n\r\n for (const operation of operations) {\r\n if (position === funcOffset) {\r\n funcFound = true;\r\n }\r\n\r\n if (funcFound) {\r\n funcOps.push(operation);\r\n\r\n // Break when ret is encountered.\r\n if (operation.opcode === 1) {\r\n break;\r\n }\r\n }\r\n\r\n position += operation.size;\r\n }\r\n\r\n return funcFound ? funcOps : null;\r\n}\r\n\r\nfunction parseObjData(objs: DatObject[]): QuestObject[] {\r\n return objs.map(objData => {\r\n const { x, y, z } = objData.position;\r\n const rot = objData.rotation;\r\n return new QuestObject(\r\n objData.areaId,\r\n objData.sectionId,\r\n new Vec3(x, y, z),\r\n new Vec3(rot.x, rot.y, rot.z),\r\n ObjectType.fromPsoId(objData.typeId),\r\n objData\r\n );\r\n });\r\n}\r\n\r\nfunction parseNpcData(episode: number, npcs: DatNpc[]): QuestNpc[] {\r\n return npcs.map(npcData => {\r\n const { x, y, z } = npcData.position;\r\n const rot = npcData.rotation;\r\n return new QuestNpc(\r\n npcData.areaId,\r\n npcData.sectionId,\r\n new Vec3(x, y, z),\r\n new Vec3(rot.x, rot.y, rot.z),\r\n getNpcType(episode, npcData),\r\n npcData\r\n );\r\n });\r\n}\r\n\r\n// TODO: detect Mothmant, St. Rappy, Hallo Rappy, Egg Rappy, Death Gunner, Bulk and Recon.\r\nfunction getNpcType(episode: number, { typeId, unknown, skin, areaId }: DatNpc): NpcType {\r\n const regular = (unknown[2][18] & 0x80) === 0;\r\n\r\n switch (`${typeId}, ${skin % 3}, ${episode}`) {\r\n case `${0x044}, 0, 1`: return NpcType.Booma;\r\n case `${0x044}, 1, 1`: return NpcType.Gobooma;\r\n case `${0x044}, 2, 1`: return NpcType.Gigobooma;\r\n\r\n case `${0x063}, 0, 1`: return NpcType.EvilShark;\r\n case `${0x063}, 1, 1`: return NpcType.PalShark;\r\n case `${0x063}, 2, 1`: return NpcType.GuilShark;\r\n\r\n case `${0x0A6}, 0, 1`: return NpcType.Dimenian;\r\n case `${0x0A6}, 0, 2`: return NpcType.Dimenian2;\r\n case `${0x0A6}, 1, 1`: return NpcType.LaDimenian;\r\n case `${0x0A6}, 1, 2`: return NpcType.LaDimenian2;\r\n case `${0x0A6}, 2, 1`: return NpcType.SoDimenian;\r\n case `${0x0A6}, 2, 2`: return NpcType.SoDimenian2;\r\n\r\n case `${0x0D6}, 0, 2`: return NpcType.Mericarol;\r\n case `${0x0D6}, 1, 2`: return NpcType.Mericus;\r\n case `${0x0D6}, 2, 2`: return NpcType.Merikle;\r\n\r\n case `${0x115}, 0, 4`: return NpcType.Boota;\r\n case `${0x115}, 1, 4`: return NpcType.ZeBoota;\r\n case `${0x115}, 2, 4`: return NpcType.BaBoota;\r\n case `${0x117}, 0, 4`: return NpcType.Goran;\r\n case `${0x117}, 1, 4`: return NpcType.PyroGoran;\r\n case `${0x117}, 2, 4`: return NpcType.GoranDetonator;\r\n }\r\n\r\n switch (`${typeId}, ${skin % 2}, ${episode}`) {\r\n case `${0x040}, 0, 1`: return NpcType.Hildebear;\r\n case `${0x040}, 0, 2`: return NpcType.Hildebear2;\r\n case `${0x040}, 1, 1`: return NpcType.Hildeblue;\r\n case `${0x040}, 1, 2`: return NpcType.Hildeblue2;\r\n case `${0x041}, 0, 1`: return NpcType.RagRappy;\r\n case `${0x041}, 0, 2`: return NpcType.RagRappy2;\r\n case `${0x041}, 0, 4`: return NpcType.SandRappy;\r\n case `${0x041}, 1, 1`: return NpcType.AlRappy;\r\n case `${0x041}, 1, 2`: return NpcType.LoveRappy;\r\n case `${0x041}, 1, 4`: return NpcType.DelRappy;\r\n\r\n case `${0x061}, 0, 1`: return areaId > 15 ? NpcType.DelLily : NpcType.PoisonLily;\r\n case `${0x061}, 0, 2`: return areaId > 15 ? NpcType.DelLily : NpcType.PoisonLily2;\r\n case `${0x061}, 1, 1`: return areaId > 15 ? NpcType.DelLily : NpcType.NarLily;\r\n case `${0x061}, 1, 2`: return areaId > 15 ? NpcType.DelLily : NpcType.NarLily2;\r\n\r\n case `${0x080}, 0, 1`: return NpcType.Dubchic;\r\n case `${0x080}, 0, 2`: return NpcType.Dubchic2;\r\n case `${0x080}, 1, 1`: return NpcType.Gilchic;\r\n case `${0x080}, 1, 2`: return NpcType.Gilchic2;\r\n\r\n case `${0x0D4}, 0, 2`: return NpcType.SinowBerill;\r\n case `${0x0D4}, 1, 2`: return NpcType.SinowSpigell;\r\n case `${0x0D5}, 0, 2`: return NpcType.Merillia;\r\n case `${0x0D5}, 1, 2`: return NpcType.Meriltas;\r\n case `${0x0D7}, 0, 2`: return NpcType.UlGibbon;\r\n case `${0x0D7}, 1, 2`: return NpcType.ZolGibbon;\r\n\r\n case `${0x0DD}, 0, 2`: return NpcType.Dolmolm;\r\n case `${0x0DD}, 1, 2`: return NpcType.Dolmdarl;\r\n case `${0x0E0}, 0, 2`: return areaId > 15 ? NpcType.Epsilon : NpcType.SinowZoa;\r\n case `${0x0E0}, 1, 2`: return areaId > 15 ? NpcType.Epsilon : NpcType.SinowZele;\r\n\r\n case `${0x112}, 0, 4`: return NpcType.MerissaA;\r\n case `${0x112}, 1, 4`: return NpcType.MerissaAA;\r\n case `${0x114}, 0, 4`: return NpcType.Zu;\r\n case `${0x114}, 1, 4`: return NpcType.Pazuzu;\r\n case `${0x116}, 0, 4`: return NpcType.Dorphon;\r\n case `${0x116}, 1, 4`: return NpcType.DorphonEclair;\r\n case `${0x119}, 0, 4`: return regular ? NpcType.SaintMilion : NpcType.Kondrieu;\r\n case `${0x119}, 1, 4`: return regular ? NpcType.Shambertin : NpcType.Kondrieu;\r\n }\r\n\r\n switch (`${typeId}, ${episode}`) {\r\n case `${0x042}, 1`: return NpcType.Monest;\r\n case `${0x042}, 2`: return NpcType.Monest2;\r\n case `${0x043}, 1`: return regular ? NpcType.SavageWolf : NpcType.BarbarousWolf;\r\n case `${0x043}, 2`: return regular ? NpcType.SavageWolf2 : NpcType.BarbarousWolf2;\r\n\r\n case `${0x060}, 1`: return NpcType.GrassAssassin;\r\n case `${0x060}, 2`: return NpcType.GrassAssassin2;\r\n case `${0x062}, 1`: return NpcType.NanoDragon;\r\n case `${0x064}, 1`: return regular ? NpcType.PofuillySlime : NpcType.PouillySlime;\r\n case `${0x065}, 1`: return NpcType.PanArms;\r\n case `${0x065}, 2`: return NpcType.PanArms2;\r\n\r\n case `${0x081}, 1`: return NpcType.Garanz;\r\n case `${0x081}, 2`: return NpcType.Garanz2;\r\n case `${0x082}, 1`: return regular ? NpcType.SinowBeat : NpcType.SinowGold;\r\n case `${0x083}, 1`: return NpcType.Canadine;\r\n case `${0x084}, 1`: return NpcType.Canane;\r\n case `${0x085}, 1`: return NpcType.Dubswitch;\r\n case `${0x085}, 2`: return NpcType.Dubswitch2;\r\n\r\n case `${0x0A0}, 1`: return NpcType.Delsaber;\r\n case `${0x0A0}, 2`: return NpcType.Delsaber2;\r\n case `${0x0A1}, 1`: return NpcType.ChaosSorcerer;\r\n case `${0x0A1}, 2`: return NpcType.ChaosSorcerer2;\r\n case `${0x0A2}, 1`: return NpcType.DarkGunner;\r\n case `${0x0A4}, 1`: return NpcType.ChaosBringer;\r\n case `${0x0A5}, 1`: return NpcType.DarkBelra;\r\n case `${0x0A5}, 2`: return NpcType.DarkBelra2;\r\n case `${0x0A7}, 1`: return NpcType.Bulclaw;\r\n case `${0x0A8}, 1`: return NpcType.Claw;\r\n\r\n case `${0x0C0}, 1`: return NpcType.Dragon;\r\n case `${0x0C0}, 2`: return NpcType.GalGryphon;\r\n case `${0x0C1}, 1`: return NpcType.DeRolLe;\r\n // TODO:\r\n // case `${0x0C2}, 1`: return NpcType.VolOptPart1;\r\n case `${0x0C5}, 1`: return NpcType.VolOpt;\r\n case `${0x0C8}, 1`: return NpcType.DarkFalz;\r\n case `${0x0CA}, 2`: return NpcType.OlgaFlow;\r\n case `${0x0CB}, 2`: return NpcType.BarbaRay;\r\n case `${0x0CC}, 2`: return NpcType.GolDragon;\r\n\r\n case `${0x0D8}, 2`: return NpcType.Gibbles;\r\n case `${0x0D9}, 2`: return NpcType.Gee;\r\n case `${0x0DA}, 2`: return NpcType.GiGue;\r\n\r\n case `${0x0DB}, 2`: return NpcType.Deldepth;\r\n case `${0x0DC}, 2`: return NpcType.Delbiter;\r\n case `${0x0DE}, 2`: return NpcType.Morfos;\r\n case `${0x0DF}, 2`: return NpcType.Recobox;\r\n case `${0x0E1}, 2`: return NpcType.IllGill;\r\n\r\n case `${0x110}, 4`: return NpcType.Astark;\r\n case `${0x111}, 4`: return regular ? NpcType.SatelliteLizard : NpcType.Yowie;\r\n case `${0x113}, 4`: return NpcType.Girtablulu;\r\n }\r\n\r\n switch (typeId) {\r\n case 0x004: return NpcType.FemaleFat;\r\n case 0x005: return NpcType.FemaleMacho;\r\n case 0x007: return NpcType.FemaleTall;\r\n case 0x00A: return NpcType.MaleDwarf;\r\n case 0x00B: return NpcType.MaleFat;\r\n case 0x00C: return NpcType.MaleMacho;\r\n case 0x00D: return NpcType.MaleOld;\r\n case 0x019: return NpcType.BlueSoldier;\r\n case 0x01A: return NpcType.RedSoldier;\r\n case 0x01B: return NpcType.Principal;\r\n case 0x01C: return NpcType.Tekker;\r\n case 0x01D: return NpcType.GuildLady;\r\n case 0x01E: return NpcType.Scientist;\r\n case 0x01F: return NpcType.Nurse;\r\n case 0x020: return NpcType.Irene;\r\n case 0x0F1: return NpcType.ItemShop;\r\n case 0x0FE: return NpcType.Nurse2;\r\n }\r\n\r\n return NpcType.Unknown;\r\n}\r\n\r\nfunction objectsToDatData(objects: QuestObject[]): DatObject[] {\r\n return objects.map(object => ({\r\n typeId: object.type.psoId!,\r\n sectionId: object.sectionId,\r\n position: object.sectionPosition,\r\n rotation: object.rotation,\r\n areaId: object.areaId,\r\n unknown: object.dat.unknown\r\n }));\r\n}\r\n\r\nfunction npcsToDatData(npcs: QuestNpc[]): DatNpc[] {\r\n return npcs.map(npc => {\r\n // If the type is unknown, typeData will be null and we use the raw data from the DAT file.\r\n const typeData = npcTypeToDatData(npc.type);\r\n\r\n if (typeData) {\r\n npc.dat.unknown[2][18] = (npc.dat.unknown[2][18] & ~0x80) | (typeData.regular ? 0 : 0x80);\r\n }\r\n\r\n return {\r\n typeId: typeData ? typeData.typeId : npc.dat.typeId,\r\n sectionId: npc.sectionId,\r\n position: npc.sectionPosition,\r\n rotation: npc.rotation,\r\n skin: typeData ? typeData.skin : npc.dat.skin,\r\n areaId: npc.areaId,\r\n unknown: npc.dat.unknown\r\n };\r\n });\r\n}\r\n\r\nfunction npcTypeToDatData(\r\n type: NpcType\r\n): { typeId: number, skin: number, regular: boolean } | null {\r\n switch (type) {\r\n default: throw new Error(`Unexpected type ${type.code}.`);\r\n\r\n case NpcType.Unknown: return null;\r\n\r\n case NpcType.FemaleFat: return { typeId: 0x004, skin: 0, regular: true };\r\n case NpcType.FemaleMacho: return { typeId: 0x005, skin: 0, regular: true };\r\n case NpcType.FemaleTall: return { typeId: 0x007, skin: 0, regular: true };\r\n case NpcType.MaleDwarf: return { typeId: 0x00A, skin: 0, regular: true };\r\n case NpcType.MaleFat: return { typeId: 0x00B, skin: 0, regular: true };\r\n case NpcType.MaleMacho: return { typeId: 0x00C, skin: 0, regular: true };\r\n case NpcType.MaleOld: return { typeId: 0x00D, skin: 0, regular: true };\r\n case NpcType.BlueSoldier: return { typeId: 0x019, skin: 0, regular: true };\r\n case NpcType.RedSoldier: return { typeId: 0x01A, skin: 0, regular: true };\r\n case NpcType.Principal: return { typeId: 0x01B, skin: 0, regular: true };\r\n case NpcType.Tekker: return { typeId: 0x01C, skin: 0, regular: true };\r\n case NpcType.GuildLady: return { typeId: 0x01D, skin: 0, regular: true };\r\n case NpcType.Scientist: return { typeId: 0x01E, skin: 0, regular: true };\r\n case NpcType.Nurse: return { typeId: 0x01F, skin: 0, regular: true };\r\n case NpcType.Irene: return { typeId: 0x020, skin: 0, regular: true };\r\n case NpcType.ItemShop: return { typeId: 0x0F1, skin: 0, regular: true };\r\n case NpcType.Nurse2: return { typeId: 0x0FE, skin: 0, regular: true };\r\n\r\n case NpcType.Hildebear: return { typeId: 0x040, skin: 0, regular: true };\r\n case NpcType.Hildeblue: return { typeId: 0x040, skin: 1, regular: true };\r\n case NpcType.RagRappy: return { typeId: 0x041, skin: 0, regular: true };\r\n case NpcType.AlRappy: return { typeId: 0x041, skin: 1, regular: true };\r\n case NpcType.Monest: return { typeId: 0x042, skin: 0, regular: true };\r\n case NpcType.SavageWolf: return { typeId: 0x043, skin: 0, regular: true };\r\n case NpcType.BarbarousWolf: return { typeId: 0x043, skin: 0, regular: false };\r\n case NpcType.Booma: return { typeId: 0x044, skin: 0, regular: true };\r\n case NpcType.Gobooma: return { typeId: 0x044, skin: 1, regular: true };\r\n case NpcType.Gigobooma: return { typeId: 0x044, skin: 2, regular: true };\r\n case NpcType.Dragon: return { typeId: 0x0C0, skin: 0, regular: true };\r\n\r\n case NpcType.GrassAssassin: return { typeId: 0x060, skin: 0, regular: true };\r\n case NpcType.PoisonLily: return { typeId: 0x061, skin: 0, regular: true };\r\n case NpcType.NarLily: return { typeId: 0x061, skin: 1, regular: true };\r\n case NpcType.NanoDragon: return { typeId: 0x062, skin: 0, regular: true };\r\n case NpcType.EvilShark: return { typeId: 0x063, skin: 0, regular: true };\r\n case NpcType.PalShark: return { typeId: 0x063, skin: 1, regular: true };\r\n case NpcType.GuilShark: return { typeId: 0x063, skin: 2, regular: true };\r\n case NpcType.PofuillySlime: return { typeId: 0x064, skin: 0, regular: true };\r\n case NpcType.PouillySlime: return { typeId: 0x064, skin: 0, regular: false };\r\n case NpcType.PanArms: return { typeId: 0x065, skin: 0, regular: true };\r\n case NpcType.DeRolLe: return { typeId: 0x0C1, skin: 0, regular: true };\r\n\r\n case NpcType.Dubchic: return { typeId: 0x080, skin: 0, regular: true };\r\n case NpcType.Gilchic: return { typeId: 0x080, skin: 1, regular: true };\r\n case NpcType.Garanz: return { typeId: 0x081, skin: 0, regular: true };\r\n case NpcType.SinowBeat: return { typeId: 0x082, skin: 0, regular: true };\r\n case NpcType.SinowGold: return { typeId: 0x082, skin: 0, regular: false };\r\n case NpcType.Canadine: return { typeId: 0x083, skin: 0, regular: true };\r\n case NpcType.Canane: return { typeId: 0x084, skin: 0, regular: true };\r\n case NpcType.Dubswitch: return { typeId: 0x085, skin: 0, regular: true };\r\n case NpcType.VolOpt: return { typeId: 0x0C5, skin: 0, regular: true };\r\n\r\n case NpcType.Delsaber: return { typeId: 0x0A0, skin: 0, regular: true };\r\n case NpcType.ChaosSorcerer: return { typeId: 0x0A1, skin: 0, regular: true };\r\n case NpcType.DarkGunner: return { typeId: 0x0A2, skin: 0, regular: true };\r\n case NpcType.ChaosBringer: return { typeId: 0x0A4, skin: 0, regular: true };\r\n case NpcType.DarkBelra: return { typeId: 0x0A5, skin: 0, regular: true };\r\n case NpcType.Dimenian: return { typeId: 0x0A6, skin: 0, regular: true };\r\n case NpcType.LaDimenian: return { typeId: 0x0A6, skin: 1, regular: true };\r\n case NpcType.SoDimenian: return { typeId: 0x0A6, skin: 2, regular: true };\r\n case NpcType.Bulclaw: return { typeId: 0x0A7, skin: 0, regular: true };\r\n case NpcType.Claw: return { typeId: 0x0A8, skin: 0, regular: true };\r\n case NpcType.DarkFalz: return { typeId: 0x0C8, skin: 0, regular: true };\r\n\r\n case NpcType.Hildebear2: return { typeId: 0x040, skin: 0, regular: true };\r\n case NpcType.Hildeblue2: return { typeId: 0x040, skin: 1, regular: true };\r\n case NpcType.RagRappy2: return { typeId: 0x041, skin: 0, regular: true };\r\n case NpcType.LoveRappy: return { typeId: 0x041, skin: 1, regular: true };\r\n case NpcType.Monest2: return { typeId: 0x042, skin: 0, regular: true };\r\n case NpcType.PoisonLily2: return { typeId: 0x061, skin: 0, regular: true };\r\n case NpcType.NarLily2: return { typeId: 0x061, skin: 1, regular: true };\r\n case NpcType.GrassAssassin2: return { typeId: 0x060, skin: 0, regular: true };\r\n case NpcType.Dimenian2: return { typeId: 0x0A6, skin: 0, regular: true };\r\n case NpcType.LaDimenian2: return { typeId: 0x0A6, skin: 1, regular: true };\r\n case NpcType.SoDimenian2: return { typeId: 0x0A6, skin: 2, regular: true };\r\n case NpcType.DarkBelra2: return { typeId: 0x0A5, skin: 0, regular: true };\r\n case NpcType.BarbaRay: return { typeId: 0x0CB, skin: 0, regular: true };\r\n\r\n case NpcType.SavageWolf2: return { typeId: 0x043, skin: 0, regular: true };\r\n case NpcType.BarbarousWolf2: return { typeId: 0x043, skin: 0, regular: false };\r\n case NpcType.PanArms2: return { typeId: 0x065, skin: 0, regular: true };\r\n case NpcType.Dubchic2: return { typeId: 0x080, skin: 0, regular: true };\r\n case NpcType.Gilchic2: return { typeId: 0x080, skin: 1, regular: true };\r\n case NpcType.Garanz2: return { typeId: 0x081, skin: 0, regular: true };\r\n case NpcType.Dubswitch2: return { typeId: 0x085, skin: 0, regular: true };\r\n case NpcType.Delsaber2: return { typeId: 0x0A0, skin: 0, regular: true };\r\n case NpcType.ChaosSorcerer2: return { typeId: 0x0A1, skin: 0, regular: true };\r\n case NpcType.GolDragon: return { typeId: 0x0CC, skin: 0, regular: true };\r\n\r\n case NpcType.SinowBerill: return { typeId: 0x0D4, skin: 0, regular: true };\r\n case NpcType.SinowSpigell: return { typeId: 0x0D4, skin: 1, regular: true };\r\n case NpcType.Merillia: return { typeId: 0x0D5, skin: 0, regular: true };\r\n case NpcType.Meriltas: return { typeId: 0x0D5, skin: 1, regular: true };\r\n case NpcType.Mericarol: return { typeId: 0x0D6, skin: 0, regular: true };\r\n case NpcType.Mericus: return { typeId: 0x0D6, skin: 1, regular: true };\r\n case NpcType.Merikle: return { typeId: 0x0D6, skin: 2, regular: true };\r\n case NpcType.UlGibbon: return { typeId: 0x0D7, skin: 0, regular: true };\r\n case NpcType.ZolGibbon: return { typeId: 0x0D7, skin: 1, regular: true };\r\n case NpcType.Gibbles: return { typeId: 0x0D8, skin: 0, regular: true };\r\n case NpcType.Gee: return { typeId: 0x0D9, skin: 0, regular: true };\r\n case NpcType.GiGue: return { typeId: 0x0DA, skin: 0, regular: true };\r\n case NpcType.GalGryphon: return { typeId: 0x0C0, skin: 0, regular: true };\r\n\r\n case NpcType.Deldepth: return { typeId: 0x0DB, skin: 0, regular: true };\r\n case NpcType.Delbiter: return { typeId: 0x0DC, skin: 0, regular: true };\r\n case NpcType.Dolmolm: return { typeId: 0x0DD, skin: 0, regular: true };\r\n case NpcType.Dolmdarl: return { typeId: 0x0DD, skin: 1, regular: true };\r\n case NpcType.Morfos: return { typeId: 0x0DE, skin: 0, regular: true };\r\n case NpcType.Recobox: return { typeId: 0x0DF, skin: 0, regular: true };\r\n case NpcType.Epsilon: return { typeId: 0x0E0, skin: 0, regular: true };\r\n case NpcType.SinowZoa: return { typeId: 0x0E0, skin: 0, regular: true };\r\n case NpcType.SinowZele: return { typeId: 0x0E0, skin: 1, regular: true };\r\n case NpcType.IllGill: return { typeId: 0x0E1, skin: 0, regular: true };\r\n case NpcType.DelLily: return { typeId: 0x061, skin: 0, regular: true };\r\n case NpcType.OlgaFlow: return { typeId: 0x0CA, skin: 0, regular: true };\r\n\r\n case NpcType.SandRappy: return { typeId: 0x041, skin: 0, regular: true };\r\n case NpcType.DelRappy: return { typeId: 0x041, skin: 1, regular: true };\r\n case NpcType.Astark: return { typeId: 0x110, skin: 0, regular: true };\r\n case NpcType.SatelliteLizard: return { typeId: 0x111, skin: 0, regular: true };\r\n case NpcType.Yowie: return { typeId: 0x111, skin: 0, regular: false };\r\n case NpcType.MerissaA: return { typeId: 0x112, skin: 0, regular: true };\r\n case NpcType.MerissaAA: return { typeId: 0x112, skin: 1, regular: true };\r\n case NpcType.Girtablulu: return { typeId: 0x113, skin: 0, regular: true };\r\n case NpcType.Zu: return { typeId: 0x114, skin: 0, regular: true };\r\n case NpcType.Pazuzu: return { typeId: 0x114, skin: 1, regular: true };\r\n case NpcType.Boota: return { typeId: 0x115, skin: 0, regular: true };\r\n case NpcType.ZeBoota: return { typeId: 0x115, skin: 1, regular: true };\r\n case NpcType.BaBoota: return { typeId: 0x115, skin: 2, regular: true };\r\n case NpcType.Dorphon: return { typeId: 0x116, skin: 0, regular: true };\r\n case NpcType.DorphonEclair: return { typeId: 0x116, skin: 1, regular: true };\r\n case NpcType.Goran: return { typeId: 0x117, skin: 0, regular: true };\r\n case NpcType.PyroGoran: return { typeId: 0x117, skin: 1, regular: true };\r\n case NpcType.GoranDetonator: return { typeId: 0x117, skin: 2, regular: true };\r\n case NpcType.SaintMilion: return { typeId: 0x119, skin: 0, regular: true };\r\n case NpcType.Shambertin: return { typeId: 0x119, skin: 1, regular: true };\r\n case NpcType.Kondrieu: return { typeId: 0x119, skin: 0, regular: false };\r\n }\r\n}\r\n","import { autorun } from 'mobx';\r\nimport { BufferGeometry, DoubleSide, Mesh, MeshLambertMaterial } from 'three';\r\nimport { QuestNpc, QuestObject, QuestEntity } from '../domain';\r\n\r\nexport const OBJECT_COLOR = 0xFFFF00;\r\nexport const OBJECT_HOVER_COLOR = 0xFFDF3F;\r\nexport const OBJECT_SELECTED_COLOR = 0xFFAA00;\r\nexport const NPC_COLOR = 0xFF0000;\r\nexport const NPC_HOVER_COLOR = 0xFF3F5F;\r\nexport const NPC_SELECTED_COLOR = 0xFF0054;\r\n\r\nexport function createObjectMesh(object: QuestObject, geometry: BufferGeometry): Mesh {\r\n return createMesh(object, geometry, OBJECT_COLOR, 'Object');\r\n}\r\n\r\nexport function createNpcMesh(npc: QuestNpc, geometry: BufferGeometry): Mesh {\r\n return createMesh(npc, geometry, NPC_COLOR, 'NPC');\r\n}\r\n\r\nfunction createMesh(\r\n entity: QuestEntity,\r\n geometry: BufferGeometry,\r\n color: number,\r\n type: string\r\n): Mesh {\r\n const object3d = new Mesh(\r\n geometry,\r\n new MeshLambertMaterial({\r\n color,\r\n side: DoubleSide\r\n })\r\n );\r\n object3d.name = type;\r\n object3d.userData.entity = entity;\r\n\r\n // TODO: dispose autorun?\r\n autorun(() => {\r\n const { x, y, z } = entity.position;\r\n object3d.position.set(x, y, z);\r\n const rot = entity.rotation;\r\n object3d.rotation.set(rot.x, rot.y, rot.z);\r\n });\r\n\r\n return object3d;\r\n}\r\n","import { BufferGeometry, DoubleSide, Mesh, MeshLambertMaterial } from 'three';\r\n\r\nexport function createModelMesh(geometry?: BufferGeometry): Mesh | undefined {\r\n return geometry && new Mesh(\r\n geometry,\r\n new MeshLambertMaterial({\r\n color: 0xFF00FF,\r\n side: DoubleSide\r\n })\r\n );\r\n}\r\n","import { observable, action } from 'mobx';\r\nimport { Object3D } from 'three';\r\nimport { ArrayBufferCursor } from '../bin-data/ArrayBufferCursor';\r\nimport { getAreaSections } from '../bin-data/loading/areas';\r\nimport { getNpcGeometry, getObjectGeometry } from '../bin-data/loading/entities';\r\nimport { parseNj, parseXj } from '../bin-data/parsing/ninja';\r\nimport { parseQuest, writeQuestQst } from '../bin-data/parsing/quest';\r\nimport { Area, Quest, QuestEntity, Section, Vec3 } from '../domain';\r\nimport { createNpcMesh, createObjectMesh } from '../rendering/entities';\r\nimport { createModelMesh } from '../rendering/models';\r\n\r\nclass QuestEditorStore {\r\n @observable currentModel?: Object3D;\r\n @observable currentQuest?: Quest;\r\n @observable currentArea?: Area;\r\n @observable selectedEntity?: QuestEntity;\r\n\r\n setModel = action('setModel', (model?: Object3D) => {\r\n this.resetModelAndQuestState();\r\n this.currentModel = model;\r\n })\r\n\r\n setQuest = action('setQuest', (quest?: Quest) => {\r\n this.resetModelAndQuestState();\r\n this.currentQuest = quest;\r\n\r\n if (quest && quest.areaVariants.length) {\r\n this.currentArea = quest.areaVariants[0].area;\r\n }\r\n })\r\n\r\n private resetModelAndQuestState() {\r\n this.currentQuest = undefined;\r\n this.currentArea = undefined;\r\n this.selectedEntity = undefined;\r\n this.currentModel = undefined;\r\n }\r\n\r\n setSelectedEntity = (entity?: QuestEntity) => {\r\n this.selectedEntity = entity;\r\n }\r\n\r\n setCurrentAreaId = action('setCurrentAreaId', (areaId?: number) => {\r\n this.selectedEntity = undefined;\r\n\r\n if (areaId == null) {\r\n this.currentArea = undefined;\r\n } else if (this.currentQuest) {\r\n const areaVariant = this.currentQuest.areaVariants.find(\r\n variant => variant.area.id === areaId\r\n );\r\n this.currentArea = areaVariant && areaVariant.area;\r\n }\r\n })\r\n\r\n loadFile = (file: File) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', () => { this.loadend(file, reader) });\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n // TODO: notify user of problems.\r\n private loadend = async (file: File, reader: FileReader) => {\r\n if (!(reader.result instanceof ArrayBuffer)) {\r\n console.error('Couldn\\'t read file.');\r\n return;\r\n }\r\n\r\n if (file.name.endsWith('.nj')) {\r\n this.setModel(createModelMesh(parseNj(new ArrayBufferCursor(reader.result, true))));\r\n } else if (file.name.endsWith('.xj')) {\r\n this.setModel(createModelMesh(parseXj(new ArrayBufferCursor(reader.result, true))));\r\n } else {\r\n const quest = parseQuest(new ArrayBufferCursor(reader.result, true));\r\n this.setQuest(quest);\r\n\r\n if (quest) {\r\n // Load section data.\r\n for (const variant of quest.areaVariants) {\r\n const sections = await getAreaSections(quest.episode, variant.area.id, variant.id);\r\n variant.sections = sections;\r\n\r\n // Generate object geometry.\r\n for (const object of quest.objects.filter(o => o.areaId === variant.area.id)) {\r\n try {\r\n const geometry = await getObjectGeometry(object.type);\r\n this.setSectionOnVisibleQuestEntity(object, sections);\r\n object.object3d = createObjectMesh(object, geometry);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n // Generate NPC geometry.\r\n for (const npc of quest.npcs.filter(npc => npc.areaId === variant.area.id)) {\r\n try {\r\n const geometry = await getNpcGeometry(npc.type);\r\n this.setSectionOnVisibleQuestEntity(npc, sections);\r\n npc.object3d = createNpcMesh(npc, geometry);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n } else {\r\n console.error('Couldn\\'t parse quest file.');\r\n }\r\n }\r\n }\r\n\r\n private setSectionOnVisibleQuestEntity = async (entity: QuestEntity, sections: Section[]) => {\r\n let { x, y, z } = entity.position;\r\n\r\n const section = sections.find(s => s.id === entity.sectionId);\r\n entity.section = section;\r\n\r\n if (section) {\r\n const { x: secX, y: secY, z: secZ } = section.position;\r\n const rotX = section.cosYAxisRotation * x + section.sinYAxisRotation * z;\r\n const rotZ = -section.sinYAxisRotation * x + section.cosYAxisRotation * z;\r\n x = rotX + secX;\r\n y += secY;\r\n z = rotZ + secZ;\r\n } else {\r\n console.warn(`Section ${entity.sectionId} not found.`);\r\n }\r\n\r\n entity.position = new Vec3(x, y, z);\r\n }\r\n\r\n saveCurrentQuestToFile = (fileName: string) => {\r\n if (this.currentQuest) {\r\n const cursor = writeQuestQst(this.currentQuest, fileName);\r\n\r\n if (!fileName.endsWith('.qst')) {\r\n fileName += '.qst';\r\n }\r\n\r\n const a = document.createElement('a');\r\n a.href = URL.createObjectURL(new Blob([cursor.buffer]));\r\n a.download = fileName;\r\n document.body.appendChild(a);\r\n a.click();\r\n URL.revokeObjectURL(a.href);\r\n document.body.removeChild(a);\r\n }\r\n }\r\n}\r\n\r\nexport const questEditorStore = new QuestEditorStore();\r\n","import { InputNumber } from 'antd';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { QuestNpc, QuestObject, QuestEntity } from '../../domain';\r\nimport './EntityInfoComponent.css';\r\n\r\ninterface Props {\r\n entity?: QuestEntity;\r\n}\r\n\r\n@observer\r\nexport class EntityInfoComponent extends React.Component<Props> {\r\n render() {\r\n const entity = this.props.entity;\r\n\r\n if (entity) {\r\n const sectionId = entity.section ? entity.section.id : entity.sectionId;\r\n let name = null;\r\n\r\n if (entity instanceof QuestObject) {\r\n name = (\r\n <tr>\r\n <td>Object: </td><td colSpan={2}>{entity.type.name}</td>\r\n </tr>\r\n );\r\n } else if (entity instanceof QuestNpc) {\r\n name = (\r\n <tr>\r\n <td>NPC: </td><td>{entity.type.name}</td>\r\n </tr>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"EntityInfoComponent-container\">\r\n <table className=\"EntityInfoComponent-table\">\r\n <tbody>\r\n {name}\r\n <tr>\r\n <td>Section: </td><td>{sectionId}</td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>World position: </td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <table>\r\n <tbody>\r\n <CoordRow entity={entity} positionType=\"position\" coord=\"x\" />\r\n <CoordRow entity={entity} positionType=\"position\" coord=\"y\" />\r\n <CoordRow entity={entity} positionType=\"position\" coord=\"z\" />\r\n </tbody>\r\n </table>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>Section position: </td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <table>\r\n <tbody>\r\n <CoordRow entity={entity} positionType=\"sectionPosition\" coord=\"x\" />\r\n <CoordRow entity={entity} positionType=\"sectionPosition\" coord=\"y\" />\r\n <CoordRow entity={entity} positionType=\"sectionPosition\" coord=\"z\" />\r\n </tbody>\r\n </table>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n } else {\r\n return <div className=\"EntityInfoComponent-container\" />;\r\n }\r\n }\r\n}\r\n\r\n@observer\r\nclass CoordRow extends React.Component<{\r\n entity: QuestEntity,\r\n positionType: 'position' | 'sectionPosition',\r\n coord: 'x' | 'y' | 'z'\r\n}> {\r\n render() {\r\n const entity = this.props.entity;\r\n const value = entity[this.props.positionType][this.props.coord];\r\n return (\r\n <tr>\r\n <td>{this.props.coord.toUpperCase()}: </td>\r\n <td>\r\n <InputNumber\r\n value={value}\r\n size=\"small\"\r\n precision={3}\r\n className=\"EntityInfoComponent-coord\"\r\n onChange={this.changed}\r\n />\r\n </td>\r\n </tr>\r\n );\r\n }\r\n\r\n private changed = (value?: number) => {\r\n if (value != null) {\r\n const entity = this.props.entity;\r\n const posType = this.props.positionType;\r\n const pos = entity[posType].clone();\r\n pos[this.props.coord] = value;\r\n entity[posType] = pos;\r\n }\r\n }\r\n}\r\n","import React from 'react';\r\nimport { NpcType, Quest } from '../../domain';\r\nimport './QuestInfoComponent.css';\r\n\r\nexport function QuestInfoComponent({ quest }: { quest?: Quest }) {\r\n if (quest) {\r\n const episode = quest.episode === 4 ? 'IV' : (quest.episode === 2 ? 'II' : 'I');\r\n const npcCounts = new Map<NpcType, number>();\r\n\r\n for (const npc of quest.npcs) {\r\n const val = npcCounts.get(npc.type) || 0;\r\n npcCounts.set(npc.type, val + 1);\r\n }\r\n\r\n const extraCanadines = (npcCounts.get(NpcType.Canane) || 0) * 8;\r\n\r\n // Sort by type ID.\r\n const sortedNpcCounts = [...npcCounts].sort((a, b) => a[0].id - b[0].id);\r\n\r\n const npcCountRows = sortedNpcCounts.map(([npcType, count]) => {\r\n const extra = npcType === NpcType.Canadine ? extraCanadines : 0;\r\n return (\r\n <tr key={npcType.id}>\r\n <td>{npcType.name}:</td>\r\n <td>{count + extra}</td>\r\n </tr>\r\n );\r\n });\r\n\r\n return (\r\n <div className=\"qe-QuestInfoComponent\">\r\n <table>\r\n <tbody>\r\n <tr>\r\n <th>Name:</th><td>{quest.name}</td>\r\n </tr>\r\n <tr>\r\n <th>Episode:</th><td>{episode}</td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <pre>{quest.shortDescription}</pre>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <pre>{quest.longDescription}</pre>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div className=\"qe-QuestInfoComponent-npc-counts-container\">\r\n <table >\r\n <thead>\r\n <tr><th colSpan={2}>NPC Counts</th></tr>\r\n </thead>\r\n <tbody>\r\n {npcCountRows}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n } else {\r\n return <div className=\"qe-QuestInfoComponent\" />;\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport { Color, HemisphereLight, Intersection, Mesh, MeshLambertMaterial, MOUSE, Object3D, PerspectiveCamera, Plane, Raycaster, Scene, Vector2, Vector3, WebGLRenderer } from 'three';\r\nimport OrbitControlsCreator from 'three-orbit-controls';\r\nimport { getAreaCollisionGeometry, getAreaRenderGeometry } from '../bin-data/loading/areas';\r\nimport { Area, Quest, QuestEntity, QuestNpc, QuestObject, Section, Vec3 } from '../domain';\r\nimport { questEditorStore } from '../stores/QuestEditorStore';\r\nimport { NPC_COLOR, NPC_HOVER_COLOR, NPC_SELECTED_COLOR, OBJECT_COLOR, OBJECT_HOVER_COLOR, OBJECT_SELECTED_COLOR } from './entities';\r\n\r\nconst OrbitControls = OrbitControlsCreator(THREE);\r\n\r\ninterface PickEntityResult {\r\n object: Mesh;\r\n entity: QuestEntity;\r\n grabOffset: Vector3;\r\n dragAdjust: Vector3;\r\n dragY: number;\r\n manipulating: boolean;\r\n}\r\n\r\nlet renderer: Renderer | undefined;\r\n\r\nexport function getRenderer(): Renderer {\r\n if (!renderer) {\r\n renderer = new Renderer();\r\n }\r\n\r\n return renderer;\r\n}\r\n\r\n/**\r\n * Renders a quest area or an NJ/XJ model.\r\n */\r\nexport class Renderer {\r\n private renderer = new WebGLRenderer({ antialias: true });\r\n private camera: PerspectiveCamera;\r\n private controls: any;\r\n private raycaster = new Raycaster();\r\n private scene = new Scene();\r\n private quest?: Quest;\r\n private questEntitiesLoaded = false;\r\n private area?: Area;\r\n private objs: Map<number, QuestObject[]> = new Map(); // Objs grouped by area id\r\n private npcs: Map<number, QuestNpc[]> = new Map(); // Npcs grouped by area id\r\n private collisionGeometry = new Object3D();\r\n private renderGeometry = new Object3D();\r\n private objGeometry = new Object3D();\r\n private npcGeometry = new Object3D();\r\n private hoveredData?: PickEntityResult;\r\n private selectedData?: PickEntityResult;\r\n private model?: Object3D;\r\n\r\n constructor() {\r\n this.renderer.domElement.addEventListener(\r\n 'mousedown', this.onMouseDown);\r\n this.renderer.domElement.addEventListener(\r\n 'mouseup', this.onMouseUp);\r\n this.renderer.domElement.addEventListener(\r\n 'mousemove', this.onMouseMove);\r\n\r\n this.camera = new PerspectiveCamera(75, 1, 0.1, 5000);\r\n this.controls = new OrbitControls(\r\n this.camera, this.renderer.domElement);\r\n this.controls.mouseButtons.ORBIT = MOUSE.RIGHT;\r\n this.controls.mouseButtons.PAN = MOUSE.LEFT;\r\n\r\n this.scene.background = new Color(0x151C21);\r\n this.scene.add(new HemisphereLight(0xffffff, 0x505050, 1));\r\n this.scene.add(this.objGeometry);\r\n this.scene.add(this.npcGeometry);\r\n\r\n requestAnimationFrame(this.renderLoop);\r\n }\r\n\r\n get domElement(): HTMLElement {\r\n return this.renderer.domElement;\r\n }\r\n\r\n setSize(width: number, height: number) {\r\n this.renderer.setSize(width, height);\r\n this.camera.aspect = width / height;\r\n this.camera.updateProjectionMatrix();\r\n }\r\n\r\n setQuestAndArea(quest?: Quest, area?: Area) {\r\n let update = false;\r\n\r\n if (this.area !== area) {\r\n this.area = area;\r\n update = true;\r\n }\r\n\r\n if (this.quest !== quest) {\r\n this.quest = quest;\r\n\r\n this.objs.clear();\r\n this.npcs.clear();\r\n\r\n if (quest) {\r\n for (const obj of quest.objects) {\r\n const array = this.objs.get(obj.areaId) || [];\r\n array.push(obj);\r\n this.objs.set(obj.areaId, array);\r\n }\r\n\r\n for (const npc of quest.npcs) {\r\n const array = this.npcs.get(npc.areaId) || [];\r\n array.push(npc);\r\n this.npcs.set(npc.areaId, array);\r\n }\r\n }\r\n\r\n update = true;\r\n }\r\n\r\n if (update) {\r\n this.updateGeometry();\r\n }\r\n }\r\n\r\n /**\r\n * Renders a generic Object3D.\r\n */\r\n setModel(model?: Object3D) {\r\n if (this.model !== model) {\r\n if (this.model) {\r\n this.scene.remove(this.model);\r\n }\r\n\r\n if (model) {\r\n this.setQuestAndArea(undefined, undefined);\r\n this.scene.add(model);\r\n this.resetCamera();\r\n }\r\n\r\n this.model = model;\r\n }\r\n }\r\n\r\n private updateGeometry() {\r\n this.scene.remove(this.objGeometry);\r\n this.scene.remove(this.npcGeometry);\r\n this.objGeometry = new Object3D();\r\n this.npcGeometry = new Object3D();\r\n this.scene.add(this.objGeometry);\r\n this.scene.add(this.npcGeometry);\r\n this.questEntitiesLoaded = false;\r\n\r\n this.scene.remove(this.collisionGeometry);\r\n\r\n if (this.quest && this.area) {\r\n const episode = this.quest.episode;\r\n const areaId = this.area.id;\r\n const variant = this.quest.areaVariants.find(v => v.area.id === areaId);\r\n const variantId = (variant && variant.id) || 0;\r\n\r\n getAreaCollisionGeometry(episode, areaId, variantId).then(geometry => {\r\n if (this.quest && this.area) {\r\n this.setModel(undefined);\r\n this.scene.remove(this.collisionGeometry);\r\n\r\n this.resetCamera();\r\n\r\n this.collisionGeometry = geometry;\r\n this.scene.add(geometry);\r\n }\r\n });\r\n\r\n getAreaRenderGeometry(episode, areaId, variantId).then(geometry => {\r\n if (this.quest && this.area) {\r\n this.renderGeometry = geometry;\r\n }\r\n });\r\n }\r\n }\r\n\r\n private resetCamera() {\r\n this.controls.reset();\r\n this.camera.position.set(0, 800, 700);\r\n this.camera.lookAt(new Vector3(0, 0, 0));\r\n }\r\n\r\n private renderLoop = () => {\r\n this.controls.update();\r\n this.addLoadedEntities();\r\n this.renderer.render(this.scene, this.camera);\r\n requestAnimationFrame(this.renderLoop);\r\n }\r\n\r\n private addLoadedEntities() {\r\n if (this.quest && this.area && !this.questEntitiesLoaded) {\r\n let loaded = true;\r\n\r\n for (const object of this.quest.objects) {\r\n if (object.areaId === this.area.id) {\r\n if (object.object3d) {\r\n this.objGeometry.add(object.object3d);\r\n } else {\r\n loaded = false;\r\n }\r\n }\r\n }\r\n\r\n for (const npc of this.quest.npcs) {\r\n if (npc.areaId === this.area.id) {\r\n if (npc.object3d) {\r\n this.npcGeometry.add(npc.object3d);\r\n } else {\r\n loaded = false;\r\n }\r\n }\r\n }\r\n\r\n this.questEntitiesLoaded = loaded;\r\n }\r\n }\r\n\r\n private onMouseDown = (e: MouseEvent) => {\r\n const oldSelectedData = this.selectedData;\r\n const data = this.pickEntity(\r\n this.pointerPosToDeviceCoords(e));\r\n\r\n // Did we pick a different object than the previously hovered over 3D object?\r\n if (this.hoveredData && (!data || data.object !== this.hoveredData.object)) {\r\n (this.hoveredData.object.material as MeshLambertMaterial).color.set(\r\n this.getColor(this.hoveredData.entity, 'normal'));\r\n }\r\n\r\n // Did we pick a different object than the previously selected 3D object?\r\n if (this.selectedData && (!data || data.object !== this.selectedData.object)) {\r\n (this.selectedData.object.material as MeshLambertMaterial).color.set(\r\n this.getColor(this.selectedData.entity, 'normal'));\r\n this.selectedData.manipulating = false;\r\n }\r\n\r\n if (data) {\r\n // User selected an entity.\r\n (data.object.material as MeshLambertMaterial).color.set(this.getColor(data.entity, 'selected'));\r\n data.manipulating = true;\r\n this.hoveredData = data;\r\n this.selectedData = data;\r\n this.controls.enabled = false;\r\n } else {\r\n // User clicked on terrain or outside of area.\r\n this.hoveredData = undefined;\r\n this.selectedData = undefined;\r\n this.controls.enabled = true;\r\n }\r\n\r\n const selectionChanged = oldSelectedData && data\r\n ? oldSelectedData.object !== data.object\r\n : oldSelectedData !== data;\r\n\r\n if (selectionChanged) {\r\n questEditorStore.setSelectedEntity(data && data.entity);\r\n }\r\n }\r\n\r\n private onMouseUp = () => {\r\n if (this.selectedData) {\r\n this.selectedData.manipulating = false;\r\n this.controls.enabled = true;\r\n }\r\n }\r\n\r\n private onMouseMove = (e: MouseEvent) => {\r\n const pointerPos = this.pointerPosToDeviceCoords(e);\r\n\r\n if (this.selectedData && this.selectedData.manipulating) {\r\n if (e.buttons === 1) {\r\n // User is dragging a selected entity.\r\n const data = this.selectedData;\r\n\r\n if (e.shiftKey) {\r\n // Vertical movement.\r\n // We intersect with a plane that's oriented toward the camera and that's coplanar with the point where the entity was grabbed.\r\n this.raycaster.setFromCamera(pointerPos, this.camera);\r\n const ray = this.raycaster.ray;\r\n const negativeWorldDir = this.camera.getWorldDirection(new Vector3()).negate();\r\n const plane = new Plane().setFromNormalAndCoplanarPoint(\r\n new Vector3(negativeWorldDir.x, 0, negativeWorldDir.z).normalize(),\r\n data.object.position.sub(data.grabOffset));\r\n const intersectionPoint = new Vector3();\r\n\r\n if (ray.intersectPlane(plane, intersectionPoint)) {\r\n const y = intersectionPoint.y + data.grabOffset.y;\r\n const yDelta = y - data.entity.position.y;\r\n data.dragY += yDelta;\r\n data.dragAdjust.y -= yDelta;\r\n data.entity.position = new Vec3(\r\n data.entity.position.x,\r\n y,\r\n data.entity.position.z\r\n );\r\n }\r\n } else {\r\n // Horizontal movement accross terrain.\r\n // Cast ray adjusted for dragging entities.\r\n const { intersection, section } = this.pickTerrain(pointerPos, data);\r\n\r\n if (intersection) {\r\n data.entity.position = new Vec3(\r\n intersection.point.x,\r\n intersection.point.y + data.dragY,\r\n intersection.point.z\r\n );\r\n data.entity.section = section;\r\n } else {\r\n // If the cursor is not over any terrain, we translate the entity accross the horizontal plane in which the entity's origin lies.\r\n this.raycaster.setFromCamera(pointerPos, this.camera);\r\n const ray = this.raycaster.ray;\r\n // ray.origin.add(data.dragAdjust);\r\n const plane = new Plane(\r\n new Vector3(0, 1, 0),\r\n -data.entity.position.y + data.grabOffset.y);\r\n const intersectionPoint = new Vector3();\r\n\r\n if (ray.intersectPlane(plane, intersectionPoint)) {\r\n data.entity.position = new Vec3(\r\n intersectionPoint.x + data.grabOffset.x,\r\n data.entity.position.y,\r\n intersectionPoint.z + data.grabOffset.z\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // User is hovering.\r\n const oldData = this.hoveredData;\r\n const data = this.pickEntity(pointerPos);\r\n\r\n if (oldData && (!data || data.object !== oldData.object)) {\r\n if (!this.selectedData || oldData.object !== this.selectedData.object) {\r\n (oldData.object.material as MeshLambertMaterial).color.set(\r\n this.getColor(oldData.entity, 'normal'));\r\n }\r\n\r\n this.hoveredData = undefined;\r\n }\r\n\r\n if (data && (!oldData || data.object !== oldData.object)) {\r\n if (!this.selectedData || data.object !== this.selectedData.object) {\r\n (data.object.material as MeshLambertMaterial).color.set(\r\n this.getColor(data.entity, 'hover'));\r\n }\r\n\r\n this.hoveredData = data;\r\n }\r\n }\r\n }\r\n\r\n private pointerPosToDeviceCoords(e: MouseEvent) {\r\n const coords = new Vector2();\r\n this.renderer.getSize(coords);\r\n coords.width = e.offsetX / coords.width * 2 - 1;\r\n coords.height = e.offsetY / coords.height * -2 + 1;\r\n return coords;\r\n }\r\n\r\n /**\r\n * @param pointerPos - pointer coordinates in normalized device space\r\n */\r\n private pickEntity(pointerPos: Vector2): PickEntityResult | undefined {\r\n // Find the nearest object and NPC under the pointer.\r\n this.raycaster.setFromCamera(pointerPos, this.camera);\r\n const [nearestObject] = this.raycaster.intersectObjects(\r\n this.objGeometry.children\r\n );\r\n const [nearestNpc] = this.raycaster.intersectObjects(\r\n this.npcGeometry.children\r\n );\r\n\r\n if (!nearestObject && !nearestNpc) {\r\n return;\r\n }\r\n\r\n const objectDist = nearestObject ? nearestObject.distance : Infinity;\r\n const npcDist = nearestNpc ? nearestNpc.distance : Infinity;\r\n const intersection = objectDist < npcDist ? nearestObject : nearestNpc;\r\n\r\n const entity = intersection.object.userData.entity;\r\n // Vector that points from the grabbing point to the model's origin.\r\n const grabOffset = intersection.object.position\r\n .clone()\r\n .sub(intersection.point);\r\n // Vector that points from the grabbing point to the terrain point directly under the model's origin.\r\n const dragAdjust = grabOffset.clone();\r\n // Distance to terrain.\r\n let dragY = 0;\r\n\r\n // Find vertical distance to terrain.\r\n this.raycaster.set(\r\n intersection.object.position, new Vector3(0, -1, 0)\r\n );\r\n const [terrain] = this.raycaster.intersectObjects(\r\n this.collisionGeometry.children, true\r\n );\r\n\r\n if (terrain) {\r\n dragAdjust.sub(new Vector3(0, terrain.distance, 0));\r\n dragY += terrain.distance;\r\n }\r\n\r\n return {\r\n object: intersection.object as Mesh,\r\n entity,\r\n grabOffset,\r\n dragAdjust,\r\n dragY,\r\n manipulating: false\r\n };\r\n }\r\n\r\n /**\r\n * @param pointerPos - pointer coordinates in normalized device space\r\n */\r\n private pickTerrain(pointerPos: Vector2, data: PickEntityResult): { intersection?: Intersection, section?: Section } {\r\n this.raycaster.setFromCamera(pointerPos, this.camera);\r\n this.raycaster.ray.origin.add(data.dragAdjust);\r\n const terrains = this.raycaster.intersectObjects(\r\n this.collisionGeometry.children, true);\r\n\r\n // Don't allow entities to be placed on very steep terrain.\r\n // E.g. walls.\r\n // TODO: make use of the flags field in the collision data.\r\n for (const terrain of terrains) {\r\n if (terrain.face!.normal.y > 0.75) {\r\n // Find section ID.\r\n this.raycaster.set(\r\n terrain.point.clone().setY(1000), new Vector3(0, -1, 0));\r\n const renderTerrains = this.raycaster\r\n .intersectObjects(this.renderGeometry.children, true)\r\n .filter(rt => rt.object.userData.section.id >= 0);\r\n\r\n return {\r\n intersection: terrain,\r\n section: renderTerrains[0] && renderTerrains[0].object.userData.section\r\n };\r\n }\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private getColor(entity: QuestEntity, type: 'normal' | 'hover' | 'selected') {\r\n const isNpc = entity instanceof QuestNpc;\r\n\r\n switch (type) {\r\n default:\r\n case 'normal': return isNpc ? NPC_COLOR : OBJECT_COLOR;\r\n case 'hover': return isNpc ? NPC_HOVER_COLOR : OBJECT_HOVER_COLOR;\r\n case 'selected': return isNpc ? NPC_SELECTED_COLOR : OBJECT_SELECTED_COLOR;\r\n }\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Object3D } from 'three';\r\nimport { Area, Quest } from '../../domain';\r\nimport { getRenderer } from '../../rendering/Renderer';\r\n\r\ninterface Props {\r\n quest?: Quest;\r\n area?: Area;\r\n model?: Object3D;\r\n}\r\n\r\nexport class RendererComponent extends React.Component<Props> {\r\n private renderer = getRenderer();\r\n\r\n render() {\r\n return <div style={{ overflow: 'hidden' }} ref={this.modifyDom} />;\r\n }\r\n\r\n componentDidMount() {\r\n window.addEventListener('resize', this.onResize);\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener('resize', this.onResize);\r\n }\r\n\r\n componentWillReceiveProps({ quest, area, model }: Props) {\r\n if (model) {\r\n this.renderer.setModel(model);\r\n } else {\r\n this.renderer.setQuestAndArea(quest, area);\r\n }\r\n }\r\n\r\n shouldComponentUpdate() {\r\n return false;\r\n }\r\n\r\n private modifyDom = (div: HTMLDivElement | null) => {\r\n if (div) {\r\n this.renderer.setSize(div.clientWidth, div.clientHeight);\r\n div.appendChild(this.renderer.domElement);\r\n }\r\n }\r\n\r\n private onResize = () => {\r\n const wrapperDiv = this.renderer.domElement.parentNode as HTMLDivElement;\r\n this.renderer.setSize(wrapperDiv.clientWidth, wrapperDiv.clientHeight);\r\n }\r\n}\r\n","import { Button, Form, Icon, Input, Modal, Select, Upload } from \"antd\";\r\nimport { UploadChangeParam } from \"antd/lib/upload\";\r\nimport { UploadFile } from \"antd/lib/upload/interface\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { ChangeEvent } from \"react\";\r\nimport { questEditorStore } from \"../../stores/QuestEditorStore\";\r\nimport { EntityInfoComponent } from \"./EntityInfoComponent\";\r\nimport './QuestEditorComponent.css';\r\nimport { QuestInfoComponent } from \"./QuestInfoComponent\";\r\nimport { RendererComponent } from \"./RendererComponent\";\r\n\r\n@observer\r\nexport class QuestEditorComponent extends React.Component<{}, {\r\n filename?: string,\r\n saveDialogOpen: boolean,\r\n saveDialogFilename: string\r\n}> {\r\n state = {\r\n saveDialogOpen: false,\r\n saveDialogFilename: 'Untitled',\r\n };\r\n\r\n render() {\r\n const quest = questEditorStore.currentQuest;\r\n const model = questEditorStore.currentModel;\r\n const area = questEditorStore.currentArea;\r\n\r\n return (\r\n <div className=\"qe-QuestEditorComponent\">\r\n <Toolbar onSaveAsClicked={this.saveAsClicked} />\r\n <div className=\"qe-QuestEditorComponent-main\">\r\n <QuestInfoComponent quest={quest} />\r\n <RendererComponent\r\n quest={quest}\r\n area={area}\r\n model={model}\r\n />\r\n <EntityInfoComponent entity={questEditorStore.selectedEntity} />\r\n </div>\r\n <SaveAsForm\r\n isOpen={this.state.saveDialogOpen}\r\n filename={this.state.saveDialogFilename}\r\n onFilenameChange={this.saveDialogFilenameChanged}\r\n onOk={this.saveDialogAffirmed}\r\n onCancel={this.saveDialogCancelled}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private saveAsClicked = (filename?: string) => {\r\n const name = filename\r\n ? filename.endsWith('.qst') ? filename.slice(0, -4) : filename\r\n : this.state.saveDialogFilename;\r\n\r\n this.setState({\r\n saveDialogOpen: true,\r\n saveDialogFilename: name\r\n });\r\n }\r\n\r\n private saveDialogFilenameChanged = (filename: string) => {\r\n this.setState({ saveDialogFilename: filename });\r\n }\r\n\r\n private saveDialogAffirmed = () => {\r\n questEditorStore.saveCurrentQuestToFile(this.state.saveDialogFilename);\r\n this.setState({ saveDialogOpen: false });\r\n }\r\n\r\n private saveDialogCancelled = () => {\r\n this.setState({ saveDialogOpen: false });\r\n }\r\n}\r\n\r\n@observer\r\nclass Toolbar extends React.Component<{ onSaveAsClicked: (filename?: string) => void }> {\r\n state = {\r\n filename: undefined\r\n }\r\n\r\n render() {\r\n const quest = questEditorStore.currentQuest;\r\n const areas = quest && Array.from(quest.areaVariants).map(a => a.area);\r\n const area = questEditorStore.currentArea;\r\n const areaId = area && area.id;\r\n\r\n return (\r\n <div className=\"qe-QuestEditorComponent-toolbar\">\r\n <Upload\r\n accept=\".nj, .qst, .xj\"\r\n showUploadList={false}\r\n onChange={this.setFilename}\r\n >\r\n <Button icon=\"file\">{this.state.filename || 'Choose file...'}</Button>\r\n </Upload>\r\n {areas && (\r\n <Select\r\n onChange={questEditorStore.setCurrentAreaId}\r\n value={areaId}\r\n style={{ width: 200 }}\r\n >\r\n {areas.map(area =>\r\n <Select.Option key={area.id} value={area.id}>{area.name}</Select.Option>\r\n )}\r\n </Select>\r\n )}\r\n {quest && (\r\n <Button\r\n icon=\"save\"\r\n onClick={this.saveAsClicked}\r\n >Save as...</Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private setFilename = (info: UploadChangeParam<UploadFile>) => {\r\n if (info.file.originFileObj) {\r\n this.setState({ filename: info.file.name });\r\n questEditorStore.loadFile(info.file.originFileObj);\r\n }\r\n }\r\n\r\n private saveAsClicked = () => {\r\n this.props.onSaveAsClicked(this.state.filename);\r\n }\r\n}\r\n\r\nclass SaveAsForm extends React.Component<{\r\n isOpen: boolean,\r\n filename: string,\r\n onFilenameChange: (name: string) => void,\r\n onOk: () => void,\r\n onCancel: () => void\r\n}> {\r\n render() {\r\n return (\r\n <Modal\r\n title={<><Icon type=\"save\" /> Save as...</>}\r\n visible={this.props.isOpen}\r\n onOk={this.props.onOk}\r\n onCancel={this.props.onCancel}\r\n >\r\n <Form layout=\"vertical\">\r\n <Form.Item label=\"Name\">\r\n <Input\r\n autoFocus={true}\r\n maxLength={12}\r\n value={this.props.filename}\r\n onChange={this.nameChanged}\r\n />\r\n </Form.Item>\r\n </Form>\r\n </Modal>\r\n );\r\n }\r\n\r\n private nameChanged = (e: ChangeEvent<HTMLInputElement>) => {\r\n this.props.onFilenameChange(e.currentTarget.value);\r\n }\r\n}\r\n","import { Menu } from 'antd';\r\nimport { ClickParam } from 'antd/lib/menu';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport './ApplicationComponent.css';\r\nimport { withErrorBoundary } from './ErrorBoundary';\r\nimport { HuntOptimizerComponent } from './hunt-optimizer/HuntOptimizerComponent';\r\nimport { QuestEditorComponent } from './quest-editor/QuestEditorComponent';\r\n\r\nconst QuestEditor = withErrorBoundary(QuestEditorComponent);\r\nconst HuntOptimizer = withErrorBoundary(HuntOptimizerComponent);\r\n\r\n@observer\r\nexport class ApplicationComponent extends React.Component {\r\n state = { tool: 'questEditor' }\r\n\r\n render() {\r\n let toolComponent;\r\n\r\n switch (this.state.tool) {\r\n case 'questEditor':\r\n toolComponent = <QuestEditor />;\r\n break;\r\n case 'huntOptimizer':\r\n toolComponent = <HuntOptimizer />;\r\n break;\r\n }\r\n\r\n return (\r\n <div className=\"ApplicationComponent\">\r\n <div className=\"ApplicationComponent-navbar\">\r\n <h1 className=\"ApplicationComponent-heading\">\r\n Phantasmal World\r\n </h1>\r\n <Menu\r\n onClick={this.menuClicked}\r\n selectedKeys={[this.state.tool]}\r\n mode=\"horizontal\"\r\n >\r\n <Menu.Item key=\"questEditor\">\r\n Quest Editor<sup className=\"ApplicationComponent-beta\">(Beta)</sup>\r\n </Menu.Item>\r\n <Menu.Item key=\"huntOptimizer\">\r\n Hunt Optimizer\r\n </Menu.Item>\r\n </Menu>\r\n </div>\r\n <div className=\"ApplicationComponent-main\">\r\n {toolComponent}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private menuClicked = (e: ClickParam) => {\r\n this.setState({ tool: e.key });\r\n };\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.less';\r\nimport { ApplicationComponent } from './ui/ApplicationComponent';\r\nimport 'react-virtualized/styles.css';\r\n\r\nReactDOM.render(\r\n <ApplicationComponent />,\r\n document.getElementById('phantasmal-world-root')\r\n);\r\n"],"sourceRoot":""} |