mirror of
https://github.com/DaanVandenBosch/phantasmal-world.git
synced 2025-04-07 16:58:26 +08:00
1 line
568 KiB
Plaintext
1 line
568 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/ItemKindStore.ts","stores/ItemDropStore.ts","stores/HuntOptimizerStore.ts","ui/BigSelect.tsx","ui/hunt-optimizer/WantedItemsComponent.tsx","ui/BigTable.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","stores/DpsCalcStore.ts","ui/dps-calc/DpsCalcComponent.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","byCodeMap","set","map","byEpAndName","get","checkEpisode","Map","undefined","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","IllGill","DelLily","Epsilon","GalGryphon","Deldepth","Delbiter","Dolmolm","Dolmdarl","Morfos","Recobox","Recon","SinowZoa","SinowZele","OlgaFlow","SandRappy","DelRappy","Astark","SatelliteLizard","Yowie","MerissaA","MerissaAA","Girtablulu","Zu","Pazuzu","Boota","ZeBoota","BaBoota","Dorphon","DorphonEclair","Goran","PyroGoran","GoranDetonator","SaintMilion","Shambertin","Kondrieu","NpcTypes","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","ItemKind","WeaponItemKind","_ItemKind","minAtp","maxAtp","ata","maxGrind","requiredAtp","_this3","ArmorItemKind","_ItemKind2","ShieldItemKind","_ItemKind3","UnitItemKind","_ItemKind4","ToolItemKind","_ItemKind5","EnemyDrop","difficulty","npcType","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","ItemKindStore","idToItemKind","itemKinds","itemKindDto","itemKind","json","t1","finish","itemKindStores","store","EnemyDropTable","table","itemKindToDrops","drop","drops","itemKindId","ItemDropStore","itemKindStore","dropDto","current","promise","byCode","warn","getById","setDrop","dropRate","enemyDrops","itemDropStores","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","itemStore","wi","_wantedItems","_ref4","_context2","localStorage","getItem","JSON","parse","replace","setItem","stringify","_ref5","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","_ref11","_ref10","count","result","_i","_Object$entries","_ref12","_ref8","variableName","runsOrOther","details","_method2","_difficulty","_splitPanArms","_runs","_variable","items","_i2","_Object$entries2","_ref15","_ref14","_itemName","expectedAmount","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_iterator9","_step9","_sectionIds","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","sid","matchFound","_i3","_Object$keys","_itemName2","_context3","Set","w","min","method","delete","entries","slicedToArray","getDrop","has","t2","fullMethodName","t3","t4","t5","solver","Solve","opType","feasible","itemName","t6","t7","toConsumableArray","itemDropStore","getDropsForItemKind","array","BigSelect","_PureComponent","commonjs_default","assign","PureComponent","WantedItemsComponent","observer","WantedItemsComponent_class","helpVisible","addWanted","selected","find","removeWanted","findIndex","splice","tableRemoveCellRenderer","_ref","rowData","es_button","icon","onClick","noRowsRenderer","onHelpVisibleChange","visible","setState","popover","content","Help","trigger","onVisibleChange","BigSelect_BigSelect","placeholder","style","width","options","huntableItems","label","onChange","marginLeft","es","_ref2","height","headerHeight","rowHeight","rowCount","rowGetter","_ref3","index","dataKey","cellRenderer","WantedItemsComponent_WantedAmountCell","wantedItem","flexGrow","cellDataGetter","WantedAmountCell","wantedAmountChanged","input_number","max","size","BigTable","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","BigTable_BigTable","totalRuns","toFixed","_loop","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","getInt8","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","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","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","es_select","Option","SaveAsForm","nameChanged","currentTarget","modal","Fragment","es_form","layout","input","autoFocus","maxLength","dpsCalcStore","Weapon","DpsCalcStore_descriptor","DpsCalcStore_descriptor2","shiftaFactor","grind","grindAtp","shiftaAtp","armorAtp","shieldAtp","baseAtp","baseShiftaAtp","finalMinAtp","enemyDfp","finalMaxAtp","minNormalDamage","maxNormalDamage","NORMAL_DAMAGE_FACTOR","minHeavyDamage","maxHeavyDamage","charAtp","magPow","shiftaLvl","DpsCalcComponent","DpsCalcComponent_class","step","QuestEditor","HuntOptimizer","tab","OptimizerComponent_OptimizerComponent","MethodsComponent_MethodsComponent","DpsCalc","ApplicationComponent","ApplicationComponent_class","tool","initTool","menuClicked","toolComponent","menu","selectedKeys","mode","defaultValue","param","location","search","p","startsWith","ReactDOM","ApplicationComponent_ApplicationComponent","getElementById"],"mappings":"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C,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,CAAC,IAAM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","file":"static/js/main.57e66464.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 /**\r\n * Matches the constant name. E.g. the code of NpcType.Zu is \"Zu\".\r\n * Uniquely identifies an NPC.\r\n */\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 < 0)\r\n throw new Error(`Expected id to be an integer greater than or equal to 0, 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 NpcType.byCodeMap.set(code, this);\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 byCodeMap = new Map<string, NpcType>();\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 static byCode(code: string): NpcType | undefined {\r\n return this.byCodeMap.get(code);\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 IllGill: NpcType;\r\n static DelLily: NpcType;\r\n static Epsilon: 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 SinowZoa: NpcType;\r\n static SinowZele: 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 = 0;\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.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.Epsilon = new NpcType(id++, 'Epsilon', 'Epsilon', 'Epsilon', 'Epsilon', 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.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.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.IllGill,\r\n NpcType.DelLily,\r\n NpcType.Epsilon,\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.SinowZoa,\r\n NpcType.SinowZele,\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 / 10;\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 const Episodes: Episode[] = enumValues(Episode);\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,\r\n Greenill,\r\n Skyly,\r\n Bluefull,\r\n Purplenum,\r\n Pinkal,\r\n Redria,\r\n Oran,\r\n Yellowboze,\r\n Whitill,\r\n}\r\n\r\nexport const SectionIds: SectionId[] = enumValues(SectionId);\r\n\r\nexport enum Difficulty {\r\n Normal, Hard, VHard, 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\n// Abstract base class of all item kinds.\r\nexport class ItemKind {\r\n constructor(\r\n readonly id: number,\r\n readonly name: string\r\n ) {\r\n\r\n if (Object.getPrototypeOf(this) === Object.getPrototypeOf(ItemKind))\r\n throw new Error('Abstract class should not be instantiated directly.');\r\n }\r\n}\r\n\r\nexport class WeaponItemKind extends ItemKind {\r\n constructor(\r\n id: number,\r\n name: string,\r\n readonly minAtp: number,\r\n readonly maxAtp: number,\r\n readonly ata: number,\r\n readonly maxGrind: number,\r\n readonly requiredAtp: number,\r\n ) {\r\n super(id, name);\r\n }\r\n}\r\n\r\nexport class ArmorItemKind extends ItemKind {\r\n constructor(\r\n id: number,\r\n name: string,\r\n ) {\r\n super(id, name);\r\n }\r\n}\r\n\r\nexport class ShieldItemKind extends ItemKind {\r\n constructor(\r\n id: number,\r\n name: string,\r\n ) {\r\n super(id, name);\r\n }\r\n}\r\n\r\nexport class UnitItemKind extends ItemKind {\r\n constructor(\r\n id: number,\r\n name: string,\r\n ) {\r\n super(id, name);\r\n }\r\n}\r\n\r\nexport class ToolItemKind extends ItemKind {\r\n constructor(\r\n id: number,\r\n name: string,\r\n ) {\r\n super(id, name);\r\n }\r\n}\r\n\r\ntype ItemDrop = {\r\n item: ItemKind,\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 readonly difficulty: Difficulty,\r\n readonly sectionId: SectionId,\r\n readonly npcType: NpcType,\r\n readonly item: ItemKind,\r\n readonly anythingRate: number,\r\n 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 { ItemKind, Server, WeaponItemKind, ArmorItemKind, ShieldItemKind, ToolItemKind, UnitItemKind } from \"../domain\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport { ItemKindDto } from \"../dto\";\r\n\r\nclass ItemKindStore {\r\n private idToItemKind: Array<ItemKind> = [];\r\n\r\n @observable itemKinds: Array<ItemKind> = [];\r\n\r\n getById(id: number): ItemKind | undefined {\r\n return this.idToItemKind[id];\r\n }\r\n\r\n load = async (server: Server): Promise<ItemKindStore> => {\r\n const response = await fetch(\r\n `${process.env.PUBLIC_URL}/itemKinds.${Server[server].toLowerCase()}.json`\r\n );\r\n const data: Array<ItemKindDto> = await response.json();\r\n\r\n const itemKinds = new Array<ItemKind>();\r\n\r\n for (const itemKindDto of data) {\r\n let itemKind: ItemKind;\r\n\r\n switch (itemKindDto.type) {\r\n case 'weapon':\r\n itemKind = new WeaponItemKind(\r\n itemKindDto.id,\r\n itemKindDto.name,\r\n itemKindDto.minAtp,\r\n itemKindDto.maxAtp,\r\n itemKindDto.ata,\r\n itemKindDto.maxGrind,\r\n itemKindDto.requiredAtp,\r\n );\r\n break;\r\n case 'armor':\r\n itemKind = new ArmorItemKind(\r\n itemKindDto.id,\r\n itemKindDto.name,\r\n );\r\n break;\r\n case 'shield':\r\n itemKind = new ShieldItemKind(\r\n itemKindDto.id,\r\n itemKindDto.name,\r\n );\r\n break;\r\n case 'unit':\r\n itemKind = new UnitItemKind(\r\n itemKindDto.id,\r\n itemKindDto.name,\r\n );\r\n break;\r\n case 'tool':\r\n itemKind = new ToolItemKind(\r\n itemKindDto.id,\r\n itemKindDto.name,\r\n );\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n this.idToItemKind[itemKind.id] = itemKind;\r\n itemKinds.push(itemKind);\r\n }\r\n\r\n this.itemKinds = itemKinds;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport const itemKindStores: ServerMap<Loadable<ItemKindStore>> = new ServerMap(server => {\r\n const store = new ItemKindStore();\r\n return new Loadable(store, () => store.load(server));\r\n});\r\n","import { observable } from \"mobx\";\r\nimport { Difficulties, Difficulty, EnemyDrop, NpcType, SectionId, SectionIds, Server, ItemKind } from \"../domain\";\r\nimport { NpcTypes } from \"../domain/NpcType\";\r\nimport { EnemyDropDto } from \"../dto\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { itemKindStores } from \"./ItemKindStore\";\r\nimport { ServerMap } from \"./ServerMap\";\r\n\r\nclass EnemyDropTable {\r\n // Mapping of difficulties to section IDs to NpcTypes to EnemyDrops.\r\n private table: Array<EnemyDrop> =\r\n new Array(Difficulties.length * SectionIds.length * NpcTypes.length);\r\n\r\n // Mapping of ItemKind ids to EnemyDrops.\r\n private itemKindToDrops: Array<Array<EnemyDrop>> = new Array();\r\n\r\n getDrop(difficulty: Difficulty, sectionId: SectionId, npcType: NpcType): EnemyDrop | undefined {\r\n return this.table[\r\n difficulty * SectionIds.length * NpcTypes.length\r\n + sectionId * NpcTypes.length\r\n + npcType.id\r\n ];\r\n }\r\n\r\n setDrop(difficulty: Difficulty, sectionId: SectionId, npcType: NpcType, drop: EnemyDrop) {\r\n this.table[\r\n difficulty * SectionIds.length * NpcTypes.length\r\n + sectionId * NpcTypes.length\r\n + npcType.id\r\n ] = drop;\r\n\r\n let drops = this.itemKindToDrops[drop.item.id];\r\n\r\n if (!drops) {\r\n drops = [];\r\n this.itemKindToDrops[drop.item.id] = drops;\r\n }\r\n\r\n drops.push(drop);\r\n }\r\n\r\n getDropsForItemKind(itemKindId: number): Array<EnemyDrop> {\r\n return this.itemKindToDrops[itemKindId] || [];\r\n }\r\n}\r\n\r\nclass ItemDropStore {\r\n @observable enemyDrops: EnemyDropTable = new EnemyDropTable();\r\n\r\n load = async (server: Server): Promise<ItemDropStore> => {\r\n const itemKindStore = await itemKindStores.current.promise;\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.byCode(dropDto.enemy);\r\n\r\n if (!npcType) {\r\n console.warn(`Couldn't determine NpcType of episode ${dropDto.episode} ${dropDto.enemy}.`);\r\n continue;\r\n }\r\n\r\n const difficulty = (Difficulty as any)[dropDto.difficulty];\r\n const itemKind = itemKindStore.getById(dropDto.itemKindId);\r\n\r\n if (!itemKind) {\r\n console.warn(`Couldn't find item kind ${dropDto.itemKindId}.`);\r\n continue;\r\n }\r\n\r\n const sectionId = (SectionId as any)[dropDto.sectionId];\r\n\r\n if (sectionId == null) {\r\n console.warn(`Couldn't find section ID ${dropDto.sectionId}.`);\r\n continue;\r\n }\r\n\r\n drops.setDrop(difficulty, sectionId, npcType, new EnemyDrop(\r\n difficulty,\r\n sectionId,\r\n npcType,\r\n itemKind,\r\n dropDto.dropRate,\r\n dropDto.rareRate\r\n ));\r\n }\r\n\r\n this.enemyDrops = drops;\r\n return this;\r\n }\r\n}\r\n\r\nexport const itemDropStores: ServerMap<Loadable<ItemDropStore>> = new ServerMap(server => {\r\n const store = new ItemDropStore();\r\n return new Loadable(store, () => store.load(server));\r\n});\r\n","import solver from 'javascript-lp-solver';\r\nimport { autorun, IObservableArray, observable, computed } from \"mobx\";\r\nimport { Difficulties, Difficulty, HuntMethod, ItemKind, KONDRIEU_PROB, NpcType, RARE_ENEMY_PROB, SectionId, SectionIds, Server } from \"../domain\";\r\nimport { applicationStore } from './ApplicationStore';\r\nimport { huntMethodStore } from \"./HuntMethodStore\";\r\nimport { itemDropStores } from './ItemDropStore';\r\nimport { itemKindStores } from './ItemKindStore';\r\n\r\nexport class WantedItem {\r\n @observable readonly itemKind: ItemKind;\r\n @observable amount: number;\r\n\r\n constructor(itemKind: ItemKind, amount: number) {\r\n this.itemKind = itemKind;\r\n this.amount = amount;\r\n }\r\n}\r\n\r\nexport class OptimalResult {\r\n constructor(\r\n readonly wantedItems: Array<ItemKind>,\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<ItemKind, 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 @computed get huntableItems(): Array<ItemKind> {\r\n const itemDropStore = itemDropStores.current.value;\r\n return itemKindStores.current.value.itemKinds.filter(i =>\r\n itemDropStore.enemyDrops.getDropsForItemKind(i.id).length\r\n );\r\n }\r\n\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.${Server[applicationStore.currentServer]}`\r\n );\r\n\r\n if (wantedItemsJson) {\r\n const itemStore = await itemKindStores.current.promise;\r\n const wi = JSON.parse(wantedItemsJson);\r\n\r\n const wantedItems: WantedItem[] = [];\r\n\r\n for (const { itemKindId, amount } of wi) {\r\n const item = itemStore.getById(itemKindId);\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.${Server[applicationStore.currentServer]}`,\r\n JSON.stringify(\r\n this.wantedItems.map(({ itemKind, amount }) => ({\r\n itemKindId: itemKind.id,\r\n amount\r\n }))\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.itemKind));\r\n\r\n const methods = await huntMethodStore.methods.current.promise;\r\n const dropTable = (await itemDropStores.current.promise).enemyDrops;\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.itemKind.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<ItemKind, 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.id}`;\r\n if (splitPanArms) name += '\\tspa';\r\n return name;\r\n }\r\n}\r\n\r\nexport const huntOptimizerStore = new HuntOptimizerStore();\r\n","import React, { PureComponent } from \"react\";\r\nimport { OptionValues, ReactAsyncSelectProps, ReactCreatableSelectProps, ReactSelectProps } from \"react-select\";\r\nimport VirtualizedSelect, { AdditionalVirtualizedSelectProps } from \"react-virtualized-select\";\r\nimport \"./BigSelect.less\";\r\n\r\n/**\r\n * Simply wraps {@link VirtualizedSelect} to provide consistent styling.\r\n */\r\nexport class BigSelect<TValue = OptionValues> extends PureComponent<VirtualizedSelectProps<TValue>> {\r\n render() {\r\n return (\r\n <VirtualizedSelect className=\"BigSelect\" {...this.props} />\r\n );\r\n }\r\n}\r\n\r\n// Copied from react-virtualized-select.\r\ntype VirtualizedSelectProps<TValue = OptionValues> = (ReactCreatableSelectProps<TValue> & ReactAsyncSelectProps<TValue> & AdditionalVirtualizedSelectProps<TValue> & { async: true }) |\r\n ReactCreatableSelectProps<TValue> & ReactSelectProps<TValue> & AdditionalVirtualizedSelectProps<TValue>;\r\n","import { Button, InputNumber, 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 { itemKindStores } from \"../../stores/ItemKindStore\";\r\nimport { BigSelect } from \"../BigSelect\";\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 className=\"ho-WantedItemsComponent-top-bar\">\r\n <BigSelect\r\n placeholder=\"Add an item\"\r\n value={undefined}\r\n style={{ width: 200 }}\r\n options={huntOptimizerStore.huntableItems.map(itemKind => ({\r\n label: itemKind.name,\r\n value: itemKind.id\r\n }))}\r\n onChange={this.addWanted}\r\n />\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 }) =>\r\n (rowData as WantedItem).itemKind.name\r\n }\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 = (selected: any) => {\r\n if (selected) {\r\n let added = huntOptimizerStore.wantedItems.find(w => w.itemKind.id === selected.value);\r\n\r\n if (!added) {\r\n const itemKind = itemKindStores.current.value.getById(selected.value)!;\r\n huntOptimizerStore.wantedItems.push(new WantedItem(itemKind, 1));\r\n }\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 \"./BigTable.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 * Uses windowing to support large amounts of rows and columns.\r\n * TODO: no-content message.\r\n */\r\nexport class BigTable<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[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 { Difficulty, SectionId } from \"../../domain\";\r\nimport { huntOptimizerStore, OptimalMethod } from \"../../stores/HuntOptimizerStore\";\r\nimport { Column, BigTable } from \"../BigTable\";\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) => Difficulty[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.map(sid => SectionId[sid]).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;\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 <BigTable\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, BigTable } from \"../BigTable\";\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 <BigTable<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 = false) {\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 an signed 8-bit integer and increments position by 1.\r\n */\r\n i8() {\r\n return this.dv.getInt8(this.position++);\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 * Reads n unsigned 32-bit integers and increments position by 4n.\r\n */\r\n u32Array(n: number): number[] {\r\n const array = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n array.push(this.dv.getUint32(this.position, this.littleEndian));\r\n this.position += 4;\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 { observable, IObservableArray, computed } from \"mobx\";\r\n\r\nconst NORMAL_DAMAGE_FACTOR = 0.2 * 0.9;\r\nconst HEAVY_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 1.89;\r\nconst SAC_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 3.32;\r\nconst VJAYA_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 5.56;\r\nconst CRIT_FACTOR = 1.5;\r\n\r\nclass WeaponType {\r\n constructor(\r\n readonly minAtp: number,\r\n readonly maxAtp: number\r\n ) { }\r\n}\r\n\r\nclass Weapon {\r\n readonly type: WeaponType;\r\n\r\n /**\r\n * Integer from 0 to 100.\r\n */\r\n @observable attributePercentage: number = 0;\r\n @observable grind: number = 0;\r\n\r\n @computed get shiftaAtp(): number {\r\n if (this.type.minAtp === this.type.maxAtp) {\r\n return 0;\r\n } else {\r\n return this.type.maxAtp * this.store.shiftaFactor;\r\n }\r\n }\r\n\r\n @computed get grindAtp(): number {\r\n return 2 * this.grind;\r\n }\r\n\r\n @computed get minAtp(): number {\r\n return this.type.minAtp + this.grindAtp;\r\n }\r\n\r\n @computed get maxAtp(): number {\r\n return this.type.maxAtp + this.grindAtp + this.shiftaAtp;\r\n }\r\n\r\n @computed get finalMinAtp(): number {\r\n return this.minAtp\r\n + this.store.armorAtp\r\n + this.store.shieldAtp\r\n + this.store.baseAtp\r\n + this.store.baseShiftaAtp;\r\n }\r\n\r\n @computed get finalMaxAtp(): number {\r\n return this.maxAtp\r\n + this.store.armorAtp\r\n + this.store.shieldAtp\r\n + this.store.baseAtp\r\n + this.store.baseShiftaAtp;\r\n }\r\n\r\n @computed get minNormalDamage(): number {\r\n return (this.finalMinAtp - this.store.enemyDfp) * NORMAL_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get maxNormalDamage(): number {\r\n return (this.finalMaxAtp - this.store.enemyDfp) * NORMAL_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get avgNormalDamage(): number {\r\n return (this.minNormalDamage + this.maxNormalDamage) / 2;\r\n }\r\n\r\n @computed get minHeavyDamage(): number {\r\n return (this.finalMinAtp - this.store.enemyDfp) * HEAVY_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get maxHeavyDamage(): number {\r\n return (this.finalMaxAtp - this.store.enemyDfp) * HEAVY_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get avgHeavyDamage(): number {\r\n return (this.minHeavyDamage + this.maxHeavyDamage) / 2;\r\n }\r\n\r\n constructor(\r\n private store: DpsCalcStore,\r\n type: WeaponType,\r\n ) {\r\n this.type = type;\r\n }\r\n}\r\n\r\nclass DpsCalcStore {\r\n //\r\n // Character Details\r\n //\r\n\r\n @observable charAtp: number = 0;\r\n @observable magPow: number = 0;\r\n @observable armorAtp: number = 0;\r\n @observable shieldAtp: number = 0;\r\n @observable shiftaLvl: number = 0;\r\n\r\n @computed get baseAtp(): number {\r\n return this.charAtp + 2 * this.magPow;\r\n }\r\n\r\n @computed get shiftaFactor(): number {\r\n return this.shiftaLvl ? 0.013 * (this.shiftaLvl - 1) + 0.1 : 0;\r\n }\r\n\r\n @computed get baseShiftaAtp(): number {\r\n return this.baseAtp * this.shiftaFactor;\r\n }\r\n\r\n @observable readonly weapons: IObservableArray<Weapon> = observable.array();\r\n\r\n //\r\n // Enemy Details\r\n //\r\n\r\n @observable enemyDfp: number = 0;\r\n}\r\n\r\nexport const dpsCalcStore = new DpsCalcStore();\r\n","import { InputNumber } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport React from \"react\";\r\nimport { dpsCalcStore } from \"../../stores/DpsCalcStore\";\r\n\r\n@observer\r\nexport class DpsCalcComponent extends React.Component {\r\n render() {\r\n return (\r\n <section>\r\n <section>\r\n <div>Character ATP:</div>\r\n <InputNumber\r\n value={dpsCalcStore.charAtp}\r\n min={0}\r\n step={1}\r\n onChange={(value) => dpsCalcStore.charAtp = value || 0}\r\n />\r\n <div>MAG POW:</div>\r\n <InputNumber\r\n value={dpsCalcStore.magPow}\r\n min={0}\r\n max={200}\r\n step={1}\r\n onChange={(value) => dpsCalcStore.magPow = value || 0}\r\n />\r\n <div>Armor ATP:</div>\r\n <InputNumber\r\n value={dpsCalcStore.armorAtp}\r\n min={0}\r\n step={1}\r\n onChange={(value) => dpsCalcStore.armorAtp = value || 0}\r\n />\r\n <div>Shield ATP:</div>\r\n <InputNumber\r\n value={dpsCalcStore.shieldAtp}\r\n min={0}\r\n step={1}\r\n onChange={(value) => dpsCalcStore.shieldAtp = value || 0}\r\n />\r\n <div>Shifta level:</div>\r\n <InputNumber\r\n value={dpsCalcStore.shiftaLvl}\r\n min={0}\r\n max={30}\r\n step={1}\r\n onChange={(value) => dpsCalcStore.shiftaLvl = value || 0}\r\n />\r\n <div>Shifta factor:</div>\r\n <div>{dpsCalcStore.shiftaFactor.toFixed(3)}</div>\r\n <div>Base shifta ATP:</div>\r\n <div>{dpsCalcStore.baseShiftaAtp.toFixed(2)}</div>\r\n </section>\r\n </section>\r\n );\r\n }\r\n}\r\n","import { Menu, Select } from 'antd';\r\nimport { ClickParam } from 'antd/lib/menu';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport './ApplicationComponent.less';\r\nimport { withErrorBoundary } from './ErrorBoundary';\r\nimport { HuntOptimizerComponent } from './hunt-optimizer/HuntOptimizerComponent';\r\nimport { QuestEditorComponent } from './quest-editor/QuestEditorComponent';\r\nimport { DpsCalcComponent } from './dps-calc/DpsCalcComponent';\r\nimport { Server } from '../domain';\r\n\r\nconst QuestEditor = withErrorBoundary(QuestEditorComponent);\r\nconst HuntOptimizer = withErrorBoundary(HuntOptimizerComponent);\r\nconst DpsCalc = withErrorBoundary(DpsCalcComponent);\r\n\r\n@observer\r\nexport class ApplicationComponent extends React.Component {\r\n state = { tool: this.initTool() }\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 case 'dpsCalc':\r\n toolComponent = <DpsCalc />;\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 className=\"ApplicationComponent-heading-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.Item key=\"dpsCalc\">\r\n DPS Calculator\r\n </Menu.Item> */}\r\n </Menu>\r\n <div className=\"ApplicationComponent-server-select\">\r\n <span>Server:</span>\r\n <Select defaultValue={Server.Ephinea} style={{ width: 120 }}>\r\n <Select.Option value={Server.Ephinea}>{Server.Ephinea}</Select.Option>\r\n </Select>\r\n </div>\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 private initTool(): string {\r\n const param = window.location.search.slice(1).split('&').find(p => p.startsWith('tool='));\r\n return param ? param.slice(5) : 'questEditor';\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\nimport \"react-select/dist/react-select.css\";\r\nimport \"react-virtualized-select/styles.css\";\r\n\r\nReactDOM.render(\r\n <ApplicationComponent />,\r\n document.getElementById('phantasmal-world-root')\r\n);\r\n"],"sourceRoot":""} |