phantasmal-world/static/js/main.5c43ffc7.chunk.js.map
Daan Vanden Bosch ce263fde1f Fixed release 3.
2019-06-16 13:10:21 +02:00

1 line
546 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/SectionIdIcon.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","RARE_ENEMY_PROB","KONDRIEU_PROB","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","_class13","quest","defaultTime","enemies","enemyCounts","_descriptor18","npc","userTime","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","questId","questName","time","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","OptimalResult","wantedItems","optimalMethods","OptimalMethod","sectionIds","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","_method","counts","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_count","rareCount","countsList","panArmsCount","splitCounts","panArms2Count","_splitCounts","_counts","splitPanArms","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","diff","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","variable","addVariable","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_iterator7","_step7","_ref10","_ref9","count","result","_i","_Object$entries","_ref11","_ref7","variableName","runsOrOther","details","_method2","_difficulty","_splitPanArms","_runs","_variable","_items","_i2","_Object$entries2","_ref14","_ref13","_itemName","expectedAmount","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_iterator9","_step9","_sectionIds","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","sid","matchFound","_i3","_Object$keys","_itemName2","_context3","Set","w","enemyDrops","min","method","t1","delete","entries","slicedToArray","getDrop","has","t2","fullMethodName","t3","t4","t5","solver","Solve","opType","feasible","t6","t7","toConsumableArray","array","WantedItemsComponent","observer","WantedItemsComponent_class","helpVisible","addWanted","removeWanted","findIndex","splice","tableRemoveCellRenderer","rowData","es_button","icon","onClick","noRowsRenderer","onHelpVisibleChange","visible","setState","popover","content","Help","trigger","onVisibleChange","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","tooltip","join","fixedRowCount","overscanRowCount","columnCount","fixedColumnCount","overscanColumnCount","classNameTopLeftGrid","classNameTopRightGrid","updateTigger","updateTrigger","SectionIdIcon","_ref$size","display","backgroundImage","backgroundSize","hoursToString","hours","h","floor","m","round","toString","padStart","OptimizationResultComponent","_class2","dataTable_DataTable","totalRuns","toFixed","totalCount","OptimizationResultComponent_class","OptimizerComponent","WantedItemsComponent_WantedItemsComponent","OptimizationResultComponent_OptimizationResultComponent","MethodsComponent","MethodsComponent_temp","MethodsComponent_class2","MethodsComponent_class","TabPane","change","hour","minute","time_picker","moment","format","allowClear","suffixIcon","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","r","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","add","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","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","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","reduce","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","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","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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,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,MAClB,CAAC,IAAM,UAAW,MAClB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","file":"static/js/main.5c43ffc7.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 readonly rate: number;\r\n\r\n constructor(\r\n public readonly item: Item,\r\n public readonly anythingRate: number,\r\n public readonly rareRate: number\r\n ) {\r\n this.rate = anythingRate * rareRate;\r\n }\r\n}\r\n\r\nexport class HuntMethod {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly quest: SimpleQuest;\r\n readonly npcs: Array<SimpleNpc>;\r\n readonly enemies: Array<SimpleNpc>;\r\n readonly enemyCounts: Map<NpcType, number>;\r\n /**\r\n * The time it takes to complete the quest in hours.\r\n */\r\n readonly defaultTime: number;\r\n /**\r\n * The time it takes to complete the quest in hours as specified by the user.\r\n */\r\n @observable userTime?: number;\r\n\r\n @computed get time(): number {\r\n return this.userTime != null ? this.userTime : this.defaultTime;\r\n }\r\n\r\n constructor(\r\n id: string,\r\n name: string,\r\n quest: SimpleQuest,\r\n defaultTime: number\r\n ) {\r\n if (!id) throw new Error('id is required.');\r\n if (defaultTime <= 0) throw new Error('defaultTime must be greater than zero.');\r\n if (!name) throw new Error('name is required.');\r\n if (!quest) throw new Error('quest is required.');\r\n\r\n this.id = id;\r\n this.name = name;\r\n this.quest = quest;\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 this.defaultTime = defaultTime;\r\n }\r\n}\r\n\r\nexport class SimpleQuest {\r\n constructor(\r\n public readonly id: number,\r\n public readonly name: string,\r\n public readonly npcs: SimpleNpc[]\r\n ) {\r\n if (!id) throw new Error('id is required.');\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, i) => {\r\n const questId = i + 1;\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 `q${questId}`,\r\n questName,\r\n new SimpleQuest(\r\n questId,\r\n questName,\r\n npcs\r\n ),\r\n time\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 } 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 OptimalResult {\r\n constructor(\r\n readonly wantedItems: Array<Item>,\r\n readonly optimalMethods: Array<OptimalMethod>\r\n ) { }\r\n}\r\n\r\nexport class OptimalMethod {\r\n readonly totalTime: number;\r\n\r\n constructor(\r\n readonly difficulty: Difficulty,\r\n readonly sectionIds: Array<SectionId>,\r\n readonly methodName: string,\r\n readonly methodTime: number,\r\n readonly runs: number,\r\n 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: Show expected value or probability per item per method.\r\n// Can be useful when deciding which item to hunt first.\r\n// TODO: boxes.\r\nclass HuntOptimizerStore {\r\n @observable readonly wantedItems: IObservableArray<WantedItem> = observable.array();\r\n @observable result?: OptimalResult;\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.result = undefined;\r\n return;\r\n }\r\n\r\n // Initialize this set before awaiting data, so user changes don't affect this optimization\r\n // run from this point on.\r\n const wantedItems = new Set(this.wantedItems.filter(w => w.amount > 0).map(w => w.item));\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 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\r\n if (panArmsCount) {\r\n const splitCounts = new Map(counts);\r\n\r\n splitCounts.delete(NpcType.PanArms);\r\n splitCounts.set(NpcType.Migium, panArmsCount);\r\n splitCounts.set(NpcType.Hidoom, panArmsCount);\r\n\r\n countsList.push(splitCounts);\r\n }\r\n\r\n const panArms2Count = counts.get(NpcType.PanArms2);\r\n\r\n if (panArms2Count) {\r\n const splitCounts = new Map(counts);\r\n\r\n splitCounts.delete(NpcType.PanArms2);\r\n splitCounts.set(NpcType.Migium2, panArms2Count);\r\n splitCounts.set(NpcType.Hidoom2, panArms2Count);\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 // Will contain an entry per wanted item dropped by enemies in this method/\r\n // difficulty/section ID combo.\r\n const variable: Variable = {\r\n time: method.time\r\n };\r\n // Only add the variable if the method provides at least 1 item we want.\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 const name = this.fullMethodName(\r\n diff, sectionId, method, splitPanArms\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 /**\r\n * Value will always be a number if result is indexed with an actual method name.\r\n */\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 if (!result.feasible) {\r\n this.result = undefined;\r\n return;\r\n }\r\n\r\n const optimalMethods: Array<OptimalMethod> = [];\r\n\r\n // Loop over the entries in result, ignore standard properties that aren't variables.\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, expectedAmount] of Object.entries(variable)) {\r\n for (const item of wantedItems) {\r\n if (itemName === item.name) {\r\n items.set(item, runs * expectedAmount);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Find all section IDs that provide the same items with the same expected amount.\r\n // E.g. if you need a spread needle and a bringer's right arm, using either\r\n // purplenum or yellowboze will give you the exact same probabilities.\r\n const sectionIds: Array<SectionId> = [];\r\n\r\n for (const sid of SectionIds) {\r\n let matchFound = true;\r\n\r\n if (sid !== sectionId) {\r\n const v = variables[\r\n this.fullMethodName(difficulty, sid, method, splitPanArms)\r\n ];\r\n\r\n if (!v) {\r\n matchFound = false;\r\n } else {\r\n for (const itemName of Object.keys(variable)) {\r\n if (variable[itemName] !== v[itemName]) {\r\n matchFound = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (matchFound) {\r\n sectionIds.push(sid);\r\n }\r\n }\r\n\r\n optimalMethods.push(new OptimalMethod(\r\n difficulty,\r\n sectionIds,\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 this.result = new OptimalResult(\r\n [...wantedItems],\r\n optimalMethods\r\n );\r\n }\r\n\r\n private fullMethodName(\r\n difficulty: Difficulty,\r\n sectionId: SectionId,\r\n method: HuntMethod,\r\n splitPanArms: boolean\r\n ): string {\r\n let name = `${difficulty}\\t${sectionId}\\t${method.name}`;\r\n if (splitPanArms) name += ' (Split Pan Arms)';\r\n return name;\r\n }\r\n}\r\n\r\nexport const huntOptimizerStore = new HuntOptimizerStore();\r\n","import { Button, InputNumber, Select, Popover } 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.less';\r\n\r\n@observer\r\nexport class WantedItemsComponent extends React.Component {\r\n state = {\r\n helpVisible: false\r\n }\r\n\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>\r\n Wanted Items\r\n <Popover\r\n content={<Help />}\r\n trigger=\"click\"\r\n visible={this.state.helpVisible}\r\n onVisibleChange={this.onHelpVisibleChange}\r\n >\r\n <Button icon=\"info-circle\" type=\"link\" />\r\n </Popover>\r\n </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 noRowsRenderer={this.noRowsRenderer}\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 private noRowsRenderer = () => {\r\n return (\r\n <div className=\"ho-WantedItemsComponent-no-rows\">\r\n <p>\r\n Add some items with the above drop down and click \"Optimize\" to see the result on the right.\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n private onHelpVisibleChange = (visible: boolean) => {\r\n this.setState({ helpVisible: visible });\r\n }\r\n}\r\n\r\nfunction Help() {\r\n return (\r\n <div className=\"ho-WantedItemsComponent-help\">\r\n <p>\r\n Add some items with the drop down and click \"Optimize\" to see the optimal set of method/difficulty/section ID combinations on the right.\r\n </p>\r\n <p>\r\n At the moment a method is simply a quest run-through. Partial quest run-throughs are coming. View the list of methods on the \"Methods\" tab. Each method takes a certain amount of time, which affects the optimization result. Make sure the times are correct for you (at the moment times can't be changed, but this feature is coming).\r\n </p>\r\n <p>\r\n Only enemy drops are considered. Box drops are coming.\r\n </p>\r\n <p>\r\n The optimal result is calculated using linear optimization. The optimizer takes rare enemies and the fact that pan arms can be split in two into account.\r\n </p>\r\n </div>\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, { ReactNode } from \"react\";\r\nimport { GridCellRenderer, Index, MultiGrid } from \"react-virtualized\";\r\nimport \"./dataTable.less\";\r\n\r\nexport type Column<T> = {\r\n name: string,\r\n width: number,\r\n cellRenderer: (record: T) => ReactNode,\r\n tooltip?: (record: T) => string,\r\n footerValue?: string,\r\n footerTooltip?: string,\r\n /**\r\n * \"number\" and \"integrated\" have special meaning.\r\n */\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 overscanRowCount?: number,\r\n columns: Array<Column<T>>,\r\n fixedColumnCount?: number,\r\n overscanColumnCount?: number,\r\n record: (index: Index) => T,\r\n footer?: boolean,\r\n /**\r\n * When this changes, the DataTable will re-render.\r\n */\r\n updateTrigger?: any\r\n}> {\r\n render() {\r\n return (\r\n <div\r\n className=\"DataTable\"\r\n style={{ width: this.props.width, height: this.props.height }}\r\n >\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 overscanRowCount={this.props.overscanRowCount}\r\n columnWidth={this.columnWidth}\r\n columnCount={this.props.columns.length}\r\n fixedColumnCount={this.props.fixedColumnCount}\r\n overscanColumnCount={this.props.overscanColumnCount}\r\n cellRenderer={this.cellRenderer}\r\n classNameTopLeftGrid=\"DataTable-header\"\r\n classNameTopRightGrid=\"DataTable-header\"\r\n updateTigger={this.props.updateTrigger}\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 cell: ReactNode;\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 cell = 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 cell = 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 cell = column.cellRenderer(result);\r\n\r\n if (column.tooltip) {\r\n title = column.tooltip(result);\r\n }\r\n }\r\n }\r\n\r\n if (typeof cell !== 'string') {\r\n classes.push('custom');\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 {typeof cell === 'string' ? (\r\n <span className=\"DataTable-cell-text\">{cell}</span>\r\n ) : cell}\r\n </div>\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { SectionId } from \"../domain\";\r\n\r\nexport function SectionIdIcon({\r\n sectionId,\r\n size = 28,\r\n title\r\n}: {\r\n sectionId: SectionId,\r\n size?: number,\r\n title?: string\r\n}) {\r\n return (\r\n <div\r\n title={title}\r\n style={{\r\n display: 'inline-block',\r\n width: size,\r\n height: size,\r\n backgroundImage: `url(${process.env.PUBLIC_URL}/images/sectionids/${sectionId}.png)`,\r\n backgroundSize: size\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 { huntOptimizerStore, OptimalMethod } from \"../../stores/HuntOptimizerStore\";\r\nimport { Column, DataTable } from \"../dataTable\";\r\nimport { SectionIdIcon } from \"../SectionIdIcon\";\r\nimport { hoursToString } from \"../time\";\r\nimport \"./OptimizationResultComponent.less\";\r\n\r\n@observer\r\nexport class OptimizationResultComponent extends React.Component {\r\n @computed private get columns(): Column<OptimalMethod>[] {\r\n // Standard columns.\r\n const result = huntOptimizerStore.result;\r\n const optimalMethods = result ? result.optimalMethods : [];\r\n let totalRuns = 0;\r\n let totalTime = 0;\r\n\r\n for (const method of optimalMethods) {\r\n totalRuns += method.runs;\r\n totalTime += method.totalTime;\r\n }\r\n\r\n const columns: Column<OptimalMethod>[] = [\r\n {\r\n name: 'Difficulty',\r\n width: 75,\r\n cellRenderer: (result) => result.difficulty,\r\n footerValue: 'Totals:',\r\n },\r\n {\r\n name: 'Method',\r\n width: 200,\r\n cellRenderer: (result) => result.methodName,\r\n tooltip: (result) => result.methodName,\r\n },\r\n {\r\n name: 'Section ID',\r\n width: 80,\r\n cellRenderer: (result) => (\r\n <div className=\"ho-OptimizationResultComponent-sid-col\">\r\n {result.sectionIds.map(sid =>\r\n <SectionIdIcon sectionId={sid} key={sid} size={20} />\r\n )}\r\n </div>\r\n ),\r\n tooltip: (result) => result.sectionIds.join(', '),\r\n },\r\n {\r\n name: 'Time/Run',\r\n width: 80,\r\n cellRenderer: (result) => hoursToString(result.methodTime),\r\n className: 'number',\r\n },\r\n {\r\n name: 'Runs',\r\n width: 60,\r\n cellRenderer: (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 cellRenderer: (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 if (result) {\r\n for (const item of result.wantedItems) {\r\n let totalCount = 0;\r\n\r\n for (const method of optimalMethods) {\r\n totalCount += method.itemCounts.get(item) || 0;\r\n }\r\n\r\n columns.push({\r\n name: item.name,\r\n width: 80,\r\n cellRenderer: (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\r\n return columns;\r\n }\r\n\r\n // Make sure render is called when result changes.\r\n @computed private get updateTrigger() {\r\n return huntOptimizerStore.result != null;\r\n }\r\n\r\n render() {\r\n this.updateTrigger; // eslint-disable-line\r\n const result = huntOptimizerStore.result;\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={result ? result.optimalMethods.length : 0}\r\n columns={this.columns}\r\n fixedColumnCount={3}\r\n record={this.record}\r\n footer={result != null}\r\n updateTrigger={this.updateTrigger}\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): OptimalMethod => {\r\n return huntOptimizerStore.result!.optimalMethods[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 { TimePicker } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport moment, { Moment } from \"moment\";\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 { Column, DataTable } from \"../dataTable\";\r\nimport \"./MethodsComponent.css\";\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 cellRenderer: (method) => method.name,\r\n },\r\n {\r\n name: 'Time',\r\n width: 50,\r\n cellRenderer: (method) => hoursToString(method.time),\r\n // TODO: enable when methods have IDs so edits can be saved.\r\n // cellRenderer: (method) => <TimeComponent method={method} />,\r\n className: 'integrated',\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 cellRenderer: (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}\r\n\r\n@observer\r\nclass TimeComponent extends React.Component<{ method: HuntMethod }> {\r\n render() {\r\n const time = this.props.method.time;\r\n const hour = Math.floor(time);\r\n const minute = Math.round(60 * (time - hour));\r\n\r\n return (\r\n <TimePicker\r\n className=\"ho-MethodsComponent-timepicker\"\r\n value={moment({ hour, minute })}\r\n format=\"HH:mm\"\r\n size=\"small\"\r\n allowClear={false}\r\n suffixIcon={<span />}\r\n onChange={this.change}\r\n />\r\n );\r\n }\r\n\r\n private change = (time: Moment) => {\r\n this.props.method.userTime = time.hour() + time.minute() / 60;\r\n }\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: 'huntOptimizer' }\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":""}