mirror of
https://github.com/DaanVandenBosch/phantasmal-world.git
synced 2025-04-07 16:58:26 +08:00
1 line
698 KiB
Plaintext
1 line
698 KiB
Plaintext
{"version":3,"sources":["data_formats/BufferCursor.ts","ui/ErrorBoundary.tsx","enums.ts","data_formats/Vec3.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","data_formats/parsing/geometry.ts","stores/binary_assets.ts","stores/AreaStore.ts","data_formats/compression/prs/compress.ts","data_formats/compression/prs/decompress.ts","data_formats/parsing/quest/bin.ts","data_formats/parsing/quest/dat.ts","data_formats/parsing/quest/qst.ts","data_formats/parsing/quest/index.ts","rendering/entities.ts","rendering/index.ts","rendering/models.ts","data_formats/parsing/ninja/nj.ts","data_formats/parsing/ninja/xj.ts","data_formats/parsing/ninja/index.ts","stores/EntityStore.ts","stores/QuestEditorStore.ts","ui/quest_editor/EntityInfoComponent.tsx","ui/quest_editor/QuestInfoComponent.tsx","rendering/QuestRenderer.ts","rendering/Renderer.ts","data_formats/parsing/ninja/motion.ts","ui/quest_editor/RendererComponent.tsx","ui/quest_editor/QuestEditorComponent.tsx","stores/DpsCalcStore.ts","ui/dps_calc/DpsCalcComponent.tsx","rendering/animation.ts","stores/ModelViewerStore.ts","rendering/ModelRenderer.ts","ui/model_viewer/AnimationSelectionComponent.tsx","ui/model_viewer/ModelSelectionComponent.tsx","ui/model_viewer/RendererComponent.tsx","ui/model_viewer/ModelViewerComponent.tsx","ui/ApplicationComponent.tsx","index.tsx"],"names":["ASCII_DECODER","TextDecoder","UTF_16BE_DECODER","UTF_16LE_DECODER","ASCII_ENCODER","TextEncoder","UTF_16BE_ENCODER","UTF_16LE_ENCODER","BufferCursor","buffer_or_capacity","little_endian","arguments","length","undefined","Object","C_Users_Daan_code_phantasmal_world_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__","this","_size","position","_little_endian","buffer","dv","utf16_decoder","utf16_encoder","ArrayBuffer","size","byteLength","Buffer","Error","DataView","C_Users_Daan_code_phantasmal_world_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__","key","get","set","ensure_capacity","value","offset","seek_start","concat","getUint8","r","getUint16","getUint32","getInt8","getInt16","getInt32","getFloat32","n","array","i","push","slice","max_byte_length","null_terminated","drop_remaining","string_length","index_of_u8","decode","Math","min","index_of_u16","floor","setUint8","setUint16","setUint32","setInt32","setFloat32","Uint8Array","other","str","byte_length","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","encode","Symbol","iterator","next","done","byte","write_u8","err","return","max_pos","min_new_size","capacity","new_size","new_buffer","ErrorBoundary","_Component","_getPrototypeOf2","_this","classCallCheck","_len","args","Array","_key","possibleConstructorReturn","getPrototypeOf","call","apply","state","has_error","inherits","createClass","react_default","a","createElement","className","es_alert","type","message","props","children","Component","with_error_boundary","ComponentErrorBoundary","ErrorBoundary_ErrorBoundary","displayName","enum_values","e","values","number_values","filter","v","EnumMap","enum_","initial_value","keys","Map","Vec3","x","y","z","WeaponItemType","id","name","min_atp","max_atp","ata","max_grind","required_atp","ArmorItemType","atp","min_evp","max_evp","min_dfp","max_dfp","mst","hp","lck","ShieldItemType","UnitItemType","ToolItemType","WeaponItem","_class","initializerDefineProperty","_descriptor","_descriptor2","_descriptor3","grind","applyDecoratedDescriptor","prototype","observable","configurable","enumerable","writable","initializer","computed","getOwnPropertyDescriptor","NpcType","code","simple_name","ultimate_name","episode","enemy","rare_type","Number","isInteger","by_code_map","map","by_ep_and_name","check_episode","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","pso_id","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","Section","domain_class","y_axis_rotation","domain_descriptor","domain_descriptor2","sin","cos","Quest","_class3","short_description","long_description","area_variants","objects","npcs","dat_unknowns","bin_data","domain_descriptor3","_descriptor4","_descriptor5","_descriptor6","_descriptor7","_descriptor8","_descriptor9","_descriptor10","QuestEntity","_class5","area_id","section_id","rotation","_descriptor11","_section_id","_descriptor12","_descriptor13","_descriptor14","_descriptor15","section","_this$position","relX","relY","relZ","sin_y_axis_rotation","cos_y_axis_rotation","sectPos","rotZ","QuestObject","_class7","_QuestEntity","dat","_descriptor16","assertThisInitialized","QuestNpc","_class9","_QuestEntity2","_this2","_descriptor17","Area","order","AreaVariant","_class11","area","_descriptor18","EnemyDrop","difficulty","npc_type","item_type","anything_rate","rare_rate","rate","HuntMethod","_class13","quest","default_time","enemy_counts","_descriptor19","user_time","SimpleQuest","PlayerModel","head_style_count","hair_styles_count","hair_styles_with_accessory","PlayerAnimation","application_store","Ephinea","Loadable","Loadable_class","load","Loadable_descriptor","Loadable_descriptor2","Loadable_descriptor3","_load","Loadable_descriptor4","_value","load_value","_load_value","asyncToGenerator","regenerator_default","mark","_callee","wrap","_context","prev","is_loading","abrupt","_promise","_state","Initializing","sent","Nominal","_error","t0","stop","Uninitialized","defer","Reloading","Promise","resolve","ServerMap","ServerMap_class","_EnumMap","current_server","logger","Logger","hunt_method_store","storage_disposer","load_from_local_storage","methods","server","method_user_times_json","localStorage","getItem","user_times","JSON","parse","method","autorun","store_in_local_storage","error","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","setItem","stringify","fetch","process","toLowerCase","response","json","quests","total_count","_i","_Object$entries","entries","enemyCounts","_ref3","_ref2","slicedToArray","count","by_code","test","load_hunt_methods","ItemTypeStore","ItemTypeStore_class","id_to_item_type","ItemTypeStore_descriptor","_ref","data","item_types","item_type_dto","class","minAtp","maxAtp","maxGrind","requiredAtp","minEvp","maxEvp","minDfp","maxDfp","t1","finish","_x","item_type_stores","store","EnemyDropTable","table","item_type_to_drops","drop","drops","item_type_id","ItemDropStore","_dec","ref","ItemDropStore_class","ItemDropStore_descriptor","item_drop_stores","item_type_store","drop_dto","current","promise","warn","get_by_id","itemTypeId","sectionId","set_drop","dropRate","rareRate","enemy_drops","WantedItem","HuntOptimizerStore_class","amount","HuntOptimizerStore_descriptor","HuntOptimizerStore_descriptor2","OptimalResult","wanted_items","optimal_methods","OptimalMethod","section_ids","method_name","method_episode","method_time","runs","item_counts","total_time","hunt_optimizer_store","HuntOptimizerStore","HuntOptimizerStore_descriptor3","HuntOptimizerStore_descriptor4","optimize","drop_table","constraints","wanted","variables","variable_details","_method","counts","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_iterator3","_step3","_ref9","_ref5","_count","old_count","counts_list","pan_arms_count","split_counts","pan_arms_2_count","_split_counts","_counts","split_pan_arms","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_iterator4","_step4","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_iterator5","_step5","variable","add_variable","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_iterator6","_step6","_ref8","_ref7","result","_ref10","variable_name","runs_or_other","details","_method2","_difficulty","_split_pan_arms","_variable","items","_i2","_Object$entries2","_ref13","_ref12","_item_name","expected_amount","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_iterator8","_step8","item","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_iterator7","_step7","sid","match_found","_i3","_Object$keys","_item_name2","Set","w","delete","time","get_drop","has","t2","full_method_name","t3","t4","t5","solver","Solve","opType","feasible","item_name","t6","t7","toConsumableArray","initialize","_callee2","_context2","_callee3","wanted_items_json","item_store","wi","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_iterator9","_step9","_ref17","itemKindId","_context3","replace","_ref18","itemType","item_drop_store","get_drops_for_item_type","BigSelect","_PureComponent","commonjs_default","assign","PureComponent","WantedItemsComponent","observer","WantedItemsComponent_class","help_visible","add_wanted","selected","find","remove_wanted","findIndex","splice","table_remove_cell_renderer","rowData","es_button","icon","onClick","no_rows_renderer","on_help_visible_change","visible","setState","helpVisible","popover","content","Help","trigger","onVisibleChange","BigSelect_BigSelect","placeholder","style","width","options","huntable_item_types","label","onChange","marginLeft","es","height","headerHeight","rowHeight","rowCount","rowGetter","index","noRowsRenderer","dataKey","cellRenderer","_ref4","WantedItemsComponent_WantedAmountCell","wantedItem","flexGrow","cellDataGetter","WantedAmountCell","wanted_amount_changed","_this3","input_number","max","BigTable","sort_columns","column_width","columns","cell_renderer","cell","sort_indicator","title","columnIndex","rowIndex","column","classes","sortable","sort","direction","SortDirection","ASC","viewBox","d","fill","class_name","footer","row_count","footer_value","footer_tooltip","record","tooltip","on_click","header_clicked","join","old_index","sc","old","DESC","unshift","fixedRowCount","overscanRowCount","overscan_row_count","columnWidth","columnCount","fixedColumnCount","fixed_column_count","overscanColumnCount","overscan_column_count","classNameTopLeftGrid","classNameTopRightGrid","updateTigger","update_trigger","SectionIdIcon","_ref$size","display","backgroundImage","backgroundSize","OptimizationResultComponent","_class2","BigTable_BigTable","total_runs","hours","h","m","round","toString","padStart","hours_to_string","toFixed","_loop","totalCount","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","React","TabPane","tabs","parse_c_rel","array_buffer","object","Object3D","materials","MeshBasicMaterial","color","transparent","opacity","MeshLambertMaterial","side","DoubleSide","wireframe_materials","wireframe","main_block_offset","main_offset_table_offset","block_geometry","Geometry","block_trailer_offset","vertex_count","vertex_table_offset","vertex_table_end","triangle_count","triangle_table_offset","triangle_table_end","j","vertices","Vector3","v1","v2","v3","flags","color_index","faces","Face3","mesh","Mesh","renderOrder","add","wireframe_mesh","parse_n_rel","sections","section_count","section_table_offset","section_x","section_y","section_z","section_rotation","PI","index_lists_list","position_lists_list","normal_lists_list","simple_geometry_offset_table_offset","simple_geometry_offset_count","geometry_offset","vertex_info_table_offset","vertex_info_count","triangle_strip_table_offset","triangle_strip_count","geom_index_lists","k","triangle_strip_index_table_offset","triangle_strip_index_count","triangle_strip_indices","l","vertex_size","geom_positions","geom_normals","n_x","n_y","n_z","rotated_x","rotated_z","_loop2","positions","normals","forEach","object_indices","geometry","BufferGeometry","addAttribute","Float32BufferAttribute","setIndex","Uint16BufferAttribute","setDrawMode","TriangleStripDrawMode","userData","object_3d","get_area_collision_data","area_version","get_area_asset","get_npc_data","_get_npc_data","url","npc_type_to_url","get_asset","get_object_data","_x2","_get_object_data","object_type","object_type_to_url","get_player_data","_x3","_x4","_x5","_get_player_data","player_class","body_part","no","player_class_to_url","get_player_animation_data","_x6","_get_player_animation_data","_callee4","animation_id","_context4","area_base_names","area_variant","episode_base_names","_episode_base_names$a","base_name","variants","variant","String","area_version_to_base_url","reject","then","arrayBuffer","_area$area_variants","varis","_","sections_cache","render_geometry_cache","collision_geometry_cache","area_store","AreaStore","areas","variant_id","get_area_sections_and_render_geometry","get_area_render_data","catch","compress","src","ctx","Context","hash_table","HashTable","bytes_left","set_bit","copy_literal","put","hash","seek","_ctx$find_longest_mat","find_longest_match","_ctx$find_longest_mat2","mlen","_ctx$find_longest_mat3","_ctx$find_longest_mat4","offset2","mlen2","write_literal","add_intermediates","write_eof","dst","MAX_WINDOW","WINDOW_MASK","HASH_SIZE","cursor","flag_bits_left","flag_offset","bit","pos","u8","writeFinalFlags","s2","uint8_array_view","len","s1","lazy","entry","hash_to_offset","longest_length","longest_match","match_length","entry_2","set_prev","masked_offset_to_prev","prevOffset","decompress","read_flag_bit","copy_u8","read_u8","read_u16","offset_copy","u16","buf_size","buf","take","write_cursor","parse_bin","lenient","object_code_offset","u32","function_offset_table_offset","quest_id","language","quest_name","string_utf16","function_offset_count","function_offsets","i32","instructions","main_opcode","opcode","opsize","list","f8_opcode_list","f9_opcode_list","opcode_list","_list$opcode","mnemonic","mask","full_opcode","toUpperCase","opargs","parse_instruction_arguments","parse_object_code","args_size","old_pos","outer","charAt","f32","OBJECT_SIZE","NPC_SIZE","parse_qst","version","version_a","version_b","headers","file_name","string_ascii","file_name_2","parse_headers","files","expected_sizes","start_position","chunk_no","file","expected_size","chunk_nos","chunk_position","from","actual_size","ceil","parse_files","header","name_2","write_qst","params","total_size","f","reduce","write_u16","write_string_ascii","write_u32","dot_pos","lastIndexOf","write_file_headers","write_file_chunk","write_file_chunks","write_u8_array","parse_quest","qst","dat_file","bin_file","trim","endsWith","objs","unknowns","entity_type","entities_size","object_count","type_id","unknown1","u8_array","unknown2","rotation_x","rotation_y","rotation_z","unknown3","unknown","bytes_read","npc_count","unknown4","skin","unknown5","parse_dat","prs","bin","func_0_ops","operations","func_offset","func_found","func_ops","operation","get_func_operations","npc","obj","bb_maps","op","bb_map","area_variants_array","get_variant","get_area_variants","set_episode","debug","get_episode","obj_data","_obj_data$position","rot","from_pso_id","npc_data","_npc_data$position","regular","abs","get_npc_type","parse_npc_data","write_quest_qst","grouped_objs","groupBy","obj_area_ids","parseInt","area_objs","write_f32","write_i32","grouped_npcs","npc_area_ids","area_npcs","write_dat","section_position","type_data","npc_type_to_dat_data","ext_start","base_file_name","OBJECT_COLOR","NPC_COLOR","create_object_mesh","create_mesh","create_npc_mesh","entity","vec3_to_threejs","DEFAULT_MATERIAL","DEFAULT_SKINNED_MATERIAL","skinning","DEFAULT_NORMAL","NO_TRANSLATION","NO_ROTATION","Quaternion","NO_SCALE","ninja_object_to_buffer_geometry","material","Object3DCreator","create_buffer_geometry","NjChunkType","VerticesHolder","vertices_stack","vertex","bone_id","indices","bone_indices","bone_weights","bones","object_to_geometry","Matrix4","geom","computeBoundingSphere","SkinnedMesh","skeleton","Skeleton","bind","parent_bone","parent_matrix","bone","_object$evaluation_fl","evaluation_flags","no_translate","no_rotate","no_scale","hidden","break_child_trace","zxy_rotation_order","skip","scale","euler","Euler","matrix","compose","setFromEuler","premultiply","Bone","setRotationFromEuler","model","model_to_geometry","child","nj_model_to_geometry","xj_model_to_geometry","normal_matrix","Matrix3","getNormalMatrix","new_vertices","normal","applyMatrix4","applyMatrix3","bone_weight","bone_weight_status","calc_continue","meshes","mesh_vertex","_this$bone_indices","_this$bone_weights","clockwise_winding","index_offset","clockwise","p","strip_indices","c","pa","pb","pc","na","nb","nc","clone","sub","cross","negate","dot","parse_nj_model","cached_chunk_offsets","vlist_offset","plist_offset","bounding_sphere_center","bounding_sphere_radius","parse_chunks","chunk","Vertex","Strip","triangle_strips","wide_end_chunks","chunks","loop","chunk_start_position","Null","Bits","cache_index","CachePolygonList","cached_offset","DrawPolygonList","Tiny","Material","parse_vertex_chunk","Volume","parse_triangle_strip_chunk","End","chunk_type_id","render_flags","ignore_light","ignore_specular","ignore_ambient","use_alpha","double_side","flat_shading","environment_mapping","user_offset_and_strip_count","user_flags_size","strip_count","_options","_options2","parse_texture_coords","parse_color","parse_normal","parse_texture_coords_hires","strips","winding_flag_and_index_count","i16","index_count","objectSpread","parse_xj_model","vertex_info_list_offset","triangle_strip_list_a_offset","triangle_strip_a_count","triangle_strip_list_b_offset","triangle_strip_b_count","_model$meshes","_model$meshes2","vertexList_offset","parse_triangle_strip_list","triangle_strip_list_offset","index_list_offset","u16_array","ANGLE_TO_RAD","NinjaObject","bone_cache","_bone_count","id_ref","get_bone_internal","Infinity","parse_nj","parse_ninja","parse_xj","parse_model","context","iff_type_id","iff_chunk_size","parse_sibling_objects","siblings","eval_flags","shape_skip","model_offset","pos_x","pos_y","pos_z","scale_x","scale_y","scale_z","child_offset","sibling_offset","DEFAULT_ENTITY","CylinderBufferGeometry","translate","DEFAULT_ENTITY_PROMISE","npc_cache","object_cache","entity_store","nj_objects","quest_editor_store","set_quest","action","reset_quest_state","current_quest","current_area","set_selected_entity","selected_entity","set_current_area_id","load_file","reader","FileReader","addEventListener","loadend","readAsArrayBuffer","object_geom","npc_geom","get_area_sections","o","get_object_geometry","set_section_on_visible_quest_entity","create_object_object_3d","get_npc_geometry","create_npc_object_3d","delegateYield","_entity$position","_section$position","sec_x","sec_y","sec_z","rot_x","rot_z","s","save_current_quest_to_file","document","href","URL","createObjectURL","Blob","download","body","appendChild","click","revokeObjectURL","removeChild","EntityInfoComponent","EntityInfoComponent_class","colSpan","EntityInfoComponent_CoordRow","position_type","coord","CoordRow","changed","pos_type","precision","QuestInfoComponent","npc_counts","val","extra_canadines","npc_count_rows","extra","renderer","OrbitControls","OrbitControlsCreator","THREE","Renderer","camera","controls","scene","Scene","light_holder","Group","WebGLRenderer","antialias","render_scheduled","light","HemisphereLight","schedule_render","requestAnimationFrame","call_render","render","setPixelRatio","window","devicePixelRatio","PerspectiveCamera","domElement","mouseButtons","ORBIT","MOUSE","RIGHT","PAN","LEFT","background","Color","setSize","aspect","updateProjectionMatrix","look_at","reset","copy","lookAt","coords","Vector2","getSize","offsetX","offsetY","NjInterpolation","NjKeyframeTrackType","QuestRenderer","_Renderer","raycaster","Raycaster","entity_reaction_disposers","collision_geometry","render_geometry","obj_geometry","npc_geometry","hovered_data","selected_data","on_mouse_down","old_selected_data","pick_entity","pointer_pos_to_device_coords","get_color","manipulating","enabled","on_mouse_up","on_mouse_move","pointer_pos","buttons","shiftKey","setFromCamera","ray","negative_world_dir","getWorldDirection","plane","Plane","setFromNormalAndCoplanarPoint","normalize","grab_offset","intersection_point","intersectPlane","y_delta","drag_y","drag_adjust","_this$pick_terrain","pick_terrain","intersection","point","old_data","dom_element","update","update_geometry","_update_geometry","dispose_entity_reactions","remove","update_entity_geometry","get_area_collision_geometry","reset_camera","get_area_render_geometry","entity_geometry","when","disposer","_this$raycaster$inter","intersectObjects","nearest_object","_this$raycaster$inter3","nearest_npc","distance","_this$raycaster$inter5","terrain","origin","terrains","face","setY","render_terrains","rt","is_npc","RendererComponent","modifyDom","div","set_size","clientWidth","clientHeight","onResize","wrapper_div","parentNode","overflow","removeEventListener","set_quest_and_area","QuestEditorComponent","QuestEditorComponent_class","save_dialog_open","save_dialog_filename","save_as_clicked","filename","save_dialog_filename_changed","save_dialog_affirmed","save_dialog_cancelled","QuestEditorComponent_Toolbar","onSaveAsClicked","QuestInfoComponent_QuestInfoComponent","RendererComponent_RendererComponent","EntityInfoComponent_EntityInfoComponent","QuestEditorComponent_SaveAsForm","is_open","on_filename_change","on_ok","on_cancel","Toolbar","set_filename","info","originFileObj","upload","accept","showUploadList","customRequest","es_select","Option","SaveAsForm","name_changed","currentTarget","modal","Fragment","onOk","onCancel","es_form","layout","input","autoFocus","maxLength","Weapon","shifta_factor","grind_atp","shifta_atp","armor_atp","shield_atp","base_atp","base_shifta_atp","final_min_atp","enemy_dfp","final_max_atp","min_normal_damage","max_normal_damage","NORMAL_DAMAGE_FACTOR","min_heavy_damage","max_heavy_damage","dps_calc_store","add_weapon","weapons","it","armor_type","shield_type","char_atp","mag_pow","shifta_lvl","DpsCalcComponent","DpsCalcComponent_class","armor_changed","shield_changed","weapon_types","wt","weapon","step","avg_normal_damage","avg_heavy_damage","armor_types","at","shield_types","st","parse_njm","bone_count","chunk_size","parse_motion","parse_njm_v2","seek_end","offset1","action_offset","motion_offset","parse_action","parse_njm_bb","mdata_offset","frame_count","inp_fn","interpolation","element_count","motion_data_list","motion_data","tracks","keyframe_offsets","keyframe_counts","shift","Position","keyframes","parse_motion_data_f","Rotation","parse_motion_data_a","Scale","frames","frame","keyframe_count","start_pos","_frames","parse_motion_data_a_wide","PSO_FRAME_RATE","create_animation_clip","motion","Spline","InterpolateSmooth","InterpolateLinear","get_bone","times","keyframe","quat","QuaternionKeyframeTrack","VectorKeyframeTrack","AnimationClip","nj_object_cache","nj_motion_cache","model_viewer_store","models","animations","set_animation_frame_rate","animation","mixer","timeScale","animation_frame_rate","set_animation_frame","animation_frame_count","animation_frame","load_model","get_player_ninja_object","set_model","current_bone_count","load_animation","nj_motion","get_nj_motion","current_model","set_animation","toggle_animation_playing","paused","animation_playing","update_animation_frame","clip","current_obj3d","stopAllAction","AnimationMixer","clipAction","play","duration","uncacheRoot","create_skinned_mesh","ninja_object_to_skinned_mesh","translateY","boundingSphere","radius","_model","njm","head_part","ninja_object","get_all_assets","body_data","head_data","head","add_to_bone","hair_data","hair","accessory_data","accessory","AnimationSelectionComponent","ModelSelectionComponent","es_list","itemLayout","dataSource","renderItem","Meta","ModelRenderer","clock","Clock","skeleton_helper","show_skeleton","SkeletonHelper","linewidth","getDelta","quaternion","esm_get","ModelViewerComponent","ModelViewerComponent_class","ModelViewerComponent_Toolbar","ModelSelectionComponent_ModelSelectionComponent","AnimationSelectionComponent_AnimationSelectionComponent","model_viewer_RendererComponent_RendererComponent","es_switch","checked","ModelViewer","QuestEditor","HuntOptimizer","tab","OptimizerComponent_OptimizerComponent","MethodsComponent_MethodsComponent","DpsCalc","ApplicationComponent","ApplicationComponent_class","_React$Component","tool","init_tool","menu_clicked","tool_component","menu","selectedKeys","mode","defaultValue","param","location","search","split","startsWith","useDefaults","defaultLevel","ReactDOM","ApplicationComponent_ApplicationComponent","getElementById"],"mappings":"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lB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAAC,IAAM,UAAW,MAClB,CAA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","file":"static/js/main.c7c5461b.chunk.js","sourcesContent":["// 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 BufferCursor {\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.ensure_capacity(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 private _little_endian: boolean = false;\r\n\r\n /**\r\n * Byte order mode.\r\n */\r\n get little_endian(): boolean {\r\n return this._little_endian;\r\n }\r\n\r\n set little_endian(little_endian: boolean) {\r\n this._little_endian = little_endian;\r\n this.utf16_decoder = little_endian ? UTF_16LE_DECODER : UTF_16BE_DECODER;\r\n this.utf16_encoder = little_endian ? UTF_16LE_ENCODER : UTF_16BE_ENCODER;\r\n }\r\n\r\n /**\r\n * The amount of bytes left to read from the current position onward.\r\n */\r\n get bytes_left(): 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 utf16_decoder: TextDecoder = UTF_16BE_DECODER;\r\n private utf16_encoder: TextEncoder = UTF_16BE_ENCODER;\r\n\r\n /**\r\n * @param buffer_or_capacity - If an ArrayBuffer or Buffer is given, writes to the cursor will be reflected in this buffer and vice versa until a cursor write that requires allocating a new internal buffer happens\r\n * @param little_endian - Decides in which byte order multi-byte integers and floats will be interpreted\r\n */\r\n constructor(buffer_or_capacity: ArrayBuffer | Buffer | number, little_endian: boolean = false) {\r\n if (typeof buffer_or_capacity === \"number\") {\r\n this.buffer = new ArrayBuffer(buffer_or_capacity);\r\n this.size = 0;\r\n } else if (buffer_or_capacity instanceof ArrayBuffer) {\r\n this.buffer = buffer_or_capacity;\r\n this.size = buffer_or_capacity.byteLength;\r\n } else if (buffer_or_capacity instanceof Buffer) {\r\n // Use the backing ArrayBuffer.\r\n this.buffer = buffer_or_capacity.buffer;\r\n this.size = buffer_or_capacity.byteLength;\r\n } else {\r\n throw new Error(\"buffer_or_capacity should be an ArrayBuffer, a Buffer or a number.\");\r\n }\r\n\r\n this.little_endian = little_endian;\r\n this.position = 0;\r\n this.dv = new DataView(this.buffer);\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): BufferCursor {\r\n return this.seek_start(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 seek_start(offset: number): BufferCursor {\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 seek_end(offset: number): BufferCursor {\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(): number {\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(): number {\r\n const r = this.dv.getUint16(this.position, this.little_endian);\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(): number {\r\n const r = this.dv.getUint32(this.position, this.little_endian);\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(): number {\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(): number {\r\n const r = this.dv.getInt16(this.position, this.little_endian);\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(): number {\r\n const r = this.dv.getInt32(this.position, this.little_endian);\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(): number {\r\n const r = this.dv.getFloat32(this.position, this.little_endian);\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 u8_array(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 u16_array(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.little_endian));\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 u32_array(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.little_endian));\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): BufferCursor {\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 BufferCursor(\r\n this.buffer.slice(this.position - size, this.position),\r\n this.little_endian\r\n );\r\n }\r\n\r\n /**\r\n * Consumes up to maxByteLength bytes.\r\n */\r\n string_ascii(\r\n max_byte_length: number,\r\n null_terminated: boolean,\r\n drop_remaining: boolean\r\n ): string {\r\n const string_length = null_terminated\r\n ? this.index_of_u8(0, max_byte_length) - this.position\r\n : max_byte_length;\r\n\r\n const r = ASCII_DECODER.decode(new DataView(this.buffer, this.position, string_length));\r\n this.position += drop_remaining\r\n ? max_byte_length\r\n : Math.min(string_length + 1, max_byte_length);\r\n return r;\r\n }\r\n\r\n /**\r\n * Consumes up to maxByteLength bytes.\r\n */\r\n string_utf16(\r\n max_byte_length: number,\r\n null_terminated: boolean,\r\n drop_remaining: boolean\r\n ): string {\r\n const string_length = null_terminated\r\n ? this.index_of_u16(0, max_byte_length) - this.position\r\n : Math.floor(max_byte_length / 2) * 2;\r\n\r\n const r = this.utf16_decoder.decode(\r\n new DataView(this.buffer, this.position, string_length)\r\n );\r\n this.position += drop_remaining\r\n ? max_byte_length\r\n : Math.min(string_length + 2, max_byte_length);\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 write_u8(value: number): BufferCursor {\r\n this.ensure_capacity(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 write_u16(value: number): BufferCursor {\r\n this.ensure_capacity(this.position + 2);\r\n\r\n this.dv.setUint16(this.position, value, this.little_endian);\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 write_u32(value: number): BufferCursor {\r\n this.ensure_capacity(this.position + 4);\r\n\r\n this.dv.setUint32(this.position, value, this.little_endian);\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 write_i32(value: number): BufferCursor {\r\n this.ensure_capacity(this.position + 4);\r\n\r\n this.dv.setInt32(this.position, value, this.little_endian);\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 write_f32(value: number): BufferCursor {\r\n this.ensure_capacity(this.position + 4);\r\n\r\n this.dv.setFloat32(this.position, value, this.little_endian);\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 write_u8_array(array: number[]): BufferCursor {\r\n this.ensure_capacity(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 write_cursor(other: BufferCursor): BufferCursor {\r\n this.ensure_capacity(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 write_string_ascii(str: string, byte_length: number): BufferCursor {\r\n let i = 0;\r\n\r\n for (const byte of ASCII_ENCODER.encode(str)) {\r\n if (i < byte_length) {\r\n this.write_u8(byte);\r\n ++i;\r\n }\r\n }\r\n\r\n while (i < byte_length) {\r\n this.write_u8(0);\r\n ++i;\r\n }\r\n\r\n return this;\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 uint8_array_view(): Uint8Array {\r\n return new Uint8Array(this.buffer, 0, this.size);\r\n }\r\n\r\n private index_of_u8(value: number, max_byte_length: number): number {\r\n const max_pos = Math.min(this.position + max_byte_length, this.size);\r\n\r\n for (let i = this.position; i < max_pos; ++i) {\r\n if (this.dv.getUint8(i) === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return this.position + max_byte_length;\r\n }\r\n\r\n private index_of_u16(value: number, max_byte_length: number): number {\r\n const max_pos = Math.min(this.position + max_byte_length, this.size);\r\n\r\n for (let i = this.position; i < max_pos; i += 2) {\r\n if (this.dv.getUint16(i, this.little_endian) === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return this.position + max_byte_length;\r\n }\r\n\r\n /**\r\n * Increases buffer size if necessary.\r\n */\r\n private ensure_capacity(min_new_size: number): void {\r\n if (min_new_size > this.capacity) {\r\n let new_size = this.capacity || min_new_size;\r\n\r\n do {\r\n new_size *= 2;\r\n } while (new_size < min_new_size);\r\n\r\n const new_buffer = new ArrayBuffer(new_size);\r\n new Uint8Array(new_buffer).set(new Uint8Array(this.buffer, 0, this.size));\r\n this.buffer = new_buffer;\r\n this.dv = new DataView(this.buffer);\r\n }\r\n }\r\n}\r\n","import { Alert } from \"antd\";\r\nimport React, { ReactNode, Component, ComponentType } from \"react\";\r\nimport \"./ErrorBoundary.css\";\r\n\r\ntype State = { has_error: boolean };\r\n\r\nexport class ErrorBoundary extends Component<{}, State> {\r\n state = {\r\n has_error: false,\r\n };\r\n\r\n render(): ReactNode {\r\n if (this.state.has_error) {\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(): State {\r\n return { has_error: true };\r\n }\r\n}\r\n\r\nexport function with_error_boundary(Component: ComponentType): ComponentType {\r\n const ComponentErrorBoundary = (): JSX.Element => (\r\n <ErrorBoundary>\r\n <Component />\r\n </ErrorBoundary>\r\n );\r\n ComponentErrorBoundary.displayName = `${Component.displayName}ErrorBoundary`;\r\n return ComponentErrorBoundary;\r\n}\r\n","export function enum_values<E>(e: any): E[] {\r\n const values = Object.values(e);\r\n const number_values = values.filter(v => typeof v === \"number\");\r\n\r\n if (number_values.length) {\r\n return (number_values as any) as E[];\r\n } else {\r\n return (values as any) as E[];\r\n }\r\n}\r\n\r\nexport function enum_names(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, initial_value: (key: K) => V) {\r\n this.keys = enum_values(enum_);\r\n\r\n for (const key of this.keys) {\r\n this.values.set(key, initial_value(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","export 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;\r\n this.y = y;\r\n this.z = z;\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(): Vec3 {\r\n return new Vec3(this.x, this.y, this.z);\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 min_atp: number,\r\n readonly max_atp: number,\r\n readonly ata: number,\r\n readonly max_grind: number,\r\n readonly required_atp: 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 min_evp: number,\r\n readonly max_evp: number,\r\n readonly min_dfp: number,\r\n readonly max_dfp: 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 min_evp: number,\r\n readonly max_evp: number,\r\n readonly min_dfp: number,\r\n readonly max_dfp: 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(readonly id: number, readonly name: string) {}\r\n}\r\n\r\nexport class ToolItemType implements ItemType {\r\n constructor(readonly id: number, readonly name: string) {}\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 grind_atp(): number {\r\n return 2 * this.grind;\r\n }\r\n\r\n constructor(readonly type: WeaponItemType) {}\r\n}\r\n\r\nexport class ArmorItem implements Item {\r\n constructor(readonly type: ArmorItemType) {}\r\n}\r\n\r\nexport class ShieldItem implements Item {\r\n constructor(readonly type: ShieldItemType) {}\r\n}\r\n\r\nexport class UnitItem implements Item {\r\n constructor(readonly type: UnitItemType) {}\r\n}\r\n\r\nexport class ToolItem implements Item {\r\n constructor(readonly type: ToolItemType) {}\r\n}\r\n","import { Episode, check_episode } 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 simple_name: string;\r\n readonly ultimate_name: string;\r\n readonly episode?: number;\r\n readonly enemy: boolean;\r\n rare_type?: NpcType;\r\n\r\n constructor(\r\n id: number,\r\n code: string,\r\n name: string,\r\n simple_name: string,\r\n ultimate_name: 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 (!simple_name) throw new Error(\"simple_name is required.\");\r\n if (!ultimate_name) throw new Error(\"ultimate_name 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.simple_name = simple_name;\r\n this.ultimate_name = ultimate_name;\r\n this.name = name;\r\n this.episode = episode;\r\n this.enemy = enemy;\r\n\r\n NpcType.by_code_map.set(code, this);\r\n\r\n if (episode) {\r\n const map = NpcType.by_ep_and_name[episode];\r\n\r\n if (map) {\r\n map.set(simple_name, this);\r\n map.set(ultimate_name, this);\r\n }\r\n }\r\n }\r\n\r\n private static by_code_map = new Map<string, NpcType>();\r\n\r\n private static by_ep_and_name = [\r\n undefined,\r\n new Map<string, NpcType>(),\r\n new Map<string, NpcType>(),\r\n undefined,\r\n new Map<string, NpcType>(),\r\n ];\r\n\r\n static by_code(code: string): NpcType | undefined {\r\n return this.by_code_map.get(code);\r\n }\r\n\r\n /**\r\n * Uniquely identifies an NPC. Tries to match on simple_name and ultimate_name.\r\n */\r\n static by_name_and_episode(name: string, episode: Episode): NpcType | undefined {\r\n check_episode(episode);\r\n return this.by_ep_and_name[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(\r\n id++,\r\n \"Unknown\",\r\n \"Unknown\",\r\n \"Unknown\",\r\n \"Unknown\",\r\n undefined,\r\n false\r\n );\r\n\r\n //\r\n // Friendly NPCs\r\n //\r\n\r\n NpcType.FemaleFat = new NpcType(\r\n id++,\r\n \"FemaleFat\",\r\n \"Female Fat\",\r\n \"Female Fat\",\r\n \"Female Fat\",\r\n undefined,\r\n false\r\n );\r\n NpcType.FemaleMacho = new NpcType(\r\n id++,\r\n \"FemaleMacho\",\r\n \"Female Macho\",\r\n \"Female Macho\",\r\n \"Female Macho\",\r\n undefined,\r\n false\r\n );\r\n NpcType.FemaleTall = new NpcType(\r\n id++,\r\n \"FemaleTall\",\r\n \"Female Tall\",\r\n \"Female Tall\",\r\n \"Female Tall\",\r\n undefined,\r\n false\r\n );\r\n NpcType.MaleDwarf = new NpcType(\r\n id++,\r\n \"MaleDwarf\",\r\n \"Male Dwarf\",\r\n \"Male Dwarf\",\r\n \"Male Dwarf\",\r\n undefined,\r\n false\r\n );\r\n NpcType.MaleFat = new NpcType(\r\n id++,\r\n \"MaleFat\",\r\n \"Male Fat\",\r\n \"Male Fat\",\r\n \"Male Fat\",\r\n undefined,\r\n false\r\n );\r\n NpcType.MaleMacho = new NpcType(\r\n id++,\r\n \"MaleMacho\",\r\n \"Male Macho\",\r\n \"Male Macho\",\r\n \"Male Macho\",\r\n undefined,\r\n false\r\n );\r\n NpcType.MaleOld = new NpcType(\r\n id++,\r\n \"MaleOld\",\r\n \"Male Old\",\r\n \"Male Old\",\r\n \"Male Old\",\r\n undefined,\r\n false\r\n );\r\n NpcType.BlueSoldier = new NpcType(\r\n id++,\r\n \"BlueSoldier\",\r\n \"Blue Soldier\",\r\n \"Blue Soldier\",\r\n \"Blue Soldier\",\r\n undefined,\r\n false\r\n );\r\n NpcType.RedSoldier = new NpcType(\r\n id++,\r\n \"RedSoldier\",\r\n \"Red Soldier\",\r\n \"Red Soldier\",\r\n \"Red Soldier\",\r\n undefined,\r\n false\r\n );\r\n NpcType.Principal = new NpcType(\r\n id++,\r\n \"Principal\",\r\n \"Principal\",\r\n \"Principal\",\r\n \"Principal\",\r\n undefined,\r\n false\r\n );\r\n NpcType.Tekker = new NpcType(id++, \"Tekker\", \"Tekker\", \"Tekker\", \"Tekker\", undefined, false);\r\n NpcType.GuildLady = new NpcType(\r\n id++,\r\n \"GuildLady\",\r\n \"Guild Lady\",\r\n \"Guild Lady\",\r\n \"Guild Lady\",\r\n undefined,\r\n false\r\n );\r\n NpcType.Scientist = new NpcType(\r\n id++,\r\n \"Scientist\",\r\n \"Scientist\",\r\n \"Scientist\",\r\n \"Scientist\",\r\n undefined,\r\n false\r\n );\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(\r\n id++,\r\n \"ItemShop\",\r\n \"Item Shop\",\r\n \"Item Shop\",\r\n \"Item Shop\",\r\n undefined,\r\n false\r\n );\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(\r\n id++,\r\n \"Hildebear\",\r\n \"Hildebear\",\r\n \"Hildebear\",\r\n \"Hildelt\",\r\n 1,\r\n true\r\n );\r\n NpcType.Hildeblue = new NpcType(\r\n id++,\r\n \"Hildeblue\",\r\n \"Hildeblue\",\r\n \"Hildeblue\",\r\n \"Hildetorr\",\r\n 1,\r\n true\r\n );\r\n NpcType.Hildebear.rare_type = 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.rare_type = 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(\r\n id++,\r\n \"SavageWolf\",\r\n \"Savage Wolf\",\r\n \"Savage Wolf\",\r\n \"Gulgus\",\r\n 1,\r\n true\r\n );\r\n NpcType.BarbarousWolf = new NpcType(\r\n id++,\r\n \"BarbarousWolf\",\r\n \"Barbarous Wolf\",\r\n \"Barbarous Wolf\",\r\n \"Gulgus-Gue\",\r\n 1,\r\n true\r\n );\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(\r\n id++,\r\n \"GrassAssassin\",\r\n \"Grass Assassin\",\r\n \"Grass Assassin\",\r\n \"Crimson Assassin\",\r\n 1,\r\n true\r\n );\r\n NpcType.PoisonLily = new NpcType(\r\n id++,\r\n \"PoisonLily\",\r\n \"Poison Lily\",\r\n \"Poison Lily\",\r\n \"Ob Lily\",\r\n 1,\r\n true\r\n );\r\n NpcType.NarLily = new NpcType(id++, \"NarLily\", \"Nar Lily\", \"Nar Lily\", \"Mil Lily\", 1, true);\r\n NpcType.PoisonLily.rare_type = NpcType.NarLily;\r\n NpcType.NanoDragon = new NpcType(\r\n id++,\r\n \"NanoDragon\",\r\n \"Nano Dragon\",\r\n \"Nano Dragon\",\r\n \"Nano Dragon\",\r\n 1,\r\n true\r\n );\r\n NpcType.EvilShark = new NpcType(\r\n id++,\r\n \"EvilShark\",\r\n \"Evil Shark\",\r\n \"Evil Shark\",\r\n \"Vulmer\",\r\n 1,\r\n true\r\n );\r\n NpcType.PalShark = new NpcType(id++, \"PalShark\", \"Pal Shark\", \"Pal Shark\", \"Govulmer\", 1, true);\r\n NpcType.GuilShark = new NpcType(\r\n id++,\r\n \"GuilShark\",\r\n \"Guil Shark\",\r\n \"Guil Shark\",\r\n \"Melqueek\",\r\n 1,\r\n true\r\n );\r\n NpcType.PofuillySlime = new NpcType(\r\n id++,\r\n \"PofuillySlime\",\r\n \"Pofuilly Slime\",\r\n \"Pofuilly Slime\",\r\n \"Pofuilly Slime\",\r\n 1,\r\n true\r\n );\r\n NpcType.PouillySlime = new NpcType(\r\n id++,\r\n \"PouillySlime\",\r\n \"Pouilly Slime\",\r\n \"Pouilly Slime\",\r\n \"Pouilly Slime\",\r\n 1,\r\n true\r\n );\r\n NpcType.PofuillySlime.rare_type = 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(\r\n id++,\r\n \"SinowBeat\",\r\n \"Sinow Beat\",\r\n \"Sinow Beat\",\r\n \"Sinow Blue\",\r\n 1,\r\n true\r\n );\r\n NpcType.SinowGold = new NpcType(\r\n id++,\r\n \"SinowGold\",\r\n \"Sinow Gold\",\r\n \"Sinow Gold\",\r\n \"Sinow Red\",\r\n 1,\r\n true\r\n );\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(\r\n id++,\r\n \"Dubswitch\",\r\n \"Dubswitch\",\r\n \"Dubswitch\",\r\n \"Dubswitch\",\r\n 1,\r\n true\r\n );\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(\r\n id++,\r\n \"ChaosSorcerer\",\r\n \"Chaos Sorcerer\",\r\n \"Chaos Sorcerer\",\r\n \"Gran Sorcerer\",\r\n 1,\r\n true\r\n );\r\n NpcType.DarkGunner = new NpcType(\r\n id++,\r\n \"DarkGunner\",\r\n \"Dark Gunner\",\r\n \"Dark Gunner\",\r\n \"Dark Gunner\",\r\n 1,\r\n true\r\n );\r\n NpcType.DeathGunner = new NpcType(\r\n id++,\r\n \"DeathGunner\",\r\n \"Death Gunner\",\r\n \"Death Gunner\",\r\n \"Death Gunner\",\r\n 1,\r\n true\r\n );\r\n NpcType.ChaosBringer = new NpcType(\r\n id++,\r\n \"ChaosBringer\",\r\n \"Chaos Bringer\",\r\n \"Chaos Bringer\",\r\n \"Dark Bringer\",\r\n 1,\r\n true\r\n );\r\n NpcType.DarkBelra = new NpcType(\r\n id++,\r\n \"DarkBelra\",\r\n \"Dark Belra\",\r\n \"Dark Belra\",\r\n \"Indi Belra\",\r\n 1,\r\n true\r\n );\r\n NpcType.Dimenian = new NpcType(id++, \"Dimenian\", \"Dimenian\", \"Dimenian\", \"Arlan\", 1, true);\r\n NpcType.LaDimenian = new NpcType(\r\n id++,\r\n \"LaDimenian\",\r\n \"La Dimenian\",\r\n \"La Dimenian\",\r\n \"Merlan\",\r\n 1,\r\n true\r\n );\r\n NpcType.SoDimenian = new NpcType(\r\n id++,\r\n \"SoDimenian\",\r\n \"So Dimenian\",\r\n \"So Dimenian\",\r\n \"Del-D\",\r\n 1,\r\n true\r\n );\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(\r\n id++,\r\n \"DarkFalz\",\r\n \"Dark Falz\",\r\n \"Dark Falz\",\r\n \"Dark Falz\",\r\n 1,\r\n true\r\n );\r\n\r\n // Episode II VR Temple\r\n\r\n NpcType.Hildebear2 = new NpcType(\r\n id++,\r\n \"Hildebear2\",\r\n \"Hildebear (Ep. II)\",\r\n \"Hildebear\",\r\n \"Hildelt\",\r\n 2,\r\n true\r\n );\r\n NpcType.Hildeblue2 = new NpcType(\r\n id++,\r\n \"Hildeblue2\",\r\n \"Hildeblue (Ep. II)\",\r\n \"Hildeblue\",\r\n \"Hildetorr\",\r\n 2,\r\n true\r\n );\r\n NpcType.Hildebear2.rare_type = NpcType.Hildeblue2;\r\n NpcType.RagRappy2 = new NpcType(\r\n id++,\r\n \"RagRappy2\",\r\n \"Rag Rappy (Ep. II)\",\r\n \"Rag Rappy\",\r\n \"El Rappy\",\r\n 2,\r\n true\r\n );\r\n NpcType.LoveRappy = new NpcType(\r\n id++,\r\n \"LoveRappy\",\r\n \"Love Rappy\",\r\n \"Love Rappy\",\r\n \"Love Rappy\",\r\n 2,\r\n true\r\n );\r\n NpcType.RagRappy2.rare_type = NpcType.LoveRappy;\r\n NpcType.StRappy = new NpcType(id++, \"StRappy\", \"St. Rappy\", \"St. Rappy\", \"St. Rappy\", 2, true);\r\n NpcType.HalloRappy = new NpcType(\r\n id++,\r\n \"HalloRappy\",\r\n \"Hallo Rappy\",\r\n \"Hallo Rappy\",\r\n \"Hallo Rappy\",\r\n 2,\r\n true\r\n );\r\n NpcType.EggRappy = new NpcType(\r\n id++,\r\n \"EggRappy\",\r\n \"Egg Rappy\",\r\n \"Egg Rappy\",\r\n \"Egg Rappy\",\r\n 2,\r\n true\r\n );\r\n NpcType.Monest2 = new NpcType(\r\n id++,\r\n \"Monest2\",\r\n \"Monest (Ep. II)\",\r\n \"Monest\",\r\n \"Mothvist\",\r\n 2,\r\n true\r\n );\r\n NpcType.Mothmant2 = new NpcType(id++, \"Mothmant2\", \"Mothmant\", \"Mothmant\", \"Mothvert\", 2, true);\r\n NpcType.PoisonLily2 = new NpcType(\r\n id++,\r\n \"PoisonLily2\",\r\n \"Poison Lily (Ep. II)\",\r\n \"Poison Lily\",\r\n \"Ob Lily\",\r\n 2,\r\n true\r\n );\r\n NpcType.NarLily2 = new NpcType(\r\n id++,\r\n \"NarLily2\",\r\n \"Nar Lily (Ep. II)\",\r\n \"Nar Lily\",\r\n \"Mil Lily\",\r\n 2,\r\n true\r\n );\r\n NpcType.PoisonLily2.rare_type = NpcType.NarLily2;\r\n NpcType.GrassAssassin2 = new NpcType(\r\n id++,\r\n \"GrassAssassin2\",\r\n \"Grass Assassin (Ep. II)\",\r\n \"Grass Assassin\",\r\n \"Crimson Assassin\",\r\n 2,\r\n true\r\n );\r\n NpcType.Dimenian2 = new NpcType(\r\n id++,\r\n \"Dimenian2\",\r\n \"Dimenian (Ep. II)\",\r\n \"Dimenian\",\r\n \"Arlan\",\r\n 2,\r\n true\r\n );\r\n NpcType.LaDimenian2 = new NpcType(\r\n id++,\r\n \"LaDimenian2\",\r\n \"La Dimenian (Ep. II)\",\r\n \"La Dimenian\",\r\n \"Merlan\",\r\n 2,\r\n true\r\n );\r\n NpcType.SoDimenian2 = new NpcType(\r\n id++,\r\n \"SoDimenian2\",\r\n \"So Dimenian (Ep. II)\",\r\n \"So Dimenian\",\r\n \"Del-D\",\r\n 2,\r\n true\r\n );\r\n NpcType.DarkBelra2 = new NpcType(\r\n id++,\r\n \"DarkBelra2\",\r\n \"Dark Belra (Ep. II)\",\r\n \"Dark Belra\",\r\n \"Indi Belra\",\r\n 2,\r\n true\r\n );\r\n NpcType.BarbaRay = new NpcType(\r\n id++,\r\n \"BarbaRay\",\r\n \"Barba Ray\",\r\n \"Barba Ray\",\r\n \"Barba Ray\",\r\n 2,\r\n true\r\n );\r\n\r\n // Episode II VR Spaceship\r\n\r\n NpcType.SavageWolf2 = new NpcType(\r\n id++,\r\n \"SavageWolf2\",\r\n \"Savage Wolf (Ep. II)\",\r\n \"Savage Wolf\",\r\n \"Gulgus\",\r\n 2,\r\n true\r\n );\r\n NpcType.BarbarousWolf2 = new NpcType(\r\n id++,\r\n \"BarbarousWolf2\",\r\n \"Barbarous Wolf (Ep. II)\",\r\n \"Barbarous Wolf\",\r\n \"Gulgus-Gue\",\r\n 2,\r\n true\r\n );\r\n NpcType.PanArms2 = new NpcType(\r\n id++,\r\n \"PanArms2\",\r\n \"Pan Arms (Ep. II)\",\r\n \"Pan Arms\",\r\n \"Pan Arms\",\r\n 2,\r\n true\r\n );\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(\r\n id++,\r\n \"Dubchic2\",\r\n \"Dubchic (Ep. II)\",\r\n \"Dubchic\",\r\n \"Dubchich\",\r\n 2,\r\n true\r\n );\r\n NpcType.Gilchic2 = new NpcType(\r\n id++,\r\n \"Gilchic2\",\r\n \"Gilchic (Ep. II)\",\r\n \"Gilchic\",\r\n \"Gilchich\",\r\n 2,\r\n true\r\n );\r\n NpcType.Garanz2 = new NpcType(id++, \"Garanz2\", \"Garanz (Ep. II)\", \"Garanz\", \"Baranz\", 2, true);\r\n NpcType.Dubswitch2 = new NpcType(\r\n id++,\r\n \"Dubswitch2\",\r\n \"Dubswitch (Ep. II)\",\r\n \"Dubswitch\",\r\n \"Dubswitch\",\r\n 2,\r\n true\r\n );\r\n NpcType.Delsaber2 = new NpcType(\r\n id++,\r\n \"Delsaber2\",\r\n \"Delsaber (Ep. II)\",\r\n \"Delsaber\",\r\n \"Delsaber\",\r\n 2,\r\n true\r\n );\r\n NpcType.ChaosSorcerer2 = new NpcType(\r\n id++,\r\n \"ChaosSorcerer2\",\r\n \"Chaos Sorcerer (Ep. II)\",\r\n \"Chaos Sorcerer\",\r\n \"Gran Sorcerer\",\r\n 2,\r\n true\r\n );\r\n NpcType.GolDragon = new NpcType(\r\n id++,\r\n \"GolDragon\",\r\n \"Gol Dragon\",\r\n \"Gol Dragon\",\r\n \"Gol Dragon\",\r\n 2,\r\n true\r\n );\r\n\r\n // Episode II Central Control Area\r\n\r\n NpcType.SinowBerill = new NpcType(\r\n id++,\r\n \"SinowBerill\",\r\n \"Sinow Berill\",\r\n \"Sinow Berill\",\r\n \"Sinow Berill\",\r\n 2,\r\n true\r\n );\r\n NpcType.SinowSpigell = new NpcType(\r\n id++,\r\n \"SinowSpigell\",\r\n \"Sinow Spigell\",\r\n \"Sinow Spigell\",\r\n \"Sinow Spigell\",\r\n 2,\r\n true\r\n );\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(\r\n id++,\r\n \"Mericarol\",\r\n \"Mericarol\",\r\n \"Mericarol\",\r\n \"Mericarol\",\r\n 2,\r\n true\r\n );\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(\r\n id++,\r\n \"UlGibbon\",\r\n \"Ul Gibbon\",\r\n \"Ul Gibbon\",\r\n \"Ul Gibbon\",\r\n 2,\r\n true\r\n );\r\n NpcType.ZolGibbon = new NpcType(\r\n id++,\r\n \"ZolGibbon\",\r\n \"Zol Gibbon\",\r\n \"Zol Gibbon\",\r\n \"Zol Gibbon\",\r\n 2,\r\n true\r\n );\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(\r\n id++,\r\n \"GalGryphon\",\r\n \"Gal Gryphon\",\r\n \"Gal Gryphon\",\r\n \"Gal Gryphon\",\r\n 2,\r\n true\r\n );\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(\r\n id++,\r\n \"SinowZoa\",\r\n \"Sinow Zoa\",\r\n \"Sinow Zoa\",\r\n \"Sinow Zoa\",\r\n 2,\r\n true\r\n );\r\n NpcType.SinowZele = new NpcType(\r\n id++,\r\n \"SinowZele\",\r\n \"Sinow Zele\",\r\n \"Sinow Zele\",\r\n \"Sinow Zele\",\r\n 2,\r\n true\r\n );\r\n NpcType.OlgaFlow = new NpcType(\r\n id++,\r\n \"OlgaFlow\",\r\n \"Olga Flow\",\r\n \"Olga Flow\",\r\n \"Olga Flow\",\r\n 2,\r\n true\r\n );\r\n\r\n // Episode IV\r\n\r\n NpcType.SandRappy = new NpcType(\r\n id++,\r\n \"SandRappy\",\r\n \"Sand Rappy\",\r\n \"Sand Rappy\",\r\n \"Sand Rappy\",\r\n 4,\r\n true\r\n );\r\n NpcType.DelRappy = new NpcType(\r\n id++,\r\n \"DelRappy\",\r\n \"Del Rappy\",\r\n \"Del Rappy\",\r\n \"Del Rappy\",\r\n 4,\r\n true\r\n );\r\n NpcType.SandRappy.rare_type = NpcType.DelRappy;\r\n NpcType.Astark = new NpcType(id++, \"Astark\", \"Astark\", \"Astark\", \"Astark\", 4, true);\r\n NpcType.SatelliteLizard = new NpcType(\r\n id++,\r\n \"SatelliteLizard\",\r\n \"Satellite Lizard\",\r\n \"Satellite Lizard\",\r\n \"Satellite Lizard\",\r\n 4,\r\n true\r\n );\r\n NpcType.Yowie = new NpcType(id++, \"Yowie\", \"Yowie\", \"Yowie\", \"Yowie\", 4, true);\r\n NpcType.MerissaA = new NpcType(\r\n id++,\r\n \"MerissaA\",\r\n \"Merissa A\",\r\n \"Merissa A\",\r\n \"Merissa A\",\r\n 4,\r\n true\r\n );\r\n NpcType.MerissaAA = new NpcType(\r\n id++,\r\n \"MerissaAA\",\r\n \"Merissa AA\",\r\n \"Merissa AA\",\r\n \"Merissa AA\",\r\n 4,\r\n true\r\n );\r\n NpcType.MerissaA.rare_type = NpcType.MerissaAA;\r\n NpcType.Girtablulu = new NpcType(\r\n id++,\r\n \"Girtablulu\",\r\n \"Girtablulu\",\r\n \"Girtablulu\",\r\n \"Girtablulu\",\r\n 4,\r\n true\r\n );\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.rare_type = 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(\r\n id++,\r\n \"DorphonEclair\",\r\n \"Dorphon Eclair\",\r\n \"Dorphon Eclair\",\r\n \"Dorphon Eclair\",\r\n 4,\r\n true\r\n );\r\n NpcType.Dorphon.rare_type = NpcType.DorphonEclair;\r\n NpcType.Goran = new NpcType(id++, \"Goran\", \"Goran\", \"Goran\", \"Goran\", 4, true);\r\n NpcType.PyroGoran = new NpcType(\r\n id++,\r\n \"PyroGoran\",\r\n \"Pyro Goran\",\r\n \"Pyro Goran\",\r\n \"Pyro Goran\",\r\n 4,\r\n true\r\n );\r\n NpcType.GoranDetonator = new NpcType(\r\n id++,\r\n \"GoranDetonator\",\r\n \"Goran Detonator\",\r\n \"Goran Detonator\",\r\n \"Goran Detonator\",\r\n 4,\r\n true\r\n );\r\n NpcType.SaintMilion = new NpcType(\r\n id++,\r\n \"SaintMilion\",\r\n \"Saint-Milion\",\r\n \"Saint-Milion\",\r\n \"Saint-Milion\",\r\n 4,\r\n true\r\n );\r\n NpcType.Shambertin = new NpcType(\r\n id++,\r\n \"Shambertin\",\r\n \"Shambertin\",\r\n \"Shambertin\",\r\n \"Shambertin\",\r\n 4,\r\n true\r\n );\r\n NpcType.Kondrieu = new NpcType(id++, \"Kondrieu\", \"Kondrieu\", \"Kondrieu\", \"Kondrieu\", 4, true);\r\n NpcType.SaintMilion.rare_type = NpcType.Kondrieu;\r\n NpcType.Shambertin.rare_type = NpcType.Kondrieu;\r\n})();\r\n\r\nexport const NpcTypes: NpcType[] = [\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 pso_id?: number;\r\n name: string;\r\n\r\n constructor(id: number, pso_id: 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 (pso_id != null && (!Number.isInteger(pso_id) || pso_id < 0))\r\n throw new Error(\r\n `Expected pso_id to be null or an integer greater than or equal to 0, got ${pso_id}.`\r\n );\r\n if (!name) throw new Error(\"name is required.\");\r\n\r\n this.id = id;\r\n this.pso_id = pso_id;\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 from_pso_id(psoId: number): ObjectType {\r\n switch (psoId) {\r\n default:\r\n return ObjectType.Unknown;\r\n\r\n case 0:\r\n return ObjectType.PlayerSet;\r\n case 1:\r\n return ObjectType.Particle;\r\n case 2:\r\n return ObjectType.Teleporter;\r\n case 3:\r\n return ObjectType.Warp;\r\n case 4:\r\n return ObjectType.LightCollision;\r\n case 5:\r\n return ObjectType.Item;\r\n case 6:\r\n return ObjectType.EnvSound;\r\n case 7:\r\n return ObjectType.FogCollision;\r\n case 8:\r\n return ObjectType.EventCollision;\r\n case 9:\r\n return ObjectType.CharaCollision;\r\n case 10:\r\n return ObjectType.ElementalTrap;\r\n case 11:\r\n return ObjectType.StatusTrap;\r\n case 12:\r\n return ObjectType.HealTrap;\r\n case 13:\r\n return ObjectType.LargeElementalTrap;\r\n case 14:\r\n return ObjectType.ObjRoomID;\r\n case 15:\r\n return ObjectType.Sensor;\r\n case 16:\r\n return ObjectType.UnknownItem16;\r\n case 17:\r\n return ObjectType.Lensflare;\r\n case 18:\r\n return ObjectType.ScriptCollision;\r\n case 19:\r\n return ObjectType.HealRing;\r\n case 20:\r\n return ObjectType.MapCollision;\r\n case 21:\r\n return ObjectType.ScriptCollisionA;\r\n case 22:\r\n return ObjectType.ItemLight;\r\n case 23:\r\n return ObjectType.RadarCollision;\r\n case 24:\r\n return ObjectType.FogCollisionSW;\r\n case 25:\r\n return ObjectType.BossTeleporter;\r\n case 26:\r\n return ObjectType.ImageBoard;\r\n case 27:\r\n return ObjectType.QuestWarp;\r\n case 28:\r\n return ObjectType.Epilogue;\r\n case 29:\r\n return ObjectType.UnknownItem29;\r\n case 30:\r\n return ObjectType.UnknownItem30;\r\n case 31:\r\n return ObjectType.UnknownItem31;\r\n case 32:\r\n return ObjectType.BoxDetectObject;\r\n case 33:\r\n return ObjectType.SymbolChatObject;\r\n case 34:\r\n return ObjectType.TouchPlateObject;\r\n case 35:\r\n return ObjectType.TargetableObject;\r\n case 36:\r\n return ObjectType.EffectObject;\r\n case 37:\r\n return ObjectType.CountDownObject;\r\n case 38:\r\n return ObjectType.UnknownItem38;\r\n case 39:\r\n return ObjectType.UnknownItem39;\r\n case 40:\r\n return ObjectType.UnknownItem40;\r\n case 41:\r\n return ObjectType.UnknownItem41;\r\n case 64:\r\n return ObjectType.MenuActivation;\r\n case 65:\r\n return ObjectType.TelepipeLocation;\r\n case 66:\r\n return ObjectType.BGMCollision;\r\n case 67:\r\n return ObjectType.MainRagolTeleporter;\r\n case 68:\r\n return ObjectType.LobbyTeleporter;\r\n case 69:\r\n return ObjectType.PrincipalWarp;\r\n case 70:\r\n return ObjectType.ShopDoor;\r\n case 71:\r\n return ObjectType.HuntersGuildDoor;\r\n case 72:\r\n return ObjectType.TeleporterDoor;\r\n case 73:\r\n return ObjectType.MedicalCenterDoor;\r\n case 74:\r\n return ObjectType.Elevator;\r\n case 75:\r\n return ObjectType.EasterEgg;\r\n case 76:\r\n return ObjectType.ValentinesHeart;\r\n case 77:\r\n return ObjectType.ChristmasTree;\r\n case 78:\r\n return ObjectType.ChristmasWreath;\r\n case 79:\r\n return ObjectType.HalloweenPumpkin;\r\n case 80:\r\n return ObjectType.TwentyFirstCentury;\r\n case 81:\r\n return ObjectType.Sonic;\r\n case 82:\r\n return ObjectType.WelcomeBoard;\r\n case 83:\r\n return ObjectType.Firework;\r\n case 84:\r\n return ObjectType.LobbyScreenDoor;\r\n case 85:\r\n return ObjectType.MainRagolTeleporterBattleInNextArea;\r\n case 86:\r\n return ObjectType.LabTeleporterDoor;\r\n case 87:\r\n return ObjectType.Pioneer2InvisibleTouchplate;\r\n case 128:\r\n return ObjectType.ForestDoor;\r\n case 129:\r\n return ObjectType.ForestSwitch;\r\n case 130:\r\n return ObjectType.LaserFence;\r\n case 131:\r\n return ObjectType.LaserSquareFence;\r\n case 132:\r\n return ObjectType.ForestLaserFenceSwitch;\r\n case 133:\r\n return ObjectType.LightRays;\r\n case 134:\r\n return ObjectType.BlueButterfly;\r\n case 135:\r\n return ObjectType.Probe;\r\n case 136:\r\n return ObjectType.RandomTypeBox1;\r\n case 137:\r\n return ObjectType.ForestWeatherStation;\r\n case 138:\r\n return ObjectType.Battery;\r\n case 139:\r\n return ObjectType.ForestConsole;\r\n case 140:\r\n return ObjectType.BlackSlidingDoor;\r\n case 141:\r\n return ObjectType.RicoMessagePod;\r\n case 142:\r\n return ObjectType.EnergyBarrier;\r\n case 143:\r\n return ObjectType.ForestRisingBridge;\r\n case 144:\r\n return ObjectType.SwitchNoneDoor;\r\n case 145:\r\n return ObjectType.EnemyBoxGrey;\r\n case 146:\r\n return ObjectType.FixedTypeBox;\r\n case 147:\r\n return ObjectType.EnemyBoxBrown;\r\n case 149:\r\n return ObjectType.EmptyTypeBox;\r\n case 150:\r\n return ObjectType.LaserFenseEx;\r\n case 151:\r\n return ObjectType.LaserSquareFenceEx;\r\n case 192:\r\n return ObjectType.FloorPanel1;\r\n case 193:\r\n return ObjectType.Caves4ButtonDoor;\r\n case 194:\r\n return ObjectType.CavesNormalDoor;\r\n case 195:\r\n return ObjectType.CavesSmashingPillar;\r\n case 196:\r\n return ObjectType.CavesSign1;\r\n case 197:\r\n return ObjectType.CavesSign2;\r\n case 198:\r\n return ObjectType.CavesSign3;\r\n case 199:\r\n return ObjectType.HexagalTank;\r\n case 200:\r\n return ObjectType.BrownPlatform;\r\n case 201:\r\n return ObjectType.WarningLightObject;\r\n case 203:\r\n return ObjectType.Rainbow;\r\n case 204:\r\n return ObjectType.FloatingJelifish;\r\n case 205:\r\n return ObjectType.FloatingDragonfly;\r\n case 206:\r\n return ObjectType.CavesSwitchDoor;\r\n case 207:\r\n return ObjectType.RobotRechargeStation;\r\n case 208:\r\n return ObjectType.CavesCakeShop;\r\n case 209:\r\n return ObjectType.Caves1SmallRedRock;\r\n case 210:\r\n return ObjectType.Caves1MediumRedRock;\r\n case 211:\r\n return ObjectType.Caves1LargeRedRock;\r\n case 212:\r\n return ObjectType.Caves2SmallRock1;\r\n case 213:\r\n return ObjectType.Caves2MediumRock1;\r\n case 214:\r\n return ObjectType.Caves2LargeRock1;\r\n case 215:\r\n return ObjectType.Caves2SmallRock2;\r\n case 216:\r\n return ObjectType.Caves2MediumRock2;\r\n case 217:\r\n return ObjectType.Caves2LargeRock2;\r\n case 218:\r\n return ObjectType.Caves3SmallRock;\r\n case 219:\r\n return ObjectType.Caves3MediumRock;\r\n case 220:\r\n return ObjectType.Caves3LargeRock;\r\n case 222:\r\n return ObjectType.FloorPanel2;\r\n case 223:\r\n return ObjectType.DestructableRockCaves1;\r\n case 224:\r\n return ObjectType.DestructableRockCaves2;\r\n case 225:\r\n return ObjectType.DestructableRockCaves3;\r\n case 256:\r\n return ObjectType.MinesDoor;\r\n case 257:\r\n return ObjectType.FloorPanel3;\r\n case 258:\r\n return ObjectType.MinesSwitchDoor;\r\n case 259:\r\n return ObjectType.LargeCryoTube;\r\n case 260:\r\n return ObjectType.ComputerLikeCalus;\r\n case 261:\r\n return ObjectType.GreenScreenOpeningAndClosing;\r\n case 262:\r\n return ObjectType.FloatingRobot;\r\n case 263:\r\n return ObjectType.FloatingBlueLight;\r\n case 264:\r\n return ObjectType.SelfDestructingObject1;\r\n case 265:\r\n return ObjectType.SelfDestructingObject2;\r\n case 266:\r\n return ObjectType.SelfDestructingObject3;\r\n case 267:\r\n return ObjectType.SparkMachine;\r\n case 268:\r\n return ObjectType.MinesLargeFlashingCrate;\r\n case 304:\r\n return ObjectType.RuinsSeal;\r\n case 320:\r\n return ObjectType.RuinsTeleporter;\r\n case 321:\r\n return ObjectType.RuinsWarpSiteToSite;\r\n case 322:\r\n return ObjectType.RuinsSwitch;\r\n case 323:\r\n return ObjectType.FloorPanel4;\r\n case 324:\r\n return ObjectType.Ruins1Door;\r\n case 325:\r\n return ObjectType.Ruins3Door;\r\n case 326:\r\n return ObjectType.Ruins2Door;\r\n case 327:\r\n return ObjectType.Ruins11ButtonDoor;\r\n case 328:\r\n return ObjectType.Ruins21ButtonDoor;\r\n case 329:\r\n return ObjectType.Ruins31ButtonDoor;\r\n case 330:\r\n return ObjectType.Ruins4ButtonDoor;\r\n case 331:\r\n return ObjectType.Ruins2ButtonDoor;\r\n case 332:\r\n return ObjectType.RuinsSensor;\r\n case 333:\r\n return ObjectType.RuinsFenceSwitch;\r\n case 334:\r\n return ObjectType.RuinsLaserFence4x2;\r\n case 335:\r\n return ObjectType.RuinsLaserFence6x2;\r\n case 336:\r\n return ObjectType.RuinsLaserFence4x4;\r\n case 337:\r\n return ObjectType.RuinsLaserFence6x4;\r\n case 338:\r\n return ObjectType.RuinsPoisonBlob;\r\n case 339:\r\n return ObjectType.RuinsPilarTrap;\r\n case 340:\r\n return ObjectType.PopupTrapNoTech;\r\n case 341:\r\n return ObjectType.RuinsCrystal;\r\n case 342:\r\n return ObjectType.Monument;\r\n case 345:\r\n return ObjectType.RuinsRock1;\r\n case 346:\r\n return ObjectType.RuinsRock2;\r\n case 347:\r\n return ObjectType.RuinsRock3;\r\n case 348:\r\n return ObjectType.RuinsRock4;\r\n case 349:\r\n return ObjectType.RuinsRock5;\r\n case 350:\r\n return ObjectType.RuinsRock6;\r\n case 351:\r\n return ObjectType.RuinsRock7;\r\n case 352:\r\n return ObjectType.Poison;\r\n case 353:\r\n return ObjectType.FixedBoxTypeRuins;\r\n case 354:\r\n return ObjectType.RandomBoxTypeRuins;\r\n case 355:\r\n return ObjectType.EnemyTypeBoxYellow;\r\n case 356:\r\n return ObjectType.EnemyTypeBoxBlue;\r\n case 357:\r\n return ObjectType.EmptyTypeBoxBlue;\r\n case 358:\r\n return ObjectType.DestructableRock;\r\n case 359:\r\n return ObjectType.PopupTrapsTechs;\r\n case 368:\r\n return ObjectType.FlyingWhiteBird;\r\n case 369:\r\n return ObjectType.Tower;\r\n case 370:\r\n return ObjectType.FloatingRocks;\r\n case 371:\r\n return ObjectType.FloatingSoul;\r\n case 372:\r\n return ObjectType.Butterfly;\r\n case 384:\r\n return ObjectType.LobbyGameMenu;\r\n case 385:\r\n return ObjectType.LobbyWarpObject;\r\n case 386:\r\n return ObjectType.Lobby1EventObjectDefaultTree;\r\n case 387:\r\n return ObjectType.UnknownItem387;\r\n case 388:\r\n return ObjectType.UnknownItem388;\r\n case 389:\r\n return ObjectType.UnknownItem389;\r\n case 390:\r\n return ObjectType.LobbyEventObjectStaticPumpkin;\r\n case 391:\r\n return ObjectType.LobbyEventObject3ChristmasWindows;\r\n case 392:\r\n return ObjectType.LobbyEventObjectRedAndWhiteCurtain;\r\n case 393:\r\n return ObjectType.UnknownItem393;\r\n case 394:\r\n return ObjectType.UnknownItem394;\r\n case 395:\r\n return ObjectType.LobbyFishTank;\r\n case 396:\r\n return ObjectType.LobbyEventObjectButterflies;\r\n case 400:\r\n return ObjectType.UnknownItem400;\r\n case 401:\r\n return ObjectType.GreyWallLow;\r\n case 402:\r\n return ObjectType.SpaceshipDoor;\r\n case 403:\r\n return ObjectType.GreyWallHigh;\r\n case 416:\r\n return ObjectType.TempleNormalDoor;\r\n case 417:\r\n return ObjectType.BreakableWallWallButUnbreakable;\r\n case 418:\r\n return ObjectType.BrokenCilinderAndRubble;\r\n case 419:\r\n return ObjectType.ThreeBrokenWallPiecesOnFloor;\r\n case 420:\r\n return ObjectType.HighBrickCilinder;\r\n case 421:\r\n return ObjectType.LyingCilinder;\r\n case 422:\r\n return ObjectType.BrickConeWithFlatTop;\r\n case 423:\r\n return ObjectType.BreakableTempleWall;\r\n case 424:\r\n return ObjectType.TempleMapDetect;\r\n case 425:\r\n return ObjectType.SmallBrownBrickRisingBridge;\r\n case 426:\r\n return ObjectType.LongRisingBridgeWithPinkHighEdges;\r\n case 427:\r\n return ObjectType.FourSwitchTempleDoor;\r\n case 448:\r\n return ObjectType.FourButtonSpaceshipDoor;\r\n case 512:\r\n return ObjectType.ItemBoxCca;\r\n case 513:\r\n return ObjectType.TeleporterEp2;\r\n case 514:\r\n return ObjectType.CCADoor;\r\n case 515:\r\n return ObjectType.SpecialBoxCCA;\r\n case 516:\r\n return ObjectType.BigCCADoor;\r\n case 517:\r\n return ObjectType.BigCCADoorSwitch;\r\n case 518:\r\n return ObjectType.LittleRock;\r\n case 519:\r\n return ObjectType.Little3StoneWall;\r\n case 520:\r\n return ObjectType.Medium3StoneWall;\r\n case 521:\r\n return ObjectType.SpiderPlant;\r\n case 522:\r\n return ObjectType.CCAAreaTeleporter;\r\n case 523:\r\n return ObjectType.UnknownItem523;\r\n case 524:\r\n return ObjectType.WhiteBird;\r\n case 525:\r\n return ObjectType.OrangeBird;\r\n case 527:\r\n return ObjectType.Saw;\r\n case 528:\r\n return ObjectType.LaserDetect;\r\n case 529:\r\n return ObjectType.UnknownItem529;\r\n case 530:\r\n return ObjectType.UnknownItem530;\r\n case 531:\r\n return ObjectType.Seagull;\r\n case 544:\r\n return ObjectType.Fish;\r\n case 545:\r\n return ObjectType.SeabedDoorWithBlueEdges;\r\n case 546:\r\n return ObjectType.SeabedDoorAlwaysOpenNonTriggerable;\r\n case 547:\r\n return ObjectType.LittleCryotube;\r\n case 548:\r\n return ObjectType.WideGlassWallBreakable;\r\n case 549:\r\n return ObjectType.BlueFloatingRobot;\r\n case 550:\r\n return ObjectType.RedFloatingRobot;\r\n case 551:\r\n return ObjectType.Dolphin;\r\n case 552:\r\n return ObjectType.CaptureTrap;\r\n case 553:\r\n return ObjectType.VRLink;\r\n case 576:\r\n return ObjectType.UnknownItem576;\r\n case 640:\r\n return ObjectType.WarpInBarbaRayRoom;\r\n case 672:\r\n return ObjectType.UnknownItem672;\r\n case 688:\r\n return ObjectType.GeeNest;\r\n case 689:\r\n return ObjectType.LabComputerConsole;\r\n case 690:\r\n return ObjectType.LabComputerConsoleGreenScreen;\r\n case 691:\r\n return ObjectType.ChairYelllowPillow;\r\n case 692:\r\n return ObjectType.OrangeWallWithHoleInMiddle;\r\n case 693:\r\n return ObjectType.GreyWallWithHoleInMiddle;\r\n case 694:\r\n return ObjectType.LongTable;\r\n case 695:\r\n return ObjectType.GBAStation;\r\n case 696:\r\n return ObjectType.TalkLinkToSupport;\r\n case 697:\r\n return ObjectType.InstaWarp;\r\n case 698:\r\n return ObjectType.LabInvisibleObject;\r\n case 699:\r\n return ObjectType.LabGlassWindowDoor;\r\n case 700:\r\n return ObjectType.UnknownItem700;\r\n case 701:\r\n return ObjectType.LabCelingWarp;\r\n case 768:\r\n return ObjectType.Ep4LightSource;\r\n case 769:\r\n return ObjectType.Cacti;\r\n case 770:\r\n return ObjectType.BigBrownRock;\r\n case 771:\r\n return ObjectType.BreakableBrownRock;\r\n case 832:\r\n return ObjectType.UnknownItem832;\r\n case 833:\r\n return ObjectType.UnknownItem833;\r\n case 896:\r\n return ObjectType.PoisonPlant;\r\n case 897:\r\n return ObjectType.UnknownItem897;\r\n case 898:\r\n return ObjectType.UnknownItem898;\r\n case 899:\r\n return ObjectType.OozingDesertPlant;\r\n case 901:\r\n return ObjectType.UnknownItem901;\r\n case 902:\r\n return ObjectType.BigBlackRocks;\r\n case 903:\r\n return ObjectType.UnknownItem903;\r\n case 904:\r\n return ObjectType.UnknownItem904;\r\n case 905:\r\n return ObjectType.UnknownItem905;\r\n case 906:\r\n return ObjectType.UnknownItem906;\r\n case 907:\r\n return ObjectType.FallingRock;\r\n case 908:\r\n return ObjectType.DesertPlantHasCollision;\r\n case 909:\r\n return ObjectType.DesertFixedTypeBoxBreakableCrystals;\r\n case 910:\r\n return ObjectType.UnknownItem910;\r\n case 911:\r\n return ObjectType.BeeHive;\r\n case 912:\r\n return ObjectType.UnknownItem912;\r\n case 913:\r\n return ObjectType.Heat;\r\n case 960:\r\n return ObjectType.TopOfSaintMillionEgg;\r\n case 961:\r\n 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(\r\n id++,\r\n 85,\r\n \"Main Ragol Teleporter (Battle in next area?)\"\r\n );\r\n ObjectType.LabTeleporterDoor = new ObjectType(id++, 86, \"Lab Teleporter Door\");\r\n ObjectType.Pioneer2InvisibleTouchplate = new ObjectType(\r\n id++,\r\n 87,\r\n \"Pioneer 2 Invisible Touchplate\"\r\n );\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(\r\n id++,\r\n 261,\r\n \"Green Screen opening and closing\"\r\n );\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(\r\n id++,\r\n 386,\r\n \"Lobby 1 Event Object (Default Tree)\"\r\n );\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(\r\n id++,\r\n 390,\r\n \"Lobby Event Object (Static Pumpkin)\"\r\n );\r\n ObjectType.LobbyEventObject3ChristmasWindows = new ObjectType(\r\n id++,\r\n 391,\r\n \"Lobby Event Object (3 Christmas Windows)\"\r\n );\r\n ObjectType.LobbyEventObjectRedAndWhiteCurtain = new ObjectType(\r\n id++,\r\n 392,\r\n \"Lobby Event Object (Red and White Curtain)\"\r\n );\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(\r\n id++,\r\n 396,\r\n \"Lobby Event Object (Butterflies)\"\r\n );\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(\r\n id++,\r\n 417,\r\n '\"breakable wall wall, but unbreakable\"'\r\n );\r\n ObjectType.BrokenCilinderAndRubble = new ObjectType(id++, 418, \"Broken cilinder and rubble\");\r\n ObjectType.ThreeBrokenWallPiecesOnFloor = new ObjectType(\r\n id++,\r\n 419,\r\n \"3 broken wall pieces on floor\"\r\n );\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(\r\n id++,\r\n 425,\r\n \"small brown brick rising bridge\"\r\n );\r\n ObjectType.LongRisingBridgeWithPinkHighEdges = new ObjectType(\r\n id++,\r\n 426,\r\n \"long rising bridge (with pink high edges)\"\r\n );\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(\r\n id++,\r\n 546,\r\n \"Seabed door (always open, non-triggerable)\"\r\n );\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(\r\n id++,\r\n 690,\r\n \"Lab Computer Console (Green Screen)\"\r\n );\r\n ObjectType.ChairYelllowPillow = new ObjectType(id++, 691, \"Chair, Yelllow Pillow\");\r\n ObjectType.OrangeWallWithHoleInMiddle = new ObjectType(\r\n id++,\r\n 692,\r\n \"orange wall with hole in middle\"\r\n );\r\n ObjectType.GreyWallWithHoleInMiddle = new ObjectType(\r\n id++,\r\n 693,\r\n \"grey wall with hole in middle\"\r\n );\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(\r\n id++,\r\n 909,\r\n \"Desert Fixed Type Box (Breakable Crystals)\"\r\n );\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 { BufferCursor } from \"../data_formats/BufferCursor\";\r\nimport { DatNpc, DatObject, DatUnknown } from \"../data_formats/parsing/quest/dat\";\r\nimport { NpcType } from \"./NpcType\";\r\nimport { ObjectType } from \"./ObjectType\";\r\nimport { enum_values } from \"../enums\";\r\nimport { ItemType } from \"./items\";\r\nimport { Vec3 } from \"../data_formats/Vec3\";\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[] = enum_values(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[] = enum_values(Episode);\r\n\r\nexport function check_episode(episode: Episode): void {\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[] = enum_values(SectionId);\r\n\r\nexport enum Difficulty {\r\n Normal,\r\n Hard,\r\n VHard,\r\n Ultimate,\r\n}\r\n\r\nexport const Difficulties: Difficulty[] = enum_values(Difficulty);\r\n\r\nexport class Section {\r\n id: number;\r\n @observable position: Vec3;\r\n @observable y_axis_rotation: number;\r\n\r\n @computed get sin_y_axis_rotation(): number {\r\n return Math.sin(this.y_axis_rotation);\r\n }\r\n\r\n @computed get cos_y_axis_rotation(): number {\r\n return Math.cos(this.y_axis_rotation);\r\n }\r\n\r\n constructor(id: number, position: Vec3, y_axis_rotation: number) {\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 y_axis_rotation !== \"number\") throw new Error(\"y_axis_rotation is required.\");\r\n\r\n this.id = id;\r\n this.position = position;\r\n this.y_axis_rotation = y_axis_rotation;\r\n }\r\n}\r\n\r\nexport class Quest {\r\n @observable id?: number;\r\n @observable name: string;\r\n @observable short_description: string;\r\n @observable long_description: string;\r\n @observable episode: Episode;\r\n @observable area_variants: 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 dat_unknowns: DatUnknown[];\r\n /**\r\n * (Partial) raw BIN data that can't be parsed yet by Phantasmal.\r\n */\r\n bin_data: BufferCursor;\r\n\r\n constructor(\r\n id: number | undefined,\r\n name: string,\r\n short_description: string,\r\n long_description: string,\r\n episode: Episode,\r\n area_variants: AreaVariant[],\r\n objects: QuestObject[],\r\n npcs: QuestNpc[],\r\n dat_unknowns: DatUnknown[],\r\n bin_data: BufferCursor\r\n ) {\r\n if (id != null && (!Number.isInteger(id) || id < 0))\r\n throw new Error(\"id should be undefined or a non-negative integer.\");\r\n check_episode(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.id = id;\r\n this.name = name;\r\n this.short_description = short_description;\r\n this.long_description = long_description;\r\n this.episode = episode;\r\n this.area_variants = area_variants;\r\n this.objects = objects;\r\n this.npcs = npcs;\r\n this.dat_unknowns = dat_unknowns;\r\n this.bin_data = bin_data;\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 area_id: number;\r\n\r\n private _section_id: number;\r\n\r\n @computed get section_id(): number {\r\n return this.section ? this.section.id : this._section_id;\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 section_position(): 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.sin_y_axis_rotation;\r\n const cos = this.section.cos_y_axis_rotation;\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 section_position(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.sin_y_axis_rotation;\r\n const cos = this.section.cos_y_axis_rotation;\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 @observable object_3d?: Object3D;\r\n\r\n constructor(area_id: number, section_id: number, position: Vec3, rotation: Vec3) {\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(area_id) || area_id < 0)\r\n throw new Error(`Expected area_id to be a non-negative integer, got ${area_id}.`);\r\n if (!Number.isInteger(section_id) || section_id < 0)\r\n throw new Error(`Expected section_id to be a non-negative integer, got ${section_id}.`);\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.area_id = area_id;\r\n this._section_id = section_id;\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 area_id: number,\r\n section_id: number,\r\n position: Vec3,\r\n rotation: Vec3,\r\n type: ObjectType,\r\n dat: DatObject\r\n ) {\r\n super(area_id, section_id, 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 area_id: number,\r\n section_id: number,\r\n position: Vec3,\r\n rotation: Vec3,\r\n type: NpcType,\r\n dat: DatNpc\r\n ) {\r\n super(area_id, section_id, 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 area_variants: AreaVariant[];\r\n\r\n constructor(id: number, name: string, order: number, area_variants: 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 (!area_variants) throw new Error(\"area_variants is required.\");\r\n\r\n this.id = id;\r\n this.name = name;\r\n this.order = order;\r\n this.area_variants = area_variants;\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 item_type: ItemType;\r\n anything_rate: number;\r\n rare_rate: 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 section_id: SectionId,\r\n readonly npc_type: NpcType,\r\n readonly item_type: ItemType,\r\n readonly anything_rate: number,\r\n readonly rare_rate: number\r\n ) {\r\n this.rate = anything_rate * rare_rate;\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 enemy_counts: Map<NpcType, number>;\r\n /**\r\n * The time it takes to complete the quest in hours.\r\n */\r\n readonly default_time: 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 user_time?: number;\r\n\r\n @computed get time(): number {\r\n return this.user_time != null ? this.user_time : this.default_time;\r\n }\r\n\r\n constructor(id: string, name: string, quest: SimpleQuest, default_time: number) {\r\n if (!id) throw new Error(\"id is required.\");\r\n if (default_time <= 0) throw new Error(\"default_time 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.enemy_counts = quest.enemy_counts;\r\n this.default_time = default_time;\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 enemy_counts: 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 (!enemy_counts) throw new Error(\"enemyCounts is required.\");\r\n }\r\n}\r\n\r\nexport class PlayerModel {\r\n constructor(\r\n public readonly name: string,\r\n public readonly head_style_count: number,\r\n public readonly hair_styles_count: number,\r\n public readonly hair_styles_with_accessory: Set<number>\r\n ) {}\r\n}\r\n\r\nexport class PlayerAnimation {\r\n constructor(public readonly id: number, public readonly name: string) {}\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(initial_value: T, load?: () => Promise<T>) {\r\n this._value = initial_value;\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.load_value());\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.load_value();\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 is_initialized(): 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 is_loading(): 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.load_value();\r\n }\r\n\r\n private async load_value(): Promise<T> {\r\n if (this.is_loading) 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 current_server: Server = Server.Ephinea;\r\n}\r\n\r\nexport const application_store = new ApplicationStore();\r\n","import { computed } from \"mobx\";\r\nimport { Server } from \"../domain\";\r\nimport { application_store } from \"./ApplicationStore\";\r\nimport { EnumMap } from \"../enums\";\r\n\r\n/**\r\n * Map with a guaranteed value per server.\r\n */\r\nexport class ServerMap<V> extends EnumMap<Server, V> {\r\n constructor(initial_value: (server: Server) => V) {\r\n super(Server, initial_value);\r\n }\r\n\r\n /**\r\n * @returns the value for the current server as set in {@link application_store}.\r\n */\r\n @computed get current(): V {\r\n return this.get(application_store.current_server);\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<HuntMethod[]>> = new ServerMap(\r\n server => new Loadable([], () => this.load_hunt_methods(server))\r\n );\r\n\r\n private storage_disposer?: IReactionDisposer;\r\n\r\n private async load_hunt_methods(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 total_count = 0;\r\n const enemy_counts = new Map<NpcType, number>();\r\n\r\n for (const [code, count] of Object.entries(quest.enemyCounts)) {\r\n const npc_type = NpcType.by_code(code);\r\n\r\n if (!npc_type) {\r\n logger.error(`No NpcType found for code ${code}.`);\r\n } else {\r\n enemy_counts.set(npc_type, count);\r\n total_count += 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(quest.id, quest.name, quest.episode, enemy_counts),\r\n /^\\d-\\d.*/.test(quest.name) ? 0.75 : total_count > 400 ? 0.75 : 0.5\r\n )\r\n );\r\n }\r\n\r\n this.load_from_local_storage(methods, server);\r\n return methods;\r\n }\r\n\r\n private load_from_local_storage = (methods: HuntMethod[], server: Server) => {\r\n try {\r\n const method_user_times_json = localStorage.getItem(\r\n `HuntMethodStore.methodUserTimes.${Server[server]}`\r\n );\r\n\r\n if (method_user_times_json) {\r\n const user_times: StoredUserTimes = JSON.parse(method_user_times_json);\r\n\r\n for (const method of methods) {\r\n method.user_time = user_times[method.id];\r\n }\r\n }\r\n\r\n if (this.storage_disposer) {\r\n this.storage_disposer();\r\n }\r\n\r\n this.storage_disposer = autorun(() => this.store_in_local_storage(methods, server));\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n };\r\n\r\n private store_in_local_storage = (methods: HuntMethod[], server: Server) => {\r\n try {\r\n const user_times: StoredUserTimes = {};\r\n\r\n for (const method of methods) {\r\n if (method.user_time != undefined) {\r\n user_times[method.id] = method.user_time;\r\n }\r\n }\r\n\r\n localStorage.setItem(\r\n `HuntMethodStore.methodUserTimes.${Server[server]}`,\r\n JSON.stringify(user_times)\r\n );\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n };\r\n}\r\n\r\ntype StoredUserTimes = { [method_id: string]: number };\r\n\r\nexport const hunt_method_store = new HuntMethodStore();\r\n","import { observable } from \"mobx\";\r\nimport {\r\n ItemType,\r\n Server,\r\n WeaponItemType,\r\n ArmorItemType,\r\n ShieldItemType,\r\n ToolItemType,\r\n UnitItemType,\r\n} from \"../domain\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { ServerMap } from \"./ServerMap\";\r\nimport { ItemTypeDto } from \"../dto\";\r\n\r\nexport class ItemTypeStore {\r\n private id_to_item_type: ItemType[] = [];\r\n\r\n @observable item_types: ItemType[] = [];\r\n\r\n get_by_id(id: number): ItemType | undefined {\r\n return this.id_to_item_type[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: ItemTypeDto[] = await response.json();\r\n\r\n const item_types = new Array<ItemType>();\r\n\r\n for (const item_type_dto of data) {\r\n let item_type: ItemType;\r\n\r\n switch (item_type_dto.class) {\r\n case \"weapon\":\r\n item_type = new WeaponItemType(\r\n item_type_dto.id,\r\n item_type_dto.name,\r\n item_type_dto.minAtp,\r\n item_type_dto.maxAtp,\r\n item_type_dto.ata,\r\n item_type_dto.maxGrind,\r\n item_type_dto.requiredAtp\r\n );\r\n break;\r\n case \"armor\":\r\n item_type = new ArmorItemType(\r\n item_type_dto.id,\r\n item_type_dto.name,\r\n item_type_dto.atp,\r\n item_type_dto.ata,\r\n item_type_dto.minEvp,\r\n item_type_dto.maxEvp,\r\n item_type_dto.minDfp,\r\n item_type_dto.maxDfp,\r\n item_type_dto.mst,\r\n item_type_dto.hp,\r\n item_type_dto.lck\r\n );\r\n break;\r\n case \"shield\":\r\n item_type = new ShieldItemType(\r\n item_type_dto.id,\r\n item_type_dto.name,\r\n item_type_dto.atp,\r\n item_type_dto.ata,\r\n item_type_dto.minEvp,\r\n item_type_dto.maxEvp,\r\n item_type_dto.minDfp,\r\n item_type_dto.maxDfp,\r\n item_type_dto.mst,\r\n item_type_dto.hp,\r\n item_type_dto.lck\r\n );\r\n break;\r\n case \"unit\":\r\n item_type = new UnitItemType(item_type_dto.id, item_type_dto.name);\r\n break;\r\n case \"tool\":\r\n item_type = new ToolItemType(item_type_dto.id, item_type_dto.name);\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n this.id_to_item_type[item_type.id] = item_type;\r\n item_types.push(item_type);\r\n }\r\n\r\n this.item_types = item_types;\r\n\r\n return this;\r\n };\r\n}\r\n\r\nexport const item_type_stores: 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 {\r\n Difficulties,\r\n Difficulty,\r\n EnemyDrop,\r\n NpcType,\r\n SectionId,\r\n SectionIds,\r\n Server,\r\n} from \"../domain\";\r\nimport { NpcTypes } from \"../domain/NpcType\";\r\nimport { EnemyDropDto } from \"../dto\";\r\nimport { Loadable } from \"../Loadable\";\r\nimport { item_type_stores } 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\nexport class EnemyDropTable {\r\n // Mapping of difficulties to section IDs to NpcTypes to EnemyDrops.\r\n private table: EnemyDrop[] = new Array(\r\n Difficulties.length * SectionIds.length * NpcTypes.length\r\n );\r\n\r\n // Mapping of ItemType ids to EnemyDrops.\r\n private item_type_to_drops: EnemyDrop[][] = [];\r\n\r\n get_drop(\r\n difficulty: Difficulty,\r\n section_id: SectionId,\r\n npc_type: NpcType\r\n ): EnemyDrop | undefined {\r\n return this.table[\r\n difficulty * SectionIds.length * NpcTypes.length +\r\n section_id * NpcTypes.length +\r\n npc_type.id\r\n ];\r\n }\r\n\r\n set_drop(\r\n difficulty: Difficulty,\r\n section_id: SectionId,\r\n npc_type: NpcType,\r\n drop: EnemyDrop\r\n ): void {\r\n this.table[\r\n difficulty * SectionIds.length * NpcTypes.length +\r\n section_id * NpcTypes.length +\r\n npc_type.id\r\n ] = drop;\r\n\r\n let drops = this.item_type_to_drops[drop.item_type.id];\r\n\r\n if (!drops) {\r\n drops = [];\r\n this.item_type_to_drops[drop.item_type.id] = drops;\r\n }\r\n\r\n drops.push(drop);\r\n }\r\n\r\n get_drops_for_item_type(item_type_id: number): EnemyDrop[] {\r\n return this.item_type_to_drops[item_type_id] || [];\r\n }\r\n}\r\n\r\nexport class ItemDropStore {\r\n @observable.ref enemy_drops: EnemyDropTable = new EnemyDropTable();\r\n}\r\n\r\nexport const item_drop_stores: ServerMap<Loadable<ItemDropStore>> = new ServerMap(server => {\r\n const store = new ItemDropStore();\r\n return new Loadable(store, () => load(store, server));\r\n});\r\n\r\nasync function load(store: ItemDropStore, server: Server): Promise<ItemDropStore> {\r\n const item_type_store = await item_type_stores.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: EnemyDropDto[] = await response.json();\r\n\r\n const drops = new EnemyDropTable();\r\n\r\n for (const drop_dto of data) {\r\n const npc_type = NpcType.by_code(drop_dto.enemy);\r\n\r\n if (!npc_type) {\r\n logger.warn(\r\n `Couldn't determine NpcType of episode ${drop_dto.episode} ${drop_dto.enemy}.`\r\n );\r\n continue;\r\n }\r\n\r\n const difficulty = (Difficulty as any)[drop_dto.difficulty];\r\n const item_type = item_type_store.get_by_id(drop_dto.itemTypeId);\r\n\r\n if (!item_type) {\r\n logger.warn(`Couldn't find item kind ${drop_dto.itemTypeId}.`);\r\n continue;\r\n }\r\n\r\n const section_id = (SectionId as any)[drop_dto.sectionId];\r\n\r\n if (section_id == null) {\r\n logger.warn(`Couldn't find section ID ${drop_dto.sectionId}.`);\r\n continue;\r\n }\r\n\r\n drops.set_drop(\r\n difficulty,\r\n section_id,\r\n npc_type,\r\n new EnemyDrop(\r\n difficulty,\r\n section_id,\r\n npc_type,\r\n item_type,\r\n drop_dto.dropRate,\r\n drop_dto.rareRate\r\n )\r\n );\r\n }\r\n\r\n store.enemy_drops = drops;\r\n return store;\r\n}\r\n","import solver from \"javascript-lp-solver\";\r\nimport { autorun, IObservableArray, observable, computed } from \"mobx\";\r\nimport {\r\n Difficulties,\r\n Difficulty,\r\n HuntMethod,\r\n ItemType,\r\n KONDRIEU_PROB,\r\n NpcType,\r\n RARE_ENEMY_PROB,\r\n SectionId,\r\n SectionIds,\r\n Server,\r\n Episode,\r\n} from \"../domain\";\r\nimport { application_store } from \"./ApplicationStore\";\r\nimport { hunt_method_store } from \"./HuntMethodStore\";\r\nimport { item_drop_stores } from \"./ItemDropStore\";\r\nimport { item_type_stores } 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 item_type: ItemType;\r\n @observable amount: number;\r\n\r\n constructor(item_type: ItemType, amount: number) {\r\n this.item_type = item_type;\r\n this.amount = amount;\r\n }\r\n}\r\n\r\nexport class OptimalResult {\r\n readonly wanted_items: ItemType[];\r\n readonly optimal_methods: OptimalMethod[];\r\n\r\n constructor(wanted_items: ItemType[], optimal_methods: OptimalMethod[]) {\r\n this.wanted_items = wanted_items;\r\n this.optimal_methods = optimal_methods;\r\n }\r\n}\r\n\r\nexport class OptimalMethod {\r\n readonly difficulty: Difficulty;\r\n readonly section_ids: SectionId[];\r\n readonly method_name: string;\r\n readonly method_episode: Episode;\r\n readonly method_time: number;\r\n readonly runs: number;\r\n readonly total_time: number;\r\n readonly item_counts: Map<ItemType, number>;\r\n\r\n constructor(\r\n difficulty: Difficulty,\r\n section_ids: SectionId[],\r\n method_name: string,\r\n method_episode: Episode,\r\n method_time: number,\r\n runs: number,\r\n item_counts: Map<ItemType, number>\r\n ) {\r\n this.difficulty = difficulty;\r\n this.section_ids = section_ids;\r\n this.method_name = method_name;\r\n this.method_episode = method_episode;\r\n this.method_time = method_time;\r\n this.runs = runs;\r\n this.total_time = runs * method_time;\r\n this.item_counts = item_counts;\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 huntable_item_types(): ItemType[] {\r\n const item_drop_store = item_drop_stores.current.value;\r\n return item_type_stores.current.value.item_types.filter(\r\n i => item_drop_store.enemy_drops.get_drops_for_item_type(i.id).length\r\n );\r\n }\r\n\r\n // TODO: wanted items per server.\r\n @observable readonly wanted_items: 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.wanted_items.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 wanted_items = new Set(\r\n this.wanted_items.filter(w => w.amount > 0).map(w => w.item_type)\r\n );\r\n\r\n const methods = await hunt_method_store.methods.current.promise;\r\n const drop_table = (await item_drop_stores.current.promise).enemy_drops;\r\n\r\n // Add a constraint per wanted item.\r\n const constraints: { [item_name: string]: { min: number } } = {};\r\n\r\n for (const wanted of this.wanted_items) {\r\n constraints[wanted.item_type.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 [item_name: string]: number;\r\n };\r\n const variables: { [method_name: string]: Variable } = {};\r\n\r\n type VariableDetails = {\r\n method: HuntMethod;\r\n difficulty: Difficulty;\r\n section_id: SectionId;\r\n split_pan_arms: boolean;\r\n };\r\n const variable_details: 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.enemy_counts.entries()) {\r\n const old_count = counts.get(enemy) || 0;\r\n\r\n if (enemy.rare_type == null) {\r\n counts.set(enemy, old_count + count);\r\n } else {\r\n let rate, rare_rate;\r\n\r\n if (enemy.rare_type === NpcType.Kondrieu) {\r\n rate = 1 - KONDRIEU_PROB;\r\n rare_rate = KONDRIEU_PROB;\r\n } else {\r\n rate = 1 - RARE_ENEMY_PROB;\r\n rare_rate = RARE_ENEMY_PROB;\r\n }\r\n\r\n counts.set(enemy, old_count + count * rate);\r\n counts.set(\r\n enemy.rare_type,\r\n (counts.get(enemy.rare_type) || 0) + count * rare_rate\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 counts_list: Map<NpcType, number>[] = [counts];\r\n const pan_arms_count = counts.get(NpcType.PanArms);\r\n\r\n if (pan_arms_count) {\r\n const split_counts = new Map(counts);\r\n\r\n split_counts.delete(NpcType.PanArms);\r\n split_counts.set(NpcType.Migium, pan_arms_count);\r\n split_counts.set(NpcType.Hidoom, pan_arms_count);\r\n\r\n counts_list.push(split_counts);\r\n }\r\n\r\n const pan_arms_2_count = counts.get(NpcType.PanArms2);\r\n\r\n if (pan_arms_2_count) {\r\n const split_counts = new Map(counts);\r\n\r\n split_counts.delete(NpcType.PanArms2);\r\n split_counts.set(NpcType.Migium2, pan_arms_2_count);\r\n split_counts.set(NpcType.Hidoom2, pan_arms_2_count);\r\n\r\n counts_list.push(split_counts);\r\n }\r\n\r\n for (let i = 0; i < counts_list.length; i++) {\r\n const counts = counts_list[i];\r\n const split_pan_arms = i === 1;\r\n\r\n for (const difficulty of Difficulties) {\r\n for (const section_id 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 add_variable = false;\r\n\r\n for (const [npc_type, count] of counts.entries()) {\r\n const drop = drop_table.get_drop(difficulty, section_id, npc_type);\r\n\r\n if (drop && wanted_items.has(drop.item_type)) {\r\n const value = variable[drop.item_type.name] || 0;\r\n variable[drop.item_type.name] = value + count * drop.rate;\r\n add_variable = true;\r\n }\r\n }\r\n\r\n if (add_variable) {\r\n const name = this.full_method_name(\r\n difficulty,\r\n section_id,\r\n method,\r\n split_pan_arms\r\n );\r\n variables[name] = variable;\r\n variable_details.set(name, {\r\n method,\r\n difficulty,\r\n section_id,\r\n split_pan_arms,\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 optimal_methods: OptimalMethod[] = [];\r\n\r\n // Loop over the entries in result, ignore standard properties that aren't variables.\r\n for (const [variable_name, runs_or_other] of Object.entries(result)) {\r\n const details = variable_details.get(variable_name);\r\n\r\n if (details) {\r\n const { method, difficulty, section_id, split_pan_arms } = details;\r\n const runs = runs_or_other as number;\r\n const variable = variables[variable_name];\r\n\r\n const items = new Map<ItemType, number>();\r\n\r\n for (const [item_name, expected_amount] of Object.entries(variable)) {\r\n for (const item of wanted_items) {\r\n if (item_name === item.name) {\r\n items.set(item, runs * expected_amount);\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 section_ids: SectionId[] = [];\r\n\r\n for (const sid of SectionIds) {\r\n let match_found = true;\r\n\r\n if (sid !== section_id) {\r\n const v =\r\n variables[\r\n this.full_method_name(difficulty, sid, method, split_pan_arms)\r\n ];\r\n\r\n if (!v) {\r\n match_found = false;\r\n } else {\r\n for (const item_name of Object.keys(variable)) {\r\n if (variable[item_name] !== v[item_name]) {\r\n match_found = false;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (match_found) {\r\n section_ids.push(sid);\r\n }\r\n }\r\n\r\n optimal_methods.push(\r\n new OptimalMethod(\r\n difficulty,\r\n section_ids,\r\n method.name + (split_pan_arms ? \" (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\r\n this.result = new OptimalResult([...wanted_items], optimal_methods);\r\n };\r\n\r\n private full_method_name(\r\n difficulty: Difficulty,\r\n section_id: SectionId,\r\n method: HuntMethod,\r\n split_pan_arms: boolean\r\n ): string {\r\n let name = `${difficulty}\\t${section_id}\\t${method.id}`;\r\n if (split_pan_arms) name += \"\\tspa\";\r\n return name;\r\n }\r\n\r\n private initialize = async () => {\r\n try {\r\n await this.load_from_local_storage();\r\n autorun(this.store_in_local_storage);\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n };\r\n\r\n private load_from_local_storage = async () => {\r\n const wanted_items_json = localStorage.getItem(\r\n `HuntOptimizerStore.wantedItems.${Server[application_store.current_server]}`\r\n );\r\n\r\n if (wanted_items_json) {\r\n const item_store = await item_type_stores.current.promise;\r\n const wi: StoredWantedItem[] = JSON.parse(wanted_items_json);\r\n\r\n const wanted_items: WantedItem[] = [];\r\n\r\n for (const { itemTypeId, itemKindId, amount } of wi) {\r\n const item =\r\n itemTypeId != undefined\r\n ? item_store.get_by_id(itemTypeId)\r\n : item_store.get_by_id(itemKindId!);\r\n\r\n if (item) {\r\n wanted_items.push(new WantedItem(item, amount));\r\n }\r\n }\r\n\r\n this.wanted_items.replace(wanted_items);\r\n }\r\n };\r\n\r\n private store_in_local_storage = () => {\r\n try {\r\n localStorage.setItem(\r\n `HuntOptimizerStore.wantedItems.${Server[application_store.current_server]}`,\r\n JSON.stringify(\r\n this.wanted_items.map(\r\n ({ item_type: itemType, amount }): StoredWantedItem => ({\r\n itemTypeId: itemType.id,\r\n amount,\r\n })\r\n )\r\n )\r\n );\r\n } catch (e) {\r\n logger.error(e);\r\n }\r\n };\r\n}\r\n\r\ntype StoredWantedItem = {\r\n itemTypeId?: number; // Should only be undefined if the legacy name is still used.\r\n itemKindId?: number; // Legacy name.\r\n amount: number;\r\n};\r\n\r\nexport const hunt_optimizer_store = new HuntOptimizerStore();\r\n","import React, { PureComponent, ReactNode } from \"react\";\r\nimport {\r\n OptionValues,\r\n ReactAsyncSelectProps,\r\n ReactCreatableSelectProps,\r\n ReactSelectProps,\r\n} 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<\r\n VirtualizedSelectProps<TValue>\r\n> {\r\n render(): ReactNode {\r\n return <VirtualizedSelect className=\"BigSelect\" {...this.props} />;\r\n }\r\n}\r\n\r\n// Copied from react-virtualized-select.\r\ntype VirtualizedSelectProps<TValue = OptionValues> =\r\n | (ReactCreatableSelectProps<TValue> &\r\n ReactAsyncSelectProps<TValue> &\r\n AdditionalVirtualizedSelectProps<TValue> & { async: true })\r\n | ReactCreatableSelectProps<TValue> &\r\n ReactSelectProps<TValue> &\r\n AdditionalVirtualizedSelectProps<TValue>;\r\n","import { Button, InputNumber, Popover } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { ReactNode, Component } from \"react\";\r\nimport { AutoSizer, Column, Table, TableCellRenderer } from \"react-virtualized\";\r\nimport { hunt_optimizer_store, WantedItem } from \"../../stores/HuntOptimizerStore\";\r\nimport { item_type_stores } from \"../../stores/ItemTypeStore\";\r\nimport { BigSelect } from \"../BigSelect\";\r\nimport \"./WantedItemsComponent.less\";\r\n\r\n@observer\r\nexport class WantedItemsComponent extends Component {\r\n state = {\r\n help_visible: false,\r\n };\r\n\r\n render(): ReactNode {\r\n // Make sure render is called on updates.\r\n hunt_optimizer_store.wanted_items.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.help_visible}\r\n onVisibleChange={this.on_help_visible_change}\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={hunt_optimizer_store.huntable_item_types.map(itemType => ({\r\n label: itemType.name,\r\n value: itemType.id,\r\n }))}\r\n onChange={this.add_wanted}\r\n />\r\n <Button onClick={hunt_optimizer_store.optimize} style={{ marginLeft: 10 }}>\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={hunt_optimizer_store.wanted_items.length}\r\n rowGetter={({ index }) => hunt_optimizer_store.wanted_items[index]}\r\n noRowsRenderer={this.no_rows_renderer}\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).item_type.name\r\n }\r\n />\r\n <Column\r\n dataKey=\"remove\"\r\n width={30}\r\n cellRenderer={this.table_remove_cell_renderer}\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 add_wanted = (selected: any) => {\r\n if (selected) {\r\n let added = hunt_optimizer_store.wanted_items.find(\r\n w => w.item_type.id === selected.value\r\n );\r\n\r\n if (!added) {\r\n const item_type = item_type_stores.current.value.get_by_id(selected.value)!;\r\n hunt_optimizer_store.wanted_items.push(new WantedItem(item_type, 1));\r\n }\r\n }\r\n };\r\n\r\n private remove_wanted = (wanted: WantedItem) => () => {\r\n const i = hunt_optimizer_store.wanted_items.findIndex(w => w === wanted);\r\n\r\n if (i !== -1) {\r\n hunt_optimizer_store.wanted_items.splice(i, 1);\r\n }\r\n };\r\n\r\n private table_remove_cell_renderer: TableCellRenderer = ({ rowData }) => {\r\n return <Button type=\"link\" icon=\"delete\" onClick={this.remove_wanted(rowData)} />;\r\n };\r\n\r\n private no_rows_renderer = () => {\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\r\n on the right.\r\n </p>\r\n </div>\r\n );\r\n };\r\n\r\n private on_help_visible_change = (visible: boolean) => {\r\n this.setState({ helpVisible: visible });\r\n };\r\n}\r\n\r\nfunction Help(): JSX.Element {\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\r\n 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\r\n coming. View the list of methods on the \"Methods\" tab. Each method takes a certain\r\n amount of time, which affects the optimization result. Make sure the times are\r\n correct for you.\r\n </p>\r\n <p>Only enemy drops are considered. Box drops are coming.</p>\r\n <p>\r\n The optimal result is calculated using linear optimization. The optimizer takes rare\r\n 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 Component<{ wantedItem: WantedItem }> {\r\n render(): ReactNode {\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.wanted_amount_changed}\r\n size=\"small\"\r\n style={{ width: \"100%\" }}\r\n />\r\n );\r\n }\r\n\r\n private wanted_amount_changed = (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, Component } from \"react\";\r\nimport {\r\n GridCellRenderer,\r\n Index,\r\n MultiGrid,\r\n SortDirectionType,\r\n SortDirection,\r\n} from \"react-virtualized\";\r\nimport \"./BigTable.less\";\r\n\r\nexport interface Column<T> {\r\n key?: string;\r\n name: string;\r\n width: number;\r\n cell_renderer: (record: T) => ReactNode;\r\n tooltip?: (record: T) => string;\r\n footer_value?: string;\r\n footer_tooltip?: string;\r\n /**\r\n * \"number\" and \"integrated\" have special meaning.\r\n */\r\n class_name?: 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 Component<{\r\n width: number;\r\n height: number;\r\n row_count: number;\r\n overscan_row_count?: number;\r\n columns: Column<T>[];\r\n fixed_column_count?: number;\r\n overscan_column_count?: 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 update_trigger?: any;\r\n sort?: (sort_columns: ColumnSort<T>[]) => void;\r\n}> {\r\n private sort_columns = new Array<ColumnSort<T>>();\r\n\r\n render(): ReactNode {\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.row_count + 1 + (this.props.footer ? 1 : 0)}\r\n fixedRowCount={1}\r\n overscanRowCount={this.props.overscan_row_count}\r\n columnWidth={this.column_width}\r\n columnCount={this.props.columns.length}\r\n fixedColumnCount={this.props.fixed_column_count}\r\n overscanColumnCount={this.props.overscan_column_count}\r\n cellRenderer={this.cell_renderer}\r\n classNameTopLeftGrid=\"DataTable-header\"\r\n classNameTopRightGrid=\"DataTable-header\"\r\n updateTigger={this.props.update_trigger}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private column_width = ({ index }: Index): number => {\r\n return this.props.columns[index].width;\r\n };\r\n\r\n private cell_renderer: GridCellRenderer = ({ columnIndex, rowIndex, style }): ReactNode => {\r\n const column = this.props.columns[columnIndex];\r\n let cell: ReactNode;\r\n let sort_indicator: 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.sort_columns[0];\r\n\r\n if (sort && sort.column === column) {\r\n if (sort.direction === SortDirection.ASC) {\r\n sort_indicator = (\r\n <svg\r\n className=\"DataTable-sort-indictator\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n >\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 sort_indicator = (\r\n <svg\r\n className=\"DataTable-sort-indictator\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 24 24\"\r\n >\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.class_name) {\r\n classes.push(column.class_name);\r\n }\r\n\r\n if (this.props.footer && rowIndex === 1 + this.props.row_count) {\r\n // Footer row\r\n classes.push(\"footer-cell\");\r\n cell = column.footer_value == null ? \"\" : column.footer_value;\r\n title = column.footer_tooltip == null ? \"\" : column.footer_tooltip;\r\n } else {\r\n // Record row\r\n const result = this.props.record({ index: rowIndex - 1 });\r\n\r\n cell = column.cell_renderer(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 on_click =\r\n rowIndex === 0 && column.sortable ? () => this.header_clicked(column) : 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={on_click}\r\n >\r\n {typeof cell === \"string\" ? (\r\n <span className=\"DataTable-cell-text\">{cell}</span>\r\n ) : (\r\n cell\r\n )}\r\n {sort_indicator}\r\n </div>\r\n );\r\n };\r\n\r\n private header_clicked = (column: Column<T>): void => {\r\n const old_index = this.sort_columns.findIndex(sc => sc.column === column);\r\n let old = old_index === -1 ? undefined : this.sort_columns.splice(old_index, 1)[0];\r\n\r\n const direction =\r\n old_index === 0 && old && old.direction === SortDirection.ASC\r\n ? SortDirection.DESC\r\n : SortDirection.ASC;\r\n\r\n this.sort_columns.unshift({ column, direction });\r\n this.sort_columns.splice(10);\r\n\r\n if (this.props.sort) {\r\n this.props.sort(this.sort_columns);\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 section_id,\r\n size = 28,\r\n title,\r\n}: {\r\n section_id: SectionId;\r\n size?: number;\r\n title?: string;\r\n}): JSX.Element {\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[section_id]}.png)`,\r\n backgroundSize: size,\r\n }}\r\n />\r\n );\r\n}\r\n","import { computed } from \"mobx\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { Component, ReactNode } from \"react\";\r\nimport { AutoSizer, Index } from \"react-virtualized\";\r\nimport { Difficulty, Episode, SectionId } from \"../../domain\";\r\nimport { hunt_optimizer_store, OptimalMethod } from \"../../stores/HuntOptimizerStore\";\r\nimport { BigTable, Column } from \"../BigTable\";\r\nimport { SectionIdIcon } from \"../SectionIdIcon\";\r\nimport { hours_to_string } from \"../time\";\r\nimport \"./OptimizationResultComponent.less\";\r\n\r\n@observer\r\nexport class OptimizationResultComponent extends Component {\r\n @computed private get columns(): Column<OptimalMethod>[] {\r\n // Standard columns.\r\n const result = hunt_optimizer_store.result;\r\n const optimal_methods = result ? result.optimal_methods : [];\r\n let total_runs = 0;\r\n let total_time = 0;\r\n\r\n for (const method of optimal_methods) {\r\n total_runs += method.runs;\r\n total_time += method.total_time;\r\n }\r\n\r\n const columns: Column<OptimalMethod>[] = [\r\n {\r\n name: \"Difficulty\",\r\n width: 75,\r\n cell_renderer: result => Difficulty[result.difficulty],\r\n footer_value: \"Totals:\",\r\n },\r\n {\r\n name: \"Method\",\r\n width: 200,\r\n cell_renderer: result => result.method_name,\r\n tooltip: result => result.method_name,\r\n },\r\n {\r\n name: \"Ep.\",\r\n width: 34,\r\n cell_renderer: result => Episode[result.method_episode],\r\n },\r\n {\r\n name: \"Section ID\",\r\n width: 80,\r\n cell_renderer: result => (\r\n <div className=\"ho-OptimizationResultComponent-sid-col\">\r\n {result.section_ids.map(sid => (\r\n <SectionIdIcon section_id={sid} key={sid} size={20} />\r\n ))}\r\n </div>\r\n ),\r\n tooltip: result => result.section_ids.map(sid => SectionId[sid]).join(\", \"),\r\n },\r\n {\r\n name: \"Time/Run\",\r\n width: 80,\r\n cell_renderer: result => hours_to_string(result.method_time),\r\n class_name: \"number\",\r\n },\r\n {\r\n name: \"Runs\",\r\n width: 60,\r\n cell_renderer: result => result.runs.toFixed(1),\r\n tooltip: result => result.runs.toString(),\r\n footer_value: total_runs.toFixed(1),\r\n footer_tooltip: total_runs.toString(),\r\n class_name: \"number\",\r\n },\r\n {\r\n name: \"Total Hours\",\r\n width: 90,\r\n cell_renderer: result => result.total_time.toFixed(1),\r\n tooltip: result => result.total_time.toString(),\r\n footer_value: total_time.toFixed(1),\r\n footer_tooltip: total_time.toString(),\r\n class_name: \"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.wanted_items) {\r\n let totalCount = 0;\r\n\r\n for (const method of optimal_methods) {\r\n totalCount += method.item_counts.get(item) || 0;\r\n }\r\n\r\n columns.push({\r\n name: item.name,\r\n width: 80,\r\n cell_renderer: result => {\r\n const count = result.item_counts.get(item);\r\n return count ? count.toFixed(2) : \"\";\r\n },\r\n tooltip: result => {\r\n const count = result.item_counts.get(item);\r\n return count ? count.toString() : \"\";\r\n },\r\n class_name: \"number\",\r\n footer_value: totalCount.toFixed(2),\r\n footer_tooltip: 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 update_trigger(): any {\r\n return hunt_optimizer_store.result;\r\n }\r\n\r\n render(): ReactNode {\r\n this.update_trigger; // eslint-disable-line\r\n const result = hunt_optimizer_store.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 row_count={result ? result.optimal_methods.length : 0}\r\n columns={this.columns}\r\n fixed_column_count={4}\r\n record={this.record}\r\n footer={result != null}\r\n update_trigger={this.update_trigger}\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 hunt_optimizer_store.result!.optimal_methods[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 hours_to_string(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(): JSX.Element {\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, { ReactNode, Component } 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 { hunt_method_store } from \"../../stores/HuntMethodStore\";\r\nimport { BigTable, Column, ColumnSort } from \"../BigTable\";\r\nimport \"./MethodsComponent.css\";\r\n\r\n@observer\r\nexport class MethodsComponent extends Component {\r\n static columns: 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 cell_renderer: 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 cell_renderer: 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 cell_renderer: method => <TimeComponent method={method} />,\r\n class_name: \"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 cell_renderer: method => {\r\n const count = method.enemy_counts.get(enemy);\r\n return count == null ? \"\" : count.toString();\r\n },\r\n class_name: \"number\",\r\n sortable: true,\r\n });\r\n }\r\n\r\n return columns;\r\n })();\r\n\r\n render(): ReactNode {\r\n const methods = hunt_method_store.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 row_count={methods.length}\r\n columns={MethodsComponent.columns}\r\n fixed_column_count={3}\r\n record={this.record}\r\n sort={this.sort}\r\n update_trigger={hunt_method_store.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 hunt_method_store.methods.current.value[index];\r\n };\r\n\r\n private sort = (sorts: ColumnSort<HuntMethod>[]) => {\r\n const methods = hunt_method_store.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.by_code(column.key);\r\n\r\n if (type) {\r\n cmp = (a.enemy_counts.get(type) || 0) - (b.enemy_counts.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 hunt_method_store.methods.current.value = methods;\r\n };\r\n}\r\n\r\n@observer\r\nclass TimeComponent extends React.Component<{ method: HuntMethod }> {\r\n render(): ReactNode {\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.user_time = 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(): JSX.Element {\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","import Logger from \"js-logger\";\r\nimport {\r\n BufferGeometry,\r\n DoubleSide,\r\n Face3,\r\n Float32BufferAttribute,\r\n Geometry,\r\n Mesh,\r\n MeshBasicMaterial,\r\n MeshLambertMaterial,\r\n Object3D,\r\n TriangleStripDrawMode,\r\n Uint16BufferAttribute,\r\n Vector3,\r\n} from \"three\";\r\nimport { Section } from \"../../domain\";\r\nimport { Vec3 } from \"../Vec3\";\r\n\r\nconst logger = Logger.get(\"data_formats/parsing/geometry\");\r\n\r\nexport function parse_c_rel(array_buffer: ArrayBuffer): Object3D {\r\n const dv = new DataView(array_buffer);\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 wireframe_materials = [\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 main_block_offset = dv.getUint32(dv.byteLength - 16, true);\r\n const main_offset_table_offset = dv.getUint32(main_block_offset, true);\r\n\r\n for (\r\n let i = main_offset_table_offset;\r\n i === main_offset_table_offset || dv.getUint32(i) !== 0;\r\n i += 24\r\n ) {\r\n const block_geometry = new Geometry();\r\n\r\n const block_trailer_offset = dv.getUint32(i, true);\r\n const vertex_count = dv.getUint32(block_trailer_offset, true);\r\n const vertex_table_offset = dv.getUint32(block_trailer_offset + 4, true);\r\n const vertex_table_end = vertex_table_offset + 12 * vertex_count;\r\n const triangle_count = dv.getUint32(block_trailer_offset + 8, true);\r\n const triangle_table_offset = dv.getUint32(block_trailer_offset + 12, true);\r\n const triangle_table_end = triangle_table_offset + 36 * triangle_count;\r\n\r\n for (let j = vertex_table_offset; j < vertex_table_end; 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 block_geometry.vertices.push(new Vector3(x, y, z));\r\n }\r\n\r\n for (let j = triangle_table_offset; j < triangle_table_end; 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 is_section_transition = flags & 0b1000000;\r\n const is_vegetation = flags & 0b10000;\r\n const is_ground = flags & 0b1;\r\n const color_index = is_section_transition ? 3 : is_vegetation ? 2 : is_ground ? 1 : 0;\r\n\r\n block_geometry.faces.push(new Face3(v1, v2, v3, n, undefined, color_index));\r\n }\r\n\r\n const mesh = new Mesh(block_geometry, materials);\r\n mesh.renderOrder = 1;\r\n object.add(mesh);\r\n\r\n const wireframe_mesh = new Mesh(block_geometry, wireframe_materials);\r\n wireframe_mesh.renderOrder = 2;\r\n object.add(wireframe_mesh);\r\n }\r\n\r\n return object;\r\n}\r\n\r\nexport function parse_n_rel(\r\n array_buffer: ArrayBuffer\r\n): { sections: Section[]; object_3d: Object3D } {\r\n const dv = new DataView(array_buffer);\r\n const sections = new Map();\r\n\r\n const object = new Object3D();\r\n\r\n const main_block_offset = dv.getUint32(dv.byteLength - 16, true);\r\n const section_count = dv.getUint32(main_block_offset + 8, true);\r\n const section_table_offset = dv.getUint32(main_block_offset + 16, true);\r\n // const texture_name_offset = dv.getUint32(main_block_offset + 20, true);\r\n\r\n for (let i = section_table_offset; i < section_table_offset + section_count * 52; i += 52) {\r\n const section_id = dv.getInt32(i, true);\r\n const section_x = dv.getFloat32(i + 4, true);\r\n const section_y = dv.getFloat32(i + 8, true);\r\n const section_z = dv.getFloat32(i + 12, true);\r\n const section_rotation = (dv.getInt32(i + 20, true) / 0xffff) * 2 * Math.PI;\r\n const section = new Section(\r\n section_id,\r\n new Vec3(section_x, section_y, section_z),\r\n section_rotation\r\n );\r\n sections.set(section_id, section);\r\n\r\n const index_lists_list = [];\r\n const position_lists_list = [];\r\n const normal_lists_list = [];\r\n\r\n const simple_geometry_offset_table_offset = dv.getUint32(i + 32, true);\r\n // const complex_geometry_offset_table_offset = dv.getUint32(i + 36, true);\r\n const simple_geometry_offset_count = dv.getUint32(i + 40, true);\r\n // const complex_geometry_offset_count = dv.getUint32(i + 44, true);\r\n\r\n for (\r\n let j = simple_geometry_offset_table_offset;\r\n j < simple_geometry_offset_table_offset + simple_geometry_offset_count * 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 geometry_offset = dv.getUint32(offset + 4, true);\r\n\r\n if (geometry_offset > 0) {\r\n const vertex_info_table_offset = dv.getUint32(geometry_offset + 4, true);\r\n const vertex_info_count = dv.getUint32(geometry_offset + 8, true);\r\n const triangle_strip_table_offset = dv.getUint32(geometry_offset + 12, true);\r\n const triangle_strip_count = dv.getUint32(geometry_offset + 16, true);\r\n // const transparent_object_table_offset = dv.getUint32(blockOffset + 20, true);\r\n // const transparent_object_count = dv.getUint32(blockOffset + 24, true);\r\n\r\n const geom_index_lists = [];\r\n\r\n for (\r\n let k = triangle_strip_table_offset;\r\n k < triangle_strip_table_offset + triangle_strip_count * 20;\r\n k += 20\r\n ) {\r\n // const flag_and_texture_id_offset = dv.getUint32(k, true);\r\n // const data_type = dv.getUint32(k + 4, true);\r\n const triangle_strip_index_table_offset = dv.getUint32(k + 8, true);\r\n const triangle_strip_index_count = dv.getUint32(k + 12, true);\r\n\r\n const triangle_strip_indices = [];\r\n\r\n for (\r\n let l = triangle_strip_index_table_offset;\r\n l < triangle_strip_index_table_offset + triangle_strip_index_count * 2;\r\n l += 2\r\n ) {\r\n triangle_strip_indices.push(dv.getUint16(l, true));\r\n }\r\n\r\n geom_index_lists.push(triangle_strip_indices);\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 (vertex_info_count > 1) {\r\n logger.warn(\r\n `Vertex info count of ${vertex_info_count} was larger than expected.`\r\n );\r\n }\r\n\r\n // const vertex_type = dv.getUint32(vertexInfoTableOffset, true);\r\n const vertex_table_offset = dv.getUint32(vertex_info_table_offset + 4, true);\r\n const vertex_size = dv.getUint32(vertex_info_table_offset + 8, true);\r\n const vertex_count = dv.getUint32(vertex_info_table_offset + 12, true);\r\n\r\n const geom_positions = [];\r\n const geom_normals = [];\r\n\r\n for (\r\n let k = vertex_table_offset;\r\n k < vertex_table_offset + vertex_count * vertex_size;\r\n k += vertex_size\r\n ) {\r\n let n_x, n_y, n_z;\r\n\r\n switch (vertex_size) {\r\n case 16:\r\n case 24:\r\n // TODO: are these values sensible?\r\n n_x = 0;\r\n n_y = 1;\r\n n_z = 0;\r\n break;\r\n case 28:\r\n case 36:\r\n n_x = dv.getFloat32(k + 12, true);\r\n n_y = dv.getFloat32(k + 16, true);\r\n n_z = 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 ${vertex_size}.`);\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 rotated_x =\r\n section.cos_y_axis_rotation * x + section.sin_y_axis_rotation * z;\r\n const rotated_z =\r\n -section.sin_y_axis_rotation * x + section.cos_y_axis_rotation * z;\r\n\r\n geom_positions.push(section_x + rotated_x);\r\n geom_positions.push(section_y + y);\r\n geom_positions.push(section_z + rotated_z);\r\n geom_normals.push(n_x);\r\n geom_normals.push(n_y);\r\n geom_normals.push(n_z);\r\n }\r\n\r\n index_lists_list.push(geom_index_lists);\r\n position_lists_list.push(geom_positions);\r\n normal_lists_list.push(geom_normals);\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 < position_lists_list.length; ++i) {\r\n const positions = position_lists_list[i];\r\n const normals = normal_lists_list[i];\r\n const geom_index_lists = index_lists_list[i];\r\n // const indices = [];\r\n\r\n geom_index_lists.forEach(object_indices => {\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(\"position\", new Float32BufferAttribute(positions, 3));\r\n geometry.addAttribute(\"normal\", new Float32BufferAttribute(normals, 3));\r\n geometry.setIndex(new Uint16BufferAttribute(object_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 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 object_3d: object,\r\n };\r\n}\r\n","import { NpcType, ObjectType } from \"../domain\";\r\n\r\nexport function get_area_render_data(\r\n episode: number,\r\n area_id: number,\r\n area_version: number\r\n): Promise<ArrayBuffer> {\r\n return get_area_asset(episode, area_id, area_version, \"render\");\r\n}\r\n\r\nexport function get_area_collision_data(\r\n episode: number,\r\n area_id: number,\r\n area_version: number\r\n): Promise<ArrayBuffer> {\r\n return get_area_asset(episode, area_id, area_version, \"collision\");\r\n}\r\n\r\nexport async function get_npc_data(npc_type: NpcType): Promise<{ url: string; data: ArrayBuffer }> {\r\n const url = npc_type_to_url(npc_type);\r\n const data = await get_asset(url);\r\n return { url, data };\r\n}\r\n\r\nexport async function get_object_data(\r\n object_type: ObjectType\r\n): Promise<{ url: string; data: ArrayBuffer }> {\r\n const url = object_type_to_url(object_type);\r\n const data = await get_asset(url);\r\n return { url, data };\r\n}\r\n\r\nexport async function get_player_data(\r\n player_class: string,\r\n body_part: string,\r\n no?: number\r\n): Promise<ArrayBuffer> {\r\n return await get_asset(player_class_to_url(player_class, body_part, no));\r\n}\r\n\r\nexport async function get_player_animation_data(animation_id: number): Promise<ArrayBuffer> {\r\n return await get_asset(\r\n `/player/animation/animation_${animation_id.toString().padStart(3, \"0\")}.njm`\r\n );\r\n}\r\n\r\nconst area_base_names = [\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 area_version_to_base_url(episode: number, area_id: number, area_variant: number): string {\r\n const episode_base_names = area_base_names[episode - 1];\r\n\r\n if (0 <= area_id && area_id < episode_base_names.length) {\r\n const [base_name, variants] = episode_base_names[area_id];\r\n\r\n if (0 <= area_variant && area_variant < variants) {\r\n let variant: string;\r\n\r\n if (variants === 1) {\r\n variant = \"\";\r\n } else {\r\n variant = String(area_variant);\r\n while (variant.length < 2) variant = \"0\" + variant;\r\n }\r\n\r\n return `/maps/map_${base_name}${variant}`;\r\n } else {\r\n throw new Error(\r\n `Unknown variant ${area_variant} of area ${area_id} in episode ${episode}.`\r\n );\r\n }\r\n } else {\r\n throw new Error(`Unknown episode ${episode} area ${area_id}.`);\r\n }\r\n}\r\n\r\ntype AreaAssetType = \"render\" | \"collision\";\r\n\r\nfunction get_area_asset(\r\n episode: number,\r\n area_id: number,\r\n area_variant: number,\r\n type: AreaAssetType\r\n): Promise<ArrayBuffer> {\r\n try {\r\n const base_url = area_version_to_base_url(episode, area_id, area_variant);\r\n const suffix = type === \"render\" ? \"n.rel\" : \"c.rel\";\r\n return get_asset(base_url + suffix);\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\nfunction npc_type_to_url(npc_type: NpcType): string {\r\n switch (npc_type) {\r\n // The dubswitch model is in XJ format.\r\n case NpcType.Dubswitch:\r\n return `/npcs/${npc_type.code}.xj`;\r\n\r\n // Episode II VR Temple\r\n\r\n case NpcType.Hildebear2:\r\n return npc_type_to_url(NpcType.Hildebear);\r\n case NpcType.Hildeblue2:\r\n return npc_type_to_url(NpcType.Hildeblue);\r\n case NpcType.RagRappy2:\r\n return npc_type_to_url(NpcType.RagRappy);\r\n case NpcType.Monest2:\r\n return npc_type_to_url(NpcType.Monest);\r\n case NpcType.PoisonLily2:\r\n return npc_type_to_url(NpcType.PoisonLily);\r\n case NpcType.NarLily2:\r\n return npc_type_to_url(NpcType.NarLily);\r\n case NpcType.GrassAssassin2:\r\n return npc_type_to_url(NpcType.GrassAssassin);\r\n case NpcType.Dimenian2:\r\n return npc_type_to_url(NpcType.Dimenian);\r\n case NpcType.LaDimenian2:\r\n return npc_type_to_url(NpcType.LaDimenian);\r\n case NpcType.SoDimenian2:\r\n return npc_type_to_url(NpcType.SoDimenian);\r\n case NpcType.DarkBelra2:\r\n return npc_type_to_url(NpcType.DarkBelra);\r\n\r\n // Episode II VR Spaceship\r\n\r\n case NpcType.SavageWolf2:\r\n return npc_type_to_url(NpcType.SavageWolf);\r\n case NpcType.BarbarousWolf2:\r\n return npc_type_to_url(NpcType.BarbarousWolf);\r\n case NpcType.PanArms2:\r\n return npc_type_to_url(NpcType.PanArms);\r\n case NpcType.Dubchic2:\r\n return npc_type_to_url(NpcType.Dubchic);\r\n case NpcType.Gilchic2:\r\n return npc_type_to_url(NpcType.Gilchic);\r\n case NpcType.Garanz2:\r\n return npc_type_to_url(NpcType.Garanz);\r\n case NpcType.Dubswitch2:\r\n return npc_type_to_url(NpcType.Dubswitch);\r\n case NpcType.Delsaber2:\r\n return npc_type_to_url(NpcType.Delsaber);\r\n case NpcType.ChaosSorcerer2:\r\n return npc_type_to_url(NpcType.ChaosSorcerer);\r\n\r\n default:\r\n return `/npcs/${npc_type.code}.nj`;\r\n }\r\n}\r\n\r\nfunction object_type_to_url(object_type: ObjectType): string {\r\n switch (object_type) {\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/${object_type.pso_id}.nj`;\r\n\r\n default:\r\n return `/objects/${object_type.pso_id}.xj`;\r\n }\r\n}\r\n\r\nfunction player_class_to_url(player_class: string, body_part: string, no?: number): string {\r\n return `/player/${player_class}${body_part}${no == null ? \"\" : no}.nj`;\r\n}\r\n\r\nfunction get_asset(url: string): Promise<ArrayBuffer> {\r\n const base_url = process.env.PUBLIC_URL;\r\n const promise = fetch(base_url + url).then(r => r.arrayBuffer());\r\n return promise;\r\n}\r\n","import { Area, AreaVariant, Section } from \"../domain\";\r\nimport { Object3D } from \"three\";\r\nimport { parse_c_rel, parse_n_rel } from \"../data_formats/parsing/geometry\";\r\nimport { get_area_render_data, get_area_collision_data } from \"./binary_assets\";\r\n\r\nfunction area(id: number, name: string, order: number, variants: number): Area {\r\n const area = new Area(id, name, order, []);\r\n const varis = Array(variants)\r\n .fill(null)\r\n .map((_, i) => new AreaVariant(i, area));\r\n area.area_variants.splice(0, 0, ...varis);\r\n return area;\r\n}\r\n\r\nconst sections_cache: Map<string, Promise<Section[]>> = new Map();\r\nconst render_geometry_cache: Map<string, Promise<Object3D>> = new Map();\r\nconst collision_geometry_cache: Map<string, Promise<Object3D>> = new Map();\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 get_variant(episode: number, area_id: number, variant_id: number): AreaVariant {\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 === area_id);\r\n if (!area) throw new Error(`Area id ${area_id} for episode ${episode} is invalid.`);\r\n\r\n const area_variant = area.area_variants[variant_id];\r\n if (!area_variant)\r\n throw new Error(\r\n `Area variant id ${variant_id} for area ${area_id} of episode ${episode} is invalid.`\r\n );\r\n\r\n return area_variant;\r\n }\r\n\r\n async get_area_sections(\r\n episode: number,\r\n area_id: number,\r\n area_variant: number\r\n ): Promise<Section[]> {\r\n const sections = sections_cache.get(`${episode}-${area_id}-${area_variant}`);\r\n\r\n if (sections) {\r\n return sections;\r\n } else {\r\n return this.get_area_sections_and_render_geometry(episode, area_id, area_variant).then(\r\n ({ sections }) => sections\r\n );\r\n }\r\n }\r\n\r\n async get_area_render_geometry(\r\n episode: number,\r\n area_id: number,\r\n area_variant: number\r\n ): Promise<Object3D> {\r\n const object_3d = render_geometry_cache.get(`${episode}-${area_id}-${area_variant}`);\r\n\r\n if (object_3d) {\r\n return object_3d;\r\n } else {\r\n return this.get_area_sections_and_render_geometry(episode, area_id, area_variant).then(\r\n ({ object_3d }) => object_3d\r\n );\r\n }\r\n }\r\n\r\n async get_area_collision_geometry(\r\n episode: number,\r\n area_id: number,\r\n area_variant: number\r\n ): Promise<Object3D> {\r\n const object_3d = collision_geometry_cache.get(`${episode}-${area_id}-${area_variant}`);\r\n\r\n if (object_3d) {\r\n return object_3d;\r\n } else {\r\n const object_3d = get_area_collision_data(episode, area_id, area_variant).then(\r\n parse_c_rel\r\n );\r\n collision_geometry_cache.set(`${area_id}-${area_variant}`, object_3d);\r\n return object_3d;\r\n }\r\n }\r\n\r\n private get_area_sections_and_render_geometry(\r\n episode: number,\r\n area_id: number,\r\n area_variant: number\r\n ): Promise<{ sections: Section[]; object_3d: Object3D }> {\r\n const promise = get_area_render_data(episode, area_id, area_variant).then(parse_n_rel);\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 object_3d = new Promise<Object3D>((resolve, reject) => {\r\n promise.then(({ object_3d }) => resolve(object_3d)).catch(reject);\r\n });\r\n\r\n sections_cache.set(`${episode}-${area_id}-${area_variant}`, sections);\r\n render_geometry_cache.set(`${episode}-${area_id}-${area_variant}`, object_3d);\r\n\r\n return promise;\r\n }\r\n}\r\n\r\nexport const area_store = new AreaStore();\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\n\r\nexport function compress(src: BufferCursor): BufferCursor {\r\n const ctx = new Context(src);\r\n const hash_table = 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.bytes_left) {\r\n ctx.set_bit(1);\r\n ctx.copy_literal();\r\n }\r\n } else {\r\n // Add the first two \"strings\" to the hash table.\r\n hash_table.put(hash_table.hash(ctx.src), 0);\r\n ctx.src.seek(1);\r\n hash_table.put(hash_table.hash(ctx.src), 1);\r\n ctx.src.seek(-1);\r\n\r\n // Copy the first two bytes as literals.\r\n ctx.set_bit(1);\r\n ctx.copy_literal();\r\n ctx.set_bit(1);\r\n ctx.copy_literal();\r\n\r\n while (ctx.src.bytes_left > 1) {\r\n let [offset, mlen] = ctx.find_longest_match(hash_table, false);\r\n\r\n if (mlen > 0) {\r\n ctx.src.seek(1);\r\n const [offset2, mlen2] = ctx.find_longest_match(hash_table, 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 copy_literal = 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 copy_literal = false;\r\n }\r\n }\r\n }\r\n\r\n if (copy_literal) {\r\n ctx.set_bit(1);\r\n ctx.copy_literal();\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.set_bit(0);\r\n ctx.set_bit(0);\r\n ctx.set_bit((mlen - 2) & 0x02);\r\n ctx.set_bit((mlen - 2) & 0x01);\r\n ctx.write_literal(offset & 0xff);\r\n ctx.add_intermediates(hash_table, mlen);\r\n continue;\r\n } else if (mlen >= 3 && mlen <= 9) {\r\n // Long match, short length.\r\n ctx.set_bit(0);\r\n ctx.set_bit(1);\r\n ctx.write_literal(((offset & 0x1f) << 3) | ((mlen - 2) & 0x07));\r\n ctx.write_literal(offset >> 5);\r\n ctx.add_intermediates(hash_table, 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.set_bit(0);\r\n ctx.set_bit(1);\r\n ctx.write_literal((offset & 0x1f) << 3);\r\n ctx.write_literal(offset >> 5);\r\n ctx.write_literal(mlen - 1);\r\n ctx.add_intermediates(hash_table, 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.set_bit(1);\r\n ctx.copy_literal();\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.bytes_left) {\r\n ctx.set_bit(1);\r\n ctx.copy_literal();\r\n }\r\n }\r\n\r\n ctx.write_eof();\r\n\r\n return ctx.dst.seek_start(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: BufferCursor;\r\n dst: BufferCursor;\r\n flags: number;\r\n flag_bits_left: number;\r\n flag_offset: number;\r\n\r\n constructor(cursor: BufferCursor) {\r\n this.src = cursor;\r\n this.dst = new BufferCursor(cursor.size, cursor.little_endian);\r\n this.flags = 0;\r\n this.flag_bits_left = 0;\r\n this.flag_offset = 0;\r\n }\r\n\r\n set_bit(bit: number): void {\r\n if (!this.flag_bits_left--) {\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 .seek_start(this.flag_offset)\r\n .write_u8(this.flags)\r\n .seek_start(pos)\r\n .write_u8(0); // Placeholder for the next flags byte.\r\n this.flag_offset = pos;\r\n this.flag_bits_left = 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 copy_literal(): void {\r\n this.dst.write_u8(this.src.u8());\r\n }\r\n\r\n write_literal(value: number): void {\r\n this.dst.write_u8(value);\r\n }\r\n\r\n writeFinalFlags(): void {\r\n this.flags >>>= this.flag_bits_left;\r\n const pos = this.dst.position;\r\n this.dst\r\n .seek_start(this.flag_offset)\r\n .write_u8(this.flags)\r\n .seek_start(pos);\r\n }\r\n\r\n write_eof(): void {\r\n this.set_bit(0);\r\n this.set_bit(1);\r\n\r\n this.writeFinalFlags();\r\n\r\n this.write_literal(0);\r\n this.write_literal(0);\r\n }\r\n\r\n match_length(s2: number): number {\r\n const array = this.src.uint8_array_view();\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 find_longest_match(hash_table: HashTable, lazy: boolean): [number, number] {\r\n if (!this.src.bytes_left) {\r\n return [0, 0];\r\n }\r\n\r\n // Figure out where we're looking.\r\n const hash = hash_table.hash(this.src);\r\n\r\n // If there is nothing in the table at that point, bail out now.\r\n let entry = hash_table.get(hash);\r\n\r\n if (entry === null) {\r\n if (!lazy) {\r\n hash_table.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 hash_table.hash_to_offset[hash] = null;\r\n\r\n if (!lazy) {\r\n hash_table.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 longest_length = 0;\r\n let longest_match = 0;\r\n\r\n while (entry != null) {\r\n const mlen = this.match_length(entry);\r\n\r\n if (mlen > longest_length || mlen >= 256) {\r\n longest_length = mlen;\r\n longest_match = entry;\r\n }\r\n\r\n // Follow the chain, making sure not to exceed a difference of MAX_WINDOW.\r\n let entry_2 = hash_table.prev(entry);\r\n\r\n if (entry_2 !== null) {\r\n // If we'd go outside the window, truncate the hash chain now.\r\n if (this.src.position - entry_2 > MAX_WINDOW) {\r\n hash_table.set_prev(entry, null);\r\n entry_2 = null;\r\n }\r\n }\r\n\r\n entry = entry_2;\r\n }\r\n\r\n // Add our current string to the hash.\r\n if (!lazy) {\r\n hash_table.put(hash, this.src.position);\r\n }\r\n\r\n // Did we find a match?\r\n const offset = longest_length > 0 ? longest_match - this.src.position : 0;\r\n return [offset, longest_length];\r\n }\r\n\r\n add_intermediates(hash_table: 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 = hash_table.hash(this.src);\r\n hash_table.put(hash, this.src.position);\r\n this.src.seek(1);\r\n }\r\n }\r\n}\r\n\r\nclass HashTable {\r\n hash_to_offset: (number | null)[] = new Array(HASH_SIZE).fill(null);\r\n masked_offset_to_prev: (number | null)[] = new Array(MAX_WINDOW).fill(null);\r\n\r\n hash(cursor: BufferCursor): number {\r\n let hash = cursor.u8();\r\n\r\n if (cursor.bytes_left) {\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.hash_to_offset[hash];\r\n }\r\n\r\n put(hash: number, offset: number): void {\r\n this.set_prev(offset, this.hash_to_offset[hash]);\r\n this.hash_to_offset[hash] = offset;\r\n }\r\n\r\n prev(offset: number): number | null {\r\n return this.masked_offset_to_prev[offset & WINDOW_MASK];\r\n }\r\n\r\n set_prev(offset: number, prevOffset: number | null): void {\r\n this.masked_offset_to_prev[offset & WINDOW_MASK] = prevOffset;\r\n }\r\n}\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\nimport Logger from \"js-logger\";\r\n\r\nconst logger = Logger.get(\"data_formats/compression/prs/decompress\");\r\n\r\nexport function decompress(cursor: BufferCursor): BufferCursor {\r\n const ctx = new Context(cursor);\r\n\r\n while (true) {\r\n if (ctx.read_flag_bit() === 1) {\r\n // Single byte copy.\r\n ctx.copy_u8();\r\n } else {\r\n // Multi byte copy.\r\n let length;\r\n let offset;\r\n\r\n if (ctx.read_flag_bit() === 0) {\r\n // Short copy.\r\n length = ctx.read_flag_bit() << 1;\r\n length |= ctx.read_flag_bit();\r\n length += 2;\r\n\r\n offset = ctx.read_u8() - 256;\r\n } else {\r\n // Long copy or end of file.\r\n offset = ctx.read_u16();\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.read_u8();\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.offset_copy(offset, length);\r\n }\r\n }\r\n\r\n return ctx.dst.seek_start(0);\r\n}\r\n\r\nclass Context {\r\n src: BufferCursor;\r\n dst: BufferCursor;\r\n flags: number;\r\n flag_bits_left: number;\r\n\r\n constructor(cursor: BufferCursor) {\r\n this.src = cursor;\r\n this.dst = new BufferCursor(4 * cursor.size, cursor.little_endian);\r\n this.flags = 0;\r\n this.flag_bits_left = 0;\r\n }\r\n\r\n read_flag_bit(): number {\r\n // Fetch a new flag byte when the previous byte has been processed.\r\n if (this.flag_bits_left === 0) {\r\n this.flags = this.read_u8();\r\n this.flag_bits_left = 8;\r\n }\r\n\r\n let bit = this.flags & 1;\r\n this.flags >>>= 1;\r\n this.flag_bits_left -= 1;\r\n return bit;\r\n }\r\n\r\n copy_u8(): void {\r\n this.dst.write_u8(this.read_u8());\r\n }\r\n\r\n read_u8(): number {\r\n return this.src.u8();\r\n }\r\n\r\n read_u16(): number {\r\n return this.src.u16();\r\n }\r\n\r\n offset_copy(offset: number, length: number): void {\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 buf_size = Math.min(-offset, length);\r\n\r\n this.dst.seek(offset);\r\n const buf = this.dst.take(buf_size);\r\n this.dst.seek(-offset - buf_size);\r\n\r\n for (let i = 0; i < Math.floor(length / buf_size); ++i) {\r\n this.dst.write_cursor(buf);\r\n }\r\n\r\n this.dst.write_cursor(buf.take(length % buf_size));\r\n }\r\n}\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\nimport Logger from \"js-logger\";\r\n\r\nconst logger = Logger.get(\"data_formats/parsing/quest/bin\");\r\n\r\nexport interface BinFile {\r\n quest_id: number;\r\n language: number;\r\n quest_name: string;\r\n short_description: string;\r\n long_description: string;\r\n function_offsets: number[];\r\n instructions: Instruction[];\r\n data: BufferCursor;\r\n}\r\n\r\nexport function parse_bin(cursor: BufferCursor, lenient: boolean = false): BinFile {\r\n const object_code_offset = cursor.u32();\r\n const function_offset_table_offset = cursor.u32(); // Relative offsets\r\n const size = cursor.u32();\r\n cursor.seek(4); // Always seems to be 0xFFFFFFFF\r\n const quest_id = cursor.u32();\r\n const language = cursor.u32();\r\n const quest_name = cursor.string_utf16(64, true, true);\r\n const short_description = cursor.string_utf16(256, true, true);\r\n const long_description = cursor.string_utf16(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 function_offset_count = Math.floor((cursor.size - function_offset_table_offset) / 4);\r\n\r\n cursor.seek_start(function_offset_table_offset);\r\n const function_offsets = [];\r\n\r\n for (let i = 0; i < function_offset_count; ++i) {\r\n function_offsets.push(cursor.i32());\r\n }\r\n\r\n const instructions = parse_object_code(\r\n cursor\r\n .seek_start(object_code_offset)\r\n .take(function_offset_table_offset - object_code_offset),\r\n lenient\r\n );\r\n\r\n return {\r\n quest_id,\r\n language,\r\n quest_name,\r\n short_description,\r\n long_description,\r\n function_offsets,\r\n instructions,\r\n data: cursor.seek_start(0).take(cursor.size),\r\n };\r\n}\r\n\r\nexport function write_bin({ data }: { data: BufferCursor }): BufferCursor {\r\n return data.seek_start(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 parse_object_code(cursor: BufferCursor, lenient: boolean): Instruction[] {\r\n const instructions = [];\r\n\r\n try {\r\n while (cursor.bytes_left) {\r\n const main_opcode = cursor.u8();\r\n let opcode;\r\n let opsize;\r\n let list;\r\n\r\n switch (main_opcode) {\r\n case 0xf8:\r\n opcode = cursor.u8();\r\n opsize = 2;\r\n list = f8_opcode_list;\r\n break;\r\n case 0xf9:\r\n opcode = cursor.u8();\r\n opsize = 2;\r\n list = f9_opcode_list;\r\n break;\r\n default:\r\n opcode = main_opcode;\r\n opsize = 1;\r\n list = opcode_list;\r\n break;\r\n }\r\n\r\n let [, mnemonic, mask] = list[opcode];\r\n\r\n if (mask == null) {\r\n let full_opcode = main_opcode;\r\n\r\n if (main_opcode === 0xf8 || main_opcode === 0xf9) {\r\n full_opcode = (full_opcode << 8) | opcode;\r\n }\r\n\r\n logger.warn(\r\n `Parameters unknown for opcode 0x${full_opcode\r\n .toString(16)\r\n .toUpperCase()}, assuming 0.`\r\n );\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 = parse_instruction_arguments(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 parse_instruction_arguments(\r\n cursor: BufferCursor,\r\n mask: string\r\n): { args: any[]; size: number } {\r\n const old_pos = cursor.position;\r\n const args = [];\r\n let args_size: number;\r\n\r\n outer: 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 args_size = 2 * cursor.u8();\r\n cursor.seek(args_size);\r\n break;\r\n case \"t\":\r\n case \"T\":\r\n args_size = cursor.u8();\r\n cursor.seek(args_size);\r\n break;\r\n\r\n // Strings\r\n case \"s\":\r\n case \"S\":\r\n while (cursor.u16()) {\r\n // Eat up the entire string.\r\n }\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 - old_pos };\r\n}\r\n\r\nconst opcode_list: [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 f8_opcode_list: [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 f9_opcode_list: [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];\r\n","import { groupBy } from \"lodash\";\r\nimport { BufferCursor } from \"../../BufferCursor\";\r\nimport Logger from \"js-logger\";\r\nimport { Vec3 } from \"../../Vec3\";\r\n\r\nconst logger = Logger.get(\"data_formats/parsing/quest/dat\");\r\n\r\nconst OBJECT_SIZE = 68;\r\nconst NPC_SIZE = 72;\r\n\r\nexport type DatFile = {\r\n objs: DatObject[];\r\n npcs: DatNpc[];\r\n unknowns: DatUnknown[];\r\n};\r\n\r\nexport type DatEntity = {\r\n type_id: number;\r\n section_id: number;\r\n position: Vec3;\r\n rotation: Vec3;\r\n area_id: number;\r\n unknown: number[][];\r\n};\r\n\r\nexport type DatObject = DatEntity;\r\n\r\nexport type DatNpc = DatEntity & {\r\n flags: number;\r\n skin: number;\r\n};\r\n\r\nexport type DatUnknown = {\r\n entity_type: number;\r\n total_size: number;\r\n area_id: number;\r\n entities_size: number;\r\n data: number[];\r\n};\r\n\r\nexport function parse_dat(cursor: BufferCursor): DatFile {\r\n const objs: DatObject[] = [];\r\n const npcs: DatNpc[] = [];\r\n const unknowns: DatUnknown[] = [];\r\n\r\n while (cursor.bytes_left) {\r\n const entity_type = cursor.u32();\r\n const total_size = cursor.u32();\r\n const area_id = cursor.u32();\r\n const entities_size = cursor.u32();\r\n\r\n if (entity_type === 0) {\r\n break;\r\n } else {\r\n if (entities_size !== total_size - 16) {\r\n throw Error(\r\n `Malformed DAT file. Expected an entities size of ${total_size -\r\n 16}, got ${entities_size}.`\r\n );\r\n }\r\n\r\n if (entity_type === 1) {\r\n // Objects\r\n const object_count = Math.floor(entities_size / OBJECT_SIZE);\r\n const start_position = cursor.position;\r\n\r\n for (let i = 0; i < object_count; ++i) {\r\n const type_id = cursor.u16();\r\n const unknown1 = cursor.u8_array(10);\r\n const section_id = cursor.u16();\r\n const unknown2 = cursor.u8_array(2);\r\n const x = cursor.f32();\r\n const y = cursor.f32();\r\n const z = cursor.f32();\r\n const rotation_x = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n const rotation_y = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n const rotation_z = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n // The next 3 floats seem to be scale values.\r\n const unknown3 = cursor.u8_array(28);\r\n\r\n objs.push({\r\n type_id,\r\n section_id,\r\n position: new Vec3(x, y, z),\r\n rotation: new Vec3(rotation_x, rotation_y, rotation_z),\r\n area_id,\r\n unknown: [unknown1, unknown2, unknown3],\r\n });\r\n }\r\n\r\n const bytes_read = cursor.position - start_position;\r\n\r\n if (bytes_read !== entities_size) {\r\n logger.warn(\r\n `Read ${bytes_read} bytes instead of expected ${entities_size} for entity type ${entity_type} (Object).`\r\n );\r\n cursor.seek(entities_size - bytes_read);\r\n }\r\n } else if (entity_type === 2) {\r\n // NPCs\r\n const npc_count = Math.floor(entities_size / NPC_SIZE);\r\n const start_position = cursor.position;\r\n\r\n for (let i = 0; i < npc_count; ++i) {\r\n const type_id = cursor.u16();\r\n const unknown1 = cursor.u8_array(10);\r\n const section_id = cursor.u16();\r\n const unknown2 = cursor.u8_array(6);\r\n const x = cursor.f32();\r\n const y = cursor.f32();\r\n const z = cursor.f32();\r\n const rotation_x = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n const rotation_y = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n const rotation_z = (cursor.i32() / 0xffff) * 2 * Math.PI;\r\n const unknown3 = cursor.u8_array(4);\r\n const flags = cursor.f32();\r\n const unknown4 = cursor.u8_array(12);\r\n const skin = cursor.u32();\r\n const unknown5 = cursor.u8_array(4);\r\n\r\n npcs.push({\r\n type_id,\r\n section_id,\r\n position: new Vec3(x, y, z),\r\n rotation: new Vec3(rotation_x, rotation_y, rotation_z),\r\n skin,\r\n area_id,\r\n flags,\r\n unknown: [unknown1, unknown2, unknown3, unknown4, unknown5],\r\n });\r\n }\r\n\r\n const bytes_read = cursor.position - start_position;\r\n\r\n if (bytes_read !== entities_size) {\r\n logger.warn(\r\n `Read ${bytes_read} bytes instead of expected ${entities_size} for entity type ${entity_type} (NPC).`\r\n );\r\n cursor.seek(entities_size - bytes_read);\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 entity_type,\r\n total_size,\r\n area_id,\r\n entities_size,\r\n data: cursor.u8_array(entities_size),\r\n });\r\n }\r\n }\r\n }\r\n\r\n return { objs, npcs, unknowns };\r\n}\r\n\r\nexport function write_dat({ objs, npcs, unknowns }: DatFile): BufferCursor {\r\n const cursor = new BufferCursor(\r\n objs.length * OBJECT_SIZE + npcs.length * NPC_SIZE + unknowns.length * 1000,\r\n true\r\n );\r\n\r\n const grouped_objs = groupBy(objs, obj => obj.area_id);\r\n const obj_area_ids = Object.keys(grouped_objs)\r\n .map(key => parseInt(key, 10))\r\n .sort((a, b) => a - b);\r\n\r\n for (const area_id of obj_area_ids) {\r\n const area_objs = grouped_objs[area_id];\r\n const entities_size = area_objs.length * OBJECT_SIZE;\r\n cursor.write_u32(1); // Entity type\r\n cursor.write_u32(entities_size + 16);\r\n cursor.write_u32(area_id);\r\n cursor.write_u32(entities_size);\r\n\r\n for (const obj of area_objs) {\r\n cursor.write_u16(obj.type_id);\r\n cursor.write_u8_array(obj.unknown[0]);\r\n cursor.write_u16(obj.section_id);\r\n cursor.write_u8_array(obj.unknown[1]);\r\n cursor.write_f32(obj.position.x);\r\n cursor.write_f32(obj.position.y);\r\n cursor.write_f32(obj.position.z);\r\n cursor.write_i32(Math.round((obj.rotation.x / (2 * Math.PI)) * 0xffff));\r\n cursor.write_i32(Math.round((obj.rotation.y / (2 * Math.PI)) * 0xffff));\r\n cursor.write_i32(Math.round((obj.rotation.z / (2 * Math.PI)) * 0xffff));\r\n cursor.write_u8_array(obj.unknown[2]);\r\n }\r\n }\r\n\r\n const grouped_npcs = groupBy(npcs, npc => npc.area_id);\r\n const npc_area_ids = Object.keys(grouped_npcs)\r\n .map(key => parseInt(key, 10))\r\n .sort((a, b) => a - b);\r\n\r\n for (const area_id of npc_area_ids) {\r\n const area_npcs = grouped_npcs[area_id];\r\n const entities_size = area_npcs.length * NPC_SIZE;\r\n cursor.write_u32(2); // Entity type\r\n cursor.write_u32(entities_size + 16);\r\n cursor.write_u32(area_id);\r\n cursor.write_u32(entities_size);\r\n\r\n for (const npc of area_npcs) {\r\n cursor.write_u16(npc.type_id);\r\n cursor.write_u8_array(npc.unknown[0]);\r\n cursor.write_u16(npc.section_id);\r\n cursor.write_u8_array(npc.unknown[1]);\r\n cursor.write_f32(npc.position.x);\r\n cursor.write_f32(npc.position.y);\r\n cursor.write_f32(npc.position.z);\r\n cursor.write_i32(Math.round((npc.rotation.x / (2 * Math.PI)) * 0xffff));\r\n cursor.write_i32(Math.round((npc.rotation.y / (2 * Math.PI)) * 0xffff));\r\n cursor.write_i32(Math.round((npc.rotation.z / (2 * Math.PI)) * 0xffff));\r\n cursor.write_u8_array(npc.unknown[2]);\r\n cursor.write_f32(npc.flags);\r\n cursor.write_u8_array(npc.unknown[3]);\r\n cursor.write_u32(npc.skin);\r\n cursor.write_u8_array(npc.unknown[4]);\r\n }\r\n }\r\n\r\n for (const unknown of unknowns) {\r\n cursor.write_u32(unknown.entity_type);\r\n cursor.write_u32(unknown.total_size);\r\n cursor.write_u32(unknown.area_id);\r\n cursor.write_u32(unknown.entities_size);\r\n cursor.write_u8_array(unknown.data);\r\n }\r\n\r\n // Final header.\r\n cursor.write_u32(0);\r\n cursor.write_u32(0);\r\n cursor.write_u32(0);\r\n cursor.write_u32(0);\r\n\r\n cursor.seek_start(0);\r\n\r\n return cursor;\r\n}\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\nimport Logger from \"js-logger\";\r\n\r\nconst logger = Logger.get(\"data_formats/parsing/quest/qst\");\r\n\r\nexport type QstContainedFile = {\r\n id?: number;\r\n name: string;\r\n name_2?: string; // Unsure what this is\r\n expected_size?: number;\r\n data: BufferCursor;\r\n chunk_nos: Set<number>;\r\n};\r\n\r\nexport type 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 parse_qst(cursor: BufferCursor): 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 version_a = cursor.u8();\r\n cursor.seek(1);\r\n const version_b = cursor.u8();\r\n\r\n if (version_a === 0x44) {\r\n version = \"Dreamcast/GameCube\";\r\n } else if (version_a === 0x58) {\r\n if (version_b === 0x44) {\r\n version = \"Blue Burst\";\r\n }\r\n } else if (version_a === 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.seek_start(0);\r\n\r\n const headers = parse_headers(cursor);\r\n\r\n const files = parse_files(cursor, new Map(headers.map(h => [h.file_name, h.size])));\r\n\r\n for (const file of files) {\r\n const header = headers.find(h => h.file_name === file.name);\r\n\r\n if (header) {\r\n file.id = header.quest_id;\r\n file.name_2 = header.file_name_2;\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\nexport type SimpleQstContainedFile = {\r\n id?: number;\r\n name: string;\r\n name_2?: string;\r\n data: BufferCursor;\r\n};\r\n\r\nexport type WriteQstParams = {\r\n version?: string;\r\n files: SimpleQstContainedFile[];\r\n};\r\n\r\n/**\r\n * Always uses Blue Burst format.\r\n */\r\nexport function write_qst(params: WriteQstParams): BufferCursor {\r\n const files = params.files;\r\n const total_size = 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 BufferCursor(total_size, true);\r\n\r\n write_file_headers(cursor, files);\r\n write_file_chunks(cursor, files);\r\n\r\n if (cursor.size !== total_size) {\r\n throw new Error(`Expected a final file size of ${total_size}, but got ${cursor.size}.`);\r\n }\r\n\r\n return cursor.seek_start(0);\r\n}\r\n\r\ntype QstHeader = {\r\n quest_id: number;\r\n file_name: string;\r\n file_name_2: 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 parse_headers(cursor: BufferCursor): QstHeader[] {\r\n const headers: QstHeader[] = [];\r\n\r\n for (let i = 0; i < 2; ++i) {\r\n cursor.seek(4);\r\n const quest_id = cursor.u16();\r\n cursor.seek(38);\r\n const file_name = cursor.string_ascii(16, true, true);\r\n const size = cursor.u32();\r\n // Not sure what this is:\r\n const file_name_2 = cursor.string_ascii(24, true, true);\r\n\r\n headers.push({\r\n quest_id,\r\n file_name,\r\n file_name_2,\r\n size,\r\n });\r\n }\r\n\r\n return headers;\r\n}\r\n\r\nfunction parse_files(\r\n cursor: BufferCursor,\r\n expected_sizes: Map<string, number>\r\n): 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.bytes_left >= 1056) {\r\n const start_position = cursor.position;\r\n\r\n // Read meta data.\r\n const chunk_no = cursor.seek(4).u8();\r\n const file_name = cursor.seek(3).string_ascii(16, true, true);\r\n\r\n let file = files.get(file_name);\r\n\r\n if (!file) {\r\n const expected_size = expected_sizes.get(file_name);\r\n files.set(\r\n file_name,\r\n (file = {\r\n name: file_name,\r\n expected_size,\r\n data: new BufferCursor(expected_size || 10 * 1024, true),\r\n chunk_nos: new Set(),\r\n })\r\n );\r\n }\r\n\r\n if (file.chunk_nos.has(chunk_no)) {\r\n logger.warn(\r\n `File chunk number ${chunk_no} of file ${file_name} was already encountered, overwriting previous chunk.`\r\n );\r\n } else {\r\n file.chunk_nos.add(chunk_no);\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(\r\n `Data segment size of ${size} is larger than expected maximum size, reading just 1024 bytes.`\r\n );\r\n size = 1024;\r\n }\r\n\r\n const data = cursor.take(size);\r\n const chunk_position = chunk_no * 1024;\r\n file.data.size = Math.max(chunk_position + size, file.data.size);\r\n file.data.seek_start(chunk_position).write_cursor(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 !== start_position + 1056) {\r\n throw new Error(\r\n `Read ${cursor.position -\r\n start_position} file chunk message bytes instead of expected 1056.`\r\n );\r\n }\r\n }\r\n\r\n if (cursor.bytes_left) {\r\n logger.warn(`${cursor.bytes_left} 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.seek_start(0);\r\n file.chunk_nos = new Set(Array.from(file.chunk_nos.values()).sort((a, b) => a - b));\r\n\r\n // Check whether the expected size was correct.\r\n if (file.expected_size != null && file.data.size !== file.expected_size) {\r\n logger.warn(\r\n `File ${file.name} has an actual size of ${file.data.size} instead of the expected size ${file.expected_size}.`\r\n );\r\n }\r\n\r\n // Detect missing file chunks.\r\n const actual_size = Math.max(file.data.size, file.expected_size || 0);\r\n\r\n for (let chunk_no = 0; chunk_no < Math.ceil(actual_size / 1024); ++chunk_no) {\r\n if (!file.chunk_nos.has(chunk_no)) {\r\n logger.warn(`File ${file.name} is missing chunk ${chunk_no}.`);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(files.values());\r\n}\r\n\r\nfunction write_file_headers(cursor: BufferCursor, 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.write_u16(88); // Header size.\r\n cursor.write_u16(0x44); // Magic number.\r\n cursor.write_u16(file.id || 0);\r\n\r\n for (let i = 0; i < 38; ++i) {\r\n cursor.write_u8(0);\r\n }\r\n\r\n cursor.write_string_ascii(file.name, 16);\r\n cursor.write_u32(file.data.size);\r\n\r\n let file_name_2: string;\r\n\r\n if (file.name_2 == null) {\r\n // Not sure this makes sense.\r\n const dot_pos = file.name.lastIndexOf(\".\");\r\n file_name_2 =\r\n dot_pos === -1\r\n ? file.name + \"_j\"\r\n : file.name.slice(0, dot_pos) + \"_j\" + file.name.slice(dot_pos);\r\n } else {\r\n file_name_2 = file.name_2;\r\n }\r\n\r\n if (file_name_2.length > 24) {\r\n throw Error(\r\n `File ${file.name} has a file_name_2 length (${file_name_2}) longer than 24 characters.`\r\n );\r\n }\r\n\r\n cursor.write_string_ascii(file_name_2, 24);\r\n }\r\n}\r\n\r\nfunction write_file_chunks(cursor: BufferCursor, 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 chunk_nos = 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 (!write_file_chunk(cursor, files[i].data, chunk_nos[i]++, files[i].name)) {\r\n // Remove if there are no more chunks to write.\r\n files.splice(i, 1);\r\n chunk_nos.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 write_file_chunk(\r\n cursor: BufferCursor,\r\n data: BufferCursor,\r\n chunk_no: number,\r\n name: string\r\n): boolean {\r\n cursor.write_u8_array([28, 4, 19, 0]);\r\n cursor.write_u8(chunk_no);\r\n cursor.write_u8_array([0, 0, 0]);\r\n cursor.write_string_ascii(name, 16);\r\n\r\n const size = Math.min(1024, data.bytes_left);\r\n cursor.write_cursor(data.take(size));\r\n\r\n // Padding.\r\n for (let i = size; i < 1024; ++i) {\r\n cursor.write_u8(0);\r\n }\r\n\r\n cursor.write_u32(size);\r\n cursor.write_u32(0);\r\n\r\n return data.bytes_left > 0;\r\n}\r\n","import Logger from \"js-logger\";\r\nimport { AreaVariant, NpcType, ObjectType, Quest, QuestNpc, QuestObject } from \"../../../domain\";\r\nimport { area_store } from \"../../../stores/AreaStore\";\r\nimport { BufferCursor } from \"../../BufferCursor\";\r\nimport * as prs from \"../../compression/prs\";\r\nimport { Vec3 } from \"../../Vec3\";\r\nimport { Instruction, parse_bin, write_bin } from \"./bin\";\r\nimport { DatFile, DatNpc, DatObject, parse_dat, write_dat } from \"./dat\";\r\nimport { parse_qst, QstContainedFile, write_qst } from \"./qst\";\r\n\r\nconst logger = Logger.get(\"data_formats/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 parse_quest(cursor: BufferCursor, lenient: boolean = false): Quest | undefined {\r\n const qst = parse_qst(cursor);\r\n\r\n if (!qst) {\r\n return;\r\n }\r\n\r\n let dat_file: QstContainedFile | undefined;\r\n let bin_file: QstContainedFile | undefined;\r\n\r\n for (const file of qst.files) {\r\n const file_name = file.name.trim().toLowerCase();\r\n\r\n if (file_name.endsWith(\".dat\")) {\r\n dat_file = file;\r\n } else if (file_name.endsWith(\".bin\")) {\r\n bin_file = file;\r\n }\r\n }\r\n\r\n // TODO: deal with missing/multiple DAT or BIN file.\r\n\r\n if (!dat_file) {\r\n logger.error(\"File contains no DAT file.\");\r\n return;\r\n }\r\n\r\n if (!bin_file) {\r\n logger.error(\"File contains no BIN file.\");\r\n return;\r\n }\r\n\r\n const dat = parse_dat(prs.decompress(dat_file.data));\r\n const bin = parse_bin(prs.decompress(bin_file.data), lenient);\r\n let episode = 1;\r\n let area_variants: AreaVariant[] = [];\r\n\r\n if (bin.function_offsets.length) {\r\n const func_0_ops = get_func_operations(bin.instructions, bin.function_offsets[0]);\r\n\r\n if (func_0_ops) {\r\n episode = get_episode(func_0_ops);\r\n area_variants = get_area_variants(dat, episode, func_0_ops, lenient);\r\n } else {\r\n logger.warn(`Function 0 offset ${bin.function_offsets[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 dat_file.id,\r\n bin.quest_name,\r\n bin.short_description,\r\n bin.long_description,\r\n episode,\r\n area_variants,\r\n parse_obj_data(dat.objs),\r\n parse_npc_data(episode, dat.npcs),\r\n dat.unknowns,\r\n bin.data\r\n );\r\n}\r\n\r\nexport function write_quest_qst(quest: Quest, file_name: string): BufferCursor {\r\n const dat = write_dat({\r\n objs: objects_to_dat_data(quest.objects),\r\n npcs: npcsToDatData(quest.npcs),\r\n unknowns: quest.dat_unknowns,\r\n });\r\n const bin = write_bin({ data: quest.bin_data });\r\n const ext_start = file_name.lastIndexOf(\".\");\r\n const base_file_name = ext_start === -1 ? file_name : file_name.slice(0, ext_start);\r\n\r\n return write_qst({\r\n files: [\r\n {\r\n name: base_file_name + \".dat\",\r\n id: quest.id,\r\n data: prs.compress(dat),\r\n },\r\n {\r\n name: base_file_name + \".bin\",\r\n id: quest.id,\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 get_episode(func_0_ops: Instruction[]): number {\r\n const set_episode = func_0_ops.find(op => op.mnemonic === \"set_episode\");\r\n\r\n if (set_episode) {\r\n switch (set_episode.args[0]) {\r\n default:\r\n case 0:\r\n return 1;\r\n case 1:\r\n return 2;\r\n case 2:\r\n 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 get_area_variants(\r\n dat: DatFile,\r\n episode: number,\r\n func_0_ops: 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 area_variants = new Map();\r\n\r\n for (const npc of dat.npcs) {\r\n area_variants.set(npc.area_id, 0);\r\n }\r\n\r\n for (const obj of dat.objs) {\r\n area_variants.set(obj.area_id, 0);\r\n }\r\n\r\n const bb_maps = func_0_ops.filter(op => op.mnemonic === \"BB_Map_Designate\");\r\n\r\n for (const bb_map of bb_maps) {\r\n const area_id = bb_map.args[0];\r\n const variant_id = bb_map.args[2];\r\n area_variants.set(area_id, variant_id);\r\n }\r\n\r\n const area_variants_array = new Array<AreaVariant>();\r\n\r\n for (const [area_id, variant_id] of area_variants.entries()) {\r\n try {\r\n area_variants_array.push(area_store.get_variant(episode, area_id, variant_id));\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 area_variants_array.sort((a, b) => a.area.order - b.area.order || a.id - b.id);\r\n}\r\n\r\nfunction get_func_operations(\r\n operations: Instruction[],\r\n func_offset: number\r\n): Instruction[] | undefined {\r\n let position = 0;\r\n let func_found = false;\r\n const func_ops: Instruction[] = [];\r\n\r\n for (const operation of operations) {\r\n if (position === func_offset) {\r\n func_found = true;\r\n }\r\n\r\n if (func_found) {\r\n func_ops.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 func_found ? func_ops : undefined;\r\n}\r\n\r\nfunction parse_obj_data(objs: DatObject[]): QuestObject[] {\r\n return objs.map(obj_data => {\r\n const { x, y, z } = obj_data.position;\r\n const rot = obj_data.rotation;\r\n return new QuestObject(\r\n obj_data.area_id,\r\n obj_data.section_id,\r\n new Vec3(x, y, z),\r\n new Vec3(rot.x, rot.y, rot.z),\r\n ObjectType.from_pso_id(obj_data.type_id),\r\n obj_data\r\n );\r\n });\r\n}\r\n\r\nfunction parse_npc_data(episode: number, npcs: DatNpc[]): QuestNpc[] {\r\n return npcs.map(npc_data => {\r\n const { x, y, z } = npc_data.position;\r\n const rot = npc_data.rotation;\r\n return new QuestNpc(\r\n npc_data.area_id,\r\n npc_data.section_id,\r\n new Vec3(x, y, z),\r\n new Vec3(rot.x, rot.y, rot.z),\r\n get_npc_type(episode, npc_data),\r\n npc_data\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 get_npc_type(episode: number, { type_id, flags, skin, area_id }: DatNpc): NpcType {\r\n const regular = Math.abs(flags - 1) > 0.00001;\r\n\r\n switch (`${type_id}, ${skin % 3}, ${episode}`) {\r\n case `${0x044}, 0, 1`:\r\n return NpcType.Booma;\r\n case `${0x044}, 1, 1`:\r\n return NpcType.Gobooma;\r\n case `${0x044}, 2, 1`:\r\n return NpcType.Gigobooma;\r\n\r\n case `${0x063}, 0, 1`:\r\n return NpcType.EvilShark;\r\n case `${0x063}, 1, 1`:\r\n return NpcType.PalShark;\r\n case `${0x063}, 2, 1`:\r\n return NpcType.GuilShark;\r\n\r\n case `${0x0a6}, 0, 1`:\r\n return NpcType.Dimenian;\r\n case `${0x0a6}, 0, 2`:\r\n return NpcType.Dimenian2;\r\n case `${0x0a6}, 1, 1`:\r\n return NpcType.LaDimenian;\r\n case `${0x0a6}, 1, 2`:\r\n return NpcType.LaDimenian2;\r\n case `${0x0a6}, 2, 1`:\r\n return NpcType.SoDimenian;\r\n case `${0x0a6}, 2, 2`:\r\n return NpcType.SoDimenian2;\r\n\r\n case `${0x0d6}, 0, 2`:\r\n return NpcType.Mericarol;\r\n case `${0x0d6}, 1, 2`:\r\n return NpcType.Mericus;\r\n case `${0x0d6}, 2, 2`:\r\n return NpcType.Merikle;\r\n\r\n case `${0x115}, 0, 4`:\r\n return NpcType.Boota;\r\n case `${0x115}, 1, 4`:\r\n return NpcType.ZeBoota;\r\n case `${0x115}, 2, 4`:\r\n return NpcType.BaBoota;\r\n case `${0x117}, 0, 4`:\r\n return NpcType.Goran;\r\n case `${0x117}, 1, 4`:\r\n return NpcType.PyroGoran;\r\n case `${0x117}, 2, 4`:\r\n return NpcType.GoranDetonator;\r\n }\r\n\r\n switch (`${type_id}, ${skin % 2}, ${episode}`) {\r\n case `${0x040}, 0, 1`:\r\n return NpcType.Hildebear;\r\n case `${0x040}, 0, 2`:\r\n return NpcType.Hildebear2;\r\n case `${0x040}, 1, 1`:\r\n return NpcType.Hildeblue;\r\n case `${0x040}, 1, 2`:\r\n return NpcType.Hildeblue2;\r\n case `${0x041}, 0, 1`:\r\n return NpcType.RagRappy;\r\n case `${0x041}, 0, 2`:\r\n return NpcType.RagRappy2;\r\n case `${0x041}, 0, 4`:\r\n return NpcType.SandRappy;\r\n case `${0x041}, 1, 1`:\r\n return NpcType.AlRappy;\r\n case `${0x041}, 1, 2`:\r\n return NpcType.LoveRappy;\r\n case `${0x041}, 1, 4`:\r\n return NpcType.DelRappy;\r\n\r\n case `${0x080}, 0, 1`:\r\n return NpcType.Dubchic;\r\n case `${0x080}, 0, 2`:\r\n return NpcType.Dubchic2;\r\n case `${0x080}, 1, 1`:\r\n return NpcType.Gilchic;\r\n case `${0x080}, 1, 2`:\r\n return NpcType.Gilchic2;\r\n\r\n case `${0x0d4}, 0, 2`:\r\n return NpcType.SinowBerill;\r\n case `${0x0d4}, 1, 2`:\r\n return NpcType.SinowSpigell;\r\n case `${0x0d5}, 0, 2`:\r\n return NpcType.Merillia;\r\n case `${0x0d5}, 1, 2`:\r\n return NpcType.Meriltas;\r\n case `${0x0d7}, 0, 2`:\r\n return NpcType.UlGibbon;\r\n case `${0x0d7}, 1, 2`:\r\n return NpcType.ZolGibbon;\r\n\r\n case `${0x0dd}, 0, 2`:\r\n return NpcType.Dolmolm;\r\n case `${0x0dd}, 1, 2`:\r\n return NpcType.Dolmdarl;\r\n case `${0x0e0}, 0, 2`:\r\n return area_id > 15 ? NpcType.Epsilon : NpcType.SinowZoa;\r\n case `${0x0e0}, 1, 2`:\r\n return area_id > 15 ? NpcType.Epsilon : NpcType.SinowZele;\r\n\r\n case `${0x112}, 0, 4`:\r\n return NpcType.MerissaA;\r\n case `${0x112}, 1, 4`:\r\n return NpcType.MerissaAA;\r\n case `${0x114}, 0, 4`:\r\n return NpcType.Zu;\r\n case `${0x114}, 1, 4`:\r\n return NpcType.Pazuzu;\r\n case `${0x116}, 0, 4`:\r\n return NpcType.Dorphon;\r\n case `${0x116}, 1, 4`:\r\n return NpcType.DorphonEclair;\r\n case `${0x119}, 0, 4`:\r\n return regular ? NpcType.SaintMilion : NpcType.Kondrieu;\r\n case `${0x119}, 1, 4`:\r\n return regular ? NpcType.Shambertin : NpcType.Kondrieu;\r\n }\r\n\r\n switch (`${type_id}, ${episode}`) {\r\n case `${0x042}, 1`:\r\n return NpcType.Monest;\r\n case `${0x042}, 2`:\r\n return NpcType.Monest2;\r\n case `${0x043}, 1`:\r\n return regular ? NpcType.SavageWolf : NpcType.BarbarousWolf;\r\n case `${0x043}, 2`:\r\n return regular ? NpcType.SavageWolf2 : NpcType.BarbarousWolf2;\r\n\r\n case `${0x060}, 1`:\r\n return NpcType.GrassAssassin;\r\n case `${0x060}, 2`:\r\n return NpcType.GrassAssassin2;\r\n case `${0x061}, 1`:\r\n return area_id > 15 ? NpcType.DelLily : regular ? NpcType.PoisonLily : NpcType.NarLily;\r\n case `${0x061}, 2`:\r\n return area_id > 15\r\n ? NpcType.DelLily\r\n : regular\r\n ? NpcType.PoisonLily2\r\n : NpcType.NarLily2;\r\n case `${0x062}, 1`:\r\n return NpcType.NanoDragon;\r\n case `${0x064}, 1`:\r\n return regular ? NpcType.PofuillySlime : NpcType.PouillySlime;\r\n case `${0x065}, 1`:\r\n return NpcType.PanArms;\r\n case `${0x065}, 2`:\r\n return NpcType.PanArms2;\r\n\r\n case `${0x081}, 1`:\r\n return NpcType.Garanz;\r\n case `${0x081}, 2`:\r\n return NpcType.Garanz2;\r\n case `${0x082}, 1`:\r\n return regular ? NpcType.SinowBeat : NpcType.SinowGold;\r\n case `${0x083}, 1`:\r\n return NpcType.Canadine;\r\n case `${0x084}, 1`:\r\n return NpcType.Canane;\r\n case `${0x085}, 1`:\r\n return NpcType.Dubswitch;\r\n case `${0x085}, 2`:\r\n return NpcType.Dubswitch2;\r\n\r\n case `${0x0a0}, 1`:\r\n return NpcType.Delsaber;\r\n case `${0x0a0}, 2`:\r\n return NpcType.Delsaber2;\r\n case `${0x0a1}, 1`:\r\n return NpcType.ChaosSorcerer;\r\n case `${0x0a1}, 2`:\r\n return NpcType.ChaosSorcerer2;\r\n case `${0x0a2}, 1`:\r\n return NpcType.DarkGunner;\r\n case `${0x0a4}, 1`:\r\n return NpcType.ChaosBringer;\r\n case `${0x0a5}, 1`:\r\n return NpcType.DarkBelra;\r\n case `${0x0a5}, 2`:\r\n return NpcType.DarkBelra2;\r\n case `${0x0a7}, 1`:\r\n return NpcType.Bulclaw;\r\n case `${0x0a8}, 1`:\r\n return NpcType.Claw;\r\n\r\n case `${0x0c0}, 1`:\r\n return NpcType.Dragon;\r\n case `${0x0c0}, 2`:\r\n return NpcType.GalGryphon;\r\n case `${0x0c1}, 1`:\r\n return NpcType.DeRolLe;\r\n // TODO:\r\n // case `${0x0C2}, 1`: return NpcType.VolOptPart1;\r\n case `${0x0c5}, 1`:\r\n return NpcType.VolOpt;\r\n case `${0x0c8}, 1`:\r\n return NpcType.DarkFalz;\r\n case `${0x0ca}, 2`:\r\n return NpcType.OlgaFlow;\r\n case `${0x0cb}, 2`:\r\n return NpcType.BarbaRay;\r\n case `${0x0cc}, 2`:\r\n return NpcType.GolDragon;\r\n\r\n case `${0x0d8}, 2`:\r\n return NpcType.Gibbles;\r\n case `${0x0d9}, 2`:\r\n return NpcType.Gee;\r\n case `${0x0da}, 2`:\r\n return NpcType.GiGue;\r\n\r\n case `${0x0db}, 2`:\r\n return NpcType.Deldepth;\r\n case `${0x0dc}, 2`:\r\n return NpcType.Delbiter;\r\n case `${0x0de}, 2`:\r\n return NpcType.Morfos;\r\n case `${0x0df}, 2`:\r\n return NpcType.Recobox;\r\n case `${0x0e1}, 2`:\r\n return NpcType.IllGill;\r\n\r\n case `${0x110}, 4`:\r\n return NpcType.Astark;\r\n case `${0x111}, 4`:\r\n return regular ? NpcType.SatelliteLizard : NpcType.Yowie;\r\n case `${0x113}, 4`:\r\n return NpcType.Girtablulu;\r\n }\r\n\r\n switch (type_id) {\r\n case 0x004:\r\n return NpcType.FemaleFat;\r\n case 0x005:\r\n return NpcType.FemaleMacho;\r\n case 0x007:\r\n return NpcType.FemaleTall;\r\n case 0x00a:\r\n return NpcType.MaleDwarf;\r\n case 0x00b:\r\n return NpcType.MaleFat;\r\n case 0x00c:\r\n return NpcType.MaleMacho;\r\n case 0x00d:\r\n return NpcType.MaleOld;\r\n case 0x019:\r\n return NpcType.BlueSoldier;\r\n case 0x01a:\r\n return NpcType.RedSoldier;\r\n case 0x01b:\r\n return NpcType.Principal;\r\n case 0x01c:\r\n return NpcType.Tekker;\r\n case 0x01d:\r\n return NpcType.GuildLady;\r\n case 0x01e:\r\n return NpcType.Scientist;\r\n case 0x01f:\r\n return NpcType.Nurse;\r\n case 0x020:\r\n return NpcType.Irene;\r\n case 0x0f1:\r\n return NpcType.ItemShop;\r\n case 0x0fe:\r\n return NpcType.Nurse2;\r\n }\r\n\r\n return NpcType.Unknown;\r\n}\r\n\r\nfunction objects_to_dat_data(objects: QuestObject[]): DatObject[] {\r\n return objects.map(object => ({\r\n type_id: object.type.pso_id!,\r\n section_id: object.section_id,\r\n position: object.section_position,\r\n rotation: object.rotation,\r\n area_id: object.area_id,\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 type_data = npc_type_to_dat_data(npc.type);\r\n let flags = npc.dat.flags;\r\n\r\n if (type_data) {\r\n flags = (npc.dat.flags & ~0x800000) | (type_data.regular ? 0 : 0x800000);\r\n }\r\n\r\n return {\r\n type_id: type_data ? type_data.type_id : npc.dat.type_id,\r\n section_id: npc.section_id,\r\n position: npc.section_position,\r\n rotation: npc.rotation,\r\n flags,\r\n skin: type_data ? type_data.skin : npc.dat.skin,\r\n area_id: npc.area_id,\r\n unknown: npc.dat.unknown,\r\n };\r\n });\r\n}\r\n\r\nfunction npc_type_to_dat_data(\r\n type: NpcType\r\n): { type_id: number; skin: number; regular: boolean } | undefined {\r\n switch (type) {\r\n default:\r\n throw new Error(`Unexpected type ${type.code}.`);\r\n\r\n case NpcType.Unknown:\r\n return undefined;\r\n\r\n case NpcType.FemaleFat:\r\n return { type_id: 0x004, skin: 0, regular: true };\r\n case NpcType.FemaleMacho:\r\n return { type_id: 0x005, skin: 0, regular: true };\r\n case NpcType.FemaleTall:\r\n return { type_id: 0x007, skin: 0, regular: true };\r\n case NpcType.MaleDwarf:\r\n return { type_id: 0x00a, skin: 0, regular: true };\r\n case NpcType.MaleFat:\r\n return { type_id: 0x00b, skin: 0, regular: true };\r\n case NpcType.MaleMacho:\r\n return { type_id: 0x00c, skin: 0, regular: true };\r\n case NpcType.MaleOld:\r\n return { type_id: 0x00d, skin: 0, regular: true };\r\n case NpcType.BlueSoldier:\r\n return { type_id: 0x019, skin: 0, regular: true };\r\n case NpcType.RedSoldier:\r\n return { type_id: 0x01a, skin: 0, regular: true };\r\n case NpcType.Principal:\r\n return { type_id: 0x01b, skin: 0, regular: true };\r\n case NpcType.Tekker:\r\n return { type_id: 0x01c, skin: 0, regular: true };\r\n case NpcType.GuildLady:\r\n return { type_id: 0x01d, skin: 0, regular: true };\r\n case NpcType.Scientist:\r\n return { type_id: 0x01e, skin: 0, regular: true };\r\n case NpcType.Nurse:\r\n return { type_id: 0x01f, skin: 0, regular: true };\r\n case NpcType.Irene:\r\n return { type_id: 0x020, skin: 0, regular: true };\r\n case NpcType.ItemShop:\r\n return { type_id: 0x0f1, skin: 0, regular: true };\r\n case NpcType.Nurse2:\r\n return { type_id: 0x0fe, skin: 0, regular: true };\r\n\r\n case NpcType.Hildebear:\r\n return { type_id: 0x040, skin: 0, regular: true };\r\n case NpcType.Hildeblue:\r\n return { type_id: 0x040, skin: 1, regular: true };\r\n case NpcType.RagRappy:\r\n return { type_id: 0x041, skin: 0, regular: true };\r\n case NpcType.AlRappy:\r\n return { type_id: 0x041, skin: 1, regular: true };\r\n case NpcType.Monest:\r\n return { type_id: 0x042, skin: 0, regular: true };\r\n case NpcType.SavageWolf:\r\n return { type_id: 0x043, skin: 0, regular: true };\r\n case NpcType.BarbarousWolf:\r\n return { type_id: 0x043, skin: 0, regular: false };\r\n case NpcType.Booma:\r\n return { type_id: 0x044, skin: 0, regular: true };\r\n case NpcType.Gobooma:\r\n return { type_id: 0x044, skin: 1, regular: true };\r\n case NpcType.Gigobooma:\r\n return { type_id: 0x044, skin: 2, regular: true };\r\n case NpcType.Dragon:\r\n return { type_id: 0x0c0, skin: 0, regular: true };\r\n\r\n case NpcType.GrassAssassin:\r\n return { type_id: 0x060, skin: 0, regular: true };\r\n case NpcType.PoisonLily:\r\n return { type_id: 0x061, skin: 0, regular: true };\r\n case NpcType.NarLily:\r\n return { type_id: 0x061, skin: 1, regular: true };\r\n case NpcType.NanoDragon:\r\n return { type_id: 0x062, skin: 0, regular: true };\r\n case NpcType.EvilShark:\r\n return { type_id: 0x063, skin: 0, regular: true };\r\n case NpcType.PalShark:\r\n return { type_id: 0x063, skin: 1, regular: true };\r\n case NpcType.GuilShark:\r\n return { type_id: 0x063, skin: 2, regular: true };\r\n case NpcType.PofuillySlime:\r\n return { type_id: 0x064, skin: 0, regular: true };\r\n case NpcType.PouillySlime:\r\n return { type_id: 0x064, skin: 0, regular: false };\r\n case NpcType.PanArms:\r\n return { type_id: 0x065, skin: 0, regular: true };\r\n case NpcType.DeRolLe:\r\n return { type_id: 0x0c1, skin: 0, regular: true };\r\n\r\n case NpcType.Dubchic:\r\n return { type_id: 0x080, skin: 0, regular: true };\r\n case NpcType.Gilchic:\r\n return { type_id: 0x080, skin: 1, regular: true };\r\n case NpcType.Garanz:\r\n return { type_id: 0x081, skin: 0, regular: true };\r\n case NpcType.SinowBeat:\r\n return { type_id: 0x082, skin: 0, regular: true };\r\n case NpcType.SinowGold:\r\n return { type_id: 0x082, skin: 0, regular: false };\r\n case NpcType.Canadine:\r\n return { type_id: 0x083, skin: 0, regular: true };\r\n case NpcType.Canane:\r\n return { type_id: 0x084, skin: 0, regular: true };\r\n case NpcType.Dubswitch:\r\n return { type_id: 0x085, skin: 0, regular: true };\r\n case NpcType.VolOpt:\r\n return { type_id: 0x0c5, skin: 0, regular: true };\r\n\r\n case NpcType.Delsaber:\r\n return { type_id: 0x0a0, skin: 0, regular: true };\r\n case NpcType.ChaosSorcerer:\r\n return { type_id: 0x0a1, skin: 0, regular: true };\r\n case NpcType.DarkGunner:\r\n return { type_id: 0x0a2, skin: 0, regular: true };\r\n case NpcType.ChaosBringer:\r\n return { type_id: 0x0a4, skin: 0, regular: true };\r\n case NpcType.DarkBelra:\r\n return { type_id: 0x0a5, skin: 0, regular: true };\r\n case NpcType.Dimenian:\r\n return { type_id: 0x0a6, skin: 0, regular: true };\r\n case NpcType.LaDimenian:\r\n return { type_id: 0x0a6, skin: 1, regular: true };\r\n case NpcType.SoDimenian:\r\n return { type_id: 0x0a6, skin: 2, regular: true };\r\n case NpcType.Bulclaw:\r\n return { type_id: 0x0a7, skin: 0, regular: true };\r\n case NpcType.Claw:\r\n return { type_id: 0x0a8, skin: 0, regular: true };\r\n case NpcType.DarkFalz:\r\n return { type_id: 0x0c8, skin: 0, regular: true };\r\n\r\n case NpcType.Hildebear2:\r\n return { type_id: 0x040, skin: 0, regular: true };\r\n case NpcType.Hildeblue2:\r\n return { type_id: 0x040, skin: 1, regular: true };\r\n case NpcType.RagRappy2:\r\n return { type_id: 0x041, skin: 0, regular: true };\r\n case NpcType.LoveRappy:\r\n return { type_id: 0x041, skin: 1, regular: true };\r\n case NpcType.Monest2:\r\n return { type_id: 0x042, skin: 0, regular: true };\r\n case NpcType.PoisonLily2:\r\n return { type_id: 0x061, skin: 0, regular: true };\r\n case NpcType.NarLily2:\r\n return { type_id: 0x061, skin: 1, regular: true };\r\n case NpcType.GrassAssassin2:\r\n return { type_id: 0x060, skin: 0, regular: true };\r\n case NpcType.Dimenian2:\r\n return { type_id: 0x0a6, skin: 0, regular: true };\r\n case NpcType.LaDimenian2:\r\n return { type_id: 0x0a6, skin: 1, regular: true };\r\n case NpcType.SoDimenian2:\r\n return { type_id: 0x0a6, skin: 2, regular: true };\r\n case NpcType.DarkBelra2:\r\n return { type_id: 0x0a5, skin: 0, regular: true };\r\n case NpcType.BarbaRay:\r\n return { type_id: 0x0cb, skin: 0, regular: true };\r\n\r\n case NpcType.SavageWolf2:\r\n return { type_id: 0x043, skin: 0, regular: true };\r\n case NpcType.BarbarousWolf2:\r\n return { type_id: 0x043, skin: 0, regular: false };\r\n case NpcType.PanArms2:\r\n return { type_id: 0x065, skin: 0, regular: true };\r\n case NpcType.Dubchic2:\r\n return { type_id: 0x080, skin: 0, regular: true };\r\n case NpcType.Gilchic2:\r\n return { type_id: 0x080, skin: 1, regular: true };\r\n case NpcType.Garanz2:\r\n return { type_id: 0x081, skin: 0, regular: true };\r\n case NpcType.Dubswitch2:\r\n return { type_id: 0x085, skin: 0, regular: true };\r\n case NpcType.Delsaber2:\r\n return { type_id: 0x0a0, skin: 0, regular: true };\r\n case NpcType.ChaosSorcerer2:\r\n return { type_id: 0x0a1, skin: 0, regular: true };\r\n case NpcType.GolDragon:\r\n return { type_id: 0x0cc, skin: 0, regular: true };\r\n\r\n case NpcType.SinowBerill:\r\n return { type_id: 0x0d4, skin: 0, regular: true };\r\n case NpcType.SinowSpigell:\r\n return { type_id: 0x0d4, skin: 1, regular: true };\r\n case NpcType.Merillia:\r\n return { type_id: 0x0d5, skin: 0, regular: true };\r\n case NpcType.Meriltas:\r\n return { type_id: 0x0d5, skin: 1, regular: true };\r\n case NpcType.Mericarol:\r\n return { type_id: 0x0d6, skin: 0, regular: true };\r\n case NpcType.Mericus:\r\n return { type_id: 0x0d6, skin: 1, regular: true };\r\n case NpcType.Merikle:\r\n return { type_id: 0x0d6, skin: 2, regular: true };\r\n case NpcType.UlGibbon:\r\n return { type_id: 0x0d7, skin: 0, regular: true };\r\n case NpcType.ZolGibbon:\r\n return { type_id: 0x0d7, skin: 1, regular: true };\r\n case NpcType.Gibbles:\r\n return { type_id: 0x0d8, skin: 0, regular: true };\r\n case NpcType.Gee:\r\n return { type_id: 0x0d9, skin: 0, regular: true };\r\n case NpcType.GiGue:\r\n return { type_id: 0x0da, skin: 0, regular: true };\r\n case NpcType.GalGryphon:\r\n return { type_id: 0x0c0, skin: 0, regular: true };\r\n\r\n case NpcType.Deldepth:\r\n return { type_id: 0x0db, skin: 0, regular: true };\r\n case NpcType.Delbiter:\r\n return { type_id: 0x0dc, skin: 0, regular: true };\r\n case NpcType.Dolmolm:\r\n return { type_id: 0x0dd, skin: 0, regular: true };\r\n case NpcType.Dolmdarl:\r\n return { type_id: 0x0dd, skin: 1, regular: true };\r\n case NpcType.Morfos:\r\n return { type_id: 0x0de, skin: 0, regular: true };\r\n case NpcType.Recobox:\r\n return { type_id: 0x0df, skin: 0, regular: true };\r\n case NpcType.Epsilon:\r\n return { type_id: 0x0e0, skin: 0, regular: true };\r\n case NpcType.SinowZoa:\r\n return { type_id: 0x0e0, skin: 0, regular: true };\r\n case NpcType.SinowZele:\r\n return { type_id: 0x0e0, skin: 1, regular: true };\r\n case NpcType.IllGill:\r\n return { type_id: 0x0e1, skin: 0, regular: true };\r\n case NpcType.DelLily:\r\n return { type_id: 0x061, skin: 0, regular: true };\r\n case NpcType.OlgaFlow:\r\n return { type_id: 0x0ca, skin: 0, regular: true };\r\n\r\n case NpcType.SandRappy:\r\n return { type_id: 0x041, skin: 0, regular: true };\r\n case NpcType.DelRappy:\r\n return { type_id: 0x041, skin: 1, regular: true };\r\n case NpcType.Astark:\r\n return { type_id: 0x110, skin: 0, regular: true };\r\n case NpcType.SatelliteLizard:\r\n return { type_id: 0x111, skin: 0, regular: true };\r\n case NpcType.Yowie:\r\n return { type_id: 0x111, skin: 0, regular: false };\r\n case NpcType.MerissaA:\r\n return { type_id: 0x112, skin: 0, regular: true };\r\n case NpcType.MerissaAA:\r\n return { type_id: 0x112, skin: 1, regular: true };\r\n case NpcType.Girtablulu:\r\n return { type_id: 0x113, skin: 0, regular: true };\r\n case NpcType.Zu:\r\n return { type_id: 0x114, skin: 0, regular: true };\r\n case NpcType.Pazuzu:\r\n return { type_id: 0x114, skin: 1, regular: true };\r\n case NpcType.Boota:\r\n return { type_id: 0x115, skin: 0, regular: true };\r\n case NpcType.ZeBoota:\r\n return { type_id: 0x115, skin: 1, regular: true };\r\n case NpcType.BaBoota:\r\n return { type_id: 0x115, skin: 2, regular: true };\r\n case NpcType.Dorphon:\r\n return { type_id: 0x116, skin: 0, regular: true };\r\n case NpcType.DorphonEclair:\r\n return { type_id: 0x116, skin: 1, regular: true };\r\n case NpcType.Goran:\r\n return { type_id: 0x117, skin: 0, regular: true };\r\n case NpcType.PyroGoran:\r\n return { type_id: 0x117, skin: 1, regular: true };\r\n case NpcType.GoranDetonator:\r\n return { type_id: 0x117, skin: 2, regular: true };\r\n case NpcType.SaintMilion:\r\n return { type_id: 0x119, skin: 0, regular: true };\r\n case NpcType.Shambertin:\r\n return { type_id: 0x119, skin: 1, regular: true };\r\n case NpcType.Kondrieu:\r\n return { type_id: 0x119, skin: 0, regular: false };\r\n }\r\n}\r\n","import { BufferGeometry, DoubleSide, Mesh, MeshLambertMaterial } from \"three\";\r\nimport { QuestEntity, QuestNpc, QuestObject } 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 create_object_mesh(object: QuestObject, geometry: BufferGeometry): Mesh {\r\n return create_mesh(object, geometry, OBJECT_COLOR, \"Object\");\r\n}\r\n\r\nexport function create_npc_mesh(npc: QuestNpc, geometry: BufferGeometry): Mesh {\r\n return create_mesh(npc, geometry, NPC_COLOR, \"NPC\");\r\n}\r\n\r\nfunction create_mesh(\r\n entity: QuestEntity,\r\n geometry: BufferGeometry,\r\n color: number,\r\n type: string\r\n): Mesh {\r\n const mesh = new Mesh(\r\n geometry,\r\n new MeshLambertMaterial({\r\n color,\r\n side: DoubleSide,\r\n })\r\n );\r\n mesh.name = type;\r\n mesh.userData.entity = entity;\r\n\r\n return mesh;\r\n}\r\n","import { Vec3 } from \"../data_formats/Vec3\";\r\nimport { Vector3 } from \"three\";\r\n\r\nexport function vec3_to_threejs(v: Vec3): Vector3 {\r\n return new Vector3(v.x, v.y, v.z);\r\n}\r\n","import {\r\n Bone,\r\n BufferGeometry,\r\n DoubleSide,\r\n Euler,\r\n Float32BufferAttribute,\r\n Material,\r\n Matrix3,\r\n Matrix4,\r\n MeshLambertMaterial,\r\n Quaternion,\r\n Skeleton,\r\n SkinnedMesh,\r\n Uint16BufferAttribute,\r\n Vector3,\r\n} from \"three\";\r\nimport { vec3_to_threejs } from \".\";\r\nimport { NinjaModel, NinjaObject } from \"../data_formats/parsing/ninja\";\r\nimport { NjModel } from \"../data_formats/parsing/ninja/nj\";\r\nimport { XjModel } from \"../data_formats/parsing/ninja/xj\";\r\n\r\nconst DEFAULT_MATERIAL = new MeshLambertMaterial({\r\n color: 0xff00ff,\r\n side: DoubleSide,\r\n});\r\nconst DEFAULT_SKINNED_MATERIAL = new MeshLambertMaterial({\r\n skinning: true,\r\n color: 0xff00ff,\r\n side: DoubleSide,\r\n});\r\nconst DEFAULT_NORMAL = new Vector3(0, 1, 0);\r\nconst NO_TRANSLATION = new Vector3(0, 0, 0);\r\nconst NO_ROTATION = new Quaternion(0, 0, 0, 1);\r\nconst NO_SCALE = new Vector3(1, 1, 1);\r\n\r\nexport function ninja_object_to_buffer_geometry(\r\n object: NinjaObject<NinjaModel>,\r\n material: Material = DEFAULT_MATERIAL\r\n): BufferGeometry {\r\n return new Object3DCreator(material).create_buffer_geometry(object);\r\n}\r\n\r\nexport function ninja_object_to_skinned_mesh(\r\n object: NinjaObject<NinjaModel>,\r\n material: Material = DEFAULT_SKINNED_MATERIAL\r\n): SkinnedMesh {\r\n return new Object3DCreator(material).create_skinned_mesh(object);\r\n}\r\n\r\ntype Vertex = {\r\n bone_id: number;\r\n position: Vector3;\r\n normal?: Vector3;\r\n bone_weight: number;\r\n bone_weight_status: number;\r\n calc_continue: boolean;\r\n};\r\n\r\nclass VerticesHolder {\r\n private vertices_stack: Vertex[][] = [];\r\n\r\n put(vertices: Vertex[]): void {\r\n this.vertices_stack.push(vertices);\r\n }\r\n\r\n get(index: number): Vertex[] {\r\n const vertices: Vertex[] = [];\r\n\r\n for (let i = this.vertices_stack.length - 1; i >= 0; i--) {\r\n const vertex = this.vertices_stack[i][index];\r\n\r\n if (vertex) {\r\n vertices.push(vertex);\r\n }\r\n }\r\n\r\n return vertices;\r\n }\r\n}\r\n\r\nclass Object3DCreator {\r\n private material: Material;\r\n private bone_id: number = 0;\r\n private vertices = new VerticesHolder();\r\n private positions: number[] = [];\r\n private normals: number[] = [];\r\n private indices: number[] = [];\r\n private bone_indices: number[] = [];\r\n private bone_weights: number[] = [];\r\n private bones: Bone[] = [];\r\n\r\n constructor(material: Material) {\r\n this.material = material;\r\n }\r\n\r\n create_buffer_geometry(object: NinjaObject<NinjaModel>): BufferGeometry {\r\n this.object_to_geometry(object, undefined, new Matrix4());\r\n\r\n const geom = new BufferGeometry();\r\n\r\n geom.addAttribute(\"position\", new Float32BufferAttribute(this.positions, 3));\r\n geom.addAttribute(\"normal\", new Float32BufferAttribute(this.normals, 3));\r\n geom.setIndex(new Uint16BufferAttribute(this.indices, 1));\r\n\r\n // The bounding spheres from the object seem be too small.\r\n geom.computeBoundingSphere();\r\n\r\n return geom;\r\n }\r\n\r\n create_skinned_mesh(object: NinjaObject<NinjaModel>): SkinnedMesh {\r\n const geom = this.create_buffer_geometry(object);\r\n geom.addAttribute(\"skinIndex\", new Uint16BufferAttribute(this.bone_indices, 4));\r\n geom.addAttribute(\"skinWeight\", new Float32BufferAttribute(this.bone_weights, 4));\r\n\r\n const mesh = new SkinnedMesh(geom, this.material);\r\n\r\n const skeleton = new Skeleton(this.bones);\r\n mesh.add(this.bones[0]);\r\n mesh.bind(skeleton);\r\n\r\n return mesh;\r\n }\r\n\r\n private object_to_geometry(\r\n object: NinjaObject<NinjaModel>,\r\n parent_bone: Bone | undefined,\r\n parent_matrix: Matrix4\r\n ): void {\r\n const {\r\n no_translate,\r\n no_rotate,\r\n no_scale,\r\n hidden,\r\n break_child_trace,\r\n zxy_rotation_order,\r\n skip,\r\n } = object.evaluation_flags;\r\n const { position, rotation, scale } = object;\r\n\r\n const euler = new Euler(\r\n rotation.x,\r\n rotation.y,\r\n rotation.z,\r\n zxy_rotation_order ? \"ZXY\" : \"ZYX\"\r\n );\r\n const matrix = new Matrix4()\r\n .compose(\r\n no_translate ? NO_TRANSLATION : vec3_to_threejs(position),\r\n no_rotate ? NO_ROTATION : new Quaternion().setFromEuler(euler),\r\n no_scale ? NO_SCALE : vec3_to_threejs(scale)\r\n )\r\n .premultiply(parent_matrix);\r\n\r\n let bone: Bone | undefined;\r\n\r\n if (skip) {\r\n bone = parent_bone;\r\n } else {\r\n bone = new Bone();\r\n bone.name = this.bone_id.toString();\r\n\r\n bone.position.set(position.x, position.y, position.z);\r\n bone.setRotationFromEuler(euler);\r\n bone.scale.set(scale.x, scale.y, scale.z);\r\n\r\n this.bones.push(bone);\r\n\r\n if (parent_bone) {\r\n parent_bone.add(bone);\r\n }\r\n }\r\n\r\n if (object.model && !hidden) {\r\n this.model_to_geometry(object.model, matrix);\r\n }\r\n\r\n this.bone_id++;\r\n\r\n if (!break_child_trace) {\r\n for (const child of object.children) {\r\n this.object_to_geometry(child, bone, matrix);\r\n }\r\n }\r\n }\r\n\r\n private model_to_geometry(model: NinjaModel, matrix: Matrix4): void {\r\n if (model.type === \"nj\") {\r\n this.nj_model_to_geometry(model, matrix);\r\n } else {\r\n this.xj_model_to_geometry(model, matrix);\r\n }\r\n }\r\n\r\n private nj_model_to_geometry(model: NjModel, matrix: Matrix4): void {\r\n const normal_matrix = new Matrix3().getNormalMatrix(matrix);\r\n\r\n const new_vertices = model.vertices.map(vertex => {\r\n const position = vec3_to_threejs(vertex.position);\r\n const normal = vertex.normal ? vec3_to_threejs(vertex.normal) : DEFAULT_NORMAL;\r\n\r\n position.applyMatrix4(matrix);\r\n normal.applyMatrix3(normal_matrix);\r\n\r\n return {\r\n bone_id: this.bone_id,\r\n position,\r\n normal,\r\n bone_weight: vertex.bone_weight,\r\n bone_weight_status: vertex.bone_weight_status,\r\n calc_continue: vertex.calc_continue,\r\n };\r\n });\r\n\r\n this.vertices.put(new_vertices);\r\n\r\n for (const mesh of model.meshes) {\r\n for (let i = 0; i < mesh.vertices.length; ++i) {\r\n const mesh_vertex = mesh.vertices[i];\r\n const vertices = this.vertices.get(mesh_vertex.index);\r\n\r\n if (vertices.length) {\r\n const vertex = vertices[0];\r\n const normal = vertex.normal || mesh_vertex.normal || DEFAULT_NORMAL;\r\n const index = this.positions.length / 3;\r\n\r\n this.positions.push(vertex.position.x, vertex.position.y, vertex.position.z);\r\n this.normals.push(normal.x, normal.y, normal.z);\r\n\r\n if (i >= 2) {\r\n if (i % 2 === (mesh.clockwise_winding ? 1 : 0)) {\r\n this.indices.push(index - 2);\r\n this.indices.push(index - 1);\r\n this.indices.push(index);\r\n } else {\r\n this.indices.push(index - 2);\r\n this.indices.push(index);\r\n this.indices.push(index - 1);\r\n }\r\n }\r\n\r\n const bone_indices = [0, 0, 0, 0];\r\n const bone_weights = [0, 0, 0, 0];\r\n\r\n for (let j = vertices.length - 1; j >= 0; j--) {\r\n const vertex = vertices[j];\r\n bone_indices[vertex.bone_weight_status] = vertex.bone_id;\r\n bone_weights[vertex.bone_weight_status] = vertex.bone_weight;\r\n }\r\n\r\n this.bone_indices.push(...bone_indices);\r\n this.bone_weights.push(...bone_weights);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private xj_model_to_geometry(model: XjModel, matrix: Matrix4): void {\r\n const positions = this.positions;\r\n const normals = this.normals;\r\n const indices = this.indices;\r\n const index_offset = this.positions.length / 3;\r\n let clockwise = true;\r\n\r\n const normal_matrix = new Matrix3().getNormalMatrix(matrix);\r\n\r\n for (let { position, normal } of model.vertices) {\r\n const p = vec3_to_threejs(position).applyMatrix4(matrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n normal = normal || DEFAULT_NORMAL;\r\n const n = vec3_to_threejs(normal).applyMatrix3(normal_matrix);\r\n normals.push(n.x, n.y, n.z);\r\n }\r\n\r\n for (const mesh of model.meshes) {\r\n const strip_indices = mesh.indices;\r\n\r\n for (let j = 2; j < strip_indices.length; ++j) {\r\n const a = index_offset + strip_indices[j - 2];\r\n const b = index_offset + strip_indices[j - 1];\r\n const c = index_offset + strip_indices[j];\r\n const pa = new Vector3(\r\n positions[3 * a],\r\n positions[3 * a + 1],\r\n positions[3 * a + 2]\r\n );\r\n const pb = new Vector3(\r\n positions[3 * b],\r\n positions[3 * b + 1],\r\n positions[3 * b + 2]\r\n );\r\n const pc = new Vector3(\r\n positions[3 * c],\r\n positions[3 * c + 1],\r\n positions[3 * c + 2]\r\n );\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\r\n .clone()\r\n .sub(pa)\r\n .cross(pc.clone().sub(pa));\r\n\r\n if (clockwise) {\r\n normal.negate();\r\n }\r\n\r\n const opposite_count =\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 (opposite_count >= 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}\r\n","import Logger from \"js-logger\";\r\nimport { BufferCursor } from \"../../BufferCursor\";\r\nimport { Vec3 } from \"../../Vec3\";\r\nimport { NinjaVertex } from \"../ninja\";\r\n\r\nconst logger = Logger.get(\"data_formats/parsing/ninja/nj\");\r\n\r\n// TODO:\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 type NjModel = {\r\n type: \"nj\";\r\n /**\r\n * Sparse array of vertices.\r\n */\r\n vertices: NinjaVertex[];\r\n meshes: NjTriangleStrip[];\r\n // materials: [],\r\n bounding_sphere_center: Vec3;\r\n bounding_sphere_radius: number;\r\n};\r\n\r\nenum NjChunkType {\r\n Unknown,\r\n Null,\r\n Bits,\r\n CachePolygonList,\r\n DrawPolygonList,\r\n Tiny,\r\n Material,\r\n Vertex,\r\n Volume,\r\n Strip,\r\n End,\r\n}\r\n\r\ntype NjChunk = {\r\n type: NjChunkType;\r\n type_id: number;\r\n} & (\r\n | NjUnknownChunk\r\n | NjNullChunk\r\n | NjBitsChunk\r\n | NjCachePolygonListChunk\r\n | NjDrawPolygonListChunk\r\n | NjTinyChunk\r\n | NjMaterialChunk\r\n | NjVertexChunk\r\n | NjVolumeChunk\r\n | NjStripChunk\r\n | NjEndChunk);\r\n\r\ntype NjUnknownChunk = {\r\n type: NjChunkType.Unknown;\r\n};\r\n\r\ntype NjNullChunk = {\r\n type: NjChunkType.Null;\r\n};\r\n\r\ntype NjBitsChunk = {\r\n type: NjChunkType.Bits;\r\n};\r\n\r\ntype NjCachePolygonListChunk = {\r\n type: NjChunkType.CachePolygonList;\r\n cache_index: number;\r\n offset: number;\r\n};\r\n\r\ntype NjDrawPolygonListChunk = {\r\n type: NjChunkType.DrawPolygonList;\r\n cache_index: number;\r\n};\r\n\r\ntype NjTinyChunk = {\r\n type: NjChunkType.Tiny;\r\n};\r\n\r\ntype NjMaterialChunk = {\r\n type: NjChunkType.Material;\r\n};\r\n\r\ntype NjVertexChunk = {\r\n type: NjChunkType.Vertex;\r\n vertices: NjVertex[];\r\n};\r\n\r\ntype NjVolumeChunk = {\r\n type: NjChunkType.Volume;\r\n};\r\n\r\ntype NjStripChunk = {\r\n type: NjChunkType.Strip;\r\n triangle_strips: NjTriangleStrip[];\r\n};\r\n\r\ntype NjEndChunk = {\r\n type: NjChunkType.End;\r\n};\r\n\r\ntype NjVertex = {\r\n index: number;\r\n position: Vec3;\r\n normal?: Vec3;\r\n bone_weight: number;\r\n bone_weight_status: number;\r\n calc_continue: boolean;\r\n};\r\n\r\ntype NjTriangleStrip = {\r\n ignore_light: boolean;\r\n ignore_specular: boolean;\r\n ignore_ambient: boolean;\r\n use_alpha: boolean;\r\n double_side: boolean;\r\n flat_shading: boolean;\r\n environment_mapping: boolean;\r\n clockwise_winding: boolean;\r\n vertices: NjMeshVertex[];\r\n};\r\n\r\ntype NjMeshVertex = {\r\n index: number;\r\n normal?: Vec3;\r\n};\r\n\r\nexport function parse_nj_model(cursor: BufferCursor, cached_chunk_offsets: number[]): NjModel {\r\n const vlist_offset = cursor.u32(); // Vertex list\r\n const plist_offset = cursor.u32(); // Triangle strip index list\r\n const bounding_sphere_center = new Vec3(cursor.f32(), cursor.f32(), cursor.f32());\r\n const bounding_sphere_radius = cursor.f32();\r\n const vertices: NinjaVertex[] = [];\r\n const meshes: NjTriangleStrip[] = [];\r\n\r\n if (vlist_offset) {\r\n cursor.seek_start(vlist_offset);\r\n\r\n for (const chunk of parse_chunks(cursor, cached_chunk_offsets, true)) {\r\n if (chunk.type === NjChunkType.Vertex) {\r\n for (const vertex of chunk.vertices) {\r\n vertices[vertex.index] = {\r\n position: vertex.position,\r\n normal: vertex.normal,\r\n bone_weight: vertex.bone_weight,\r\n bone_weight_status: vertex.bone_weight_status,\r\n calc_continue: vertex.calc_continue,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (plist_offset) {\r\n cursor.seek_start(plist_offset);\r\n\r\n for (const chunk of parse_chunks(cursor, cached_chunk_offsets, false)) {\r\n if (chunk.type === NjChunkType.Strip) {\r\n meshes.push(...chunk.triangle_strips);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n type: \"nj\",\r\n vertices,\r\n meshes,\r\n bounding_sphere_center,\r\n bounding_sphere_radius,\r\n };\r\n}\r\n\r\n// TODO: don't reparse when DrawPolygonList chunk is encountered.\r\nfunction parse_chunks(\r\n cursor: BufferCursor,\r\n cached_chunk_offsets: number[],\r\n wide_end_chunks: boolean\r\n): NjChunk[] {\r\n const chunks: NjChunk[] = [];\r\n let loop = true;\r\n\r\n while (loop) {\r\n const type_id = cursor.u8();\r\n const flags = cursor.u8();\r\n const chunk_start_position = cursor.position;\r\n let size = 0;\r\n\r\n if (type_id === 0) {\r\n chunks.push({\r\n type: NjChunkType.Null,\r\n type_id,\r\n });\r\n } else if (1 <= type_id && type_id <= 3) {\r\n chunks.push({\r\n type: NjChunkType.Bits,\r\n type_id,\r\n });\r\n } else if (type_id === 4) {\r\n const cache_index = flags;\r\n const offset = cursor.position;\r\n chunks.push({\r\n type: NjChunkType.CachePolygonList,\r\n type_id,\r\n cache_index,\r\n offset,\r\n });\r\n cached_chunk_offsets[cache_index] = offset;\r\n loop = false;\r\n } else if (type_id === 5) {\r\n const cache_index = flags;\r\n const cached_offset = cached_chunk_offsets[cache_index];\r\n\r\n if (cached_offset != null) {\r\n cursor.seek_start(cached_offset);\r\n chunks.push(...parse_chunks(cursor, cached_chunk_offsets, wide_end_chunks));\r\n }\r\n\r\n chunks.push({\r\n type: NjChunkType.DrawPolygonList,\r\n type_id,\r\n cache_index,\r\n });\r\n } else if (8 <= type_id && type_id <= 9) {\r\n size = 2;\r\n chunks.push({\r\n type: NjChunkType.Tiny,\r\n type_id,\r\n });\r\n } else if (17 <= type_id && type_id <= 31) {\r\n size = 2 + 2 * cursor.u16();\r\n chunks.push({\r\n type: NjChunkType.Material,\r\n type_id,\r\n });\r\n } else if (32 <= type_id && type_id <= 50) {\r\n size = 2 + 4 * cursor.u16();\r\n chunks.push({\r\n type: NjChunkType.Vertex,\r\n type_id,\r\n vertices: parse_vertex_chunk(cursor, type_id, flags),\r\n });\r\n } else if (56 <= type_id && type_id <= 58) {\r\n size = 2 + 2 * cursor.u16();\r\n chunks.push({\r\n type: NjChunkType.Volume,\r\n type_id,\r\n });\r\n } else if (64 <= type_id && type_id <= 75) {\r\n size = 2 + 2 * cursor.u16();\r\n chunks.push({\r\n type: NjChunkType.Strip,\r\n type_id,\r\n triangle_strips: parse_triangle_strip_chunk(cursor, type_id, flags),\r\n });\r\n } else if (type_id === 255) {\r\n size = wide_end_chunks ? 2 : 0;\r\n chunks.push({\r\n type: NjChunkType.End,\r\n type_id,\r\n });\r\n loop = false;\r\n } else {\r\n size = 2 + 2 * cursor.u16();\r\n chunks.push({\r\n type: NjChunkType.Unknown,\r\n type_id,\r\n });\r\n logger.warn(`Unknown chunk type ${type_id} at offset ${chunk_start_position}.`);\r\n }\r\n\r\n cursor.seek_start(chunk_start_position + size);\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\nfunction parse_vertex_chunk(\r\n cursor: BufferCursor,\r\n chunk_type_id: number,\r\n flags: number\r\n): NjVertex[] {\r\n if (chunk_type_id < 32 || chunk_type_id > 50) {\r\n logger.warn(`Unknown vertex chunk type ${chunk_type_id}.`);\r\n return [];\r\n }\r\n\r\n const bone_weight_status = flags & 0b11;\r\n const calc_continue = (flags & 0x80) !== 0;\r\n\r\n const index = cursor.u16();\r\n const vertex_count = cursor.u16();\r\n\r\n const vertices: NjVertex[] = [];\r\n\r\n for (let i = 0; i < vertex_count; ++i) {\r\n const vertex: NjVertex = {\r\n index: index + i,\r\n position: new Vec3(\r\n cursor.f32(), // x\r\n cursor.f32(), // y\r\n cursor.f32() // z\r\n ),\r\n bone_weight: 1,\r\n bone_weight_status,\r\n calc_continue,\r\n };\r\n\r\n if (chunk_type_id === 32) {\r\n // NJD_CV_SH\r\n cursor.seek(4); // Always 1.0\r\n } else if (chunk_type_id === 33) {\r\n // NJD_CV_VN_SH\r\n cursor.seek(4); // Always 1.0\r\n vertex.normal = new Vec3(\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 <= chunk_type_id && chunk_type_id <= 40) {\r\n if (chunk_type_id === 37) {\r\n // NJD_CV_NF\r\n // NinjaFlags32\r\n vertex.index = index + cursor.u16();\r\n vertex.bone_weight = cursor.u16() / 255;\r\n } else {\r\n // Skip user flags and material information.\r\n cursor.seek(4);\r\n }\r\n } else if (41 <= chunk_type_id && chunk_type_id <= 47) {\r\n vertex.normal = new Vec3(\r\n cursor.f32(), // x\r\n cursor.f32(), // y\r\n cursor.f32() // z\r\n );\r\n\r\n if (chunk_type_id >= 42) {\r\n if (chunk_type_id === 44) {\r\n // NJD_CV_VN_NF\r\n // NinjaFlags32\r\n vertex.index = index + cursor.u16();\r\n vertex.bone_weight = cursor.u16() / 255;\r\n } else {\r\n // Skip user flags and material information.\r\n cursor.seek(4);\r\n }\r\n }\r\n } else if (48 <= chunk_type_id && chunk_type_id <= 50) {\r\n // 32-Bit vertex normal in format: reserved(2)|x(10)|y(10)|z(10)\r\n const normal = cursor.u32();\r\n vertex.normal = new Vec3(\r\n ((normal >> 20) & 0x3ff) / 0x3ff,\r\n ((normal >> 10) & 0x3ff) / 0x3ff,\r\n (normal & 0x3ff) / 0x3ff\r\n );\r\n\r\n if (chunk_type_id >= 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 parse_triangle_strip_chunk(\r\n cursor: BufferCursor,\r\n chunk_type_id: number,\r\n flags: number\r\n): NjTriangleStrip[] {\r\n const render_flags = {\r\n ignore_light: (flags & 0b1) !== 0,\r\n ignore_specular: (flags & 0b10) !== 0,\r\n ignore_ambient: (flags & 0b100) !== 0,\r\n use_alpha: (flags & 0b1000) !== 0,\r\n double_side: (flags & 0b10000) !== 0,\r\n flat_shading: (flags & 0b100000) !== 0,\r\n environment_mapping: (flags & 0b1000000) !== 0,\r\n };\r\n const user_offset_and_strip_count = cursor.u16();\r\n const user_flags_size = user_offset_and_strip_count >>> 14;\r\n const strip_count = user_offset_and_strip_count & 0x3fff;\r\n let options;\r\n\r\n switch (chunk_type_id) {\r\n case 64:\r\n options = [false, false, false, false];\r\n break;\r\n case 65:\r\n options = [true, false, false, false];\r\n break;\r\n case 66:\r\n options = [true, false, false, false];\r\n break;\r\n case 67:\r\n options = [false, false, true, false];\r\n break;\r\n case 68:\r\n options = [true, false, true, false];\r\n break;\r\n case 69:\r\n options = [true, false, true, false];\r\n break;\r\n case 70:\r\n options = [false, true, false, false];\r\n break;\r\n case 71:\r\n options = [true, true, false, false];\r\n break;\r\n case 72:\r\n options = [true, true, false, false];\r\n break;\r\n case 73:\r\n options = [false, false, false, false];\r\n break;\r\n case 74:\r\n options = [true, false, false, true];\r\n break;\r\n case 75:\r\n options = [true, false, false, true];\r\n break;\r\n default:\r\n throw new Error(`Unexpected chunk type ID: ${chunk_type_id}.`);\r\n }\r\n\r\n const [parse_texture_coords, parse_color, parse_normal, parse_texture_coords_hires] = options;\r\n\r\n const strips: NjTriangleStrip[] = [];\r\n\r\n for (let i = 0; i < strip_count; ++i) {\r\n const winding_flag_and_index_count = cursor.i16();\r\n const clockwise_winding = winding_flag_and_index_count < 1;\r\n const index_count = Math.abs(winding_flag_and_index_count);\r\n\r\n const vertices: NjMeshVertex[] = [];\r\n\r\n for (let j = 0; j < index_count; ++j) {\r\n const vertex: NjMeshVertex = {\r\n index: cursor.u16(),\r\n };\r\n vertices.push(vertex);\r\n\r\n if (parse_texture_coords) {\r\n cursor.seek(4);\r\n }\r\n\r\n if (parse_color) {\r\n cursor.seek(4);\r\n }\r\n\r\n if (parse_normal) {\r\n vertex.normal = new Vec3(cursor.u16(), cursor.u16(), cursor.u16());\r\n }\r\n\r\n if (parse_texture_coords_hires) {\r\n cursor.seek(8);\r\n }\r\n\r\n if (j >= 2) {\r\n cursor.seek(2 * user_flags_size);\r\n }\r\n }\r\n\r\n strips.push({\r\n ...render_flags,\r\n clockwise_winding,\r\n vertices,\r\n });\r\n }\r\n\r\n return strips;\r\n}\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\nimport { Vec3 } from \"../../Vec3\";\r\nimport { NinjaVertex } from \"../ninja\";\r\n\r\n// TODO:\r\n// - textures\r\n// - colors\r\n// - bump maps\r\n// - animation\r\n\r\nexport type XjModel = {\r\n type: \"xj\";\r\n vertices: NinjaVertex[];\r\n meshes: XjTriangleStrip[];\r\n};\r\n\r\nexport type XjTriangleStrip = {\r\n indices: number[];\r\n};\r\n\r\nexport function parse_xj_model(cursor: BufferCursor): XjModel {\r\n cursor.seek(4); // Flags according to QEdit, seemingly always 0.\r\n const vertex_info_list_offset = cursor.u32();\r\n cursor.seek(4); // Seems to be the vertexInfoCount, always 1.\r\n const triangle_strip_list_a_offset = cursor.u32();\r\n const triangle_strip_a_count = cursor.u32();\r\n const triangle_strip_list_b_offset = cursor.u32();\r\n const triangle_strip_b_count = cursor.u32();\r\n cursor.seek(16); // Bounding sphere position and radius in floats.\r\n\r\n const model: XjModel = {\r\n type: \"xj\",\r\n vertices: [],\r\n meshes: [],\r\n };\r\n\r\n if (vertex_info_list_offset) {\r\n cursor.seek_start(vertex_info_list_offset);\r\n cursor.seek(4); // Possibly the vertex type.\r\n const vertexList_offset = cursor.u32();\r\n const vertex_size = cursor.u32();\r\n const vertex_count = cursor.u32();\r\n\r\n for (let i = 0; i < vertex_count; ++i) {\r\n cursor.seek_start(vertexList_offset + i * vertex_size);\r\n const position = new Vec3(cursor.f32(), cursor.f32(), cursor.f32());\r\n let normal: Vec3 | undefined;\r\n\r\n if (vertex_size === 28 || vertex_size === 32 || vertex_size === 36) {\r\n normal = new Vec3(cursor.f32(), cursor.f32(), cursor.f32());\r\n }\r\n\r\n model.vertices.push({\r\n position,\r\n normal,\r\n bone_weight: 1.0,\r\n bone_weight_status: 0,\r\n calc_continue: true,\r\n });\r\n }\r\n }\r\n\r\n if (triangle_strip_list_a_offset) {\r\n model.meshes.push(\r\n ...parse_triangle_strip_list(\r\n cursor,\r\n triangle_strip_list_a_offset,\r\n triangle_strip_a_count\r\n )\r\n );\r\n }\r\n\r\n if (triangle_strip_list_b_offset) {\r\n model.meshes.push(\r\n ...parse_triangle_strip_list(\r\n cursor,\r\n triangle_strip_list_b_offset,\r\n triangle_strip_b_count\r\n )\r\n );\r\n }\r\n\r\n return model;\r\n}\r\n\r\nfunction parse_triangle_strip_list(\r\n cursor: BufferCursor,\r\n triangle_strip_list_offset: number,\r\n triangle_strip_count: number\r\n): XjTriangleStrip[] {\r\n const strips: XjTriangleStrip[] = [];\r\n\r\n for (let i = 0; i < triangle_strip_count; ++i) {\r\n cursor.seek_start(triangle_strip_list_offset + i * 20);\r\n cursor.seek(8); // Skip material information.\r\n const index_list_offset = cursor.u32();\r\n const index_count = cursor.u32();\r\n // Ignoring 4 bytes.\r\n\r\n cursor.seek_start(index_list_offset);\r\n const indices = cursor.u16_array(index_count);\r\n\r\n strips.push({ indices });\r\n }\r\n\r\n return strips;\r\n}\r\n","import { Vec3 } from \"../../Vec3\";\r\nimport { BufferCursor } from \"../../BufferCursor\";\r\nimport { NjModel, parse_nj_model } from \"./nj\";\r\nimport { parse_xj_model, XjModel } 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\nconst ANGLE_TO_RAD = (2 * Math.PI) / 65536;\r\n\r\nexport type NinjaVertex = {\r\n position: Vec3;\r\n normal?: Vec3;\r\n bone_weight: number;\r\n bone_weight_status: number;\r\n calc_continue: boolean;\r\n};\r\n\r\nexport type NinjaModel = NjModel | XjModel;\r\n\r\nexport class NinjaObject<M extends NinjaModel> {\r\n evaluation_flags: NinjaEvaluationFlags;\r\n model: M | undefined;\r\n position: Vec3;\r\n rotation: Vec3; // Euler angles in radians.\r\n scale: Vec3;\r\n children: NinjaObject<M>[];\r\n\r\n private bone_cache = new Map<number, NinjaObject<M> | null>();\r\n private _bone_count = -1;\r\n\r\n constructor(\r\n evaluation_flags: NinjaEvaluationFlags,\r\n model: M | undefined,\r\n position: Vec3,\r\n rotation: Vec3, // Euler angles in radians.\r\n scale: Vec3,\r\n children: NinjaObject<M>[]\r\n ) {\r\n this.evaluation_flags = evaluation_flags;\r\n this.model = model;\r\n this.position = position;\r\n this.rotation = rotation;\r\n this.scale = scale;\r\n this.children = children;\r\n }\r\n\r\n bone_count(): number {\r\n if (this._bone_count === -1) {\r\n const id_ref: [number] = [0];\r\n this.get_bone_internal(this, Infinity, id_ref);\r\n this._bone_count = id_ref[0];\r\n }\r\n\r\n return this._bone_count;\r\n }\r\n\r\n get_bone(bone_id: number): NinjaObject<M> | undefined {\r\n let bone = this.bone_cache.get(bone_id);\r\n\r\n // Strict check because null means there's no bone with this id.\r\n if (bone === undefined) {\r\n bone = this.get_bone_internal(this, bone_id, [0]);\r\n this.bone_cache.set(bone_id, bone || null);\r\n }\r\n\r\n return bone || undefined;\r\n }\r\n\r\n private get_bone_internal(\r\n object: NinjaObject<M>,\r\n bone_id: number,\r\n id_ref: [number]\r\n ): NinjaObject<M> | undefined {\r\n if (!object.evaluation_flags.skip) {\r\n const id = id_ref[0]++;\r\n this.bone_cache.set(id, object);\r\n\r\n if (id === bone_id) {\r\n return object;\r\n }\r\n }\r\n\r\n if (!object.evaluation_flags.break_child_trace) {\r\n for (const child of object.children) {\r\n const bone = this.get_bone_internal(child, bone_id, id_ref);\r\n if (bone) return bone;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport type NinjaEvaluationFlags = {\r\n no_translate: boolean;\r\n no_rotate: boolean;\r\n no_scale: boolean;\r\n hidden: boolean;\r\n break_child_trace: boolean;\r\n zxy_rotation_order: boolean;\r\n skip: boolean;\r\n shape_skip: boolean;\r\n};\r\n\r\nexport function parse_nj(cursor: BufferCursor): NinjaObject<NjModel>[] {\r\n return parse_ninja(cursor, parse_nj_model, []);\r\n}\r\n\r\nexport function parse_xj(cursor: BufferCursor): NinjaObject<XjModel>[] {\r\n return parse_ninja(cursor, parse_xj_model, undefined);\r\n}\r\n\r\nfunction parse_ninja<M extends NinjaModel>(\r\n cursor: BufferCursor,\r\n parse_model: (cursor: BufferCursor, context: any) => M,\r\n context: any\r\n): NinjaObject<M>[] {\r\n while (cursor.bytes_left) {\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 iff_type_id = cursor.string_ascii(4, false, false);\r\n const iff_chunk_size = cursor.u32();\r\n\r\n if (iff_type_id === \"NJCM\") {\r\n return parse_sibling_objects(cursor.take(iff_chunk_size), parse_model, context);\r\n } else {\r\n if (iff_chunk_size > cursor.bytes_left) {\r\n break;\r\n }\r\n\r\n cursor.seek(iff_chunk_size);\r\n }\r\n }\r\n\r\n return [];\r\n}\r\n\r\n// TODO: cache model and object offsets so we don't reparse the same data.\r\nfunction parse_sibling_objects<M extends NinjaModel>(\r\n cursor: BufferCursor,\r\n parse_model: (cursor: BufferCursor, context: any) => M,\r\n context: any\r\n): NinjaObject<M>[] {\r\n const eval_flags = cursor.u32();\r\n const no_translate = (eval_flags & 0b1) !== 0;\r\n const no_rotate = (eval_flags & 0b10) !== 0;\r\n const no_scale = (eval_flags & 0b100) !== 0;\r\n const hidden = (eval_flags & 0b1000) !== 0;\r\n const break_child_trace = (eval_flags & 0b10000) !== 0;\r\n const zxy_rotation_order = (eval_flags & 0b100000) !== 0;\r\n const skip = (eval_flags & 0b1000000) !== 0;\r\n const shape_skip = (eval_flags & 0b10000000) !== 0;\r\n\r\n const model_offset = cursor.u32();\r\n const pos_x = cursor.f32();\r\n const pos_y = cursor.f32();\r\n const pos_z = cursor.f32();\r\n const rotation_x = cursor.i32() * ANGLE_TO_RAD;\r\n const rotation_y = cursor.i32() * ANGLE_TO_RAD;\r\n const rotation_z = cursor.i32() * ANGLE_TO_RAD;\r\n const scale_x = cursor.f32();\r\n const scale_y = cursor.f32();\r\n const scale_z = cursor.f32();\r\n const child_offset = cursor.u32();\r\n const sibling_offset = cursor.u32();\r\n\r\n let model: M | undefined;\r\n let children: NinjaObject<M>[];\r\n let siblings: NinjaObject<M>[];\r\n\r\n if (model_offset) {\r\n cursor.seek_start(model_offset);\r\n model = parse_model(cursor, context);\r\n }\r\n\r\n if (child_offset) {\r\n cursor.seek_start(child_offset);\r\n children = parse_sibling_objects(cursor, parse_model, context);\r\n } else {\r\n children = [];\r\n }\r\n\r\n if (sibling_offset) {\r\n cursor.seek_start(sibling_offset);\r\n siblings = parse_sibling_objects(cursor, parse_model, context);\r\n } else {\r\n siblings = [];\r\n }\r\n\r\n const object = new NinjaObject<M>(\r\n {\r\n no_translate,\r\n no_rotate,\r\n no_scale,\r\n hidden,\r\n break_child_trace,\r\n zxy_rotation_order,\r\n skip,\r\n shape_skip,\r\n },\r\n model,\r\n new Vec3(pos_x, pos_y, pos_z),\r\n new Vec3(rotation_x, rotation_y, rotation_z),\r\n new Vec3(scale_x, scale_y, scale_z),\r\n children\r\n );\r\n\r\n return [object, ...siblings];\r\n}\r\n","import { BufferGeometry, CylinderBufferGeometry } from \"three\";\r\nimport { NpcType, ObjectType } from \"../domain\";\r\nimport { BufferCursor } from \"../data_formats/BufferCursor\";\r\nimport { get_npc_data, get_object_data } from \"./binary_assets\";\r\nimport { ninja_object_to_buffer_geometry } from \"../rendering/models\";\r\nimport { parse_nj, parse_xj } from \"../data_formats/parsing/ninja\";\r\n\r\nconst DEFAULT_ENTITY = new CylinderBufferGeometry(3, 3, 20);\r\nDEFAULT_ENTITY.translate(0, 10, 0);\r\n\r\nconst DEFAULT_ENTITY_PROMISE: Promise<BufferGeometry> = new Promise(resolve =>\r\n resolve(DEFAULT_ENTITY)\r\n);\r\n\r\nconst npc_cache: Map<NpcType, Promise<BufferGeometry>> = new Map();\r\nnpc_cache.set(NpcType.Unknown, DEFAULT_ENTITY_PROMISE);\r\n\r\nconst object_cache: Map<ObjectType, Promise<BufferGeometry>> = new Map();\r\nobject_cache.set(ObjectType.Unknown, DEFAULT_ENTITY_PROMISE);\r\n\r\nclass EntityStore {\r\n async get_npc_geometry(npc_type: NpcType): Promise<BufferGeometry> {\r\n let mesh = npc_cache.get(npc_type);\r\n\r\n if (mesh) {\r\n return mesh;\r\n } else {\r\n mesh = get_npc_data(npc_type).then(({ url, data }) => {\r\n const cursor = new BufferCursor(data, true);\r\n const nj_objects = url.endsWith(\".nj\") ? parse_nj(cursor) : parse_xj(cursor);\r\n\r\n if (nj_objects.length) {\r\n return ninja_object_to_buffer_geometry(nj_objects[0]);\r\n } else {\r\n throw new Error(`Could not parse ${url}.`);\r\n }\r\n });\r\n\r\n npc_cache.set(npc_type, mesh);\r\n return mesh;\r\n }\r\n }\r\n\r\n async get_object_geometry(object_type: ObjectType): Promise<BufferGeometry> {\r\n let geometry = object_cache.get(object_type);\r\n\r\n if (geometry) {\r\n return geometry;\r\n } else {\r\n geometry = get_object_data(object_type).then(({ url, data }) => {\r\n const cursor = new BufferCursor(data, true);\r\n const nj_objects = url.endsWith(\".nj\") ? parse_nj(cursor) : parse_xj(cursor);\r\n\r\n if (nj_objects.length) {\r\n return ninja_object_to_buffer_geometry(nj_objects[0]);\r\n } else {\r\n throw new Error(\"File could not be parsed into a BufferGeometry.\");\r\n }\r\n });\r\n\r\n object_cache.set(object_type, geometry);\r\n return geometry;\r\n }\r\n }\r\n}\r\n\r\nexport const entity_store = new EntityStore();\r\n","import Logger from \"js-logger\";\r\nimport { action, observable } from \"mobx\";\r\nimport { BufferCursor } from \"../data_formats/BufferCursor\";\r\nimport { parse_quest, write_quest_qst } from \"../data_formats/parsing/quest\";\r\nimport { Area, Quest, QuestEntity, Section } from \"../domain\";\r\nimport { Vec3 } from \"../data_formats/Vec3\";\r\nimport {\r\n create_npc_mesh as create_npc_object_3d,\r\n create_object_mesh as create_object_object_3d,\r\n} from \"../rendering/entities\";\r\nimport { area_store } from \"./AreaStore\";\r\nimport { entity_store } from \"./EntityStore\";\r\n\r\nconst logger = Logger.get(\"stores/QuestEditorStore\");\r\n\r\nclass QuestEditorStore {\r\n @observable current_quest?: Quest;\r\n @observable current_area?: Area;\r\n @observable selected_entity?: QuestEntity;\r\n\r\n set_quest = action(\"set_quest\", (quest?: Quest) => {\r\n this.reset_quest_state();\r\n this.current_quest = quest;\r\n\r\n if (quest && quest.area_variants.length) {\r\n this.current_area = quest.area_variants[0].area;\r\n }\r\n });\r\n\r\n private reset_quest_state(): void {\r\n this.current_quest = undefined;\r\n this.current_area = undefined;\r\n this.selected_entity = undefined;\r\n }\r\n\r\n set_selected_entity = (entity?: QuestEntity) => {\r\n this.selected_entity = entity;\r\n };\r\n\r\n set_current_area_id = action(\"set_current_area_id\", (area_id?: number) => {\r\n this.selected_entity = undefined;\r\n\r\n if (area_id == null) {\r\n this.current_area = undefined;\r\n } else if (this.current_quest) {\r\n const area_variant = this.current_quest.area_variants.find(\r\n variant => variant.area.id === area_id\r\n );\r\n this.current_area = area_variant && area_variant.area;\r\n }\r\n });\r\n\r\n load_file = (file: File) => {\r\n const reader = new FileReader();\r\n reader.addEventListener(\"loadend\", () => {\r\n this.loadend(file, reader);\r\n });\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 const quest = parse_quest(new BufferCursor(reader.result, true));\r\n this.set_quest(quest);\r\n\r\n if (quest) {\r\n // Load section data.\r\n for (const variant of quest.area_variants) {\r\n const sections = await area_store.get_area_sections(\r\n quest.episode,\r\n variant.area.id,\r\n variant.id\r\n );\r\n variant.sections = sections;\r\n\r\n // Generate object geometry.\r\n for (const object of quest.objects.filter(o => o.area_id === variant.area.id)) {\r\n try {\r\n const object_geom = await entity_store.get_object_geometry(object.type);\r\n this.set_section_on_visible_quest_entity(object, sections);\r\n object.object_3d = create_object_object_3d(object, object_geom);\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.area_id === variant.area.id)) {\r\n try {\r\n const npc_geom = await entity_store.get_npc_geometry(npc.type);\r\n this.set_section_on_visible_quest_entity(npc, sections);\r\n npc.object_3d = create_npc_object_3d(npc, npc_geom);\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 private set_section_on_visible_quest_entity = async (\r\n entity: QuestEntity,\r\n sections: Section[]\r\n ) => {\r\n let { x, y, z } = entity.position;\r\n\r\n const section = sections.find(s => s.id === entity.section_id);\r\n entity.section = section;\r\n\r\n if (section) {\r\n const { x: sec_x, y: sec_y, z: sec_z } = section.position;\r\n const rot_x = section.cos_y_axis_rotation * x + section.sin_y_axis_rotation * z;\r\n const rot_z = -section.sin_y_axis_rotation * x + section.cos_y_axis_rotation * z;\r\n x = rot_x + sec_x;\r\n y += sec_y;\r\n z = rot_z + sec_z;\r\n } else {\r\n logger.warn(`Section ${entity.section_id} not found.`);\r\n }\r\n\r\n entity.position = new Vec3(x, y, z);\r\n };\r\n\r\n save_current_quest_to_file = (file_name: string) => {\r\n if (this.current_quest) {\r\n const cursor = write_quest_qst(this.current_quest, file_name);\r\n\r\n if (!file_name.endsWith(\".qst\")) {\r\n file_name += \".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 = file_name;\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 quest_editor_store = new QuestEditorStore();\r\n","import { InputNumber } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { ReactNode, Component } from \"react\";\r\nimport { QuestNpc, QuestObject, QuestEntity } from \"../../domain\";\r\nimport \"./EntityInfoComponent.css\";\r\n\r\nexport type Props = {\r\n entity?: QuestEntity;\r\n};\r\n\r\n@observer\r\nexport class EntityInfoComponent extends Component<Props> {\r\n render(): ReactNode {\r\n const entity = this.props.entity;\r\n\r\n if (entity) {\r\n const section_id = entity.section ? entity.section.id : entity.section_id;\r\n let name = null;\r\n\r\n if (entity instanceof QuestObject) {\r\n name = (\r\n <tr>\r\n <td>Object: </td>\r\n <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>\r\n <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>\r\n <td>{section_id}</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\r\n entity={entity}\r\n position_type=\"position\"\r\n coord=\"x\"\r\n />\r\n <CoordRow\r\n entity={entity}\r\n position_type=\"position\"\r\n coord=\"y\"\r\n />\r\n <CoordRow\r\n entity={entity}\r\n position_type=\"position\"\r\n coord=\"z\"\r\n />\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\r\n entity={entity}\r\n position_type=\"section_position\"\r\n coord=\"x\"\r\n />\r\n <CoordRow\r\n entity={entity}\r\n position_type=\"section_position\"\r\n coord=\"y\"\r\n />\r\n <CoordRow\r\n entity={entity}\r\n position_type=\"section_position\"\r\n coord=\"z\"\r\n />\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 Component<{\r\n entity: QuestEntity;\r\n position_type: \"position\" | \"section_position\";\r\n coord: \"x\" | \"y\" | \"z\";\r\n}> {\r\n render(): ReactNode {\r\n const entity = this.props.entity;\r\n const value = entity[this.props.position_type][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 pos_type = this.props.position_type;\r\n const pos = entity[pos_type].clone();\r\n pos[this.props.coord] = value;\r\n entity[pos_type] = 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 }): JSX.Element {\r\n if (quest) {\r\n const episode = quest.episode === 4 ? \"IV\" : quest.episode === 2 ? \"II\" : \"I\";\r\n const npc_counts = new Map<NpcType, number>();\r\n\r\n for (const npc of quest.npcs) {\r\n const val = npc_counts.get(npc.type) || 0;\r\n npc_counts.set(npc.type, val + 1);\r\n }\r\n\r\n const extra_canadines = (npc_counts.get(NpcType.Canane) || 0) * 8;\r\n\r\n // Sort by type ID.\r\n const sorted_npc_counts = [...npc_counts].sort((a, b) => a[0].id - b[0].id);\r\n\r\n const npc_count_rows = sorted_npc_counts.map(([npc_type, count]) => {\r\n const extra = npc_type === NpcType.Canadine ? extra_canadines : 0;\r\n return (\r\n <tr key={npc_type.id}>\r\n <td>{npc_type.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>\r\n <td>{quest.name}</td>\r\n </tr>\r\n <tr>\r\n <th>Episode:</th>\r\n <td>{episode}</td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <pre>{quest.short_description}</pre>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td colSpan={2}>\r\n <pre>{quest.long_description}</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>\r\n <th colSpan={2}>NPC Counts</th>\r\n </tr>\r\n </thead>\r\n <tbody>{npc_count_rows}</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 { autorun, IReactionDisposer, when } from \"mobx\";\r\nimport {\r\n Intersection,\r\n Mesh,\r\n MeshLambertMaterial,\r\n Object3D,\r\n Plane,\r\n Raycaster,\r\n Vector2,\r\n Vector3,\r\n} from \"three\";\r\nimport { Vec3 } from \"../data_formats/Vec3\";\r\nimport { Area, Quest, QuestEntity, QuestNpc, Section } from \"../domain\";\r\nimport { area_store } from \"../stores/AreaStore\";\r\nimport { quest_editor_store } from \"../stores/QuestEditorStore\";\r\nimport {\r\n NPC_COLOR,\r\n NPC_HOVER_COLOR,\r\n NPC_SELECTED_COLOR,\r\n OBJECT_COLOR,\r\n OBJECT_HOVER_COLOR,\r\n OBJECT_SELECTED_COLOR,\r\n} from \"./entities\";\r\nimport { Renderer } from \"./Renderer\";\r\n\r\nlet renderer: QuestRenderer | undefined;\r\n\r\nexport function get_quest_renderer(): QuestRenderer {\r\n if (!renderer) renderer = new QuestRenderer();\r\n return renderer;\r\n}\r\n\r\ntype PickEntityResult = {\r\n object: Mesh;\r\n entity: QuestEntity;\r\n grab_offset: Vector3;\r\n drag_adjust: Vector3;\r\n drag_y: number;\r\n manipulating: boolean;\r\n};\r\n\r\ntype EntityUserData = {\r\n entity: QuestEntity;\r\n};\r\n\r\nexport class QuestRenderer extends Renderer {\r\n private raycaster = new Raycaster();\r\n\r\n private quest?: Quest;\r\n private area?: Area;\r\n private entity_reaction_disposers: IReactionDisposer[] = [];\r\n\r\n private collision_geometry = new Object3D();\r\n private render_geometry = new Object3D();\r\n private obj_geometry = new Object3D();\r\n private npc_geometry = new Object3D();\r\n\r\n private hovered_data?: PickEntityResult;\r\n private selected_data?: PickEntityResult;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.dom_element.addEventListener(\"mousedown\", this.on_mouse_down);\r\n this.dom_element.addEventListener(\"mouseup\", this.on_mouse_up);\r\n this.dom_element.addEventListener(\"mousemove\", this.on_mouse_move);\r\n\r\n this.scene.add(this.obj_geometry);\r\n this.scene.add(this.npc_geometry);\r\n }\r\n\r\n set_quest_and_area(quest?: Quest, area?: Area): void {\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 update = true;\r\n }\r\n\r\n if (update) {\r\n this.update_geometry();\r\n }\r\n }\r\n\r\n private async update_geometry(): Promise<void> {\r\n this.dispose_entity_reactions();\r\n\r\n this.scene.remove(this.obj_geometry);\r\n this.scene.remove(this.npc_geometry);\r\n this.obj_geometry = new Object3D();\r\n this.npc_geometry = new Object3D();\r\n this.scene.add(this.obj_geometry);\r\n this.scene.add(this.npc_geometry);\r\n\r\n this.scene.remove(this.collision_geometry);\r\n\r\n if (this.quest && this.area) {\r\n // Add necessary entity geometry when it arrives.\r\n for (const obj of this.quest.objects) {\r\n this.update_entity_geometry(obj, this.obj_geometry);\r\n }\r\n\r\n for (const npc of this.quest.npcs) {\r\n this.update_entity_geometry(npc, this.npc_geometry);\r\n }\r\n\r\n // Load necessary area geometry.\r\n const episode = this.quest.episode;\r\n const area_id = this.area.id;\r\n const variant = this.quest.area_variants.find(v => v.area.id === area_id);\r\n const variant_id = (variant && variant.id) || 0;\r\n\r\n const collision_geometry = await area_store.get_area_collision_geometry(\r\n episode,\r\n area_id,\r\n variant_id\r\n );\r\n\r\n this.scene.remove(this.collision_geometry);\r\n\r\n this.reset_camera(new Vector3(0, 800, 700), new Vector3(0, 0, 0));\r\n\r\n this.collision_geometry = collision_geometry;\r\n this.scene.add(collision_geometry);\r\n\r\n const render_geometry = await area_store.get_area_render_geometry(\r\n episode,\r\n area_id,\r\n variant_id\r\n );\r\n\r\n this.render_geometry = render_geometry;\r\n }\r\n }\r\n\r\n private update_entity_geometry(entity: QuestEntity, entity_geometry: Object3D): void {\r\n if (this.area && entity.area_id === this.area.id) {\r\n this.entity_reaction_disposers.push(\r\n when(\r\n () => entity.object_3d != undefined,\r\n () => {\r\n const object_3d = entity.object_3d!;\r\n entity_geometry.add(object_3d);\r\n\r\n this.entity_reaction_disposers.push(\r\n autorun(() => {\r\n const { x, y, z } = entity.position;\r\n object_3d.position.set(x, y, z);\r\n const rot = entity.rotation;\r\n object_3d.rotation.set(rot.x, rot.y, rot.z);\r\n this.schedule_render();\r\n })\r\n );\r\n\r\n this.schedule_render();\r\n }\r\n )\r\n );\r\n }\r\n }\r\n\r\n private dispose_entity_reactions(): void {\r\n for (const disposer of this.entity_reaction_disposers) {\r\n disposer();\r\n }\r\n }\r\n\r\n private on_mouse_down = (e: MouseEvent) => {\r\n const old_selected_data = this.selected_data;\r\n const data = this.pick_entity(this.pointer_pos_to_device_coords(e));\r\n\r\n // Did we pick a different object than the previously hovered over 3D object?\r\n if (this.hovered_data && (!data || data.object !== this.hovered_data.object)) {\r\n (this.hovered_data.object.material as MeshLambertMaterial).color.set(\r\n this.get_color(this.hovered_data.entity, \"normal\")\r\n );\r\n }\r\n\r\n // Did we pick a different object than the previously selected 3D object?\r\n if (this.selected_data && (!data || data.object !== this.selected_data.object)) {\r\n (this.selected_data.object.material as MeshLambertMaterial).color.set(\r\n this.get_color(this.selected_data.entity, \"normal\")\r\n );\r\n this.selected_data.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(\r\n this.get_color(data.entity, \"selected\")\r\n );\r\n data.manipulating = true;\r\n this.hovered_data = data;\r\n this.selected_data = data;\r\n this.controls.enabled = false;\r\n } else {\r\n // User clicked on terrain or outside of area.\r\n this.hovered_data = undefined;\r\n this.selected_data = undefined;\r\n this.controls.enabled = true;\r\n }\r\n\r\n const selection_changed =\r\n old_selected_data && data\r\n ? old_selected_data.object !== data.object\r\n : old_selected_data !== data;\r\n\r\n if (selection_changed) {\r\n quest_editor_store.set_selected_entity(data && data.entity);\r\n this.schedule_render();\r\n }\r\n };\r\n\r\n private on_mouse_up = () => {\r\n if (this.selected_data) {\r\n this.selected_data.manipulating = false;\r\n this.controls.enabled = true;\r\n this.schedule_render();\r\n }\r\n };\r\n\r\n private on_mouse_move = (e: MouseEvent) => {\r\n const pointer_pos = this.pointer_pos_to_device_coords(e);\r\n\r\n if (this.selected_data && this.selected_data.manipulating) {\r\n if (e.buttons === 1) {\r\n // User is dragging a selected entity.\r\n const data = this.selected_data;\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(pointer_pos, this.camera);\r\n const ray = this.raycaster.ray;\r\n const negative_world_dir = this.camera\r\n .getWorldDirection(new Vector3())\r\n .negate();\r\n const plane = new Plane().setFromNormalAndCoplanarPoint(\r\n new Vector3(negative_world_dir.x, 0, negative_world_dir.z).normalize(),\r\n data.object.position.sub(data.grab_offset)\r\n );\r\n const intersection_point = new Vector3();\r\n\r\n if (ray.intersectPlane(plane, intersection_point)) {\r\n const y = intersection_point.y + data.grab_offset.y;\r\n const y_delta = y - data.entity.position.y;\r\n data.drag_y += y_delta;\r\n data.drag_adjust.y -= y_delta;\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.pick_terrain(pointer_pos, 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.drag_y,\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(pointer_pos, 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.grab_offset.y\r\n );\r\n const intersection_point = new Vector3();\r\n\r\n if (ray.intersectPlane(plane, intersection_point)) {\r\n data.entity.position = new Vec3(\r\n intersection_point.x + data.grab_offset.x,\r\n data.entity.position.y,\r\n intersection_point.z + data.grab_offset.z\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.schedule_render();\r\n } else {\r\n // User is hovering.\r\n const old_data = this.hovered_data;\r\n const data = this.pick_entity(pointer_pos);\r\n\r\n if (old_data && (!data || data.object !== old_data.object)) {\r\n if (!this.selected_data || old_data.object !== this.selected_data.object) {\r\n (old_data.object.material as MeshLambertMaterial).color.set(\r\n this.get_color(old_data.entity, \"normal\")\r\n );\r\n }\r\n\r\n this.hovered_data = undefined;\r\n this.schedule_render();\r\n }\r\n\r\n if (data && (!old_data || data.object !== old_data.object)) {\r\n if (!this.selected_data || data.object !== this.selected_data.object) {\r\n (data.object.material as MeshLambertMaterial).color.set(\r\n this.get_color(data.entity, \"hover\")\r\n );\r\n }\r\n\r\n this.hovered_data = data;\r\n this.schedule_render();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @param pointer_pos - pointer coordinates in normalized device space\r\n */\r\n private pick_entity(pointer_pos: Vector2): PickEntityResult | undefined {\r\n // Find the nearest object and NPC under the pointer.\r\n this.raycaster.setFromCamera(pointer_pos, this.camera);\r\n const [nearest_object] = this.raycaster.intersectObjects(this.obj_geometry.children);\r\n const [nearest_npc] = this.raycaster.intersectObjects(this.npc_geometry.children);\r\n\r\n if (!nearest_object && !nearest_npc) {\r\n return;\r\n }\r\n\r\n const object_dist = nearest_object ? nearest_object.distance : Infinity;\r\n const npc_dist = nearest_npc ? nearest_npc.distance : Infinity;\r\n const intersection = object_dist < npc_dist ? nearest_object : nearest_npc;\r\n\r\n const entity = (intersection.object.userData as EntityUserData).entity;\r\n // Vector that points from the grabbing point to the model's origin.\r\n const grab_offset = intersection.object.position.clone().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 drag_adjust = grab_offset.clone();\r\n // Distance to terrain.\r\n let drag_y = 0;\r\n\r\n // Find vertical distance to terrain.\r\n this.raycaster.set(intersection.object.position, new Vector3(0, -1, 0));\r\n const [terrain] = this.raycaster.intersectObjects(this.collision_geometry.children, true);\r\n\r\n if (terrain) {\r\n drag_adjust.sub(new Vector3(0, terrain.distance, 0));\r\n drag_y += terrain.distance;\r\n }\r\n\r\n return {\r\n object: intersection.object as Mesh,\r\n entity,\r\n grab_offset,\r\n drag_adjust,\r\n drag_y,\r\n manipulating: false,\r\n };\r\n }\r\n\r\n /**\r\n * @param pointer_pos - pointer coordinates in normalized device space\r\n */\r\n private pick_terrain(\r\n pointer_pos: Vector2,\r\n data: PickEntityResult\r\n ): {\r\n intersection?: Intersection;\r\n section?: Section;\r\n } {\r\n this.raycaster.setFromCamera(pointer_pos, this.camera);\r\n this.raycaster.ray.origin.add(data.drag_adjust);\r\n const terrains = this.raycaster.intersectObjects(this.collision_geometry.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(terrain.point.clone().setY(1000), new Vector3(0, -1, 0));\r\n const render_terrains = this.raycaster\r\n .intersectObjects(this.render_geometry.children, true)\r\n .filter(rt => rt.object.userData.section.id >= 0);\r\n\r\n return {\r\n intersection: terrain,\r\n section: render_terrains[0] && render_terrains[0].object.userData.section,\r\n };\r\n }\r\n }\r\n\r\n return {};\r\n }\r\n\r\n private get_color(entity: QuestEntity, type: \"normal\" | \"hover\" | \"selected\"): number {\r\n const is_npc = entity instanceof QuestNpc;\r\n\r\n switch (type) {\r\n default:\r\n case \"normal\":\r\n return is_npc ? NPC_COLOR : OBJECT_COLOR;\r\n case \"hover\":\r\n return is_npc ? NPC_HOVER_COLOR : OBJECT_HOVER_COLOR;\r\n case \"selected\":\r\n return is_npc ? NPC_SELECTED_COLOR : OBJECT_SELECTED_COLOR;\r\n }\r\n }\r\n}\r\n","import * as THREE from \"three\";\r\nimport {\r\n Color,\r\n HemisphereLight,\r\n MOUSE,\r\n PerspectiveCamera,\r\n Scene,\r\n Vector3,\r\n WebGLRenderer,\r\n Vector2,\r\n Group,\r\n} from \"three\";\r\nimport OrbitControlsCreator from \"three-orbit-controls\";\r\n\r\nconst OrbitControls = OrbitControlsCreator(THREE);\r\n\r\nexport class Renderer {\r\n protected camera: PerspectiveCamera;\r\n protected controls: any;\r\n protected scene = new Scene();\r\n protected light_holder = new Group();\r\n\r\n private renderer = new WebGLRenderer({ antialias: true });\r\n private render_scheduled = false;\r\n private light = new HemisphereLight(0xffffff, 0x505050, 1);\r\n\r\n constructor() {\r\n this.renderer.setPixelRatio(window.devicePixelRatio);\r\n\r\n this.camera = new PerspectiveCamera(75, 1, 0.1, 5000);\r\n\r\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\r\n this.controls.mouseButtons.ORBIT = MOUSE.RIGHT;\r\n this.controls.mouseButtons.PAN = MOUSE.LEFT;\r\n this.controls.addEventListener(\"change\", this.schedule_render);\r\n\r\n this.scene.background = new Color(0x151c21);\r\n\r\n this.light_holder.add(this.light);\r\n this.scene.add(this.light_holder);\r\n }\r\n\r\n get dom_element(): HTMLElement {\r\n return this.renderer.domElement;\r\n }\r\n\r\n set_size(width: number, height: number): void {\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 protected schedule_render = () => {\r\n if (!this.render_scheduled) {\r\n this.render_scheduled = true;\r\n requestAnimationFrame(this.call_render);\r\n }\r\n };\r\n\r\n protected render(): void {\r\n this.renderer.render(this.scene, this.camera);\r\n }\r\n\r\n protected reset_camera(position: Vector3, look_at: Vector3): void {\r\n this.controls.reset();\r\n this.camera.position.copy(position);\r\n this.camera.lookAt(look_at);\r\n }\r\n\r\n protected pointer_pos_to_device_coords(e: MouseEvent): Vector2 {\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 private call_render = () => {\r\n this.render_scheduled = false;\r\n this.render();\r\n };\r\n}\r\n","import { BufferCursor } from \"../../BufferCursor\";\r\nimport { Vec3 } from \"../../Vec3\";\r\n\r\nconst ANGLE_TO_RAD = (2 * Math.PI) / 0xffff;\r\n\r\nexport type NjMotion = {\r\n motion_data: NjMotionData[];\r\n frame_count: number;\r\n type: number;\r\n interpolation: NjInterpolation;\r\n element_count: number;\r\n};\r\n\r\nexport enum NjInterpolation {\r\n Linear,\r\n Spline,\r\n UserFunction,\r\n}\r\n\r\nexport type NjMotionData = {\r\n tracks: NjKeyframeTrack[];\r\n};\r\n\r\nexport enum NjKeyframeTrackType {\r\n Position,\r\n Rotation,\r\n Scale,\r\n}\r\n\r\nexport type NjKeyframeTrack =\r\n | NjKeyframeTrackPosition\r\n | NjKeyframeTrackRotation\r\n | NjKeyframeTrackScale;\r\n\r\nexport type NjKeyframeTrackPosition = {\r\n type: NjKeyframeTrackType.Position;\r\n keyframes: NjKeyframeF[];\r\n};\r\n\r\nexport type NjKeyframeTrackRotation = {\r\n type: NjKeyframeTrackType.Rotation;\r\n keyframes: NjKeyframeA[];\r\n};\r\n\r\nexport type NjKeyframeTrackScale = {\r\n type: NjKeyframeTrackType.Scale;\r\n keyframes: NjKeyframeF[];\r\n};\r\n\r\nexport type NjKeyframe = NjKeyframeF | NjKeyframeA;\r\n\r\n/**\r\n * Used for parallel motion (POS), scale (SCL) and vector (VEC).\r\n */\r\nexport type NjKeyframeF = {\r\n frame: number;\r\n value: Vec3;\r\n};\r\n\r\n/**\r\n * Used for rotation (ANG).\r\n */\r\nexport type NjKeyframeA = {\r\n frame: number;\r\n value: Vec3; // Euler angles in radians.\r\n};\r\n\r\nexport function parse_njm(cursor: BufferCursor, bone_count: number): NjMotion {\r\n if (cursor.string_ascii(4, false, true) === \"NMDM\") {\r\n return parse_njm_v2(cursor, bone_count);\r\n } else {\r\n cursor.seek_start(0);\r\n return parse_njm_bb(cursor, bone_count);\r\n }\r\n}\r\n\r\n/**\r\n * Format used by PSO v2 and for the enemies in PSO:BB.\r\n */\r\nfunction parse_njm_v2(cursor: BufferCursor, bone_count: number): NjMotion {\r\n const chunk_size = cursor.u32();\r\n return parse_motion(cursor.take(chunk_size), bone_count);\r\n}\r\n\r\n/**\r\n * Format used by PSO:BB plymotiondata.rlc.\r\n */\r\nfunction parse_njm_bb(cursor: BufferCursor, bone_count: number): NjMotion {\r\n cursor.seek_end(16);\r\n const offset1 = cursor.u32();\r\n cursor.seek_start(offset1);\r\n const action_offset = cursor.u32();\r\n cursor.seek_start(action_offset);\r\n return parse_action(cursor, bone_count);\r\n}\r\n\r\nfunction parse_action(cursor: BufferCursor, bone_count: number): NjMotion {\r\n cursor.seek(4); // Object pointer placeholder.\r\n const motion_offset = cursor.u32();\r\n cursor.seek_start(motion_offset);\r\n return parse_motion(cursor, bone_count);\r\n}\r\n\r\nfunction parse_motion(cursor: BufferCursor, bone_count: number): NjMotion {\r\n // Points to an array the size of bone_count.\r\n let mdata_offset = cursor.u32();\r\n const frame_count = cursor.u32();\r\n const type = cursor.u16();\r\n const inp_fn = cursor.u16();\r\n // Linear, spline or user function.\r\n const interpolation: NjInterpolation = (inp_fn & 0b11000000) >> 6;\r\n const element_count = inp_fn & 0b1111;\r\n const motion_data_list = [];\r\n\r\n for (let i = 0; i < bone_count; i++) {\r\n cursor.seek_start(mdata_offset);\r\n mdata_offset = mdata_offset += 8 * element_count;\r\n\r\n let motion_data: NjMotionData = {\r\n tracks: [],\r\n };\r\n motion_data_list.push(motion_data);\r\n\r\n const keyframe_offsets: number[] = [];\r\n const keyframe_counts: number[] = [];\r\n\r\n for (let j = 0; j < element_count; j++) {\r\n keyframe_offsets.push(cursor.u32());\r\n }\r\n\r\n for (let j = 0; j < element_count; j++) {\r\n const count = cursor.u32();\r\n keyframe_counts.push(count);\r\n }\r\n\r\n // NJD_MTYPE_POS_0\r\n if (type & (1 << 0)) {\r\n cursor.seek_start(keyframe_offsets.shift()!);\r\n const count = keyframe_counts.shift();\r\n\r\n if (count) {\r\n motion_data.tracks.push({\r\n type: NjKeyframeTrackType.Position,\r\n keyframes: parse_motion_data_f(cursor, count),\r\n });\r\n }\r\n }\r\n\r\n // NJD_MTYPE_ANG_1\r\n if (type & (1 << 1)) {\r\n cursor.seek_start(keyframe_offsets.shift()!);\r\n const count = keyframe_counts.shift();\r\n\r\n if (count) {\r\n motion_data.tracks.push({\r\n type: NjKeyframeTrackType.Rotation,\r\n keyframes: parse_motion_data_a(cursor, count, frame_count),\r\n });\r\n }\r\n }\r\n\r\n // NJD_MTYPE_SCL_2\r\n if (type & (1 << 2)) {\r\n cursor.seek_start(keyframe_offsets.shift()!);\r\n const count = keyframe_counts.shift();\r\n\r\n if (count) {\r\n motion_data.tracks.push({\r\n type: NjKeyframeTrackType.Scale,\r\n keyframes: parse_motion_data_f(cursor, count),\r\n });\r\n }\r\n }\r\n\r\n // TODO: all NJD_MTYPE's\r\n }\r\n\r\n return {\r\n motion_data: motion_data_list,\r\n frame_count,\r\n type,\r\n interpolation,\r\n element_count,\r\n };\r\n}\r\n\r\nfunction parse_motion_data_f(cursor: BufferCursor, count: number): NjKeyframeF[] {\r\n const frames: NjKeyframeF[] = [];\r\n\r\n for (let i = 0; i < count; ++i) {\r\n frames.push({\r\n frame: cursor.u32(),\r\n value: new Vec3(cursor.f32(), cursor.f32(), cursor.f32()),\r\n });\r\n }\r\n\r\n return frames;\r\n}\r\n\r\nfunction parse_motion_data_a(\r\n cursor: BufferCursor,\r\n keyframe_count: number,\r\n frame_count: number\r\n): NjKeyframeA[] {\r\n const frames: NjKeyframeA[] = [];\r\n const start_pos = cursor.position;\r\n\r\n for (let i = 0; i < keyframe_count; ++i) {\r\n frames.push({\r\n frame: cursor.u16(),\r\n value: new Vec3(\r\n cursor.u16() * ANGLE_TO_RAD,\r\n cursor.u16() * ANGLE_TO_RAD,\r\n cursor.u16() * ANGLE_TO_RAD\r\n ),\r\n });\r\n }\r\n\r\n let prev = -1;\r\n\r\n for (const { frame } of frames) {\r\n if (frame < prev || frame >= frame_count) {\r\n cursor.seek_start(start_pos);\r\n return parse_motion_data_a_wide(cursor, keyframe_count);\r\n }\r\n\r\n prev = frame;\r\n }\r\n\r\n return frames;\r\n}\r\n\r\nfunction parse_motion_data_a_wide(cursor: BufferCursor, keyframe_count: number): NjKeyframeA[] {\r\n const frames: NjKeyframeA[] = [];\r\n\r\n for (let i = 0; i < keyframe_count; ++i) {\r\n frames.push({\r\n frame: cursor.u32(),\r\n value: new Vec3(\r\n cursor.i32() * ANGLE_TO_RAD,\r\n cursor.i32() * ANGLE_TO_RAD,\r\n cursor.i32() * ANGLE_TO_RAD\r\n ),\r\n });\r\n }\r\n\r\n return frames;\r\n}\r\n","import React, { ReactNode, Component } from \"react\";\r\nimport { Area, Quest } from \"../../domain\";\r\nimport { get_quest_renderer } from \"../../rendering/QuestRenderer\";\r\n\r\ntype Props = {\r\n quest?: Quest;\r\n area?: Area;\r\n};\r\n\r\nexport class RendererComponent extends Component<Props> {\r\n private renderer = get_quest_renderer();\r\n\r\n render(): ReactNode {\r\n return <div style={{ overflow: \"hidden\" }} ref={this.modifyDom} />;\r\n }\r\n\r\n componentDidMount(): void {\r\n window.addEventListener(\"resize\", this.onResize);\r\n }\r\n\r\n componentWillUnmount(): void {\r\n window.removeEventListener(\"resize\", this.onResize);\r\n }\r\n\r\n componentWillReceiveProps({ quest, area }: Props): void {\r\n this.renderer.set_quest_and_area(quest, area);\r\n }\r\n\r\n shouldComponentUpdate(): boolean {\r\n return false;\r\n }\r\n\r\n private modifyDom = (div: HTMLDivElement | null) => {\r\n if (div) {\r\n this.renderer.set_size(div.clientWidth, div.clientHeight);\r\n div.appendChild(this.renderer.dom_element);\r\n }\r\n };\r\n\r\n private onResize = () => {\r\n const wrapper_div = this.renderer.dom_element.parentNode as HTMLDivElement;\r\n this.renderer.set_size(wrapper_div.clientWidth, wrapper_div.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, ReactNode, Component } from \"react\";\r\nimport { quest_editor_store } 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 Component<\r\n {},\r\n {\r\n filename?: string;\r\n save_dialog_open: boolean;\r\n save_dialog_filename: string;\r\n }\r\n> {\r\n state = {\r\n save_dialog_open: false,\r\n save_dialog_filename: \"Untitled\",\r\n };\r\n\r\n render(): ReactNode {\r\n const quest = quest_editor_store.current_quest;\r\n\r\n return (\r\n <div className=\"qe-QuestEditorComponent\">\r\n <Toolbar onSaveAsClicked={this.save_as_clicked} />\r\n <div className=\"qe-QuestEditorComponent-main\">\r\n <QuestInfoComponent quest={quest} />\r\n <RendererComponent quest={quest} area={quest_editor_store.current_area} />\r\n <EntityInfoComponent entity={quest_editor_store.selected_entity} />\r\n </div>\r\n <SaveAsForm\r\n is_open={this.state.save_dialog_open}\r\n filename={this.state.save_dialog_filename}\r\n on_filename_change={this.save_dialog_filename_changed}\r\n on_ok={this.save_dialog_affirmed}\r\n on_cancel={this.save_dialog_cancelled}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private save_as_clicked = (filename?: string) => {\r\n const name = filename\r\n ? filename.endsWith(\".qst\")\r\n ? filename.slice(0, -4)\r\n : filename\r\n : this.state.save_dialog_filename;\r\n\r\n this.setState({\r\n save_dialog_open: true,\r\n save_dialog_filename: name,\r\n });\r\n };\r\n\r\n private save_dialog_filename_changed = (filename: string) => {\r\n this.setState({ save_dialog_filename: filename });\r\n };\r\n\r\n private save_dialog_affirmed = () => {\r\n quest_editor_store.save_current_quest_to_file(this.state.save_dialog_filename);\r\n this.setState({ save_dialog_open: false });\r\n };\r\n\r\n private save_dialog_cancelled = () => {\r\n this.setState({ save_dialog_open: false });\r\n };\r\n}\r\n\r\n@observer\r\nclass Toolbar extends Component<{ onSaveAsClicked: (filename?: string) => void }> {\r\n state = {\r\n filename: undefined,\r\n };\r\n\r\n render(): ReactNode {\r\n const quest = quest_editor_store.current_quest;\r\n const areas = quest && Array.from(quest.area_variants).map(a => a.area);\r\n const area = quest_editor_store.current_area;\r\n const area_id = area && area.id;\r\n\r\n return (\r\n <div className=\"qe-QuestEditorComponent-toolbar\">\r\n <Upload\r\n accept=\".qst\"\r\n showUploadList={false}\r\n onChange={this.set_filename}\r\n // Make sure it doesn't do a POST:\r\n customRequest={() => false}\r\n >\r\n <Button icon=\"file\">{this.state.filename || \"Open file...\"}</Button>\r\n </Upload>\r\n {areas && (\r\n <Select\r\n onChange={quest_editor_store.set_current_area_id}\r\n value={area_id}\r\n style={{ width: 200 }}\r\n >\r\n {areas.map(area => (\r\n <Select.Option key={area.id} value={area.id}>\r\n {area.name}\r\n </Select.Option>\r\n ))}\r\n </Select>\r\n )}\r\n {quest && (\r\n <Button icon=\"save\" onClick={this.save_as_clicked}>\r\n Save as...\r\n </Button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n private set_filename = (info: UploadChangeParam<UploadFile>) => {\r\n if (info.file.originFileObj) {\r\n this.setState({ filename: info.file.name });\r\n quest_editor_store.load_file(info.file.originFileObj);\r\n }\r\n };\r\n\r\n private save_as_clicked = () => {\r\n this.props.onSaveAsClicked(this.state.filename);\r\n };\r\n}\r\n\r\nclass SaveAsForm extends React.Component<{\r\n is_open: boolean;\r\n filename: string;\r\n on_filename_change: (name: string) => void;\r\n on_ok: () => void;\r\n on_cancel: () => void;\r\n}> {\r\n render(): ReactNode {\r\n return (\r\n <Modal\r\n title={\r\n <>\r\n <Icon type=\"save\" /> Save as...\r\n </>\r\n }\r\n visible={this.props.is_open}\r\n onOk={this.props.on_ok}\r\n onCancel={this.props.on_cancel}\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.name_changed}\r\n />\r\n </Form.Item>\r\n </Form>\r\n </Modal>\r\n );\r\n }\r\n\r\n private name_changed = (e: ChangeEvent<HTMLInputElement>) => {\r\n this.props.on_filename_change(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 { item_type_stores } from \"./ItemTypeStore\";\r\n\r\nconst NORMAL_DAMAGE_FACTOR = 0.2 * 0.9;\r\nconst HEAVY_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 1.89;\r\n// const SAC_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 3.32;\r\n// const VJAYA_DAMAGE_FACTOR = NORMAL_DAMAGE_FACTOR * 5.56;\r\n// const CRIT_FACTOR = 1.5;\r\n\r\nclass Weapon {\r\n private readonly store: DpsCalcStore;\r\n readonly item: WeaponItem;\r\n\r\n @computed get shifta_atp(): number {\r\n if (this.item.type.min_atp === this.item.type.max_atp) {\r\n return 0;\r\n } else {\r\n return this.item.type.max_atp * this.store.shifta_factor;\r\n }\r\n }\r\n\r\n @computed get min_atp(): number {\r\n return this.item.type.min_atp + this.item.grind_atp;\r\n }\r\n\r\n @computed get max_atp(): number {\r\n return this.item.type.max_atp + this.item.grind_atp + this.shifta_atp;\r\n }\r\n\r\n @computed get final_min_atp(): number {\r\n return (\r\n this.min_atp +\r\n this.store.armor_atp +\r\n this.store.shield_atp +\r\n this.store.base_atp +\r\n this.store.base_shifta_atp\r\n );\r\n }\r\n\r\n @computed get final_max_atp(): number {\r\n return (\r\n this.max_atp +\r\n this.store.armor_atp +\r\n this.store.shield_atp +\r\n this.store.base_atp +\r\n this.store.base_shifta_atp\r\n );\r\n }\r\n\r\n @computed get min_normal_damage(): number {\r\n return (this.final_min_atp - this.store.enemy_dfp) * NORMAL_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get max_normal_damage(): number {\r\n return (this.final_max_atp - this.store.enemy_dfp) * NORMAL_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get avg_normal_damage(): number {\r\n return (this.min_normal_damage + this.max_normal_damage) / 2;\r\n }\r\n\r\n @computed get min_heavy_damage(): number {\r\n return (this.final_min_atp - this.store.enemy_dfp) * HEAVY_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get max_heavy_damage(): number {\r\n return (this.final_max_atp - this.store.enemy_dfp) * HEAVY_DAMAGE_FACTOR;\r\n }\r\n\r\n @computed get avg_heavy_damage(): number {\r\n return (this.min_heavy_damage + this.max_heavy_damage) / 2;\r\n }\r\n\r\n constructor(store: DpsCalcStore, item: WeaponItem) {\r\n this.store = store;\r\n this.item = item;\r\n }\r\n}\r\n\r\nclass DpsCalcStore {\r\n @computed get weapon_types(): WeaponItemType[] {\r\n return item_type_stores.current.value.item_types.filter(\r\n it => it instanceof WeaponItemType\r\n ) as WeaponItemType[];\r\n }\r\n\r\n @computed get armor_types(): ArmorItemType[] {\r\n return item_type_stores.current.value.item_types.filter(\r\n it => it instanceof ArmorItemType\r\n ) as ArmorItemType[];\r\n }\r\n\r\n @computed get shield_types(): ShieldItemType[] {\r\n return item_type_stores.current.value.item_types.filter(\r\n it => it instanceof ShieldItemType\r\n ) as ShieldItemType[];\r\n }\r\n\r\n //\r\n // Character Details\r\n //\r\n\r\n @observable char_atp: number = 0;\r\n @observable mag_pow: number = 0;\r\n @computed get armor_atp(): number {\r\n return this.armor_type ? this.armor_type.atp : 0;\r\n }\r\n @computed get shield_atp(): number {\r\n return this.shield_type ? this.shield_type.atp : 0;\r\n }\r\n @observable shifta_lvl: number = 0;\r\n\r\n @computed get base_atp(): number {\r\n return this.char_atp + 2 * this.mag_pow;\r\n }\r\n\r\n @computed get shifta_factor(): number {\r\n return this.shifta_lvl ? 0.013 * (this.shifta_lvl - 1) + 0.1 : 0;\r\n }\r\n\r\n @computed get base_shifta_atp(): number {\r\n return this.base_atp * this.shifta_factor;\r\n }\r\n\r\n @observable readonly weapons: IObservableArray<Weapon> = observable.array();\r\n\r\n add_weapon = (type: WeaponItemType) => {\r\n this.weapons.push(new Weapon(this, new WeaponItem(type)));\r\n };\r\n\r\n @observable armor_type?: ArmorItemType;\r\n @observable shield_type?: ShieldItemType;\r\n\r\n //\r\n // Enemy Details\r\n //\r\n\r\n @observable enemy_dfp: number = 0;\r\n}\r\n\r\nexport const dps_calc_store = new DpsCalcStore();\r\n","import { InputNumber } from \"antd\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { ReactNode, Component } from \"react\";\r\nimport { WeaponItemType, ArmorItemType, ShieldItemType } from \"../../domain\";\r\nimport { dps_calc_store } from \"../../stores/DpsCalcStore\";\r\nimport { item_type_stores } from \"../../stores/ItemTypeStore\";\r\nimport { BigSelect } from \"../BigSelect\";\r\n\r\n@observer\r\nexport class DpsCalcComponent extends Component {\r\n render(): ReactNode {\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={dps_calc_store.weapon_types.map(wt => ({\r\n label: wt.name,\r\n value: wt.id,\r\n }))}\r\n onChange={this.add_weapon}\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 {dps_calc_store.weapons.map((weapon, i) => (\r\n <tr key={i}>\r\n <td>{weapon.item.type.name}</td>\r\n <td>{weapon.item.type.min_atp}</td>\r\n <td>{weapon.item.type.max_atp}</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.max_grind}\r\n step={1}\r\n onChange={value => (weapon.item.grind = value || 0)}\r\n />\r\n </td>\r\n <td>{weapon.item.grind_atp}</td>\r\n <td>{weapon.shifta_atp.toFixed(1)}</td>\r\n <td>{weapon.final_min_atp.toFixed(1)}</td>\r\n <td>{weapon.final_max_atp.toFixed(1)}</td>\r\n <td>{weapon.min_normal_damage.toFixed(1)}</td>\r\n <td>{weapon.max_normal_damage.toFixed(1)}</td>\r\n <td>{weapon.avg_normal_damage.toFixed(1)}</td>\r\n <td>{weapon.min_heavy_damage.toFixed(1)}</td>\r\n <td>{weapon.max_heavy_damage.toFixed(1)}</td>\r\n <td>{weapon.avg_heavy_damage.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={dps_calc_store.char_atp}\r\n min={0}\r\n step={1}\r\n onChange={value => (dps_calc_store.char_atp = value || 0)}\r\n />\r\n <div>MAG POW:</div>\r\n <InputNumber\r\n value={dps_calc_store.mag_pow}\r\n min={0}\r\n max={200}\r\n step={1}\r\n onChange={value => (dps_calc_store.mag_pow = value || 0)}\r\n />\r\n <div>Armor:</div>\r\n <BigSelect\r\n placeholder=\"Choose an armor\"\r\n value={dps_calc_store.armor_type && dps_calc_store.armor_type.id}\r\n options={dps_calc_store.armor_types.map(at => ({\r\n label: at.name,\r\n value: at.id,\r\n }))}\r\n onChange={this.armor_changed}\r\n />\r\n <span>Armor ATP: {dps_calc_store.armor_atp}</span>\r\n <div>Shield:</div>\r\n <BigSelect\r\n placeholder=\"Choose a shield\"\r\n value={dps_calc_store.shield_type && dps_calc_store.shield_type.id}\r\n options={dps_calc_store.shield_types.map(st => ({\r\n label: st.name,\r\n value: st.id,\r\n }))}\r\n onChange={this.shield_changed}\r\n />\r\n <span>Shield ATP: {dps_calc_store.shield_atp}</span>\r\n <div>Shifta level:</div>\r\n <InputNumber\r\n value={dps_calc_store.shifta_lvl}\r\n min={0}\r\n max={30}\r\n step={1}\r\n onChange={value => (dps_calc_store.shifta_lvl = value || 0)}\r\n />\r\n <div>Shifta factor:</div>\r\n <div>{dps_calc_store.shifta_factor.toFixed(3)}</div>\r\n <div>Base shifta ATP:</div>\r\n <div>{dps_calc_store.base_shifta_atp.toFixed(2)}</div>\r\n </section>\r\n </section>\r\n );\r\n }\r\n\r\n private add_weapon = (selected: any) => {\r\n if (selected) {\r\n let type = item_type_stores.current.value.get_by_id(selected.value)!;\r\n dps_calc_store.add_weapon(type as WeaponItemType);\r\n }\r\n };\r\n\r\n private armor_changed = (selected: any) => {\r\n if (selected) {\r\n let item_type = item_type_stores.current.value.get_by_id(selected.value)!;\r\n dps_calc_store.armor_type = item_type as ArmorItemType;\r\n } else {\r\n dps_calc_store.armor_type = undefined;\r\n }\r\n };\r\n\r\n private shield_changed = (selected: any) => {\r\n if (selected) {\r\n let item_type = item_type_stores.current.value.get_by_id(selected.value)!;\r\n dps_calc_store.shield_type = item_type as ShieldItemType;\r\n } else {\r\n dps_calc_store.shield_type = undefined;\r\n }\r\n };\r\n}\r\n","import {\r\n AnimationClip,\r\n Euler,\r\n InterpolateLinear,\r\n InterpolateSmooth,\r\n KeyframeTrack,\r\n Quaternion,\r\n QuaternionKeyframeTrack,\r\n VectorKeyframeTrack,\r\n} from \"three\";\r\nimport { NinjaModel, NinjaObject } from \"../data_formats/parsing/ninja\";\r\nimport {\r\n NjInterpolation,\r\n NjKeyframeTrackType,\r\n NjMotion,\r\n} from \"../data_formats/parsing/ninja/motion\";\r\n\r\nexport const PSO_FRAME_RATE = 30;\r\n\r\nexport function create_animation_clip(\r\n object: NinjaObject<NinjaModel>,\r\n motion: NjMotion\r\n): AnimationClip {\r\n const interpolation =\r\n motion.interpolation === NjInterpolation.Spline ? InterpolateSmooth : InterpolateLinear;\r\n\r\n const tracks: KeyframeTrack[] = [];\r\n\r\n motion.motion_data.forEach((motion_data, bone_id) => {\r\n const bone = object.get_bone(bone_id);\r\n if (!bone) return;\r\n\r\n motion_data.tracks.forEach(({ type, keyframes }) => {\r\n const times: number[] = [];\r\n const values: number[] = [];\r\n\r\n for (const keyframe of keyframes) {\r\n times.push(keyframe.frame / PSO_FRAME_RATE);\r\n\r\n if (type === NjKeyframeTrackType.Rotation) {\r\n const order = bone.evaluation_flags.zxy_rotation_order ? \"ZXY\" : \"ZYX\";\r\n const quat = new Quaternion().setFromEuler(\r\n new Euler(keyframe.value.x, keyframe.value.y, keyframe.value.z, order)\r\n );\r\n\r\n values.push(quat.x, quat.y, quat.z, quat.w);\r\n } else {\r\n values.push(keyframe.value.x, keyframe.value.y, keyframe.value.z);\r\n }\r\n }\r\n\r\n if (type === NjKeyframeTrackType.Rotation) {\r\n tracks.push(\r\n new QuaternionKeyframeTrack(\r\n `.bones[${bone_id}].quaternion`,\r\n times,\r\n values,\r\n interpolation\r\n )\r\n );\r\n } else {\r\n const name =\r\n type === NjKeyframeTrackType.Position\r\n ? `.bones[${bone_id}].position`\r\n : `.bones[${bone_id}].scale`;\r\n\r\n tracks.push(new VectorKeyframeTrack(name, times, values, interpolation));\r\n }\r\n });\r\n });\r\n\r\n return new AnimationClip(\r\n \"Animation\",\r\n (motion.frame_count - 1) / PSO_FRAME_RATE,\r\n tracks\r\n ).optimize();\r\n}\r\n","import Logger from \"js-logger\";\r\nimport { action, observable } from \"mobx\";\r\nimport { AnimationAction, AnimationClip, AnimationMixer, SkinnedMesh } from \"three\";\r\nimport { BufferCursor } from \"../data_formats/BufferCursor\";\r\nimport { NinjaModel, NinjaObject, parse_nj, parse_xj } from \"../data_formats/parsing/ninja\";\r\nimport { parse_njm, NjMotion } from \"../data_formats/parsing/ninja/motion\";\r\nimport { PlayerModel, PlayerAnimation } from \"../domain\";\r\nimport { create_animation_clip, PSO_FRAME_RATE } from \"../rendering/animation\";\r\nimport { ninja_object_to_skinned_mesh } from \"../rendering/models\";\r\nimport { get_player_data, get_player_animation_data } from \"./binary_assets\";\r\n\r\nconst logger = Logger.get(\"stores/ModelViewerStore\");\r\nconst nj_object_cache: Map<string, Promise<NinjaObject<NinjaModel>>> = new Map();\r\nconst nj_motion_cache: Map<number, Promise<NjMotion>> = new Map();\r\n\r\nclass ModelViewerStore {\r\n readonly models: PlayerModel[] = [\r\n new PlayerModel(\"HUmar\", 1, 10, new Set([6])),\r\n new PlayerModel(\"HUnewearl\", 1, 10, new Set()),\r\n new PlayerModel(\"HUcast\", 5, 0, new Set()),\r\n new PlayerModel(\"HUcaseal\", 5, 0, new Set()),\r\n new PlayerModel(\"RAmar\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n new PlayerModel(\"RAmarl\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n new PlayerModel(\"RAcast\", 5, 0, new Set()),\r\n new PlayerModel(\"RAcaseal\", 5, 0, new Set()),\r\n new PlayerModel(\"FOmarl\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n new PlayerModel(\"FOmar\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n new PlayerModel(\"FOnewm\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n new PlayerModel(\"FOnewearl\", 1, 10, new Set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),\r\n ];\r\n readonly animations: PlayerAnimation[] = new Array(572)\r\n .fill(undefined)\r\n .map((_, i) => new PlayerAnimation(i, `Animation ${i + 1}`));\r\n\r\n @observable.ref current_model?: NinjaObject<NinjaModel>;\r\n @observable.ref current_bone_count: number = 0;\r\n @observable.ref current_obj3d?: SkinnedMesh;\r\n\r\n @observable.ref animation?: {\r\n mixer: AnimationMixer;\r\n clip: AnimationClip;\r\n action: AnimationAction;\r\n };\r\n @observable animation_playing: boolean = false;\r\n @observable animation_frame_rate: number = PSO_FRAME_RATE;\r\n @observable animation_frame: number = 0;\r\n @observable animation_frame_count: number = 0;\r\n\r\n @observable show_skeleton: boolean = false;\r\n\r\n set_animation_frame_rate = action(\"set_animation_frame_rate\", (rate: number) => {\r\n if (this.animation) {\r\n this.animation.mixer.timeScale = rate / PSO_FRAME_RATE;\r\n this.animation_frame_rate = rate;\r\n }\r\n });\r\n\r\n set_animation_frame = action(\"set_animation_frame\", (frame: number) => {\r\n if (this.animation) {\r\n const frame_count = this.animation_frame_count;\r\n if (frame > frame_count) frame = 1;\r\n if (frame < 1) frame = frame_count;\r\n this.animation.action.time = (frame - 1) / PSO_FRAME_RATE;\r\n this.animation_frame = frame;\r\n }\r\n });\r\n\r\n load_model = async (model: PlayerModel) => {\r\n const object = await this.get_player_ninja_object(model);\r\n this.set_model(object);\r\n // Ignore the bones from the head parts.\r\n this.current_bone_count = 64;\r\n };\r\n\r\n load_animation = async (animation: PlayerAnimation) => {\r\n const nj_motion = await this.get_nj_motion(animation);\r\n\r\n if (this.current_model) {\r\n this.set_animation(create_animation_clip(this.current_model, nj_motion));\r\n }\r\n };\r\n\r\n load_file = (file: File) => {\r\n const reader = new FileReader();\r\n reader.addEventListener(\"loadend\", () => {\r\n this.loadend(file, reader);\r\n });\r\n reader.readAsArrayBuffer(file);\r\n };\r\n\r\n toggle_animation_playing = action(\"toggle_animation_playing\", () => {\r\n if (this.animation) {\r\n this.animation.action.paused = !this.animation.action.paused;\r\n this.animation_playing = !this.animation.action.paused;\r\n }\r\n });\r\n\r\n update_animation_frame = action(\"update_animation_frame\", () => {\r\n if (this.animation && this.animation_playing) {\r\n const time = this.animation.action.time;\r\n this.animation_frame = Math.round(time * PSO_FRAME_RATE) + 1;\r\n }\r\n });\r\n\r\n set_animation = action(\"set_animation\", (clip: AnimationClip) => {\r\n if (!this.current_obj3d) return;\r\n\r\n let mixer: AnimationMixer;\r\n\r\n if (this.animation) {\r\n this.animation.mixer.stopAllAction();\r\n mixer = this.animation.mixer;\r\n } else {\r\n mixer = new AnimationMixer(this.current_obj3d);\r\n }\r\n\r\n this.animation = {\r\n mixer,\r\n clip,\r\n action: mixer.clipAction(clip),\r\n };\r\n\r\n this.animation.action.play();\r\n this.animation_playing = true;\r\n this.animation_frame_count = Math.round(PSO_FRAME_RATE * clip.duration) + 1;\r\n });\r\n\r\n private set_model = action(\"set_model\", (model: NinjaObject<NinjaModel>) => {\r\n if (this.current_obj3d && this.animation) {\r\n this.animation.mixer.stopAllAction();\r\n this.animation.mixer.uncacheRoot(this.current_obj3d);\r\n this.animation = undefined;\r\n }\r\n\r\n this.current_model = model;\r\n this.current_bone_count = model.bone_count();\r\n\r\n const mesh = ninja_object_to_skinned_mesh(this.current_model);\r\n mesh.translateY(-mesh.geometry.boundingSphere.radius);\r\n this.current_obj3d = mesh;\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 const model = parse_nj(new BufferCursor(reader.result, true))[0];\r\n this.set_model(model);\r\n } else if (file.name.endsWith(\".xj\")) {\r\n const model = parse_xj(new BufferCursor(reader.result, true))[0];\r\n this.set_model(model);\r\n } else if (file.name.endsWith(\".njm\")) {\r\n if (this.current_model) {\r\n const njm = parse_njm(\r\n new BufferCursor(reader.result, true),\r\n this.current_bone_count\r\n );\r\n this.set_animation(create_animation_clip(this.current_model, njm));\r\n }\r\n } else {\r\n logger.error(`Unknown file extension in filename \"${file.name}\".`);\r\n }\r\n };\r\n\r\n private add_to_bone(\r\n object: NinjaObject<NinjaModel>,\r\n head_part: NinjaObject<NinjaModel>,\r\n bone_id: number\r\n ): void {\r\n const bone = object.get_bone(bone_id);\r\n\r\n if (bone) {\r\n bone.evaluation_flags.hidden = false;\r\n bone.evaluation_flags.break_child_trace = false;\r\n bone.children.push(head_part);\r\n }\r\n }\r\n\r\n private async get_player_ninja_object(model: PlayerModel): Promise<NinjaObject<NinjaModel>> {\r\n let ninja_object = nj_object_cache.get(model.name);\r\n\r\n if (ninja_object) {\r\n return ninja_object;\r\n } else {\r\n ninja_object = this.get_all_assets(model);\r\n nj_object_cache.set(model.name, ninja_object);\r\n return ninja_object;\r\n }\r\n }\r\n\r\n private async get_all_assets(model: PlayerModel): Promise<NinjaObject<NinjaModel>> {\r\n const body_data = await get_player_data(model.name, \"Body\");\r\n const body = parse_nj(new BufferCursor(body_data, true))[0];\r\n\r\n if (!body) {\r\n throw new Error(`Couldn't parse body for player class ${model.name}.`);\r\n }\r\n\r\n const head_data = await get_player_data(model.name, \"Head\", 0);\r\n const head = parse_nj(new BufferCursor(head_data, true))[0];\r\n\r\n if (head) {\r\n this.add_to_bone(body, head, 59);\r\n }\r\n\r\n if (model.hair_styles_count > 0) {\r\n const hair_data = await get_player_data(model.name, \"Hair\", 0);\r\n const hair = parse_nj(new BufferCursor(hair_data, true))[0];\r\n\r\n if (hair) {\r\n this.add_to_bone(body, hair, 59);\r\n }\r\n\r\n if (model.hair_styles_with_accessory.has(0)) {\r\n const accessory_data = await get_player_data(model.name, \"Accessory\", 0);\r\n const accessory = parse_nj(new BufferCursor(accessory_data, true))[0];\r\n\r\n if (accessory) {\r\n this.add_to_bone(body, accessory, 59);\r\n }\r\n }\r\n }\r\n\r\n return body;\r\n }\r\n\r\n private async get_nj_motion(animation: PlayerAnimation): Promise<NjMotion> {\r\n let nj_motion = nj_motion_cache.get(animation.id);\r\n\r\n if (nj_motion) {\r\n return nj_motion;\r\n } else {\r\n nj_motion = get_player_animation_data(animation.id).then(motion_data =>\r\n parse_njm(new BufferCursor(motion_data, true), this.current_bone_count)\r\n );\r\n\r\n nj_motion_cache.set(animation.id, nj_motion);\r\n return nj_motion;\r\n }\r\n }\r\n}\r\n\r\nexport const model_viewer_store = new ModelViewerStore();\r\n","import { autorun } from \"mobx\";\r\nimport { Clock, SkeletonHelper, SkinnedMesh, Vector3 } from \"three\";\r\nimport { model_viewer_store } from \"../stores/ModelViewerStore\";\r\nimport { Renderer } from \"./Renderer\";\r\n\r\nlet renderer: ModelRenderer | undefined;\r\n\r\nexport function get_model_renderer(): ModelRenderer {\r\n if (!renderer) renderer = new ModelRenderer();\r\n return renderer;\r\n}\r\n\r\nexport class ModelRenderer extends Renderer {\r\n private clock = new Clock();\r\n\r\n private model?: SkinnedMesh;\r\n private skeleton_helper?: SkeletonHelper;\r\n\r\n constructor() {\r\n super();\r\n\r\n autorun(() => {\r\n const show_skeleton = model_viewer_store.show_skeleton;\r\n\r\n if (this.skeleton_helper) {\r\n this.skeleton_helper.visible = show_skeleton;\r\n this.schedule_render();\r\n }\r\n\r\n if (!model_viewer_store.animation_playing) {\r\n // Reference animation_frame here to make sure we render when the user sets the frame manually.\r\n model_viewer_store.animation_frame;\r\n this.schedule_render();\r\n }\r\n });\r\n\r\n autorun(() => {\r\n if (model_viewer_store.animation) {\r\n this.schedule_render();\r\n }\r\n });\r\n }\r\n\r\n set_model(model?: SkinnedMesh): void {\r\n if (this.model !== model) {\r\n if (this.model) {\r\n this.scene.remove(this.model);\r\n this.scene.remove(this.skeleton_helper!);\r\n this.skeleton_helper = undefined;\r\n }\r\n\r\n if (model) {\r\n this.scene.add(model);\r\n this.skeleton_helper = new SkeletonHelper(model);\r\n this.skeleton_helper.visible = model_viewer_store.show_skeleton;\r\n (this.skeleton_helper.material as any).linewidth = 3;\r\n this.scene.add(this.skeleton_helper);\r\n this.reset_camera(new Vector3(0, 10, 20), new Vector3(0, 0, 0));\r\n }\r\n\r\n this.model = model;\r\n this.schedule_render();\r\n }\r\n }\r\n\r\n protected render(): void {\r\n if (model_viewer_store.animation) {\r\n model_viewer_store.animation.mixer.update(this.clock.getDelta());\r\n model_viewer_store.update_animation_frame();\r\n }\r\n\r\n this.light_holder.quaternion.copy(this.camera.quaternion);\r\n super.render();\r\n\r\n if (model_viewer_store.animation && !model_viewer_store.animation.action.paused) {\r\n this.schedule_render();\r\n }\r\n }\r\n}\r\n","import React, { Component, ReactNode } from \"react\";\r\nimport { model_viewer_store } from \"../../stores/ModelViewerStore\";\r\nimport \"./AnimationSelectionComponent.less\";\r\n\r\nexport class AnimationSelectionComponent extends Component {\r\n render(): ReactNode {\r\n return (\r\n <section className=\"mv-AnimationSelectionComponent\">\r\n <ul>\r\n {model_viewer_store.animations.map(animation => (\r\n <li\r\n key={animation.id}\r\n onClick={() => model_viewer_store.load_animation(animation)}\r\n >\r\n {animation.name}\r\n </li>\r\n ))}\r\n </ul>\r\n </section>\r\n );\r\n }\r\n}\r\n","import { List } from \"antd\";\r\nimport React, { Component, ReactNode } from \"react\";\r\nimport { model_viewer_store } from \"../../stores/ModelViewerStore\";\r\nimport \"./ModelSelectionComponent.less\";\r\n\r\nexport class ModelSelectionComponent extends Component {\r\n render(): ReactNode {\r\n return (\r\n <section className=\"mv-ModelSelectionComponent\">\r\n <List\r\n itemLayout=\"horizontal\"\r\n dataSource={model_viewer_store.models}\r\n size=\"small\"\r\n renderItem={model => (\r\n <List.Item onClick={() => model_viewer_store.load_model(model)}>\r\n <List.Item.Meta\r\n title={\r\n <span className=\"mv-ModelSelectionComponent-model\">\r\n {model.name}\r\n </span>\r\n }\r\n />\r\n </List.Item>\r\n )}\r\n />\r\n </section>\r\n );\r\n }\r\n}\r\n","import React, { ReactNode, Component } from \"react\";\r\nimport { SkinnedMesh } from \"three\";\r\nimport { get_model_renderer } from \"../../rendering/ModelRenderer\";\r\n\r\ntype Props = {\r\n model?: SkinnedMesh;\r\n};\r\n\r\nexport class RendererComponent extends Component<Props> {\r\n private renderer = get_model_renderer();\r\n\r\n render(): ReactNode {\r\n return <div style={{ overflow: \"hidden\" }} ref={this.modifyDom} />;\r\n }\r\n\r\n componentDidMount(): void {\r\n window.addEventListener(\"resize\", this.onResize);\r\n }\r\n\r\n componentWillUnmount(): void {\r\n window.removeEventListener(\"resize\", this.onResize);\r\n }\r\n\r\n componentWillReceiveProps({ model }: Props): void {\r\n this.renderer.set_model(model);\r\n }\r\n\r\n shouldComponentUpdate(): boolean {\r\n return false;\r\n }\r\n\r\n private modifyDom = (div: HTMLDivElement | null) => {\r\n if (div) {\r\n this.renderer.set_size(div.clientWidth, div.clientHeight);\r\n div.appendChild(this.renderer.dom_element);\r\n }\r\n };\r\n\r\n private onResize = () => {\r\n const wrapper_div = this.renderer.dom_element.parentNode as HTMLDivElement;\r\n this.renderer.set_size(wrapper_div.clientWidth, wrapper_div.clientHeight);\r\n };\r\n}\r\n","import { Button, InputNumber, Switch, 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, { Component, ReactNode } from \"react\";\r\nimport { model_viewer_store } from \"../../stores/ModelViewerStore\";\r\nimport { AnimationSelectionComponent } from \"./AnimationSelectionComponent\";\r\nimport { ModelSelectionComponent } from \"./ModelSelectionComponent\";\r\nimport \"./ModelViewerComponent.less\";\r\nimport { RendererComponent } from \"./RendererComponent\";\r\n\r\n@observer\r\nexport class ModelViewerComponent extends Component {\r\n componentDidMount(): void {\r\n if (!model_viewer_store.current_model) {\r\n model_viewer_store.load_model(model_viewer_store.models[5]);\r\n }\r\n }\r\n\r\n render(): ReactNode {\r\n return (\r\n <div className=\"mv-ModelViewerComponent\">\r\n <Toolbar />\r\n <div className=\"mv-ModelViewerComponent-main\">\r\n <ModelSelectionComponent />\r\n <AnimationSelectionComponent />\r\n <RendererComponent model={model_viewer_store.current_obj3d} />\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\n@observer\r\nclass Toolbar extends Component {\r\n state = {\r\n filename: undefined,\r\n };\r\n\r\n render(): ReactNode {\r\n return (\r\n <div className=\"mv-ModelViewerComponent-toolbar\">\r\n <Upload\r\n accept=\".nj, .njm, .xj\"\r\n showUploadList={false}\r\n onChange={this.set_filename}\r\n // Make sure it doesn't do a POST:\r\n customRequest={() => false}\r\n >\r\n <Button icon=\"file\">{this.state.filename || \"Open file...\"}</Button>\r\n </Upload>\r\n {model_viewer_store.animation && (\r\n <>\r\n <Button\r\n icon={model_viewer_store.animation_playing ? \"pause\" : \"caret-right\"}\r\n onClick={model_viewer_store.toggle_animation_playing}\r\n >\r\n {model_viewer_store.animation_playing\r\n ? \"Pause animation\"\r\n : \"Play animation\"}\r\n </Button>\r\n <div className=\"group\">\r\n <span>Frame rate:</span>\r\n <InputNumber\r\n value={model_viewer_store.animation_frame_rate}\r\n onChange={value =>\r\n model_viewer_store.set_animation_frame_rate(value || 0)\r\n }\r\n min={1}\r\n step={1}\r\n />\r\n </div>\r\n <div className=\"group\">\r\n <span>Frame:</span>\r\n <InputNumber\r\n value={model_viewer_store.animation_frame}\r\n onChange={value =>\r\n model_viewer_store.set_animation_frame(value || 0)\r\n }\r\n step={1}\r\n />\r\n <span>/ {model_viewer_store.animation_frame_count}</span>\r\n </div>\r\n </>\r\n )}\r\n <div className=\"group\">\r\n <span>Show skeleton:</span>\r\n <Switch\r\n checked={model_viewer_store.show_skeleton}\r\n onChange={value => (model_viewer_store.show_skeleton = value)}\r\n />\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private set_filename = (info: UploadChangeParam<UploadFile>) => {\r\n if (info.file.originFileObj) {\r\n this.setState({ filename: info.file.name });\r\n model_viewer_store.load_file(info.file.originFileObj);\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, { ReactNode } from \"react\";\r\nimport \"./ApplicationComponent.less\";\r\nimport { with_error_boundary } 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\nimport { ModelViewerComponent } from \"./model_viewer/ModelViewerComponent\";\r\n\r\nconst ModelViewer = with_error_boundary(ModelViewerComponent);\r\nconst QuestEditor = with_error_boundary(QuestEditorComponent);\r\nconst HuntOptimizer = with_error_boundary(HuntOptimizerComponent);\r\nconst DpsCalc = with_error_boundary(DpsCalcComponent);\r\n\r\n@observer\r\nexport class ApplicationComponent extends React.Component {\r\n state = { tool: this.init_tool() };\r\n\r\n render(): ReactNode {\r\n let tool_component;\r\n\r\n switch (this.state.tool) {\r\n case \"model_viewer\":\r\n tool_component = <ModelViewer />;\r\n break;\r\n case \"quest_editor\":\r\n tool_component = <QuestEditor />;\r\n break;\r\n case \"hunt_optimizer\":\r\n tool_component = <HuntOptimizer />;\r\n break;\r\n case \"dps_calc\":\r\n tool_component = <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\">Phantasmal World</h1>\r\n <Menu\r\n className=\"ApplicationComponent-heading-menu\"\r\n onClick={this.menu_clicked}\r\n selectedKeys={[this.state.tool]}\r\n mode=\"horizontal\"\r\n >\r\n <Menu.Item key=\"model_viewer\">\r\n Model Viewer<sup className=\"ApplicationComponent-beta\">(Beta)</sup>\r\n </Menu.Item>\r\n <Menu.Item key=\"quest_editor\">\r\n Quest Editor<sup className=\"ApplicationComponent-beta\">(Beta)</sup>\r\n </Menu.Item>\r\n <Menu.Item key=\"hunt_optimizer\">Hunt Optimizer</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\">{tool_component}</div>\r\n </div>\r\n );\r\n }\r\n\r\n private menu_clicked = (e: ClickParam) => {\r\n this.setState({ tool: e.key });\r\n };\r\n\r\n private init_tool(): string {\r\n const param = window.location.search\r\n .slice(1)\r\n .split(\"&\")\r\n .find(p => p.startsWith(\"tool=\"));\r\n return param ? param.slice(5) : \"model_viewer\";\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(<ApplicationComponent />, document.getElementById(\"phantasmal-world-root\"));\r\n"],"sourceRoot":""} |