mirror of
https://github.com/DaanVandenBosch/phantasmal-world.git
synced 2025-04-07 16:58:26 +08:00
1 line
596 KiB
Plaintext
1 line
596 KiB
Plaintext
{"version":3,"sources":["ui/ErrorBoundary.tsx","enums.ts","domain/items.ts","domain/NpcType.ts","domain/ObjectType.ts","domain/index.ts","Loadable.ts","stores/ApplicationStore.ts","stores/ServerMap.ts","stores/HuntMethodStore.ts","stores/ItemTypeStore.ts","stores/ItemDropStore.ts","stores/HuntOptimizerStore.ts","ui/BigSelect.tsx","ui/hunt-optimizer/WantedItemsComponent.tsx","ui/BigTable.tsx","ui/SectionIdIcon.tsx","ui/hunt-optimizer/OptimizationResultComponent.tsx","ui/time.ts","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/quest/dat.ts","bin-data/parsing/quest/bin.ts","bin-data/parsing/quest/qst.ts","stores/AreaStore.ts","bin-data/parsing/quest/index.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","enumValues","e","values","numberValues","filter","v","EnumMap","enum_","initialValue","keys","Map","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","set","err","return","get","WeaponItemType","id","name","minAtp","maxAtp","ata","maxGrind","requiredAtp","ArmorItemType","atp","minEvp","maxEvp","minDfp","maxDfp","mst","hp","lck","ShieldItemType","UnitItemType","ToolItemType","WeaponItem","_class","initializerDefineProperty","_descriptor","_descriptor2","_descriptor3","grind","applyDecoratedDescriptor","prototype","observable","configurable","enumerable","writable","initializer","computed","getOwnPropertyDescriptor","NpcType","code","simpleName","ultimateName","episode","enemy","rareType","Number","isInteger","Error","byCodeMap","map","byEpAndName","checkEpisode","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","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","Server","RARE_ENEMY_PROB","KONDRIEU_PROB","Episode","SectionId","Difficulty","SectionIds","LoadableState","Difficulties","Vec3","x","y","z","Section","domain_class","position","yAxisRotation","domain_descriptor","domain_descriptor2","Math","sin","cos","Quest","_class3","shortDescription","longDescription","questNo","areaVariants","objects","npcs","datUnknowns","binData","domain_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_descriptor8","_descriptor9","_descriptor10","datUnkowns","QuestEntity","_class5","areaId","sectionId","rotation","_descriptor11","_sectionId","_descriptor12","_descriptor13","_descriptor14","object3d","section","_this$position","relX","relY","relZ","sinYAxisRotation","cosYAxisRotation","sectPos","rotZ","QuestObject","_class7","_QuestEntity","dat","_descriptor15","assertThisInitialized","QuestNpc","_class9","_QuestEntity2","_this2","_descriptor16","Area","order","AreaVariant","_class11","area","_descriptor17","EnemyDrop","difficulty","npcType","itemType","anythingRate","rareRate","rate","HuntMethod","_class13","quest","defaultTime","enemyCounts","_descriptor18","userTime","SimpleQuest","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","logger","Logger","huntMethodStore","storageDisposer","loadFromLocalStorage","methods","server","methodUserTimesJson","localStorage","getItem","userTimes","JSON","parse","method","autorun","storeInLocalStorage","error","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","setItem","stringify","fetch","process","toLowerCase","response","json","quests","totalCount","_i","_Object$entries","entries","_ref3","_ref2","slicedToArray","count","byCode","push","test","loadHuntMethods","ItemTypeStore","idToItemType","data","itemTypes","itemTypeDto","class","t1","finish","itemTypeStores","store","EnemyDropTable","table","itemTypeToDrops","drop","drops","itemTypeId","ItemDropStore","itemTypeStore","dropDto","current","promise","warn","getById","setDrop","dropRate","enemyDrops","itemDropStores","WantedItem","HuntOptimizerStore_class","amount","HuntOptimizerStore_descriptor","HuntOptimizerStore_descriptor2","OptimalResult","wantedItems","optimalMethods","OptimalMethod","sectionIds","methodName","methodEpisode","methodTime","runs","itemCounts","totalTime","huntOptimizerStore","HuntOptimizerStore","HuntOptimizerStore_descriptor3","HuntOptimizerStore_descriptor4","optimize","dropTable","constraints","wanted","variables","variableDetails","_method","counts","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_ref9","_ref5","_count","oldCount","countsList","panArmsCount","splitCounts","panArms2Count","_splitCounts","i","_counts","splitPanArms","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","diff","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","variable","addVariable","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","_ref8","_ref7","result","_ref10","variableName","runsOrOther","details","_method2","_difficulty","_splitPanArms","_runs","_variable","items","_i2","_Object$entries2","_ref13","_ref12","_itemName","expectedAmount","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","item","_sectionIds","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_iterator7","_step7","sid","matchFound","_i3","_Object$keys","_itemName2","Set","w","min","delete","time","getDrop","has","t2","fullMethodName","t3","t4","t5","solver","Solve","opType","feasible","itemName","t6","t7","toConsumableArray","initialize","_callee2","_context2","_callee3","wantedItemsJson","itemStore","wi","_wantedItems","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_iterator9","_step9","_ref17","itemKindId","_context3","replace","_ref18","itemDropStore","getDropsForItemType","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","slice","popover","content","Help","trigger","onVisibleChange","BigSelect_BigSelect","placeholder","style","width","options","huntableItemTypes","label","onChange","marginLeft","es","height","headerHeight","rowHeight","rowCount","rowGetter","index","dataKey","cellRenderer","_ref4","WantedItemsComponent_WantedAmountCell","wantedItem","flexGrow","cellDataGetter","WantedAmountCell","wantedAmountChanged","_this3","input_number","max","size","BigTable","sortColumns","columnWidth","columns","cell","sortIndicator","title","columnIndex","rowIndex","column","classes","sortable","sort","direction","SortDirection","ASC","viewBox","d","fill","footer","footerValue","footerTooltip","record","tooltip","headerClicked","join","oldIndex","sc","old","DESC","unshift","fixedRowCount","overscanRowCount","columnCount","fixedColumnCount","overscanColumnCount","classNameTopLeftGrid","classNameTopRightGrid","updateTigger","updateTrigger","SectionIdIcon","_ref$size","display","backgroundImage","backgroundSize","OptimizationResultComponent","_class2","BigTable_BigTable","totalRuns","hours","h","floor","m","round","toString","padStart","hoursToString","toFixed","_loop","OptimizationResultComponent_class","OptimizerComponent","WantedItemsComponent_WantedItemsComponent","OptimizationResultComponent_OptimizationResultComponent","MethodsComponent","MethodsComponent_temp","MethodsComponent_class2","sorts","b","cmp","localeCompare","MethodsComponent_TimeComponent","MethodsComponent_class","TimeComponent","change","hour","minute","time_picker","moment","format","allowClear","suffixIcon","TabPane","tabs","ASCII_DECODER","TextDecoder","UTF_16BE_DECODER","UTF_16LE_DECODER","ASCII_ENCODER","TextEncoder","UTF_16BE_ENCODER","UTF_16LE_ENCODER","ArrayBufferCursor","bufferOrCapacity","littleEndian","_size","buffer","dv","uint8Array","utf16Decoder","utf16Encoder","ArrayBuffer","byteLength","DataView","Uint8Array","ensureCapacity","offset","seekStart","getUint8","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","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","maskedOffsetToPrev","prevOffset","decompress","readFlagBit","copyU8","readU8","readU16","offsetCopy","bufSize","buf","writeCursor","OBJECT_SIZE","NPC_SIZE","parseBin","lenient","objectCodeOffset","functionOffsetTableOffset","questNumber","language","questName","stringUtf16","functionOffsetCount","functionOffsets","instructions","mainOpcode","opcode","opsize","list","F8opcodeList","F9opcodeList","opcodeList","_list$opcode","mnemonic","mask","fullOpcode","toUpperCase","opargs","parseInstructionArguments","parseObjectCode","argsSize","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","trim","objs","unknowns","entityType","entitiesSize","objectCount","typeId","unknown1","u8Array","unknown2","unknown3","unknown","bytesRead","npcCount","unknown4","skin","unknown5","parseDat","prs","bin","func0Ops","operations","funcOffset","funcFound","funcOps","operation","getFuncOperations","npc","obj","bbMaps","op","bbMap","areaVariantsArray","getVariant","getAreaVariants","setEpisode","debug","getEpisode","objData","_objData$position","rot","fromPsoId","npcData","_npcData$position","regular","getNpcType","parseNpcData","writeQuestQst","groupedObjs","groupBy","objAreaIds","parseInt","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","customRequest","es_select","Option","SaveAsForm","nameChanged","currentTarget","modal","Fragment","es_form","layout","input","autoFocus","maxLength","Weapon","shiftaFactor","grindAtp","shiftaAtp","armorAtp","shieldAtp","baseAtp","baseShiftaAtp","finalMinAtp","enemyDfp","finalMaxAtp","minNormalDamage","maxNormalDamage","NORMAL_DAMAGE_FACTOR","minHeavyDamage","maxHeavyDamage","dpsCalcStore","addWeapon","weapons","it","armorType","shieldType","charAtp","magPow","shiftaLvl","DpsCalcComponent","DpsCalcComponent_class","armorChanged","shieldChanged","weaponTypes","wt","weapon","step","avgNormalDamage","avgHeavyDamage","armorTypes","at","shieldTypes","st","QuestEditor","HuntOptimizer","tab","OptimizerComponent_OptimizerComponent","MethodsComponent_MethodsComponent","DpsCalc","ApplicationComponent","ApplicationComponent_class","tool","initTool","menuClicked","toolComponent","menu","selectedKeys","mode","defaultValue","param","location","search","split","p","startsWith","useDefaults","defaultLevel","ReactDOM","ApplicationComponent_ApplicationComponent","getElementById"],"mappings":"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AAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MA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","file":"static/js/main.0bbc2e00.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","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 { observable, computed } from \"mobx\";\r\n\r\n//\r\n// Item types.\r\n// Instances of these classes contain the data that is the same for every item of a specific type.\r\n// E.g. all spread needles are called \"Spread Needle\" and they all have the same ATA.\r\n//\r\n\r\nexport interface ItemType {\r\n readonly id: number,\r\n readonly name: string\r\n}\r\n\r\nexport class WeaponItemType implements ItemType {\r\n constructor(\r\n readonly id: number,\r\n readonly 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}\r\n\r\nexport class ArmorItemType implements ItemType {\r\n constructor(\r\n readonly id: number,\r\n readonly name: string,\r\n readonly atp: number,\r\n readonly ata: number,\r\n readonly minEvp: number,\r\n readonly maxEvp: number,\r\n readonly minDfp: number,\r\n readonly maxDfp: number,\r\n readonly mst: number,\r\n readonly hp: number,\r\n readonly lck: number,\r\n ) { }\r\n}\r\n\r\nexport class ShieldItemType implements ItemType {\r\n constructor(\r\n readonly id: number,\r\n readonly name: string,\r\n readonly atp: number,\r\n readonly ata: number,\r\n readonly minEvp: number,\r\n readonly maxEvp: number,\r\n readonly minDfp: number,\r\n readonly maxDfp: number,\r\n readonly mst: number,\r\n readonly hp: number,\r\n readonly lck: number,\r\n ) { }\r\n}\r\n\r\nexport class UnitItemType implements ItemType {\r\n constructor(\r\n readonly id: number,\r\n readonly name: string,\r\n ) { }\r\n}\r\n\r\nexport class ToolItemType implements ItemType {\r\n constructor(\r\n readonly id: number,\r\n readonly name: string,\r\n ) { }\r\n}\r\n\r\n//\r\n// Item instances.\r\n// Instances of these classes contain the data that is unique to each item.\r\n// E.g. a specific spread needle dropped by an enemy or in an inventory.\r\n//\r\n\r\nexport interface Item {\r\n readonly type: ItemType,\r\n}\r\n\r\nexport class WeaponItem implements Item {\r\n /**\r\n * Integer from 0 to 100.\r\n */\r\n @observable attribute: number = 0;\r\n /**\r\n * Integer from 0 to 100.\r\n */\r\n @observable hit: number = 0;\r\n @observable grind: number = 0;\r\n\r\n @computed get grindAtp(): number {\r\n return 2 * this.grind;\r\n }\r\n\r\n constructor(\r\n readonly type: WeaponItemType,\r\n ) { }\r\n}\r\n\r\nexport class ArmorItem implements Item {\r\n constructor(\r\n readonly type: ArmorItemType,\r\n ) { }\r\n}\r\n\r\nexport class ShieldItem implements Item {\r\n constructor(\r\n readonly type: ShieldItemType,\r\n ) { }\r\n}\r\n\r\nexport class UnitItem implements Item {\r\n constructor(\r\n readonly type: UnitItemType,\r\n ) { }\r\n}\r\n\r\nexport class ToolItem implements Item {\r\n constructor(\r\n readonly type: ToolItemType,\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","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/quest/dat';\r\nimport { NpcType } from './NpcType';\r\nimport { ObjectType } from './ObjectType';\r\nimport { enumValues } from '../enums';\r\nimport { ItemType } from './items';\r\n\r\nexport * from './items';\r\nexport * from './NpcType';\r\nexport * 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\ntype ItemDrop = {\r\n itemType: ItemType,\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 itemType: ItemType,\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 episode: Episode;\r\n readonly quest: SimpleQuest;\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.episode = quest.episode;\r\n this.quest = quest;\r\n this.enemyCounts = quest.enemyCounts;\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 episode: Episode,\r\n public readonly enemyCounts: Map<NpcType, number>\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 (!enemyCounts) throw new Error('enemyCounts 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 set value(value: T) {\r\n this._value = 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 Logger from 'js-logger';\r\nimport { autorun, IReactionDisposer, observable } from \"mobx\";\r\nimport { HuntMethod, NpcType, Server, SimpleQuest } from \"../domain\";\r\nimport { QuestDto } from \"../dto\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\n\r\nconst logger = Logger.get('stores/HuntMethodStore');\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 storageDisposer?: IReactionDisposer;\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()}.json`\r\n );\r\n const quests = await response.json() as QuestDto[];\r\n const methods = new Array<HuntMethod>();\r\n\r\n for (const quest of quests) {\r\n let totalCount = 0;\r\n const enemyCounts = new Map<NpcType, number>();\r\n\r\n for (const [code, count] of Object.entries(quest.enemyCounts)) {\r\n const npcType = NpcType.byCode(code);\r\n\r\n if (!npcType) {\r\n logger.error(`No NpcType found for code ${code}.`);\r\n } else {\r\n enemyCounts.set(npcType, count);\r\n totalCount += count;\r\n }\r\n }\r\n\r\n // Filter out some quests.\r\n /* eslint-disable no-fallthrough */\r\n switch (quest.id) {\r\n // The following quests are left out because their enemies don't drop anything.\r\n case 31: // Black Paper's Dangerous Deal\r\n case 34: // Black Paper's Dangerous Deal 2\r\n case 1305: // Maximum Attack S (Ep. 1)\r\n case 1306: // Maximum Attack S (Ep. 2)\r\n case 1307: // Maximum Attack S (Ep. 4)\r\n case 313: // Beyond the Horizon\r\n\r\n // MAXIMUM ATTACK 3 Ver2 is filtered out because its actual enemy count depends on the path taken.\r\n // TODO: generate a method per path.\r\n case 314:\r\n continue;\r\n }\r\n\r\n methods.push(\r\n new HuntMethod(\r\n `q${quest.id}`,\r\n quest.name,\r\n new SimpleQuest(\r\n quest.id,\r\n quest.name,\r\n quest.episode,\r\n enemyCounts\r\n ),\r\n /^\\d-\\d.*/.test(quest.name) ? 0.75 : (totalCount > 400 ? 0.75 : 0.5)\r\n )\r\n );\r\n }\r\n\r\n this.loadFromLocalStorage(methods, server);\r\n return methods;\r\n }\r\n\r\n private loadFromLocalStorage = (methods: HuntMethod[], server: Server) => {\r\n try {\r\n const methodUserTimesJson = localStorage.getItem(\r\n `HuntMethodStore.methodUserTimes.${Server[server]}`\r\n );\r\n\r\n if (methodUserTimesJson) {\r\n const userTimes = JSON.parse(methodUserTimesJson);\r\n\r\n for (const method of methods) {\r\n method.userTime = userTimes[method.id] as number;\r\n }\r\n }\r\n\r\n if (this.storageDisposer) {\r\n this.storageDisposer();\r\n }\r\n\r\n this.storageDisposer = autorun(() =>\r\n this.storeInLocalStorage(methods, server)\r\n );\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n }\r\n\r\n private storeInLocalStorage = (methods: HuntMethod[], server: Server) => {\r\n try {\r\n const userTimes: any = {};\r\n\r\n for (const method of methods) {\r\n if (method.userTime != null) {\r\n userTimes[method.id] = method.userTime;\r\n }\r\n }\r\n\r\n localStorage.setItem(\r\n `HuntMethodStore.methodUserTimes.${Server[server]}`,\r\n JSON.stringify(userTimes)\r\n );\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n }\r\n}\r\n\r\nexport const huntMethodStore = new HuntMethodStore();\r\n","import { observable } from \"mobx\";\r\nimport { ItemType, Server, WeaponItemType, ArmorItemType, ShieldItemType, ToolItemType, UnitItemType } from \"../domain\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport { ItemTypeDto } from \"../dto\";\r\n\r\nclass ItemTypeStore {\r\n private idToItemType: Array<ItemType> = [];\r\n\r\n @observable itemTypes: Array<ItemType> = [];\r\n\r\n getById(id: number): ItemType | undefined {\r\n return this.idToItemType[id];\r\n }\r\n\r\n load = async (server: Server): Promise<ItemTypeStore> => {\r\n const response = await fetch(\r\n `${process.env.PUBLIC_URL}/itemTypes.${Server[server].toLowerCase()}.json`\r\n );\r\n const data: Array<ItemTypeDto> = await response.json();\r\n\r\n const itemTypes = new Array<ItemType>();\r\n\r\n for (const itemTypeDto of data) {\r\n let itemType: ItemType;\r\n\r\n switch (itemTypeDto.class) {\r\n case 'weapon':\r\n itemType = new WeaponItemType(\r\n itemTypeDto.id,\r\n itemTypeDto.name,\r\n itemTypeDto.minAtp,\r\n itemTypeDto.maxAtp,\r\n itemTypeDto.ata,\r\n itemTypeDto.maxGrind,\r\n itemTypeDto.requiredAtp,\r\n );\r\n break;\r\n case 'armor':\r\n itemType = new ArmorItemType(\r\n itemTypeDto.id,\r\n itemTypeDto.name,\r\n itemTypeDto.atp,\r\n itemTypeDto.ata,\r\n itemTypeDto.minEvp,\r\n itemTypeDto.maxEvp,\r\n itemTypeDto.minDfp,\r\n itemTypeDto.maxDfp,\r\n itemTypeDto.mst,\r\n itemTypeDto.hp,\r\n itemTypeDto.lck,\r\n );\r\n break;\r\n case 'shield':\r\n itemType = new ShieldItemType(\r\n itemTypeDto.id,\r\n itemTypeDto.name,\r\n itemTypeDto.atp,\r\n itemTypeDto.ata,\r\n itemTypeDto.minEvp,\r\n itemTypeDto.maxEvp,\r\n itemTypeDto.minDfp,\r\n itemTypeDto.maxDfp,\r\n itemTypeDto.mst,\r\n itemTypeDto.hp,\r\n itemTypeDto.lck,\r\n );\r\n break;\r\n case 'unit':\r\n itemType = new UnitItemType(\r\n itemTypeDto.id,\r\n itemTypeDto.name,\r\n );\r\n break;\r\n case 'tool':\r\n itemType = new ToolItemType(\r\n itemTypeDto.id,\r\n itemTypeDto.name,\r\n );\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n this.idToItemType[itemType.id] = itemType;\r\n itemTypes.push(itemType);\r\n }\r\n\r\n this.itemTypes = itemTypes;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport const itemTypeStores: ServerMap<Loadable<ItemTypeStore>> = new ServerMap(server => {\r\n const store = new ItemTypeStore();\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 } from \"../domain\";\r\nimport { NpcTypes } from \"../domain/NpcType\";\r\nimport { EnemyDropDto } from \"../dto\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { itemTypeStores } from \"./ItemTypeStore\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('stores/ItemDropStore');\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 ItemType ids to EnemyDrops.\r\n private itemTypeToDrops: Array<Array<EnemyDrop>> = [];\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.itemTypeToDrops[drop.itemType.id];\r\n\r\n if (!drops) {\r\n drops = [];\r\n this.itemTypeToDrops[drop.itemType.id] = drops;\r\n }\r\n\r\n drops.push(drop);\r\n }\r\n\r\n getDropsForItemType(itemTypeId: number): Array<EnemyDrop> {\r\n return this.itemTypeToDrops[itemTypeId] || [];\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 itemTypeStore = await itemTypeStores.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 logger.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 itemType = itemTypeStore.getById(dropDto.itemTypeId);\r\n\r\n if (!itemType) {\r\n logger.warn(`Couldn't find item kind ${dropDto.itemTypeId}.`);\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 logger.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 itemType,\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, ItemType, KONDRIEU_PROB, NpcType, RARE_ENEMY_PROB, SectionId, SectionIds, Server, Episode } from \"../domain\";\r\nimport { applicationStore } from './ApplicationStore';\r\nimport { huntMethodStore } from \"./HuntMethodStore\";\r\nimport { itemDropStores } from './ItemDropStore';\r\nimport { itemTypeStores } from './ItemTypeStore';\r\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('stores/HuntOptimizerStore');\r\n\r\nexport class WantedItem {\r\n @observable readonly itemType: ItemType;\r\n @observable amount: number;\r\n\r\n constructor(itemType: ItemType, amount: number) {\r\n this.itemType = itemType;\r\n this.amount = amount;\r\n }\r\n}\r\n\r\nexport class OptimalResult {\r\n constructor(\r\n readonly wantedItems: Array<ItemType>,\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 methodEpisode: Episode,\r\n readonly methodTime: number,\r\n readonly runs: number,\r\n readonly itemCounts: Map<ItemType, number>\r\n ) {\r\n this.totalTime = runs * methodTime;\r\n }\r\n}\r\n\r\n// TODO: take into account mothmants spawned from mothverts.\r\n// TODO: take into account split slimes.\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 huntableItemTypes(): Array<ItemType> {\r\n const itemDropStore = itemDropStores.current.value;\r\n return itemTypeStores.current.value.itemTypes.filter(i =>\r\n itemDropStore.enemyDrops.getDropsForItemType(i.id).length\r\n );\r\n }\r\n\r\n // TODO: wanted items per server.\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 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.itemType));\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.itemType.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, count] of method.enemyCounts.entries()) {\r\n const oldCount = counts.get(enemy) || 0;\r\n\r\n if (enemy.rareType == null) {\r\n counts.set(enemy, oldCount + count);\r\n } else {\r\n let rate, rareRate;\r\n\r\n if (enemy.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, oldCount + count * rate);\r\n counts.set(\r\n enemy.rareType,\r\n (counts.get(enemy.rareType) || 0) + count * rareRate\r\n );\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.itemType)) {\r\n const value = variable[drop.itemType.name] || 0;\r\n variable[drop.itemType.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<ItemType, 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.episode,\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 private initialize = async () => {\r\n try {\r\n await this.loadFromLocalStorage();\r\n autorun(this.storeInLocalStorage);\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n }\r\n\r\n private 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 itemTypeStores.current.promise;\r\n const wi = JSON.parse(wantedItemsJson);\r\n\r\n const wantedItems: WantedItem[] = [];\r\n\r\n for (const { itemTypeId, itemKindId, amount } of wi) {\r\n const item = itemTypeId != null\r\n ? itemStore.getById(itemTypeId)\r\n : itemStore.getById(itemKindId); // Legacy name.\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 private storeInLocalStorage = () => {\r\n try {\r\n localStorage.setItem(\r\n `HuntOptimizerStore.wantedItems.${Server[applicationStore.currentServer]}`,\r\n JSON.stringify(\r\n this.wantedItems.map(({ itemType, amount }) => ({\r\n itemTypeId: itemType.id,\r\n amount\r\n }))\r\n )\r\n );\r\n } catch (e) {\r\n logger.error(e);\r\n }\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 { itemTypeStores } from \"../../stores/ItemTypeStore\";\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.huntableItemTypes.map(itemType => ({\r\n label: itemType.name,\r\n value: itemType.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).itemType.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.itemType.id === selected.value);\r\n\r\n if (!added) {\r\n const itemType = itemTypeStores.current.value.getById(selected.value)!;\r\n huntOptimizerStore.wantedItems.push(new WantedItem(itemType, 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 combination of hunt methods 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.\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, SortDirectionType, SortDirection } from \"react-virtualized\";\r\nimport \"./BigTable.less\";\r\n\r\nexport type Column<T> = {\r\n key?: string,\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 sortable?: boolean\r\n}\r\n\r\nexport type ColumnSort<T> = { column: Column<T>, direction: SortDirectionType }\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 sort?: (sortColumns: Array<ColumnSort<T>>) => void\r\n}> {\r\n private sortColumns = new Array<ColumnSort<T>>();\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 sortIndicator: 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\r\n if (column.sortable) {\r\n classes.push('sortable');\r\n\r\n const sort = this.sortColumns[0];\r\n\r\n if (sort && sort.column === column) {\r\n if (sort.direction === SortDirection.ASC) {\r\n sortIndicator = (\r\n <svg className=\"DataTable-sort-indictator\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 14l5-5 5 5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n );\r\n } else {\r\n sortIndicator = (\r\n <svg className=\"DataTable-sort-indictator\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n );\r\n }\r\n }\r\n }\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 const onClick = rowIndex === 0 && column.sortable\r\n ? () => this.headerClicked(column)\r\n : undefined;\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 onClick={onClick}\r\n >\r\n {typeof cell === 'string' ? (\r\n <span className=\"DataTable-cell-text\">{cell}</span>\r\n ) : cell}\r\n {sortIndicator}\r\n </div>\r\n );\r\n }\r\n\r\n private headerClicked = (column: Column<T>) => {\r\n const oldIndex = this.sortColumns.findIndex(sc => sc.column === column);\r\n let old = oldIndex === -1 ? undefined : this.sortColumns.splice(oldIndex, 1)[0];\r\n\r\n const direction = oldIndex === 0 && old!.direction === SortDirection.ASC\r\n ? SortDirection.DESC\r\n : SortDirection.ASC\r\n\r\n this.sortColumns.unshift({ column, direction });\r\n this.sortColumns.splice(10);\r\n\r\n if (this.props.sort) {\r\n this.props.sort(this.sortColumns);\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}","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, Episode, SectionId } from \"../../domain\";\r\nimport { huntOptimizerStore, OptimalMethod } from \"../../stores/HuntOptimizerStore\";\r\nimport { BigTable, Column } 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: 'Ep.',\r\n width: 34,\r\n cellRenderer: (result) => Episode[result.methodEpisode],\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={4}\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","/**\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 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, SortDirection } from \"react-virtualized\";\r\nimport { Episode, HuntMethod } from \"../../domain\";\r\nimport { EnemyNpcTypes, NpcType } from \"../../domain/NpcType\";\r\nimport { huntMethodStore } from \"../../stores/HuntMethodStore\";\r\nimport { BigTable, Column, ColumnSort } from \"../BigTable\";\r\nimport \"./MethodsComponent.css\";\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 key: 'name',\r\n name: 'Method',\r\n width: 250,\r\n cellRenderer: (method) => method.name,\r\n sortable: true,\r\n },\r\n {\r\n key: 'episode',\r\n name: 'Ep.',\r\n width: 34,\r\n cellRenderer: (method) => Episode[method.episode],\r\n sortable: true,\r\n },\r\n {\r\n key: 'time',\r\n name: 'Time',\r\n width: 50,\r\n cellRenderer: (method) => <TimeComponent method={method} />,\r\n className: 'integrated',\r\n sortable: true,\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 key: enemy.code,\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 sortable: true,\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={3}\r\n record={this.record}\r\n sort={this.sort}\r\n updateTrigger={huntMethodStore.methods.current.value}\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 private sort = (sorts: ColumnSort<HuntMethod>[]) => {\r\n const methods = huntMethodStore.methods.current.value.slice();\r\n\r\n methods.sort((a, b) => {\r\n for (const { column, direction } of sorts) {\r\n let cmp = 0;\r\n\r\n if (column.key === 'name') {\r\n cmp = a.name.localeCompare(b.name);\r\n } else if (column.key === 'episode') {\r\n cmp = a.episode - b.episode;\r\n } else if (column.key === 'time') {\r\n cmp = a.time - b.time;\r\n } else if (column.key) {\r\n const type = NpcType.byCode(column.key);\r\n\r\n if (type) {\r\n cmp = (a.enemyCounts.get(type) || 0) - (b.enemyCounts.get(type) || 0);\r\n }\r\n }\r\n\r\n if (cmp !== 0) {\r\n return direction === SortDirection.ASC ? cmp : -cmp;\r\n }\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n huntMethodStore.methods.current.value = methods;\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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/geometry');\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 // logger.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 // logger.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 logger.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 // logger.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 logger.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 // logger.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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/ninja/nj');\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 logger.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\nimport { ArrayBufferCursor } from '../../ArrayBufferCursor';\r\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/compression/prs/decompress');\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 logger.error(`offset was ${offset}, should be between -8192 and 0.`);\r\n }\r\n\r\n if (length < 1 || length > 256) {\r\n logger.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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/quest/dat');\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 flags: number;\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 logger.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(4);\r\n const flags = cursor.f32();\r\n const unknown4 = cursor.u8Array(12);\r\n const skin = cursor.u32();\r\n const unknown5 = 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 flags,\r\n unknown: [unknown1, unknown2, unknown3, unknown4, unknown5]\r\n });\r\n }\r\n\r\n const bytesRead = cursor.position - startPosition;\r\n\r\n if (bytesRead !== entitiesSize) {\r\n logger.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.writeF32(npc.flags);\r\n cursor.writeU8Array(npc.unknown[3]);\r\n cursor.writeU32(npc.skin);\r\n cursor.writeU8Array(npc.unknown[4]);\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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/quest/bin');\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, lenient: boolean = false): 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 logger.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 lenient\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, lenient: boolean): Instruction[] {\r\n const instructions = [];\r\n\r\n try {\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 let [, mnemonic, mask] = list[opcode];\r\n\r\n if (mask == null) {\r\n let fullOpcode = mainOpcode;\r\n\r\n if (mainOpcode === 0xF8 || mainOpcode === 0xF9) {\r\n fullOpcode = (fullOpcode << 8) | opcode;\r\n }\r\n\r\n logger.warn(`Parameters unknown for opcode 0x${fullOpcode.toString(16).toUpperCase()}, assuming 0.`);\r\n\r\n instructions.push({\r\n opcode,\r\n mnemonic,\r\n args: [],\r\n size: opsize\r\n });\r\n } else {\r\n try {\r\n const opargs = parseInstructionArguments(cursor, mask);\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 } catch (e) {\r\n instructions.push({\r\n opcode,\r\n mnemonic,\r\n args: [],\r\n size: opsize\r\n });\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n if (lenient) {\r\n logger.error(\"Couldn't fully parse object code.\", e);\r\n } else {\r\n throw e;\r\n }\r\n }\r\n\r\n return instructions;\r\n}\r\n\r\nfunction parseInstructionArguments(\r\n cursor: ArrayBufferCursor,\r\n mask: string\r\n): { args: any[], size: number } {\r\n const oldPos = cursor.position;\r\n const args = [];\r\n let argsSize: number;\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 break;\r\n case 'W':\r\n args.push(cursor.u16());\r\n break;\r\n case 'L':\r\n args.push(cursor.u32());\r\n break;\r\n\r\n // Signed integers\r\n case 'I':\r\n args.push(cursor.i32());\r\n break;\r\n\r\n // Floats\r\n case 'f':\r\n case 'F':\r\n args.push(cursor.f32());\r\n break;\r\n\r\n // Registers?\r\n case 'R':\r\n case 'r':\r\n cursor.seek(1);\r\n break;\r\n\r\n // Registers with unsigned integers?\r\n case 'b':\r\n args.push(cursor.u8());\r\n break;\r\n case 'w':\r\n args.push(cursor.u16());\r\n break;\r\n case 'l':\r\n args.push(cursor.u32());\r\n break;\r\n\r\n // Registers with signed integers?\r\n case 'i':\r\n args.push(cursor.i32());\r\n break;\r\n\r\n // Variably sized data?\r\n case 'j':\r\n case 'J':\r\n argsSize = 2 * cursor.u8();\r\n cursor.seek(argsSize);\r\n break;\r\n case 't':\r\n case 'T':\r\n argsSize = cursor.u8();\r\n cursor.seek(argsSize);\r\n break;\r\n\r\n // Strings\r\n case 's':\r\n case 'S':\r\n while (cursor.u16()) { }\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 return { args, size: cursor.position - oldPos };\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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/quest/qst');\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 logger.error(`Can't parse ${version} QST files.`);\r\n return undefined;\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 >= 1056) {\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 logger.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 logger.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 if (cursor.bytesLeft) {\r\n logger.warn(`${cursor.bytesLeft} Bytes left in file.`);\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 logger.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 logger.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 area(15, 'BA Ruins', order++, 3),\r\n area(16, 'BA Spaceship', order++, 3),\r\n area(17, 'Lobby', order++, 15),\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, DatFile } 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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('bin-data/parsing/quest');\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, lenient: boolean = false): 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 const fileName = file.name.trim().toLowerCase();\r\n\r\n if (fileName.endsWith('.dat')) {\r\n datFile = file;\r\n } else if (fileName.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 logger.error('File contains no DAT file.');\r\n return;\r\n }\r\n\r\n if (!binFile) {\r\n logger.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), lenient);\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(dat, episode, func0Ops, lenient);\r\n } else {\r\n logger.warn(`Function 0 offset ${bin.functionOffsets[0]} is invalid.`);\r\n }\r\n } else {\r\n logger.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 logger.debug('Function 0 has no set_episode instruction.');\r\n return 1;\r\n }\r\n}\r\n\r\nfunction getAreaVariants(\r\n dat: DatFile,\r\n episode: number,\r\n func0Ops: Instruction[],\r\n lenient: boolean\r\n): AreaVariant[] {\r\n // Add area variants that have npcs or objects even if there are no BB_Map_Designate instructions for them.\r\n const areaVariants = new Map();\r\n\r\n for (const npc of dat.npcs) {\r\n areaVariants.set(npc.areaId, 0);\r\n }\r\n\r\n for (const obj of dat.objs) {\r\n areaVariants.set(obj.areaId, 0);\r\n }\r\n\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 const areaVariantsArray = new Array<AreaVariant>();\r\n\r\n for (const [areaId, variantId] of areaVariants.entries()) {\r\n try {\r\n areaVariantsArray.push(\r\n areaStore.getVariant(episode, areaId, variantId)\r\n );\r\n } catch (e) {\r\n if (lenient) {\r\n logger.error(`Unknown area variant.`, e);\r\n } else {\r\n throw e;\r\n }\r\n }\r\n }\r\n\r\n // Sort by area order and then variant id.\r\n return areaVariantsArray.sort((a, b) =>\r\n 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, flags, skin, areaId }: DatNpc): NpcType {\r\n const regular = Math.abs(flags - 1) > 0.00001;\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 `${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 `${0x061}, 1`: return areaId > 15 ? NpcType.DelLily : (\r\n regular ? NpcType.PoisonLily : NpcType.NarLily);\r\n case `${0x061}, 2`: return areaId > 15 ? NpcType.DelLily : (\r\n regular ? NpcType.PoisonLily2 : NpcType.NarLily2);\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 undefined and we use the raw data from the DAT file.\r\n const typeData = npcTypeToDatData(npc.type);\r\n let flags = npc.dat.flags;\r\n\r\n if (typeData) {\r\n flags = (npc.dat.flags & ~0x800000) | (typeData.regular ? 0 : 0x800000);\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 flags,\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\nimport Logger from 'js-logger';\r\n\r\nconst logger = Logger.get('stores/QuestEditorStore');\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 logger.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 logger.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 logger.error(e);\r\n }\r\n }\r\n }\r\n } else {\r\n logger.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 logger.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 // Make sure it doesn't do a POST:\r\n customRequest={() => false}\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\nimport { WeaponItem, WeaponItemType, ArmorItemType, ShieldItemType } from \"../domain\";\r\nimport { itemTypeStores } from \"./ItemTypeStore\";\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 Weapon {\r\n readonly item: WeaponItem;\r\n\r\n @computed get shiftaAtp(): number {\r\n if (this.item.type.minAtp === this.item.type.maxAtp) {\r\n return 0;\r\n } else {\r\n return this.item.type.maxAtp * this.store.shiftaFactor;\r\n }\r\n }\r\n\r\n @computed get minAtp(): number {\r\n return this.item.type.minAtp + this.item.grindAtp;\r\n }\r\n\r\n @computed get maxAtp(): number {\r\n return this.item.type.maxAtp + this.item.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 item: WeaponItem,\r\n ) {\r\n this.item = item;\r\n }\r\n}\r\n\r\nclass DpsCalcStore {\r\n @computed get weaponTypes(): WeaponItemType[] {\r\n return itemTypeStores.current.value.itemTypes.filter(it =>\r\n it instanceof WeaponItemType\r\n ) as WeaponItemType[];\r\n }\r\n\r\n @computed get armorTypes(): ArmorItemType[] {\r\n return itemTypeStores.current.value.itemTypes.filter(it =>\r\n it instanceof ArmorItemType\r\n ) as ArmorItemType[];\r\n }\r\n\r\n @computed get shieldTypes(): ShieldItemType[] {\r\n return itemTypeStores.current.value.itemTypes.filter(it =>\r\n it instanceof ShieldItemType\r\n ) as ShieldItemType[];\r\n }\r\n\r\n //\r\n // Character Details\r\n //\r\n\r\n @observable charAtp: number = 0;\r\n @observable magPow: number = 0;\r\n @computed get armorAtp(): number { return this.armorType ? this.armorType.atp : 0 }\r\n @computed get shieldAtp(): number { return this.shieldType ? this.shieldType.atp : 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 addWeapon = (type: WeaponItemType) => {\r\n this.weapons.push(new Weapon(\r\n this,\r\n new WeaponItem(type)\r\n ));\r\n }\r\n\r\n @observable armorType?: ArmorItemType;\r\n @observable shieldType?: ShieldItemType;\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 { WeaponItemType, ArmorItemType, ShieldItemType } from \"../../domain\";\r\nimport { dpsCalcStore } from \"../../stores/DpsCalcStore\";\r\nimport { itemTypeStores } from \"../../stores/ItemTypeStore\";\r\nimport { BigSelect } from \"../BigSelect\";\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>Weapons:</div>\r\n <BigSelect\r\n placeholder=\"Add a weapon\"\r\n value={undefined}\r\n options={dpsCalcStore.weaponTypes.map(wt => ({\r\n label: wt.name,\r\n value: wt.id\r\n }))}\r\n onChange={this.addWeapon}\r\n />\r\n <table>\r\n <thead>\r\n <tr>\r\n <td>Weapon</td>\r\n <td>Min. ATP</td>\r\n <td>Max. ATP</td>\r\n <td>Grind</td>\r\n <td>Grind ATP</td>\r\n <td>Shifta ATP</td>\r\n <td>Final Min. ATP</td>\r\n <td>Final Max. ATP</td>\r\n <td>Min. Normal Damage</td>\r\n <td>Max. Normal Damage</td>\r\n <td>Avg. Normal Damage</td>\r\n <td>Min. Heavy Damage</td>\r\n <td>Max. Heavy Damage</td>\r\n <td>Avg. Heavy Damage</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {dpsCalcStore.weapons.map((weapon, i) => (\r\n <tr key={i}>\r\n <td>{weapon.item.type.name}</td>\r\n <td>{weapon.item.type.minAtp}</td>\r\n <td>{weapon.item.type.maxAtp}</td>\r\n <td>\r\n <InputNumber\r\n size=\"small\"\r\n value={weapon.item.grind}\r\n min={0}\r\n max={weapon.item.type.maxGrind}\r\n step={1}\r\n onChange={(value) => weapon.item.grind = value || 0}\r\n />\r\n </td>\r\n <td>{weapon.item.grindAtp}</td>\r\n <td>{weapon.shiftaAtp.toFixed(1)}</td>\r\n <td>{weapon.finalMinAtp.toFixed(1)}</td>\r\n <td>{weapon.finalMaxAtp.toFixed(1)}</td>\r\n <td>{weapon.minNormalDamage.toFixed(1)}</td>\r\n <td>{weapon.maxNormalDamage.toFixed(1)}</td>\r\n <td>{weapon.avgNormalDamage.toFixed(1)}</td>\r\n <td>{weapon.minHeavyDamage.toFixed(1)}</td>\r\n <td>{weapon.maxHeavyDamage.toFixed(1)}</td>\r\n <td>{weapon.avgHeavyDamage.toFixed(1)}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\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:</div>\r\n <BigSelect\r\n placeholder=\"Choose an armor\"\r\n value={dpsCalcStore.armorType && dpsCalcStore.armorType.id}\r\n options={dpsCalcStore.armorTypes.map(at => ({\r\n label: at.name,\r\n value: at.id\r\n }))}\r\n onChange={this.armorChanged}\r\n />\r\n <span>Armor ATP: {dpsCalcStore.armorAtp}</span>\r\n <div>Shield:</div>\r\n <BigSelect\r\n placeholder=\"Choose a shield\"\r\n value={dpsCalcStore.shieldType && dpsCalcStore.shieldType.id}\r\n options={dpsCalcStore.shieldTypes.map(st => ({\r\n label: st.name,\r\n value: st.id\r\n }))}\r\n onChange={this.shieldChanged}\r\n />\r\n <span>Shield ATP: {dpsCalcStore.shieldAtp}</span>\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 private addWeapon = (selected: any) => {\r\n if (selected) {\r\n let type = itemTypeStores.current.value.getById(selected.value)!;\r\n dpsCalcStore.addWeapon(type as WeaponItemType);\r\n }\r\n }\r\n\r\n private armorChanged = (selected: any) => {\r\n if (selected) {\r\n let type = itemTypeStores.current.value.getById(selected.value)!;\r\n dpsCalcStore.armorType = (type as ArmorItemType);\r\n } else {\r\n dpsCalcStore.armorType = undefined;\r\n }\r\n }\r\n\r\n private shieldChanged = (selected: any) => {\r\n if (selected) {\r\n let type = itemTypeStores.current.value.getById(selected.value)!;\r\n dpsCalcStore.shieldType = (type as ShieldItemType);\r\n } else {\r\n dpsCalcStore.shieldType = undefined;\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 Logger from \"js-logger\";\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\nLogger.useDefaults({\r\n defaultLevel: (Logger as any)[process.env['REACT_APP_LOG_LEVEL'] || 'OFF']\r\n});\r\n\r\nReactDOM.render(\r\n <ApplicationComponent />,\r\n document.getElementById('phantasmal-world-root')\r\n);\r\n"],"sourceRoot":""} |